180 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
			Vendored
		
	
	
	
| import Errors from './error';
 | |
| import axios from "axios";
 | |
| 
 | |
| 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 (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 (type == 'radio') {
 | |
|                 if (!this[name]) {
 | |
|                     this[name] = form_element.getAttribute('value') || '';
 | |
|                 }
 | |
|             } 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) {
 | |
|                         this[name] = form_element.value;
 | |
|                     } 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 (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 (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] = '';
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     submit() {
 | |
|         this.loading = true;
 | |
| 
 | |
|         axios[this.method](this.action, this.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;
 | |
| 
 | |
|             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;
 | |
|     }
 | |
| }
 |