effective_pages 0.8.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.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +30 -0
  4. data/Rakefile +24 -0
  5. data/app/assets/javascripts/effective_pages.js +0 -0
  6. data/app/assets/stylesheets/effective_pages/dropdown-submenu.css +7 -0
  7. data/app/assets/stylesheets/effective_pages.css.scss +1 -0
  8. data/app/controllers/admin/menus_controller.rb +79 -0
  9. data/app/controllers/admin/pages_controller.rb +95 -0
  10. data/app/controllers/effective/pages_controller.rb +24 -0
  11. data/app/helpers/effective_menus_helper.rb +151 -0
  12. data/app/helpers/effective_pages_helper.rb +14 -0
  13. data/app/models/effective/access_denied.rb +17 -0
  14. data/app/models/effective/datatables/menus.rb +16 -0
  15. data/app/models/effective/datatables/pages.rb +19 -0
  16. data/app/models/effective/menu.rb +152 -0
  17. data/app/models/effective/menu_item.rb +68 -0
  18. data/app/models/effective/page.rb +32 -0
  19. data/app/views/admin/menu_items/_actions.html.haml +4 -0
  20. data/app/views/admin/menu_items/_expand.html.haml +2 -0
  21. data/app/views/admin/menu_items/_item.html.haml +13 -0
  22. data/app/views/admin/menu_items/_new.html.haml +3 -0
  23. data/app/views/admin/menus/_actions.html.haml +4 -0
  24. data/app/views/admin/menus/_form.html.haml +9 -0
  25. data/app/views/admin/menus/edit.html.haml +2 -0
  26. data/app/views/admin/menus/index.html.haml +9 -0
  27. data/app/views/admin/menus/new.html.haml +2 -0
  28. data/app/views/admin/pages/_actions.html.haml +14 -0
  29. data/app/views/admin/pages/_form.html.haml +31 -0
  30. data/app/views/admin/pages/edit.html.haml +2 -0
  31. data/app/views/admin/pages/index.html.haml +9 -0
  32. data/app/views/admin/pages/new.html.haml +2 -0
  33. data/config/routes.rb +28 -0
  34. data/db/migrate/01_create_effective_pages.rb.erb +52 -0
  35. data/lib/effective_pages/engine.rb +19 -0
  36. data/lib/effective_pages/version.rb +3 -0
  37. data/lib/effective_pages.rb +73 -0
  38. data/lib/generators/effective_pages/install_generator.rb +43 -0
  39. data/lib/generators/templates/README +1 -0
  40. data/lib/generators/templates/effective_pages.rb +49 -0
  41. data/lib/generators/templates/example.html.haml +6 -0
  42. data/lib/tasks/effective_pages_tasks.rake +29 -0
  43. data/spec/controllers/effective/pages_controller_spec.rb +66 -0
  44. data/spec/dummy/README.rdoc +261 -0
  45. data/spec/dummy/Rakefile +7 -0
  46. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  47. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  48. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  49. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  50. data/spec/dummy/app/views/effective/pages/example.html.haml +2 -0
  51. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  52. data/spec/dummy/config/application.rb +66 -0
  53. data/spec/dummy/config/boot.rb +10 -0
  54. data/spec/dummy/config/database.yml +25 -0
  55. data/spec/dummy/config/environment.rb +5 -0
  56. data/spec/dummy/config/environments/development.rb +37 -0
  57. data/spec/dummy/config/environments/production.rb +67 -0
  58. data/spec/dummy/config/environments/test.rb +37 -0
  59. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  60. data/spec/dummy/config/initializers/inflections.rb +15 -0
  61. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  62. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  63. data/spec/dummy/config/initializers/session_store.rb +8 -0
  64. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  65. data/spec/dummy/config/locales/en.yml +5 -0
  66. data/spec/dummy/config/routes.rb +60 -0
  67. data/spec/dummy/config.ru +4 -0
  68. data/spec/dummy/db/migrate/01_create_effective_pages.rb +51 -0
  69. data/spec/dummy/db/schema.rb +52 -0
  70. data/spec/dummy/db/test.sqlite3 +0 -0
  71. data/spec/dummy/public/404.html +26 -0
  72. data/spec/dummy/public/422.html +26 -0
  73. data/spec/dummy/public/500.html +25 -0
  74. data/spec/dummy/public/favicon.ico +0 -0
  75. data/spec/dummy/script/rails +6 -0
  76. data/spec/dummy/spec_link +3 -0
  77. data/spec/effective_pages_spec.rb +7 -0
  78. data/spec/helpers/effective_menus_helper_spec.rb +281 -0
  79. data/spec/models/effective/menu_spec.rb +133 -0
  80. data/spec/spec_helper.rb +43 -0
  81. data/spec/support/factories.rb +15 -0
  82. metadata +261 -0
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run Dummy::Application
@@ -0,0 +1,51 @@
1
+ class CreateEffectivePages < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :pages do |t|
4
+ t.string :title
5
+ t.string :meta_description
6
+
7
+ t.boolean :draft, :default => false
8
+
9
+ t.string :layout, :default => 'application'
10
+ t.string :template
11
+
12
+ t.string :slug
13
+ t.integer :roles_mask, :default => 0
14
+
15
+ t.datetime :updated_at
16
+ t.datetime :created_at
17
+ end
18
+ add_index :pages, :slug, :unique => true
19
+
20
+ create_table :menus do |t|
21
+ t.string :title
22
+ t.timestamps
23
+ end
24
+
25
+ create_table :menu_items do |t|
26
+ t.integer :menu_id
27
+
28
+ t.integer :menuable_id
29
+ t.string :menuable_type
30
+
31
+ t.string :title
32
+ t.string :url
33
+ t.string :classes
34
+ t.string :special
35
+ t.boolean :new_window, :default => false
36
+ t.integer :roles_mask, :default => nil
37
+
38
+ t.integer :lft
39
+ t.integer :rgt
40
+ end
41
+ add_index :menu_items, :lft
42
+
43
+ end
44
+
45
+ def self.down
46
+ drop_table :pages
47
+ drop_table :menus
48
+ drop_table :menu_items
49
+ end
50
+
51
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended to check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(:version => 1) do
15
+
16
+ create_table "menu_items", :force => true do |t|
17
+ t.integer "menu_id"
18
+ t.integer "menuable_id"
19
+ t.string "menuable_type"
20
+ t.string "title"
21
+ t.string "url"
22
+ t.string "classes"
23
+ t.string "special"
24
+ t.boolean "new_window", :default => false
25
+ t.integer "roles_mask"
26
+ t.integer "lft"
27
+ t.integer "rgt"
28
+ end
29
+
30
+ add_index "menu_items", ["lft"], :name => "index_menu_items_on_lft"
31
+
32
+ create_table "menus", :force => true do |t|
33
+ t.string "title"
34
+ t.datetime "created_at", :null => false
35
+ t.datetime "updated_at", :null => false
36
+ end
37
+
38
+ create_table "pages", :force => true do |t|
39
+ t.string "title"
40
+ t.string "meta_description"
41
+ t.boolean "draft", :default => false
42
+ t.string "layout", :default => "application"
43
+ t.string "template"
44
+ t.string "slug"
45
+ t.integer "roles_mask", :default => 0
46
+ t.datetime "updated_at"
47
+ t.datetime "created_at"
48
+ end
49
+
50
+ add_index "pages", ["slug"], :name => "index_pages_on_slug", :unique => true
51
+
52
+ end
Binary file
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ </body>
25
+ </html>
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,3 @@
1
+ You may have to link this to ../../spec
2
+
3
+ spec/dummy > ln -s ../../spec spec
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe EffectivePages do
4
+ it 'should be a module' do
5
+ assert_kind_of Module, EffectivePages
6
+ end
7
+ end
@@ -0,0 +1,281 @@
1
+ require 'spec_helper'
2
+
3
+ describe EffectiveMenusHelper do
4
+ describe 'render_menu' do
5
+
6
+ it 'correctly renders a menu with items' do
7
+ menu = Effective::Menu.new(:title => 'test').build do
8
+ item 'AAA'
9
+ item 'BBB'
10
+ end
11
+
12
+ render_menu(menu).should eq "
13
+ <ul class='nav navbar-nav'>
14
+ <li>
15
+ <a href='#'>AAA</a>
16
+ </li>
17
+ <li>
18
+ <a href='#'>BBB</a>
19
+ </li>
20
+ </ul>
21
+ ".gsub("\n", '').gsub(' ', '')
22
+ end
23
+
24
+ it 'correctly renders a divider' do
25
+ menu = Effective::Menu.new(:title => 'test').build do
26
+ item 'AAA'
27
+ item :divider
28
+ item 'BBB'
29
+ end
30
+
31
+ render_menu(menu).should eq "
32
+ <ul class='nav navbar-nav'>
33
+ <li>
34
+ <a href='#'>AAA</a>
35
+ </li>
36
+ <li class='divider'></li>
37
+ <li>
38
+ <a href='#'>BBB</a>
39
+ </li>
40
+ </ul>
41
+ ".gsub("\n", '').gsub(' ', '')
42
+ end
43
+
44
+ it 'correctly renders a menu with dropdowns' do
45
+ menu = Effective::Menu.new(:title => 'test').build do
46
+ dropdown 'About' do
47
+ item 'AAA'
48
+ item 'BBB'
49
+ end
50
+
51
+ dropdown 'Become a Member' do
52
+ item '111'
53
+ divider
54
+ item '222'
55
+ end
56
+
57
+ item 'XXX'
58
+ end.tap { |menu| menu.save }
59
+
60
+ render_menu('test').should eq "
61
+ <ul class='nav navbar-nav'>
62
+ <li class='dropdown'>
63
+ <a href='#' data-toggle='dropdown'>
64
+ About
65
+ <span class='caret'></span>
66
+ </a>
67
+ <ul class='dropdown-menu'>
68
+ <li>
69
+ <a href='#'>AAA</a>
70
+ </li>
71
+ <li>
72
+ <a href='#'>BBB</a>
73
+ </li>
74
+ </ul>
75
+ </li>
76
+ <li class='dropdown'>
77
+ <a href='#' data-toggle='dropdown'>
78
+ Become a Member
79
+ <span class='caret'></span>
80
+ </a>
81
+ <ul class='dropdown-menu'>
82
+ <li>
83
+ <a href='#'>111</a>
84
+ </li>
85
+ <li class='divider'></li>
86
+ <li>
87
+ <a href='#'>222</a>
88
+ </li>
89
+ </ul>
90
+ </li>
91
+ <li>
92
+ <a href='#'>XXX</a>
93
+ </li>
94
+ </ul>
95
+ ".gsub("\n", '').gsub(' ', '')
96
+ end
97
+
98
+ it 'correctly builds a menu with dropdowns inside dropdowns' do
99
+ menu = Effective::Menu.new(:title => 'test').build do
100
+ dropdown 'Fruit' do
101
+ dropdown 'Red' do
102
+ item 'Cherry'
103
+ end
104
+
105
+ dropdown 'Yellow' do
106
+ item 'Banana'
107
+ end
108
+ end
109
+
110
+ dropdown 'Meat' do
111
+ item 'Beef'
112
+ item 'Pork'
113
+ end
114
+ end.tap { |menu| menu.save }
115
+
116
+ render_menu('test').should eq "
117
+ <ul class='nav navbar-nav'>
118
+ <li class='dropdown'>
119
+ <a href='#' data-toggle='dropdown'>
120
+ Fruit
121
+ <span class='caret'></span>
122
+ </a>
123
+ <ul class='dropdown-menu'>
124
+ <li class='dropdown'>
125
+ <a href='#' data-toggle='dropdown'>Red</a>
126
+ <ul class='dropdown-menu'>
127
+ <li>
128
+ <a href='#'>Cherry</a>
129
+ </li>
130
+ </ul>
131
+ </li>
132
+ <li class='dropdown'>
133
+ <a href='#' data-toggle='dropdown'>Yellow</a>
134
+ <ul class='dropdown-menu'>
135
+ <li>
136
+ <a href='#'>Banana</a>
137
+ </li>
138
+ </ul>
139
+ </li>
140
+ </ul>
141
+ </li>
142
+ <li class='dropdown'>
143
+ <a href='#' data-toggle='dropdown'>
144
+ Meat
145
+ <span class='caret'></span>
146
+ </a>
147
+ <ul class='dropdown-menu'>
148
+ <li>
149
+ <a href='#'>Beef</a>
150
+ </li>
151
+ <li>
152
+ <a href='#'>Pork</a>
153
+ </li>
154
+ </ul>
155
+ </li>
156
+ </ul>
157
+ ".gsub("\n", '').gsub(' ', '')
158
+ end
159
+
160
+ it 'correctly renders a menu with dropdowns in dropdowns and items' do
161
+ menu = Effective::Menu.new(:title => 'test').build do
162
+ dropdown 'Events' do
163
+ item 'Conferences'
164
+
165
+ dropdown 'Workshops' do
166
+ dropdown 'AAA' do
167
+ item '111'
168
+ end
169
+ item 'BBB'
170
+ end
171
+ end
172
+ end.tap { |menu| menu.save }
173
+
174
+ render_menu('test', :class => 'something').should eq "
175
+ <ul class='nav navbar-nav something'>
176
+ <li class='dropdown'>
177
+ <a href='#' data-toggle='dropdown'>
178
+ Events
179
+ <span class='caret'></span>
180
+ </a>
181
+ <ul class='dropdown-menu'>
182
+ <li>
183
+ <a href='#'>Conferences</a>
184
+ </li>
185
+ <li class='dropdown'>
186
+ <a href='#' data-toggle='dropdown'>Workshops</a>
187
+ <ul class='dropdown-menu'>
188
+ <li class='dropdown'>
189
+ <a href='#' data-toggle='dropdown'>AAA</a>
190
+ <ul class='dropdown-menu'>
191
+ <li>
192
+ <a href='#'>111</a>
193
+ </li>
194
+ </ul>
195
+ </li>
196
+ <li>
197
+ <a href='#'>BBB</a>
198
+ </li>
199
+ </ul>
200
+ </li>
201
+ </ul>
202
+ </li>
203
+ </ul>
204
+ ".gsub("\n", '').gsub(' ', '')
205
+ end
206
+
207
+ it 'hides private items when user is not logged in' do
208
+ menu = Effective::Menu.new(:title => 'test').build do
209
+ dropdown 'About' do
210
+ item 'AAA'
211
+ item 'BBB', '#', :private => true # private => true and roles_mask => 0 do the same thing
212
+ item 'CCC'
213
+ end
214
+
215
+ dropdown 'Become a Member' do
216
+ item '111'
217
+
218
+ dropdown 'More...', :roles_mask => 0 do
219
+ item 'ABC'
220
+ end
221
+
222
+ item '222'
223
+ end
224
+
225
+ item 'XXX'
226
+ end.tap { |menu| menu.save }
227
+
228
+ render_menu('test').should eq "
229
+ <ul class='nav navbar-nav'>
230
+ <li class='dropdown'>
231
+ <a href='#' data-toggle='dropdown'>
232
+ About
233
+ <span class='caret'></span>
234
+ </a>
235
+ <ul class='dropdown-menu'>
236
+ <li>
237
+ <a href='#'>AAA</a>
238
+ </li>
239
+ <li>
240
+ <a href='#'>CCC</a>
241
+ </li>
242
+ </ul>
243
+ </li>
244
+ <li class='dropdown'>
245
+ <a href='#' data-toggle='dropdown'>
246
+ Become a Member
247
+ <span class='caret'></span>
248
+ </a>
249
+ <ul class='dropdown-menu'>
250
+ <li>
251
+ <a href='#'>111</a>
252
+ </li>
253
+ <li>
254
+ <a href='#'>222</a>
255
+ </li>
256
+ </ul>
257
+ </li>
258
+ <li>
259
+ <a href='#'>XXX</a>
260
+ </li>
261
+ </ul>
262
+ ".gsub("\n", '').gsub(' ', '')
263
+ end
264
+
265
+ it 'displays an empty menu when all nodes are private' do
266
+ menu = Effective::Menu.new(:title => 'test').build do
267
+ item 'AAA', '#', :private => true
268
+ dropdown 'More...', :private => true do
269
+ item 'ABC'
270
+ end
271
+ item 'BBB', '#', :private => true
272
+ end.tap { |menu| menu.save }
273
+
274
+ render_menu('test').should eq "
275
+ <ul class='nav navbar-nav'>
276
+ </ul>
277
+ ".gsub("\n", '').gsub(' ', '')
278
+ end
279
+
280
+ end
281
+ end