playbook_ui 6.4.2 → 6.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +1 -0
  3. data/app/pb_kits/playbook/data/menu.yml +1 -0
  4. data/app/pb_kits/playbook/index.js +2 -0
  5. data/app/pb_kits/playbook/packs/examples.js +2 -1
  6. data/app/pb_kits/playbook/pb_button/_button.jsx +1 -0
  7. data/app/pb_kits/playbook/pb_button/_button_mixins.scss +1 -1
  8. data/app/pb_kits/playbook/pb_button/docs/_button_default.jsx +3 -7
  9. data/app/pb_kits/playbook/pb_button/docs/_button_default_dark.jsx +3 -0
  10. data/app/pb_kits/playbook/pb_button/docs/_button_link.jsx +2 -0
  11. data/app/pb_kits/playbook/pb_button/docs/_button_loading.jsx +2 -0
  12. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_link.html.erb +2 -1
  13. data/app/pb_kits/playbook/pb_date_picker/_date_picker.html.erb +39 -0
  14. data/app/pb_kits/playbook/pb_date_picker/_date_picker.jsx +146 -0
  15. data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +37 -0
  16. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +85 -0
  17. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.js +171 -0
  18. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_dark.html.erb +4 -0
  19. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_dark.jsx +13 -0
  20. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default.html.erb +1 -0
  21. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default.jsx +12 -0
  22. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.html.erb +24 -0
  23. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.jsx +30 -0
  24. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_disabled.html.erb +43 -0
  25. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_disabled.jsx +48 -0
  26. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +4 -0
  27. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.jsx +13 -0
  28. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_format.html.erb +19 -0
  29. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_format.jsx +25 -0
  30. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_format.md +1 -0
  31. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_hide_icon.html.erb +4 -0
  32. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_hide_icon.jsx +13 -0
  33. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_hooks.html.erb +37 -0
  34. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_hooks.jsx +37 -0
  35. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_hooks.md +1 -0
  36. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_input.html.erb +26 -0
  37. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_input.jsx +32 -0
  38. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_input.md +3 -0
  39. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_label.html.erb +9 -0
  40. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_label.jsx +17 -0
  41. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_label.md +1 -0
  42. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_min_max.html.erb +14 -0
  43. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_min_max.jsx +22 -0
  44. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range.html.erb +4 -0
  45. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range.jsx +13 -0
  46. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_read_only.html.erb +4 -0
  47. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_read_only.jsx +13 -0
  48. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_read_only.md +1 -0
  49. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_year_range.html.erb +7 -0
  50. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_year_range.jsx +16 -0
  51. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_year_range.md +1 -0
  52. data/app/pb_kits/playbook/pb_date_picker/docs/_description.md +7 -0
  53. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +35 -0
  54. data/app/pb_kits/playbook/pb_date_picker/docs/index.js +14 -0
  55. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_calendar_input_icon.scss +32 -0
  56. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_day_styles.scss +53 -0
  57. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_flatpickr_styles.scss +785 -0
  58. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_header_styles.scss +108 -0
  59. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_overrides.scss +44 -0
  60. data/app/pb_kits/playbook/pb_filter/_filter.scss +1 -1
  61. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  62. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -0
  63. data/app/pb_kits/playbook/pb_form/docs/_form_simple_form.html.erb +2 -0
  64. data/app/pb_kits/playbook/pb_form/docs/_form_simple_form_validate.html.erb +2 -0
  65. data/app/pb_kits/playbook/pb_form/form_builder.rb +1 -0
  66. data/app/pb_kits/playbook/pb_form/form_builder/date_picker_field.rb +20 -0
  67. data/app/pb_kits/playbook/pb_progress_step/progress_step.rb +2 -2
  68. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.rb +0 -1
  69. data/app/pb_kits/playbook/pb_table/table.rb +3 -3
  70. data/app/pb_kits/playbook/pb_text_input/_text_input.html.erb +1 -0
  71. data/app/pb_kits/playbook/pb_text_input/_text_input.jsx +21 -17
  72. data/app/pb_kits/playbook/pb_text_input/text_input.rb +2 -0
  73. data/app/pb_kits/playbook/vendor.js +6 -0
  74. data/lib/playbook/version.rb +1 -1
  75. metadata +50 -2
@@ -0,0 +1,171 @@
1
+ import flatpickr from 'flatpickr'
2
+
3
+ const datePickerHelper = (config) => {
4
+ const {
5
+ defaultDate,
6
+ disableDate,
7
+ disableRange,
8
+ disableWeekdays,
9
+ format,
10
+ hideIcon,
11
+ maxDate,
12
+ minDate,
13
+ mode,
14
+ pickerId,
15
+ readOnly,
16
+ yearRange,
17
+ } = config
18
+
19
+ // ===========================================================
20
+ // | Hook Definitions |
21
+ // ===========================================================
22
+
23
+ const defaultDateGetter = () => {
24
+ if (defaultDate !== '') {
25
+ if (defaultDate === 'blank') {
26
+ return ''
27
+ } else {
28
+ return defaultDate
29
+ }
30
+ }
31
+ if (mode === 'single' && defaultDate === '') {
32
+ return new Date()
33
+ } else if (mode === 'range' && defaultDate === '') {
34
+ const today = new Date()
35
+ const tomorrow = new Date(today)
36
+ tomorrow.setDate(tomorrow.getDate() + 1)
37
+ return [today, tomorrow]
38
+ }
39
+ }
40
+ const disabledParser = () => {
41
+ if (disableDate && disableDate.length > 0) {
42
+ return disableDate
43
+ } else if (disableRange && disableRange.length > 0) {
44
+ return disableRange
45
+ } else {
46
+ return []
47
+ }
48
+ }
49
+ const calendarResizer = () => {
50
+ const cal = document.querySelector(`#cal-${pickerId}.open`)
51
+ const parentInput = cal.parentElement
52
+ if (cal.getBoundingClientRect().right > window.innerWidth) {
53
+ parentInput.style.display = 'flex'
54
+ parentInput.style.justifyContent = 'center'
55
+ }
56
+ if (cal.offsetWidth <= parentInput.offsetWidth) {
57
+ parentInput.style.display = ''
58
+ parentInput.style.justifyContent = ''
59
+ }
60
+ }
61
+
62
+ // ===========================================================
63
+ // | Flatpickr initializer w/ config |
64
+ // ===========================================================
65
+
66
+ flatpickr(`#${pickerId}`, {
67
+ disableMobile: true,
68
+ allowInput: !readOnly,
69
+ dateFormat: format,
70
+ defaultDate: defaultDateGetter(),
71
+ disable: disableWeekdays && disableWeekdays.length > 0 ? [
72
+ (date) => {
73
+ const weekdayObj = {
74
+ Sunday: 0,
75
+ Monday: 1,
76
+ Tuesday: 2,
77
+ Wednesday: 3,
78
+ Thursday: 4,
79
+ Friday: 5,
80
+ Saturday: 6,
81
+ }
82
+ return (
83
+ date.getDay() === weekdayObj[disableWeekdays[0]] ||
84
+ date.getDay() === weekdayObj[disableWeekdays[1]] ||
85
+ date.getDay() === weekdayObj[disableWeekdays[2]] ||
86
+ date.getDay() === weekdayObj[disableWeekdays[3]] ||
87
+ date.getDay() === weekdayObj[disableWeekdays[4]] ||
88
+ date.getDay() === weekdayObj[disableWeekdays[5]] ||
89
+ date.getDay() === weekdayObj[disableWeekdays[6]]
90
+ )
91
+ },
92
+ ] : disabledParser(),
93
+ maxDate: maxDate,
94
+ minDate: minDate,
95
+ mode: mode,
96
+ nextArrow: '<i class="far fa-angle-right"></i>',
97
+ onOpen: [() => {
98
+ calendarResizer()
99
+ window.addEventListener('resize', calendarResizer)
100
+ }],
101
+ onClose: [() => {
102
+ window.removeEventListener('resize', calendarResizer)
103
+ }],
104
+ onYearChange: [],
105
+ prevArrow: '<i class="far fa-angle-left"></i>',
106
+ static: true,
107
+ })
108
+
109
+ // ===========================================================
110
+ // Additional JS Functionality |
111
+ // ===========================================================
112
+
113
+ // Assign dynamically sourced flatpickr instance to variable
114
+ const picker = document.querySelector(`#${pickerId}`)._flatpickr
115
+ picker.innerContainer.parentElement.id = `cal-${pickerId}`
116
+
117
+ // replace year selector with dropdown
118
+ picker.yearElements[0].parentElement.innerHTML = `<select class="numInput cur-year" type="number" tabIndex="-1" aria-label="Year" id="year-${pickerId}"></select>`
119
+
120
+ // create html option tags for desired years
121
+ let years = ''
122
+ for (let year = yearRange[1]; year >= yearRange[0]; year--) {
123
+ years += `<option value="${year}">${year}</option>`
124
+ }
125
+
126
+ // variablize each dropdown selecttor
127
+ const dropdown = document.querySelector(`#year-${pickerId}`)
128
+
129
+ // inject year options into dropdown and assign it the flatpickr's current year value
130
+ dropdown.innerHTML = years
131
+ dropdown.value = picker.currentYear
132
+
133
+ // whenever a new year is selected from dropdown update flatpickr's current year value
134
+ dropdown.addEventListener('input', (e) => {
135
+ picker.changeYear(Number(e.target.value))
136
+ })
137
+
138
+ // two way binding
139
+ const yearChangeHook = () => {
140
+ dropdown.value = picker.currentYear
141
+ }
142
+ picker.config.onYearChange.push(yearChangeHook)
143
+
144
+ // click handling for Calendar Icon
145
+ if (!hideIcon){
146
+ document.querySelector(`#cal-icon-${pickerId}`).addEventListener('click', () => {
147
+ picker.toggle()
148
+ })
149
+ }
150
+
151
+ // Adding dropdown icons to year and month selects
152
+ picker.monthElements[0].insertAdjacentHTML('afterend', '<i class="far fa-angle-down month-dropdown-icon"></i>')
153
+ dropdown.insertAdjacentHTML('afterend', '<i class="far fa-angle-down year-dropdown-icon" id="test-id"></i>')
154
+
155
+ // Set input value attribute on page load
156
+ picker.input.setAttribute('value', picker.input.value)
157
+ // logic for updating value when typing
158
+ document.querySelector(`#${pickerId}`).addEventListener('input', (e) => {
159
+ picker.input.setAttribute('value', e.target.value)
160
+ const variant = picker.config.mode
161
+ if (variant === 'single' && e.target.value.split('').length === 10) {
162
+ picker.setDate(e.target.value)
163
+ dropdown.value = picker.currentYear
164
+ } else if (variant === 'range' && e.target.value.split('').length === 24) {
165
+ picker.setDate(e.target.value)
166
+ dropdown.value = picker.currentYear
167
+ }
168
+ })
169
+ }
170
+
171
+ export default datePickerHelper
@@ -0,0 +1,4 @@
1
+ <%= pb_rails("date_picker", props: {
2
+ dark: true,
3
+ picker_id: "date-picker-dark"
4
+ }) %>
@@ -0,0 +1,13 @@
1
+ import React from 'react'
2
+ import { DatePicker } from '../../'
3
+
4
+ const DatePickerDark = () => (
5
+ <div>
6
+ <DatePicker
7
+ dark
8
+ pickerId="date-picker-dark"
9
+ />
10
+ </div>
11
+ )
12
+
13
+ export default DatePickerDark
@@ -0,0 +1 @@
1
+ <%= pb_rails("date_picker", props: { picker_id: "date-picker-default" }) %>
@@ -0,0 +1,12 @@
1
+ import React from 'react'
2
+ import { DatePicker } from '../../'
3
+
4
+ const DatePickerDefault = () => (
5
+ <div>
6
+ <DatePicker
7
+ pickerId="date-picker-default"
8
+ />
9
+ </div>
10
+ )
11
+
12
+ export default DatePickerDefault
@@ -0,0 +1,24 @@
1
+ <%= pb_rails("date_picker", props: {
2
+ default_date: "07/31/2020",
3
+ label: "Default Date String",
4
+ picker_id: "date-picker-default-date1"
5
+ }) %>
6
+
7
+ <%= pb_rails("date_picker", props: {
8
+ default_date: (Date.today + 2).httpdate,
9
+ label: "Default Date Dynamic",
10
+ picker_id: "date-picker-default-date2"
11
+ }) %>
12
+
13
+ <%= pb_rails("date_picker", props: {
14
+ default_date: [(Date.today).httpdate, (Date.today + 7).httpdate],
15
+ label: "Default Date Range",
16
+ mode: "range",
17
+ picker_id: "date-picker-default-date3"
18
+ }) %>
19
+
20
+ <%= pb_rails("date_picker", props: {
21
+ default_date: "blank",
22
+ label: "Blank",
23
+ picker_id: "date-picker-default-date4"
24
+ }) %>
@@ -0,0 +1,30 @@
1
+ import React from 'react'
2
+ import { DatePicker } from '../../'
3
+
4
+ const DatePickerDefaultDate = () => (
5
+ <div>
6
+ <DatePicker
7
+ defaultDate="07/31/2020"
8
+ label="Default Date String"
9
+ pickerId="date-picker-default-date1"
10
+ />
11
+ <DatePicker
12
+ defaultDate={new Date().fp_incr(1)}
13
+ label="Default Date Dynamic"
14
+ pickerId="date-picker-default-date2"
15
+ />
16
+ <DatePicker
17
+ defaultDate={[new Date(), new Date().fp_incr(6)]}
18
+ label="Default Date Range"
19
+ mode="range"
20
+ pickerId="date-picker-default-date3"
21
+ />
22
+ <DatePicker
23
+ defaultDate="blank"
24
+ label="Blank"
25
+ pickerId="date-picker-default-date4"
26
+ />
27
+ </div>
28
+ )
29
+
30
+ export default DatePickerDefaultDate
@@ -0,0 +1,43 @@
1
+ <%= pb_rails("date_picker", props: {
2
+ disable_date: [(Date.today + 1).httpdate],
3
+ label: "Disable Single Date",
4
+ picker_id: "single-disabled-date"
5
+ }) %>
6
+
7
+ <%= pb_rails("date_picker", props: {
8
+ disable_date: [(Date.today + 1).httpdate, (Date.today + 3).httpdate],
9
+ label: "Disable Multiple Dates",
10
+ picker_id: "multiple-disabled-dates"
11
+ }) %>
12
+
13
+ <%= pb_rails("date_picker", props: {
14
+ disable_range: [
15
+ {
16
+ from: (Date.today + 1).httpdate,
17
+ to: (Date.today + 7).httpdate,
18
+ },
19
+ ],
20
+ label: "Disable Single Range",
21
+ picker_id: "single-date-range"
22
+ }) %>
23
+
24
+ <%= pb_rails("date_picker", props: {
25
+ disable_range: [
26
+ {
27
+ from: (Date.today + 1).httpdate,
28
+ to: (Date.today + 3).httpdate,
29
+ },
30
+ {
31
+ from: (Date.today + 7).httpdate,
32
+ to: (Date.today + 14).httpdate,
33
+ },
34
+ ],
35
+ label: "Disable Multiple Ranges",
36
+ picker_id: "multiple-date-ranges"
37
+ }) %>
38
+
39
+ <%= pb_rails("date_picker", props: {
40
+ disable_weekdays: ['Sunday', 'Saturday'],
41
+ label: "Disable Specific Weekdays",
42
+ picker_id: "disabled-weekdays"
43
+ }) %>
@@ -0,0 +1,48 @@
1
+ import React from 'react'
2
+ import { DatePicker } from '../../'
3
+
4
+ const DatePickerDisabled = () => (
5
+ <div>
6
+ <DatePicker
7
+ disableDate={[new Date().fp_incr(1)]}
8
+ label="Disable Single Date"
9
+ pickerId="single-disabled-date"
10
+ />
11
+ <DatePicker
12
+ disableDate={[new Date().fp_incr(1), new Date().fp_incr(3)]}
13
+ label="Disable Multiple Dates"
14
+ pickerId="multiple-disabled-dates"
15
+ />
16
+ <DatePicker
17
+ disableRange={[
18
+ {
19
+ from: new Date().fp_incr(1),
20
+ to: new Date().fp_incr(7),
21
+ },
22
+ ]}
23
+ label="Disable Single Range"
24
+ pickerId="single-date-range"
25
+ />
26
+ <DatePicker
27
+ disableRange={[
28
+ {
29
+ from: new Date().fp_incr(1),
30
+ to: new Date().fp_incr(3),
31
+ },
32
+ {
33
+ from: new Date().fp_incr(7),
34
+ to: new Date().fp_incr(14),
35
+ },
36
+ ]}
37
+ label="Disable Multiple Ranges"
38
+ pickerId="multiple-date-ranges"
39
+ />
40
+ <DatePicker
41
+ disableWeekdays={['Sunday', 'Saturday']}
42
+ label="Disable Specific Weekdays"
43
+ pickerId="disabled-weekdays"
44
+ />
45
+ </div>
46
+ )
47
+
48
+ export default DatePickerDisabled
@@ -0,0 +1,4 @@
1
+ <%= pb_rails("date_picker", props: {
2
+ error: "Invalid date. Please pick a valid date.",
3
+ picker_id: "date-picker-error"
4
+ }) %>
@@ -0,0 +1,13 @@
1
+ import React from 'react'
2
+ import { DatePicker } from '../../'
3
+
4
+ const DatePickerError = () => (
5
+ <div>
6
+ <DatePicker
7
+ error="Invalid date. Please pick a valid date."
8
+ pickerId="date-picker-error"
9
+ />
10
+ </div>
11
+ )
12
+
13
+ export default DatePickerError
@@ -0,0 +1,19 @@
1
+ <%= pb_rails("date_picker", props: {
2
+ format: "m-d-Y",
3
+ picker_id: "date-picker-format1"
4
+ }) %>
5
+
6
+ <%= pb_rails("date_picker", props: {
7
+ format: "m/d/y",
8
+ picker_id: "date-picker-format2"
9
+ }) %>
10
+
11
+ <%= pb_rails("date_picker", props: {
12
+ format: "n-j-y",
13
+ picker_id: "date-picker-format3"
14
+ }) %>
15
+
16
+ <%= pb_rails("date_picker", props: {
17
+ format: "Y-d-m",
18
+ picker_id: "date-picker-format4"
19
+ }) %>
@@ -0,0 +1,25 @@
1
+ import React from 'react'
2
+ import { DatePicker } from '../../'
3
+
4
+ const DatePickerFormat = () => (
5
+ <div>
6
+ <DatePicker
7
+ format="m-d-Y"
8
+ pickerId="date-picker-format1"
9
+ />
10
+ <DatePicker
11
+ format="m/d/y"
12
+ pickerId="date-picker-format2"
13
+ />
14
+ <DatePicker
15
+ format="n-j-y"
16
+ pickerId="date-picker-format3"
17
+ />
18
+ <DatePicker
19
+ format="Y-d-m"
20
+ pickerId="date-picker-format4"
21
+ />
22
+ </div>
23
+ )
24
+
25
+ export default DatePickerFormat
@@ -0,0 +1 @@
1
+ A full list of formatting tokens, i.e. `"m/d/Y"` can be found [here](https://flatpickr.js.org/formatting/).
@@ -0,0 +1,4 @@
1
+ <%= pb_rails("date_picker", props: {
2
+ hide_icon: true,
3
+ picker_id: "date-picker-hide-icon"
4
+ }) %>
@@ -0,0 +1,13 @@
1
+ import React from 'react'
2
+ import { DatePicker } from '../../'
3
+
4
+ const DatePickerHideIcon = () => (
5
+ <div>
6
+ <DatePicker
7
+ hideIcon
8
+ pickerId="date-picker-hide-icon"
9
+ />
10
+ </div>
11
+ )
12
+
13
+ export default DatePickerHideIcon