VladislavNechepaev

Untitled

Aug 20th, 2020
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.   // ==================== MEIDO ====================
  2.  
  3.   class MeidoCart{
  4.   constructor(itemList, limit, cartElem, dateElemsCollection, fsMeidoField, reverseDate){
  5.     console.log('constructing')
  6.     this.itemList = itemList
  7.     this.dailyLimit = limit
  8.     //this.renderElementId = elemId
  9.     this.renderTarget = cartElem
  10.     this.reverseDate = reverseDate
  11.     this.targetField = fsMeidoField
  12.     this.dateElemsCollection = dateElemsCollection
  13.     console.log(this.dateElemsCollection)
  14.     this.dateCollection = null
  15.     this.selectedRadio = null
  16.  
  17.     this.dateElemsCollection.forEach(dateElem => {
  18.       dateElem.onchange = function(){
  19.         this.calcDateCollection()
  20.         this.render()
  21.       }
  22.     })
  23.   }
  24.  
  25.   init(){
  26.     this.calcDateCollection()
  27.   }
  28.  
  29.   reverse(date){
  30.     const vals = date.split("-")
  31.     //return `${vals[2]}-${vals[1]}-${vals[0]}`
  32.     return vals[2]+"-"+vals[1]+"-"+vals[0]
  33.   }
  34.  
  35.   calcDateCollection(){
  36.     if (!this.dateCollection) this.dateCollection = {}
  37.     var flag = false
  38.     var collection = []
  39.     var dateObj = {}
  40.     this.dateElemsCollection.forEach(dateElem => {
  41.       if (dateElem.value) {
  42.         flag = true
  43.         collection.push(dateElem.value)
  44.       }
  45.       if (dateElem.value){
  46.         if (!this.dateCollection[dateElem.value]){
  47.           dateObj[dateElem.value] = {
  48.             limit: this.dailyLimit,
  49.             items: {}
  50.           }
  51.         } else {
  52.           dateObj[dateElem.value] = this.dateCollection[dateElem.value]
  53.         }
  54.       }
  55.     })
  56.     if (!this.selectedRadio || !collection.includes(this.selectedRadio)) this.selectedRadio = this.dateElemsCollection[0].value
  57.     if (!flag) dateObj = null
  58.     this.dateCollection = dateObj
  59.     this.render()
  60.   }
  61.  
  62.   get cartState(){
  63.     return JSON.stringify(this.dateCollection)
  64.   }
  65.  
  66.   render(){
  67.     const wrapper = document.createElement("div")
  68.     if (!this.dateCollection) {
  69.       wrapper.innerHTML = "Диапазон дат указан неверно!"
  70.     } else {
  71.       for(let date in this.dateCollection){
  72.         const dateWrapper = document.createElement("div")
  73.         dateWrapper.className += "meido-cart-date-wrapper"
  74.         const header = document.createElement("div")
  75.         header.className += "meido-cart-date-header"
  76.         const radio = document.createElement("input")
  77.         radio.type = "radio"
  78.         radio.id = date
  79.         radio.value = date
  80.         radio.name = "date-radio"
  81.         radio.addEventListener('change', function(e){
  82.           this.selectedRadio = e.target.value
  83.         }.bind(this))
  84.         if (date === this.selectedRadio) radio.checked = true
  85.         header.appendChild(radio)
  86.         const label = document.createElement("label")
  87.         label.htmlFor = date
  88.         //label.innerHTML += `${date} (остаток: ${this.dateCollection[date].limit} грн.)`
  89.         label.innerHTML += date+" (остаток: "+this.dateCollection[date].limit+" грн.)"
  90.         header.appendChild(label)
  91.         dateWrapper.appendChild(header)
  92.         var flag = false
  93.         for(let item in this.dateCollection[date].items){
  94.           flag = true
  95.           const itemElem = document.createElement("div")
  96.           itemElem.className += "meido-cart-item"
  97.           const itemText = document.createElement("span")
  98.           //itemText.innerHTML = `${this.dateCollection[date].items[item]} x ${this.itemList[item].name}`
  99.           itemText.innerHTML = this.dateCollection[date].items[item]+" x "+this.itemList[item].name
  100.           itemElem.appendChild(itemText)
  101.           const itemRemove = document.createElement("button")
  102.           itemRemove.innerHTML = "X"
  103.           itemRemove.className += "meido-cart-item-remove"
  104.           itemRemove.onclick = function(){ this.removeMeidoItem(item, date) }.bind(this)
  105.           itemElem.appendChild(itemRemove)
  106.           dateWrapper.appendChild(itemElem)
  107.         }
  108.         if (!flag) {
  109.           const itemEmpty = document.createElement("div")
  110.           itemEmpty.className += "meido-cart-item"
  111.           itemEmpty.style.color = "grey"
  112.           itemEmpty.innerHTML = "<i>Ничего не добавлено</i>"
  113.           dateWrapper.appendChild(itemEmpty)
  114.         }
  115.         wrapper.appendChild(dateWrapper)
  116.       }
  117.     }
  118.     this.renderTarget.innerHTML = ""
  119.     this.renderTarget.appendChild(wrapper)
  120.     document.getElementById(this.targetField).innerHTML = this.cartState
  121.   }
  122.  
  123.   addMeidoItem(itemId){
  124.     if (this.dateCollection[this.selectedRadio].limit - this.itemList[itemId].price >= 0) {
  125.       if (!this.dateCollection[this.selectedRadio].items[itemId]) {
  126.         this.dateCollection[this.selectedRadio].items[itemId] = 1
  127.       } else {
  128.         this.dateCollection[this.selectedRadio].items[itemId] += 1
  129.       }
  130.       this.dateCollection[this.selectedRadio].limit -= this.itemList[itemId].price
  131.     } else {
  132.       console.error('Insufficient funds!')
  133.     }
  134.     this.render()
  135.   }
  136.  
  137.   removeMeidoItem(itemId, date){
  138.     this.dateCollection[date].items[itemId] -= 1
  139.     if (this.dateCollection[date].items[itemId] === 0) delete this.dateCollection[date].items[itemId]
  140.     this.dateCollection[date].limit += this.itemList[itemId].price
  141.     this.render()
  142.   }
  143. }
  144.  
  145. function meidoInit(container, dateElemsCollection, fsMeidoField, limit, reverseDate = false){
  146.   const innerContainer = document.createElement("div")
  147.  
  148.   return fetch("https://analytics.getmeido.com/api/fs/product-list?token=test")
  149.   .then(res => {return res.json()})
  150.   .then(data => {
  151.     const title = document.createElement("h4")
  152.     title.innerHTML = "Заказ еды Meido"
  153.     innerContainer.appendChild(title)
  154.     const mainWindow = buildMeidoWindow(data, dateElemsCollection, fsMeidoField, limit, reverseDate)
  155.     innerContainer.appendChild(mainWindow)
  156.     meidoCart.init()
  157.     container.appendChild(innerContainer)
  158.     return innerContainer
  159.   })
  160.  
  161. }
  162.  
  163. function buildMeidoWindow(apiData, dateElemsCollection, fsMeidoField, limit, reverseDate){
  164.   const wrapper = document.createElement("div")
  165.   wrapper.className += "meido-main-window"
  166.   const menuElem = document.createElement("div")
  167.   menuElem.id = "meido-menu"
  168.   const cartElem = document.createElement("div")
  169.   cartElem.id = "meido-cart"
  170.   var categorized = {}
  171.   var flat = {}
  172.   apiData.forEach(item => {
  173.     if (!categorized[item.product_contractor_title]) categorized[item.product_contractor_title] = {}
  174.     if (!categorized[item.product_contractor_title][item.category_title]) categorized[item.product_contractor_title][item.category_title] = {}
  175.     categorized[item.product_contractor_title][item.category_title][item.id] = item
  176.     flat[item.id] = {
  177.       name: item.product_title,
  178.       price: parseInt(item.product_price)
  179.     }
  180.   })
  181.   menuElem.appendChild(buildMenu(categorized))
  182.   console.log(limit, dateElemsCollection, reverseDate)
  183.   window.meidoCart = new MeidoCart(flat, limit, cartElem, dateElemsCollection, fsMeidoField, reverseDate)
  184.   cartElem.className += "meido-cart-wrapper"
  185.   wrapper.appendChild(menuElem)
  186.   wrapper.appendChild(cartElem)
  187.   return wrapper
  188. }
  189.  
  190. function buildMenu(data){
  191.   const wrapper = document.createElement("div")
  192.   wrapper.className += "meido-menu-wrapper"
  193.   for(let category in data){
  194.     const categoryWrapper = document.createElement("div")
  195.     const categoryHeader = document.createElement("div")
  196.     categoryHeader.className += "meido-category-title"
  197.     const categoryArrow = document.createElement("span")
  198.     categoryArrow.className += "arrow"
  199.     categoryArrow.innerHTML = "►"
  200.     const categoryTitle = document.createElement("span")
  201.     categoryTitle.innerHTML = category
  202.     categoryHeader.appendChild(categoryArrow)
  203.     categoryHeader.appendChild(categoryTitle)
  204.     const categoryContent = document.createElement("div")
  205.     categoryContent.className += "meido-category-content"
  206.     categoryHeader.onclick = function(){
  207.       categoryContent.hidden = !categoryContent.hidden
  208.       categoryArrow.innerHTML = (categoryArrow.innerHTML === "►" ? "▼" : "►")
  209.     }
  210.     categoryContent.hidden = true
  211.     categoryWrapper.appendChild(categoryHeader)
  212.     for(let contractor in data[category]){
  213.       const contractorWrapper = document.createElement("div")
  214.       const contractorHeader = document.createElement("div")
  215.       contractorHeader.className += "meido-contractor-title"
  216.       const contractorArrow = document.createElement("span")
  217.       contractorArrow.className += "arrow"
  218.       contractorArrow.innerHTML = "►"
  219.       const contractorTitle = document.createElement("span")
  220.       contractorTitle.innerHTML = contractor
  221.       contractorHeader.appendChild(contractorArrow)
  222.       contractorHeader.appendChild(contractorTitle)
  223.       const contractorContent = document.createElement("div")
  224.       contractorContent.className += "meido-contractor-content"
  225.       contractorHeader.onclick = function(){
  226.         contractorContent.hidden = !contractorContent.hidden
  227.         contractorArrow.innerHTML = (contractorArrow.innerHTML === "►" ? "▼" : "►")
  228.       }
  229.       contractorContent.hidden = true
  230.       contractorWrapper.appendChild(contractorHeader)
  231.       for(let item in data[category][contractor]){
  232.         contractorContent.appendChild(buildMenuItem(data[category][contractor][item]))
  233.       }
  234.       contractorWrapper.appendChild(contractorContent)
  235.       categoryContent.appendChild(contractorWrapper)
  236.     }
  237.     categoryWrapper.appendChild(categoryContent)
  238.     wrapper.appendChild(categoryWrapper)
  239.   }
  240.  
  241.   return wrapper
  242. }
  243.  
  244. function buildMenuItem(item){
  245.   const wrapper = document.createElement("div")
  246.   wrapper.className += "meido-item"
  247.   const itemTitle = document.createElement("div")
  248.   itemTitle.innerHTML = "<u>" + item.product_title + "</u>"
  249.   itemTitle.className += "meido-item-title"
  250.   const itemPic = document.createElement("img")
  251.   itemPic.src = item.photo_url
  252.   itemPic.className += "meido-pic"
  253.   const itemDesc = document.createElement("div")
  254.   itemDesc.innerHTML = item.product_description
  255.   const price = document.createElement("span")
  256.   //price.innerHTML = `<i>Цена: ${item.product_price} грн.</i>`
  257.   price.innerHTML = "<i>Цена: "+item.product_price+" грн.</i>"
  258.   price.className += "meido-price"
  259.   const add = document.createElement("button")
  260.   add.innerHTML = "Добавить"
  261.   add.className += "meido-add-button"
  262.   add.onclick = null
  263.   add.onclick = function(e){
  264.     e.preventDefault()
  265.     meidoCart.addMeidoItem(item.id)
  266.   }
  267.   wrapper.appendChild(itemTitle)
  268.   wrapper.appendChild(itemPic)
  269.   wrapper.appendChild(itemDesc)
  270.   wrapper.appendChild(add)
  271.   wrapper.appendChild(price)
  272.   return wrapper
  273. }
Add Comment
Please, Sign In to add comment