"use strict"; import $ from "jquery"; import Events from "../_events"; const FormStorage = (($) => { // Constants const NAME = "jsFormStorage"; const DATA_KEY = NAME; const STORAGE = window.localStorage; class FormStorage { constructor(element) { console.log(`${NAME}: init`); const ui = this; const $element = $(element); const $elements = $element.find("input, textarea, select"); const setRangeValues = function (el) { const $el = $(el); $el.siblings(".value").text($el.val()); }; ui._element = element; $element.data(DATA_KEY, this); $element.addClass(`${NAME}-active`); // restore form data from localStorage $elements.each((i, el) => { const $el = $(el); const id = $el.attr("id"); const type = $el.attr("type"); const val = STORAGE.getItem(NAME + id); if (type === "file") { return true; } if (id && val && type) { if (type && (type === "checkbox" || type === "radio")) { $el.prop("checked", val); } else { $el.val(val); } } $el.trigger(Events.RESTORE_FIELD); }); // range fields $('input[type="range"]').each((i, el) => { setRangeValues(el); }); $element.trigger(Events.RESTORE_FIELD); $('input[type="range"]').on("change", (e) => { setRangeValues(e.currentTarget); }); // store form data into localStorage $elements.on("change", (e) => { const $el = $(e.currentTarget); const id = $el.attr("id"); const type = $el.attr("type"); // skip some elements if ($el.hasClass("no-storage")) { return true; } let val = $el.val(); if (type && (type === "checkbox" || type === "radio")) { val = !!$el.is(":checked"); } if (id && type && type !== "password") { STORAGE.setItem(NAME + id, val); } }); $element.on("submit", () => { $element.data(DATA_KEY).clear(); }); $element .find(".btn-toolbar,.form-actions") .children('button,[type="submit"],[type="clear"]') .on("click", () => { $element.data(DATA_KEY).clear(); }); $element.addClass(`${NAME}-active`); $element.trigger(Events.FORM_INIT_STORAGE); } // Public methods dispose() { const $element = $(this._element); $element.removeClass(`${NAME}-active`); $.removeData(this._element, DATA_KEY); this._element = null; } clear() { STORAGE.clear(); } static _jQueryInterface() { if (typeof window.localStorage !== "undefined") { return this.each(function () { // attach functionality to element const $element = $(this); let data = $element.data(DATA_KEY); if (!data) { data = new FormStorage(this); $element.data(DATA_KEY, data); } }); } } } // jQuery interface $.fn[NAME] = FormStorage._jQueryInterface; $.fn[NAME].Constructor = FormStorage; $.fn[NAME].noConflict = function () { $.fn[NAME] = JQUERY_NO_CONFLICT; return FormStorage._jQueryInterface; }; // auto-apply $(window).on(`${Events.AJAX} ${Events.LOADED}`, () => { $("form").each((i, el) => { const $el = $(el); // skip some forms if ($el.hasClass("no-storage")) { return true; } $el.jsFormStorage(); }); }); return FormStorage; })($); export default FormStorage;