alchemy_cms 3.0.0.rc7 → 3.0.0.rc8
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.
- checksums.yaml +4 -4
- data/Gemfile +2 -1
- data/README.md +1 -1
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +0 -2
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +26 -2
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +22 -0
- data/app/assets/stylesheets/alchemy/base.scss +1 -5
- data/app/assets/stylesheets/alchemy/elements.scss +11 -61
- data/app/assets/stylesheets/alchemy/frame.scss +1 -1
- data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +1 -1
- data/app/controllers/alchemy/admin/attachments_controller.rb +1 -1
- data/app/controllers/alchemy/admin/base_controller.rb +7 -13
- data/app/controllers/alchemy/admin/clipboard_controller.rb +15 -10
- data/app/controllers/alchemy/admin/elements_controller.rb +15 -11
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +8 -1
- data/app/controllers/alchemy/admin/pages_controller.rb +95 -22
- data/app/controllers/alchemy/admin/tags_controller.rb +1 -1
- data/app/controllers/alchemy/pictures_controller.rb +33 -32
- data/app/helpers/alchemy/admin/base_helper.rb +3 -16
- data/app/models/alchemy/element.rb +1 -1
- data/app/models/alchemy/page/page_naming.rb +4 -2
- data/app/models/alchemy/page/page_natures.rb +1 -1
- data/app/models/alchemy/page.rb +20 -1
- data/app/models/alchemy/picture.rb +1 -0
- data/app/models/alchemy/tree_node.rb +4 -0
- data/app/views/alchemy/admin/contents/destroy.js.erb +4 -0
- data/app/views/alchemy/admin/dashboard/index.html.erb +1 -1
- data/app/views/alchemy/admin/elements/_element.html.erb +11 -12
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +0 -3
- data/app/views/alchemy/admin/elements/create.js.erb +3 -3
- data/app/views/alchemy/admin/elements/index.html.erb +4 -19
- data/app/views/alchemy/admin/elements/new.html.erb +0 -3
- data/app/views/alchemy/admin/elements/trash.js.erb +12 -16
- data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
- data/app/views/alchemy/admin/pages/edit.html.erb +36 -30
- data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +1 -1
- data/app/views/alchemy/admin/trash/clear.js.erb +4 -0
- data/config/locales/alchemy.de.yml +56 -84
- data/config/locales/alchemy.en.yml +326 -105
- data/config/locales/alchemy.fr.yml +942 -0
- data/config/locales/alchemy.nl.yml +111 -137
- data/config/locales/simple_form.fr.yml +26 -0
- data/lib/alchemy/engine.rb +7 -1
- data/lib/alchemy/i18n.rb +7 -1
- data/lib/alchemy/middleware/rescue_old_cookies.rb +27 -0
- data/lib/alchemy/permissions.rb +1 -1
- data/lib/alchemy/version.rb +1 -1
- data/spec/controllers/admin/clipboard_controller_spec.rb +16 -19
- data/spec/controllers/admin/elements_controller_spec.rb +20 -23
- data/spec/controllers/admin/essence_pictures_controller_spec.rb +22 -6
- data/spec/controllers/admin/pages_controller_spec.rb +94 -5
- data/spec/controllers/pictures_controller_spec.rb +44 -3
- data/spec/features/admin/link_overlay_spec.rb +1 -0
- data/spec/features/admin/locale_select_feature_spec.rb +22 -0
- data/spec/libraries/i18n_spec.rb +30 -0
- data/spec/libraries/permissions_spec.rb +1 -1
- data/spec/models/element_spec.rb +5 -4
- data/spec/models/page_spec.rb +137 -8
- data/spec/spec_helper.rb +23 -19
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +9 -3
- metadata +12 -10
- data/app/models/alchemy/clipboard.rb +0 -74
- data/app/views/alchemy/admin/contents/destroy.js.coffee +0 -4
- data/app/views/alchemy/admin/elements/_add_element_button.html.erb +0 -18
- data/app/views/alchemy/admin/trash/clear.js.coffee +0 -4
- data/spec/models/clipboard_spec.rb +0 -111
- data/spec/support/phantomjs_mavericks_fix.rb +0 -32
@@ -0,0 +1,26 @@
|
|
1
|
+
fr:
|
2
|
+
simple_form:
|
3
|
+
"yes": 'oui'
|
4
|
+
"no": 'non'
|
5
|
+
required:
|
6
|
+
text: 'champ obligatoire'
|
7
|
+
mark: '*'
|
8
|
+
# You can uncomment the line below if you need to overwrite the whole required html.
|
9
|
+
# When using html, text and mark won't be used.
|
10
|
+
# html: '<abbr title="required">*</abbr>'
|
11
|
+
error_notification:
|
12
|
+
default_message: "Il ya des erreurs:"
|
13
|
+
# Labels and hints examples
|
14
|
+
# labels:
|
15
|
+
# defaults:
|
16
|
+
# password: 'Password'
|
17
|
+
# user:
|
18
|
+
# new:
|
19
|
+
# email: 'E-mail to sign in.'
|
20
|
+
# edit:
|
21
|
+
# email: 'E-mail.'
|
22
|
+
# hints:
|
23
|
+
# defaults:
|
24
|
+
# username: 'User name to sign in.'
|
25
|
+
# password: 'No special characters, please.'
|
26
|
+
|
data/lib/alchemy/engine.rb
CHANGED
@@ -6,7 +6,6 @@ require 'action_view/dependency_tracker'
|
|
6
6
|
require 'active_model_serializers'
|
7
7
|
require 'awesome_nested_set'
|
8
8
|
require 'cancan'
|
9
|
-
require 'coffee-rails'
|
10
9
|
require 'compass-rails'
|
11
10
|
require 'dragonfly'
|
12
11
|
require 'jquery-rails'
|
@@ -47,6 +46,9 @@ require_relative './touching'
|
|
47
46
|
require_relative './kaminari/scoped_pagination_url_helper'
|
48
47
|
require_relative '../extensions/action_view'
|
49
48
|
|
49
|
+
# Middleware
|
50
|
+
require_relative './middleware/rescue_old_cookies'
|
51
|
+
|
50
52
|
module Alchemy
|
51
53
|
class Engine < Rails::Engine
|
52
54
|
isolate_namespace Alchemy
|
@@ -66,6 +68,10 @@ module Alchemy
|
|
66
68
|
]
|
67
69
|
end
|
68
70
|
|
71
|
+
initializer 'alchemy.middleware.rescue_old_cookies' do |app|
|
72
|
+
app.middleware.insert_before(ActionDispatch::Cookies, Alchemy::Middleware::RescueOldCookies)
|
73
|
+
end
|
74
|
+
|
69
75
|
initializer 'alchemy.dependency_tracker' do |app|
|
70
76
|
[:erb, :slim, :haml].each do |handler|
|
71
77
|
ActionView::DependencyTracker.register_tracker(handler, CacheDigests::TemplateTracker)
|
data/lib/alchemy/i18n.rb
CHANGED
@@ -45,7 +45,13 @@ module Alchemy
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def self.available_locales
|
48
|
-
|
48
|
+
@@available_locales ||= nil
|
49
|
+
@@available_locales || translation_files.collect { |f| f.match(/.{2}\.yml$/).to_s.gsub(/\.yml/, '').to_sym }
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.available_locales=(locales)
|
53
|
+
@@available_locales = Array(locales).map { |locale| locale.to_sym }
|
54
|
+
@@available_locales = nil if @@available_locales.empty?
|
49
55
|
end
|
50
56
|
|
51
57
|
def self.translation_files
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Alchemy
|
2
|
+
module Middleware
|
3
|
+
class RescueOldCookies
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
begin
|
10
|
+
@app.call(env)
|
11
|
+
rescue NameError => error
|
12
|
+
if error.to_s =~ /uninitialized constant Alchemy::Clipboard/
|
13
|
+
message = "<h2>You have an old style Alchemy clipboard in your session!</h2>"
|
14
|
+
message += "<h3>Please remove your cookies and try again.</h3>"
|
15
|
+
Rails.logger.error(error)
|
16
|
+
return [
|
17
|
+
500, { "Content-Type" => "text/html" },
|
18
|
+
[message]
|
19
|
+
]
|
20
|
+
else
|
21
|
+
raise error
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/alchemy/permissions.rb
CHANGED
@@ -86,12 +86,12 @@ module Alchemy
|
|
86
86
|
|
87
87
|
# Controller actions
|
88
88
|
can [:info, :help], :alchemy_admin_dashboard
|
89
|
+
can :manage, :alchemy_admin_clipboard
|
89
90
|
can :index, :trash
|
90
91
|
can :edit, :alchemy_admin_layoutpages
|
91
92
|
|
92
93
|
# Resources
|
93
94
|
can [:read, :download], Alchemy::Attachment
|
94
|
-
can :manage, Alchemy::Clipboard
|
95
95
|
can :manage, Alchemy::Content
|
96
96
|
can :manage, Alchemy::Element
|
97
97
|
can :manage, Alchemy::EssenceFile
|
data/lib/alchemy/version.rb
CHANGED
@@ -8,51 +8,48 @@ module Alchemy
|
|
8
8
|
|
9
9
|
before do
|
10
10
|
sign_in(admin_user)
|
11
|
-
session[:
|
11
|
+
session[:alchemy_clipboard] = {}
|
12
12
|
Element.stub(find: element)
|
13
13
|
end
|
14
14
|
|
15
15
|
describe "#insert" do
|
16
16
|
it "should hold element ids" do
|
17
|
-
xhr :post, :insert, {remarkable_type:
|
18
|
-
session[:
|
17
|
+
xhr :post, :insert, {remarkable_type: 'elements', remarkable_id: element.id}
|
18
|
+
session[:alchemy_clipboard]['elements'].should == [{'id' => element.id.to_s, 'action' => 'copy'}]
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should not have the same element twice" do
|
22
|
-
session[:
|
23
|
-
xhr :post, :insert, {remarkable_type:
|
24
|
-
session[:
|
22
|
+
session[:alchemy_clipboard]['elements'] = [{'id' => element.id.to_s, 'action' => 'copy'}]
|
23
|
+
xhr :post, :insert, {remarkable_type: 'elements', remarkable_id: element.id}
|
24
|
+
session[:alchemy_clipboard]['elements'].collect { |e| e['id'] }.should_not == [element.id, element.id]
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
describe "#delete" do
|
29
29
|
it "should remove element ids from clipboard" do
|
30
|
-
session[:
|
31
|
-
session[:
|
32
|
-
xhr :delete, :remove, {remarkable_type:
|
33
|
-
session[:
|
30
|
+
session[:alchemy_clipboard]['elements'] = [{'id' => element.id.to_s, 'action' => 'copy'}]
|
31
|
+
session[:alchemy_clipboard]['elements'] << {'id' => another_element.id.to_s, 'action' => 'copy'}
|
32
|
+
xhr :delete, :remove, {remarkable_type: 'elements', remarkable_id: another_element.id}
|
33
|
+
session[:alchemy_clipboard]['elements'].should == [{'id' => element.id.to_s, 'action' => 'copy'}]
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
37
|
describe "#clear" do
|
38
|
-
|
39
38
|
context "with elements as remarkable_type" do
|
40
39
|
it "should clear the elements clipboard" do
|
41
|
-
session[:
|
42
|
-
xhr :delete, :clear, {remarkable_type:
|
43
|
-
session[:
|
40
|
+
session[:alchemy_clipboard]['elements'] = [{'id' => element.id.to_s}]
|
41
|
+
xhr :delete, :clear, {remarkable_type: 'elements'}
|
42
|
+
session[:alchemy_clipboard]['elements'].should be_empty
|
44
43
|
end
|
45
44
|
end
|
46
45
|
|
47
46
|
context "with pages as remarkable_type" do
|
48
47
|
it "should clear the pages clipboard" do
|
49
|
-
session[:
|
50
|
-
xhr :delete, :clear, {remarkable_type:
|
51
|
-
session[:
|
48
|
+
session[:alchemy_clipboard]['pages'] = [{'id' => public_page.id.to_s}]
|
49
|
+
xhr :delete, :clear, {remarkable_type: 'pages'}
|
50
|
+
session[:alchemy_clipboard]['pages'].should be_empty
|
52
51
|
end
|
53
52
|
end
|
54
|
-
|
55
53
|
end
|
56
|
-
|
57
54
|
end
|
58
55
|
end
|
@@ -5,7 +5,7 @@ module Alchemy
|
|
5
5
|
let(:alchemy_page) { create(:page) }
|
6
6
|
let(:element) { create(:element, :page_id => alchemy_page.id) }
|
7
7
|
let(:element_in_clipboard) { create(:element, :page_id => alchemy_page.id) }
|
8
|
-
let(:clipboard) { session[:
|
8
|
+
let(:clipboard) { session[:alchemy_clipboard] = {} }
|
9
9
|
|
10
10
|
before { sign_in(author_user) }
|
11
11
|
|
@@ -80,9 +80,9 @@ module Alchemy
|
|
80
80
|
end
|
81
81
|
|
82
82
|
context "with elements in clipboard" do
|
83
|
-
let(:clipboard_items) { [{
|
83
|
+
let(:clipboard_items) { [{'id' => element.id.to_s, 'action' => 'copy'}] }
|
84
84
|
|
85
|
-
before { clipboard[
|
85
|
+
before { clipboard['elements'] = clipboard_items }
|
86
86
|
|
87
87
|
it "should load all elements from clipboard" do
|
88
88
|
Element.should_receive(:all_from_clipboard_for_page).and_return(clipboard_items)
|
@@ -96,28 +96,25 @@ module Alchemy
|
|
96
96
|
describe 'insertion position' do
|
97
97
|
before { element }
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
alchemy_page.elements.first.name.should == 'news'
|
104
|
-
end
|
99
|
+
it "should insert the element at bottom of list" do
|
100
|
+
xhr :post, :create, {element: {name: 'news', page_id: alchemy_page.id}}
|
101
|
+
alchemy_page.elements.count.should == 2
|
102
|
+
alchemy_page.elements.last.name.should == 'news'
|
105
103
|
end
|
106
104
|
|
107
|
-
context "with
|
108
|
-
let(:element_before) { create(:element, name: 'headline', page: alchemy_page) }
|
109
|
-
|
105
|
+
context "on a page with a setting for insert_elements_at of top" do
|
110
106
|
before do
|
111
|
-
|
112
|
-
|
107
|
+
PageLayout.stub(:get).and_return({
|
108
|
+
'name' => 'news',
|
109
|
+
'elements' => ['news'],
|
110
|
+
'insert_elements_at' => 'top'
|
111
|
+
})
|
113
112
|
end
|
114
113
|
|
115
|
-
it "should insert the
|
116
|
-
xhr :post, :create, {element: {name: 'news', page_id: alchemy_page.id}
|
114
|
+
it "should insert the element at top of list" do
|
115
|
+
xhr :post, :create, {element: {name: 'news', page_id: alchemy_page.id}}
|
117
116
|
alchemy_page.elements.count.should == 2
|
118
|
-
alchemy_page.elements.
|
119
|
-
alchemy_page.elements.first.name.should == 'headline'
|
120
|
-
alchemy_page.elements.last.name.should == 'news'
|
117
|
+
alchemy_page.elements.first.name.should == 'news'
|
121
118
|
end
|
122
119
|
end
|
123
120
|
end
|
@@ -161,7 +158,7 @@ module Alchemy
|
|
161
158
|
'cells' => ['header']
|
162
159
|
})
|
163
160
|
Cell.stub(:definition_for).and_return({'name' => 'header', 'elements' => ['article']})
|
164
|
-
clipboard[
|
161
|
+
clipboard['elements'] = [{'id' => element_in_clipboard.id.to_s}]
|
165
162
|
end
|
166
163
|
|
167
164
|
context "and cell name in element name" do
|
@@ -202,7 +199,7 @@ module Alchemy
|
|
202
199
|
'cells' => ['news']
|
203
200
|
})
|
204
201
|
Cell.stub(:definition_for).and_return({'name' => 'news', 'elements' => ['news']})
|
205
|
-
clipboard[
|
202
|
+
clipboard['elements'] = [{'id' => element_in_clipboard.id.to_s}]
|
206
203
|
cell.elements << element
|
207
204
|
end
|
208
205
|
|
@@ -220,7 +217,7 @@ module Alchemy
|
|
220
217
|
render_views
|
221
218
|
|
222
219
|
before do
|
223
|
-
clipboard[
|
220
|
+
clipboard['elements'] = [{'id' => element_in_clipboard.id.to_s, 'action' => 'cut'}]
|
224
221
|
end
|
225
222
|
|
226
223
|
it "should create an element from clipboard" do
|
@@ -232,7 +229,7 @@ module Alchemy
|
|
232
229
|
context "and with cut as action parameter" do
|
233
230
|
it "should also remove the element id from clipboard" do
|
234
231
|
xhr :post, :create, {paste_from_clipboard: element_in_clipboard.id, element: {page_id: alchemy_page.id}}
|
235
|
-
session[:
|
232
|
+
session[:alchemy_clipboard]['elements'].detect { |item| item['id'] == element_in_clipboard.id.to_s }.should be_nil
|
236
233
|
end
|
237
234
|
end
|
238
235
|
end
|
@@ -41,7 +41,7 @@ module Alchemy
|
|
41
41
|
before do
|
42
42
|
picture.image_file_width = 300
|
43
43
|
picture.image_file_height = 250
|
44
|
-
essence.should_receive(:picture).and_return(picture)
|
44
|
+
essence.should_receive(:picture).any_number_of_times.and_return(picture)
|
45
45
|
end
|
46
46
|
|
47
47
|
context 'with no render_size present in essence' do
|
@@ -67,14 +67,30 @@ module Alchemy
|
|
67
67
|
end
|
68
68
|
|
69
69
|
context 'with render_size present in essence' do
|
70
|
-
|
70
|
+
it "sets sizes from these values" do
|
71
71
|
essence.stub(:render_size).and_return('30x25')
|
72
|
-
end
|
73
72
|
|
74
|
-
it "sets sizes from these values" do
|
75
73
|
get :crop, id: 1
|
76
|
-
expect(assigns(:size_x)).to eq(
|
77
|
-
expect(assigns(:size_y)).to eq(
|
74
|
+
expect(assigns(:size_x)).to eq(30)
|
75
|
+
expect(assigns(:size_y)).to eq(25)
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when width or height is not fixed' do
|
79
|
+
it 'infers the height from the image file preserving the aspect ratio' do
|
80
|
+
essence.stub(:render_size).and_return('30')
|
81
|
+
|
82
|
+
get :crop, id: 1
|
83
|
+
expect(assigns(:size_x)).to eq(30)
|
84
|
+
expect(assigns(:size_y)).to eq(25)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'infers the height from the image file preserving the aspect ratio' do
|
88
|
+
essence.stub(:render_size).and_return('x25')
|
89
|
+
|
90
|
+
get :crop, id: 1
|
91
|
+
expect(assigns(:size_x)).to eq(30)
|
92
|
+
expect(assigns(:size_y)).to eq(25)
|
93
|
+
end
|
78
94
|
end
|
79
95
|
end
|
80
96
|
|
@@ -54,10 +54,10 @@ module Alchemy
|
|
54
54
|
|
55
55
|
describe '#new' do
|
56
56
|
context "pages in clipboard" do
|
57
|
-
let(:clipboard) { session[:
|
57
|
+
let(:clipboard) { session[:alchemy_clipboard] = {} }
|
58
58
|
let(:page) { mock_model(Alchemy::Page, name: 'Foobar') }
|
59
59
|
|
60
|
-
before { clipboard[
|
60
|
+
before { clipboard['pages'] = [{'id' => page.id.to_s, 'action' => 'copy'}] }
|
61
61
|
|
62
62
|
it "should load all pages from clipboard" do
|
63
63
|
xhr :get, :new, {page_id: page.id}
|
@@ -96,6 +96,95 @@ module Alchemy
|
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
|
+
describe '#order' do
|
100
|
+
let(:page_1) { FactoryGirl.create(:page, visible: true) }
|
101
|
+
let(:page_2) { FactoryGirl.create(:page, visible: true) }
|
102
|
+
let(:page_3) { FactoryGirl.create(:page, visible: true) }
|
103
|
+
let(:page_item_1) { {id: page_1.id, slug: page_1.slug, restricted: false, external: page_1.redirects_to_external?, visible: page_1.visible?, children: [page_item_2]} }
|
104
|
+
let(:page_item_2) { {id: page_2.id, slug: page_2.slug, restricted: false, external: page_2.redirects_to_external?, visible: page_2.visible?, children: [page_item_3]} }
|
105
|
+
let(:page_item_3) { {id: page_3.id, slug: page_3.slug, restricted: false, external: page_3.redirects_to_external?, visible: page_3.visible? } }
|
106
|
+
let(:set_of_pages) { [page_item_1] }
|
107
|
+
|
108
|
+
it "stores the new order" do
|
109
|
+
xhr :post, :order, set: set_of_pages.to_json
|
110
|
+
page_1.reload
|
111
|
+
expect(page_1.descendants).to eq([page_2, page_3])
|
112
|
+
end
|
113
|
+
|
114
|
+
context 'with url nesting enabled' do
|
115
|
+
before { Alchemy::Config.stub(get: true) }
|
116
|
+
|
117
|
+
it "updates the pages urlnames" do
|
118
|
+
xhr :post, :order, set: set_of_pages.to_json
|
119
|
+
[page_1, page_2, page_3].map(&:reload)
|
120
|
+
expect(page_1.urlname).to eq("#{page_1.slug}")
|
121
|
+
expect(page_2.urlname).to eq("#{page_1.slug}/#{page_2.slug}")
|
122
|
+
expect(page_3.urlname).to eq("#{page_1.slug}/#{page_2.slug}/#{page_3.slug}")
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'with invisible page in tree' do
|
126
|
+
let(:page_item_2) do
|
127
|
+
{
|
128
|
+
id: page_2.id,
|
129
|
+
slug: page_2.slug,
|
130
|
+
children: [page_item_3],
|
131
|
+
visible: false
|
132
|
+
}
|
133
|
+
end
|
134
|
+
|
135
|
+
it "does not use this pages slug in urlnames of descendants" do
|
136
|
+
xhr :post, :order, set: set_of_pages.to_json
|
137
|
+
[page_1, page_2, page_3].map(&:reload)
|
138
|
+
expect(page_1.urlname).to eq("#{page_1.slug}")
|
139
|
+
expect(page_2.urlname).to eq("#{page_1.slug}/#{page_2.slug}")
|
140
|
+
expect(page_3.urlname).to eq("#{page_1.slug}/#{page_3.slug}")
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'with external page in tree' do
|
145
|
+
let(:page_item_2) do
|
146
|
+
{
|
147
|
+
id: page_2.id,
|
148
|
+
slug: page_2.slug,
|
149
|
+
children: [page_item_3],
|
150
|
+
external: true
|
151
|
+
}
|
152
|
+
end
|
153
|
+
|
154
|
+
it "does not use this pages slug in urlnames of descendants" do
|
155
|
+
xhr :post, :order, set: set_of_pages.to_json
|
156
|
+
[page_1, page_2, page_3].map(&:reload)
|
157
|
+
expect(page_3.urlname).to eq("#{page_1.slug}/#{page_3.slug}")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'with restricted page in tree' do
|
162
|
+
let(:page_2) { FactoryGirl.create(:page, restricted: true) }
|
163
|
+
let(:page_item_2) do
|
164
|
+
{
|
165
|
+
id: page_2.id,
|
166
|
+
slug: page_2.slug,
|
167
|
+
children: [page_item_3],
|
168
|
+
restricted: true
|
169
|
+
}
|
170
|
+
end
|
171
|
+
|
172
|
+
it "updates restricted status of descendants" do
|
173
|
+
xhr :post, :order, set: set_of_pages.to_json
|
174
|
+
page_3.reload
|
175
|
+
expect(page_3.restricted).to be_true
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
it "creates legacy urls" do
|
180
|
+
xhr :post, :order, set: set_of_pages.to_json
|
181
|
+
[page_2, page_3].map(&:reload)
|
182
|
+
expect(page_2.legacy_urls.size).to eq(1)
|
183
|
+
expect(page_3.legacy_urls.size).to eq(1)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
99
188
|
describe "#configure" do
|
100
189
|
render_views
|
101
190
|
|
@@ -289,14 +378,14 @@ module Alchemy
|
|
289
378
|
end
|
290
379
|
|
291
380
|
describe '#destroy' do
|
292
|
-
let(:clipboard) { session[:
|
381
|
+
let(:clipboard) { session[:alchemy_clipboard] = {} }
|
293
382
|
let(:page) { FactoryGirl.create(:public_page) }
|
294
383
|
|
295
|
-
before { clipboard[
|
384
|
+
before { clipboard['pages'] = [{'id' => page.id.to_s}] }
|
296
385
|
|
297
386
|
it "should also remove the page from clipboard" do
|
298
387
|
xhr :post, :destroy, {id: page.id, _method: :delete}
|
299
|
-
clipboard[
|
388
|
+
clipboard['pages'].should be_empty
|
300
389
|
end
|
301
390
|
end
|
302
391
|
|