alchemy_cms 2.0.rc2 → 2.0.rc3
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/app/controllers/admin/attachments_controller.rb +47 -21
- data/app/controllers/admin/clipboard_controller.rb +2 -0
- data/app/controllers/admin/elements_controller.rb +2 -0
- data/app/controllers/admin/essence_files_controller.rb +7 -6
- data/app/controllers/admin/languages_controller.rb +1 -0
- data/app/controllers/admin/pictures_controller.rb +49 -34
- data/app/controllers/admin/users_controller.rb +2 -0
- data/app/controllers/admin_controller.rb +1 -0
- data/app/controllers/alchemy_controller.rb +9 -0
- data/app/helpers/alchemy_helper.rb +8 -2
- data/app/models/attachment.rb +5 -0
- data/app/models/element.rb +4 -0
- data/app/sweepers/pictures_sweeper.rb +2 -1
- data/app/views/admin/attachments/_archive_overlay.html.erb +25 -0
- data/app/views/admin/attachments/_file_to_assign.html.erb +2 -2
- data/app/views/admin/attachments/create.js.erb +4 -2
- data/app/views/admin/contents/create.js.erb +16 -7
- data/app/views/admin/elements/_add_content.html.erb +1 -3
- data/app/views/admin/essence_files/edit.html.erb +5 -5
- data/app/views/admin/essence_pictures/destroy.js.erb +6 -3
- data/app/views/admin/pages/edit.html.erb +1 -1
- data/app/views/admin/partials/_remote_search_form.html.erb +4 -3
- data/app/views/admin/partials/_upload_form.html.erb +1 -3
- data/app/views/admin/pictures/_archive_overlay.html.erb +18 -0
- data/app/views/admin/pictures/_filter_and_size_bar.html.erb +6 -17
- data/app/views/admin/pictures/_picture.html.erb +14 -16
- data/app/views/admin/pictures/_picture_to_assign.html.erb +27 -29
- data/app/views/admin/pictures/create.js.erb +10 -10
- data/app/views/admin/pictures/index.html.erb +35 -5
- data/app/views/essences/_essence_file_editor.html.erb +4 -4
- data/app/views/essences/_essence_picture_editor.html.erb +2 -2
- data/app/views/essences/_essence_picture_tools.html.erb +1 -3
- data/assets/javascripts/alchemy.js +2 -2
- data/assets/stylesheets/alchemy.css +127 -132
- data/assets/stylesheets/elements.css +19 -39
- data/config/routes.rb +6 -8
- data/lib/alchemy/remote_pagination_link_renderer.rb +12 -1
- data/lib/alchemy/version.rb +1 -1
- data/spec/dummy/public/stylesheets/alchemy/alchemy.css +197 -173
- data/spec/dummy/public/stylesheets/alchemy/elements.css +6 -6
- metadata +6 -8
- data/app/views/admin/attachments/archive_overlay.html.erb +0 -8
- data/app/views/admin/pictures/_archive_overlay_images.html.erb +0 -16
- data/app/views/admin/pictures/archive_overlay.html.erb +0 -3
- data/app/views/admin/pictures/update.js.erb +0 -11
@@ -2,22 +2,33 @@ class Admin::AttachmentsController < AlchemyController
|
|
2
2
|
|
3
3
|
protect_from_forgery :except => [:create]
|
4
4
|
|
5
|
+
before_filter :set_translation
|
5
6
|
filter_access_to :all
|
6
7
|
|
7
8
|
def index
|
8
|
-
|
9
|
-
|
10
|
-
@attachments = Attachment.where(cond).order(:name)
|
9
|
+
if in_overlay?
|
10
|
+
archive_overlay
|
11
11
|
else
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
cond = "name LIKE '%#{params[:query]}%' OR filename LIKE '%#{params[:query]}%'"
|
13
|
+
if params[:per_page] == 'all'
|
14
|
+
@attachments = Attachment.where(cond).order(:name)
|
15
|
+
else
|
16
|
+
@attachments = Attachment.where(cond).paginate(
|
17
|
+
:page => (params[:page] || 1),
|
18
|
+
:per_page => (params[:per_page] || 20)
|
19
|
+
).order(:name)
|
20
|
+
end
|
16
21
|
end
|
17
22
|
end
|
18
23
|
|
19
24
|
def new
|
20
25
|
@attachment = Attachment.new
|
26
|
+
if in_overlay?
|
27
|
+
@while_assigning = true
|
28
|
+
@content = Content.find(params[:content_id], :select => 'id') if !params[:content_id].blank?
|
29
|
+
@swap = params[:swap]
|
30
|
+
@options = hashified_options
|
31
|
+
end
|
21
32
|
render :layout => false
|
22
33
|
end
|
23
34
|
|
@@ -34,7 +45,14 @@ class Admin::AttachmentsController < AlchemyController
|
|
34
45
|
:per_page => (params[:per_page] || 20)
|
35
46
|
).order(:name)
|
36
47
|
end
|
48
|
+
if in_overlay?
|
49
|
+
@while_assigning = true
|
50
|
+
@content = Content.find(params[:content_id], :select => 'id') if !params[:content_id].blank?
|
51
|
+
@swap = params[:swap]
|
52
|
+
@options = hashified_options
|
53
|
+
end
|
37
54
|
@message = _('File %{name} uploaded succesfully') % {:name => @attachment.name}
|
55
|
+
# Are we using the Flash uploader? Or the plain html file uploader?
|
38
56
|
if params[Rails.application.config.session_options[:key]].blank?
|
39
57
|
flash[:notice] = @message
|
40
58
|
redirect_to :action => :index
|
@@ -76,20 +94,6 @@ class Admin::AttachmentsController < AlchemyController
|
|
76
94
|
end
|
77
95
|
end
|
78
96
|
|
79
|
-
def archive_overlay
|
80
|
-
@content = Content.find(params[:content_id])
|
81
|
-
@options = params[:options]
|
82
|
-
if !params[:only].blank?
|
83
|
-
condition = "filename LIKE '%.#{params[:only].join("' OR filename LIKE '%.")}'"
|
84
|
-
elsif !params[:except].blank?
|
85
|
-
condition = "filename NOT LIKE '%.#{params[:except].join("' OR filename NOT LIKE '%.")}'"
|
86
|
-
else
|
87
|
-
condition = ""
|
88
|
-
end
|
89
|
-
@attachments = Attachment.where(condition).order(:name)
|
90
|
-
render :layout => false
|
91
|
-
end
|
92
|
-
|
93
97
|
def show
|
94
98
|
@attachment = Attachment.find(params[:id])
|
95
99
|
send_file(
|
@@ -113,4 +117,26 @@ class Admin::AttachmentsController < AlchemyController
|
|
113
117
|
)
|
114
118
|
end
|
115
119
|
|
120
|
+
private
|
121
|
+
|
122
|
+
def in_overlay?
|
123
|
+
!params[:content_id].blank?
|
124
|
+
end
|
125
|
+
|
126
|
+
def archive_overlay
|
127
|
+
@content = Content.find(params[:content_id])
|
128
|
+
@options = params[:options]
|
129
|
+
if !params[:only].blank?
|
130
|
+
condition = "filename LIKE '%.#{params[:only].join("' OR filename LIKE '%.")}'"
|
131
|
+
elsif !params[:except].blank?
|
132
|
+
condition = "filename NOT LIKE '%.#{params[:except].join("' OR filename NOT LIKE '%.")}'"
|
133
|
+
else
|
134
|
+
condition = ""
|
135
|
+
end
|
136
|
+
@attachments = Attachment.where(condition).order(:name)
|
137
|
+
respond_to do |format|
|
138
|
+
format.html { render :partial => 'archive_overlay' }
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
116
142
|
end
|
@@ -2,6 +2,8 @@ class Admin::ClipboardController < AlchemyController
|
|
2
2
|
|
3
3
|
filter_access_to :all
|
4
4
|
|
5
|
+
before_filter :set_translation
|
6
|
+
|
5
7
|
def index
|
6
8
|
clipboard = get_clipboard(params[:remarkable_type].tableize)
|
7
9
|
@clipboard_items = params[:remarkable_type].classify.constantize.all_from_clipboard(clipboard)
|
@@ -12,8 +12,8 @@ class Admin::EssenceFilesController < AlchemyController
|
|
12
12
|
@essence_file = EssenceFile.find(params[:id])
|
13
13
|
@essence_file.update_attributes(params[:essence_file])
|
14
14
|
render :update do |page|
|
15
|
-
page
|
16
|
-
page
|
15
|
+
page.call "Alchemy.closeCurrentWindow"
|
16
|
+
page.call "Alchemy.reloadPreview"
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -23,11 +23,12 @@ class Admin::EssenceFilesController < AlchemyController
|
|
23
23
|
@content.essence.attachment = @attachment
|
24
24
|
@content.essence.save
|
25
25
|
@content.save
|
26
|
+
@options = params[:options]
|
26
27
|
render :update do |page|
|
27
|
-
page
|
28
|
-
page
|
29
|
-
page
|
30
|
-
page
|
28
|
+
page << "jQuery('##{@content.essence_type.underscore}_#{@content.id}').replaceWith('#{escape_javascript(render(:partial => "essences/essence_file_editor.html.erb", :locals => {:content => @content, :options => @options}))}')"
|
29
|
+
page.call "Alchemy.closeCurrentWindow"
|
30
|
+
page.call "Alchemy.reloadPreview"
|
31
|
+
page.call "Alchemy.setElementDirty", "#element_#{@content.element.id}"
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
@@ -1,29 +1,38 @@
|
|
1
1
|
class Admin::PicturesController < AlchemyController
|
2
2
|
protect_from_forgery :except => [:create]
|
3
3
|
|
4
|
+
before_filter :set_translation
|
5
|
+
|
4
6
|
filter_access_to :all
|
5
7
|
|
6
8
|
cache_sweeper :pictures_sweeper, :only => [:update, :destroy]
|
7
9
|
|
8
10
|
def index
|
11
|
+
@size = params[:size] || 'medium'
|
9
12
|
if params[:per_page] == 'all'
|
10
13
|
@pictures = Picture.where("name LIKE '%#{params[:query]}%'").order(:name)
|
11
14
|
else
|
12
15
|
@pictures = Picture.where("name LIKE '%#{params[:query]}%'").paginate(
|
13
16
|
:page => params[:page] || 1,
|
14
|
-
:per_page =>
|
17
|
+
:per_page => pictures_per_page_for_size(@size)
|
15
18
|
).order(:name)
|
16
19
|
end
|
20
|
+
if in_overlay?
|
21
|
+
archive_overlay
|
22
|
+
else
|
23
|
+
# render index.html.erb
|
24
|
+
end
|
17
25
|
end
|
18
26
|
|
19
27
|
def new
|
20
28
|
@picture = Picture.new
|
21
29
|
@while_assigning = params[:while_assigning] == 'true'
|
22
|
-
|
30
|
+
@size = params[:size] || 'medium'
|
31
|
+
if in_overlay?
|
32
|
+
@while_assigning = true
|
23
33
|
@content = Content.find(params[:content_id], :select => 'id') if !params[:content_id].blank?
|
24
34
|
@element = Element.find(params[:element_id], :select => 'id')
|
25
|
-
@
|
26
|
-
@options = params[:options]
|
35
|
+
@options = hashified_options
|
27
36
|
@page = params[:page]
|
28
37
|
@per_page = params[:per_page]
|
29
38
|
end
|
@@ -34,12 +43,12 @@ class Admin::PicturesController < AlchemyController
|
|
34
43
|
@picture = Picture.new(:image_file => params[:Filedata])
|
35
44
|
@picture.name = @picture.image_filename
|
36
45
|
@picture.save
|
37
|
-
@
|
38
|
-
if
|
46
|
+
@size = params[:size] || 'medium'
|
47
|
+
if in_overlay?
|
48
|
+
@while_assigning = true
|
39
49
|
@content = Content.find(params[:content_id], :select => 'id') if !params[:content_id].blank?
|
40
50
|
@element = Element.find(params[:element_id], :select => 'id')
|
41
|
-
@
|
42
|
-
@options = params[:options]
|
51
|
+
@options = hashified_options
|
43
52
|
@page = params[:page] || 1
|
44
53
|
@per_page = pictures_per_page_for_size(@size)
|
45
54
|
end
|
@@ -48,10 +57,11 @@ class Admin::PicturesController < AlchemyController
|
|
48
57
|
else
|
49
58
|
@pictures = Picture.where("name LIKE '%#{params[:query]}%'").paginate(
|
50
59
|
:page => (params[:page] || 1),
|
51
|
-
:per_page => (
|
60
|
+
:per_page => pictures_per_page_for_size(@size)
|
52
61
|
).order(:name)
|
53
62
|
end
|
54
63
|
@message = _('Picture %{name} uploaded succesfully') % {:name => @picture.name}
|
64
|
+
# Are we using the Flash uploader? Or the plain html file uploader?
|
55
65
|
if params[Rails.application.config.session_options[:key]].blank?
|
56
66
|
flash[:notice] = @message
|
57
67
|
redirect_to :back
|
@@ -60,33 +70,16 @@ class Admin::PicturesController < AlchemyController
|
|
60
70
|
exception_handler(e)
|
61
71
|
end
|
62
72
|
|
63
|
-
def archive_overlay
|
64
|
-
@content = Content.find_by_id(params[:content_id], :select => 'id')
|
65
|
-
@element = Element.find_by_id(params[:element_id], :select => 'id')
|
66
|
-
@size = params[:size] || 'medium'
|
67
|
-
@pictures = Picture.where("name LIKE '%#{params[:query]}%'").paginate(
|
68
|
-
:page => params[:page] || 1,
|
69
|
-
:per_page => pictures_per_page_for_size(@size)
|
70
|
-
).order(:name)
|
71
|
-
@options = params[:options].is_a?(String) ? Rack::Utils.parse_query(params[:options]) : params[:options]
|
72
|
-
respond_to do |format|
|
73
|
-
format.html {
|
74
|
-
render :layout => false
|
75
|
-
}
|
76
|
-
format.js {
|
77
|
-
render :update do |page|
|
78
|
-
page << "jQuery('#alchemy_window_body').html('#{escape_javascript(render(:partial => 'archive_overlay_images'))}')"
|
79
|
-
end
|
80
|
-
}
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
73
|
def update
|
74
|
+
@size = params[:size] || 'medium'
|
85
75
|
@picture = Picture.find(params[:id])
|
86
76
|
oldname = @picture.name
|
87
77
|
@picture.name = params[:name]
|
88
78
|
@picture.save
|
89
79
|
@message = _("Image renamed successfully from: '%{from}' to '%{to}'") % {:from => oldname, :to => @picture.name}
|
80
|
+
render :update do |page|
|
81
|
+
page.call 'Alchemy.growl', @message
|
82
|
+
end
|
90
83
|
rescue Exception => e
|
91
84
|
exception_handler(e)
|
92
85
|
end
|
@@ -121,12 +114,34 @@ private
|
|
121
114
|
|
122
115
|
def pictures_per_page_for_size(size)
|
123
116
|
case size
|
124
|
-
when 'small'
|
125
|
-
|
117
|
+
when 'small'
|
118
|
+
per_page = in_overlay? ? 35 : 55
|
119
|
+
when 'large'
|
120
|
+
per_page = in_overlay? ? 4 : 8
|
126
121
|
else
|
127
|
-
per_page = 12
|
122
|
+
per_page = in_overlay? ? 12 : 18
|
128
123
|
end
|
129
124
|
return per_page
|
130
125
|
end
|
131
|
-
|
126
|
+
|
127
|
+
def in_overlay?
|
128
|
+
!params[:element_id].blank?
|
129
|
+
end
|
130
|
+
|
131
|
+
def archive_overlay
|
132
|
+
@content = Content.find_by_id(params[:content_id], :select => 'id')
|
133
|
+
@element = Element.find_by_id(params[:element_id], :select => 'id')
|
134
|
+
@options = hashified_options
|
135
|
+
respond_to do |format|
|
136
|
+
format.html {
|
137
|
+
render :partial => 'archive_overlay'
|
138
|
+
}
|
139
|
+
format.js {
|
140
|
+
render :update do |page|
|
141
|
+
page << "jQuery('#alchemy_window_body').replaceWith('#{escape_javascript(render(:partial => 'archive_overlay'))}')"
|
142
|
+
end
|
143
|
+
}
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
132
147
|
end
|
@@ -3,6 +3,8 @@ class Admin::UsersController < AlchemyController
|
|
3
3
|
filter_access_to [:edit, :update, :destroy], :attribute_check => true
|
4
4
|
filter_access_to [:index, :new, :create], :attribute_check => false
|
5
5
|
|
6
|
+
before_filter :set_translation
|
7
|
+
|
6
8
|
def index
|
7
9
|
if !params[:query].blank?
|
8
10
|
@users = User.where([
|
@@ -142,6 +142,15 @@ private
|
|
142
142
|
ActionMailer::Base.default_url_options[:host] = request.host_with_port
|
143
143
|
end
|
144
144
|
|
145
|
+
def hashified_options
|
146
|
+
return nil if params[:options].blank?
|
147
|
+
if params[:options].is_a?(String)
|
148
|
+
Rack::Utils.parse_query(params[:options])
|
149
|
+
else
|
150
|
+
params[:options]
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
145
154
|
protected
|
146
155
|
|
147
156
|
def init_gettext#:nodoc:
|
@@ -726,7 +726,7 @@ module AlchemyHelper
|
|
726
726
|
)
|
727
727
|
filter_field << "<label for=\"search_field\">" + _("search") + "</label>"
|
728
728
|
filter_field << "</div>"
|
729
|
-
filter_field
|
729
|
+
filter_field.html_safe
|
730
730
|
end
|
731
731
|
|
732
732
|
def clipboard_select_tag(items, html_options = {})
|
@@ -1180,5 +1180,11 @@ module AlchemyHelper
|
|
1180
1180
|
end
|
1181
1181
|
"Alchemy CMS - #{title}"
|
1182
1182
|
end
|
1183
|
-
|
1183
|
+
|
1184
|
+
def max_image_count
|
1185
|
+
return nil if !@options
|
1186
|
+
image_count = @options[:maximum_amount_of_images] || @options[:max_images]
|
1187
|
+
image_count.to_i unless image_count.blank?
|
1188
|
+
end
|
1189
|
+
|
1184
1190
|
end
|
data/app/models/attachment.rb
CHANGED
@@ -9,9 +9,14 @@ class Attachment < ActiveRecord::Base
|
|
9
9
|
)
|
10
10
|
validates_as_attachment
|
11
11
|
|
12
|
+
def name
|
13
|
+
read_attribute(:name).split('.').first
|
14
|
+
end
|
15
|
+
|
12
16
|
def extension
|
13
17
|
filename.split(".").last
|
14
18
|
end
|
19
|
+
alias_method :suffix, :extension
|
15
20
|
|
16
21
|
def icon_css_class
|
17
22
|
case content_type
|
data/app/models/element.rb
CHANGED
@@ -263,6 +263,10 @@ class Element < ActiveRecord::Base
|
|
263
263
|
content.ingredient
|
264
264
|
end
|
265
265
|
|
266
|
+
def has_ingredient?(name)
|
267
|
+
!self.ingredient(name).blank?
|
268
|
+
end
|
269
|
+
|
266
270
|
def save_contents(params)
|
267
271
|
contents.each do |content|
|
268
272
|
unless content.save_essence(params[:contents]["content_#{content.id}"], :public => !params["public"].nil?)
|
@@ -12,9 +12,10 @@ class PicturesSweeper < ActionController::Caching::Sweeper
|
|
12
12
|
private
|
13
13
|
|
14
14
|
def expire_cache_for(picture)
|
15
|
+
# Removing all variants of the picture with FileUtils.
|
15
16
|
FileUtils.rm_rf("#{Rails.root}/public/pictures/show/#{picture.id}")
|
16
17
|
FileUtils.rm_rf("#{Rails.root}/public/pictures/thumbnails/#{picture.id}")
|
17
|
-
expire_page(
|
18
|
+
expire_page(zoom_picture_path(picture, :format => 'png'))
|
18
19
|
end
|
19
20
|
|
20
21
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<div id="alchemy_window_body">
|
2
|
+
<div id="overlay_toolbar">
|
3
|
+
<div class="button_with_label">
|
4
|
+
<%= link_to_overlay_window(
|
5
|
+
content_tag('span', '', :class => 'icon upload'),
|
6
|
+
new_admin_attachment_path(
|
7
|
+
:content_id => @content.blank? ? nil : @content.id,
|
8
|
+
:swap => @swap,
|
9
|
+
:options => @options
|
10
|
+
),
|
11
|
+
{
|
12
|
+
:title => _('upload_file'),
|
13
|
+
:size => '540x480'
|
14
|
+
},
|
15
|
+
:title => _('upload_file'),
|
16
|
+
:class => 'icon_button'
|
17
|
+
) %><br />
|
18
|
+
<label><%= _('upload_file') %></label>
|
19
|
+
</div>
|
20
|
+
<%= js_filter_field(:onkeyup => "Alchemy.ListFilter('.assign_file_file')") %>
|
21
|
+
</div>
|
22
|
+
<div id="assign_file_list" class="with_padding">
|
23
|
+
<%= render :partial => 'file_to_assign', :collection => @attachments %>
|
24
|
+
</div>
|
25
|
+
</div>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
prefix = "<div class=\"assign_file_file_icon\">"
|
3
3
|
suffix = "</div><div class=\"assign_file_file_name\">#{file_to_assign.filename}</div>"
|
4
4
|
-%>
|
5
|
-
<%- img_tag = "#{prefix}#{render_icon(file_to_assign.icon_css_class)}#{suffix}" -%>
|
5
|
+
<%- img_tag = "#{prefix}#{render_icon(file_to_assign.icon_css_class)}#{suffix}".html_safe -%>
|
6
6
|
<div class="assign_file_file" name="<%= file_to_assign.filename %>">
|
7
7
|
<%= link_to(
|
8
8
|
img_tag,
|
@@ -14,7 +14,7 @@
|
|
14
14
|
:options => @options
|
15
15
|
},
|
16
16
|
:remote => true,
|
17
|
-
:method => '
|
17
|
+
:method => 'put',
|
18
18
|
:title => file_to_assign.filename
|
19
19
|
) %>
|
20
20
|
</div>
|