georgia 0.7.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 (366) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +27 -0
  4. data/Rakefile +27 -0
  5. data/app/assets/fonts/georgia/signika-bold-webfont.eot +0 -0
  6. data/app/assets/fonts/georgia/signika-bold-webfont.svg +1711 -0
  7. data/app/assets/fonts/georgia/signika-bold-webfont.ttf +0 -0
  8. data/app/assets/fonts/georgia/signika-bold-webfont.woff +0 -0
  9. data/app/assets/fonts/georgia/signika-light-webfont.eot +0 -0
  10. data/app/assets/fonts/georgia/signika-light-webfont.svg +1680 -0
  11. data/app/assets/fonts/georgia/signika-light-webfont.ttf +0 -0
  12. data/app/assets/fonts/georgia/signika-light-webfont.woff +0 -0
  13. data/app/assets/fonts/georgia/signika-regular-webfont.eot +0 -0
  14. data/app/assets/fonts/georgia/signika-regular-webfont.svg +1746 -0
  15. data/app/assets/fonts/georgia/signika-regular-webfont.ttf +0 -0
  16. data/app/assets/fonts/georgia/signika-regular-webfont.woff +0 -0
  17. data/app/assets/images/georgia/bg-body-bar.jpg +0 -0
  18. data/app/assets/images/georgia/checkmark.png +0 -0
  19. data/app/assets/images/georgia/content-types/avi.jpg +0 -0
  20. data/app/assets/images/georgia/content-types/css.jpg +0 -0
  21. data/app/assets/images/georgia/content-types/csv.jpg +0 -0
  22. data/app/assets/images/georgia/content-types/doc.jpg +0 -0
  23. data/app/assets/images/georgia/content-types/docx.jpg +0 -0
  24. data/app/assets/images/georgia/content-types/eps.jpg +0 -0
  25. data/app/assets/images/georgia/content-types/gif.jpg +0 -0
  26. data/app/assets/images/georgia/content-types/gz.jpg +0 -0
  27. data/app/assets/images/georgia/content-types/html.jpg +0 -0
  28. data/app/assets/images/georgia/content-types/jpg.jpg +0 -0
  29. data/app/assets/images/georgia/content-types/mp3.jpg +0 -0
  30. data/app/assets/images/georgia/content-types/ods.jpg +0 -0
  31. data/app/assets/images/georgia/content-types/odt.jpg +0 -0
  32. data/app/assets/images/georgia/content-types/pdf.jpg +0 -0
  33. data/app/assets/images/georgia/content-types/png.jpg +0 -0
  34. data/app/assets/images/georgia/content-types/ppt.jpg +0 -0
  35. data/app/assets/images/georgia/content-types/pptx.jpg +0 -0
  36. data/app/assets/images/georgia/content-types/rar.jpg +0 -0
  37. data/app/assets/images/georgia/content-types/tar.jpg +0 -0
  38. data/app/assets/images/georgia/content-types/txt.jpg +0 -0
  39. data/app/assets/images/georgia/content-types/wav.jpg +0 -0
  40. data/app/assets/images/georgia/content-types/xls.jpg +0 -0
  41. data/app/assets/images/georgia/content-types/zip.jpg +0 -0
  42. data/app/assets/images/georgia/down_arrow.gif +0 -0
  43. data/app/assets/images/georgia/grippy_large.png +0 -0
  44. data/app/assets/images/georgia/indeterminate.png +0 -0
  45. data/app/assets/images/georgia/logo.png +0 -0
  46. data/app/assets/images/georgia/select2-spinner.gif +0 -0
  47. data/app/assets/images/georgia/select2.png +0 -0
  48. data/app/assets/images/georgia/select2x2.png +0 -0
  49. data/app/assets/images/georgia/transparent.jpg +0 -0
  50. data/app/assets/images/georgia/up_arrow.gif +0 -0
  51. data/app/assets/images/ui-bg_glass_75_ffffff_1x400.png +0 -0
  52. data/app/assets/javascripts/georgia/application.js +20 -0
  53. data/app/assets/javascripts/georgia/bootstrap-vendor.js.coffee +13 -0
  54. data/app/assets/javascripts/georgia/ckeditor/config.js +22 -0
  55. data/app/assets/javascripts/georgia/components/asset-replacer.js.coffee +25 -0
  56. data/app/assets/javascripts/georgia/components/asset-uploader.js.coffee +44 -0
  57. data/app/assets/javascripts/georgia/components/flash.js.coffee +15 -0
  58. data/app/assets/javascripts/georgia/components/forms/menu.js.coffee +66 -0
  59. data/app/assets/javascripts/georgia/components/forms/revision.js.coffee +22 -0
  60. data/app/assets/javascripts/georgia/components/forms/spinning.js.coffee +51 -0
  61. data/app/assets/javascripts/georgia/components/media-library.js.coffee +57 -0
  62. data/app/assets/javascripts/georgia/components/portlets/link.js.coffee +14 -0
  63. data/app/assets/javascripts/georgia/components/portlets/slide.js.coffee +38 -0
  64. data/app/assets/javascripts/georgia/components/portlets/widget.js.coffee +47 -0
  65. data/app/assets/javascripts/georgia/components/position_sort.js.coffee +20 -0
  66. data/app/assets/javascripts/georgia/components/tables/checkbox.js.coffee +123 -0
  67. data/app/assets/javascripts/georgia/components/tables/media.js.coffee +59 -0
  68. data/app/assets/javascripts/georgia/components/tables/messages.js.coffee +59 -0
  69. data/app/assets/javascripts/georgia/components/tables/pages.js.coffee +93 -0
  70. data/app/assets/javascripts/georgia/components/tags.js.coffee +36 -0
  71. data/app/assets/javascripts/georgia/components/widget.js.coffee +32 -0
  72. data/app/assets/javascripts/georgia/featured-image.js.coffee +8 -0
  73. data/app/assets/javascripts/georgia/keybindings.js.coffee +42 -0
  74. data/app/assets/javascripts/georgia/toggle.js.coffee +4 -0
  75. data/app/assets/javascripts/georgia/vendor/bootstrap-datetimepicker.js +28 -0
  76. data/app/assets/javascripts/georgia/vendor/jquery.mjs.nestedSortable.js +608 -0
  77. data/app/assets/javascripts/georgia/vendor/jquery.ui.touch-punch.js +160 -0
  78. data/app/assets/javascripts/georgia/vendor/moment.js +6 -0
  79. data/app/assets/stylesheets/georgia/application.css.scss +16 -0
  80. data/app/assets/stylesheets/georgia/components/_box.scss +29 -0
  81. data/app/assets/stylesheets/georgia/components/_button.scss +60 -0
  82. data/app/assets/stylesheets/georgia/components/_checkbox.scss +48 -0
  83. data/app/assets/stylesheets/georgia/components/_form.scss +8 -0
  84. data/app/assets/stylesheets/georgia/components/_help.scss +4 -0
  85. data/app/assets/stylesheets/georgia/components/_icon.scss +7 -0
  86. data/app/assets/stylesheets/georgia/components/_input.scss +48 -0
  87. data/app/assets/stylesheets/georgia/components/_label.scss +4 -0
  88. data/app/assets/stylesheets/georgia/components/_modal.scss +14 -0
  89. data/app/assets/stylesheets/georgia/components/_nav-list.scss +13 -0
  90. data/app/assets/stylesheets/georgia/components/_note.scss +31 -0
  91. data/app/assets/stylesheets/georgia/components/_portlet.scss +57 -0
  92. data/app/assets/stylesheets/georgia/components/_progress.scss +4 -0
  93. data/app/assets/stylesheets/georgia/components/_state.scss +17 -0
  94. data/app/assets/stylesheets/georgia/components/_table.scss +8 -0
  95. data/app/assets/stylesheets/georgia/components/_transparent.scss +3 -0
  96. data/app/assets/stylesheets/georgia/layout/_base.scss +94 -0
  97. data/app/assets/stylesheets/georgia/layout/_devise.scss +5 -0
  98. data/app/assets/stylesheets/georgia/mixins/_clearfix.scss +12 -0
  99. data/app/assets/stylesheets/georgia/mixins/_ellipsis.scss +8 -0
  100. data/app/assets/stylesheets/georgia/mixins/_inflectors.scss +1 -0
  101. data/app/assets/stylesheets/georgia/mixins/_opacity.scss +6 -0
  102. data/app/assets/stylesheets/georgia/mixins/_utilities.scss +13 -0
  103. data/app/assets/stylesheets/georgia/modules/_facets.scss +4 -0
  104. data/app/assets/stylesheets/georgia/modules/_footer.scss +9 -0
  105. data/app/assets/stylesheets/georgia/modules/_form_with_helpers.scss +17 -0
  106. data/app/assets/stylesheets/georgia/modules/_header.scss +66 -0
  107. data/app/assets/stylesheets/georgia/modules/_link.scss +51 -0
  108. data/app/assets/stylesheets/georgia/modules/_login.scss +7 -0
  109. data/app/assets/stylesheets/georgia/modules/_media.scss +55 -0
  110. data/app/assets/stylesheets/georgia/modules/_menu.scss +7 -0
  111. data/app/assets/stylesheets/georgia/modules/_message.scss +53 -0
  112. data/app/assets/stylesheets/georgia/modules/_notifications.scss +26 -0
  113. data/app/assets/stylesheets/georgia/modules/_pages.scss +7 -0
  114. data/app/assets/stylesheets/georgia/modules/_pagination.scss +41 -0
  115. data/app/assets/stylesheets/georgia/modules/_results.scss +46 -0
  116. data/app/assets/stylesheets/georgia/modules/_revision.scss +18 -0
  117. data/app/assets/stylesheets/georgia/modules/_sidebar.scss +71 -0
  118. data/app/assets/stylesheets/georgia/modules/_slide.scss +11 -0
  119. data/app/assets/stylesheets/georgia/modules/_subpage.scss +25 -0
  120. data/app/assets/stylesheets/georgia/modules/_users.scss +3 -0
  121. data/app/assets/stylesheets/georgia/modules/_widget.scss +45 -0
  122. data/app/assets/stylesheets/georgia/overrides/_select2.scss +5 -0
  123. data/app/assets/stylesheets/georgia/settings/_base.scss +6 -0
  124. data/app/assets/stylesheets/georgia/settings/_colors.scss +41 -0
  125. data/app/assets/stylesheets/georgia/settings/_fonts.scss +3 -0
  126. data/app/assets/stylesheets/georgia/settings/_z-index.scss +7 -0
  127. data/app/assets/stylesheets/georgia/vendor/_autocomplete.scss +50 -0
  128. data/app/assets/stylesheets/georgia/vendor/_bootstrap-datetimepicker.scss +174 -0
  129. data/app/assets/stylesheets/georgia/vendor/_select2.scss +18 -0
  130. data/app/assets/stylesheets/georgia/vendor/_tooltip.scss +98 -0
  131. data/app/controllers/georgia/api/media_controller.rb +18 -0
  132. data/app/controllers/georgia/api/tags_controller.rb +22 -0
  133. data/app/controllers/georgia/application_controller.rb +25 -0
  134. data/app/controllers/georgia/concerns/frontendable.rb +45 -0
  135. data/app/controllers/georgia/concerns/helpers.rb +28 -0
  136. data/app/controllers/georgia/dashboard_controller.rb +14 -0
  137. data/app/controllers/georgia/links_controller.rb +13 -0
  138. data/app/controllers/georgia/media_controller.rb +101 -0
  139. data/app/controllers/georgia/menus_controller.rb +80 -0
  140. data/app/controllers/georgia/messages_controller.rb +74 -0
  141. data/app/controllers/georgia/pages_controller.rb +180 -0
  142. data/app/controllers/georgia/revisions_controller.rb +89 -0
  143. data/app/controllers/georgia/slides_controller.rb +13 -0
  144. data/app/controllers/georgia/ui_associations_controller.rb +12 -0
  145. data/app/controllers/georgia/users/sessions_controller.rb +7 -0
  146. data/app/controllers/georgia/users_controller.rb +51 -0
  147. data/app/controllers/georgia/widgets_controller.rb +67 -0
  148. data/app/controllers/messages_controller.rb +29 -0
  149. data/app/decorators/ckeditor/asset_decorator.rb +13 -0
  150. data/app/decorators/ckeditor/assets_decorator.rb +4 -0
  151. data/app/decorators/ckeditor/picture_decorator.rb +9 -0
  152. data/app/decorators/ckeditor/pictures_decorator.rb +4 -0
  153. data/app/decorators/georgia/application_decorator.rb +6 -0
  154. data/app/decorators/georgia/link_decorator.rb +9 -0
  155. data/app/decorators/georgia/links_decorator.rb +4 -0
  156. data/app/decorators/georgia/message_decorator.rb +21 -0
  157. data/app/decorators/georgia/messages_decorator.rb +4 -0
  158. data/app/decorators/georgia/page_decorator.rb +31 -0
  159. data/app/decorators/georgia/pages_decorator.rb +4 -0
  160. data/app/decorators/georgia/revision_decorator.rb +28 -0
  161. data/app/decorators/georgia/slide_decorator.rb +4 -0
  162. data/app/decorators/georgia/widget_decorator.rb +4 -0
  163. data/app/decorators/pagination_decorator.rb +3 -0
  164. data/app/decorators/sunspot/highlighted_hit_decorator.rb +29 -0
  165. data/app/helpers/georgia/checkboxes_helper.rb +13 -0
  166. data/app/helpers/georgia/devise_helper.rb +15 -0
  167. data/app/helpers/georgia/facets_helper.rb +35 -0
  168. data/app/helpers/georgia/forms_helper.rb +68 -0
  169. data/app/helpers/georgia/header_helper.rb +10 -0
  170. data/app/helpers/georgia/internationalization_helper.rb +32 -0
  171. data/app/helpers/georgia/menus_helper.rb +20 -0
  172. data/app/helpers/georgia/messages_helper.rb +9 -0
  173. data/app/helpers/georgia/meta_tags_helper.rb +22 -0
  174. data/app/helpers/georgia/modals_helper.rb +7 -0
  175. data/app/helpers/georgia/pages_helper.rb +22 -0
  176. data/app/helpers/georgia/pagination_helper.rb +10 -0
  177. data/app/helpers/georgia/routes_helper.rb +25 -0
  178. data/app/helpers/georgia/sidebar_helper.rb +13 -0
  179. data/app/helpers/georgia/states_helper.rb +17 -0
  180. data/app/helpers/georgia/twitter_helper.rb +24 -0
  181. data/app/helpers/georgia/ui_helper.rb +51 -0
  182. data/app/mailers/georgia/notifier.rb +33 -0
  183. data/app/models/ability.rb +19 -0
  184. data/app/models/ckeditor/asset.rb +61 -0
  185. data/app/models/ckeditor/attachment_file.rb +7 -0
  186. data/app/models/ckeditor/picture.rb +15 -0
  187. data/app/models/georgia/clone.rb +101 -0
  188. data/app/models/georgia/concerns/cacheable.rb +18 -0
  189. data/app/models/georgia/concerns/contentable.rb +22 -0
  190. data/app/models/georgia/concerns/indexable.rb +67 -0
  191. data/app/models/georgia/concerns/orderable.rb +21 -0
  192. data/app/models/georgia/concerns/publishable.rb +35 -0
  193. data/app/models/georgia/concerns/revisionable.rb +38 -0
  194. data/app/models/georgia/concerns/slugable.rb +46 -0
  195. data/app/models/georgia/concerns/statable.rb +64 -0
  196. data/app/models/georgia/concerns/taggable.rb +19 -0
  197. data/app/models/georgia/concerns/templatable.rb +20 -0
  198. data/app/models/georgia/concerns/treeable.rb +26 -0
  199. data/app/models/georgia/content.rb +15 -0
  200. data/app/models/georgia/link.rb +27 -0
  201. data/app/models/georgia/menu.rb +13 -0
  202. data/app/models/georgia/message.rb +47 -0
  203. data/app/models/georgia/page.rb +20 -0
  204. data/app/models/georgia/revision.rb +22 -0
  205. data/app/models/georgia/role.rb +10 -0
  206. data/app/models/georgia/slide.rb +13 -0
  207. data/app/models/georgia/status.rb +29 -0
  208. data/app/models/georgia/ui_association.rb +27 -0
  209. data/app/models/georgia/ui_section.rb +12 -0
  210. data/app/models/georgia/user.rb +27 -0
  211. data/app/models/georgia/widget.rb +32 -0
  212. data/app/parsers/georgia/menu_ancestry_parser.rb +41 -0
  213. data/app/policies/georgia/policy.rb +17 -0
  214. data/app/policies/georgia/revision_policy.rb +53 -0
  215. data/app/presenters/georgia/active_facet_presenter.rb +25 -0
  216. data/app/presenters/georgia/facet_presenter.rb +26 -0
  217. data/app/presenters/georgia/link_portlet.rb +101 -0
  218. data/app/presenters/georgia/list_facet_presenter.rb +32 -0
  219. data/app/presenters/georgia/media_library_presenter.rb +44 -0
  220. data/app/presenters/georgia/message_actions_presenter.rb +51 -0
  221. data/app/presenters/georgia/page_actions_presenter.rb +94 -0
  222. data/app/presenters/georgia/pagination_presenter.rb +58 -0
  223. data/app/presenters/georgia/portlet.rb +30 -0
  224. data/app/presenters/georgia/presenter.rb +17 -0
  225. data/app/presenters/georgia/sidebar_link_presenter.rb +55 -0
  226. data/app/presenters/georgia/single_active_facet_presenter.rb +10 -0
  227. data/app/presenters/georgia/slide_portlet.rb +79 -0
  228. data/app/presenters/georgia/subpage_portlet.rb +36 -0
  229. data/app/presenters/georgia/warning_message.rb +55 -0
  230. data/app/presenters/georgia/widget_portlet.rb +75 -0
  231. data/app/sweepers/navigation_sweeper.rb +12 -0
  232. data/app/uploaders/ckeditor_attachment_file_uploader.rb +16 -0
  233. data/app/uploaders/ckeditor_picture_uploader.rb +36 -0
  234. data/app/uploaders/georgia/attachment_uploader.rb +16 -0
  235. data/app/views/georgia/api/media/pictures.html.erb +17 -0
  236. data/app/views/georgia/ckeditor/assets/_asset.html.erb +23 -0
  237. data/app/views/georgia/ckeditor/attachment_files/_attachment_file.html.erb +1 -0
  238. data/app/views/georgia/ckeditor/pictures/_picture.html.erb +26 -0
  239. data/app/views/georgia/dashboard/panels/_messages.html.erb +30 -0
  240. data/app/views/georgia/dashboard/panels/_reviews.html.erb +24 -0
  241. data/app/views/georgia/dashboard/show.html.erb +18 -0
  242. data/app/views/georgia/header/_dashboard.html.erb +1 -0
  243. data/app/views/georgia/header/_media.html.erb +3 -0
  244. data/app/views/georgia/header/_messages.html.erb +3 -0
  245. data/app/views/georgia/header/_navigation.html.erb +3 -0
  246. data/app/views/georgia/header/_pages.html.erb +3 -0
  247. data/app/views/georgia/header/_users.html.erb +3 -0
  248. data/app/views/georgia/header/_widgets.html.erb +3 -0
  249. data/app/views/georgia/links/show.html.erb +1 -0
  250. data/app/views/georgia/media/_header.html.erb +27 -0
  251. data/app/views/georgia/media/create.js.erb +1 -0
  252. data/app/views/georgia/media/edit.html.erb +74 -0
  253. data/app/views/georgia/media/search.html.erb +36 -0
  254. data/app/views/georgia/media/sidebar/_facets.html.erb +12 -0
  255. data/app/views/georgia/menus/_menu.html.erb +7 -0
  256. data/app/views/georgia/menus/create.js.erb +5 -0
  257. data/app/views/georgia/menus/edit.html.erb +37 -0
  258. data/app/views/georgia/menus/index.html.erb +36 -0
  259. data/app/views/georgia/messages/_message.html.erb +26 -0
  260. data/app/views/georgia/messages/destroy.js.erb +3 -0
  261. data/app/views/georgia/messages/search.html.erb +58 -0
  262. data/app/views/georgia/messages/show.html.erb +46 -0
  263. data/app/views/georgia/notifier/notify_admins.html.erb +10 -0
  264. data/app/views/georgia/notifier/notify_editors.html.erb +10 -0
  265. data/app/views/georgia/notifier/notify_support.html.erb +9 -0
  266. data/app/views/georgia/pages/_header.html.erb +22 -0
  267. data/app/views/georgia/pages/_page.html.erb +19 -0
  268. data/app/views/georgia/pages/_subpage.html.erb +1 -0
  269. data/app/views/georgia/pages/create.js.erb +6 -0
  270. data/app/views/georgia/pages/search.html.erb +32 -0
  271. data/app/views/georgia/pages/settings.html.erb +79 -0
  272. data/app/views/georgia/pages/templates/_custom.html.erb +7 -0
  273. data/app/views/georgia/pages/templates/_default.html.erb +7 -0
  274. data/app/views/georgia/pages/templates/_one-column.html.erb +7 -0
  275. data/app/views/georgia/pages/templates/_sidebar-left.html.erb +10 -0
  276. data/app/views/georgia/pages/templates/_sidebar-right.html.erb +10 -0
  277. data/app/views/georgia/revisions/_revision.html.erb +11 -0
  278. data/app/views/georgia/revisions/edit.html.erb +36 -0
  279. data/app/views/georgia/revisions/fields/_content.html.erb +43 -0
  280. data/app/views/georgia/revisions/fields/_slides.html.erb +19 -0
  281. data/app/views/georgia/revisions/fields/_template.html.erb +8 -0
  282. data/app/views/georgia/revisions/fields/_ui_section.html.erb +14 -0
  283. data/app/views/georgia/revisions/fields/_widgets.html.erb +11 -0
  284. data/app/views/georgia/revisions/index.html.erb +25 -0
  285. data/app/views/georgia/shared/_messages.html.erb +11 -0
  286. data/app/views/georgia/shared/modals/_media_library.html.erb +35 -0
  287. data/app/views/georgia/shared/modals/_menu.html.erb +20 -0
  288. data/app/views/georgia/shared/modals/_page.html.erb +20 -0
  289. data/app/views/georgia/shared/modals/_progress.html.erb +15 -0
  290. data/app/views/georgia/shared/modals/_widget.html.erb +24 -0
  291. data/app/views/georgia/shared/search/_messages.html.erb +4 -0
  292. data/app/views/georgia/slides/new.html.erb +1 -0
  293. data/app/views/georgia/ui_associations/new.html.erb +1 -0
  294. data/app/views/georgia/users/_form.html.erb +27 -0
  295. data/app/views/georgia/users/_user.html.erb +9 -0
  296. data/app/views/georgia/users/edit.html.erb +22 -0
  297. data/app/views/georgia/users/index.html.erb +25 -0
  298. data/app/views/georgia/users/new.html.erb +19 -0
  299. data/app/views/georgia/users/registrations/new.html.erb +20 -0
  300. data/app/views/georgia/users/sessions/new.html.erb +17 -0
  301. data/app/views/georgia/widgets/_widget.html.erb +35 -0
  302. data/app/views/georgia/widgets/create.js.erb +5 -0
  303. data/app/views/georgia/widgets/index.html.erb +31 -0
  304. data/app/views/layouts/georgia/_footer.html.erb +7 -0
  305. data/app/views/layouts/georgia/_head.html.erb +15 -0
  306. data/app/views/layouts/georgia/_header.html.erb +40 -0
  307. data/app/views/layouts/georgia/_messages.html.erb +7 -0
  308. data/app/views/layouts/georgia/_sidebar.html.erb +9 -0
  309. data/app/views/layouts/georgia/application.html.erb +16 -0
  310. data/app/views/layouts/georgia/devise.html.erb +11 -0
  311. data/app/views/menus/_dropdown_group.html.erb +10 -0
  312. data/app/views/menus/_dropdown_link.html.erb +3 -0
  313. data/app/views/menus/_dropdown_menu.html.erb +11 -0
  314. data/app/views/menus/_link.html.erb +1 -0
  315. data/app/views/menus/_menu.html.erb +7 -0
  316. data/app/views/messages/create.js.erb +0 -0
  317. data/app/workers/spam_worker.rb +12 -0
  318. data/config/initializers/acts_as_taggable_on.rb +19 -0
  319. data/config/initializers/ckeditor.rb +18 -0
  320. data/config/initializers/devise.rb +254 -0
  321. data/config/initializers/inflections.rb +3 -0
  322. data/config/initializers/revisions.rb +5 -0
  323. data/config/initializers/simple_form.rb +79 -0
  324. data/config/locales/georgia.en.yml +4 -0
  325. data/config/routes.rb +79 -0
  326. data/db/migrate/001_create_ckeditor_assets.rb +25 -0
  327. data/db/migrate/002_create_georgia_contents.rb +18 -0
  328. data/db/migrate/003_create_georgia_links.rb +12 -0
  329. data/db/migrate/004_create_georgia_menus.rb +10 -0
  330. data/db/migrate/005_create_georgia_messages.rb +21 -0
  331. data/db/migrate/006_create_georgia_pages.rb +21 -0
  332. data/db/migrate/007_create_georgia_revisions.rb +12 -0
  333. data/db/migrate/008_create_georgia_roles.rb +10 -0
  334. data/db/migrate/009_create_georgia_slides.rb +11 -0
  335. data/db/migrate/010_create_georgia_ui_associations.rb +13 -0
  336. data/db/migrate/011_create_georgia_ui_sections.rb +9 -0
  337. data/db/migrate/012_create_georgia_users.rb +24 -0
  338. data/db/migrate/013_create_georgia_widgets.rb +9 -0
  339. data/db/migrate/014_create_roles_users.rb +11 -0
  340. data/db/migrate/015_create_tags.rb +20 -0
  341. data/lib/generators/georgia/install/install_generator.rb +60 -0
  342. data/lib/generators/georgia/install/templates/Procfile +1 -0
  343. data/lib/generators/georgia/install/templates/README +14 -0
  344. data/lib/generators/georgia/install/templates/app/controllers/pages_controller.rb +13 -0
  345. data/lib/generators/georgia/install/templates/config/initializers/georgia.rb +15 -0
  346. data/lib/generators/georgia/upgrade/templates/add_anti_spam_to_messages.rb +12 -0
  347. data/lib/generators/georgia/upgrade/templates/add_contents_counter_cache_to_images.rb +15 -0
  348. data/lib/generators/georgia/upgrade/templates/add_public_to_georgia_pages.rb +8 -0
  349. data/lib/generators/georgia/upgrade/templates/add_state_to_georgia_pages.rb +13 -0
  350. data/lib/generators/georgia/upgrade/templates/create_georgia_revisions.rb +12 -0
  351. data/lib/generators/georgia/upgrade/upgrade_generator.rb +34 -0
  352. data/lib/georgia.rb +23 -0
  353. data/lib/georgia/assets.rb +8 -0
  354. data/lib/georgia/assets/cloud_files_connection.rb +22 -0
  355. data/lib/georgia/assets/transferable_picture.rb +51 -0
  356. data/lib/georgia/engine.rb +58 -0
  357. data/lib/georgia/paths.rb +22 -0
  358. data/lib/georgia/version.rb +3 -0
  359. data/lib/tasks/assets.rake +106 -0
  360. data/lib/tasks/georgia.rake +61 -0
  361. data/lib/tasks/install.rake +19 -0
  362. data/lib/tasks/sidekiq.rake +8 -0
  363. data/lib/tasks/solr.rake +30 -0
  364. data/lib/tasks/upgrade.rake +39 -0
  365. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  366. metadata +857 -0
@@ -0,0 +1,28 @@
1
+ require 'active_support/concern'
2
+
3
+ module Georgia
4
+ module Concerns
5
+ module Helpers
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ helper_method :instance_name
10
+ helper_method :model
11
+ end
12
+
13
+ def instance_name
14
+ controller_name.singularize
15
+ end
16
+
17
+ def model
18
+ begin
19
+ self.class.to_s.gsub(/Controller/,'').singularize.constantize
20
+ # If no constant is found, check if the non-namespaced one exists. i.e. Partner => Admin::PartnersController
21
+ rescue NameError
22
+ self.class.to_s.gsub(/Controller/,'').gsub(/\w+::/,'').singularize.constantize
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ module Georgia
2
+ class DashboardController < Georgia::ApplicationController
3
+
4
+ def show
5
+ if can?(:approve, Georgia::Revision) or can?(:review, Georgia::Revision)
6
+ @awaiting_revisions = Georgia::Revision.reviews.select{|r| r.revisionable.present?}
7
+ end
8
+ if can?(:index, Georgia::Message)
9
+ @messages = Georgia::Message.ham.latest.limit(5).decorate
10
+ end
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module Georgia
2
+ class LinksController < ApplicationController
3
+
4
+ # Renders new portlet for menus#edit
5
+ def create
6
+ @link = Link.create
7
+ @link.contents.build(locale: current_locale)
8
+ render :show, layout: false
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,101 @@
1
+ module Georgia
2
+ class MediaController < ApplicationController
3
+
4
+ load_and_authorize_resource class: Ckeditor::Asset
5
+ # destroy's :id param is an Array and makes load_resource fails
6
+ skip_load_resource only: :destroy
7
+
8
+ def index
9
+ redirect_to action: :search
10
+ end
11
+
12
+ def search
13
+ @asset = Ckeditor::Asset.new
14
+ session[:search_params] = params
15
+ @search = Ckeditor::Asset.search do
16
+ fulltext params[:query] do
17
+ fields(:filename, :tags)
18
+ end
19
+ with(:extension, params[:e]) unless params[:e].blank?
20
+ with(:tags).any_of(params[:tg]) unless params[:tg].blank?
21
+ order_by (params[:o] || :updated_at), (params[:dir] || :desc)
22
+ paginate(page: params[:page], per_page: (params[:per] || 8))
23
+ end
24
+ @assets = Ckeditor::AssetDecorator.decorate_collection(@search.results)
25
+ end
26
+
27
+ def create
28
+ @assets = []
29
+ params[:assets].each do |asset|
30
+ klass = asset.content_type.match(/^image/) ? Ckeditor::Picture : Ckeditor::Asset
31
+ @assets << klass.create(data: asset)
32
+ end
33
+ render layout: false
34
+ end
35
+
36
+ def show
37
+ redirect_to edit_media_path(id: params[:id])
38
+ end
39
+
40
+ def edit
41
+ @asset = Ckeditor::Asset.find(params[:id])
42
+ end
43
+
44
+ def update
45
+ @asset = Ckeditor::Asset.find(params[:id])
46
+ if @asset.update_attributes(params[:asset])
47
+ respond_to do |format|
48
+ format.html { redirect_to edit_media_path(@asset), notice: "Asset was successfully updated." }
49
+ format.js { head :ok }
50
+ end
51
+ else
52
+ respond_to do |format|
53
+ format.html { redirect_to edit_media_path(@asset), alert: "Oups. Something went wrong." }
54
+ format.js { head :internal_server_error }
55
+ end
56
+ end
57
+ end
58
+
59
+ # Destroy multiple assets
60
+ def destroy
61
+ @assets = Ckeditor::Asset.where(id: params[:id])
62
+ if can?(:destroy, Ckeditor::Asset) and @assets.destroy_all
63
+ respond_to do |format|
64
+ format.html { redirect_to search_media_index_path, notice: "Assets were successfully deleted." }
65
+ format.js { head :ok }
66
+ end
67
+ else
68
+ respond_to do |format|
69
+ format.html { redirect_to search_media_index_path, alert: "Oups. Something went wrong." }
70
+ format.js { head :internal_server_error }
71
+ end
72
+ end
73
+ end
74
+
75
+ # Download multiple assets as a zip file
76
+ # TODO: We could send via AJAX with jquery.fileDownload plugin
77
+ # We could then have a download spinner while the request is processing, even a progress bar
78
+ def download
79
+ ids = params[:ids].split(',')
80
+ @files = Ckeditor::Asset.find(ids)
81
+ t = Tempfile.new("tmp-zip-#{Time.now.to_i}")
82
+ Zip::OutputStream.open(t.path) do |zos|
83
+ @files.each do |file|
84
+ filename = file.filename
85
+ zos.put_next_entry(filename)
86
+ tmp_file = Tempfile.new(filename)
87
+ open(file.url) do |data|
88
+ tmp_file.write data.read.force_encoding('UTF-8')
89
+ end
90
+ zos.print IO.read(tmp_file)
91
+ tmp_file.close
92
+ end
93
+ end
94
+ filename = "#{Georgia.title.try(:parameterize) || 'georgia'}_assets_#{Time.now.strftime('%Y%m%d%H%M%S')}.zip"
95
+ t.close
96
+
97
+ send_file t.path, type: "application/zip", disposition: 'attachment', filename: filename
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,80 @@
1
+ module Georgia
2
+ class MenusController < ApplicationController
3
+
4
+ load_and_authorize_resource class: Menu
5
+
6
+ def index
7
+ @menus = Menu.scoped.page(params[:page])
8
+ end
9
+
10
+ def new
11
+ @menu = Menu.new
12
+ end
13
+
14
+ def create
15
+ @menu = Menu.new(params[:menu])
16
+ if @menu.save
17
+ respond_to do |format|
18
+ format.html { redirect_to [:edit, @menu], notice: "#{@menu.title} was successfully created." }
19
+ format.js { render layout: false }
20
+ end
21
+ else
22
+ respond_to do |format|
23
+ format.html { render :edit }
24
+ format.js { render layout: false }
25
+ end
26
+ end
27
+ end
28
+
29
+ def show
30
+ redirect_to edit_menu_path(params[:id])
31
+ end
32
+
33
+ def edit
34
+ @menu = Menu.find(params[:id])
35
+ @links = @menu.links.roots
36
+ end
37
+
38
+ def update
39
+ @menu = Menu.find(params[:id])
40
+ update_links_attributes(params[:menu].delete(:ancestry))
41
+ update_links_menu_id
42
+ if @menu.update_attributes(params[:menu])
43
+ respond_to do |format|
44
+ format.html { redirect_to [:edit, @menu], notice: "#{@menu.title} was successfully updated." }
45
+ format.js { head :ok }
46
+ end
47
+ else
48
+ respond_to do |format|
49
+ format.html { render :edit, alert: "Oups. Something went wrong." }
50
+ format.js { head :internal_server_error }
51
+ end
52
+ end
53
+ end
54
+
55
+ def destroy
56
+ @menu = Menu.find(params[:id])
57
+ @menu.destroy
58
+
59
+ redirect_to menus_url
60
+ end
61
+
62
+ private
63
+
64
+ def update_links_attributes ancestry_tree
65
+ return unless ancestry_tree
66
+ ancestry_attributes(ancestry_tree).each do |k,v|
67
+ params[:menu][:links_attributes][k].merge!(v)
68
+ end
69
+ end
70
+
71
+ def update_links_menu_id
72
+ Link.where(id: params[:menu][:links_attributes].keys).update_all(menu_id: params[:id])
73
+ end
74
+
75
+ def ancestry_attributes(ancestry_tree)
76
+ MenuAncestryParser.new(ancestry_tree).to_hash
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,74 @@
1
+ module Georgia
2
+ class MessagesController < ApplicationController
3
+
4
+ load_and_authorize_resource class: Georgia::Message
5
+
6
+ before_filter :prepare_search, only: [:search, :show, :spam, :ham]
7
+
8
+
9
+ def index
10
+ redirect_to action: :search
11
+ end
12
+
13
+ def search
14
+ end
15
+
16
+ # Destroy multiple assets
17
+ def destroy
18
+ ids = params[:id].split(',')
19
+ if @messages = Message.destroy(ids)
20
+ render layout: false
21
+ else
22
+ head :internal_server_error
23
+ end
24
+ end
25
+
26
+ def destroy_all_spam
27
+ if Message.spam.destroy_all
28
+ redirect_to :back, notice: 'All spam messages have been successfully deleted.'
29
+ else
30
+ redirect_to :back, alert: 'Oups. Something went wrong.'
31
+ end
32
+ end
33
+
34
+ def show
35
+ @message = Message.find(params[:id]).decorate
36
+ end
37
+
38
+ def spam
39
+ @message = Message.find(params[:id])
40
+ if @message.spam!
41
+ @message.update_attribute(:spam, true)
42
+ redirect_to :back, notice: 'Message successfully marked as spam.'
43
+ else
44
+ redirect_to :back, alert: 'Oups. Something went wrong.'
45
+ end
46
+ end
47
+
48
+ def ham
49
+ @message = Message.find(params[:id])
50
+ if @message.ham! == false
51
+ @message.update_attribute(:spam, false)
52
+ redirect_to :back, notice: 'Message successfully marked as ham.'
53
+ else
54
+ redirect_to :back, alert: 'Oups. Something went wrong.'
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def prepare_search
61
+ @search = Georgia::Message.search do
62
+ fulltext params[:query] do
63
+ fields(:name, :email, :message, :subject, :phone)
64
+ end
65
+ facet :spam
66
+ with(:spam, (params[:s] || 'clean'))
67
+ order_by (params[:o] || :created_at), (params[:dir] || :desc)
68
+ paginate(page: params[:page], per_page: (params[:per] || 25))
69
+ end
70
+ @messages = Georgia::MessageDecorator.decorate_collection(@search.results)
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,180 @@
1
+ module Georgia
2
+ class PagesController < ApplicationController
3
+
4
+ include Georgia::Concerns::Helpers
5
+
6
+ # load_and_authorize_resource class: Georgia::Page
7
+
8
+ before_filter :prepare_new_page, only: [:search]
9
+ before_filter :prepare_page, only: [:show, :edit, :settings, :update, :copy, :preview, :draft]
10
+
11
+ def show
12
+ redirect_to [:edit, @page]
13
+ end
14
+
15
+ # Edit current revision
16
+ def edit
17
+ redirect_to [:edit, @page, @page.current_revision]
18
+ end
19
+
20
+ # Edit current page
21
+ def settings
22
+ end
23
+
24
+ # Create page, load first current revision and js redirect to revisions#edit
25
+ def create
26
+ @page = model.new(slug: params[:title].try(:parameterize))
27
+ if @page.save
28
+ @page.revisions.create(template: Georgia.templates.first) do |rev|
29
+ rev.contents << Georgia::Content.new(locale: I18n.default_locale, title: params[:title])
30
+ end
31
+ @page.update_attribute(:current_revision, @page.revisions.first)
32
+ respond_to do |format|
33
+ format.html { redirect_to edit_page_revision_path(@page, @page.current_revision), notice: "#{@page.title} was successfully created." }
34
+ format.js { render layout: false }
35
+ end
36
+ else
37
+ respond_to do |format|
38
+ format.html { redirect_to :back, alert: "Oups. Something went wrong." }
39
+ format.js { render layout: false }
40
+ end
41
+ end
42
+ end
43
+
44
+ # Update page settings
45
+ def update
46
+ Georgia::Page.update_tree(params[:page_tree]) if params[:page_tree]
47
+ if @page.update_attributes(params[:page])
48
+ respond_to do |format|
49
+ format.html { redirect_to [:settings, @page], notice: "#{@page.title} was successfully updated." }
50
+ format.js { head :ok }
51
+ end
52
+ else
53
+ respond_to do |format|
54
+ format.html { redirect_to [:settings, @page], notice: "Oups. Something went wrong." }
55
+ format.js { head :internal_server_error }
56
+ end
57
+ end
58
+ end
59
+
60
+ # Creates a copy of a page and redirects to its revisions#edit
61
+ def copy
62
+ @copy = @page.copy
63
+ redirect_to edit_page_revision_path(@copy, @copy.current_revision), notice: "Do not forget to change your url"
64
+ end
65
+
66
+ # Destroys page and its revisions from page
67
+ # Also used to destroy multiple pages from table checkboxes
68
+ def destroy
69
+ back_url = url_for(controller: controller_name, action: :search)
70
+ @pages = model.where(id: params[:id])
71
+ if @pages.destroy_all
72
+ respond_to do |format|
73
+ format.html { redirect_to back_url, notice: "#{instance_name.humanize} successfully deleted." }
74
+ format.js { head :ok }
75
+ end
76
+ else
77
+ respond_to do |format|
78
+ format.html { redirect_to back_url, alert: "Oups. Something went wrong." }
79
+ format.js { head :internal_server_error }
80
+ end
81
+ end
82
+ end
83
+
84
+ # Flush cache from multiple pages
85
+ def flush_cache
86
+ @pages = model.where(id: params[:id])
87
+ @cache_keys = @pages.map(&:cache_key)
88
+ unless @cache_keys.map{|k| expire_action(k)}.include?(false)
89
+ respond_to do |format|
90
+ format.html { redirect_to :back, notice: "Cache was successfully cleared." }
91
+ format.js { head :ok }
92
+ end
93
+ else
94
+ respond_to do |format|
95
+ format.html { redirect_to :back, alert: "Oups. Either there wasn't any cache to start with or something went wrong." }
96
+ format.js { head :internal_server_error }
97
+ end
98
+ end
99
+ end
100
+
101
+ # Publishes multiple pages from table checkboxes
102
+ def publish
103
+ @pages = model.where(id: params[:id])
104
+
105
+ unless @pages.map(&:publish).include?(false)
106
+ respond_to do |format|
107
+ format.html { redirect_to :back, notice: "Successfully published." }
108
+ format.js { head :ok }
109
+ end
110
+ else
111
+ respond_to do |format|
112
+ format.html { redirect_to :back, alert: "Oups. Something went wrong." }
113
+ format.js { head :internal_server_error }
114
+ end
115
+ end
116
+ end
117
+
118
+ # Unpublishes the page
119
+ def unpublish
120
+ @pages = model.where(id: params[:id])
121
+
122
+ unless @pages.map(&:unpublish).include?(false)
123
+ respond_to do |format|
124
+ format.html { redirect_to :back, notice: "Successfully unpublished." }
125
+ format.js { head :ok }
126
+ end
127
+ else
128
+ respond_to do |format|
129
+ format.html { redirect_to :back, alert: "Oups. Something went wrong." }
130
+ format.js { head :internal_server_error }
131
+ end
132
+ end
133
+ end
134
+
135
+ # Sorts subpages/children from pages#settings
136
+ # FIXME: This should be taken care of in pages#update
137
+ def sort
138
+ if params[:page]
139
+ params[:page].each_with_index do |id, index|
140
+ model.update_all({position: index+1}, {id: id})
141
+ end
142
+ end
143
+ render nothing: true
144
+ end
145
+
146
+ def index
147
+ redirect_to search_pages_path
148
+ end
149
+
150
+ def search
151
+ session[:search_params] = params
152
+ @search = model.search do
153
+ fulltext params[:query] do
154
+ fields(:title, :excerpt, :text, :keywords, :tags, :url, :template)
155
+ end
156
+ facet :state, :template, :tag_list
157
+ # ensure pages indexed in the wrong bucket don't get displayed
158
+ with(:class_name, model.to_s)
159
+ with(:state, params[:s]) unless params[:s].blank?
160
+ with(:template, params[:t]) unless params[:t].blank?
161
+ with(:tag_list).all_of(params[:tg]) unless params[:tg].blank?
162
+ order_by (params[:o] || :updated_at), (params[:dir] || :desc)
163
+ paginate(page: params[:page], per_page: (params[:per] || 25))
164
+ instance_eval &model.extra_search_params if model.respond_to? :extra_search_params
165
+ end
166
+ @pages = Georgia::PageDecorator.decorate_collection(@search.results)
167
+ end
168
+
169
+ private
170
+
171
+ def prepare_new_page
172
+ @page = model.new
173
+ end
174
+
175
+ def prepare_page
176
+ @page = model.find(params[:id]).decorate
177
+ end
178
+
179
+ end
180
+ end