Advertisement
Guest User

class

a guest
Oct 14th, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class AddUserToTable {
  2.     constructor(formId, tableId) {
  3.         this._formEl = document.querySelector(formId);
  4.         this._tableEl = document.querySelector(tableId);
  5.         this.onSaveOfAdd();
  6.         this.previewPhotoOnForm();
  7.         // this.editUser();
  8.     }
  9.  
  10.     onSaveOfAdd() {
  11.         const save = document.querySelector('#save');
  12.         save.addEventListener('click', (event) => {
  13.             event.preventDefault();
  14.             save.disabled = true;
  15.             const valuesIsValid = this.getValues();
  16.             if (!valuesIsValid) {
  17.                 save.disabled = false;
  18.                 return false;
  19.             } else {
  20.                 const values = this.getValues();
  21.                 const photoData = async () => {
  22.                     try {
  23.                         // START - Add user with new photo
  24.                         const photo = await this.getPhoto();
  25.                         values.photo = photo;
  26.                         this.addUser(values);
  27.                         // END - Add user with new photo
  28.  
  29.                         // START - Form Preview
  30.                         const previewPhoto = document.querySelector('#preview-photo');
  31.                         previewPhoto.src = photo;
  32.                         // END - Form preview
  33.  
  34.                         // START - Reset form
  35.                         this.resetForm();
  36.                         // END - Reset form
  37.  
  38.                         save.disabled = false;
  39.                     } catch(error) {
  40.                         values.photo = 'https://cdn0.iconfinder.com/data/icons/cyber-crime-or-threats-glyph/120/hacker_cyber_crime-512.png';
  41.                         this.addUser(values);
  42.                         this.resetForm();
  43.                         save.disabled = false;
  44.                     }
  45.                 }
  46.                 photoData();
  47.             }
  48.         });
  49.     }
  50.  
  51.     resetForm() {
  52.         const spanFileName = document.querySelector('#filename');
  53.         const previewPhoto = document.querySelector('#preview-photo');        
  54.         this._formEl.reset();
  55.         spanFileName.innerHTML = '';
  56.         previewPhoto.src = 'https://cdn.iconscout.com/icon/free/png-256/hacker-7-71228.png';
  57.     }
  58.  
  59.     onCancelOfAdd() {
  60.         const cancel  = document.querySelector('#cancel');
  61.         cancel.addEventListener('click', () => {
  62.             this.resetForm();
  63.         });
  64.     }
  65.  
  66.     isValid() {
  67.         let valid = true;
  68.         const user = document.querySelector('[name="user"]');
  69.         const age = document.querySelector('[name="age"]');
  70.         if (!user.value.match(/(?=.*[a-zA-Z-_])[a-zA-Z-_]{3,}/gm) || user.value.match(/[0-9!@#$%¨&*.,()<>?ªº°¢¹²³¬|\/+^~§{}'=]/gm)) {
  71.             user.classList.remove('text-indigo-600', 'border-indigo-600', 'focus:border-indigo-500');
  72.             user.classList.add('text-pink-600', 'border-pink-600', 'focus:border-pink-500');
  73.             user.focus();
  74.             valid = false;
  75.         } else {
  76.             user.classList.remove('text-pink-600', 'border-pink-600', 'focus:border-pink-500');
  77.             user.classList.add('text-indigo-600', 'border-indigo-600', 'focus:border-indigo-500');
  78.         }
  79.  
  80.         if (!age.value.match(/[0-9]/gm) || age.value.match(/[a-zA-Z]/gm)) {
  81.             age.classList.remove('text-indigo-600', 'border-indigo-600', 'focus:border-indigo-500');
  82.             age.classList.add('text-pink-600', 'border-pink-600', 'focus:border-pink-500');
  83.             age.focus();
  84.             valid = false;
  85.         } else {
  86.             age.classList.remove('text-pink-600', 'border-pink-600', 'focus:border-pink-500');
  87.             age.classList.add('text-indigo-600', 'border-indigo-600', 'focus:border-indigo-500');
  88.         }
  89.        
  90.         if (valid) { return true } else { return false }
  91.     }
  92.  
  93.     previewPhotoOnForm() {
  94.         const previewPhoto = document.querySelector('#preview-photo');
  95.         const input = document.querySelector('[name="photo"]');
  96.         input.addEventListener('change', async () => {
  97.             const values = await this.getPhoto();
  98.             previewPhoto.src = values;
  99.         });
  100.     }
  101.  
  102.     getPhoto() {
  103.         return new Promise((resolve, reject) => {
  104.             const fileReader = new FileReader();
  105.             const file = document.querySelector('[name="photo"]').files[0];
  106.             fileReader.onload = () => resolve(fileReader.result);
  107.             fileReader.onerror = (error) => reject(error);
  108.             fileReader.readAsDataURL(file);
  109.         });
  110.     }
  111.  
  112.     getValues() {
  113.         let data = {}
  114.         let names = [...this._formEl.elements];
  115.         names.forEach((element) => {
  116.             if (element.name === 'developer') {
  117.                 if (element.checked) data[element.name] = element.value;
  118.             } else if (element.name === 'gender') {
  119.                 if (element.value === '') {
  120.                     data[element.name] = 'undefined';
  121.                 } else if (element.value === 'male') {
  122.                     data[element.name] = 'm';
  123.                 } else {
  124.                     data[element.name] = 'f';
  125.                 }
  126.             } else {
  127.                 data[element.name] = element.value;
  128.             }
  129.         });
  130.         if (!this.isValid()) return false;
  131.         return data;
  132.     }
  133.  
  134.     addUser(data) {
  135.         const tr = document.createElement('tr');
  136.         const tbody = this._tableEl.lastElementChild;
  137.  
  138.         const typeGender = (value) => {
  139.             if (value === 'm') {
  140.                 return 'Masculino';
  141.             } else if (value === 'f') {
  142.                 return 'Feminino';
  143.             } else {
  144.                 return 'Indefinido';
  145.             }
  146.         }
  147.  
  148.         tr.innerHTML = `
  149.             <td class="text-white uppercase text-center p-3"><img src="${data.photo}" alt="Perfil" class="mx-auto h-12 w-12 object-cover rounded-full"></td>
  150.             <td class="text-white uppercase text-center p-3">${data.user}</td>
  151.             <td class="text-white uppercase text-center p-3">${data.age}</td>
  152.             <td class="text-white uppercase text-center p-3">${typeGender(data.gender)}</td>
  153.             <td class="text-white uppercase text-center p-3">${data.language}</td>
  154.             <td class="text-white uppercase text-center p-3">${(data.developer === 'yes') ? 'Sim' : 'Não'}</td>
  155.             <td class="text-white uppercase text-center p-3">
  156.                 <button data-edit type="send" class="w-full mb-0 md:mb-2 lg:mb-2 px-3 py-1 bg-indigo-700 text-white font-semibold rounded hover:bg-indigo-600 focus:outline-none">Editar</button>
  157.                 <button id="delete" type="send" class="w-full mt-2 md:mt-0 lg:mt-0 px-3 py-1 bg-pink-600 text-white font-semibold rounded hover:bg-pink-500 focus:outline-none">Excluir</button>
  158.             </td>
  159.         `;
  160.         tbody.appendChild(tr);
  161.         this.editUser();
  162.     }
  163.  
  164.     editUser() {
  165.         let buttonEdit = [...document.querySelectorAll('[data-edit]')];
  166.         buttonEdit.forEach((element) => {
  167.             element.addEventListener('click', () => {
  168.                 console.log('Cliquei!');
  169.             });
  170.         });
  171.     }
  172.  
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement