papermill 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,27 +1,49 @@
1
1
  = Papermill
2
2
 
3
- Asset management made easy.
3
+ Asset management made easy, 10 minutes integration.
4
+ All-you-can-eat glue around Polymorphic Paperclip table, SWFUpload & JQuery.
5
+ Associate any image or list of images with any model and any key.
4
6
 
5
- == Install the gems
7
+ === Out-of-the-box OPTIONAL compatibility with :
8
+
9
+ Formtastic # use :as => :[image|asset](s)_upload
10
+ JGrowl # instead of alert for notifications
11
+ FaceBox/Shadowbox # instead of a pop_up for edit form
12
+ Stringex # (or any String#to_url) for asset filename/url generation
13
+
14
+ === Navigator minimal requirements:
15
+
16
+ IE6+, Flash 9+, Javascript ON. Check your audience.
17
+
18
+ === Server requirements:
19
+
20
+ makes internal use of JQuery (but loaded in compatibility mode by default, compatible with Prototype/whatever... JRails not needed.)
21
+ Rails 2.3 (rail's I18n, engine)
22
+ Paperclip 2.3 branch (installed by default as a gem dependency, will be loaded internally if needed)
23
+ Windows environnement :
24
+ # Mime/Types library. Ex:
25
+ config.gem "mime-types", :lib => "mime/types"
26
+
27
+ Front web server serving static assets if present, and forwarding demand to rails if not. (Usually a no-brainer on any classic installation. Works with Webrick)
28
+
29
+ == Install the gem
6
30
 
7
- $ gem source -a http://gemcutter.org
8
31
  $ sudo gem install papermill
9
32
 
10
33
  == Try the demo
11
34
 
12
- $ sudo gem install sqlite3-ruby
13
- $ rails -m http://github.com/bbenezech/papermill/raw/master/installation-template.txt papermill-example
35
+ $ rails -m http://github.com/bbenezech/papermill/raw/master/demo.txt papermill-example
14
36
 
15
37
  == Features
16
38
 
17
39
  Loads of them
18
40
 
19
- === Ajax uploading form helpers through SWFUpload:
41
+ === Ajax uploading form helpers through SWFUpload => [image|asset](s)_upload
20
42
 
21
- * image_upload => unique image upload field, with preview
22
- * images_upload => sortable image gallery upload field
23
- * asset_upload => simple one asset field
24
- * assets_upload => sortable asset list field
43
+ * image_upload => one image, with thumbnail preview
44
+ * images_upload => sortable image thumbnail gallery
45
+ * asset_upload => one asset
46
+ * assets_upload => sortable asset list
25
47
 
26
48
  === Choose thumbnail size for images previews :
27
49
 
@@ -39,12 +61,12 @@ Loads of them
39
61
  * thumbnails are generated the first time they are asked-for, and only in the requested size.
40
62
  * no need to register thumbnail size anywhere: my_asset.url("100x100>")
41
63
 
42
- === Alias handling, declaration application-wide
64
+ === Alias handling, declaration application-wide (in config/initializers/papermill.rb, after you do a ./script/generate papermill_initializer)
43
65
 
44
66
  * :big_alias => {:geometry => "1000x>"}
45
67
  * :other_alias => "100x>"
46
68
  * :third_alias => {:geometry => '100:122', :my_other_keys => 'blblabla'} # if you have a customed Paperclip::Thumbnail processor, you can pass any values you need.
47
- * and use them when you need them : my_asset.url(:big_alias)
69
+ * Use them when you need them : my_asset.url(:big_alias)
48
70
 
49
71
  == Papermill comes in 2 flavors:
50
72
 
@@ -106,7 +128,7 @@ FormTagHelpers
106
128
  # For resources not linked to any assetable model :
107
129
  image_upload_tag #{current_organization.name}_logo
108
130
 
109
- === Resources access
131
+ === Resource access
110
132
 
111
133
  With generic papermill association, Papermill generates an #assets(:key, *args) named_scope
112
134
  @article.assets(:illustrations)
@@ -123,7 +145,7 @@ With declarative papermill associations, Papermill generates an #<association_ke
123
145
  # etc.
124
146
 
125
147
  Or for non-assetable resources :
126
- PapermillAsset.all(:conditions => { :assetable_key => "#{current_organization.name}_logo" }).first
148
+ PapermillAsset.key("#{current_organization.name}_logo").first
127
149
  ColorAsset.all.red
128
150
 
129
151
  === Using PapermillAsset
@@ -131,7 +153,7 @@ Or for non-assetable resources :
131
153
  @asset = @entry.mug_shot.first
132
154
  image_tag @asset.url # original
133
155
  image_tag @asset.url("100x>")
134
- image_tag @asset.url(:big) # assuming you have a :big alias in your environment.rb
156
+ image_tag @asset.url(:big) # assuming you have a :big alias
135
157
  @asset.name
136
158
  @asset.content_type
137
159
  @asset.path # original
@@ -156,8 +178,7 @@ Or for non-assetable resources :
156
178
  Rails::Initializer.run do |config|
157
179
  ...
158
180
  config.gem papermill
159
- # Needed for Windows OS (mime type from file extension):
160
- config.gem "mime-types", :lib => "mime/types"
181
+ config.gem "mime-types", :lib => "mime/types" # required for windows only
161
182
  end
162
183
 
163
184
  === In your layout:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.4
1
+ 1.0.5
@@ -3,32 +3,35 @@ class PapermillController < ApplicationController
3
3
  # Yet SwfUpload doesn't send the right header for request.xhr? to be true and thus fails to disable verify_authenticity_token automatically.
4
4
  skip_before_filter :verify_authenticity_token, :only => [:create]
5
5
 
6
- prepend_before_filter :load_asset, :only => ["show", "destroy", "update", "edit"]
7
- prepend_before_filter :load_assets, :only => ["sort", "mass_delete", "mass_edit"]
6
+ prepend_before_filter :load_asset, :only => [ "show", "destroy", "update", "edit" ]
7
+ prepend_before_filter :load_assets, :only => [ "sort", "mass_delete", "mass_edit" ]
8
8
 
9
9
  def show
10
10
  if @asset.create_thumb_file(params[:style])
11
11
  redirect_to @asset.url(params[:style])
12
12
  else
13
- render :nothing => true, :status => 500
13
+ render :nothing => true, :status => 404
14
14
  end
15
15
  end
16
16
 
17
17
  def destroy
18
18
  render :update do |page|
19
19
  if @asset.destroy
20
- page << "jQuery('#papermill_asset_#{params[:id]}').remove()"
20
+ page << %{ jQuery("#papermill_asset_#{params[:id]}").remove(); }
21
21
  else
22
- page << "jQuery('#papermill_asset_#{params[:id]}').show()"
23
- page << %{ notify("#{ escape_javascript t("papermill.not-deleted", :ressource => @asset.name) }", "error") }
22
+ page << %{ jQuery("#papermill_asset_#{params[:id]}").show(); }
23
+ page << %{ notify("#{ escape_javascript t('papermill.not-deleted', :ressource => @asset.name) }", "error"); }
24
24
  end
25
25
  end
26
26
  end
27
27
 
28
28
  def update
29
29
  render :update do |page|
30
- @asset.update_attributes(params[:papermill_asset])
31
- page << %{ notify("#{ escape_javascript t("papermill.updated", :ressource => @asset.name)}", "notice") }
30
+ if @asset.update_attributes(params[:papermill_asset])
31
+ page << %{ notify("#{ escape_javascript t("papermill.updated", :ressource => @asset.name)}", "notice"); close_popup(self); }
32
+ else
33
+ page << %{ jQuery("#error").html("#{ escape_javascript @asset.errors.full_messages.join('<br>') }"); jQuery("#error").show(); }
34
+ end
32
35
  end
33
36
  end
34
37
 
@@ -38,8 +41,16 @@ class PapermillController < ApplicationController
38
41
 
39
42
  def create
40
43
  @asset = params[:asset_class].constantize.new(params.reject{|k, v| !(PapermillAsset.columns.map(&:name)+["Filedata", "Filename"]).include?(k)})
41
- @asset.save(:unique => !params[:gallery])
42
- render :partial => "papermill/asset", :object => @asset, :locals => {:gallery => params[:gallery], :thumbnail_style => params[:thumbnail_style]}
44
+ if @asset.save
45
+ PapermillAsset.find(:all, :conditions => { :assetable_id => @asset.assetable_id, :assetable_type => @asset.assetable_type, :assetable_key => @asset.assetable_key }).each do |asset|
46
+ asset.destroy unless asset == @asset
47
+ end if !!params[:gallery]
48
+ render :partial => "papermill/asset", :object => @asset, :locals => { :gallery => params[:gallery], :thumbnail_style => params[:thumbnail_style] }
49
+ else
50
+ render :update do |page|
51
+ page << %{ notify("#{ escape_javascript(@asset.errors.join('<br />')) }", "warning"); }
52
+ end
53
+ end
43
54
  end
44
55
 
45
56
  def sort
@@ -52,19 +63,24 @@ class PapermillController < ApplicationController
52
63
  def mass_delete
53
64
  render :update do |page|
54
65
  @assets.each do |asset|
55
- asset.destroy
56
- page << "jQuery('#papermill_asset_#{asset.id}').remove()"
66
+ page << %{ jQuery("#papermill_asset_#{asset.id}").remove(); } if asset.destroy
57
67
  end
58
68
  end
59
69
  end
60
70
 
61
71
  def mass_edit
72
+ ok_messages = []
73
+ ko_messages = []
62
74
  @assets.each do |asset|
63
- asset.update_attribute(params[:attribute], params[:value])
64
- (message ||= []) << t("papermill.updated", :ressource => asset.name)
75
+ if asset.update_attributes({params[:attribute] => params[:value]})
76
+ ok_messages << t("papermill.updated", :ressource => asset.name)
77
+ else
78
+ ko_messages << "#{asset.name} -> #{asset.errors.full_messages.to_sentence}"
79
+ end
65
80
  end
66
81
  render :update do |page|
67
- page << %{ notify('#{ escape_javascript message.join("<br />")}', "notice") } if defined?(message)
82
+ page << %{ notify("#{ escape_javascript ok_messages.join('\n') }", "notice"); } unless ok_messages.empty?
83
+ page << %{ notify("#{ escape_javascript ko_messages.join('\n') }", "error"); } unless ko_messages.empty?
68
84
  end
69
85
  end
70
86
 
@@ -1,7 +1,7 @@
1
1
  <%- dom_id = "papermill_asset_#{asset.id}" -%>
2
2
  <%- delete_link = %{<a onclick="if(confirm('#{escape_javascript t("papermill.delete-confirmation", :resource => asset.name)}')){ jQuery.ajax({async:true, beforeSend:function(request){jQuery('##{dom_id}').hide();}, dataType:'script', error:function(request){jQuery('##{dom_id}').show();}, type:'delete', url:'#{papermill_url(asset)}'})}; return false;" href="#" class="delete"><img title="#{escape_javascript t("papermill.delete", :ressource => asset.name)}" src="/papermill/images/delete.png" alt="delete"/></a>} %>
3
3
 
4
- <div id="<%= dom_id %>" class="asset" title="<%= t("papermill.#{thumbnail_style ? "thumbnail-" : ""}edit-title", :ressource => asset.name) %>" onDblClick="popup(jQuery(this).attr('rel')); return false;" rel="<%= edit_papermill_url(asset) %>">
4
+ <div id="<%= dom_id %>" class="asset" title="<%= t("papermill.#{(thumbnail_style) ? "thumbnail-" : ""}edit-title", :ressource => asset.name) %>" onDblClick="popup(jQuery(this).attr('rel')); return false;" rel="<%= edit_papermill_url(asset) %>">
5
5
  <%= delete_link %>
6
6
  <%- if thumbnail_style -%>
7
7
  <%= render :partial => "papermill/thumbnail_asset", :object => asset, :locals => {:thumbnail_style => thumbnail_style} %>
@@ -1,16 +1,23 @@
1
- <form onsubmit="jQuery.ajax({data:jQuery.param(jQuery(this).serializeArray()), dataType:'script', type:'post', url:'/papermill/<%= @asset.id %>'}); close_popup(self); return false;" method="post" action="/papermill/<%= @asset.id %>">
1
+ <form onsubmit="jQuery.ajax({data:jQuery.param(jQuery(this).serializeArray()), dataType:'script', type:'post', url:'/papermill/<%= @asset.id %>'}); return false;" method="post" class="edit_papermill_asset">
2
2
  <input type="hidden" value="put" name="_method"/>
3
+ <div id="error" style="display:none;"></div>
3
4
  <% fields_for :papermill_asset, @asset do |form| %>
4
- <% PapermillAsset.columns.map{|c| [c.name, c.type] }.reject{ |c| ["slug", "file_file_name", "file_content_type", "file_file_size", "position", "assetable_id", "assetable_type", "assetable_key", "type", "id", "created_at", "updated_at"].include?(c.first) }.each do |c| %>
5
+ <% @asset.assetable_papermill_options[:editable_fields].each do |field| %>
6
+ <% key = field.keys.first %>
5
7
  <p>
6
- <%= form.label c.first, t("papermill.#{c.first}") %><br />
7
- <% if c.last == :text %>
8
- <%= form.text_area c.first %>
8
+ <%= form.label key, field[key][:label] || t("papermill.#{key}") %><br />
9
+ <% case field[key][:type]
10
+ when "text" %>
11
+ <%= form.text_area key %>
12
+ <% when "string" %>
13
+ <%= form.text_field key %>
14
+ <% when "boolean" -%>
15
+ <%= form.check_box key %>
9
16
  <% else %>
10
- <%= form.text_field c.first %>
17
+ <%= form.text_field key %>
11
18
  <% end -%>
12
19
  </p>
13
20
  <% end %>
14
- <%= submit_tag t('papermill.save') %>
15
21
  <% end %>
16
- </form>
22
+ <%= submit_tag t('papermill.save') %>
23
+ </form>
@@ -8,10 +8,10 @@
8
8
  <tr><td class="left-cell"><%= t("papermill.name") %> </td><td><%= @asset.name %></td></tr>
9
9
  <tr><td class="left-cell"><%= t("papermill.content_type") %></td><td><%= @asset.content_type %></td></tr>
10
10
  <tr><td class="left-cell"><%= t("papermill.size") %> </td><td><%= number_to_human_size(@asset.size.to_i) %></td></tr>
11
- <% if @asset.image? %>
12
- <tr><td class="left-cell"><%= t("papermill.width") %> </td><td><%= @asset.width.to_i %>px</td></tr>
13
- <tr><td class="left-cell"><%= t("papermill.height") %> </td><td><%= @asset.height.to_i %>px</td></tr>
14
- <% end %>
11
+ <% if @asset.image? %>
12
+ <tr><td class="left-cell"><%= t("papermill.width") %> </td><td><%= @asset.width.to_i %>px</td></tr>
13
+ <tr><td class="left-cell"><%= t("papermill.height") %> </td><td><%= @asset.height.to_i %>px</td></tr>
14
+ <% end %>
15
15
  <tr><td class="left-cell"><%= t("papermill.created_at") %> </td><td><%= I18n.l(@asset.created_at) %></td></tr>
16
16
  <tr><td class="left-cell"><%= t("papermill.updated_at") %> </td><td><%= I18n.l(@asset.updated_at) %></td></tr>
17
17
  </table>
@@ -35,21 +35,13 @@ module ActionView::Helpers::FormTagHelper
35
35
 
36
36
  private
37
37
  def papermill_upload_tag(key, options)
38
- if key.nil? && (options[:assetable].is_a?(Symbol) || options[:assetable].is_a?(String))
38
+ if key.nil? && options[:assetable]
39
39
  key = options[:assetable]
40
40
  options[:assetable] = nil
41
41
  end
42
42
 
43
43
  assetable = options[:assetable] || @template.instance_variable_get("@#{@object_name}")
44
- options = (
45
- if assetable && (association = (assetable.class.papermill_associations[key.to_sym] || assetable.class.papermill_associations[Papermill::options[:base_association_name]]))
46
- association.deep_merge(options)
47
- elsif assetable.nil?
48
- Papermill::options.deep_merge(options)
49
- else
50
- raise PapermillException.new("Can't find '#{key.to_s}' association for '#{assetable.class.to_s}'.\n\n##{assetable.class.to_s.underscore}.rb\nYou can take on of these actions: \n1. set either a catchall papermill association: 'papermill {your_option_hash}'\n2. or a specific association: 'papermill :#{key.to_s}, {your_option_hash}'")
51
- end
52
- )
44
+ options = PapermillAsset.assetable_papermill_options(assetable.class.name, key)
53
45
 
54
46
  assetable_id = assetable && (assetable.id || assetable.timestamp) || nil
55
47
  assetable_type = assetable && assetable.class.base_class.name || nil
@@ -116,7 +108,7 @@ module ActionView::Helpers::FormTagHelper
116
108
 
117
109
  html[:upload_button] = %{<div id="#{id}-button-wrapper" class="papermill-button-wrapper" style="height: #{options[:swfupload][:button_height]}px;"><span id="browse_for_#{id}" class="swf_button"></span></div>}
118
110
  html[:container] = @template.content_tag(:div, :id => id, :class => "#{(options[:thumbnail] ? "papermill-thumb-container" : "papermill-asset-container")} #{(options[:gallery] ? "papermill-multiple-items" : "papermill-unique-item")}") {
119
- @template.render :partial => "papermill/asset", :collection => collection, :locals => { :thumbnail_style => (options[:thumbnail] && options[:thumbnail][:style]) }
111
+ @template.render :partial => "papermill/asset", :collection => collection, :locals => { :thumbnail_style => options[:thumbnail] && options[:thumbnail][:style] }
120
112
  }
121
113
 
122
114
  if options[:gallery]
@@ -22,7 +22,7 @@ module Papermill
22
22
  include Papermill::InstanceMethods
23
23
  before_destroy :destroy_assets
24
24
  after_create :rebase_assets
25
- has_many :papermill_assets, :as => "Assetable"
25
+ has_many :papermill_assets, :as => "Assetable", :dependent => :destroy, :order => 'assetable_key ASC, position ASC'
26
26
 
27
27
  define_method assoc_name do |*options|
28
28
  scope = PapermillAsset.scoped(:conditions => {:assetable_id => self.id, :assetable_type => self.class.base_class.name})
@@ -56,11 +56,7 @@ module Papermill
56
56
 
57
57
  def rebase_assets
58
58
  PapermillAsset.all(:conditions => { :assetable_id => self.timestamp, :assetable_type => self.class.base_class.name }).each do |asset|
59
- if asset.created_at < 2.hours.ago
60
- asset.destroy
61
- else
62
- asset.update_attribute(:assetable_id, self.id)
63
- end
59
+ asset.created_at < 2.hours.ago ? asset.destroy : asset.update_attribute(:assetable_id, self.id)
64
60
  end
65
61
  end
66
62
  end
@@ -12,7 +12,9 @@ class PapermillAsset < ActiveRecord::Base
12
12
  validates_attachment_presence :file
13
13
 
14
14
  belongs_to :assetable, :polymorphic => true
15
- default_scope :order => 'position'
15
+ default_scope :order => 'assetable_key ASC, position ASC'
16
+
17
+ named_scope :key, lambda { |assetable_key| { :conditions => ['assetable_key = ?', assetable_key] }
16
18
 
17
19
  def Filedata=(data)
18
20
  data.content_type = data.get_content_type # SWFUpload content-type fix
@@ -68,23 +70,23 @@ class PapermillAsset < ActiveRecord::Base
68
70
  file_content_type
69
71
  end
70
72
 
71
- def image?
72
- content_type.split("/")[0] == "image"
73
- end
74
-
75
- def save(*params)
76
- if super(*params)
77
- if params.last.is_a?(Hash) && params.last[:unique] && assetable_key
78
- PapermillAsset.find(:all, :conditions => {:assetable_id => assetable_id, :assetable_type => assetable_type, :assetable_key => assetable_key }).each do |asset|
79
- asset.destroy unless asset == self
80
- end
81
- end
82
- true
73
+ def self.assetable_papermill_options(assetable_class, assetable_key)
74
+ if assetable_class
75
+ assoc = assetable_class.constantize.papermill_associations
76
+ assoc[assetable_key.try(:to_sym)] || assoc[Papermill::options[:base_association_name]]
83
77
  else
84
- false
78
+ Papermill::options
85
79
  end
86
80
  end
87
81
 
82
+ def assetable_papermill_options
83
+ self.class.assetable_papermill_options(assetable_type, assetable_key)
84
+ end
85
+
86
+ def image?
87
+ content_type.split("/")[0] == "image"
88
+ end
89
+
88
90
  def self.cleanup
89
91
  self.all(:conditions => ["id < 0 AND created_at < ?", DateTime.now.yesterday]).each &:destroy
90
92
  end
@@ -105,7 +107,7 @@ class PapermillAsset < ActiveRecord::Base
105
107
  FileUtils.rm_r(File.dirname(path).chomp("original")) rescue true
106
108
  end
107
109
 
108
- def self.compute_style(style, compatibility_mode = nil)
110
+ def self.compute_style(style)
109
111
  style = Papermill::options[:aliases][style.to_sym] || Papermill::options[:aliases][style.to_s] || !Papermill::options[:alias_only] && style
110
112
  [Symbol, String].include?(style.class) ? {:geometry => style.to_s} : style
111
113
  end
@@ -48,6 +48,14 @@ module Papermill
48
48
 
49
49
  # Attributes editable at once for all assets in a gallery
50
50
  :mass_editable_fields => ["title", "copyright", "description"],
51
+
52
+ # Attributes you can edit in the form. You can use :type and :label
53
+ :editable_fields => [
54
+ {:title => {:type => "string"}},
55
+ {:alt => {:type => "string"}},
56
+ {:copyright => {:type => "string"}},
57
+ {:description => {:type => "text" }},
58
+ ],
51
59
 
52
60
  # FormHelper gallery options
53
61
  # If :inline_css is true, css will be generated automatically and added through @content_for_papermill_inline_css (papermill_stylesheet_tag includes it)
@@ -9,6 +9,8 @@
9
9
  #papermill-box #footer { text-align:center; font-size:10px; padding:5px }
10
10
  #papermill-box #read-write { margin:10px 0 0 5px; }
11
11
 
12
+ #papermill-box #error { color:red; padding:10px; margin:10px; border:1px dashed green; background-color:#DDD; }
13
+
12
14
  #papermill-box .right-cell {}
13
15
  #papermill-box .left-cell {font-weight:bold; padding-right:10px; text-align:right;}
14
16
 
@@ -1,5 +1,5 @@
1
1
  popup = function(url) {
2
- window.open (url, "Papermill", config='height=580, width=870, toolbar=no, menubar=no, scrollbars=yes, resizable=yes, location=no, directories=no, status=no')
2
+ window.open (url, "Papermill", config='height=600, width=900, toolbar=no, menubar=no, scrollbars=yes, resizable=no, location=no, directories=no, status=no')
3
3
  }
4
4
 
5
5
  close_popup = function(source) {
@@ -43,7 +43,7 @@ close_popup = function(source) {
43
43
  */
44
44
 
45
45
  notify = function(message, type) {
46
- if(type != "notice") { alert(type + ": " + message) }
46
+ if(type != "notice") { alert(message) }
47
47
  }
48
48
 
49
49
  /*
@@ -57,6 +57,8 @@ notify = function(message, type) {
57
57
  if(type == "error") { jQuery.noticeAdd({ text: message, stayTime: 20000, stay: false, type: type }) }
58
58
  }
59
59
 
60
+ Or you can just update div's in your application (like dynamic rails flash)
61
+
60
62
  */
61
63
 
62
64
  var Upload = {
@@ -108,27 +110,18 @@ var Upload = {
108
110
  jQuery('#' + file.id + ' .progress span').width(percent + '%');
109
111
  },
110
112
  upload_error: function(file, errorCode, message) {
111
- try {
112
- switch (errorCode) {
113
- case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
114
- notify("Too many files selected", "error");
115
- return;
116
- default:
117
- notify("An error occurred while sending the file" + errorCode, "error");
118
- return;
119
- }
120
- } catch (ex) {
113
+ switch (errorCode) {
114
+ case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
115
+ notify("Too many files selected", "error"); break;
116
+ default:
117
+ notify("An error occurred while sending the file", "error");
121
118
  }
119
+ jQuery("#"+file.id).remove();
122
120
  },
123
121
 
124
122
  upload_success: function(file, data)
125
123
  {
126
- if(jQuery(data).length == 0) {
127
- notify(data, "warning");
128
- jQuery('#' + file.id).remove();
129
- } else {
130
- jQuery('#' + file.id).replaceWith(jQuery(data));
131
- }
124
+ jQuery('#' + file.id).replaceWith(jQuery(data));
132
125
  },
133
126
  upload_complete: function(file)
134
127
  {
@@ -139,26 +132,19 @@ var Upload = {
139
132
  },
140
133
 
141
134
  file_queue_error: function(file, errorCode, message) {
142
- try {
143
- switch (errorCode) {
144
- case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
145
- notify("Too many files selected", "error");
146
- return;
147
- case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
148
- notify("File is too big", "error");
149
- return;
150
- case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
151
- notify("File is empty. Please select another file", "error");
152
- return;
153
- case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
154
- notify("File is not an allowed file type", "error");
155
- return;
156
- default:
157
- notify("An error occurred while sending the file" + errorCode, "error");
158
- return;
159
- }
160
- } catch (e) {
135
+ switch (errorCode) {
136
+ case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
137
+ notify("Too many files selected", "error"); break;
138
+ case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
139
+ notify("File is too big", "error"); break;
140
+ case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
141
+ notify("File is empty. Please select another file", "error"); break;
142
+ case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
143
+ notify("File is not an allowed file type", "error"); break;
144
+ default:
145
+ notify("An error occurred while sending the file", "error");
161
146
  }
147
+ jQuery("#"+file.id).remove();
162
148
  }
163
149
  }
164
150
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: papermill
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Benoit B\xC3\xA9n\xC3\xA9zech"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-18 00:00:00 +01:00
12
+ date: 2009-11-19 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -54,7 +54,6 @@ files:
54
54
  - generators/papermill_table/templates/migrate/papermill_migration.rb.erb
55
55
  - init.rb
56
56
  - install.rb
57
- - installation-template.txt
58
57
  - lib/extensions.rb
59
58
  - lib/papermill.rb
60
59
  - lib/papermill/form_builder.rb
@@ -1,113 +0,0 @@
1
- gem 'papermill'
2
-
3
- generate :papermill_table, "PapermillMigration"
4
- generate :papermill_assets
5
- generate :papermill_initializer
6
- generate :scaffold, "article title:string"
7
- rake "db:migrate"
8
-
9
- file "app/models/article.rb", <<-END
10
- class Article < ActiveRecord::Base
11
- validates_presence_of :title
12
- papermill :thumbnail => {:width => 100, :height => 75} # catch-all for non-specified associations, will create assets/asset methods.
13
- papermill :image_gallery, :class_name => ImageAsset, :images_only => true, :thumbnail => {:width => 75, :height => 100}
14
- # image_gallery association (set with define_method)
15
- end
16
- END
17
-
18
- file "app/models/image_asset.rb", <<-END
19
- class ImageAsset < PapermillAsset
20
- validates_attachment_content_type :file, :content_type => ['image/jpeg', 'image/pjpeg', 'image/jpg', 'image/png', 'image/gif']
21
- end
22
- END
23
-
24
- file "app/views/articles/edit.html.erb", <<-END
25
- <h1>Editing article</h1>
26
- <%= render :partial => "form" %>
27
- <%= link_to 'Show', @article %> |
28
- <%= link_to 'Back', articles_path %>
29
- END
30
-
31
- file "app/views/articles/new.html.erb", <<-END
32
- <h1>New article</h1>
33
- <%= render :partial => "form" %>
34
- <%= link_to 'Back', articles_path %>
35
- END
36
-
37
- file "app/views/articles/_form.html.erb", <<-END
38
- <% form_for(@article) do |f| %>
39
- <%= f.error_messages %><br /><br />
40
- <%= f.label :title %><br />
41
- <%= f.text_field :title %><br /><br />
42
- <%= f.label :image_gallery %><br />
43
- <%= f.images_upload(:image_gallery) %><br /><br />
44
- <%= f.label :my_other_image %><br />
45
- <%= f.image_upload(:my_other_image) %> <br /><br />
46
- <%= f.label :my_assets %><br />
47
- <%= f.assets_upload(:my_assets) %><br /><br />
48
- <%= f.label :my_other_asset %><br />
49
- <%= f.asset_upload(:my_other_asset) %><br /><br />
50
- <%= f.submit 'Send' %>
51
- <% end %>
52
- END
53
-
54
- file "app/views/articles/show.html.erb", <<-END
55
- <p>
56
- <b>Title:</b>
57
- <%=h @article.title %>
58
- </p>
59
- <br /><br />
60
- <b>@article.image_gallery.each :</b>
61
- <p>
62
- <% @article.image_gallery.each do |image| %>
63
- <%= link_to(image_tag(image.url("100x100#")), image.url) %>
64
- <% end %>
65
- </p>
66
- <br /><br />
67
- <b>@article.assets(:my_other_image).first :</b>
68
- <p>
69
- <% image = @article.assets(:my_other_image).first %>
70
- <%= link_to(image_tag(image.url("100x100#")), image.url) if image %>
71
- </p>
72
- <br /><br />
73
- <b>@article.assets(:my_assets).each :</b>
74
- <p>
75
- <ul>
76
- <% @article.assets(:my_assets).each do |asset| %>
77
- <li><%= link_to asset.name, asset.url %></li>
78
- <% end %>
79
- </ul>
80
- </p>
81
- <br /><br />
82
- <b>@article.assets(:my_other_asset).first :</b>
83
- <p>
84
- <% asset = @article.assets(:my_other_asset).first %>
85
- <%= link_to(asset.name, asset.url) if asset %>
86
- </p>
87
-
88
- <%= link_to 'Edit', edit_article_path(@article) %> |
89
- <%= link_to 'Back', articles_path %>
90
- END
91
-
92
-
93
- file "app/views/layouts/application.html.erb", <<-END
94
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
95
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
96
-
97
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
98
- <head>
99
- <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
100
- <title>Papermill Demo</title>
101
- <%= stylesheet_link_tag 'scaffold' %>
102
- <%= papermill_stylesheet_tag %>
103
- </head>
104
- <body>
105
- <%= yield %>
106
- <%= papermill_javascript_tag :with_jquery => true %>
107
- </body>
108
- </html>
109
- END
110
-
111
- run "rm app/views/layouts/articles.html.erb"
112
- run "rm public/index.html"
113
- route "map.root :controller => 'articles'"