jsOMS/Views/FormView.js
2016-03-25 15:35:06 +01:00

169 lines
5.1 KiB
JavaScript

(function (jsOMS, undefined) {
"use strict";
jsOMS.FormView = function (id) {
this.id = id;
this.initializeMembers();
this.bind();
};
jsOMS.FormView.prototype.initializeMembers = function()
{
this.submitInjects = {};
this.method = 'POST';
this.action = '';
};
jsOMS.FormView.prototype.getMethod = function()
{
return this.method;
};
jsOMS.FormView.prototype.getAction = function()
{
return this.action;
};
jsOMS.FormView.prototype.getSubmit = function()
{
return document.getElementById(this.id).querySelectorAll('input[type=submit]')[0];
};
jsOMS.FormView.prototype.injectSubmit = function(id, callback)
{
this.submitInjects[id] = callback;
};
jsOMS.FormView.prototype.getData = function()
{
let data = {},
form = document.getElementById(this.id),
selects = form.getElementsByTagName('select'),
textareas = form.getElementsByTagName('textarea'),
inputs = form.getElementsByTagName('input'),
external = document.querySelectorAll('[form='+this.id+']'),
elements = Array.prototype.slice.call(inputs).concat(Array.prototype.slice.call(selects), Array.prototype.slice.call(textareas), Array.prototype.slice.call(external)),
length = elements.length,
i = 0;
for(i = 0; i < length; i++) {
data[elements[i].getAttribute('name')] = elements[i].value;
}
return data;
};
jsOMS.FormView.prototype.getSubmitInjects = function()
{
return this.submitInjects;
};
jsOMS.FormView.prototype.bind = function()
{
this.clean();
this.method = document.getElementById(this.id).method;
this.action = document.getElementById(this.id).action;
let form = document.getElementById(this.id),
selects = form.getElementsByTagName('select'),
textareas = form.getElementsByTagName('textarea'),
inputs = form.getElementsByTagName('input'),
external = document.querySelectorAll('[form='+this.id+']'),
elements = Array.prototype.slice.call(inputs).concat(Array.prototype.slice.call(selects), Array.prototype.slice.call(textareas), Array.prototype.slice.call(external)),
length = elements.length,
i = 0;
for(i = 0; i < length; i++) {
switch(elements[i].tagName) {
case 'input':
this.bindInput(elements[i]);
break;
case 'select':
this.bindSelect(elements[i]);
break;
case 'textarea':
this.bindTextarea(elements[i]);
break;
case 'button':
this.bindButton(elements[i]);
break;
};
}
};
jsOMS.FormView.prototype.unbind = function()
{
};
jsOMS.FormView.prototype.clean = function()
{
this.unbind();
this.initializeMembers();
};
jsOMS.FormView.prototype.bindInput = function(input)
{
let listId, list,
self = this;
if((listId = input.getAttribute('list')) !== 'undefined' && (list = document.getElementById(listId)).getAttribute('data-list-src') !== 'undefined') {
input.addEventListener('change', function(event) {
self.addRemoteDatalistOptions(input, list);
});
}
};
jsOMS.FormView.prototype.addRemoteDatalistOptions = function(input, datalist)
{
this.clearDatalistOptions(datalist);
let request = new Request();
request.setData(input.value);
request.setType('json');
request.setUri(datalist.getAttribute('data-list-src'));
request.setMethod(jsOMS.EnumRequestMethod.POST);
request.setRequestHeader('Content-Type', 'application/json');
request.setSuccess(function (xhr) {
try {
let o = JSON.parse(xhr.response),
response = new Response(o),
responseLength = response.count(),
tempResponse = null,
success = null;
for (let k = 0; k < responseLength; k++) {
tempResponse = response.get(k);
console.log(tempResponse);
let option = null,
data = tempResponse.getData(),
length = data.length;
for(let i = 0; i < length; i++) {
option = document.createElement('option');
datalist.appendChild(option);
}
}
} catch (exception) {
self.app.logger.error('Invalid JSON object: ' + xhr, 'FormManager')
return false;
}
});
request.send();
};
jsOMS.FormView.prototype.clearDatalistOptions = function(datalist)
{
let length = datalist.options.length,
i = 0;
for(i = 0; i < length; i++) {
datalist.remove(0);
}
};
}(window.jsOMS = window.jsOMS || {}));