qbrick 2.5.0.pre

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 (297) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +423 -0
  3. data/Rakefile +82 -0
  4. data/app/assets/javascripts/ckeditor/plugins/adv_link/LICENSE.txt +674 -0
  5. data/app/assets/javascripts/ckeditor/plugins/adv_link/README.md +62 -0
  6. data/app/assets/javascripts/ckeditor/plugins/adv_link/dialogs/anchor.js.coffee +81 -0
  7. data/app/assets/javascripts/ckeditor/plugins/adv_link/dialogs/link.js.coffee +1353 -0
  8. data/app/assets/javascripts/ckeditor/plugins/adv_link/images/anchor.png +0 -0
  9. data/app/assets/javascripts/ckeditor/plugins/adv_link/images/hidpi/anchor.png +0 -0
  10. data/app/assets/javascripts/ckeditor/plugins/adv_link/lang/de.js +68 -0
  11. data/app/assets/javascripts/ckeditor/plugins/adv_link/lang/en.js +68 -0
  12. data/app/assets/javascripts/ckeditor/plugins/adv_link/plugin.js.coffee +282 -0
  13. data/app/assets/javascripts/kuhsaft/application.js.coffee +7 -0
  14. data/app/assets/javascripts/kuhsaft/cms/application.js.coffee.erb +136 -0
  15. data/app/assets/javascripts/kuhsaft/views/read_more_view.js.coffee +17 -0
  16. data/app/assets/stylesheets/kuhsaft/application.css.sass +1 -0
  17. data/app/assets/stylesheets/kuhsaft/cms/application.css.sass +204 -0
  18. data/app/assets/stylesheets/kuhsaft/modules/_text_brick.css.sass +16 -0
  19. data/app/controllers/kuhsaft/api/pages_controller.rb +14 -0
  20. data/app/controllers/kuhsaft/cms/admin_controller.rb +18 -0
  21. data/app/controllers/kuhsaft/cms/assets_controller.rb +38 -0
  22. data/app/controllers/kuhsaft/cms/bricks_controller.rb +61 -0
  23. data/app/controllers/kuhsaft/cms/ckimages_controller.rb +26 -0
  24. data/app/controllers/kuhsaft/cms/pages_controller.rb +71 -0
  25. data/app/controllers/kuhsaft/pages_controller.rb +38 -0
  26. data/app/controllers/kuhsaft/sitemaps_controller.rb +12 -0
  27. data/app/helpers/cms_helper.rb +27 -0
  28. data/app/helpers/kuhsaft/admin_helper.rb +20 -0
  29. data/app/helpers/kuhsaft/cms/admin_helper.rb +21 -0
  30. data/app/helpers/kuhsaft/cms/pages_helper.rb +17 -0
  31. data/app/helpers/pages_helper.rb +49 -0
  32. data/app/helpers/sitemaps_helper.rb +12 -0
  33. data/app/models/kuhsaft/accordion_brick.rb +15 -0
  34. data/app/models/kuhsaft/accordion_item_brick.rb +21 -0
  35. data/app/models/kuhsaft/anchor_brick.rb +17 -0
  36. data/app/models/kuhsaft/asset.rb +29 -0
  37. data/app/models/kuhsaft/asset_brick.rb +26 -0
  38. data/app/models/kuhsaft/brick.rb +137 -0
  39. data/app/models/kuhsaft/brick_type.rb +7 -0
  40. data/app/models/kuhsaft/brick_type_filter.rb +18 -0
  41. data/app/models/kuhsaft/ckimage.rb +5 -0
  42. data/app/models/kuhsaft/cms.rb +7 -0
  43. data/app/models/kuhsaft/column_brick.rb +22 -0
  44. data/app/models/kuhsaft/image_brick.rb +16 -0
  45. data/app/models/kuhsaft/image_size.rb +51 -0
  46. data/app/models/kuhsaft/link_brick.rb +21 -0
  47. data/app/models/kuhsaft/page.rb +160 -0
  48. data/app/models/kuhsaft/page_type.rb +11 -0
  49. data/app/models/kuhsaft/partition.rb +18 -0
  50. data/app/models/kuhsaft/placeholder_brick.rb +23 -0
  51. data/app/models/kuhsaft/publish_state.rb +24 -0
  52. data/app/models/kuhsaft/slider_brick.rb +18 -0
  53. data/app/models/kuhsaft/text_brick.rb +23 -0
  54. data/app/models/kuhsaft/two_column_brick.rb +46 -0
  55. data/app/models/kuhsaft/video_brick.rb +22 -0
  56. data/app/uploaders/kuhsaft/asset_brick_asset_uploader.rb +43 -0
  57. data/app/uploaders/kuhsaft/asset_uploader.rb +50 -0
  58. data/app/uploaders/kuhsaft/ckimage_uploader.rb +16 -0
  59. data/app/uploaders/kuhsaft/image_brick_image_uploader.rb +35 -0
  60. data/app/views/kuhsaft/accordion_bricks/_accordion_brick.html.haml +3 -0
  61. data/app/views/kuhsaft/accordion_bricks/accordion_brick/_edit.html.haml +0 -0
  62. data/app/views/kuhsaft/accordion_item_bricks/_accordion_item_brick.html.haml +8 -0
  63. data/app/views/kuhsaft/accordion_item_bricks/accordion_item_brick/_edit.html.haml +1 -0
  64. data/app/views/kuhsaft/anchor_bricks/_anchor_brick.html.haml +1 -0
  65. data/app/views/kuhsaft/anchor_bricks/anchor_brick/_edit.html.haml +1 -0
  66. data/app/views/kuhsaft/asset_bricks/_asset_brick.html.haml +2 -0
  67. data/app/views/kuhsaft/asset_bricks/asset_brick/_edit.html.haml +8 -0
  68. data/app/views/kuhsaft/cms/admin/_brick_type_dropdown.html.haml +14 -0
  69. data/app/views/kuhsaft/cms/admin/_content_language_switch.html.haml +7 -0
  70. data/app/views/kuhsaft/cms/admin/_empty_state.html.haml +5 -0
  71. data/app/views/kuhsaft/cms/admin/_flash.html.haml +7 -0
  72. data/app/views/kuhsaft/cms/admin/_main_navigation.html.haml +6 -0
  73. data/app/views/kuhsaft/cms/assets/_form.html.haml +15 -0
  74. data/app/views/kuhsaft/cms/assets/_list.html.haml +11 -0
  75. data/app/views/kuhsaft/cms/assets/edit.html.haml +2 -0
  76. data/app/views/kuhsaft/cms/assets/index.html.haml +3 -0
  77. data/app/views/kuhsaft/cms/assets/new.html.haml +2 -0
  78. data/app/views/kuhsaft/cms/bricks/_brick_header.html.haml +43 -0
  79. data/app/views/kuhsaft/cms/bricks/_brick_item.html.haml +25 -0
  80. data/app/views/kuhsaft/cms/bricks/_brick_list.html.haml +4 -0
  81. data/app/views/kuhsaft/cms/bricks/_new.html.haml +41 -0
  82. data/app/views/kuhsaft/cms/bricks/_sort_form.html.haml +3 -0
  83. data/app/views/kuhsaft/cms/bricks/create.js.erb +11 -0
  84. data/app/views/kuhsaft/cms/bricks/destroy.js.erb +10 -0
  85. data/app/views/kuhsaft/cms/bricks/new.js.erb +14 -0
  86. data/app/views/kuhsaft/cms/bricks/update.js.erb +8 -0
  87. data/app/views/kuhsaft/cms/ckimages/create.html.haml +11 -0
  88. data/app/views/kuhsaft/cms/ckimages/destroy.js.erb +2 -0
  89. data/app/views/kuhsaft/cms/ckimages/index.html.haml +13 -0
  90. data/app/views/kuhsaft/cms/pages/_branch.html.haml +19 -0
  91. data/app/views/kuhsaft/cms/pages/_form.html.haml +45 -0
  92. data/app/views/kuhsaft/cms/pages/edit.html.haml +16 -0
  93. data/app/views/kuhsaft/cms/pages/index.html.haml +14 -0
  94. data/app/views/kuhsaft/cms/pages/new.html.haml +1 -0
  95. data/app/views/kuhsaft/cms/pages/show.html.haml +0 -0
  96. data/app/views/kuhsaft/cms/pages/sort.js.erb +0 -0
  97. data/app/views/kuhsaft/column_bricks/_column_brick.html.haml +3 -0
  98. data/app/views/kuhsaft/column_bricks/column_brick/_edit.html.haml +0 -0
  99. data/app/views/kuhsaft/image_bricks/_image_brick.html.haml +11 -0
  100. data/app/views/kuhsaft/image_bricks/image_brick/_edit.html.haml +13 -0
  101. data/app/views/kuhsaft/link_bricks/_link_brick.html.haml +2 -0
  102. data/app/views/kuhsaft/link_bricks/link_brick/_edit.html.haml +4 -0
  103. data/app/views/kuhsaft/pages/index.html.haml +7 -0
  104. data/app/views/kuhsaft/pages/show.html.haml +11 -0
  105. data/app/views/kuhsaft/placeholder_bricks/_placeholder_brick.html.haml +2 -0
  106. data/app/views/kuhsaft/placeholder_bricks/placeholder_brick/_edit.html.haml +1 -0
  107. data/app/views/kuhsaft/search/_form.html.haml +2 -0
  108. data/app/views/kuhsaft/search/_results.html.haml +8 -0
  109. data/app/views/kuhsaft/search/_results_entry.html.haml +13 -0
  110. data/app/views/kuhsaft/sitemaps/index.xml.haml +9 -0
  111. data/app/views/kuhsaft/slider_bricks/_slider_brick.html.haml +10 -0
  112. data/app/views/kuhsaft/slider_bricks/slider_brick/_edit.html.haml +0 -0
  113. data/app/views/kuhsaft/text_bricks/_text_brick.html.haml +11 -0
  114. data/app/views/kuhsaft/text_bricks/text_brick/_edit.html.haml +2 -0
  115. data/app/views/kuhsaft/two_column_bricks/_two_column_brick.html.haml +3 -0
  116. data/app/views/kuhsaft/two_column_bricks/two_column_brick/_childs.html.haml +5 -0
  117. data/app/views/kuhsaft/two_column_bricks/two_column_brick/_edit.html.haml +1 -0
  118. data/app/views/kuhsaft/video_bricks/_video_brick.html.haml +9 -0
  119. data/app/views/kuhsaft/video_bricks/video_brick/_edit.html.haml +8 -0
  120. data/app/views/layouts/kuhsaft/cms/application.html.haml +25 -0
  121. data/app/views/layouts/kuhsaft/cms/ckimages.html.haml +18 -0
  122. data/config/initializers/simple_form.rb +142 -0
  123. data/config/initializers/simple_form_bootstrap.rb +45 -0
  124. data/config/locales/de.yml +207 -0
  125. data/config/locales/en.yml +211 -0
  126. data/config/locales/models/kuhsaft/accordion_brick/de.yml +4 -0
  127. data/config/locales/models/kuhsaft/accordion_brick/en.yml +4 -0
  128. data/config/locales/models/kuhsaft/accordion_item_brick/de.yml +7 -0
  129. data/config/locales/models/kuhsaft/accordion_item_brick/en.yml +7 -0
  130. data/config/locales/models/kuhsaft/anchor_brick/de.yml +7 -0
  131. data/config/locales/models/kuhsaft/anchor_brick/en.yml +7 -0
  132. data/config/locales/models/kuhsaft/asset_brick/de.yml +9 -0
  133. data/config/locales/models/kuhsaft/asset_brick/en.yml +9 -0
  134. data/config/locales/models/kuhsaft/brick/de.yml +5 -0
  135. data/config/locales/models/kuhsaft/brick/en.yml +5 -0
  136. data/config/locales/models/kuhsaft/column_brick/de.yml +4 -0
  137. data/config/locales/models/kuhsaft/column_brick/en.yml +4 -0
  138. data/config/locales/models/kuhsaft/image_brick/de.yml +11 -0
  139. data/config/locales/models/kuhsaft/image_brick/en.yml +11 -0
  140. data/config/locales/models/kuhsaft/image_size/de.yml +13 -0
  141. data/config/locales/models/kuhsaft/image_size/en.yml +13 -0
  142. data/config/locales/models/kuhsaft/link_brick/de.yml +10 -0
  143. data/config/locales/models/kuhsaft/link_brick/en.yml +10 -0
  144. data/config/locales/models/kuhsaft/page/de.yml +19 -0
  145. data/config/locales/models/kuhsaft/page/en.yml +19 -0
  146. data/config/locales/models/kuhsaft/placeholder_brick/de.yml +8 -0
  147. data/config/locales/models/kuhsaft/placeholder_brick/en.yml +8 -0
  148. data/config/locales/models/kuhsaft/slider_brick/de.yml +4 -0
  149. data/config/locales/models/kuhsaft/slider_brick/en.yml +4 -0
  150. data/config/locales/models/kuhsaft/text_brick/de.yml +11 -0
  151. data/config/locales/models/kuhsaft/text_brick/en.yml +11 -0
  152. data/config/locales/models/kuhsaft/two_column_brick/de.yml +7 -0
  153. data/config/locales/models/kuhsaft/two_column_brick/en.yml +7 -0
  154. data/config/locales/models/kuhsaft/video_brick/de.yml +9 -0
  155. data/config/locales/models/kuhsaft/video_brick/en.yml +9 -0
  156. data/config/locales/simple_form.en.yml +26 -0
  157. data/config/locales/views/kuhsaft/cms/admin/de.yml +13 -0
  158. data/config/locales/views/kuhsaft/cms/admin/en.yml +12 -0
  159. data/config/locales/views/kuhsaft/cms/bricks/de.yml +18 -0
  160. data/config/locales/views/kuhsaft/cms/bricks/en.yml +18 -0
  161. data/config/locales/views/kuhsaft/cms/pages/de.yml +31 -0
  162. data/config/locales/views/kuhsaft/cms/pages/en.yml +31 -0
  163. data/config/locales/views/kuhsaft/image_brick/de.yml +6 -0
  164. data/config/locales/views/kuhsaft/image_brick/en.yml +6 -0
  165. data/config/locales/views/kuhsaft/search/de.yml +12 -0
  166. data/config/locales/views/kuhsaft/search/en.yml +12 -0
  167. data/config/locales/views/kuhsaft/text_brick/de.yml +6 -0
  168. data/config/locales/views/kuhsaft/text_brick/en.yml +6 -0
  169. data/config/locales/views/kuhsaft/video_brick/de.yml +7 -0
  170. data/config/locales/views/kuhsaft/video_brick/en.yml +7 -0
  171. data/config/routes.rb +30 -0
  172. data/db/migrate/01_create_kuhsaft_pages.rb +31 -0
  173. data/db/migrate/02_create_kuhsaft_bricks.rb +23 -0
  174. data/db/migrate/03_create_kuhsaft_brick_types.rb +12 -0
  175. data/db/migrate/04_create_kuhsaft_assets.rb +10 -0
  176. data/db/migrate/05_remove_cms_admin.rb +9 -0
  177. data/db/migrate/06_add_template_name_to_kuhsaft_bricks.rb +7 -0
  178. data/db/migrate/07_add_default_value_to_brick_type_enabled.rb +6 -0
  179. data/db/migrate/08_add_display_styles_to_bricks.rb +5 -0
  180. data/db/migrate/09_add_additional_fields_to_kuhsaft_bricks.rb +6 -0
  181. data/db/migrate/10_add_redirect_url_to_kuhsaft_pages.rb +7 -0
  182. data/db/migrate/11_update_url_and_redirect_url_value.rb +45 -0
  183. data/db/migrate/12_regenerate_fulltext.rb +12 -0
  184. data/db/migrate/13_add_page_title_to_pages.rb +7 -0
  185. data/db/migrate/14_move_kuhsaft_assets.rb +22 -0
  186. data/db/migrate/15_add_alt_text_to_bricks.rb +5 -0
  187. data/db/migrate/16_update_default_value_for_page_type.rb +9 -0
  188. data/db/migrate/17_set_page_type_to_content_for_empty_fields.rb +7 -0
  189. data/db/migrate/18_add_identifier_to_kuhsaft_pages.rb +6 -0
  190. data/db/migrate/19_add_col_count_to_bricks.rb +5 -0
  191. data/db/migrate/20_create_kuhsaft_ckimages.rb +9 -0
  192. data/db/seeds.rb +20 -0
  193. data/lib/generators/kuhsaft/assets/install_generator.rb +25 -0
  194. data/lib/generators/kuhsaft/translations/add_generator.rb +41 -0
  195. data/lib/kuhsaft.rb +22 -0
  196. data/lib/kuhsaft/brick_list.rb +87 -0
  197. data/lib/kuhsaft/engine.rb +27 -0
  198. data/lib/kuhsaft/gridded.rb +20 -0
  199. data/lib/kuhsaft/image_uploader_mounting.rb +22 -0
  200. data/lib/kuhsaft/orderable.rb +71 -0
  201. data/lib/kuhsaft/page_tree.rb +14 -0
  202. data/lib/kuhsaft/partial_extractor.rb +21 -0
  203. data/lib/kuhsaft/searchable.rb +69 -0
  204. data/lib/kuhsaft/touch_placeholders.rb +31 -0
  205. data/lib/kuhsaft/translatable.rb +54 -0
  206. data/lib/kuhsaft/version.rb +3 -0
  207. data/lib/tasks/kuhsaft_tasks.rake +22 -0
  208. data/lib/templates/kuhsaft/assets/ck-config.js.coffee +48 -0
  209. data/lib/templates/kuhsaft/assets/customizations.css.sass +0 -0
  210. data/lib/templates/kuhsaft/assets/customizations.js.coffee +0 -0
  211. data/lib/templates/kuhsaft/translations/add_translation.erb +8 -0
  212. data/spec/controllers/kuhsaft/api/pages_controller_spec.rb +70 -0
  213. data/spec/controllers/kuhsaft/pages_controller_spec.rb +90 -0
  214. data/spec/controllers/kuhsaft/sitemaps_controller_spec.rb +13 -0
  215. data/spec/dummy/Rakefile +7 -0
  216. data/spec/dummy/app/assets/images/spec-image.png +0 -0
  217. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  218. data/spec/dummy/app/assets/javascripts/kuhsaft/cms/ck-config.js.coffee +48 -0
  219. data/spec/dummy/app/assets/javascripts/kuhsaft/cms/customizations.js.coffee +0 -0
  220. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  221. data/spec/dummy/app/assets/stylesheets/kuhsaft/cms/customizations.css.sass +0 -0
  222. data/spec/dummy/app/controllers/application_controller.rb +4 -0
  223. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  224. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  225. data/spec/dummy/bin/bundle +3 -0
  226. data/spec/dummy/bin/rails +4 -0
  227. data/spec/dummy/bin/rake +4 -0
  228. data/spec/dummy/config.ru +4 -0
  229. data/spec/dummy/config/application.rb +26 -0
  230. data/spec/dummy/config/boot.rb +3 -0
  231. data/spec/dummy/config/database.yml +19 -0
  232. data/spec/dummy/config/environment.rb +5 -0
  233. data/spec/dummy/config/environments/development.rb +29 -0
  234. data/spec/dummy/config/environments/production.rb +81 -0
  235. data/spec/dummy/config/environments/test.rb +36 -0
  236. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  237. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  238. data/spec/dummy/config/initializers/inflections.rb +16 -0
  239. data/spec/dummy/config/initializers/kuhsaft.rb +5 -0
  240. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  241. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  242. data/spec/dummy/config/initializers/session_store.rb +3 -0
  243. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  244. data/spec/dummy/config/locales/en.yml +23 -0
  245. data/spec/dummy/config/routes.rb +3 -0
  246. data/spec/dummy/db/.gitkeep +0 -0
  247. data/spec/dummy/lib/assets/.gitkeep +0 -0
  248. data/spec/dummy/log/.gitkeep +0 -0
  249. data/spec/dummy/public/404.html +26 -0
  250. data/spec/dummy/public/422.html +26 -0
  251. data/spec/dummy/public/500.html +25 -0
  252. data/spec/dummy/public/favicon.ico +0 -0
  253. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  254. data/spec/dummy/script/rails +6 -0
  255. data/spec/factories.rb +26 -0
  256. data/spec/features/cms_pages_spec.rb +76 -0
  257. data/spec/features/search_spec.rb +78 -0
  258. data/spec/helpers/kuhsaft/cms/admin_helper_spec.rb +25 -0
  259. data/spec/helpers/kuhsaft/cms/pages_helper_spec.rb +46 -0
  260. data/spec/helpers/kuhsaft/pages_helper_spec.rb +21 -0
  261. data/spec/kuhsaft_spec.rb +7 -0
  262. data/spec/lib/brick_list_spec.rb +50 -0
  263. data/spec/lib/engine_spec.rb +25 -0
  264. data/spec/lib/gridded_spec.rb +24 -0
  265. data/spec/lib/image_uploader_mounting_spec.rb +14 -0
  266. data/spec/lib/page_tree_spec.rb +38 -0
  267. data/spec/lib/searchable_spec.rb +30 -0
  268. data/spec/lib/touch_placeholders_spec.rb +44 -0
  269. data/spec/lib/translatable_spec.rb +155 -0
  270. data/spec/models/accordion_brick_spec.rb +38 -0
  271. data/spec/models/accordion_item_brick_spec.rb +50 -0
  272. data/spec/models/anchor_brick_spec.rb +26 -0
  273. data/spec/models/asset_brick_spec.rb +45 -0
  274. data/spec/models/asset_spec.rb +41 -0
  275. data/spec/models/brick_spec.rb +134 -0
  276. data/spec/models/brick_type_filter_spec.rb +64 -0
  277. data/spec/models/column_brick_spec.rb +32 -0
  278. data/spec/models/image_brick_spec.rb +49 -0
  279. data/spec/models/image_size_spec.rb +36 -0
  280. data/spec/models/link_brick_spec.rb +51 -0
  281. data/spec/models/page_spec.rb +472 -0
  282. data/spec/models/placeholder_brick_spec.rb +46 -0
  283. data/spec/models/publish_state_spec.rb +33 -0
  284. data/spec/models/slider_brick_spec.rb +26 -0
  285. data/spec/models/text_brick_spec.rb +30 -0
  286. data/spec/models/two_column_brick_spec.rb +82 -0
  287. data/spec/models/video_brick_spec.rb +32 -0
  288. data/spec/spec_helper.rb +81 -0
  289. data/spec/support/kuhsaft_spec_helper.rb +8 -0
  290. data/spec/support/write_expectation.rb +57 -0
  291. data/spec/views/kuhsaft/sitemaps/index.xml.haml_spec.rb +67 -0
  292. data/vendor/assets/javascripts/bootstrap-modal-v2.js +376 -0
  293. data/vendor/assets/javascripts/bootstrap-modalmanager.js +423 -0
  294. data/vendor/assets/javascripts/jquery.nestable.js +485 -0
  295. data/vendor/assets/stylesheets/bootstrap_modal.css +214 -0
  296. data/vendor/assets/stylesheets/nestable.css +84 -0
  297. metadata +870 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: aa68b302bf2fad31f0d1e24afa8d9b0408ffc9bb
4
+ data.tar.gz: e76b64ee8157ef3a183db7b4a938b603d3bf2065
5
+ SHA512:
6
+ metadata.gz: 0c57ecb2927fc22070a4418d622722e7d778d93abc97869f16f02465f0628658d7eb7e884b003e80ed5f9c9ba8e37f83d6f29db1123e8980f73288b9c771b060
7
+ data.tar.gz: ab7e185baadf339aaa5c4edce29ef1eb55888e26fd4c00160ba768414859f973c2ffa28d52b59324d888503d1386e111dcf8bf60a6c5f27bc927acb7b782d7e4
data/README.md ADDED
@@ -0,0 +1,423 @@
1
+ [![Build Status](https://travis-ci.org/screenconcept/kuhsaft.png)](https://travis-ci.org/screenconcept/kuhsaft)
2
+ [![Code Climate](https://codeclimate.com/github/screenconcept/kuhsaft.png)](https://codeclimate.com/github/screenconcept/kuhsaft)
3
+ [![Gem Version](https://badge.fury.io/rb/kuhsaft.png)](http://badge.fury.io/rb/kuhsaft)
4
+
5
+ # Kuhsaft. A CMS as simple as it could be
6
+
7
+ ## The Who, What and Why?
8
+
9
+ Kuhsaft is made by some Rails developers at Screen Concept that got tired of
10
+ fiddling with unusable content management sytems. We are trying hard to make a
11
+ minimalistic and developer friendly CMS. Our goal is to provide a system for
12
+ ourselves and our customers that makes the of-the-shelf website project a
13
+ hasslefree thing. On one side easy to set up, integrate and customize (good for
14
+ devs) on the other hand it should be easily usable by anyone.
15
+
16
+ ## What's in it
17
+
18
+ * A modular system to integrate any type of content structure
19
+ * Multilanguage content
20
+ * much more
21
+
22
+ # Requirements
23
+
24
+ Kuhsaft requires:
25
+
26
+ * A Rails 4 app to be integrated into
27
+ * ImageMagick
28
+ * An ActiveRecord compatible DB
29
+
30
+ # Installation
31
+
32
+ Add Kuhsaft to your Gemfile:
33
+
34
+ gem 'kuhsaft'
35
+
36
+ And run
37
+
38
+ bundle install
39
+
40
+ to get the gem
41
+
42
+ Then install the assets and the migrations and run them:
43
+
44
+ rake kuhsaft:install:migrations
45
+ rake db:migrate
46
+ rake db:seed
47
+ rails generate kuhsaft:assets:install
48
+
49
+ You might want to change the language suffixes on the fields inside the create_kuhsaft_pages migration, depending on your app's default_locale.
50
+
51
+ Mount the kuhsaft engine in your routing file:
52
+
53
+ MyApp::Application.routes.draw do
54
+ # add your app routes here
55
+ mount Kuhsaft::Engine => "/"
56
+ end
57
+
58
+ Load the Kuhsaft assets into your app, so you have working grids, widgets etc:
59
+
60
+ # application.css.sass
61
+ @import 'kuhsaft/application'
62
+
63
+ # application.js.coffee
64
+ //= require 'kuhsaft/application'
65
+
66
+ Finally, you need to define the image sizes for the image brick or use
67
+ the defaults:
68
+
69
+ # your_app/config/initializers/kuhsaft.rb
70
+ Rails.application.config.to_prepare do
71
+ Kuhsaft::Engine.configure do
72
+ config.image_sizes.build_defaults! # creates 960x540 and 320x180 sizes
73
+ end
74
+ end
75
+
76
+ See "Configuring the image brick" for more details.
77
+
78
+ ## Authentication
79
+
80
+ Kuhsaft itself does not ship with any form of authentication. However, it is fairly easy to add by plugging into the Kuhsaft::Cms::AdminController. An example with devise:
81
+
82
+ ```ruby
83
+ # config/initializers/kuhsaft.rb
84
+ Rails.application.config.to_prepare do
85
+ Kuhsaft::Cms::AdminController.class_eval do
86
+ before_filter :authenticate_user!
87
+ end
88
+ end
89
+ ```
90
+
91
+ Also, be sure to have override the navigation partial in `app/views/kuhsaft/cms/admin/_main_navigation.html.haml` so you get a working logout button.
92
+
93
+ ## Extending the backend CSS/javascript
94
+ Kuhsaft installs a sass file in `assets/stylesheets/kuhsaft/cms/customizations.css.sass` and a coffeescript file in `assets/javascripts/kuhsaft/cms/customizations.js.coffee` which are loaded by the backend layout. Those files can be installed by running `rails generate kuhsaft:assets:install`.
95
+
96
+ Make sure they are in the `config.assets.precompile` array in environments like production where you usually precompile the assets. The generator will only add the necessary configs for the production env!
97
+
98
+ ## Testing
99
+
100
+ There's a dummy app inside spec/dummy. Get it running by executing the following steps:
101
+
102
+ ```
103
+ rake setup
104
+ rake start_dummy
105
+ ```
106
+
107
+ # Usage
108
+
109
+ ## Making Kuhsaft helpers available to your app
110
+
111
+ As defined in the rails docs, load the helpers from our isolated Kuhsaft engine inside your application controller:
112
+
113
+ class ApplicationController < ActionController::Base
114
+ helper Kuhsaft::Engine.helpers
115
+ end
116
+
117
+ ## Adding sublime video
118
+
119
+ Create an initializer file in your app inside `config/initializers` and set the `sublime_video_token`:
120
+
121
+ Rails.application.config.to_prepare do
122
+ Kuhsaft::Engine.configure do
123
+ # Get the token from the MySites section on the sublime video site
124
+ config.sublime_video_token = '123abcd'
125
+ end
126
+ end
127
+
128
+ Require the sublime javascript with the following helper:
129
+
130
+ # in your application layout in the head section
131
+ sublime_video_include_tag
132
+
133
+
134
+ ## Configuring the image brick
135
+
136
+ The image brick can process uploaded images into specific sizes. These sizes can be configured inside the engine configuration. You can also use the built-in default sizes:
137
+
138
+ # your_app/config/initializers/kuhsaft.rb
139
+ Rails.application.config.to_prepare do
140
+ Kuhsaft::Engine.configure do
141
+ config.image_sizes.build_defaults! # creates 960x540 and 320x180 sizes
142
+ end
143
+ end
144
+
145
+ You can also remove the default sizes:
146
+
147
+ # your_app/config/initializers/kuhsaft.rb
148
+ Rails.application.config.to_prepare do
149
+ Kuhsaft::Engine.configure do
150
+ config.image_sizes.clear! # .all is now empty
151
+ end
152
+ end
153
+
154
+ And most importantly, you can add custom sizes:
155
+
156
+ # your_app/config/initializers/kuhsaft.rb
157
+ Rails.application.config.to_prepare do
158
+ Kuhsaft::Engine.configure do
159
+ config.image_sizes.add(:side_box_vertical, 180, 460)
160
+ config.image_sizes.add(:footer_teaser, 320, 220)
161
+ end
162
+ end
163
+
164
+ The `name` option is a unique identifier, which is also used for translating the dropdown in the brick. You can add your translation by using the translation path:
165
+
166
+ activerecord.attributes.kuhsaft/image_size.sizes.#{name}
167
+
168
+ ## Configuring custom styles for bricks
169
+
170
+ Implement the `available_display_styles` on a brick model and return an array of css classnames: `['module-big', 'module-small']`. These styles can be applied to a brick instance through the UI. In the frontend, use `to_style_class` to get the configured styles:
171
+
172
+ %my-brick{ :class => brick.to_style_class}
173
+ = brick.text # ... etc
174
+
175
+ After setting up display styles in specific model add your translations
176
+ for the UI dropdown. E.g. you've added display styles to the TextBrick model:
177
+
178
+ ```
179
+ de:
180
+ text_brick:
181
+ display_styles:
182
+ style1: 'My Style 1'
183
+ style2: 'My Style 2'
184
+ ```
185
+
186
+ ## Configuring Grid settings for Bricks
187
+
188
+ Include the Kuhsaft::Gridded Module on every Brick you want to display in a grid. Default grid options are 1 to 12 (representing columns) wich can be configured via the class method `available_grid_sizes` (should return an array of integers).
189
+ Each instance of a gridded class will have a method `gridded?` wich returns true if a column size is set.
190
+
191
+ If the Gridded Module is added to a Custom Brick, it should provide a col_count integer field with default value 0.
192
+
193
+ ```
194
+ add_column :your_awesome_brick, :col_count, :integer, default: 0
195
+ ```
196
+
197
+ ## Adding custom templates with placeholder bricks
198
+
199
+ * Save your partial in `views/kuhsaft/placeholder_bricks/partials/_your_partial.html.haml`
200
+ * Add translations for your partial in `config/locales/models/kuhsaft/placeholder_brick/locale.yml`
201
+
202
+ ```
203
+ de:
204
+ your_partial: Your Partial
205
+ ```
206
+
207
+ ## Invalidating placeholder bricks containing other models on model changes
208
+
209
+ Include the TouchPlaceholders module if your model is used within a
210
+ placeholder brick and define which templates it appears in:
211
+
212
+ ```ruby
213
+ class Dummy < ActiveRecord::Base
214
+ include Kuhsaft::TouchPlaceholders
215
+ placeholder_templates 'some_template', 'some_other_template'
216
+ end
217
+ ```
218
+
219
+ ## Adding additional content languages
220
+
221
+ If you want to translate your pages into another language, generate a new translation migration:
222
+
223
+ # translate your pages into french
224
+ rails g kuhsaft:translations:add fr
225
+ Or
226
+
227
+ # translate your pages into swiss german
228
+ rails g kuhsaft:translations:add de-CH
229
+
230
+ This creates a new migration file inside `db/migrate` of your app. Run the migration as you normally do:
231
+
232
+ rake db:migrate
233
+
234
+ Finally, add the new translation locale to your `available_locales` inside your apps `application.rb`:
235
+
236
+ config.available_locales = [:en, :fr]
237
+ Or
238
+
239
+ config.available_locales = [:en, 'de-CH']
240
+
241
+ ## Adding a language switch
242
+
243
+ Add scope around routes:
244
+
245
+ scope "(:locale)", locale: /de|en|fr/ do
246
+ root 'kuhsaft/pages#show'
247
+ end
248
+
249
+ Set the locale in the ApplicationController in a before_action and set default url options:
250
+
251
+ before_action :set_locale
252
+
253
+ def set_locale
254
+ if I18n.available_locales.map{|sym| sym.to_s }.include?(params[:locale])
255
+ I18n.locale = params[:locale]
256
+ else
257
+ I18n.locale = I18n.default_locale
258
+ end
259
+ end
260
+
261
+ def default_url_options(options={})
262
+ { locale: I18n.locale }
263
+ end
264
+
265
+ Add method to ApplicationHelper which redirects to homepage when current page is not translated.
266
+ Make sure to have the homepage translated in every available language.
267
+
268
+ def localized_url(url, target_locale)
269
+ page = Kuhsaft::Page.find_by_url("#{I18n.locale}/#{url}")
270
+ I18n.with_locale target_locale do
271
+ translated_url = page.presence && page.url
272
+ if translated_url.present?
273
+ "/#{translated_url}"
274
+ else
275
+ root_path(locale: target_locale)
276
+ end
277
+ end
278
+ end
279
+
280
+ def language_link(url, locale)
281
+ localized_url(params[:url], locale)
282
+ end
283
+
284
+ Add language switch to navigation:
285
+
286
+ SimpleNavigation::Configuration.run do |navigation|
287
+ I18n.available_locales.each do |locale|
288
+ primary.item locale, locale.to_s.upcase, language_link(params[:url], locale), highlights_on: Proc.new { I18n.locale == locale }
289
+ end
290
+ end
291
+
292
+ Make sure to render only pages which are translated and published by using `published` and `translated` scope, so pages
293
+ without translation and which are not published will not be displayed in the navigation.
294
+ Here is an example of a possible navigation:
295
+
296
+ SimpleNavigation::Configuration.run do |navigation|
297
+ navigation.items do |primary|
298
+ primary.dom_class = 'right'
299
+ primary.selected_class = 'active'
300
+ Kuhsaft::Page.find_by(slug_de: 'meta-navigation').children.published.translated.each do |page|
301
+ primary.item page.id, page.title, page.link, class: 'contact icon'
302
+ end
303
+
304
+ primary.item '', 'Sprache', '#', class: 'language icon has-dropdown'do |language|
305
+ I18n.available_locales.each do |locale|
306
+ language.dom_class = 'dropdown'
307
+ language.item locale, language_text(locale), language_link(params[:url], locale), highlights_on: Proc.new { I18n.locale == locale }, class: "icon lang-#{locale}"
308
+ end
309
+ end
310
+ end
311
+ end
312
+
313
+ ## Styling the content
314
+
315
+ By default, the text editor lets you add the following tags, for which you should supply some styles in your app:
316
+
317
+ p, h1, h2, h3, h4, table, a, strong, em
318
+
319
+ ## Building a navigation
320
+
321
+ Building a navigation is simple, access to the page tree is available through the common methods built into the ancestry gem.
322
+ Just make sure you are only accessing published pages for your production site, using the `published` scope.
323
+ Or if your page is translated, using the `translated` scope and the `published` scope.
324
+
325
+ ### 2 level navigation example using simple-navigation
326
+
327
+ SimpleNavigation::Configuration.run do |navigation|
328
+ navigation.items do |primary|
329
+ # build first level
330
+ Kuhsaft::Page.roots.published.translated.each do |page|
331
+ primary.item page.id, page.title, page.link do |sub_item|
332
+ # build second level
333
+ page.children.published.translated.each do |subpage|
334
+ sub_item.item subpage.id, subpage.title, subpage.link
335
+ end
336
+ end
337
+ end
338
+ end
339
+ end
340
+
341
+ ## Use the `page_title` attribute in your app
342
+
343
+ Kuhsaft::Pages will provide a `%title` tag containing its `page_title`
344
+ (or the required `title`if no title is present). Simply yield for
345
+ `:head` in your `application.html` to use it.
346
+
347
+ %head
348
+ = yield(:head)
349
+
350
+ ## Modifying the backend navigation
351
+
352
+ Simply override the default partial for the main navigation in your app with your own file at `kuhsaft/cms/admin/_main_navigation.html.haml`
353
+
354
+ ## Adding your own Bricks
355
+
356
+ * Create your Brick model in `app/models`, for example `CaptionBrick`, which inherits from `Kuhsaft::Brick`.
357
+ * If u use a string field add a max-length validation of 255 characters.
358
+ To prevent a `ActiveRecord::StatementInvalid` Error.
359
+ * Create a migration which adds the necessary fields to the `kuhsaft_bricks` table.
360
+ * If your brick should be accessible via UI, add a BrickType into the seeds or add a migration:
361
+ `Kuhsaft::BrickType.create(:class_name => 'CaptionBrick', :group => 'elements')`
362
+ * Add the `edit` and `show` partials to your views, e.g: `app/views/caption_bricks/caption_brick/_edit.html.haml`
363
+ * Add the `childs` partial to your views, if you want to render your bricks childs with your own html: `app/views/caption_bricks/caption_brick/_childs.html.haml`
364
+ * Implement the `fulltext` method on your brick, return anything you want to be searchable.
365
+ * Customize the edit form behaviour of your brick by overriding methods like `to_style_class?`. See the `Brick` and `BrickList` files for more methods.
366
+
367
+ ### Use the Kuhsaft ImageBrickImageUploader for your own Brick
368
+
369
+ Kuhsaft has a module called `ImageUploaderMounting`. This module mounts the ImageBrickImageUploader
370
+ and includes a callback method which handles that the image sizes will be updated after save.
371
+
372
+ class CustomBrick < Brick
373
+ include Kuhsaft::ImageUploaderMounting
374
+ ...
375
+ end
376
+
377
+ If you do not include this module, then the images will not be changed when selecting one of your own image
378
+ sizes. See "Configuring the image brick" for more details on creating your own image sizes.
379
+
380
+ ## Integrating search
381
+
382
+ Kuhsaft supports fulltext search when using PostgreSQL with a simple
383
+ LIKE fallback for any other ActiveRecord DB.
384
+
385
+ Add a call to the `search_page_form` helper in your views. This renders
386
+ the default search form. The query will be executed by kuhsaft.
387
+
388
+ # e.g. _footer.html.haml
389
+ = search_page_form
390
+
391
+ To customize the search and result views you can add your own partials
392
+ to your rails app. The following partials are overridable.
393
+
394
+ app/views/kuhsaft/search
395
+ ├── _form.html.haml # Search form
396
+ ├── _results.html.haml # Results list (@pages)
397
+ └── _results_entry.html.haml # Single result entry (@page)
398
+
399
+ When using PostgreSQL, an additional attribute `excerpt` will be
400
+ available on the page model. It includes a highlighted excerpt of the
401
+ matching `fulltext` column.
402
+
403
+ ## Selecting CMS pages in CKEditor (API)
404
+
405
+ The pages API is available under `/:locale/api/pages.json`. Only the
406
+ title and url attribute is rendered in the json.
407
+
408
+ ### Usage
409
+ Add the following lines to your `ck-config.js` file. The first line
410
+ disables the standard link plugin. The second line enables the adv_link
411
+ plugin, which we need for the CMS Page link dialogue in CKEditor.
412
+
413
+ ```
414
+ config.removePlugins = 'link'
415
+ config.extraPlugins = 'adv_link'
416
+ ```
417
+
418
+ Do not forget to update your `config.assets.precompile` array. Add the
419
+ following to your existing array `ckeditor/adv_link/*`.
420
+
421
+ # LICENSE
422
+
423
+ See the file LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,82 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'rspec/core/rake_task'
4
+ require 'fileutils'
5
+
6
+ begin
7
+ require 'rdoc/task'
8
+ rescue LoadError
9
+ require 'rdoc/rdoc'
10
+ require 'rake/rdoctask'
11
+ RDoc::Task = Rake::RDocTask
12
+ end
13
+
14
+ module Postgres
15
+ class << self
16
+ def exec(query)
17
+ `psql postgres -tAc "#{query}"`
18
+ end
19
+
20
+ def user_exists?(username)
21
+ exec("SELECT 1 FROM pg_user WHERE usename='#{username}'").strip == '1'
22
+ end
23
+
24
+ def drop_user(username)
25
+ puts "dropping user #{username}"
26
+ puts exec("DROP USER #{username}").inspect
27
+ end
28
+
29
+ def create_user(username)
30
+ user_exists?(username) ? false : `createuser -s #{username}`
31
+ end
32
+ end
33
+ end
34
+
35
+ def within_dummy_app
36
+ Dir.chdir('spec/dummy') do
37
+ ENV['BUNDLE_GEMFILE'] = File.join File.dirname(__FILE__), 'Gemfile'
38
+ yield
39
+ end
40
+ end
41
+
42
+ desc 'Run specs'
43
+ RSpec::Core::RakeTask.new(spec: :setup)
44
+
45
+ RDoc::Task.new(:rdoc) do |rdoc|
46
+ rdoc.rdoc_dir = 'rdoc'
47
+ rdoc.title = 'Kuhsaft'
48
+ rdoc.options << '--line-numbers'
49
+ rdoc.rdoc_files.include('README.rdoc')
50
+ rdoc.rdoc_files.include('lib/**/*.rb')
51
+ end
52
+
53
+ desc 'set up the dummy app for testing'
54
+ task :setup do
55
+ Postgres.create_user 'screenconcept'
56
+ within_dummy_app do
57
+ `bundle exec rake kuhsaft:install:migrations`
58
+ `bundle exec rails generate kuhsaft:install:assets`
59
+ `bundle exec rake db:create`
60
+ `bundle exec rake db:migrate`
61
+ `bundle exec rake db:test:prepare`
62
+ `bundle exec rake db:seed`
63
+ end
64
+ end
65
+
66
+ task default: [:spec]
67
+
68
+ desc 'start the dummy app'
69
+ task :start_dummy do
70
+ within_dummy_app do
71
+ `bundle exec rails server`
72
+ end
73
+ end
74
+
75
+ namespace :dummy_db do
76
+ desc 'migrate in dummy app'
77
+ task :migrate do
78
+ within_dummy_app do
79
+ `bundle exec rake db:migrate 2>&1`
80
+ end
81
+ end
82
+ end