UNPKG

wejsv2old-plugin-rating

Version:
183 lines (156 loc) 4.82 kB
/* * WeRatingDisplayComponent.js - Plugin to show contents's rate * * How to use: * * @param {string} modelName - Model's name * @param {string} modelId - Model record's id that is being evaluated * * {{we-rating-show modelName="relato" modelId="1313"}} * */ App.WeRatingDisplayComponent = Ember.Component.extend({ target: Em.computed.alias('targetObject'), loading: false, classNames: ['box'], classNameBindings: ['hide'], hide: function () { return !this.get('manager.active'); }.property('manager.active'), checkPermission: function () { var self = this; Ember.assert('\'modelName\' must be provided', self.get('modelName')); Ember.assert('\'modelId\' must be provided', self.get('modelId')); var queryManager = {}; if (!self.get('ratingManager')) { queryManager.modelName = self.get('modelName'); } else { queryManager = self.get('ratingManager'); } var rM = self.store.find('ratingmanager', queryManager); rM .then(function (aRatingManager) { var ratingmanager = aRatingManager; if (Ember.isArray(ratingmanager)) ratingmanager = ratingmanager.get('firstObject'); self.set('manager', ratingmanager); if (ratingmanager.get('active')) self.fetchRatings(); }); we.events.on('we-rating:relato:' + self.get('modelId') + ':rated', function (){ self.fetchRatings(); }); }.on('init'), onModalIdChange: function (){ var self = this; // Bind handler to event to allow multiple instances of this component to be shared we.events.on('we-rating:relato:' + self.get('modelId') + ':rated', function (){ self.fetchRatings(); }); this.fetchRatings(); }.observes('modelId'), text: function () { if (this.get('rate.rating.total') > 1) return Ember.I18n.translations['rating.text.plural']; return Ember.I18n.translations['rating.text.singular']; }.property('rate.rating.total'), heartFill: function () { var self = this; var heartBase = [{ even: false, odd: false }, { even: false, odd: false }, { even: false, odd: false }, { even: false, odd: false }, { even: false, odd: false }]; if (!self.get('rate.rating.rate')) { return heartBase; } var rating = self.get('rate.rating.rate'); var integer = Math.floor(rating); var heart = heartBase.map(function (h, pos) { if (pos + 1 > integer) return h; h.odd = true; h.even = true; return h; }); var decimal = (rating % Math.floor(rating)) * 10; if (decimal >= 7.5) { heart[integer].odd = true; heart[integer].even = true; } else if (decimal >= 2.5 && decimal < 7.5) { heart[integer].even = true; } return heart; }.property('rate.rating.rate'), observeTerms: function () { var self = this; var t = this.get('rate.terms'); var totalG = this.get('rate.totalGeral'); var idIndex = _.indexBy(t, 'id'); if (!t){ return Ember.A(); } var termsId = t.map(function (term) { return term.id; }); return self.store .findByIds('term', termsId) .then(function (models) { var terms = models.map(function (m, i) { // Add some laytou useful information to compose the rate stack if (idIndex[m.id]) { var totalP = Math.round((idIndex[m.id].total / totalG ) * 100); m.set('total', totalP); } else { m.set('total', 0); } m.set('style', 'width: ' + m.get('total')+ '%;'); // Define the bar color switch (i) { case 0: m.set('class', 'progress-bar-success'); break; case 1: m.set('class', 'progress-bar-primary'); break; case 2: m.set('class', 'progress-bar-info'); break; default: m.set('class', 'progress-bar-success'); break; } return m; }).sort(function (a, b){ return b.get('total') - a.get('total'); }).filter(function (m, i){ if (i >= 0 && i < 3){ return true; } return false; }); self.set('terms', terms); }); }.observes('rate.terms').on('init'), fetchRatings: function () { var self = this; self.set('loading', true); return $.getJSON('/rating/' + self.get('manager').id + '/' + self.get('modelId')) .done(function (data) { self.set('rate', data); }) .fail(function () { self.set('rate', {}); }) .always(function (){ self.set('loading', false); }); } });