refinerycms-page-menus 2.0.3

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.
Files changed (49) hide show
  1. data/.gitignore +2 -0
  2. data/app/controllers/refinery/admin/page_menus_controller.rb +9 -0
  3. data/app/controllers/refinery/admin/page_positions_controller.rb +51 -0
  4. data/app/models/refinery/page_menu.rb +31 -0
  5. data/app/models/refinery/page_position.rb +37 -0
  6. data/app/views/refinery/admin/page_menus/_form.html.erb +41 -0
  7. data/app/views/refinery/admin/page_menus/edit.html.erb +1 -0
  8. data/app/views/refinery/admin/page_positions/_actions.html.erb +45 -0
  9. data/app/views/refinery/admin/page_positions/_page_position.html.erb +49 -0
  10. data/app/views/refinery/admin/page_positions/_records.html.erb +14 -0
  11. data/app/views/refinery/admin/page_positions/_sortable_list.html.erb +4 -0
  12. data/app/views/refinery/admin/page_positions/index.html.erb +11 -0
  13. data/app/views/refinery/admin/pages/_actions.html.erb +40 -0
  14. data/app/views/refinery/admin/pages/_list_actions.html.erb +28 -0
  15. data/app/views/refinery/admin/pages/_list_page.html.erb +46 -0
  16. data/app/views/refinery/admin/pages/_list_records.html.erb +16 -0
  17. data/app/views/refinery/admin/pages/list.html.erb +8 -0
  18. data/app/views/refinery/admin/pages_shared/_submenu.html.erb +65 -0
  19. data/config/locales/da.yml +32 -0
  20. data/config/locales/en.yml +93 -0
  21. data/config/routes.rb +14 -0
  22. data/db/migrate/20120406121839_create_page_menus.rb +31 -0
  23. data/db/migrate/20120411133453_add_permatitle_to_page_menus.rb +9 -0
  24. data/db/migrate/20120411134419_add_menu_match_to_page_positions.rb +6 -0
  25. data/lib/generators/refinery/page_menus/page_menus_generator.rb +14 -0
  26. data/lib/generators/refinery/page_menus/templates/config/initializers/refinery/page_menus.rb.erb +3 -0
  27. data/lib/refinery/page_menus.rb +31 -0
  28. data/lib/refinery/page_menus/configuration.rb +10 -0
  29. data/lib/refinery/page_menus/controller_extension.rb +44 -0
  30. data/lib/refinery/page_menus/engine.rb +35 -0
  31. data/lib/refinery/page_menus/instance_methods.rb +16 -0
  32. data/lib/refinery/page_menus/model_extension.rb +14 -0
  33. data/lib/refinerycms-page-menus.rb +1 -0
  34. data/license.md +21 -0
  35. data/readme.md +1 -0
  36. data/refinerycms-page-menus.gemspec +25 -0
  37. data/spec/factories/pages.rb +5 -0
  38. data/spec/helpers/refinery/pages/content_pages_helper_spec.rb +44 -0
  39. data/spec/lib/generators/refinery/pages/pages_generator_spec.rb +29 -0
  40. data/spec/lib/pages/content_page_presenter_spec.rb +43 -0
  41. data/spec/lib/pages/content_presenter_spec.rb +111 -0
  42. data/spec/lib/pages/page_part_section_presenter_spec.rb +35 -0
  43. data/spec/lib/pages/section_presenter_spec.rb +86 -0
  44. data/spec/lib/pages/title_section_presenter_spec.rb +21 -0
  45. data/spec/lib/pages_spec.rb +26 -0
  46. data/spec/models/refinery/page_spec.rb +415 -0
  47. data/spec/requests/refinery/admin/pages_spec.rb +613 -0
  48. data/spec/requests/refinery/pages_spec.rb +302 -0
  49. metadata +127 -0
@@ -0,0 +1 @@
1
+ require 'refinery/page_menus'
data/license.md ADDED
@@ -0,0 +1,21 @@
1
+ # MIT License
2
+
3
+ Copyright (c) 2005-2012 [Pylonweb](http://pylonweb.dk)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/readme.md ADDED
@@ -0,0 +1 @@
1
+ ## Coming soon
@@ -0,0 +1,25 @@
1
+ # Encoding: UTF-8
2
+ # $:.push File.expand_path('../../core/lib', __FILE__)
3
+ # require 'refinery/version'
4
+ #
5
+ # version = Refinery::Version.to_s
6
+
7
+ Gem::Specification.new do |s|
8
+ s.platform = Gem::Platform::RUBY
9
+ s.name = %q{refinerycms-page-menus}
10
+ s.version = '2.0.3'
11
+ s.summary = %q{Pages Menus extension for Refinery CMS}
12
+ s.description = %q{Add custom menus to pages}
13
+ s.date = Date.today.strftime("%Y-%m-%d")
14
+ s.email = %q{johan@pylonweb.dk}
15
+ s.homepage = %q{http://github.com/pylonweb/refinerycms-page-menus}
16
+ s.authors = ['Johan Frølich']
17
+ s.license = %q{MIT}
18
+ s.require_paths = %w(lib)
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- spec/*`.split("\n")
22
+
23
+ s.add_dependency 'awesome_nested_set', '~> 2.1.0'
24
+ s.add_dependency 'refinerycms-pages', '~> 2.0.3'
25
+ end
@@ -0,0 +1,5 @@
1
+ # FactoryGirl.define do
2
+ # factory :page, :class => Refinery::Page do
3
+ # title "Test title"
4
+ # end
5
+ # end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ module Refinery
4
+ module Pages
5
+ describe ContentPagesHelper do
6
+ let(:content_presenter) { double(ContentPresenter, :hide_sections => nil, :fetch_template_overrides => nil, :to_html => nil) }
7
+
8
+ describe "when rendering content presenter" do
9
+ it "asks to content presenter to hide sections if told to" do
10
+ content_presenter.should_receive(:hide_sections).with(['foo', 'bar'])
11
+ render_content_presenter(content_presenter, :hide_sections => ['foo', 'bar'])
12
+ end
13
+
14
+ it "attempts to fetch template overrides declared elsewhere via content_for" do
15
+ content_presenter.should_receive(:fetch_template_overrides).and_yield(12)
16
+ self.should_receive(:content_for).with(12)
17
+ render_content_presenter(content_presenter)
18
+ end
19
+
20
+ it "outputs the html rendered by the content presenter" do
21
+ content_presenter.should_receive(:to_html).and_return('foobar')
22
+ render_content_presenter(content_presenter).should == 'foobar'
23
+ end
24
+
25
+ it "passes can_use_fallback option through to html rendering" do
26
+ content_presenter.should_receive(:to_html).with(true)
27
+ render_content_presenter(content_presenter, :can_use_fallback => true)
28
+ end
29
+ end
30
+
31
+ describe "when rendering page" do
32
+ let(:page) { double(Page) }
33
+
34
+ it "builds a content page presenter and returns its html" do
35
+ self.should_receive(:page_title).and_return('some title')
36
+ Refinery::Pages::ContentPagePresenter.should_receive(:new).with(page, 'some title').and_return(content_presenter)
37
+ content_presenter.should_receive(:to_html).and_return('barfoo')
38
+
39
+ render_content_page(page).should == 'barfoo'
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'generator_spec/test_case'
3
+ require 'generators/refinery/pages/pages_generator'
4
+
5
+ module Refinery
6
+ describe PagesGenerator do
7
+ include GeneratorSpec::TestCase
8
+ destination File.expand_path("../../../../tmp", __FILE__)
9
+
10
+ before(:each) do
11
+ prepare_destination
12
+ run_generator
13
+ end
14
+
15
+ specify do
16
+ destination_root.should have_structure {
17
+ directory "config" do
18
+ directory "initializers" do
19
+ directory "refinery" do
20
+ file "pages.rb" do
21
+ contains "Refinery::Pages.configure"
22
+ end
23
+ end
24
+ end
25
+ end
26
+ }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper"
2
+
3
+ module Refinery
4
+ module Pages
5
+ describe ContentPagePresenter do
6
+ let(:part) { double(PagePart, :body => 'part_body', :title => 'A Wonderful Page Part') }
7
+ let(:part2) { double(PagePart, :body => 'part_body2', :title => 'Another Wonderful Page Part') }
8
+ let(:title) { 'This Great Page' }
9
+
10
+ describe "when building for page" do
11
+ let(:page_with_one_part) { double(Page, :parts => [part]) }
12
+
13
+ it "adds page title section before page parts" do
14
+ content = ContentPagePresenter.new(page_with_one_part, title)
15
+ content.get_section(0).fallback_html.should == title
16
+ end
17
+
18
+ it "adds a section for each page part" do
19
+ page = double(Page, :parts => [part, part2])
20
+ content = ContentPagePresenter.new(page, title)
21
+ content.get_section(1).fallback_html.should == 'part_body'
22
+ content.get_section(2).fallback_html.should == 'part_body2'
23
+ end
24
+
25
+ it "adds body content left and right after page parts" do
26
+ content = ContentPagePresenter.new(page_with_one_part, title)
27
+ content.get_section(2).id.should == :body
28
+ content.get_section(3).id.should == :side_body
29
+ end
30
+
31
+ it "doesnt add page parts if page is nil" do
32
+ content = ContentPagePresenter.new(nil, title)
33
+ content.get_section(1).id.should == :body
34
+ end
35
+
36
+ it "doesnt add title if it is blank" do
37
+ content = ContentPagePresenter.new(nil, '')
38
+ content.get_section(0).id.should == :body
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,111 @@
1
+ require "spec_helper"
2
+
3
+ module Refinery
4
+ module Pages
5
+ describe ContentPresenter do
6
+ let(:section1) { double(SectionPresenter, :id => 'foo', :has_content? => true) }
7
+ let(:section2) { double(SectionPresenter, :id => 'bar', :has_content? => true) }
8
+
9
+ describe "when building css classes for blank sections" do
10
+ let(:section) { double(SectionPresenter, :not_present_css_class => 'no_section1') }
11
+
12
+ it "includes css class for any section which doesnt have content" do
13
+ section.stub(:has_content?).with(true).and_return(false)
14
+ content = ContentPresenter.new
15
+ content.add_section section
16
+
17
+ content.blank_section_css_classes(true).should == ['no_section1']
18
+ end
19
+
20
+ it "doesnt include sections which have content" do
21
+ section.stub(:has_content?).with(true).and_return(true)
22
+ content = ContentPresenter.new
23
+ content.add_section section
24
+
25
+ content.blank_section_css_classes(true).should be_empty
26
+ end
27
+ end
28
+
29
+ describe "when hiding sections" do
30
+ before do
31
+ @content = ContentPresenter.new
32
+ @content.add_section section1
33
+ @content.add_section section2
34
+ end
35
+
36
+ it "hides a section specified by id" do
37
+ section2.should_receive :hide
38
+ @content.hide_sections 'bar'
39
+ end
40
+
41
+ # Regression for https://github.com/resolve/refinerycms/issues/1516
42
+ it "accepts an array" do
43
+ section2.should_receive :hide
44
+ @content.hide_sections ['bar']
45
+ end
46
+
47
+ it "hides nothing if nil" do
48
+ section1.stub(:hidden?).and_return false
49
+ section2.stub(:hidden?).and_return false
50
+ @content.hide_sections nil
51
+ @content.hidden_sections.count.should == 0
52
+ end
53
+
54
+ end
55
+
56
+ describe "when fetching template overrides" do
57
+ before do
58
+ @content = ContentPresenter.new
59
+ end
60
+
61
+ it "yields a section with an id and stores the result in its override html" do
62
+ section = double(SectionPresenter, :id => 'foo')
63
+ section.should_receive(:override_html=).with('some override')
64
+ @content.add_section section
65
+
66
+ @content.fetch_template_overrides do |section_id|
67
+ section_id.should == 'foo'
68
+ 'some override'
69
+ end
70
+ end
71
+
72
+ it "doesnt yield a section without an id" do
73
+ section = double(SectionPresenter, :id => nil)
74
+ section.should_receive(:override_html=).never
75
+ @content.add_section section
76
+
77
+ @content.fetch_template_overrides do |section_id|
78
+ raise "this should not occur"
79
+ end
80
+ end
81
+ end
82
+
83
+ describe "when rendering as html" do
84
+ it "is empty section tag if it has no sections" do
85
+ content = ContentPresenter.new
86
+ content.to_html.should == "<section class=\"\" id=\"body_content\"></section>"
87
+ end
88
+
89
+ it "returns sections joined by a newline inside section tag" do
90
+ section1.stub(:wrapped_html).and_return('foo')
91
+ section2.stub(:wrapped_html).and_return('bar')
92
+ content = ContentPresenter.new([section1, section2])
93
+ content.to_html.should == "<section class=\"\" id=\"body_content\">foo\nbar</section>"
94
+ end
95
+
96
+ it "passes can_use_fallback option on to sections" do
97
+ section1.should_receive(:wrapped_html).with(false).and_return('foo')
98
+ content = ContentPresenter.new([section1])
99
+ content.to_html(false)
100
+ end
101
+
102
+ it "doesnt include sections with nil content" do
103
+ section1.stub(:wrapped_html).and_return('foo')
104
+ section2.stub(:wrapped_html).and_return(nil)
105
+ content = ContentPresenter.new([section1, section2])
106
+ content.to_html.should == "<section class=\"\" id=\"body_content\">foo</section>"
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ module Refinery
4
+ module Pages
5
+ describe PagePartSectionPresenter do
6
+ it "can be built from a page part" do
7
+ part = double(PagePart, :body => 'part_body', :title => 'A Wonderful Page Part')
8
+ section = PagePartSectionPresenter.new(part)
9
+ section.fallback_html.should == 'part_body'
10
+ section.id.should == :a_wonderful_page_part
11
+ end
12
+
13
+ it "marks the body as html safe" do
14
+ part = double(PagePart, :body => '<p>part_body</p>', :title => nil)
15
+ section = PagePartSectionPresenter.new(part)
16
+ section.fallback_html.should be_html_safe
17
+ section.wrapped_html.should == "<section><div class=\"inner\"><p>part_body</p></div></section>"
18
+ end
19
+
20
+ it "handles a nil page body" do
21
+ part = double(PagePart, :body => nil, :title => nil)
22
+ section = PagePartSectionPresenter.new(part)
23
+ section.fallback_html.should be_nil
24
+ section.wrapped_html.should be_nil
25
+ section.has_content?.should be_false
26
+ end
27
+
28
+ it "has no id if title is nil" do
29
+ part = double(PagePart, :body => 'foobar', :title => nil)
30
+ section = PagePartSectionPresenter.new(part)
31
+ section.id.should be_nil
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,86 @@
1
+ require "spec_helper"
2
+
3
+ module Refinery
4
+ module Pages
5
+ describe SectionPresenter do
6
+ it "can build a css class for when it is not present based on id" do
7
+ section = SectionPresenter.new(:fallback_html => 'foobar', :id => 'mynode')
8
+ section.not_present_css_class.should == 'no_mynode'
9
+ end
10
+
11
+ it "allows access to constructor arguments" do
12
+ section = SectionPresenter.new(:fallback_html => 'foobar', :id => 'mynode', :hidden => true)
13
+ section.fallback_html.should == 'foobar'
14
+ section.id.should == 'mynode'
15
+ section.should be_hidden
16
+ end
17
+
18
+ it "should be visible if not hidden" do
19
+ section = SectionPresenter.new(:hidden => false)
20
+ section.should be_visible
21
+ end
22
+
23
+ it "should be not visible if hidden" do
24
+ section = SectionPresenter.new(:hidden => true)
25
+ section.should_not be_visible
26
+ end
27
+
28
+ describe "when building html for a section" do
29
+ it "wont show a hidden section" do
30
+ section = SectionPresenter.new(:fallback_html => 'foobar', :hidden => true)
31
+ section.has_content?(true).should be_false
32
+ section.wrapped_html(true).should be_nil
33
+ end
34
+
35
+ it "can be hidden with the hide method" do
36
+ section = SectionPresenter.new(:fallback_html => 'foobar')
37
+ section.hide
38
+ section.has_content?(true).should be_false
39
+ section.wrapped_html(true).should be_nil
40
+ end
41
+
42
+ it "will use the specified id" do
43
+ section = SectionPresenter.new(:fallback_html => 'foobar', :id => 'mynode')
44
+ section.has_content?(true).should be_true
45
+ section.wrapped_html(true).should == '<section id="mynode"><div class="inner">foobar</div></section>'
46
+ end
47
+
48
+ describe "if allowed to use fallback html" do
49
+ it "wont show a section with no fallback or override" do
50
+ section = SectionPresenter.new
51
+ section.has_content?(true).should be_false
52
+ section.wrapped_html(true).should be_nil
53
+ end
54
+
55
+ it "uses wrapped fallback html" do
56
+ section = SectionPresenter.new(:fallback_html => 'foobar')
57
+ section.has_content?(true).should be_true
58
+ section.wrapped_html(true).should == '<section><div class="inner">foobar</div></section>'
59
+ end
60
+
61
+ it "uses wrapped override html if present" do
62
+ section = SectionPresenter.new(:fallback_html => 'foobar')
63
+ section.override_html = 'hello world'
64
+ section.has_content?(true).should be_true
65
+ section.wrapped_html(true).should == '<section><div class="inner">hello world</div></section>'
66
+ end
67
+ end
68
+
69
+ describe "if not allowed to use fallback html" do
70
+ it "wont show a section with no override" do
71
+ section = SectionPresenter.new(:fallback_html => 'foobar')
72
+ section.has_content?(false).should be_false
73
+ section.wrapped_html(false).should be_nil
74
+ end
75
+
76
+ it "uses wrapped override html if present" do
77
+ section = SectionPresenter.new(:fallback_html => 'foobar')
78
+ section.override_html = 'hello world'
79
+ section.has_content?(false).should be_true
80
+ section.wrapped_html(false).should == '<section><div class="inner">hello world</div></section>'
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ module Refinery
4
+ module Pages
5
+ describe TitleSectionPresenter do
6
+ describe "when building html for a section" do
7
+ it "wraps a title section in a title element" do
8
+ section = TitleSectionPresenter.new(:fallback_html => 'foobar')
9
+ section.has_content?(true).should be_true
10
+ section.wrapped_html(true).should == '<h1>foobar</h1>'
11
+ end
12
+
13
+ it "will use the specified id" do
14
+ section = TitleSectionPresenter.new(:fallback_html => 'foobar', :id => 'mynode')
15
+ section.has_content?(true).should be_true
16
+ section.wrapped_html(true).should == '<h1 id="mynode">foobar</h1>'
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ require "spec_helper"
2
+
3
+ module Refinery
4
+ describe Pages do
5
+ describe ".valid_templates" do
6
+ before do
7
+ File.open(File.join(subject.root, "spec", "ugisozols.html"), "w+") do
8
+ end
9
+ end
10
+
11
+ after { File.delete(File.join(subject.root, "spec", "ugisozols.html")) }
12
+
13
+ context "when pattern match valid templates" do
14
+ it "returns an array of valid templates" do
15
+ subject.valid_templates('spec', '*html*').should include("ugisozols")
16
+ end
17
+ end
18
+
19
+ context "when pattern doesn't match valid templates" do
20
+ it "returns empty array" do
21
+ subject.valid_templates('huh', '*html*').should == []
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end