comfortable_mexican_sofa 1.12.11 → 2.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 (490) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +4 -0
  3. data/.gitattributes +2 -0
  4. data/.github/issue_template.md +22 -0
  5. data/.github/pull_request_template.md +6 -0
  6. data/.gitignore +3 -0
  7. data/.rubocop.yml +5 -0
  8. data/.rubocop_todo.yml +974 -0
  9. data/.travis.yml +2 -10
  10. data/Gemfile +5 -7
  11. data/README.md +40 -39
  12. data/Rakefile +1 -31
  13. data/app/assets/javascripts/comfy/admin/cms/application.js.coffee +7 -4
  14. data/app/assets/javascripts/comfy/admin/cms/base.js.coffee +23 -33
  15. data/app/assets/javascripts/comfy/admin/cms/lib/diff/pretty_text_diff.js +76 -0
  16. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr.min.js +2 -0
  17. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ar.js +52 -0
  18. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/bg.js +65 -0
  19. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/bn.js +65 -0
  20. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/cat.js +83 -0
  21. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/cs.js +70 -0
  22. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/cy.js +92 -0
  23. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/da.js +71 -0
  24. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/de.js +70 -0
  25. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/default.js +80 -0
  26. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/eo.js +73 -0
  27. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/es.js +69 -0
  28. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/et.js +73 -0
  29. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/fa.js +68 -0
  30. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/fi.js +69 -0
  31. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/fr.js +75 -0
  32. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/gr.js +74 -0
  33. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/he.js +57 -0
  34. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/hi.js +65 -0
  35. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/hr.js +66 -0
  36. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/hu.js +72 -0
  37. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/id.js +61 -0
  38. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/it.js +70 -0
  39. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ja.js +57 -0
  40. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ko.js +60 -0
  41. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/lt.js +72 -0
  42. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/lv.js +67 -0
  43. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/mk.js +69 -0
  44. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/mn.js +67 -0
  45. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ms.js +68 -0
  46. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/my.js +69 -0
  47. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/nl.js +75 -0
  48. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/no.js +73 -0
  49. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/pa.js +65 -0
  50. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/pl.js +68 -0
  51. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/pt-BR.js +66 -0
  52. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/pt.js +66 -0
  53. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ro.js +69 -0
  54. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/ru.js +66 -0
  55. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/si.js +65 -0
  56. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/sk.js +70 -0
  57. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/sl.js +70 -0
  58. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/sq.js +65 -0
  59. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/sr.js +69 -0
  60. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/sv.js +70 -0
  61. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/th.js +72 -0
  62. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/tr.js +66 -0
  63. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/uk.js +66 -0
  64. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/vn.js +66 -0
  65. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/zh-CN.js +61 -0
  66. data/app/assets/javascripts/comfy/admin/cms/lib/flatpickr/i18n/zh-TW.js +61 -0
  67. data/app/assets/javascripts/comfy/admin/cms/lib/redactor.js +9 -3
  68. data/app/assets/javascripts/comfy/admin/cms/uploader.js.coffee +9 -10
  69. data/app/assets/stylesheets/comfy/admin/cms/application.sass +4 -4
  70. data/app/assets/stylesheets/comfy/admin/cms/base.sass +215 -338
  71. data/app/assets/stylesheets/comfy/admin/cms/lib/flatpickr.min.css +13 -0
  72. data/app/assets/stylesheets/comfy/admin/cms/redactor_overrides.sass +2 -2
  73. data/app/controllers/comfy/admin/base_controller.rb +20 -0
  74. data/app/controllers/comfy/admin/cms/base_controller.rb +9 -22
  75. data/app/controllers/comfy/admin/cms/categories_controller.rb +2 -3
  76. data/app/controllers/comfy/admin/cms/files_controller.rb +50 -31
  77. data/app/controllers/comfy/admin/cms/layouts_controller.rb +12 -13
  78. data/app/controllers/comfy/admin/cms/pages_controller.rb +28 -28
  79. data/app/controllers/comfy/admin/cms/revisions_controller.rb +23 -14
  80. data/app/controllers/comfy/admin/cms/sites_controller.rb +9 -10
  81. data/app/controllers/comfy/admin/cms/snippets_controller.rb +11 -11
  82. data/app/controllers/comfy/admin/cms/translations_controller.rb +98 -0
  83. data/app/controllers/comfy/cms/assets_controller.rb +9 -10
  84. data/app/controllers/comfy/cms/base_controller.rb +0 -2
  85. data/app/controllers/comfy/cms/content_controller.rb +50 -31
  86. data/app/controllers/concerns/comfy/paginate.rb +2 -2
  87. data/app/helpers/comfy/admin/cms_helper.rb +29 -0
  88. data/app/helpers/comfy/cms_helper.rb +40 -60
  89. data/app/models/comfy/cms/categorization.rb +8 -11
  90. data/app/models/comfy/cms/category.rb +10 -14
  91. data/app/models/comfy/cms/file.rb +31 -47
  92. data/app/models/comfy/cms/fragment.rb +55 -0
  93. data/app/models/comfy/cms/layout.rb +45 -40
  94. data/app/models/comfy/cms/page.rb +47 -36
  95. data/app/models/comfy/cms/revision.rb +5 -8
  96. data/app/models/comfy/cms/site.rb +26 -51
  97. data/app/models/comfy/cms/snippet.rb +20 -24
  98. data/app/models/comfy/cms/translation.rb +37 -0
  99. data/app/models/concerns/comfy/cms/with_categories.rb +38 -0
  100. data/app/models/concerns/comfy/cms/with_fragments.rb +121 -0
  101. data/app/views/comfy/admin/cms/categories/_categories.html.haml +2 -1
  102. data/app/views/comfy/admin/cms/categories/_edit.html.haml +7 -6
  103. data/app/views/comfy/admin/cms/categories/_form.html.haml +8 -5
  104. data/app/views/comfy/admin/cms/categories/_index.html.haml +24 -20
  105. data/app/views/comfy/admin/cms/categories/_show.html.haml +10 -9
  106. data/app/views/comfy/admin/cms/categories/create.js.erb +2 -2
  107. data/app/views/comfy/admin/cms/categories/edit.js.erb +1 -1
  108. data/app/views/comfy/admin/cms/categories/update.js.erb +2 -2
  109. data/app/views/comfy/admin/cms/files/_file.html.haml +31 -25
  110. data/app/views/comfy/admin/cms/files/_form.html.haml +16 -12
  111. data/app/views/comfy/admin/cms/files/edit.html.haml +1 -1
  112. data/app/views/comfy/admin/cms/files/index.html.haml +17 -19
  113. data/app/views/comfy/admin/cms/files/new.html.haml +1 -1
  114. data/app/views/comfy/admin/cms/layouts/_form.html.haml +10 -10
  115. data/app/views/comfy/admin/cms/layouts/_index_branch.html.haml +21 -19
  116. data/app/views/comfy/admin/cms/layouts/edit.html.haml +5 -5
  117. data/app/views/comfy/admin/cms/layouts/index.html.haml +4 -7
  118. data/app/views/comfy/admin/cms/pages/_form.html.haml +15 -21
  119. data/app/views/comfy/admin/cms/pages/_form_fragments.html.haml +40 -0
  120. data/app/views/comfy/admin/cms/pages/_fragment_attachments.html.haml +10 -0
  121. data/app/views/comfy/admin/cms/pages/_index_branch.html.haml +34 -26
  122. data/app/views/comfy/admin/cms/pages/edit.html.haml +19 -5
  123. data/app/views/comfy/admin/cms/pages/form_fragments.js.erb +1 -0
  124. data/app/views/comfy/admin/cms/pages/index.html.haml +5 -8
  125. data/app/views/comfy/admin/cms/pages/new.html.haml +1 -1
  126. data/app/views/comfy/admin/cms/revisions/show.html.haml +29 -27
  127. data/app/views/comfy/admin/cms/sites/_form.html.haml +6 -8
  128. data/app/views/comfy/admin/cms/sites/edit.html.haml +1 -1
  129. data/app/views/comfy/admin/cms/sites/index.html.haml +23 -22
  130. data/app/views/comfy/admin/cms/sites/new.html.haml +1 -1
  131. data/app/views/comfy/admin/cms/snippets/_form.html.haml +9 -9
  132. data/app/views/comfy/admin/cms/snippets/edit.html.haml +6 -5
  133. data/app/views/comfy/admin/cms/snippets/index.html.haml +25 -25
  134. data/app/views/comfy/admin/cms/snippets/new.html.haml +1 -1
  135. data/app/views/comfy/admin/cms/translations/_form.html.haml +21 -0
  136. data/app/views/comfy/admin/cms/translations/edit.html.haml +9 -0
  137. data/app/views/comfy/admin/cms/translations/form_fragments.js.erb +1 -0
  138. data/app/views/comfy/admin/cms/translations/new.html.haml +5 -0
  139. data/app/views/kaminari/comfy/_first_page.html.haml +3 -2
  140. data/app/views/kaminari/comfy/_gap.html.haml +2 -2
  141. data/app/views/kaminari/comfy/_last_page.html.haml +3 -2
  142. data/app/views/kaminari/comfy/_next_page.html.haml +2 -2
  143. data/app/views/kaminari/comfy/_page.html.haml +2 -2
  144. data/app/views/kaminari/comfy/_prev_page.html.haml +1 -1
  145. data/app/views/layouts/comfy/admin/cms/_body.html.haml +13 -15
  146. data/app/views/layouts/comfy/admin/cms/_footer_js.html.haml +10 -3
  147. data/app/views/layouts/comfy/admin/cms/_head.html.haml +7 -10
  148. data/app/views/layouts/comfy/admin/cms/_left.html.haml +33 -15
  149. data/app/views/layouts/comfy/admin/cms/_right.html.haml +2 -2
  150. data/comfortable_mexican_sofa.gemspec +19 -19
  151. data/config/application.rb +14 -8
  152. data/config/boot.rb +2 -2
  153. data/config/cms_routes.rb +3 -3
  154. data/config/environments/development.rb +37 -4
  155. data/config/environments/test.rb +12 -14
  156. data/config/initializers/comfortable_mexican_sofa.rb +5 -12
  157. data/config/locales/cs.yml +33 -7
  158. data/config/locales/da.yml +33 -7
  159. data/config/locales/de.yml +32 -6
  160. data/config/locales/en.yml +33 -7
  161. data/config/locales/es.yml +33 -7
  162. data/config/locales/fr.yml +33 -7
  163. data/config/locales/it.yml +33 -7
  164. data/config/locales/ja.yml +33 -7
  165. data/config/locales/nb.yml +33 -7
  166. data/config/locales/nl.yml +33 -7
  167. data/config/locales/pl.yml +33 -7
  168. data/config/locales/pt-BR.yml +33 -7
  169. data/config/locales/ru.yml +33 -7
  170. data/config/locales/sk.yml +33 -7
  171. data/config/locales/sv.yml +33 -7
  172. data/config/locales/tr.yml +33 -7
  173. data/config/locales/uk.yml +33 -7
  174. data/config/locales/zh-CN.yml +33 -7
  175. data/config/locales/zh-TW.yml +33 -7
  176. data/config/storage.yml +35 -0
  177. data/db/cms_seeds/sample-site/files/_default.jpg.yml +5 -0
  178. data/db/{cms_fixtures/sample-site/files/sample.jpg → cms_seeds/sample-site/files/default.jpg} +0 -0
  179. data/db/cms_seeds/sample-site/layouts/default/content.html +16 -0
  180. data/db/cms_seeds/sample-site/layouts/default/nested/content.html +14 -0
  181. data/db/cms_seeds/sample-site/pages/index/child_a/content.html +7 -0
  182. data/db/cms_seeds/sample-site/pages/index/child_b/content.html +6 -0
  183. data/db/cms_seeds/sample-site/pages/index/content.es.html +6 -0
  184. data/db/cms_seeds/sample-site/pages/index/content.fr.html +6 -0
  185. data/db/cms_seeds/sample-site/pages/index/content.html +24 -0
  186. data/db/{cms_fixtures/sample-site/pages/index/child/thumbnail.png → cms_seeds/sample-site/pages/index/footer.png} +0 -0
  187. data/db/cms_seeds/sample-site/pages/index/header.png +0 -0
  188. data/db/cms_seeds/sample-site/snippets/default.html +8 -0
  189. data/db/migrate/00_create_active_storage_tables.active_storage.rb +26 -0
  190. data/db/migrate/01_create_cms.rb +113 -104
  191. data/doc/preview.jpg +0 -0
  192. data/lib/comfortable_mexican_sofa.rb +10 -14
  193. data/lib/comfortable_mexican_sofa/configuration.rb +9 -13
  194. data/lib/comfortable_mexican_sofa/content.rb +28 -0
  195. data/lib/comfortable_mexican_sofa/content/block.rb +11 -0
  196. data/lib/comfortable_mexican_sofa/content/params_parser.rb +80 -0
  197. data/lib/comfortable_mexican_sofa/content/renderer.rb +125 -0
  198. data/lib/comfortable_mexican_sofa/content/tag.rb +37 -0
  199. data/lib/comfortable_mexican_sofa/content/tags/asset.rb +56 -0
  200. data/lib/comfortable_mexican_sofa/content/tags/checkbox.rb +21 -0
  201. data/lib/comfortable_mexican_sofa/content/tags/date.rb +22 -0
  202. data/lib/comfortable_mexican_sofa/content/tags/datetime.rb +22 -0
  203. data/lib/comfortable_mexican_sofa/content/tags/file.rb +77 -0
  204. data/lib/comfortable_mexican_sofa/content/tags/file_link.rb +66 -0
  205. data/lib/comfortable_mexican_sofa/content/tags/files.rb +39 -0
  206. data/lib/comfortable_mexican_sofa/content/tags/fragment.rb +54 -0
  207. data/lib/comfortable_mexican_sofa/content/tags/helper.rb +52 -0
  208. data/lib/comfortable_mexican_sofa/content/tags/markdown.rb +21 -0
  209. data/lib/comfortable_mexican_sofa/content/tags/number.rb +17 -0
  210. data/lib/comfortable_mexican_sofa/content/tags/partial.rb +42 -0
  211. data/lib/comfortable_mexican_sofa/content/tags/snippet.rb +31 -0
  212. data/lib/comfortable_mexican_sofa/content/tags/template.rb +41 -0
  213. data/lib/comfortable_mexican_sofa/content/tags/text.rb +17 -0
  214. data/lib/comfortable_mexican_sofa/content/tags/textarea.rb +17 -0
  215. data/lib/comfortable_mexican_sofa/content/tags/wysiwyg.rb +18 -0
  216. data/lib/comfortable_mexican_sofa/engine.rb +3 -2
  217. data/lib/comfortable_mexican_sofa/extensions/acts_as_tree.rb +33 -30
  218. data/lib/comfortable_mexican_sofa/extensions/has_revisions.rb +27 -23
  219. data/lib/comfortable_mexican_sofa/form_builder.rb +32 -104
  220. data/lib/comfortable_mexican_sofa/render_methods.rb +24 -21
  221. data/lib/comfortable_mexican_sofa/routes/cms.rb +6 -14
  222. data/lib/comfortable_mexican_sofa/routes/cms_admin.rb +39 -29
  223. data/lib/comfortable_mexican_sofa/routing.rb +1 -1
  224. data/lib/comfortable_mexican_sofa/seeds.rb +102 -0
  225. data/lib/comfortable_mexican_sofa/seeds/file/exporter.rb +40 -0
  226. data/lib/comfortable_mexican_sofa/seeds/file/importer.rb +61 -0
  227. data/lib/comfortable_mexican_sofa/seeds/layout/exporter.rb +37 -0
  228. data/lib/comfortable_mexican_sofa/seeds/layout/importer.rb +59 -0
  229. data/lib/comfortable_mexican_sofa/seeds/page/exporter.rb +88 -0
  230. data/lib/comfortable_mexican_sofa/seeds/page/importer.rb +213 -0
  231. data/lib/comfortable_mexican_sofa/seeds/snippet/exporter.rb +31 -0
  232. data/lib/comfortable_mexican_sofa/seeds/snippet/importer.rb +48 -0
  233. data/lib/comfortable_mexican_sofa/version.rb +1 -1
  234. data/lib/comfortable_mexican_sofa/view_hooks.rb +0 -1
  235. data/lib/generators/comfy/cms/assets_generator.rb +0 -1
  236. data/lib/generators/comfy/cms/cms_generator.rb +15 -5
  237. data/lib/generators/comfy/scaffold/scaffold_generator.rb +26 -20
  238. data/lib/generators/comfy/scaffold/templates/{controller.rb → controller.rb.tt} +10 -10
  239. data/lib/generators/comfy/scaffold/templates/{migration.rb → migration.rb.tt} +2 -3
  240. data/lib/generators/comfy/scaffold/templates/{model.rb → model.rb.tt} +7 -7
  241. data/lib/generators/comfy/scaffold/templates/tests/{controller.rb → controller.rb.tt} +37 -24
  242. data/lib/generators/comfy/scaffold/templates/tests/{fixture.yml → fixture.yml.tt} +0 -0
  243. data/lib/generators/comfy/scaffold/templates/tests/{model.rb → model.rb.tt} +3 -4
  244. data/lib/generators/comfy/scaffold/templates/views/_form.haml.tt +7 -0
  245. data/lib/generators/comfy/scaffold/templates/views/{edit.haml → edit.haml.tt} +1 -1
  246. data/lib/generators/comfy/scaffold/templates/views/index.haml.tt +21 -0
  247. data/lib/generators/comfy/scaffold/templates/views/{new.haml → new.haml.tt} +1 -1
  248. data/lib/generators/comfy/scaffold/templates/views/{show.haml → show.haml.tt} +2 -2
  249. data/lib/tasks/cms_seeds.rake +37 -0
  250. data/test/controllers/comfy/admin/cms/base_controller_test.rb +5 -6
  251. data/test/controllers/comfy/admin/cms/categories_controller_test.rb +27 -24
  252. data/test/controllers/comfy/admin/cms/files_controller_test.rb +97 -97
  253. data/test/controllers/comfy/admin/cms/layouts_controller_test.rb +32 -31
  254. data/test/controllers/comfy/admin/cms/pages_controller_test.rb +317 -263
  255. data/test/controllers/comfy/admin/cms/revisions_controller_test.rb +175 -65
  256. data/test/controllers/comfy/admin/cms/sites_controller_test.rb +27 -29
  257. data/test/controllers/comfy/admin/cms/snippets_controller_test.rb +54 -51
  258. data/test/controllers/comfy/admin/cms/translations_controller_test.rb +181 -0
  259. data/test/controllers/comfy/cms/assets_controller_test.rb +24 -22
  260. data/test/controllers/comfy/cms/content_controller_test.rb +126 -140
  261. data/test/fixtures/active_storage/attachments.yml +9 -0
  262. data/test/fixtures/active_storage/blobs.yml +13 -0
  263. data/test/fixtures/comfy/cms/files.yml +2 -6
  264. data/test/fixtures/comfy/cms/fragments.yml +25 -0
  265. data/test/fixtures/comfy/cms/layouts.yml +7 -13
  266. data/test/fixtures/comfy/cms/pages.yml +2 -17
  267. data/test/fixtures/comfy/cms/revisions.yml +16 -8
  268. data/test/fixtures/comfy/cms/sites.yml +0 -1
  269. data/test/fixtures/comfy/cms/snippets.yml +1 -1
  270. data/test/fixtures/comfy/cms/translations.yml +7 -0
  271. data/test/fixtures/generators/cms/application.rb +7 -0
  272. data/test/fixtures/generators/cms/routes.rb +4 -7
  273. data/test/fixtures/generators/scaffold/controller.rb +10 -10
  274. data/test/fixtures/generators/scaffold/migration.rb +2 -3
  275. data/test/fixtures/generators/scaffold/model.rb +7 -7
  276. data/test/fixtures/generators/scaffold/routes.rb +1 -2
  277. data/test/fixtures/generators/scaffold/tests/controller.rb +37 -24
  278. data/test/fixtures/generators/scaffold/tests/model.rb +3 -4
  279. data/test/fixtures/generators/scaffold/views/_form.haml +3 -2
  280. data/test/fixtures/generators/scaffold/views/edit.haml +1 -1
  281. data/test/fixtures/generators/scaffold/views/index.haml +15 -13
  282. data/test/fixtures/generators/scaffold/views/new.haml +1 -1
  283. data/test/fixtures/generators/scaffold/views/show.haml +2 -2
  284. data/test/gemfiles/Gemfile.rails.5.2 +32 -0
  285. data/test/generators/cms_assets_generator_test.rb +1 -2
  286. data/test/generators/cms_generator_test.rb +3 -1
  287. data/test/generators/cms_views_generator_test.rb +1 -1
  288. data/test/generators/scaffold_generator_test.rb +2 -2
  289. data/test/helpers/cms_helper_test.rb +52 -73
  290. data/test/integration/access_control_test.rb +35 -28
  291. data/test/integration/js_variables_test.rb +1 -2
  292. data/test/integration/render_cms_test.rb +37 -37
  293. data/test/integration/routing_test.rb +4 -5
  294. data/test/integration/seeds_test.rb +76 -0
  295. data/test/integration/sites_test.rb +35 -49
  296. data/test/integration/view_hooks_test.rb +12 -13
  297. data/test/lib/configuration_test.rb +3 -4
  298. data/test/lib/content/block_test.rb +26 -0
  299. data/test/lib/content/params_parser_test.rb +125 -0
  300. data/test/lib/content/renderer_test.rb +240 -0
  301. data/test/lib/content/tag_test.rb +48 -0
  302. data/test/lib/content/tags/asset_test.rb +79 -0
  303. data/test/lib/content/tags/checkbox_test.rb +20 -0
  304. data/test/lib/content/tags/date_test.rb +20 -0
  305. data/test/lib/content/tags/datetime_test.rb +20 -0
  306. data/test/lib/content/tags/file_link_test.rb +78 -0
  307. data/test/lib/content/tags/file_test.rb +60 -0
  308. data/test/lib/content/tags/files_test.rb +49 -0
  309. data/test/lib/content/tags/fragment_test.rb +63 -0
  310. data/test/lib/content/tags/helper_test.rb +52 -0
  311. data/test/lib/content/tags/markdown_test.rb +33 -0
  312. data/test/lib/content/tags/number_test.rb +13 -0
  313. data/test/lib/content/tags/partial_test.rb +43 -0
  314. data/test/lib/content/tags/snippet_test.rb +36 -0
  315. data/test/lib/content/tags/template_test.rb +35 -0
  316. data/test/lib/content/tags/text_test.rb +13 -0
  317. data/test/lib/content/tags/textarea_test.rb +13 -0
  318. data/test/lib/content/tags/wysiwyg_test.rb +13 -0
  319. data/test/lib/revisions_test.rb +146 -111
  320. data/test/lib/seeds/files_test.rb +96 -0
  321. data/test/lib/seeds/layouts_test.rb +155 -0
  322. data/test/lib/seeds/pages_test.rb +227 -0
  323. data/test/lib/seeds/snippets_test.rb +98 -0
  324. data/test/lib/seeds_test.rb +50 -0
  325. data/test/models/categorization_test.rb +37 -38
  326. data/test/models/category_test.rb +14 -14
  327. data/test/models/file_test.rb +23 -96
  328. data/test/models/fragment_test.rb +131 -0
  329. data/test/models/layout_test.rb +105 -74
  330. data/test/models/page_test.rb +352 -97
  331. data/test/models/site_test.rb +101 -90
  332. data/test/models/snippet_test.rb +29 -23
  333. data/test/models/translation_test.rb +60 -0
  334. data/test/tasks/cms_seeds_test.rb +33 -0
  335. data/test/test_helper.rb +49 -32
  336. metadata +235 -210
  337. data/_config.yml +0 -1
  338. data/app/assets/images/comfy/admin/cms/arrow_bottom.gif +0 -0
  339. data/app/assets/images/comfy/admin/cms/arrow_right.gif +0 -0
  340. data/app/assets/images/comfy/admin/cms/checkerboard.gif +0 -0
  341. data/app/assets/images/comfy/admin/cms/icon_draft.gif +0 -0
  342. data/app/assets/images/comfy/admin/cms/icon_file.gif +0 -0
  343. data/app/assets/images/comfy/admin/cms/icon_layout.gif +0 -0
  344. data/app/assets/images/comfy/admin/cms/icon_move.gif +0 -0
  345. data/app/assets/images/comfy/admin/cms/icon_page.gif +0 -0
  346. data/app/assets/images/comfy/admin/cms/icon_site.gif +0 -0
  347. data/app/assets/images/comfy/admin/cms/icon_snippet.gif +0 -0
  348. data/app/assets/javascripts/comfy/admin/cms/lib/bootstrap-datetimepicker.js +0 -29
  349. data/app/assets/javascripts/comfy/admin/cms/lib/diff.js.coffee +0 -9
  350. data/app/assets/javascripts/comfy/admin/cms/lib/diff/pretty_text_diff.min.js +0 -5
  351. data/app/assets/stylesheets/comfy/admin/cms/bootstrap_overrides.sass +0 -32
  352. data/app/assets/stylesheets/comfy/admin/cms/lib/bootstrap-datetimepicker.css +0 -9
  353. data/app/models/comfy/cms/block.rb +0 -63
  354. data/app/views/comfy/admin/cms/files/_page_form.html.haml +0 -10
  355. data/app/views/comfy/admin/cms/pages/_form_blocks.html.haml +0 -32
  356. data/app/views/comfy/admin/cms/pages/form_blocks.js.erb +0 -1
  357. data/app/views/comfy/admin/cms/partials/_body_before.html.haml +0 -3
  358. data/app/views/comfy/admin/cms/partials/_file_form_after.html.haml +0 -3
  359. data/app/views/comfy/admin/cms/partials/_file_form_before.html.haml +0 -3
  360. data/app/views/comfy/admin/cms/partials/_files_after.html.haml +0 -3
  361. data/app/views/comfy/admin/cms/partials/_files_before.html.haml +0 -3
  362. data/app/views/comfy/admin/cms/partials/_html_footer.html.haml +0 -2
  363. data/app/views/comfy/admin/cms/partials/_html_head.html.haml +0 -2
  364. data/app/views/comfy/admin/cms/partials/_layout_form_after.html.haml +0 -3
  365. data/app/views/comfy/admin/cms/partials/_layout_form_before.html.haml +0 -3
  366. data/app/views/comfy/admin/cms/partials/_layouts_after.html.haml +0 -3
  367. data/app/views/comfy/admin/cms/partials/_layouts_before.html.haml +0 -3
  368. data/app/views/comfy/admin/cms/partials/_navigation_after.html.haml +0 -3
  369. data/app/views/comfy/admin/cms/partials/_navigation_before.html.haml +0 -3
  370. data/app/views/comfy/admin/cms/partials/_navigation_inner.html.haml +0 -3
  371. data/app/views/comfy/admin/cms/partials/_page_form_after.html.haml +0 -3
  372. data/app/views/comfy/admin/cms/partials/_page_form_before.html.haml +0 -3
  373. data/app/views/comfy/admin/cms/partials/_page_form_inner.html.haml +0 -3
  374. data/app/views/comfy/admin/cms/partials/_pages_after.html.haml +0 -3
  375. data/app/views/comfy/admin/cms/partials/_pages_before.html.haml +0 -3
  376. data/app/views/comfy/admin/cms/partials/_right_column_after.html.haml +0 -3
  377. data/app/views/comfy/admin/cms/partials/_right_column_before.html.haml +0 -3
  378. data/app/views/comfy/admin/cms/partials/_site_form_after.html.haml +0 -3
  379. data/app/views/comfy/admin/cms/partials/_site_form_before.html.haml +0 -3
  380. data/app/views/comfy/admin/cms/partials/_sites_after.html.haml +0 -3
  381. data/app/views/comfy/admin/cms/partials/_sites_before.html.haml +0 -3
  382. data/app/views/comfy/admin/cms/partials/_snippet_form_after.html.haml +0 -3
  383. data/app/views/comfy/admin/cms/partials/_snippet_form_before.html.haml +0 -3
  384. data/app/views/comfy/admin/cms/partials/_snippets_after.html.haml +0 -3
  385. data/app/views/comfy/admin/cms/partials/_snippets_before.html.haml +0 -3
  386. data/app/views/comfy/admin/cms/sites/_mirrors.html.haml +0 -18
  387. data/app/views/comfy/cms/content/render_sitemap.xml.builder +0 -14
  388. data/app/views/layouts/comfy/admin/cms/_footer.html.haml +0 -3
  389. data/config/initializers/paperclip.rb +0 -3
  390. data/config/initializers/secret_token.rb +0 -15
  391. data/db/cms_fixtures/sample-site/categories/files.yml +0 -1
  392. data/db/cms_fixtures/sample-site/categories/pages.yml +0 -1
  393. data/db/cms_fixtures/sample-site/categories/snippets.yml +0 -1
  394. data/db/cms_fixtures/sample-site/files/_sample.jpg.yml +0 -5
  395. data/db/cms_fixtures/sample-site/layouts/default/attributes.yml +0 -1
  396. data/db/cms_fixtures/sample-site/layouts/default/content.html +0 -5
  397. data/db/cms_fixtures/sample-site/layouts/default/javascript.js +0 -1
  398. data/db/cms_fixtures/sample-site/layouts/default/nested/attributes.yml +0 -2
  399. data/db/cms_fixtures/sample-site/layouts/default/nested/content.haml +0 -3
  400. data/db/cms_fixtures/sample-site/layouts/default/nested/javascript.js +0 -1
  401. data/db/cms_fixtures/sample-site/layouts/default/nested/stylesheet.css +0 -1
  402. data/db/cms_fixtures/sample-site/layouts/default/stylesheet.css +0 -1
  403. data/db/cms_fixtures/sample-site/pages/index/attributes.yml +0 -6
  404. data/db/cms_fixtures/sample-site/pages/index/child/attributes.yml +0 -3
  405. data/db/cms_fixtures/sample-site/pages/index/child/left.haml +0 -1
  406. data/db/cms_fixtures/sample-site/pages/index/child/right.html +0 -1
  407. data/db/cms_fixtures/sample-site/pages/index/content.html +0 -2
  408. data/db/cms_fixtures/sample-site/snippets/default/attributes.yml +0 -4
  409. data/db/cms_fixtures/sample-site/snippets/default/content.html +0 -1
  410. data/db/seeds.rb +0 -7
  411. data/db/upgrade_migrations/02_upgrade_to_1_1_0.rb +0 -19
  412. data/db/upgrade_migrations/03_upgrade_to_1_2_0.rb +0 -15
  413. data/db/upgrade_migrations/04_upgrade_to_1_3_0.rb +0 -23
  414. data/db/upgrade_migrations/05_upgrade_to_1_4_0.rb +0 -33
  415. data/db/upgrade_migrations/06_upgrade_to_1_5_0.rb +0 -21
  416. data/db/upgrade_migrations/07_upgrade_to_1_6_0.rb +0 -25
  417. data/db/upgrade_migrations/08_upgrade_to_1_12_0.rb +0 -83
  418. data/doc/preview.png +0 -0
  419. data/lib/comfortable_mexican_sofa/extensions/cms_manageable.rb +0 -106
  420. data/lib/comfortable_mexican_sofa/extensions/is_categorized.rb +0 -49
  421. data/lib/comfortable_mexican_sofa/extensions/is_mirrored.rb +0 -86
  422. data/lib/comfortable_mexican_sofa/extensions/rails.rb +0 -17
  423. data/lib/comfortable_mexican_sofa/fixture.rb +0 -82
  424. data/lib/comfortable_mexican_sofa/fixture/category.rb +0 -42
  425. data/lib/comfortable_mexican_sofa/fixture/file.rb +0 -85
  426. data/lib/comfortable_mexican_sofa/fixture/layout.rb +0 -95
  427. data/lib/comfortable_mexican_sofa/fixture/page.rb +0 -129
  428. data/lib/comfortable_mexican_sofa/fixture/snippet.rb +0 -75
  429. data/lib/comfortable_mexican_sofa/tag.rb +0 -154
  430. data/lib/comfortable_mexican_sofa/tags/asset.rb +0 -30
  431. data/lib/comfortable_mexican_sofa/tags/collection.rb +0 -64
  432. data/lib/comfortable_mexican_sofa/tags/field_boolean.rb +0 -17
  433. data/lib/comfortable_mexican_sofa/tags/field_datetime.rb +0 -17
  434. data/lib/comfortable_mexican_sofa/tags/field_integer.rb +0 -17
  435. data/lib/comfortable_mexican_sofa/tags/field_rich_text.rb +0 -17
  436. data/lib/comfortable_mexican_sofa/tags/field_string.rb +0 -17
  437. data/lib/comfortable_mexican_sofa/tags/field_text.rb +0 -17
  438. data/lib/comfortable_mexican_sofa/tags/file.rb +0 -29
  439. data/lib/comfortable_mexican_sofa/tags/helper.rb +0 -24
  440. data/lib/comfortable_mexican_sofa/tags/page_datetime.rb +0 -13
  441. data/lib/comfortable_mexican_sofa/tags/page_file.rb +0 -62
  442. data/lib/comfortable_mexican_sofa/tags/page_files.rb +0 -51
  443. data/lib/comfortable_mexican_sofa/tags/page_integer.rb +0 -13
  444. data/lib/comfortable_mexican_sofa/tags/page_markdown.rb +0 -16
  445. data/lib/comfortable_mexican_sofa/tags/page_rich_text.rb +0 -13
  446. data/lib/comfortable_mexican_sofa/tags/page_string.rb +0 -13
  447. data/lib/comfortable_mexican_sofa/tags/page_text.rb +0 -13
  448. data/lib/comfortable_mexican_sofa/tags/partial.rb +0 -23
  449. data/lib/comfortable_mexican_sofa/tags/snippet.rb +0 -19
  450. data/lib/comfortable_mexican_sofa/tags/template.rb +0 -22
  451. data/lib/generators/comfy/scaffold/templates/views/_form.haml +0 -6
  452. data/lib/generators/comfy/scaffold/templates/views/index.haml +0 -23
  453. data/lib/tasks/comfortable_mexican_sofa.rake +0 -37
  454. data/test/fixtures/comfy/cms/blocks.yml +0 -12
  455. data/test/gemfiles/Gemfile.rails.4.1 +0 -22
  456. data/test/gemfiles/Gemfile.rails.4.2 +0 -22
  457. data/test/gemfiles/Gemfile.rails.5.0 +0 -23
  458. data/test/gemfiles/Gemfile.rails.master +0 -23
  459. data/test/integration/fixtures_test.rb +0 -65
  460. data/test/integration/mirrors_test.rb +0 -72
  461. data/test/lib/fixtures/categories_test.rb +0 -36
  462. data/test/lib/fixtures/files_test.rb +0 -109
  463. data/test/lib/fixtures/layouts_test.rb +0 -135
  464. data/test/lib/fixtures/pages_test.rb +0 -168
  465. data/test/lib/fixtures/snippets_test.rb +0 -106
  466. data/test/lib/fixtures_test.rb +0 -43
  467. data/test/lib/mirrors_test.rb +0 -254
  468. data/test/lib/tag_test.rb +0 -309
  469. data/test/lib/tags/asset_test.rb +0 -95
  470. data/test/lib/tags/collection_test.rb +0 -117
  471. data/test/lib/tags/field_boolean_test.rb +0 -49
  472. data/test/lib/tags/field_datetime_test.rb +0 -50
  473. data/test/lib/tags/field_integer_test.rb +0 -49
  474. data/test/lib/tags/field_rich_text_test.rb +0 -49
  475. data/test/lib/tags/field_string_test.rb +0 -52
  476. data/test/lib/tags/field_text_test.rb +0 -48
  477. data/test/lib/tags/file_test.rb +0 -67
  478. data/test/lib/tags/helper_test.rb +0 -86
  479. data/test/lib/tags/page_datetime_test.rb +0 -50
  480. data/test/lib/tags/page_file_test.rb +0 -119
  481. data/test/lib/tags/page_files_test.rb +0 -117
  482. data/test/lib/tags/page_integer_test.rb +0 -49
  483. data/test/lib/tags/page_markdown_test.rb +0 -48
  484. data/test/lib/tags/page_rich_text_test.rb +0 -49
  485. data/test/lib/tags/page_string_test.rb +0 -49
  486. data/test/lib/tags/page_text_test.rb +0 -52
  487. data/test/lib/tags/partial_test.rb +0 -76
  488. data/test/lib/tags/snippet_test.rb +0 -45
  489. data/test/lib/tags/template_test.rb +0 -56
  490. data/test/models/block_test.rb +0 -233
@@ -1,9 +1,9 @@
1
1
  module Comfy::Paginate
2
2
 
3
3
  # Wrapper to deal with WillPaginate vs Kaminari nonsense
4
- def comfy_paginate(scope, per_page = 50)
4
+ def comfy_paginate(scope, per_page: 50)
5
5
  if defined?(WillPaginate)
6
- scope.paginate(:page => params[:page], :per_page => per_page)
6
+ scope.paginate(page: params[:page], per_page: per_page)
7
7
  elsif defined?(Kaminari)
8
8
  scope.page(params[:page]).per(per_page)
9
9
  else
@@ -0,0 +1,29 @@
1
+ module Comfy
2
+ module Admin
3
+ module CmsHelper
4
+
5
+ # Wrapper around ComfortableMexicanSofa::FormBuilder
6
+ def comfy_form_for(record, options = {}, &block)
7
+ options[:builder] = ComfortableMexicanSofa::FormBuilder
8
+ options[:layout] ||= :horizontal
9
+ bootstrap_form_for(record, options, &block)
10
+ end
11
+
12
+ def comfy_admin_partial(path, params = {})
13
+ render path, params
14
+ rescue ActionView::MissingTemplate
15
+ if ComfortableMexicanSofa.config.reveal_cms_partials
16
+ content_tag(:div, class: "comfy-admin-partial") do
17
+ path
18
+ end
19
+ end
20
+ end
21
+
22
+ # Injects some content somewhere inside cms admin area
23
+ def cms_hook(name, options = {})
24
+ ComfortableMexicanSofa::ViewHooks.render(name, self, options)
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -1,75 +1,54 @@
1
1
  module Comfy
2
2
  module CmsHelper
3
3
 
4
- # Wrapper around ComfortableMexicanSofa::FormBuilder
5
- def comfy_form_for(record, options = {}, &proc)
6
- options[:builder] = ComfortableMexicanSofa::FormBuilder
7
- options[:layout] ||= :horizontal
8
- bootstrap_form_for(record, options, &proc)
4
+ # Raw content of a page fragment. This is how you get content from unrenderable
5
+ # tags like {{cms:fragment meta, render: false}}
6
+ # Example:
7
+ # cms_fragment_content(:left_column, CmsPage.first)
8
+ # cms_fragment_content(:left_column) # if @cms_page is present
9
+ def cms_fragment_content(identifier, page = @cms_page)
10
+ frag = page && page.fragments.detect{|f| f.identifier == identifier.to_s}
11
+ return "" unless frag
12
+ case frag.tag
13
+ when "date", "datetime"
14
+ frag.datetime
15
+ when "checkbox"
16
+ frag.boolean
17
+ when "file", "files"
18
+ frag.attachments
19
+ else
20
+ frag.content
21
+ end
9
22
  end
10
23
 
11
- # Injects some content somewhere inside cms admin area
12
- def cms_hook(name, options = {})
13
- ComfortableMexicanSofa::ViewHooks.render(name, self, options)
24
+ # Same as cms_fragment_content but with cms tags expanded and rendered. Use
25
+ # it only if you know you got more stuff in the fragment content other than
26
+ # text because this is a potentially expensive call.
27
+ def cms_fragment_render(identifier, page = @cms_page)
28
+ node = page.fragment_nodes.detect{|n| n.identifier == identifier.to_s}
29
+ return "" unless node
30
+ render inline: page.render([node])
14
31
  end
15
32
 
16
- # Content of a snippet. Examples:
33
+ # Raw content of a snippet.
34
+ # Example:
17
35
  # cms_snippet_content(:my_snippet)
18
- # <%= cms_snippet_content(:my_snippet) do %>
19
- # Default content can go here.
20
- # <% end %>
21
- def cms_snippet_content(identifier, cms_site = @cms_site, &block)
36
+ def cms_snippet_content(identifier, cms_site = @cms_site)
22
37
  unless cms_site
23
38
  host, path = request.host_with_port.downcase, request.fullpath if respond_to?(:request) && request
24
39
  cms_site = Comfy::Cms::Site.find_site(host, path)
25
40
  end
26
- return '' unless cms_site
27
-
28
- snippet = cms_site.snippets.find_by_identifier(identifier)
29
-
30
- if !snippet && block_given?
31
- snippet = cms_site.snippets.create(
32
- :identifier => identifier,
33
- :label => identifier.to_s.titleize,
34
- :content => capture(&block)
35
- )
36
- end
37
-
38
- snippet ? snippet.content : ''
41
+ snippet = cms_site && cms_site.snippets.find_by_identifier(identifier)
42
+ return "" unless snippet
43
+ snippet.content
39
44
  end
40
45
 
41
- # Same as cms_snippet_content but cms tags will be expanded
42
- def cms_snippet_render(identifier, cms_site = @cms_site, &block)
43
- return '' unless cms_site
44
- content = cms_snippet_content(identifier, cms_site, &block)
45
- render :inline => ComfortableMexicanSofa::Tag.process_content(
46
- cms_site.pages.build, ComfortableMexicanSofa::Tag.sanitize_irb(content)
47
- )
48
- end
49
-
50
- # Content of a page block. This is how you get content from page:field
51
- # Example:
52
- # cms_block_content(:left_column, CmsPage.first)
53
- # cms_block_content(:left_column) # if @cms_page is present
54
- def cms_block_content(identifier, blockable = @cms_page)
55
- tag = blockable && (block = blockable.blocks.find_by_identifier(identifier)) && block.tag
56
- return '' unless tag
57
- tag.content
58
- end
59
-
60
- # For those times when we need to render content that shouldn't be renderable
61
- # Example: {{cms:field}} tags
62
- def cms_block_content_render(identifier, blockable = @cms_page)
63
- tag = blockable && (block = blockable.blocks.find_by_identifier(identifier)) && block.tag
64
- return '' unless tag
65
- render :inline => ComfortableMexicanSofa::Tag.process_content(blockable, tag.content)
66
- end
67
-
68
- # Same as cms_block_content but with cms tags expanded
69
- def cms_block_render(identifier, blockable = @cms_page)
70
- tag = blockable && (block = blockable.blocks.find_by_identifier(identifier)) && block.tag
71
- return '' unless tag
72
- render :inline => ComfortableMexicanSofa::Tag.process_content(blockable, tag.render)
46
+ # Same as cms_snippet_content but cms tags will be expanded. Note that there
47
+ # is no page context, so snippet cannot contain fragment tags.
48
+ def cms_snippet_render(identifier, cms_site = @cms_site)
49
+ content = cms_snippet_content(identifier, cms_site)
50
+ r = ComfortableMexicanSofa::Content::Renderer.new(Comfy::Cms::Page.new)
51
+ render inline: r.render(r.nodes(r.tokenize(content)))
73
52
  end
74
53
 
75
54
  # Wrapper to deal with Kaminari vs WillPaginate
@@ -78,8 +57,9 @@ module Comfy
78
57
  if defined?(WillPaginate)
79
58
  will_paginate collection
80
59
  elsif defined?(Kaminari)
81
- paginate collection, :theme => 'comfy'
60
+ paginate collection, theme: "comfy"
82
61
  end
83
62
  end
63
+
84
64
  end
85
- end
65
+ end
@@ -1,16 +1,13 @@
1
1
  class Comfy::Cms::Categorization < ActiveRecord::Base
2
- self.table_name = 'comfy_cms_categorizations'
3
-
4
- # -- Relationships --------------------------------------------------------
2
+ self.table_name = "comfy_cms_categorizations"
3
+
4
+ # -- Relationships -----------------------------------------------------------
5
5
  belongs_to :category
6
6
  belongs_to :categorized,
7
- :polymorphic => true
8
-
9
- # -- Validations ----------------------------------------------------------
10
- validates :categorized_type, :categorized_id,
11
- :presence => true
7
+ polymorphic: true
8
+
9
+ # -- Validations -------------------------------------------------------------
12
10
  validates :category_id,
13
- :presence => true,
14
- :uniqueness => { :scope => [:categorized_type, :categorized_id] }
15
-
11
+ uniqueness: { scope: [:categorized_type, :categorized_id] }
12
+
16
13
  end
@@ -1,25 +1,21 @@
1
1
  class Comfy::Cms::Category < ActiveRecord::Base
2
- self.table_name = 'comfy_cms_categories'
3
-
2
+ self.table_name = "comfy_cms_categories"
3
+
4
4
  # -- Relationships --------------------------------------------------------
5
5
  belongs_to :site
6
6
  has_many :categorizations,
7
- :dependent => :destroy
8
-
7
+ dependent: :destroy
8
+
9
9
  # -- Validations ----------------------------------------------------------
10
- validates :site_id,
11
- :presence => true
12
10
  validates :label,
13
- :presence => true,
14
- :uniqueness => { :scope => [:categorized_type, :site_id] }
11
+ presence: true,
12
+ uniqueness: { scope: [:categorized_type, :site_id] }
15
13
  validates :categorized_type,
16
- :presence => true
17
-
14
+ presence: true
15
+
18
16
  # -- Scopes ---------------------------------------------------------------
19
- default_scope{ order(:label) }
20
-
21
17
  scope :of_type, lambda { |type|
22
- where(:categorized_type => type)
18
+ where(categorized_type: type)
23
19
  }
24
-
20
+
25
21
  end
@@ -1,68 +1,52 @@
1
1
  class Comfy::Cms::File < ActiveRecord::Base
2
2
  self.table_name = 'comfy_cms_files'
3
3
 
4
- IMAGE_MIMETYPES = %w(gif jpeg pjpeg png tiff).collect{|subtype| "image/#{subtype}"}
4
+ include Comfy::Cms::WithCategories
5
5
 
6
- cms_is_categorized
6
+ VARIANT_SIZE = {
7
+ redactor: {resize: "100x75^", gravity: "center", crop: "100x75+0+0"},
8
+ thumb: {resize: "200x150^", gravity: "center", crop: "200x150+0+0"},
9
+ icon: {resize: "28x28^", gravity: "center", crop: "28x28+0+0"}
10
+ }
7
11
 
8
- attr_accessor :dimensions
12
+ # temporary place to store attachment
13
+ attr_accessor :file
9
14
 
10
- has_attached_file :file, ComfortableMexicanSofa.config.upload_file_options.merge(
11
- # dimensions accessor needs to be set before file assignment for this to work
12
- :styles => lambda { |f|
13
- if f.respond_to?(:instance) && f.instance.respond_to?(:dimensions)
14
- (f.instance.dimensions.blank?? { } : { :original => f.instance.dimensions }).merge(
15
- :cms_thumb => '100x75#'
16
- ).merge(ComfortableMexicanSofa.config.upload_file_options[:styles] || {})
17
- end
18
- }
19
- )
20
- before_post_process :is_image?
15
+ has_one_attached :attachment
21
16
 
22
- # -- Relationships --------------------------------------------------------
17
+ # -- Relationships -----------------------------------------------------------
23
18
  belongs_to :site
24
- belongs_to :block
25
19
 
26
- # -- Validations ----------------------------------------------------------
27
- validates :site_id,
28
- :presence => true
29
- validates_attachment_presence :file
30
- do_not_validate_attachment_file_type :file
31
-
32
- validates :file_file_name,
33
- :uniqueness => {:scope => [:site_id, :block_id]}
34
-
35
- # -- Callbacks ------------------------------------------------------------
36
- before_save :assign_label
20
+ # -- Callbacks ---------------------------------------------------------------
37
21
  before_create :assign_position
38
- after_save :reload_blockable_cache
39
- after_destroy :reload_blockable_cache
40
-
41
- # -- Scopes ---------------------------------------------------------------
42
- scope :not_page_file, -> { where(:block_id => nil)}
43
- scope :images, -> { where(:file_content_type => IMAGE_MIMETYPES) }
44
- scope :not_images, -> { where('file_content_type NOT IN (?)', IMAGE_MIMETYPES) }
45
-
46
- # -- Instance Methods -----------------------------------------------------
47
- def is_image?
48
- IMAGE_MIMETYPES.include?(file_content_type)
22
+ after_save :process_attachment
23
+
24
+ # -- Validations -------------------------------------------------------------
25
+ validates :file, presence: true, on: :create
26
+
27
+ # -- Scopes ------------------------------------------------------------------
28
+ # When we need to grab only files with image attachments.
29
+ # Don't forget to include `with_attached_attachment` before calling this
30
+ scope :with_images, -> {
31
+ where("active_storage_blobs.content_type LIKE 'image/%'").references(:blob)
32
+ }
33
+
34
+ # -- Instance Methods --------------------------------------------------------
35
+ def label
36
+ l = read_attribute(:label)
37
+ return l if l.present?
38
+ attachment.attached?? attachment.filename.to_s : nil
49
39
  end
50
40
 
51
41
  protected
52
42
 
53
- def assign_label
54
- self.label = self.label.blank?? self.file_file_name.gsub(/\.[^\.]*?$/, '').titleize : self.label
55
- end
56
-
57
43
  def assign_position
58
44
  max = Comfy::Cms::File.maximum(:position)
59
45
  self.position = max ? max + 1 : 0
60
46
  end
61
47
 
62
- def reload_blockable_cache
63
- return unless self.block
64
- b = self.block.blockable
65
- b.class.name.constantize.where(:id => b.id).update_all(:content_cache => nil)
48
+ def process_attachment
49
+ return if @file.blank?
50
+ self.attachment.attach(@file)
66
51
  end
67
-
68
52
  end
@@ -0,0 +1,55 @@
1
+ class Comfy::Cms::Fragment < ActiveRecord::Base
2
+ self.table_name = 'comfy_cms_fragments'
3
+
4
+ has_many_attached :attachments
5
+
6
+ serialize :content
7
+
8
+ attr_reader :files
9
+
10
+ # -- Callbacks ---------------------------------------------------------------
11
+ after_save :remove_attachments,
12
+ :add_attachments
13
+
14
+ # -- Relationships -----------------------------------------------------------
15
+ belongs_to :record, polymorphic: true, touch: true
16
+
17
+ # -- Validations -------------------------------------------------------------
18
+ validates :identifier,
19
+ presence: true,
20
+ uniqueness: {scope: :record}
21
+
22
+ # -- Instance Methods --------------------------------------------------------
23
+
24
+ # Temporary accessor for uploaded files. We can only attach to persisted
25
+ # records so we are deffering it to the after_save callback.
26
+ # Note: hijacking dirty tracking to force trigger callbacks later.
27
+ def files=(files)
28
+ @files = [files].flatten.compact
29
+ content_will_change! if @files.present?
30
+ end
31
+
32
+ def file_ids_destroy=(ids)
33
+ @file_ids_destroy = [ids].flatten.compact
34
+ content_will_change! if @file_ids_destroy.present?
35
+ end
36
+
37
+ protected
38
+
39
+ def remove_attachments
40
+ return unless @file_ids_destroy.present?
41
+ self.attachments.where(id: @file_ids_destroy).destroy_all
42
+ end
43
+
44
+ def add_attachments
45
+ return if @files.blank?
46
+
47
+ # If we're dealing with a single file
48
+ if self.tag == "file"
49
+ @files = [@files.first]
50
+ self.attachments.purge_later if self.attachments
51
+ end
52
+
53
+ self.attachments.attach(@files)
54
+ end
55
+ end
@@ -2,35 +2,31 @@
2
2
 
3
3
  class Comfy::Cms::Layout < ActiveRecord::Base
4
4
  self.table_name = 'comfy_cms_layouts'
5
-
5
+
6
6
  cms_acts_as_tree
7
- cms_is_mirrored
8
7
  cms_has_revisions_for :content, :css, :js
9
-
8
+
10
9
  # -- Relationships --------------------------------------------------------
11
10
  belongs_to :site
12
- has_many :pages, :dependent => :nullify
13
-
14
- # -- Callbacks ------------------------------------------------------------
11
+ has_many :pages, dependent: :nullify
12
+
13
+ # -- Callbacks ---------------------------------------------------------------
15
14
  before_validation :assign_label
16
15
  before_create :assign_position
17
16
  after_save :clear_page_content_cache
18
17
  after_destroy :clear_page_content_cache
19
-
20
- # -- Validations ----------------------------------------------------------
18
+
19
+ # -- Validations -------------------------------------------------------------
21
20
  validates :site_id,
22
- :presence => true
21
+ presence: true
23
22
  validates :label,
24
- :presence => true
23
+ presence: true
25
24
  validates :identifier,
26
- :presence => true,
27
- :uniqueness => { :scope => :site_id },
28
- :format => { :with => /\A\w[a-z0-9_-]*\z/i }
29
-
30
- # -- Scopes ---------------------------------------------------------------
31
- default_scope -> { order('comfy_cms_layouts.position') }
32
-
33
- # -- Class Methods --------------------------------------------------------
25
+ presence: true,
26
+ uniqueness: {scope: :site_id},
27
+ format: {with: /\A\w[a-z0-9_-]*\z/i}
28
+
29
+ # -- Class Methods -----------------------------------------------------------
34
30
  # Tree-like structure for layouts
35
31
  def self.options_for_select(site, layout = nil, current_layout = nil, depth = 0, spacer = '. . ')
36
32
  out = []
@@ -43,7 +39,7 @@ class Comfy::Cms::Layout < ActiveRecord::Base
43
39
  end
44
40
  return out.compact
45
41
  end
46
-
42
+
47
43
  # List of available application layouts
48
44
  def self.app_layouts_for_select(view_paths)
49
45
  view_paths.map(&:to_s).select { |path| path.start_with?(Rails.root.to_s) }.flat_map do |full_path|
@@ -51,46 +47,55 @@ class Comfy::Cms::Layout < ActiveRecord::Base
51
47
  filename.gsub!("#{full_path}/layouts/", '')
52
48
  filename.split('/').last[0...1] == '_' ? nil : filename.split('.').first
53
49
  end.compact.sort
54
- end.compact.sort
50
+ end.compact.uniq.sort
55
51
  end
56
-
57
- # -- Instance Methods -----------------------------------------------------
58
- # magical merging tag is {cms:page:content} If parent layout has this tag
59
- # defined its content will be merged. If no such tag found, parent content
60
- # is ignored.
61
- def merged_content
52
+
53
+ # -- Instance Methods --------------------------------------------------------
54
+ # Tokenized layout content that also pulls in parent layout (if there's one)
55
+ # and merges on the {{cms:fragment content}} tag (if parent layout has that).
56
+ # Returns a list of tokens that can be fed into the renderer.
57
+ def content_tokens
58
+
59
+ renderer = ComfortableMexicanSofa::Content::Renderer.new(nil)
60
+ tokens = renderer.tokenize(self.content)
62
61
  if parent
63
- regex = /\{\{\s*cms:page:content:?(?:(?::text)|(?::rich_text))?\s*\}\}/
64
- if parent.merged_content.match(regex)
65
- parent.merged_content.gsub(regex, content.to_s)
66
- else
67
- content.to_s
62
+ fragment_tags = ComfortableMexicanSofa::Content::Tag::Fragment.subclasses.map do |c|
63
+ c.to_s.demodulize.underscore
64
+ end
65
+ parent_tokens = parent.content_tokens
66
+ replacement_position = parent_tokens.index do |n|
67
+ n.is_a?(Hash) &&
68
+ fragment_tags.member?(n[:tag_class]) &&
69
+ n[:tag_params].split(/\s/).first == "content"
70
+ end
71
+ if replacement_position
72
+ parent_tokens[replacement_position] = tokens
73
+ tokens = parent_tokens.flatten
68
74
  end
69
- else
70
- content.to_s
71
75
  end
76
+
77
+ return tokens
72
78
  end
73
79
 
74
80
  def cache_buster
75
81
  updated_at.to_i
76
82
  end
77
-
83
+
78
84
  protected
79
-
85
+
80
86
  def assign_label
81
87
  self.label = self.label.blank?? self.identifier.try(:titleize) : self.label
82
88
  end
83
-
89
+
84
90
  def assign_position
85
91
  return if self.position.to_i > 0
86
- max = self.site.layouts.where(:parent_id => self.parent_id).maximum(:position)
92
+ max = self.site.layouts.where(parent_id: self.parent_id).maximum(:position)
87
93
  self.position = max ? max + 1 : 0
88
94
  end
89
-
95
+
90
96
  # Forcing page content reload
91
97
  def clear_page_content_cache
92
- Comfy::Cms::Page.where(:id => self.pages.pluck(:id)).update_all(:content_cache => nil)
98
+ Comfy::Cms::Page.where(id: self.pages.pluck(:id)).update_all(content_cache: nil)
93
99
  self.children.each{ |child_layout| child_layout.clear_page_content_cache }
94
100
  end
95
-
96
101
  end