1
0
Fork 0
mirror of synced 2024-06-27 18:50:47 +12:00
appwrite/public/scripts/services/form.js

132 lines
4.6 KiB
JavaScript
Raw Normal View History

2019-05-13 06:15:19 +12:00
(function (window) {
"use strict";
2019-08-15 01:50:40 +12:00
window.ls.container.set('form', function () {
function cast(value, to) {
2021-04-07 01:40:24 +12:00
if (value && Array.isArray(value) && to !== 'array') {
value = value.map(element => cast(element, to));
return value;
}
2019-08-15 01:50:40 +12:00
switch (to) {
case 'int':
case 'integer':
value = parseInt(value);
break;
2020-06-10 15:11:53 +12:00
case 'numeric':
value = Number(value);
break;
2019-08-15 01:50:40 +12:00
case 'string':
value = value.toString();
break;
case 'json':
value = (value) ? JSON.parse(value) : [];
break;
case 'array':
value = (value && value.constructor && value.constructor === Array) ? value : [value];
2019-08-15 01:50:40 +12:00
break;
case 'array-empty':
value = [];
break;
case 'bool':
case 'boolean':
value = (value === 'false') ? false : value;
value = !!value;
break;
}
return value;
2019-05-13 06:15:19 +12:00
}
2019-08-15 01:50:40 +12:00
function toJson(element, json) {
json = json || {};
let name = element.getAttribute('name');
let type = element.getAttribute('type');
let castTo = element.getAttribute('data-cast-to');
let ref = json;
2019-05-13 06:15:19 +12:00
2019-08-15 01:50:40 +12:00
if (name && 'FORM' !== element.tagName) {
2021-04-06 23:51:59 +12:00
if (name.startsWith('[')) { // Check for array names
let splitName = name.split('.');
if (splitName.length > 1 && splitName[0].endsWith(']')) {
name = splitName[splitName.length-1];
}
}
2019-08-15 01:50:40 +12:00
if ('FIELDSET' === element.tagName) { // Fieldset Array / Object
if (castTo === 'object') {
2019-05-13 06:15:19 +12:00
2019-08-15 01:50:40 +12:00
if (json[name] === undefined) {
json[name] = {};
}
2019-05-13 06:15:19 +12:00
2019-08-15 01:50:40 +12:00
ref = json[name];
2019-05-13 06:15:19 +12:00
}
2019-08-15 01:50:40 +12:00
else {
if (!Array.isArray(json[name])) {
json[name] = [];
}
2019-05-13 06:15:19 +12:00
2019-08-15 01:50:40 +12:00
json[name].push({});
2019-05-13 06:15:19 +12:00
2019-08-15 01:50:40 +12:00
ref = json[name][json[name].length - 1];
2019-05-13 06:15:19 +12:00
}
}
2019-08-15 01:50:40 +12:00
else if (undefined !== element.value) {
if ('SELECT' === element.tagName && element.children > 0) { // Select
json[name] = element.children[element.selectedIndex].value;
2019-05-13 06:15:19 +12:00
}
2019-08-15 01:50:40 +12:00
else if ('radio' === type) { // Radio
if (element.checked) {
json[name] = element.value;
}
2019-05-13 06:15:19 +12:00
}
2019-08-15 01:50:40 +12:00
else if ('checkbox' === type) { // Checkbox
if (!Array.isArray(json[name])) {
json[name] = [];
}
if (element.checked) {
json[name].push(element.value);
}
2019-05-13 06:15:19 +12:00
}
2019-08-15 01:50:40 +12:00
else if ('file' === type) { // File upload
json[name] = element.files[0];
2019-05-13 06:15:19 +12:00
}
2019-08-15 01:50:40 +12:00
else if (undefined !== element.value) { // Normal
if ((json[name] !== undefined) && (!Array.isArray(json[name]))) { // Support for list array when name is repeating more than once
json[name] = [json[name]];
}
if (Array.isArray(json[name])) {
json[name].push(element.value);
}
else {
json[name] = element.value;
}
2019-05-13 06:15:19 +12:00
}
2020-03-15 17:54:55 +13:00
2019-08-15 01:50:40 +12:00
json[name] = cast(json[name], castTo); // Apply casting
}
2019-05-13 06:15:19 +12:00
}
2019-08-15 01:50:40 +12:00
for (let i = 0; i < element.children.length; i++) {
if (Array.isArray(ref)) {
ref.push({});
toJson(element.children[i], ref[ref.length]);
}
else {
toJson(element.children[i], ref);
}
2019-05-13 06:15:19 +12:00
}
2019-08-15 01:50:40 +12:00
return json;
}
2019-05-13 06:15:19 +12:00
2019-08-15 01:50:40 +12:00
return {
'toJson': toJson
}
}, true, false);
2019-05-13 06:15:19 +12:00
2021-04-06 23:51:59 +12:00
})(window);