VladislavNechepaev

Untitled

Aug 27th, 2020
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class MeidoCart{
  2.   constructor(itemList, limit, cartElem, dateElemsCollection, fsMeidoField, reverseDate){
  3.     console.log('constructing')
  4.     this.itemList = itemList
  5.     this.dailyLimit = limit
  6.     //this.renderElementId = elemId
  7.     this.renderTarget = cartElem
  8.     this.reverseDate = reverseDate
  9.     this.targetField = fsMeidoField
  10.     this.dateElemsCollection = dateElemsCollection
  11.     console.log(this.dateElemsCollection)
  12.     this.dateCollection = null
  13.     this.selectedRadio = null
  14.  
  15.     this.dateElemsCollection.forEach(dateElem => {
  16.       dateElem.onchange = function(){
  17.         this.calcDateCollection()
  18.         this.render()
  19.       }
  20.     })
  21.   }
  22.  
  23.   init(){
  24.     this.calcDateCollection()
  25.   }
  26.  
  27.   reverse(date){
  28.     const vals = date.split("-")
  29.     //return `${vals[2]}-${vals[1]}-${vals[0]}`
  30.     return vals[2]+"-"+vals[1]+"-"+vals[0]
  31.   }
  32.  
  33.   calcDateCollection(){
  34.     if (!this.dateCollection) this.dateCollection = {}
  35.     var flag = false
  36.     var collection = []
  37.     var dateObj = {}
  38.     this.dateElemsCollection.forEach(dateElem => {
  39.       if (dateElem.value) {
  40.         flag = true
  41.         collection.push(dateElem.value)
  42.       }
  43.       const weekday = new Date(dateElem.value).getDay()
  44.       if (dateElem.value && weekday !== 6 && weekday !== 0){
  45.         if (!this.dateCollection[dateElem.value]){
  46.           dateObj[dateElem.value] = {
  47.             limit: this.dailyLimit,
  48.             items: {}
  49.           }
  50.         } else {
  51.           dateObj[dateElem.value] = this.dateCollection[dateElem.value]
  52.         }
  53.       }
  54.     })
  55.     if (!this.selectedRadio || !collection.includes(this.selectedRadio)) this.selectedRadio = this.dateElemsCollection[0].value
  56.     if (!flag) dateObj = null
  57.     this.dateCollection = dateObj
  58.     this.render()
  59.   }
  60.  
  61.   get cartState(){
  62.     return JSON.stringify(this.dateCollection)
  63.   }
  64.  
  65.   render(){
  66.     const wrapper = document.createElement("div")
  67.     if (!this.dateCollection) {
  68.       wrapper.innerHTML = "Диапазон дат указан неверно!"
  69.     } else {
  70.       for(let date in this.dateCollection){
  71.         const dateWrapper = document.createElement("div")
  72.         dateWrapper.className += "meido-cart-date-wrapper"
  73.         const header = document.createElement("div")
  74.         header.className += "meido-cart-date-header"
  75.         const radio = document.createElement("input")
  76.         radio.type = "radio"
  77.         radio.id = date
  78.         radio.value = date
  79.         radio.name = "date-radio"
  80.         radio.addEventListener('change', function(e){
  81.           this.selectedRadio = e.target.value
  82.         }.bind(this))
  83.         if (date === this.selectedRadio) radio.checked = true
  84.         header.appendChild(radio)
  85.         const label = document.createElement("label")
  86.         label.htmlFor = date
  87.         //label.innerHTML += `${date} (остаток: ${this.dateCollection[date].limit} грн.)`
  88.         label.innerHTML += date+" (остаток: "+this.dateCollection[date].limit+" грн.)"
  89.         header.appendChild(label)
  90.         dateWrapper.appendChild(header)
  91.         var flag = false
  92.         for(let item in this.dateCollection[date].items){
  93.           flag = true
  94.           const itemElem = document.createElement("div")
  95.           itemElem.className += "meido-cart-item"
  96.           const itemText = document.createElement("span")
  97.           //itemText.innerHTML = `${this.dateCollection[date].items[item]} x ${this.itemList[item].name}`
  98.           itemText.innerHTML = this.dateCollection[date].items[item]+" x "+this.itemList[item].name
  99.           itemText.style.width = "90%"
  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="+meidoToken)
  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.   }).catch(err => {
  160.     console.error("[MEIDO] Cannot get Meido menu!")
  161.     console.error(err)
  162.   })
  163.  
  164. }
  165.  
  166. function buildMeidoWindow(apiData, dateElemsCollection, fsMeidoField, limit, reverseDate){
  167.   const wrapper = document.createElement("div")
  168.   wrapper.className += "meido-main-window"
  169.   const menuElem = document.createElement("div")
  170.   menuElem.id = "meido-menu"
  171.   const cartElem = document.createElement("div")
  172.   cartElem.id = "meido-cart"
  173.   var categorized = {}
  174.   var flat = {}
  175.   apiData.forEach(item => {
  176.     if (!categorized[item.product_contractor_title]) categorized[item.product_contractor_title] = {}
  177.     if (!categorized[item.product_contractor_title][item.category_title]) categorized[item.product_contractor_title][item.category_title] = {}
  178.     categorized[item.product_contractor_title][item.category_title][item.id] = item
  179.     flat[item.id] = {
  180.       name: item.product_title,
  181.       price: parseFloat(item.product_price),
  182.       bzhu: item.bzhu,
  183.       weight: item.weight,
  184.       cal: item.cal
  185.     }
  186.   })
  187.   menuElem.appendChild(buildMenu(categorized))
  188.   console.log(limit, dateElemsCollection, reverseDate)
  189.   window.meidoCart = new MeidoCart(flat, limit, cartElem, dateElemsCollection, fsMeidoField, reverseDate)
  190.   cartElem.className += "meido-cart-wrapper"
  191.   wrapper.appendChild(menuElem)
  192.   wrapper.appendChild(cartElem)
  193.   return wrapper
  194. }
  195.  
  196. function buildMenu(data){
  197.   const wrapper = document.createElement("div")
  198.   wrapper.className += "meido-menu-wrapper"
  199.   for(let category in data){
  200.     const categoryWrapper = document.createElement("div")
  201.     const categoryHeader = document.createElement("div")
  202.     categoryHeader.className += "meido-category-title"
  203.     const categoryArrow = document.createElement("span")
  204.     categoryArrow.className += "arrow"
  205.     categoryArrow.innerHTML = "►"
  206.     const categoryTitle = document.createElement("span")
  207.     categoryTitle.innerHTML = category
  208.     categoryHeader.appendChild(categoryArrow)
  209.     categoryHeader.appendChild(categoryTitle)
  210.     const categoryContent = document.createElement("div")
  211.     categoryContent.className += "meido-category-content"
  212.     categoryHeader.onclick = function(){
  213.       categoryContent.hidden = !categoryContent.hidden
  214.       categoryArrow.innerHTML = (categoryArrow.innerHTML === "►" ? "▼" : "►")
  215.     }
  216.     categoryContent.hidden = true
  217.     categoryWrapper.appendChild(categoryHeader)
  218.     for(let contractor in data[category]){
  219.       const contractorWrapper = document.createElement("div")
  220.       const contractorHeader = document.createElement("div")
  221.       contractorHeader.className += "meido-contractor-title"
  222.       const contractorArrow = document.createElement("span")
  223.       contractorArrow.className += "arrow"
  224.       contractorArrow.innerHTML = "►"
  225.       const contractorTitle = document.createElement("span")
  226.       contractorTitle.innerHTML = contractor
  227.       contractorHeader.appendChild(contractorArrow)
  228.       contractorHeader.appendChild(contractorTitle)
  229.       const contractorContent = document.createElement("div")
  230.       contractorContent.className += "meido-contractor-content"
  231.       contractorHeader.onclick = function(){
  232.         contractorContent.hidden = !contractorContent.hidden
  233.         contractorArrow.innerHTML = (contractorArrow.innerHTML === "►" ? "▼" : "►")
  234.       }
  235.       contractorContent.hidden = true
  236.       contractorWrapper.appendChild(contractorHeader)
  237.       for(let item in data[category][contractor]){
  238.         contractorContent.appendChild(buildMenuItem(data[category][contractor][item]))
  239.       }
  240.       contractorWrapper.appendChild(contractorContent)
  241.       categoryContent.appendChild(contractorWrapper)
  242.     }
  243.     categoryWrapper.appendChild(categoryContent)
  244.     wrapper.appendChild(categoryWrapper)
  245.   }
  246.  
  247.   return wrapper
  248. }
  249.  
  250. function buildMenuItem(item){
  251.   const wrapper = document.createElement("div")
  252.   wrapper.className += "meido-item"
  253.   const itemTitle = document.createElement("div")
  254.   itemTitle.innerHTML = item.product_title
  255.   itemTitle.className += "meido-item-title"
  256.   const descWrapper = document.createElement("div")
  257.   descWrapper.className += "meido-desc-wrapper"
  258.   const itemPic = document.createElement("img")
  259.   itemPic.src = item.photo_url
  260.   itemPic.className += "meido-pic"
  261.   const innerWrapper = document.createElement("div")
  262.   const itemDesc = document.createElement("div")
  263.   itemDesc.innerHTML = item.product_description
  264.   itemDesc.className += "meido-desc-text"
  265.   const itemInfo = document.createElement("div")
  266.   itemInfo.innerHTML = item.weight + " gr.    " + item.cal
  267.   itemInfo.className += "meido-item-bzhu"
  268.   const itemBzhu = document.createElement("div")
  269.   itemBzhu.innerHTML = item.bzhu
  270.   itemBzhu.className += "meido-item-bzhu"
  271.   descWrapper.appendChild(itemPic)
  272.   innerWrapper.appendChild(itemDesc)
  273.   innerWrapper.appendChild(itemInfo)
  274.   descWrapper.appendChild(innerWrapper)
  275.   const price = document.createElement("span")
  276.   //price.innerHTML = `<i>Цена: ${item.product_price} грн.</i>`
  277.   price.innerHTML = "Цена: "+item.product_price+" грн."
  278.   price.className += "meido-price"
  279.   const add = document.createElement("button")
  280.   add.innerHTML = "Buy"
  281.   add.className += "meido-add-button"
  282.   add.onclick = null
  283.   add.onclick = function(e){
  284.     e.preventDefault()
  285.     meidoCart.addMeidoItem(item.id)
  286.   }
  287.   wrapper.appendChild(itemTitle)
  288.   wrapper.appendChild(descWrapper)
  289.   wrapper.appendChild(itemBzhu)
  290.   wrapper.appendChild(add)
  291.   wrapper.appendChild(price)
  292.   return wrapper
  293. }
Add Comment
Please, Sign In to add comment