alchemy_cms 2.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -1
- data/app/controllers/admin/clipboard_controller.rb +2 -2
- data/app/controllers/admin/elements_controller.rb +37 -25
- data/app/controllers/admin/trash_controller.rb +2 -0
- data/app/helpers/admin/elements_helper.rb +16 -23
- data/app/helpers/alchemy_helper.rb +15 -0
- data/app/models/cell.rb +4 -8
- data/app/models/element.rb +16 -11
- data/app/models/page.rb +24 -26
- data/app/views/admin/elements/_element.html.erb +1 -1
- data/app/views/admin/elements/_new_element_form.html.erb +1 -1
- data/app/views/admin/elements/create.js.erb +7 -3
- data/app/views/admin/elements/destroy.js.erb +1 -1
- data/app/views/admin/elements/fold.js.erb +6 -4
- data/app/views/admin/elements/index.html.erb +2 -2
- data/app/views/admin/elements/trash.js.erb +1 -1
- data/app/views/admin/elements/update.js.erb +2 -2
- data/app/views/admin/trash/index.html.erb +1 -3
- data/assets/javascripts/alchemy.js +14 -3
- data/lib/alchemy/page_layout.rb +0 -3
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/templates/alchemy.rb +1 -1
- data/locale/de/alchemy.po +5 -5
- data/spec/helpers/elements_helper_spec.rb +1 -1
- data/spec/models/page_spec.rb +22 -1
- metadata +2 -2
data/.travis.yml
CHANGED
@@ -16,7 +16,7 @@ class Admin::ClipboardController < AlchemyController
|
|
16
16
|
@clipboard = get_clipboard(params[:remarkable_type].tableize)
|
17
17
|
@item = params[:remarkable_type].classify.constantize.find(params[:remarkable_id])
|
18
18
|
unless @clipboard.include?(params[:remarkable_id])
|
19
|
-
@clipboard.push(params[:remarkable_id])
|
19
|
+
@clipboard.push({:id => params[:remarkable_id], :action => params[:remove] ? 'cut' : 'copy'})
|
20
20
|
end
|
21
21
|
respond_to do |format|
|
22
22
|
format.js
|
@@ -28,7 +28,7 @@ class Admin::ClipboardController < AlchemyController
|
|
28
28
|
def remove
|
29
29
|
@clipboard = get_clipboard(params[:remarkable_type].tableize)
|
30
30
|
@item = params[:remarkable_type].classify.constantize.find(params[:remarkable_id])
|
31
|
-
@clipboard.
|
31
|
+
@clipboard.delete_if { |i| i[:id] == params[:remarkable_id] }
|
32
32
|
respond_to do |format|
|
33
33
|
format.js
|
34
34
|
end
|
@@ -10,7 +10,7 @@ class Admin::ElementsController < AlchemyController
|
|
10
10
|
@page = Page.find(params[:page_id], :include => {:elements => :contents})
|
11
11
|
@cells = @page.cells
|
12
12
|
if @cells.blank?
|
13
|
-
@elements = @page.elements
|
13
|
+
@elements = @page.elements.not_trashed
|
14
14
|
else
|
15
15
|
@elements = @page.elements_grouped_by_cells
|
16
16
|
end
|
@@ -37,28 +37,20 @@ class Admin::ElementsController < AlchemyController
|
|
37
37
|
end
|
38
38
|
|
39
39
|
# Creates a element as discribed in config/alchemy/elements.yml on page via AJAX.
|
40
|
-
# If a Ferret::FileNotFoundError raises we catch it and rebuilding the index.
|
41
40
|
def create
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# if page has cells, put element in cell
|
56
|
-
if @page.has_cells?
|
57
|
-
if cell_definition
|
58
|
-
@cell = @page.cells.find_or_create_by_name(cell_definition['name'])
|
59
|
-
end
|
60
|
-
@element.cell = @cell
|
61
|
-
end
|
41
|
+
@page = Page.find(params[:element][:page_id])
|
42
|
+
@paste_from_clipboard = !params[:paste_from_clipboard].blank?
|
43
|
+
if @paste_from_clipboard
|
44
|
+
source_element = Element.find(element_from_clipboard[:id])
|
45
|
+
@element = Element.copy(source_element, {:page_id => @page.id})
|
46
|
+
if element_from_clipboard[:action] == 'cut'
|
47
|
+
source_element.destroy
|
48
|
+
@clipboard.delete_if { |i| i[:id].to_i == source_element.id }
|
49
|
+
end
|
50
|
+
else
|
51
|
+
@element = Element.new_from_scratch(params[:element])
|
52
|
+
end
|
53
|
+
put_element_in_cell if @page.can_have_cells?
|
62
54
|
@element.page = @page
|
63
55
|
if @element.save
|
64
56
|
render :action => :create
|
@@ -113,11 +105,12 @@ class Admin::ElementsController < AlchemyController
|
|
113
105
|
end
|
114
106
|
|
115
107
|
def order
|
116
|
-
page = Page.find(params[:page_id])
|
117
108
|
params[:element_ids].each do |element_id|
|
118
109
|
element = Element.find(element_id)
|
119
110
|
if element.trashed?
|
120
|
-
|
111
|
+
element.page_id = params[:page_id]
|
112
|
+
element.cell_id = params[:cell_id] if params[:cell_id]
|
113
|
+
element.position = 1
|
121
114
|
end
|
122
115
|
element.move_to_bottom
|
123
116
|
end
|
@@ -129,9 +122,28 @@ class Admin::ElementsController < AlchemyController
|
|
129
122
|
@element = Element.find(params[:id])
|
130
123
|
@page = @element.page
|
131
124
|
@element.folded = !@element.folded
|
132
|
-
|
125
|
+
@element.save
|
133
126
|
rescue Exception => e
|
134
127
|
exception_handler(e)
|
135
128
|
end
|
136
129
|
|
130
|
+
private
|
131
|
+
|
132
|
+
def put_element_in_cell
|
133
|
+
element_with_cell_name = @paste_from_clipboard ? params[:paste_from_clipboard] : params[:element][:name]
|
134
|
+
cell_definition = Cell.definition_for(element_with_cell_name.split('#').last) if !element_with_cell_name.blank?
|
135
|
+
if cell_definition
|
136
|
+
@cell = @page.cells.find_or_create_by_name(cell_definition['name'])
|
137
|
+
@element.cell = @cell
|
138
|
+
return true
|
139
|
+
else
|
140
|
+
return false
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def element_from_clipboard
|
145
|
+
@clipboard = get_clipboard(:elements)
|
146
|
+
@clipboard.detect { |i| i[:id].to_i == params[:paste_from_clipboard].to_i }
|
147
|
+
end
|
148
|
+
|
137
149
|
end
|
@@ -10,6 +10,8 @@ class Admin::TrashController < AlchemyController
|
|
10
10
|
@elements = Element.trashed
|
11
11
|
@page = Page.find_by_id(params[:page_id])
|
12
12
|
@allowed_elements = Element.all_for_page(@page)
|
13
|
+
@draggable_trash_items = {}
|
14
|
+
@elements.each { |e| @draggable_trash_items["element_#{e.id}"] = e.belonging_cellnames(@page) }
|
13
15
|
render :layout => false
|
14
16
|
rescue Exception => e
|
15
17
|
exception_handler(e)
|
@@ -56,21 +56,6 @@ module Admin::ElementsHelper
|
|
56
56
|
)
|
57
57
|
end
|
58
58
|
|
59
|
-
def clipboard_select_tag(items, html_options = {})
|
60
|
-
options = [[_('Please choose'), ""]]
|
61
|
-
items.each do |item|
|
62
|
-
options << [item.class.to_s == 'Element' ? item.display_name_with_preview_text : item.name, item.id]
|
63
|
-
end
|
64
|
-
select_tag(
|
65
|
-
'paste_from_clipboard',
|
66
|
-
@page.has_cells? ? grouped_elements_for_select(items, :id) : options_for_select(options),
|
67
|
-
{
|
68
|
-
:class => html_options[:class] || 'very_long',
|
69
|
-
:style => html_options[:style]
|
70
|
-
}
|
71
|
-
)
|
72
|
-
end
|
73
|
-
|
74
59
|
# Returns all elements that could be placed on that page because of the pages layout.
|
75
60
|
# The elements are returned as an array to be used in alchemy_selectbox form builder.
|
76
61
|
def elements_for_select(elements)
|
@@ -92,23 +77,31 @@ module Admin::ElementsHelper
|
|
92
77
|
celled_elements += cell_elements
|
93
78
|
optgroup_label = Cell.translated_label_for(cell['name'])
|
94
79
|
options[optgroup_label] = cell_elements.map do |e|
|
95
|
-
|
96
|
-
I18n.t("alchemy.element_names.#{e['name']}", :default => e['name'].capitalize),
|
97
|
-
(e.class.name == 'Element' ? e.send(object_method).to_s : e[object_method]) + "##{cell['name']}"
|
98
|
-
]
|
80
|
+
element_array_for_options(e, object_method, cell)
|
99
81
|
end
|
100
82
|
end
|
101
83
|
other_elements = elements - celled_elements
|
102
84
|
unless other_elements.blank?
|
103
85
|
optgroup_label = _('other Elements')
|
104
86
|
options[optgroup_label] = other_elements.map do |e|
|
105
|
-
|
106
|
-
I18n.t("alchemy.element_names.#{e['name']}", :default => e['name'].capitalize),
|
107
|
-
e.class.name == 'Element' ? e.send(object_method) : e[object_method]
|
108
|
-
]
|
87
|
+
element_array_for_options(e, object_method)
|
109
88
|
end
|
110
89
|
end
|
111
90
|
return grouped_options_for_select(options)
|
112
91
|
end
|
113
92
|
|
93
|
+
def element_array_for_options(e, object_method, cell = nil)
|
94
|
+
if e.class.name == 'Element'
|
95
|
+
[
|
96
|
+
e.display_name_with_preview_text,
|
97
|
+
e.send(object_method).to_s + (cell ? "##{cell['name']}" : "")
|
98
|
+
]
|
99
|
+
else
|
100
|
+
[
|
101
|
+
I18n.t("alchemy.element_names.#{e['name']}", :default => e['name'].capitalize),
|
102
|
+
e[object_method] + (cell ? "##{cell['name']}" : "")
|
103
|
+
]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
114
107
|
end
|
@@ -339,4 +339,19 @@ module AlchemyHelper
|
|
339
339
|
end
|
340
340
|
end
|
341
341
|
|
342
|
+
def clipboard_select_tag(items, html_options = {})
|
343
|
+
options = [[_('Please choose'), ""]]
|
344
|
+
items.each do |item|
|
345
|
+
options << [item.class.to_s == 'Element' ? item.display_name_with_preview_text : item.name, item.id]
|
346
|
+
end
|
347
|
+
select_tag(
|
348
|
+
'paste_from_clipboard',
|
349
|
+
!@page.new_record? && @page.can_have_cells? ? grouped_elements_for_select(items, :id) : options_for_select(options),
|
350
|
+
{
|
351
|
+
:class => html_options[:class] || 'very_long',
|
352
|
+
:style => html_options[:style]
|
353
|
+
}
|
354
|
+
)
|
355
|
+
end
|
356
|
+
|
342
357
|
end
|
data/app/models/cell.rb
CHANGED
@@ -37,19 +37,15 @@ class Cell < ActiveRecord::Base
|
|
37
37
|
Element.all_definitions_for(element_names.uniq)
|
38
38
|
end
|
39
39
|
|
40
|
-
def self.definition_for_element(element_name)
|
41
|
-
definitions_for_element(element_name).first
|
42
|
-
end
|
43
|
-
|
44
40
|
def self.definitions_for_element(element_name)
|
45
41
|
return [] if definitions.blank?
|
46
42
|
definitions.select { |d| d['elements'].include?(element_name) }
|
47
43
|
end
|
48
44
|
|
49
|
-
def self.
|
50
|
-
|
51
|
-
return nil if
|
52
|
-
|
45
|
+
def self.names_for_element(element_name)
|
46
|
+
definitions = definitions_for_element(element_name)
|
47
|
+
return nil if definitions.blank?
|
48
|
+
definitions.collect { |d| d['name'] }
|
53
49
|
end
|
54
50
|
|
55
51
|
def name_for_label
|
data/app/models/element.rb
CHANGED
@@ -17,6 +17,7 @@ class Element < ActiveRecord::Base
|
|
17
17
|
|
18
18
|
# TODO: add a trashed column to elements table
|
19
19
|
scope :trashed, where(:page_id => nil).order('updated_at DESC')
|
20
|
+
scope :not_trashed, where('`elements`.`page_id` IS NOT NULL')
|
20
21
|
scope :published, where(:public => true)
|
21
22
|
scope :named, lambda { |names| where(arel_table[:name].in(names)) }
|
22
23
|
scope :excluded, lambda { |names| where(arel_table[:name].not_in(names)) }
|
@@ -52,11 +53,15 @@ class Element < ActiveRecord::Base
|
|
52
53
|
|
53
54
|
# nullifies the page_id aka. trashs it.
|
54
55
|
def trash
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
self.attributes = {
|
57
|
+
:page_id => nil,
|
58
|
+
:cell_id => nil,
|
59
|
+
:folded => true,
|
60
|
+
:public => false
|
61
|
+
}
|
62
|
+
# If we validate the element, it will not get trashed if another element with same postion is already trashed.
|
63
|
+
# And we cannot remove the position, because it will not be reordered in the list if its position is nil.
|
64
|
+
self.remove_from_list
|
60
65
|
end
|
61
66
|
|
62
67
|
def trashed?
|
@@ -286,7 +291,7 @@ class Element < ActiveRecord::Base
|
|
286
291
|
|
287
292
|
def self.all_from_clipboard(clipboard)
|
288
293
|
return [] if clipboard.nil?
|
289
|
-
self.find_all_by_id(clipboard)
|
294
|
+
self.find_all_by_id(clipboard.collect { |i| i[:id] })
|
290
295
|
end
|
291
296
|
|
292
297
|
def self.all_from_clipboard_for_page(clipboard, page)
|
@@ -399,12 +404,12 @@ class Element < ActiveRecord::Base
|
|
399
404
|
alias_method :richtext_contents, :rtf_contents
|
400
405
|
|
401
406
|
# The name of the cell the element could be placed in.
|
402
|
-
def
|
403
|
-
|
404
|
-
if
|
405
|
-
return 'for_other_elements'
|
407
|
+
def belonging_cellnames(page)
|
408
|
+
cellnames = Cell.names_for_element(name)
|
409
|
+
if cellnames.blank? || !page.has_cells?
|
410
|
+
return ['for_other_elements']
|
406
411
|
else
|
407
|
-
return
|
412
|
+
return cellnames
|
408
413
|
end
|
409
414
|
end
|
410
415
|
|
data/app/models/page.rb
CHANGED
@@ -111,8 +111,8 @@ class Page < ActiveRecord::Base
|
|
111
111
|
|
112
112
|
def elements_grouped_by_cells
|
113
113
|
group = ActiveSupport::OrderedHash.new
|
114
|
-
cells.each { |cell| group[cell] = cell.elements }
|
115
|
-
group[Cell.new({:name => 'for_other_elements'})] = elements.
|
114
|
+
cells.each { |cell| group[cell] = cell.elements.not_trashed }
|
115
|
+
group[Cell.new({:name => 'for_other_elements'})] = elements.not_trashed.where(:cell_id => nil)
|
116
116
|
return group
|
117
117
|
end
|
118
118
|
|
@@ -302,17 +302,18 @@ class Page < ActiveRecord::Base
|
|
302
302
|
end
|
303
303
|
end
|
304
304
|
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
305
|
+
# Returns the self#page_layout description from config/alchemy/page_layouts.yml file.
|
306
|
+
def layout_description
|
307
|
+
description = Alchemy::PageLayout.get(self.page_layout)
|
308
|
+
if self.root?
|
309
|
+
return {}
|
310
|
+
elsif description.nil?
|
311
|
+
raise "Description could not be found for page layout named #{self.page_layout}. Please check page_layouts.yml file."
|
312
|
+
else
|
313
|
+
description
|
314
|
+
end
|
315
|
+
end
|
316
|
+
alias_method :definition, :layout_description
|
316
317
|
|
317
318
|
# Returns translated name of the pages page_layout value.
|
318
319
|
# Page layout names are defined inside the config/alchemy/page_layouts.yml file.
|
@@ -338,16 +339,12 @@ class Page < ActiveRecord::Base
|
|
338
339
|
end
|
339
340
|
|
340
341
|
def contains_feed?
|
341
|
-
|
342
|
-
return false if desc.blank?
|
343
|
-
desc["feed"]
|
342
|
+
definition["feed"]
|
344
343
|
end
|
345
344
|
|
346
345
|
# Returns true or false if the pages layout_description for config/alchemy/page_layouts.yml contains redirects_to_external: true
|
347
346
|
def redirects_to_external?
|
348
|
-
|
349
|
-
return false if desc.blank?
|
350
|
-
desc["redirects_to_external"]
|
347
|
+
definition["redirects_to_external"]
|
351
348
|
end
|
352
349
|
|
353
350
|
# Returns an array of all pages currently locked by user
|
@@ -432,7 +429,7 @@ class Page < ActiveRecord::Base
|
|
432
429
|
|
433
430
|
def self.all_from_clipboard(clipboard)
|
434
431
|
return [] if clipboard.blank?
|
435
|
-
self.find_all_by_id(clipboard)
|
432
|
+
self.find_all_by_id(clipboard.collect { |i| i[:id] })
|
436
433
|
end
|
437
434
|
|
438
435
|
def self.all_from_clipboard_for_select(clipboard, language_id, layoutpage = false)
|
@@ -459,11 +456,13 @@ class Page < ActiveRecord::Base
|
|
459
456
|
end
|
460
457
|
|
461
458
|
# Returns true or false if the page has a page_layout that has cells.
|
462
|
-
def
|
463
|
-
|
464
|
-
return false if pagelayout.blank?
|
465
|
-
!pagelayout['cells'].blank?
|
459
|
+
def can_have_cells?
|
460
|
+
!definition['cells'].blank?
|
466
461
|
end
|
462
|
+
|
463
|
+
def has_cells?
|
464
|
+
cells.any?
|
465
|
+
end
|
467
466
|
|
468
467
|
def self.link_target_options
|
469
468
|
options = [
|
@@ -522,7 +521,6 @@ private
|
|
522
521
|
# Looks in the layout_descripion, if there are elements to autogenerate.
|
523
522
|
# If so, it generates them.
|
524
523
|
def autogenerate_elements
|
525
|
-
return true if self.layout_description.blank?
|
526
524
|
elements = self.layout_description["autogenerate"]
|
527
525
|
unless (elements.blank?)
|
528
526
|
elements.each do |element|
|
@@ -538,7 +536,7 @@ private
|
|
538
536
|
end
|
539
537
|
|
540
538
|
def create_cells
|
541
|
-
return
|
539
|
+
return false if !can_have_cells?
|
542
540
|
definition['cells'].each do |cellname|
|
543
541
|
cells.create({:name => cellname})
|
544
542
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<div class="element_editor<%= element.folded ? ' folded' : '' %> <%= defined?(draggable) && !draggable ? 'not-draggable' : 'draggable' %>" id="element_<%= element.id %>">
|
1
|
+
<div class="element_editor<%= element.folded ? ' folded' : '' %> <%= defined?(draggable) && !draggable ? 'not-draggable' : 'draggable' %>" id="element_<%= element.id %>" data-element-id="<%= element.id %>">
|
2
2
|
<%= render :partial => "admin/elements/element_head", :locals => {:element => element} %>
|
3
3
|
<%- if !element.folded? -%>
|
4
4
|
<%= form_for(
|
@@ -12,7 +12,7 @@
|
|
12
12
|
<span style="margin-right: 16px"><%= _("element_of_type") %>:</span>
|
13
13
|
<%= form.select(
|
14
14
|
'name',
|
15
|
-
@page.
|
15
|
+
@page.can_have_cells? ? grouped_elements_for_select(@elements) : elements_for_select(@elements),
|
16
16
|
{:prompt => _('select_element')},
|
17
17
|
{:class => 'very_long'}
|
18
18
|
) -%>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
(function($) {
|
2
2
|
|
3
|
-
<%- if @page.
|
3
|
+
<%- if @page.can_have_cells? -%>
|
4
4
|
Alchemy.selectOrCreateCellTab('<%= @cell.nil? ? "for_other_elements" : @cell.name -%>', '<%= @cell.nil? ? _("other Elements") : @cell.name_for_label -%>');
|
5
5
|
<%- end -%>
|
6
6
|
$('#cell_<%= @cell.nil? ? "for_other_elements" : @cell.name -%>').append('<%= escape_javascript render(:partial => "element", :object => @element, :locals => {:draggable => true}) -%>');
|
@@ -12,9 +12,13 @@
|
|
12
12
|
<%- end -%>
|
13
13
|
Alchemy.PreviewWindow.refresh();
|
14
14
|
Alchemy.ElementEditorSelector.init();
|
15
|
-
$('
|
15
|
+
$('.element_editor[data-element-id="<%= @element.id -%>"]').trigger('Alchemy.SelectElementEditor');
|
16
16
|
Alchemy.ElementDirtyObserver('#element_<%= @element.id -%>');
|
17
17
|
Alchemy.SelectBox('#element_<%= @element.id -%> select');
|
18
18
|
Alchemy.ButtonObserver('#element_<%= @element.id -%> button.button');
|
19
|
-
|
19
|
+
|
20
|
+
<%- if @clipboard.blank? -%>
|
21
|
+
$('#clipboard_button .icon.clipboard').removeClass('full');
|
22
|
+
<%- end -%>
|
23
|
+
|
20
24
|
})(jQuery);
|
@@ -6,10 +6,12 @@
|
|
6
6
|
|
7
7
|
<%- else -%>
|
8
8
|
|
9
|
-
$('
|
10
|
-
$('#element_area').sortable('refresh');
|
9
|
+
$('.element_editor[data-element-id="<%= @element.id -%>"]').replaceWith('<%= escape_javascript render(:partial => "element", :object => @element) -%>');
|
10
|
+
$('#element_area .sortable_cell').sortable('refresh');
|
11
11
|
Alchemy.ElementEditorSelector.bindEvent('#element_<%= @element.id -%>');
|
12
|
-
|
12
|
+
|
13
|
+
$('.element_editor[data-element-id="<%= @element.id -%>"]');
|
14
|
+
|
13
15
|
<%- if @element.folded -%>
|
14
16
|
|
15
17
|
<%- @element.rtf_contents.each do |content| -%>
|
@@ -22,7 +24,7 @@
|
|
22
24
|
|
23
25
|
<%- else -%>
|
24
26
|
|
25
|
-
$('
|
27
|
+
$('.element_editor[data-element-id="<%= @element.id -%>"]').trigger('Alchemy.SelectElementEditor');
|
26
28
|
Alchemy.SelectBox('#element_<%= @element.id -%> select');
|
27
29
|
|
28
30
|
<%- @element.rtf_contents.each do |content| -%>
|
@@ -11,13 +11,13 @@
|
|
11
11
|
<%- end -%>
|
12
12
|
</ul>
|
13
13
|
<%- @elements.each do |cell, elements| -%>
|
14
|
-
<div id="cell_<%= cell.name %>" class="sortable_cell">
|
14
|
+
<div id="cell_<%= cell.name %>" class="sortable_cell <%= cell.name %>_cell" data-cell-id="<%= cell.id %>">
|
15
15
|
<%= render :partial => 'element', :collection => elements, :locals => {:draggable => true} %>
|
16
16
|
</div>
|
17
17
|
<%- end -%>
|
18
18
|
</div>
|
19
19
|
<%- else -%>
|
20
|
-
<div class="sortable_cell" id="cell_for_other_elements">
|
20
|
+
<div class="sortable_cell for_other_elements_cell" id="cell_for_other_elements">
|
21
21
|
<%= render :partial => @elements, :locals => {:draggable => true} %>
|
22
22
|
</div>
|
23
23
|
<%- end -%>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
(function($) {
|
2
2
|
|
3
|
-
$("
|
3
|
+
$('.element_editor[data-element-id="<%= @element.id -%>"]').remove();
|
4
4
|
Alchemy.growl('<%= _("Element trashed") -%>');
|
5
5
|
$('#element_area').sortable('refresh');
|
6
6
|
Alchemy.refreshTrashWindow(<%= @page_id -%>);
|
@@ -1,7 +1,7 @@
|
|
1
1
|
(function($) {
|
2
2
|
$('div#element_<%= @element.id -%> div.element_handle span.icon').removeClass('element_<%= @element.public? ? "draft" : "public" -%>').addClass('element_<%= @element.public? ? "public" : "draft" -%>');
|
3
|
-
$('
|
4
|
-
$('
|
3
|
+
$('.element_editor[data-element-id="<%= @element.id -%>"] .element_heading .preview_text_element_name').text('<%= @element.display_name -%>');
|
4
|
+
$('.element_editor[data-element-id="<%= @element.id -%>"] .element_heading .preview_text_quote').text('<%= escape_javascript(@element.preview_text) -%>');
|
5
5
|
$('div.content_editor').removeClass('validation_failed');
|
6
6
|
$("#element_<%= @element.id -%>_errors").hide();
|
7
7
|
Alchemy.setElementSaved('#element_<%= @element.id -%>');
|
@@ -19,7 +19,5 @@
|
|
19
19
|
<%- end -%>
|
20
20
|
</div>
|
21
21
|
<script type="text/javascript" charset="utf-8">
|
22
|
-
|
23
|
-
<%- @elements.each { |e| cells_items["element_#{e.id}"] = e.belonging_cellname }; -%>
|
24
|
-
Alchemy.DraggableTrashItems(<%= cells_items.to_json.html_safe %>);
|
22
|
+
Alchemy.DraggableTrashItems(<%= @draggable_trash_items.to_json.html_safe %>);
|
25
23
|
</script>
|
@@ -549,8 +549,10 @@ if (typeof(Alchemy) === 'undefined') {
|
|
549
549
|
tolerance: 'pointer',
|
550
550
|
update: function(event, ui) {
|
551
551
|
var ids = $.map($(event.target).children(), function(child) {
|
552
|
-
return child.
|
552
|
+
return $(child).attr('data-element-id');
|
553
553
|
});
|
554
|
+
var params_string = '';
|
555
|
+
var cell_id = $(event.target).attr('data-cell-id');
|
554
556
|
// Is the trash window open?
|
555
557
|
if ($('#alchemyTrashWindow').length > 0) {
|
556
558
|
// updating the trash icon
|
@@ -560,10 +562,14 @@ if (typeof(Alchemy) === 'undefined') {
|
|
560
562
|
}
|
561
563
|
}
|
562
564
|
$(event.target).css("cursor", "progress");
|
565
|
+
params_string = "page_id=" + page_id + "&authenticity_token=" + encodeURIComponent(form_token) + "&" + $.param({element_ids: ids});
|
566
|
+
if (cell_id) {
|
567
|
+
params_string += "&cell_id=" + cell_id;
|
568
|
+
}
|
563
569
|
$.ajax({
|
564
570
|
url: '/admin/elements/order',
|
565
571
|
type: 'POST',
|
566
|
-
data:
|
572
|
+
data: params_string,
|
567
573
|
complete: function () {
|
568
574
|
$(event.target).css("cursor", "auto");
|
569
575
|
Alchemy.refreshTrashWindow(page_id);
|
@@ -788,10 +794,15 @@ if (typeof(Alchemy) === 'undefined') {
|
|
788
794
|
|
789
795
|
DraggableTrashItems: function (items_n_cells) {
|
790
796
|
$("#trash_items div.draggable").each(function () {
|
797
|
+
var cell_classes = '';
|
798
|
+
var cell_names = items_n_cells[this.id];
|
799
|
+
$.each(cell_names, function (i) {
|
800
|
+
cell_classes += '.' + this + '_cell' + ', ';
|
801
|
+
});
|
791
802
|
$(this).draggable({
|
792
803
|
helper: 'clone',
|
793
804
|
iframeFix: 'iframe#alchemyPreviewWindow',
|
794
|
-
connectToSortable:
|
805
|
+
connectToSortable: cell_classes,
|
795
806
|
start: function(event, ui) {
|
796
807
|
$(this).hide().addClass('dragged');
|
797
808
|
ui.helper.css({width: '300px'});
|
data/lib/alchemy/page_layout.rb
CHANGED
@@ -30,9 +30,6 @@ module Alchemy
|
|
30
30
|
# Returns the page_layout description found by name in page_layouts.yml
|
31
31
|
def self.get(name = "")
|
32
32
|
self.get_layouts.detect{ |a| a["name"].downcase == name.downcase }
|
33
|
-
rescue Exception => e
|
34
|
-
Rails.logger.error("++++++ ERROR\n#{e}")
|
35
|
-
return nil
|
36
33
|
end
|
37
34
|
|
38
35
|
# Returns page layouts ready for Rails' select form helper.
|
data/lib/alchemy/version.rb
CHANGED
data/locale/de/alchemy.po
CHANGED
@@ -71,7 +71,7 @@ msgstr "Seite wählen"
|
|
71
71
|
|
72
72
|
#: app/controllers/admin/trash_controller.rb:15
|
73
73
|
msgid "Cleared trash"
|
74
|
-
msgstr "Der Papierkorb wurde
|
74
|
+
msgstr "Der Papierkorb wurde geleert"
|
75
75
|
|
76
76
|
#: app/views/admin/pictures/_picture.html.erb:35
|
77
77
|
msgid "Click to rename"
|
@@ -106,11 +106,11 @@ msgstr "Bild löschen"
|
|
106
106
|
|
107
107
|
#: app/views/admin/clipboard/index.html.erb:15
|
108
108
|
msgid "Do you really want to clear the clipboard?"
|
109
|
-
msgstr "Wollen Sie die Zwischenablage wirklich
|
109
|
+
msgstr "Wollen Sie die Zwischenablage wirklich leeren?"
|
110
110
|
|
111
111
|
#: app/views/admin/trash/index.html.erb:16
|
112
112
|
msgid "Do you really want to clear the trash?"
|
113
|
-
msgstr "Wollen Sie den Papierkorb wirklich
|
113
|
+
msgstr "Wollen Sie den Papierkorb wirklich leeren?"
|
114
114
|
|
115
115
|
#: app/views/essences/_essence_text_editor.html.erb:50
|
116
116
|
msgid "Do you really want to delete this content?"
|
@@ -932,11 +932,11 @@ msgstr "Bitte wählen Sie eine Datei zum Verlinken aus."
|
|
932
932
|
|
933
933
|
#: app/views/admin/clipboard/index.html.erb:15
|
934
934
|
msgid "clear clipboard"
|
935
|
-
msgstr "Zwischenablage
|
935
|
+
msgstr "Zwischenablage leeren"
|
936
936
|
|
937
937
|
#: app/views/admin/trash/index.html.erb:16
|
938
938
|
msgid "clear trash"
|
939
|
-
msgstr "Papierkorb
|
939
|
+
msgstr "Papierkorb leeren"
|
940
940
|
|
941
941
|
#: app/helpers/alchemy_helper.rb:790
|
942
942
|
#: app/views/admin/partials/_remote_search_form.html.erb:30
|
@@ -23,7 +23,7 @@ describe ElementsHelper do
|
|
23
23
|
helper.element_dom_id(@element).should == "#{@element.name}_#{@element.id}"
|
24
24
|
end
|
25
25
|
|
26
|
-
it "should render elements for a cell"
|
26
|
+
it "should render elements for a cell" do
|
27
27
|
cell = Factory(:cell)
|
28
28
|
Factory(:element, :cell_id => cell.id)
|
29
29
|
helper.stub(:configuration).and_return(true)
|
data/spec/models/page_spec.rb
CHANGED
@@ -7,7 +7,28 @@ describe Page do
|
|
7
7
|
before(:each) do
|
8
8
|
@rootpage = Page.rootpage
|
9
9
|
@language = Language.get_default
|
10
|
-
@language_root = Factory(:page, :parent_id => @rootpage.id, :language => @language, :language_root => true)
|
10
|
+
@language_root = Factory(:page, :parent_id => @rootpage.id, :language => @language, :language_root => true, :page_layout => 'intro')
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".layout_description" do
|
14
|
+
|
15
|
+
context "for a language root page" do
|
16
|
+
|
17
|
+
it "should return the page layout description as hash" do
|
18
|
+
@language_root.layout_description['name'].should == 'intro'
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return an empty hash for root page" do
|
22
|
+
@rootpage.layout_description.should == {}
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should raise Exception if the page_layout could not be found in the definition file" do
|
28
|
+
@page = mock(:page, :page_layout => 'foo')
|
29
|
+
expect { @page.layout_description }.to raise_error
|
30
|
+
end
|
31
|
+
|
11
32
|
end
|
12
33
|
|
13
34
|
it "should contain one rootpage" do
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: alchemy_cms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version:
|
5
|
+
version: 2.0.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Thomas von Deyen
|
@@ -12,7 +12,7 @@ autorequire:
|
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
14
|
|
15
|
-
date: 2011-11-
|
15
|
+
date: 2011-11-03 00:00:00 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rails
|