manifest-rails 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +1 -1
- data/README.rdoc +3 -0
- data/app/assets/javascripts/manifest/main.js +17 -0
- data/app/assets/stylesheets/manifest/_forms.css.scss +42 -21
- data/app/assets/stylesheets/manifest/_tables.css.scss +24 -20
- data/app/assets/stylesheets/manifest/main.css.scss +72 -0
- data/app/assets/stylesheets/manifest/sessions.css.scss +9 -0
- data/app/controllers/manifest/content_blocks_controller.rb +14 -11
- data/app/controllers/manifest/manifest_controller.rb +3 -8
- data/app/controllers/manifest/pages_controller.rb +2 -5
- data/app/controllers/manifest/sessions_controller.rb +1 -1
- data/app/controllers/pages_controller.rb +1 -8
- data/app/form_builders/manifest/labelled_form_builder.rb +23 -0
- data/app/models/content_block.rb +6 -2
- data/app/models/page.rb +18 -13
- data/app/views/layouts/manifest/manifest.html.erb +19 -18
- data/app/views/layouts/manifest/sessions.html.erb +10 -7
- data/app/views/manifest/content_blocks/_form.html.erb +24 -26
- data/app/views/manifest/content_blocks/edit.html.erb +1 -9
- data/app/views/manifest/content_blocks/index.html.erb +14 -14
- data/app/views/manifest/content_blocks/new.html.erb +1 -1
- data/app/views/manifest/pages/_form.html.erb +9 -10
- data/app/views/manifest/pages/edit.html.erb +1 -9
- data/app/views/manifest/pages/index.html.erb +5 -3
- data/app/views/manifest/pages/new.html.erb +1 -1
- data/app/views/manifest/pages/show.html.erb +29 -6
- data/config/initializers/manifest.rb +1 -1
- data/config/routes.rb +1 -1
- data/db/migrate/20120303200114_create_pages.rb +10 -0
- data/db/migrate/20120304152605_create_content_blocks.rb +13 -0
- data/db/migrate/20120304155055_add_index_to_pages.rb +5 -0
- data/db/migrate/20120304155130_add_index_to_content_blocks.rb +5 -0
- data/db/migrate/20120305164036_create_editors.rb +11 -0
- data/lib/active_record/base/data_type_for_manifest.rb +11 -0
- data/lib/generators/manifest/data_type/data_type_generator.rb +13 -2
- data/lib/generators/manifest/data_type/templates/_form.html.erb +19 -0
- data/lib/generators/manifest/data_type/templates/controller.rb +41 -4
- data/lib/generators/manifest/data_type/templates/edit.html.erb +3 -0
- data/lib/generators/manifest/data_type/templates/index.html.erb +4 -0
- data/lib/generators/manifest/data_type/templates/model.rb +1 -1
- data/lib/generators/manifest/data_type/templates/new.html.erb +3 -0
- data/lib/generators/manifest/install/USAGE +1 -3
- data/lib/generators/manifest/install/install_generator.rb +13 -4
- data/lib/generators/manifest/install/templates/create_content_blocks.rb +1 -1
- data/lib/generators/manifest/install/templates/create_pages.rb +1 -1
- data/lib/manifest.rb +4 -9
- data/lib/manifest/engine.rb +0 -3
- data/lib/manifest/version.rb +1 -1
- metadata +54 -115
- data/README.md +0 -37
- data/app/assets/images/manifest/grid.png +0 -0
- data/app/assets/images/manifest/sketch.png +0 -0
- data/app/assets/javascripts/manifest/manifest.js +0 -7
- data/app/assets/stylesheets/manifest/_mixins.css.scss +0 -41
- data/app/assets/stylesheets/manifest/manifest.css.scss +0 -137
- data/app/controllers/manifest/editors_controller.rb +0 -3
- data/app/models/user.rb +0 -8
- data/lib/active_record/base/acts_as_manifest.rb +0 -8
data/MIT-LICENSE
CHANGED
data/README.rdoc
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
//= require jquery
|
2
|
+
//= require jquery_ujs
|
3
|
+
//= require tinymce-jquery
|
4
|
+
|
5
|
+
$(function() {
|
6
|
+
$('.tinymce').tinymce({});
|
7
|
+
|
8
|
+
$('#content_block_allow_html').change(function() {
|
9
|
+
if ($(this).is(':checked')) {
|
10
|
+
$('#content_block_content').tinymce({});
|
11
|
+
} else {
|
12
|
+
$('#content_block_content_container').remove();
|
13
|
+
$('#content_block_content').css('display', 'inline-block');
|
14
|
+
$('#content_block_content').attr('aria-hidden', 'false');
|
15
|
+
}
|
16
|
+
})
|
17
|
+
})
|
@@ -1,34 +1,55 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
border: 1px solid #aaa;
|
5
|
-
background: #f8f8f8;
|
6
|
-
@include box-shadow(0 1px 1px rgba(0, 0, 0, 0.2) inset);
|
1
|
+
label {
|
2
|
+
display: block;
|
3
|
+
margin-bottom: $base / 4;
|
7
4
|
}
|
8
5
|
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
input[type='text'],
|
7
|
+
input[type='password'],
|
8
|
+
textarea {
|
9
|
+
width: $base * 14;
|
12
10
|
font-size: inherit;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
height: $base;
|
13
|
+
padding: $base / 4;
|
14
|
+
@include box-shadow(0 1px 1px rgba(0,0,0,0.1) inset, 0 1px 0 white);
|
13
15
|
}
|
14
16
|
|
15
|
-
textarea {
|
16
|
-
|
17
|
-
input[type='submit'] {
|
18
|
-
@include pretty_button;
|
19
|
-
font-size: 1em;
|
17
|
+
textarea {
|
18
|
+
height: $base * 10;
|
20
19
|
}
|
21
20
|
|
22
21
|
.field {
|
23
|
-
margin-bottom:
|
24
|
-
|
22
|
+
margin-bottom: $base;
|
23
|
+
|
24
|
+
&.inline-label {
|
25
|
+
label {
|
26
|
+
display: inline;
|
27
|
+
margin-right: $base / 2;
|
25
28
|
|
26
|
-
|
27
|
-
|
28
|
-
margin-right: 20px;
|
29
|
-
display: inline;
|
29
|
+
&:after { content: ':'; }
|
30
|
+
}
|
30
31
|
}
|
31
32
|
}
|
32
33
|
|
33
|
-
.actions {
|
34
|
+
.form-actions {
|
35
|
+
margin-top: $base;
|
36
|
+
}
|
37
|
+
|
38
|
+
.form-errors {
|
39
|
+
width: $base * 16;
|
40
|
+
margin-bottom: $base;
|
41
|
+
padding: $base;
|
42
|
+
padding-left: $base * 2;
|
43
|
+
background: #fcc;
|
44
|
+
border: 1px solid #faa;
|
45
|
+
@include box-shadow(0 1px 1px rgba(0,0,0,0.1));
|
34
46
|
|
47
|
+
h3 { font: 150% 'Oswald'; }
|
48
|
+
p { font-style: italic; }
|
49
|
+
li { position: relative; }
|
50
|
+
li:before {
|
51
|
+
content: '\279b';
|
52
|
+
position: absolute;
|
53
|
+
left: -24px;
|
54
|
+
}
|
55
|
+
}
|
@@ -1,26 +1,30 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
thead {
|
2
|
+
border: 1px solid darken(#36c, 13.5);
|
3
|
+
border-bottom: none;
|
4
|
+
}
|
5
|
+
|
6
|
+
th, td {
|
7
|
+
padding: $base / 4 $base / 2;
|
8
|
+
}
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
th {
|
11
|
+
background: #36c;
|
12
|
+
@include background(linear-gradient(#36c, darken(#36c, 6.75)));
|
13
|
+
@include box-shadow(0 -1px 0 darken(#36c, 27) inset);
|
14
|
+
color: #fff;
|
15
|
+
}
|
13
16
|
|
14
|
-
|
15
|
-
background: #ccc;
|
16
|
-
}
|
17
|
+
tr:first-child td { @include box-shadow(0 1px 0 #f8f8f8 inset); }
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
color: $copy-on-dark;
|
19
|
+
tr:nth-child(odd) {
|
20
|
+
background: #e8e8e8;
|
21
|
+
}
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
tr:nth-child(even) {
|
24
|
+
background: #fff;
|
25
25
|
}
|
26
26
|
|
27
|
+
tbody {
|
28
|
+
border: 1px solid #ccc;
|
29
|
+
border-top: none;
|
30
|
+
}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
@import 'compass/reset';
|
2
|
+
@import 'compass/css3';
|
3
|
+
|
4
|
+
$base: 22.856px;
|
5
|
+
$accent: #36c;
|
6
|
+
|
7
|
+
body {
|
8
|
+
background: #f8f8f8;
|
9
|
+
font: 100%/1.4285 'PT Sans';
|
10
|
+
}
|
11
|
+
|
12
|
+
h1, h2 {
|
13
|
+
margin-bottom: $base;
|
14
|
+
font: 200% 'Oswald';
|
15
|
+
text-transform: uppercase;
|
16
|
+
}
|
17
|
+
|
18
|
+
h1 {
|
19
|
+
padding-bottom: $base;
|
20
|
+
border-bottom: 1px solid #999;
|
21
|
+
font: 200% 'Oswald';
|
22
|
+
text-align: center;
|
23
|
+
text-transform: uppercase;
|
24
|
+
|
25
|
+
/* &:after { content: ':'; } */
|
26
|
+
}
|
27
|
+
|
28
|
+
p {
|
29
|
+
margin-bottom: 16px;
|
30
|
+
&:last-child { margin-bottom: 0; }
|
31
|
+
}
|
32
|
+
|
33
|
+
a { color: $accent; }
|
34
|
+
|
35
|
+
strong, label { font-weight: bold; }
|
36
|
+
|
37
|
+
.app-nav {
|
38
|
+
width: $base * 8;
|
39
|
+
position: fixed;
|
40
|
+
top: 0; bottom: 0;
|
41
|
+
padding: $base * 2 $base;
|
42
|
+
background: #fcfcfc;
|
43
|
+
border-right: 1px solid #ccc;
|
44
|
+
@include box-shadow(1px 0 1px rgba(0, 0, 0, 0.1));
|
45
|
+
}
|
46
|
+
|
47
|
+
.app-nav nav {
|
48
|
+
padding-bottom: $base;
|
49
|
+
border-bottom: 1px solid #999;
|
50
|
+
|
51
|
+
a {
|
52
|
+
display: block;
|
53
|
+
text-decoration: none;
|
54
|
+
}
|
55
|
+
|
56
|
+
a:before {
|
57
|
+
content: '\279b';
|
58
|
+
margin-right: 0.5em;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
.app-content {
|
63
|
+
margin-left: $base * 10;
|
64
|
+
padding: $base * 2 $base;
|
65
|
+
}
|
66
|
+
|
67
|
+
.model-actions {
|
68
|
+
margin-top: $base;
|
69
|
+
}
|
70
|
+
|
71
|
+
@import 'forms';
|
72
|
+
@import 'tables';
|
@@ -1,22 +1,18 @@
|
|
1
1
|
class Manifest::ContentBlocksController < Manifest::ManifestController
|
2
|
-
before_filter :authorize
|
3
2
|
before_filter :authorize_admin, except: [:index, :edit, :update]
|
4
3
|
|
5
|
-
layout 'manifest/manifest'
|
6
|
-
|
7
4
|
def index
|
8
5
|
@content_blocks = ContentBlock.all
|
9
6
|
end
|
10
7
|
|
11
8
|
def new
|
12
|
-
@content_block = ContentBlock.new
|
9
|
+
@content_block = ContentBlock.new(content_block_params)
|
13
10
|
end
|
14
11
|
|
15
12
|
def create
|
16
|
-
@content_block = ContentBlock.new(
|
13
|
+
@content_block = ContentBlock.new(content_block_params)
|
17
14
|
|
18
15
|
if @content_block.save
|
19
|
-
expire_all_pages
|
20
16
|
redirect_to manifest_content_blocks_path
|
21
17
|
else
|
22
18
|
render 'new'
|
@@ -30,8 +26,7 @@ class Manifest::ContentBlocksController < Manifest::ManifestController
|
|
30
26
|
def update
|
31
27
|
@content_block = ContentBlock.find(params[:id])
|
32
28
|
|
33
|
-
if @content_block.update_attributes(
|
34
|
-
expire_all_pages
|
29
|
+
if @content_block.update_attributes(content_block_params)
|
35
30
|
redirect_to manifest_content_blocks_path
|
36
31
|
else
|
37
32
|
render 'edit'
|
@@ -40,10 +35,18 @@ class Manifest::ContentBlocksController < Manifest::ManifestController
|
|
40
35
|
|
41
36
|
def destroy
|
42
37
|
@content_block = ContentBlock.find(params[:id])
|
43
|
-
@content_block.
|
44
|
-
|
45
|
-
expire_all_pages
|
38
|
+
@content_block.destroy
|
46
39
|
|
47
40
|
redirect_to manifest_content_blocks_path
|
48
41
|
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def content_block_params
|
46
|
+
if current_editor.admin?
|
47
|
+
params[:content_block]
|
48
|
+
else
|
49
|
+
params[:content_block].slice(:content)
|
50
|
+
end
|
51
|
+
end
|
49
52
|
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
class Manifest::ManifestController < ApplicationController
|
2
|
+
before_filter :authorize
|
3
|
+
|
4
|
+
layout 'manifest/manifest'
|
2
5
|
|
3
6
|
private
|
4
7
|
|
@@ -15,12 +18,4 @@ class Manifest::ManifestController < ApplicationController
|
|
15
18
|
def authorize_admin
|
16
19
|
redirect_to manifest_path, alert: 'Admins only' unless current_editor.admin?
|
17
20
|
end
|
18
|
-
|
19
|
-
def expire_all_pages
|
20
|
-
expire_page '/index.html'
|
21
|
-
|
22
|
-
Page.all.each do |p|
|
23
|
-
expire_page "/#{p.slug}.html"
|
24
|
-
end
|
25
|
-
end
|
26
21
|
end
|
@@ -1,9 +1,6 @@
|
|
1
1
|
class Manifest::PagesController < Manifest::ManifestController
|
2
|
-
before_filter :authorize
|
3
2
|
before_filter :authorize_admin, except: [:index, :show]
|
4
3
|
|
5
|
-
layout 'manifest/manifest'
|
6
|
-
|
7
4
|
def index
|
8
5
|
@pages = Page.all
|
9
6
|
end
|
@@ -20,7 +17,7 @@ class Manifest::PagesController < Manifest::ManifestController
|
|
20
17
|
@page = Page.new(params[:page])
|
21
18
|
|
22
19
|
if @page.save
|
23
|
-
redirect_to
|
20
|
+
redirect_to manifest_page_path(@page)
|
24
21
|
else
|
25
22
|
render 'new'
|
26
23
|
end
|
@@ -42,7 +39,7 @@ class Manifest::PagesController < Manifest::ManifestController
|
|
42
39
|
|
43
40
|
def destroy
|
44
41
|
@page = Page.find(params[:id])
|
45
|
-
@page.
|
42
|
+
@page.destroy
|
46
43
|
|
47
44
|
redirect_to manifest_pages_path
|
48
45
|
end
|
@@ -1,14 +1,7 @@
|
|
1
1
|
class PagesController < ApplicationController
|
2
2
|
layout 'public'
|
3
3
|
|
4
|
-
caches_page :show
|
5
|
-
|
6
4
|
def show
|
7
|
-
if @page = Page.
|
8
|
-
@content_blocks = @page.content_blocks
|
9
|
-
render @page.slug
|
10
|
-
else
|
11
|
-
raise ActiveRecord::RecordNotFound
|
12
|
-
end
|
5
|
+
render @page.slug if @page = Page.find(params[:id])
|
13
6
|
end
|
14
7
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Manifest::LabelledFormBuilder < ActionView::Helpers::FormBuilder
|
2
|
+
%w[text_field check_box collection_select check_box text_area date_select datetime_select time_select].each do |method_name|
|
3
|
+
define_method(method_name) do |name, *args|
|
4
|
+
classes = %w[field]
|
5
|
+
|
6
|
+
if %w[collection_select check_box].include? method_name
|
7
|
+
classes << 'inline-label'
|
8
|
+
end
|
9
|
+
|
10
|
+
@template.content_tag :div, class: classes.join(' ') do
|
11
|
+
label(name) + super(name, *args)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
%w[submit].each do |method_name|
|
17
|
+
define_method(method_name) do
|
18
|
+
@template.content_tag :div, class: 'form-actions' do
|
19
|
+
super()
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/app/models/content_block.rb
CHANGED
@@ -4,13 +4,17 @@ class ContentBlock < ActiveRecord::Base
|
|
4
4
|
|
5
5
|
validates :title, :slug, uniqueness: true
|
6
6
|
validates :title, presence: true
|
7
|
-
validates :
|
7
|
+
validates :slug, presence: true, on: :update
|
8
8
|
|
9
9
|
belongs_to :page
|
10
10
|
|
11
11
|
default_scope includes(:page).order('pages.title')
|
12
12
|
|
13
13
|
def render
|
14
|
-
|
14
|
+
if allow_html
|
15
|
+
content.html_safe
|
16
|
+
else
|
17
|
+
content
|
18
|
+
end
|
15
19
|
end
|
16
20
|
end
|
data/app/models/page.rb
CHANGED
@@ -2,10 +2,9 @@ class Page < ActiveRecord::Base
|
|
2
2
|
extend FriendlyId
|
3
3
|
friendly_id :title, use: :slugged
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
after_destroy :remove_template_file
|
5
|
+
after_create :create_template
|
6
|
+
after_update :rename_template
|
7
|
+
after_destroy :remove_template
|
9
8
|
|
10
9
|
validates :title, :slug, uniqueness: true
|
11
10
|
validates :title, presence: true
|
@@ -13,22 +12,28 @@ class Page < ActiveRecord::Base
|
|
13
12
|
|
14
13
|
has_many :content_blocks
|
15
14
|
|
16
|
-
|
15
|
+
default_scope order('title')
|
17
16
|
|
18
|
-
def
|
19
|
-
|
20
|
-
self.template_path = "#{Rails.root}/app/views/pages/#{self.slug}.html.erb"
|
17
|
+
def template_path
|
18
|
+
template_path_from_slug(slug)
|
21
19
|
end
|
22
20
|
|
23
|
-
|
21
|
+
private
|
22
|
+
|
23
|
+
def create_template
|
24
24
|
%x(touch #{self.template_path})
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
|
27
|
+
def rename_template
|
28
|
+
old_template_path = template_path_from_slug(slug_was)
|
29
|
+
%x(mv #{old_template_path} #{template_path})
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove_template
|
33
|
+
%x(rm #{template_path})
|
29
34
|
end
|
30
35
|
|
31
|
-
def
|
32
|
-
|
36
|
+
def template_path_from_slug(slug)
|
37
|
+
"#{Rails.root}/app/views/pages/#{slug}.html.erb"
|
33
38
|
end
|
34
39
|
end
|