radiant-assets-extension 0.0.6 → 0.0.7
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.
- 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:
|