Advertisement
Todorov_Stanimir

08. Furniture Exercise: DOM

Oct 8th, 2019
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function solve() {
  2.     const [generateButton, buyButton] = document.getElementsByTagName('button');
  3.  
  4.     const demarkInputElements = () => { document.querySelector('input').disabled = false }
  5.  
  6.     const getInfoForNewFurniture = () => { return JSON.parse(document.querySelector('textarea').value) }
  7.  
  8.     const formingNewRow = (obj) => {
  9.         incomElem = {
  10.             'decFactor': 'consistStartAndEndTag',
  11.             'price': 'consistStartAndEndTag',
  12.             'name': 'consistStartAndEndTag',
  13.             'img': 'img'
  14.         }
  15.         htmlElem = {
  16.             'img': function (obj, key) { return `<td><img src="${obj[key]}"></td>` },
  17.             'consistStartAndEndTag': function (obj, key) { return `<td><p>${obj[key]}</p></td>` }
  18.         }
  19.         return ['decFactor', 'price', 'name', 'img'].reduce((row, key) => {
  20.             row.unshift(htmlElem[incomElem[key]](obj, key));
  21.             return row
  22.         }, [`<td><input type="checkbox"/></td>`]).join('');
  23.     }
  24.  
  25.     const addNewRowInTable = (newRow) => {
  26.         let row = document.createElement('tr');
  27.         row.innerHTML = newRow;
  28.         let tBody = document.getElementsByTagName('tbody')[0];
  29.         tBody.appendChild(row);
  30.     }
  31.  
  32.     const getMarkedFurniture = () => { return [...document.getElementsByTagName('input')].filter(el => el.checked === true) }
  33.  
  34.     const generateTable = () => {
  35.         demarkInputElements();
  36.         getInfoForNewFurniture().map(el => { addNewRowInTable(formingNewRow(el)) })
  37.     }
  38.  
  39.     const collectInfoForBoughtFurniture = (checkedInput) => {
  40.         let namesBoughtFurniture = [];
  41.         let priceBoughtFurniture = 0;
  42.         let decFactor = 0;
  43.         checkedInput.map(el => {
  44.             const parenEl = el.parentElement.parentElement;
  45.             namesBoughtFurniture.push(parenEl.children[1].textContent.trim());
  46.             priceBoughtFurniture += Number(parenEl.children[2].textContent);
  47.             decFactor += Number(parenEl.children[3].textContent);
  48.         });
  49.         let avgDecFactor = decFactor / namesBoughtFurniture.length;
  50.         let names = namesBoughtFurniture.join(', ');
  51.         priceBoughtFurniture = priceBoughtFurniture.toFixed(2);
  52.         return [names, priceBoughtFurniture, avgDecFactor];
  53.     }
  54.  
  55.     const addInfoInTextArea = (infoForBoughtFurnitures) => {
  56.         let textAreaElement = document.getElementsByTagName('textarea')[1];
  57.         textAreaElement.disabled = false;
  58.         let output = ['Bought furniture: ', 'Total price: ', 'Average decoration factor: ']
  59.             .map((el, ind) => { return el += String(infoForBoughtFurnitures[ind]) }).join('\n');
  60.         textAreaElement.innerHTML = output;
  61.     }
  62.  
  63.     const buy = () => {
  64.         addInfoInTextArea(collectInfoForBoughtFurniture(getMarkedFurniture()));
  65.     }
  66.  
  67.     generateButton.addEventListener('click', generateTable);
  68.     buyButton.addEventListener('click', buy);
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement