locomotive_cms 1.0.0.beta → 1.0.0.beta.2
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/models/extensions/page/redirect.rb +25 -0
- data/app/models/page.rb +1 -0
- data/app/views/admin/pages/_form.html.haml +7 -2
- data/config/assets.yml +1 -0
- data/lib/locomotive/import/pages.rb +24 -3
- data/lib/locomotive/liquid/tags/extends.rb +9 -2
- data/lib/locomotive/misc_form_builder.rb +1 -1
- data/lib/locomotive/regexps.rb +2 -0
- data/lib/locomotive/render.rb +13 -3
- data/lib/locomotive/version.rb +1 -1
- data/public/javascripts/admin/pages.js +18 -1
- data/public/stylesheets/admin/application.css +0 -2
- data/public/stylesheets/admin/formtastic_changes.css +2 -0
- data/public/stylesheets/admin/inline_editor.css +1 -1
- metadata +5 -3
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Models
|
|
2
|
+
module Extensions
|
|
3
|
+
module Page
|
|
4
|
+
module Redirect
|
|
5
|
+
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
|
|
10
|
+
field :redirect, :type => Boolean, :default => false
|
|
11
|
+
|
|
12
|
+
field :redirect_url, :type => String
|
|
13
|
+
|
|
14
|
+
validates_presence_of :redirect_url, :if => :redirect
|
|
15
|
+
|
|
16
|
+
validates_format_of :redirect_url, :with => Locomotive::Regexps::URL, :allow_blank => true
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
data/app/models/page.rb
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
= f.input :slug, :required => false, :hint => @page.slug.blank? ? ' ' : @page.url, :input_html => { :data_url => get_path_admin_pages_url, :disabled => @page.index? || @page.not_found? }, :wrapper_html => { :style => "#{'display: none' if @page.templatized?}" }
|
|
13
13
|
|
|
14
|
-
= f.custom_input :templatized, :css => 'toggle' do
|
|
14
|
+
= f.custom_input :templatized, :css => 'toggle', :style => "#{'display: none' if @page.redirect?}" do
|
|
15
15
|
= f.check_box :templatized
|
|
16
16
|
|
|
17
17
|
= f.input :content_type_id, :as => :select, :collection => current_site.content_types.all.to_a, :include_blank => false, :wrapper_html => { :style => "#{'display: none' unless @page.templatized?}" }
|
|
@@ -19,7 +19,12 @@
|
|
|
19
19
|
= f.custom_input :published, :css => 'toggle' do
|
|
20
20
|
= f.check_box :published
|
|
21
21
|
|
|
22
|
-
= f.
|
|
22
|
+
= f.custom_input :redirect, :css => 'toggle', :style => "#{'display: none' if @page.templatized?}" do
|
|
23
|
+
= f.check_box :redirect
|
|
24
|
+
|
|
25
|
+
= f.input :cache_strategy, :as => :select, :collection => options_for_page_cache_strategy, :include_blank => false, :wrapper_html => { :style => "#{'display: none' if @page.redirect?}" }
|
|
26
|
+
|
|
27
|
+
= f.input :redirect_url, :required => true, :wrapper_html => { :style => "#{'display: none' unless @page.redirect?}" }
|
|
23
28
|
|
|
24
29
|
= render 'editable_elements', :page => @page
|
|
25
30
|
|
data/config/assets.yml
CHANGED
|
@@ -82,6 +82,7 @@ stylesheets:
|
|
|
82
82
|
- public/stylesheets/admin/buttons.css
|
|
83
83
|
- public/stylesheets/admin/formtastic.css
|
|
84
84
|
- public/stylesheets/admin/formtastic_changes.css
|
|
85
|
+
- public/stylesheets/admin/assets.css
|
|
85
86
|
- public/stylesheets/admin/application.css
|
|
86
87
|
- public/stylesheets/admin/safari.css
|
|
87
88
|
fancybox:
|
|
@@ -15,10 +15,21 @@ module Locomotive
|
|
|
15
15
|
|
|
16
16
|
self.add_page(fullpath)
|
|
17
17
|
end
|
|
18
|
+
|
|
19
|
+
# make sure all the pages were processed (redirection pages without template for instance)
|
|
20
|
+
self.pages.each { |fullpath, attributes| self.add_page_without_template(fullpath.to_s) }
|
|
18
21
|
end
|
|
19
22
|
|
|
20
23
|
protected
|
|
21
24
|
|
|
25
|
+
def add_page_without_template(fullpath)
|
|
26
|
+
page = context[:done][fullpath]
|
|
27
|
+
|
|
28
|
+
return page if page # already added, so skip it
|
|
29
|
+
|
|
30
|
+
self._save_page!(fullpath, nil)
|
|
31
|
+
end
|
|
32
|
+
|
|
22
33
|
def add_page(fullpath)
|
|
23
34
|
page = context[:done][fullpath]
|
|
24
35
|
|
|
@@ -30,6 +41,10 @@ module Locomotive
|
|
|
30
41
|
|
|
31
42
|
self.build_parent_template(template)
|
|
32
43
|
|
|
44
|
+
self._save_page!(fullpath, template)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def _save_page!(fullpath, template)
|
|
33
48
|
parent = self.find_parent(fullpath)
|
|
34
49
|
|
|
35
50
|
attributes = {
|
|
@@ -42,20 +57,22 @@ module Locomotive
|
|
|
42
57
|
|
|
43
58
|
# templatized ?
|
|
44
59
|
if content_type_slug = attributes.delete(:content_type)
|
|
45
|
-
fullpath.gsub!(/\/template$/, '/content_type_template')
|
|
46
60
|
attributes.merge!({
|
|
47
61
|
:templatized => true,
|
|
48
62
|
:content_type => site.content_types.where(:slug => content_type_slug).first
|
|
49
63
|
})
|
|
50
64
|
end
|
|
51
65
|
|
|
52
|
-
|
|
66
|
+
# redirection page ?
|
|
67
|
+
attributes[:redirect] = true if attributes[:redirect_url].present?
|
|
68
|
+
|
|
69
|
+
page = site.pages.where(:fullpath => self.sanitize_fullpath(fullpath)).first || site.pages.build
|
|
53
70
|
|
|
54
71
|
page.attributes = attributes
|
|
55
72
|
|
|
56
73
|
page.save!
|
|
57
74
|
|
|
58
|
-
self.log "adding #{page.fullpath} / #{page.position}"
|
|
75
|
+
self.log "adding #{page.fullpath} (#{template.blank? ? 'without' : 'with'} template) / #{page.position}"
|
|
59
76
|
|
|
60
77
|
site.reload
|
|
61
78
|
|
|
@@ -162,6 +179,10 @@ module Locomotive
|
|
|
162
179
|
pages
|
|
163
180
|
end
|
|
164
181
|
|
|
182
|
+
def sanitize_fullpath(fullpath)
|
|
183
|
+
fullpath.gsub(/\/template$/, '/content_type_template')
|
|
184
|
+
end
|
|
185
|
+
|
|
165
186
|
end
|
|
166
187
|
end
|
|
167
188
|
end
|
|
@@ -19,7 +19,9 @@ module Locomotive
|
|
|
19
19
|
def parse_parent_template
|
|
20
20
|
if @template_name == 'parent'
|
|
21
21
|
if @context[:cached_parent]
|
|
22
|
-
@context[:parent_page] = @context[:cached_parent]
|
|
22
|
+
@context[:parent_page] = @context[:cached_parent] #.clone # parent must not be modified
|
|
23
|
+
|
|
24
|
+
@context[:cached_parent].instance_variable_set(:@template, nil) # force to reload the template
|
|
23
25
|
@context[:cached_parent] = nil
|
|
24
26
|
else
|
|
25
27
|
@context[:parent_page] = @context[:page].parent
|
|
@@ -31,7 +33,12 @@ module Locomotive
|
|
|
31
33
|
|
|
32
34
|
raise PageNotFound.new("Page with fullpath '#{@template_name}' was not found") if @context[:parent_page].nil?
|
|
33
35
|
|
|
34
|
-
|
|
36
|
+
# be sure to work with a copy of the parent template otherwise there will be conflicts
|
|
37
|
+
parent_template = @context[:parent_page].template.clone
|
|
38
|
+
|
|
39
|
+
@context[:parent_page].instance_variable_set(:@template, parent_template)
|
|
40
|
+
|
|
41
|
+
parent_template
|
|
35
42
|
end
|
|
36
43
|
|
|
37
44
|
end
|
|
@@ -22,7 +22,7 @@ module Locomotive
|
|
|
22
22
|
html += inline_hints_for(name, options) || ''
|
|
23
23
|
html += self.errors_on(name) || ''
|
|
24
24
|
|
|
25
|
-
template.content_tag(:li, template.find_and_preserve(html), :class => "#{options[:css]} #{'error' unless @object.errors[name].empty?}")
|
|
25
|
+
template.content_tag(:li, template.find_and_preserve(html), :style => "#{options[:style]}", :class => "#{options[:css]} #{'error' unless @object.errors[name].empty?}")
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def inline_errors_on(method, options = nil)
|
data/lib/locomotive/regexps.rb
CHANGED
data/lib/locomotive/render.rb
CHANGED
|
@@ -9,10 +9,12 @@ module Locomotive
|
|
|
9
9
|
|
|
10
10
|
def render_locomotive_page
|
|
11
11
|
if request.fullpath =~ /^\/admin\//
|
|
12
|
-
render :template => "/admin/errors/404", :layout => '/admin/layouts/box', :status =>
|
|
12
|
+
render :template => "/admin/errors/404", :layout => '/admin/layouts/box', :status => :not_found
|
|
13
13
|
else
|
|
14
14
|
@page = locomotive_page
|
|
15
15
|
|
|
16
|
+
redirect_to(@page.redirect_url) and return if @page.present? && @page.redirect?
|
|
17
|
+
|
|
16
18
|
render_no_page_error and return if @page.nil?
|
|
17
19
|
|
|
18
20
|
output = @page.render(locomotive_context)
|
|
@@ -50,7 +52,7 @@ module Locomotive
|
|
|
50
52
|
end
|
|
51
53
|
end
|
|
52
54
|
|
|
53
|
-
page ||
|
|
55
|
+
page || not_found_page
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
def locomotive_context
|
|
@@ -91,13 +93,21 @@ module Locomotive
|
|
|
91
93
|
end
|
|
92
94
|
end
|
|
93
95
|
|
|
94
|
-
render :text => output, :layout => false, :status =>
|
|
96
|
+
render :text => output, :layout => false, :status => page_status
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def not_found_page
|
|
100
|
+
current_site.pages.not_found.published.first
|
|
95
101
|
end
|
|
96
102
|
|
|
97
103
|
def editing_page?
|
|
98
104
|
self.params[:editing] == true && current_admin
|
|
99
105
|
end
|
|
100
106
|
|
|
107
|
+
def page_status
|
|
108
|
+
@page == not_found_page ? :not_found : :ok
|
|
109
|
+
end
|
|
110
|
+
|
|
101
111
|
end
|
|
102
112
|
|
|
103
113
|
end
|
data/lib/locomotive/version.rb
CHANGED
|
@@ -26,7 +26,8 @@ $(document).ready(function() {
|
|
|
26
26
|
params += '&_method=put';
|
|
27
27
|
|
|
28
28
|
$.post($(this).attr('data_url'), params, function(data) {
|
|
29
|
-
|
|
29
|
+
var error = typeof(data.error) != 'undefined';
|
|
30
|
+
$.growl((error ? 'error' : 'success'), (error ? data.error : data.notice));
|
|
30
31
|
}, 'json');
|
|
31
32
|
}
|
|
32
33
|
});
|
|
@@ -35,15 +36,31 @@ $(document).ready(function() {
|
|
|
35
36
|
|
|
36
37
|
$.subscribe('toggle.page_templatized.checked', function(event, data) {
|
|
37
38
|
$('#page_slug_input').hide();
|
|
39
|
+
$('#page_redirect').parent('li').hide();
|
|
38
40
|
$('#page_content_type_id_input').show();
|
|
39
41
|
}, []);
|
|
40
42
|
|
|
41
43
|
$.subscribe('toggle.page_templatized.unchecked', function(event, data) {
|
|
42
44
|
$('#page_slug_input').show();
|
|
45
|
+
$('#page_redirect').parent('li').show();
|
|
43
46
|
$('#page_slug').val(makeSlug($('#page_title').val())).addClass('touched');
|
|
44
47
|
$('#page_content_type_id_input').hide();
|
|
45
48
|
}, []);
|
|
46
49
|
|
|
50
|
+
// redirect feature
|
|
51
|
+
|
|
52
|
+
$.subscribe('toggle.page_redirect.checked', function(event, data) {
|
|
53
|
+
$('#page_templatized').parent('li').hide();
|
|
54
|
+
$('#page_cache_strategy_input').hide();
|
|
55
|
+
$('#page_redirect_url_input').show();
|
|
56
|
+
}, []);
|
|
57
|
+
|
|
58
|
+
$.subscribe('toggle.page_redirect.unchecked', function(event, data) {
|
|
59
|
+
$('#page_templatized').parent('li').show();
|
|
60
|
+
$('#page_cache_strategy_input').show();
|
|
61
|
+
$('#page_redirect_url_input').hide();
|
|
62
|
+
}, []);
|
|
63
|
+
|
|
47
64
|
// automatic slug from page title
|
|
48
65
|
$('#page_title').keypress(function() {
|
|
49
66
|
var input = $(this);
|
|
@@ -171,6 +171,8 @@ form.formtastic div.actions a {
|
|
|
171
171
|
top: 4px;
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
+
form.formtastic div.actions a.remove { color: #ff092c !important; }
|
|
175
|
+
|
|
174
176
|
form.formtastic div.actions p a:hover { text-decoration: underline; }
|
|
175
177
|
|
|
176
178
|
form.formtastic div.actions .last p { text-align: right; }
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
left: 7px;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
#page-toolbar ul li.sep { float: left; margin: 0 15px 0 10px; }
|
|
92
|
+
#page-toolbar ul li.sep { float: left; margin: 0 15px 0 10px; width: auto !important; background: none !important; }
|
|
93
93
|
|
|
94
94
|
#page-toolbar ul li.sep span {
|
|
95
95
|
display: block;
|
metadata
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: locomotive_cms
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 62196359
|
|
5
5
|
prerelease: true
|
|
6
6
|
segments:
|
|
7
7
|
- 1
|
|
8
8
|
- 0
|
|
9
9
|
- 0
|
|
10
10
|
- beta
|
|
11
|
-
|
|
11
|
+
- 2
|
|
12
|
+
version: 1.0.0.beta.2
|
|
12
13
|
platform: ruby
|
|
13
14
|
authors:
|
|
14
15
|
- Didier Lafforgue
|
|
@@ -16,7 +17,7 @@ autorequire:
|
|
|
16
17
|
bindir: bin
|
|
17
18
|
cert_chain: []
|
|
18
19
|
|
|
19
|
-
date: 2011-01-
|
|
20
|
+
date: 2011-01-10 00:00:00 +01:00
|
|
20
21
|
default_executable:
|
|
21
22
|
dependencies:
|
|
22
23
|
- !ruby/object:Gem::Dependency
|
|
@@ -446,6 +447,7 @@ files:
|
|
|
446
447
|
- app/models/extensions/asset/vignette.rb
|
|
447
448
|
- app/models/extensions/page/editable_elements.rb
|
|
448
449
|
- app/models/extensions/page/parse.rb
|
|
450
|
+
- app/models/extensions/page/redirect.rb
|
|
449
451
|
- app/models/extensions/page/render.rb
|
|
450
452
|
- app/models/extensions/page/templatized.rb
|
|
451
453
|
- app/models/extensions/page/tree.rb
|