167 lines
5.9 KiB
JavaScript
167 lines
5.9 KiB
JavaScript
/*===============================================================================
|
|
************ Store and parse forms data ************
|
|
===============================================================================*/
|
|
app.formsData = {};
|
|
app.formStoreData = function (formId, formJSON) {
|
|
// Store form data in app.formsData
|
|
app.formsData[formId] = formJSON;
|
|
|
|
// Store form data in local storage also
|
|
app.ls['f7form-' + formId] = JSON.stringify(formJSON);
|
|
};
|
|
app.formDeleteData = function (formId) {
|
|
// Delete form data from app.formsData
|
|
if (app.formsData[formId]) {
|
|
app.formsData[formId] = '';
|
|
delete app.formsData[formId];
|
|
}
|
|
|
|
// Delete form data from local storage also
|
|
if (app.ls['f7form-' + formId]) {
|
|
app.ls['f7form-' + formId] = '';
|
|
app.ls.removeItem('f7form-' + formId);
|
|
}
|
|
};
|
|
app.formGetData = function (formId) {
|
|
// First of all check in local storage
|
|
if (app.ls['f7form-' + formId]) {
|
|
return JSON.parse(app.ls['f7form-' + formId]);
|
|
}
|
|
// Try to get it from formsData obj
|
|
else if (app.formsData[formId]) return app.formsData[formId];
|
|
};
|
|
app.formToData = function (form) {
|
|
form = $(form);
|
|
if (form.length !== 1) return false;
|
|
|
|
// Form data
|
|
var formData = {};
|
|
|
|
// Skip input types
|
|
var skipTypes = ['submit', 'image', 'button', 'file'];
|
|
var skipNames = [];
|
|
form.find('input, select, textarea').each(function () {
|
|
var input = $(this);
|
|
var name = input.attr('name');
|
|
var type = input.attr('type');
|
|
var tag = this.nodeName.toLowerCase();
|
|
if (skipTypes.indexOf(type) >= 0) return;
|
|
if (skipNames.indexOf(name) >= 0 || !name) return;
|
|
if (tag === 'select' && input.prop('multiple')) {
|
|
skipNames.push(name);
|
|
formData[name] = [];
|
|
form.find('select[name="' + name + '"] option').each(function () {
|
|
if (this.selected) formData[name].push(this.value);
|
|
});
|
|
}
|
|
else {
|
|
switch (type) {
|
|
case 'checkbox' :
|
|
skipNames.push(name);
|
|
formData[name] = [];
|
|
form.find('input[name="' + name + '"]').each(function () {
|
|
if (this.checked) formData[name].push(this.value);
|
|
});
|
|
break;
|
|
case 'radio' :
|
|
skipNames.push(name);
|
|
form.find('input[name="' + name + '"]').each(function () {
|
|
if (this.checked) formData[name] = this.value;
|
|
});
|
|
break;
|
|
default :
|
|
formData[name] = input.val();
|
|
break;
|
|
}
|
|
}
|
|
|
|
});
|
|
form.trigger('formToJSON formToData', {formData: formData});
|
|
|
|
return formData;
|
|
};
|
|
app.formToJSON = app.formToData;
|
|
app.formFromData = function (form, formData) {
|
|
form = $(form);
|
|
if (form.length !== 1) return false;
|
|
|
|
// Skip input types
|
|
var skipTypes = ['submit', 'image', 'button', 'file'];
|
|
var skipNames = [];
|
|
|
|
form.find('input, select, textarea').each(function () {
|
|
var input = $(this);
|
|
var name = input.attr('name');
|
|
var type = input.attr('type');
|
|
var tag = this.nodeName.toLowerCase();
|
|
if (!formData[name]) return;
|
|
if (skipTypes.indexOf(type) >= 0) return;
|
|
if (skipNames.indexOf(name) >= 0 || !name) return;
|
|
if (tag === 'select' && input.prop('multiple')) {
|
|
skipNames.push(name);
|
|
form.find('select[name="' + name + '"] option').each(function () {
|
|
if (formData[name].indexOf(this.value) >= 0) this.selected = true;
|
|
else this.selected = false;
|
|
});
|
|
}
|
|
else {
|
|
switch (type) {
|
|
case 'checkbox' :
|
|
skipNames.push(name);
|
|
form.find('input[name="' + name + '"]').each(function () {
|
|
if (formData[name].indexOf(this.value) >= 0) this.checked = true;
|
|
else this.checked = false;
|
|
});
|
|
break;
|
|
case 'radio' :
|
|
skipNames.push(name);
|
|
form.find('input[name="' + name + '"]').each(function () {
|
|
if (formData[name] === this.value) this.checked = true;
|
|
else this.checked = false;
|
|
});
|
|
break;
|
|
default :
|
|
input.val(formData[name]);
|
|
break;
|
|
}
|
|
}
|
|
if (tag === 'select' && input.parents('.smart-select').length > 0) {
|
|
input.trigger('change');
|
|
}
|
|
});
|
|
form.trigger('formFromJSON formFromData', {formData: formData});
|
|
};
|
|
app.formFromJSON = app.formFromData;
|
|
|
|
app.initFormsStorage = function (pageContainer) {
|
|
pageContainer = $(pageContainer);
|
|
var forms = pageContainer.find('form.store-data');
|
|
if (forms.length === 0) return;
|
|
|
|
// Parse forms data and fill form if there is such data
|
|
forms.each(function () {
|
|
var id = this.getAttribute('id');
|
|
if (!id) return;
|
|
var formData = app.formGetData(id);
|
|
if (formData) app.formFromData(this, formData);
|
|
});
|
|
// Update forms data on inputs change
|
|
function storeForm() {
|
|
/*jshint validthis:true */
|
|
var form = $(this);
|
|
var formId = form[0].id;
|
|
if (!formId) return;
|
|
var formJSON = app.formToData(form);
|
|
if (!formJSON) return;
|
|
app.formStoreData(formId, formJSON);
|
|
form.trigger('store', {data: formJSON});
|
|
}
|
|
forms.on('change submit', storeForm);
|
|
|
|
// Detach Listeners
|
|
function pageBeforeRemove() {
|
|
forms.off('change submit', storeForm);
|
|
pageContainer.off('pageBeforeRemove', pageBeforeRemove);
|
|
}
|
|
pageContainer.on('pageBeforeRemove', pageBeforeRemove);
|
|
}; |