grat 0.0.8 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/grat.gemspec +1 -1
- data/lib/grat/content.rb +5 -1
- data/lib/grat/system.rb +24 -1
- data/lib/grat.rb +13 -6
- data/public/gratfiles/application.js +32 -15
- data/views/content_form.haml +5 -0
- metadata +1 -1
data/Rakefile
CHANGED
@@ -3,7 +3,7 @@ require 'rubygems'
|
|
3
3
|
require 'rake'
|
4
4
|
require 'echoe'
|
5
5
|
|
6
|
-
Echoe.new('grat', '0.0
|
6
|
+
Echoe.new('grat', '0.1.0') do |p|
|
7
7
|
p.summary = "Minimal CMS for Rack and MongoDB."
|
8
8
|
p.description = "Basic interface for making webpages with Haml and Erb. Supports nested templates."
|
9
9
|
p.url = "http://samsm.com/"
|
data/grat.gemspec
CHANGED
data/lib/grat/content.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
class Grat::Content
|
2
2
|
include MongoMapper::Document
|
3
3
|
|
4
|
+
attr_accessor :suggested_fields
|
5
|
+
|
4
6
|
key :url, String
|
5
7
|
validates_uniqueness_of :url
|
6
8
|
key :content, String
|
@@ -107,5 +109,7 @@ class Grat::Content
|
|
107
109
|
send "#{render_engine}_render", y, content, locals
|
108
110
|
end
|
109
111
|
|
110
|
-
|
112
|
+
def suggested_fields
|
113
|
+
@suggested_fields or []
|
114
|
+
end
|
111
115
|
end
|
data/lib/grat/system.rb
CHANGED
@@ -9,6 +9,17 @@ module Grat::System
|
|
9
9
|
collection
|
10
10
|
end
|
11
11
|
|
12
|
+
def request_type
|
13
|
+
case env['HTTP_ACCEPT']
|
14
|
+
when /html/
|
15
|
+
'html'
|
16
|
+
when /json/
|
17
|
+
'json'
|
18
|
+
when /xml/ #?
|
19
|
+
'xml'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
12
23
|
not_found do
|
13
24
|
missing_page
|
14
25
|
end
|
@@ -18,7 +29,19 @@ module Grat::System
|
|
18
29
|
end
|
19
30
|
|
20
31
|
def content
|
21
|
-
@content ||= model.find_by_url(url) ||
|
32
|
+
@content ||= model.find_by_url(url) || new_content
|
33
|
+
end
|
34
|
+
|
35
|
+
def new_content
|
36
|
+
content = model.new(:url => url)
|
37
|
+
if params[:template]
|
38
|
+
template = model.find_by_url params[:template]
|
39
|
+
if template
|
40
|
+
content.template_url = template.url
|
41
|
+
content.suggested_fields = template.default_content_vars.keys
|
42
|
+
end
|
43
|
+
end
|
44
|
+
content
|
22
45
|
end
|
23
46
|
|
24
47
|
def model
|
data/lib/grat.rb
CHANGED
@@ -101,12 +101,19 @@ class Grat::Application < Sinatra::Base
|
|
101
101
|
|
102
102
|
get '/*' do
|
103
103
|
pass if content.new_record?
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
104
|
+
|
105
|
+
case request_type
|
106
|
+
when 'html'
|
107
|
+
locals = {}
|
108
|
+
template_chain.inject('') do |sum, template|
|
109
|
+
locals = template.default_content_vars.
|
110
|
+
merge(template.attributes_for_variables).
|
111
|
+
merge(locals)
|
112
|
+
combine_docs(sum,template, locals)
|
113
|
+
end
|
114
|
+
when 'json'
|
115
|
+
response['Content-Type'] = 'application/json'
|
116
|
+
content.to_json
|
110
117
|
end
|
111
118
|
end
|
112
119
|
|
@@ -1,5 +1,22 @@
|
|
1
1
|
// once page is loaded ...
|
2
2
|
$(document).ready(function(){
|
3
|
+
$('.template select').change(function() {
|
4
|
+
// if template has url
|
5
|
+
selected_option = $(this).val()
|
6
|
+
if (selected_option) {
|
7
|
+
// look up template data
|
8
|
+
$.getJSON(selected_option, {ajax: 'true'}, function(j) {
|
9
|
+
// clear current suggested fields -- in future check for data first
|
10
|
+
$('#suggested_fields').html('');
|
11
|
+
for (key in j['default_content_vars']) {
|
12
|
+
new_field = '<div class="'+ key +'"><label for="content['+ key +']">'+ key +'</label><input name="content['+ key +']" /></div>';
|
13
|
+
$.test = new_field;
|
14
|
+
$('#suggested_fields').append(new_field);
|
15
|
+
}
|
16
|
+
})
|
17
|
+
}
|
18
|
+
})
|
19
|
+
|
3
20
|
// New field button + features
|
4
21
|
$('a[href=#new_field]').click(function(){
|
5
22
|
|
@@ -30,22 +47,22 @@ $(document).ready(function(){
|
|
30
47
|
input.attr('name',new_name);
|
31
48
|
})
|
32
49
|
|
33
|
-
// Move to input field on enter
|
50
|
+
// Move to input field on enter
|
34
51
|
editable.keypress(function(event){
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
52
|
+
|
53
|
+
// move to field input is cancelled if enter is pressed
|
54
|
+
if (event.which == 13) {
|
55
|
+
|
56
|
+
// Remove editing class -- should add edited class maybe
|
57
|
+
editable.removeClass('editing');
|
58
|
+
|
59
|
+
// forward to text input
|
60
|
+
$(editable).parent().children().filter('input').focus();
|
61
|
+
return false
|
62
|
+
} else {
|
63
|
+
return event.which
|
64
|
+
}
|
65
|
+
});
|
49
66
|
|
50
67
|
editable.change(function() {
|
51
68
|
console.log('blur');
|
data/views/content_form.haml
CHANGED
@@ -33,6 +33,11 @@
|
|
33
33
|
%div{:class => k}
|
34
34
|
%label{:for => form_nest(k)}= k.capitalize
|
35
35
|
%input{:name => form_nest(k), :value => v}
|
36
|
+
#suggested_fields
|
37
|
+
- content.suggested_fields.each do |field|
|
38
|
+
%div{:class => field}
|
39
|
+
%label{:for => form_nest(field)}= field.capitalize
|
40
|
+
%input{:name => form_nest(field)}
|
36
41
|
#new_fields
|
37
42
|
%p
|
38
43
|
%a.add{:href=>'#new_field'} Add a New Field
|