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 | 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 | 19 | function star_filter(start, end, elements) { |
5 | 20 | var test_regex = undefined; |
6 | 21 | |
22 | + // Verify if it is a valid range and makes its range regex: /[start-end]/ | |
7 | 23 | if (end >= start) { |
8 | 24 | test_regex = new RegExp("["+(start)+"-"+(end)+"]"); |
9 | 25 | } else { |
26 | + // If the range is invalid, make a regex that will return no element | |
10 | 27 | test_regex = new RegExp("[]"); |
11 | 28 | } |
12 | 29 | |
30 | + // Filter the elements that are in the given range | |
13 | 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 | 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 | 88 | $(document).ready(function() { |
64 | - set_star_hover_actions(); | |
65 | - }); | |
89 | + set_star_hover_actions(); | |
90 | + }); | |
66 | 91 | }) (jQuery); | ... | ... |
plugins/communities_ratings/views/communities_ratings_plugin_profile/new_rating.html.erb
... | ... | @@ -4,18 +4,17 @@ |
4 | 4 | <div> |
5 | 5 | <div data-rate-url=<%= url_for controller: "communities_ratings_plugin_profile", :action => "rate" %>> |
6 | 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 | 12 | </div> |
13 | 13 | |
14 | 14 | <div class="star-action"> |
15 | 15 | <button><%= _("Rate") %></button> |
16 | 16 | </div> |
17 | 17 | </div> |
18 | - | |
19 | 18 | <div> |
20 | 19 | <%= form_for :comments do |c| %> |
21 | 20 | ... | ... |