slices 1.0.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.
Files changed (215) hide show
  1. data/CHANGELOG.md +3 -0
  2. data/README.md +51 -0
  3. data/Rakefile +9 -0
  4. data/app/assets/images/slices/ajax-loader.gif +0 -0
  5. data/app/assets/images/slices/asset-background.png +0 -0
  6. data/app/assets/images/slices/asset-spinner.gif +0 -0
  7. data/app/assets/images/slices/bg_header.gif +0 -0
  8. data/app/assets/images/slices/black-Linen.png +0 -0
  9. data/app/assets/images/slices/calendar.svg +68 -0
  10. data/app/assets/images/slices/chosen-sprite.png +0 -0
  11. data/app/assets/images/slices/drag-handle.svg +9 -0
  12. data/app/assets/images/slices/icon_admins.png +0 -0
  13. data/app/assets/images/slices/icon_app.png +0 -0
  14. data/app/assets/images/slices/icon_assets.png +0 -0
  15. data/app/assets/images/slices/icon_collapse.png +0 -0
  16. data/app/assets/images/slices/icon_drag.png +0 -0
  17. data/app/assets/images/slices/icon_files.png +0 -0
  18. data/app/assets/images/slices/icon_generic_file.png +0 -0
  19. data/app/assets/images/slices/icon_images.png +0 -0
  20. data/app/assets/images/slices/icon_padlock.png +0 -0
  21. data/app/assets/images/slices/icon_page.png +0 -0
  22. data/app/assets/images/slices/icon_search.png +0 -0
  23. data/app/assets/images/slices/icon_set-link.png +0 -0
  24. data/app/assets/images/slices/icon_set.png +0 -0
  25. data/app/assets/images/slices/icon_sitemap.png +0 -0
  26. data/app/assets/images/slices/icon_snippets.png +0 -0
  27. data/app/assets/images/slices/icon_template.jpg +0 -0
  28. data/app/assets/images/slices/icon_upload_happy.png +0 -0
  29. data/app/assets/images/slices/icon_upload_sad.png +0 -0
  30. data/app/assets/images/slices/icon_upload_thinking.png +0 -0
  31. data/app/assets/images/slices/noise.png +0 -0
  32. data/app/assets/images/slices/sitemap_icon_ghost.png +0 -0
  33. data/app/assets/images/slices/sitemap_icon_home.png +0 -0
  34. data/app/assets/images/slices/sitemap_icon_page.png +0 -0
  35. data/app/assets/images/slices/sitemap_icon_set_page.png +0 -0
  36. data/app/assets/images/slices/sitemap_icon_virtual_page.png +0 -0
  37. data/app/assets/images/slices/sitemap_overlay.png +0 -0
  38. data/app/assets/images/slices/spinner.gif +0 -0
  39. data/app/assets/images/slices/trash.png +0 -0
  40. data/app/assets/javascripts/admin.js.erb +18 -0
  41. data/app/assets/javascripts/slices/app/backbones/admins.js +114 -0
  42. data/app/assets/javascripts/slices/app/backbones/entries.js +172 -0
  43. data/app/assets/javascripts/slices/app/backbones/generic.js +101 -0
  44. data/app/assets/javascripts/slices/app/backbones/snippets.js +113 -0
  45. data/app/assets/javascripts/slices/app/helpers/assets.js +61 -0
  46. data/app/assets/javascripts/slices/app/helpers/breadcrumbs.js +30 -0
  47. data/app/assets/javascripts/slices/app/helpers/composer.js +26 -0
  48. data/app/assets/javascripts/slices/app/helpers/date_field.js +16 -0
  49. data/app/assets/javascripts/slices/app/helpers/get_value.js +31 -0
  50. data/app/assets/javascripts/slices/app/helpers/icon_upload_names.js.erb +5 -0
  51. data/app/assets/javascripts/slices/app/helpers/layout.js +20 -0
  52. data/app/assets/javascripts/slices/app/helpers/sitemap.js +150 -0
  53. data/app/assets/javascripts/slices/app/helpers/slice_preview.js +48 -0
  54. data/app/assets/javascripts/slices/app/helpers/tagging.js +73 -0
  55. data/app/assets/javascripts/slices/app/helpers/token_field.js +17 -0
  56. data/app/assets/javascripts/slices/app/helpers/upload_icons.js.erb +5 -0
  57. data/app/assets/javascripts/slices/app/helpers/uploader.js +127 -0
  58. data/app/assets/javascripts/slices/app/models/asset.js +29 -0
  59. data/app/assets/javascripts/slices/app/models/asset_collection.js +41 -0
  60. data/app/assets/javascripts/slices/app/models/attachment.js +29 -0
  61. data/app/assets/javascripts/slices/app/models/attachment_collection.js +7 -0
  62. data/app/assets/javascripts/slices/app/models/composer_item.js +1 -0
  63. data/app/assets/javascripts/slices/app/models/composer_item_collection.js +3 -0
  64. data/app/assets/javascripts/slices/app/models/file.js +103 -0
  65. data/app/assets/javascripts/slices/app/models/page.js +186 -0
  66. data/app/assets/javascripts/slices/app/models/s3_file.js +64 -0
  67. data/app/assets/javascripts/slices/app/slices.js +661 -0
  68. data/app/assets/javascripts/slices/app/views/asset_editor_view.js.erb +209 -0
  69. data/app/assets/javascripts/slices/app/views/asset_library_view.js +720 -0
  70. data/app/assets/javascripts/slices/app/views/asset_thumb_view.js.erb +191 -0
  71. data/app/assets/javascripts/slices/app/views/attachment_composer_view.js +350 -0
  72. data/app/assets/javascripts/slices/app/views/attachment_view.js +101 -0
  73. data/app/assets/javascripts/slices/app/views/calendar_view.js +198 -0
  74. data/app/assets/javascripts/slices/app/views/composer_item_view.js +54 -0
  75. data/app/assets/javascripts/slices/app/views/composer_view.js +130 -0
  76. data/app/assets/javascripts/slices/app/views/date_field_view.js +177 -0
  77. data/app/assets/javascripts/slices/app/views/file_view.js +142 -0
  78. data/app/assets/javascripts/slices/app/views/token_field_view.js +253 -0
  79. data/app/assets/javascripts/slices/lib/freeze.js +14 -0
  80. data/app/assets/javascripts/slices/lib/human_file_size.js +16 -0
  81. data/app/assets/javascripts/slices/lib/json_patch.js +9 -0
  82. data/app/assets/javascripts/slices/lib/moment.js +47 -0
  83. data/app/assets/javascripts/slices/lib/plugins.js +101 -0
  84. data/app/assets/javascripts/slices/lib/sortable.js +14 -0
  85. data/app/assets/javascripts/slices/slices.js +27 -0
  86. data/app/assets/javascripts/slices/vendor/autoscroll.js +188 -0
  87. data/app/assets/javascripts/slices/vendor/backbone.js +38 -0
  88. data/app/assets/javascripts/slices/vendor/handlebars.js +1920 -0
  89. data/app/assets/javascripts/slices/vendor/jqmodal.js +69 -0
  90. data/app/assets/javascripts/slices/vendor/jquery-ui.js +274 -0
  91. data/app/assets/javascripts/slices/vendor/jquery-ui_nested-sortable.js +357 -0
  92. data/app/assets/javascripts/slices/vendor/jquery.ajaxprogress.js +76 -0
  93. data/app/assets/javascripts/slices/vendor/jquery.js +2 -0
  94. data/app/assets/javascripts/slices/vendor/livefield.js +459 -0
  95. data/app/assets/javascripts/slices/vendor/moment.js +6 -0
  96. data/app/assets/javascripts/slices/vendor/rails.js +315 -0
  97. data/app/assets/javascripts/slices/vendor/underscore-string.js +1 -0
  98. data/app/assets/javascripts/slices/vendor/underscore.js +5 -0
  99. data/app/assets/stylesheets/admin.css +1 -0
  100. data/app/assets/stylesheets/slices/admin.css.erb +2237 -0
  101. data/app/assets/stylesheets/slices/reset_html5.css +106 -0
  102. data/app/assets/stylesheets/slices/slices.css +7 -0
  103. data/app/controllers/admin/admin_controller.rb +10 -0
  104. data/app/controllers/admin/admins_controller.rb +76 -0
  105. data/app/controllers/admin/assets_controller.rb +53 -0
  106. data/app/controllers/admin/auth/omniauth_callbacks_controller.rb +15 -0
  107. data/app/controllers/admin/auth/passwords_controller.rb +4 -0
  108. data/app/controllers/admin/auth/sessions_controller.rb +4 -0
  109. data/app/controllers/admin/entries_controller.rb +88 -0
  110. data/app/controllers/admin/page_search_controller.rb +12 -0
  111. data/app/controllers/admin/pages_controller.rb +103 -0
  112. data/app/controllers/admin/site_maps_controller.rb +15 -0
  113. data/app/controllers/admin/snippets_controller.rb +33 -0
  114. data/app/controllers/application_controller.rb +4 -0
  115. data/app/controllers/pages_controller.rb +45 -0
  116. data/app/controllers/slices_controller.rb +63 -0
  117. data/app/controllers/static_assets_controller.rb +52 -0
  118. data/app/helpers/admin/admin_helper.rb +63 -0
  119. data/app/helpers/admin/assets_helper.rb +36 -0
  120. data/app/helpers/admin/entries_helper.rb +13 -0
  121. data/app/helpers/admin/site_maps_helper.rb +104 -0
  122. data/app/helpers/assets_helper.rb +64 -0
  123. data/app/helpers/navigation_helper.rb +195 -0
  124. data/app/helpers/pages_helper.rb +119 -0
  125. data/app/models/admin.rb +34 -0
  126. data/app/models/asset.rb +211 -0
  127. data/app/models/attachment.rb +11 -0
  128. data/app/models/layout.rb +44 -0
  129. data/app/models/page.rb +214 -0
  130. data/app/models/placeholder_slice.rb +8 -0
  131. data/app/models/set_page.rb +12 -0
  132. data/app/models/set_slice.rb +57 -0
  133. data/app/models/site_map.rb +24 -0
  134. data/app/models/slice.rb +80 -0
  135. data/app/models/snippet.rb +21 -0
  136. data/app/observers/asset_observer.rb +6 -0
  137. data/app/observers/page_observer.rb +37 -0
  138. data/app/presenters/entry_presenter.rb +17 -0
  139. data/app/presenters/page_presenter.rb +67 -0
  140. data/app/presenters/presenter.rb +9 -0
  141. data/app/presenters/set_page_presenter.rb +2 -0
  142. data/app/views/admin/admins/index.html.erb +26 -0
  143. data/app/views/admin/admins/show.html.erb +27 -0
  144. data/app/views/admin/assets/index.html.erb +1 -0
  145. data/app/views/admin/auth/passwords/edit.html.erb +20 -0
  146. data/app/views/admin/auth/passwords/new.html.erb +14 -0
  147. data/app/views/admin/auth/sessions/_form.html.erb +35 -0
  148. data/app/views/admin/auth/sessions/new.html.erb +14 -0
  149. data/app/views/admin/entries/index.html.erb +32 -0
  150. data/app/views/admin/pages/_breadcrumbs.html.erb +32 -0
  151. data/app/views/admin/pages/_slices.html.erb +27 -0
  152. data/app/views/admin/pages/new.html.erb +14 -0
  153. data/app/views/admin/pages/show.html.erb +50 -0
  154. data/app/views/admin/shared/_asset_storage.html.erb +17 -0
  155. data/app/views/admin/shared/_custom_links.html.erb +1 -0
  156. data/app/views/admin/shared/_custom_navigation.html.erb +1 -0
  157. data/app/views/admin/shared/_navigation.html.erb +5 -0
  158. data/app/views/admin/site_maps/_page_li.html.erb +20 -0
  159. data/app/views/admin/site_maps/_set_page_li.html.erb +23 -0
  160. data/app/views/admin/site_maps/index.html.erb +29 -0
  161. data/app/views/admin/snippets/form.html.erb +12 -0
  162. data/app/views/admin/snippets/index.html.erb +20 -0
  163. data/app/views/admin/snippets/update.html.erb +0 -0
  164. data/app/views/layouts/admin.html.erb +72 -0
  165. data/lib/ext/file_store_cache.rb +18 -0
  166. data/lib/generators/humans/USAGE +8 -0
  167. data/lib/generators/humans/humans_generator.rb +10 -0
  168. data/lib/generators/humans/templates/humans.txt +6 -0
  169. data/lib/generators/slice/USAGE +28 -0
  170. data/lib/generators/slice/slice_generator.rb +123 -0
  171. data/lib/generators/slice/templates/main_fields.hbs +11 -0
  172. data/lib/generators/slice/templates/meta_fields.hbs +11 -0
  173. data/lib/generators/slice/templates/page.rb +19 -0
  174. data/lib/generators/slice/templates/presenter.rb +53 -0
  175. data/lib/generators/slice/templates/set.html.erb +8 -0
  176. data/lib/generators/slice/templates/set_slice.rb +14 -0
  177. data/lib/generators/slice/templates/set_slice_fields.hbs +5 -0
  178. data/lib/generators/slice/templates/show.html.erb +48 -0
  179. data/lib/generators/slice/templates/show_slice.rb +20 -0
  180. data/lib/generators/slice/templates/slice.rb +58 -0
  181. data/lib/generators/slice/templates/slice_fields.hbs +74 -0
  182. data/lib/generators/templates/slices.rb +211 -0
  183. data/lib/mongo_search.rb +84 -0
  184. data/lib/paperclip_validator.rb +5 -0
  185. data/lib/rack_utf8_fix.rb +10 -0
  186. data/lib/sRGB.icc +0 -0
  187. data/lib/set_link_renderer.rb +31 -0
  188. data/lib/slices.rb +68 -0
  189. data/lib/slices/asset/maker.rb +55 -0
  190. data/lib/slices/asset/rename.rb +67 -0
  191. data/lib/slices/available_slices.rb +43 -0
  192. data/lib/slices/cms_form_builder.rb +42 -0
  193. data/lib/slices/config.rb +93 -0
  194. data/lib/slices/container_parser.rb +70 -0
  195. data/lib/slices/generator_macros.rb +36 -0
  196. data/lib/slices/has_attachments.rb +111 -0
  197. data/lib/slices/has_slices.rb +88 -0
  198. data/lib/slices/i18n.rb +6 -0
  199. data/lib/slices/i18n/backend.rb +32 -0
  200. data/lib/slices/i18n_backend.rb +24 -0
  201. data/lib/slices/paperclip.rb +13 -0
  202. data/lib/slices/position_helper.rb +98 -0
  203. data/lib/slices/renderer.rb +52 -0
  204. data/lib/slices/slices_engine.rb +51 -0
  205. data/lib/slices/split_date_time_field.rb +14 -0
  206. data/lib/slices/tasks/assets.rake +35 -0
  207. data/lib/slices/tasks/db.rake +50 -0
  208. data/lib/slices/tasks/seeds.rake +93 -0
  209. data/lib/slices/tasks/validate.rake +62 -0
  210. data/lib/slices/tree.rb +306 -0
  211. data/lib/slices/version.rb +4 -0
  212. data/lib/slices/will_paginate.rb +12 -0
  213. data/lib/slices/will_paginate_mongoid.rb +45 -0
  214. data/lib/standard_tree.rb +193 -0
  215. metadata +483 -0
@@ -0,0 +1,19 @@
1
+ class <%= page_name.classify %> < Page
2
+ <%= field_definitions %>
3
+
4
+ def entry?
5
+ true
6
+ end
7
+
8
+ def template
9
+ "<%= file_name %>/views/show"
10
+ end
11
+
12
+ # Uncomment the as_json method if the page defines fields that are
13
+ # shown in the admin UI. Pass a hash to merge() that contains each
14
+ # field.
15
+ #
16
+ # def as_json(options = {})
17
+ # super.merge(published: published.to_s)
18
+ # end
19
+ end
@@ -0,0 +1,53 @@
1
+ class <%= page_name.classify %>Presenter < PagePresenter
2
+ include EntryPresenter
3
+
4
+ # We need to tell the admin UI which fields to show when presenting a
5
+ # table of entries in the admin UI. Each key in the column hash should
6
+ # be a symbol matching the name of one of the fields defined on the
7
+ # page.
8
+ #
9
+ # The hash's values (e.g. 'Date Published') will be used for the
10
+ # column headings in the admin UI.
11
+
12
+ @columns = {
13
+ name: 'Name',
14
+ # published_at: 'Date Published'
15
+ }
16
+ class << self
17
+ attr_reader :columns
18
+ end
19
+
20
+ <%- if options.with_entry_templates? -%>
21
+ def main_extra_template
22
+ '<%= file_name %>/<%= page_name %>_main'
23
+ end
24
+
25
+ def meta_extra_template
26
+ '<%= file_name %>/<%= page_name %>_meta'
27
+ end
28
+ <%- else -%>
29
+ # If you want to display extra information while editing or creating a
30
+ # page (i.e. in the admin UI's side bar) you'll need to define some
31
+ # .hbs files, and then tell the CMS to use them by uncommenting these
32
+ # methods.
33
+
34
+ # def main_extra_template
35
+ # '<%= file_name %>/<%= page_name %>_main'
36
+ # end
37
+
38
+ # def meta_extra_template
39
+ # '<%= file_name %>/<%= page_name %>_meta'
40
+ # end
41
+ <%- end -%>
42
+
43
+ # The CMS needs to know how to present the data stored on a page;
44
+ # it's not always good enough just to convert it to a string and
45
+ # render it into the page. You can access the page through the @source
46
+ # variable.
47
+
48
+ def name
49
+ @source.name.blank? ? "(name isn't set)" : @source.name
50
+ end
51
+
52
+ end
53
+
@@ -0,0 +1,8 @@
1
+ <%%= will_paginate slice.page_entries, renderer: SetLinkRenderer, class: 'pagination above' %>
2
+ <ul class="entries">
3
+ <%% slice.page_entries.each do |entry| -%>
4
+ <li><%%= link_to entry.name, entry.path %></li>
5
+ <%% end -%>
6
+ </ul>
7
+ <%%= will_paginate slice.page_entries, renderer: SetLinkRenderer, class: 'pagination below' %>
8
+
@@ -0,0 +1,14 @@
1
+ class <%= class_name %>Slice < SetSlice
2
+ restricted_slice
3
+
4
+ <%- if options.with_identical_entries? -%>
5
+ def addable_entries?
6
+ false
7
+ end
8
+
9
+ def editable_entries?
10
+ false
11
+ end
12
+ <%- end -%>
13
+ end
14
+
@@ -0,0 +1,5 @@
1
+ <li>
2
+ <label for="slices-{{id}}-per_page">Per page</label>
3
+ <input type="text" id="slices-{{id}}-per_page" value="{{per_page}}">
4
+ </li>
5
+
@@ -0,0 +1,48 @@
1
+ <div class="slice <%= file_name %>">
2
+ <% if form_slice? -%>
3
+ <%%= form_for slice, url: slice.page.path do |f| %>
4
+ <% end -%>
5
+
6
+ <!--
7
+ Stick the HTML that should be rendered when your slice is displayed here.
8
+
9
+ You can refer to data stored on your slice by calling slice.foo inside
10
+ a normal ERB code block.
11
+
12
+ <%- if form_slice? -%>
13
+ For more information on available form helpers, see:
14
+ http://guides.rubyonrails.org/form_helpers.html
15
+ <%- end -%>
16
+ -->
17
+
18
+ <% attributes.each do |attribute| -%>
19
+ <% case attribute.type
20
+ when :attachments -%>
21
+ <ul class="<%= attribute.name %>">
22
+ <%%- slice.<%= attribute.name %>.each do |<%= attribute.name.singularize %>| -%>
23
+ <li>
24
+ <%%= image_if_present <%= attribute.name.singularize %>.asset, :original %>
25
+ <div class="caption"><%%= markdown <%= attribute.name.singularize %>.caption %></div>
26
+ </li>
27
+ <%%- end -%>
28
+ </ul>
29
+ <% when :date_time, :datetime, :date -%>
30
+ <div class="<%= attribute.name %>"><%%=l slice.<%= attribute.name %> %></div>
31
+ <% when :string, :text -%>
32
+ <div class="<%= attribute.name %>"><%%= markdown slice.<%= attribute.name %> %></div>
33
+ <% when :boolean -%>
34
+ <%%- if slice.<%= attribute.name %>? -%>
35
+ <div class="<%= attribute.name %>"><%= attribute.name.humanize %>!</div>
36
+ <%%- end -%>
37
+ <% else -%>
38
+ <div class="<%= attribute.name %>"><%%= slice.<%= attribute.name %> %></div>
39
+ <% end -%>
40
+
41
+ <% end -%>
42
+ <p>Change me by editing app/slices/<%= file_name %>/views/show.html.erb</p>
43
+
44
+ <% if form_slice? -%>
45
+ <%% end %>
46
+ <% end -%>
47
+ </div>
48
+
@@ -0,0 +1,20 @@
1
+ class <%= page_name.classify %>ShowSlice < Slice
2
+ restricted_slice
3
+
4
+ # A "show slice" is handy if every page in a set will have the same
5
+ # fields defined up on them, and no slices will be involved in the
6
+ # display of the page. Append it to the set page's entry_content.slices.
7
+ #
8
+ # Here's an example of how to give the slice the ability to access the
9
+ # copy field on the <%= page_name %>'s content document:
10
+ #
11
+ # attr_reader :copy
12
+ #
13
+ # def prepare(params)
14
+ # @copy = page.content[:copy]
15
+ # end
16
+ #
17
+ # Don't forget to add each field to the as_json method in <%= page_name %>.rb
18
+ # if you want to be able to edit the fields in the admin UI.
19
+ end
20
+
@@ -0,0 +1,58 @@
1
+ class <%= class_name %>Slice < Slice
2
+ <%= field_definitions %>
3
+
4
+ # For each field that you want to store on the slice, declare the
5
+ # field as follow:
6
+ # field :title
7
+ # field :body
8
+ #
9
+ # You can also specify more complex fields like this:
10
+ # field :potatoes, type: Array, default: []
11
+ #
12
+ # For date/time fields use the following convention:
13
+ # field :published_on, type: Date
14
+ # field :published_at, type: DateTime
15
+ #
16
+ # For more details of available fields, see the Mongoid
17
+ # documentation: http://mongoid.org/docs/documents/fields.html
18
+ #
19
+ # You can also attach assets to a slice, like this:
20
+ # has_attachments
21
+ #
22
+ # You can name your attachments like this:
23
+ # has_attachments :images
24
+ #
25
+ # You can map your attachments to a custom class like this:
26
+ # class Image < Attachment
27
+ # field :caption
28
+ # end
29
+ # has_attachments :images, class_name: "MySlice::Image"
30
+
31
+ <%- if form_slice? -%>
32
+ # The handle_post method will get passed the params from the POST
33
+ # request, and should return true or false, depending on whether or
34
+ # not processing was successful.
35
+ #
36
+ # def handle_post(params)
37
+ # end
38
+ #
39
+ #
40
+ # Form slices get a chance to set a flash message after they have
41
+ # successfully handled a post. Set 'name' in the flash key to
42
+ # something specific to this slice.
43
+ #
44
+ # def set_success_message(flash)
45
+ # flash['slices.name.notice'] = 'Nicely done'
46
+ # end
47
+ #
48
+ #
49
+ # After a successful POST request the CMS will redirect the user to a
50
+ # URL (this prevents them from being able to re-submit the form by
51
+ # reloading the page). This is the URL they end up at.
52
+ #
53
+ # def redirect_url
54
+ # '/path/to/a/page'
55
+ # end
56
+ <%- end -%>
57
+ end
58
+
@@ -0,0 +1,74 @@
1
+ <% attributes.each do |attribute| -%>
2
+ <li>
3
+ <% case attribute.type
4
+ when :attachments -%>
5
+ <%= label_if_needed_for attribute %>
6
+ {{#attachmentComposer field="<%= attribute.name %>"}}
7
+ <textarea name="caption" placeholder="Caption…" class="full-height">{{caption}}</textarea>
8
+ {{/attachmentComposer}}
9
+ <% when :date %>
10
+ <%= label_if_needed_for attribute %>
11
+ {{dateField field="<%= attribute.name %>"}}
12
+ <% when :date_time, :datetime -%>
13
+ <%= label_if_needed_for attribute %>
14
+ {{dateField field="<%= attribute.name %>"}}
15
+ <% when :boolean -%>
16
+ <label>
17
+ <input type="checkbox" id="slices-{{id}}-<%= attribute.name %>" data-value="{{<%= attribute.name %>}}">
18
+ <%= attribute.name.humanize %>
19
+ </label>
20
+ <% when :text %>
21
+ <%= label_if_needed_for attribute %>
22
+ <textarea id="slices-{{id}}-<%= attribute.name %>" placeholder="<%= attribute.name.humanize %>…" rows="24">{{<%= attribute.name %>}}</textarea>
23
+ <% else -%>
24
+ <%= label_if_needed_for attribute %>
25
+ <input type="text" id="slices-{{id}}-<%= attribute.name %>" placeholder="<%= attribute.name.humanize %>…" value="{{<%= attribute.name %>}}">
26
+ <% end -%>
27
+ </li>
28
+ <% end -%>
29
+
30
+ <!--
31
+ To change the text that is displayed when this slice is minimised,
32
+ use the `slicePreview` helper below. The method is scoped to this slice
33
+ so you can easily access any contained elements.
34
+
35
+ Examples:
36
+
37
+ return this.find('textarea').val();
38
+ return this.find('option:selected').text();
39
+
40
+ -->
41
+ {{#slicePreview}}
42
+ {{/slicePreview}}
43
+
44
+ <!--
45
+ To use radio buttons, follow this formula...
46
+
47
+ Let's say we've a field on the slice called 'color', this is how we'd
48
+ structure the radio buttons:
49
+
50
+ <ul id="slices-{{id}}-color" data-value="{{color}}">
51
+ <li>
52
+ <input type="radio" value="red"
53
+ id="option-{{id}}-red" name="slices-{{id}}-color">
54
+ <label for="option-{{id}}-red">Red</label>
55
+ </li>
56
+ <li>
57
+ <input type="radio" value="green"
58
+ id="option-{{id}}-green" name="slices-{{id}}-color">
59
+ <label for="option-{{id}}-green">Green</label>
60
+ </li>
61
+ <li>
62
+ <input type="radio" value="blue"
63
+ id="option-{{id}}-blue" name="slices-{{id}}-color">
64
+ <label for="option-{{id}}-blue">Blue</label>
65
+ </li>
66
+ </ul>
67
+
68
+ The important points to note:
69
+
70
+ * The field id `slices-{{id}}-color` goes on the common parent.
71
+ * The value `data-value="{{color}}"` also goes on the common parent.
72
+ * The name attribute of the radio buttons is the field id (see above).
73
+ * To relate labels to inputs, use `option-{{id}}-value` in `for` and `id`.
74
+ -->
@@ -0,0 +1,211 @@
1
+ require File.dirname(__FILE__) + '/../../slices/version'
2
+
3
+ # Remove files
4
+ remove_file "README.rdoc"
5
+ remove_file "public/index.html"
6
+ remove_file "public/404.html"
7
+ remove_file "public/422.html"
8
+ remove_file "public/500.html"
9
+ remove_file "public/favicon.ico"
10
+ remove_dir "doc"
11
+
12
+ create_file "public/favicon.ico"
13
+
14
+ file "README.md", <<-END
15
+ # #{app_const_base}
16
+
17
+ Built with [Slices](http://slices.withassociates.com).
18
+
19
+ Need help? See the [Slices wiki](https://github.com/withassociates/slices/wiki).
20
+ END
21
+
22
+ # Set up .gitignore files
23
+ remove_file ".gitignore"
24
+ file ".gitignore", <<-END
25
+ .DS_Store
26
+ *.swp
27
+ .bundle
28
+ .sass-cache
29
+ coverage
30
+ db/*.sqlite3
31
+ db/*development*
32
+ db/*production*
33
+ db/*test*
34
+ db/mongod.lock
35
+ log/*.log
36
+ public/assets
37
+ public/cache
38
+ public/system
39
+ tmp
40
+ END
41
+
42
+ # mongoid.yml
43
+ file "config/mongoid.yml", <<-END
44
+ development:
45
+ host: localhost
46
+ database: #{app_name}_development
47
+
48
+ test:
49
+ host: localhost
50
+ database: #{app_name}_test
51
+
52
+ production:
53
+ host: localhost
54
+ database: #{app_name}_development
55
+ END
56
+
57
+ initializer "slices.rb", <<-END
58
+ # Slices::Config.add_asset_styles(
59
+ # slice_full_width: '945x496>',
60
+ # avatar: '30x30#',
61
+ # )
62
+
63
+ # Configure the Google Apps domain to use for quick auth.
64
+ # Press the '=' key on the admin sign-in screen to authenticate via
65
+ # a Google Apps account within the domain configured here.
66
+ # Slices::Config.google_apps_domain = 'example.com'
67
+
68
+ ActionView::Base.send(:include, AssetsHelper)
69
+
70
+ END
71
+
72
+ # Gemfile
73
+ run "rm Gemfile"
74
+ file "Gemfile", <<-END
75
+ source 'https://rubygems.org'
76
+
77
+ gem 'slices',
78
+ git: 'git@github.com:withassociates/slices.git',
79
+ tag: 'v#{Slices::VERSION}'
80
+
81
+ group :assets do
82
+ gem 'sass-rails'
83
+ gem 'therubyracer'
84
+ gem 'uglifier'
85
+ end
86
+
87
+ group :development do
88
+ gem 'capistrano', require: false
89
+ gem 'foreman', require: false
90
+ gem 'unicorn', require: false
91
+ end
92
+
93
+ group :test do
94
+ gem 'capybara'
95
+ gem 'database_cleaner'
96
+ gem 'launchy'
97
+ gem 'rspec-rails'
98
+ end
99
+
100
+ END
101
+
102
+ # Generate example slices
103
+ generate("slice text text:text")
104
+ generate("slice images images:attachments")
105
+
106
+ # Default layout
107
+ remove_file "app/views/layouts/application.html.erb"
108
+
109
+ file "app/views/layouts/default.html.erb", <<-END
110
+ <!doctype html>
111
+ <html>
112
+ <head>
113
+ <%= render "shared/head" %>
114
+ </head>
115
+ <body class="layout-default">
116
+ <section id="main" role="main">
117
+ <%= container "content" %>
118
+ </section>
119
+ </body>
120
+ </html>
121
+ END
122
+
123
+ file "app/views/shared/_head.html.erb", <<-END
124
+ <meta charset="utf-8">
125
+ <%= csrf_meta_tags %>
126
+
127
+ <title>#{app_const_base}</title>
128
+
129
+ <!-- <meta name="description" content=""> -->
130
+
131
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
132
+
133
+ <%= stylesheet_link_tag *%w[
134
+ application
135
+ ] %>
136
+
137
+ <%= javascript_include_tag *%w[
138
+ //cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js
139
+ application
140
+ ] %>
141
+
142
+ <!--[if lt IE 9]>
143
+ <%= javascript_include_tag *%w[
144
+ //cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.2/html5shiv.min.js
145
+ ] %>
146
+ <![endif]-->
147
+
148
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
149
+ END
150
+
151
+ # Assets directory structure
152
+ remove_file "app/assets/images/rails.png"
153
+ create_file "app/assets/images/.gitkeep"
154
+
155
+ # Rspec
156
+ generate("rspec:install")
157
+
158
+ file ".rspec", <<-END, force: true
159
+ --colour
160
+ --format=documentation
161
+ END
162
+
163
+ file "spec/spec_helper.rb", <<-END, force: true
164
+ ENV['RAILS_ENV'] ||= 'test'
165
+
166
+ require File.expand_path '../../config/environment', __FILE__
167
+ require 'rspec/rails'
168
+ require 'rspec/autorun'
169
+
170
+ Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
171
+
172
+ RSpec.configure do |config|
173
+ config.order = 'random'
174
+
175
+ config.before :suite do
176
+ DatabaseCleaner.orm = 'mongoid'
177
+ DatabaseCleaner.strategy = :truncation
178
+ end
179
+
180
+ config.before do
181
+ DatabaseCleaner.start
182
+ end
183
+
184
+ config.after do
185
+ DatabaseCleaner.clean
186
+ end
187
+ end
188
+ END
189
+
190
+ # Admin nav partials
191
+ file "app/views/admin/shared/_custom_navigation.html.erb", <<-END
192
+ <%# Place custom navbar controls here i.e. %>
193
+ <%#= admin_nav_link 'Example', example_path %>
194
+ END
195
+
196
+ file "app/views/admin/shared/_custom_links.html.erb", <<-END
197
+ <%# Place custom navbar links here i.e. %>
198
+ <%#= content_tag :li, link_to('Example', example_path) %>
199
+ END
200
+
201
+ # Procfile
202
+ file "Procfile", "web: bundle exec unicorn -p $PORT"
203
+ git add: "--all"
204
+ git commit: "-m 'Add Procfile'"
205
+
206
+ # Seed the database
207
+ rake "slices:seed"
208
+
209
+ say "All done!", :green
210
+ say "Remember to run `bundle install` when you first cd into the project", :green
211
+