page_engine 0.0.3 → 0.0.4
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/app/assets/javascripts/page_engine.js +53 -50
- data/app/assets/stylesheets/page_engine.css +2 -0
- data/app/controllers/admin/pages_controller.rb +1 -3
- data/app/helpers/pages_helper.rb +64 -71
- data/app/models/page.rb +6 -18
- data/app/views/admin/pages/_form.html.haml +3 -3
- data/app/views/admin/pages/_page_part_fields.html.haml +1 -1
- data/app/views/admin/pages/duplicate.js.erb +0 -4
- data/app/views/admin/pages/index.html.haml +1 -1
- data/app/views/pages/_nav_item.html.haml +1 -1
- data/lib/generators/page_engine/install/install_generator.rb +64 -0
- data/lib/page_engine/extensions.rb +12 -8
- data/lib/page_engine/instance_methods.rb +6 -6
- data/lib/page_engine.rb +31 -0
- data/spec/dummy/app/assets/stylesheets/application.css +250 -0
- data/spec/dummy/app/controllers/application_controller.rb +1 -1
- data/spec/dummy/app/views/layouts/application.html.haml +5 -3
- data/spec/dummy/config/initializers/page_engine.rb +13 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/log/development.log +18618 -0
- data/spec/dummy/tmp/cache/assets/BF5/7E0/sprockets%2F1681222188324d465309541f4e71f6e8 +0 -0
- data/spec/dummy/tmp/cache/assets/C1F/4A0/sprockets%2Fb257125f39b2a708d678262f26152408 +0 -0
- data/spec/dummy/tmp/cache/assets/C38/BB0/sprockets%2F122300de3f3142028abb055394919a47 +0 -0
- data/spec/dummy/tmp/cache/assets/C51/920/sprockets%2F3522c83d77303240c3548fdd7d186194 +0 -0
- data/spec/dummy/tmp/cache/assets/C54/B60/sprockets%2F08007599d13c8b8205959be4709d103d +0 -0
- data/spec/dummy/tmp/cache/assets/C83/E20/sprockets%2F2d6f03d170965f27d7626502373e8cd2 +0 -0
- data/spec/dummy/tmp/cache/assets/C8E/6D0/sprockets%2F10a754e99f089474b072c71eeb960954 +0 -0
- data/spec/dummy/tmp/cache/assets/CAD/1B0/sprockets%2F12cb3832e2e7e34236067e9e350b8c73 +0 -0
- data/spec/dummy/tmp/cache/assets/CB8/880/sprockets%2F3b651a5763758db2fc0347488e69a3e1 +0 -0
- data/spec/dummy/tmp/cache/assets/CBA/0A0/sprockets%2F2983f7dd6130a7c24892da333c18d779 +0 -0
- data/spec/dummy/tmp/cache/assets/CD0/CA0/sprockets%2F719e10ea5f5b1c20b6518a1d3432774e +0 -0
- data/spec/dummy/tmp/cache/assets/CD1/EB0/sprockets%2Fba17700b36ee975c05d06042a6af9631 +0 -0
- data/spec/dummy/tmp/cache/assets/CD5/8B0/sprockets%2F31178c43077cb48bfc81217ad0872cd1 +0 -0
- data/spec/dummy/tmp/cache/assets/CDA/A30/sprockets%2Fd1a7692303d59c495dd61cd1d41246b5 +0 -0
- data/spec/dummy/tmp/cache/assets/CDD/D20/sprockets%2F070d2bf7a81574ee0e560e174737a17f +0 -0
- data/spec/dummy/tmp/cache/assets/CE0/CD0/sprockets%2Fd206c4ec51748382823dee1e7f28055a +0 -0
- data/spec/dummy/tmp/cache/assets/CE3/690/sprockets%2F9531c78d64b8651a60dd128573bbe7e1 +0 -0
- data/spec/dummy/tmp/cache/assets/CE3/C10/sprockets%2F05a63f093f971cd73662695fab452b0f +0 -0
- data/spec/dummy/tmp/cache/assets/CE7/770/sprockets%2F56570f527d86457c48485cedb2d1c30c +0 -0
- data/spec/dummy/tmp/cache/assets/CEE/2B0/sprockets%2F75f58ee42279991f91ac43260b9b0fe3 +0 -0
- data/spec/dummy/tmp/cache/assets/CF2/E60/sprockets%2F6cf94481464e607960899cc38adac2b6 +0 -0
- data/spec/dummy/tmp/cache/assets/D09/2D0/sprockets%2F731ea2f82a086d10ff127d30c994f53b +0 -0
- data/spec/dummy/tmp/cache/assets/D0D/000/sprockets%2Fbb689a9183e1482be8c02ab4f536083b +0 -0
- data/spec/dummy/tmp/cache/assets/D13/FF0/sprockets%2Fd62e2814c718d1a22c84c7b3a78eb948 +0 -0
- data/spec/dummy/tmp/cache/assets/D16/BA0/sprockets%2F141f6d67a3871387dc3a1a9963de0de7 +0 -0
- data/spec/dummy/tmp/cache/assets/D17/DD0/sprockets%2F04f75f0ecb38c984675d23a9144d2be7 +0 -0
- data/spec/dummy/tmp/cache/assets/D1A/140/sprockets%2Fe5dbcc46887452182b85e8da04994ea0 +0 -0
- data/spec/dummy/tmp/cache/assets/D1F/620/sprockets%2F5eb71efe5276c4b5c148cd75958e2760 +0 -0
- data/spec/dummy/tmp/cache/assets/D23/570/sprockets%2Fb79b2bd85b952ef68724f54e3344dd66 +0 -0
- data/spec/dummy/tmp/cache/assets/D26/4D0/sprockets%2Faa9fd545084f66b324662ca8f48c88f9 +0 -0
- data/spec/dummy/tmp/cache/assets/D27/2F0/sprockets%2F6b6e52b5006574d3fef8d34ef639978d +0 -0
- data/spec/dummy/tmp/cache/assets/D30/ED0/sprockets%2Fea74cc14e1532ac70f928d8d205c5a13 +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/D33/E40/sprockets%2F06b596c4052fc9ad352a54ac0871cf2c +0 -0
- data/spec/dummy/tmp/cache/assets/D3B/4D0/sprockets%2Faf8a08611a00ade8c7f16d626708eb67 +0 -0
- data/spec/dummy/tmp/cache/assets/D3E/740/sprockets%2F62194496bd7f322f3b2f6f2bf602e1fb +0 -0
- data/spec/dummy/tmp/cache/assets/D3F/170/sprockets%2F13df698b0cd7e1f7045913a1c6a96cc4 +0 -0
- data/spec/dummy/tmp/cache/assets/D3F/7C0/sprockets%2F42286191d1dec5e46ae8f89a0af0d147 +0 -0
- data/spec/dummy/tmp/cache/assets/D40/720/sprockets%2Fe798537f2ae8abbbac509070c9e06506 +0 -0
- data/spec/dummy/tmp/cache/assets/D45/CF0/sprockets%2F577ac52ab81ab676640dda59969cce32 +0 -0
- data/spec/dummy/tmp/cache/assets/D47/1D0/sprockets%2F904ef275b101c77ee529b4fe7cf323f7 +0 -0
- data/spec/dummy/tmp/cache/assets/D4A/D90/sprockets%2F4f476e9f41ff71e1045d03fc36de6c66 +0 -0
- data/spec/dummy/tmp/cache/assets/D4C/EE0/sprockets%2F7ee487bf0d625668f3fcb075c89a420d +0 -0
- data/spec/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +0 -0
- data/spec/dummy/tmp/cache/assets/D60/DB0/sprockets%2Fb2b29acaab38e7049fd950a381e05f11 +0 -0
- data/spec/dummy/tmp/cache/assets/D68/450/sprockets%2F7290abaa3947f361fb72cb333692beaf +0 -0
- data/spec/dummy/tmp/cache/assets/D69/910/sprockets%2F05abeb33740bac77bef60b5445695c8c +0 -0
- data/spec/dummy/tmp/cache/assets/D6B/230/sprockets%2F744429c3ae6d8aadf46550ee21cc58b1 +0 -0
- data/spec/dummy/tmp/cache/assets/D6C/7E0/sprockets%2Fd3abe581052fc2ffd33b9f465b477b14 +0 -0
- data/spec/dummy/tmp/cache/assets/D70/280/sprockets%2F99a543e2b6be1d37c3ccc8a90261f87a +0 -0
- data/spec/dummy/tmp/cache/assets/D70/330/sprockets%2F292913c88244b67cdb46da1eed327fda +0 -0
- data/spec/dummy/tmp/cache/assets/D71/520/sprockets%2F018fdf705225eaa53bc9c287ebd68c91 +0 -0
- data/spec/dummy/tmp/cache/assets/D71/5D0/sprockets%2Fc8e0dae5e23b4b3941152e3b87e7f7c6 +0 -0
- data/spec/dummy/tmp/cache/assets/D73/830/sprockets%2F38d93d829b7d163c372f3acd557c2eab +0 -0
- data/spec/dummy/tmp/cache/assets/D74/120/sprockets%2Ffbe442bef82371edd6525fe5622de319 +0 -0
- data/spec/dummy/tmp/cache/assets/D77/7C0/sprockets%2Fcf660249e6eb81370e70cfe24d771dfe +0 -0
- data/spec/dummy/tmp/cache/assets/D7C/660/sprockets%2Fbb4ce966494c0b544c7ea5f4e9c2b866 +0 -0
- data/spec/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
- data/spec/dummy/tmp/cache/assets/D87/FA0/sprockets%2Fed7ffae98375a3c9819ee641f00e388d +0 -0
- data/spec/dummy/tmp/cache/assets/D92/E50/sprockets%2F09a8ce459d99efe497507cad2ed88f56 +0 -0
- data/spec/dummy/tmp/cache/assets/D93/670/sprockets%2Fdf4cd8447459d7b31b077d0af7aba00b +0 -0
- data/spec/dummy/tmp/cache/assets/D94/0C0/sprockets%2Fac68f40dcce2850b0fdd7dfb91505115 +0 -0
- data/spec/dummy/tmp/cache/assets/D96/AE0/sprockets%2F6c450fd116d891f54a32bcfcbd4b762b +0 -0
- data/spec/dummy/tmp/cache/assets/DA2/0E0/sprockets%2F71a404ff712a059b23edee96c9bfcd75 +0 -0
- data/spec/dummy/tmp/cache/assets/DA6/860/sprockets%2Ff5526cc6647cdd14b05aed999377abbc +0 -0
- data/spec/dummy/tmp/cache/assets/DA7/5F0/sprockets%2Fe92688bcadd7fcddd86227c04b9712e1 +0 -0
- data/spec/dummy/tmp/cache/assets/DA7/6A0/sprockets%2Fa6745bdd80053c25a9ee2d81e96adef9 +0 -0
- data/spec/dummy/tmp/cache/assets/DA9/890/sprockets%2Fd1501c9a42bbc34f0cc11eae60b2e22e +0 -0
- data/spec/dummy/tmp/cache/assets/DB7/5A0/sprockets%2Fd2fac77222901b5da4abcf1c225d91db +0 -0
- data/spec/dummy/tmp/cache/assets/DBE/A90/sprockets%2F40e8db6da00eac4d36841aa33ff46fb3 +0 -0
- data/spec/dummy/tmp/cache/assets/DC6/E60/sprockets%2F415f6a64519b7c8ae296dbbafeb105ba +0 -0
- data/spec/dummy/tmp/cache/assets/DC8/660/sprockets%2Fbafd7b9ed0b0c06ed5e283463ad4c547 +0 -0
- data/spec/dummy/tmp/cache/assets/DCA/BB0/sprockets%2F1a792cae50966aef0d0d4131fe5fafd9 +0 -0
- data/spec/dummy/tmp/cache/assets/DD0/D40/sprockets%2Fc5ad6e6949709508d0dbdb0b1a7ecbe9 +0 -0
- data/spec/dummy/tmp/cache/assets/DD9/E90/sprockets%2Fd44526e0ec17dcbbccf7e14db768e869 +0 -0
- data/spec/dummy/tmp/cache/assets/DDC/270/sprockets%2Fadb8f369db4f8784c76fd2ee1d3633ac +0 -0
- data/spec/dummy/tmp/cache/assets/DDE/420/sprockets%2F69cf180e779eb3095cebe85edbfc22b7 +0 -0
- data/spec/dummy/tmp/cache/assets/DE0/250/sprockets%2F1559ff83d17dd6b788d6ab7fada65ee1 +0 -0
- data/spec/dummy/tmp/cache/assets/DE1/B40/sprockets%2F9c7deec5e90b5957c6d5b31ded7fe074 +0 -0
- data/spec/dummy/tmp/cache/assets/DFB/2A0/sprockets%2F801140d7903bfebe6accecc7fc9f71e2 +0 -0
- data/spec/dummy/tmp/cache/assets/E01/830/sprockets%2F3359db498c5ca08b6ff0a5fe54c8acda +0 -0
- data/spec/dummy/tmp/cache/assets/E04/7E0/sprockets%2Fee9c0f735fc2fed82f00e66fa71bc91d +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/E32/C40/sprockets%2Faade2bb8a94be3f057fe7d4a6fd65a84 +0 -0
- data/spec/dummy/tmp/cache/assets/E51/940/sprockets%2F5c78b0ffb0472ccdce1fea8dad2142bf +0 -0
- data/spec/dummy/tmp/cache/assets/E70/2B0/sprockets%2F7eedcfada8bf8bff28c96d9ea93521d3 +0 -0
- data/spec/dummy/tmp/pids/server.pid +1 -0
- data/vendor/assets/javascripts/codemirror/codemirror.js +2164 -0
- data/vendor/assets/javascripts/codemirror/modes/css.js +124 -0
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +348 -0
- data/vendor/assets/javascripts/codemirror/overlay.js +51 -0
- data/vendor/assets/javascripts/codemirror/runmode.js +27 -0
- data/vendor/assets/stylesheets/codemirror/codemirror.css +68 -0
- data/vendor/assets/stylesheets/codemirror/themes/cobalt.css +17 -0
- data/vendor/assets/stylesheets/codemirror/themes/default.css +19 -0
- data/vendor/assets/stylesheets/codemirror/themes/elegant.css +9 -0
- data/vendor/assets/stylesheets/codemirror/themes/neat.css +8 -0
- data/vendor/assets/stylesheets/codemirror/themes/night.css +20 -0
- metadata +194 -18
- data/lib/generators/page_engine/page_engine_generator.rb +0 -60
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
//= require markitup/sets/css/set
|
|
7
7
|
//= require markitup/sets/javascript/set
|
|
8
8
|
//= require jquery.ui.nestedSortable
|
|
9
|
+
//= require codemirror/codemirror
|
|
10
|
+
//= require codemirror/modes/javascript
|
|
11
|
+
//= require codemirror/modes/css
|
|
9
12
|
|
|
10
13
|
$(document).ready(function(){
|
|
11
14
|
|
|
@@ -50,6 +53,14 @@ $(document).ready(function(){
|
|
|
50
53
|
return false;
|
|
51
54
|
});
|
|
52
55
|
|
|
56
|
+
$('select.filter').live('change', function(){
|
|
57
|
+
check_filter($(this));
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
$('select.filter').each(function(){
|
|
61
|
+
check_filter($(this));
|
|
62
|
+
});
|
|
63
|
+
|
|
53
64
|
$('textarea[data-filter=css]').each(function(){
|
|
54
65
|
add_css($(this));
|
|
55
66
|
});
|
|
@@ -57,50 +68,6 @@ $(document).ready(function(){
|
|
|
57
68
|
$('textarea[data-filter=javascript]').each(function(){
|
|
58
69
|
add_javascript($(this));
|
|
59
70
|
});
|
|
60
|
-
|
|
61
|
-
$('textarea[data-filter=textile]').each(function(){
|
|
62
|
-
add_textile($(this));
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
$('textarea[data-filter=markdown]').each(function(){
|
|
66
|
-
add_markdown($(this));
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
$('textarea[data-filter=html]').each(function(){
|
|
70
|
-
add_html($(this));
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
$('select.filter').live('change', function(){
|
|
74
|
-
textarea = $('#' + $(this).attr('rel'));
|
|
75
|
-
filter = textarea.attr('data-filter');
|
|
76
|
-
|
|
77
|
-
switch ($(this).val()){
|
|
78
|
-
case 'html':
|
|
79
|
-
add_html(textarea)
|
|
80
|
-
textarea.attr('data-filter', 'html');
|
|
81
|
-
break;
|
|
82
|
-
case 'textile':
|
|
83
|
-
add_textile(textarea);
|
|
84
|
-
textarea.attr('data-filter', 'textile');
|
|
85
|
-
break;
|
|
86
|
-
case 'markdown':
|
|
87
|
-
add_markdown(textarea);
|
|
88
|
-
textarea.attr('data-filter', 'markdown');
|
|
89
|
-
break;
|
|
90
|
-
case 'erb':
|
|
91
|
-
remove_editors(textarea);
|
|
92
|
-
textarea.attr('data-filter', 'erb');
|
|
93
|
-
break;
|
|
94
|
-
case 'erb+textile':
|
|
95
|
-
add_textile(textarea)
|
|
96
|
-
textarea.attr('data-filter', 'erb+textile');
|
|
97
|
-
break;
|
|
98
|
-
case 'none':
|
|
99
|
-
remove_editors(textarea);
|
|
100
|
-
textarea.attr('data-filter', 'none');
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
71
|
|
|
105
72
|
$('#page_no_publish_window').change(function(){
|
|
106
73
|
$('.edit_page .field.publish_from').toggle('slide');
|
|
@@ -129,6 +96,37 @@ $(document).ready(function(){
|
|
|
129
96
|
});
|
|
130
97
|
});
|
|
131
98
|
|
|
99
|
+
check_filter = function(filter){
|
|
100
|
+
textarea = $('#' + filter.attr('rel'));
|
|
101
|
+
|
|
102
|
+
switch (filter.val()){
|
|
103
|
+
case 'html':
|
|
104
|
+
add_html(textarea)
|
|
105
|
+
textarea.attr('data-filter', 'html');
|
|
106
|
+
break;
|
|
107
|
+
case 'textile':
|
|
108
|
+
add_textile(textarea);
|
|
109
|
+
textarea.attr('data-filter', 'textile');
|
|
110
|
+
break;
|
|
111
|
+
case 'markdown':
|
|
112
|
+
add_markdown(textarea);
|
|
113
|
+
textarea.attr('data-filter', 'markdown');
|
|
114
|
+
break;
|
|
115
|
+
case 'erb':
|
|
116
|
+
remove_editors(textarea);
|
|
117
|
+
textarea.attr('data-filter', 'erb');
|
|
118
|
+
break;
|
|
119
|
+
case 'erb+textile':
|
|
120
|
+
add_textile(textarea)
|
|
121
|
+
textarea.attr('data-filter', 'erb+textile');
|
|
122
|
+
break;
|
|
123
|
+
case 'none':
|
|
124
|
+
remove_editors(textarea);
|
|
125
|
+
textarea.attr('data-filter', 'none');
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
132
130
|
add_html = function(textarea){
|
|
133
131
|
remove_editors(textarea);
|
|
134
132
|
textarea.markItUp(markitup_html_settings);
|
|
@@ -148,15 +146,19 @@ add_markdown = function(textarea){
|
|
|
148
146
|
}
|
|
149
147
|
|
|
150
148
|
add_css = function(textarea){
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
149
|
+
CodeMirror.fromTextArea(document.getElementById(textarea.attr('id')), {
|
|
150
|
+
lineNumbers: true,
|
|
151
|
+
matchBrackets: true,
|
|
152
|
+
mode: 'css'
|
|
153
|
+
});
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
add_javascript = function(textarea){
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
157
|
+
CodeMirror.fromTextArea(document.getElementById(textarea.attr('id')), {
|
|
158
|
+
lineNumbers: true,
|
|
159
|
+
matchBrackets: true,
|
|
160
|
+
mode: 'javascript'
|
|
161
|
+
});
|
|
160
162
|
}
|
|
161
163
|
|
|
162
164
|
remove_editors = function(textarea){
|
|
@@ -185,5 +187,6 @@ add_fields = function(link, association, content){
|
|
|
185
187
|
} else {
|
|
186
188
|
alert('You need to specify a name');
|
|
187
189
|
}
|
|
190
|
+
return false;
|
|
188
191
|
}
|
|
189
192
|
|
|
@@ -26,10 +26,9 @@ class Admin::PagesController < ApplicationController
|
|
|
26
26
|
# GET /pages/new.xml
|
|
27
27
|
def new
|
|
28
28
|
@page = Page.new
|
|
29
|
-
|
|
29
|
+
PageEngine.page_parts.collect { |page_part| @page.page_parts.build(:title => page_part) }
|
|
30
30
|
@parent = Page.find_by_permalink(params[:page_id])
|
|
31
31
|
@roles = PageEngine.class_exists?('Role') ? Role.all : []
|
|
32
|
-
@page_part_index = 0
|
|
33
32
|
|
|
34
33
|
respond_to do |format|
|
|
35
34
|
format.html # new.html.erb
|
|
@@ -44,7 +43,6 @@ class Admin::PagesController < ApplicationController
|
|
|
44
43
|
@page = @page.first
|
|
45
44
|
@parent = @page.parent
|
|
46
45
|
@roles = PageEngine.class_exists?('Role') ? Role.all : []
|
|
47
|
-
@page_part_index = 0
|
|
48
46
|
end
|
|
49
47
|
|
|
50
48
|
# POST /pages
|
data/app/helpers/pages_helper.rb
CHANGED
|
@@ -10,11 +10,11 @@ module PagesHelper
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def page_js(options={})
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}.merge(options
|
|
13
|
+
options = {
|
|
14
|
+
:with_tags => true
|
|
15
|
+
}.with_indifferent_access.merge(options)
|
|
16
16
|
|
|
17
|
-
if
|
|
17
|
+
if options[:with_tags]
|
|
18
18
|
if @page && !@page.js.blank?
|
|
19
19
|
javascript_tag do
|
|
20
20
|
@page.js
|
|
@@ -26,11 +26,11 @@ module PagesHelper
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def page_css(options={})
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}.merge(options
|
|
29
|
+
options = {
|
|
30
|
+
:with_tags => true
|
|
31
|
+
}.with_indifferent_access.merge(options)
|
|
32
32
|
|
|
33
|
-
if
|
|
33
|
+
if options[:with_tags]
|
|
34
34
|
if @page && !@page.css.blank?
|
|
35
35
|
content_tag :style do
|
|
36
36
|
@page.css
|
|
@@ -97,30 +97,30 @@ module PagesHelper
|
|
|
97
97
|
|
|
98
98
|
# Return the specified page part content
|
|
99
99
|
def page_content(options={})
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}.merge
|
|
100
|
+
options = {
|
|
101
|
+
:page => @page,
|
|
102
|
+
:part => 'body'
|
|
103
|
+
}.with_indifferent_access.merge(options)
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
options[:page].page_parts.detect { |p| p.title == options[:part].to_s } if options[:page]
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
def page_snippet(name, options={})
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}.merge(options
|
|
109
|
+
options = {
|
|
110
|
+
:default_text => 'Page snippet not found',
|
|
111
|
+
:tag => nil,
|
|
112
|
+
:class => ['page_snippet'],
|
|
113
|
+
:id => nil
|
|
114
|
+
}.with_indifferent_access.merge(options)
|
|
115
115
|
|
|
116
116
|
page_snippet = PageSnippet.find_by_name(name.to_s)
|
|
117
117
|
|
|
118
|
-
if
|
|
119
|
-
content_tag
|
|
120
|
-
page_snippet ? page_snippet :
|
|
118
|
+
if options[:tag]
|
|
119
|
+
content_tag options[:tag], :class => options[:class], :id => options[:id] do
|
|
120
|
+
page_snippet ? page_snippet : options[:default_text]
|
|
121
121
|
end
|
|
122
122
|
else
|
|
123
|
-
page_snippet ? page_snippet :
|
|
123
|
+
page_snippet ? page_snippet : options[:default_text]
|
|
124
124
|
end
|
|
125
125
|
end
|
|
126
126
|
|
|
@@ -142,76 +142,69 @@ module PagesHelper
|
|
|
142
142
|
# * seperator: The text or character that will seperate the breadcrumbs. Defaults to " » "
|
|
143
143
|
# * format: choices are "ul" or "inline". "ul" displays the breadcrumb links in an unordered list whilst "inline" displays them inline in a containing div. Defaults to "ul"
|
|
144
144
|
def breadcrumbs(options={})
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}.merge
|
|
145
|
+
options = {
|
|
146
|
+
:breadcrumbs => @breadcrumbs,
|
|
147
|
+
:page => @page,
|
|
148
|
+
:seperator => ' » ',
|
|
149
|
+
:format => :ul
|
|
150
|
+
}.with_indifferent_access.merge(options)
|
|
151
151
|
|
|
152
|
-
case
|
|
153
|
-
when
|
|
154
|
-
content_tag :div, :class =>
|
|
155
|
-
links =
|
|
156
|
-
links += content_tag(:span, replace_title_for(
|
|
152
|
+
case options[:format]
|
|
153
|
+
when :inline
|
|
154
|
+
content_tag :div, :class => :breadcrumbs do
|
|
155
|
+
links = options[:breadcrumbs].collect.with_index { |breadcrumb, i| link_to_page(breadcrumb, :class => "crumb_#{i}") + options[:seperator].html_safe }.join().html_safe
|
|
156
|
+
links += content_tag(:span, replace_title_for(options[:page]), :class => 'current_page') if options[:page]
|
|
157
157
|
end
|
|
158
158
|
|
|
159
|
-
when
|
|
160
|
-
content_tag :ul, :class =>
|
|
161
|
-
links =
|
|
162
|
-
links += content_tag(:li, replace_title_for(
|
|
159
|
+
when :ul
|
|
160
|
+
content_tag :ul, :class => :breadcrumbs do
|
|
161
|
+
links = options[:breadcrumbs].collect.with_index { |breadcrumb, i| content_tag(:li, link_to_page(breadcrumb, :class => "crumb_#{i}")) }.join().html_safe
|
|
162
|
+
links += content_tag(:li, replace_title_for(options[:page]), :class => 'current_page') if options[:page]
|
|
163
163
|
end
|
|
164
164
|
|
|
165
165
|
else
|
|
166
|
-
'Please choose one of
|
|
166
|
+
'Please choose one of :inline or :ul as a format'
|
|
167
167
|
end
|
|
168
168
|
end
|
|
169
169
|
|
|
170
170
|
# Options:
|
|
171
|
+
# * root: The root of the navigation structure
|
|
171
172
|
# * current: The current_page if not @page
|
|
172
173
|
# * depth: The number of levels in the tree to traverse. Defaults to 2
|
|
173
174
|
# * class: The class of the containing ul. Defaults to ""
|
|
174
175
|
# * id: The id of the containing id. Defaults to ""
|
|
175
|
-
# * link_current: Set to true if the current page should have a link. Defaults to false
|
|
176
|
-
def navigation(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
176
|
+
# * link_current: Set to true if the current page should have a link. Defaults to false
|
|
177
|
+
def navigation(options={})
|
|
178
|
+
options = {
|
|
179
|
+
:root => nil,
|
|
180
|
+
:current => @page,
|
|
181
|
+
:class => 'nav',
|
|
182
|
+
:id => '',
|
|
183
|
+
:include_root => false,
|
|
184
|
+
:link_current => false,
|
|
185
|
+
:depth => 2
|
|
186
|
+
}.with_indifferent_access.merge(options)
|
|
185
187
|
|
|
186
188
|
current_user = nil unless defined?(current_user)
|
|
187
|
-
|
|
188
|
-
root_page = Page.published_or_hidden.viewable_by(current_user)
|
|
189
189
|
|
|
190
|
-
if
|
|
191
|
-
root_page =
|
|
190
|
+
if options[:root].is_a?(NilClass)
|
|
191
|
+
root_page = Page.published_or_hidden.viewable_by(current_user).root_only.first
|
|
192
|
+
elsif options[:root].is_a?(Page)
|
|
193
|
+
root_page = options[:root]
|
|
194
|
+
elsif options[:root].is_a?(String)
|
|
195
|
+
root_page = Page.published_or_hidden.viewable_by(current_user).where('pages.url = :root or pages.permalink = :root', :root => options[:root]).first
|
|
196
|
+
elsif options[:root].is_a?(Hash)
|
|
197
|
+
options[:root].stringify_keys!
|
|
198
|
+
root_page = Page.published_or_hidden.viewable_by(current_user).where(:controller => options[:root][:controller], :action => options[:root][:action]).first
|
|
192
199
|
else
|
|
193
|
-
|
|
200
|
+
return "<p><em>Error:</em> Root must be a page, a permalink, a url or a hash containing the controller and action, got: #{root.class.to_s}.</p>".html_safe
|
|
194
201
|
end
|
|
195
202
|
|
|
196
|
-
return "<p><em>Error:</em> Root page not found</p>".html_safe unless root_page
|
|
203
|
+
return "<p><em>Error:</em> Root page not found: #{options[:root]}</p>".html_safe unless root_page
|
|
197
204
|
|
|
198
|
-
grouped_pages = root_page.self_and_descendants.viewable_by(current_user).shown_in_menu.published.group_by(&:parent_id)
|
|
205
|
+
grouped_pages = root_page.self_and_descendants.viewable_by(current_user).shown_in_menu.published.for_nav.group_by(&:parent_id)
|
|
199
206
|
|
|
200
|
-
render 'pages/navigation', :options =>
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
def filter_select(target, options={})
|
|
204
|
-
default_options = {
|
|
205
|
-
'builder' => nil,
|
|
206
|
-
'object' => nil,
|
|
207
|
-
'attribute' => nil
|
|
208
|
-
}.merge!(options.stringify_keys)
|
|
209
|
-
|
|
210
|
-
if default_options['builder']
|
|
211
|
-
default_options['builder'].select(default_options['attribute'], Page.filters, {}, { :class => 'filter', :rel => target })
|
|
212
|
-
else
|
|
213
|
-
select_tag(default_options['object'], default_options['attribute'], Page.filters, {}, { :class => 'filter', :rel => target })
|
|
214
|
-
end
|
|
207
|
+
render 'pages/navigation', :options => options, :root_page => root_page, :grouped_pages => grouped_pages, :level => 1
|
|
215
208
|
end
|
|
216
209
|
|
|
217
210
|
private
|
data/app/models/page.rb
CHANGED
|
@@ -42,6 +42,7 @@ class Page < ActiveRecord::Base
|
|
|
42
42
|
scope :shown_in_sitemap, where({ :display_in_sitemap => true })
|
|
43
43
|
scope :shown_in_menu, where({ :display_in_menu => true })
|
|
44
44
|
scope :just_controller_and_actions, select("controller || '|' || action as taken").group('taken')
|
|
45
|
+
scope :for_nav, select([:id, :title, :parent_id, :menu_css_class, :no_link, :url, :controller, :action, :permalink])
|
|
45
46
|
|
|
46
47
|
attr_accessor :no_publish_window, :controller_action
|
|
47
48
|
|
|
@@ -112,7 +113,7 @@ class Page < ActiveRecord::Base
|
|
|
112
113
|
page
|
|
113
114
|
end
|
|
114
115
|
|
|
115
|
-
def is_viewable_by?
|
|
116
|
+
def is_viewable_by?(user)
|
|
116
117
|
if PageEngine.class_exists?('Role')
|
|
117
118
|
if PageEngine.class_exists?('User') && user
|
|
118
119
|
return true if self.roles.length == 0
|
|
@@ -151,27 +152,14 @@ class Page < ActiveRecord::Base
|
|
|
151
152
|
end
|
|
152
153
|
|
|
153
154
|
class << self
|
|
154
|
-
attr_accessor :layouts
|
|
155
155
|
|
|
156
|
-
def breadcrumbs_for
|
|
156
|
+
def breadcrumbs_for(user, url)
|
|
157
157
|
root = Page.published.viewable_by(user).find_by_url(url)
|
|
158
158
|
root.nil? ? [] : root.self_and_ancestors
|
|
159
159
|
end
|
|
160
|
-
|
|
161
|
-
def status_values
|
|
162
|
-
["Draft", "Published", "Review", "Hidden"]
|
|
163
|
-
end
|
|
164
160
|
|
|
165
161
|
def default_layout
|
|
166
|
-
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
def filters
|
|
170
|
-
%w{ none html textile markdown erb erb+textile }
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
def page_parts
|
|
174
|
-
%w{ body left right header footer }
|
|
162
|
+
PageEngine.layouts.first
|
|
175
163
|
end
|
|
176
164
|
|
|
177
165
|
# Scopes
|
|
@@ -189,7 +177,7 @@ class Page < ActiveRecord::Base
|
|
|
189
177
|
end
|
|
190
178
|
end
|
|
191
179
|
|
|
192
|
-
def with_roles
|
|
180
|
+
def with_roles(roles)
|
|
193
181
|
if Extras.class_exists?('Role')
|
|
194
182
|
includes(:roles).where([ "roles.id IN (?)", roles.join(',') ])
|
|
195
183
|
else
|
|
@@ -197,7 +185,7 @@ class Page < ActiveRecord::Base
|
|
|
197
185
|
end
|
|
198
186
|
end
|
|
199
187
|
|
|
200
|
-
def with_url
|
|
188
|
+
def with_url(request, params)
|
|
201
189
|
url = request.fullpath
|
|
202
190
|
url.gsub!(/\?.*/, '') # Strip away anything after the ? as it's not needed
|
|
203
191
|
|
|
@@ -29,20 +29,20 @@
|
|
|
29
29
|
= f.input :js, :label => 'Javascript', :input_html => { 'data-filter' => 'javascript' }
|
|
30
30
|
= f.input :meta_description
|
|
31
31
|
= f.input :meta_keywords
|
|
32
|
-
= f.input :status, :as => :select, :collection =>
|
|
32
|
+
= f.input :status, :as => :select, :collection => PageEngine.statuses, :include_blank => false
|
|
33
33
|
= f.input :no_publish_window, :as => :boolean
|
|
34
34
|
= f.input :publish_from, :order => [:day, :month, :year]
|
|
35
35
|
= f.input :publish_to, :order => [:day, :month, :year]
|
|
36
36
|
= f.input :url
|
|
37
37
|
|
|
38
|
-
= f.input :controller_action do
|
|
38
|
+
= f.input :controller_action, :as => :select do
|
|
39
39
|
= f.select :controller_action, grouped_options_for_select(@routes), :include_blank => true
|
|
40
40
|
|
|
41
41
|
= f.input :display_in_menu
|
|
42
42
|
= f.input :display_in_sitemap
|
|
43
43
|
= f.input :menu_css_class
|
|
44
44
|
= f.input :no_link
|
|
45
|
-
= f.input :layout, :as => :select, :collection =>
|
|
45
|
+
= f.input :layout, :as => :select, :collection => PageEngine.layouts, :include_blank => false
|
|
46
46
|
|
|
47
47
|
- if PageEngine.class_exists?('Asset')
|
|
48
48
|
.field.attached_assets
|
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
= f.error_notification
|
|
6
6
|
|
|
7
7
|
= f.input :title, :class => 'page_part_title'
|
|
8
|
-
= f.input :filter, :collection =>
|
|
8
|
+
= f.input :filter, :collection => PageEngine.filters, :include_blank => false, :class => 'filter', :input_html => { :class => 'filter', :rel => "page_part_content_#{f.object.id}" }
|
|
9
9
|
= f.input :content, :input_html => { 'data-filter' => f.object.filter, :class => 'editor ignore_tab', :id => "page_part_content_#{f.object.id}" }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
%h2 Pages
|
|
2
2
|
%p
|
|
3
|
-
= link_to
|
|
3
|
+
= link_to('New root page', new_admin_page_path, :class => 'icon_left add')
|
|
4
4
|
|
|
5
5
|
%ol#page_engine.list{ 'data-href' => sort_admin_pages_path }
|
|
6
6
|
= render @pages[nil] if @pages[nil]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module PageEngine
|
|
2
|
+
module Generators
|
|
3
|
+
require 'rails/generators'
|
|
4
|
+
require 'rails/generators/migration'
|
|
5
|
+
|
|
6
|
+
class InstallGenerator < Rails::Generators::Base
|
|
7
|
+
include Rails::Generators::Migration
|
|
8
|
+
desc "This generator installs PageEngine supporting assets"
|
|
9
|
+
|
|
10
|
+
source_root File.expand_path('../../../../', __FILE__)
|
|
11
|
+
|
|
12
|
+
def self.next_migration_number(path)
|
|
13
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def install
|
|
17
|
+
create_migrations
|
|
18
|
+
copy_stylesheets
|
|
19
|
+
copy_javascripts
|
|
20
|
+
copy_images
|
|
21
|
+
|
|
22
|
+
copy_file 'app/views/layouts/admin.html.haml', 'app/views/layouts/admin.html.haml'
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def create_migrations
|
|
28
|
+
begin
|
|
29
|
+
migration_template 'db/migrate/20110814185929_create_page_engine.rb', 'db/migrate/create_page_engine.rb'
|
|
30
|
+
rescue Exception => e
|
|
31
|
+
puts e
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def copy_stylesheets
|
|
36
|
+
directory 'app/assets/stylesheets', 'public/stylesheets'
|
|
37
|
+
directory 'vendor/assets/stylesheets', 'public/stylesheets'
|
|
38
|
+
|
|
39
|
+
puts 'Updating image location'
|
|
40
|
+
['css', 'textile', 'markdown', 'html', 'javascript'].each do |area|
|
|
41
|
+
gsub_file "public/stylesheets/markitup/sets/#{area}/style.css", /\/assets\//, '/images/'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
['markitup', 'simple'].each do |area|
|
|
45
|
+
gsub_file "public/stylesheets/markitup/skins/#{area}/style.css", /\/assets\//, '/images/'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
gsub_file "public/stylesheets/jquery-ui.css", /\/assets\//, '/images/'
|
|
49
|
+
gsub_file "public/stylesheets/page_engine.css", /\/assets\//, '/images/'
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def copy_javascripts
|
|
53
|
+
directory 'app/assets/javascripts', 'public/javascripts'
|
|
54
|
+
directory 'vendor/assets/javascripts', 'public/javascripts'
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def copy_images
|
|
58
|
+
directory 'app/assets/images', 'public/images'
|
|
59
|
+
directory 'vendor/assets/images', 'public/images'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end if Rails.version < "3.1"
|
|
@@ -4,14 +4,18 @@ require 'page_engine/exceptions'
|
|
|
4
4
|
|
|
5
5
|
class << ActionController::Base
|
|
6
6
|
def page_engine(options = {})
|
|
7
|
+
# # Check options
|
|
8
|
+
# raise PageEngine::PageEngineException.new("Options for page_engine must be in a hash.") unless options.is_a? Hash
|
|
9
|
+
#
|
|
10
|
+
# options = {
|
|
11
|
+
# :layouts = ['application']
|
|
12
|
+
# }.merge(options)
|
|
7
13
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
end
|
|
14
|
-
end
|
|
14
|
+
# options.each do |key, value|
|
|
15
|
+
# unless [:layouts].include?(key)
|
|
16
|
+
# raise PageEngine::PageEngineException.new("Unknown option for page_engine: #{key.inspect} => #{value.inspect}.")
|
|
17
|
+
# end
|
|
18
|
+
# end
|
|
15
19
|
|
|
16
20
|
include PageEngine::InstanceMethods
|
|
17
21
|
extend PageEngine::ClassMethods
|
|
@@ -19,6 +23,6 @@ class << ActionController::Base
|
|
|
19
23
|
before_filter :find_page
|
|
20
24
|
layout :get_layout
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
# PageEngine.layouts = options[:layouts].is_a?(Array) ? options[:layouts] : ['application']
|
|
23
27
|
end
|
|
24
28
|
end
|
|
@@ -2,13 +2,13 @@ module PageEngine
|
|
|
2
2
|
module InstanceMethods
|
|
3
3
|
def get_layout
|
|
4
4
|
if @page
|
|
5
|
-
@page.layout.blank? ? Page.default_layout : @page.layout
|
|
5
|
+
@page.layout.blank? ? Page.default_layout.to_s : @page.layout.to_s
|
|
6
6
|
else
|
|
7
|
-
Page.default_layout
|
|
7
|
+
Page.default_layout.to_s
|
|
8
8
|
end
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
def find_page
|
|
11
|
+
def find_page(permalink=nil)
|
|
12
12
|
current_user = nil unless defined?(current_user)
|
|
13
13
|
|
|
14
14
|
unless params[:controller].split('/').first == "admin"
|
|
@@ -23,7 +23,7 @@ module PageEngine
|
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
def page_title_replace
|
|
26
|
+
def page_title_replace(models=[])
|
|
27
27
|
models.each do |m|
|
|
28
28
|
key = m.class.to_s.underscore
|
|
29
29
|
@page.title.scan(/\{\{#{key}_([_a-z]*)\}\}/).uniq.flatten.each do |attribute|
|
|
@@ -43,7 +43,7 @@ module PageEngine
|
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
def breadcrumb_replace
|
|
46
|
+
def breadcrumb_replace(models=[])
|
|
47
47
|
models.each do |m|
|
|
48
48
|
key = m.class.to_s.underscore
|
|
49
49
|
@breadcrumbs.each do |breadcrumb|
|
|
@@ -72,7 +72,7 @@ module PageEngine
|
|
|
72
72
|
def get_breadcrumbs
|
|
73
73
|
current_user = nil unless defined?(current_user)
|
|
74
74
|
if @page
|
|
75
|
-
@breadcrumbs = @page.ancestors.published.viewable_by(current_user).all
|
|
75
|
+
@breadcrumbs = @page.ancestors.for_nav.published.viewable_by(current_user).all
|
|
76
76
|
else
|
|
77
77
|
@breadcrumbs = []
|
|
78
78
|
end
|