Advertisement
Guest User

Untitled

a guest
Jul 19th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function randomString(len = 8, charSet) {
  2.     charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  3.     let output = '';
  4.     for (let i = 0; i < len; i++) {
  5.         let randomPoz = Math.floor(Math.random() * charSet.length);
  6.         output += charSet.substring(randomPoz, randomPoz + 1);
  7.     }
  8.     return output;
  9. }
  10. function makeHiddenInput(value, name) {
  11.     return `<input type="hidden" value="${value}" name="portfolio_data${name}">`;
  12. }
  13.  
  14. $(document).ready(function () {
  15.     class Form {
  16.         constructor(container) {
  17.             this.container = container;
  18.             this.itemTemplate = {};
  19.             this.items = {};
  20.             this.tableHeader = [];
  21.             this.activeItem = false;
  22.         }
  23.         init() {
  24.             this.container.append('<div class="p-form__data-to-send"></div>');
  25.             const self = this;
  26.             let isDates = false;
  27.             this.container.find('.form-input').each(function () {
  28.                 const $input = $(this).find('input, textarea');
  29.                 if (!$(this).hasClass('form-input--date')) {
  30.                     self.tableHeader.push($input.attr('placeholder'));
  31.                     if (!$input.attr('name')) {
  32.                         throw 'input has no attribute "name"';
  33.                     }
  34.                     self.itemTemplate[$input.attr('name')] = '';
  35.                 } else if (!isDates) {
  36.                     self.itemTemplate.dates = {};
  37.                     isDates = true;
  38.                     $('.form-input--date').each(function () {
  39.                         let $in = $(this).find('input');
  40.                         if (!$in.attr('name')) {
  41.                             throw 'input has no attribute "name"';
  42.                         }
  43.                         self.itemTemplate.dates[$in.attr('name')] = '';
  44.                     });
  45.                 }
  46.             });
  47.             if (isDates) {
  48.                 self.tableHeader.push('Dates');
  49.             }
  50.             if (window.preloadDataForForm) {
  51.                 this.items = Object.assign(this.items, window.preloadDataForForm);
  52.                 self.setActive(Object.keys(self.items)[0]);
  53.             } else {
  54.                 this.addItem();
  55.             }
  56.         }
  57.         update() {
  58.             let template = '';
  59.             let hiddenInputs = '';
  60.             for (let i = 0; i < this.tableHeader.length; i++) {
  61.                 template += `<div class="form-table__col">${this.tableHeader[i]}</div>`;
  62.             }
  63.             this.container.find('.form-table__header').html(template);
  64.             template = '';
  65.             for (let i in this.items) {
  66.                 if (this.items.hasOwnProperty(i)) {
  67.                     template += `<div class="form-table__row ${ i === this.activeItem ? 'form-table__row--active' : ''}" data-row-id="${i}">`;
  68.                     for (let item in this.items[i]) {
  69.                         if (this.items[i].hasOwnProperty(item)) {
  70.                             if (item !== 'dates') {
  71.                                 template += `<div class="form-table__col">${this.items[i][item]}</div>`;
  72.                                 hiddenInputs += makeHiddenInput(this.items[i][item], `[${i}][${item}]`);
  73.                             }
  74.                         }
  75.                     }
  76.                     if (this.items[i].hasOwnProperty('dates')) {
  77.                         let text = this.items[i].dates.hasOwnProperty('text') ? this.items[i].dates.text : '';
  78.                         template += `<div class="form-table__col">${text}</div>`;
  79.                         for (let date in this.items[i].dates) {
  80.                             if (this.items[i].dates.hasOwnProperty(date)) {
  81.                                 if (date !== 'text') {
  82.                                     hiddenInputs += makeHiddenInput(this.items[i].dates[date], `[${i}][${date}]`);
  83.                                 }
  84.                             }
  85.                         }
  86.                     }
  87.                     template += `<div class="form-table__buttons">
  88.                                         <div class="form-table__buttons-item" data-action="edit"><span><i class="linear-pencil-line"></i>Edit</span></div>
  89.                                         <div class="form-table__buttons-item" data-action="delete"><span><i class="linear-trash2"></i>Delete</span></div>
  90.                                   </div>`;
  91.                 }
  92.                 template += '</div>';
  93.             }
  94.             this.container.find('.form-table__data').html(template);
  95.             this.container.find('.p-form__data-to-send').html(hiddenInputs);
  96.         }
  97.         fieldChange($field) {
  98.             const attr = $field.attr('name');
  99.             if (!this.activeItem) {
  100.                 this.addItem();
  101.             }
  102.             if (this.activeItem) {
  103.                 if (!$field.parents('.form-input').hasClass('form-input--date')) {
  104.                     this.items[this.activeItem][attr] = $field.val();
  105.                 } else {
  106.                     let dates = '';
  107.                     $('.form-input--date input').each(function () {
  108.                         dates += $(this).val() + ' ';
  109.                     });
  110.                     this.items[this.activeItem].dates[attr] = $field.val();
  111.                     this.items[this.activeItem].dates.text = dates;
  112.                 }
  113.                 this.update();
  114.             }
  115.         }
  116.         addItem() {
  117.             const id = randomString();
  118.             this.activeItem = id;
  119.             this.items[id] = Object.assign({}, this.itemTemplate);
  120.             if (this.itemTemplate.hasOwnProperty('dates')) {
  121.                 this.items[id].dates = Object.assign({}, this.itemTemplate.dates);
  122.             }
  123.             this.container.find('.form-input').each(function () {
  124.                 $(this).find('input, textarea').val('');
  125.             });
  126.             this.update();
  127.         }
  128.         deleteItem(id) {
  129.             delete this.items[id];
  130.             this.activeItem = false;
  131.             this.container.find('.form-input').each(function () {
  132.                 $(this).find('input, textarea').val('');
  133.             });
  134.             this.update();
  135.         }
  136.         setActive(id) {
  137.             this.activeItem = id;
  138.             const current = this.items[id];
  139.             const self = this;
  140.             $('.form-input input, .form-input textarea').val('');
  141.             for (let i in current) {
  142.                 if (current.hasOwnProperty(i)) {
  143.                     $(`[name="${i}"]`).val(current[i]);
  144.                 }
  145.             }
  146.             for (let i in current.dates) {
  147.                 if (current.dates.hasOwnProperty(i)) {
  148.                     $(`[name="${i}"]`).val(current.dates[i]);
  149.                 }
  150.             }
  151.             self.update();
  152.         }
  153.     }
  154.     const $formObject = $('.form-table').parents('.p-form');
  155.     const form = new Form($formObject);
  156.  
  157.     form.container.find('.form-input input, .form-input textarea').on('keyup', function () {
  158.         form.fieldChange($(this));
  159.     });
  160.     form.container.on('click', '.form-table__buttons-item', function () {
  161.         const action = $(this).data('action');
  162.         const id = $(this).parents('.form-table__row').data('row-id');
  163.         if (action === 'edit') {
  164.             form.setActive(id);
  165.         } else if (action === 'delete') {
  166.             form.deleteItem(id);
  167.         }
  168.     });
  169.     $('[data-add-item]').click(function () {
  170.         form.addItem();
  171.     });
  172.     $('input[data-dp-id]').each(function () {
  173.         const field = $(this);
  174.         $(this).datepicker({
  175.             language: 'en',
  176.             onSelect: function () {
  177.                 form.fieldChange(field);
  178.             }
  179.         });
  180.         $(this).on('keyup keydown', function (e) {
  181.             e.preventDefault();
  182.         });
  183.     });
  184.  
  185.     form.init();
  186. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement