2022-10-18 11:35:25 +03:00

503 lines
18 KiB
JavaScript
Vendored

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;
}
/*
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;
}
*/
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;
} 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 {
if (form_element.dataset.type != undefined) {
if (form_element.dataset.type == 'multiple') {
this[form_element.getAttribute('data-field')][name] = [];
} else {
this[form_element.getAttribute('data-field')][name] = '';
}
} else {
this[form_element.getAttribute('data-field')][name] = '';
}
}
}
} else {
this[form_element.getAttribute('data-field')][name] = form_element.getAttribute('value') || '';
}
continue;
}
if (type == 'radio') {
if (!this[name]) {
this[name] = (form_element.getAttribute('value') ? form_element.getAttribute('value') : 0) || 0;
} 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;
}
} 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;
}
} else {
if (form_element.dataset.type != undefined) {
if (form_element.dataset.type == 'multiple') {
this[name] = [];
} else {
this[name] = '';
}
} 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;
}
/*
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;
}
*/
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;
}
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;
}
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;
}
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] = '';
}
}
}
oldSubmit() {
this.loading = true;
window.axios({
method: this.method,
url: this.action,
data: this.data()
})
.then(this.onSuccess.bind(this))
.catch(this.onFail.bind(this));
}
submit() {
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);
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));
}
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));
}
onSuccess(response) {
this.errors.clear();
this.loading = false;
if (response.data.redirect) {
this.loading = true;
// Empty hash because /sale/customer/1#transaction redirect to sale/invoice/create.
window.location.hash = '';
window.location.href = response.data.redirect;
if (typeof window.location.hash != "undefined" && window.location.hash.length) {
location.reload();
}
}
this.response = response.data;
}
// Form fields check validation issue
onFail(error) {
if (typeof this.errors != "undefined") {
this.errors.record(error.response.data.errors);
}
this.loading = false;
}
}