manifest-rails 0.0.4 → 0.1.0
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/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
|