wejsv2old-plugin-rating
Version:
We.js v2 Old - Rating Plugin
183 lines (156 loc) • 4.82 kB
JavaScript
/*
* 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);
});
}
});