seems_rateable 1.0.6 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +8 -8
  2. data/{LICENSE.txt → MIT-LICENSE} +2 -4
  3. data/README.md +43 -54
  4. data/Rakefile +29 -4
  5. data/{lib/generators/seems_rateable/templates/images → app/assets/images/seems_rateable}/bg_jRatingInfos.png +0 -0
  6. data/{lib/generators/seems_rateable/templates/images → app/assets/images/seems_rateable}/small.png +0 -0
  7. data/{lib/generators/seems_rateable/templates/images → app/assets/images/seems_rateable}/stars.png +0 -0
  8. data/app/assets/javascripts/seems_rateable/application.js +15 -0
  9. data/{lib/generators/seems_rateable/templates/javascripts → app/assets/javascripts/seems_rateable}/jRating.jquery.js.erb +3 -3
  10. data/app/assets/stylesheets/seems_rateable/application.css +13 -0
  11. data/{lib/generators/seems_rateable/templates/stylesheets → app/assets/stylesheets/seems_rateable}/jRating.jquery.css +4 -4
  12. data/app/controllers/seems_rateable/application_controller.rb +4 -0
  13. data/app/controllers/seems_rateable/ratings_controller.rb +17 -0
  14. data/app/helpers/seems_rateable/application_helper.rb +4 -0
  15. data/app/helpers/seems_rateable/ratings_helper.rb +4 -0
  16. data/app/models/seems_rateable/cached_rating.rb +5 -0
  17. data/app/models/seems_rateable/rate.rb +6 -0
  18. data/app/views/layouts/seems_rateable/application.html.erb +14 -0
  19. data/config/routes.rb +3 -0
  20. data/lib/generators/seems_rateable/install/install_generator.rb +39 -0
  21. data/lib/generators/seems_rateable/{templates/cached_rating_migration.rb → install/templates/cached_ratings_migration.rb} +2 -2
  22. data/lib/generators/seems_rateable/install/templates/initializer.rb +4 -0
  23. data/lib/generators/seems_rateable/install/templates/jRating.js.erb +225 -0
  24. data/lib/generators/seems_rateable/install/templates/rateable.js.erb +25 -0
  25. data/lib/generators/seems_rateable/{templates/rate_migration.rb → install/templates/rates_migration.rb} +2 -5
  26. data/lib/seems_rateable/engine.rb +17 -0
  27. data/lib/seems_rateable/errors.rb +21 -0
  28. data/lib/seems_rateable/helpers.rb +27 -23
  29. data/lib/seems_rateable/model.rb +111 -0
  30. data/lib/seems_rateable/routes.rb +7 -0
  31. data/lib/seems_rateable/version.rb +1 -1
  32. data/lib/seems_rateable.rb +11 -3
  33. data/lib/tasks/seems_rateable_tasks.rake +4 -0
  34. metadata +83 -33
  35. data/.gitignore +0 -19
  36. data/Gemfile +0 -9
  37. data/lib/generators/seems_rateable/USAGE +0 -0
  38. data/lib/generators/seems_rateable/seems_rateable_generator.rb +0 -65
  39. data/lib/generators/seems_rateable/templates/cached_model.rb +0 -4
  40. data/lib/generators/seems_rateable/templates/controller.rb +0 -15
  41. data/lib/generators/seems_rateable/templates/javascripts/rateable.jquery.js.erb +0 -25
  42. data/lib/generators/seems_rateable/templates/model.rb +0 -7
  43. data/lib/generators/seems_rateable_destroy_generator.rb +0 -19
  44. data/lib/seems_rateable/record.rb +0 -117
  45. data/seems_rateable.gemspec +0 -25
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ODdlZjk5NDg2Yzc4MWFiMDU3NTIxOTIzMDAzYWI1N2RlY2Y1Y2MyMA==
4
+ NjkxYmI5OTY4NDFmN2MzMDllYTIwZmVhYjZiNjhhMzkwMDVmNTRiNQ==
5
5
  data.tar.gz: !binary |-
6
- MGNhZDczNjU0OWU5MjFhODVmMTcxYTkwOTkzYmZjNGE1YTRjODY1ZA==
6
+ ZTkyNGVkZTZiNGZlNzVmYTE2NDQ2ZWJhZmM3YmY4NzgwZGVmMmE0Yw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NWE1NWJkNmIxODRiYzAwMjk0YWRhZmRjM2E1MTQ0NWFiM2E4ZTc3ZTMwMjI4
10
- Yzc4ZDljM2ZlMTAzOTU1YTE3NWRlNmZhMjY3MThhY2ZiOTA5ZmJjMWQ5NTBm
11
- NTk3ZTExZDdjMmZjNDY1NTIzNWMwN2E0Njg0MTY3MTgxYzg4NzQ=
9
+ M2FmYjc3NWNjNzI1YWVhNzFlNmYxMDNjZmFjOTM3ZGQzOWNkNjk3M2EzNjlj
10
+ ZmNiZmZkMDMwNzBiYjcyYmFlNGZhZjhhYzlmYzU2NDg5YTcwODBkYTA0ZmU0
11
+ OTVmOTk5YTNlYmU0NjZmYTZjZTQ4YWZmMzA2ZjczZWZiYmRiNzc=
12
12
  data.tar.gz: !binary |-
13
- MTlkM2YyNzJjZmY0MDc4MzJhZjc3Yjc2YzljYjdlMTk4NDQ4ZTYxNDgyODcz
14
- YzNhYjQ3YWNlNzI1YWZiMjJkMTBmNGU3MDZiYjY2OTA3MGNjZjFlYzgzMWUy
15
- YzBkODQ3MzIzM2IxNTJmOGVkZDQ1ZTk5MTU3MDgxZGJkOTFkNjE=
13
+ OWIzNmJkYjI5OGMwYjNmNDU2YTFmMjlkZmE0OWNmYjMzMDBmYTUyNWY4ODFk
14
+ N2U1YTY5OWMxYjRhYjViZTYwNzMzYjdmNjMzYzYwYmVkOWUxZmYyNDQ4NzAx
15
+ MGUwMzcwMzJjOWMzOTUzZmExMDFmZGE3NjhkNTYzNzc1YmE0NDY=
@@ -1,6 +1,4 @@
1
- Copyright (c) 2013 progz
2
-
3
- MIT License
1
+ Copyright 2013 YOURNAME
4
2
 
5
3
  Permission is hereby granted, free of charge, to any person obtaining
6
4
  a copy of this software and associated documentation files (the
@@ -19,4 +17,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
17
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
18
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
19
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -4,7 +4,7 @@ Star rating gem for Rails application using jQuery plugin <a href="http://www.my
4
4
 
5
5
  ## Demo
6
6
 
7
- <a href="http://rateable.herokuapp.com/">Demo</a> application, requires to sign up before rating
7
+ <a href="http://rateable.herokuapp.com/">Demo</a> application, requires to sign up before rating
8
8
 
9
9
  ## Instructions
10
10
 
@@ -24,58 +24,51 @@ Or install it yourself as:
24
24
 
25
25
  ### Generation
26
26
 
27
- $ rails g seems_rateable User
28
-
29
- Generator takes one argument which is the name of an existing user model e.g User, Client, Player ... <br>
30
- The generator creates necessary model, controller and asset files. It also creates route and migration files that are already being migrated
27
+ $ rails generate seems_rateable:install
28
+
29
+ Generator creates migration files, javascript files and initializer
31
30
 
32
31
  ### Prepare
33
-
34
- Include Javascript files adding these lines to application.js
35
-
36
- #application.js
37
- //= require rateable/jRating.jquery
38
- //= require rateable/rateable.jquery
39
-
40
- Include CSS file adding <code><%= seems_rateable_style %></code> to your layaut head tag
41
-
42
- Also make sure you have an existing <code>current_user</code> object. If not, add something like this to your application controller
43
-
44
- #application_controller.rb
45
- helper_method :current_user
46
- private
47
- def current_user
48
- @current_user ||= User.find(session[:user_id]) if session[:user_id]
49
- end
50
-
51
- To prepare model be rateable add <code>seems_rateable</code> to your model file. You can also pass a hash of options to
52
- customize the functionality
53
32
 
54
- <ul>
55
- <li><code>:dimensions</code> Array of dimensions e.g. <code>:dimensions => [:quality, :price, :performance]</code></li>
56
- <li><code>:allow_update</code> Allowing user to re-rate his own ratings, default set to false e.g <code>:allow_update=> true</code>
57
- </ul>
33
+ Require javascript files by adding this line to application.js
58
34
 
59
- class Computer < ActiveRecord::Base
60
- seems_rateable :dimensions => [:quality, :price, :performance], :allow_update => true
61
- end
35
+ #application.js
36
+ //= require_directory ./rateable
62
37
 
63
- Each object of the model now gain these methods :
64
- <ul>
65
- <li><code>@computer.rates_without_dimension</code> returns array of ratings given to the object</li>
66
- <li><code>@computer.raters_without_dimension</code> returns array of users that rated the object</li>
67
- <li><code>@computer.rate_average_without_dimension</code> returns cached database object containing average rate and quantity of given ratings of the object</li>
68
- </ul>
38
+ Add <code>seems_rateable</code> to routes.rb file
69
39
 
70
- Depending on the passed dimensions your object also gain these methods :
40
+ Include stylesheet adding <code><%= seems_rateable_stylesheet %></code> to your layout header
41
+
42
+ Also make sure you have an existing <code>current_user</code> helper method
43
+
44
+ Don't forget to run
45
+ $ rake db:migrate
46
+
47
+ To prepare model add <code> seems_rateable </code> to your model. You can also pass a hash of options to
48
+ customize the functionality
71
49
 
72
50
  <ul>
73
- <li><code>@computer.dimension_rates</code> e.g <code>@computer.quality_rates</code></li>
74
- <li><code>@computer.dimension_raters</code> e.g <code>@computer.price_raters</code></li>
75
- <li><code>@computer.dimension_average</code> e.g <code>@computer.performance_average</code></li>
51
+ <li><code>:dimensions</code>Array of dimensions e.g <code>:dimensions => [:quality, :quantity]</code> </li>
52
+ <li><code>:allow_update</code>Allowing user to re-rate his own ratings, default set to false e.g <code>:allow_update=> true</code></li>
76
53
  </ul>
77
54
 
78
- To track user's given ratings add <code>seems_rateable_rater</code> to your user model.
55
+ To access object's rates use <code>rates</code> method, to get dimension rates pass an argument eg :
56
+ $ @object.rates
57
+ $ @object.rates(:quality)
58
+ $ @object.rates(:quantity)
59
+
60
+ This also applies to cached average rating e.g
61
+ $ @object.average
62
+ $ @object.average(:quality)
63
+ $ @object.average(:quantity)
64
+
65
+ And to object's raters e.g
66
+ $ @object.raters
67
+ $ @object.raters(:quality)
68
+ $ @object.raters(:quantity)
69
+
70
+ To track user's given ratings add <code>seems_rateable_rater</code> to your rater model.
71
+ If your rater class is not "User"(e.g "Client" or "Customer") change configuration in initializer generated by this engine
79
72
  Now you can access user's ratings by <code>@user.ratings_given</code>
80
73
 
81
74
  ### Usage
@@ -84,26 +77,22 @@ To display star rating use helper method <code>rating_for</code> in your view
84
77
 
85
78
  #index.html.erb
86
79
 
87
- rating_for @computer
80
+ rating_for @post
88
81
 
89
- rating_for @computer, :dimension => :price, :id => "storage"
82
+ rating_for @post, :dimension => :quality, :class => 'post', :id => 'list'
90
83
 
91
- rating_for @computer, :static => true
92
-
84
+ rating_for @post, :static => true
85
+
93
86
  You can specify these options :
94
87
  <ul>
95
88
  <li><code>:dimension</code>The dimension of the object</li>
96
89
  <li><code>:static</code>Set to true to display static star rating, default false</li>
90
+ <li><code>:class</code>Class of the div, default set to 'rateable'</li>
97
91
  <li><code>:id</code>ID of the div e.g <code>:id => "info"</code>, default nil</li>
98
92
  </ul>
99
93
 
100
- To edit the javascript options locate rateable.jquery.js file in /vendor/assets/javascripts/rateable/.
101
- The javascript options are explained directly in the file
102
-
103
- ### Removal
104
-
105
- To remove gem files simply execute <code>rails g seems_rateable_destroy</code> in terminal.
106
- Neither migration files nor database tables will be destroyed.
94
+ To edit the javascript options locate rateable.jquery.js file in /app/assets/javascripts/rateable/.
95
+ The javascript options are explained directly in the file
107
96
 
108
97
  ## Contributing
109
98
 
data/Rakefile CHANGED
@@ -1,7 +1,32 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
3
6
 
4
- RSpec::Core::RakeTask.new
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'SeemsRateable'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+ Bundler::GemHelper.install_tasks
20
+
21
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
22
+ load 'rails/tasks/engine.rake'
23
+
24
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
25
+ require 'rspec/core'
26
+ require 'rspec/core/rake_task'
5
27
 
6
28
  task :default => :spec
7
- task :test => :spec
29
+
30
+
31
+
32
+
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+
13
+ //= require_tree .
14
+
15
+
@@ -12,9 +12,9 @@
12
12
  $.fn.jRating = function(op) {
13
13
  var defaults = {
14
14
  /** String vars **/
15
- bigStarsPath : '<%= image_path "rateable/stars.png" %>', // path of the icon stars.png
16
- smallStarsPath : '<%= image_path "rateable/small.png" %>', // path of the icon small.png
17
- path : '<%= Rails.application.class.routes.url_helpers.ratings_path %>', // path of the php file jRating.php
15
+ bigStarsPath : '<%= image_path "seems_rateable/stars.png" %>', // path of the icon stars.png
16
+ smallStarsPath : '<%= image_path "seems_rateable/small.png" %>', // path of the icon small.png
17
+ path : '<%= SeemsRateable::Engine.routes.url_helpers.ratings_path %>',
18
18
  type : 'big', // can be set to 'small' or 'big'
19
19
 
20
20
  /** Boolean vars **/
@@ -0,0 +1,13 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
@@ -42,7 +42,7 @@ p.jRatingInfos {
42
42
  text-align:center;
43
43
  padding-top:5px;
44
44
  }
45
- p.jRatingInfos span.maxRate {
46
- color:#c9c9c9;
47
- font-size:14px;
48
- }
45
+ p.jRatingInfos span.maxRate {
46
+ color:#c9c9c9;
47
+ font-size:14px;
48
+ }
@@ -0,0 +1,4 @@
1
+ module SeemsRateable
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,17 @@
1
+ require_dependency "seems_rateable/application_controller"
2
+
3
+ module SeemsRateable
4
+ class RatingsController < ::ApplicationController
5
+ def create
6
+ raise NoCurrentUserInstanceError unless current_user
7
+
8
+ obj = params[:kls].classify.constantize.find(params[:idBox])
9
+ begin
10
+ obj.rate(params[:rate].to_i, current_user.id, params[:dimension])
11
+ render :json => true
12
+ rescue Errors::AlreadyRatedError
13
+ render :json => {:error => true}
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,4 @@
1
+ module SeemsRateable
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module SeemsRateable
2
+ module RatingsHelper
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module SeemsRateable
2
+ class CachedRating < ActiveRecord::Base
3
+ belongs_to :cacheable, :polymorphic => true
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module SeemsRateable
2
+ class Rate < ActiveRecord::Base
3
+ belongs_to :rater, :class_name => SeemsRateable::Engine.config.owner_class
4
+ belongs_to :rateable, :polymorphic => true
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>SeemsRateable</title>
5
+ <%= stylesheet_link_tag "seems_rateable/application", media: "all" %>
6
+ <%= javascript_include_tag "seems_rateable/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ SeemsRateable::Engine.routes.draw do
2
+ resources :ratings, :only => :create
3
+ end
@@ -0,0 +1,39 @@
1
+ require 'rails/generators/migration'
2
+ require 'fileutils'
3
+
4
+ module SeemsRateable
5
+ module Generators
6
+ class InstallGenerator < ::Rails::Generators::Base
7
+ include Rails::Generators::Migration
8
+ source_root File.expand_path('../templates', __FILE__)
9
+
10
+ def self.next_migration_number(path)
11
+ unless @prev_migration_nr
12
+ @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
13
+ else
14
+ @prev_migration_nr += 1
15
+ end
16
+ @prev_migration_nr.to_s
17
+ end
18
+
19
+ desc "generating migration files"
20
+ def copy_migrations
21
+ migration_template "rates_migration.rb", "db/migrate/create_seems_rateable_rates.rb"
22
+ migration_template "cached_ratings_migration.rb", "db/migrate/create_seems_rateable_cached_ratings.rb"
23
+ end
24
+
25
+ desc "generating initializer"
26
+ def copy_initializer
27
+ template "initializer.rb", "config/initializers/seems_rateable.rb"
28
+ end
29
+
30
+ desc "generating javascript files"
31
+ def copy_javascript_asset
32
+ Dir.mkdir "app/assets/javascripts/rateable" unless File.directory?("app/assets/javascripts/rateable")
33
+ copy_file "rateable.js.erb", "app/assets/javascripts/rateable/rateable.js.erb" unless File.exists?("app/assets/javascripts/rateable/rateable.js.erb")
34
+ copy_file "jRating.js.erb", "app/assets/javascripts/rateable/jRating.js.erb" unless File.exists?("app/assets/javascripts/rateable/jRating.js.erb")
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -1,6 +1,6 @@
1
- class CreateCachedRatings < ActiveRecord::Migration
1
+ class CreateSeemsRateableCachedRatings < ActiveRecord::Migration
2
2
  def self.up
3
- create_table :cached_ratings do |t|
3
+ create_table :seems_rateable_cached_ratings do |t|
4
4
  t.belongs_to :cacheable, :polymorphic => true
5
5
  t.float :avg, :null => false
6
6
  t.integer :cnt, :null => false
@@ -0,0 +1,4 @@
1
+ #SeemsRateable engine Initializer
2
+
3
+ #Configure owner class of the given ratings
4
+ SeemsRateable::Engine.config.owner_class = "User"
@@ -0,0 +1,225 @@
1
+ /************************************************************************
2
+ *************************************************************************
3
+ @Name : jRating - jQuery Plugin
4
+ @Revison : 3.0
5
+ @Date : 28/01/2013
6
+ @Author: ALPIXEL - (www.myjqueryplugins.com - www.alpixel.fr)
7
+ @License : Open Source - MIT License : http://www.opensource.org/licenses/mit-license.php
8
+
9
+ **************************************************************************
10
+ *************************************************************************/
11
+ (function($) {
12
+ $.fn.jRating = function(op) {
13
+ var defaults = {
14
+ /** String vars **/
15
+ bigStarsPath : '<%= image_path "seems_rateable/stars.png" %>', // path of the icon stars.png
16
+ smallStarsPath : '<%= image_path "seems_rateable/small.png" %>', // path of the icon small.png
17
+ path : '<%= SeemsRateable::Engine.routes.url_helpers.ratings_path %>',
18
+ type : 'big', // can be set to 'small' or 'big'
19
+
20
+ /** Boolean vars **/
21
+ step:false, // if true, mouseover binded star by star,
22
+ isDisabled:false,
23
+ showRateInfo: false,
24
+ canRateAgain : false,
25
+
26
+ /** Integer vars **/
27
+ length:5, // number of star to display
28
+ decimalLength : 0, // number of decimals.. Max 3, but you can complete the function 'getNote'
29
+ rateMax : 20, // maximal rate - integer from 0 to 9999 (or more)
30
+ rateInfosX : -45, // relative position in X axis of the info box when mouseover
31
+ rateInfosY : 5, // relative position in Y axis of the info box when mouseover
32
+ nbRates : 1,
33
+
34
+ /** Functions **/
35
+ onSuccess : null,
36
+ onError : null
37
+ };
38
+
39
+ if(this.length>0)
40
+ return this.each(function() {
41
+ /*vars*/
42
+ var opts = $.extend(defaults, op),
43
+ newWidth = 0,
44
+ starWidth = 0,
45
+ starHeight = 0,
46
+ bgPath = '',
47
+ hasRated = false,
48
+ globalWidth = 0,
49
+ nbOfRates = opts.nbRates;
50
+
51
+ if($(this).hasClass('jDisabled') || opts.isDisabled)
52
+ var jDisabled = true;
53
+ else
54
+ var jDisabled = false;
55
+
56
+ getStarWidth();
57
+ $(this).height(starHeight);
58
+
59
+
60
+
61
+ var average = parseFloat($(this).attr('data-average')), // get the average of all rates
62
+ idBox = parseInt($(this).attr('data-id')), // get the id of the box
63
+ kls = $(this).attr('data-kls'),
64
+ dimension = $(this).attr('data-dimension'),
65
+ widthRatingContainer = starWidth*opts.length, // Width of the Container
66
+ widthColor = average/opts.rateMax*widthRatingContainer, // Width of the color Container
67
+ quotient =
68
+ $('<div>',
69
+ {
70
+ 'class' : 'jRatingColor',
71
+ css:{
72
+ width:widthColor
73
+ }
74
+ }).appendTo($(this)),
75
+
76
+ average =
77
+ $('<div>',
78
+ {
79
+ 'class' : 'jRatingAverage',
80
+ css:{
81
+ width:0,
82
+ top:- starHeight
83
+ }
84
+ }).appendTo($(this)),
85
+
86
+ jstar =
87
+ $('<div>',
88
+ {
89
+ 'class' : 'jStar',
90
+ css:{
91
+ width:widthRatingContainer,
92
+ height:starHeight,
93
+ top:- (starHeight*2),
94
+ background: 'url('+bgPath+') repeat-x'
95
+ }
96
+ }).appendTo($(this));
97
+
98
+ $(this).css({width: widthRatingContainer,overflow:'hidden',zIndex:1,position:'relative'});
99
+
100
+ if(!jDisabled)
101
+ $(this).unbind().bind({
102
+ mouseenter : function(e){
103
+ var realOffsetLeft = findRealLeft(this);
104
+ var relativeX = e.pageX - realOffsetLeft;
105
+ if (opts.showRateInfo)
106
+ var tooltip =
107
+ $('<p>',{
108
+ 'class' : 'jRatingInfos',
109
+ html : getNote(relativeX)+' <span class="maxRate">/ '+opts.rateMax+'</span>',
110
+ css : {
111
+ top: (e.pageY + opts.rateInfosY),
112
+ left: (e.pageX + opts.rateInfosX)
113
+ }
114
+ }).appendTo('body').show();
115
+ },
116
+ mouseover : function(e){
117
+ $(this).css('cursor','pointer');
118
+ },
119
+ mouseout : function(){
120
+ $(this).css('cursor','default');
121
+ if(hasRated) average.width(globalWidth);
122
+ else average.width(0);
123
+ },
124
+ mousemove : function(e){
125
+ var realOffsetLeft = findRealLeft(this);
126
+ var relativeX = e.pageX - realOffsetLeft;
127
+ if(opts.step) newWidth = Math.floor(relativeX/starWidth)*starWidth + starWidth;
128
+ else newWidth = relativeX;
129
+ average.width(newWidth);
130
+ if (opts.showRateInfo)
131
+ $("p.jRatingInfos")
132
+ .css({
133
+ left: (e.pageX + opts.rateInfosX)
134
+ })
135
+ .html(getNote(newWidth) +' <span class="maxRate">/ '+opts.rateMax+'</span>');
136
+ },
137
+ mouseleave : function(){
138
+ $("p.jRatingInfos").remove();
139
+ },
140
+ click : function(e){
141
+ var element = this;
142
+
143
+ /*set vars*/
144
+ hasRated = true;
145
+ globalWidth = newWidth;
146
+ nbOfRates--;
147
+
148
+ if(!opts.canRateAgain || parseInt(nbOfRates) <= 0) $(this).unbind().css('cursor','default').addClass('jDisabled');
149
+
150
+ if (opts.showRateInfo) $("p.jRatingInfos").fadeOut('fast',function(){$(this).remove();});
151
+ e.preventDefault();
152
+ var rate = getNote(newWidth);
153
+ average.width(newWidth);
154
+
155
+
156
+ $.post(defaults.path,
157
+ {
158
+ idBox : idBox,
159
+ rate : rate,
160
+ kls : kls,
161
+ dimension : dimension
162
+ /** action : 'rating' **/
163
+ },
164
+ function(data) {
165
+ if(!data.error)
166
+ {
167
+ /** Here you can display an alert box,
168
+ or use the jNotify Plugin :) http://www.myqjqueryplugins.com/jNotify
169
+ exemple : */
170
+ if(opts.onSuccess) opts.onSuccess( element, rate );
171
+ }
172
+ else
173
+ {
174
+
175
+ /** Here you can display an alert box,
176
+ or use the jNotify Plugin :) http://www.myqjqueryplugins.com/jNotify
177
+ exemple : */
178
+ if(opts.onError) opts.onError( element, rate );
179
+ }
180
+ },
181
+ 'json'
182
+ );
183
+ }
184
+ });
185
+
186
+ function getNote(relativeX) {
187
+ var noteBrut = parseFloat((relativeX*100/widthRatingContainer)*opts.rateMax/100);
188
+ switch(opts.decimalLength) {
189
+ case 1 :
190
+ var note = Math.round(noteBrut*10)/10;
191
+ break;
192
+ case 2 :
193
+ var note = Math.round(noteBrut*100)/100;
194
+ break;
195
+ case 3 :
196
+ var note = Math.round(noteBrut*1000)/1000;
197
+ break;
198
+ default :
199
+ var note = Math.round(noteBrut*1)/1;
200
+ }
201
+ return note;
202
+ };
203
+
204
+ function getStarWidth(){
205
+ switch(opts.type) {
206
+ case 'small' :
207
+ starWidth = 12; // width of the picture small.png
208
+ starHeight = 10; // height of the picture small.png
209
+ bgPath = opts.smallStarsPath;
210
+ break;
211
+ default :
212
+ starWidth = 23; // width of the picture stars.png
213
+ starHeight = 20; // height of the picture stars.png
214
+ bgPath = opts.bigStarsPath;
215
+ }
216
+ };
217
+
218
+ function findRealLeft(obj) {
219
+ if( !obj ) return 0;
220
+ return obj.offsetLeft + findRealLeft( obj.offsetParent );
221
+ };
222
+ });
223
+
224
+ }
225
+ })(jQuery);
@@ -0,0 +1,25 @@
1
+ $(document).ready(function(){
2
+ $(".rateable").jRating({
3
+ //default options displayed below ->
4
+
5
+ rateMax: 5, //Maximal rate
6
+ length : 5, //Number of stars
7
+ //decimalLength : 0, //Number of decimals in the rate
8
+ //type : 'big', //Big or small
9
+ //step : true, //If set to true, filling of the stars is done star by star (step by step).
10
+ //isDisabled: false, //Set true to display static rating
11
+ //showRateInfo:false, //Rate info panel, set true to display
12
+ //rateInfosX : 45, //In pixel - Absolute left position of the information box during mousemove.
13
+ //rateInfosY : 5, //In pixel - Absolute top position of the information box during mousemove.
14
+ path : '<%= SeemsRateable::Engine.routes.url_helpers.ratings_path %>',
15
+ onSuccess : function(element, rate){
16
+ //something like ->
17
+ //alert('success');
18
+ $('<span class="text-success"><small style="display:inline-block;">Thanks for rating!</small></span>').insertAfter(element)
19
+ },
20
+ onError : function(element, rate) {
21
+ $('<span class="text-error"><small style="display:inline-block;">You have already rated!</small></span>').insertAfter(element)
22
+ }
23
+ });
24
+
25
+ });