fae-railsz 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (328) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +5 -0
  3. data/Rakefile +37 -0
  4. data/app/assets/fonts/fae/icons.eot +0 -0
  5. data/app/assets/fonts/fae/icons.svg +56 -0
  6. data/app/assets/fonts/fae/icons.ttf +0 -0
  7. data/app/assets/fonts/fae/icons.woff +0 -0
  8. data/app/assets/fonts/fae/lato-bold-webfont.eot +0 -0
  9. data/app/assets/fonts/fae/lato-bold-webfont.svg +4551 -0
  10. data/app/assets/fonts/fae/lato-bold-webfont.ttf +0 -0
  11. data/app/assets/fonts/fae/lato-bold-webfont.woff +0 -0
  12. data/app/assets/fonts/fae/lato-light-webfont.eot +0 -0
  13. data/app/assets/fonts/fae/lato-light-webfont.svg +4241 -0
  14. data/app/assets/fonts/fae/lato-light-webfont.ttf +0 -0
  15. data/app/assets/fonts/fae/lato-light-webfont.woff +0 -0
  16. data/app/assets/fonts/fae/lato-regular-webfont.eot +0 -0
  17. data/app/assets/fonts/fae/lato-regular-webfont.svg +4241 -0
  18. data/app/assets/fonts/fae/lato-regular-webfont.ttf +0 -0
  19. data/app/assets/fonts/fae/lato-regular-webfont.woff +0 -0
  20. data/app/assets/fonts/fae/selection.json +1334 -0
  21. data/app/assets/images/fae/error_bg.jpg +0 -0
  22. data/app/assets/images/fae/error_sad_face.png +0 -0
  23. data/app/assets/images/fae/icons/alert.svg +9 -0
  24. data/app/assets/images/fae/icons/arrow_down.svg +8 -0
  25. data/app/assets/images/fae/icons/arrow_left.svg +9 -0
  26. data/app/assets/images/fae/icons/arrow_right.svg +9 -0
  27. data/app/assets/images/fae/icons/arrow_stacked.svg +8 -0
  28. data/app/assets/images/fae/icons/arrow_up.svg +8 -0
  29. data/app/assets/images/fae/icons/calendar.svg +17 -0
  30. data/app/assets/images/fae/icons/check.svg +7 -0
  31. data/app/assets/images/fae/icons/checkmark.svg +8 -0
  32. data/app/assets/images/fae/icons/chevron_down.svg +7 -0
  33. data/app/assets/images/fae/icons/chevron_left.svg +10 -0
  34. data/app/assets/images/fae/icons/chevron_right.svg +10 -0
  35. data/app/assets/images/fae/icons/chevron_up.svg +7 -0
  36. data/app/assets/images/fae/icons/delete.svg +8 -0
  37. data/app/assets/images/fae/icons/delete_x.svg +8 -0
  38. data/app/assets/images/fae/icons/edit.svg +11 -0
  39. data/app/assets/images/fae/icons/handle.svg +13 -0
  40. data/app/assets/images/fae/icons/home.svg +10 -0
  41. data/app/assets/images/fae/icons/logout.svg +12 -0
  42. data/app/assets/images/fae/icons/magnifying_glass.svg +10 -0
  43. data/app/assets/images/fae/icons/menu.svg +11 -0
  44. data/app/assets/images/fae/icons/offlink.svg +25 -0
  45. data/app/assets/images/fae/icons/plus.svg +8 -0
  46. data/app/assets/images/fae/icons/pulldown.svg +11 -0
  47. data/app/assets/images/fae/icons/search.svg +11 -0
  48. data/app/assets/images/fae/icons/settings.svg +12 -0
  49. data/app/assets/images/fae/icons/sort.svg +11 -0
  50. data/app/assets/images/fae/icons/support.svg +15 -0
  51. data/app/assets/images/fae/icons/trash.svg +10 -0
  52. data/app/assets/images/fae/icons/trumbowyg.svg +1 -0
  53. data/app/assets/images/fae/icons/user.svg +13 -0
  54. data/app/assets/images/fae/icons/users.svg +19 -0
  55. data/app/assets/images/fae/icons/zoom.svg +12 -0
  56. data/app/assets/images/fae/tutorial_model_location.png +0 -0
  57. data/app/assets/images/fae/youtube_helper.jpg +0 -0
  58. data/app/assets/javascripts/fae/_modals.js +60 -0
  59. data/app/assets/javascripts/fae/_tables.js +403 -0
  60. data/app/assets/javascripts/fae/admin.js.erb +11 -0
  61. data/app/assets/javascripts/fae/application.js +63 -0
  62. data/app/assets/javascripts/fae/fae_init.js +8 -0
  63. data/app/assets/javascripts/fae/form/_ajax.js +380 -0
  64. data/app/assets/javascripts/fae/form/_cancel.js +38 -0
  65. data/app/assets/javascripts/fae/form/_filtering.js +276 -0
  66. data/app/assets/javascripts/fae/form/_form.js +60 -0
  67. data/app/assets/javascripts/fae/form/_slugger.js.erb +100 -0
  68. data/app/assets/javascripts/fae/form/_validator.js +459 -0
  69. data/app/assets/javascripts/fae/form/fae_chosen.js +44 -0
  70. data/app/assets/javascripts/fae/form/fileinputer.js +178 -0
  71. data/app/assets/javascripts/fae/form/hinter.js +111 -0
  72. data/app/assets/javascripts/fae/form/inputs/_checkbox.js +27 -0
  73. data/app/assets/javascripts/fae/form/inputs/_color.js +42 -0
  74. data/app/assets/javascripts/fae/form/inputs/_dates.js +78 -0
  75. data/app/assets/javascripts/fae/form/inputs/_select.js +162 -0
  76. data/app/assets/javascripts/fae/form/inputs/_text.js +118 -0
  77. data/app/assets/javascripts/fae/navigation/_global_search.js +184 -0
  78. data/app/assets/javascripts/fae/navigation/_language.js +89 -0
  79. data/app/assets/javascripts/fae/navigation/_navigation.js +206 -0
  80. data/app/assets/javascripts/fae/navigation/_subnav_highlighter.js +81 -0
  81. data/app/assets/javascripts/fae/navigation/sticky.js +186 -0
  82. data/app/assets/javascripts/fae/vendor/chosen.jquery.min.js +2 -0
  83. data/app/assets/javascripts/fae/vendor/frob_core_helpers.js +587 -0
  84. data/app/assets/javascripts/fae/vendor/fryr.js +437 -0
  85. data/app/assets/javascripts/fae/vendor/jqColorPicker.min.js +4 -0
  86. data/app/assets/javascripts/fae/vendor/jquery.daterangepicker.js +1292 -0
  87. data/app/assets/javascripts/fae/vendor/jquery.multi-select.js +534 -0
  88. data/app/assets/javascripts/fae/vendor/jquery.simplemodal.1.4.4.js +719 -0
  89. data/app/assets/javascripts/fae/vendor/jquery.tablesorter.js +1901 -0
  90. data/app/assets/javascripts/fae/vendor/js.cookie.js +139 -0
  91. data/app/assets/javascripts/fae/vendor/moment.min.js +7 -0
  92. data/app/assets/javascripts/fae/vendor/simplemde.min.js +13 -0
  93. data/app/assets/javascripts/fae/vendor/touch_punch.js +11 -0
  94. data/app/assets/javascripts/fae/vendor/trumbowyg.js.erb +4 -0
  95. data/app/assets/javascripts/fae/vendor/trumbowyg/plugins/upload/trumbowyg.upload.js +223 -0
  96. data/app/assets/javascripts/fae/vendor/trumbowyg/trumbowyg.js +1603 -0
  97. data/app/assets/stylesheets/fae/application.css +8 -0
  98. data/app/assets/stylesheets/fae/base.scss +82 -0
  99. data/app/assets/stylesheets/fae/globals/_fonts.scss +43 -0
  100. data/app/assets/stylesheets/fae/globals/_icons.scss +15 -0
  101. data/app/assets/stylesheets/fae/globals/_plugins.scss +51 -0
  102. data/app/assets/stylesheets/fae/globals/_tags.scss +68 -0
  103. data/app/assets/stylesheets/fae/globals/imports/_extends.scss +53 -0
  104. data/app/assets/stylesheets/fae/globals/imports/_mixins.scss +58 -0
  105. data/app/assets/stylesheets/fae/globals/imports/_variables.scss +165 -0
  106. data/app/assets/stylesheets/fae/globals/imports/finescss/_fine.scss +7 -0
  107. data/app/assets/stylesheets/fae/globals/imports/finescss/_fine_functions.scss +88 -0
  108. data/app/assets/stylesheets/fae/globals/imports/finescss/_fine_mixins.scss +280 -0
  109. data/app/assets/stylesheets/fae/globals/imports/finescss/_fine_variables.scss +30 -0
  110. data/app/assets/stylesheets/fae/globals/layout/_base.scss +48 -0
  111. data/app/assets/stylesheets/fae/globals/layout/_breadcrumbs.scss +45 -0
  112. data/app/assets/stylesheets/fae/globals/layout/_content-header.scss +99 -0
  113. data/app/assets/stylesheets/fae/globals/legacy/_pre-1.3.scss +659 -0
  114. data/app/assets/stylesheets/fae/globals/navigation/_base.scss +22 -0
  115. data/app/assets/stylesheets/fae/globals/navigation/_footer.scss +50 -0
  116. data/app/assets/stylesheets/fae/globals/navigation/_header.scss +149 -0
  117. data/app/assets/stylesheets/fae/globals/navigation/_mobilenav.scss +149 -0
  118. data/app/assets/stylesheets/fae/globals/navigation/_search.scss +76 -0
  119. data/app/assets/stylesheets/fae/globals/navigation/_sidenav.scss +142 -0
  120. data/app/assets/stylesheets/fae/globals/navigation/_utility.scss +95 -0
  121. data/app/assets/stylesheets/fae/modules/_alerts.scss +50 -0
  122. data/app/assets/stylesheets/fae/modules/_buttons.scss +62 -0
  123. data/app/assets/stylesheets/fae/modules/_modal.scss +78 -0
  124. data/app/assets/stylesheets/fae/modules/_toggles.scss +48 -0
  125. data/app/assets/stylesheets/fae/modules/forms/_asset-actions.scss +83 -0
  126. data/app/assets/stylesheets/fae/modules/forms/_base.scss +100 -0
  127. data/app/assets/stylesheets/fae/modules/forms/_checkbox.scss +87 -0
  128. data/app/assets/stylesheets/fae/modules/forms/_colorpicker.scss +57 -0
  129. data/app/assets/stylesheets/fae/modules/forms/_date.scss +335 -0
  130. data/app/assets/stylesheets/fae/modules/forms/_hints.scss +40 -0
  131. data/app/assets/stylesheets/fae/modules/forms/_label.scss +57 -0
  132. data/app/assets/stylesheets/fae/modules/forms/_radio.scss +69 -0
  133. data/app/assets/stylesheets/fae/modules/forms/_select.scss +317 -0
  134. data/app/assets/stylesheets/fae/modules/forms/_simple-mde.scss +29 -0
  135. data/app/assets/stylesheets/fae/modules/forms/_text.scss +62 -0
  136. data/app/assets/stylesheets/fae/modules/forms/_textarea.scss +16 -0
  137. data/app/assets/stylesheets/fae/modules/forms/_validation.scss +63 -0
  138. data/app/assets/stylesheets/fae/modules/tables/_actions.scss +41 -0
  139. data/app/assets/stylesheets/fae/modules/tables/_base.scss +63 -0
  140. data/app/assets/stylesheets/fae/modules/tables/_collapsible.scss +76 -0
  141. data/app/assets/stylesheets/fae/modules/tables/_filters.scss +61 -0
  142. data/app/assets/stylesheets/fae/modules/tables/_image.scss +21 -0
  143. data/app/assets/stylesheets/fae/modules/tables/_pagination.scss +34 -0
  144. data/app/assets/stylesheets/fae/modules/tables/_sorting.scss +58 -0
  145. data/app/assets/stylesheets/fae/modules/tables/_sticky.scss +9 -0
  146. data/app/assets/stylesheets/fae/modules/tables/_tooltips.scss +24 -0
  147. data/app/assets/stylesheets/fae/pages/_error.scss +35 -0
  148. data/app/assets/stylesheets/fae/pages/_help.scss +28 -0
  149. data/app/assets/stylesheets/fae/pages/_home.scss +18 -0
  150. data/app/assets/stylesheets/fae/pages/_login.scss +137 -0
  151. data/app/assets/stylesheets/fae/vendor/chosen.css +377 -0
  152. data/app/assets/stylesheets/fae/vendor/daterangepicker.css +227 -0
  153. data/app/assets/stylesheets/fae/vendor/reset.css +48 -0
  154. data/app/assets/stylesheets/fae/vendor/simplemde.min.css +7 -0
  155. data/app/assets/stylesheets/fae/vendor/trumbowyg.css +584 -0
  156. data/app/controllers/concerns/fae/application_controller_concern.rb +1 -0
  157. data/app/controllers/concerns/fae/asset_cloner.rb +46 -0
  158. data/app/controllers/concerns/fae/cloneable.rb +136 -0
  159. data/app/controllers/fae/application_controller.rb +123 -0
  160. data/app/controllers/fae/base_controller.rb +117 -0
  161. data/app/controllers/fae/files_controller.rb +26 -0
  162. data/app/controllers/fae/images_controller.rb +37 -0
  163. data/app/controllers/fae/nested_base_controller.rb +100 -0
  164. data/app/controllers/fae/options_controller.rb +29 -0
  165. data/app/controllers/fae/pages_controller.rb +44 -0
  166. data/app/controllers/fae/setup_controller.rb +54 -0
  167. data/app/controllers/fae/static_pages_controller.rb +54 -0
  168. data/app/controllers/fae/users_controller.rb +71 -0
  169. data/app/controllers/fae/utilities_controller.rb +61 -0
  170. data/app/helpers/fae/application_helper.rb +114 -0
  171. data/app/helpers/fae/fae_helper.rb +6 -0
  172. data/app/helpers/fae/form_helper.rb +240 -0
  173. data/app/helpers/fae/nested_form_helper.rb +39 -0
  174. data/app/helpers/fae/view_helper.rb +175 -0
  175. data/app/inputs/date_range_input.rb +17 -0
  176. data/app/inputs/radio_collection_input.rb +17 -0
  177. data/app/inputs/symbol_input.rb +5 -0
  178. data/app/models/concerns/fae/assets_validatable.rb +12 -0
  179. data/app/models/concerns/fae/authorization_concern.rb +12 -0
  180. data/app/models/concerns/fae/base_model_concern.rb +105 -0
  181. data/app/models/concerns/fae/change_concern.rb +1 -0
  182. data/app/models/concerns/fae/file_concern.rb +1 -0
  183. data/app/models/concerns/fae/image_concern.rb +1 -0
  184. data/app/models/concerns/fae/navigation_concern.rb +10 -0
  185. data/app/models/concerns/fae/option_concern.rb +1 -0
  186. data/app/models/concerns/fae/page_validatable.rb +26 -0
  187. data/app/models/concerns/fae/paper_trailer.rb +8 -0
  188. data/app/models/concerns/fae/role_concern.rb +1 -0
  189. data/app/models/concerns/fae/sortable.rb +51 -0
  190. data/app/models/concerns/fae/static_page_concern.rb +1 -0
  191. data/app/models/concerns/fae/text_area_concern.rb +1 -0
  192. data/app/models/concerns/fae/text_field_concern.rb +1 -0
  193. data/app/models/concerns/fae/trackable.rb +124 -0
  194. data/app/models/concerns/fae/user_concern.rb +7 -0
  195. data/app/models/fae/authorization.rb +8 -0
  196. data/app/models/fae/change.rb +53 -0
  197. data/app/models/fae/file.rb +24 -0
  198. data/app/models/fae/image.rb +33 -0
  199. data/app/models/fae/navigation.rb +132 -0
  200. data/app/models/fae/option.rb +38 -0
  201. data/app/models/fae/role.rb +18 -0
  202. data/app/models/fae/static_page.rb +109 -0
  203. data/app/models/fae/text_area.rb +14 -0
  204. data/app/models/fae/text_field.rb +14 -0
  205. data/app/models/fae/user.rb +67 -0
  206. data/app/uploaders/fae/file_uploader.rb +26 -0
  207. data/app/uploaders/fae/image_uploader.rb +28 -0
  208. data/app/validators/fae/cross_model_uniqueness_validator.rb +14 -0
  209. data/app/views/devise/confirmations/new.html.slim +13 -0
  210. data/app/views/devise/mailer/confirmation_instructions.html.slim +3 -0
  211. data/app/views/devise/mailer/reset_password_instructions.html.slim +5 -0
  212. data/app/views/devise/mailer/unlock_instructions.html.slim +4 -0
  213. data/app/views/devise/passwords/edit.html.slim +10 -0
  214. data/app/views/devise/passwords/new.html.slim +10 -0
  215. data/app/views/devise/registrations/edit.html.slim +22 -0
  216. data/app/views/devise/registrations/new.html.slim +15 -0
  217. data/app/views/devise/sessions/new.html.slim +7 -0
  218. data/app/views/devise/shared/_links.slim +25 -0
  219. data/app/views/devise/unlocks/new.html.slim +13 -0
  220. data/app/views/fae/application/_breadcrumb.html.slim +19 -0
  221. data/app/views/fae/application/_content_form.html.slim +55 -0
  222. data/app/views/fae/application/_credit.slim +6 -0
  223. data/app/views/fae/application/_file_uploader.html.slim +36 -0
  224. data/app/views/fae/application/_flash_messages.slim +2 -0
  225. data/app/views/fae/application/_global_search_results.html.slim +37 -0
  226. data/app/views/fae/application/_header.slim +50 -0
  227. data/app/views/fae/application/_markdown_helper.slim +41 -0
  228. data/app/views/fae/application/_mobilenav.slim +66 -0
  229. data/app/views/fae/application/_sidenav.slim +23 -0
  230. data/app/views/fae/application/_user_log.html.slim +36 -0
  231. data/app/views/fae/images/_image_uploader.html.slim +66 -0
  232. data/app/views/fae/options/_form.html.slim +16 -0
  233. data/app/views/fae/options/edit.html.slim +1 -0
  234. data/app/views/fae/pages/activity_log.html.slim +32 -0
  235. data/app/views/fae/pages/disabled_environment.html.slim +4 -0
  236. data/app/views/fae/pages/error404.html.slim +7 -0
  237. data/app/views/fae/pages/help.html.slim +35 -0
  238. data/app/views/fae/pages/home.html.slim +36 -0
  239. data/app/views/fae/setup/first_user.html.slim +11 -0
  240. data/app/views/fae/shared/_errors.slim +4 -0
  241. data/app/views/fae/shared/_form_header.html.slim +40 -0
  242. data/app/views/fae/shared/_index_header.html.slim +26 -0
  243. data/app/views/fae/shared/_nested_table.html.slim +49 -0
  244. data/app/views/fae/shared/_recent_changes.html.slim +22 -0
  245. data/app/views/fae/shared/_shared_nested_table.html.slim +46 -0
  246. data/app/views/fae/static_pages/index.html.slim +13 -0
  247. data/app/views/fae/users/_form.html.slim +19 -0
  248. data/app/views/fae/users/edit.html.slim +1 -0
  249. data/app/views/fae/users/index.html.slim +23 -0
  250. data/app/views/fae/users/new.html.slim +1 -0
  251. data/app/views/fae/users/settings.html.slim +1 -0
  252. data/app/views/kaminari/fae/_gap.html.slim +8 -0
  253. data/app/views/kaminari/fae/_next_page.html.slim +9 -0
  254. data/app/views/kaminari/fae/_page.html.slim +15 -0
  255. data/app/views/kaminari/fae/_paginator.html.slim +15 -0
  256. data/app/views/kaminari/fae/_prev_page.html.slim +9 -0
  257. data/app/views/layouts/devise.html.slim +29 -0
  258. data/app/views/layouts/fae/application.html.slim +23 -0
  259. data/app/views/layouts/fae/error.html.slim +11 -0
  260. data/config/deploy.rb +73 -0
  261. data/config/deploy/dev.rb +19 -0
  262. data/config/deploy/prod.rb +19 -0
  263. data/config/deploy/stage.rb +19 -0
  264. data/config/initializers/assets.rb +1 -0
  265. data/config/initializers/carrierwave.rb +3 -0
  266. data/config/initializers/devise.rb +258 -0
  267. data/config/initializers/devise_monkeypatch.rb +11 -0
  268. data/config/initializers/fae_judge.rb +3 -0
  269. data/config/initializers/inflections.rb +16 -0
  270. data/config/initializers/kaminari_config.rb +10 -0
  271. data/config/initializers/simple_form.rb +147 -0
  272. data/config/initializers/time_formats.rb +3 -0
  273. data/config/locales/devise.en.yml +59 -0
  274. data/config/locales/devise.zh-CN.yml +59 -0
  275. data/config/locales/fae.en.yml +10 -0
  276. data/config/locales/fae.zh-CN.yml +10 -0
  277. data/config/locales/simple_form.en.yml +26 -0
  278. data/config/locales/simple_form.zh-CN.yml +26 -0
  279. data/config/routes.rb +46 -0
  280. data/db/migrate/20140809222030_add_user_table.rb +49 -0
  281. data/db/migrate/20140822224029_create_fae_roles.rb +10 -0
  282. data/db/migrate/20141008180718_create_fae_images_table.rb +19 -0
  283. data/db/migrate/20141017194616_create_fae_options.rb +16 -0
  284. data/db/migrate/20141021181327_create_fae_files.rb +17 -0
  285. data/db/migrate/20141021183047_create_fae_text_areas.rb +16 -0
  286. data/db/migrate/20141021184311_create_fae_pages.rb +13 -0
  287. data/db/migrate/20141105214814_create_fae_text_fields.rb +15 -0
  288. data/db/migrate/20150930224821_create_fae_changes.rb +17 -0
  289. data/lib/fae-rails.rb +6 -0
  290. data/lib/fae/concerns/models/base.rb +8 -0
  291. data/lib/fae/engine.rb +37 -0
  292. data/lib/fae/options.rb +35 -0
  293. data/lib/fae/validation_helper_collection.rb +76 -0
  294. data/lib/fae/version.rb +3 -0
  295. data/lib/file_size_validator.rb +71 -0
  296. data/lib/generators/fae/base_generator.rb +156 -0
  297. data/lib/generators/fae/controller_generator.rb +13 -0
  298. data/lib/generators/fae/install_generator.rb +61 -0
  299. data/lib/generators/fae/model_generator.rb +11 -0
  300. data/lib/generators/fae/nested_index_scaffold_generator.rb +36 -0
  301. data/lib/generators/fae/nested_scaffold_generator.rb +51 -0
  302. data/lib/generators/fae/page_generator.rb +65 -0
  303. data/lib/generators/fae/scaffold_generator.rb +15 -0
  304. data/lib/generators/fae/templates/assets/fae.js +6 -0
  305. data/lib/generators/fae/templates/assets/fae.scss +2 -0
  306. data/lib/generators/fae/templates/controllers/nested_index_scaffold_controller.rb +81 -0
  307. data/lib/generators/fae/templates/controllers/nested_scaffold_controller.rb +13 -0
  308. data/lib/generators/fae/templates/controllers/scaffold_controller.rb +13 -0
  309. data/lib/generators/fae/templates/controllers/static_pages_controller.rb +10 -0
  310. data/lib/generators/fae/templates/initializers/fae.rb +63 -0
  311. data/lib/generators/fae/templates/initializers/fae_fine.rb +51 -0
  312. data/lib/generators/fae/templates/initializers/judge.rb +6 -0
  313. data/lib/generators/fae/templates/models/concerns/authorization_concern.rb +27 -0
  314. data/lib/generators/fae/templates/models/concerns/navigation_concern.rb +33 -0
  315. data/lib/generators/fae/templates/models/pages_model.rb +14 -0
  316. data/lib/generators/fae/templates/tasks/fae_tasks.rake +19 -0
  317. data/lib/generators/fae/templates/views/_form.html.slim +18 -0
  318. data/lib/generators/fae/templates/views/_form_index_nested.html.slim +13 -0
  319. data/lib/generators/fae/templates/views/_form_nested.html.slim +17 -0
  320. data/lib/generators/fae/templates/views/edit.html.slim +1 -0
  321. data/lib/generators/fae/templates/views/edit_nested.html.slim +3 -0
  322. data/lib/generators/fae/templates/views/index.html.slim +35 -0
  323. data/lib/generators/fae/templates/views/index_nested.html.slim +8 -0
  324. data/lib/generators/fae/templates/views/new.html.slim +1 -0
  325. data/lib/generators/fae/templates/views/new_nested.html.slim +3 -0
  326. data/lib/generators/fae/templates/views/static_page_form.html.slim +15 -0
  327. data/lib/generators/fae/templates/views/table_nested.html.slim +4 -0
  328. metadata +692 -0
@@ -0,0 +1,17 @@
1
+ class DateRangeInput < SimpleForm::Inputs::Base
2
+ def input(wrapper_options)
3
+ start_date = options[:start_date] || :start_date
4
+ end_date = options[:end_date] || :end_date
5
+ template.content_tag(:div, class: 'input-group date form_datetime') do
6
+ template.concat @builder.text_field start_date, class: "daterangepicker js-start_date"
7
+ template.concat span_seperator
8
+ template.concat @builder.text_field end_date, class: "daterangepicker js-end_date"
9
+ end
10
+ end
11
+
12
+ def span_seperator
13
+ template.content_tag(:span, class: 'daterangepicker-seperator') do
14
+ template.concat "to"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ class RadioCollectionInput < SimpleForm::Inputs::CollectionRadioButtonsInput
2
+
3
+ def input(wrapper_options)
4
+ label_method, value_method = detect_collection_methods
5
+
6
+ @builder.send("collection_radio_buttons",
7
+ attribute_name, collection, value_method, label_method,
8
+ input_options, input_html_options, &collection_block_for_nested_boolean_style
9
+ )
10
+ end
11
+
12
+ protected
13
+
14
+ def build_nested_boolean_style_item_tag(collection_builder)
15
+ collection_builder.radio_button + "<span class='radio_collection-bullet'></span>".html_safe + collection_builder.text
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ class SymbolInput < SimpleForm::Inputs::Base
2
+ def input(wrapper_options)
3
+ "<label for='#{object_name}_#{attribute_name}' class='#{options[:span_class]}'>#{options[:content_text]}</label>#{@builder.text_field(attribute_name, "data-validate" => input_html_options['data-validate'], placeholder: input_html_options[:placeholder])}".html_safe
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ module Fae::AssetsValidatable
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ validate :asset_exists
6
+ end
7
+
8
+ def asset_exists
9
+ errors.add(:asset, "#{self.class.to_s.gsub('Fae::','')} can't be empty") if required && asset.blank?
10
+ end
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+ module Fae
2
+ module AuthorizationConcern
3
+ extend ActiveSupport::Concern
4
+ module ClassMethods
5
+
6
+ def access_map
7
+ {}
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,105 @@
1
+ module Fae
2
+ module BaseModelConcern
3
+ extend ActiveSupport::Concern
4
+ require 'csv'
5
+
6
+ attr_accessor :filter
7
+
8
+ included do
9
+ include Fae::Trackable if Fae.track_changes
10
+ include Fae::Sortable
11
+ end
12
+
13
+ def fae_display_field
14
+ # override this method in your model
15
+ end
16
+
17
+ def fae_nested_parent
18
+ # override this method in your model
19
+ end
20
+
21
+ def fae_tracker_parent
22
+ # override this method in your model
23
+ end
24
+
25
+ def fae_nested_foreign_key
26
+ return if fae_nested_parent.blank?
27
+ "#{fae_nested_parent}_id"
28
+ end
29
+
30
+ module ClassMethods
31
+ def for_fae_index
32
+ order(order_method)
33
+ end
34
+
35
+ def order_method
36
+ klass = name.constantize
37
+ if klass.column_names.include? 'position'
38
+ return :position
39
+ elsif klass.column_names.include? 'name'
40
+ return :name
41
+ elsif klass.column_names.include? 'title'
42
+ return :title
43
+ else
44
+ raise "No order_method found, please define for_fae_index as a #{name} class method to set a custom scope."
45
+ end
46
+ end
47
+
48
+ def filter(params)
49
+ # override this method in your model
50
+ for_fae_index
51
+ end
52
+
53
+ def fae_search(query)
54
+ all.to_a.keep_if { |i| i.fae_display_field.present? && i.fae_display_field.to_s.downcase.include?(query.downcase) }
55
+ end
56
+
57
+ def to_csv
58
+ CSV.generate do |csv|
59
+ csv << column_names
60
+ all.each do |item|
61
+ csv << item.attributes.values_at(*column_names)
62
+ end
63
+ end
64
+ end
65
+
66
+ def fae_translate(*attributes)
67
+ attributes.each do |attribute|
68
+ define_method attribute.to_s do
69
+ self.send "#{attribute}_#{I18n.locale}"
70
+ end
71
+
72
+ define_singleton_method "find_by_#{attribute}" do |val|
73
+ self.send("find_by_#{attribute}_#{I18n.locale}", val)
74
+ end
75
+ end
76
+ end
77
+
78
+ def has_fae_image(image_name_symbol)
79
+ has_one image_name_symbol, -> { where(attached_as: image_name_symbol.to_s) },
80
+ as: :imageable,
81
+ class_name: '::Fae::Image',
82
+ dependent: :destroy
83
+ accepts_nested_attributes_for image_name_symbol, allow_destroy: true
84
+ end
85
+
86
+ def has_fae_file(file_name_symbol)
87
+ has_one file_name_symbol, -> { where(attached_as: file_name_symbol.to_s) },
88
+ as: :fileable,
89
+ class_name: '::Fae::File',
90
+ dependent: :destroy
91
+ accepts_nested_attributes_for file_name_symbol, allow_destroy: true
92
+ end
93
+
94
+ end
95
+
96
+ private
97
+
98
+ def fae_bust_navigation_caches
99
+ Fae::Role.all.each do |role|
100
+ Rails.cache.delete("fae_navigation_#{role.id}")
101
+ end
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1 @@
1
+ module Fae::ChangeConcern; end
@@ -0,0 +1 @@
1
+ module Fae::FileConcern; end
@@ -0,0 +1 @@
1
+ module Fae::ImageConcern; end
@@ -0,0 +1,10 @@
1
+ module Fae
2
+ module NavigationConcern
3
+ extend ActiveSupport::Concern
4
+
5
+ def structure
6
+ []
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1 @@
1
+ module Fae::OptionConcern; end
@@ -0,0 +1,26 @@
1
+ module Fae::PageValidatable
2
+ extend ActiveSupport::Concern
3
+
4
+ def validators(page_class)
5
+ self.class.validators_on(:content).keep_if { |amv| is_valid_validator?(amv, page_class) }
6
+ end
7
+
8
+ def validation_json(page_class)
9
+ validators(page_class).map { |v| Judge::Validator.new(self, :content, v).to_hash }.to_json
10
+ end
11
+
12
+ def is_required?(page_class)
13
+ required = false
14
+ validators(page_class).each do |amv|
15
+ required = true if amv.class.name['PresenceValidator']
16
+ end
17
+ required
18
+ end
19
+
20
+ private
21
+
22
+ def is_valid_validator?(amv, page_class)
23
+ amv.options[:if].blank? || amv.options[:if] == "is_#{page_class.name.underscore}_#{attached_as}?".to_sym
24
+ end
25
+
26
+ end
@@ -0,0 +1,8 @@
1
+ module Fae::PaperTrailer
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ has_paper_trail ignore: [:updated_at]
6
+ end
7
+
8
+ end
@@ -0,0 +1 @@
1
+ module Fae::RoleConcern; end
@@ -0,0 +1,51 @@
1
+ module Fae
2
+ module Sortable
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+
7
+ def fae_sort(params)
8
+ return all unless params.present? && params[:sort_by].present?
9
+
10
+ attr_parts = params[:sort_by].split('.')
11
+
12
+ if attr_parts.length == 1
13
+ order_by_model_attr(attr_parts.first, sort_direction(params[:sort_direction]))
14
+ else
15
+ order_by_association_attr(attr_parts.first.to_sym, attr_parts.second, sort_direction(params[:sort_direction]))
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def order_by_model_attr(sort_by, direction)
22
+ return all unless attribute_exists(self, sort_by)
23
+ unscope(:order).order("#{table_name}.#{sort_by} #{direction}")
24
+ end
25
+
26
+ def order_by_association_attr(association, sort_by, direction)
27
+ assoc_index = reflect_on_all_associations.map(&:name).index(association)
28
+ return all unless assoc_index
29
+ order_klass = reflect_on_all_associations[assoc_index].klass
30
+
31
+ return all unless attribute_exists(order_klass, sort_by)
32
+
33
+ includes(association).unscope(:order).order("#{order_klass.table_name}.#{sort_by} #{direction}")
34
+ end
35
+
36
+ def sort_direction(direction_from_params)
37
+ return 'asc' if direction_from_params.blank?
38
+
39
+ direction = direction_from_params.downcase
40
+ # verify the direction from parms are legit to protect against injection
41
+ return %w(asc desc).include?(direction) ? direction : 'asc'
42
+ end
43
+
44
+ def attribute_exists(klass, attribute)
45
+ klass.column_names.include? attribute
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1 @@
1
+ module Fae::StaticPageConcern; end
@@ -0,0 +1 @@
1
+ module Fae::TextAreaConcern; end
@@ -0,0 +1 @@
1
+ module Fae::TextFieldConcern; end
@@ -0,0 +1,124 @@
1
+ module Fae
2
+ module Trackable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ after_create :add_create_change, if: :track_changes?
7
+ before_update :add_update_change, if: :track_changes?
8
+ before_destroy :add_delete_change, if: :track_changes?
9
+
10
+ has_many :tracked_changes, -> { order(id: :desc) },
11
+ as: :changeable,
12
+ class_name: 'Fae::Change'
13
+ end
14
+
15
+ def fae_tracker_blacklist
16
+ []
17
+ end
18
+
19
+ def track_changes?
20
+ Fae.track_changes && fae_tracker_blacklist != 'all'
21
+ end
22
+
23
+ private
24
+
25
+ def add_create_change
26
+ return if has_parent?
27
+ attrs = {
28
+ changeable_id: id,
29
+ changeable_type: self_or_super_class_name,
30
+ user_id: Fae::Change.current_user,
31
+ change_type: 'created'
32
+ }
33
+ attrs.merge!(tracker_parent_attrs(attrs[:change_type])) if fae_tracker_parent
34
+ Fae::Change.create(attrs)
35
+ end
36
+
37
+ def add_update_change
38
+ if has_parent?
39
+ update_parent
40
+ else
41
+ return if legit_updated_attributes.blank?
42
+ attrs = {
43
+ changeable_id: id,
44
+ changeable_type: self_or_super_class_name,
45
+ user_id: Fae::Change.current_user,
46
+ change_type: 'updated',
47
+ updated_attributes: legit_updated_attributes
48
+ }
49
+ attrs.merge!(tracker_parent_attrs(attrs[:change_type])) if fae_tracker_parent
50
+ Fae::Change.create(attrs)
51
+ clean_history
52
+ end
53
+ end
54
+
55
+ def add_delete_change
56
+ return if has_parent?
57
+ attrs = {
58
+ changeable_id: id,
59
+ changeable_type: self_or_super_class_name,
60
+ user_id: Fae::Change.current_user,
61
+ change_type: 'deleted'
62
+ }
63
+ attrs.merge!(tracker_parent_attrs(attrs[:change_type])) if fae_tracker_parent
64
+ Fae::Change.create(attrs)
65
+ clean_history
66
+ end
67
+
68
+ def self_or_super_class_name
69
+ self.class.superclass.name == 'Fae::StaticPage' ? 'Fae::StaticPage' : self.class.name
70
+ end
71
+
72
+ def legit_updated_attributes
73
+ legit_attributes = changed - ignored_attributes
74
+ if fae_tracker_blacklist.kind_of?(Array) && fae_tracker_blacklist.present?
75
+ legit_attributes -= fae_tracker_blacklist.map(&:to_s)
76
+ end
77
+ legit_attributes
78
+ end
79
+
80
+ def ignored_attributes
81
+ ['id', 'updated_at', 'created_at']
82
+ end
83
+
84
+ def clean_history
85
+ tracked_changes.offset(Fae.tracker_history_length).destroy_all
86
+ end
87
+
88
+ def has_parent?
89
+ %w(Fae::Image Fae::File Fae::TextField Fae::TextArea).include? self.class.name
90
+ end
91
+
92
+ def asset_name
93
+ attached_as || self.class.name.gsub('Fae::','').underscore
94
+ end
95
+
96
+ def update_parent
97
+ parent = self.try(:imageable) || self.try(:fileable) || self.try(:contentable)
98
+ if parent.present?
99
+ latest_change = parent.try(:tracked_changes).try(:first)
100
+ if latest_change.present? && latest_change.change_type == 'updated' && latest_change.updated_at > 2.seconds.ago
101
+ updated_updated_attributes = latest_change.updated_attributes << asset_name
102
+ latest_change.update_attribute(:updated_attributes, updated_updated_attributes)
103
+ else
104
+ Fae::Change.create({
105
+ changeable_id: parent.id,
106
+ changeable_type: parent.class.name,
107
+ user_id: Fae::Change.current_user,
108
+ change_type: 'updated',
109
+ updated_attributes: [asset_name]
110
+ })
111
+ end
112
+ end
113
+ end
114
+
115
+ def tracker_parent_attrs(change_type)
116
+ {
117
+ changeable_id: fae_tracker_parent.id,
118
+ changeable_type: fae_tracker_parent.class.name,
119
+ change_type: "#{self.class.name.titleize} #{fae_display_field} #{change_type}"
120
+ }
121
+ end
122
+
123
+ end
124
+ end
@@ -0,0 +1,7 @@
1
+ module Fae::UserConcern
2
+ extend ActiveRecord::Concern
3
+
4
+ included do
5
+ devise :database_authenticatable
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ module Fae
2
+ class Authorization
3
+ include Fae::AuthorizationConcern
4
+
5
+ # `self.access_map` is defined in Fae::AuthorizationConcern on the parent app
6
+
7
+ end
8
+ end
@@ -0,0 +1,53 @@
1
+ module Fae
2
+ class Change < ActiveRecord::Base
3
+ include Fae::Sortable
4
+ include Fae::ChangeConcern
5
+
6
+ belongs_to :user
7
+ belongs_to :changeable, polymorphic: true
8
+
9
+ serialize :updated_attributes
10
+
11
+ class << self
12
+ # writing current_user to thread for thread safety
13
+ def current_user=(user)
14
+ Thread.current[:current_user] = user
15
+ end
16
+
17
+ def current_user
18
+ Thread.current[:current_user]
19
+ end
20
+
21
+ def unique_changeable_types
22
+ pluck(:changeable_type).uniq.sort.map{ |changeable_type| [changeable_type.gsub('Fae::',''), changeable_type] }
23
+ end
24
+
25
+ def filter(params)
26
+ # build conditions if specific params are present
27
+ conditions = {}
28
+ conditions[:user_id] = params['user'] if params['user'].present?
29
+ conditions[:changeable_type] = params['model'] if params['model'].present?
30
+ conditions[:change_type] = params['type'] if params['type'].present?
31
+
32
+ date_scope = case params['date']
33
+ when 'Last Hour' then ['fae_changes.updated_at >= ?', 60.minutes.ago]
34
+ when 'Last Day' then ['fae_changes.updated_at >= ?', 1.day.ago]
35
+ when 'Last Week' then ['fae_changes.updated_at >= ?', 1.week.ago]
36
+ when 'Last Month' then ['fae_changes.updated_at >= ?', 1.month.ago]
37
+ end
38
+
39
+ # use good 'ol MySQL to search if search param is present
40
+ search = []
41
+ if params['search'].present?
42
+ search = ["fae_users.first_name LIKE ? OR fae_users.last_name LIKE ? OR fae_changes.updated_attributes LIKE ? OR fae_changes.changeable_type LIKE ? OR fae_changes.change_type LIKE ?", "%#{params['search']}%", "%#{params['search']}%", "%#{params['search']}%", "%#{params['search']}%", "%#{params['search']}%"]
43
+ end
44
+
45
+ # apply conditions and search from above to our scope
46
+ order(id: :desc)
47
+ .includes(:user).references(:user)
48
+ .where(Arel.sql(date_scope)).where(conditions).where(Arel.sql(search))
49
+ end
50
+
51
+ end
52
+ end
53
+ end