smithycms 0.7.3 → 0.8.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.
Files changed (200) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/smithy/editor.coffee +4 -3
  3. data/app/assets/javascripts/smithy/nested_forms.js +1 -1
  4. data/app/assets/javascripts/smithy/page_contents.coffee +11 -0
  5. data/app/assets/stylesheets/smithy/forms.scss +23 -0
  6. data/app/assets/stylesheets/smithy/pages.scss +5 -0
  7. data/app/assets/stylesheets/smithy/templates.scss +1 -6
  8. data/app/controllers/smithy/pages_controller.rb +1 -1
  9. data/app/helpers/smithy/application_helper.rb +3 -6
  10. data/app/inputs/markdown_input.rb +6 -3
  11. data/app/models/smithy/asset.rb +1 -1
  12. data/app/models/smithy/content_block_template.rb +1 -1
  13. data/app/models/smithy/image.rb +1 -1
  14. data/app/models/smithy/page.rb +3 -2
  15. data/app/models/smithy/page_content.rb +8 -4
  16. data/app/models/smithy/permitted_params.rb +43 -6
  17. data/app/models/smithy/template_container.rb +1 -1
  18. data/app/views/smithy/pages/_container.html.erb +2 -20
  19. data/app/views/smithy/pages/_page_content.html.erb +27 -0
  20. data/db/migrate/20160819164547_add_css_classes_to_smithy_page_contents.rb +5 -0
  21. data/lib/smithy.rb +1 -0
  22. data/lib/smithy/content_blocks/model.rb +1 -1
  23. data/lib/smithy/content_blocks/registry.rb +1 -2
  24. data/lib/smithy/dependencies.rb +1 -0
  25. data/lib/smithy/engine.rb +4 -3
  26. data/lib/smithy/liquid/tags/html.rb +6 -2
  27. data/lib/smithy/page_content_wrapper.rb +15 -0
  28. data/lib/smithy/version.rb +1 -1
  29. metadata +25 -178
  30. data/app/assets/javascripts/smithy/page_contents.js +0 -4
  31. data/vendor/cache/CFPropertyList-2.3.2.gem +0 -0
  32. data/vendor/cache/actionmailer-4.1.10.gem +0 -0
  33. data/vendor/cache/actionpack-4.1.10.gem +0 -0
  34. data/vendor/cache/actionview-4.1.10.gem +0 -0
  35. data/vendor/cache/activemodel-4.1.10.gem +0 -0
  36. data/vendor/cache/activerecord-4.1.10.gem +0 -0
  37. data/vendor/cache/activesupport-4.1.10.gem +0 -0
  38. data/vendor/cache/addressable-2.3.8.gem +0 -0
  39. data/vendor/cache/amoeba-3.0.0.gem +0 -0
  40. data/vendor/cache/arel-5.0.1.20140414130214.gem +0 -0
  41. data/vendor/cache/autoprefixer-rails-6.3.6.1.gem +0 -0
  42. data/vendor/cache/awesome_nested_set-3.0.3.gem +0 -0
  43. data/vendor/cache/aws-sdk-2.3.4.gem +0 -0
  44. data/vendor/cache/aws-sdk-core-2.3.4.gem +0 -0
  45. data/vendor/cache/aws-sdk-resources-2.3.4.gem +0 -0
  46. data/vendor/cache/bcrypt-3.1.10.gem +0 -0
  47. data/vendor/cache/bootstrap-sass-3.2.0.2.gem +0 -0
  48. data/vendor/cache/builder-3.2.2.gem +0 -0
  49. data/vendor/cache/byebug-4.0.5.gem +0 -0
  50. data/vendor/cache/capybara-2.4.4.gem +0 -0
  51. data/vendor/cache/celluloid-0.16.0.gem +0 -0
  52. data/vendor/cache/coderay-1.1.0.gem +0 -0
  53. data/vendor/cache/coffee-rails-4.1.1.gem +0 -0
  54. data/vendor/cache/coffee-script-2.4.1.gem +0 -0
  55. data/vendor/cache/coffee-script-source-1.10.0.gem +0 -0
  56. data/vendor/cache/columnize-0.9.0.gem +0 -0
  57. data/vendor/cache/concurrent-ruby-1.0.2.gem +0 -0
  58. data/vendor/cache/coveralls-0.7.12.gem +0 -0
  59. data/vendor/cache/crass-1.0.2.gem +0 -0
  60. data/vendor/cache/database_cleaner-1.4.1.gem +0 -0
  61. data/vendor/cache/diff-lcs-1.2.5.gem +0 -0
  62. data/vendor/cache/docile-1.1.5.gem +0 -0
  63. data/vendor/cache/domain_name-0.5.23.gem +0 -0
  64. data/vendor/cache/dotenv-2.0.1.gem +0 -0
  65. data/vendor/cache/dotenv-rails-2.0.1.gem +0 -0
  66. data/vendor/cache/em-websocket-0.5.1.gem +0 -0
  67. data/vendor/cache/erubis-2.7.0.gem +0 -0
  68. data/vendor/cache/eventmachine-1.0.7.gem +0 -0
  69. data/vendor/cache/excon-0.49.0.gem +0 -0
  70. data/vendor/cache/execjs-2.6.0.gem +0 -0
  71. data/vendor/cache/factory_girl-4.5.0.gem +0 -0
  72. data/vendor/cache/factory_girl_rails-4.5.0.gem +0 -0
  73. data/vendor/cache/fakeweb-1.3.0.gem +0 -0
  74. data/vendor/cache/ffaker-2.0.0.gem +0 -0
  75. data/vendor/cache/ffi-1.9.8.gem +0 -0
  76. data/vendor/cache/fission-0.5.0.gem +0 -0
  77. data/vendor/cache/fog-1.38.0.gem +0 -0
  78. data/vendor/cache/fog-aliyun-0.1.0.gem +0 -0
  79. data/vendor/cache/fog-atmos-0.1.0.gem +0 -0
  80. data/vendor/cache/fog-aws-0.9.2.gem +0 -0
  81. data/vendor/cache/fog-brightbox-0.10.1.gem +0 -0
  82. data/vendor/cache/fog-cloudatcost-0.1.2.gem +0 -0
  83. data/vendor/cache/fog-core-1.39.0.gem +0 -0
  84. data/vendor/cache/fog-dynect-0.0.3.gem +0 -0
  85. data/vendor/cache/fog-ecloud-0.3.0.gem +0 -0
  86. data/vendor/cache/fog-google-0.1.0.gem +0 -0
  87. data/vendor/cache/fog-json-1.0.2.gem +0 -0
  88. data/vendor/cache/fog-local-0.3.0.gem +0 -0
  89. data/vendor/cache/fog-openstack-0.1.5.gem +0 -0
  90. data/vendor/cache/fog-powerdns-0.1.1.gem +0 -0
  91. data/vendor/cache/fog-profitbricks-0.0.5.gem +0 -0
  92. data/vendor/cache/fog-rackspace-0.1.1.gem +0 -0
  93. data/vendor/cache/fog-radosgw-0.0.5.gem +0 -0
  94. data/vendor/cache/fog-riakcs-0.1.0.gem +0 -0
  95. data/vendor/cache/fog-sakuracloud-1.7.5.gem +0 -0
  96. data/vendor/cache/fog-serverlove-0.1.2.gem +0 -0
  97. data/vendor/cache/fog-softlayer-1.1.1.gem +0 -0
  98. data/vendor/cache/fog-storm_on_demand-0.1.1.gem +0 -0
  99. data/vendor/cache/fog-terremark-0.1.0.gem +0 -0
  100. data/vendor/cache/fog-vmfusion-0.1.0.gem +0 -0
  101. data/vendor/cache/fog-voxel-0.1.0.gem +0 -0
  102. data/vendor/cache/fog-vsphere-0.7.0.gem +0 -0
  103. data/vendor/cache/fog-xenserver-0.2.3.gem +0 -0
  104. data/vendor/cache/fog-xml-0.1.2.gem +0 -0
  105. data/vendor/cache/font-awesome-sass-4.6.2.gem +0 -0
  106. data/vendor/cache/formatador-0.2.5.gem +0 -0
  107. data/vendor/cache/formtastic-3.1.4.gem +0 -0
  108. data/vendor/cache/formtastic-bootstrap-3.1.1.gem +0 -0
  109. data/vendor/cache/friendly_id-5.0.5.gem +0 -0
  110. data/vendor/cache/fuubar-2.0.0.gem +0 -0
  111. data/vendor/cache/guard-2.12.5.gem +0 -0
  112. data/vendor/cache/guard-compat-1.2.1.gem +0 -0
  113. data/vendor/cache/guard-livereload-2.4.0.gem +0 -0
  114. data/vendor/cache/guard-rspec-4.5.0.gem +0 -0
  115. data/vendor/cache/hitimes-1.2.2.gem +0 -0
  116. data/vendor/cache/http-cookie-1.0.2.gem +0 -0
  117. data/vendor/cache/http_parser.rb-0.6.0.gem +0 -0
  118. data/vendor/cache/httparty-0.13.7.gem +0 -0
  119. data/vendor/cache/i18n-0.7.0.gem +0 -0
  120. data/vendor/cache/inflecto-0.0.2.gem +0 -0
  121. data/vendor/cache/ipaddress-0.8.3.gem +0 -0
  122. data/vendor/cache/jmespath-1.2.4.gem +0 -0
  123. data/vendor/cache/jquery-rails-3.1.4.gem +0 -0
  124. data/vendor/cache/json-1.8.2.gem +0 -0
  125. data/vendor/cache/json_pure-1.8.3.gem +0 -0
  126. data/vendor/cache/kaminari-0.16.3.gem +0 -0
  127. data/vendor/cache/kramdown-1.11.1.gem +0 -0
  128. data/vendor/cache/launchy-2.4.3.gem +0 -0
  129. data/vendor/cache/letter_opener-1.3.0.gem +0 -0
  130. data/vendor/cache/liquid-2.6.3.gem +0 -0
  131. data/vendor/cache/listen-2.10.0.gem +0 -0
  132. data/vendor/cache/lumberjack-1.0.9.gem +0 -0
  133. data/vendor/cache/mail-2.6.4.gem +0 -0
  134. data/vendor/cache/method_source-0.8.2.gem +0 -0
  135. data/vendor/cache/mime-types-2.4.3.gem +0 -0
  136. data/vendor/cache/mini_magick-4.5.1.gem +0 -0
  137. data/vendor/cache/mini_portile-0.6.2.gem +0 -0
  138. data/vendor/cache/minitest-5.5.1.gem +0 -0
  139. data/vendor/cache/multi_json-1.11.0.gem +0 -0
  140. data/vendor/cache/multi_xml-0.5.5.gem +0 -0
  141. data/vendor/cache/mysql2-0.3.18.gem +0 -0
  142. data/vendor/cache/nenv-0.2.0.gem +0 -0
  143. data/vendor/cache/netrc-0.10.3.gem +0 -0
  144. data/vendor/cache/nokogiri-1.6.6.2.gem +0 -0
  145. data/vendor/cache/nokogumbo-1.4.7.gem +0 -0
  146. data/vendor/cache/notiffany-0.0.6.gem +0 -0
  147. data/vendor/cache/pg-0.18.1.gem +0 -0
  148. data/vendor/cache/pry-0.10.1.gem +0 -0
  149. data/vendor/cache/rack-1.5.2.gem +0 -0
  150. data/vendor/cache/rack-cache-1.6.1.gem +0 -0
  151. data/vendor/cache/rack-livereload-0.3.15.gem +0 -0
  152. data/vendor/cache/rack-protection-1.5.3.gem +0 -0
  153. data/vendor/cache/rack-test-0.6.3.gem +0 -0
  154. data/vendor/cache/rails-4.1.10.gem +0 -0
  155. data/vendor/cache/railties-4.1.10.gem +0 -0
  156. data/vendor/cache/rake-10.4.2.gem +0 -0
  157. data/vendor/cache/rb-fsevent-0.9.4.gem +0 -0
  158. data/vendor/cache/rb-inotify-0.9.5.gem +0 -0
  159. data/vendor/cache/rbvmomi-1.8.2.gem +0 -0
  160. data/vendor/cache/refile-0.6.2.gem +0 -0
  161. data/vendor/cache/refile-mini_magick-0.2.0.gem +0 -0
  162. data/vendor/cache/refile-s3-0.2.0.gem +0 -0
  163. data/vendor/cache/remotipart-1.2.1.gem +0 -0
  164. data/vendor/cache/rest-client-1.8.0.gem +0 -0
  165. data/vendor/cache/rinku-1.7.3.gem +0 -0
  166. data/vendor/cache/rspec-3.2.0.gem +0 -0
  167. data/vendor/cache/rspec-core-3.2.2.gem +0 -0
  168. data/vendor/cache/rspec-expectations-3.2.0.gem +0 -0
  169. data/vendor/cache/rspec-mocks-3.2.1.gem +0 -0
  170. data/vendor/cache/rspec-rails-3.2.1.gem +0 -0
  171. data/vendor/cache/rspec-support-3.2.2.gem +0 -0
  172. data/vendor/cache/ruby-oembed-0.8.14.gem +0 -0
  173. data/vendor/cache/ruby-progressbar-1.7.5.gem +0 -0
  174. data/vendor/cache/sanitize-4.0.1.gem +0 -0
  175. data/vendor/cache/sass-3.4.22.gem +0 -0
  176. data/vendor/cache/sass-rails-5.0.4.gem +0 -0
  177. data/vendor/cache/shellany-0.0.1.gem +0 -0
  178. data/vendor/cache/shoulda-matchers-2.8.0.gem +0 -0
  179. data/vendor/cache/simplecov-0.9.2.gem +0 -0
  180. data/vendor/cache/simplecov-html-0.9.0.gem +0 -0
  181. data/vendor/cache/sinatra-1.4.7.gem +0 -0
  182. data/vendor/cache/slodown-0.1.3.gem +0 -0
  183. data/vendor/cache/slop-3.6.0.gem +0 -0
  184. data/vendor/cache/smithycms-auth-0.4.2.gem +0 -0
  185. data/vendor/cache/sprockets-3.6.0.gem +0 -0
  186. data/vendor/cache/sprockets-rails-2.3.3.gem +0 -0
  187. data/vendor/cache/sqlite3-1.3.10.gem +0 -0
  188. data/vendor/cache/term-ansicolor-1.3.0.gem +0 -0
  189. data/vendor/cache/terminal-notifier-guard-1.6.4.gem +0 -0
  190. data/vendor/cache/thor-0.19.1.gem +0 -0
  191. data/vendor/cache/thread_safe-0.3.5.gem +0 -0
  192. data/vendor/cache/tilt-2.0.4.gem +0 -0
  193. data/vendor/cache/timers-4.0.1.gem +0 -0
  194. data/vendor/cache/tins-1.3.5.gem +0 -0
  195. data/vendor/cache/trollop-2.1.2.gem +0 -0
  196. data/vendor/cache/tzinfo-1.2.2.gem +0 -0
  197. data/vendor/cache/unf-0.1.4.gem +0 -0
  198. data/vendor/cache/unf_ext-0.0.6.gem +0 -0
  199. data/vendor/cache/xml-simple-1.1.5.gem +0 -0
  200. data/vendor/cache/xpath-2.0.0.gem +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4ddcfec9326cecb947ca8f6b438d922c50b9aade
4
- data.tar.gz: a8baae438f9d3ecd2a51408d849a7483c9a9af62
3
+ metadata.gz: 4b8a748c87e90088c1ecde907900b0f65cd9e995
4
+ data.tar.gz: 74176f6fed35d9fc36e809a67885048d1e58dae3
5
5
  SHA512:
6
- metadata.gz: cf299a6e9b5913807d587854ddb2140f311c1e12b4571695a6b42a5621b3dfd5135eb02c5f7f505726c335d7f15ee848ac0a7c7fedbb6f9268341410550a031e
7
- data.tar.gz: b1c0bfccc3e54cc2917681625723bd9633f48c0e47e98ea6baa7f317a95c8bd03f164fe6260d9b4c7c5898f23119130759c45224a8ff7abd0a9ba954e7dd7e95
6
+ metadata.gz: d8b890ff799dc1439f26133149ea290e1c711e46faa1f53b4d426d70400e0672fa20aad5eb881b731989720b4a67ec243d93e2e975d2309fbb3602c8fdf3aa3f
7
+ data.tar.gz: 6991e5a9ee4b806b5baaebdb5a9bb5cc7169ba33f366d531ab48e965171c0bf3d0f648e610e60d91758f584f8fa4433046a824678fa1e94c39d66eb40a90b2a5
@@ -26,10 +26,11 @@ window.ace_edit = (id, template_type, name) ->
26
26
  ,
27
27
  readOnly: false
28
28
  })
29
- editor.setOptions({
30
- enableBasicAutocompletion: true,
29
+ editor.setOptions
30
+ enableBasicAutocompletion: true
31
31
  enableSnippets: true
32
- })
32
+ maxLines: 40
33
+ minLines: 2
33
34
  return editor
34
35
 
35
36
  create_ace_toolbar = (editor, assets_modal_url, pages_modal_url) ->
@@ -5,7 +5,7 @@ $(function() {
5
5
  $('form').on('click', 'a.add_nested_fields', function() {
6
6
  // Setup
7
7
  var assoc = $(this).attr('data-association'); // Name of child
8
- var content = $('#' + assoc + '_fields_blueprint').html(); // Fields template
8
+ var content = $(this).attr('data-fields-blueprint'); // Fields template
9
9
 
10
10
  // Make the context correct by replacing new_<parents> with the generated ID
11
11
  // of each of the parent objects
@@ -0,0 +1,11 @@
1
+ $("form#new_page_content .page_content_block").click ->
2
+ $('#page_content_content_block_type').val($(this).attr('data-content_block'))
3
+ $('form#new_page_content').submit()
4
+
5
+ $('.page_content .page_content-heading a[data-toggle="collapse"]').click (e) ->
6
+ e.preventDefault()
7
+ e.stopPropagation()
8
+ $(this).parent().siblings('.page_content-fields').collapse('toggle')
9
+
10
+ # $ ->
11
+ # $('.page_content-fields').collapse('hide')
@@ -1,3 +1,26 @@
1
1
  #template_content,
2
2
  #content_content,
3
3
  #content_block_content { height:100%; width:97%; }
4
+
5
+
6
+ .page_content {
7
+ @extend .panel;
8
+ @extend .panel-default;
9
+ margin-bottom:8px;
10
+
11
+ .page_content-heading { @extend .panel-heading; }
12
+ .page_content-fields {
13
+ @extend .panel-collapse;
14
+ > div { @extend .panel-body; }
15
+ }
16
+ .page_content-toggle {
17
+ color:$text-color; display:inline-block; width:100%;
18
+ &:hover,
19
+ &:active,
20
+ &:focus { text-decoration: none; }
21
+ .name { font-weight: bold; }
22
+ .type,
23
+ .lastupdated { color:#BBB; font-size:$font-size-small; padding-left:1em; }
24
+ .lastupdated { float:right; font-style:italic; padding-top:$font-size-base - $font-size-small; }
25
+ }
26
+ }
@@ -2,6 +2,11 @@
2
2
  .handle { color:#999; cursor:move; padding-right:6px; }
3
3
  }
4
4
 
5
+ .page-container {
6
+ border-top: 1px solid #AAA; margin: 1.5em 0; padding: 1.5em 0 1em;
7
+ &:first-child { margin-top: 3em }
8
+ }
9
+
5
10
  #side .page-list {
6
11
  position:relative; overflow:hidden;
7
12
  .back { background:#444; }
@@ -8,14 +8,9 @@ textarea[name="content[content]"],
8
8
  .template_content_editor,
9
9
  .ace_editor {
10
10
  display:none;
11
- min-height:40em;
12
- width:97%;
11
+ width:100%;
13
12
  position:relative;
14
- &.short {
15
- min-height:10em;
16
- }
17
13
  }
18
-
19
14
  .ace-editor-toolbar {
20
15
  background:#f9f9f9; border:1px solid darken(#f9f9f9,10%); border-radius:$border-radius-base $border-radius-base 0 0; line-height:40px; width:97%; margin:0; padding:0;
21
16
  li {
@@ -112,7 +112,7 @@ module Smithy
112
112
 
113
113
  def page_path
114
114
  params[:path] = '' if params[:id].nil? && params[:path].nil? # sets the root path when nothing else is passed
115
- params[:path].nil? ? params[:id] : "/#{params[:path]}"
115
+ params[:path].nil? ? params[:id] : "/#{params[:path]}".downcase
116
116
  end
117
117
 
118
118
  def render_page
@@ -1,13 +1,10 @@
1
1
  module Smithy
2
2
  module ApplicationHelper
3
3
  def smithy_link_to_add_fields(name, association, form_builder)
4
- html = content_tag(:div, :id => "#{association}_fields_blueprint", :style => "display:none;") do
5
- form_builder.semantic_fields_for(association, model_object(form_builder, association), :child_index => "new_#{association}") do |builder|
6
- form_builder.template.concat(raw render("#{form_builder.object.class.to_s.tableize}/#{association.to_s.singularize}_fields", :f => builder))
7
- end
4
+ blueprint = form_builder.semantic_fields_for(association, model_object(form_builder, association), :child_index => "new_#{association}") do |builder|
5
+ raw render("#{form_builder.object.class.to_s.tableize}/#{association.to_s.singularize}_fields", :f => builder)
8
6
  end
9
- form_builder.template.concat(html)
10
- form_builder.template.link_to(name, "javascript:void(0)", :class => "add_nested_fields", "data-association" => association)
7
+ form_builder.template.link_to(name, "javascript:void(0)", :class => "add_nested_fields", "data-association" => association, 'data-fields-blueprint' => CGI.escapeHTML(blueprint).html_safe)
11
8
  end
12
9
 
13
10
  def smithy_link_to_remove_fields(name, form_builder)
@@ -3,9 +3,12 @@ class MarkdownInput < FormtasticBootstrap::Inputs::TextInput
3
3
  def to_html
4
4
  self.options[:hint] = markdown_hint if self.options[:hint].blank?
5
5
  bootstrap_wrapping do
6
- builder.text_area(method, form_control_input_html_options) +
7
- builder.template.content_tag(:div, nil, id: editor_id, class: 'ace_editor', data: { id: id, type: :markdown, name: dom_id, init: "$('##{editor_id}').smithy_editor()".html_safe, assets_url: builder.template.selector_modal_assets_path, pages_url: builder.template.selector_modal_pages_path }) +
8
- builder.template.content_tag(:div, nil, id: 'content-guide')
6
+ text_area = builder.text_area(method, form_control_input_html_options)
7
+ editor = builder.template.content_tag :div do
8
+ builder.template.content_tag(:div, nil, id: editor_id, class: 'ace_editor', data: { id: id, type: :markdown, name: dom_id, init: "$('##{editor_id}').smithy_editor()".html_safe, assets_url: builder.template.selector_modal_assets_path, pages_url: builder.template.selector_modal_pages_path }) +
9
+ builder.template.content_tag(:div, nil, id: 'content-guide')
10
+ end
11
+ text_area + editor
9
12
  end
10
13
  end
11
14
 
@@ -1,7 +1,7 @@
1
1
  module Smithy
2
2
  class Asset < ActiveRecord::Base
3
3
  validates_presence_of :file, :name
4
- belongs_to :asset_source
4
+ belongs_to :asset_source, inverse_of: :assets
5
5
  has_many :images, :dependent => :destroy
6
6
 
7
7
  attachment :file
@@ -1,6 +1,6 @@
1
1
  module Smithy
2
2
  class ContentBlockTemplate < ActiveRecord::Base
3
- belongs_to :content_block, :touch => true
3
+ belongs_to :content_block, :touch => true, inverse_of: :templates
4
4
  has_many :page_contents
5
5
 
6
6
  validates_presence_of :name
@@ -4,7 +4,7 @@ module Smithy
4
4
 
5
5
  validates_presence_of :asset
6
6
 
7
- belongs_to :asset
7
+ belongs_to :asset, inverse_of: :images
8
8
 
9
9
  class << self
10
10
  def content_block_description
@@ -5,7 +5,7 @@ module Smithy
5
5
  validate :validate_exclusion_of_reserved_words
6
6
  validate :validate_page_to_copy_exists
7
7
 
8
- belongs_to :template
8
+ belongs_to :template, inverse_of: :pages
9
9
  has_many :containers, :through => :template
10
10
  has_many :contents, :class_name => "PageContent"
11
11
 
@@ -44,6 +44,7 @@ module Smithy
44
44
  end
45
45
 
46
46
  def duplicate_content_from(page_id)
47
+ page_id = page_id.id if page_id.is_a?(Smithy::Page)
47
48
  page = Page.find(page_id)
48
49
  self.contents = page.contents.map(&:amoeba_dup)
49
50
  self.contents.each do |content|
@@ -55,7 +56,7 @@ module Smithy
55
56
  def normalize_friendly_id(value) # normalize_friendly_id overrides the default creator for friendly_id
56
57
  return "/" if self.parent.blank?
57
58
  value = self.permalink? ? self.permalink.parameterize : value.to_s.parameterize
58
- [(self.parent.present? && !self.parent.root? ? self.parent.path : nil), value].join('/')
59
+ [(self.parent.present? && !self.parent.root? ? self.parent.path : nil), value].join('/').downcase
59
60
  end
60
61
 
61
62
  def should_generate_new_friendly_id?
@@ -4,13 +4,14 @@ module Smithy
4
4
  validates_presence_of :content_block_type, :on => :create
5
5
  validates_presence_of :label, :container, :page
6
6
 
7
- belongs_to :page, :touch => true
8
- belongs_to :content_block, :polymorphic => true
9
- belongs_to :content_block_template
7
+ belongs_to :page, :touch => true, inverse_of: :contents
8
+ belongs_to :content_block, :polymorphic => true, inverse_of: :page_contents
9
+ belongs_to :content_block_template, inverse_of: :page_contents
10
10
 
11
11
  before_update :set_publishable
12
12
 
13
13
  accepts_nested_attributes_for :content_block, :allow_destroy => true
14
+
14
15
  amoeba do
15
16
  enable
16
17
  include_association :content_block
@@ -41,7 +42,10 @@ module Smithy
41
42
  # scopes as the original values as well, but this ensures they don't get clobbered
42
43
  liquid_context.merge('smithy' => liquid_context.scopes.last)
43
44
  liquid_context.merge(self.to_liquid)
44
- content_block_template.liquid_template.render(liquid_context)
45
+ output = content_block_template.liquid_template.render(liquid_context)
46
+ # auto-wrap every page content in a div with the page_content-#id and the page_content#css_classes
47
+ wrapper = Smithy::PageContentWrapper.new(self)
48
+ wrapper.wrap(output)
45
49
  end
46
50
  end
47
51
 
@@ -25,12 +25,11 @@ module Smithy
25
25
  end
26
26
 
27
27
  def content_block_attributes
28
- # [ :name, templates_attributes: [ :id, :name, :content, :_destroy ] ]
29
- :all
28
+ [ :name, templates_attributes: [ :id, :name, :content, :_destroy ] ]
30
29
  end
31
30
 
32
31
  def content_block_template_attributes
33
- [ :content, :name ]
32
+ [ :name, :content ]
34
33
  end
35
34
 
36
35
  def image_attributes
@@ -38,12 +37,19 @@ module Smithy
38
37
  end
39
38
 
40
39
  def page_attributes
41
- [ :browser_title, :cache_length, :description, :external_link, :keywords, :permalink, :publish, :published_at, :show_in_navigation, :title, :parent_id, :template_id, :copy_content_from ]
40
+ [
41
+ :browser_title, :cache_length, :description, :external_link, :keywords, :permalink, :publish, :published_at, :show_in_navigation, :title, :parent_id, :template_id, :copy_content_from,
42
+ contents_attributes: page_content_attributes + [:id, :_destroy]
43
+ ]
42
44
  end
43
45
 
44
46
  def page_content_attributes
45
- # [ :label, :container, :content_block_type, :content_block_template_id, :position ]
46
- :all
47
+ attributes = [ :label, :css_classes, :container, :content_block_type, :content_block_template_id, :position ]
48
+ content_block_attributes = ::Smithy::ContentBlocks::Registry.content_blocks.inject([]) do |association_attributes, content_block_type|
49
+ association_attributes += nested_content_block_attributes_for(content_block_type)
50
+ end
51
+ attributes << { content_block_attributes: content_block_attributes + [:id, :_destroy] } if content_block_attributes.present?
52
+ attributes
47
53
  end
48
54
 
49
55
  def page_list_attributes
@@ -61,5 +67,36 @@ module Smithy
61
67
  def template_container_attributes
62
68
  [ :name, :position ]
63
69
  end
70
+
71
+ private
72
+ def content_block_attributes_for(content_block_type)
73
+ attributes_method = "#{content_block_type.underscore}_attributes".to_sym
74
+ if self.respond_to?(attributes_method)
75
+ public_send(attributes_method)
76
+ else
77
+ klass = "Smithy::#{content_block_type.camelize}".safe_constantize || content_block_type.camelize.safe_constantize
78
+ klass.present? ? klass.column_names.delete_if { |n| n.to_s.presence_in %w(id updated_at created_at) }.map(&:to_sym) : []
79
+ end
80
+ end
81
+
82
+ def nested_content_block_attributes_for(content_block_type)
83
+ content_block_attributes = content_block_attributes_for(content_block_type)
84
+ association_attributes = []
85
+ reflected_content_block_associations(content_block_type).each do |reflection|
86
+ name, association = reflection
87
+ next if association.active_record.nested_attributes_options[name.to_sym].blank?
88
+ allowed_attributes = content_block_attributes_for(content_block_type) + [:id]
89
+ allowed_attributes += [:_destroy] if association.active_record.nested_attributes_options[name.to_sym][:allow_destroy] == true
90
+ association_attributes << {"#{name}_attributes".to_sym => allowed_attributes }
91
+ end
92
+ content_block_attributes += association_attributes
93
+ content_block_attributes.uniq
94
+ end
95
+
96
+ def reflected_content_block_associations(content_block_type)
97
+ klass = "Smithy::#{content_block_type}".safe_constantize || content_block_type.safe_constantize
98
+ reflections = klass.reflections.delete_if{|k,v| k.to_s.presence_in %w(id page_contents pages) }
99
+ end
100
+
64
101
  end
65
102
  end
@@ -2,7 +2,7 @@ module Smithy
2
2
  class TemplateContainer < ActiveRecord::Base
3
3
  validates_presence_of :name, :template
4
4
 
5
- belongs_to :template
5
+ belongs_to :template, inverse_of: :containers
6
6
  has_many :pages, :through => :template
7
7
 
8
8
  default_scope -> { order([:position, :name]) }
@@ -1,24 +1,6 @@
1
- <div class="well">
1
+ <div class="page-container">
2
2
  <%= f.inputs container.display_name do %>
3
- <table class="table table-striped page-contents" data-reorder-href="<%= order_page_contents_path(@page.id) %>">
4
- <% @page.contents.for_container(container.name).each do |page_content| %>
5
- <%= content_tag_for :tr, page_content do %>
6
- <td>
7
- <i class="fa fa-reorder handle"></i>
8
- <%= link_to "edit", edit_page_content_path(@page.id, page_content), class: "btn btn-primary btn-sm" %>
9
- </td>
10
- <td><strong><%= page_content.label %></strong></td>
11
- <td><%= page_content.content_block_type.demodulize %></td>
12
- <td><%= page_content.updated_at.strftime('%b %e, %Y %H:%M:%S') %></td>
13
- <td>
14
- <div class="pull-right">
15
- <%= link_to "preview", preview_page_content_path(@page.id, page_content), class: "btn btn-default btn-sm", data: { previewtoggle: "modal" } %>
16
- <%= link_to "<i class=\"fa fa-trash\"></i> delete".html_safe, page_content_path(@page.id, page_content), method: :delete, data: { confirm: "Do you really want to delete this content?" }, class: "btn btn-danger btn-sm" %>
17
- </div>
18
- </td>
19
- <% end %>
20
- <% end %>
21
- </table>
3
+ <%= render :partial => "page_content", :collection => @page.contents.for_container(container.name), :locals => { :f => f } %>
22
4
  <div><%= link_to "Add to #{container.display_name}", new_page_content_path(@page.id, page_content: { container: container.name }), class: "btn btn-primary btn-sm" %></div>
23
5
  <% end %>
24
6
  </div>
@@ -0,0 +1,27 @@
1
+ <div class="page_content">
2
+ <%= f.semantic_fields_for :contents, page_content do |f| %>
3
+ <div class="page_content-heading">
4
+ <a href="#page_content-<%= page_content.id %>" class="page_content-toggle" id="page_content-<%= page_content.id %>" data-toggle="collapse">
5
+ <span class="name"><%= page_content.label %></span>
6
+ <span class="type"><%= page_content.content_block_type.demodulize.underscore.humanize %></span>
7
+ <span class="lastupdated">Last Updated: <%= page_content.updated_at.strftime('%b %e, %Y %H:%M') %></span>
8
+ </a>
9
+ </div>
10
+ <div class="page_content-fields collapse" role="tabpanel">
11
+ <div>
12
+ <%= f.inputs do %>
13
+ <%= f.input :label, hint: "Internal CMS usage only - so you can identify it later" %>
14
+ <%= f.input :css_classes, label: 'CSS Classes', hint: 'If you need a hook to apply special styles' %>
15
+ <%= f.input :container, as: :hidden %>
16
+ <%= f.input :content_block_type, as: :hidden %>
17
+ <% end %>
18
+ <div class="well">
19
+ <%= f.input :content_block_template, collection: page_content.templates, include_blank: false %>
20
+ <%= f.semantic_fields_for(:content_block) do |builder| %>
21
+ <%= render partial: "#{page_content.content_block_type.underscore.pluralize}/form_fields", locals: { f: builder } %>
22
+ <% end %>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ <% end %>
27
+ </div>
@@ -0,0 +1,5 @@
1
+ class AddCssClassesToSmithyPageContents < ActiveRecord::Migration
2
+ def change
3
+ add_column :smithy_page_contents, :css_classes, :string
4
+ end
5
+ end
@@ -6,6 +6,7 @@ require 'smithy/logger'
6
6
  require 'smithy/liquid'
7
7
  # content formatting
8
8
  require 'smithy/asset_link'
9
+ require 'smithy/page_content_wrapper'
9
10
  require 'smithy/formatter'
10
11
  #
11
12
  require 'smithy/content_blocks'
@@ -3,7 +3,7 @@ module Smithy
3
3
  module Model
4
4
  extend ActiveSupport::Concern
5
5
  included do
6
- has_many :page_contents, :as => :content_block, class_name: '::Smithy::PageContent', dependent: :destroy
6
+ has_many :page_contents, as: :content_block, class_name: '::Smithy::PageContent', dependent: :destroy
7
7
  has_many :pages, through: :page_contents, class_name: '::Smithy::Page'
8
8
  Smithy::ContentBlocks::Registry.register self
9
9
  amoeba do
@@ -20,8 +20,7 @@ module Smithy
20
20
  return unless ActiveRecord::Base.connection.table_exists?(content_block.table_name)
21
21
  content_block_name = content_block.to_s.demodulize
22
22
  @@content_blocks << content_block_name unless @@content_blocks.include?(content_block_name)
23
- cb = Smithy::ContentBlock.find_or_initialize_by(name: content_block_name)
24
- cb.save
23
+ Smithy::ContentBlock.find_or_create_by(name: content_block_name)
25
24
  @@content_blocks
26
25
  end
27
26
  end
@@ -15,5 +15,6 @@ require 'liquid'
15
15
  require 'refile/rails'
16
16
  require 'refile/mini_magick'
17
17
  require 'remotipart'
18
+ require 'responders'
18
19
  require 'sass-rails'
19
20
  require 'slodown'
@@ -26,7 +26,8 @@ module Smithy
26
26
  end
27
27
 
28
28
  initializer :assets do |config|
29
- Rails.application.config.assets.precompile += %w( ZeroClipboard.swf smithy/logo-sm.png )
29
+ icons = %w(_blank _page doc pdf ppt txt xls xlsx)
30
+ Rails.application.config.assets.precompile += %w( ZeroClipboard.swf smithy/logo-sm.png) + icons.map{|icon| "smithy/icons/#{icon}.png" }
30
31
  end
31
32
 
32
33
  config.after_initialize do
@@ -40,8 +41,8 @@ module Smithy
40
41
  # we need to require all our model files so that ContentBlocks
41
42
  # are registered with the engine
42
43
  Dir[Smithy::Engine.root.join('app', 'models', 'smithy', '*.rb')].each do |file|
43
- table_name = File.basename(file, '.rb').pluralize
44
- require_dependency file if ActiveRecord::Base.connection.table_exists?(table_name)
44
+ table_name = "smithy_#{File.basename(file, '.rb').pluralize}"
45
+ require file if ActiveRecord::Base.connection.table_exists?(table_name)
45
46
  end
46
47
  end
47
48
 
@@ -47,14 +47,18 @@ module Smithy
47
47
  def render(context)
48
48
  controller = context.registers[:controller]
49
49
  javascript = Smithy::Template.javascripts.find_by(name: tag_without_ext('js'))
50
- controller.view_context.send(:javascript_include_tag, "/templates/javascripts/#{tag_with_ext('js')}?#{javascript.updated_at.to_s(:number) if javascript.present?}")
50
+ path = "/templates/javascripts/#{tag_with_ext('js')}"
51
+ path += "?#{javascript.updated_at.to_s(:number)}" if javascript.present?
52
+ controller.view_context.send(:javascript_include_tag, path)
51
53
  end
52
54
  end
53
55
  class SmithyStylesheetLinkTag < Base
54
56
  def render(context)
55
57
  controller = context.registers[:controller]
56
58
  stylesheet = Smithy::Template.stylesheets.find_by(name: tag_without_ext('css'))
57
- controller.view_context.send(:stylesheet_link_tag, "/templates/stylesheets/#{tag_with_ext('css')}?#{stylesheet.updated_at.to_s(:number) if stylesheet.present?}")
59
+ path = "/templates/stylesheets/#{tag_with_ext('css')}"
60
+ path += "?#{stylesheet.updated_at.to_s(:number)}" if stylesheet.present?
61
+ controller.view_context.send(:stylesheet_link_tag, path)
58
62
  end
59
63
  end
60
64
  end