{"version":3,"sources":["src/js/product/product-reviews.js","src/js/api/reviews.js","src/js/util/ellipsis.js","src/js/product/index.js"],"names":["remaining","BASE_URL","$reviewsContainer","$","productId","data","mustacheTitle","html","mustacheReview","reviews","page","setRating","$star","persist","prevAll","add","addClass","nextAll","removeClass","rating","closest","next","text","concat","$box","find","addReviews","arguments","length","undefined","limit","Promise","resolve","get","Reviews","then","response","append","Mustache","render","$vote","addedIds","map","res","uuid","addedReviews","filter","review","item","eq","includes","total","count","each","i","el","after","hasClass","fullContent","content","substring","on","e","remove","this","Ellipsis","$el","reviewId","processVotes","localStorage","getItem","preventDefault","stopPropagation","ls","vote","action","getToken","token","post","setItem","Number","not","star","target","$container","currentTarget","parseInt","children","parseFloat","number","API","document","ready","log","_ref","productList","default","console","_ref2","carousel","productCarousel","productReviews","products","_ref3","packageBuilder","_ref4","productPage","index","_ref5","productPackage","_ref6","_ref7","leasing"],"mappings":"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","file":"hashed/19.23b632c3.chunk.js","sourcesContent":["'use strict';\nimport $ from 'jquery';\nimport Mustache from 'mustache';\nimport * as Reviews from '../api/reviews';\nimport * as Ellipsis from '../util/ellipsis';\n\nconst $reviewsContainer = $('.js-reviews-container'),\n\tproductId = $reviewsContainer.data('product'),\n\tmustacheTitle = $('.js-review-title').html(),\n\tmustacheReview = $('.js-review-container').html(),\n\treviews = {},\n\treviewsInPage = 4;\n\nlet remaining;\nlet page = 1;\n\n/**\n * @param {jQuery} $star\n * @param {Boolean} persist\n */\nconst setRating = ($star, persist) => {\n\t$star.prevAll().add($star).addClass('fill');\n\t$star.nextAll().removeClass('fill');\n\tif (persist) {\n\t\tconst rating = $star.data('value');\n\t\tif (rating) {\n\t\t\t$star.closest('.product-review-stars')\n\t\t\t\t.data('rating', rating)\n\t\t\t\t.next('.product-review-rating')\n\t\t\t\t.text(`${rating} / 5`);\n\t\t}\n\t}\n}\n\nconst clearRating = $stars =>\n\t$stars.children().removeClass('fill').next('.product-review-rating').text('');\n\nexport default () => {\n\tconst $box = $('.product-review-box');\n\tconst $star = $box.find('.product-review-star');\n\n\t$star.on('mouseenter', (e) => {\n\t\tconst star = $(e.target);\n\t\tsetRating(star);\n\t});\n\n\t$star.on('click', (e) => {\n\t\tconst star = $(e.target);\n\t\tsetRating(star, true);\n\t});\n\n\t$box.find('.product-review-stars').on('mouseleave', (e) => {\n\t\tconst $container = $(e.currentTarget);\n\t\tconst {rating} = $container.data();\n\t\tif (parseInt(rating) === 0 || !rating) {\n\t\t\tclearRating($container);\n\t\t} else {\n\t\t\tconst $star = $container.find(`.product-review-star[data-value=\"${rating}\"]`);\n\t\t\tsetRating($star);\n\t\t}\n\t});\n\n\t// Product page reviews\n\tif ($reviewsContainer.length > 0) {\n\n\t\t$('.js-review-container').html('');\n\t\t$('.js-review-title').html('');\n\n\t\tReviews.getAverage(productId).then(response => {\n\t\t\treviews.total = response;\n\n\t\t\tif (response.count > 1 || response.count === 1 && parseFloat(response.number) > 2) { // Show only reviews if more than 1 or 1 over 2 given stars\n\t\t\t\t$('.js-review-title').html(Mustache.render(mustacheTitle, response));\n\n\t\t\t\taddReviews();\n\n\t\t\t\t// Load more button\n\t\t\t\t$reviewsContainer.find('.js-load-more').on('click', function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tpage++;\n\t\t\t\t\taddReviews();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n   * Get reviews from stage using promise\n   */\n\tfunction addReviews () {\n\t\tReviews.getReviews(productId, page, reviewsInPage).then(response => {\n\t\t\t$('.js-review-container').append(Mustache.render(mustacheReview, response));\n\n\t\t\tconst addedIds = response.map(res => res.uuid);\n\t\t\tconst addedReviews = $('.js-review-item').filter(review => {\n\t\t\t\tconst item = $('.js-review-item').eq(review);\n\t\t\t\tif (addedIds.includes(item.data('id'))) {\n\t\t\t\t\treturn item;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Load more count\n\t\t\tremaining = reviews.total.count - $reviewsContainer.find('.js-review-item').length;\n\t\t\tremaining > 0 ? $reviewsContainer.find('.js-load-more span').html(remaining) : $reviewsContainer.find('.js-load-more').addClass('hidden');\n\n\t\t\t$.each($reviewsContainer.find('.js-review-item'), function (i) {\n\t\t\t\tEllipsis.truncate($(this).find('.js-ellipsis'), 120, '...');\n\t\t\t});\n\n\t\t\tvoting(addedReviews);\n\t\t\t$reviewsContainer.removeClass('hidden');\n\t\t});\n\t}\n\n\t/**\n   * Enable voting for review if there is comment or text review\n   * @param {object} $vote HTML object of new review\n   */\n\tfunction voting ($vote) {\n\t\tif ($vote.length > 0) {\n\t\t\t$.each($vote, function (i) {\n\t\t\t\tconst $el = $(this),\n\t\t\t\t\treviewId = $el.data('id');\n\n\t\t\t\tfunction processVotes () {\n\t\t\t\t\t$el.find('.button').removeClass('selected');\n\t\t\t\t\tif (localStorage.getItem(`intersport-review-${$el.data('id')}`) === 'upvote') {\n\t\t\t\t\t\t$el.find('.button[data-value=\"upvote\"]').addClass('selected');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (localStorage.getItem(`intersport-review-${$el.data('id')}`) === 'downvote') {\n\t\t\t\t\t\t$el.find('.button[data-value=\"downvote\"]').addClass('selected');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocessVotes();\n\n\t\t\t\t$el.find('.button').on('click', function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tif (!$(this).hasClass('selected')) {\n\t\t\t\t\t\tlet ls = localStorage.getItem(`intersport-review-${$el.data('id')}`);\n\t\t\t\t\t\tconst vote = $(this).data('value');\n\t\t\t\t\t\tconst action = (ls === 'upvote' && vote === 'downvote') ||(ls === 'downvote' && vote === 'upvote') ? 'change' : 'add';\n\t\t\t\t\t\tReviews.vote(reviewId, vote, action);\n\t\t\t\t\t\tlocalStorage.setItem(`intersport-review-${$el.data('id')}`, vote);\n\t\t\t\t\t\t$(this).find('.count').text(Number($(this).find('.count').text()) + 1);\n\t\t\t\t\t\tif (action === 'change') {\n\t\t\t\t\t\t\t$el.find('.button').not($(this)).find('.count').text(Number($el.find('.button').not($(this)).find('.count').text()) - 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprocessVotes();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n}\n","'use strict';\nimport Promise from 'bluebird';\nimport $ from 'jquery';\nimport getToken from './token';\n\nconst BASE_URL = '/fi/api/v1/reviews/';\n\nexport const getReviews = (productId, page = 1, limit = 4) => {\n\treturn Promise.resolve($.get(`${BASE_URL}?productId=${productId}&page=${page}&limit=${limit}`));\n}\n\nexport const getAverage = (productId) => {\n\treturn Promise.resolve($.get(`${BASE_URL}?productId=${productId}&average=true`));\n}\n\nexport const vote = (reviewId, vote, action) => {\n\tgetToken().then(token => Promise.resolve($.post(`${BASE_URL}vote/${reviewId}/${vote}`, { token, action })));\n}","'use strict';\nimport $ from 'jquery';\n\n/**\n * Ellipsis truncate\n * @param {object} el html element\n * @param {integer} limit character count\n * @param {string} after string to show after truncate (usually '...')\n */\nexport const truncate = (el, limit, after) => {\n\tif (!el || !limit || el.hasClass('ellipsed')) return;\n\n\tel = $(el);\n\tconst fullContent = el.html();\n\tlet content = el.text().substring(0, limit);\n\n\tif (content.length > 0) {\n\t\tif (el.text().length > limit) {\n\t\t\tcontent = after ? content + after : content;\n\t\t\tel.html('<div class=\"js-ellipsis-text-content\">' + content + '</div>');\n\t\t\tel.append('<div class=\"js-ellipsis-content hidden\">' + fullContent + '</div>');\n\t\t\tel.append('<button class=\"js-ellipsis-read-more ellipsis-read-more a-link\">Lue lisää</button>');\n\n\t\t\tel.find('.js-ellipsis-read-more').on('click', function (e) {\n\t\t\t\tel.find('.js-ellipsis-text-content').remove();\n\t\t\t\tel.find('.js-ellipsis-content.hidden').removeClass('hidden');\n\t\t\t\t$(this).remove();\n\t\t\t});\n\t\t\tel.addClass('ellipsed');\n\t\t}\n\t}\n}\n","'use strict';\n\nimport $ from 'jquery';\n\n//import productList from './product-list';\n//import productPage from './product-page';\n//import productPackage from './product-package';\n//import packageBuilder from './package-builder';\nimport productReviews from './product-reviews';\n\nexport default function(API) {\n\t$(document).ready(() => {\n\n\t\tAPI.log('INIT Product');\n\n\t\t// Init product lists globally\n\n\t\tif( $('.product-grid').length ){\n\n\t\t\timport('./product-list').then(({ default: productList }) => {\n\t\t\t\tproductList();\n\t\t\t\tconsole.log('IMPORT product grid');\n\t\t\t});\n\n\t\t}\n\n\t\tif( $('.product-carousel').length ){\n\n\t\t\timport('./product-carousel').then(({ productCarousel: carousel }) => {\n\t\t\t\tcarousel('.product-carousel');\n\t\t\t\tconsole.log('IMPORT carousel');\n\t\t\t});\n\n\t\t}\n\n\t\tproductReviews();\n\n\t\t// Init product cards\n\t\tconst products = $('.v4-product-card');\n\t\tif( $('.package-builder').length ) {\n\n\t\t\timport('./package-builder').then(({ default: packageBuilder }) => {\n\t\t\t\tpackageBuilder();\n\t\t\t\tconsole.log('IMPORT package builder');\n\t\t\t});\n\n\t\t} else if( $('.product-package').length ) {\n\n\t\t\timport('./product-page').then(({ default: productPage }) => {\n\t\t\t\tproducts.each((index, el) => productPage($(el)));\n\t\t\t\tconsole.log('IMPORT product page');\n\t\t\t});\n\n\t\t\timport('./product-package').then(({ default: productPackage }) => {\n\t\t\t\tproductPackage();\n\t\t\t\tconsole.log('IMPORT product package');\n\t\t\t});\n\n\t\t} else if( $('.v4-product').length ){\n\n\t\t\timport('./product-page').then(({ default: productPage }) => {\n\t\t\t\tproductPage(products);\n\t\t\t\tconsole.log('IMPORT product page');\n\t\t\t});\n\n\t\t}\n\n\t\tif ($('.form-leasing').length) {\n\t\t\timport('./leasing').then(({ default: leasing }) => {\n\t\t\t\tleasing();\n\t\t\t});\n\t\t}\n\n\t});\n}\n"],"sourceRoot":""}