alchemy_cms 2.6.0.rc5 → 2.6.0
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/.travis.yml +1 -1
- data/Gemfile +2 -1
- data/README.md +2 -4
- data/alchemy_cms.gemspec +1 -1
- data/app/assets/fonts/alchemy/icons.eot +0 -0
- data/app/assets/fonts/alchemy/icons.svg +71 -0
- data/app/assets/fonts/alchemy/icons.ttf +0 -0
- data/app/assets/fonts/alchemy/icons.woff +0 -0
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +6 -8
- data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +2 -3
- data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +3 -8
- data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +3 -3
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +19 -9
- data/app/assets/javascripts/tiny_mce/plugins/alchemy_link/editor_plugin.js +6 -7
- data/app/assets/stylesheets/alchemy/admin.css.scss +0 -1
- data/app/assets/stylesheets/alchemy/archive.scss +55 -7
- data/app/assets/stylesheets/alchemy/base.scss +8 -144
- data/app/assets/stylesheets/alchemy/defaults.scss +1 -1
- data/app/assets/stylesheets/alchemy/elements.scss +20 -16
- data/app/assets/stylesheets/alchemy/flash.scss +1 -1
- data/app/assets/stylesheets/alchemy/form_elements.scss +49 -42
- data/app/assets/stylesheets/alchemy/icon-font.css.scss +67 -0
- data/app/assets/stylesheets/alchemy/icons.scss +16 -4
- data/app/assets/stylesheets/alchemy/jquery-ui.scss +40 -26
- data/app/assets/stylesheets/alchemy/menubar.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/notices.scss +6 -1
- data/app/assets/stylesheets/alchemy/search.scss +3 -2
- data/app/assets/stylesheets/alchemy/sitemap.scss +72 -13
- data/app/assets/stylesheets/alchemy/tables.scss +31 -24
- data/app/assets/stylesheets/alchemy/upload.scss +1 -1
- data/app/assets/stylesheets/alchemy/variables.scss +2 -1
- data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/{alchemy → alchemy-tinymce-dialog}/window.css.scss +70 -65
- data/app/controllers/alchemy/admin/base_controller.rb +7 -4
- data/app/controllers/alchemy/admin/pictures_controller.rb +2 -0
- data/app/controllers/alchemy/admin/users_controller.rb +1 -1
- data/app/controllers/alchemy/user_sessions_controller.rb +1 -1
- data/app/helpers/alchemy/admin/base_helper.rb +161 -60
- data/app/helpers/alchemy/admin/pages_helper.rb +4 -1
- data/app/helpers/alchemy/elements_block_helper.rb +1 -1
- data/app/helpers/alchemy/elements_helper.rb +119 -31
- data/app/helpers/alchemy/pages_helper.rb +29 -72
- data/app/models/alchemy/attachment.rb +0 -2
- data/app/models/alchemy/content.rb +1 -1
- data/app/models/alchemy/language.rb +1 -0
- data/app/models/alchemy/page.rb +8 -8
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +3 -1
- data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +1 -1
- data/app/views/alchemy/admin/attachments/_tag_list.html.erb +25 -27
- data/app/views/alchemy/admin/attachments/index.html.erb +4 -1
- data/app/views/alchemy/admin/elements/_elements_select.html.erb +6 -6
- data/app/views/alchemy/admin/elements/list.js.erb +1 -1
- data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_page_for_links.html.erb +1 -1
- data/app/views/alchemy/admin/pages/edit.html.erb +4 -2
- data/app/views/alchemy/admin/pictures/_archive.html.erb +0 -1
- data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +2 -1
- data/app/views/alchemy/admin/pictures/_picture.html.erb +5 -0
- data/app/views/alchemy/admin/pictures/index.html.erb +1 -0
- data/app/views/alchemy/base/500.html.erb +26 -5
- data/app/views/alchemy/essences/_essence_picture_tools.html.erb +1 -1
- data/app/views/alchemy/essences/_linkable_essence_tools.html.erb +1 -1
- data/app/views/alchemy/language_links/_language.html.erb +12 -0
- data/app/views/alchemy/language_links/_spacer.html.erb +1 -0
- data/config/locales/alchemy.de.yml +7 -3
- data/config/locales/alchemy.en.yml +8 -3
- data/lib/alchemy/page_layout.rb +1 -1
- data/lib/alchemy/tinymce.rb +1 -1
- data/lib/alchemy/upgrader.rb +26 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +4 -1
- data/lib/tasks/ferret.rake +1 -0
- data/spec/controllers/admin/users_controller_spec.rb +5 -5
- data/spec/features/admin/pages_controller_spec.rb +1 -1
- data/spec/helpers/admin/pages_helper_spec.rb +31 -0
- data/spec/helpers/pages_helper_spec.rb +60 -72
- data/spec/models/content_spec.rb +2 -1
- data/spec/models/page_layout_spec.rb +29 -0
- data/spec/models/page_spec.rb +33 -1
- data/spec/support/alchemy/test_tweaks.rb +2 -6
- metadata +34 -12
- data/app/assets/fonts/alchemy-icons.eot +0 -0
- data/app/assets/fonts/alchemy-icons.svg +0 -54
- data/app/assets/fonts/alchemy-icons.ttf +0 -0
- data/app/assets/fonts/alchemy-icons.woff +0 -0
- data/app/assets/images/alchemy/placeholder.png +0 -0
- data/app/assets/stylesheets/alchemy/fonts.scss +0 -46
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= options[:spacer].html_safe %>
|
|
@@ -186,6 +186,7 @@ de:
|
|
|
186
186
|
site:
|
|
187
187
|
aliases: Weitere Domains bitte mit Leerzeichen oder Leerzeile getrennt angeben.
|
|
188
188
|
|
|
189
|
+
back: 'zurück'
|
|
189
190
|
create_tree_as_new_language: "%{language} als neuen Sprachbaum anlegen"
|
|
190
191
|
"<a href=\"http://get.adobe.com/flashplayer\" target=\"_blank\">%{value}</a>": ""
|
|
191
192
|
"Active Pages": "Aktive Seiten"
|
|
@@ -193,6 +194,7 @@ de:
|
|
|
193
194
|
"Adobe Website": "Adobe Webseite"
|
|
194
195
|
"Alchemy is open software and itself uses open software and free resources:": "Alchemy ist offene Software und benutzt selbst offene Software und freie Ressourcen:"
|
|
195
196
|
"Alchemy is up to date": 'Alchemy ist aktuell'
|
|
197
|
+
'An error happened': 'Es ist leider ein Fehler aufgetreten!'
|
|
196
198
|
"Change password": "Passwort ändern"
|
|
197
199
|
"Choose page": "Seite wählen"
|
|
198
200
|
"Cleared trash": "Der Papierkorb wurde geleert"
|
|
@@ -220,7 +222,7 @@ de:
|
|
|
220
222
|
"File successfully updated": "Datei wurde erfolgreich gespeichert."
|
|
221
223
|
"File upload error: %{error}": "Datei konnte nicht hochgeladen werden: %{error}"
|
|
222
224
|
"File: '%{name}' deleted successfully": "%{name} wurde gelöscht"
|
|
223
|
-
"Filter by tag": "Nach
|
|
225
|
+
"Filter by tag": "Nach Tag filtern"
|
|
224
226
|
"Flush page cache": "Seitencache löschen"
|
|
225
227
|
"Flush picture cache": "Bildercache löschen"
|
|
226
228
|
"Hide childpages": "Unterseiten ausblenden"
|
|
@@ -520,8 +522,9 @@ de:
|
|
|
520
522
|
picture_gallery_editor: 'Bilder'
|
|
521
523
|
picture_library:
|
|
522
524
|
filter:
|
|
523
|
-
last_upload: "
|
|
524
|
-
recent: "
|
|
525
|
+
last_upload: "die zuletzt hochgeladen wurden"
|
|
526
|
+
recent: "aus den letzten 24 Stunden"
|
|
527
|
+
without_tag: "ohne Tag"
|
|
525
528
|
place_link: "Text verlinken"
|
|
526
529
|
player_version: "Flashplayer Version"
|
|
527
530
|
"please enter subject and mail address": "Bitte geben Sie den Betreff und eine Empfängeradresse an."
|
|
@@ -594,6 +597,7 @@ de:
|
|
|
594
597
|
"We need at least one default.": "Es muss eine Standardsprache geben."
|
|
595
598
|
welcome_please_identify_notice: "Willkommen! Bitte identifizieren Sie sich."
|
|
596
599
|
width: "Breite"
|
|
600
|
+
without_tag: 'Ohne Tag'
|
|
597
601
|
you_can_rename_this_tag: "Sie können dieses Tag umbenennen"
|
|
598
602
|
zoom_image: "Bild in voller Größe anzeigen."
|
|
599
603
|
"Leave Alchemy": "Alchemy verlassen"
|
|
@@ -333,7 +333,7 @@ en:
|
|
|
333
333
|
"false": ""
|
|
334
334
|
restricted:
|
|
335
335
|
"true": "Page is restricted."
|
|
336
|
-
"false": ""
|
|
336
|
+
"false": "Page is not restricted."
|
|
337
337
|
page_status: "Status"
|
|
338
338
|
page_title: "Title"
|
|
339
339
|
page_type: "Type"
|
|
@@ -352,8 +352,9 @@ en:
|
|
|
352
352
|
pictures_deleted_successfully: "Pictures %{name} deleted"
|
|
353
353
|
picture_library:
|
|
354
354
|
filter:
|
|
355
|
-
last_upload: "
|
|
356
|
-
recent: "
|
|
355
|
+
last_upload: "from last upload"
|
|
356
|
+
recent: "that where recently uploaded"
|
|
357
|
+
without_tag: "without tag"
|
|
357
358
|
place_link: "Link text"
|
|
358
359
|
player_version: "Flashplayer Version"
|
|
359
360
|
"please enter subject and mail address": "Please enter recipient and subject."
|
|
@@ -611,6 +612,10 @@ en:
|
|
|
611
612
|
one: File
|
|
612
613
|
other: Files
|
|
613
614
|
|
|
615
|
+
alchemy/picture:
|
|
616
|
+
one: Picture
|
|
617
|
+
other: Pictures
|
|
618
|
+
|
|
614
619
|
attributes:
|
|
615
620
|
|
|
616
621
|
alchemy/attachment:
|
data/lib/alchemy/page_layout.rb
CHANGED
data/lib/alchemy/tinymce.rb
CHANGED
|
@@ -20,7 +20,7 @@ module Alchemy
|
|
|
20
20
|
:theme => 'advanced',
|
|
21
21
|
:skin => 'o2k7',
|
|
22
22
|
:skin_variant => 'silver',
|
|
23
|
-
:inlinepopups_skin => 'alchemy',
|
|
23
|
+
:inlinepopups_skin => 'alchemy-tinymce-dialog',
|
|
24
24
|
:popup_css => "/assets/alchemy/tinymce_dialog.css",
|
|
25
25
|
:content_css => "/assets/alchemy/tinymce_content.css",
|
|
26
26
|
:dialog_type => "modal",
|
data/lib/alchemy/upgrader.rb
CHANGED
|
@@ -20,11 +20,37 @@ module Alchemy
|
|
|
20
20
|
Rake::Task['alchemy:install:migrations'].invoke
|
|
21
21
|
Rake::Task['db:migrate'].invoke
|
|
22
22
|
Seeder.seed!
|
|
23
|
+
convert_attachment_storage
|
|
23
24
|
copy_new_config_file
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
private
|
|
27
28
|
|
|
29
|
+
def convert_attachment_storage
|
|
30
|
+
desc "Convert the attachment storage"
|
|
31
|
+
converted_files = []
|
|
32
|
+
files = Dir.glob Rails.root.join 'uploads/attachments/**/*.*'
|
|
33
|
+
if files.blank?
|
|
34
|
+
log "No attachments found", :skip
|
|
35
|
+
else
|
|
36
|
+
files.each do |file|
|
|
37
|
+
file_uid = file.gsub(/#{Rails.root.to_s}\/uploads\/attachments\//, '')
|
|
38
|
+
file_id = file_uid.split('/')[1].to_i
|
|
39
|
+
attachment = Alchemy::Attachment.find_by_id(file_id)
|
|
40
|
+
if attachment && attachment.file_uid.blank?
|
|
41
|
+
attachment.file_uid = file_uid
|
|
42
|
+
attachment.file_size = File.new(file).size
|
|
43
|
+
attachment.file_name = attachment.sanitized_filename
|
|
44
|
+
if attachment.save!
|
|
45
|
+
log "Converted #{file_uid}"
|
|
46
|
+
end
|
|
47
|
+
else
|
|
48
|
+
log "Attachment with id #{file_id} not found or already converted.", :skip
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
28
54
|
def copy_new_config_file
|
|
29
55
|
desc "Copy configuration file."
|
|
30
56
|
config_file = Rails.root.join('config/alchemy/config.yml')
|
data/lib/alchemy/version.rb
CHANGED
|
@@ -3,6 +3,9 @@ require 'rails'
|
|
|
3
3
|
module Alchemy
|
|
4
4
|
module Generators
|
|
5
5
|
class ScaffoldGenerator < ::Rails::Generators::Base
|
|
6
|
+
|
|
7
|
+
ALCHEMY_VIEWS = %w(breadcrumb language_links messages navigation notifications search)
|
|
8
|
+
|
|
6
9
|
desc "This generator generates the Alchemy scaffold."
|
|
7
10
|
class_option :copy_views, :default => false, :type => :boolean, :desc => "Copy all Alchemy views into your app.", :aliases => '-v'
|
|
8
11
|
source_root File.expand_path('templates', File.dirname(__FILE__))
|
|
@@ -37,7 +40,7 @@ module Alchemy
|
|
|
37
40
|
end
|
|
38
41
|
|
|
39
42
|
def copy_alchemy_views
|
|
40
|
-
|
|
43
|
+
ALCHEMY_VIEWS.each do |dir|
|
|
41
44
|
src = File.expand_path("../../../../../app/views/alchemy/#{dir}", File.dirname(__FILE__))
|
|
42
45
|
dest = Rails.root.join('app/views/alchemy', dir)
|
|
43
46
|
directory src, dest
|
data/lib/tasks/ferret.rake
CHANGED
|
@@ -2,6 +2,7 @@ namespace :ferret do
|
|
|
2
2
|
|
|
3
3
|
desc "Updates the Ferret index."
|
|
4
4
|
task :rebuild_index => :environment do
|
|
5
|
+
abort 'Enable ferret search in Alchemy config first.' if !Alchemy::Config.get(:ferret)
|
|
5
6
|
Alchemy::EssenceText.where(:do_not_index => false).rebuild_index
|
|
6
7
|
Alchemy::EssenceRichtext.where(:do_not_index => false).rebuild_index
|
|
7
8
|
end
|
|
@@ -49,17 +49,17 @@ describe Alchemy::Admin::UsersController do
|
|
|
49
49
|
|
|
50
50
|
context "if user is permitted to update roles" do
|
|
51
51
|
it "updates the user including role" do
|
|
52
|
-
controller.stub(:permitted_to?).with(:
|
|
53
|
-
Alchemy::User.any_instance.should_receive(:update_attributes).with({'
|
|
54
|
-
post :update, :id => user.id, :user => {:
|
|
52
|
+
controller.stub(:permitted_to?).with(:update_roles).and_return { true }
|
|
53
|
+
Alchemy::User.any_instance.should_receive(:update_attributes).with({'roles' => ['Administrator']})
|
|
54
|
+
post :update, :id => user.id, :user => {:roles => ['Administrator']}, :format => :js
|
|
55
55
|
end
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
context "if the user is not permitted to update roles" do
|
|
59
59
|
it "updates user without role" do
|
|
60
|
-
controller.stub(:permitted_to?).with(:
|
|
60
|
+
controller.stub(:permitted_to?).with(:update_roles).and_return { false }
|
|
61
61
|
Alchemy::User.any_instance.should_receive(:update_attributes).with({})
|
|
62
|
-
post :update, :id => user.id, :user => {'
|
|
62
|
+
post :update, :id => user.id, :user => {'roles' => ['Administrator']}, :format => :js
|
|
63
63
|
end
|
|
64
64
|
end
|
|
65
65
|
|
|
@@ -18,7 +18,7 @@ module Alchemy
|
|
|
18
18
|
|
|
19
19
|
before do
|
|
20
20
|
klingonian_root
|
|
21
|
-
Capybara.default_wait_time =
|
|
21
|
+
Capybara.default_wait_time = 4 # Raising this helps this test to pass, even on travis-ci
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
it "one should be able to switch the language tree" do
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Alchemy::Admin::PagesHelper do
|
|
4
|
+
|
|
5
|
+
describe '#tinymce_javascript_tags' do
|
|
6
|
+
it "renders script tag for tinymce initalization" do
|
|
7
|
+
helper.tinymce_javascript_tags.squish.should match(/script.+Alchemy\.Tinymce/)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe '#custom_tinymce_javascript_tags' do
|
|
12
|
+
it "renders script tag for custom tinymce initalization" do
|
|
13
|
+
helper.custom_tinymce_javascript_tags.squish.should match(/Alchemy\.Tinymce\.customInits/)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe '#preview_sizes_for_select' do
|
|
18
|
+
it "returns a options string of preview screen sizes for select tag" do
|
|
19
|
+
helper.preview_sizes_for_select.should include('option', 'auto', '240', '320', '480', '768', '1024', '1280')
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe '#combined_page_status' do
|
|
24
|
+
let(:page) { FactoryGirl.build(:page, public: true, visible: true, restricted: false, locked: false)}
|
|
25
|
+
|
|
26
|
+
it "returns the translated page status" do
|
|
27
|
+
helper.combined_page_status(page).should == 'Page is visible in navigation.<br>Page is published.<br>Page is not restricted.'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
@@ -263,93 +263,81 @@ module Alchemy
|
|
|
263
263
|
|
|
264
264
|
end
|
|
265
265
|
|
|
266
|
-
describe "#
|
|
266
|
+
describe "#language_links" do
|
|
267
267
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
it "should return nil when having only one public language" do
|
|
275
|
-
helper.language_switcher.should be nil
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
context "with two public languages and two language_roots" do
|
|
279
|
-
|
|
280
|
-
before do
|
|
281
|
-
language_root
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
context "and config redirect_to_public_child is set to TRUE" do
|
|
285
|
-
|
|
286
|
-
it "should return nil if only one language_root is public and both do not have children" do
|
|
287
|
-
klingonian_language_root.update_attributes(:public => false)
|
|
288
|
-
helper.language_switcher.should == nil
|
|
289
|
-
end
|
|
268
|
+
context "with two public languages" do
|
|
269
|
+
|
|
270
|
+
# Always create second language
|
|
271
|
+
before { klingonian }
|
|
290
272
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
FactoryGirl.create(:page, :language => klingonian, :parent_id => klingonian_language_root.id)
|
|
295
|
-
helper.language_switcher.should == nil
|
|
273
|
+
context "with only one language root page" do
|
|
274
|
+
it "should return nil" do
|
|
275
|
+
expect(helper.language_links).to be_nil
|
|
296
276
|
end
|
|
277
|
+
end
|
|
297
278
|
|
|
298
|
-
|
|
299
|
-
klingonian_language_root
|
|
300
|
-
helper.language_switcher.should have_selector('a', :count => 2)
|
|
301
|
-
end
|
|
279
|
+
context "with two language root pages" do
|
|
302
280
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
public_page
|
|
306
|
-
klingonian_public_page
|
|
307
|
-
helper.language_switcher.should have_selector('a', :count => 2)
|
|
308
|
-
end
|
|
281
|
+
# Always create a language root page for klingonian
|
|
282
|
+
before { klingonian_language_root }
|
|
309
283
|
|
|
310
|
-
it "should render two links
|
|
311
|
-
|
|
312
|
-
klingonian_language_root.update_attributes(:public => false)
|
|
313
|
-
public_page
|
|
314
|
-
klingonian_public_page
|
|
315
|
-
helper.language_switcher.should have_selector('a', :count => 2)
|
|
284
|
+
it "should render two language links" do
|
|
285
|
+
expect(helper.language_links).to have_selector('a', :count => 2)
|
|
316
286
|
end
|
|
317
287
|
|
|
318
|
-
it "should
|
|
319
|
-
|
|
320
|
-
klingonian_language_root.
|
|
321
|
-
|
|
322
|
-
klingonian_public_page
|
|
323
|
-
helper.language_switcher.should == nil
|
|
288
|
+
it "should render language links referring to their language root page" do
|
|
289
|
+
code = klingonian_language_root.language_code
|
|
290
|
+
urlname = klingonian_language_root.urlname
|
|
291
|
+
expect(helper.language_links).to have_selector("a.#{code}[href='/#{code}/#{urlname}']")
|
|
324
292
|
end
|
|
325
293
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
294
|
+
context "with options[:linkname]" do
|
|
295
|
+
context "set to 'name'" do
|
|
296
|
+
it "should render the name of the language" do
|
|
297
|
+
expect(helper.language_links(linkname: 'name')).to have_selector("span[contains('#{klingonian_language_root.language.name}')]")
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
context "set to 'code'" do
|
|
302
|
+
it "should render the code of the language" do
|
|
303
|
+
expect(helper.language_links(linkname: 'code')).to have_selector("span[contains('#{klingonian_language_root.language.code}')]")
|
|
304
|
+
end
|
|
305
|
+
end
|
|
334
306
|
end
|
|
335
307
|
|
|
336
|
-
|
|
337
|
-
|
|
308
|
+
context "spacer set to '\o/'" do
|
|
309
|
+
it "should render the given string as a spacer" do
|
|
310
|
+
expect(helper.language_links(spacer: '<span>\o/</span>')).to have_selector('span[contains("\o/")]', :count => 1)
|
|
311
|
+
end
|
|
338
312
|
end
|
|
339
313
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
314
|
+
context "with options[:reverse]" do
|
|
315
|
+
context "set to false" do
|
|
316
|
+
it "should render the language links in an ascending order" do
|
|
317
|
+
expect(helper.language_links(reverse: false)).to have_selector("a.de + a.kl")
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
context "set to true" do
|
|
322
|
+
it "should render the language links in a descending order" do
|
|
323
|
+
expect(helper.language_links(reverse: true)).to have_selector("a.kl + a.de")
|
|
324
|
+
end
|
|
325
|
+
end
|
|
345
326
|
end
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
327
|
+
|
|
328
|
+
context "with options[:show_title]" do
|
|
329
|
+
context "set to true" do
|
|
330
|
+
it "should render the language links with titles" do
|
|
331
|
+
helper.stub!(:_t).and_return("my title")
|
|
332
|
+
expect(helper.language_links(show_title: true)).to have_selector('a[title="my title"]')
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
context "set to false" do
|
|
337
|
+
it "should render the language links without titles" do
|
|
338
|
+
expect(helper.language_links(show_title: false)).to_not have_selector('a[title]')
|
|
339
|
+
end
|
|
340
|
+
end
|
|
353
341
|
end
|
|
354
342
|
|
|
355
343
|
end
|
data/spec/models/content_spec.rb
CHANGED
|
@@ -133,8 +133,9 @@ module Alchemy
|
|
|
133
133
|
describe "#descriptions" do
|
|
134
134
|
|
|
135
135
|
context "without any descriptions in elements.yml file" do
|
|
136
|
+
before { Element.stub(:descriptions).and_return([]) }
|
|
137
|
+
|
|
136
138
|
it "should return an empty array" do
|
|
137
|
-
Element.stub(:descriptions).and_return([])
|
|
138
139
|
Content.descriptions.should == []
|
|
139
140
|
end
|
|
140
141
|
end
|
|
@@ -27,5 +27,34 @@ module Alchemy
|
|
|
27
27
|
PageLayout.selectable_layouts(Language.get_default).each { |e| e["hide"].should_not == true }
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
describe ".element_names_for" do
|
|
31
|
+
|
|
32
|
+
it "should return all element names for the given pagelayout" do
|
|
33
|
+
PageLayout.stub(:get).with('default').and_return({'name' => 'default', 'elements' => ['element_1', 'element_2']})
|
|
34
|
+
expect(PageLayout.element_names_for('default')).to eq(['element_1', 'element_2'])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context "when given page_layout name does not exist" do
|
|
38
|
+
it "should return an empty array" do
|
|
39
|
+
expect(PageLayout.element_names_for('layout_does_not_exist!')).to eq([])
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context "when page_layout description does not contain the elements key" do
|
|
44
|
+
it "should return an empty array" do
|
|
45
|
+
PageLayout.stub(:get).with('layout_without_elements_key').and_return({'name' => 'layout_without_elements_key'})
|
|
46
|
+
expect(PageLayout.element_names_for('layout_without_elements_key')).to eq([])
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe ".get" do
|
|
53
|
+
it "should return the page_layout description found by given name" do
|
|
54
|
+
PageLayout.stub(:all).and_return([{'name' => 'default'}, {'name' => 'contact'}])
|
|
55
|
+
expect(PageLayout.get('default')).to eq({'name' => 'default'})
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
30
59
|
end
|
|
31
60
|
end
|
data/spec/models/page_spec.rb
CHANGED
|
@@ -733,8 +733,11 @@ module Alchemy
|
|
|
733
733
|
before { page.tag_list = 'red, yellow'; page.save }
|
|
734
734
|
|
|
735
735
|
it "the copy should have source tag_list" do
|
|
736
|
+
# The order of tags varies between postgresql and sqlite/mysql
|
|
737
|
+
# This is related to acts-as-taggable-on v.2.4.1
|
|
738
|
+
# To fix the spec we sort the tags until the issue is solved (https://github.com/mbleigh/acts-as-taggable-on/issues/363)
|
|
736
739
|
subject.tag_list.should_not be_empty
|
|
737
|
-
subject.tag_list.should == page.tag_list
|
|
740
|
+
subject.tag_list.sort.should == page.tag_list.sort
|
|
738
741
|
end
|
|
739
742
|
end
|
|
740
743
|
|
|
@@ -890,5 +893,34 @@ module Alchemy
|
|
|
890
893
|
end
|
|
891
894
|
end
|
|
892
895
|
|
|
896
|
+
describe "page status methods" do
|
|
897
|
+
let(:page) { FactoryGirl.build(:page, public: true, visible: true, restricted: false, locked: false)}
|
|
898
|
+
|
|
899
|
+
describe '#status' do
|
|
900
|
+
it "returns a combined status hash" do
|
|
901
|
+
page.status.should == {public: true, visible: true, restricted: false, locked: false}
|
|
902
|
+
end
|
|
903
|
+
end
|
|
904
|
+
|
|
905
|
+
describe '#status_title' do
|
|
906
|
+
it "returns a translated status string for public status" do
|
|
907
|
+
page.status_title(:public).should == 'Page is published.'
|
|
908
|
+
end
|
|
909
|
+
|
|
910
|
+
it "returns a translated status string for visible status" do
|
|
911
|
+
page.status_title(:visible).should == 'Page is visible in navigation.'
|
|
912
|
+
end
|
|
913
|
+
|
|
914
|
+
it "returns a translated status string for locked status" do
|
|
915
|
+
page.status_title(:locked).should == ''
|
|
916
|
+
end
|
|
917
|
+
|
|
918
|
+
it "returns a translated status string for restricted status" do
|
|
919
|
+
page.status_title(:restricted).should == 'Page is not restricted.'
|
|
920
|
+
end
|
|
921
|
+
end
|
|
922
|
+
|
|
923
|
+
end
|
|
924
|
+
|
|
893
925
|
end
|
|
894
926
|
end
|