avatars_for_rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +10 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +138 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +91 -0
- data/Rakefile +29 -0
- data/app/controllers/avatars_controller.rb +109 -0
- data/app/models/avatar.rb +138 -0
- data/app/views/avatars/_errors.html.erb +6 -0
- data/app/views/avatars/_form.html.erb +128 -0
- data/app/views/avatars/_includes.html.erb +14 -0
- data/app/views/avatars/_list.html.erb +39 -0
- data/app/views/avatars/_new.html.erb +15 -0
- data/app/views/avatars/_precrop.html.erb +38 -0
- data/app/views/avatars/destroy.js.erb +2 -0
- data/app/views/avatars/edit.html.erb +8 -0
- data/app/views/avatars/index.html.erb +4 -0
- data/app/views/avatars/new.html.erb +1 -0
- data/app/views/avatars/show.html.erb +8 -0
- data/app/views/avatars/update.js.erb +6 -0
- data/avatars_for_rails.gemspec +40 -0
- data/config/locales/en.yml +28 -0
- data/config/routes.rb +6 -0
- data/lib/avatars_for_rails/avatars_controller_config.rb +4 -0
- data/lib/avatars_for_rails.rb +27 -0
- data/lib/generators/avatars_for_rails/install_generator.rb +28 -0
- data/lib/generators/avatars_for_rails/templates/initializer.rb +11 -0
- data/lib/generators/avatars_for_rails/templates/migration.rb +20 -0
- data/lib/generators/avatars_for_rails/templates/public/images/Jcrop.gif +0 -0
- data/lib/generators/avatars_for_rails/templates/public/images/cancel.png +0 -0
- data/lib/generators/avatars_for_rails/templates/public/images/pbar-ani.gif +0 -0
- data/lib/generators/avatars_for_rails/templates/public/images/rails.png +0 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/application.js +2 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/avatars.js +8 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/controls.js +965 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/dragdrop.js +974 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/effects.js +1123 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery-ui.min.js +401 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery.Jcrop.min.js +163 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery.fileupload-ui.js +259 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery.fileupload.js +475 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery.form.js +815 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery.js +7179 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/prototype.js +6001 -0
- data/lib/generators/avatars_for_rails/templates/public/javascripts/rails.js +158 -0
- data/lib/generators/avatars_for_rails/templates/public/stylesheets/.gitkeep +0 -0
- data/lib/generators/avatars_for_rails/templates/public/stylesheets/avatars.css +115 -0
- data/lib/generators/avatars_for_rails/templates/public/stylesheets/jquery.Jcrop.css +35 -0
- data/lib/generators/avatars_for_rails/templates/public/stylesheets/jquery.fileupload-ui.css +70 -0
- data/spec/avatars_for_rails_spec.rb +7 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/actor.rb +7 -0
- data/spec/dummy/app/views/layouts/application.html.erb +20 -0
- data/spec/dummy/config/application.rb +46 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +22 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +26 -0
- data/spec/dummy/config/environments/production.rb +49 -0
- data/spec/dummy/config/environments/test.rb +35 -0
- data/spec/dummy/config/initializers/avatars_for_rails.rb +6 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +60 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20110411073237_create_actors.rb +13 -0
- data/spec/dummy/db/migrate/20110411073238_create_avatars.rb +21 -0
- data/spec/dummy/db/schema.rb +32 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/images/Jcrop.gif +0 -0
- data/spec/dummy/public/images/cancel.png +0 -0
- data/spec/dummy/public/images/pbar-ani.gif +0 -0
- data/spec/dummy/public/images/rails.png +0 -0
- data/spec/dummy/public/javascripts/application.js +2 -0
- data/spec/dummy/public/javascripts/avatars.js +8 -0
- data/spec/dummy/public/javascripts/controls.js +965 -0
- data/spec/dummy/public/javascripts/dragdrop.js +974 -0
- data/spec/dummy/public/javascripts/effects.js +1123 -0
- data/spec/dummy/public/javascripts/jquery-ui.min.js +401 -0
- data/spec/dummy/public/javascripts/jquery.Jcrop.min.js +163 -0
- data/spec/dummy/public/javascripts/jquery.fileupload-ui.js +259 -0
- data/spec/dummy/public/javascripts/jquery.fileupload.js +475 -0
- data/spec/dummy/public/javascripts/jquery.form.js +815 -0
- data/spec/dummy/public/javascripts/jquery.js +7179 -0
- data/spec/dummy/public/javascripts/prototype.js +6001 -0
- data/spec/dummy/public/javascripts/rails.js +158 -0
- data/spec/dummy/public/stylesheets/.gitkeep +0 -0
- data/spec/dummy/public/stylesheets/avatars.css +115 -0
- data/spec/dummy/public/stylesheets/jquery.Jcrop.css +35 -0
- data/spec/dummy/public/stylesheets/jquery.fileupload-ui.css +70 -0
- data/spec/dummy/public/system/logos/1/actor/stream20110411-3539-1e9l1hn-0.jpg +0 -0
- data/spec/dummy/public/system/logos/1/original/stream20110411-3539-1e9l1hn-0.jpg +0 -0
- data/spec/dummy/public/system/logos/1/profile/stream20110411-3539-1e9l1hn-0.jpg +0 -0
- data/spec/dummy/public/system/logos/1/representation/stream20110411-3539-1e9l1hn-0.jpg +0 -0
- data/spec/dummy/public/system/logos/1/tie/stream20110411-3539-1e9l1hn-0.jpg +0 -0
- data/spec/dummy/public/system/logos/2/actor/stream20110411-3539-1hlzauh-0.jpeg +0 -0
- data/spec/dummy/public/system/logos/2/original/stream20110411-3539-1hlzauh-0.jpeg +0 -0
- data/spec/dummy/public/system/logos/2/profile/stream20110411-3539-1hlzauh-0.jpeg +0 -0
- data/spec/dummy/public/system/logos/2/representation/stream20110411-3539-1hlzauh-0.jpeg +0 -0
- data/spec/dummy/public/system/logos/2/tie/stream20110411-3539-1hlzauh-0.jpeg +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/integration/navigation_spec.rb +9 -0
- data/spec/spec_helper.rb +33 -0
- metadata +333 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
avatars_for_rails (0.0.1)
|
5
|
+
foreigner (~> 0.9.1)
|
6
|
+
paperclip (~> 2.3.4)
|
7
|
+
rmagick (~> 2.13.1)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: http://rubygems.org/
|
11
|
+
specs:
|
12
|
+
abstract (1.0.0)
|
13
|
+
actionmailer (3.0.5)
|
14
|
+
actionpack (= 3.0.5)
|
15
|
+
mail (~> 2.2.15)
|
16
|
+
actionpack (3.0.5)
|
17
|
+
activemodel (= 3.0.5)
|
18
|
+
activesupport (= 3.0.5)
|
19
|
+
builder (~> 2.1.2)
|
20
|
+
erubis (~> 2.6.6)
|
21
|
+
i18n (~> 0.4)
|
22
|
+
rack (~> 1.2.1)
|
23
|
+
rack-mount (~> 0.6.13)
|
24
|
+
rack-test (~> 0.5.7)
|
25
|
+
tzinfo (~> 0.3.23)
|
26
|
+
activemodel (3.0.5)
|
27
|
+
activesupport (= 3.0.5)
|
28
|
+
builder (~> 2.1.2)
|
29
|
+
i18n (~> 0.4)
|
30
|
+
activerecord (3.0.5)
|
31
|
+
activemodel (= 3.0.5)
|
32
|
+
activesupport (= 3.0.5)
|
33
|
+
arel (~> 2.0.2)
|
34
|
+
tzinfo (~> 0.3.23)
|
35
|
+
activeresource (3.0.5)
|
36
|
+
activemodel (= 3.0.5)
|
37
|
+
activesupport (= 3.0.5)
|
38
|
+
activesupport (3.0.5)
|
39
|
+
arel (2.0.9)
|
40
|
+
builder (2.1.2)
|
41
|
+
capybara (0.3.9)
|
42
|
+
culerity (>= 0.2.4)
|
43
|
+
mime-types (>= 1.16)
|
44
|
+
nokogiri (>= 1.3.3)
|
45
|
+
rack (>= 1.0.0)
|
46
|
+
rack-test (>= 0.5.4)
|
47
|
+
selenium-webdriver (>= 0.0.3)
|
48
|
+
childprocess (0.1.8)
|
49
|
+
ffi (~> 1.0.6)
|
50
|
+
columnize (0.3.2)
|
51
|
+
culerity (0.2.15)
|
52
|
+
diff-lcs (1.1.2)
|
53
|
+
erubis (2.6.6)
|
54
|
+
abstract (>= 1.0.0)
|
55
|
+
factory_girl (1.3.3)
|
56
|
+
ffi (1.0.7)
|
57
|
+
rake (>= 0.8.7)
|
58
|
+
foreigner (0.9.1)
|
59
|
+
forgery (0.3.7)
|
60
|
+
nokogiri (~> 1.4)
|
61
|
+
i18n (0.5.0)
|
62
|
+
json_pure (1.5.1)
|
63
|
+
linecache (0.43)
|
64
|
+
mail (2.2.15)
|
65
|
+
activesupport (>= 2.3.6)
|
66
|
+
i18n (>= 0.4.0)
|
67
|
+
mime-types (~> 1.16)
|
68
|
+
treetop (~> 1.4.8)
|
69
|
+
mime-types (1.16)
|
70
|
+
nokogiri (1.4.4)
|
71
|
+
paperclip (2.3.10)
|
72
|
+
activerecord (>= 2.3.0)
|
73
|
+
activesupport (>= 2.3.2)
|
74
|
+
polyglot (0.3.1)
|
75
|
+
rack (1.2.2)
|
76
|
+
rack-mount (0.6.14)
|
77
|
+
rack (>= 1.0.0)
|
78
|
+
rack-test (0.5.7)
|
79
|
+
rack (>= 1.0)
|
80
|
+
rails (3.0.5)
|
81
|
+
actionmailer (= 3.0.5)
|
82
|
+
actionpack (= 3.0.5)
|
83
|
+
activerecord (= 3.0.5)
|
84
|
+
activeresource (= 3.0.5)
|
85
|
+
activesupport (= 3.0.5)
|
86
|
+
bundler (~> 1.0)
|
87
|
+
railties (= 3.0.5)
|
88
|
+
railties (3.0.5)
|
89
|
+
actionpack (= 3.0.5)
|
90
|
+
activesupport (= 3.0.5)
|
91
|
+
rake (>= 0.8.7)
|
92
|
+
thor (~> 0.14.4)
|
93
|
+
rake (0.8.7)
|
94
|
+
rmagick (2.13.1)
|
95
|
+
rspec (2.5.0)
|
96
|
+
rspec-core (~> 2.5.0)
|
97
|
+
rspec-expectations (~> 2.5.0)
|
98
|
+
rspec-mocks (~> 2.5.0)
|
99
|
+
rspec-core (2.5.1)
|
100
|
+
rspec-expectations (2.5.0)
|
101
|
+
diff-lcs (~> 1.1.2)
|
102
|
+
rspec-mocks (2.5.0)
|
103
|
+
rspec-rails (2.5.0)
|
104
|
+
actionpack (~> 3.0)
|
105
|
+
activesupport (~> 3.0)
|
106
|
+
railties (~> 3.0)
|
107
|
+
rspec (~> 2.5.0)
|
108
|
+
ruby-debug (0.10.4)
|
109
|
+
columnize (>= 0.1)
|
110
|
+
ruby-debug-base (~> 0.10.4.0)
|
111
|
+
ruby-debug-base (0.10.4)
|
112
|
+
linecache (>= 0.3)
|
113
|
+
rubyzip (0.9.4)
|
114
|
+
selenium-webdriver (0.1.4)
|
115
|
+
childprocess (>= 0.1.7)
|
116
|
+
ffi (>= 1.0.7)
|
117
|
+
json_pure
|
118
|
+
rubyzip
|
119
|
+
sqlite3 (1.3.3)
|
120
|
+
sqlite3-ruby (1.3.3)
|
121
|
+
sqlite3 (>= 1.3.3)
|
122
|
+
thor (0.14.6)
|
123
|
+
treetop (1.4.9)
|
124
|
+
polyglot (>= 0.3.1)
|
125
|
+
tzinfo (0.3.26)
|
126
|
+
|
127
|
+
PLATFORMS
|
128
|
+
ruby
|
129
|
+
|
130
|
+
DEPENDENCIES
|
131
|
+
avatars_for_rails!
|
132
|
+
capybara (~> 0.3.9)
|
133
|
+
factory_girl (~> 1.3.2)
|
134
|
+
forgery (~> 0.3.6)
|
135
|
+
rails (~> 3.0.5)
|
136
|
+
rspec-rails (~> 2.5.0)
|
137
|
+
ruby-debug (~> 0.10.3)
|
138
|
+
sqlite3-ruby
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2011 YOURNAME
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
= AvatarsForRails
|
2
|
+
|
3
|
+
This project rocks and uses MIT-LICENSE.
|
4
|
+
|
5
|
+
|
6
|
+
= Installation
|
7
|
+
|
8
|
+
Add to your Gemfile:
|
9
|
+
|
10
|
+
gem 'avatars_for_rails'
|
11
|
+
|
12
|
+
and run:
|
13
|
+
|
14
|
+
bundle update
|
15
|
+
|
16
|
+
Then, if you have a class named actor and you want it to have avatars, run:
|
17
|
+
|
18
|
+
rails generate avatars_for_rails:install actor
|
19
|
+
|
20
|
+
This will generate the following:
|
21
|
+
* A public/ file with the js and css files required.
|
22
|
+
* A initializer file with configuration for avatars_for_rails.
|
23
|
+
* A migration providing the database schema for using avatars_for_rails with the actor class.
|
24
|
+
|
25
|
+
Do not forget to migrate your database
|
26
|
+
|
27
|
+
rake db:migrate
|
28
|
+
|
29
|
+
In your application layout you have to add this on the <head> label:
|
30
|
+
|
31
|
+
<head>
|
32
|
+
<% stylesheet_link_tag :all %>
|
33
|
+
<% javascript_include_tag :defaults %>
|
34
|
+
<%= yield :headers %>
|
35
|
+
<%= csrf_meta_tag %>
|
36
|
+
<script type="text/javascript" charset="utf-8">
|
37
|
+
$(document).ready(function() {
|
38
|
+
<%= yield :javascript %>
|
39
|
+
})
|
40
|
+
</script>
|
41
|
+
</head>
|
42
|
+
|
43
|
+
In config/initializers/avatars_for_rails.rb you have to change:
|
44
|
+
|
45
|
+
def current_avatarable_object
|
46
|
+
return Actor.find(:all).first
|
47
|
+
end
|
48
|
+
|
49
|
+
to return the actor you wants to be the owner of the new avatars, etc For example, you can return the current logged in actor.
|
50
|
+
|
51
|
+
Finally, add to your actor model the relation with avatars_for_rails:
|
52
|
+
|
53
|
+
has_many :avatars
|
54
|
+
|
55
|
+
Now, if you go to /avatars you will see:
|
56
|
+
* A list of all the avatars for the current actor. You can change the default and delete avatars in this list.
|
57
|
+
* Forms for creating a new avatar with two options. A typical file filed or a drag and drop file field
|
58
|
+
|
59
|
+
For rendering the avatars list:
|
60
|
+
<%= render :partial => 'list' %>
|
61
|
+
|
62
|
+
For rendering the new avatar form:
|
63
|
+
<%= render :partial => 'form' %>
|
64
|
+
|
65
|
+
For include the javacript and css files:
|
66
|
+
<%= render :partial => 'includes' %>
|
67
|
+
or
|
68
|
+
<% content_for :headers do %>
|
69
|
+
<%= javascript_include_tag 'jquery' %>
|
70
|
+
<%= javascript_include_tag 'jquery.Jcrop.min' %>
|
71
|
+
<%= javascript_include_tag 'jquery-ui.min' %>
|
72
|
+
<%= javascript_include_tag 'rails' %>
|
73
|
+
<%= javascript_include_tag 'avatars' %>
|
74
|
+
<%= javascript_include_tag 'jquery.form' %>
|
75
|
+
<%= javascript_include_tag 'jquery.fileupload' %>
|
76
|
+
<%= javascript_include_tag 'jquery.fileupload-ui' %>
|
77
|
+
<%= stylesheet_link_tag "jquery.Jcrop", :media => "screen, projection" %>
|
78
|
+
<%= stylesheet_link_tag "avatars", :media => "screen, projection" %><br/>
|
79
|
+
<%= stylesheet_link_tag "jquery.fileupload-ui", :media => "screen, projection" %><br/>
|
80
|
+
<%end%>
|
81
|
+
|
82
|
+
For rendering an image_tag for an acctor's avatar:
|
83
|
+
<%= image_tag(avatar.logo.url(:style) ) %>
|
84
|
+
|
85
|
+
The avaible styles for now are:
|
86
|
+
|
87
|
+
:representation => 20x20 px
|
88
|
+
:tie => 30x30 px
|
89
|
+
:actor => 35x35 px
|
90
|
+
:profile => 94x94 px
|
91
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'bundler/setup'
|
6
|
+
require 'bundler'
|
7
|
+
rescue LoadError
|
8
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'rake'
|
12
|
+
require 'rake/rdoctask'
|
13
|
+
|
14
|
+
require 'rspec/core'
|
15
|
+
require 'rspec/core/rake_task'
|
16
|
+
|
17
|
+
RSpec::Core::RakeTask.new(:spec)
|
18
|
+
|
19
|
+
task :default => :spec
|
20
|
+
|
21
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
22
|
+
rdoc.rdoc_dir = 'rdoc'
|
23
|
+
rdoc.title = 'AvatarsForRails'
|
24
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
25
|
+
rdoc.rdoc_files.include('README.rdoc')
|
26
|
+
rdoc.rdoc_files.include('lib/**/*.rb', 'app/**/*.rb')
|
27
|
+
end
|
28
|
+
|
29
|
+
Bundler::GemHelper.install_tasks
|
@@ -0,0 +1,109 @@
|
|
1
|
+
#class AvatarsController < InheritedResources::Base
|
2
|
+
class AvatarsController < ApplicationController
|
3
|
+
def index
|
4
|
+
@avatars = Avatar.all
|
5
|
+
|
6
|
+
respond_to do |format|
|
7
|
+
format.html # index.html.erb
|
8
|
+
#format.xml { render :xml => @gastos }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
@avatars = Avatar.all
|
14
|
+
@avatar = Avatar.create(params[:avatar])
|
15
|
+
|
16
|
+
if params[:drag_name].blank?
|
17
|
+
respond_to do |format|
|
18
|
+
format.html # new.html.erb
|
19
|
+
end
|
20
|
+
else
|
21
|
+
#debugger
|
22
|
+
if Avatar.check_image_tmp_valid(params[:drag_name].to_s)
|
23
|
+
render :partial => 'precrop'
|
24
|
+
else
|
25
|
+
@avatar.logo.errors['invalid_type'] = I18n.t('avatar.error.no_image_file')
|
26
|
+
render :partial => 'errors'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
def update
|
33
|
+
#debugger
|
34
|
+
if !current_avatarable_object.avatars.blank?
|
35
|
+
|
36
|
+
new_logo = Avatar.find(params[:id])
|
37
|
+
|
38
|
+
if (new_logo.avatarable == current_avatarable_object)
|
39
|
+
actual_logo = current_avatarable_object.avatars.active.first
|
40
|
+
unless actual_logo.blank?
|
41
|
+
#actual_logo.active = false
|
42
|
+
#actual_logo.save
|
43
|
+
old_logo_id = actual_logo.id
|
44
|
+
current_avatarable_object.avatars.each do |old_logo|
|
45
|
+
old_logo.active = false
|
46
|
+
old_logo.save
|
47
|
+
end
|
48
|
+
else
|
49
|
+
old_logo_id = params[:id].to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
new_logo.active = true
|
53
|
+
new_logo.save
|
54
|
+
|
55
|
+
respond_to do |format|
|
56
|
+
format.js { render :layout=>false , :locals=>{:new_id => params[:id],:old_id => old_logo_id}}
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# redirect_to avatars_path
|
63
|
+
end
|
64
|
+
|
65
|
+
def create
|
66
|
+
@avatar = current_avatarable_object.avatars.create(params[:avatar])
|
67
|
+
|
68
|
+
if @avatar.new_record?
|
69
|
+
if (params[:avatar].blank? || params[:avatar][:drag].nil?)
|
70
|
+
render :new
|
71
|
+
else
|
72
|
+
render :json => {:name => File.basename(@avatar.logo.queued_for_write[:original].path) }
|
73
|
+
end
|
74
|
+
else
|
75
|
+
#debugger
|
76
|
+
#@avatar.updating_logo = true
|
77
|
+
#@avatar.avatarable.id = current_avatarable_object.id
|
78
|
+
# unless current_avatarable_object.avatars.blank?
|
79
|
+
# current_avatarable_object.avatars.each do |old_logo|
|
80
|
+
# old_logo.active = false
|
81
|
+
# old_logo.save
|
82
|
+
# end
|
83
|
+
# end
|
84
|
+
#debugger
|
85
|
+
#@avatar.active = true
|
86
|
+
#@avatar.save
|
87
|
+
redirect_to avatars_path
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def destroy
|
93
|
+
@avatar = Avatar.find(params[:id])
|
94
|
+
|
95
|
+
if (@avatar.avatarable == current_avatarable_object)
|
96
|
+
@avatar.destroy
|
97
|
+
respond_to do |format|
|
98
|
+
format.js { render :layout=>false , :locals=>{:deleted_id => params[:id]}}
|
99
|
+
end
|
100
|
+
end
|
101
|
+
#redirect_to avatars_path
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
#def current_avatarable_object
|
106
|
+
#return Actor.find(:all).first
|
107
|
+
#end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'RMagick'
|
2
|
+
|
3
|
+
class Avatar < ActiveRecord::Base
|
4
|
+
has_attached_file :logo,
|
5
|
+
:styles => { :representation => "20x20>",
|
6
|
+
:tie => "30x30>",
|
7
|
+
:actor => '35x35>',
|
8
|
+
:profile => '94x94' },
|
9
|
+
:default_url => "/images/logos/:style/:subtype_class.png"
|
10
|
+
|
11
|
+
before_post_process :process_precrop
|
12
|
+
attr_accessor :crop_x, :crop_y, :crop_w, :crop_h, :name,:updating_logo,:drag,:drag_name
|
13
|
+
validates_attachment_presence :logo, :if => :uploading_file?, :message => I18n.t('avatar.error.no_file')
|
14
|
+
|
15
|
+
after_validation :precrop_done
|
16
|
+
|
17
|
+
#belongs_to :actor
|
18
|
+
belongs_to AvatarsForRails.avatarable_model
|
19
|
+
|
20
|
+
scope :active, where(:active => true)
|
21
|
+
|
22
|
+
before_create :make_active
|
23
|
+
after_create :disable_old
|
24
|
+
|
25
|
+
def make_active
|
26
|
+
self.updating_logo = true
|
27
|
+
self.active = true
|
28
|
+
end
|
29
|
+
|
30
|
+
def disable_old
|
31
|
+
#unless self.avatarable.avatars.blank?
|
32
|
+
self.avatarable.avatars.where("id != ?", self.id).each do |old_logo|
|
33
|
+
old_logo.update_attribute :active, false
|
34
|
+
end
|
35
|
+
#end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
def avatarable
|
41
|
+
__send__ AvatarsForRails.avatarable_model # __send__ :actor
|
42
|
+
end
|
43
|
+
|
44
|
+
def uploading_file?
|
45
|
+
return @name.blank?
|
46
|
+
end
|
47
|
+
|
48
|
+
def precrop_done
|
49
|
+
return if @name.blank? || !@updating_logo.blank?
|
50
|
+
|
51
|
+
precrop_path = File.join(Avatar.images_tmp_path,@name)
|
52
|
+
|
53
|
+
make_precrop(precrop_path,@crop_x.to_i,@crop_y.to_i,@crop_w.to_i,@crop_h.to_i)
|
54
|
+
@avatar = Avatar.new :logo => File.open(precrop_path), :name => @name
|
55
|
+
|
56
|
+
self.logo = @avatar.logo
|
57
|
+
|
58
|
+
FileUtils.remove_file(precrop_path)
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.images_tmp_path
|
62
|
+
images_path = File.join(RAILS_ROOT, "public", "images")
|
63
|
+
tmp_path = FileUtils.mkdir_p(File.join(images_path, "tmp"))
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.copy_to_temp_file(path)
|
67
|
+
FileUtils.cp(path,Avatar.images_tmp_path)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.get_image_dimensions(name)
|
71
|
+
img_orig = Magick::Image.read(name).first
|
72
|
+
dimensions = {}
|
73
|
+
dimensions[:width] = img_orig.columns
|
74
|
+
dimensions[:height] = img_orig.rows
|
75
|
+
dimensions
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.check_image_tmp_valid(path)
|
79
|
+
|
80
|
+
begin
|
81
|
+
path = File.join(Avatar.images_tmp_path,path)
|
82
|
+
img_orig = Magick::Image.read(path).first
|
83
|
+
return true
|
84
|
+
rescue
|
85
|
+
return false
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def process_precrop
|
90
|
+
|
91
|
+
if @name.blank? && ( logo.content_type.present? && !logo.content_type.start_with?("image/"))
|
92
|
+
logo.errors['invalid_type'] = I18n.t('avatar.error.no_image_file')
|
93
|
+
return false
|
94
|
+
end
|
95
|
+
|
96
|
+
return if !@name.blank?
|
97
|
+
|
98
|
+
if resize_image(logo.queued_for_write[:original].path,500,500)
|
99
|
+
logo.errors['precrop'] = "You have to make precrop"
|
100
|
+
Avatar.copy_to_temp_file(logo.queued_for_write[:original].path)
|
101
|
+
else
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def resize_image(path,width,height)
|
107
|
+
begin
|
108
|
+
img_orig = Magick::Image.read(path).first
|
109
|
+
img_orig = img_orig.resize_to_fit(width, height)
|
110
|
+
img_orig.write(path)
|
111
|
+
return true
|
112
|
+
rescue
|
113
|
+
logo.errors['invalid_type'] = I18n.t('avatar.error.no_image_file')
|
114
|
+
return false
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def make_precrop(path,x,y,width,height)
|
119
|
+
begin
|
120
|
+
img_orig = Magick::Image.read(path).first
|
121
|
+
rescue
|
122
|
+
logo.errors['invalid_type'] = I18n.t('avatar.error.no_image_file')
|
123
|
+
return false
|
124
|
+
end
|
125
|
+
|
126
|
+
dimensions = Avatar.get_image_dimensions(path)
|
127
|
+
|
128
|
+
unless (width == 0) || (height == 0)
|
129
|
+
crop_args = [x,y,width,height]
|
130
|
+
img_orig = img_orig.crop(*crop_args)
|
131
|
+
end
|
132
|
+
|
133
|
+
img_orig = img_orig.resize_to_fill(500,500)
|
134
|
+
|
135
|
+
img_orig.write(path)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
@@ -0,0 +1,128 @@
|
|
1
|
+
<div id ="avatars_for_rails">
|
2
|
+
<div class= "block">
|
3
|
+
<div class = "content">
|
4
|
+
<%= form_for Avatar.new,:html => { :multipart => true,:id =>"uploadForm"} do |f| %>
|
5
|
+
<div class="form_row">
|
6
|
+
<%= f.file_field :logo %>
|
7
|
+
|
8
|
+
<%= f.submit t('avatar.upload'), :class => "button" %>
|
9
|
+
</div>
|
10
|
+
<div id= "prueba">
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="files">
|
17
|
+
<%= form_for Avatar.new, :html => { :class => "upload", :multipart => true } do |f| %>
|
18
|
+
<%= f.file_field :logo %>
|
19
|
+
<div>Upload files</div>
|
20
|
+
<%= f.hidden_field :drag %>
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
<table class="upload_files"></table>
|
24
|
+
<table class="download_files"></table>
|
25
|
+
<div id="show_pic"></div>
|
26
|
+
<div id="show_crop"></div>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div id= "precrop_drag_response"></div>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
|
33
|
+
<% content_for :javascript do%>
|
34
|
+
$(document).ready(function() {
|
35
|
+
var options = {
|
36
|
+
target: '#precrop_drag_response',
|
37
|
+
success: showResponse
|
38
|
+
};
|
39
|
+
|
40
|
+
$('#uploadForm').submit(function() {
|
41
|
+
$(this).ajaxSubmit(options);
|
42
|
+
return false;
|
43
|
+
});
|
44
|
+
});
|
45
|
+
|
46
|
+
function update_crop(coords) {
|
47
|
+
var rx = 100/coords.w;
|
48
|
+
var ry = 100/coords.h;
|
49
|
+
|
50
|
+
if((coords.w == 0) || (coords.h == 0)){
|
51
|
+
rx = 100/$("#cropImage").width();
|
52
|
+
ry = 100/$("#cropImage").height();
|
53
|
+
coords.x = 0;
|
54
|
+
coords.y = 0;
|
55
|
+
}
|
56
|
+
|
57
|
+
$('#preview').css({
|
58
|
+
width: Math.round(rx * $("#cropImage").width()) + 'px',
|
59
|
+
height: Math.round(ry * $("#cropImage").height()) + 'px',
|
60
|
+
marginLeft: '-' + Math.round(rx * coords.x) + 'px',
|
61
|
+
marginTop: '-' + Math.round(ry * coords.y) + 'px'
|
62
|
+
});
|
63
|
+
var ratio = 1;
|
64
|
+
$("#crop_x").val(Math.round(coords.x * ratio));
|
65
|
+
$("#crop_y").val(Math.round(coords.y * ratio));
|
66
|
+
$("#crop_w").val(Math.round(coords.w * ratio));
|
67
|
+
$("#crop_h").val(Math.round(coords.h * ratio));
|
68
|
+
}
|
69
|
+
|
70
|
+
function showResponse(responseText, statusText, xhr, $form) {
|
71
|
+
jQuery('#cropImage').Jcrop({
|
72
|
+
bgColor: 'clear',
|
73
|
+
bgOpacity: .6,
|
74
|
+
setSelect: [ 0, 0, 200, 200 ],
|
75
|
+
aspectRatio: 1 ,
|
76
|
+
onChange: update_crop,
|
77
|
+
onSelect: update_crop
|
78
|
+
});
|
79
|
+
}
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
$(function () {
|
86
|
+
$('.upload').fileUploadUI({
|
87
|
+
uploadTable: $('.upload_files'),
|
88
|
+
downloadTable: $('.download_files'),
|
89
|
+
buildUploadRow: function (files, index) {
|
90
|
+
var file = files[index];
|
91
|
+
return $('<tr><td>' + file.name + '<\/td>' +
|
92
|
+
'<td class="file_upload_progress"><div><\/div><\/td>' +
|
93
|
+
'<td class="file_upload_cancel">' +
|
94
|
+
'<div class="ui-state-default ui-corner-all ui-state-hover" title="Cancel">' +
|
95
|
+
'<span class="ui-icon ui-icon-cancel">Cancel<\/span>' +
|
96
|
+
'<\/div><\/td><\/tr>');
|
97
|
+
},
|
98
|
+
buildDownloadRow: function (file) {
|
99
|
+
|
100
|
+
},
|
101
|
+
onComplete: function (event, files, index, xhr, handler) {
|
102
|
+
$.ajax({
|
103
|
+
type: "GET",
|
104
|
+
url: "/avatars/new/?drag_name=" + handler.response.name,
|
105
|
+
success: function(data){
|
106
|
+
$("#precrop_drag_response").html(data);
|
107
|
+
jQuery('#cropImage').Jcrop({
|
108
|
+
bgColor: 'clear',
|
109
|
+
bgOpacity: .6,
|
110
|
+
setSelect: [ 0, 0, 200, 200 ],
|
111
|
+
aspectRatio: 1 ,
|
112
|
+
onChange: update_crop,
|
113
|
+
onSelect: update_crop
|
114
|
+
});
|
115
|
+
}
|
116
|
+
});
|
117
|
+
}
|
118
|
+
});
|
119
|
+
});
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
<% end %>
|
128
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% content_for :headers do %>
|
2
|
+
<%= javascript_include_tag 'jquery' %>
|
3
|
+
<%= javascript_include_tag 'jquery.Jcrop.min' %>
|
4
|
+
<%= javascript_include_tag 'jquery-ui.min' %>
|
5
|
+
<%= javascript_include_tag 'rails' %>
|
6
|
+
<%= javascript_include_tag 'avatars' %>
|
7
|
+
<%= javascript_include_tag 'jquery.form' %>
|
8
|
+
<%= javascript_include_tag 'jquery.fileupload' %>
|
9
|
+
<%= javascript_include_tag 'jquery.fileupload-ui' %>
|
10
|
+
|
11
|
+
<%= stylesheet_link_tag "jquery.Jcrop", :media => "screen, projection" %>
|
12
|
+
<%= stylesheet_link_tag "avatars", :media => "screen, projection" %><br/>
|
13
|
+
<%= stylesheet_link_tag "jquery.fileupload-ui", :media => "screen, projection" %><br/>
|
14
|
+
<%end%>
|