Skip to content

Commit c7a9323

Browse files
Add flatpickr component (#26)
* Add flatpickr component * Lint * Fix eslint * Refactor to use stimulus targets * Import flatpickr js through CDN * Split in to four javascript controllers * Change weird sentence * Refactor to single controller and pass stimulus value
1 parent fa5e67c commit c7a9323

File tree

6 files changed

+129
-0
lines changed

6 files changed

+129
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// See notes - you need to add the library and stylesheet via the CDN
2+
3+
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
4+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# frozen_string_literal: true
2+
3+
class FlatpickrComponentPreview < Lookbook::Preview
4+
include LookbookHelper
5+
6+
# Add the following to your `application.html.erb` head:
7+
#
8+
# `<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>`<br>
9+
# `<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">`
10+
#
11+
# @source ../../../app/views/components/flatpickr/_themes.html.erb
12+
13+
def themes
14+
render 'components/flatpickr/themes'
15+
end
16+
end
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { Controller } from '@hotwired/stimulus';
2+
3+
export default class FlatpickrController extends Controller {
4+
static values = {
5+
type: String,
6+
};
7+
8+
connect() {
9+
switch (this.typeValue) {
10+
case 'custom':
11+
flatpickr(this.element, {
12+
altInput: true, // creates a prettier input field
13+
enableTime: true, // add time picker
14+
time_24hr: true, // sets a 24 hour time picker
15+
minTime: '09:00',
16+
maxTime: '17:30',
17+
locale: {
18+
firstDayOfWeek: 1, // start week on Monday
19+
},
20+
disable: [
21+
function (date) {
22+
return date.getDay() === 0 || date.getDay() === 6; // disable weekends
23+
},
24+
],
25+
minDate: 'today', // sets the minimum date
26+
maxDate: new Date().fp_incr(14), // sets the maximum date 2 weeks from now
27+
});
28+
break;
29+
30+
case 'multiple':
31+
flatpickr(this.element, {
32+
altInput: true, // creates a prettier input field
33+
altFormat: 'd M Y', // overwrites date format with altInput enabled (dateFormat does not work)
34+
mode: 'multiple', // allows multiple dates to be selected
35+
});
36+
break;
37+
38+
case 'range':
39+
flatpickr(this.element, {
40+
altInput: true, // creates a prettier input field
41+
mode: 'range', // allows a range of dates to be selected
42+
defaultDate: [new Date(), new Date().fp_incr(14)], // sets the default values
43+
});
44+
break;
45+
46+
// default is 'basic'
47+
default:
48+
flatpickr(this.element, {
49+
// customize options here
50+
// see: https://flatpickr.js.org/examples/
51+
});
52+
}
53+
}
54+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<div class="mt-3 col-md-6">
2+
<%= form_for :appointment do |form| %>
3+
<div class="my-3">
4+
<p class="my-1">Default HTML date input</p>
5+
<%= form.date_field :normal_date %>
6+
</div>
7+
8+
<div class="my-3">
9+
<p class="my-1">Default Flatpickr date input</p>
10+
<%= form.date_field :flatpickr_date,
11+
data: {
12+
controller: 'flatpickr'
13+
} %>
14+
</div>
15+
16+
<div class="my-3">
17+
<p class="my-1">Custom Flatpickr date input</p>
18+
<%= form.date_field :custom_flatpickr_date,
19+
data: {
20+
controller: 'flatpickr',
21+
flatpickr_type_value: 'custom'
22+
},
23+
placeholder: 'Select appointment date' %>
24+
</div>
25+
26+
<div class="my-3">
27+
<p class="my-1">Multiple select Flatpickr date input</p>
28+
<%= form.date_field :multiple_flatpickr_date,
29+
data: {
30+
controller: 'flatpickr',
31+
flatpickr_type_value: 'multiple'
32+
},
33+
placeholder: 'Select multiple dates' %>
34+
</div>
35+
36+
<div class="my-3">
37+
<p class="my-1">Range Flatpickr date input</p>
38+
<%= form.date_field :range_flatpickr_date,
39+
data: {
40+
controller: 'flatpickr',
41+
flatpickr_type_value: 'range'
42+
},
43+
placeholder: 'Select a range of dates' %>
44+
</div>
45+
46+
<div class="my-3">
47+
<%= form.submit 'Submit' %>
48+
</div>
49+
<% end %>
50+
</div>

app/views/layouts/application.html.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
<%= stylesheet_link_tag 'application', 'data-turbo-track': 'reload' %>
1010
<%= javascript_importmap_tags %>
1111
<script src='https://kit.fontawesome.com/328ac1243c.js' crossorigin='anonymous' defer='true'></script>
12+
13+
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
14+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
1215
</head>
1316

1417
<body>

vendor/javascript/flatpickr.js

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)