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,17 @@
1
+ <script>
2
+ <% if Slices::Config.s3_storage? %>
3
+ slices.S3_UPLOADER_DEFAULTS = {
4
+ AWSAccessKeyId : '<%= Slices::Config.s3_credentials[:access_key_id] %>',
5
+ acl : 'public-read',
6
+ policy : '<%= policy %>',
7
+ signature : '<%= signature %>',
8
+ success_action_status : '201',
9
+ };
10
+
11
+ slices.S3_URL = 'https://<%= Slices::Config.s3_credentials[:bucket] %>.s3.amazonaws.com/';
12
+ slices.S3_TEMPFILE_KEY_PREFIX = '<%= Slices::Config::S3_TEMPFILE_KEY_PREFIX %>';
13
+ slices.fileClass = slices.S3File;
14
+ <% else %>
15
+ slices.fileClass = slices.File;
16
+ <% end %>
17
+ </script>
@@ -0,0 +1 @@
1
+ <li><%= link_to 'Suggestion Box', 'https://github.com/withassociates/slices/issues' %></li>
@@ -0,0 +1 @@
1
+ <%= admin_nav_link 'Source', 'https://github.com/withassociates/slices' %>
@@ -0,0 +1,5 @@
1
+ <%= admin_nav_link("Sitemap", admin_site_maps_path) %>
2
+ <%= admin_nav_link("Assets", admin_assets_path) %>
3
+ <%= admin_nav_link("Snippets", admin_snippets_path) if Slices::Config.snippets? %>
4
+ <%= admin_nav_link("Administrators", admin_admins_path) %>
5
+ <%= render_custom_navigation %>
@@ -0,0 +1,20 @@
1
+ <li class="page <%= "home" if page.home? %>" rel="<%= page.id %>">
2
+ <div>
3
+ <h2><%= link_to(page.name, admin_page_path(page)) %></h2>
4
+
5
+ <% unless page.virtual? %>
6
+ <span class="item-actions primary">
7
+ <%= link_to_add_child page %>
8
+ <%= link_to_view_page page %>
9
+ </span>
10
+
11
+ <%= link_to_delete page unless page.home? %>
12
+ <% end %>
13
+ </div>
14
+
15
+ <% if page.children.any? %>
16
+ <ol>
17
+ <%= list_pages(page.children) %>
18
+ </ol>
19
+ <% end %>
20
+ </li>
@@ -0,0 +1,23 @@
1
+ <li class="set-page" rel="<%= page.id %>">
2
+ <div>
3
+ <h2><%= link_to page.name, admin_page_entries_path(page) %></h2>
4
+
5
+ <span class="item-actions primary">
6
+ <%= link_to_add_entry page %>
7
+ <%= link_to_all_entries page %>
8
+ <%= link_to_view_page page %>
9
+ </span>
10
+
11
+ <span class="item-actions secondary">
12
+ <%= link_to_edit_index_template page %>
13
+ <%= link_to_edit_entry_template page %>
14
+ </span>
15
+
16
+ </div>
17
+
18
+ <% if page.page_children.any? %>
19
+ <ol>
20
+ <%= list_pages page.page_children %>
21
+ </ol>
22
+ <% end %>
23
+ </li>
@@ -0,0 +1,29 @@
1
+ <form id="sitemap-form">
2
+ <div id="container-actions" class="toolbar">
3
+ <p id="structure-locked">
4
+ Site structure is currently locked.
5
+ <%= link_to 'Unlock structure?', '#' %>
6
+ </p>
7
+ <div id="structure-unlocked">
8
+ <ul class="actions">
9
+ <li>
10
+ <input type="submit" value="Save" />
11
+ </li>
12
+ </ul>
13
+ <p>
14
+ Site structure is currently unlocked.
15
+ <%= link_to 'Cancel', admin_site_maps_path %>
16
+ </p>
17
+ </div>
18
+ <input type="search" id="sitemap-search" placeholder="Filter pages..." />
19
+ </div>
20
+ <div id="main">
21
+ <ol id="sitemap">
22
+ <%= list_pages(@pages) %>
23
+ </ol>
24
+ <hr id="sitemap-divider" />
25
+ <ol id="virtual-pages">
26
+ <%= list_pages(@virtuals) %>
27
+ </ol>
28
+ </div>
29
+ </form>
@@ -0,0 +1,12 @@
1
+ <%= form_for [:admin, @snippet],
2
+ html: {multipart: true},
3
+ remote: true do |form| %>
4
+ <div class="fields">
5
+ <label for="snippet_value" class="legend">Value for <em><%= @snippet.key %></em>:</label>
6
+ <%= form.text_area :value %>
7
+ </div>
8
+ <div class="bottom-toolbar">
9
+ <%= form.submit value: 'Save snippet' %>
10
+ </div>
11
+ <% end %>
12
+
@@ -0,0 +1,20 @@
1
+ <div id="container-actions" class="toolbar">
2
+ <ul id="pagination">
3
+ </ul>
4
+ </div>
5
+ <div id="main">
6
+ <section>
7
+ <table class="elements-table" id='snippets-list'>
8
+ <thead>
9
+ <tr><th>Key</th><th>Value</th><th></th></tr>
10
+ </thead>
11
+ <tbody>
12
+ </tbody>
13
+ </table>
14
+ </section>
15
+ </div>
16
+ <% content_for :js_head do %>
17
+ $(function() {
18
+ SnippetsBackbone.boot();
19
+ });
20
+ <% end %>
File without changes
@@ -0,0 +1,72 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <%= csrf_meta_tag %>
6
+ <title><%= cms_title %></title>
7
+
8
+ <%= stylesheet_link_tag 'slices/slices' %>
9
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
10
+ <%= javascript_include_tag 'slices/slices' %>
11
+ <%= render "admin/shared/asset_storage" %>
12
+
13
+ <meta name="robots" content="noindex, nofollow">
14
+ <script type="text/javascript">
15
+ $(document).ready(function() {
16
+ <%= yield :js_head %>
17
+ });
18
+ </script>
19
+ </head>
20
+ <body class="<%= body_class_from_controller %>">
21
+ <div class="jqmWindow modal" id="general-modal"></div>
22
+ <div id="server-communication">Loading...</div>
23
+
24
+ <div id="container">
25
+ <header id="layout">
26
+ <% if admin_signed_in? -%>
27
+ <ul>
28
+ <li><%= current_admin.email %></li>
29
+ <%= render_custom_links %>
30
+ <li><%= link_to "View Site", root_path, target: "_blank" %></li>
31
+ <li><%= link_to "Account", admin_admin_path(current_admin) %></li>
32
+ <li><%= link_to "Log out", destroy_admin_session_path %></li>
33
+ </ul>
34
+ <% end -%>
35
+ <nav>
36
+ <ul>
37
+ <% if admin_signed_in? -%>
38
+ <%= render('admin/shared/navigation') %>
39
+ <% else -%>
40
+ <li>&nbsp;</li>
41
+ <% end -%>
42
+ </ul>
43
+ </nav>
44
+ </header>
45
+
46
+ <%= yield %>
47
+ </div>
48
+
49
+ <script type="text/html" id="livefield-result-template">
50
+ <li data-value="{{path}}">
51
+ <span class="name">{{name}}</span>
52
+ <span class="path">{{path}}</span>
53
+ </li>
54
+ </script>
55
+
56
+ <% if Rails.env.production? %>
57
+ <script type="text/javascript">
58
+ var _gaq = _gaq || [];
59
+ _gaq.push(['_setAccount', 'UA-298580-55']);
60
+ _gaq.push(['_setDomainName', 'none']);
61
+ _gaq.push(['_setAllowLinker', true]);
62
+ _gaq.push(['_setCustomVar', 1, 'Slices Version', '<%= Slices::VERSION %>', 3]);
63
+ _gaq.push(['_trackPageview']);
64
+ (function() {
65
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
66
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
67
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
68
+ })();
69
+ </script>
70
+ <% end -%>
71
+ </body>
72
+ </html>
@@ -0,0 +1,18 @@
1
+ module ActiveSupport
2
+ module Cache
3
+ class FileStore < Store
4
+
5
+ silence_warnings do
6
+ UNESCAPE_FILENAME_CHARS = /%([0-9A-F]{2})/
7
+ end
8
+
9
+ private
10
+
11
+ def file_path_key(path)
12
+ fname = path[cache_path.size, path.size].split(File::SEPARATOR, 4).last
13
+ fname.gsub(UNESCAPE_FILENAME_CHARS){|match| $1.hex.chr }
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,8 @@
1
+ Description:
2
+ This generator creates a boilerplate humans.txt file
3
+
4
+ Example:
5
+ rails generate humans
6
+
7
+ This will create:
8
+ public/humans.txt
@@ -0,0 +1,10 @@
1
+ class HumansGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('../templates', __FILE__)
3
+
4
+ desc "This generator creates a boilerplate humans.txt file"
5
+
6
+ def copy_humans_txt
7
+ copy_file 'humans.txt', 'public/humans.txt'
8
+ end
9
+
10
+ end
@@ -0,0 +1,6 @@
1
+ /* TEAM */
2
+ With Associates
3
+ http://withassociates.com/
4
+ hello@withassociates.com
5
+ @withassociates
6
+ London, UK
@@ -0,0 +1,28 @@
1
+ Description:
2
+ Creates a new slice in app/slices.
3
+
4
+ If you want to make a set slice, make sure that the name ends with
5
+ "set" or "Set" (e.g. photo_set or PhotoSet).
6
+
7
+ If you want to make a form slice, the name should end with "form".
8
+
9
+ Example:
10
+ rails generate slice you_tube
11
+ rails generate slice YouTube
12
+
13
+ Either of these commands will create:
14
+ app/slices/you_tube/you_tube_slice.rb
15
+ app/slices/you_tube/templates/you_tube.hbs
16
+ app/slices/you_tube/views/show.html.erb
17
+
18
+ You will need to restart your rails app after generating a slice
19
+ before it will appear in the admin interface.
20
+
21
+ You can define fields on a slice like this:
22
+
23
+ rails generate slice slideshow title:string slides:attachments
24
+ rails generate slice countdown text:string ends_at:date_time
25
+
26
+ Tips:
27
+ Note the shorthand version `rails g slice my_slice`
28
+
@@ -0,0 +1,123 @@
1
+ class SliceGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('../templates', __FILE__)
3
+
4
+ argument :attributes,
5
+ type: :array,
6
+ default: [],
7
+ banner: "field:type field:type"
8
+
9
+ class_option :with_entry_templates, type: :boolean, default: false,
10
+ desc: "Add templates for editing entry content."
11
+
12
+ class_option :with_identical_entries, type: :boolean, default: false,
13
+ desc: "For sets whose entry pages are all alike."
14
+
15
+ FIELD_NORMALIZATIONS = {
16
+ text: :string,
17
+ datetime: :date_time
18
+ }
19
+
20
+ def create_slices
21
+ if set_slice?
22
+ template "set_slice.rb", "#{slice_path}/#{file_name}_slice.rb"
23
+ else
24
+ template "slice.rb", "#{slice_path}/#{file_name}_slice.rb"
25
+ end
26
+ end
27
+
28
+ def create_views
29
+ if set_slice?
30
+ template "set.html.erb", "#{slice_path}/views/set.html.erb"
31
+ else
32
+ template "show.html.erb", "#{slice_path}/views/show.html.erb"
33
+ end
34
+ end
35
+
36
+ def create_templates
37
+ if set_slice?
38
+ template "set_slice_fields.hbs", "#{slice_path}/templates/#{file_name}.hbs"
39
+ else
40
+ template "slice_fields.hbs", "#{slice_path}/templates/#{file_name}.hbs"
41
+ end
42
+
43
+ base = set_slice? ? page_name : file_name
44
+
45
+ if options.with_entry_templates?
46
+ template "main_fields.hbs", "#{slice_path}/templates/#{base}_main.hbs"
47
+ template "meta_fields.hbs", "#{slice_path}/templates/#{base}_meta.hbs"
48
+ end
49
+ end
50
+
51
+ def create_set_files
52
+ if set_slice?
53
+ template "page.rb", "#{slice_path}/#{page_name}.rb"
54
+ template "presenter.rb", "#{slice_path}/#{page_name}_presenter.rb"
55
+ end
56
+ end
57
+
58
+
59
+ private
60
+
61
+ def slice_path
62
+ "app/slices/#{file_name}"
63
+ end
64
+
65
+ def page_name
66
+ file_name.sub /_set$/, ''
67
+ end
68
+
69
+ def set_slice?
70
+ file_name.ends_with? '_set'
71
+ end
72
+
73
+ def form_slice?
74
+ file_name.ends_with? '_form'
75
+ end
76
+
77
+ def field_definitions
78
+ out = []
79
+
80
+ if attributes.any? { |attribute| attribute.type == :attachments }
81
+ out << " include Slices::HasAttachments\n"
82
+ end
83
+
84
+ attributes.each do |attribute|
85
+ case attribute.type
86
+ when :attachments
87
+ attachment_klass = attribute.name.classify
88
+ out << [
89
+ "",
90
+ " class #{attachment_klass} < Attachment",
91
+ " # Extend your attachments by adding fields here e.g.",
92
+ " field :caption",
93
+ " end",
94
+ " has_attachments :#{attribute.name}, class_name: '#{class_name}Slice::#{attachment_klass}'",
95
+ ""
96
+ ].join("\n")
97
+ else
98
+ out << " field :#{attribute.name}, type: #{class_for_field attribute.type}"
99
+ end
100
+ end
101
+
102
+ out.join "\n"
103
+ end
104
+
105
+ def slice_input_id name
106
+ "slices-{{id}}-#{name}"
107
+ end
108
+
109
+ def needs_label? attribute
110
+ attribute.name.underscore == class_name.underscore
111
+ end
112
+
113
+ def label_if_needed_for attribute
114
+ unless attribute.name == file_name
115
+ %{<label for="slices-{{id}}-#{attribute.name}">#{attribute.name.humanize}</label>}
116
+ end
117
+ end
118
+
119
+ def class_for_field type
120
+ FIELD_NORMALIZATIONS.fetch(type, type).to_s.classify
121
+ end
122
+
123
+ end
@@ -0,0 +1,11 @@
1
+ <!--
2
+ Any extra fields required for editing entries can be added here.
3
+
4
+ For example:
5
+
6
+ <li>
7
+ <label for="meta-published_at">Published at</label>
8
+ <input type="datetime" id="meta-published_at" value="{{published_at}}">
9
+ </li>
10
+ -->
11
+
@@ -0,0 +1,11 @@
1
+ <!--
2
+ Any extra meta field required for editing entries can be added here.
3
+
4
+ For example:
5
+
6
+ <li>
7
+ <label for="meta-published_at">Published at</label>
8
+ <input type="datetime" id="meta-published_at" value="{{published_at}}">
9
+ </li>
10
+ -->
11
+