poodle-rb 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/poodle/application.js +1 -2
  3. data/app/assets/javascripts/poodle/cropper.js +1525 -0
  4. data/app/assets/javascripts/poodle/utilities.js +23 -7
  5. data/app/assets/stylesheets/poodle/poodle-theme.css +18 -1
  6. data/app/controllers/poodle/admin_controller.rb +0 -26
  7. data/app/controllers/poodle/images_controller.rb +65 -0
  8. data/app/helpers/poodle/image_helper.rb +171 -31
  9. data/app/helpers/poodle/render_helper.rb +31 -0
  10. data/{spec/dummy/app → app}/uploaders/image_uploader.rb +19 -22
  11. data/app/views/layouts/poodle/application/_footer.html.erb +1 -1
  12. data/app/views/layouts/poodle/application.html.erb +7 -3
  13. data/app/views/layouts/poodle/image_upload.html.erb +16 -0
  14. data/app/views/layouts/poodle/public/_footer.html.erb +2 -4
  15. data/app/views/layouts/poodle/public/_header.html.erb +1 -3
  16. data/app/views/layouts/poodle/public/public.html.erb +51 -0
  17. data/app/views/layouts/poodle/public.html.erb +8 -5
  18. data/lib/poodle/action_view/theme_helper.rb +0 -76
  19. data/lib/poodle/engine.rb +2 -0
  20. data/lib/poodle/version.rb +1 -1
  21. data/spec/dummy/app/controllers/profile_pictures_controller.rb +2 -0
  22. data/spec/dummy/app/models/image/base.rb +30 -0
  23. data/spec/dummy/app/models/image/profile_picture.rb +2 -0
  24. data/spec/dummy/app/models/user.rb +1 -1
  25. data/spec/dummy/app/views/profile_pictures/_crop_form.html.erb +44 -0
  26. data/spec/dummy/app/views/profile_pictures/_form.html.erb +41 -0
  27. data/spec/dummy/app/views/profile_pictures/_new.html.erb +9 -0
  28. data/spec/dummy/app/views/profile_pictures/_photos.html.erb +16 -0
  29. data/spec/dummy/app/views/profile_pictures/create.html.erb +10 -0
  30. data/spec/dummy/app/views/profile_pictures/crop.html.erb +5 -0
  31. data/spec/dummy/app/views/profile_pictures/edit.js.erb +7 -0
  32. data/spec/dummy/app/views/profile_pictures/new.js.erb +7 -0
  33. data/spec/dummy/app/views/profile_pictures/update.html.erb +10 -0
  34. data/spec/dummy/app/views/profile_pictures/update.js.erb +2 -0
  35. data/spec/dummy/config/initializers/carrier_wave.rb +2 -0
  36. data/spec/dummy/config/routes.rb +15 -1
  37. data/spec/dummy/db/migrate/20131108102728_create_images.rb +12 -0
  38. data/spec/dummy/db/schema.rb +5 -2
  39. data/spec/dummy/db/test.sqlite3 +0 -0
  40. data/{app/assets/javascripts/poodle/common.js → spec/dummy/log/development.log} +0 -0
  41. data/spec/dummy/log/test.log +11173 -0
  42. data/spec/dummy/spec/controllers/profile_pictures_controller_spec.rb +50 -0
  43. data/spec/dummy/spec/helpers/image_helper_spec.rb +129 -0
  44. data/spec/dummy/spec/helpers/theme_helper_spec.rb +14 -43
  45. data/spec/dummy/spec/support/factories/profile_pictures.rb +2 -2
  46. data/spec/dummy/spec/support/factories/users.rb +1 -1
  47. data/spec/dummy/{public/uploads/profile_picture/image → uploads/image/profile_picture}/1/large_test.jpg +0 -0
  48. data/spec/dummy/uploads/image/profile_picture/1/medium_test.jpg +0 -0
  49. data/spec/dummy/{public/uploads/profile_picture/image → uploads/image/profile_picture}/1/test.jpg +0 -0
  50. data/spec/dummy/{public/uploads/profile_picture/image → uploads/image/profile_picture}/1/thumb_test.jpg +0 -0
  51. data/spec/dummy/uploads/image/profile_picture/2/large_test.jpg +0 -0
  52. data/spec/dummy/uploads/image/profile_picture/2/medium_test.jpg +0 -0
  53. data/spec/dummy/uploads/image/profile_picture/2/test.jpg +0 -0
  54. data/spec/dummy/uploads/image/profile_picture/2/thumb_test.jpg +0 -0
  55. metadata +60 -18
  56. data/app/assets/javascripts/poodle/photo_upload.js +0 -104
  57. data/spec/dummy/app/models/profile_picture.rb +0 -8
  58. data/spec/dummy/db/migrate/20131108102728_create_profile_pictures.rb +0 -9
  59. data/spec/dummy/public/uploads/profile_picture/image/1/medium_test.jpg +0 -0
@@ -282,82 +282,6 @@ module Poodle
282
282
  content_tag(:div, text, class: classes)
283
283
  end
284
284
 
285
- # Example
286
- # theme_image(@project, admin_project_path(@project), :url, "logo.image.url", change_picture_url: change_picture_url)
287
- # is equivalent to:
288
- # ---------------------------
289
- # <% img_tag = display_image(@project, "logo.image.url", width: "100%", place_holder: {width: 300, height: 180, text: "<No Image>"}) %>
290
- # <%= link_to img_tag, change_picture_url, :remote => true %>
291
- # <%= link_to raw("<i class=\"fa fa-photo mr-5\"></i> Change Picture"), change_picture_url, :class=>"btn btn-default btn-xs mt-10", :remote=>true %>
292
- def theme_image(object, url, assoc_name, assoc_url, **options)
293
- options.reverse_merge!(
294
- width: "100%",
295
- ph: {
296
- width: 300,
297
- height: 180,
298
- text: "<No Image>"
299
- },
300
- remote: true,
301
- text: "Change Image",
302
- icon: "photo",
303
- classes: "btn btn-default btn-xs mt-10",
304
- change_picture_url: nil
305
- )
306
- img_tag = display_image(object, assoc_url, width: options[:width], place_holder: options[:ph])
307
- btn_display = raw(theme_fa_icon(options[:icon])+theme_button_text(options[:text]))
308
- link_to(img_tag, options[:change_picture_url], :remote => options[:remote]) +
309
- link_to(btn_display, options[:change_picture_url], :class=>options[:classes], :remote=>options[:remote])
310
- end
311
-
312
- # Example
313
- # place_holder(width: 60, height: 40, text: "Not Found")
314
- # is equivalent to:
315
- # "http://placehold.it/60x40&text=Not Found"
316
- def palceholdit(**options)
317
- options.reverse_merge!( width: 60, height: 60, text: "<No Image>" )
318
- "http://placehold.it/#{options[:width]}x#{options[:height]}&text=#{options[:text]}"
319
- end
320
-
321
- # Example
322
- # theme_user_image(@user)
323
- # is equivalent to:
324
- def theme_user_image(user, method_name, **options)
325
-
326
- url_domain = defined?(QAuthRubyClient) ? QAuthRubyClient.configuration.q_auth_url : "http://localhost:9001"
327
-
328
- options.reverse_merge!(
329
- width: 60,
330
- height: options[:width],
331
- url_domain: url_domain,
332
- place_holder: { width: options[:width], height: options[:height], text: "<No Image>" },
333
- html_options: { class: "", style: "width:100%;height:auto;cursor:pointer;" }
334
- )
335
-
336
- options[:place_holder].reverse_merge!(
337
- width: options[:width],
338
- height: options[:height],
339
- text: "<No Image>"
340
- )
341
-
342
- options[:html_options].reverse_merge!(
343
- "data-toggle" => "popover",
344
- "data-placement" => "bottom",
345
- "title" => user.name,
346
- "data-content" => options[:popover] === true ? "" : options[:popover].to_s
347
- ) if options[:popover]
348
-
349
- begin
350
- url = options[:url_domain] + user.send(:eval, method_name)
351
- rescue
352
- url = palceholdit()
353
- end
354
-
355
- content_tag(:div) do
356
- content_tag(:div, class: "rounded", style: "width:#{options[:width]}px;height:#{options[:width]}px;") do
357
- image_tag(url, options[:html_options])
358
- end
359
- end
360
- end
361
285
  end
362
286
  end
363
287
  end
data/lib/poodle/engine.rb CHANGED
@@ -27,6 +27,7 @@ module Poodle
27
27
  include Poodle::ParamsParserHelper
28
28
  include Poodle::TitleHelper
29
29
  include Poodle::UrlHelper
30
+ include Poodle::RenderHelper
30
31
  helper Poodle::DisplayHelper
31
32
  helper Poodle::FlashHelper
32
33
  helper Poodle::ImageHelper
@@ -35,6 +36,7 @@ module Poodle
35
36
  helper Poodle::ParamsParserHelper
36
37
  helper Poodle::TitleHelper
37
38
  helper Poodle::UrlHelper
39
+ helper Poodle::RenderHelper
38
40
  end
39
41
 
40
42
  end
@@ -1,3 +1,3 @@
1
1
  module Poodle
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -0,0 +1,2 @@
1
+ class ProfilePicturesController < Poodle::ImagesController
2
+ end
@@ -0,0 +1,30 @@
1
+ class Image::Base < ActiveRecord::Base
2
+
3
+ self.table_name = "images"
4
+ mount_uploader :image, ImageUploader
5
+ attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
6
+
7
+ # Associations
8
+ belongs_to :imageable, :polymorphic => true
9
+
10
+ # Callbacks
11
+ after_save :crop_image
12
+
13
+ def crop_image
14
+ image.recreate_versions! if crop_x.present?
15
+ end
16
+
17
+ #one convenient method to pass jq_upload the necessary information
18
+ def to_jq_upload
19
+ {
20
+ "name" => read_attribute(:image),
21
+ "size" => image.size,
22
+ "full_url" => image.url,
23
+ "thumbnail_url" => image.thumb.url,
24
+ "large_url" => image.large.url,
25
+ "url" => "/admin/images/#{id}",
26
+ "delete_type" => "DELETE"
27
+ }
28
+ end
29
+
30
+ end
@@ -0,0 +1,2 @@
1
+ class Image::ProfilePicture < Image::Base
2
+ end
@@ -1,5 +1,5 @@
1
1
  class User < ActiveRecord::Base
2
2
 
3
- has_one :profile_picture, :dependent => :destroy
3
+ has_one :profile_picture, :as => :imageable, :dependent => :destroy, :class_name => "Image::ProfilePicture"
4
4
 
5
5
  end
@@ -0,0 +1,44 @@
1
+ <%= form_for(@image, :as => :image,
2
+ :url => main_app.crop_admin_image_path(@image),
3
+ :method => :put,
4
+ :html => {:id=>"form_crop_photo", :class=>"mb-0 form-horizontal", :multipart => true, :target => "iframe_crop_photo"}) do |f| %>
5
+
6
+ <div class="modal-body">
7
+
8
+ <%= @image.errors[:base].to_sentence %>
9
+
10
+ <%= hidden_field_tag :imageable_id, params[:imageable_id] %>
11
+ <%= hidden_field_tag :imageable_type, params[:imageable_type] %>
12
+ <%= hidden_field_tag :redirect_url, params[:redirect_url] %>
13
+ <%= hidden_field_tag :image_type, params[:image_type] %>
14
+
15
+ <% %w[x y w h].each do |i| %>
16
+ <%= f.hidden_field "crop_#{i}", class: "crop_#{i}" %>
17
+ <% end %>
18
+
19
+ <div class="add-photos-path">
20
+ <div class="row">
21
+ <%= image_tag @image.image.present? ?
22
+ (@image.image_url) :
23
+ ('http://placehold.it/220x220'), :alt => '', :id => "new_photos", :class=>"img-thumbnail" %>
24
+ </div>
25
+ </div>
26
+
27
+ </div>
28
+
29
+ <div class="modal-footer">
30
+ <div class="pull-right">
31
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
32
+ <%= submit_tag "Crop Image", "data-reset-text"=>"Crop Image", "data-loading-text"=>"Cropping ...", :class=>"btn btn-primary ml-10" %>
33
+ </div>
34
+
35
+ </div>
36
+
37
+ <div class="cl-10"></div>
38
+
39
+ <% end %>
40
+
41
+ <!-- when the form is submitted, the server response will appear in this iframe -->
42
+ <iframe id="iframe_crop_photo" name="iframe_crop_photo" width="100%" style="display:none;">
43
+ </iframe>
44
+
@@ -0,0 +1,41 @@
1
+ <%= form_for(@image, :as => :image,
2
+ :url => (@image.new_record? ? main_app.admin_images_path : main_app.admin_image_path),
3
+ :method => (@image.new_record? ? :post : :put),
4
+ :html => {:id=>"form_photo", :class=>"mb-0 form-horizontal", :multipart => true, :target => "iframe_photo"}) do |f| %>
5
+
6
+ <div class="modal-body">
7
+
8
+ <%= @image.errors[:base].to_sentence %>
9
+
10
+ <%= hidden_field_tag :faction, @image.new_record? ? main_app.admin_images_path : main_app.admin_image_path(@image) %>
11
+ <%= hidden_field_tag :fmethod, @image.new_record? ? "POST" : "PUT" %>
12
+
13
+ <%= hidden_field_tag :imageable_id, params[:imageable_id] %>
14
+ <%= hidden_field_tag :imageable_type, params[:imageable_type] %>
15
+ <%= hidden_field_tag :redirect_url, params[:redirect_url] %>
16
+ <%= hidden_field_tag :image_type, params[:image_type] %>
17
+
18
+ <div class="add-photos-path">
19
+
20
+ <div class="row">
21
+ <div class="col-md-12">
22
+ <%= theme_form_field(@image, :image, html_options: {type: 'file'}, label: "Upload a new Image", param_name: "image") %>
23
+ </div>
24
+ </div>
25
+
26
+ </div>
27
+
28
+ </div>
29
+
30
+ <div class="modal-footer">
31
+ <div class="pull-right">
32
+ <% button_text = "#{@image.new_record? ? "Create" : "Update"} Photo" %>
33
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
34
+ <%= submit_tag button_text, "data-reset-text"=>button_text, "data-loading-text"=>"Saving ...", :class=>"btn btn-primary ml-10" %>
35
+ </div>
36
+
37
+ </div>
38
+
39
+ <div class="cl-10"></div>
40
+
41
+ <% end %>
@@ -0,0 +1,9 @@
1
+
2
+ <%# Used to create a new photo form %>
3
+ <div class="box p-10">
4
+ <div class="p-10 text-color-blue fs-18 mb-20">
5
+ Add a Picture
6
+ </div>
7
+ <%= render 'form' %>
8
+ </div>
9
+
@@ -0,0 +1,16 @@
1
+ <% if photo_album.photos.any? %>
2
+
3
+ <div id="links">
4
+ <% photo_album.photos.each do |photo| %>
5
+ <a class="" href="<%= photo.image_url %>"
6
+ title="<%= photo_album.name%>" data-gallery="">
7
+ <%= display_photo(photo, 200) %>
8
+ </a>
9
+ <% end %>
10
+ </div>
11
+
12
+ <% else %>
13
+ <p>Photos are not available yet. Please upload photos</p>
14
+ <% end %>
15
+
16
+
@@ -0,0 +1,10 @@
1
+ <%= content_for :javascript_footer do %>
2
+ <script type="text/javascript">
3
+
4
+ var heading = "Crop Image";
5
+ var bodyContent = "<%= escape_javascript(render(:partial=>"crop_form")) %>";
6
+ this.parent.showModal(heading, bodyContent);
7
+ this.parent.cropImage("form_crop_photo");
8
+
9
+ </script>
10
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <%= content_for :javascript_footer do %>
2
+ <script type="text/javascript">
3
+ this.parent.closeModal();
4
+ </script>
5
+ <% end %>
@@ -0,0 +1,7 @@
1
+ // Show the new form in the right box.
2
+ heading = "Edit a photo";
3
+ bodyContent = "<%= escape_javascript(render(:partial=>"form")) %>";
4
+ showModal(heading, bodyContent);
5
+
6
+ // When the image upload form is submitted, the server response will appear in this iframe -->
7
+ var $div = $('<iframe id="iframe_photo" name="iframe_photo" width="100%" style="display:none"></iframe>').appendTo('body');
@@ -0,0 +1,7 @@
1
+ // Show the new form in the right box.
2
+ heading = "Add a photo";
3
+ bodyContent = "<%= escape_javascript(render(:partial=>"form")) %>";
4
+ showModal(heading, bodyContent);
5
+
6
+ // When the image upload form is submitted, the server response will appear in this iframe -->
7
+ var $div = $('<iframe id="iframe_photo" name="iframe_photo" width="100%" style="display:none"></iframe>').appendTo('body');
@@ -0,0 +1,10 @@
1
+ <%= content_for :javascript_footer do %>
2
+ <script type="text/javascript">
3
+
4
+ var heading = "Crop Image";
5
+ var bodyContent = "<%= escape_javascript(render(:partial=>"crop_form")) %>";
6
+ this.parent.showModal(heading, bodyContent);
7
+ this.parent.cropImage("form_crop_photo");
8
+
9
+ </script>
10
+ <% end %>
@@ -0,0 +1,2 @@
1
+ // Close Modal
2
+ closeModal();
@@ -0,0 +1,2 @@
1
+ require 'carrierwave'
2
+ CarrierWave.root = ""
@@ -1,4 +1,18 @@
1
1
  Rails.application.routes.draw do
2
-
3
2
  mount Poodle::Engine => "/poodle"
3
+
4
+ resources :images, controller: "profile_pictures" do
5
+ member do
6
+ put :crop
7
+ end
8
+ end
9
+
10
+ namespace :custom do
11
+ resources :images do
12
+ member do
13
+ put :crop
14
+ end
15
+ end
16
+ end
17
+
4
18
  end
@@ -0,0 +1,12 @@
1
+ class CreateImages < ActiveRecord::Migration
2
+ def change
3
+ create_table :images do |t|
4
+ t.string :image
5
+ t.integer :imageable_id
6
+ t.string :imageable_type
7
+ t.timestamps
8
+ end
9
+
10
+ add_index(:images, [ :imageable_id, :imageable_type ])
11
+ end
12
+ end
@@ -13,13 +13,16 @@
13
13
 
14
14
  ActiveRecord::Schema.define(version: 20140402113213) do
15
15
 
16
- create_table "profile_pictures", force: :cascade do |t|
16
+ create_table "images", force: :cascade do |t|
17
17
  t.string "image"
18
- t.integer "user_id"
18
+ t.integer "imageable_id"
19
+ t.string "imageable_type"
19
20
  t.datetime "created_at"
20
21
  t.datetime "updated_at"
21
22
  end
22
23
 
24
+ add_index "images", ["imageable_id", "imageable_type"], name: "index_images_on_imageable_id_and_imageable_type"
25
+
23
26
  create_table "users", force: :cascade do |t|
24
27
  t.string "name", limit: 255
25
28
  t.datetime "created_at"
Binary file