Patch extracted from here the comments on turbolinks issue 253 and converted to vanilla javascript. The hide action over datepickers ensures us that opened datepickers will be closed before leving the page. Previously if you open any datepicker and then move to previous page you will keep seeing the datepicker in the restored page.
32 lines
1.2 KiB
JavaScript
32 lines
1.2 KiB
JavaScript
// Based on code by Javan Makhmali
|
|
// https://github.com/turbolinks/turbolinks/issues/253#issuecomment-289101048
|
|
// The jQuery UI date picker widget appends a shared element to the
|
|
// body which it expects will never leave the page, but Turbolinks
|
|
// removes that shared element when it rerenders. We satisfy that
|
|
// expectation by removing the shared element from the page before
|
|
// Turbolinks caches the page, and appending it again before
|
|
// Turbolinks swaps the new body in during rendering.
|
|
//
|
|
// Additionally, returning to the cached version of a page that
|
|
// previously had date picker elements would result in those date
|
|
// pickers not being initialized again. We fix this issue by finding
|
|
// all initialized date picker inputs on the page and calling the
|
|
// date picker's destroy method before Turbolinks caches the page.
|
|
(function() {
|
|
"use strict";
|
|
App.Datepicker = {
|
|
destroy: function() {
|
|
$.datepicker.dpDiv.remove();
|
|
|
|
document.querySelectorAll("input.hasDatepicker").forEach(function(input) {
|
|
$(input).datepicker("hide");
|
|
$(input).datepicker("destroy");
|
|
});
|
|
}
|
|
};
|
|
|
|
document.addEventListener("turbolinks:before-render", function(event) {
|
|
$.datepicker.dpDiv.appendTo(event.data.newBody);
|
|
});
|
|
}).call(this);
|