forest_cms 0.98.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (411) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +204 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/config/forest_manifest.js +2 -0
  6. data/app/assets/fonts/FontAwesome.otf +0 -0
  7. data/app/assets/fonts/fontawesome-webfont.eot +0 -0
  8. data/app/assets/fonts/fontawesome-webfont.svg +2671 -0
  9. data/app/assets/fonts/fontawesome-webfont.ttf +0 -0
  10. data/app/assets/fonts/fontawesome-webfont.woff +0 -0
  11. data/app/assets/fonts/fontawesome-webfont.woff2 +0 -0
  12. data/app/assets/images/forest/favicons/android-chrome-192x192.png +0 -0
  13. data/app/assets/images/forest/favicons/android-chrome-512x512.png +0 -0
  14. data/app/assets/images/forest/favicons/apple-touch-icon.png +0 -0
  15. data/app/assets/images/forest/favicons/browserconfig.xml +9 -0
  16. data/app/assets/images/forest/favicons/favicon-16x16.png +0 -0
  17. data/app/assets/images/forest/favicons/favicon-32x32.png +0 -0
  18. data/app/assets/images/forest/favicons/favicon.ico +0 -0
  19. data/app/assets/images/forest/favicons/manifest.json.erb +18 -0
  20. data/app/assets/images/forest/favicons/mstile-150x150.png +0 -0
  21. data/app/assets/images/forest/favicons/safari-pinned-tab.svg +21 -0
  22. data/app/assets/images/forest/forest-low.jpg +0 -0
  23. data/app/assets/images/forest/forest.jpg +0 -0
  24. data/app/assets/javascripts/forest/admin/lib/jquery_plugins.js +32 -0
  25. data/app/assets/javascripts/forest/admin/main.js +59 -0
  26. data/app/assets/javascripts/forest/admin/partials/add_block.js +22 -0
  27. data/app/assets/javascripts/forest/admin/partials/block_collapser.js +49 -0
  28. data/app/assets/javascripts/forest/admin/partials/block_errors.js +11 -0
  29. data/app/assets/javascripts/forest/admin/partials/block_selector_inputs.js +61 -0
  30. data/app/assets/javascripts/forest/admin/partials/cocoon_events.js +3 -0
  31. data/app/assets/javascripts/forest/admin/partials/cocoon_sortable_field_sets.js +55 -0
  32. data/app/assets/javascripts/forest/admin/partials/collage_inputs.js +286 -0
  33. data/app/assets/javascripts/forest/admin/partials/color_inputs.js +24 -0
  34. data/app/assets/javascripts/forest/admin/partials/datepicker_init.js +70 -0
  35. data/app/assets/javascripts/forest/admin/partials/documentation_sidebar_affix.js +22 -0
  36. data/app/assets/javascripts/forest/admin/partials/dropdown_block_selector.js +106 -0
  37. data/app/assets/javascripts/forest/admin/partials/edit_header.js +22 -0
  38. data/app/assets/javascripts/forest/admin/partials/file_upload_init.js +111 -0
  39. data/app/assets/javascripts/forest/admin/partials/forest_tables.js +42 -0
  40. data/app/assets/javascripts/forest/admin/partials/infinite_loader.js +89 -0
  41. data/app/assets/javascripts/forest/admin/partials/markdown_text_editor_init.js +89 -0
  42. data/app/assets/javascripts/forest/admin/partials/media_item_chooser_modal.js.erb +259 -0
  43. data/app/assets/javascripts/forest/admin/partials/menus.js +79 -0
  44. data/app/assets/javascripts/forest/admin/partials/multi_checkbox_selector.js +27 -0
  45. data/app/assets/javascripts/forest/admin/partials/persisted_value_warnings.js +38 -0
  46. data/app/assets/javascripts/forest/admin/partials/repeater_inputs.js +24 -0
  47. data/app/assets/javascripts/forest/admin/partials/select2_init.js +165 -0
  48. data/app/assets/javascripts/forest/admin/partials/select_tag_form_submitter.js +40 -0
  49. data/app/assets/javascripts/forest/admin/partials/sortable_gallery.js +45 -0
  50. data/app/assets/javascripts/forest/admin/partials/sortable_page_block_position_setter.js +37 -0
  51. data/app/assets/javascripts/forest/admin/partials/status_scheduler.js +16 -0
  52. data/app/assets/javascripts/forest/admin/partials/tab_templates.js +93 -0
  53. data/app/assets/javascripts/forest/admin/partials/tables.js +7 -0
  54. data/app/assets/javascripts/forest/admin/partials/tooltips.js +7 -0
  55. data/app/assets/javascripts/forest/admin/partials/turboform_form_submitter.js +15 -0
  56. data/app/assets/javascripts/forest/admin/vendor/imagesloaded.pkgd.min.js +7 -0
  57. data/app/assets/javascripts/forest/admin/vendor/jquery-ui-timepicker-addon.js +2291 -0
  58. data/app/assets/javascripts/forest/admin/vendor/jquery.ba-throttle-debounce.min.js +9 -0
  59. data/app/assets/javascripts/forest/admin/vendor/jquery.nestable.js +756 -0
  60. data/app/assets/javascripts/forest/admin/vendor/select2.full.min.js +3 -0
  61. data/app/assets/javascripts/forest/admin/vendor/simplemde.min.js +15 -0
  62. data/app/assets/javascripts/forest/application_admin.js +29 -0
  63. data/app/assets/javascripts/forest/application_admin_from_host_app.js +1 -0
  64. data/app/assets/javascripts/forest/application_public.js +19 -0
  65. data/app/assets/javascripts/forest/cable.js +13 -0
  66. data/app/assets/javascripts/forest/lib/jquery-3.3.1.min.js +2 -0
  67. data/app/assets/javascripts/forest/main.js +59 -0
  68. data/app/assets/javascripts/forest/public/partials/analytics.js +16 -0
  69. data/app/assets/stylesheets/forest/admin/_bootstrap-variables.scss +877 -0
  70. data/app/assets/stylesheets/forest/admin/_variables.scss +13 -0
  71. data/app/assets/stylesheets/forest/admin/base/_foundation.scss +17 -0
  72. data/app/assets/stylesheets/forest/admin/mixins/_breakpoints.scss +26 -0
  73. data/app/assets/stylesheets/forest/admin/mixins/_glyphicons.scss +278 -0
  74. data/app/assets/stylesheets/forest/admin/mixins/_layout.scss +13 -0
  75. data/app/assets/stylesheets/forest/admin/mixins/_links.scss +10 -0
  76. data/app/assets/stylesheets/forest/admin/mixins/_lists.scss +10 -0
  77. data/app/assets/stylesheets/forest/admin/mixins/_mixins.scss +6 -0
  78. data/app/assets/stylesheets/forest/admin/mixins/_triangles.scss +21 -0
  79. data/app/assets/stylesheets/forest/admin/partials/_admin.scss +57 -0
  80. data/app/assets/stylesheets/forest/admin/partials/_affix.scss +5 -0
  81. data/app/assets/stylesheets/forest/admin/partials/_block_errors.scss +15 -0
  82. data/app/assets/stylesheets/forest/admin/partials/_block_layout.scss +48 -0
  83. data/app/assets/stylesheets/forest/admin/partials/_block_type_edit_ui.scss +15 -0
  84. data/app/assets/stylesheets/forest/admin/partials/_bootstrap_customizations.scss +12 -0
  85. data/app/assets/stylesheets/forest/admin/partials/_collage_inputs.scss +122 -0
  86. data/app/assets/stylesheets/forest/admin/partials/_documentation.scss +7 -0
  87. data/app/assets/stylesheets/forest/admin/partials/_dropdown_block_selector.scss +19 -0
  88. data/app/assets/stylesheets/forest/admin/partials/_edit_header.scss +16 -0
  89. data/app/assets/stylesheets/forest/admin/partials/_file_upload.scss +3 -0
  90. data/app/assets/stylesheets/forest/admin/partials/_forest_tables.scss +20 -0
  91. data/app/assets/stylesheets/forest/admin/partials/_forms_and_inputs.scss +72 -0
  92. data/app/assets/stylesheets/forest/admin/partials/_helper_classes.scss +24 -0
  93. data/app/assets/stylesheets/forest/admin/partials/_infinite_loader.scss +8 -0
  94. data/app/assets/stylesheets/forest/admin/partials/_markdown_editor.scss +12 -0
  95. data/app/assets/stylesheets/forest/admin/partials/_media_item_chooser.scss +168 -0
  96. data/app/assets/stylesheets/forest/admin/partials/_media_library.scss +109 -0
  97. data/app/assets/stylesheets/forest/admin/partials/_pages.scss +6 -0
  98. data/app/assets/stylesheets/forest/admin/partials/_pagination.scss +5 -0
  99. data/app/assets/stylesheets/forest/admin/partials/_repeater_inputs.scss +57 -0
  100. data/app/assets/stylesheets/forest/admin/partials/_resizable_ui.scss +1 -0
  101. data/app/assets/stylesheets/forest/admin/partials/_select2_custom.scss +20 -0
  102. data/app/assets/stylesheets/forest/admin/partials/_sessions.scss +13 -0
  103. data/app/assets/stylesheets/forest/admin/partials/_slug_attributes.scss +9 -0
  104. data/app/assets/stylesheets/forest/admin/partials/_sortable_field_sets.scss +22 -0
  105. data/app/assets/stylesheets/forest/admin/partials/_sortable_select2.scss +18 -0
  106. data/app/assets/stylesheets/forest/admin/partials/_sortable_ui.scss +15 -0
  107. data/app/assets/stylesheets/forest/admin/partials/_status_indicators.scss +33 -0
  108. data/app/assets/stylesheets/forest/admin/partials/_status_scheduler.scss +9 -0
  109. data/app/assets/stylesheets/forest/admin/partials/_tooltips.scss +5 -0
  110. data/app/assets/stylesheets/forest/admin/partials/_turbolinks.scss +5 -0
  111. data/app/assets/stylesheets/forest/admin/partials/_typography.scss +19 -0
  112. data/app/assets/stylesheets/forest/admin/partials/_ui.scss +32 -0
  113. data/app/assets/stylesheets/forest/admin/sprockets/font-awesome.scss +2337 -0
  114. data/app/assets/stylesheets/forest/admin/sprockets/main_bootstrap.scss +3 -0
  115. data/app/assets/stylesheets/forest/admin/vendor/_jquery-ui-timepicker-addon.scss +30 -0
  116. data/app/assets/stylesheets/forest/admin/vendor/_nestable.scss +347 -0
  117. data/app/assets/stylesheets/forest/admin/vendor/_select2_1_core.scss +484 -0
  118. data/app/assets/stylesheets/forest/admin/vendor/_select2_2_bootstrap.scss +612 -0
  119. data/app/assets/stylesheets/forest/admin/vendor/_simplemde.min.scss +7 -0
  120. data/app/assets/stylesheets/forest/admin_overrides.scss +1 -0
  121. data/app/assets/stylesheets/forest/application_admin.css +23 -0
  122. data/app/assets/stylesheets/forest/application_public.css +16 -0
  123. data/app/assets/stylesheets/forest/main_admin.scss +16 -0
  124. data/app/assets/stylesheets/forest/main_public.scss +4 -0
  125. data/app/assets/stylesheets/forest/public/base/_admin_error_messages.scss +15 -0
  126. data/app/assets/stylesheets/forest/public/base/_foundation.scss +24 -0
  127. data/app/assets/stylesheets/forest/public/base/_images.scss +14 -0
  128. data/app/assets/stylesheets/forest/scaffolds.scss +87 -0
  129. data/app/assets/stylesheets/jquery.fileupload.scss +37 -0
  130. data/app/classes/forest/block_set.rb +26 -0
  131. data/app/classes/forest/error.rb +15 -0
  132. data/app/classes/forest/markdown_renderer.rb +31 -0
  133. data/app/classes/search_index_manager.rb +83 -0
  134. data/app/controllers/admin/block_kinds_controller.rb +31 -0
  135. data/app/controllers/admin/block_layouts_controller.rb +47 -0
  136. data/app/controllers/admin/cache_purge_controller.rb +11 -0
  137. data/app/controllers/admin/dashboard_controller.rb +6 -0
  138. data/app/controllers/admin/documentation_controller.rb +5 -0
  139. data/app/controllers/admin/errors_controller.rb +9 -0
  140. data/app/controllers/admin/forest_controller.rb +96 -0
  141. data/app/controllers/admin/imports_controller.rb +34 -0
  142. data/app/controllers/admin/media_items_controller.rb +107 -0
  143. data/app/controllers/admin/menus_controller.rb +69 -0
  144. data/app/controllers/admin/pages_controller.rb +105 -0
  145. data/app/controllers/admin/settings_controller.rb +66 -0
  146. data/app/controllers/admin/translations_controller.rb +58 -0
  147. data/app/controllers/admin/user_groups_controller.rb +69 -0
  148. data/app/controllers/admin/users_controller.rb +88 -0
  149. data/app/controllers/application_controller.rb +2 -0
  150. data/app/controllers/errors_controller.rb +26 -0
  151. data/app/controllers/forest_controller.rb +39 -0
  152. data/app/controllers/media_items_controller.rb +12 -0
  153. data/app/controllers/pages_controller.rb +39 -0
  154. data/app/controllers/public_controller.rb +5 -0
  155. data/app/helpers/admin_helper.rb +95 -0
  156. data/app/helpers/admin_info_helper.rb +12 -0
  157. data/app/helpers/admin_settings_helper.rb +16 -0
  158. data/app/helpers/application_helper.rb +2 -0
  159. data/app/helpers/block_helper.rb +25 -0
  160. data/app/helpers/cache_helper.rb +23 -0
  161. data/app/helpers/forest_errors_helper.rb +34 -0
  162. data/app/helpers/form_helper.rb +93 -0
  163. data/app/helpers/image_helper.rb +65 -0
  164. data/app/helpers/markdown_helper.rb +25 -0
  165. data/app/helpers/meta_helper.rb +238 -0
  166. data/app/helpers/navigation_helper.rb +18 -0
  167. data/app/helpers/status_indicator_helper.rb +7 -0
  168. data/app/inputs/block_selector_input.rb +16 -0
  169. data/app/inputs/collage_input.rb +63 -0
  170. data/app/inputs/color_input.rb +30 -0
  171. data/app/inputs/currency_input.rb +22 -0
  172. data/app/inputs/datepicker_input.rb +19 -0
  173. data/app/inputs/gallery_input.rb +67 -0
  174. data/app/inputs/grouped_collection_select_input.rb +19 -0
  175. data/app/inputs/image_input.rb +82 -0
  176. data/app/inputs/repeater_input.rb +58 -0
  177. data/app/jobs/forest/application_job.rb +4 -0
  178. data/app/mailers/forest/application_mailer.rb +6 -0
  179. data/app/models/application_record.rb +13 -0
  180. data/app/models/block_kind.rb +54 -0
  181. data/app/models/block_layout.rb +19 -0
  182. data/app/models/block_slot.rb +49 -0
  183. data/app/models/blocks/base_block.rb +134 -0
  184. data/app/models/cache_record.rb +2 -0
  185. data/app/models/concerns/attachable.rb +126 -0
  186. data/app/models/concerns/blockable.rb +65 -0
  187. data/app/models/concerns/filter_controller_scopes.rb +13 -0
  188. data/app/models/concerns/forest/cache_buster.rb +112 -0
  189. data/app/models/concerns/searchable.rb +200 -0
  190. data/app/models/concerns/sluggable.rb +70 -0
  191. data/app/models/concerns/statusable.rb +71 -0
  192. data/app/models/concerns/versionable.rb +13 -0
  193. data/app/models/forest/application_record.rb +111 -0
  194. data/app/models/import.rb +43 -0
  195. data/app/models/media_item.rb +136 -0
  196. data/app/models/menu.rb +65 -0
  197. data/app/models/page.rb +154 -0
  198. data/app/models/setting.rb +142 -0
  199. data/app/models/translation.rb +97 -0
  200. data/app/models/user.rb +45 -0
  201. data/app/models/user_group.rb +17 -0
  202. data/app/policies/application_policy.rb +71 -0
  203. data/app/policies/block_kind_policy.rb +2 -0
  204. data/app/policies/block_layout_policy.rb +2 -0
  205. data/app/policies/block_record_policy.rb +13 -0
  206. data/app/policies/dashboard_policy.rb +19 -0
  207. data/app/policies/media_item_policy.rb +5 -0
  208. data/app/policies/menu_policy.rb +2 -0
  209. data/app/policies/page_policy.rb +9 -0
  210. data/app/policies/setting_policy.rb +2 -0
  211. data/app/policies/translation_policy.rb +2 -0
  212. data/app/policies/user_group_policy.rb +2 -0
  213. data/app/policies/user_policy.rb +17 -0
  214. data/app/views/admin/_file_upload.html.erb +75 -0
  215. data/app/views/admin/_flash_notifications.html.erb +20 -0
  216. data/app/views/admin/_navigation.html.erb +61 -0
  217. data/app/views/admin/api/index/_header.json.jbuilder +2 -0
  218. data/app/views/admin/api/index/_records.json.jbuilder +6 -0
  219. data/app/views/admin/block_kinds/_form.html.erb +34 -0
  220. data/app/views/admin/block_kinds/edit.html.erb +3 -0
  221. data/app/views/admin/block_kinds/index.html.erb +31 -0
  222. data/app/views/admin/block_layouts/_form.html.erb +33 -0
  223. data/app/views/admin/block_layouts/edit.html.erb +3 -0
  224. data/app/views/admin/block_layouts/index.html.erb +29 -0
  225. data/app/views/admin/block_layouts/new.html.erb +3 -0
  226. data/app/views/admin/block_layouts/show.html.erb +24 -0
  227. data/app/views/admin/block_record/_block_layout.html.erb +67 -0
  228. data/app/views/admin/block_record/_block_slot_field_buttons.html.erb +15 -0
  229. data/app/views/admin/block_record/_block_slot_fields.html.erb +37 -0
  230. data/app/views/admin/block_record/_block_slot_fields_template.html.erb +50 -0
  231. data/app/views/admin/dashboard/_panel.html.erb +30 -0
  232. data/app/views/admin/dashboard/index.html.erb +18 -0
  233. data/app/views/admin/documentation/_body.html.erb +9 -0
  234. data/app/views/admin/documentation/_sidebar.html.erb +17 -0
  235. data/app/views/admin/documentation/index.html.erb +87 -0
  236. data/app/views/admin/form_inputs/_slug.html.erb +11 -0
  237. data/app/views/admin/form_inputs/_status.html.erb +20 -0
  238. data/app/views/admin/form_inputs/collage/_media_item_fields.html.erb +41 -0
  239. data/app/views/admin/headers/_edit.html.erb +68 -0
  240. data/app/views/admin/headers/_index.html.erb +61 -0
  241. data/app/views/admin/headers/_new.html.erb +14 -0
  242. data/app/views/admin/headers/_show.html.erb +37 -0
  243. data/app/views/admin/imports/edit.html.erb +60 -0
  244. data/app/views/admin/media_items/_form.html.erb +54 -0
  245. data/app/views/admin/media_items/_media_item_grid_layout.html.erb +23 -0
  246. data/app/views/admin/media_items/_media_item_list_layout.html.erb +32 -0
  247. data/app/views/admin/media_items/_modal.html.erb +62 -0
  248. data/app/views/admin/media_items/edit.html.erb +3 -0
  249. data/app/views/admin/media_items/index.html.erb +58 -0
  250. data/app/views/admin/media_items/index.json.jbuilder +2 -0
  251. data/app/views/admin/media_items/new.html.erb +3 -0
  252. data/app/views/admin/menus/_form.html.erb +92 -0
  253. data/app/views/admin/menus/_list_item.html.erb +39 -0
  254. data/app/views/admin/menus/edit.html.erb +3 -0
  255. data/app/views/admin/menus/index.html.erb +29 -0
  256. data/app/views/admin/menus/new.html.erb +3 -0
  257. data/app/views/admin/menus/show.html.erb +3 -0
  258. data/app/views/admin/navigation/_resources_dropdown.html.erb +12 -0
  259. data/app/views/admin/pages/_additional_inputs.html.erb +1 -0
  260. data/app/views/admin/pages/_form.html.erb +52 -0
  261. data/app/views/admin/pages/_table_row.html.erb +14 -0
  262. data/app/views/admin/pages/edit.html.erb +3 -0
  263. data/app/views/admin/pages/index.html.erb +33 -0
  264. data/app/views/admin/pages/index.json.jbuilder +2 -0
  265. data/app/views/admin/pages/new.html.erb +3 -0
  266. data/app/views/admin/pages/show.html.erb +3 -0
  267. data/app/views/admin/settings/_form.html.erb +25 -0
  268. data/app/views/admin/settings/edit.html.erb +3 -0
  269. data/app/views/admin/settings/index.html.erb +38 -0
  270. data/app/views/admin/settings/new.html.erb +3 -0
  271. data/app/views/admin/settings/show.html.erb +19 -0
  272. data/app/views/admin/settings/types/_boolean.html.erb +1 -0
  273. data/app/views/admin/settings/types/_image.html.erb +10 -0
  274. data/app/views/admin/settings/types/_integer.html.erb +5 -0
  275. data/app/views/admin/settings/types/_string.html.erb +5 -0
  276. data/app/views/admin/settings/types/_text.html.erb +5 -0
  277. data/app/views/admin/shared/_admin_head_additions.html.erb +1 -0
  278. data/app/views/admin/shared/navigation/_navbar.html.erb +8 -0
  279. data/app/views/admin/translations/_form.html.erb +31 -0
  280. data/app/views/admin/translations/edit.html.erb +3 -0
  281. data/app/views/admin/translations/index.html.erb +41 -0
  282. data/app/views/admin/translations/new.html.erb +3 -0
  283. data/app/views/admin/translations/show.html.erb +19 -0
  284. data/app/views/admin/user_groups/_form.html.erb +11 -0
  285. data/app/views/admin/user_groups/edit.html.erb +3 -0
  286. data/app/views/admin/user_groups/index.html.erb +29 -0
  287. data/app/views/admin/user_groups/new.html.erb +3 -0
  288. data/app/views/admin/user_groups/show.html.erb +9 -0
  289. data/app/views/admin/users/_form.html.erb +41 -0
  290. data/app/views/admin/users/edit.html.erb +3 -0
  291. data/app/views/admin/users/index.html.erb +35 -0
  292. data/app/views/admin/users/new.html.erb +3 -0
  293. data/app/views/admin/users/show.html.erb +4 -0
  294. data/app/views/blocks/_show.html.erb +21 -0
  295. data/app/views/devise/confirmations/new.html.erb +28 -0
  296. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  297. data/app/views/devise/mailer/password_change.html.erb +3 -0
  298. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  299. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  300. data/app/views/devise/passwords/edit.html.erb +31 -0
  301. data/app/views/devise/passwords/new.html.erb +27 -0
  302. data/app/views/devise/registrations/edit.html.erb +39 -0
  303. data/app/views/devise/registrations/new.html.erb +1 -0
  304. data/app/views/devise/sessions/_default_login.html.erb +25 -0
  305. data/app/views/devise/sessions/_first_time_login.html.erb +22 -0
  306. data/app/views/devise/sessions/new.html.erb +12 -0
  307. data/app/views/devise/shared/_flash_notifications.html.erb +3 -0
  308. data/app/views/devise/shared/_links.html.erb +25 -0
  309. data/app/views/devise/unlocks/new.html.erb +28 -0
  310. data/app/views/errors/internal_server_error.html.erb +2 -0
  311. data/app/views/errors/internal_server_error.json.jbuilder +4 -0
  312. data/app/views/errors/not_found.html.erb +2 -0
  313. data/app/views/errors/not_found.json.jbuilder +4 -0
  314. data/app/views/errors/unprocessable.html.erb +2 -0
  315. data/app/views/errors/unprocessable.json.jbuilder +4 -0
  316. data/app/views/forest/_analytics.html.erb +10 -0
  317. data/app/views/forest/_favicons.html.erb +7 -0
  318. data/app/views/kaminari/_first_page.html.erb +11 -0
  319. data/app/views/kaminari/_gap.html.erb +8 -0
  320. data/app/views/kaminari/_last_page.html.erb +11 -0
  321. data/app/views/kaminari/_next_page.html.erb +11 -0
  322. data/app/views/kaminari/_page.html.erb +12 -0
  323. data/app/views/kaminari/_paginator.html.erb +25 -0
  324. data/app/views/kaminari/_prev_page.html.erb +11 -0
  325. data/app/views/layouts/_shared_head.html.erb +48 -0
  326. data/app/views/layouts/admin.html.erb +19 -0
  327. data/app/views/layouts/application.html.erb +15 -0
  328. data/app/views/layouts/devise.html.erb +12 -0
  329. data/app/views/layouts/mailer.html.erb +13 -0
  330. data/app/views/layouts/mailer.text.erb +1 -0
  331. data/app/views/media_items/show.html.erb +29 -0
  332. data/app/views/pages/show.html.erb +1 -0
  333. data/app/views/public/index.html.erb +2 -0
  334. data/app/views/shared/_footer.html.erb +9 -0
  335. data/app/views/shared/_header.html.erb +9 -0
  336. data/app/views/shared/_header_colophon.html.erb +7 -0
  337. data/app/views/shared/_menu.html.erb +5 -0
  338. data/app/views/shared/_menu_item.html.erb +30 -0
  339. data/app/views/shared/_subnav.html.erb +7 -0
  340. data/config/initializers/aws.rb +17 -0
  341. data/config/initializers/devise.rb +275 -0
  342. data/config/initializers/forest.rb +5 -0
  343. data/config/initializers/paperclip.rb +1 -0
  344. data/config/initializers/rails_extensions.rb +6 -0
  345. data/config/initializers/simple_form.rb +164 -0
  346. data/config/initializers/simple_form/markdown.rb +21 -0
  347. data/config/initializers/simple_form/remote.rb +38 -0
  348. data/config/initializers/simple_form/sortable.rb +28 -0
  349. data/config/initializers/simple_form_bootstrap.rb +155 -0
  350. data/config/locales/devise.en.yml +62 -0
  351. data/config/locales/en.yml +24 -0
  352. data/config/locales/simple_form.en.yml +31 -0
  353. data/config/routes.rb +61 -0
  354. data/db/migrate/20161217191000_devise_create_users.rb +48 -0
  355. data/db/migrate/20161217200300_create_pages.rb +21 -0
  356. data/db/migrate/20161217205353_create_menus.rb +12 -0
  357. data/db/migrate/20161219033747_create_settings.rb +14 -0
  358. data/db/migrate/20161219231741_create_media_items.rb +18 -0
  359. data/db/migrate/20161225212203_create_user_groups.rb +10 -0
  360. data/db/migrate/20161225212258_create_join_table_user_groups_users.rb +8 -0
  361. data/db/migrate/20170109175932_create_block_kinds.rb +14 -0
  362. data/db/migrate/20170109180818_create_block_slots.rb +17 -0
  363. data/db/migrate/20170109185414_create_base_blocks.rb +8 -0
  364. data/db/migrate/20170818025124_create_block_layouts.rb +13 -0
  365. data/db/migrate/20170818025229_add_block_layout_to_block_slots.rb +5 -0
  366. data/db/migrate/20170818025500_remove_layout_from_block_slots.rb +5 -0
  367. data/db/migrate/20170821161755_add_unique_index_to_block_layouts.rb +6 -0
  368. data/db/migrate/20170826173346_create_translations.rb +12 -0
  369. data/db/migrate/20170910204934_index_attachment_content_type_on_media_items.rb +5 -0
  370. data/db/migrate/20180206035546_create_cache_records.rb +14 -0
  371. data/db/migrate/20180415034427_add_redirect_to_pages.rb +5 -0
  372. data/db/migrate/20180618190248_add_index_created_at_to_media_items.rb +5 -0
  373. data/db/migrate/20180625172226_add_blockable_metadata_to_pages.rb +6 -0
  374. data/db/migrate/20180626182949_remove_attachable_from_media_items.rb +7 -0
  375. data/db/migrate/20180712162414_add_media_item_status_to_media_items.rb +6 -0
  376. data/db/migrate/20190223155013_add_type_to_block_kinds.rb +6 -0
  377. data/db/migrate/20190423173909_add_seo_title_to_pages.rb +5 -0
  378. data/lib/forest.rb +9 -0
  379. data/lib/forest/engine.rb +51 -0
  380. data/lib/forest/migrations.rb +86 -0
  381. data/lib/forest/rails/active_record/has_many_ordered.rb +30 -0
  382. data/lib/forest/rails/active_record/has_repeatable.rb +19 -0
  383. data/lib/forest/rails/core_ext/enumerable.rb +17 -0
  384. data/lib/forest/version.rb +3 -0
  385. data/lib/generators/forest/block/USAGE +8 -0
  386. data/lib/generators/forest/block/block_generator.rb +103 -0
  387. data/lib/generators/forest/block/templates/_block.html.erb +2 -0
  388. data/lib/generators/forest/block/templates/_block.scss.erb +5 -0
  389. data/lib/generators/forest/block/templates/_block_edit_fields.html.erb +21 -0
  390. data/lib/generators/forest/block/templates/create_table_migration.rb +31 -0
  391. data/lib/generators/forest/block/templates/model.rb +41 -0
  392. data/lib/generators/forest/install/USAGE +2 -0
  393. data/lib/generators/forest/install/install_generator.rb +72 -0
  394. data/lib/generators/forest/scaffold/USAGE +8 -0
  395. data/lib/generators/forest/scaffold/scaffold_generator.rb +133 -0
  396. data/lib/generators/forest/scaffold/templates/admin_controller.rb +67 -0
  397. data/lib/generators/forest/scaffold/templates/controller.rb +20 -0
  398. data/lib/generators/forest/scaffold/templates/create_table_migration.rb +35 -0
  399. data/lib/generators/forest/scaffold/templates/model.rb +21 -0
  400. data/lib/generators/forest/scaffold/templates/policy.rb +2 -0
  401. data/lib/generators/forest/scaffold/templates/views/admin/_form.html.erb +56 -0
  402. data/lib/generators/forest/scaffold/templates/views/admin/edit.html.erb +3 -0
  403. data/lib/generators/forest/scaffold/templates/views/admin/index.html.erb +58 -0
  404. data/lib/generators/forest/scaffold/templates/views/admin/index.json.jbuilder +2 -0
  405. data/lib/generators/forest/scaffold/templates/views/admin/new.html.erb +3 -0
  406. data/lib/generators/forest/scaffold/templates/views/admin/show.html.erb +12 -0
  407. data/lib/generators/forest/scaffold/templates/views/public/index.html.erb +1 -0
  408. data/lib/generators/forest/scaffold/templates/views/public/show.html.erb +17 -0
  409. data/lib/tasks/forest_db_tasks.rake +176 -0
  410. data/lib/tasks/forest_elasticsearch_tasks.rake +22 -0
  411. metadata +719 -0
@@ -0,0 +1,2 @@
1
+ json.total_count records.total_count
2
+ json.per_page records.default_per_page
@@ -0,0 +1,6 @@
1
+ json.items records do |record|
2
+ json.id record.id
3
+ json.to_label record.to_label
4
+ json.select2_response record.to_select2_response
5
+ json.select2_selection record.to_select2_selection
6
+ end
@@ -0,0 +1,34 @@
1
+ <%= simple_form_for([:admin, @block_kind]) do |f| %>
2
+ <%= f.error_notification %>
3
+
4
+ <div class="row">
5
+ <div class="col-sm-12">
6
+
7
+ <div class="panel panel-default" data-collapse-parent>
8
+ <div class="panel-heading">
9
+ <h3 class="panel-title">
10
+ Metadata
11
+ <button type="button" class="btn btn-default btn-xs pull-right" data-collapse-trigger>
12
+ <div class="collapsable-icon glyphicon glyphicon-chevron-up"></div>
13
+ </button>
14
+ </h3>
15
+ </div>
16
+ <div class="panel-body" data-collapse-body>
17
+ <div class="form-inputs">
18
+ <div class="row">
19
+ <div class="col-sm-6">
20
+ <%= f.input :name, readonly: true %>
21
+ <%= f.input :description %>
22
+ <%= f.input :category %>
23
+ <%= f.input :record_type, readonly: true %>
24
+ <%= f.button :submit, class: 'btn-success' %>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ </div>
30
+
31
+ <%#= f.button :submit, class: 'btn-success' %>
32
+ </div>
33
+ </div>
34
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <%= render 'admin/headers/edit', record: @block_kind %>
2
+
3
+ <%= render 'form', record: @block_kind %>
@@ -0,0 +1,31 @@
1
+ <%= render 'admin/headers/index', records: @block_kinds, model_name: 'BlockKind' %>
2
+
3
+ <div class="table-responsive">
4
+ <table class="forest-table table table-striped">
5
+ <thead>
6
+ <tr>
7
+ <th><%= table_sorter title: 'ID', path: :admin_block_kinds_path, scope: :by_id, default_order: :desc %></th>
8
+ <th>Display Name</th>
9
+ <th>Description</th>
10
+ <th>Category</th>
11
+ <th>Record Type</th>
12
+ <th colspan="1"></th>
13
+ </tr>
14
+ </thead>
15
+
16
+ <tbody>
17
+ <% @block_kinds.each do |block_kind| %>
18
+ <tr>
19
+ <td><%= block_kind.id %></td>
20
+ <td><%= block_kind.display_name %></td>
21
+ <td><%= block_kind.description %></td>
22
+ <td><%= block_kind.category %></td>
23
+ <td><%= block_kind.record_type %></td>
24
+ <td width="1"><%= link_to 'Edit', edit_admin_block_kind_path(block_kind), class: 'btn btn-xs btn-primary', role: 'button' %></td>
25
+ </tr>
26
+ <% end %>
27
+ </tbody>
28
+ </table>
29
+ </div>
30
+
31
+ <%= paginate @block_kinds %>
@@ -0,0 +1,33 @@
1
+ <%= simple_form_for([:admin, @block_layout]) do |f| %>
2
+ <%= f.error_notification %>
3
+
4
+ <div class="row">
5
+ <div class="col-sm-12">
6
+
7
+ <div class="panel panel-default" data-collapse-parent>
8
+ <div class="panel-heading">
9
+ <h3 class="panel-title">
10
+ Metadata
11
+ <button type="button" class="btn btn-default btn-xs pull-right" data-collapse-trigger>
12
+ <div class="collapsable-icon glyphicon glyphicon-chevron-up"></div>
13
+ </button>
14
+ </h3>
15
+ </div>
16
+ <div class="panel-body" data-collapse-body>
17
+ <div class="form-inputs">
18
+ <div class="row">
19
+ <div class="col-sm-6">
20
+ <%= f.input :display_name %>
21
+ <%= render 'admin/form_inputs/slug', f: f %>
22
+ <%= f.input :description %>
23
+ <%= f.button :submit, class: 'btn-success' %>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ </div>
29
+
30
+ <%#= f.button :submit, class: 'btn-success' %>
31
+ </div>
32
+ </div>
33
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <%= render 'admin/headers/edit', record: @block_layout %>
2
+
3
+ <%= render 'form', record: @block_layout %>
@@ -0,0 +1,29 @@
1
+ <%= render 'admin/headers/index', records: @block_layouts, model_name: 'BlockLayout' %>
2
+
3
+ <div class="table-responsive">
4
+ <table class="forest-table table table-striped">
5
+ <thead>
6
+ <tr>
7
+ <th><%= table_sorter title: 'ID', path: :admin_block_layouts_path, scope: :by_id, default_order: :desc %></th>
8
+ <th>Display Name</th>
9
+ <th><%= table_sorter title: 'Slug', path: :admin_block_layouts_path, scope: :by_slug, default_order: :asc %></th>
10
+ <th>Description</th>
11
+ <th colspan="1"></th>
12
+ </tr>
13
+ </thead>
14
+
15
+ <tbody>
16
+ <% @block_layouts.each do |block_layout| %>
17
+ <tr>
18
+ <td><%= block_layout.id %></td>
19
+ <td><%= block_layout.display_name %></td>
20
+ <td><%= block_layout.slug %></td>
21
+ <td><%= block_layout.description %></td>
22
+ <td width="1"><%= link_to 'Edit', edit_admin_block_layout_path(block_layout), class: 'btn btn-xs btn-primary', role: 'button' %></td>
23
+ </tr>
24
+ <% end %>
25
+ </tbody>
26
+ </table>
27
+ </div>
28
+
29
+ <%= paginate @block_layouts %>
@@ -0,0 +1,3 @@
1
+ <%= render 'admin/headers/new', record: @block_layout %>
2
+
3
+ <%= render 'form', block_layout: @block_layout %>
@@ -0,0 +1,24 @@
1
+ <p>Find me in app/views/forest/block_layouts/show.html.erb</p>
2
+
3
+ <%# content_for :page_description, @block_layout.description if @block_layout.try(:description).present? %>
4
+ <%# content_for :page_featured_image, @block_layout.featured_image.attachment.url(:large) if @block_layout.try(:featured_image).present? %>
5
+
6
+ <p>
7
+ <b>Display Name</b>
8
+ <%= @block_layout.display_name %>
9
+ </p>
10
+ <p>
11
+ <b>Slug</b>
12
+ <%= @block_layout.slug %>
13
+ </p>
14
+ <p>
15
+ <b>Description</b>
16
+ <%= @block_layout.description %>
17
+ </p>
18
+
19
+ <p>
20
+ <b>Status:</b>
21
+ <%= @block_layout.try(:status) %>
22
+ </p>
23
+
24
+ <%= render_blocks @block_layout.blocks if @block_layout.try(:blocks).present? %>
@@ -0,0 +1,67 @@
1
+ <% block_kinds = local_assigns.fetch(:block_kinds, nil).presence || BlockKind.all.by_name %>
2
+ <% block_layout = local_assigns.fetch(:block_layout, nil).presence || BlockLayout.default_layout %>
3
+
4
+ <% raise Forest::Error.new('Block Layout does not exist.', block_layout) if block_layout.blank? %>
5
+
6
+ <% locals = { block_kinds: block_kinds,
7
+ block_layout: block_layout,
8
+ block_record: f.object } %>
9
+
10
+ <% if block_kinds.present? %>
11
+ <div class="block-layout panel panel-default" data-collapse-parent>
12
+ <div class="block-layout__panel-heading panel-heading">
13
+ <h2 class="block-layout__title">
14
+ <%= block_layout.display_name %>
15
+ <button type="button" class="block-collapse-button btn btn-default btn-xs pull-right" title="Collapse all blocks" data-block-collapse-all>
16
+ <div class="collapsable-icon glyphicon glyphicon-chevron-up"></div>
17
+ </button>
18
+ </h2>
19
+ <% if block_layout.description.present? %>
20
+ <p class="text-muted">
21
+ <%= block_layout.description %>
22
+ </p>
23
+ <% end %>
24
+ </div>
25
+ <div class="panel-body">
26
+ <div class="form-inputs">
27
+ <div class="row">
28
+ <div class="col-sm-12">
29
+ <div id="block_slots" class="block_slots">
30
+ <%# Don't try to eager load the :block or :block_kind associations here otherwise validations for new blocks will fail. %>
31
+ <%= f.simple_fields_for :block_slots, f.object.block_slots.sort_by(&:position).select { |bs| bs.block_layout_id == block_layout.id } do |f| %>
32
+ <%= render 'admin/block_record/block_slot_fields', f: f, **locals %>
33
+ <% end %>
34
+
35
+ <% if f.object.block_slots.blank? %>
36
+ <div class="well well-lg text-center block-layout__empty-description">
37
+ <p>Click the <%= "\"Add #{block_layout.display_name.downcase.sub(/ blocks?$/i, '')} block\"" %> button below to start creating your layout.</p>
38
+ </div>
39
+ <% end %>
40
+
41
+ <div class="links">
42
+ <%= link_to_add_association "Add #{block_layout.display_name.downcase.sub(/ blocks?$/i, '')} block",
43
+ f,
44
+ :block_slots,
45
+ partial: 'admin/block_record/block_slot_fields_template',
46
+ class: 'add-block-button btn btn-primary',
47
+ render_options: {
48
+ locals: locals } %>
49
+ </div>
50
+ </div>
51
+ </div>
52
+
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ <% elsif Rails.env.development? %>
58
+ <div class="row">
59
+ <div class="col-sm-12">
60
+ <div class="panel panel-default">
61
+ <div class="panel-body">
62
+ <p>No block kinds exist. Generate a new Block Kind with the command <code>rails g forest:block TextBlock text:text</code>.</p>
63
+ </div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <div class="block-slot__buttons">
2
+ <button type="button" class="block-slot-field__button--low-priority btn btn-xs btn-default" data-block-add title="Add block">
3
+ <div class="glyphicon glyphicon-plus"></div>
4
+ </button>
5
+ <%= link_to_remove_association f,
6
+ class: 'block-slot-field__button--low-priority btn btn-xs btn-default',
7
+ title: 'Remove block',
8
+ data: {
9
+ confirm: "Are you sure you want to remove this block?" } do %>
10
+ <div class="glyphicon glyphicon-minus"></div>
11
+ <% end %>
12
+ <button type="button" class="btn btn-xs btn-default" data-block-collapser title="Collapse block">
13
+ <div class="collapsable-icon glyphicon glyphicon-chevron-up"></div>
14
+ </button>
15
+ </div>
@@ -0,0 +1,37 @@
1
+ <% block_id = f.object.try(:block).try(:block_id) %>
2
+ <% block_kind = f.object.try(:block).try(:model_name).try(:name) %>
3
+ <% locals = { block_record: local_assigns.fetch(:block_record, nil) } %>
4
+
5
+ <%= content_tag :div,
6
+ class: 'block-slot nested-fields',
7
+ id: block_id,
8
+ data: {
9
+ kind: block_kind } do %>
10
+ <div class="panel panel-default">
11
+ <div class="block-slot__panel-heading panel-heading sortable-handle" data-block-type-header>
12
+ <div class="block-type-header-title">
13
+ <% if f.object.block_kind %>
14
+ <%= content_tag :div, '', class: "nested-fields__panel-display-icon #{f.object.block_kind.name.constantize.display_icon}" %>
15
+ <%= f.object.block.try(:display_name) %>
16
+ <span class="text-muted">
17
+ <small><%= f.object.block_kind.description %></small>
18
+ </span>
19
+ <% end %>
20
+ </div>
21
+
22
+ <%= render 'admin/block_record/block_slot_field_buttons', f: f %>
23
+ </div>
24
+
25
+ <div class="block-slot__inputs panel-body">
26
+ <% klass = f.object.block_kind.name.constantize %>
27
+ <%= f.simple_fields_for :block do |f| %>
28
+ <%= render "blocks/#{klass.model_name.singular}/edit", f: f, **locals %>
29
+ <% end %>
30
+ </div>
31
+ </div>
32
+
33
+ <%= f.association :block_layout, as: :hidden, input_html: { value: block_layout.id } %>
34
+ <%= f.input :block_record_type, as: :hidden %>
35
+ <%= f.input :block_kind_id, as: :hidden %>
36
+ <%= f.input :position, as: :hidden, input_html: { class: 'block-position' } %>
37
+ <% end %>
@@ -0,0 +1,50 @@
1
+ <% locals = { block_record: local_assigns.fetch(:block_record, nil) } %>
2
+
3
+ <div class="block-slot nested-fields">
4
+ <% collection = block_kinds.to_a
5
+ .sort_by { |bk| [bk.category, bk.name] }
6
+ .collect { |bk| [bk.to_label, bk.id, category: bk.category, data: { select2_response: bk.to_select2_response }] } %>
7
+ <%= f.association :block_kind,
8
+ collection: collection,
9
+ as: :grouped_select,
10
+ group_by: proc { |bk| bk.last[:category].humanize if bk.last[:category].present? },
11
+ include_blank: true,
12
+ input_html: {
13
+ class: 'block-kind-select' } %>
14
+
15
+ <div class="block-slot-field-templates">
16
+ <% block_kinds.each do |block_kind| %>
17
+ <% klass = block_kind.name.constantize %>
18
+ <%= content_tag :div,
19
+ class: "block-slot-field-template block-slot-field-template--#{klass.model_name.singular}",
20
+ data: {
21
+ block_kind_id: block_kind.id } do %>
22
+
23
+ <div class="panel panel-default">
24
+ <div class="block-slot__panel-heading panel-heading sortable-handle" data-block-type-header>
25
+ <div class="block-type-header-title">
26
+ <%= content_tag :div, '', class: "nested-fields__panel-display-icon #{klass.display_icon}" %>
27
+ <%= klass.display_name %>
28
+ <span class="text-muted">
29
+ <small><%= block_kind.description %></small>
30
+ </span>
31
+ </div>
32
+
33
+ <%= render 'admin/block_record/block_slot_field_buttons', f: f %>
34
+ </div>
35
+
36
+ <div class="block-slot__inputs panel-body">
37
+ <%= f.simple_fields_for :block, f.object.send(:build_block, klass) do |f| %>
38
+ <%= render "blocks/#{klass.model_name.singular}/edit", f: f, **locals %>
39
+ <% end %>
40
+ </div>
41
+ </div>
42
+
43
+ <% end %>
44
+ <% end %>
45
+ </div>
46
+
47
+ <%= f.association :block_layout, as: :hidden, input_html: { value: block_layout.id } %>
48
+ <%= f.input :block_record_type, as: :hidden %>
49
+ <%= f.input :position, as: :hidden, input_html: { class: 'block-position' } %>
50
+ </div>
@@ -0,0 +1,30 @@
1
+ <div class="panel panel-default">
2
+ <div class="panel-heading">
3
+ <h3><%= title %></h3>
4
+ </div>
5
+ <div class="table-responsive">
6
+ <table class="forest-table table table-striped">
7
+ <thead>
8
+ <tr>
9
+ <th width="10%">Index</th>
10
+ <th width="20%">Resource type</th>
11
+ <th width="60%">Description</th>
12
+ <th width="10%">Count</th>
13
+ <th colspan="1"></th>
14
+ </tr>
15
+ </thead>
16
+ <tbody>
17
+ <% @_rendered_resources.concat(resources) %>
18
+ <% resources.each_with_index do |resource, index| %>
19
+ <tr>
20
+ <td><%= index + 1 %></td>
21
+ <td><%= resource.model_name.human.titleize.pluralize %></td>
22
+ <td><p class="text-muted"><%= resource.try(:resource_description) %></p></td>
23
+ <td><%= number_with_delimiter resource.count %></td>
24
+ <td width="1"><%= link_to 'Edit', polymorphic_path([:admin, resource]), class: 'btn btn-xs btn-info forest-table__link', role: 'button' %></td>
25
+ </tr>
26
+ <% end %>
27
+ </tbody>
28
+ </table>
29
+ </div>
30
+ </div>
@@ -0,0 +1,18 @@
1
+ <div class="admin-header">
2
+ <div class="well">
3
+ <h1>
4
+ Dashboard
5
+ <span class="badge" title="<%= number_with_delimiter(@admin_resources.count) %> total resources"><%= number_with_delimiter @admin_resources.count %></span>
6
+ </h1>
7
+ </div>
8
+ </div>
9
+
10
+ <% @_rendered_resources = [] %>
11
+
12
+ <%= render 'admin/dashboard/panel',
13
+ title: 'Content',
14
+ resources: [Page, MediaItem] %>
15
+
16
+ <%= render 'admin/dashboard/panel',
17
+ title: 'Admin',
18
+ resources: @admin_resources - @_rendered_resources %>
@@ -0,0 +1,9 @@
1
+ <div id="documentation-wrapper" class="row">
2
+ <div class="col-sm-9">
3
+ <%= yield :body %>
4
+ </div>
5
+
6
+ <div class="col-sm-3">
7
+ <%= render 'sidebar' %>
8
+ </div>
9
+ </div>
@@ -0,0 +1,17 @@
1
+ <ul id="documentation-sidebar" class="documentation-sidebar blank-list">
2
+ <li><%= link_to 'General', admin_documentation_path %></li>
3
+ <li><a href="#dashboard">Dashboard</a></li>
4
+ <li><a href="#pages">Pages</a></li>
5
+ <li><a href="#blocks">Blocks</a></li>
6
+ <li><a href="#markdown">Markdown</a></li>
7
+ <li><a href="#links">Links</a></li>
8
+ <li><a href="#media-library">Media Library</a></li>
9
+ <li><a href="#menus">Menus</a></li>
10
+ <li><a href="#resources">Resources</a></li>
11
+ <li><a href="#bulk-import">Bulk Import</a></li>
12
+ <li><a href="#settings">Settings</a></li>
13
+ <li><a href="#users">Users</a></li>
14
+ <li><a href="#user-groups">User Groups</a></li>
15
+ <li><a href="#statusable">Statusable</a></li>
16
+ <li><a href="#about-forest">About Forest</a></li>
17
+ </ul>
@@ -0,0 +1,87 @@
1
+ <div class="admin-header">
2
+ <div class="well">
3
+ <div class="row">
4
+ <div class="col-sm-6">
5
+ <h1>
6
+ Forest Documentation
7
+ </h1>
8
+ </div>
9
+ <div class="col-sm-5 col-sm-offset-1">
10
+ <%= Gem.loaded_specs['forest'].name.titleize %> <%= Gem.loaded_specs['forest'].version %><br>
11
+ <%= Gem.loaded_specs['forest'].date.to_formatted_s(:long_ordinal).sub(/ 00:00/, '') %><br>
12
+ <% if Gem.loaded_specs['forest'].homepage.present? %>
13
+ </strong> <%= link_to Gem.loaded_specs['forest'].homepage, Gem.loaded_specs['forest'].homepage %><br>
14
+ <% end %>
15
+ </div>
16
+ </div>
17
+ </div>
18
+ </div>
19
+
20
+ <% content_for :body do %>
21
+ <p>Welcome to <strong>Forest Documentation</strong>, the built-in manual for Forest CMS.</p>
22
+ <h2 id="general">General</h2>
23
+ <p>Forest is an intuitive, easy to use content management system that is built around your content.</p>
24
+ <h2 id="dashboard">Dashboard</h2>
25
+ <p>The <span class="text-danger" data-toggle="tooltip" title="The dashboard is the admin home page.">dashboard</span> is the CMS' home page, where your primary <span class="text-danger" data-toggle="tooltip" title="A resource is a data type that you control via the admin database.">resources</span> are organized.</p>
26
+ <h2 id="pages">Pages</h2>
27
+ <p>Pages are typically composed of various interchangeable <span class="text-danger" data-toggle="tooltip" title="A block is a modular component that is used to add content to pages and other resources.">blocks</span>.</p>
28
+ <h2 id="blocks">Blocks</h2>
29
+ <p>Pages and other resoures may be composed of blocks, reusable fields such as text, images and more customized implementations based on your project. A resource may contain any number of blocks, which can be re-arrange, deleted and added to suit the page's design.</p>
30
+ <p>It's also possible that blocks may be organized into various <span class="text-danger" data-toggle="tooltip" title="A block layout is a grouping of blocks that may appear in a particular part of the page. For example, you may have block layouts that apply to the sidebar or header areas of a page.">block layouts</span>.</p>
31
+ <h2 id="markdown">Markdown</h2>
32
+ <p>Forest uses <%= link_to 'markdown', 'https://daringfireball.net/projects/markdown', target: '_blank' %> to parse text. <%= link_to 'This is another good resource', 'https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet', target: '_blank' %> for markdown.</p>
33
+ <h2 id="links">Links</h2>
34
+ <p>When linking to internal pages (pages within this same website) use relative links. A relative link begins with a slash, and omits the name of the website. Here are a few examples how you should link to various pages on your website, and to external websites.</p>
35
+ <ul>
36
+ <li>The home page is just a single slash <code>/</code></li>
37
+ <li>A link to this documentation page <code>/admin/documentation</code></li>
38
+ <li>A contact page that is nested under an about page <code>/about/contact</code></li>
39
+ <li>An external URL uses the full, absolute path <code>http://example.org</code></li>
40
+ </ul>
41
+ <h2 id="media-library">Media Library</h2>
42
+ <p>The media library is where you manage image, video and other file uploads. You can drag and drop files onto the media index to upload multiple items at once.</p>
43
+ <p>When preparing your images for upload, please follow these steps to ensure the best web experience:</p>
44
+ <h3>Images</h3>
45
+ <p><strong>Image size</strong></p>
46
+ <ul>
47
+ <li>Upload files that are at least 2000 pixels on their longest edge. Forest converts images to several different sizes. A large source image will produce high quality derivatives. If a high quality image source is unavailable, Forest will use the image at the size you upload, but it may appear pixelated depending on context.</li>
48
+ <li>Don't upload images that are larger than 3000 pixels. This will decrease upload time and increase server load when Forest resizes and optimizes the images. The DPI of the image doesn't matter, just pay attention to the pixel size.</li>
49
+ </ul>
50
+ <p><strong>Color format</strong></p>
51
+ <ul>
52
+ <li>Save images using the sRGB color space. Don't upload CMYK images. If you notice the color integrity of the image is different (it looks washed out, less vibrant, etc.) when viewing online, it's likely because the image wasn't saved in the sRGB color space.</li>
53
+ <li>If you use Adobe Photoshop, save files using the "Save for Web" dialog box, save as maximum quality JPG and check the convert to sRGB checkbox.</li>
54
+ </ul>
55
+ <p><strong>Image file type</strong></p>
56
+ <ul>
57
+ <li>Save images as maximum quality JPGs. Unless the image is an animated GIF, transparent PNG, or you have specific reasons for using another format, export the image as JPG.</li>
58
+ </ul>
59
+ <h3>Files / PDFs</h3>
60
+ <p>Upload files such as PDFs to the media library in the same way you add images. When linking to a file, you'll likely want to use <a href="https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#links" target="_blank">markdown</a> to insert the link into a text block. For example, the markdown for a link to download a file could look like:<br><code>[Click here](https://afh4b1i30gk8s.cloudfront.net/production/media_items/attachments/my-file.pdf) to download the file.</code></p>
61
+ <h2 id="menus">Menus</h2>
62
+ <p>Menus are where you edit the navigation structure of your website. Menu items are composed of custom links or associations with pages.</p>
63
+ <h2 id="resources">Resources</h2>
64
+ <p>Resources represent all of the user-controllable data in Forest CMS. You can create, edit, update and delete items from a consistent interface.</p>
65
+ <h2 id="bulk-import">Bulk Import</h2>
66
+ <p>Most resources support bulk import, accessible from the resource's index screen, in the new resource button dropdown. Use the bulk import screen to download an import template, fill out the appropriate fields, then upload the CSV file. Note that not all attributes of a resource are able to be imported without a custom implementation.</p>
67
+ <h2 id="settings">Settings</h2>
68
+ <p>Settings are where you define static values that are used throughout the site. For example the title of your website, the description, and other values. You can also <span class="text-danger" data-toggle="tooltip" title="Your website may be cached to improve performance times. If you notice stale data, purge the cache to refresh it.">purge the cache</span> of the website from the settings dropdown nav.</p>
69
+ <h2 id="users">Users</h2>
70
+ <p>Users are the website editors, administrators and content managers who have access to the CMS. Users are organized by <span class="text-danger" data-toggle="tooltip" title="User groups allow you to control which users have access to certain resources.">user groups</span> that define what a user has permission to edit, publish and view.</p>
71
+ <h2 id="user-groups">User Groups</h2>
72
+ <p>The user tab in the navigation bar gives you access to edit your profile, view the website's public home page, read this documentation, and log out of the CMS.</p>
73
+ <h2 id="statusable">Statusable</h2>
74
+ <p>Some resources support changing the status, which controls whether the resource is visible. Current supported statuses are:</p>
75
+ <dl>
76
+ <dt>Published</dt>
77
+ <dd>The default status. The resource is published and may be visible to the public.</dd>
78
+ <dt>Hidden</dt>
79
+ <dd>The resource is not visible to the public, even with a direct link to the resource.</dd>
80
+ </dl>
81
+ <h2 id="about-forest">About Forest</h2>
82
+ <p>Forest is created and maintained by <a href="http://dylanfisher.com/" target="_blank">Dylan Fisher</a>.</p>
83
+ <p>The goal of forest is to provide an easy to use, full featured CMS similar to Wordpress but with the flexibility and security of Ruby on Rails.</p>
84
+ <p>If you have questions about the CMS, the project you are currently working on, or just want to get in touch, email me at <%= mail_to 'hi@dylanfisher.com' %></p>
85
+ <% end %>
86
+
87
+ <%= render 'body' %>