constructor-cms 0.5.7 → 0.5.8

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 (289) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +13 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +9 -0
  5. data/.yardopts +9 -0
  6. data/Gemfile +20 -0
  7. data/Guardfile +17 -0
  8. data/Rakefile +17 -0
  9. data/config.ru +4 -0
  10. data/constructor-cms.gemspec +28 -0
  11. data/core/app/assets/images/constructor_core/glyphicons-halflings-white.png +0 -0
  12. data/core/app/assets/images/constructor_core/glyphicons-halflings.png +0 -0
  13. data/core/app/assets/images/constructor_core/minus.gif +0 -0
  14. data/core/app/assets/images/constructor_core/plus.gif +0 -0
  15. data/core/app/assets/images/constructor_core/rss.png +0 -0
  16. data/core/app/assets/images/constructor_core/treeview-black-line.gif +0 -0
  17. data/core/app/assets/images/constructor_core/treeview-black.gif +0 -0
  18. data/core/app/assets/images/constructor_core/treeview-default-line.gif +0 -0
  19. data/core/app/assets/images/constructor_core/treeview-default.gif +0 -0
  20. data/core/app/assets/images/constructor_core/treeview-famfamfam-line.gif +0 -0
  21. data/core/app/assets/images/constructor_core/treeview-famfamfam.gif +0 -0
  22. data/core/app/assets/images/constructor_core/treeview-gray-line.gif +0 -0
  23. data/core/app/assets/images/constructor_core/treeview-gray.gif +0 -0
  24. data/core/app/assets/images/constructor_core/treeview-red-line.gif +0 -0
  25. data/core/app/assets/images/constructor_core/treeview-red.gif +0 -0
  26. data/core/app/assets/images/constructor_core/twitter.png +0 -0
  27. data/core/app/assets/images/constructor_core/widgets.png +0 -0
  28. data/core/app/assets/javascripts/constructor_core/application.js.coffee +52 -0
  29. data/core/app/assets/javascripts/constructor_core/bootstrap.js +2276 -0
  30. data/core/app/assets/javascripts/constructor_core/jquery.cookie.js +92 -0
  31. data/core/app/assets/javascripts/constructor_core/jquery_bundle.js.coffee +3 -0
  32. data/core/app/assets/javascripts/constructor_core/keys_snippet.js +33 -0
  33. data/core/app/assets/javascripts/constructor_core/retina.js +148 -0
  34. data/core/app/assets/javascripts/constructor_core/urlify.js +82 -0
  35. data/core/app/assets/stylesheets/constructor_core/application.css.scss +3 -0
  36. data/core/app/assets/stylesheets/constructor_core/main.css.scss +229 -0
  37. data/core/app/controllers/constructor_core/application_controller.rb +31 -0
  38. data/core/app/controllers/constructor_core/sessions_controller.rb +15 -0
  39. data/core/app/controllers/constructor_core/users_controller.rb +26 -0
  40. data/core/app/helpers/constructor_core/application_helper.rb +9 -0
  41. data/core/app/models/constructor_core/user.rb +8 -0
  42. data/core/app/views/constructor_core/devise/confirmations/new.html.haml +10 -0
  43. data/core/app/views/constructor_core/devise/mailer/confirmation_instructions.html.haml +5 -0
  44. data/core/app/views/constructor_core/devise/mailer/reset_password_instructions.html.haml +7 -0
  45. data/core/app/views/constructor_core/devise/mailer/unlock_instructions.html.haml +5 -0
  46. data/core/app/views/constructor_core/devise/passwords/edit.html.haml +21 -0
  47. data/core/app/views/constructor_core/devise/passwords/new.html.haml +13 -0
  48. data/core/app/views/constructor_core/devise/registrations/edit.html.haml +28 -0
  49. data/core/app/views/constructor_core/devise/registrations/new.html.haml +20 -0
  50. data/core/app/views/constructor_core/devise/shared/_links.html.haml +19 -0
  51. data/core/app/views/constructor_core/devise/unlocks/new.html.haml +9 -0
  52. data/core/app/views/constructor_core/sessions/new.html.haml +22 -0
  53. data/core/app/views/constructor_core/users/profile.haml +16 -0
  54. data/core/app/views/layouts/constructor_core/application.haml +93 -0
  55. data/core/config/environments/production.rb +3 -0
  56. data/core/config/initializers/devise.rb +15 -0
  57. data/core/config/locales/devise.en.yml +56 -0
  58. data/core/config/locales/devise.ru.yml +52 -0
  59. data/core/config/locales/en.yml +15 -0
  60. data/core/config/locales/ru.yml +27 -0
  61. data/core/config/routes.rb +18 -0
  62. data/core/constructor-core.gemspec +24 -0
  63. data/core/db/migrate/1_devise_users.rb +24 -0
  64. data/core/db/migrate/2_add_default_user.rb +9 -0
  65. data/core/lib/constructor-core.rb +25 -0
  66. data/core/lib/constructor_core/engine.rb +6 -0
  67. data/core/lib/constructor_core/version.rb +3 -0
  68. data/core/vendor/assets/javascripts/.gitkeep +0 -0
  69. data/core/vendor/assets/javascripts/ckeditor/ckeditor.js +913 -0
  70. data/core/vendor/assets/javascripts/ckeditor/config.js +38 -0
  71. data/core/vendor/assets/javascripts/ckeditor/lang/en.js +5 -0
  72. data/core/vendor/assets/javascripts/ckeditor/lang/ru.js +5 -0
  73. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +10 -0
  74. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt +25 -0
  75. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js +9 -0
  76. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js +9 -0
  77. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js +9 -0
  78. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js +10 -0
  79. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js +9 -0
  80. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/da.js +9 -0
  81. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/de.js +10 -0
  82. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/el.js +10 -0
  83. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/en.js +9 -0
  84. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js +10 -0
  85. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/es.js +10 -0
  86. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/et.js +9 -0
  87. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js +9 -0
  88. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js +10 -0
  89. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js +10 -0
  90. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js +9 -0
  91. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/he.js +9 -0
  92. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js +9 -0
  93. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js +9 -0
  94. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js +9 -0
  95. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/it.js +10 -0
  96. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js +9 -0
  97. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/km.js +9 -0
  98. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js +10 -0
  99. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js +9 -0
  100. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js +10 -0
  101. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js +9 -0
  102. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js +9 -0
  103. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js +9 -0
  104. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js +10 -0
  105. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/no.js +9 -0
  106. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js +10 -0
  107. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js +9 -0
  108. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js +9 -0
  109. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js +9 -0
  110. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js +9 -0
  111. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js +10 -0
  112. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js +9 -0
  113. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js +10 -0
  114. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/th.js +9 -0
  115. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js +10 -0
  116. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js +9 -0
  117. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js +9 -0
  118. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js +9 -0
  119. data/core/vendor/assets/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js +7 -0
  120. data/core/vendor/assets/javascripts/ckeditor/plugins/about/dialogs/about.js +6 -0
  121. data/core/vendor/assets/javascripts/ckeditor/plugins/about/dialogs/logo_ckeditor.png +0 -0
  122. data/core/vendor/assets/javascripts/ckeditor/plugins/clipboard/dialogs/paste.js +11 -0
  123. data/core/vendor/assets/javascripts/ckeditor/plugins/colordialog/dialogs/colordialog.js +13 -0
  124. data/core/vendor/assets/javascripts/ckeditor/plugins/dialog/dialogDefinition.js +4 -0
  125. data/core/vendor/assets/javascripts/ckeditor/plugins/div/dialogs/div.js +9 -0
  126. data/core/vendor/assets/javascripts/ckeditor/plugins/fakeobjects/images/spacer.gif +0 -0
  127. data/core/vendor/assets/javascripts/ckeditor/plugins/find/dialogs/find.js +24 -0
  128. data/core/vendor/assets/javascripts/ckeditor/plugins/icons.png +0 -0
  129. data/core/vendor/assets/javascripts/ckeditor/plugins/iframe/dialogs/iframe.js +10 -0
  130. data/core/vendor/assets/javascripts/ckeditor/plugins/iframe/images/placeholder.png +0 -0
  131. data/core/vendor/assets/javascripts/ckeditor/plugins/image/dialogs/image.js +43 -0
  132. data/core/vendor/assets/javascripts/ckeditor/plugins/image/images/noimage.png +0 -0
  133. data/core/vendor/assets/javascripts/ckeditor/plugins/link/dialogs/anchor.js +8 -0
  134. data/core/vendor/assets/javascripts/ckeditor/plugins/link/dialogs/link.js +36 -0
  135. data/core/vendor/assets/javascripts/ckeditor/plugins/link/images/anchor.png +0 -0
  136. data/core/vendor/assets/javascripts/ckeditor/plugins/liststyle/dialogs/liststyle.js +10 -0
  137. data/core/vendor/assets/javascripts/ckeditor/plugins/magicline/images/icon.png +0 -0
  138. data/core/vendor/assets/javascripts/ckeditor/plugins/pastefromword/filter/default.js +31 -0
  139. data/core/vendor/assets/javascripts/ckeditor/plugins/preview/preview.html +10 -0
  140. data/core/vendor/assets/javascripts/ckeditor/plugins/scayt/LICENSE.md +28 -0
  141. data/core/vendor/assets/javascripts/ckeditor/plugins/scayt/README.md +25 -0
  142. data/core/vendor/assets/javascripts/ckeditor/plugins/scayt/dialogs/options.js +20 -0
  143. data/core/vendor/assets/javascripts/ckeditor/plugins/scayt/dialogs/toolbar.css +71 -0
  144. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_address.png +0 -0
  145. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_blockquote.png +0 -0
  146. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_div.png +0 -0
  147. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h1.png +0 -0
  148. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h2.png +0 -0
  149. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h3.png +0 -0
  150. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h4.png +0 -0
  151. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h5.png +0 -0
  152. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_h6.png +0 -0
  153. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_p.png +0 -0
  154. data/core/vendor/assets/javascripts/ckeditor/plugins/showblocks/images/block_pre.png +0 -0
  155. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt +20 -0
  156. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/ca.js +13 -0
  157. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/cs.js +13 -0
  158. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/cy.js +14 -0
  159. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/de.js +13 -0
  160. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/el.js +13 -0
  161. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/en.js +13 -0
  162. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/eo.js +12 -0
  163. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/et.js +13 -0
  164. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/fa.js +12 -0
  165. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/fi.js +13 -0
  166. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/fr.js +11 -0
  167. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/he.js +13 -0
  168. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/hr.js +13 -0
  169. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/it.js +14 -0
  170. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/ku.js +13 -0
  171. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/lv.js +13 -0
  172. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/nb.js +11 -0
  173. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/nl.js +13 -0
  174. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/no.js +11 -0
  175. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/pl.js +12 -0
  176. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js +11 -0
  177. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/sk.js +13 -0
  178. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/sv.js +11 -0
  179. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/th.js +13 -0
  180. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/tr.js +12 -0
  181. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/ug.js +13 -0
  182. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js +9 -0
  183. data/core/vendor/assets/javascripts/ckeditor/plugins/specialchar/dialogs/specialchar.js +14 -0
  184. data/core/vendor/assets/javascripts/ckeditor/plugins/table/dialogs/table.js +21 -0
  185. data/core/vendor/assets/javascripts/ckeditor/plugins/tabletools/dialogs/tableCell.js +16 -0
  186. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/dialogs/templates.css +84 -0
  187. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/dialogs/templates.js +10 -0
  188. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/templates/default.js +6 -0
  189. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/templates/images/template1.gif +0 -0
  190. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/templates/images/template2.gif +0 -0
  191. data/core/vendor/assets/javascripts/ckeditor/plugins/templates/templates/images/template3.gif +0 -0
  192. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/LICENSE.md +28 -0
  193. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/README.md +25 -0
  194. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/dialogs/ciframe.html +49 -0
  195. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +52 -0
  196. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/dialogs/wsc.css +82 -0
  197. data/core/vendor/assets/javascripts/ckeditor/plugins/wsc/dialogs/wsc.js +11 -0
  198. data/core/vendor/assets/javascripts/ckeditor/styles.js +111 -0
  199. data/core/vendor/assets/stylesheets/.gitkeep +0 -0
  200. data/core/vendor/assets/stylesheets/ckeditor/contents.css +103 -0
  201. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/dialog.css +5 -0
  202. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/dialog_ie.css +5 -0
  203. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/dialog_ie7.css +5 -0
  204. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/dialog_ie8.css +5 -0
  205. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/dialog_opera.css +5 -0
  206. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/editor.css +5 -0
  207. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/editor_gecko.css +5 -0
  208. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/editor_ie.css +5 -0
  209. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/editor_ie7.css +5 -0
  210. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/editor_ie8.css +5 -0
  211. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/icons.png +0 -0
  212. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/images/arrow.png +0 -0
  213. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/images/close.png +0 -0
  214. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/images/mini.png +0 -0
  215. data/core/vendor/assets/stylesheets/ckeditor/skins/moono/readme.md +51 -0
  216. data/pages/app/assets/images/constructor_pages/arrow_down.png +0 -0
  217. data/pages/app/assets/images/constructor_pages/arrow_up.png +0 -0
  218. data/pages/app/assets/images/constructor_pages/information.png +0 -0
  219. data/pages/app/assets/images/constructor_pages/page_white_edit.png +0 -0
  220. data/pages/app/assets/images/constructor_pages/photos.png +0 -0
  221. data/pages/app/assets/javascripts/constructor_pages/ajax_pages.js +61 -0
  222. data/pages/app/assets/javascripts/constructor_pages/jquery.history.js +1 -0
  223. data/pages/app/controllers/constructor_pages/fields_controller.rb +70 -0
  224. data/pages/app/controllers/constructor_pages/pages_controller.rb +144 -0
  225. data/pages/app/controllers/constructor_pages/templates_controller.rb +51 -0
  226. data/pages/app/helpers/constructor_pages/code_name_uniq.rb +9 -0
  227. data/pages/app/helpers/constructor_pages/fields_helper.rb +18 -0
  228. data/pages/app/helpers/constructor_pages/move_helper.rb +14 -0
  229. data/pages/app/helpers/constructor_pages/pages_helper.rb +20 -0
  230. data/pages/app/helpers/constructor_pages/templates_helper.rb +11 -0
  231. data/pages/app/models/constructor_pages/field.rb +89 -0
  232. data/pages/app/models/constructor_pages/page.rb +190 -0
  233. data/pages/app/models/constructor_pages/template.rb +49 -0
  234. data/pages/app/models/constructor_pages/types/boolean_type.rb +12 -0
  235. data/pages/app/models/constructor_pages/types/date_type.rb +16 -0
  236. data/pages/app/models/constructor_pages/types/float_type.rb +12 -0
  237. data/pages/app/models/constructor_pages/types/html_type.rb +12 -0
  238. data/pages/app/models/constructor_pages/types/image_type.rb +18 -0
  239. data/pages/app/models/constructor_pages/types/integer_type.rb +12 -0
  240. data/pages/app/models/constructor_pages/types/string_type.rb +12 -0
  241. data/pages/app/models/constructor_pages/types/text_type.rb +12 -0
  242. data/pages/app/views/constructor_pages/fields/_form.haml +28 -0
  243. data/pages/app/views/constructor_pages/fields/edit.haml +6 -0
  244. data/pages/app/views/constructor_pages/fields/new.haml +6 -0
  245. data/pages/app/views/constructor_pages/fields/types/_boolean.haml +1 -0
  246. data/pages/app/views/constructor_pages/fields/types/_date.haml +1 -0
  247. data/pages/app/views/constructor_pages/fields/types/_float.haml +1 -0
  248. data/pages/app/views/constructor_pages/fields/types/_html.haml +1 -0
  249. data/pages/app/views/constructor_pages/fields/types/_image.haml +7 -0
  250. data/pages/app/views/constructor_pages/fields/types/_integer.haml +1 -0
  251. data/pages/app/views/constructor_pages/fields/types/_string.haml +1 -0
  252. data/pages/app/views/constructor_pages/fields/types/_text.haml +1 -0
  253. data/pages/app/views/constructor_pages/pages/_breadcrumbs.haml +7 -0
  254. data/pages/app/views/constructor_pages/pages/_form.haml +97 -0
  255. data/pages/app/views/constructor_pages/pages/_menu.haml +8 -0
  256. data/pages/app/views/constructor_pages/pages/_submenu.haml +6 -0
  257. data/pages/app/views/constructor_pages/pages/edit.haml +6 -0
  258. data/pages/app/views/constructor_pages/pages/index.haml +52 -0
  259. data/pages/app/views/constructor_pages/pages/new.haml +6 -0
  260. data/pages/app/views/constructor_pages/pages/show.haml +5 -0
  261. data/pages/app/views/constructor_pages/templates/_form.haml +47 -0
  262. data/pages/app/views/constructor_pages/templates/edit.haml +6 -0
  263. data/pages/app/views/constructor_pages/templates/index.haml +39 -0
  264. data/pages/app/views/constructor_pages/templates/new.haml +6 -0
  265. data/pages/config/initializers/dragonfly.rb +9 -0
  266. data/pages/config/locales/en.yml +51 -0
  267. data/pages/config/locales/ru.yml +89 -0
  268. data/pages/config/routes.rb +32 -0
  269. data/pages/constructor-pages.gemspec +30 -0
  270. data/pages/db/migrate/10_create_html_types.rb +15 -0
  271. data/pages/db/migrate/11_create_image_types.rb +16 -0
  272. data/pages/db/migrate/12_add_default_template.rb +13 -0
  273. data/pages/db/migrate/1_create_pages.rb +27 -0
  274. data/pages/db/migrate/2_create_templates.rb +18 -0
  275. data/pages/db/migrate/3_create_fields.rb +17 -0
  276. data/pages/db/migrate/4_create_string_types.rb +15 -0
  277. data/pages/db/migrate/5_create_float_types.rb +15 -0
  278. data/pages/db/migrate/6_create_boolean_types.rb +15 -0
  279. data/pages/db/migrate/7_create_integer_types.rb +15 -0
  280. data/pages/db/migrate/8_create_text_types.rb +15 -0
  281. data/pages/db/migrate/9_create_date_types.rb +15 -0
  282. data/pages/lib/constructor-pages.rb +6 -0
  283. data/pages/lib/constructor_pages/engine.rb +6 -0
  284. data/pages/public/hello.txt +1 -0
  285. data/pages/spec/models/constructor_pages/field_model_spec.rb +138 -0
  286. data/pages/spec/models/constructor_pages/page_model_spec.rb +313 -0
  287. data/pages/spec/models/constructor_pages/template_model_spec.rb +29 -0
  288. data/pages/spec/requests/constructor_pages/pages_controller_spec.rb +12 -0
  289. metadata +296 -8
@@ -0,0 +1,144 @@
1
+ # encoding: utf-8
2
+
3
+ module ConstructorPages
4
+ class PagesController < ConstructorCore::ApplicationController
5
+ include MoveHelper
6
+ caches_page :show
7
+
8
+ before_filter {@roots = Page.roots}
9
+ before_filter :cache, only: [:create, :update, :destroy, :move_up, :move_down]
10
+
11
+ def new
12
+ @page, @template_id, @multipart = Page.new, Template.first.id, false
13
+
14
+ if params[:page] and (@page.parent = Page.find(params[:page]))
15
+ @template_id = @page.parent.template.child.id
16
+ end
17
+ end
18
+
19
+ def show
20
+ @page = Page.find_by_request_or_first('/' + params[:all])
21
+
22
+ error_404 and return if @page.nil? or !@page.active?
23
+
24
+ redirect_to @page.link if @page.redirect?
25
+
26
+ _code_name = @page.template.code_name.to_s
27
+
28
+ instance_variable_set('@'+_code_name, @page)
29
+
30
+ respond_to do |format|
31
+ format.html { render template: "html_templates/#{_code_name}" }
32
+ format.json {
33
+ _template = render_to_string partial: "json_templates/#{_code_name}.json.erb", layout: false, locals: {_code_name.to_sym => @page, page: @page}
34
+ _js = render_to_string partial: "js_partials/#{_code_name}.js"
35
+
36
+ render json: @page, self_and_ancestors: @page.self_and_ancestors.map(&:id), template: _template.gsub(/\n/, '\\\\n'), js: _js
37
+ }
38
+ end
39
+ end
40
+
41
+ =begin
42
+ def search
43
+ if params[:all].nil?
44
+ @page = Page.first
45
+ else
46
+ @request = '/' + params[:all]
47
+ @page = Page.where(:full_url => @request).first
48
+ end
49
+
50
+ instance_variable_set('@'+@page.template.code_name.to_s, @page)
51
+
52
+ what_search = params[:what_search]
53
+ params_selection = request.query_parameters
54
+
55
+ template = Template.find_by_code_name(what_search.singularize)
56
+
57
+ if template.nil?
58
+ render :action => "error_404", :layout => false
59
+ return
60
+ end
61
+
62
+ @pages = @page.descendants.where(:template_id => template.id)
63
+
64
+ params_selection.each_pair do |code_name, value|
65
+ if value.numeric?
66
+ value = value.to_f
67
+ elsif value.boolean?
68
+ value = value.to_bool
69
+ end
70
+
71
+ @pages = @pages.select do |page|
72
+ if code_name == 'name'
73
+ page.name == value
74
+ else
75
+ page.field(code_name) == value
76
+ end
77
+ end
78
+ end
79
+
80
+ instance_variable_set('@'+template.code_name.pluralize, @pages)
81
+
82
+ render :template => "templates/#{template.code_name}_search"
83
+ end
84
+ =end
85
+
86
+ def edit
87
+ @page = Page.find(params[:id])
88
+ @page.template ||= Template.first
89
+ @template_id = @page.template.id
90
+
91
+ @multipart = @page.fields.map{|f| f.type_value == 'image'}.include?(true) ? true : false
92
+ end
93
+
94
+ def create
95
+ @page = Page.new params[:page]
96
+
97
+ if @page.save
98
+ redirect_to pages.pages_url, notice: t(:page_success_added, name: @page.name)
99
+ else
100
+ render action: :new
101
+ end
102
+ end
103
+
104
+ def update
105
+ @page = Page.find params[:id]
106
+
107
+ if @page.template.id != params[:page][:template_id].to_i
108
+ @page.remove_fields_values
109
+ end
110
+
111
+ if @page.update_attributes params[:page]
112
+ @page.create_fields_values
113
+ @page.update_fields_values params[:fields]
114
+
115
+ redirect_to pages_url, notice: t(:page_success_updated, name: @page.name)
116
+ else
117
+ render action: :edit
118
+ end
119
+ end
120
+
121
+ def destroy
122
+ @page = Page.find(params[:id])
123
+ _name = @page.name
124
+ @page.destroy
125
+ redirect_to pages_url, notice: t(:page_success_removed, name: _name)
126
+ end
127
+
128
+ %w{up down}.each {|m| define_method "move_#{m}" do move_to :page, m.to_sym end}
129
+
130
+ private
131
+
132
+ def error_404
133
+ render file: "#{Rails.root}/public/404", layout: false, status: 404
134
+ end
135
+
136
+ def cache
137
+ expire_page :action => :show
138
+ cache_dir = ActionController::Base.page_cache_directory
139
+ unless cache_dir == Rails.root.to_s+"/public"
140
+ FileUtils.rm_r(Dir.glob(cache_dir+"/*")) rescue Errno::ENOENT
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+
3
+ module ConstructorPages
4
+ class TemplatesController < ConstructorCore::ApplicationController
5
+ include MoveHelper
6
+
7
+ before_filter {@roots = Template.roots}
8
+
9
+ def new
10
+ @template = Template.new
11
+
12
+ if params[:template]
13
+ @parent = Template.find(params[:template])
14
+ @template.parent_id = @parent.id
15
+ end
16
+ end
17
+
18
+ def edit
19
+ @template = Template.find(params[:id])
20
+ end
21
+
22
+ def create
23
+ @template = Template.new params[:template]
24
+
25
+ if @template.save
26
+ redirect_to templates_url, notice: t(:template_success_added, name: @template.name)
27
+ else
28
+ render action: :new
29
+ end
30
+ end
31
+
32
+ def update
33
+ @template = Template.find params[:id]
34
+
35
+ if @template.update_attributes params[:template]
36
+ redirect_to templates_url, notice: t(:template_success_updated, name: @template.name)
37
+ else
38
+ render action: :edit
39
+ end
40
+ end
41
+
42
+ def destroy
43
+ @template = Template.find(params[:id])
44
+ name = @template.name
45
+ @template.destroy
46
+ redirect_to templates_url, notice: t(:template_success_removed, name: name)
47
+ end
48
+
49
+ %w{up down}.each {|m| define_method "move_#{m}" do move_to :template, m.to_sym end}
50
+ end
51
+ end
@@ -0,0 +1,9 @@
1
+ module ConstructorPages
2
+ module CodeNameUniq
3
+ def code_name_uniqueness
4
+ unless Page.check_code_name(code_name) and check_code_name(code_name)
5
+ errors.add(:base, :code_name_already_in_use)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module ConstructorPages
4
+ module FieldsHelper
5
+ def types_value
6
+ [
7
+ [t(:string), "string"],
8
+ [t(:integer), "integer"],
9
+ [t(:float), "float"],
10
+ [t(:boolean), "boolean"],
11
+ [t(:date), "date"],
12
+ [t(:text), "text"],
13
+ [t(:html), "html"],
14
+ [t(:image), "image"]
15
+ ]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ module ConstructorPages
2
+ module MoveHelper
3
+ def move_to(what, to)
4
+ from = ('constructor_pages/'+what.to_s).classify.constantize.find(params[:id])
5
+ to_sibling = to == :up ? from.left_sibling : from.right_sibling
6
+
7
+ if not to_sibling.nil? and from.move_possible?(to_sibling)
8
+ to == :up ? from.move_left : from.move_right
9
+ end
10
+
11
+ redirect_to :back
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ module ConstructorPages
2
+ module PagesHelper
3
+ def for_select(roots)
4
+ result = []
5
+ roots.each do |r|
6
+ r.self_and_descendants.each {|i| result.push(["#{'--'*i.level} #{i.name}", i.id, {'data-full_url' => i.full_url}])}
7
+ end
8
+ result
9
+ end
10
+
11
+ def templates
12
+ Template.all.map{|t| ["#{'--'*t.level} #{t.name}", t.id]}
13
+ end
14
+
15
+ def image_tag_with_at2x(name_at_1x, options={})
16
+ name_at_2x = name_at_1x.gsub(%r{\.\w+$}, '@2x\0')
17
+ image_tag(name_at_1x, options.merge("data-at2x" => asset_path(name_at_2x)))
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ module ConstructorPages
2
+ module TemplatesHelper
3
+ def for_select(roots)
4
+ result = []
5
+ roots.each do |r|
6
+ r.self_and_descendants.each {|i| result.push(["#{'--'*i.level} #{i.name}", i.id])}
7
+ end
8
+ result
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+
3
+ module ConstructorPages
4
+ # Field model. Fields allows to add custom fields for template.
5
+ #
6
+ # Each field has type of value such as float, integer, string...
7
+ class Field < ActiveRecord::Base
8
+ attr_accessible :name, :code_name, :type_value, :template_id, :template
9
+
10
+ # Adding code_name_uniqueness method
11
+ include CodeNameUniq
12
+
13
+ # Array of available field types
14
+ TYPES = %w{string integer float boolean text date html image}
15
+
16
+ validates_presence_of :name
17
+ validates_uniqueness_of :code_name, :scope => :template_id
18
+ validate :code_name_uniqueness
19
+
20
+ after_create :create_page_fields
21
+ after_destroy :destroy_all_page_fields
22
+
23
+ belongs_to :template
24
+
25
+ # Adding has_many for all field types
26
+ TYPES.each do |t|
27
+ class_eval %{
28
+ has_many :#{t}_types, class_name: 'Types::#{t.titleize}Type'
29
+ }
30
+ end
31
+
32
+ has_many :pages, through: :template
33
+
34
+ acts_as_list scope: :template_id
35
+ default_scope order: :position
36
+
37
+ # Return constant of model type_value
38
+ def type_class; "constructor_pages/types/#{type_value}_type".classify.constantize end
39
+
40
+ # Return object of type_value by page
41
+ def find_type_object(page); type_class.find_by_field_id_and_page_id(id, page.id) end
42
+
43
+ # Create object of type_value by page
44
+ def create_type_object(page); type_class.create(field_id: id, page_id: page.id) end
45
+
46
+ # Remove all type_fields values for specified page
47
+ def remove_type_object(page); find_type_object(page).destroy end
48
+
49
+ # Get value from type_field for specified page
50
+ def get_value_for(page)
51
+ _type_object = find_type_object(page)
52
+ _type_object ? _type_object.value : nil
53
+ end
54
+
55
+ # Set value type_field for specified page
56
+ def set_value_for(page, value)
57
+ _type_object = find_type_object(page)
58
+
59
+ if _type_object
60
+ _type_object.value = value
61
+ _type_object.save!
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ # Check if there is code_name in template branch
68
+ def check_code_name(code_name)
69
+ [code_name.pluralize, code_name.singularize].each do |name|
70
+ %w{self_and_ancestors descendants}.each do |m|
71
+ if template.send(m).map{|t| t.code_name}.include?(name)
72
+ return false
73
+ end
74
+ end
75
+ end
76
+
77
+ true
78
+ end
79
+
80
+ # Create and destroy page fields
81
+ %w{create destroy_all}.each do |m|
82
+ class_eval %{
83
+ def #{m}_page_fields
84
+ template.pages.each {|page| type_class.#{m} page_id: page.id, field_id: id}
85
+ end
86
+ }
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,190 @@
1
+ # encoding: utf-8
2
+
3
+ module ConstructorPages
4
+ # Page model. Pages are core for company websites, blogs etc.
5
+ class Page < ActiveRecord::Base
6
+ attr_accessible :name, :title, :keywords, :description,
7
+ :url, :full_url, :active, :auto_url,
8
+ :parent, :parent_id, :link, :in_menu, :in_map,
9
+ :in_nav, :template_id, :template
10
+
11
+ # Adding has_many for all field types
12
+ Field::TYPES.each do |t|
13
+ class_eval %{
14
+ has_many :#{t}_types, dependent: :destroy, class_name: 'Types::#{t.titleize}Type'
15
+ }
16
+ end
17
+
18
+ has_many :fields, through: :template
19
+
20
+ belongs_to :template
21
+
22
+ default_scope order :lft
23
+
24
+ validate :template_check
25
+
26
+ before_save :friendly_url, :template_assign, :full_url_update
27
+ after_update :descendants_update
28
+ after_create :create_fields_values
29
+
30
+ acts_as_nested_set
31
+
32
+ # Used for find page by request. It return first page if no request given
33
+ # @param request for example <tt>'/conditioners/split-systems/zanussi'</tt>
34
+ def self.find_by_request_or_first(request = nil)
35
+ request.nil? ? Page.first : Page.find_by_full_url(request)
36
+ end
37
+
38
+ # Generate full_url from parent id and url
39
+ # @param parent_id integer
40
+ # @param url should looks like <tt>'hello-world-page'</tt> without leading slash
41
+ def self.full_url_generate(parent_id, url = '')
42
+ '/' + Page.find(parent_id).self_and_ancestors.map {|c| c.url}.append(url).join('/')
43
+ end
44
+
45
+ # Check code_name for field and template.
46
+ # When missing method Page find field or page in branch with plural and singular code_name so
47
+ # field and template code_name should be uniqueness for page methods
48
+ def self.check_code_name(code_name)
49
+ [code_name, code_name.pluralize, code_name.singularize].each do |name|
50
+ if Page.first.respond_to?(name)
51
+ return false
52
+ end
53
+ end
54
+
55
+ true
56
+ end
57
+
58
+ # Get field by code_name
59
+ def field(code_name)
60
+ Field.find_by_code_name_and_template_id code_name, template_id
61
+ end
62
+
63
+ # Get value of field by code_name
64
+ def get_field_value(code_name)
65
+ field = field(code_name)
66
+ field.get_value_for(self) if field
67
+ end
68
+
69
+ # Set value of field by code_name and value
70
+ def set_field_value(code_name, value)
71
+ field = field(code_name)
72
+ field.set_value_for(self, value) if field
73
+ end
74
+
75
+ # Update all fields values with given params.
76
+ # @param params should looks like <tt>{price: 500, content: 'Hello'}</tt>
77
+ # @param reset_booleans reset all boolean fields to false before assign params
78
+ def update_fields_values(params, reset_booleans = true)
79
+ fields.each do |field|
80
+ value = params[field.code_name.to_sym]
81
+
82
+ _type_object = field.find_type_object(self)
83
+ _type_object.value = 0 if field.type_value == 'boolean' and reset_booleans
84
+
85
+ if value
86
+ _type_object.value = field.type_value == 'date' ? parse_date(value).to_s : value
87
+ end
88
+
89
+ _type_object.save
90
+ end
91
+ end
92
+
93
+ # Create fields values
94
+ def create_fields_values; fields.each {|field| field.create_type_object(self) } end
95
+
96
+ # Remove all fields values
97
+ def remove_fields_values
98
+ fields.each {|f| f.remove_type_object self}
99
+ end
100
+
101
+ # Search page by template code_name in same branch of pages and templates.
102
+ # It allows to call page.category.brand.series.model etc.
103
+ #
104
+ # Return one page if founded in ancestors,
105
+ # and return array of pages if founded in descendants
106
+ #
107
+ # It determines if code_name is singular or nor
108
+ # @param code_name template code name
109
+ def find_page_in_branch(code_name)
110
+ _template = Template.find_by_code_name code_name.singularize
111
+
112
+ if _template
113
+ result = []
114
+ result = descendants.where(template_id: _template.id) if code_name == code_name.pluralize
115
+ result = ancestors.find_by_template_id(_template.id) if result.empty?
116
+ result
117
+ end
118
+ end
119
+
120
+ alias_method :find_pages_in_branch, :find_page_in_branch
121
+
122
+ def published?; active end
123
+
124
+ alias_method :active?, :published?
125
+
126
+ # Returns page hash attributes with fields.
127
+ #
128
+ # Default attributes are name and title. Options param allows to add more.
129
+ # @param options default merge name and title page attributes
130
+ def as_json(options = {})
131
+ options = {name: self.name, title: self.title}.merge options
132
+
133
+ fields.each do |field|
134
+ options.merge!({field.code_name.to_sym => field.get_value_for(self)})
135
+ end
136
+
137
+ options
138
+ end
139
+
140
+ # Check if link specified
141
+ def redirect?; url != link && !link.empty? end
142
+
143
+ # When method missing it get/set field value or get page in branch
144
+ #
145
+ # Examples:
146
+ # page.content = 'Hello world'
147
+ # puts page.price
148
+ # page.brand.models.each do...
149
+ def method_missing(name, *args, &block)
150
+ name = name.to_s
151
+ name[-1] == '=' ? set_field_value(name[0..-2], args[0]) : get_field_value(name) || find_pages_in_branch(name)
152
+ end
153
+
154
+ private
155
+
156
+ # if url has been changed by manually or url is empty
157
+ def friendly_url
158
+ self.url = ((auto_url || url.empty?) ? translit(name) : url).parameterize
159
+ end
160
+
161
+ # TODO: move out
162
+ def parse_date(value)
163
+ Date.new(value['date(1i)'].to_i, value['date(2i)'].to_i, value['date(3i)'].to_i)
164
+ end
165
+
166
+ # TODO: add more languages
167
+ # Translit to english
168
+ def translit(str)
169
+ Russian.translit(str)
170
+ end
171
+
172
+ # Page is not valid if there is no template
173
+ def template_check
174
+ errors.add_on_empty(:template_id) if Template.count == 0
175
+ end
176
+
177
+ # If template_id is nil then get first template
178
+ def template_assign
179
+ self.template_id = Template.first.id unless template_id
180
+ end
181
+
182
+ # Update full_url
183
+ def full_url_update
184
+ self.full_url = (parent_id ? Page.full_url_generate(parent_id, url) : '/' + url)
185
+ end
186
+
187
+ # Reload all descendants
188
+ def descendants_update; descendants.map(&:save) end
189
+ end
190
+ end