coalla-cms 0.4.2.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 (300) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +81 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +168 -0
  5. data/Rakefile +29 -0
  6. data/app/assets/fonts/glyphicons/glyphicons-halflings-regular.eot +0 -0
  7. data/app/assets/fonts/glyphicons/glyphicons-halflings-regular.svg +229 -0
  8. data/app/assets/fonts/glyphicons/glyphicons-halflings-regular.ttf +0 -0
  9. data/app/assets/fonts/glyphicons/glyphicons-halflings-regular.woff +0 -0
  10. data/app/assets/images/ajax-loader.gif +0 -0
  11. data/app/assets/images/blank.gif +0 -0
  12. data/app/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  13. data/app/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  14. data/app/assets/javascripts/admin/admin.js +295 -0
  15. data/app/assets/javascripts/admin/custom_admin.js +0 -0
  16. data/app/assets/javascripts/admin/jquery-migrate.min.js +2 -0
  17. data/app/assets/javascripts/admin/photo_uploader.js +67 -0
  18. data/app/assets/javascripts/admin/vendor/bootstrap.min.js +7 -0
  19. data/app/assets/javascripts/admin/vendor/jquery-ui-timepicker-addon-ru.js +40 -0
  20. data/app/assets/javascripts/admin/vendor/jquery.tagsinput.js +365 -0
  21. data/app/assets/javascripts/admin/vendor/jquery.tokeninput.patched.js +875 -0
  22. data/app/assets/javascripts/admin/vendor/underscore-min.js +5 -0
  23. data/app/assets/javascripts/ckeditor/plugins/autogrow/plugin.js +209 -0
  24. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
  25. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
  26. data/app/assets/javascripts/ckeditor/plugins/mediaembed/plugin.js +64 -0
  27. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/LICENSE.txt +303 -0
  28. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad-gallery-css-diff.htm +831 -0
  29. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_next.png +0 -0
  30. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_prev.png +0 -0
  31. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_scroll_back.png +0 -0
  32. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_scroll_forward.png +0 -0
  33. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.css +185 -0
  34. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.js +984 -0
  35. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.min - ref.js +10 -0
  36. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.min.js +1 -0
  37. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/loader.gif +0 -0
  38. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/opa75.png +0 -0
  39. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/placeholder.png +0 -0
  40. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/trans.gif +0 -0
  41. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/blank.gif +0 -0
  42. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_loading.gif +0 -0
  43. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_loading@2x.gif +0 -0
  44. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_overlay.png +0 -0
  45. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_sprite.png +0 -0
  46. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_sprite@2x.png +0 -0
  47. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/fancybox_buttons.png +0 -0
  48. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-buttons.css +97 -0
  49. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-buttons.js +122 -0
  50. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-media.js +199 -0
  51. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-thumbs.css +55 -0
  52. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-thumbs.js +162 -0
  53. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.css +274 -0
  54. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.js +2020 -0
  55. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.pack.js +46 -0
  56. data/app/assets/javascripts/ckeditor/plugins/slideshow/README.md +66 -0
  57. data/app/assets/javascripts/ckeditor/plugins/slideshow/dialogs/slideshow.js +1396 -0
  58. data/app/assets/javascripts/ckeditor/plugins/slideshow/dialogs/slideshow.min.js +1 -0
  59. data/app/assets/javascripts/ckeditor/plugins/slideshow/icons/placeholder.png +0 -0
  60. data/app/assets/javascripts/ckeditor/plugins/slideshow/icons/slideshow.png +0 -0
  61. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/Serbian_translation.txt +9 -0
  62. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/el.js +37 -0
  63. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/en.js +35 -0
  64. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/fr.js +35 -0
  65. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/ru.js +35 -0
  66. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/sr-latn.js +35 -0
  67. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/sr.js +35 -0
  68. data/app/assets/javascripts/ckeditor/plugins/slideshow/plugin.js +217 -0
  69. data/app/assets/stylesheets/admin/admin.scss +302 -0
  70. data/app/assets/stylesheets/admin/custom_admin.scss +1 -0
  71. data/app/assets/stylesheets/admin/vendor/bootstrap.min.css +14 -0
  72. data/app/assets/stylesheets/admin/vendor/jquery.tagsinput.css +99 -0
  73. data/app/assets/stylesheets/admin/vendor/token-input-facebook.patched.css +126 -0
  74. data/app/assets/stylesheets/admin/vendor/token-input.patched.css +116 -0
  75. data/app/controllers/admin/autocomplete_controller.rb +14 -0
  76. data/app/controllers/admin/image_upload_controller.rb +27 -0
  77. data/app/controllers/admin/lookups_controller.rb +47 -0
  78. data/app/controllers/admin/sortable_controller.rb +26 -0
  79. data/app/controllers/concerns/admin/path_history.rb +39 -0
  80. data/app/helpers/admin/search_helper.rb +59 -0
  81. data/app/helpers/admin_helper.rb +29 -0
  82. data/app/helpers/common_helper.rb +16 -0
  83. data/app/helpers/lookup_helper.rb +45 -0
  84. data/app/helpers/nested_fields_helper.rb +12 -0
  85. data/app/helpers/static_text_formatter.rb +25 -0
  86. data/app/helpers/twitter_builder_helper.rb +253 -0
  87. data/app/helpers/twitter_form_builder.rb +196 -0
  88. data/app/models/file_upload.rb +19 -0
  89. data/app/models/lookup.rb +6 -0
  90. data/app/uploaders/file_uploader.rb +10 -0
  91. data/app/uploaders/generic_image_uploader.rb +74 -0
  92. data/app/utils/admin_structure.rb +67 -0
  93. data/app/utils/bootstrap_link_renderer.rb +40 -0
  94. data/app/utils/table_helpers.rb +196 -0
  95. data/app/views/admin/base/_sort.haml +34 -0
  96. data/app/views/admin/common/_file_upload_template.haml +14 -0
  97. data/app/views/admin/common/_header.html.haml +27 -0
  98. data/app/views/admin/common/_image_upload_template.html.haml +40 -0
  99. data/app/views/admin/common/_menu.html.haml +2 -0
  100. data/app/views/admin/common/_menu_section.haml +10 -0
  101. data/app/views/admin/common/_menu_separator.haml +1 -0
  102. data/app/views/admin/common/_nested_fields_for.html.haml +5 -0
  103. data/app/views/admin/common/_nested_fields_for_element.html.haml +5 -0
  104. data/app/views/admin/common/_slide.haml +41 -0
  105. data/app/views/admin/common/_slides.html.haml +17 -0
  106. data/app/views/admin/common/_table_template.html.haml +14 -0
  107. data/app/views/admin/common/_upload_form.html.haml +5 -0
  108. data/app/views/admin/common/image_uploaded.js.haml +7 -0
  109. data/app/views/admin/common/upload_failed.js.erb +11 -0
  110. data/app/views/admin/common/upload_image.js.erb +6 -0
  111. data/app/views/admin/home/dashboard.html.haml +5 -0
  112. data/app/views/admin/lookups/_form.html.haml +16 -0
  113. data/app/views/admin/lookups/edit.html.haml +5 -0
  114. data/app/views/admin/lookups/index.html.haml +6 -0
  115. data/app/views/layouts/admin.html.haml +38 -0
  116. data/app/views/structure/_section.haml +16 -0
  117. data/coalla-cms.gemspec +39 -0
  118. data/config/locales/devise.ru.yml +59 -0
  119. data/config/locales/will_paginate.ru.yml +6 -0
  120. data/lib/coalla/cms/engine.rb +16 -0
  121. data/lib/coalla/cms/version.rb +5 -0
  122. data/lib/coalla/ext/mapper.rb +14 -0
  123. data/lib/coalla/orm/page_slider.rb +53 -0
  124. data/lib/coalla/orm/relation.rb +32 -0
  125. data/lib/coalla/orm/sanitized.rb +16 -0
  126. data/lib/coalla/sanitize/config/default.rb +526 -0
  127. data/lib/coalla-cms.rb +16 -0
  128. data/lib/generators/coalla/cms/create_admin_generator.rb +50 -0
  129. data/lib/generators/coalla/cms/create_admin_login_view_generator.rb +23 -0
  130. data/lib/generators/coalla/cms/file_uploads/install_generator.rb +35 -0
  131. data/lib/generators/coalla/cms/file_uploads/mount_generator.rb +34 -0
  132. data/lib/generators/coalla/cms/file_uploads/templates/add_column_migration.rb.erb +5 -0
  133. data/lib/generators/coalla/cms/file_uploads/templates/migration.rb +17 -0
  134. data/lib/generators/coalla/cms/image/install_generator.rb +39 -0
  135. data/lib/generators/coalla/cms/image/mount_generator.rb +50 -0
  136. data/lib/generators/coalla/cms/image/templates/migration.rb.erb +9 -0
  137. data/lib/generators/coalla/cms/image/templates/model.rb.erb +5 -0
  138. data/lib/generators/coalla/cms/image/templates/mount/migration.rb.erb +6 -0
  139. data/lib/generators/coalla/cms/image/templates/mount/uploader.rb.erb +3 -0
  140. data/lib/generators/coalla/cms/image/templates/uploader.rb.erb +3 -0
  141. data/lib/generators/coalla/cms/init_generator.rb +113 -0
  142. data/lib/generators/coalla/cms/lookups/install_generator.rb +43 -0
  143. data/lib/generators/coalla/cms/lookups/templates/migration.rb +13 -0
  144. data/lib/generators/coalla/cms/market/install_generator.rb +71 -0
  145. data/lib/generators/coalla/cms/market/templates/controllers/categories_controller.rb +47 -0
  146. data/lib/generators/coalla/cms/market/templates/controllers/products_controller.rb +50 -0
  147. data/lib/generators/coalla/cms/market/templates/controllers/properties_controller.rb +59 -0
  148. data/lib/generators/coalla/cms/market/templates/market.rb +5 -0
  149. data/lib/generators/coalla/cms/market/templates/market.ru.yml +53 -0
  150. data/lib/generators/coalla/cms/market/templates/migrations/create_categories.rb +15 -0
  151. data/lib/generators/coalla/cms/market/templates/migrations/create_product_properties.rb +18 -0
  152. data/lib/generators/coalla/cms/market/templates/migrations/create_products.rb +18 -0
  153. data/lib/generators/coalla/cms/market/templates/migrations/create_properties.rb +11 -0
  154. data/lib/generators/coalla/cms/market/templates/models/category.rb +36 -0
  155. data/lib/generators/coalla/cms/market/templates/models/product.rb +16 -0
  156. data/lib/generators/coalla/cms/market/templates/models/product_property.rb +14 -0
  157. data/lib/generators/coalla/cms/market/templates/models/property.rb +7 -0
  158. data/lib/generators/coalla/cms/market/templates/views/categories/_form.html.haml +10 -0
  159. data/lib/generators/coalla/cms/market/templates/views/categories/edit.html.haml +5 -0
  160. data/lib/generators/coalla/cms/market/templates/views/categories/index.html.haml +17 -0
  161. data/lib/generators/coalla/cms/market/templates/views/categories/new.html.haml +4 -0
  162. data/lib/generators/coalla/cms/market/templates/views/products/_form.html.haml +17 -0
  163. data/lib/generators/coalla/cms/market/templates/views/products/_product_property_fields.html.haml +13 -0
  164. data/lib/generators/coalla/cms/market/templates/views/products/edit.html.haml +5 -0
  165. data/lib/generators/coalla/cms/market/templates/views/products/index.html.haml +17 -0
  166. data/lib/generators/coalla/cms/market/templates/views/products/new.html.haml +4 -0
  167. data/lib/generators/coalla/cms/market/templates/views/properties/_form.html.haml +9 -0
  168. data/lib/generators/coalla/cms/market/templates/views/properties/edit.html.haml +5 -0
  169. data/lib/generators/coalla/cms/market/templates/views/properties/index.html.haml +15 -0
  170. data/lib/generators/coalla/cms/market/templates/views/properties/new.html.haml +4 -0
  171. data/lib/generators/coalla/cms/news/scaffold_generator.rb +50 -0
  172. data/lib/generators/coalla/cms/news/templates/entity.rb.erb +10 -0
  173. data/lib/generators/coalla/cms/news/templates/entity_controller_template.rb.erb +47 -0
  174. data/lib/generators/coalla/cms/news/templates/entity_image_uploader.rb.erb +7 -0
  175. data/lib/generators/coalla/cms/news/templates/migration.rb.erb +15 -0
  176. data/lib/generators/coalla/cms/news/templates/views/_form.haml.erb +16 -0
  177. data/lib/generators/coalla/cms/news/templates/views/edit.haml.erb +5 -0
  178. data/lib/generators/coalla/cms/news/templates/views/index.haml.erb +18 -0
  179. data/lib/generators/coalla/cms/news/templates/views/new.haml.erb +5 -0
  180. data/lib/generators/coalla/cms/orm_helpers.rb +31 -0
  181. data/lib/generators/coalla/cms/scaffold_generator.rb +53 -0
  182. data/lib/generators/coalla/cms/scaffold_helper.rb +11 -0
  183. data/lib/generators/coalla/cms/setup_admin_generator.rb +60 -0
  184. data/lib/generators/coalla/cms/setup_routes_generator.rb +28 -0
  185. data/lib/generators/coalla/cms/slider/init_generator.rb +41 -0
  186. data/lib/generators/coalla/cms/slider/templates/migration.rb.erb +25 -0
  187. data/lib/generators/coalla/cms/slider/templates/slider_image.rb.erb +10 -0
  188. data/lib/generators/coalla/cms/slider/templates/slider_image_uploader.rb.erb +7 -0
  189. data/lib/generators/coalla/cms/slider/templates/slider_upload_controller.rb.erb +19 -0
  190. data/lib/generators/coalla/cms/templates/.gitattributes +4 -0
  191. data/lib/generators/coalla/cms/templates/.gitignore +86 -0
  192. data/lib/generators/coalla/cms/templates/activerecord.ru.yml +13 -0
  193. data/lib/generators/coalla/cms/templates/assets.rb +13 -0
  194. data/lib/generators/coalla/cms/templates/controllers/admin/base_controller.rb.erb +35 -0
  195. data/lib/generators/coalla/cms/templates/controllers/admin/home_controller.rb.erb +6 -0
  196. data/lib/generators/coalla/cms/templates/controllers/admin/scaffold_controller_template.rb.erb +45 -0
  197. data/lib/generators/coalla/cms/templates/controllers/home_controller.rb.erb +6 -0
  198. data/lib/generators/coalla/cms/templates/database.yml.erb +35 -0
  199. data/lib/generators/coalla/cms/templates/devise.ru.yml +59 -0
  200. data/lib/generators/coalla/cms/templates/initializers/carrierwave.rb +51 -0
  201. data/lib/generators/coalla/cms/templates/migration.rb +11 -0
  202. data/lib/generators/coalla/cms/templates/migration_existing.rb +15 -0
  203. data/lib/generators/coalla/cms/templates/schedule.rb +3 -0
  204. data/lib/generators/coalla/cms/templates/structure.rb +0 -0
  205. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/_form.html.haml.erb +14 -0
  206. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/edit.html.haml.erb +5 -0
  207. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/index.html.haml.erb +15 -0
  208. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/new.html.haml.erb +4 -0
  209. data/lib/generators/coalla/cms/templates/views/administrators/sessions/new.html.haml +19 -0
  210. data/lib/generators/coalla/cms/templates/views/home/index.html.haml.erb +1 -0
  211. data/lib/generators/coalla/cms/wysiwyg/ckeditor_generator.rb +17 -0
  212. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
  213. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
  214. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/mediaembed/plugin.js +64 -0
  215. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/LICENSE.txt +303 -0
  216. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad-gallery-css-diff.htm +831 -0
  217. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_next.png +0 -0
  218. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_prev.png +0 -0
  219. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_scroll_back.png +0 -0
  220. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_scroll_forward.png +0 -0
  221. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.css +185 -0
  222. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.js +984 -0
  223. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.min - ref.js +10 -0
  224. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.min.js +1 -0
  225. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/loader.gif +0 -0
  226. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/opa75.png +0 -0
  227. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/placeholder.png +0 -0
  228. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/trans.gif +0 -0
  229. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/blank.gif +0 -0
  230. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_loading.gif +0 -0
  231. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_loading@2x.gif +0 -0
  232. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_overlay.png +0 -0
  233. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_sprite.png +0 -0
  234. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_sprite@2x.png +0 -0
  235. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/fancybox_buttons.png +0 -0
  236. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-buttons.css +97 -0
  237. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-buttons.js +122 -0
  238. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-media.js +199 -0
  239. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-thumbs.css +55 -0
  240. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-thumbs.js +162 -0
  241. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.css +274 -0
  242. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.js +2020 -0
  243. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.pack.js +46 -0
  244. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/README.md +66 -0
  245. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/dialogs/slideshow.js +1396 -0
  246. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/dialogs/slideshow.min.js +1 -0
  247. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/icons/placeholder.png +0 -0
  248. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/icons/slideshow.png +0 -0
  249. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/Serbian_translation.txt +9 -0
  250. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/el.js +37 -0
  251. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/en.js +35 -0
  252. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/fr.js +35 -0
  253. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/ru.js +35 -0
  254. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/sr-latn.js +35 -0
  255. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/sr.js +35 -0
  256. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/plugin.js +217 -0
  257. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-blockquote.png +0 -0
  258. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h1.png +0 -0
  259. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h2.png +0 -0
  260. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h3.png +0 -0
  261. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h4.png +0 -0
  262. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h5.png +0 -0
  263. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h6.png +0 -0
  264. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-p.png +0 -0
  265. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-pre.png +0 -0
  266. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/wymiframe.css +276 -0
  267. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/wymiframe.html +26 -0
  268. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/jquery.wymeditor.js +4819 -0
  269. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/lang/en.js +45 -0
  270. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/lang/ru.js +55 -0
  271. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/imageupload/icons.png +0 -0
  272. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/imageupload/jquery.wymeditor.imageupload.js +150 -0
  273. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js +91 -0
  274. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/resizable/readme.txt +124 -0
  275. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/icons.png +0 -0
  276. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/skin.css +134 -0
  277. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/skin.js +35 -0
  278. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/icons.png +0 -0
  279. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/skin.css +341 -0
  280. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/skin.js +40 -0
  281. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.header.gif +0 -0
  282. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.selector.silver.gif +0 -0
  283. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.wymeditor.png +0 -0
  284. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/icons.silver.gif +0 -0
  285. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/skin.css +131 -0
  286. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/skin.js +30 -0
  287. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/COPYING +674 -0
  288. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/README +27 -0
  289. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.header.gif +0 -0
  290. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.selector.silver.gif +0 -0
  291. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.wymeditor.png +0 -0
  292. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/icons.silver.gif +0 -0
  293. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/skin.css +297 -0
  294. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/skin.js +61 -0
  295. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/icons.png +0 -0
  296. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/skin.css +134 -0
  297. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/skin.js +39 -0
  298. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/wymeditor_icon.png +0 -0
  299. data/lib/generators/coalla/cms/wysiwyg/wymeditor_generator.rb +17 -0
  300. metadata +581 -0
@@ -0,0 +1,253 @@
1
+ #encoding: utf-8
2
+ module TwitterBuilderHelper
3
+
4
+ ALIGN_CLASSES = {left: 't-left', center: 't-center', right: 't-right'}
5
+
6
+ class ColumnDefinition
7
+ attr_accessor :title, :cols, :col_class, :value_extractor, :align
8
+
9
+ def value(item, context = self)
10
+ self.value_extractor.call(item)
11
+ end
12
+
13
+ end
14
+
15
+ class ActionsColumnDefinition < ColumnDefinition
16
+
17
+ def initialize
18
+ self.title = 'Действия'
19
+ @actions = []
20
+ end
21
+
22
+ def cols
23
+ @cols || @actions.size % 2 + @actions.size / 2
24
+ end
25
+
26
+ def col_class
27
+ "col-xs-#{cols}"
28
+ end
29
+
30
+ def cols=(value)
31
+ @cols = value
32
+ end
33
+
34
+ def value(item, context = self)
35
+ @actions.collect do |action|
36
+ options = action.second
37
+ if options[:if]
38
+ context.instance_exec(item, &action.first) if options[:if].call(item)
39
+ else
40
+ context.instance_exec(item, &action.first)
41
+ end
42
+ end.compact.join(' ').html_safe
43
+ end
44
+
45
+ def action(method, options = {})
46
+ @actions << case method
47
+ when :edit
48
+ [->(item) { edit_link(send("edit_admin_#{item.class.name.underscore.sub('/', '_')}_path", item)) }, options]
49
+ when :delete
50
+ [->(item) { delete_link([:admin, item]) }, options]
51
+ when Proc
52
+ [method, options]
53
+ else
54
+ raise "unsupported method: #{method.inspect}"
55
+ end
56
+ end
57
+
58
+ end
59
+
60
+ class TableBuilder
61
+
62
+ def initialize(parent, model_class)
63
+ @parent, @model_class = parent, model_class
64
+ @columns = []
65
+ @actions_column = ActionsColumnDefinition.new
66
+ @action_column_on_left = false
67
+ @table_helpers = TableHelpers.for(@model_class, @parent)
68
+ end
69
+
70
+ def content collection, &block
71
+ @collection = collection
72
+ block.call(self) if block_given?
73
+ create_content
74
+ end
75
+
76
+ # Метод добавляет столбец к таблице
77
+ def column(method, options = {})
78
+ helper = @table_helpers[method]
79
+ cd = ColumnDefinition.new
80
+ cd.title = options[:title] || I18n.t("activerecord.attributes.#{@model_class.model_name.singular}.#{method}")
81
+ cd.cols = options[:cols]
82
+ cd.col_class = options[:class]
83
+ cd.value_extractor = ->(item) { helper.format_value(item, options[:format]) }
84
+ cd.align = options[:align] || helper.respond_to?(:align) && "t-#{helper.align}"
85
+ @columns << cd
86
+ end
87
+
88
+ # Метод позволяет передать блок, который должен вычислять класс для строки. В этот блок передается объект,
89
+ # по которому данная строка рендерится. Таким образом, можно управлять, например, цветом строки в зависимости
90
+ # от состояния объекта (статусы заказов и прочее).
91
+ def row_class lmb
92
+ @row_class = lmb
93
+ end
94
+
95
+ # Метод добавляет кнопку в столбец действий
96
+ def action(value, options = {})
97
+ add_action(value, options)
98
+ end
99
+
100
+ # Метод добавляет кнопку редактирования сущности в столбец действий
101
+ def edit(options = {})
102
+ add_action(:edit, options)
103
+ end
104
+
105
+ # Метод добавляет кнопку удаления сущности в столбец действий
106
+ def delete(options = {})
107
+ add_action(:delete, options)
108
+ end
109
+
110
+ # Метод добавляет кнопки добавления и удаления сущностей в столбец действий
111
+ def edit_and_delete(options = {})
112
+ self.edit(options)
113
+ self.delete(options)
114
+ end
115
+
116
+ private
117
+
118
+ def add_action(value, options)
119
+ @action_column_on_left = true if @columns.empty?
120
+ @actions_column.action(value, options)
121
+ end
122
+
123
+ def all_columns
124
+ @action_column_on_left ? [@actions_column] + @columns : @columns + [@actions_column]
125
+ end
126
+
127
+ def create_content
128
+ @parent.render(partial: '/admin/common/table_template', locals: {definitions: all_columns, items: @collection, row_class: @row_class})
129
+ end
130
+ end
131
+
132
+ def twitter_form_for(name, *args, &block)
133
+ options = args.extract_options!
134
+ form_for(name, *(args << options.deep_merge(builder: TwitterFormBuilder, html: {class: 'form-horizontal'})), &block)
135
+ end
136
+
137
+ def field_set title = nil, &block
138
+ content = capture(self, &block)
139
+ content = content_tag(:legend, title) + content if title
140
+ content_tag :fieldset, content
141
+ end
142
+
143
+ def actions &block
144
+ content = capture(self, &block)
145
+ content_tag :div, content, class: 'well'
146
+ end
147
+
148
+ def standard_actions(form)
149
+ fixed_actions { form.save + form.apply + form.cancel }
150
+ end
151
+
152
+ def fixed_actions &block
153
+ panel_tag = actions(&block)
154
+ content_tag :div, panel_tag, class: 'action-bar'
155
+ end
156
+
157
+ def flash_warning_messages
158
+ r = if flash[:admin_warning]
159
+ "<div class='row'>
160
+ <div class='col-md-8 col-md-offset-2'>
161
+ <div class='alert alert-danger'>
162
+ <button data-dismiss='alert' class='close' type='button'>&times;</button>
163
+ <p>#{h(flash[:admin_warning])}</p>
164
+ </div>
165
+ </div>
166
+ </div>"
167
+ end
168
+ r && r.html_safe
169
+ end
170
+
171
+ def flash_alert_messages
172
+ r = if flash[:alert]
173
+ "<div class='row'>
174
+ <div class='col-md-8 col-md-offset-2'>
175
+ <div class='alert alert-danger'>
176
+ <button data-dismiss='alert' class='close' type='button'>&times;</button>
177
+ <p>#{h(flash[:alert])}</p>
178
+ </div>
179
+ </div>
180
+ </div>"
181
+ end
182
+ r && r.html_safe
183
+ end
184
+
185
+ def flash_success_messages
186
+ r = if flash[:admin_success]
187
+ "<div class='row'>
188
+ <div class='col-md-8 col-md-offset-2'>
189
+ <div class='alert alert-success'>
190
+ <button data-dismiss='alert' class='close' type='button'>&times;</button>
191
+ <p>#{h(flash[:admin_success])}</p>
192
+ </div>
193
+ </div>
194
+ </div>"
195
+ end
196
+ r && r.html_safe
197
+ end
198
+
199
+ def flash_messages
200
+ [flash_warning_messages, flash_success_messages].compact.join.html_safe
201
+ end
202
+
203
+ def create_link path
204
+ content = "<i class='glyphicon glyphicon-plus'></i>&nbsp;&nbsp;Добавить".html_safe
205
+ link_to content, path, class: 'btn btn-success'
206
+ end
207
+
208
+ def sort_link path
209
+ content = "<i class='glyphicon glyphicon-random'></i>&nbsp;&nbsp;Сортировать".html_safe
210
+ link_to content, path, class: 'btn btn-primary'
211
+ end
212
+
213
+ def edit_link path
214
+ content = "<i class='glyphicon glyphicon-pencil'></i>".html_safe
215
+ link_to content, path, class: 'btn btn-default btn-xs', title: 'Редактировать'
216
+ end
217
+
218
+ def delete_link path
219
+ content = "<i class='glyphicon glyphicon-trash'></i>".html_safe
220
+ link_to content, path, data: {confirm: 'Вы уверены?'}, method: :delete, class: 'btn btn-danger btn-xs', title: 'Удалить'
221
+ end
222
+
223
+ def cancel_action path, name = 'Отменить'
224
+ link_to name, path, class: 'btn btn-default'
225
+ end
226
+
227
+ def back_action name = 'Вернуться', path = back_uri
228
+ link_to name, path, class: 'btn btn-default'
229
+ end
230
+
231
+ def table_for a_class
232
+ TableBuilder.new(self, a_class)
233
+ end
234
+
235
+ def th_class(column)
236
+ klass = []
237
+ klass << "col-xs-#{column.cols}" if column.cols
238
+ klass << ALIGN_CLASSES[column.align] if column.align
239
+ klass.join(' ')
240
+ end
241
+
242
+ def tr_class(row_class, item)
243
+ row_class && row_class.call(item)
244
+ end
245
+
246
+ def td_class(column)
247
+ klass = []
248
+ klass << column.col_class
249
+ klass << ALIGN_CLASSES[column.align] if column.align
250
+ klass.join(' ')
251
+ end
252
+
253
+ end
@@ -0,0 +1,196 @@
1
+ #encoding: utf-8
2
+ class TwitterFormBuilder < ActionView::Helpers::FormBuilder
3
+ include ActionView::Helpers::FormTagHelper
4
+
5
+ COLS_CLASS = 'col-md-8'
6
+
7
+ def errors
8
+ return nil unless @object.errors.any?
9
+
10
+ messages = @object.errors.full_messages.collect do |msg|
11
+ "<p>#{ERB::Util.h(msg)}</p>".html_safe
12
+ end
13
+
14
+ content_tag(:div,
15
+ content_tag(:div,
16
+ content_tag(:div,
17
+ content_tag(:button, '&times;'.html_safe, class: 'close', type: 'button', :'data-dismiss' => 'alert') + messages.join('').html_safe,
18
+ class: 'alert alert-danger'),
19
+ class: 'col-md-8 col-md-offset-2'),
20
+ class: 'row')
21
+ end
22
+
23
+ def static_text(method, options = {})
24
+ row method, content_tag(:p, static_text_formatter.format(method), class: 'form-control-static'), options
25
+ end
26
+
27
+ # Displays multi-line static text in form
28
+ def static_memo_text(method, options = {})
29
+ row method, simple_format(@object.send(method), class: 'form-control-static'), options
30
+ end
31
+
32
+ def string method, options = {}
33
+ row method, text_field(method, with_default_options(options)), options
34
+ end
35
+
36
+ def combobox method, choices, options = {}, html_options = {}
37
+ row method, select(method, choices, options, with_default_options(html_options)), div_class: options.delete(:div_class) || 'col-md-6'
38
+ end
39
+
40
+ def enum(method, options = {}, html_options = {})
41
+ combobox method, object.class.send(method.to_s.pluralize).collect { |s| [s[0].humanize, s[0]] }, options, html_options
42
+ end
43
+
44
+ def enumerize(method, options = {}, html_options = {})
45
+ combobox method, object.class.send(method).values.collect { |s| [s.text, s] }, options, html_options
46
+ end
47
+
48
+ def list_all_combobox(association_name, options = {}, html_options = {})
49
+ collection_class = object.class.reflect_on_association(association_name).klass
50
+ combobox("#{association_name}_id", collection_class.all.sort_by(&:name).map { |element| [element.name, element.id] }, {include_blank: true}.merge(options), html_options)
51
+ end
52
+
53
+ def textarea method, options = {}
54
+ row method, text_area(method, with_default_options(options)), options
55
+ end
56
+
57
+ def checkbox method, options = {}
58
+ row method, content_tag(:div, check_box(method, options), class: 'checkbox'), options
59
+ end
60
+
61
+ def wysiwyg method, options = {}
62
+ textarea method, with_default_options(merge_classes(options, 'wymeditor'))
63
+ end
64
+
65
+ def ckeditor(method, options = {})
66
+ row method, cktext_area(method, with_default_options(options))
67
+ end
68
+
69
+ def password method, options = {}
70
+ row method, password_field(method, with_default_options(options)), options
71
+ end
72
+
73
+ def date method, options = {}
74
+ string(method, merge_options({data: {'calendar-date' => true}, div_class: 'col-md-2'}, options))
75
+ end
76
+
77
+ def datetime(method, options = {})
78
+ value = object.try(method).try(:strftime, '%Y-%m-%d %H:%M')
79
+ string(method, merge_options({data: {'calendar-datetime' => true}, div_class: 'col-md-3', value: value}, options))
80
+ end
81
+
82
+ def save text = 'Сохранить'
83
+ submit text, name: :save, class: 'btn btn-success wymupdate'
84
+ end
85
+
86
+ def apply text = 'Применить'
87
+ submit text, name: :apply, class: 'btn btn-default wymupdate'
88
+ end
89
+
90
+ def cancel
91
+ @template.back_action
92
+ end
93
+
94
+ # Editing has_many collection
95
+ # parameters: association - name of has_many association
96
+ # association should be defined as accepts_nested_attributes with allow_destroy = true in model
97
+ # You should create partial with name #{association)_fields
98
+ def nested_fields_for(association)
99
+ @template.render 'admin/common/nested_fields_for', f: self, section_name: @object.class.human_attribute_name(association), collection: association
100
+ end
101
+
102
+ def image_upload method, options = {}
103
+ version = options[:version]
104
+
105
+ uri = if version.present?
106
+ @object.send("#{method}_url", version)
107
+ else
108
+ @object.send("#{method}_url")
109
+ end
110
+
111
+ if options[:size]
112
+ url = uri || 'placeholder'
113
+ else
114
+ url = uri
115
+ end
116
+
117
+ upload_uri = options[:upload_path]
118
+ unless upload_uri
119
+ upload_uri = @template.admin_upload_image_path(image_class: @object.class.name.underscore, field: method)
120
+ end
121
+ @template.render partial: '/admin/common/image_upload_template', locals: {
122
+ f: self, url: url, size: options[:size],
123
+ version: version || '',
124
+ title: options[:title] || '',
125
+ text: options[:text],
126
+ field: method, upload_uri: upload_uri,
127
+ container: options[:parent_id] || upload_container_id(method),
128
+ options: options.delete(:options) || {},
129
+ image_style: options.delete(:image_style) || ''
130
+ }
131
+ end
132
+
133
+ def file_upload method
134
+ @template.render partial: '/admin/common/file_upload_template', locals: {
135
+ f: self,
136
+ field: method
137
+ }
138
+ end
139
+
140
+ def multi_field(relation_name, options = {})
141
+ options = {search_field_name: :name,
142
+ show_all_on_focus: false,
143
+ use_cache: true,
144
+ relation_model_name: self.object.class.reflections[relation_name].klass.model_name.singular}.merge!(options)
145
+ options[:source] ||= @template.admin_autocomplete_path(options[:relation_model_name], options[:search_field_name])
146
+ string "#{relation_name}_tokens", title: self.object.class.human_attribute_name(relation_name),
147
+ data: {
148
+ multi_field: true,
149
+ source: options[:source],
150
+ pre: self.object.send("#{relation_name}_json", options[:search_field_name]),
151
+ show_all_on_focus: options[:show_all_on_focus],
152
+ use_cache: options[:use_cache],
153
+ object_url_name: options[:object_url_name]}
154
+ end
155
+
156
+ def row(method, controls, options = {})
157
+ label_class = options[:label_class] || 'control-label col-md-4 col-lg-2'
158
+ label_tag = label(method, options[:title], class: label_class) unless options[:hide_label]
159
+ options[:div_class] ||= COLS_CLASS
160
+ div_tag = content_tag :div, controls.html_safe, class: options[:div_class]
161
+ content_tag :div, "#{label_tag}#{div_tag}".html_safe, class: 'form-group'
162
+ end
163
+
164
+ private
165
+
166
+ def upload_container_id(method)
167
+ fake_method = "#{method}_upload"
168
+ ActionView::Helpers::Tags::Base.new(@object_name, fake_method, @template).send(:tag_id)
169
+ end
170
+
171
+ def with_default_options(options)
172
+ merge_classes(options, 'form-control')
173
+ options
174
+ end
175
+
176
+ def merge_classes(options, *clazz)
177
+ classes = [options[:class]].compact
178
+ classes.push(*clazz)
179
+ options[:class] = classes.uniq.join(' ')
180
+ options
181
+ end
182
+
183
+ def merge_options(default_options, options)
184
+ return default_options if options.blank?
185
+ new_options = default_options.merge(options)
186
+ if default_options.has_key?(:data) && options.has_key?(:data)
187
+ new_options[:data] = default_options[:data].merge(options[:data])
188
+ end
189
+ new_options
190
+ end
191
+
192
+ def static_text_formatter
193
+ @static_text_formatter ||= StaticTextFormatter.new(@object)
194
+ end
195
+
196
+ end
@@ -0,0 +1,19 @@
1
+ class FileUpload < ActiveRecord::Base
2
+
3
+ mount_uploader :file, FileUploader
4
+
5
+ before_save :update_file_attributes
6
+
7
+ validates_presence_of :file, unless: :file_cache
8
+
9
+ private
10
+
11
+ def update_file_attributes
12
+ if file.present? && file_changed?
13
+ self.content_type = file.file.content_type
14
+ self.file_size = file.file.size
15
+ self.file_name = file.file.filename if self.respond_to? :file_name=
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,6 @@
1
+ class Lookup < ActiveRecord::Base
2
+
3
+ validates_presence_of :code
4
+ validates_uniqueness_of :code
5
+
6
+ end
@@ -0,0 +1,10 @@
1
+ class FileUploader < CarrierWave::Uploader::Base
2
+
3
+ storage :file
4
+
5
+ def store_dir
6
+ "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
7
+ end
8
+
9
+
10
+ end
@@ -0,0 +1,74 @@
1
+ #encoding: utf-8
2
+ require 'carrierwave/processing/mime_types'
3
+ require 'shellwords'
4
+
5
+ # TODO Добавить настройку watermark_image, position
6
+
7
+ class GenericImageUploader < CarrierWave::Uploader::Base
8
+ include CarrierWave::RMagick
9
+ include CarrierWave::MimeTypes
10
+
11
+ before :cache, :capture_size_before_cache
12
+
13
+ storage :file
14
+
15
+ process :set_content_type
16
+ process :set_image_properties
17
+
18
+ def watermark
19
+ return if !model || !model.respond_to?(getter(:watermarked?)) || !model.send(getter(:watermarked?))
20
+
21
+ manipulate! do |img|
22
+ logo = Magick::Image.read(Rails.root.join("app/assets/images/watermark.png")).first
23
+ img.composite(logo, Magick::SouthEastGravity, 0, 0, Magick::OverCompositeOp)
24
+ end
25
+ end
26
+
27
+ def store_dir
28
+ "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
29
+ end
30
+
31
+ #def default_url
32
+ # "/assets/fallback/" + [version_name, "default.png"].compact.join('_')
33
+ #end
34
+
35
+ def capture_size_before_cache(new_file)
36
+ return unless model
37
+ return unless new_file.path
38
+ if model.respond_to?(setter(:width)) && model.respond_to?(setter(:height))
39
+ w, h = `identify -format "%wx %h" #{new_file.path.shellescape}`.split(/x/).map { |dim| dim.to_i }
40
+ model.send(setter(:width), w)
41
+ model.send(setter(:height), h)
42
+ end
43
+ end
44
+
45
+ def set_image_properties
46
+ return if !model || !file
47
+
48
+ model.send(setter(:file_name), file.filename) if model.respond_to?(setter(:file_name))
49
+ model.send(setter(:size), file.size) if model.respond_to?(setter(:size))
50
+ model.send(setter(:content_type), file.content_type) if model.respond_to?(setter(:content_type))
51
+ end
52
+
53
+ private
54
+
55
+ def setter(name)
56
+ opt = model.class.uploader_options[mounted_as] || {}
57
+ if opt[:prefixed]
58
+ "#{mounted_as}_#{name}="
59
+ else
60
+ "#{name}="
61
+ end
62
+ end
63
+
64
+
65
+ def getter(name)
66
+ opt = model.class.uploader_options[mounted_as] || {}
67
+ if opt[:prefixed]
68
+ "#{mounted_as}_#{name}"
69
+ else
70
+ "#{name}"
71
+ end
72
+ end
73
+
74
+ end
@@ -0,0 +1,67 @@
1
+ #encoding: utf-8
2
+ class AdminStructure
3
+
4
+ include Rails.application.routes.url_helpers
5
+
6
+ Section = Struct.new(:name, :path, :icon, :description, :counter, :show_menu_counter, :creation_path) do
7
+
8
+ def show_menu_counter?
9
+ show_menu_counter.present?
10
+ end
11
+
12
+ end
13
+
14
+ Separator = Struct.new(:title)
15
+
16
+ CONFIG_FILE_NAME = 'structure.rb'
17
+
18
+ attr_accessor :sections
19
+
20
+ def initialize
21
+ @sections = []
22
+ load_sections_from_config
23
+ end
24
+
25
+ def menu_items
26
+ dashboard_item = Section.new('Сводка', admin_dashboard_path, 'glyphicon glyphicon-align-left')
27
+ [dashboard_item] + @sections
28
+ end
29
+
30
+ def sections
31
+ @sections.find_all { |section| section.is_a?(Section) }
32
+ end
33
+
34
+ private
35
+
36
+ def load_sections_from_config
37
+ config_path = Rails.root.join('config', CONFIG_FILE_NAME).to_s
38
+ if File.exist?(config_path)
39
+ instance_eval(File.read(config_path), config_path)
40
+ end
41
+ end
42
+
43
+ # Options:
44
+ # creation_path - false or path string
45
+ def section(section_reference, options = {})
46
+ path = options.delete(:path)
47
+ icon = options.delete(:icon)
48
+ description = options.delete(:description)
49
+ counter = options.delete(:counter)
50
+ show_menu_counter = options.delete(:show_menu_counter)
51
+ creation_path = options.delete(:creation_path)
52
+ if section_reference.is_a?(Class)
53
+ section_name = section_reference.model_name.human
54
+ path = send("admin_#{section_reference.model_name.route_key}_path") unless path
55
+ counter = ->() { section_reference.count } unless counter
56
+ creation_path = send("new_admin_#{section_reference.model_name.singular}_path") if creation_path.nil?
57
+ else
58
+ section_name = section_reference
59
+ end
60
+ @sections << Section.new(section_name, path, icon, description, counter, show_menu_counter, creation_path)
61
+ end
62
+
63
+ def separator(title)
64
+ @sections << Separator.new(title)
65
+ end
66
+
67
+ end
@@ -0,0 +1,40 @@
1
+ class BootstrapLinkRenderer < WillPaginate::ActionView::LinkRenderer
2
+
3
+ protected
4
+
5
+ def html_container(html)
6
+ tag(:div, tag(:ul, html, class: 'pagination'), class: 't-center')
7
+ end
8
+
9
+ def page_number(page)
10
+ if page == current_page
11
+ tag(:li, tag(:a, page), class: 'active')
12
+ else
13
+ tag(:li, link(page, page, rel: rel_value(page)))
14
+ end
15
+ end
16
+
17
+ def gap
18
+ text = @template.will_paginate_translate(:page_gap) { '&hellip;' }
19
+ tag(:li, tag(:a, text), class: 'disabled')
20
+ end
21
+
22
+ def previous_page
23
+ num = @collection.current_page > 1 && @collection.current_page - 1
24
+ previous_or_next_page(num, @options[:previous_label])
25
+ end
26
+
27
+ def next_page
28
+ num = @collection.current_page < @collection.total_pages && @collection.current_page + 1
29
+ previous_or_next_page(num, @options[:next_label])
30
+ end
31
+
32
+ def previous_or_next_page(page, text)
33
+ if page
34
+ tag(:li, link(text, page))
35
+ else
36
+ tag(:li, tag(:a, text), class: 'disabled')
37
+ end
38
+ end
39
+
40
+ end