radiant-assets-extension 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/{README → README.rdoc} +4 -2
- data/Rakefile +3 -3
- data/app/controllers/admin/assets_controller.rb +5 -22
- data/app/controllers/admin/attachments_controller.rb +21 -0
- data/app/controllers/admin/upload_handler.rb +22 -0
- data/app/helpers/assets_helper.rb +8 -2
- data/app/models/asset.rb +16 -2
- data/app/models/asset_tags.rb +56 -24
- data/app/models/attachment.rb +23 -0
- data/app/views/admin/assets/_attachment.html.erb +3 -0
- data/app/views/admin/assets/_attachments.html.erb +23 -0
- data/app/views/admin/assets/_grid.html.erb +3 -5
- data/app/views/admin/assets/_list.html.erb +2 -0
- data/app/views/admin/assets/_upload.html.erb +40 -0
- data/app/views/admin/assets/edit.html.erb +8 -0
- data/app/views/admin/assets/index.html.erb +1 -1
- data/app/views/admin/assets/new.html.erb +3 -42
- data/app/views/admin/assets/remove.html.erb +12 -0
- data/assets_extension.rb +6 -1
- data/config/routes.rb +5 -0
- data/db/migrate/20110225174217_add_caching_columns_to_asset.rb +26 -0
- data/db/migrate/20110225210821_add_attachment_to_pages.rb +12 -0
- data/db/migrate/20110225210912_add_timestamps_and_locking_to_assets.rb +19 -0
- data/db/migrate/20110320152044_add_position_to_attachments.rb +14 -0
- data/lib/radiant-assets-extension/s3_store.rb +1 -0
- data/lib/radiant-assets-extension/version.rb +1 -1
- data/public/stylesheets/admin/extensions/assets/assets.css +48 -12
- data/radiant-assets-extension.gemspec +1 -0
- metadata +32 -6
data/{README → README.rdoc}
RENAMED
@@ -7,7 +7,7 @@ Supports uploading of images as well as other files.
|
|
7
7
|
|
8
8
|
== Radius Tags
|
9
9
|
|
10
|
-
<r:
|
10
|
+
<r:image size="300x" />
|
11
11
|
|
12
12
|
Proportionally resizes an image to 300px width. Supports imagemagick geometry
|
13
13
|
strings to do advanced resizing straight in Radius tags. Resized images are
|
@@ -17,4 +17,6 @@ request.
|
|
17
17
|
== Todo
|
18
18
|
|
19
19
|
- Attaching Assets to Pages
|
20
|
-
- Easy/Automatic migration from paperclipped
|
20
|
+
- Easy/Automatic migration from paperclipped (currently this extension should
|
21
|
+
only be used on “fresh” radiant sites w/o an asset management solution
|
22
|
+
already in place)
|
data/Rakefile
CHANGED
@@ -96,17 +96,17 @@ namespace :spec do
|
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
|
-
desc 'Generate documentation for the
|
99
|
+
desc 'Generate documentation for the assets extension.'
|
100
100
|
Rake::RDocTask.new(:rdoc) do |rdoc|
|
101
101
|
rdoc.rdoc_dir = 'rdoc'
|
102
|
-
rdoc.title = '
|
102
|
+
rdoc.title = 'AssetsExtension'
|
103
103
|
rdoc.options << '--line-numbers' << '--inline-source'
|
104
104
|
rdoc.rdoc_files.include('README')
|
105
105
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
106
106
|
end
|
107
107
|
|
108
108
|
# For extensions that are in transition
|
109
|
-
desc 'Test the
|
109
|
+
desc 'Test the assets extension.'
|
110
110
|
Rake::TestTask.new(:test) do |t|
|
111
111
|
t.libs << 'lib'
|
112
112
|
t.pattern = 'test/**/*_test.rb'
|
@@ -1,28 +1,11 @@
|
|
1
1
|
class Admin::AssetsController < Admin::ResourceController
|
2
|
+
include Admin::UploadHandler
|
2
3
|
paginate_models
|
3
|
-
helper :assets
|
4
4
|
|
5
5
|
def create
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
@asset.save!
|
11
|
-
render_hacky_json(:markup => @template.asset_listing(@asset))
|
12
|
-
rescue => e
|
13
|
-
logger.warn(e.to_s)
|
14
|
-
render_hacky_json(:markup => "Error: #{e.to_s}")
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
# HACK: sending JSON as text/html
|
19
|
-
# (https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)
|
20
|
-
# jquery.fileupload makes use of iframes for browsers like Microsoft
|
21
|
-
# Internet Explorer and Opera, which do not yet support XMLHTTPRequest
|
22
|
-
# uploads. They will only register a load event if the Content-type of the
|
23
|
-
# response is set to text/plain or text/html, not if it is set to
|
24
|
-
# application/json.
|
25
|
-
def render_hacky_json(data)
|
26
|
-
render :json => data, :content_type => 'text/html'
|
6
|
+
rendering_upload_response do
|
7
|
+
@asset = Asset.create! params[:asset]
|
8
|
+
@template.content_tag(:li, @template.asset_listing(@asset))
|
9
|
+
end
|
27
10
|
end
|
28
11
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Admin::AttachmentsController < Admin::ResourceController
|
2
|
+
include Admin::UploadHandler
|
3
|
+
|
4
|
+
def create
|
5
|
+
rendering_upload_response do
|
6
|
+
@page = Page.find(params[:page_id])
|
7
|
+
attachment = @page.attachments.create!(params[:attachment])
|
8
|
+
render_to_string(:partial => 'admin/assets/attachment', :locals => {:attachment => attachment})
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# Gets called after successful update
|
13
|
+
# only used when attachment update form not submitted using javascript
|
14
|
+
def index
|
15
|
+
redirect_to edit_admin_page_path(params[:page_id])
|
16
|
+
end
|
17
|
+
|
18
|
+
def positions
|
19
|
+
render :json => Attachment.reorder(params[:attachment])
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Admin::UploadHandler
|
2
|
+
private
|
3
|
+
# HACK: sending JSON as text/html
|
4
|
+
# (https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)
|
5
|
+
# jquery.fileupload makes use of iframes for browsers like Microsoft
|
6
|
+
# Internet Explorer and Opera, which do not yet support XMLHTTPRequest
|
7
|
+
# uploads. They will only register a load event if the Content-type of the
|
8
|
+
# response is set to text/plain or text/html, not if it is set to
|
9
|
+
# application/json.
|
10
|
+
def render_hacky_json(data)
|
11
|
+
render :json => data, :content_type => 'text/html'
|
12
|
+
end
|
13
|
+
|
14
|
+
# Renders a response appropriate for use with jquery.fileupload.js
|
15
|
+
# Takes a block that should return an HTML string
|
16
|
+
def rendering_upload_response
|
17
|
+
render_hacky_json(:markup => yield)
|
18
|
+
rescue => e
|
19
|
+
logger.warn(e.to_s)
|
20
|
+
render_hacky_json(:markup => "Error: #{e.to_s}")
|
21
|
+
end
|
22
|
+
end
|
@@ -1,10 +1,16 @@
|
|
1
1
|
module AssetsHelper
|
2
2
|
def asset_listing(asset)
|
3
|
-
|
3
|
+
asset_icon(asset) +
|
4
4
|
content_tag(:span, asset.to_s, :class=>'title')
|
5
5
|
end
|
6
6
|
|
7
|
-
def
|
7
|
+
def asset_grid_item(asset)
|
8
|
+
asset_icon(asset, 120) +
|
9
|
+
content_tag(:span, "ID: #{asset.id}", :class => 'id') +
|
10
|
+
content_tag(:span, asset.to_s, :class => 'caption')
|
11
|
+
end
|
12
|
+
|
13
|
+
def asset_icon(asset, size=30)
|
8
14
|
asset.image? ? square_thumb(asset, size) : text_icon(asset, size)
|
9
15
|
end
|
10
16
|
|
data/app/models/asset.rb
CHANGED
@@ -1,16 +1,30 @@
|
|
1
1
|
class Asset < ActiveRecord::Base
|
2
|
+
has_many :attachments, :include => :page, :dependent => :destroy
|
2
3
|
# HACK: incomplete
|
3
4
|
AUDIO_FORMATS = [:wav, :mp3, :m4a, :ogg]
|
4
5
|
VIDEO_FORMATS = [:mp4, :avi]
|
5
6
|
|
6
7
|
image_accessor :upload
|
7
8
|
validates_presence_of :upload
|
9
|
+
delegate :url, :width, :height, :landscape, :portrait, :to => :upload
|
10
|
+
|
11
|
+
def uploads
|
12
|
+
[]
|
13
|
+
end
|
14
|
+
|
15
|
+
def uploads=(new_uploads)
|
16
|
+
# HACK: depends on javascript being present and packaging each file
|
17
|
+
# in its own request
|
18
|
+
# TODO: handle non-js situations with several files in one request
|
19
|
+
# see Admin::AttachmentsController#create and Admin::AssetsController#create
|
20
|
+
self.upload = Array(new_uploads).first
|
21
|
+
end
|
8
22
|
|
9
23
|
def format
|
10
24
|
# HACK: relying on extension instead of using analyser and upload.format
|
11
25
|
# analyser can throw us into very long loop when trying to identify
|
12
26
|
# non-image files like word docs
|
13
|
-
upload.ext
|
27
|
+
upload.ext ? upload.ext.to_sym : :generic
|
14
28
|
rescue Dragonfly::FunctionManager::UnableToHandle
|
15
29
|
:generic
|
16
30
|
end
|
@@ -32,6 +46,6 @@ class Asset < ActiveRecord::Base
|
|
32
46
|
end
|
33
47
|
|
34
48
|
def to_s
|
35
|
-
caption || upload.name
|
49
|
+
caption || upload.name || ''
|
36
50
|
end
|
37
51
|
end
|
data/app/models/asset_tags.rb
CHANGED
@@ -27,26 +27,37 @@ module AssetTags
|
|
27
27
|
# TODO: accept width/height attributes and do something sensible like
|
28
28
|
# resizing proportionally
|
29
29
|
tag 'image' do |tag|
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
asset = find_asset(tag)
|
31
|
+
options = tag.attr.dup
|
32
|
+
image = resized_or_original_image(asset, options.delete('size'))
|
33
|
+
%{<img src="#{image.url}"#{html_attributes(options)}>}
|
33
34
|
end
|
34
35
|
|
35
36
|
desc %{
|
36
37
|
Selects an asset. Does not render anything itself but gives access to the
|
37
38
|
asset's attributes such as size
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
<r:asset id="22" [size="200"]><r:url /></r:asset>
|
40
|
+
<r:asset id="22"><r:url /></r:asset>
|
42
41
|
}
|
43
42
|
tag 'asset' do |tag|
|
44
|
-
assert_id_given(tag)
|
45
43
|
tag.locals.asset = find_asset(tag)
|
46
44
|
tag.expand
|
47
45
|
end
|
48
46
|
|
49
|
-
%
|
47
|
+
desc %{
|
48
|
+
Renders the URL of an asset
|
49
|
+
|
50
|
+
Accepts optional size parameter in which case, if the asset is an image,
|
51
|
+
the URL to a resized version of the image will be returned
|
52
|
+
|
53
|
+
<r:asset:url [size="200x200"] id="22" />
|
54
|
+
}
|
55
|
+
tag 'asset:url' do |tag|
|
56
|
+
image = resized_or_original_image(tag.locals.asset, tag.attr['size'])
|
57
|
+
(image && image.url) || tag.locals.asset.url
|
58
|
+
end
|
59
|
+
|
60
|
+
%w[caption width height].each do |attribute|
|
50
61
|
desc %{
|
51
62
|
Renders the #{attribute} of the current asset
|
52
63
|
}
|
@@ -55,13 +66,6 @@ module AssetTags
|
|
55
66
|
end
|
56
67
|
end
|
57
68
|
|
58
|
-
desc %{
|
59
|
-
Renders the caption of the current asset
|
60
|
-
}
|
61
|
-
tag 'asset:caption' do |tag|
|
62
|
-
tag.locals.asset.caption
|
63
|
-
end
|
64
|
-
|
65
69
|
desc %{
|
66
70
|
Renders contents if the current asset is an image
|
67
71
|
}
|
@@ -92,17 +96,45 @@ module AssetTags
|
|
92
96
|
end
|
93
97
|
end
|
94
98
|
|
95
|
-
|
96
|
-
|
97
|
-
|
99
|
+
# Namespace only
|
100
|
+
tag 'attachments' do |tag|
|
101
|
+
tag.expand
|
98
102
|
end
|
99
|
-
|
103
|
+
|
104
|
+
desc %{
|
105
|
+
Selects the first attached asset of the page and renders the tag's contents.
|
106
|
+
If there are no assets on the page, nothing is rendered.
|
107
|
+
}
|
108
|
+
tag 'attachments:first' do |tag|
|
109
|
+
if attachment = tag.locals.page.attachments.first
|
110
|
+
tag.locals.asset = attachment.asset
|
111
|
+
tag.expand
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
tag 'attachments:each' do |tag|
|
116
|
+
tag.locals.page.attachments.collect do |attachment|
|
117
|
+
tag.locals.attachment = attachment
|
118
|
+
tag.locals.asset = attachment.asset
|
119
|
+
tag.expand
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
100
124
|
def find_asset(tag)
|
101
|
-
asset
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
125
|
+
tag.locals.asset || Asset.find(tag.attr['id'])
|
126
|
+
rescue ActiveRecord::RecordNotFound
|
127
|
+
raise TagError, 'Please supply an id attribute'
|
128
|
+
end
|
129
|
+
|
130
|
+
def resized_or_original_image(asset, size)
|
131
|
+
if asset.image?
|
132
|
+
size ? asset.upload.process(:resize, size) : asset.upload
|
106
133
|
end
|
107
134
|
end
|
135
|
+
|
136
|
+
def html_attributes(options)
|
137
|
+
attributes = options.inject('') { |s, (k, v)| s << %{#{k.downcase}="#{v}" } }.strip
|
138
|
+
" #{attributes}" unless attributes.empty?
|
139
|
+
end
|
108
140
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'acts_as_list'
|
2
|
+
|
3
|
+
class Attachment < ActiveRecord::Base
|
4
|
+
belongs_to :asset, :autosave => true
|
5
|
+
belongs_to :page
|
6
|
+
|
7
|
+
acts_as_list :scope => :page_id
|
8
|
+
|
9
|
+
def self.reorder(new_order)
|
10
|
+
new_order.each_with_index do |id, index|
|
11
|
+
find(id).update_attributes! :position => index+1
|
12
|
+
end
|
13
|
+
new_order
|
14
|
+
end
|
15
|
+
|
16
|
+
def uploads=(new_uploads)
|
17
|
+
(asset || build_asset).uploads=new_uploads
|
18
|
+
end
|
19
|
+
|
20
|
+
def uploads
|
21
|
+
(asset || build_asset).uploads
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<h2>Attachments</h2>
|
2
|
+
|
3
|
+
<%= render :partial => 'admin/assets/upload', :locals => {:record => @page.attachments.build, :url => admin_page_attachments_path(@page)} %>
|
4
|
+
|
5
|
+
<ul id="assets">
|
6
|
+
<%= render :partial => 'admin/assets/attachment', :collection => @page.attachments.reject(&:new_record?) %>
|
7
|
+
</ul>
|
8
|
+
|
9
|
+
<script type="text/javascript">
|
10
|
+
(function($) {
|
11
|
+
$(function() {
|
12
|
+
$('#assets').sortable({
|
13
|
+
update: function(event, ui) {
|
14
|
+
$.ajax({
|
15
|
+
type: "POST",
|
16
|
+
url: '<%= positions_admin_page_attachments_path(@page) %>',
|
17
|
+
data: '_method=PUT&'+$(this).sortable('serialize'),
|
18
|
+
});
|
19
|
+
}
|
20
|
+
}).disableSelection();
|
21
|
+
});
|
22
|
+
}(jQuery));
|
23
|
+
</script>
|
@@ -1,11 +1,9 @@
|
|
1
1
|
<ul id="assets">
|
2
|
-
<% unless
|
3
|
-
<%
|
2
|
+
<% unless assets.empty? %>
|
3
|
+
<% assets.each do |asset| %>
|
4
4
|
<li>
|
5
5
|
<% link_to edit_admin_asset_path(asset) do %>
|
6
|
-
<%=
|
7
|
-
<span class="id">ID: <%= asset.id %></span>
|
8
|
-
<span class="caption"><%= asset %></span>
|
6
|
+
<%= asset_grid_item(asset) %>
|
9
7
|
<% end %>
|
10
8
|
<%= link_to_remove(asset) %>
|
11
9
|
</li>
|
@@ -3,6 +3,7 @@
|
|
3
3
|
<th class="name">Name</th>
|
4
4
|
<th class="format">Type</th>
|
5
5
|
<th class="size">Size</th>
|
6
|
+
<th class="updated_at">Last Changed</th>
|
6
7
|
<th class="actions">Modify</th>
|
7
8
|
</thead>
|
8
9
|
<tbody>
|
@@ -12,6 +13,7 @@
|
|
12
13
|
<td class="name"><%= asset_listing(asset) %></td>
|
13
14
|
<td class="format"><%= asset.format.to_s.mb_chars.upcase %></td>
|
14
15
|
<td class="size"><%= number_to_human_size(asset.upload.size) %></td>
|
16
|
+
<td class="updated_at"><%= time_ago_in_words asset.updated_at %> ago</td>
|
15
17
|
<td class="actions"><%= link_to_remove(asset) %></td>
|
16
18
|
</tr>
|
17
19
|
<% end %>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<% include_stylesheet 'admin/extensions/assets/assets' %>
|
2
|
+
|
3
|
+
<% form_for record, :url => url, :html => {:multipart => true, :id => 'asset_upload', 'data-onsubmit_status'=>'Uploading Asset…'} do |f| %>
|
4
|
+
<p>Click or drag files here to upload</p>
|
5
|
+
<%= f.file_field :uploads, :multiple => true %>
|
6
|
+
|
7
|
+
<p class="buttons">
|
8
|
+
<%= f.submit 'Upload Asset', :class=>'button' %>
|
9
|
+
or <%= link_to 'Cancel', admin_assets_path %>
|
10
|
+
</p>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
|
14
|
+
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js"></script>
|
15
|
+
<% include_stylesheet 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/themes/base/jquery-ui.css' %>
|
16
|
+
<script type="text/javascript">jQuery.noConflict();</script>
|
17
|
+
<script src="/jquery.fileupload/jquery.fileupload.js" type="text/javascript"></script>
|
18
|
+
<script src="/jquery.fileupload/jquery.fileupload-ui.js" type="text/javascript"></script>
|
19
|
+
<% include_stylesheet '/jquery.fileupload/jquery.fileupload-ui.css' %>
|
20
|
+
<script type="text/javascript">
|
21
|
+
(function($) {
|
22
|
+
$(function () {
|
23
|
+
$('form#asset_upload').fileUploadUI({
|
24
|
+
uploadTable: $('#assets'),
|
25
|
+
downloadTable: $('#assets'),
|
26
|
+
buildUploadRow: function (files, index) {
|
27
|
+
return $('<li>' + files[index].name +
|
28
|
+
'<span class="file_upload_progress"><div><\/div><\/span>' +
|
29
|
+
'<span class="file_upload_cancel">' +
|
30
|
+
'<button class="ui-state-default ui-corner-all" title="Cancel">' +
|
31
|
+
'<span class="ui-icon ui-icon-cancel">Cancel<\/span>' +
|
32
|
+
'<\/button><\/span><\/li>');
|
33
|
+
},
|
34
|
+
buildDownloadRow: function (file) {
|
35
|
+
return $(file.markup);
|
36
|
+
}
|
37
|
+
});
|
38
|
+
});
|
39
|
+
}(jQuery));
|
40
|
+
</script>
|
@@ -18,6 +18,14 @@
|
|
18
18
|
</table>
|
19
19
|
<%= f.file_field :upload %>
|
20
20
|
<%= display(@asset) %>
|
21
|
+
<%- if @asset.attachments.any? -%>
|
22
|
+
<h2>Included on <%= pluralize(@asset.attachments.size, 'this page', 'these pages') %>:</h2>
|
23
|
+
<ul>
|
24
|
+
<%- @asset.attachments.each do |attachment| -%>
|
25
|
+
<li><%= link_to attachment.page.title, edit_admin_page_path(attachment.page) %></li>
|
26
|
+
<%- end -%>
|
27
|
+
</ul>
|
28
|
+
<%- end -%>
|
21
29
|
</div>
|
22
30
|
<p class="buttons">
|
23
31
|
<%= save_model_button(@asset) %>
|
@@ -1,45 +1,6 @@
|
|
1
|
-
<% include_stylesheet 'admin/extensions/assets/assets' %>
|
2
|
-
|
3
1
|
<h1>Upload New Assets</h1>
|
4
|
-
<table id="files">
|
5
|
-
<tbody></tbody>
|
6
|
-
</table>
|
7
2
|
|
8
|
-
<
|
9
|
-
|
10
|
-
<%= f.file_field :upload, :multiple => true %>
|
11
|
-
|
12
|
-
<!-- <p class="buttons">
|
13
|
-
<%= f.submit 'Upload Asset', :class=>'button' %>
|
14
|
-
or <%= link_to 'Cancel', admin_assets_path %>
|
15
|
-
</p> -->
|
16
|
-
<% end %>
|
3
|
+
<ul id="assets">
|
4
|
+
</ul>
|
17
5
|
|
18
|
-
|
19
|
-
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js"></script>
|
20
|
-
<% include_stylesheet 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/themes/base/jquery-ui.css' %>
|
21
|
-
<script type="text/javascript">jQuery.noConflict();</script>
|
22
|
-
<script src="/jquery.fileupload/jquery.fileupload.js" type="text/javascript"></script>
|
23
|
-
<script src="/jquery.fileupload/jquery.fileupload-ui.js" type="text/javascript"></script>
|
24
|
-
<% include_stylesheet '/jquery.fileupload/jquery.fileupload-ui.css' %>
|
25
|
-
<script type="text/javascript">
|
26
|
-
(function($) {
|
27
|
-
$(function () {
|
28
|
-
$('form.new_asset').fileUploadUI({
|
29
|
-
uploadTable: $('#files'),
|
30
|
-
downloadTable: $('#files'),
|
31
|
-
buildUploadRow: function (files, index) {
|
32
|
-
return $('<tr><td>' + files[index].name + '<\/td>' +
|
33
|
-
'<td class="file_upload_progress"><div><\/div><\/td>' +
|
34
|
-
'<td class="file_upload_cancel">' +
|
35
|
-
'<button class="ui-state-default ui-corner-all" title="Cancel">' +
|
36
|
-
'<span class="ui-icon ui-icon-cancel">Cancel<\/span>' +
|
37
|
-
'<\/button><\/td><\/tr>');
|
38
|
-
},
|
39
|
-
buildDownloadRow: function (file) {
|
40
|
-
return $('<tr><td>' + file.markup + '<\/td><\/tr>');
|
41
|
-
}
|
42
|
-
});
|
43
|
-
});
|
44
|
-
}(jQuery));
|
45
|
-
</script>
|
6
|
+
<%= render :partial => 'upload', :locals => {:record => @asset, :url => admin_assets_path} %>
|
@@ -8,6 +8,18 @@
|
|
8
8
|
|
9
9
|
<table class="index" id="assets">
|
10
10
|
<tr><td class="name"><%= asset_listing(@asset) %></td></tr>
|
11
|
+
<% if @asset.attachments.any? %>
|
12
|
+
<tr>
|
13
|
+
<th>
|
14
|
+
It's being used on the following
|
15
|
+
<%= pluralize(@asset.attachments.size, 'page') %> and will be removed from
|
16
|
+
there as well:
|
17
|
+
</th>
|
18
|
+
</tr>
|
19
|
+
<% @asset.attachments.each do |attachment| %>
|
20
|
+
<tr><td><%= attachment.page.title %></td></tr>
|
21
|
+
<% end %>
|
22
|
+
<% end %>
|
11
23
|
</table>
|
12
24
|
|
13
25
|
<% form_for [:admin, @asset], :html => {:method => :delete, 'data-onsubmit_status'=>'Removing asset…'} do |f| %>
|
data/assets_extension.rb
CHANGED
@@ -29,6 +29,11 @@ class AssetsExtension < Radiant::Extension
|
|
29
29
|
tab 'Content' do
|
30
30
|
add_item 'Assets', '/admin/assets', :after => 'Pages'
|
31
31
|
end
|
32
|
-
|
32
|
+
admin.page.edit.add :main, 'admin/assets/attachments', :after => :form
|
33
|
+
ApplicationController.helper(:assets)
|
34
|
+
Page.class_eval do
|
35
|
+
include AssetTags
|
36
|
+
has_many :attachments, :include => :asset, :order => :position
|
37
|
+
end
|
33
38
|
end
|
34
39
|
end
|
data/config/routes.rb
CHANGED
@@ -2,4 +2,9 @@ ActionController::Routing::Routes.draw do |map|
|
|
2
2
|
map.namespace :admin, :member => { :remove => :get } do |admin|
|
3
3
|
admin.resources :assets
|
4
4
|
end
|
5
|
+
map.namespace :admin do |admin|
|
6
|
+
admin.resources :pages do |pages|
|
7
|
+
pages.resources :attachments, :collection => { :positions => :put }
|
8
|
+
end
|
9
|
+
end
|
5
10
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class AddCachingColumnsToAsset < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
add_column :assets, :upload_name, :string
|
4
|
+
add_column :assets, :upload_ext, :string
|
5
|
+
add_column :assets, :upload_size, :integer
|
6
|
+
add_column :assets, :upload_width, :integer
|
7
|
+
add_column :assets, :upload_height, :integer
|
8
|
+
puts "Updating existing assets…"
|
9
|
+
Asset.all.each do |asset|
|
10
|
+
asset.upload_name = asset.upload.name
|
11
|
+
asset.upload_ext = asset.upload.ext
|
12
|
+
asset.upload_size = asset.upload.size
|
13
|
+
asset.upload_width = asset.upload.width
|
14
|
+
asset.upload_height = asset.upload.height
|
15
|
+
asset.save!
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.down
|
20
|
+
remove_column :assets, :upload_name
|
21
|
+
remove_column :assets, :upload_ext
|
22
|
+
remove_column :assets, :upload_size
|
23
|
+
remove_column :assets, :upload_width
|
24
|
+
remove_column :assets, :upload_height
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class AddTimestampsAndLockingToAssets < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
add_column :assets, :lock_version, :integer, :default => 0
|
4
|
+
add_column :assets, :created_at, :datetime
|
5
|
+
add_column :assets, :updated_at, :datetime
|
6
|
+
puts 'Updating current assets with dates'
|
7
|
+
Asset.all.each do |asset|
|
8
|
+
asset.created_at = Time.now
|
9
|
+
asset.updated_at = Time.now
|
10
|
+
asset.save!
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.down
|
15
|
+
remove_column :assets, :lock_version
|
16
|
+
add_column :assets, :created_at
|
17
|
+
add_column :assets, :updated_at
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class AddPositionToAttachments < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
add_column :attachments, :position, :integer
|
4
|
+
Page.all(:include => :attachments).each do |page|
|
5
|
+
page.attachments.each_with_index do |attachment, index|
|
6
|
+
attachment.update_attributes :position => index+1
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.down
|
12
|
+
remove_column :attachments, :position
|
13
|
+
end
|
14
|
+
end
|
@@ -17,32 +17,41 @@ table.index .size {
|
|
17
17
|
padding-right: 5px;
|
18
18
|
}
|
19
19
|
|
20
|
+
table#assets .icon,
|
21
|
+
table#assets .thumbnail {
|
22
|
+
margin-right: 5px;
|
23
|
+
}
|
24
|
+
|
20
25
|
#assets .icon {
|
26
|
+
float: left;
|
27
|
+
font-size: 75%;
|
21
28
|
display: block;
|
22
29
|
text-align: center;
|
23
30
|
background: #ccc;
|
24
31
|
text-transform: uppercase;
|
32
|
+
overflow: hidden;
|
25
33
|
}
|
26
34
|
|
27
|
-
table#assets .
|
28
|
-
|
29
|
-
|
35
|
+
table#assets th.name,
|
36
|
+
table#assets td.name {
|
37
|
+
width: auto;
|
30
38
|
}
|
31
39
|
|
32
|
-
table#assets .
|
33
|
-
|
40
|
+
table#assets th.actions {
|
41
|
+
/* min-width: 7em;*/
|
42
|
+
min-width: auto;
|
34
43
|
}
|
35
44
|
|
36
|
-
table#assets .
|
37
|
-
|
38
|
-
|
39
|
-
}
|
45
|
+
/*table#assets th.size {*/
|
46
|
+
/* min-width: 5em;*/
|
47
|
+
/*}*/
|
40
48
|
|
41
|
-
#assets, #assets li {
|
49
|
+
ul#assets, #assets li {
|
42
50
|
display: block;
|
43
51
|
list-style: none;
|
44
52
|
margin: 0;
|
45
53
|
padding: 0;
|
54
|
+
overflow: hidden;
|
46
55
|
}
|
47
56
|
|
48
57
|
#assets li {
|
@@ -51,7 +60,6 @@ table#assets .icon {
|
|
51
60
|
margin-right: 1px;
|
52
61
|
margin-bottom: 1px;
|
53
62
|
position: relative;
|
54
|
-
overflow: hidden;
|
55
63
|
}
|
56
64
|
|
57
65
|
#assets li a {
|
@@ -73,6 +81,10 @@ table#assets .icon {
|
|
73
81
|
display: block;
|
74
82
|
}
|
75
83
|
|
84
|
+
#assets li .action {
|
85
|
+
right: 2px;
|
86
|
+
}
|
87
|
+
|
76
88
|
#assets li .caption {
|
77
89
|
top: auto;
|
78
90
|
bottom: 0;
|
@@ -92,7 +104,6 @@ table#assets .remove::before {
|
|
92
104
|
}
|
93
105
|
|
94
106
|
#assets li .remove {
|
95
|
-
right: 2px;
|
96
107
|
width: 12px;
|
97
108
|
height: 12px;
|
98
109
|
text-indent: -1000em;
|
@@ -114,3 +125,28 @@ table#assets .remove::before,
|
|
114
125
|
#actions .new a::before {
|
115
126
|
background: url('/images/admin/plus.png') no-repeat left bottom;
|
116
127
|
}
|
128
|
+
|
129
|
+
/*
|
130
|
+
Overriding values from jquery.fileupload-ui.css
|
131
|
+
Need higher specificity as that file is only loaded later
|
132
|
+
*/
|
133
|
+
|
134
|
+
html .file_upload {
|
135
|
+
width: auto;
|
136
|
+
height: auto;
|
137
|
+
margin: 1em 0;
|
138
|
+
}
|
139
|
+
|
140
|
+
html .file_upload .buttons {display: none}
|
141
|
+
|
142
|
+
|
143
|
+
html .file_upload,
|
144
|
+
html .file_upload_small,
|
145
|
+
html .file_upload_large {
|
146
|
+
background: #F5F1E2;
|
147
|
+
border-color: #ccc;
|
148
|
+
}
|
149
|
+
|
150
|
+
html .file_upload_highlight {
|
151
|
+
background: lawngreen;
|
152
|
+
}
|
@@ -14,6 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
s.add_dependency 'dragonfly', '~>0.8.2'
|
16
16
|
s.add_dependency 'aws-s3', '~>0.6.2'
|
17
|
+
s.add_dependency 'acts_as_list', '~>0.1.2'
|
17
18
|
|
18
19
|
s.files = `git ls-files`.split("\n")
|
19
20
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radiant-assets-extension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Gerrit Kaiser
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-03-20 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -50,6 +50,22 @@ dependencies:
|
|
50
50
|
version: 0.6.2
|
51
51
|
type: :runtime
|
52
52
|
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: acts_as_list
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 31
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
- 1
|
65
|
+
- 2
|
66
|
+
version: 0.1.2
|
67
|
+
type: :runtime
|
68
|
+
version_requirements: *id003
|
53
69
|
description: Makes Radiant better by adding images!
|
54
70
|
email:
|
55
71
|
- gerrit@gerritkaiser.de
|
@@ -62,14 +78,20 @@ extra_rdoc_files: []
|
|
62
78
|
files:
|
63
79
|
- .gitignore
|
64
80
|
- Gemfile
|
65
|
-
- README
|
81
|
+
- README.rdoc
|
66
82
|
- Rakefile
|
67
83
|
- app/controllers/admin/assets_controller.rb
|
84
|
+
- app/controllers/admin/attachments_controller.rb
|
85
|
+
- app/controllers/admin/upload_handler.rb
|
68
86
|
- app/helpers/assets_helper.rb
|
69
87
|
- app/models/asset.rb
|
70
88
|
- app/models/asset_tags.rb
|
89
|
+
- app/models/attachment.rb
|
90
|
+
- app/views/admin/assets/_attachment.html.erb
|
91
|
+
- app/views/admin/assets/_attachments.html.erb
|
71
92
|
- app/views/admin/assets/_grid.html.erb
|
72
93
|
- app/views/admin/assets/_list.html.erb
|
94
|
+
- app/views/admin/assets/_upload.html.erb
|
73
95
|
- app/views/admin/assets/edit.html.erb
|
74
96
|
- app/views/admin/assets/index.html.erb
|
75
97
|
- app/views/admin/assets/new.html.erb
|
@@ -82,6 +104,10 @@ files:
|
|
82
104
|
- db/migrate/20110224001246_add_images_table.rb
|
83
105
|
- db/migrate/20110225021327_add_caption.rb
|
84
106
|
- db/migrate/20110225023017_rename_model_class.rb
|
107
|
+
- db/migrate/20110225174217_add_caching_columns_to_asset.rb
|
108
|
+
- db/migrate/20110225210821_add_attachment_to_pages.rb
|
109
|
+
- db/migrate/20110225210912_add_timestamps_and_locking_to_assets.rb
|
110
|
+
- db/migrate/20110320152044_add_position_to_attachments.rb
|
85
111
|
- features/support/env.rb
|
86
112
|
- features/support/paths.rb
|
87
113
|
- lib/radiant-assets-extension.rb
|
@@ -101,7 +127,7 @@ has_rdoc: true
|
|
101
127
|
homepage: http://ext.radiantcms.org/extensions/269-assets
|
102
128
|
licenses: []
|
103
129
|
|
104
|
-
post_install_message: "\n Add this to your radiant project with:\n config.gem 'radiant-assets-extension', :version => '0.0.
|
130
|
+
post_install_message: "\n Add this to your radiant project with:\n config.gem 'radiant-assets-extension', :version => '0.0.7'\n "
|
105
131
|
rdoc_options: []
|
106
132
|
|
107
133
|
require_paths:
|