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,24 @@
1
+ require 'file_size_validator'
2
+
3
+ module Fae
4
+ class File < ActiveRecord::Base
5
+
6
+ include Fae::BaseModelConcern
7
+ include Fae::FileConcern
8
+ include Fae::AssetsValidatable
9
+
10
+ mount_uploader :asset, Fae::FileUploader
11
+
12
+ validates :asset,
13
+ file_size: {
14
+ maximum: Fae.max_file_upload_size.megabytes.to_i
15
+ }
16
+
17
+ belongs_to :fileable, polymorphic: true, touch: true, optional: true
18
+
19
+ def readonly?
20
+ false
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ require 'file_size_validator'
2
+
3
+ module Fae
4
+ class Image < ActiveRecord::Base
5
+
6
+ include Fae::BaseModelConcern
7
+ include Fae::ImageConcern
8
+ include Fae::AssetsValidatable
9
+
10
+ attr_accessor :redirect
11
+ mount_uploader :asset, Fae::ImageUploader
12
+
13
+ after_save :recreate_versions
14
+
15
+ validates :asset,
16
+ file_size: {
17
+ maximum: Fae.max_image_upload_size.megabytes.to_i
18
+ }
19
+
20
+ belongs_to :imageable, polymorphic: true, touch: true, optional: true
21
+
22
+ def readonly?
23
+ false
24
+ end
25
+
26
+ private
27
+
28
+ def recreate_versions
29
+ asset.recreate_versions! if Fae.recreate_versions && asset.present?
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,132 @@
1
+ module Fae
2
+ class Navigation
3
+ include Rails.application.routes.url_helpers
4
+ include Fae::NavigationConcern
5
+
6
+ attr_accessor :current_path, :coordinates, :current_user, :items
7
+
8
+ def initialize(current_user)
9
+ @current_user = current_user
10
+ @items = recursive_authorization(structure)
11
+ end
12
+
13
+ def side_nav(current_path)
14
+ @current_path = current_path
15
+ # set the coors based on current path
16
+ @coordinates = []
17
+ find_current_hash(@items)
18
+
19
+ @items[@coordinates.first][:subitems][@coordinates.second][:subitems] if @coordinates.length > 2
20
+ end
21
+
22
+ def search(query)
23
+ find_items_by_text(@items, query, [])
24
+ end
25
+
26
+ private
27
+
28
+ def current_section
29
+ @current_path.gsub(/\/new$|\/\d+\/edit/, '')
30
+ end
31
+
32
+ def find_current_hash(array_of_items)
33
+ @coordinates.push(0)
34
+
35
+ array_of_items.each do |item|
36
+ return item if item[:path] == current_section
37
+
38
+ if item[:subitems].present?
39
+ current_sidenav = find_current_hash(item[:subitems])
40
+ return current_sidenav if current_sidenav.present?
41
+ end
42
+
43
+ increment_coordinates
44
+ end
45
+ # if nothing is returned, remove last coor and return nil
46
+ @coordinates.pop
47
+ nil
48
+ end
49
+
50
+ def increment_coordinates
51
+ last_item = @coordinates.pop
52
+ @coordinates.push(last_item + 1)
53
+ end
54
+
55
+ def find_items_by_text(items, query, results)
56
+ items.each do |item|
57
+ if item[:text].present? && item[:text].downcase.include?(query.downcase)
58
+ results << { text: item[:text], nested_path: item[:nested_path] }
59
+ end
60
+ if item[:subitems].present?
61
+ results = find_items_by_text(item[:subitems], query, results)
62
+ end
63
+ end
64
+ results
65
+ end
66
+
67
+ def item(text, options={})
68
+ hash = { text: text }
69
+ hash.merge! options
70
+ hash[:nested_path] = nested_path(hash)
71
+ hash[:path] ||= '#'
72
+ # prefer `subitems` over `sublinks` for new DSL but still need to support old structure in v1
73
+ hash[:sublinks] = hash[:subitems] if hash[:subitems].present?
74
+
75
+ # authorize link with current user
76
+ unless can_view_path(hash[:nested_path])
77
+ hash[:path] = '#'
78
+ hash[:nested_path] = '#'
79
+ end
80
+
81
+ hash
82
+ end
83
+
84
+ def can_view_path(path)
85
+ return true if path.blank?
86
+
87
+ can_view = true
88
+ item_controllers = path.split(/\/\d+\//)
89
+ item_controllers.each do |item_controller|
90
+ item_controller = item_controller.gsub(/#{fae.root_path}|\/new$|edit$/, '')
91
+ can_view = !Fae::Authorization.access_map[item_controller] || Fae::Authorization.access_map[item_controller].include?(@current_user.role.name)
92
+ end
93
+
94
+ can_view
95
+ end
96
+
97
+ def fae
98
+ Fae::Engine.routes.url_helpers
99
+ end
100
+
101
+ def nested_path(hash)
102
+ return hash[:path] if hash[:path]
103
+
104
+ path_from_subitems hash
105
+ end
106
+
107
+ def path_from_subitems(hash)
108
+ return '#' unless hash[:subitems] && hash[:subitems].is_a?(Array)
109
+
110
+ first_subitem = hash[:subitems].first
111
+
112
+ if first_subitem.present?
113
+ return first_subitem[:path] if first_subitem.present? && first_subitem[:path] != '#'
114
+
115
+ path_from_subitems hash[:subitems].first
116
+ end
117
+ end
118
+
119
+ def recursive_authorization(items)
120
+ rejected_indexes = []
121
+ items.each_with_index do |item, i|
122
+ recursive_authorization(item[:subitems]) if item[:subitems].present?
123
+ # flag for removal if there isn't active links in the item or subitems
124
+ rejected_indexes << i if item[:nested_path] == '#' && item[:subitems].blank?
125
+ end
126
+ # remove flagged items in separate loop
127
+ # removing them inline will skip the next item in the loop
128
+ items.delete_if.with_index { |_, index| rejected_indexes.include? index }
129
+ end
130
+
131
+ end
132
+ end
@@ -0,0 +1,38 @@
1
+ module Fae
2
+ class Option < ActiveRecord::Base
3
+
4
+ include Fae::BaseModelConcern
5
+ include Fae::OptionConcern
6
+
7
+ validates_inclusion_of :singleton_guard, :in => [0]
8
+ validates_presence_of :title, :time_zone, :live_url
9
+
10
+ has_one :logo, -> { where(attached_as: 'logo' ) },
11
+ as: :imageable,
12
+ class_name: 'Fae::Image',
13
+ dependent: :destroy
14
+ accepts_nested_attributes_for :logo, allow_destroy: true
15
+
16
+ has_one :favicon, -> { where(attached_as: 'favicon' ) },
17
+ as: :imageable,
18
+ class_name: 'Fae::Image',
19
+ dependent: :destroy
20
+ accepts_nested_attributes_for :favicon, allow_destroy: true
21
+
22
+ def fae_tracker_blacklist
23
+ 'all'
24
+ end
25
+
26
+ def self.instance
27
+ instance = first
28
+
29
+ if instance.blank?
30
+ instance = Option.new({title: 'My Fae Admin', time_zone: 'Pacific Time (US & Canada)', live_url: 'http://www.wearefine.com'})
31
+ instance.singleton_guard = 0
32
+ instance.save!
33
+ end
34
+
35
+ instance
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,18 @@
1
+ module Fae
2
+ class Role < ActiveRecord::Base
3
+
4
+ include Fae::BaseModelConcern
5
+ include Fae::RoleConcern
6
+
7
+ has_many :users
8
+
9
+ acts_as_list add_new_at: :bottom
10
+ default_scope { order(Arel.sql('-position DESC')) }
11
+
12
+ scope :public_roles, -> {where.not(name: 'super admin')}
13
+
14
+ def fae_tracker_blacklist
15
+ 'all'
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,109 @@
1
+ module Fae
2
+ class StaticPage < ActiveRecord::Base
3
+
4
+ include Fae::BaseModelConcern
5
+ include Fae::StaticPageConcern
6
+
7
+ validates :title, presence: true
8
+
9
+ @singleton_is_setup = false
10
+
11
+ def self.instance
12
+ setup_dynamic_singleton
13
+ row = includes(fae_fields.keys).references(fae_fields.keys).find_by_slug(@slug)
14
+ row = create(title: @slug.titleize, slug: @slug) if row.blank?
15
+ row
16
+ end
17
+
18
+ def self.fae_fields
19
+ {}
20
+ end
21
+
22
+ def fae_display_field
23
+ title
24
+ end
25
+
26
+ def as_json(options={})
27
+ self.class.fae_fields.keys.map do |field|
28
+ [field, field_json(field)]
29
+ end.to_h
30
+ end
31
+
32
+ private
33
+
34
+ def self.setup_dynamic_singleton
35
+ return if @singleton_is_setup
36
+
37
+ fae_fields.each do |name, value|
38
+ type = value.is_a?(Hash) ? value[:type] : value
39
+ languages = value.try(:[], :languages)
40
+
41
+ if languages.present?
42
+ languages.each do |lang|
43
+ # Save with suffix for form fields
44
+ define_association("#{name}_#{lang}", type)
45
+ define_validations("#{name}_#{lang}", type, value[:validates]) if supports_validation(type, value)
46
+ end
47
+ # Save with lookup to have default language return in front-end use (don't need to worry about validations here)
48
+ default_language = Rails.application.config.i18n.default_locale || languages.first
49
+ define_association(name, type, "#{name}_#{default_language}")
50
+ else
51
+ # Normal content_blocks
52
+ define_association(name, type)
53
+ define_validations(name, type, value[:validates]) if supports_validation(type, value)
54
+ end
55
+ end
56
+
57
+ @singleton_is_setup = true
58
+ end
59
+
60
+ def self.define_association(name, type, locale_name = nil)
61
+ locale_name ||= name
62
+
63
+ send :has_one, name.to_sym, -> { where(attached_as: locale_name.to_s)}, as: poly_sym(type), class_name: type.to_s, dependent: :destroy
64
+ send :accepts_nested_attributes_for, name, allow_destroy: true
65
+ send :define_method, :"#{name}_content", -> { send(name.to_sym).try(:content) }
66
+ end
67
+
68
+ def self.define_validations(name, type, validations)
69
+ unique_method_name = "is_#{self.name.underscore}_#{name.to_s}?".to_sym
70
+ slug = @slug
71
+ validations[:if] = unique_method_name
72
+ type.validates(:content, validations)
73
+ type.send(:define_method, unique_method_name) do
74
+ contentable.slug == slug && attached_as == name.to_s if contentable.present?
75
+ end
76
+ end
77
+
78
+ def self.supports_validation(type, value)
79
+ # validations are only supported on Fae::TextField and Fae::TextArea
80
+ poly_sym(type) == :contentable && value.try(:[], :validates).present?
81
+ end
82
+
83
+ def self.poly_sym(assoc)
84
+ case assoc.name
85
+ when 'Fae::TextField', 'Fae::TextArea'
86
+ return :contentable
87
+ when 'Fae::Image'
88
+ return :imageable
89
+ when 'Fae::File'
90
+ return :fileable
91
+ end
92
+ end
93
+
94
+ def field_json(assoc)
95
+ assoc_obj = self.send(assoc)
96
+ case assoc_obj.class.name
97
+ when 'Fae::TextField', 'Fae::TextArea'
98
+ return assoc_obj.content
99
+ when 'Fae::Image', 'Fae::File'
100
+ assoc_json = assoc_obj.as_json
101
+ assoc_json['asset'] = assoc_obj.asset.as_json
102
+ return assoc_json
103
+ else
104
+ return assoc_obj.as_json
105
+ end
106
+ end
107
+
108
+ end
109
+ end
@@ -0,0 +1,14 @@
1
+ module Fae
2
+ class TextArea < ActiveRecord::Base
3
+
4
+ include Fae::BaseModelConcern
5
+ include Fae::TextAreaConcern
6
+ include Fae::PageValidatable
7
+
8
+ belongs_to :contentable, polymorphic: true, touch: true
9
+
10
+ def readonly?
11
+ false
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module Fae
2
+ class TextField < ActiveRecord::Base
3
+
4
+ include Fae::BaseModelConcern
5
+ include Fae::TextFieldConcern
6
+ include Fae::PageValidatable
7
+
8
+ belongs_to :contentable, polymorphic: true, touch: true
9
+
10
+ def readonly?
11
+ false
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,67 @@
1
+ module Fae
2
+ class User < ActiveRecord::Base
3
+
4
+ include Fae::BaseModelConcern
5
+ include Fae::UserConcern
6
+
7
+ # Include default devise modules. Others available are:
8
+ # :registerable, :confirmable, :lockable, :timeoutable and :omniauthable
9
+ devise :recoverable, :rememberable, :trackable
10
+
11
+ belongs_to :role
12
+
13
+ validates :first_name, presence: true
14
+ validates :email,
15
+ presence: true,
16
+ uniqueness: { message: 'That email address is already in use. Give another one a go.' },
17
+ format: {
18
+ with: /^\s*(([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})[\s\/,;]*)+$/i,
19
+ message: 'is invalid',
20
+ multiline: true
21
+ }
22
+ # validates :password,
23
+ # presence: { on: :create },
24
+ # confirmation: { message: "does not match Password"},
25
+ # length: { minimum: 8, allow_blank: true }
26
+ validates :role_id, presence: true
27
+
28
+ default_scope { order(:first_name, :last_name) }
29
+
30
+ scope :public_users, -> { joins(:role).where.not('fae_roles.name = ?', 'super admin') }
31
+ scope :live_super_admins, -> { joins(:role).where(active: true, fae_roles: { name: 'super admin' }) }
32
+
33
+ def super_admin?
34
+ role.name == 'super admin'
35
+ end
36
+
37
+ def admin?
38
+ role.name == 'admin'
39
+ end
40
+
41
+ def user?
42
+ role.name == 'user'
43
+ end
44
+
45
+ def super_admin_or_admin?
46
+ super_admin? || admin?
47
+ end
48
+
49
+ def full_name
50
+ "#{first_name} #{last_name}"
51
+ end
52
+
53
+ # Called by Devise to see if an user can currently be signed in
54
+ def active_for_authentication?
55
+ active? && super
56
+ end
57
+
58
+ # Called by Devise to get the proper error message when an user cannot be signed in
59
+ def inactive_message
60
+ !active? ? :inactive : super
61
+ end
62
+
63
+ def fae_tracker_blacklist
64
+ [:reset_password_token, :reset_password_sent_at, :remember_created_at, :sign_in_count, :current_sign_in_at, :last_sign_in_at, :current_sign_in_ip, :last_sign_in_ip, :confirmation_token, :confirmed_at, :confirmation_sent_at, :unconfirmed_email, :failed_attempts, :unlock_token, :locked_at]
65
+ end
66
+ end
67
+ end