alchemy_cms 2.1.beta5 → 2.1.beta6
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/README.md +14 -0
- data/alchemy_cms.gemspec +1 -1
- data/app/assets/javascripts/alchemy/alchemy.base.js +8 -2
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.erb +1 -1
- data/app/assets/javascripts/alchemy/alchemy.link_overlay.js +1 -10
- data/app/assets/javascripts/alchemy/alchemy.routes.js.erb +9 -9
- data/app/assets/stylesheets/alchemy/base.css.scss +68 -66
- data/app/assets/stylesheets/alchemy/elements.css.scss +3 -2
- data/app/assets/stylesheets/alchemy/jquery-ui.alchemy.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +1 -1
- data/app/controllers/alchemy/admin/base_controller.rb +1 -1
- data/app/controllers/alchemy/admin/contents_controller.rb +1 -1
- data/app/controllers/alchemy/admin/elements_controller.rb +2 -1
- data/app/controllers/alchemy/admin/pages_controller.rb +18 -8
- data/app/controllers/alchemy/admin/resources_controller.rb +1 -1
- data/app/controllers/alchemy/pages_controller.rb +14 -2
- data/app/helpers/alchemy/admin/base_helper.rb +2 -2
- data/app/helpers/alchemy/admin/elements_helper.rb +1 -1
- data/app/helpers/alchemy/admin/essences_helper.rb +1 -1
- data/app/helpers/alchemy/base_helper.rb +0 -8
- data/app/helpers/alchemy/essences_helper.rb +1 -2
- data/app/helpers/alchemy/pages_helper.rb +3 -3
- data/app/models/alchemy/content.rb +27 -3
- data/app/models/alchemy/element.rb +2 -2
- data/app/models/alchemy/page.rb +4 -4
- data/app/models/alchemy/user.rb +5 -1
- data/app/views/alchemy/admin/clipboard/insert.js.erb +9 -9
- data/app/views/alchemy/admin/dashboard/index.html.erb +1 -1
- data/app/views/alchemy/admin/elements/create.js.erb +26 -19
- data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +4 -4
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
- data/app/views/alchemy/admin/layoutpages/index.html.erb +1 -14
- data/app/views/alchemy/admin/pages/_external_link.html.erb +3 -13
- data/app/views/alchemy/admin/pages/index.html.erb +1 -14
- data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +22 -0
- data/app/views/alchemy/admin/partials/_pagination_links.html.erb +3 -1
- data/app/views/alchemy/admin/pictures/update.js.erb +2 -0
- data/app/views/alchemy/admin/trash/index.html.erb +1 -1
- data/app/views/alchemy/admin/users/_user.html.erb +1 -1
- data/config/locales/alchemy.de.yml +29 -17
- data/config/locales/alchemy.en.yml +5 -4
- data/lib/alchemy/capistrano.rb +5 -0
- data/lib/alchemy/i18n.rb +1 -1
- data/lib/alchemy/page_layout.rb +1 -1
- data/lib/alchemy/scoped_pagination_link_renderer.rb +27 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +1 -1
- data/spec/controllers/admin/contents_controller_spec.rb +19 -0
- data/spec/controllers/admin/pages_controller_spec.rb +19 -0
- data/spec/controllers/base_controller_spec.rb +1 -1
- data/spec/controllers/pages_controller_spec.rb +62 -0
- data/spec/dummy/app/views/layouts/.gitkeep +0 -0
- data/spec/integration/admin/pages_controller_spec.rb +42 -13
- data/spec/integration/pages_controller_spec.rb +2 -2
- data/spec/models/content_spec.rb +40 -0
- data/spec/models/element_spec.rb +50 -0
- data/spec/models/page_spec.rb +45 -1
- data/spec/routing_spec.rb +27 -29
- data/spec/spec_helper.rb +2 -2
- metadata +40 -36
- data/spec/dummy/app/views/layouts/application.html.erb +0 -14
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -76,6 +76,20 @@ Start the local server:
|
|
76
76
|
|
77
77
|
Then just switch to your browser and open `http://localhost:3000`
|
78
78
|
|
79
|
+
Upgrading
|
80
|
+
------------
|
81
|
+
|
82
|
+
Projects running with Alchemy CMS version < 2.1 needs to be upgraded.
|
83
|
+
|
84
|
+
Otherwise errors will be raised like this:
|
85
|
+
`uninitialized constant EssenceText`
|
86
|
+
|
87
|
+
You have to use the following Upgrade-Task.
|
88
|
+
Run in terminal:
|
89
|
+
|
90
|
+
rake alchemy:upgrade
|
91
|
+
|
92
|
+
|
79
93
|
Add to existing Rails project
|
80
94
|
-----------------------------
|
81
95
|
|
data/alchemy_cms.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
s.add_runtime_dependency(%q<magiclabs-userstamp>, ["~> 2.0.2"])
|
31
31
|
s.add_runtime_dependency(%q<dynamic_form>, ["~> 1.1"])
|
32
32
|
s.add_runtime_dependency(%q<jquery-rails>, ["~> 1.0.16"])
|
33
|
-
s.add_runtime_dependency(%q<attachment_magic>, ["~> 0.2"])
|
33
|
+
s.add_runtime_dependency(%q<attachment_magic>, ["~> 0.2.1"])
|
34
34
|
|
35
35
|
s.add_development_dependency(%q<rspec-rails>, ["~> 2.7"])
|
36
36
|
s.add_development_dependency(%q<sqlite3>)
|
@@ -27,7 +27,8 @@ if (typeof(Alchemy) === 'undefined') {
|
|
27
27
|
url: Alchemy.routes.admin_picture_path(id),
|
28
28
|
type: 'PUT',
|
29
29
|
data: {
|
30
|
-
name: value
|
30
|
+
name: value,
|
31
|
+
size: Alchemy.getUrlParam('size')
|
31
32
|
}
|
32
33
|
});
|
33
34
|
return false;
|
@@ -211,8 +212,13 @@ if (typeof(Alchemy) === 'undefined') {
|
|
211
212
|
console.debug(e);
|
212
213
|
console.trace();
|
213
214
|
}
|
215
|
+
},
|
216
|
+
|
217
|
+
getUrlParam : function(name){
|
218
|
+
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
|
219
|
+
return results[1] || 0;
|
214
220
|
}
|
215
|
-
|
221
|
+
|
216
222
|
});
|
217
223
|
|
218
224
|
})(jQuery);
|
@@ -71,7 +71,7 @@ if (typeof(Alchemy) === 'undefined') {
|
|
71
71
|
tolerance: 'pointer',
|
72
72
|
containment: 'parent',
|
73
73
|
update: function(event, ui) {
|
74
|
-
var ids = $.map($(
|
74
|
+
var ids = $.map($(this).children('div.dragable_picture'), function (child) {
|
75
75
|
return child.id.replace(/essence_picture_/, '');
|
76
76
|
});
|
77
77
|
$(event.originalTarget).css("cursor", "progress");
|
@@ -144,16 +144,7 @@ if (typeof(Alchemy) === 'undefined') {
|
|
144
144
|
// Handling an external link.
|
145
145
|
if (link.className == 'external') {
|
146
146
|
$('#overlay_tabs').tabs("select", '#overlay_tab_external_link');
|
147
|
-
|
148
|
-
$('#url_protocol option').map(function() {
|
149
|
-
protocols.push($(this).attr('value'));
|
150
|
-
});
|
151
|
-
$(protocols).each(function(index, value) {
|
152
|
-
if (link.href.beginsWith(value)) {
|
153
|
-
$('#external_url').val(link.href.replace(value, ""));
|
154
|
-
$('#url_protocol').val(value);
|
155
|
-
}
|
156
|
-
});
|
147
|
+
$('#external_url').val(link.href);
|
157
148
|
}
|
158
149
|
|
159
150
|
// Handling a file link.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
// This object provides dynamically generated Rails routes in Javascript.
|
2
2
|
// A little bit hacky, but the best solution so far. ^_^
|
3
|
-
<%
|
3
|
+
<% self.class.send(:include, Alchemy::Engine.routes.url_helpers) %>
|
4
4
|
if (typeof(Alchemy) === 'undefined') {
|
5
5
|
var Alchemy = {};
|
6
6
|
}
|
@@ -13,25 +13,25 @@ if (typeof(Alchemy) === 'undefined') {
|
|
13
13
|
Alchemy.routes = {
|
14
14
|
|
15
15
|
admin_picture_path: function(id) {
|
16
|
-
return '<%=
|
16
|
+
return '<%= admin_picture_path(:id => 1) %>'.replace(/1/, id);
|
17
17
|
},
|
18
18
|
|
19
19
|
admin_trash_path : function(page_id) {
|
20
|
-
var url = '<%=
|
20
|
+
var url = '<%= admin_trash_path %>';
|
21
21
|
if (page_id)
|
22
22
|
url += '?page_id=' + page_id;
|
23
23
|
return url;
|
24
24
|
},
|
25
25
|
|
26
26
|
fold_admin_element_path: function(id) {
|
27
|
-
return '<%=
|
27
|
+
return '<%= fold_admin_element_path(:id => 1) %>'.replace(/1/, id);
|
28
28
|
},
|
29
29
|
|
30
|
-
list_admin_elements_path: '<%=
|
31
|
-
order_admin_contents_path: '<%=
|
32
|
-
order_admin_elements_path: '<%=
|
33
|
-
order_admin_pages_path: '<%=
|
34
|
-
link_admin_pages_path: '<%=
|
30
|
+
list_admin_elements_path: '<%= list_admin_elements_path %>',
|
31
|
+
order_admin_contents_path: '<%= order_admin_contents_path %>',
|
32
|
+
order_admin_elements_path: '<%= order_admin_elements_path %>',
|
33
|
+
order_admin_pages_path: '<%= order_admin_pages_path %>',
|
34
|
+
link_admin_pages_path: '<%= link_admin_pages_path %>'
|
35
35
|
|
36
36
|
}
|
37
37
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
@import "defaults";
|
1
|
+
@import "alchemy/defaults";
|
2
2
|
|
3
3
|
html {
|
4
4
|
height: 100%;
|
@@ -1282,18 +1282,18 @@ div#user_list_legend {
|
|
1282
1282
|
}
|
1283
1283
|
|
1284
1284
|
#toolbar div.button_with_label form label {
|
1285
|
-
margin-top:
|
1285
|
+
margin-top: $default-margin;
|
1286
1286
|
}
|
1287
1287
|
|
1288
1288
|
#toolbar div.search_field {
|
1289
1289
|
position: relative;
|
1290
1290
|
float: left;
|
1291
|
-
margin-bottom:
|
1291
|
+
margin-bottom: $default-margin;
|
1292
1292
|
}
|
1293
1293
|
|
1294
1294
|
#toolbar div p {
|
1295
1295
|
float: right;
|
1296
|
-
margin: 3px
|
1296
|
+
margin: 3px $default-margin 0 0;
|
1297
1297
|
padding: 0;
|
1298
1298
|
}
|
1299
1299
|
|
@@ -1303,8 +1303,8 @@ div#toolbar div.toolbar_spacer {
|
|
1303
1303
|
height: 37px;
|
1304
1304
|
border-right-style: dotted;
|
1305
1305
|
border-right-width: 1px;
|
1306
|
-
margin-right:
|
1307
|
-
margin-left:
|
1306
|
+
margin-right: 2*$default-margin;
|
1307
|
+
margin-left: $default-margin;
|
1308
1308
|
}
|
1309
1309
|
|
1310
1310
|
div#toolbar a.button {
|
@@ -2484,23 +2484,65 @@ div.button_with_label {
|
|
2484
2484
|
margin-left: 8px;
|
2485
2485
|
float: left;
|
2486
2486
|
min-width: 70px;
|
2487
|
-
|
2488
|
-
|
2489
|
-
|
2490
|
-
|
2491
|
-
|
2492
|
-
|
2493
|
-
|
2494
|
-
|
2495
|
-
|
2496
|
-
|
2497
|
-
|
2498
|
-
}
|
2499
|
-
|
2500
|
-
|
2501
|
-
|
2502
|
-
|
2503
|
-
|
2487
|
+
line-height: 0;
|
2488
|
+
|
2489
|
+
&.active {
|
2490
|
+
.icon_button {
|
2491
|
+
background-color: #cdd6db;
|
2492
|
+
border-style: inset;
|
2493
|
+
border-color: #bfbfbf;
|
2494
|
+
}
|
2495
|
+
label {
|
2496
|
+
color: black;
|
2497
|
+
text-shadow: white 0 0 2px;
|
2498
|
+
}
|
2499
|
+
}
|
2500
|
+
|
2501
|
+
.disabledButton {
|
2502
|
+
position: absolute;
|
2503
|
+
top: 0;
|
2504
|
+
left: 0;
|
2505
|
+
width: 100%;
|
2506
|
+
height: 100%;
|
2507
|
+
z-index: 1;
|
2508
|
+
}
|
2509
|
+
|
2510
|
+
a.icon_button {
|
2511
|
+
float: none;
|
2512
|
+
margin-right: auto;
|
2513
|
+
margin-left: auto;
|
2514
|
+
display: inline-block;
|
2515
|
+
position: relative;
|
2516
|
+
}
|
2517
|
+
|
2518
|
+
&.disabled {
|
2519
|
+
position: relative;
|
2520
|
+
@include opacity(50);
|
2521
|
+
cursor: default;
|
2522
|
+
|
2523
|
+
a:hover, a:active {
|
2524
|
+
cursor: default;
|
2525
|
+
background-color: #f7f7f7;
|
2526
|
+
border: 1px solid #9a9a9a;
|
2527
|
+
}
|
2528
|
+
|
2529
|
+
&:before {
|
2530
|
+
content: '';
|
2531
|
+
position: absolute;
|
2532
|
+
z-index: 1;
|
2533
|
+
width: 100%;
|
2534
|
+
height: 100%;
|
2535
|
+
background-color: transparent;
|
2536
|
+
@include opacity(50);
|
2537
|
+
}
|
2538
|
+
|
2539
|
+
&:hover label {
|
2540
|
+
color: $text-color;
|
2541
|
+
cursor: default;
|
2542
|
+
}
|
2543
|
+
|
2544
|
+
}
|
2545
|
+
|
2504
2546
|
}
|
2505
2547
|
|
2506
2548
|
.icon_button.disabled span {
|
@@ -2515,50 +2557,10 @@ div.button_with_label.disabled {
|
|
2515
2557
|
cursor: default;
|
2516
2558
|
}
|
2517
2559
|
|
2518
|
-
div
|
2519
|
-
content: '';
|
2520
|
-
position: absolute;
|
2521
|
-
z-index: 1;
|
2522
|
-
width: 100%;
|
2523
|
-
height: 100%;
|
2524
|
-
background-color: transparent;
|
2525
|
-
@include opacity(50);
|
2526
|
-
}
|
2527
|
-
|
2528
|
-
div.button_with_label.disabled a:hover,
|
2529
|
-
div.button_with_label.disabled a:active {
|
2530
|
-
cursor: default;
|
2531
|
-
background-color: #f7f7f7;
|
2532
|
-
border: 1px solid #9a9a9a;
|
2533
|
-
}
|
2534
|
-
|
2535
|
-
div.button_with_label.disabled:hover label {
|
2536
|
-
color: $text-color;
|
2537
|
-
cursor: default;
|
2538
|
-
}
|
2539
|
-
|
2540
|
-
div.button_with_label .disabledButton {
|
2541
|
-
position: absolute;
|
2542
|
-
top: 0;
|
2543
|
-
left: 0;
|
2544
|
-
width: 100%;
|
2545
|
-
height: 100%;
|
2546
|
-
z-index: 1;
|
2547
|
-
}
|
2548
|
-
|
2549
|
-
div.button_with_label a.icon_button {
|
2550
|
-
float: none;
|
2551
|
-
margin-right: auto;
|
2552
|
-
margin-left: auto;
|
2553
|
-
display: inline-block;
|
2554
|
-
position: relative;
|
2555
|
-
}
|
2556
|
-
|
2557
|
-
div#toolbar label,
|
2558
|
-
div#overlay_toolbar label {
|
2560
|
+
div#toolbar label, div#overlay_toolbar label {
|
2559
2561
|
font-size: 10px;
|
2560
2562
|
text-shadow: #fff 0 1px 2px;
|
2561
|
-
margin-top:
|
2563
|
+
margin-top: $default-margin;
|
2562
2564
|
display: block;
|
2563
2565
|
line-height: 13px;
|
2564
2566
|
}
|
@@ -2572,7 +2574,7 @@ div.button_with_label:hover label {
|
|
2572
2574
|
padding: $default-padding;
|
2573
2575
|
border: 1px solid #9a9a9a;
|
2574
2576
|
@include rounded-corner;
|
2575
|
-
margin-right:
|
2577
|
+
margin-right: $default-margin;
|
2576
2578
|
background: #fff image-url('alchemy/shading.png') repeat-x 0 -75px;
|
2577
2579
|
text-decoration: none;
|
2578
2580
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
@import "defaults";
|
1
|
+
@import "alchemy/defaults";
|
2
2
|
|
3
3
|
#alchemy div.content_editor input.text_with_icon.auto_resize.thin_border {
|
4
4
|
padding-right: 52px;
|
@@ -426,7 +426,7 @@ a.icon_button.linked {
|
|
426
426
|
cursor: default;
|
427
427
|
}
|
428
428
|
|
429
|
-
div.
|
429
|
+
div.essence_picture_editor {
|
430
430
|
position: relative;
|
431
431
|
float: left;
|
432
432
|
margin: 0;
|
@@ -444,6 +444,7 @@ div.essence_picture_editor.validation_failed .picture_thumbnail {
|
|
444
444
|
border-color: #931f23;
|
445
445
|
-webkit-box-shadow: #931f23 0px 1px 3px;
|
446
446
|
-moz-box-shadow: #931f23 0px 1px 3px;
|
447
|
+
-ms-box-shadow: #931f23 0px 1px 3px;
|
447
448
|
-o-box-shadow: #931f23 0px 1px 3px;
|
448
449
|
box-shadow: #931f23 0px 1px 3px;
|
449
450
|
}
|
@@ -42,8 +42,9 @@ module Alchemy
|
|
42
42
|
source_element = Element.find(element_from_clipboard[:id])
|
43
43
|
@element = Element.copy(source_element, {:page_id => @page.id})
|
44
44
|
if element_from_clipboard[:action] == 'cut'
|
45
|
-
source_element.
|
45
|
+
@cutted_element_id = source_element.id
|
46
46
|
@clipboard.delete_if { |i| i[:id].to_i == source_element.id }
|
47
|
+
source_element.destroy
|
47
48
|
end
|
48
49
|
else
|
49
50
|
@element = Element.new_from_scratch(params[:element])
|
@@ -54,7 +54,7 @@ module Alchemy
|
|
54
54
|
else
|
55
55
|
page = Page.create(params[:page])
|
56
56
|
end
|
57
|
-
render_errors_or_redirect(page, parent.layoutpage? ? admin_layoutpages_path : admin_pages_path, t("Page created
|
57
|
+
render_errors_or_redirect(page, parent.layoutpage? ? admin_layoutpages_path : admin_pages_path, t("Page created", :name => page.name), 'form#new_page_form button.button')
|
58
58
|
end
|
59
59
|
|
60
60
|
# Edit the content of the page and all its elements and contents.
|
@@ -210,7 +210,7 @@ module Alchemy
|
|
210
210
|
|
211
211
|
def switch_language
|
212
212
|
set_language_from(params[:language_id])
|
213
|
-
redirect_path =
|
213
|
+
redirect_path = request.referer.include?('admin/layoutpages') ? admin_layoutpages_path : admin_pages_path
|
214
214
|
if request.xhr?
|
215
215
|
@redirect_url = redirect_path
|
216
216
|
render :action => :redirect
|
@@ -240,12 +240,22 @@ module Alchemy
|
|
240
240
|
|
241
241
|
def expire_page(page)
|
242
242
|
return if page.do_not_sweep
|
243
|
-
expire_action
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
)
|
243
|
+
# TODO: We should change this back to expire_action after Rails 3.2 was released.
|
244
|
+
# expire_action(
|
245
|
+
# alchemy.show_page_url(
|
246
|
+
# :urlname => page.urlname_was,
|
247
|
+
# :lang => multi_language? ? page.language_code : nil
|
248
|
+
# )
|
249
|
+
# )
|
250
|
+
# Temporarily fix for Rails 3 bug
|
251
|
+
expire_fragment(ActionController::Caching::Actions::ActionCachePath.new(
|
252
|
+
self,
|
253
|
+
alchemy.show_page_url(
|
254
|
+
:urlname => page.urlname_was,
|
255
|
+
:lang => multi_language? ? page.language_code : nil
|
256
|
+
),
|
257
|
+
false
|
258
|
+
).path)
|
249
259
|
end
|
250
260
|
|
251
261
|
end
|