refinerycms-images 1.0.11 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/app/controllers/refinery/admin/images_controller.rb +110 -0
  2. data/app/helpers/refinery/admin/images_helper.rb +24 -0
  3. data/app/models/refinery/image.rb +96 -0
  4. data/app/views/refinery/admin/images/_actions.html.erb +15 -0
  5. data/app/views/{admin → refinery/admin}/images/_existing_image.html.erb +13 -26
  6. data/app/views/{admin → refinery/admin}/images/_form.html.erb +11 -15
  7. data/app/views/{admin → refinery/admin}/images/_grid_view.html.erb +7 -5
  8. data/app/views/refinery/admin/images/_images.html.erb +2 -0
  9. data/app/views/{admin → refinery/admin}/images/_list_view.html.erb +0 -0
  10. data/app/views/{admin → refinery/admin}/images/_list_view_image.html.erb +7 -5
  11. data/app/views/refinery/admin/images/_records.html.erb +18 -0
  12. data/app/views/refinery/admin/images/edit.html.erb +1 -0
  13. data/app/views/refinery/admin/images/index.html.erb +6 -0
  14. data/app/views/{admin → refinery/admin}/images/insert.html.erb +10 -13
  15. data/app/views/refinery/admin/images/new.html.erb +1 -0
  16. data/config/locales/bg.yml +37 -36
  17. data/config/locales/cs.yml +37 -36
  18. data/config/locales/da.yml +37 -36
  19. data/config/locales/de.yml +37 -36
  20. data/config/locales/el.yml +37 -36
  21. data/config/locales/en.yml +37 -36
  22. data/config/locales/es.yml +38 -37
  23. data/config/locales/fi.yml +37 -36
  24. data/config/locales/fr.yml +37 -36
  25. data/config/locales/it.yml +47 -45
  26. data/config/locales/ja.yml +44 -0
  27. data/config/locales/ko.yml +44 -0
  28. data/config/locales/lt.yml +37 -36
  29. data/config/locales/lv.yml +37 -36
  30. data/config/locales/nb.yml +37 -37
  31. data/config/locales/nl.yml +36 -35
  32. data/config/locales/pl.yml +38 -37
  33. data/config/locales/pt-BR.yml +38 -37
  34. data/config/locales/rs.yml +37 -37
  35. data/config/locales/ru.yml +37 -36
  36. data/config/locales/sk.yml +37 -36
  37. data/config/locales/sl.yml +36 -35
  38. data/config/locales/sv.yml +37 -36
  39. data/config/locales/vi.yml +37 -36
  40. data/config/locales/zh-CN.yml +37 -36
  41. data/config/locales/zh-TW.yml +37 -36
  42. data/config/routes.rb +4 -7
  43. data/db/migrate/20100913234707_create_refinerycms_images_schema.rb +10 -18
  44. data/lib/generators/refinery/images/images_generator.rb +10 -0
  45. data/lib/generators/refinery/images/templates/config/initializers/refinery/images.rb.erb +41 -0
  46. data/lib/refinery/images.rb +25 -0
  47. data/lib/refinery/images/configuration.rb +54 -0
  48. data/lib/refinery/images/dragonfly.rb +54 -0
  49. data/lib/refinery/images/engine.rb +38 -0
  50. data/lib/refinery/images/validators.rb +7 -0
  51. data/lib/refinery/images/validators/image_size_validator.rb +19 -0
  52. data/lib/refinerycms-images.rb +1 -76
  53. data/refinerycms-images.gemspec +14 -91
  54. data/spec/factories/image.rb +5 -0
  55. data/{features/uploads → spec/fixtures}/beach.jpeg +0 -0
  56. data/spec/fixtures/fathead.png +0 -0
  57. data/spec/fixtures/image-with-dashes.jpg +0 -0
  58. data/spec/lib/generators/refinery/images/images_generator_spec.rb +29 -0
  59. data/spec/models/refinery/image_spec.rb +158 -0
  60. data/spec/requests/refinery/admin/images_spec.rb +103 -0
  61. metadata +116 -106
  62. data/app/controllers/admin/images_controller.rb +0 -106
  63. data/app/helpers/admin/images_helper.rb +0 -27
  64. data/app/models/image.rb +0 -116
  65. data/app/views/admin/images/_actions.html.erb +0 -16
  66. data/app/views/admin/images/_images.html.erb +0 -2
  67. data/app/views/admin/images/_records.html.erb +0 -18
  68. data/app/views/admin/images/edit.html.erb +0 -1
  69. data/app/views/admin/images/index.html.erb +0 -6
  70. data/app/views/admin/images/new.html.erb +0 -1
  71. data/config/locales/jp.yml +0 -43
  72. data/config/locales/lolcat.yml +0 -43
  73. data/features/manage_images.feature +0 -49
  74. data/features/step_definitions/image_steps.rb +0 -40
  75. data/features/support/factories.rb +0 -7
  76. data/features/support/paths.rb +0 -17
  77. data/features/uploads/id-rather-be-here.jpg +0 -0
  78. data/features/uploads/refinery_is_awesome.txt +0 -1
  79. data/lib/gemspec.rb +0 -38
  80. data/lib/generators/refinerycms_images_generator.rb +0 -8
  81. data/spec/models/image_spec.rb +0 -115
  82. data/spec/uploads/beach.jpeg +0 -0
@@ -0,0 +1,110 @@
1
+ module ::Refinery
2
+ module Admin
3
+ class ImagesController < ::Refinery::AdminController
4
+
5
+ crudify :'refinery/image',
6
+ :order => "created_at DESC",
7
+ :sortable => false,
8
+ :xhr_paging => true
9
+
10
+ before_filter :change_list_mode_if_specified, :init_dialog
11
+
12
+ def new
13
+ @image = ::Refinery::Image.new if @image.nil?
14
+
15
+ @url_override = refinery.admin_images_path(:dialog => from_dialog?)
16
+ end
17
+
18
+ # This renders the image insert dialog
19
+ def insert
20
+ self.new if @image.nil?
21
+
22
+ @url_override = refinery.admin_images_path(request.query_parameters.merge(:insert => true))
23
+
24
+ if params[:conditions].present?
25
+ extra_condition = params[:conditions].split(',')
26
+
27
+ extra_condition[1] = true if extra_condition[1] == "true"
28
+ extra_condition[1] = false if extra_condition[1] == "false"
29
+ extra_condition[1] = nil if extra_condition[1] == "nil"
30
+ end
31
+
32
+ find_all_images(({extra_condition[0].to_sym => extra_condition[1]} if extra_condition.present?))
33
+ search_all_images if searching?
34
+
35
+ paginate_images
36
+
37
+ render :action => "insert"
38
+ end
39
+
40
+ def create
41
+ @images = []
42
+ begin
43
+ unless params[:image].present? and params[:image][:image].is_a?(Array)
44
+ @images << (@image = ::Refinery::Image.create(params[:image]))
45
+ else
46
+ params[:image][:image].each do |image|
47
+ @images << (@image = ::Refinery::Image.create(:image => image))
48
+ end
49
+ end
50
+ rescue Dragonfly::FunctionManager::UnableToHandle
51
+ logger.warn($!.message)
52
+ @image = ::Refinery::Image.new
53
+ end
54
+
55
+ unless params[:insert]
56
+ if @images.all?(&:valid?)
57
+ flash.notice = t('created', :scope => 'refinery.crudify', :what => "'#{@images.map(&:title).join("', '")}'")
58
+ if from_dialog?
59
+ @dialog_successful = true
60
+ render :nothing => true, :layout => true
61
+ else
62
+ redirect_to refinery.admin_images_path
63
+ end
64
+ else
65
+ self.new # important for dialogs
66
+ render :action => 'new'
67
+ end
68
+ else
69
+ # if all uploaded images are ok redirect page back to dialog, else show current page with error
70
+ if @images.all?(&:valid?)
71
+ @image_id = @image.id if @image.persisted?
72
+ @image = nil
73
+
74
+ self.insert
75
+ end
76
+ end
77
+ end
78
+
79
+ protected
80
+
81
+ def init_dialog
82
+ @app_dialog = params[:app_dialog].present?
83
+ @field = params[:field]
84
+ @update_image = params[:update_image]
85
+ @thumbnail = params[:thumbnail]
86
+ @callback = params[:callback]
87
+ @conditions = params[:conditions]
88
+ end
89
+
90
+ def change_list_mode_if_specified
91
+ if action_name == 'index' && params[:view].present? && Refinery::Images.image_views.include?(params[:view].to_sym)
92
+ Refinery::Images.preferred_image_view = params[:view]
93
+ end
94
+ end
95
+
96
+ def paginate_images
97
+ @images = @images.paginate(:page => params[:page], :per_page => Image.per_page(from_dialog?, !@app_dialog))
98
+ end
99
+
100
+ def restrict_controller
101
+ super unless action_name == 'insert'
102
+ end
103
+
104
+ def store_current_location!
105
+ super unless action_name == 'insert' or from_dialog?
106
+ end
107
+
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,24 @@
1
+ module Refinery
2
+ module Admin
3
+ module ImagesHelper
4
+ def other_image_views
5
+ Refinery::Images.image_views.reject { |image_view|
6
+ image_view.to_s == Refinery::Images.preferred_image_view.to_s
7
+ }
8
+ end
9
+
10
+ def thumbnail_urls(image)
11
+ thumbnail_urls = {
12
+ :"data-original" => asset_paths.compute_public_path(image.url, ''),
13
+ :"data-grid" => asset_paths.compute_public_path(image.thumbnail('135x135#c').url, '')
14
+ }
15
+
16
+ Refinery::Images.user_image_sizes.sort_by{|key,geometry| geometry}.each do |size, pixels|
17
+ thumbnail_urls[:"data-#{size.to_s.parameterize}"] = asset_paths.compute_public_path(image.thumbnail(pixels).url, '')
18
+ end
19
+
20
+ thumbnail_urls
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,96 @@
1
+ module Refinery
2
+ class Image < Refinery::Core::BaseModel
3
+ include Images::Validators
4
+
5
+ image_accessor :image
6
+
7
+ validates :image, :presence => true
8
+ validates_with ImageSizeValidator
9
+ validates_property :mime_type, :of => :image, :in => %w(image/jpeg image/png image/gif image/tiff),
10
+ :message => :incorrect_format
11
+
12
+ # Docs for acts_as_indexed http://github.com/dougal/acts_as_indexed
13
+ acts_as_indexed :fields => [:title]
14
+
15
+ # allows Mass-Assignment
16
+ attr_accessible :id, :image, :image_size
17
+
18
+ delegate :size, :mime_type, :url, :width, :height, :to => :image
19
+
20
+ class << self
21
+ # How many images per page should be displayed?
22
+ def per_page(dialog = false, has_size_options = false)
23
+ if dialog
24
+ unless has_size_options
25
+ Images.pages_per_dialog
26
+ else
27
+ Images.pages_per_dialog_that_have_size_options
28
+ end
29
+ else
30
+ Images.pages_per_admin_index
31
+ end
32
+ end
33
+ end
34
+
35
+ # Get a thumbnail job object given a geometry.
36
+ def thumbnail(geometry = nil)
37
+ if geometry.is_a?(Symbol) and Refinery::Images.user_image_sizes.keys.include?(geometry)
38
+ geometry = Refinery::Images.user_image_sizes[geometry]
39
+ end
40
+
41
+ if geometry.present? && !geometry.is_a?(Symbol)
42
+ image.thumb(geometry)
43
+ else
44
+ image
45
+ end
46
+ end
47
+
48
+ # Intelligently works out dimensions for a thumbnail of this image based on the Dragonfly geometry string.
49
+ def thumbnail_dimensions(geometry)
50
+ geometry = geometry.to_s
51
+ width = original_width = self.image_width.to_f
52
+ height = original_height = self.image_height.to_f
53
+ geometry_width, geometry_height = geometry.to_s.split(%r{\#{1,2}|\+|>|!|x}im)[0..1].map(&:to_f)
54
+ if (original_width * original_height > 0) && geometry =~ ::Dragonfly::ImageMagick::Processor::THUMB_GEOMETRY
55
+ if geometry =~ ::Dragonfly::ImageMagick::Processor::RESIZE_GEOMETRY
56
+ if geometry !~ %r{\d+x\d+>} || (geometry =~ %r{\d+x\d+>} && (width > geometry_width.to_f || height > geometry_height.to_f))
57
+ # Try scaling with width factor first. (wf = width factor)
58
+ wf_width = (original_width * (geometry_width / width)).ceil
59
+ wf_height = (original_height * (geometry_width / width)).ceil
60
+
61
+ # Scale with height factor (hf = height factor)
62
+ hf_width = (original_width * (geometry_height / height)).ceil
63
+ hf_height = (original_height * (geometry_height / height)).ceil
64
+
65
+ # Take the highest value that doesn't exceed either axis limit.
66
+ use_wf = wf_width <= geometry_width && wf_height <= geometry_height
67
+ if use_wf && hf_width <= geometry_width && hf_height <= geometry_height
68
+ use_wf = wf_width * wf_height > hf_width * hf_height
69
+ end
70
+
71
+ if use_wf
72
+ width = wf_width
73
+ height = wf_height
74
+ else
75
+ width = hf_width
76
+ height = hf_height
77
+ end
78
+ end
79
+ else
80
+ # cropping
81
+ width = geometry_width
82
+ height = geometry_height
83
+ end
84
+ end
85
+
86
+ { :width => width.to_i, :height => height.to_i }
87
+ end
88
+
89
+ # Returns a titleized version of the filename
90
+ # my_file.jpg returns My File
91
+ def title
92
+ CGI::unescape(image_name.to_s).gsub(/\.\w+$/, '').titleize
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,15 @@
1
+ <ul>
2
+ <li>
3
+ <%= render '/refinery/admin/search', :url => refinery.admin_images_path %>
4
+ </li>
5
+ <li>
6
+ <%= link_to t('.create_new_image'), refinery.new_admin_image_path(:dialog => true), :class => "add_icon" %>
7
+ </li>
8
+ <% other_image_views.each do |image_view| %>
9
+ <li>
10
+ <%= link_to t('switch_to', :scope => 'refinery.admin.images.index.view', :view_name => t("#{image_view}", :scope => 'refinery.admin.images.index.view')),
11
+ refinery.admin_images_path(:view => image_view, :page => params[:page]),
12
+ :class => "reorder_icon" %>
13
+ </li>
14
+ <% end %>
15
+ </ul>
@@ -1,36 +1,26 @@
1
1
  <div id='existing_image_area' class='dialog_area' <%= "style='display:none;'" if @image.errors.any? %>>
2
- <%= render :partial => '/shared/admin/search',
3
- :locals => {:url => insert_admin_images_path(params.dup.delete(:image))} %>
2
+ <%= render '/refinery/admin/search', :url => refinery.insert_admin_images_path(params.dup.except('image')) %>
4
3
  <input type='hidden' name='selected_image' id='selected_image' />
5
4
  <div id='existing_image_area_content' class='clearfix'>
6
5
  <% if @images.any? %>
7
6
  <ul>
8
- <%
9
- @images.each do |image|
10
- thumbnail_urls = {
11
- :"data-original" => compute_public_path(image.url, ''),
12
- :"data-grid" => compute_public_path(image.thumbnail('135x135#c').url, '')
13
- }
14
- ::Image.user_image_sizes.sort_by{|key,geometry| geometry}.each do |size, pixels|
15
- thumbnail_urls[:"data-#{size.to_s.parameterize}"] = compute_public_path(image.thumbnail(pixels).url, '')
16
- end
17
- -%>
7
+ <% @images.each do |image| -%>
18
8
  <li<%= " class='selected'" if @image_id == image.id %>>
19
9
  <%= image_fu(image, '106x106#c', {
20
10
  :alt => image.title,
21
11
  :title => image.title,
22
12
  :id => "image_#{image.id}",
23
13
  :'data-id' => image.id
24
- }.merge(thumbnail_urls)) -%>
14
+ }.merge(thumbnail_urls(image))) -%>
25
15
  </li>
26
16
  <% end -%>
27
17
  </ul>
28
18
  <% elsif searching? %>
29
- <%= t('no_results', :scope => 'shared.admin.search') %>
19
+ <%= t('no_results', :scope => 'refinery.admin.search') %>
30
20
  <% end %>
31
21
  </div>
32
22
 
33
- <%= images_paginator @images, from_dialog? %>
23
+ <%= will_paginate @images, :params => params.dup %>
34
24
 
35
25
  <% unless @app_dialog or @images.empty? %>
36
26
  <div id='existing_image_size_area' class='clearfix'>
@@ -43,7 +33,7 @@
43
33
  </p>
44
34
  <ul>
45
35
  <%
46
- ::Image.user_image_sizes.sort_by { |key, geometry| geometry }.each_with_index do |(size, pixels), index|
36
+ Refinery::Images.user_image_sizes.sort_by { |key, geometry| geometry }.each_with_index do |(size, pixels), index|
47
37
  safe_pixels = pixels.to_s.gsub(/[<>=]/, '')
48
38
  # (parndt): ' selected' if size.to_s == 'medium' is not very generic, but I
49
39
  # can't think of a decent way of making it so for even sets (e.g. 2,4,6,8,etc image sizes).
@@ -60,14 +50,11 @@
60
50
  </div>
61
51
  <% end %>
62
52
 
63
- <%= render :partial => "/shared/admin/form_actions",
64
- :locals => {
65
- :f => nil,
66
- :cancel_url => '',
67
- :submit_button_text => t('.button_text'),
68
- :hide_submit => @images.empty?,
69
- :hide_cancel => false,
70
- :hide_delete => true,
71
- :cancel_title => nil
72
- } if @app_dialog or @images.any? or searching? %>
53
+ <%= render '/refinery/admin/form_actions', :f => nil,
54
+ :cancel_url => '',
55
+ :submit_button_text => t('.button_text'),
56
+ :hide_submit => @images.empty?,
57
+ :hide_cancel => false,
58
+ :hide_delete => true,
59
+ :cancel_title => nil if @app_dialog or @images.any? or searching? %>
73
60
  </div>
@@ -1,10 +1,9 @@
1
- <%= form_for [:admin, @image], :url => @url_override || @url, :html => {:multipart => true} do |f| %>
1
+ <%= form_for @image, :url => (@url_override or @image.persisted? ? refinery.admin_image_path(@image) : refinery.admin_images_path),
2
+ :html => { :multipart => true } do |f| %>
2
3
 
3
- <%= render :partial => "/shared/admin/error_messages",
4
- :locals => {
5
- :object => @image,
6
- :include_object_name => false
7
- } %>
4
+ <%= render '/refinery/admin/error_messages',
5
+ :object => @image,
6
+ :include_object_name => false %>
8
7
 
9
8
  <div class='field'>
10
9
  <% if action_name =~ /(edit)|(update)/ %>
@@ -22,19 +21,16 @@
22
21
  </div>
23
22
 
24
23
  <div class='field'>
25
- <label><%= t('.maximum_image_size', :megabytes => Image::MAX_SIZE_IN_MB) %></label>
24
+ <label><%= t('.maximum_image_size', :bytes => number_to_human_size(Refinery::Images.max_image_size)) %></label>
26
25
  </div>
27
26
 
28
27
  <input type='hidden' name='wymeditor' value='<%= params[:wymeditor] %>'>
29
28
 
30
- <%= render :partial => "/shared/admin/form_actions",
31
- :locals => {
32
- :f => f,
33
- :continue_editing => false,
34
- :hide_cancel => (@app_dialog or action_name == "insert" or from_dialog?),
35
- :delete_title => t('delete', :scope => 'admin.images'),
36
- :delete_confirmation => t('message', :scope => 'shared.admin.delete', :title => @image.image_name)
37
- } -%>
29
+ <%= render '/refinery/admin/form_actions', :f => f,
30
+ :continue_editing => false,
31
+ :hide_cancel => (@app_dialog or action_name == "insert" or from_dialog?),
32
+ :delete_title => t('delete', :scope => 'refinery.admin.images'),
33
+ :delete_confirmation => t('message', :scope => 'refinery.admin.delete', :title => @image.image_name) -%>
38
34
 
39
35
  <% if @app_dialog %>
40
36
  <input type='hidden' name='app_dialog' value='<%= @app_dialog %>' />
@@ -6,12 +6,14 @@
6
6
  <%= link_to refinery_icon_tag('eye.png'), image.url,
7
7
  :target => "_blank",
8
8
  :title => t('.view_live_html') %>
9
- <%= link_to refinery_icon_tag('application_edit.png'), edit_admin_image_path(image),
10
- :title => t('edit', :scope => 'admin.images') %>
11
- <%= link_to refinery_icon_tag('delete.png'), admin_image_path(image),
9
+ <%= link_to refinery_icon_tag('application_edit.png'),
10
+ refinery.edit_admin_image_path(image),
11
+ :title => t('edit', :scope => 'refinery.admin.images') %>
12
+ <%= link_to refinery_icon_tag('delete.png'),
13
+ refinery.admin_image_path(image),
12
14
  :class => "cancel confirm-delete",
13
- :title => t('delete', :scope => 'admin.images'),
14
- :confirm => t('message', :scope => 'shared.admin.delete', :title => image.title),
15
+ :title => t('delete', :scope => 'refinery.admin.images'),
16
+ :confirm => t('message', :scope => 'refinery.admin.delete', :title => image.title),
15
17
  :method => :delete %>
16
18
  </span>
17
19
  </li>
@@ -0,0 +1,2 @@
1
+ <%= will_paginate @images if Refinery::Admin::ImagesController.pageable? %>
2
+ <%= render "#{Refinery::Images.preferred_image_view}_view" %>
@@ -6,12 +6,14 @@
6
6
  <%= link_to refinery_icon_tag('eye.png'), list_view_image.url,
7
7
  :target => "_blank",
8
8
  :title => "#{image_fu list_view_image, '96x96#c', :size => '96x96'}" %>
9
- <%= link_to refinery_icon_tag('application_edit.png'), edit_admin_image_path(list_view_image),
10
- :title => t('edit', :scope => 'admin.images') %>
11
- <%= link_to refinery_icon_tag('delete.png'), admin_image_path(list_view_image),
9
+ <%= link_to refinery_icon_tag('application_edit.png'),
10
+ refinery.edit_admin_image_path(list_view_image),
11
+ :title => t('edit', :scope => 'refinery.admin.images') %>
12
+ <%= link_to refinery_icon_tag('delete.png'),
13
+ refinery.admin_image_path(list_view_image),
12
14
  :class => "cancel confirm-delete",
13
- :title => t('delete', :scope => 'admin.images'),
14
- :confirm => t('message', :scope => 'shared.admin.delete', :title => list_view_image.title),
15
+ :title => t('delete', :scope => 'refinery.admin.images'),
16
+ :confirm => t('message', :scope => 'refinery.admin.delete', :title => list_view_image.title),
15
17
  :method => :delete %>
16
18
  </span>
17
19
  </li>
@@ -0,0 +1,18 @@
1
+ <% if searching? %>
2
+ <h2><%= t('results_for', :scope => 'refinery.admin.search', :query => params[:search]) %></h2>
3
+ <% end %>
4
+ <div class='pagination_container'>
5
+ <% if @images.any? %>
6
+ <%= render 'images' %>
7
+ <% else %>
8
+ <p>
9
+ <% unless searching? %>
10
+ <strong>
11
+ <%= t('.no_images_yet') %>
12
+ </strong>
13
+ <% else %>
14
+ <%= t('no_results', :scope => 'refinery.admin.search') %>
15
+ <% end %>
16
+ </p>
17
+ <% end %>
18
+ </div>
@@ -0,0 +1 @@
1
+ <%= render 'form' %>
@@ -0,0 +1,6 @@
1
+ <section id='records'>
2
+ <%= render 'records' %>
3
+ </section>
4
+ <section id='actions'>
5
+ <%= render 'actions' %>
6
+ </section>
@@ -16,25 +16,22 @@
16
16
 
17
17
  <div id='dialog_main'>
18
18
  <% if any_images or user_can_modify_images %>
19
- <%= render :partial => "existing_image" if any_images or searching? %>
19
+ <%= render 'existing_image' if any_images or searching? %>
20
20
 
21
21
  <% if user_can_modify_images %>
22
22
  <div id='upload_image_area' class='dialog_area'<%= " style='display:none;'" if any_images and (no_errors or searching?) %>>
23
- <%= render :partial => "form", :locals => {:insert => true} %>
23
+ <%= render 'form', :insert => true %>
24
24
  </div>
25
25
  <% end %>
26
26
  <% else %>
27
- <% flash.now[:error] = t('no_images_yet', :scope => 'admin.images.records').split('.').first.html_safe + "." %>
28
- <%= render :partial => "/shared/admin/form_actions",
29
- :locals => {
30
- :f => nil,
31
- :cancel_url => '',
32
- :hide_cancel => false,
33
- :hide_delete => true,
34
- :hide_submit => true,
35
- :cancel_button_text => t('close', :scope => 'shared.admin.form_actions'),
36
- :cancel_title => nil
37
- } %>
27
+ <% flash.now[:error] = t('no_images_yet', :scope => 'refinery.admin.images.records').split('.').first.html_safe + "." %>
28
+ <%= render '/refinery/admin/form_actions', :f => nil,
29
+ :cancel_url => '',
30
+ :hide_cancel => false,
31
+ :hide_delete => true,
32
+ :hide_submit => true,
33
+ :cancel_button_text => t('close', :scope => 'refinery.admin.form_actions'),
34
+ :cancel_title => nil %>
38
35
  <% end %>
39
36
  </div>
40
37