Commit c30779afee11a5758692757e686fbad7d08d5d2d
1 parent
59de989e
Exists in
temp_ratings
Add comments to a better code understanding
Signed-off-by: Fabio Teixeira <fabio1079@gmail.com>
Showing
2 changed files
with
65 additions
and
41 deletions
Show diff stats
plugins/communities_ratings/public/rate.js
1 | -(function($, undefined) { | 1 | +;(function($, undefined) { |
2 | "use strict"; | 2 | "use strict"; |
3 | 3 | ||
4 | + /* | ||
5 | + * All global data that are used in the stars feature. | ||
6 | + */ | ||
7 | + var DATA = { | ||
8 | + selected_rate: undefined, // The actual selected star when the click on a star | ||
9 | + MAXIMUM_STARS: 5, // (const) The maximum number of allowed stars | ||
10 | + MINIMUM_STARS: 1, // (const) The minimum number of allowed stars | ||
11 | + DATA_RATE_ATTRIBUTE: "data-star-rate" // (const) The data attribute with the star rate | ||
12 | + } | ||
13 | + | ||
14 | + | ||
15 | + /* | ||
16 | + * Given a start rate, an end rate and the elements, it makes a regex that filter | ||
17 | + * the elements by the given range and returns it. | ||
18 | + */ | ||
4 | function star_filter(start, end, elements) { | 19 | function star_filter(start, end, elements) { |
5 | var test_regex = undefined; | 20 | var test_regex = undefined; |
6 | 21 | ||
22 | + // Verify if it is a valid range and makes its range regex: /[start-end]/ | ||
7 | if (end >= start) { | 23 | if (end >= start) { |
8 | test_regex = new RegExp("["+(start)+"-"+(end)+"]"); | 24 | test_regex = new RegExp("["+(start)+"-"+(end)+"]"); |
9 | } else { | 25 | } else { |
26 | + // If the range is invalid, make a regex that will return no element | ||
10 | test_regex = new RegExp("[]"); | 27 | test_regex = new RegExp("[]"); |
11 | } | 28 | } |
12 | 29 | ||
30 | + // Filter the elements that are in the given range | ||
13 | var result = elements.filter(function(i, element) { | 31 | var result = elements.filter(function(i, element) { |
14 | - var index = parseInt(element.getAttribute("data-star-index")); | 32 | + var rate = parseInt(element.getAttribute(DATA.DATA_RATE_ATTRIBUTE)); |
15 | 33 | ||
16 | - return test_regex.test(index); | 34 | + return test_regex.test(rate); |
17 | }); | 35 | }); |
18 | 36 | ||
19 | return result; | 37 | return result; |
20 | } | 38 | } |
21 | 39 | ||
22 | - | ||
23 | - function set_star_hover_actions() { | ||
24 | - var star_selected = undefined; | ||
25 | - | ||
26 | - $(".star-negative") | ||
27 | - .on("mouseover", function() { | ||
28 | - var index = parseInt(this.getAttribute("data-star-index")); | ||
29 | - var previous_stars = undefined; | ||
30 | - | ||
31 | - if (star_selected !== undefined) { | ||
32 | - previous_stars = star_filter(star_selected+1, index, $(".star-negative")); | ||
33 | - } else { | ||
34 | - previous_stars = star_filter(0, index, $(".star-negative")); | ||
35 | - } | ||
36 | 40 | ||
37 | - previous_stars.switchClass("star-negative", "star-positive"); | ||
38 | - }) | 41 | + /* |
42 | + * Show or hide the stars depending on the mouse position and the limit rate. | ||
43 | + * Given the mouseover rate, the limit rate and the css classes to be swapped, | ||
44 | + * | ||
45 | + * it verify if the user already selected a star rate: | ||
46 | + * If true: | ||
47 | + * It swap the css classes from the selected star up to the given limit rate | ||
48 | + * If false: | ||
49 | + * It swap the css classes from the minimum rate up to the mouseover rate | ||
50 | + */ | ||
51 | + function change_stars_class(rate_mouseover, limit_rate, remove_class, add_class) { | ||
52 | + var previous_stars = undefined; | ||
53 | + | ||
54 | + if (DATA.selected_rate !== undefined) { | ||
55 | + previous_stars = star_filter(DATA.selected_rate+1, limit_rate, $("."+remove_class)); | ||
56 | + } else { | ||
57 | + previous_stars = star_filter(DATA.MINIMUM_STARS, rate_mouseover, $("."+remove_class)); | ||
58 | + } | ||
39 | 59 | ||
40 | - .on("mouseout", function() { | ||
41 | - var index = parseInt(this.getAttribute("data-star-index")); | 60 | + previous_stars.switchClass(remove_class, add_class); |
61 | + } | ||
42 | 62 | ||
43 | - var previous_stars = undefined; | ||
44 | 63 | ||
45 | - if (star_selected !== undefined) { | ||
46 | - previous_stars = star_filter(star_selected+1, 4, $(".star-positive")); | ||
47 | - } else { | ||
48 | - previous_stars = star_filter(0, index, $(".star-positive")); | ||
49 | - } | 64 | + /* |
65 | + * Sets the stars mouse events. | ||
66 | + */ | ||
67 | + function set_star_hover_actions() { | ||
68 | + $(".star-negative") | ||
69 | + .on("mouseover", function() { // On mouse over, show the current rate star | ||
70 | + var rate_mouseover = parseInt(this.getAttribute(DATA.DATA_RATE_ATTRIBUTE)); | ||
50 | 71 | ||
51 | - previous_stars.switchClass("star-positive", "star-negative"); | 72 | + change_stars_class(rate_mouseover, rate_mouseover, "star-negative", "star-positive"); |
52 | }) | 73 | }) |
53 | 74 | ||
54 | - .on("click", function() { | ||
55 | - var index = parseInt(this.getAttribute("data-star-index")); | ||
56 | - star_selected = index; | ||
57 | - }); | 75 | + .on("mouseout", function() { // On mouse out, hide the stars |
76 | + var rate_mouseover = parseInt(this.getAttribute(DATA.DATA_RATE_ATTRIBUTE)); | ||
58 | 77 | ||
78 | + change_stars_class(rate_mouseover, DATA.MAXIMUM_STARS, "star-positive", "star-negative"); | ||
79 | + }) | ||
59 | 80 | ||
81 | + .on("click", function() { // On mouse click, set the selected star rate | ||
82 | + var rate_mouseover = parseInt(this.getAttribute(DATA.DATA_RATE_ATTRIBUTE)); | ||
83 | + DATA.selected_rate = rate_mouseover; | ||
84 | + }); | ||
60 | } | 85 | } |
61 | - | 86 | + |
62 | 87 | ||
63 | $(document).ready(function() { | 88 | $(document).ready(function() { |
64 | - set_star_hover_actions(); | ||
65 | - }); | 89 | + set_star_hover_actions(); |
90 | + }); | ||
66 | }) (jQuery); | 91 | }) (jQuery); |
plugins/communities_ratings/views/communities_ratings_plugin_profile/new_rating.html.erb
@@ -4,18 +4,17 @@ | @@ -4,18 +4,17 @@ | ||
4 | <div> | 4 | <div> |
5 | <div data-rate-url=<%= url_for controller: "communities_ratings_plugin_profile", :action => "rate" %>> | 5 | <div data-rate-url=<%= url_for controller: "communities_ratings_plugin_profile", :action => "rate" %>> |
6 | <div class="star-container"> | 6 | <div class="star-container"> |
7 | - <div class="star-negative" data-star-index="0"></div> | ||
8 | - <div class="star-negative" data-star-index="1"></div> | ||
9 | - <div class="star-negative" data-star-index="2"></div> | ||
10 | - <div class="star-negative" data-star-index="3"></div> | ||
11 | - <div class="star-negative" data-star-index="4"></div> | 7 | + <div class="star-negative" data-star-rate="1"></div> |
8 | + <div class="star-negative" data-star-rate="2"></div> | ||
9 | + <div class="star-negative" data-star-rate="3"></div> | ||
10 | + <div class="star-negative" data-star-rate="4"></div> | ||
11 | + <div class="star-negative" data-star-rate="5"></div> | ||
12 | </div> | 12 | </div> |
13 | 13 | ||
14 | <div class="star-action"> | 14 | <div class="star-action"> |
15 | <button><%= _("Rate") %></button> | 15 | <button><%= _("Rate") %></button> |
16 | </div> | 16 | </div> |
17 | </div> | 17 | </div> |
18 | - | ||
19 | <div> | 18 | <div> |
20 | <%= form_for :comments do |c| %> | 19 | <%= form_for :comments do |c| %> |
21 | 20 |