common-content 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -20
- data/README.textile +55 -55
- data/Rakefile +29 -29
- data/app/assets/javascripts/application.js +15 -15
- data/app/assets/javascripts/contents.js.coffee +16 -16
- data/app/assets/javascripts/jquery-ui-1.8.21.custom.min.js +124 -124
- data/app/assets/stylesheets/bootstrap_and_overrides.css.less +29 -29
- data/app/assets/stylesheets/contents.css.less +6 -6
- data/app/assets/stylesheets/scaffolds.css.less +62 -62
- data/app/controllers/contents_controller.rb +99 -99
- data/app/helpers/contents_helper.rb +27 -34
- data/app/models/content.rb +71 -66
- data/app/models/textile.rb +15 -15
- data/app/views/contents/_array_form.html.erb +13 -13
- data/app/views/contents/_child_content_fields.html.erb +8 -14
- data/app/views/contents/_content.xml.builder +3 -3
- data/app/views/contents/_fields_edit.html.erb +7 -7
- data/app/views/contents/_fields_new.html.erb +12 -14
- data/app/views/contents/_navigation.html.erb +13 -0
- data/app/views/contents/_resource_fields.html.erb +23 -21
- data/app/views/contents/_seo_fields.html.erb +21 -21
- data/app/views/contents/_show_children.html.erb +10 -10
- data/app/views/contents/edit.html.erb +51 -44
- data/app/views/contents/index.html.erb +33 -34
- data/app/views/contents/index.xml.builder +4 -4
- data/app/views/contents/new.html.erb +13 -13
- data/app/views/contents/show.html.erb +25 -25
- data/app/views/layouts/contents.html.erb +46 -64
- data/config/routes.rb +9 -9
- data/lib/common-content.rb +4 -4
- data/lib/common-content/engine.rb +7 -7
- data/lib/common-content/version.rb +3 -3
- data/lib/tasks/common-content_tasks.rake +4 -4
- metadata +44 -73
@@ -1,29 +1,29 @@
|
|
1
|
-
@import "twitter/bootstrap/bootstrap";
|
2
|
-
body { padding-top: 60px; }
|
3
|
-
|
4
|
-
@import "twitter/bootstrap/responsive";
|
5
|
-
|
6
|
-
// Set the correct sprite paths
|
7
|
-
@iconSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings.png');
|
8
|
-
@iconWhiteSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings-white.png');
|
9
|
-
|
10
|
-
// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines)
|
11
|
-
@fontAwesomeEotPath: asset-path('fontawesome-webfont.eot');
|
12
|
-
@fontAwesomeWoffPath: asset-path('fontawesome-webfont.woff');
|
13
|
-
@fontAwesomeTtfPath: asset-path('fontawesome-webfont.ttf');
|
14
|
-
@fontAwesomeSvgzPath: asset-path('fontawesome-webfont.svgz');
|
15
|
-
@fontAwesomeSvgPath: asset-path('fontawesome-webfont.svg');
|
16
|
-
|
17
|
-
// Font Awesome
|
18
|
-
@import "fontawesome";
|
19
|
-
|
20
|
-
// Your custom LESS stylesheets goes here
|
21
|
-
//
|
22
|
-
// Since bootstrap was imported above you have access to its mixins which
|
23
|
-
// you may use and inherit here
|
24
|
-
//
|
25
|
-
// If you'd like to override bootstrap's own variables, you can do so here as well
|
26
|
-
// See http://twitter.github.com/bootstrap/less.html for their names and documentation
|
27
|
-
//
|
28
|
-
// Example:
|
29
|
-
// @linkColor: #ff0000;
|
1
|
+
@import "twitter/bootstrap/bootstrap";
|
2
|
+
body { padding-top: 60px; }
|
3
|
+
|
4
|
+
@import "twitter/bootstrap/responsive";
|
5
|
+
|
6
|
+
// Set the correct sprite paths
|
7
|
+
@iconSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings.png');
|
8
|
+
@iconWhiteSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings-white.png');
|
9
|
+
|
10
|
+
// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines)
|
11
|
+
@fontAwesomeEotPath: asset-path('fontawesome-webfont.eot');
|
12
|
+
@fontAwesomeWoffPath: asset-path('fontawesome-webfont.woff');
|
13
|
+
@fontAwesomeTtfPath: asset-path('fontawesome-webfont.ttf');
|
14
|
+
@fontAwesomeSvgzPath: asset-path('fontawesome-webfont.svgz');
|
15
|
+
@fontAwesomeSvgPath: asset-path('fontawesome-webfont.svg');
|
16
|
+
|
17
|
+
// Font Awesome
|
18
|
+
@import "fontawesome";
|
19
|
+
|
20
|
+
// Your custom LESS stylesheets goes here
|
21
|
+
//
|
22
|
+
// Since bootstrap was imported above you have access to its mixins which
|
23
|
+
// you may use and inherit here
|
24
|
+
//
|
25
|
+
// If you'd like to override bootstrap's own variables, you can do so here as well
|
26
|
+
// See http://twitter.github.com/bootstrap/less.html for their names and documentation
|
27
|
+
//
|
28
|
+
// Example:
|
29
|
+
// @linkColor: #ff0000;
|
@@ -1,6 +1,6 @@
|
|
1
|
-
/*
|
2
|
-
Place all the styles related to the matching controller here.
|
3
|
-
They will automatically be included in application.css.
|
4
|
-
*/
|
5
|
-
@import "bootstrap_and_overrides.css";
|
6
|
-
@import "scaffolds.css";
|
1
|
+
/*
|
2
|
+
Place all the styles related to the matching controller here.
|
3
|
+
They will automatically be included in application.css.
|
4
|
+
*/
|
5
|
+
@import "bootstrap_and_overrides.css";
|
6
|
+
@import "scaffolds.css";
|
@@ -1,62 +1,62 @@
|
|
1
|
-
body {
|
2
|
-
background-color: #fff;
|
3
|
-
color: #333;
|
4
|
-
}
|
5
|
-
body,
|
6
|
-
p,
|
7
|
-
ol,
|
8
|
-
ul,
|
9
|
-
td {
|
10
|
-
font-family: verdana, arial, helvetica, sans-serif;
|
11
|
-
font-size: 13px;
|
12
|
-
line-height: 18px;
|
13
|
-
}
|
14
|
-
pre {
|
15
|
-
background-color: #eee;
|
16
|
-
padding: 10px;
|
17
|
-
font-size: 11px;
|
18
|
-
}
|
19
|
-
a {
|
20
|
-
color: #000;
|
21
|
-
}
|
22
|
-
a:visited {
|
23
|
-
color: #666;
|
24
|
-
}
|
25
|
-
a:hover {
|
26
|
-
color: #fff;
|
27
|
-
background-color: #000;
|
28
|
-
}
|
29
|
-
div.field,
|
30
|
-
div.actions {
|
31
|
-
margin-bottom: 10px;
|
32
|
-
}
|
33
|
-
#notice {
|
34
|
-
color: green;
|
35
|
-
}
|
36
|
-
.field_with_errors {
|
37
|
-
padding: 2px;
|
38
|
-
background-color: red;
|
39
|
-
display: table;
|
40
|
-
}
|
41
|
-
#error_explanation {
|
42
|
-
width: 450px;
|
43
|
-
border: 2px solid red;
|
44
|
-
padding: 7px;
|
45
|
-
padding-bottom: 0;
|
46
|
-
margin-bottom: 20px;
|
47
|
-
background-color: #f0f0f0;
|
48
|
-
}
|
49
|
-
#error_explanation h2 {
|
50
|
-
text-align: left;
|
51
|
-
font-weight: bold;
|
52
|
-
padding: 5px 5px 5px 15px;
|
53
|
-
font-size: 12px;
|
54
|
-
margin: -7px;
|
55
|
-
margin-bottom: 0px;
|
56
|
-
background-color: #c00;
|
57
|
-
color: #fff;
|
58
|
-
}
|
59
|
-
#error_explanation ul li {
|
60
|
-
font-size: 12px;
|
61
|
-
list-style: square;
|
62
|
-
}
|
1
|
+
body {
|
2
|
+
background-color: #fff;
|
3
|
+
color: #333;
|
4
|
+
}
|
5
|
+
body,
|
6
|
+
p,
|
7
|
+
ol,
|
8
|
+
ul,
|
9
|
+
td {
|
10
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
11
|
+
font-size: 13px;
|
12
|
+
line-height: 18px;
|
13
|
+
}
|
14
|
+
pre {
|
15
|
+
background-color: #eee;
|
16
|
+
padding: 10px;
|
17
|
+
font-size: 11px;
|
18
|
+
}
|
19
|
+
a {
|
20
|
+
color: #000;
|
21
|
+
}
|
22
|
+
a:visited {
|
23
|
+
color: #666;
|
24
|
+
}
|
25
|
+
a:hover {
|
26
|
+
color: #fff;
|
27
|
+
background-color: #000;
|
28
|
+
}
|
29
|
+
div.field,
|
30
|
+
div.actions {
|
31
|
+
margin-bottom: 10px;
|
32
|
+
}
|
33
|
+
#notice {
|
34
|
+
color: green;
|
35
|
+
}
|
36
|
+
.field_with_errors {
|
37
|
+
padding: 2px;
|
38
|
+
background-color: red;
|
39
|
+
display: table;
|
40
|
+
}
|
41
|
+
#error_explanation {
|
42
|
+
width: 450px;
|
43
|
+
border: 2px solid red;
|
44
|
+
padding: 7px;
|
45
|
+
padding-bottom: 0;
|
46
|
+
margin-bottom: 20px;
|
47
|
+
background-color: #f0f0f0;
|
48
|
+
}
|
49
|
+
#error_explanation h2 {
|
50
|
+
text-align: left;
|
51
|
+
font-weight: bold;
|
52
|
+
padding: 5px 5px 5px 15px;
|
53
|
+
font-size: 12px;
|
54
|
+
margin: -7px;
|
55
|
+
margin-bottom: 0px;
|
56
|
+
background-color: #c00;
|
57
|
+
color: #fff;
|
58
|
+
}
|
59
|
+
#error_explanation ul li {
|
60
|
+
font-size: 12px;
|
61
|
+
list-style: square;
|
62
|
+
}
|
@@ -1,99 +1,99 @@
|
|
1
|
-
class ContentsController < ApplicationController
|
2
|
-
|
3
|
-
respond_to :html, :json, :xml
|
4
|
-
|
5
|
-
before_filter :customize_view_paths
|
6
|
-
|
7
|
-
# helper_method :link_to_add_fields
|
8
|
-
|
9
|
-
def index
|
10
|
-
@contents = Content.all
|
11
|
-
respond_with @contents
|
12
|
-
end
|
13
|
-
|
14
|
-
def new
|
15
|
-
@content = Content.new
|
16
|
-
end
|
17
|
-
|
18
|
-
def edit
|
19
|
-
@content = Content.find_by_ancestry(params[:ancestors].try(:split,'/'), params[:id])
|
20
|
-
# @content.build_seo unless @content.seo
|
21
|
-
# @content.child_contents.create(slug:"#{@content.slug}-kid-#{@content.child_contents.count}", title:"#{@content.slug} Kid") if @content.child_contents.size == 0
|
22
|
-
respond_with @content
|
23
|
-
end
|
24
|
-
|
25
|
-
def define
|
26
|
-
@content = Content.find(params[:id])
|
27
|
-
end
|
28
|
-
|
29
|
-
def show # Content.all_entries
|
30
|
-
@content = Content.find_by_ancestry(params[:ancestors].try(:split,'/'), params[:id])
|
31
|
-
respond_with @content
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
def create
|
36
|
-
@content = Content.new(params[:content])
|
37
|
-
if @content.save
|
38
|
-
# respond_with @content
|
39
|
-
redirect_to contents_path, notice: "#{@content.slug} created."
|
40
|
-
else
|
41
|
-
format.html { render action: "new" }
|
42
|
-
format.json { render json: @content.errors, status: :unprocessable_entity }
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def update
|
47
|
-
@content = Content.find_by_ancestry(params[:ancestors].try(:split,'/'), params[:id])
|
48
|
-
if @content.update_attributes(params[:content])
|
49
|
-
redirect_to contents_path, notice: "#{@content.title} updated."
|
50
|
-
else
|
51
|
-
respond_to do |format|
|
52
|
-
format.html { render action: "edit" }
|
53
|
-
format.json { render json: @content.errors, status: :unprocessable_entity }
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
# TODO add code here to build-up embedded objects in the edited object via ajax
|
60
|
-
def modify
|
61
|
-
@content = Content.find(params[:id])
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
|
66
|
-
# PUT /foos/1
|
67
|
-
# PUT /foos/1.json
|
68
|
-
def renovate
|
69
|
-
@content = Content.find(params[:id])
|
70
|
-
@content.renovate(params[:content][:defn])
|
71
|
-
if @content.save
|
72
|
-
redirect_to contents_path, notice: "#{@content.slug} definition updated."
|
73
|
-
else
|
74
|
-
respond_to do |format|
|
75
|
-
format.html { render action: "define" }
|
76
|
-
format.json { render json: @content.errors, status: :unprocessable_entity }
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def destroy
|
82
|
-
@content = Content.find_by_ancestry(params[:ancestors].try(:split,'/'), params[:id])
|
83
|
-
@content.destroy
|
84
|
-
|
85
|
-
respond_to do |format|
|
86
|
-
format.html { redirect_to contents_url}
|
87
|
-
format.json { head :no_content }
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|
91
|
-
|
92
|
-
def customize_view_paths
|
93
|
-
c = Content.find_by_ancestry(params[:ancestors].try(:split, '/'), params[:id]) if params[:id]
|
94
|
-
prepend_view_path "app/views/contents/#{c.slug}" if c
|
95
|
-
end
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
end
|
1
|
+
class ContentsController < ApplicationController
|
2
|
+
|
3
|
+
respond_to :html, :json, :xml
|
4
|
+
|
5
|
+
before_filter :customize_view_paths
|
6
|
+
|
7
|
+
# helper_method :link_to_add_fields
|
8
|
+
|
9
|
+
def index
|
10
|
+
@contents = Content.all
|
11
|
+
respond_with @contents
|
12
|
+
end
|
13
|
+
|
14
|
+
def new
|
15
|
+
@content = Content.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def edit
|
19
|
+
@content = Content.find_by_ancestry(params[:ancestors].try(:split,'/'), params[:id])
|
20
|
+
# @content.build_seo unless @content.seo
|
21
|
+
# @content.child_contents.create(slug:"#{@content.slug}-kid-#{@content.child_contents.count}", title:"#{@content.slug} Kid") if @content.child_contents.size == 0
|
22
|
+
respond_with @content
|
23
|
+
end
|
24
|
+
|
25
|
+
def define
|
26
|
+
@content = Content.find(params[:id])
|
27
|
+
end
|
28
|
+
|
29
|
+
def show # Content.all_entries
|
30
|
+
@content = Content.find_by_ancestry(params[:ancestors].try(:split,'/'), params[:id])
|
31
|
+
respond_with @content
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
def create
|
36
|
+
@content = Content.new(params[:content])
|
37
|
+
if @content.save
|
38
|
+
# respond_with @content
|
39
|
+
redirect_to contents_path, notice: "#{@content.slug} created."
|
40
|
+
else
|
41
|
+
format.html { render action: "new" }
|
42
|
+
format.json { render json: @content.errors, status: :unprocessable_entity }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def update
|
47
|
+
@content = Content.find_by_ancestry(params[:ancestors].try(:split,'/'), params[:id])
|
48
|
+
if @content.update_attributes(params[:content])
|
49
|
+
redirect_to contents_path, notice: "#{@content.title} updated."
|
50
|
+
else
|
51
|
+
respond_to do |format|
|
52
|
+
format.html { render action: "edit" }
|
53
|
+
format.json { render json: @content.errors, status: :unprocessable_entity }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
# TODO add code here to build-up embedded objects in the edited object via ajax
|
60
|
+
def modify
|
61
|
+
@content = Content.find(params[:id])
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
# PUT /foos/1
|
67
|
+
# PUT /foos/1.json
|
68
|
+
def renovate
|
69
|
+
@content = Content.find(params[:id])
|
70
|
+
@content.renovate(params[:content][:defn])
|
71
|
+
if @content.save
|
72
|
+
redirect_to contents_path, notice: "#{@content.slug} definition updated."
|
73
|
+
else
|
74
|
+
respond_to do |format|
|
75
|
+
format.html { render action: "define" }
|
76
|
+
format.json { render json: @content.errors, status: :unprocessable_entity }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def destroy
|
82
|
+
@content = Content.find_by_ancestry(params[:ancestors].try(:split,'/'), params[:id])
|
83
|
+
@content.destroy
|
84
|
+
|
85
|
+
respond_to do |format|
|
86
|
+
format.html { redirect_to contents_url}
|
87
|
+
format.json { head :no_content }
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
def customize_view_paths
|
93
|
+
c = Content.find_by_ancestry(params[:ancestors].try(:split, '/'), params[:id]) if params[:id]
|
94
|
+
prepend_view_path "app/views/contents/#{c.slug}" if c
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
end
|
@@ -1,34 +1,27 @@
|
|
1
|
-
module ContentsHelper
|
2
|
-
def hateoas_uri_options(source, entity)
|
3
|
-
# open the source url
|
4
|
-
# parse out the entities
|
5
|
-
# look for <name> and <link rel='self'> and parse into [[link, name]]
|
6
|
-
end
|
7
|
-
|
8
|
-
|
9
|
-
# from http://railscasts.com/episodes/196-nested-model-form-revised?view=asciicast
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
render(partial: association.to_s.singularize + "_fields", locals: { f: builder })
|
29
|
-
end
|
30
|
-
link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
end
|
1
|
+
module ContentsHelper
|
2
|
+
def hateoas_uri_options(source, entity)
|
3
|
+
# open the source url
|
4
|
+
# parse out the entities
|
5
|
+
# look for <name> and <link rel='self'> and parse into [[link, name]]
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
# from http://railscasts.com/episodes/196-nested-model-form-revised?view=asciicast
|
10
|
+
|
11
|
+
def link_to_add_fields(name, f, association, enclosing_element = nil)
|
12
|
+
begin
|
13
|
+
new_object = f.object.send(association).klass.new
|
14
|
+
rescue Exception => e
|
15
|
+
p e
|
16
|
+
end
|
17
|
+
new_object ||= ::Content.const_get(association.to_s.camelize).new
|
18
|
+
id = new_object.object_id
|
19
|
+
fields = f.fields_for(association, new_object, child_index: id) do |builder|
|
20
|
+
render(partial: association.to_s.singularize + "_fields", locals: { f: builder, child_index: id })
|
21
|
+
end
|
22
|
+
link_to(name, '#', class: "add_fields",
|
23
|
+
data: {id: id, fields: fields.gsub("\n", ""), enclosing: enclosing_element})
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
end
|