477 lines
17 KiB
JavaScript
Raw Normal View History

2019-11-16 10:21:14 +03:00
import Errors from './error';
export default class Form {
constructor(form_id) {
let form = document.getElementById(form_id);
if (!form) {
return;
}
this['method'] = form.getAttribute('method').toLowerCase();
this['action'] = form.getAttribute('action');
for (let form_element of document.getElementById(form_id).getElementsByTagName("input")) {
if (form_element.getAttribute('id') == 'global-search') {
continue;
}
var name = form_element.getAttribute('name');
var type = form_element.getAttribute('type');
if (name == 'method') {
continue;
}
2020-12-24 01:28:38 +03:00
/*
if (name != null && name.indexOf('.') != '-1') {
let partial_name = name.split('.');
switch(partial_name.length) {
case 2:
this[partial_name[0]] = [];
this[partial_name[0]][partial_name[1]] = '';
break;
case 3:
this[partial_name[0]] = [];
this[partial_name[0]][partial_name[1]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]] = '';
break;
case 4:
this[partial_name[0]] = [];
this[partial_name[0]][partial_name[1]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]][partial_name[3]] = '';
break;
case 5:
this[partial_name[0]] = [];
this[partial_name[0]][partial_name[1]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]][partial_name[3]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]][partial_name[3]][partial_name[4]] = '';
break;
}
continue;
}
*/
2019-11-16 10:21:14 +03:00
if (form_element.getAttribute('data-item')) {
if (!this['items']) {
var item = {};
var row = {};
item[0] = row;
this['items'] = item;
}
if (!this['items'][0][form_element.getAttribute('data-item')]) {
this['items'][0][form_element.getAttribute('data-item')] = '';
}
this['item_backup'] = this['items'];
continue;
}
if (form_element.getAttribute('data-field')) {
if (!this[form_element.getAttribute('data-field')]) {
var field = {};
this[form_element.getAttribute('data-field')] = field;
}
/*
if (!this[form_element.getAttribute('data-field')][name]) {
this[form_element.getAttribute('data-field')][name] = '';
}
*/
if (type == 'radio') {
if (!this[form_element.getAttribute('data-field')][name]) {
this[form_element.getAttribute('data-field')][name] = (form_element.getAttribute('value') ? form_element.getAttribute('value') : 0) || 0;
2020-11-24 16:45:41 +03:00
} else if (form_element.checked) {
this[form_element.getAttribute('data-field')][name] = (form_element.getAttribute('value') ? form_element.getAttribute('value') : 0) || 0;
} else if (form_element.getAttribute('checked')) {
this[form_element.getAttribute('data-field')][name] = (form_element.getAttribute('value') ? form_element.getAttribute('value') : 0) || 0;
}
} else if (type == 'checkbox') {
if (this[form_element.getAttribute('data-field')][name]) {
if (!this[form_element.getAttribute('data-field')][name].push) {
this[form_element.getAttribute('data-field')][name] = [this[form_element.getAttribute('data-field')][name]];
}
if (form_element.checked) {
this[form_element.getAttribute('data-field')][name].push(form_element.value);
}
} else {
if (form_element.checked) {
if (form_element.dataset.type != undefined) {
if (form_element.dataset.type == 'multiple') {
this[name] = [];
this[form_element.getAttribute('data-field')][name].push(form_element.value);
} else {
this[form_element.getAttribute('data-field')][name] = form_element.value;
}
} else {
this[form_element.getAttribute('data-field')][name] = form_element.value;
}
} else {
this[form_element.getAttribute('data-field')][name] = [];
}
}
} else {
this[form_element.getAttribute('data-field')][name] = form_element.getAttribute('value') || '';
}
continue;
}
2019-11-16 10:21:14 +03:00
if (type == 'radio') {
if (!this[name]) {
this[name] = (form_element.getAttribute('value') ? form_element.getAttribute('value') : 0) || 0;
2020-11-24 16:45:41 +03:00
} else if (form_element.checked) {
this[name] = (form_element.getAttribute('value') ? form_element.getAttribute('value') : 0) || 0;
} else if (form_element.getAttribute('checked')) {
this[name] = (form_element.getAttribute('value') ? form_element.getAttribute('value') : 0) || 0;
2019-11-16 10:21:14 +03:00
}
} else if (type == 'checkbox') {
if (this[name]) {
if (!this[name].push) {
this[name] = [this[name]];
}
if (form_element.checked) {
this[name].push(form_element.value);
}
} else {
if (form_element.checked) {
if (form_element.dataset.type != undefined) {
if (form_element.dataset.type == 'multiple') {
this[name] = [];
this[name].push(form_element.value);
} else {
this[name] = form_element.value;
}
} else {
this[name] = form_element.value;
}
2019-11-16 10:21:14 +03:00
} else {
this[name] = [];
}
}
} else {
this[name] = form_element.getAttribute('value') || '';
}
}
for (let form_element of document.getElementById(form_id).getElementsByTagName("textarea")) {
var name = form_element.getAttribute('name');
if (name == 'method') {
continue;
}
2020-12-24 01:28:38 +03:00
/*
if (name != null && name.indexOf('.') != '-1') {
let partial_name = name.split('.');
switch(partial_name.length) {
case 2:
this[partial_name[0]] = [];
this[partial_name[0]][partial_name[1]] = '';
break;
case 3:
this[partial_name[0]] = [];
this[partial_name[0]][partial_name[1]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]] = '';
break;
case 4:
this[partial_name[0]] = [];
this[partial_name[0]][partial_name[1]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]][partial_name[3]] = '';
break;
case 5:
this[partial_name[0]] = [];
this[partial_name[0]][partial_name[1]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]][partial_name[3]] = [];
this[partial_name[0]][partial_name[1]][partial_name[2]][partial_name[3]][partial_name[4]] = '';
break;
}
continue;
}
*/
2020-01-24 11:55:19 +03:00
if (form_element.getAttribute('data-item')) {
if (!this['items']) {
var item = {};
var row = {};
item[0] = row;
this['items'] = item;
}
if (!this['items'][0][form_element.getAttribute('data-item')]) {
this['items'][0][form_element.getAttribute('data-item')] = '';
}
this['item_backup'] = this['items'];
continue;
}
if (form_element.getAttribute('data-field')) {
if (!this[form_element.getAttribute('data-field')]) {
var field = {};
this[form_element.getAttribute('data-field')] = field;
}
if (!this[form_element.getAttribute('data-field')][name]) {
this[form_element.getAttribute('data-field')][name] = '';
}
continue;
}
2019-11-16 10:21:14 +03:00
if (this[name]) {
if (!this[name].push) {
this[name] = [this[name]];
}
this[name].push(form_element.value || '');
} else {
this[name] = form_element.value || '';
}
}
for (let form_element of document.getElementById(form_id).getElementsByTagName("select")) {
var name = form_element.getAttribute('name');
if (name == 'method') {
continue;
}
2020-01-24 11:55:19 +03:00
if (form_element.getAttribute('data-item')) {
if (!this['items']) {
var item = {};
var row = {};
item[0] = row;
this['items'] = item;
}
if (!this['items'][0][form_element.getAttribute('data-item')]) {
this['items'][0][form_element.getAttribute('data-item')] = '';
}
this['item_backup'] = this['items'];
continue;
}
if (form_element.getAttribute('data-field')) {
if (!this[form_element.getAttribute('data-field')]) {
var field = {};
this[form_element.getAttribute('data-field')] = field;
}
if (!this[form_element.getAttribute('data-field')][name]) {
this[form_element.getAttribute('data-field')][name] = '';
}
continue;
}
2019-11-16 10:21:14 +03:00
if (this[name]) {
if (!this[name].push) {
this[name] = [this[name]];
}
this[name].push(form_element.getAttribute('value') || '');
} else {
this[name] = form_element.getAttribute('value') || '';
}
}
this.errors = new Errors();
this.loading = false;
this.response = {};
}
data() {
let data = Object.assign({}, this);
delete data.method;
delete data.action;
delete data.errors;
delete data.loading;
delete data.response;
return data;
}
reset() {
for (let form_element of document.getElementsByTagName("input")) {
var name = form_element.getAttribute('name');
if (this[name]) {
this[name] = '';
}
}
for (let form_element of document.getElementsByTagName("textarea")) {
var name = form_element.getAttribute('name');
if (this[name]) {
this[name] = '';
}
}
for (let form_element of document.getElementsByTagName("select")) {
var name = form_element.getAttribute('name');
if (this[name]) {
this[name] = '';
}
}
}
2020-02-28 15:49:23 +03:00
oldSubmit() {
2019-11-16 10:21:14 +03:00
this.loading = true;
2020-02-28 15:49:23 +03:00
window.axios({
method: this.method,
url: this.action,
data: this.data()
})
.then(this.onSuccess.bind(this))
.catch(this.onFail.bind(this));
}
2020-02-28 15:49:23 +03:00
submit() {
FormData.prototype.appendRecursive = function(data, wrapper = null) {
2021-02-10 12:07:33 +03:00
for (var name in data) {
if (name == "previewElement" || name == "previewTemplate") {
continue;
}
2020-02-28 15:49:23 +03:00
if (wrapper) {
2020-12-24 01:28:38 +03:00
if ((typeof data[name] == 'object' || Array.isArray(data[name])) && ((data[name] instanceof File != true ) && (data[name] instanceof Blob != true))) {
2020-02-28 15:49:23 +03:00
this.appendRecursive(data[name], wrapper + '[' + name + ']');
} else {
this.append(wrapper + '[' + name + ']', data[name]);
}
} else {
2020-12-24 01:28:38 +03:00
if ((typeof data[name] == 'object' || Array.isArray(data[name])) && ((data[name] instanceof File != true ) && (data[name] instanceof Blob != true))) {
2020-02-28 15:49:23 +03:00
this.appendRecursive(data[name], name);
} else {
this.append(name, data[name]);
}
}
}
};
this.loading = true;
let data = this.data();
2020-02-28 15:49:23 +03:00
let form_data = new FormData();
form_data.appendRecursive(data);
2020-02-28 15:49:23 +03:00
window.axios({
method: this.method,
url: this.action,
data: form_data,
headers: {
2020-02-28 15:49:23 +03:00
'X-CSRF-TOKEN': window.Laravel.csrfToken,
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'multipart/form-data'
}
})
2019-11-16 10:21:14 +03:00
.then(this.onSuccess.bind(this))
.catch(this.onFail.bind(this));
}
2021-11-05 19:16:04 +03:00
async asyncSubmit() {
FormData.prototype.appendRecursive = function(data, wrapper = null) {
for (var name in data) {
if (name == "previewElement" || name == "previewTemplate") {
continue;
}
if (wrapper) {
if ((typeof data[name] == 'object' || Array.isArray(data[name])) && ((data[name] instanceof File != true ) && (data[name] instanceof Blob != true))) {
this.appendRecursive(data[name], wrapper + '[' + name + ']');
} else {
this.append(wrapper + '[' + name + ']', data[name]);
}
} else {
if ((typeof data[name] == 'object' || Array.isArray(data[name])) && ((data[name] instanceof File != true ) && (data[name] instanceof Blob != true))) {
this.appendRecursive(data[name], name);
} else {
this.append(name, data[name]);
}
}
}
};
this.loading = true;
let data = this.data();
let form_data = new FormData();
form_data.appendRecursive(data);
await window.axios({
method: this.method,
url: this.action,
data: form_data,
headers: {
'X-CSRF-TOKEN': window.Laravel.csrfToken,
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'multipart/form-data'
}
})
.then(this.onSuccess.bind(this))
.catch(this.onFail.bind(this));
}
2019-11-16 10:21:14 +03:00
onSuccess(response) {
this.errors.clear();
this.loading = false;
if (response.data.redirect) {
this.loading = true;
window.location.href = response.data.redirect;
}
this.response = response.data;
}
// Form fields check validation issue
onFail(error) {
this.errors.record(error.response.data.errors);
this.loading = false;
}
}