smithycms 0.0.1
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 +20 -0
- data/README.md +142 -0
- data/Rakefile +27 -0
- data/app/assets/images/smithy/logo.png +0 -0
- data/app/assets/images/smithy/logo2.png +0 -0
- data/app/assets/javascripts/smithy/application.js +13 -0
- data/app/assets/javascripts/smithy/assets.js.coffee +35 -0
- data/app/assets/javascripts/smithy/guides.js +23 -0
- data/app/assets/javascripts/smithy/jquery-ui.min.js +5 -0
- data/app/assets/javascripts/smithy/nested_forms.js +55 -0
- data/app/assets/javascripts/smithy/page_contents.js +4 -0
- data/app/assets/javascripts/smithy/pages.js +41 -0
- data/app/assets/javascripts/smithy/settings.js +0 -0
- data/app/assets/javascripts/smithy/templates.js +25 -0
- data/app/assets/stylesheets/smithy/application.css.scss +29 -0
- data/app/assets/stylesheets/smithy/assets.css.scss +3 -0
- data/app/assets/stylesheets/smithy/bootstrap_and_overrides.css.scss +12 -0
- data/app/assets/stylesheets/smithy/content_blocks.css.scss +2 -0
- data/app/assets/stylesheets/smithy/forms.css.scss +3 -0
- data/app/assets/stylesheets/smithy/guides.css.scss +5 -0
- data/app/assets/stylesheets/smithy/layout.css.scss +113 -0
- data/app/assets/stylesheets/smithy/pages.css.scss +35 -0
- data/app/assets/stylesheets/smithy/templates.css.scss +14 -0
- data/app/controllers/smithy/assets_controller.rb +50 -0
- data/app/controllers/smithy/base_controller.rb +14 -0
- data/app/controllers/smithy/caches_controller.rb +13 -0
- data/app/controllers/smithy/content_blocks_controller.rb +50 -0
- data/app/controllers/smithy/content_pieces_controller.rb +97 -0
- data/app/controllers/smithy/contents_controller.rb +41 -0
- data/app/controllers/smithy/guides_controller.rb +9 -0
- data/app/controllers/smithy/images_controller.rb +41 -0
- data/app/controllers/smithy/page_contents_controller.rb +90 -0
- data/app/controllers/smithy/pages_controller.rb +110 -0
- data/app/controllers/smithy/settings_controller.rb +46 -0
- data/app/controllers/smithy/sitemap_controller.rb +13 -0
- data/app/controllers/smithy/templates_controller.rb +79 -0
- data/app/helpers/smithy/application_helper.rb +36 -0
- data/app/helpers/smithy/assets_helper.rb +9 -0
- data/app/helpers/smithy/pages_helper.rb +12 -0
- data/app/helpers/smithy/settings_helper.rb +4 -0
- data/app/helpers/smithy/templates_helper.rb +4 -0
- data/app/helpers/smithy/upload_helper.rb +110 -0
- data/app/models/smithy/asset.rb +64 -0
- data/app/models/smithy/content.rb +35 -0
- data/app/models/smithy/content_block.rb +41 -0
- data/app/models/smithy/content_block_template.rb +26 -0
- data/app/models/smithy/image.rb +41 -0
- data/app/models/smithy/page.rb +94 -0
- data/app/models/smithy/page_content.rb +62 -0
- data/app/models/smithy/page_list.rb +61 -0
- data/app/models/smithy/page_proxy.rb +63 -0
- data/app/models/smithy/setting.rb +6 -0
- data/app/models/smithy/site.rb +30 -0
- data/app/models/smithy/template.rb +53 -0
- data/app/models/smithy/template_container.rb +16 -0
- data/app/views/layouts/smithy/application.html.erb +27 -0
- data/app/views/layouts/smithy/guides.html.erb +16 -0
- data/app/views/layouts/smithy/modal.html.erb +10 -0
- data/app/views/layouts/smithy/shared/_flash.html.erb +6 -0
- data/app/views/layouts/smithy/shared/_footer.html.erb +3 -0
- data/app/views/layouts/smithy/shared/_head.html.erb +8 -0
- data/app/views/layouts/smithy/shared/_nav.html.erb +37 -0
- data/app/views/layouts/smithy/shared/_tail.html.erb +4 -0
- data/app/views/layouts/smithy/wide.html.erb +24 -0
- data/app/views/smithy/assets/_asset.html.erb +10 -0
- data/app/views/smithy/assets/_form.html.erb +13 -0
- data/app/views/smithy/assets/_upload_form.html.erb +13 -0
- data/app/views/smithy/assets/create.js.erb +5 -0
- data/app/views/smithy/assets/edit.html.erb +5 -0
- data/app/views/smithy/assets/index.html.erb +13 -0
- data/app/views/smithy/assets/new.html.erb +13 -0
- data/app/views/smithy/caches/show.html.erb +8 -0
- data/app/views/smithy/content_blocks/_content_block.html.erb +1 -0
- data/app/views/smithy/content_blocks/_secondary_nav.html.erb +12 -0
- data/app/views/smithy/content_blocks/_template_fields.html.erb +19 -0
- data/app/views/smithy/content_blocks/edit.html.erb +31 -0
- data/app/views/smithy/content_blocks/index.html.erb +17 -0
- data/app/views/smithy/content_blocks/new.html.erb +12 -0
- data/app/views/smithy/content_pieces/edit.html.erb +13 -0
- data/app/views/smithy/content_pieces/index.html.erb +21 -0
- data/app/views/smithy/content_pieces/new.html.erb +1 -0
- data/app/views/smithy/contents/_form.html.erb +6 -0
- data/app/views/smithy/contents/_form_fields.html.erb +12 -0
- data/app/views/smithy/contents/edit.html.erb +3 -0
- data/app/views/smithy/contents/new.html.erb +3 -0
- data/app/views/smithy/guides/markdown.html.erb +150 -0
- data/app/views/smithy/images/_form.html.erb +6 -0
- data/app/views/smithy/images/_form_fields.html.erb +28 -0
- data/app/views/smithy/images/edit.html.erb +3 -0
- data/app/views/smithy/images/new.html.erb +3 -0
- data/app/views/smithy/page_contents/edit.html.erb +18 -0
- data/app/views/smithy/page_contents/new.html.erb +28 -0
- data/app/views/smithy/page_lists/_form_fields.html.erb +6 -0
- data/app/views/smithy/pages/_container.html.erb +24 -0
- data/app/views/smithy/pages/_form.html.erb +57 -0
- data/app/views/smithy/pages/_page.html.erb +6 -0
- data/app/views/smithy/pages/_page_nav.html.erb +6 -0
- data/app/views/smithy/pages/_page_related.html.erb +21 -0
- data/app/views/smithy/pages/_parent.html.erb +10 -0
- data/app/views/smithy/pages/_root.html.erb +5 -0
- data/app/views/smithy/pages/edit.html.erb +7 -0
- data/app/views/smithy/pages/index.html.erb +17 -0
- data/app/views/smithy/pages/new.html.erb +7 -0
- data/app/views/smithy/settings/_form.html.erb +7 -0
- data/app/views/smithy/settings/_setting.html.erb +6 -0
- data/app/views/smithy/settings/edit.html.erb +3 -0
- data/app/views/smithy/settings/index.html.erb +9 -0
- data/app/views/smithy/settings/new.html.erb +3 -0
- data/app/views/smithy/settings/show.html.erb +10 -0
- data/app/views/smithy/sitemap/show.xml.erb +10 -0
- data/app/views/smithy/templates/_secondary_nav.html.erb +21 -0
- data/app/views/smithy/templates/_template.html.erb +1 -0
- data/app/views/smithy/templates/edit.html.erb +36 -0
- data/app/views/smithy/templates/index.html.erb +17 -0
- data/app/views/smithy/templates/new.html.erb +13 -0
- data/config/initializers/aws.rb +5 -0
- data/config/initializers/dragonfly.rb +48 -0
- data/config/initializers/formtastic.rb +77 -0
- data/config/initializers/kaminari_config.rb +10 -0
- data/config/initializers/liquid.rb +2 -0
- data/config/routes.rb +38 -0
- data/db/migrate/20120911193140_create_smithy_templates.rb +11 -0
- data/db/migrate/20120911203618_create_smithy_settings.rb +10 -0
- data/db/migrate/20121018182146_create_smithy_pages.rb +27 -0
- data/db/migrate/20121019145543_create_smithy_template_containers.rb +11 -0
- data/db/migrate/20121019160426_create_smithy_page_contents.rb +21 -0
- data/db/migrate/20121024213357_create_smithy_content_blocks.rb +10 -0
- data/db/migrate/20121025011733_create_smithy_content_block_templates.rb +12 -0
- data/db/migrate/20121029175812_create_smithy_contents.rb +9 -0
- data/db/migrate/20121105222537_create_smithy_assets.rb +16 -0
- data/db/migrate/20121115215053_create_smithy_images.rb +15 -0
- data/db/migrate/20121127205022_add_external_link_to_smithy_pages.rb +5 -0
- data/db/migrate/20130115190505_add_markdown_content_to_smithy_contents.rb +5 -0
- data/db/migrate/20130123170918_set_defaults_for_show_in_navigation_and_cache_length.rb +6 -0
- data/db/migrate/20130311203806_create_smithy_page_lists.rb +15 -0
- data/db/migrate/20130312161116_remove_description_from_content_block.rb +5 -0
- data/db/migrate/20130326191051_add_html_attributes_to_images.rb +5 -0
- data/db/migrate/20131003210228_add_publishable_to_smithy_page_contents.rb +11 -0
- data/db/migrate/20131220160755_add_content_to_images.rb +5 -0
- data/db/migrate/20131223145710_add_position_to_smithy_template_containers.rb +5 -0
- data/lib/smithy/content_blocks/model.rb +16 -0
- data/lib/smithy/content_blocks/registry.rb +30 -0
- data/lib/smithy/content_blocks.rb +2 -0
- data/lib/smithy/content_pieces/base.rb +10 -0
- data/lib/smithy/content_pieces/registry.rb +39 -0
- data/lib/smithy/dependencies.rb +19 -0
- data/lib/smithy/dragonfly/asset_helper.rb +67 -0
- data/lib/smithy/dragonfly/remote_data_store.rb +33 -0
- data/lib/smithy/dragonfly.rb +30 -0
- data/lib/smithy/engine.rb +48 -0
- data/lib/smithy/formatter.rb +46 -0
- data/lib/smithy/liquid/database.rb +12 -0
- data/lib/smithy/liquid/drops/base.rb +16 -0
- data/lib/smithy/liquid/drops/page.rb +78 -0
- data/lib/smithy/liquid/filters/asset_tag.rb +33 -0
- data/lib/smithy/liquid/filters/resize.rb +12 -0
- data/lib/smithy/liquid/rendering.rb +50 -0
- data/lib/smithy/liquid/tags/asset.rb +54 -0
- data/lib/smithy/liquid/tags/csrf.rb +30 -0
- data/lib/smithy/liquid/tags/html.rb +61 -0
- data/lib/smithy/liquid/tags/nav.rb +76 -0
- data/lib/smithy/liquid.rb +8 -0
- data/lib/smithy/logger.rb +12 -0
- data/lib/smithy/version.rb +3 -0
- data/lib/smithy.rb +21 -0
- data/lib/smithycms.rb +1 -0
- data/lib/tasks/smithy_tasks.rake +4 -0
- data/lib/templates/erb/scaffold/_form.html.erb +11 -0
- metadata +871 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
/*
|
2
|
+
Nested Forms
|
3
|
+
*/
|
4
|
+
$(function() {
|
5
|
+
$('form').on('click', 'a.add_nested_fields', function() {
|
6
|
+
// Setup
|
7
|
+
var assoc = $(this).attr('data-association'); // Name of child
|
8
|
+
var content = $('#' + assoc + '_fields_blueprint').html(); // Fields template
|
9
|
+
|
10
|
+
// Make the context correct by replacing new_<parents> with the generated ID
|
11
|
+
// of each of the parent objects
|
12
|
+
var context = ($(this).parents('.fields').children('input:first').attr('name') || '').replace(new RegExp('[[a-z]+]$'), '');
|
13
|
+
|
14
|
+
// context will be something like this for a brand new form:
|
15
|
+
// project[tasks_attributes][1255929127459][assignments_attributes][1255929128105]
|
16
|
+
// or for an edit form:
|
17
|
+
// project[tasks_attributes][0][assignments_attributes][1]
|
18
|
+
if(context) {
|
19
|
+
var parent_names = context.match(/[a-z]+_attributes/g) || []
|
20
|
+
var parent_ids = context.match(/[0-9]+/g)
|
21
|
+
|
22
|
+
for(i = 0; i < parent_names.length; i++) {
|
23
|
+
if(parent_ids[i]) {
|
24
|
+
content = content.replace(
|
25
|
+
new RegExp('(\[' + parent_names[i] + '\])\[.+?\]', 'g'),
|
26
|
+
'$1[' + parent_ids[i] + ']'
|
27
|
+
)
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
// Make a unique ID for the new child
|
33
|
+
var regexp = new RegExp('new_' + assoc, 'g');
|
34
|
+
var new_id = new Date().getTime();
|
35
|
+
content = content.replace(regexp, new_id)
|
36
|
+
|
37
|
+
$(this).parent().after(content);
|
38
|
+
return false;
|
39
|
+
});
|
40
|
+
|
41
|
+
$('form').on('click', 'a.remove_nested_fields', function() {
|
42
|
+
var container = $(this).closest('.destroy');
|
43
|
+
var hidden_field = $('input[type=hidden]', container).val('1');
|
44
|
+
$(this).closest('.nested').hide();
|
45
|
+
return false;
|
46
|
+
});
|
47
|
+
|
48
|
+
// replace the remover checkboxes with a link
|
49
|
+
$('form .destroy > label').hide();
|
50
|
+
$('form .destroy .controls label').each(function(i) {
|
51
|
+
link = $('<a href="javascript:void(0);" class="btn btn-danger btn-mini">Delete</a>').addClass("remove_nested_fields");
|
52
|
+
$(this).empty().append($(link));
|
53
|
+
});
|
54
|
+
|
55
|
+
});
|
@@ -0,0 +1,41 @@
|
|
1
|
+
$(function() {
|
2
|
+
// Support for AJAX loaded modal window.
|
3
|
+
// Focuses on first input textbox after it loads the window.
|
4
|
+
$("[data-previewtoggle='modal']").on('click', function(e) {
|
5
|
+
e.preventDefault();
|
6
|
+
var url = $(this).attr('href');
|
7
|
+
if (url.indexOf('#') == 0) {
|
8
|
+
$(url).modal('open');
|
9
|
+
} else {
|
10
|
+
$.get(url, function(data) {
|
11
|
+
$('<div class="modal hide fade">' + data + '</div>').modal();
|
12
|
+
}).success(function() { $('input:text:visible:first').focus(); });
|
13
|
+
}
|
14
|
+
});
|
15
|
+
|
16
|
+
$(".page-contents").sortable({
|
17
|
+
distance: 20,
|
18
|
+
handle: ".handle",
|
19
|
+
items: "tr.page_content",
|
20
|
+
update: function() {
|
21
|
+
$.ajax($(this).attr('data-reorder-href'), {
|
22
|
+
data: $(this).sortable("serialize", { key: "order[]" })
|
23
|
+
});
|
24
|
+
}
|
25
|
+
});
|
26
|
+
|
27
|
+
$(".page-list").sortable({
|
28
|
+
distance: 20,
|
29
|
+
handle: ".handle",
|
30
|
+
items: "> li.child",
|
31
|
+
update: function() {
|
32
|
+
$.ajax("/smithy/pages/order", {
|
33
|
+
data: $(".page-list").sortable("serialize", { key: "order[]" })
|
34
|
+
// highlight on failure?
|
35
|
+
// failure: function(xhr, status, error) {}
|
36
|
+
});
|
37
|
+
}
|
38
|
+
});
|
39
|
+
});
|
40
|
+
|
41
|
+
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
var ace_edit = function(id, template_type, name) {
|
2
|
+
if (!name) { name = 'template_content' }
|
3
|
+
var editor_name = name + '_editor-' + id
|
4
|
+
$('#'+editor_name).show();
|
5
|
+
var editor = ace.edit(editor_name);
|
6
|
+
var textarea = $('textarea[id="' + name + '-'+id+'"]').hide();
|
7
|
+
var session = editor.getSession();
|
8
|
+
session.setMode("ace/mode/" + template_type);
|
9
|
+
session.setValue(textarea.val());
|
10
|
+
session.setTabSize(2);
|
11
|
+
session.setUseSoftTabs(true);
|
12
|
+
session.setUseWrapMode(true);
|
13
|
+
session.on('change', function(){
|
14
|
+
textarea.val(editor.getSession().getValue());
|
15
|
+
});
|
16
|
+
editor.commands.addCommand({
|
17
|
+
name: 'save',
|
18
|
+
bindKey: {win: 'Ctrl-S', mac: 'Command-S'},
|
19
|
+
exec: function(editor) {
|
20
|
+
$("#"+editor.container.id).closest('form').submit();
|
21
|
+
},
|
22
|
+
readOnly: false
|
23
|
+
});
|
24
|
+
return editor;
|
25
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require_self
|
12
|
+
*= depend_on smithy/bootstrap_and_overrides.css.scss
|
13
|
+
*= depend_on smithy/assets.css.scss
|
14
|
+
*= depend_on smithy/content_blocks.css.scss
|
15
|
+
*= depend_on smithy/layout.css.scss
|
16
|
+
*= depend_on smithy/forms.css.scss
|
17
|
+
*= depend_on smithy/guides.css.scss
|
18
|
+
*= depend_on smithy/pages.css.scss
|
19
|
+
*= depend_on smithy/templates.css.scss
|
20
|
+
*/
|
21
|
+
|
22
|
+
@import 'bootstrap_and_overrides';
|
23
|
+
@import 'layout';
|
24
|
+
@import 'forms';
|
25
|
+
@import 'guides';
|
26
|
+
@import 'pages';
|
27
|
+
@import 'templates';
|
28
|
+
@import 'content_blocks';
|
29
|
+
@import 'assets';
|
@@ -0,0 +1,12 @@
|
|
1
|
+
@import "bootstrap";
|
2
|
+
@import "bootstrap-responsive";
|
3
|
+
@import "font-awesome";
|
4
|
+
.icon-white,
|
5
|
+
.nav > .active > a > [class^="icon-"],
|
6
|
+
.nav > .active > a > [class*=" icon-"],
|
7
|
+
.dropdown-menu > li > a:hover > [class^="icon-"],
|
8
|
+
.dropdown-menu > li > a:hover > [class*=" icon-"],
|
9
|
+
.dropdown-menu > .active > a > [class^="icon-"],
|
10
|
+
.dropdown-menu > .active > a > [class*=" icon-"] {
|
11
|
+
background-image: none;
|
12
|
+
}
|
@@ -0,0 +1,113 @@
|
|
1
|
+
body { background:#444; padding:0; }
|
2
|
+
|
3
|
+
#header { border-bottom:1px solid #666; position:relative; top:0; z-index:-5;
|
4
|
+
h1 {
|
5
|
+
margin:0;
|
6
|
+
padding:2px 8px;
|
7
|
+
text-align:center;
|
8
|
+
width:20%;
|
9
|
+
img { max-width:100%; }
|
10
|
+
}
|
11
|
+
}
|
12
|
+
#header {
|
13
|
+
background: #333333; /* Old browsers */
|
14
|
+
background: -moz-linear-gradient(top, #333333 0%, #222222 100%); /* FF3.6+ */
|
15
|
+
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#333333), color-stop(100%,#222222)); /* Chrome,Safari4+ */
|
16
|
+
background: -webkit-linear-gradient(top, #333333 0%,#222222 100%); /* Chrome10+,Safari5.1+ */
|
17
|
+
background: -o-linear-gradient(top, #333333 0%,#222222 100%); /* Opera 11.10+ */
|
18
|
+
background: -ms-linear-gradient(top, #333333 0%,#222222 100%); /* IE10+ */
|
19
|
+
background: linear-gradient(to bottom, #333333 0%,#222222 100%); /* W3C */
|
20
|
+
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#333333', endColorstr='#222222',GradientType=0 ); /* IE6-9 */
|
21
|
+
}
|
22
|
+
#main-nav {
|
23
|
+
background:transparent;
|
24
|
+
left:20%;
|
25
|
+
right:0;
|
26
|
+
position:absolute;
|
27
|
+
top:0;
|
28
|
+
z-index:5;
|
29
|
+
|
30
|
+
.navbar-inner { background:transparent; border:0; padding-left:0;
|
31
|
+
box-shadow:none;
|
32
|
+
-webkit-box-shadow:none;
|
33
|
+
-moz-box-shadow:none;
|
34
|
+
}
|
35
|
+
.container { padding-top: 6px; }
|
36
|
+
}
|
37
|
+
@media (max-width: 979px) {
|
38
|
+
#main-nav {
|
39
|
+
.nav-collapse {
|
40
|
+
background-color:#333;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
#side {
|
46
|
+
border-top:1px solid #393939; float:left; position:relative; width:20%;
|
47
|
+
.actions { padding:16px 15px 0 15px ; }
|
48
|
+
.nav-list {
|
49
|
+
border-top:1px solid #393939;
|
50
|
+
margin:16px 0 0 0;
|
51
|
+
padding:0;
|
52
|
+
.nav-list { margin:0; }
|
53
|
+
li + .nav-header {
|
54
|
+
margin-top:16px;
|
55
|
+
}
|
56
|
+
.nav-header {
|
57
|
+
color:#DDD;
|
58
|
+
}
|
59
|
+
> li {
|
60
|
+
border-top:1px solid #4e4e4e;
|
61
|
+
border-bottom:1px solid #393939;
|
62
|
+
color:#AAA;
|
63
|
+
}
|
64
|
+
> li > a,
|
65
|
+
.nav-header {
|
66
|
+
text-shadow: 0 1px 0 rgba(0,0,0,.5);
|
67
|
+
margin:0;
|
68
|
+
padding:8px 15px;
|
69
|
+
}
|
70
|
+
> li > a {
|
71
|
+
background-color:transparent;
|
72
|
+
color:#AAA;
|
73
|
+
}
|
74
|
+
> li > a:hover {
|
75
|
+
background-color:#4f4f4f;
|
76
|
+
color:#CCC;
|
77
|
+
}
|
78
|
+
> .active {
|
79
|
+
background: #292929; /* Old browsers */
|
80
|
+
background: -moz-linear-gradient(top, #292929 0%, #3a3a3a 100%);
|
81
|
+
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#292929), color-stop(100%,#3a3a3a));
|
82
|
+
background: -webkit-linear-gradient(top, #292929 0%,#3a3a3a 100%);
|
83
|
+
background: -o-linear-gradient(top, #292929 0%,#3a3a3a 100%);
|
84
|
+
background: -ms-linear-gradient(top, #292929 0%,#3a3a3a 100%);
|
85
|
+
background: linear-gradient(to bottom, #292929 0%,#3a3a3a 100%);
|
86
|
+
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#292929', endColorstr='#3a3a3a',GradientType=0 );
|
87
|
+
> a,
|
88
|
+
> a:hover{ background-color:transparent; }
|
89
|
+
}
|
90
|
+
}
|
91
|
+
}
|
92
|
+
#main { background:#f9f9f9; margin:-52px 0 0 20%; padding:0 0 24px 0; position:relative;
|
93
|
+
-webkit-border-radius: 10px 0px 0px 10px;
|
94
|
+
border-radius: 10px 0px 0px 10px;
|
95
|
+
-webkit-box-shadow: 0px 0px 18px 0px rgba(0, 0, 0, 0.4);
|
96
|
+
box-shadow: 0px 0px 18px 0px rgba(0, 0, 0, 0.4);
|
97
|
+
> h1 { padding:24px 0 0 12px; }
|
98
|
+
> .container-fluid { padding-right:0; }
|
99
|
+
#content { border-right:1px solid #DDD; }
|
100
|
+
#related {}
|
101
|
+
}
|
102
|
+
|
103
|
+
.wide #main {
|
104
|
+
> .container-fluid { padding-right:20px; }
|
105
|
+
#content { border-right:0; }
|
106
|
+
}
|
107
|
+
|
108
|
+
#main-wide { background:#f9f9f9; padding:0 0 24px 0; position:relative; }
|
109
|
+
|
110
|
+
#footer {
|
111
|
+
color:#BBB; font-size:12px; text-align:right; padding:1em;
|
112
|
+
a { color:#EEE; }
|
113
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
.page-contents {
|
2
|
+
.handle { color:#999; cursor:move; padding-right:6px; }
|
3
|
+
}
|
4
|
+
|
5
|
+
#side .page-list {
|
6
|
+
position:relative; overflow:hidden;
|
7
|
+
.back { background:#444; }
|
8
|
+
.back > a { border-top:1px solid #444; }
|
9
|
+
.add-page a { color:#888; text-align:right; padding-right:45px; }
|
10
|
+
|
11
|
+
}
|
12
|
+
|
13
|
+
#side .page-list > li {
|
14
|
+
position:relative;
|
15
|
+
|
16
|
+
> .handle { color:#777; cursor:move; position:absolute; left:6px; top:50%; margin-top:-0.75em;
|
17
|
+
&:hover { color:#DDD; }
|
18
|
+
}
|
19
|
+
> a.edit-page {
|
20
|
+
padding:8px 28px;
|
21
|
+
display: block;
|
22
|
+
white-space: nowrap;
|
23
|
+
text-overflow: ellipsis;
|
24
|
+
overflow: hidden;
|
25
|
+
}
|
26
|
+
> a.add-page {
|
27
|
+
color:#666; padding:6px; position:absolute; right:0px; top:50%; margin-top:-1.25em;
|
28
|
+
&:hover,
|
29
|
+
&:active { background:transparent; color:#DDD; }
|
30
|
+
}
|
31
|
+
&.home > a {
|
32
|
+
padding-left:6px;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
.template_types {}
|
2
|
+
|
3
|
+
textarea[name="template[content]"],
|
4
|
+
textarea[name="content[content]"],
|
5
|
+
#template_content,
|
6
|
+
#content_content { height:100%; width:97%; }
|
7
|
+
|
8
|
+
.template_content_editor,
|
9
|
+
.ace_editor {
|
10
|
+
display:none;
|
11
|
+
min-height:40em;
|
12
|
+
width:97%;
|
13
|
+
position:relative;
|
14
|
+
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require_dependency "smithy/base_controller"
|
2
|
+
|
3
|
+
module Smithy
|
4
|
+
class AssetsController < BaseController
|
5
|
+
before_filter :load_assets, :only => :index
|
6
|
+
respond_to :html, :json, :js
|
7
|
+
|
8
|
+
def index
|
9
|
+
respond_with @assets, :layout => 'smithy/wide'
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
@asset = Asset.new(params[:asset])
|
14
|
+
respond_with @asset
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
@asset = Asset.new(params[:asset])
|
19
|
+
@asset.save
|
20
|
+
flash.notice = "Your asset was created" if @asset.persisted?
|
21
|
+
respond_with @asset do |format|
|
22
|
+
format.html { redirect_to assets_path }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def edit
|
27
|
+
@asset = Asset.find(params[:id])
|
28
|
+
respond_with @asset
|
29
|
+
end
|
30
|
+
|
31
|
+
def update
|
32
|
+
@asset = Asset.find(params[:id])
|
33
|
+
flash.notice = "Your asset was saved" if @asset.update_attributes(params[:asset])
|
34
|
+
respond_with @asset do |format|
|
35
|
+
format.html { redirect_to assets_path }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def destroy
|
40
|
+
@asset = Asset.find(params[:id])
|
41
|
+
@asset.destroy
|
42
|
+
respond_with @asset
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
def load_assets
|
47
|
+
@assets = Asset.order(:name).page(params[:page])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Smithy::BaseController < ApplicationController
|
2
|
+
layout 'smithy/application'
|
3
|
+
|
4
|
+
before_filter :authenticate_smithy_admin
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def authenticate_smithy_admin
|
9
|
+
unless smithy_current_user && smithy_current_user.smithy_admin?
|
10
|
+
flash.alert = "Please login to continue."
|
11
|
+
redirect_to smithy_login_path
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require_dependency "smithy/base_controller"
|
2
|
+
|
3
|
+
module Smithy
|
4
|
+
class ContentBlocksController < BaseController
|
5
|
+
before_filter :load_content_blocks
|
6
|
+
respond_to :html, :json
|
7
|
+
|
8
|
+
def index
|
9
|
+
respond_with @content_blocks
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
@content_block = ContentBlock.new(params[:content_block])
|
14
|
+
respond_with @content_block
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
@content_block = ContentBlock.new(params[:content_block])
|
19
|
+
@content_block.save
|
20
|
+
flash.notice = "Your content_block was created" if @content_block.persisted?
|
21
|
+
respond_with @content_block do |format|
|
22
|
+
format.html { redirect_to [:edit, @content_block] }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def edit
|
27
|
+
@content_block = ContentBlock.find(params[:id])
|
28
|
+
respond_with @content_block
|
29
|
+
end
|
30
|
+
|
31
|
+
def update
|
32
|
+
@content_block = ContentBlock.find(params[:id])
|
33
|
+
flash.notice = "Your content_block was saved" if @content_block.update_attributes(params[:content_block])
|
34
|
+
respond_with @content_block do |format|
|
35
|
+
format.html { redirect_to [:edit, @content_block] }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def destroy
|
40
|
+
@content_block = ContentBlock.find(params[:id])
|
41
|
+
@content_block.destroy
|
42
|
+
respond_with @content_block
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
def load_content_blocks
|
47
|
+
@content_blocks = ContentBlock.all
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require_dependency "smithy/base_controller"
|
2
|
+
|
3
|
+
class Smithy::ContentPiecesController < Smithy::BaseController
|
4
|
+
before_filter :set_controller_path
|
5
|
+
respond_to :html, :json
|
6
|
+
|
7
|
+
helper_method :accessible_attributes
|
8
|
+
helper_method :klass_name
|
9
|
+
helper_method :readable_attributes
|
10
|
+
|
11
|
+
def index
|
12
|
+
@records = find_records
|
13
|
+
respond_with @records, :layout => 'smithy/wide'
|
14
|
+
end
|
15
|
+
|
16
|
+
def show
|
17
|
+
@record = find_record
|
18
|
+
respond_with @record
|
19
|
+
end
|
20
|
+
|
21
|
+
def new
|
22
|
+
@record = new_record
|
23
|
+
respond_with @record
|
24
|
+
end
|
25
|
+
|
26
|
+
def create
|
27
|
+
@record = new_record
|
28
|
+
@record.save
|
29
|
+
flash.notice = "Your #{klass_name} was created" if @record.persisted?
|
30
|
+
respond_with @record do |format|
|
31
|
+
format.html { @record.persisted? ? redirect_to([:edit, @record]) : render(:action => 'new') }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def edit
|
36
|
+
@record = find_record
|
37
|
+
respond_with @record
|
38
|
+
end
|
39
|
+
|
40
|
+
def update
|
41
|
+
@record = find_record
|
42
|
+
@saved = update_record(@record)
|
43
|
+
flash.notice = "Your #{klass_name} was saved" if @saved
|
44
|
+
respond_with @page_content do |format|
|
45
|
+
format.html { @saved ? redirect_to(:action => :index) : render(:action => "edit") }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def destroy
|
50
|
+
@record = find_record
|
51
|
+
@record.destroy
|
52
|
+
flash.notice = "Your #{klass_name} was deleted"
|
53
|
+
respond_with @record
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
def klass
|
58
|
+
# override to provide an object for each class
|
59
|
+
raise "You must inherit from this Smithy::ContentPiecesController and provide a private #klass method"
|
60
|
+
end
|
61
|
+
|
62
|
+
def klass_name
|
63
|
+
@klass_name ||= klass.name.sub(/^Smithy::/, '').titleize
|
64
|
+
end
|
65
|
+
|
66
|
+
def klass_params
|
67
|
+
params[klass.name.sub(/^Smithy::/, '').underscore]
|
68
|
+
end
|
69
|
+
|
70
|
+
def new_record
|
71
|
+
klass.new(klass_params)
|
72
|
+
end
|
73
|
+
|
74
|
+
def find_record
|
75
|
+
klass.find(params[:id])
|
76
|
+
end
|
77
|
+
|
78
|
+
def find_records
|
79
|
+
klass.all
|
80
|
+
end
|
81
|
+
|
82
|
+
def set_controller_path
|
83
|
+
@controller_path = self.class.superclass.name.sub(/Controller$/, '').deconstantize.underscore
|
84
|
+
end
|
85
|
+
|
86
|
+
def update_record(record)
|
87
|
+
record.update_attributes(klass_params)
|
88
|
+
end
|
89
|
+
|
90
|
+
def readable_attributes
|
91
|
+
accessible_attributes
|
92
|
+
end
|
93
|
+
|
94
|
+
def accessible_attributes
|
95
|
+
klass.accessible_attributes.select(&:present?).map(&:to_sym)
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_dependency "smithy/base_controller"
|
2
|
+
|
3
|
+
module Smithy
|
4
|
+
class ContentsController < BaseController
|
5
|
+
respond_to :html, :json
|
6
|
+
|
7
|
+
def show
|
8
|
+
@content = Smithy::Content.find(params[:id])
|
9
|
+
respond_with @content
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
@content = Smithy::Content.new(params[:content])
|
14
|
+
respond_with @content
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
@content = Smithy::Content.new(params[:content])
|
19
|
+
@content.save
|
20
|
+
flash.notice = "Your content was created" if @content.persisted?
|
21
|
+
respond_with @content
|
22
|
+
end
|
23
|
+
|
24
|
+
def edit
|
25
|
+
@content = Smithy::Content.find(params[:id])
|
26
|
+
respond_with @content
|
27
|
+
end
|
28
|
+
|
29
|
+
def update
|
30
|
+
@content = Smithy::Content.find(params[:id])
|
31
|
+
flash.notice = "Your content was saved" if @content.update_attributes(params[:content])
|
32
|
+
respond_with @content
|
33
|
+
end
|
34
|
+
|
35
|
+
def destroy
|
36
|
+
@content = Smithy::Content.find(params[:id])
|
37
|
+
@content.destroy
|
38
|
+
respond_with @content
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_dependency "smithy/base_controller"
|
2
|
+
|
3
|
+
module Smithy
|
4
|
+
class ImagesController < BaseController
|
5
|
+
respond_to :html, :json
|
6
|
+
|
7
|
+
def show
|
8
|
+
@image = Smithy::Image.find(params[:id])
|
9
|
+
respond_with @image
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
@image = Smithy::Image.new(params[:image])
|
14
|
+
respond_with @image
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
@image = Smithy::Image.new(params[:image])
|
19
|
+
@image.save
|
20
|
+
flash.notice = "Your image was created" if @image.persisted?
|
21
|
+
respond_with @image
|
22
|
+
end
|
23
|
+
|
24
|
+
def edit
|
25
|
+
@image = Smithy::Image.find(params[:id])
|
26
|
+
respond_with @image
|
27
|
+
end
|
28
|
+
|
29
|
+
def update
|
30
|
+
@image = Smithy::Image.find(params[:id])
|
31
|
+
flash.notice = "Your image was saved" if @image.update_attributes(params[:image])
|
32
|
+
respond_with @image
|
33
|
+
end
|
34
|
+
|
35
|
+
def destroy
|
36
|
+
@image = Smithy::Image.find(params[:id])
|
37
|
+
@image.destroy
|
38
|
+
respond_with @image
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|