“People rarely succeed unless they have fun in what they are doing.”
— Dale Carnegie
Now that I have a way to display the cumulative rating to date, I need to work that into the widget and also provide a way to display any rating that accompanies a comment. The cumulative rating is pretty simple now that we have our snh-rating tag:
<snh-rating ng-show="c.data.includeRating" snh-values="c.data.ratingValues"></snh-rating>
Of course, we have to gather up the rating values to pass to the rating tag, but we already worked that out last time, so that’s pretty simple as well:
if (data.includeRating) {
data.ratingInfo = feedbackUtils.currentRating(data.table, data.sys_id);
data.ratingValues = data.ratingInfo.join(',');
}
That should take care of the overall rating. Now we just have to add the individual ratings to each comment. One thing that my earlier version did not support was the one person/one vote rule, which prevents a single individual from stuffing the ballot box and skewing the results. To enforce that approach, and also to support fetching a user’s existing vote, I added a function to my SnhFeedbackUtils Script Include to go out and get any existing vote for a table, sys_id, and profile combination:
fetchUserRating: function(table, sys_id, profile) {
var response = null;
var pollGR = new GlideRecord('live_poll');
var castGR = new GlideRecord('live_poll_cast');
if (pollGR.get('question', table + ':' + sys_id + ' Rating')) {
castGR.addQuery('poll', pollGR.getUniqueValue());
castGR.addQuery('profile', profile);
castGR.query();
if (castGR.next()) {
response = castGR;
}
}
return response;
},
The first place that I used this new function was in another new function that I created to fetch the current user’s existing rating:
currentUserRating: function(table, sys_id, profile) {
var rating = 0;
var castGR = this.fetchUserRating(table, sys_id, profile);
if (castGR) {
rating = parseInt(castGR.getValue('option.order'));
}
return rating;
},
The other place that I used it was when I modified the postRating function to update any existing vote rather than adding a second vote on the same item for the same person:
postRating: function(table, sys_id, rating) {
if (rating > 0 && rating < 6) {
var pollGR = new GlideRecord('live_poll');
var optGR = new GlideRecord('live_poll_option');
var castGR = new GlideRecord('live_poll_cast');
if (!pollGR.get('question', table + ':' + sys_id + ' Rating')) {
pollGR.initialize();
pollGR.question = table + ':' + sys_id + ' Rating';
pollGR.insert();
for (var opt=1; opt<6; opt++) {
optGR.initialize();
optGR.poll = pollGR.getUniqueValue();
optGR.order = opt;
optGR.name = opt + '';
optGR.insert();
}
}
optGR.initialize();
optGR.addQuery('poll', pollGR.getUniqueValue());
optGR.addQuery('order', rating);
optGR.query();
if (optGR.next()) {
var profile = new GlideappLiveProfile().getID();
var existing = this.fetchUserRating(table, sys_id, profile);
if (existing) {
castGR = existing;
if (castGR.getValue('option') != optGR.getUniqueValue()) {
castGR.option = optGR.getUniqueValue();
castGR.update();
}
} else {
castGR.initialize();
castGR.poll = pollGR.getUniqueValue();
castGR.profile = profile;
castGR.option = optGR.getUniqueValue();
castGR.insert();
}
}
}
},
That takes care of the modifications for the SnhFeedbackUtils Script Include. Now I just need to modify the server side code on the widget to invoke the function on the Script Include to get the score, format the score into some kind of graphic display, and then finally, modify the HTML to include the rating graphic. That sounds like quite a bit of work, so I think we will leave all of that for next time!