alchemy_cms 2.5.0 → 2.5.1
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/alchemy_cms.gemspec +1 -1
- data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +93 -0
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js +2 -2
- data/app/assets/stylesheets/alchemy/archive.scss +18 -11
- data/app/assets/stylesheets/alchemy/base.scss +4 -0
- data/app/assets/stylesheets/alchemy/form_elements.scss +2 -1
- data/app/assets/stylesheets/alchemy/jquery-ui.scss +1 -0
- data/app/assets/stylesheets/alchemy/menubar.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/tables.scss +1 -0
- data/app/controllers/alchemy/admin/contents_controller.rb +2 -0
- data/app/controllers/alchemy/admin/dashboard_controller.rb +41 -15
- data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
- data/app/controllers/alchemy/admin/pictures_controller.rb +13 -5
- data/app/controllers/alchemy/user_sessions_controller.rb +9 -0
- data/app/helpers/alchemy/admin/base_helper.rb +5 -0
- data/app/helpers/alchemy/admin/essences_helper.rb +1 -0
- data/app/helpers/alchemy/essences_helper.rb +40 -2
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +2 -2
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +2 -0
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +1 -39
- data/app/views/layouts/alchemy/admin.html.erb +1 -1
- data/config/locales/alchemy.de.yml +1 -0
- data/config/locales/alchemy.en.yml +1 -0
- data/lib/alchemy/version.rb +1 -1
- data/spec/views/essences/essence_picture_view_spec.rb +84 -0
- metadata +8 -6
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js +0 -120
data/alchemy_cms.gemspec
CHANGED
@@ -32,7 +32,7 @@ POST_INSTALL
|
|
32
32
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
33
33
|
s.require_paths = ["lib"]
|
34
34
|
|
35
|
-
s.add_runtime_dependency %q<rails>, ["~> 3.2.
|
35
|
+
s.add_runtime_dependency %q<rails>, ["~> 3.2.12"]
|
36
36
|
s.add_runtime_dependency %q<devise>, ["~> 2.2.3"]
|
37
37
|
s.add_runtime_dependency %q<devise-encryptable>, ["~> 0.1.1"]
|
38
38
|
s.add_runtime_dependency %q<awesome_nested_set>, ["~> 2.0"]
|
@@ -0,0 +1,93 @@
|
|
1
|
+
window.Alchemy = {} if typeof(window.Alchemy) is 'undefined'
|
2
|
+
|
3
|
+
Alchemy.ElementsWindow =
|
4
|
+
|
5
|
+
init: (path, options, callback) ->
|
6
|
+
self = Alchemy.ElementsWindow
|
7
|
+
$dialog = $('<div style="display: none" id="alchemyElementWindow"></div>')
|
8
|
+
closeCallback = ->
|
9
|
+
$dialog.dialog "destroy"
|
10
|
+
$("#alchemyElementWindow").remove()
|
11
|
+
Alchemy.ElementsWindow.button.enable()
|
12
|
+
|
13
|
+
self.path = path
|
14
|
+
self.callback = callback
|
15
|
+
$dialog.html Alchemy.getOverlaySpinner(x: 420, y: 300)
|
16
|
+
self.dialog = $dialog
|
17
|
+
$('#main_content').append($dialog)
|
18
|
+
Alchemy.ElementsWindow.currentWindow = $dialog.dialog(
|
19
|
+
modal: false
|
20
|
+
minWidth: 420
|
21
|
+
minHeight: 300
|
22
|
+
height: $(window).height() - 88
|
23
|
+
title: options.texts.title
|
24
|
+
show: "fade"
|
25
|
+
hide: "fade"
|
26
|
+
position:
|
27
|
+
my: "right bottom", at: "right-4px bottom-4px"
|
28
|
+
closeOnEscape: false
|
29
|
+
create: ->
|
30
|
+
$dialog.before Alchemy.ElementsWindow.createToolbar(options.toolbarButtons)
|
31
|
+
|
32
|
+
open: (event, ui) ->
|
33
|
+
Alchemy.ElementsWindow.button.disable()
|
34
|
+
Alchemy.ElementsWindow.reload callback
|
35
|
+
|
36
|
+
beforeClose: ->
|
37
|
+
if Alchemy.isPageDirty()
|
38
|
+
Alchemy.openConfirmWindow
|
39
|
+
title: options.texts.dirtyTitle
|
40
|
+
message: options.texts.dirtyMessage
|
41
|
+
okLabel: options.texts.okLabel
|
42
|
+
cancelLabel: options.texts.cancelLabel
|
43
|
+
okCallback: closeCallback
|
44
|
+
|
45
|
+
false
|
46
|
+
else
|
47
|
+
true
|
48
|
+
|
49
|
+
close: closeCallback
|
50
|
+
)
|
51
|
+
|
52
|
+
button:
|
53
|
+
enable: ->
|
54
|
+
$("div#show_element_window").removeClass("disabled").find("a").removeAttr "tabindex"
|
55
|
+
|
56
|
+
disable: ->
|
57
|
+
$("div#show_element_window").addClass("disabled").find("a").attr "tabindex", "-1"
|
58
|
+
|
59
|
+
toggle: ->
|
60
|
+
if $("div#show_element_window").hasClass("disabled")
|
61
|
+
Alchemy.ElementsWindow.button.enable()
|
62
|
+
else
|
63
|
+
Alchemy.ElementsWindow.button.disable()
|
64
|
+
|
65
|
+
createToolbar: (buttons) ->
|
66
|
+
$toolbar = $("<div id=\"overlay_toolbar\"></div>")
|
67
|
+
btn = undefined
|
68
|
+
i = 0
|
69
|
+
while i < buttons.length
|
70
|
+
btn = buttons[i]
|
71
|
+
$toolbar.append Alchemy.ToolbarButton(
|
72
|
+
buttonTitle: btn.title
|
73
|
+
buttonLabel: btn.label
|
74
|
+
iconClass: btn.iconClass
|
75
|
+
onClick: btn.onClick
|
76
|
+
buttonId: btn.buttonId
|
77
|
+
)
|
78
|
+
i++
|
79
|
+
$toolbar
|
80
|
+
|
81
|
+
reload: ->
|
82
|
+
self = Alchemy.ElementsWindow
|
83
|
+
$.ajax
|
84
|
+
url: self.path
|
85
|
+
success: (data, textStatus, XMLHttpRequest) ->
|
86
|
+
self.dialog.html data
|
87
|
+
Alchemy.Buttons.observe "#alchemyElementWindow"
|
88
|
+
Alchemy.overlayObserver "#alchemyElementWindow"
|
89
|
+
Alchemy.Datepicker "#alchemyElementWindow input.date, #alchemyElementWindow input[type=\"date\"]"
|
90
|
+
self.callback.call() if self.callback
|
91
|
+
|
92
|
+
error: (XMLHttpRequest, textStatus, errorThrown) ->
|
93
|
+
Alchemy.AjaxErrorHandler $dialog, XMLHttpRequest.status, textStatus, errorThrown
|
@@ -22,8 +22,8 @@ if (typeof(Alchemy) === 'undefined') {
|
|
22
22
|
Alchemy.PreviewWindow.currentWindow = $iframe.dialog({
|
23
23
|
modal: false,
|
24
24
|
title: title,
|
25
|
-
width: $(window).width() -
|
26
|
-
height: $(window).height() -
|
25
|
+
width: $(window).width() - 502,
|
26
|
+
height: $(window).height() - 76,
|
27
27
|
minWidth: 600,
|
28
28
|
minHeight: 300,
|
29
29
|
show: "fade",
|
@@ -244,7 +244,7 @@ div#library_sidebar {
|
|
244
244
|
right: 0;
|
245
245
|
width: 232px;
|
246
246
|
padding-top: 96px;
|
247
|
-
padding: 0 4*$default-padding;
|
247
|
+
padding: 84px 4*$default-padding 0 4*$default-padding;
|
248
248
|
height: 100%;
|
249
249
|
z-index: 1;
|
250
250
|
background-color: $light-gray;
|
@@ -257,13 +257,13 @@ div#library_sidebar {
|
|
257
257
|
div#filter_bar {
|
258
258
|
|
259
259
|
.selectboxit {
|
260
|
-
width:
|
260
|
+
width: 192px;
|
261
261
|
}
|
262
262
|
}
|
263
263
|
|
264
264
|
div#tag_list {
|
265
265
|
@include box-sizing(border-box);
|
266
|
-
height:
|
266
|
+
height: 80%;
|
267
267
|
|
268
268
|
.js_filter_field_box {
|
269
269
|
|
@@ -316,23 +316,30 @@ div#tag_list {
|
|
316
316
|
}
|
317
317
|
}
|
318
318
|
|
319
|
-
div#alchemy_window_body
|
320
|
-
|
319
|
+
div#alchemy_window_body {
|
320
|
+
|
321
|
+
#library_sidebar {
|
322
|
+
padding: 0 4*$default-padding;
|
323
|
+
}
|
324
|
+
|
325
|
+
div#tag_list ul {
|
326
|
+
height: 364px;
|
327
|
+
}
|
321
328
|
}
|
322
329
|
|
323
330
|
div#pictures_page_list {
|
324
331
|
|
325
|
-
h2 { margin: 0
|
326
|
-
h3 { padding: 0 }
|
332
|
+
h2 { margin: 0 2*$default-padding }
|
333
|
+
h3 { padding: 0 $default-padding }
|
327
334
|
|
328
335
|
ul.list {
|
329
|
-
height: 100px;
|
336
|
+
max-height: 100px;
|
330
337
|
overflow: auto;
|
331
|
-
margin:
|
338
|
+
margin: 2*$default-margin;
|
332
339
|
background-color: $medium-gray;
|
333
340
|
|
334
|
-
ul { padding: 0
|
341
|
+
ul { padding: 0 $default-padding }
|
335
342
|
}
|
336
343
|
|
337
|
-
li.even, li.odd { padding:
|
344
|
+
li.even, li.odd { padding: $default-padding }
|
338
345
|
}
|
@@ -26,6 +26,9 @@ body {
|
|
26
26
|
background-color: $light-gray;
|
27
27
|
height: 100%;
|
28
28
|
cursor: default;
|
29
|
+
|
30
|
+
// Fix for strange element window offset
|
31
|
+
&.pages.edit { overflow: hidden }
|
29
32
|
}
|
30
33
|
|
31
34
|
h1 {
|
@@ -844,6 +847,7 @@ div#overlay_toolbar {
|
|
844
847
|
background: $medium-gray url('shading.png') repeat-x 0 -42px;
|
845
848
|
border: $default-border;
|
846
849
|
height: 44px;
|
850
|
+
border-top-style: none;
|
847
851
|
border-left-style: none;
|
848
852
|
border-right-style: none;
|
849
853
|
padding: $default-padding;
|
@@ -30,28 +30,54 @@ module Alchemy
|
|
30
30
|
|
31
31
|
private
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
# Returns latest alchemy version.
|
34
|
+
def latest_alchemy_version
|
35
|
+
versions = get_alchemy_versions
|
36
|
+
return '' if versions.blank?
|
37
|
+
# reject any non release version
|
38
|
+
versions.reject! { |v| v =~ /[a-z]/ }
|
39
|
+
versions.sort.last
|
40
|
+
end
|
41
|
+
|
42
|
+
# Get alchemy versions from rubygems or github, if rubygems failes.
|
43
|
+
def get_alchemy_versions
|
44
|
+
# first we try rubygems.org
|
45
|
+
response = query_rubygems
|
40
46
|
if response.code == "200"
|
41
|
-
JSON.parse(response.body)
|
47
|
+
alchemy_versions = JSON.parse(response.body)
|
48
|
+
alchemy_versions.collect { |h| h['number'] }.sort
|
42
49
|
else
|
43
|
-
|
50
|
+
# rubygems.org not available?
|
51
|
+
# then we try github
|
52
|
+
response = query_github
|
53
|
+
if response.code == "200"
|
54
|
+
alchemy_tags = JSON.parse(response.body)
|
55
|
+
alchemy_tags.collect { |h| h['name'] }.sort
|
56
|
+
else
|
57
|
+
# no luck at all?
|
58
|
+
raise UpdateServiceUnavailable
|
59
|
+
end
|
44
60
|
end
|
45
61
|
end
|
46
62
|
|
47
|
-
|
48
|
-
|
49
|
-
|
63
|
+
# Query the RubyGems API for alchemy versions.
|
64
|
+
def query_rubygems
|
65
|
+
make_api_request('https://rubygems.org/api/v1/versions/alchemy_cms.json')
|
50
66
|
end
|
51
67
|
|
52
|
-
|
53
|
-
|
54
|
-
|
68
|
+
# Query the GitHub API for alchemy tags.
|
69
|
+
def query_github
|
70
|
+
make_api_request('https://api.github.com/repos/magiclabs/alchemy_cms/tags')
|
71
|
+
end
|
72
|
+
|
73
|
+
# Make a HTTP API request for given request url.
|
74
|
+
def make_api_request(request_url)
|
75
|
+
url = URI.parse(request_url)
|
76
|
+
request = Net::HTTP::Get.new(url.path)
|
77
|
+
connection = Net::HTTP.new(url.host, url.port)
|
78
|
+
connection.use_ssl = true
|
79
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
80
|
+
connection.request(request)
|
55
81
|
end
|
56
82
|
|
57
83
|
end
|
@@ -105,14 +105,22 @@ module Alchemy
|
|
105
105
|
if request.delete? && params[:picture_ids].present?
|
106
106
|
pictures = Picture.find(params[:picture_ids])
|
107
107
|
names = []
|
108
|
+
not_deletable = []
|
108
109
|
pictures.each do |picture|
|
109
|
-
|
110
|
-
|
111
|
-
|
110
|
+
if picture.deletable?
|
111
|
+
names << picture.name
|
112
|
+
picture.destroy
|
113
|
+
else
|
114
|
+
not_deletable << picture.name
|
115
|
+
end
|
116
|
+
end
|
117
|
+
if not_deletable.any?
|
118
|
+
flash[:warn] = _t("These pictures could not be deleted, because they where in use", :names => not_deletable.to_sentence)
|
119
|
+
else
|
120
|
+
flash[:notice] = _t("Pictures deleted successfully", :names => names.to_sentence)
|
112
121
|
end
|
113
|
-
flash[:notice] = _t("Pictures deleted successfully", :names => names.to_sentence)
|
114
122
|
else
|
115
|
-
flash[:
|
123
|
+
flash[:warn] = _t("Could not delete Pictures")
|
116
124
|
end
|
117
125
|
rescue Exception => e
|
118
126
|
flash[:error] = e.message
|
@@ -53,5 +53,14 @@ module Alchemy
|
|
53
53
|
session[:screen_size] = params[:user_screensize]
|
54
54
|
end
|
55
55
|
|
56
|
+
# Ovewriting the default of Devise
|
57
|
+
def after_sign_out_path_for(resource_or_scope)
|
58
|
+
if request.referer.blank? || request.referer.to_s =~ /admin/
|
59
|
+
root_path
|
60
|
+
else
|
61
|
+
request.referer
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
56
65
|
end
|
57
66
|
end
|
@@ -126,6 +126,7 @@ module Alchemy
|
|
126
126
|
end
|
127
127
|
|
128
128
|
def essence_picture_thumbnail(content, options)
|
129
|
+
return if content.ingredient.blank?
|
129
130
|
image_options = {
|
130
131
|
:size => content.ingredient.cropped_thumbnail_size(content.essence.render_size.blank? ? options[:image_size] : content.essence.render_size),
|
131
132
|
:crop_from => content.essence.crop_from.blank? ? nil : content.essence.crop_from,
|
@@ -134,8 +134,46 @@ module Alchemy
|
|
134
134
|
# :disable_link => true # You can surpress the link of an EssencePicture. Default false
|
135
135
|
#
|
136
136
|
def render_essence_view(content, options = {}, html_options = {})
|
137
|
-
|
138
|
-
|
137
|
+
render_essence(content, :view, {:for_view => options}, html_options)
|
138
|
+
end
|
139
|
+
|
140
|
+
# Renders a essence picture
|
141
|
+
#
|
142
|
+
def render_essence_picture_view(content, options, html_options)
|
143
|
+
options = {:show_caption => true, :disable_link => false}.update(options)
|
144
|
+
return if content.essence.picture.blank?
|
145
|
+
if content.essence.caption.present? && options[:show_caption]
|
146
|
+
caption = content_tag(:figcaption, content.essence.caption, :id => "#{dom_id(content.essence.picture)}_caption", :class => "image_caption")
|
147
|
+
end
|
148
|
+
img_tag = image_tag(
|
149
|
+
show_alchemy_picture_url(content.essence.picture,
|
150
|
+
options.merge(
|
151
|
+
:size => options.delete(:image_size),
|
152
|
+
:crop_from => options[:crop] && !content.essence.crop_from.blank? ? content.essence.crop_from : nil,
|
153
|
+
:crop_size => options[:crop] && !content.essence.crop_size.blank? ? content.essence.crop_size : nil
|
154
|
+
).delete_if { |k, v| v.blank? || k.to_sym == :show_caption || k.to_sym == :disable_link }
|
155
|
+
),
|
156
|
+
{
|
157
|
+
:alt => (content.essence.alt_tag.blank? ? nil : content.essence.alt_tag),
|
158
|
+
:title => (content.essence.title.blank? ? nil : content.essence.title),
|
159
|
+
:class => (caption || content.essence.css_class.blank? ? nil : content.essence.css_class)
|
160
|
+
}.merge(caption ? {} : html_options)
|
161
|
+
)
|
162
|
+
output = caption ? img_tag + caption : img_tag
|
163
|
+
if content.essence.link.present? && !options[:disable_link]
|
164
|
+
output = link_to(url_for(content.essence.link), {
|
165
|
+
:title => content.essence.link_title.blank? ? nil : content.essence.link_title,
|
166
|
+
:target => (content.essence.link_target == "blank" ? "_blank" : nil),
|
167
|
+
'data-link-target' => content.essence.link_target.blank? ? nil : content.essence.link_target
|
168
|
+
}) do
|
169
|
+
output
|
170
|
+
end
|
171
|
+
end
|
172
|
+
if caption
|
173
|
+
content_tag(:figure, output, {class: content.essence.css_class.blank? ? nil : content.essence.css_class}.merge(html_options))
|
174
|
+
else
|
175
|
+
output
|
176
|
+
end
|
139
177
|
end
|
140
178
|
|
141
179
|
end
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<tr>
|
8
8
|
<td class="label"><%= f.label "caption" %></td>
|
9
9
|
<td class="input">
|
10
|
-
<%- if @options[:caption_as_textarea] -%>
|
10
|
+
<%- if @options[:caption_as_textarea] == 'true' -%>
|
11
11
|
<%= f.text_area "caption", :class => 'thin_border' %>
|
12
12
|
<%- else -%>
|
13
13
|
<%= f.text_field "caption", :class => 'thin_border' %>
|
@@ -43,7 +43,7 @@
|
|
43
43
|
</td>
|
44
44
|
</tr>
|
45
45
|
<%- end -%>
|
46
|
-
<%- if @options[:image_float_selector] -%>
|
46
|
+
<%- if @options[:image_float_selector] == 'true' -%>
|
47
47
|
<tr>
|
48
48
|
<td class="label"><%= f.label "css_class" %></td>
|
49
49
|
<td class="select">
|
@@ -2,5 +2,7 @@
|
|
2
2
|
Alchemy.ImageCropper.destroy();
|
3
3
|
Alchemy.closeCurrentWindow();
|
4
4
|
Alchemy.setElementDirty('#element_<%= @content.element.id %>');
|
5
|
+
<% if @content.ingredient %>
|
5
6
|
$('.thumbnail_background img', '#<%= content_dom_id(@content) %>').replaceWith('<%= essence_picture_thumbnail(@content, @options) %>');
|
7
|
+
<% end %>
|
6
8
|
})(jQuery);
|
@@ -1,39 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
<% img_tag = image_tag(
|
4
|
-
show_alchemy_picture_url(content.essence.picture,
|
5
|
-
options.merge(
|
6
|
-
:size => options.delete(:image_size),
|
7
|
-
:crop_from => options[:crop] && !content.essence.crop_from.blank? ? content.essence.crop_from : nil,
|
8
|
-
:crop_size => options[:crop] && !content.essence.crop_size.blank? ? content.essence.crop_size : nil
|
9
|
-
).delete_if { |k,v| v.blank? || k.to_sym == :show_caption || k.to_sym == :disable_link }
|
10
|
-
),
|
11
|
-
{
|
12
|
-
:alt => (content.essence.alt_tag.blank? ? nil : content.essence.alt_tag),
|
13
|
-
:title => (content.essence.title.blank? ? nil : content.essence.title),
|
14
|
-
:class => (content.essence.css_class.blank? ? nil : content.essence.css_class)
|
15
|
-
}.merge(html_options)
|
16
|
-
) %>
|
17
|
-
|
18
|
-
<% if content.essence.caption.present? && options[:show_caption] %>
|
19
|
-
<% caption = content_tag(:figcaption, content.essence.caption, :id => "#{dom_id(content.essence.picture)}_caption", :class => "image_caption") %>
|
20
|
-
<figure>
|
21
|
-
<% end %>
|
22
|
-
|
23
|
-
<% if content.essence.link.blank? || options[:disable_link] %>
|
24
|
-
|
25
|
-
<%= caption ? img_tag + caption : img_tag %>
|
26
|
-
|
27
|
-
<% else %>
|
28
|
-
|
29
|
-
<%= link_to(url_for(content.essence.link), {
|
30
|
-
:title => content.essence.link_title,
|
31
|
-
:target => (content.essence.link_target == "blank" ? "_blank" : nil),
|
32
|
-
'data-link-target' => content.essence.link_target
|
33
|
-
}) do %>
|
34
|
-
<%= caption ? img_tag + caption : img_tag %>
|
35
|
-
<% end %>
|
36
|
-
|
37
|
-
<% end %>
|
38
|
-
<% if caption %></figure><% end %>
|
39
|
-
<% end %>
|
1
|
+
<%= render_essence_picture_view(content, options, html_options) %>
|
@@ -25,7 +25,7 @@
|
|
25
25
|
<%= javascript_include_tag('alchemy/alchemy') %>
|
26
26
|
<%= yield :javascript_includes %>
|
27
27
|
</head>
|
28
|
-
<body id="alchemy">
|
28
|
+
<body id="alchemy" class="<%= body_class %>">
|
29
29
|
<noscript>
|
30
30
|
<h1><%= _t(:javascript_disabled_headline) %></h1>
|
31
31
|
<p><%= _t(:javascript_disabled_text) %></p>
|
@@ -306,6 +306,7 @@ de:
|
|
306
306
|
searchresults_editor_info: "Dieses Element stellt die Suchergebnisse dar. Es Bedarf keinerlei Anpassung."
|
307
307
|
element_dirty_notice: "Dieses Element hat nicht gespeicherte Änderungen. Möchten Sie es wirklich einklappen?"
|
308
308
|
"Tags": "Tags"
|
309
|
+
"These pictures could not be deleted, because they where in use": "Diese Bilder konnten nicht gelöscht werden, da sie in Benutzung sind: %{names}"
|
309
310
|
"This page is locked by %{name}": "Diese Seite wird gerade von %{name} blockiert"
|
310
311
|
"Title": "Titel"
|
311
312
|
"Trash": "Papierkorb"
|
@@ -392,6 +392,7 @@ en:
|
|
392
392
|
successfully_added_element: "Succesfully added new element."
|
393
393
|
successfully_saved_element_position: "Element position updated succesfully."
|
394
394
|
swap_image: "Change image"
|
395
|
+
"These pictures could not be deleted, because they where in use": "These pictures could not be deleted, because they where in use: %{names}"
|
395
396
|
insert_image: "Insert image"
|
396
397
|
swfupload:
|
397
398
|
cancel_uploads: "Cancel uploads"
|
data/lib/alchemy/version.rb
CHANGED
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "essences/_essence_picture_view" do
|
4
|
+
|
5
|
+
let(:essence_picture) { stub_model(Alchemy::EssencePicture, picture: stub_model(Alchemy::Picture), caption: 'This is a cute cat') }
|
6
|
+
let(:content) { stub_model(Alchemy::Content, name: 'image', essence_type: 'EssencePicture', essence: essence_picture) }
|
7
|
+
|
8
|
+
before do
|
9
|
+
ActionView::Base.send(:include, Alchemy::UrlHelper)
|
10
|
+
ActionView::Base.send(:include, Alchemy::EssencesHelper)
|
11
|
+
view.stub!(:configuration).and_return(:jpg)
|
12
|
+
end
|
13
|
+
|
14
|
+
context "with caption" do
|
15
|
+
let(:options) { {show_caption: true} }
|
16
|
+
let(:html_options) { {} }
|
17
|
+
|
18
|
+
subject do
|
19
|
+
render partial: "alchemy/essences/essence_picture_view", locals: {
|
20
|
+
content: content,
|
21
|
+
options: options,
|
22
|
+
html_options: html_options
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should enclose the image in a <figure> element" do
|
27
|
+
should have_selector('figure img')
|
28
|
+
end
|
29
|
+
|
30
|
+
context "and essence with css class" do
|
31
|
+
before { essence_picture.css_class = 'left' }
|
32
|
+
|
33
|
+
it "should have the class on the <figure> element" do
|
34
|
+
should have_selector('figure.left img')
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should not have the class on the <img> element" do
|
38
|
+
should_not have_selector('figure img.left')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "and css class in the html_options" do
|
43
|
+
before { html_options[:class] = 'right' }
|
44
|
+
|
45
|
+
it "should have the class from the html_options on the <figure> element" do
|
46
|
+
should have_selector('figure.right img')
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should not have the class from the essence on the <figure> element" do
|
50
|
+
should_not have_selector('figure.left img')
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should not have the class from the html_options on the <img> element" do
|
54
|
+
should_not have_selector('figure img.right')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "with link" do
|
60
|
+
let(:options) { {} }
|
61
|
+
|
62
|
+
subject do
|
63
|
+
essence_picture.link = '/home'
|
64
|
+
render partial: "alchemy/essences/essence_picture_view", locals: {
|
65
|
+
content: content,
|
66
|
+
options: options,
|
67
|
+
html_options: {}
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should enclose the image in a link tag" do
|
72
|
+
should have_selector('a[href="/home"] img')
|
73
|
+
end
|
74
|
+
|
75
|
+
context "but disabled link option" do
|
76
|
+
before { options[:disable_link] = true }
|
77
|
+
|
78
|
+
it "should not enclose the image in a link tag" do
|
79
|
+
should_not have_selector('a img')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alchemy_cms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2013-02-
|
16
|
+
date: 2013-02-18 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: rails
|
@@ -22,7 +22,7 @@ dependencies:
|
|
22
22
|
requirements:
|
23
23
|
- - ~>
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version: 3.2.
|
25
|
+
version: 3.2.12
|
26
26
|
type: :runtime
|
27
27
|
prerelease: false
|
28
28
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 3.2.
|
33
|
+
version: 3.2.12
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: devise
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
@@ -485,7 +485,7 @@ files:
|
|
485
485
|
- app/assets/javascripts/alchemy/alchemy.dirty.js
|
486
486
|
- app/assets/javascripts/alchemy/alchemy.dragndrop.js
|
487
487
|
- app/assets/javascripts/alchemy/alchemy.element_editor_selector.js
|
488
|
-
- app/assets/javascripts/alchemy/alchemy.elements_window.js
|
488
|
+
- app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee
|
489
489
|
- app/assets/javascripts/alchemy/alchemy.file_progress.js
|
490
490
|
- app/assets/javascripts/alchemy/alchemy.growler.js
|
491
491
|
- app/assets/javascripts/alchemy/alchemy.gui.js.coffee
|
@@ -1001,6 +1001,7 @@ files:
|
|
1001
1001
|
- spec/support/image2.PNG
|
1002
1002
|
- spec/support/image3.jpeg
|
1003
1003
|
- spec/url_helpers_spec.rb
|
1004
|
+
- spec/views/essences/essence_picture_view_spec.rb
|
1004
1005
|
- vendor/assets/images/Jcrop.gif
|
1005
1006
|
- vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js
|
1006
1007
|
- vendor/assets/javascripts/jquery_plugins/jquery.dialogextend.1_0_1.js
|
@@ -1128,7 +1129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1128
1129
|
version: '0'
|
1129
1130
|
segments:
|
1130
1131
|
- 0
|
1131
|
-
hash:
|
1132
|
+
hash: 1217136868404784011
|
1132
1133
|
requirements:
|
1133
1134
|
- ImageMagick (libmagick), v6.6 or greater.
|
1134
1135
|
rubyforge_project:
|
@@ -1265,4 +1266,5 @@ test_files:
|
|
1265
1266
|
- spec/support/image2.PNG
|
1266
1267
|
- spec/support/image3.jpeg
|
1267
1268
|
- spec/url_helpers_spec.rb
|
1269
|
+
- spec/views/essences/essence_picture_view_spec.rb
|
1268
1270
|
has_rdoc:
|
@@ -1,120 +0,0 @@
|
|
1
|
-
if (typeof(Alchemy) === 'undefined') {
|
2
|
-
var Alchemy = {};
|
3
|
-
}
|
4
|
-
|
5
|
-
(function($) {
|
6
|
-
|
7
|
-
var ElementsWindow = {};
|
8
|
-
$.extend(Alchemy, ElementsWindow);
|
9
|
-
|
10
|
-
Alchemy.ElementsWindow = {
|
11
|
-
|
12
|
-
init: function(path, options, callback) {
|
13
|
-
var self = Alchemy.ElementsWindow;
|
14
|
-
var $dialog = $('<div style="display: none" id="alchemyElementWindow"></div>');
|
15
|
-
var closeCallback = function() {
|
16
|
-
$dialog.dialog("destroy");
|
17
|
-
$('#alchemyElementWindow').remove();
|
18
|
-
Alchemy.ElementsWindow.button.enable();
|
19
|
-
};
|
20
|
-
self.path = path;
|
21
|
-
self.callback = callback;
|
22
|
-
$dialog.html(Alchemy.getOverlaySpinner({
|
23
|
-
x: 420,
|
24
|
-
y: 300
|
25
|
-
}));
|
26
|
-
self.dialog = $dialog;
|
27
|
-
Alchemy.ElementsWindow.currentWindow = $dialog.dialog({
|
28
|
-
modal: false,
|
29
|
-
minWidth: 422,
|
30
|
-
minHeight: 300,
|
31
|
-
height: $(window).height() - 90,
|
32
|
-
title: options.texts.title,
|
33
|
-
show: "fade",
|
34
|
-
hide: "fade",
|
35
|
-
position: [$(window).width() - 428, 84],
|
36
|
-
closeOnEscape: false,
|
37
|
-
create: function() {
|
38
|
-
$dialog.before(Alchemy.ElementsWindow.createToolbar(options.toolbarButtons));
|
39
|
-
},
|
40
|
-
open: function(event, ui) {
|
41
|
-
Alchemy.ElementsWindow.button.disable();
|
42
|
-
Alchemy.ElementsWindow.reload(callback);
|
43
|
-
},
|
44
|
-
beforeClose: function() {
|
45
|
-
if (Alchemy.isPageDirty()) {
|
46
|
-
Alchemy.openConfirmWindow({
|
47
|
-
title: options.texts.dirtyTitle,
|
48
|
-
message: options.texts.dirtyMessage,
|
49
|
-
okLabel: options.texts.okLabel,
|
50
|
-
cancelLabel: options.texts.cancelLabel,
|
51
|
-
okCallback: closeCallback
|
52
|
-
});
|
53
|
-
return false;
|
54
|
-
} else {
|
55
|
-
return true;
|
56
|
-
}
|
57
|
-
},
|
58
|
-
close: closeCallback
|
59
|
-
});
|
60
|
-
},
|
61
|
-
|
62
|
-
button: {
|
63
|
-
enable: function() {
|
64
|
-
$('div#show_element_window').
|
65
|
-
removeClass('disabled').
|
66
|
-
find('a').removeAttr('tabindex');
|
67
|
-
},
|
68
|
-
disable: function() {
|
69
|
-
$('div#show_element_window').
|
70
|
-
addClass('disabled').
|
71
|
-
find('a').attr('tabindex', '-1');
|
72
|
-
},
|
73
|
-
toggle: function() {
|
74
|
-
if ($('div#show_element_window').hasClass('disabled')) {
|
75
|
-
Alchemy.ElementsWindow.button.enable();
|
76
|
-
} else {
|
77
|
-
Alchemy.ElementsWindow.button.disable();
|
78
|
-
}
|
79
|
-
}
|
80
|
-
},
|
81
|
-
|
82
|
-
createToolbar: function(buttons) {
|
83
|
-
var $toolbar = $('<div id="overlay_toolbar"></div>'),
|
84
|
-
btn;
|
85
|
-
for (i = 0; i < buttons.length; i++) {
|
86
|
-
btn = buttons[i];
|
87
|
-
$toolbar.append(
|
88
|
-
Alchemy.ToolbarButton({
|
89
|
-
buttonTitle: btn.title,
|
90
|
-
buttonLabel: btn.label,
|
91
|
-
iconClass: btn.iconClass,
|
92
|
-
onClick: btn.onClick,
|
93
|
-
buttonId: btn.buttonId
|
94
|
-
}));
|
95
|
-
}
|
96
|
-
return $toolbar;
|
97
|
-
},
|
98
|
-
|
99
|
-
reload: function() {
|
100
|
-
var self = Alchemy.ElementsWindow;
|
101
|
-
$.ajax({
|
102
|
-
url: self.path,
|
103
|
-
success: function(data, textStatus, XMLHttpRequest) {
|
104
|
-
self.dialog.html(data);
|
105
|
-
Alchemy.Buttons.observe('#alchemyElementWindow');
|
106
|
-
Alchemy.overlayObserver('#alchemyElementWindow');
|
107
|
-
Alchemy.Datepicker('#alchemyElementWindow input.date, #alchemyElementWindow input[type="date"]');
|
108
|
-
if (self.callback) {
|
109
|
-
self.callback.call();
|
110
|
-
}
|
111
|
-
},
|
112
|
-
error: function(XMLHttpRequest, textStatus, errorThrown) {
|
113
|
-
Alchemy.AjaxErrorHandler($dialog, XMLHttpRequest.status, textStatus, errorThrown);
|
114
|
-
}
|
115
|
-
});
|
116
|
-
}
|
117
|
-
|
118
|
-
}
|
119
|
-
|
120
|
-
})(jQuery);
|