fae-railsz 2.1.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 (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