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,10 @@
1
+ class CreateFaeRoles < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :fae_roles do |t|
4
+ t.string :name
5
+ t.integer :position
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ class CreateFaeImagesTable < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table(:fae_images) do |t|
4
+ t.string :name
5
+ t.string :asset
6
+ t.references :imageable, polymorphic: true, index: true
7
+ t.string :alt
8
+ t.string :caption
9
+ t.integer :position, default: 0
10
+ t.string :attached_as, index: true
11
+ t.boolean :on_stage, default: true
12
+ t.boolean :on_prod, default: false
13
+ t.integer :file_size
14
+ t.boolean :required, default: false
15
+
16
+ t.timestamps
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ class CreateFaeOptions < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :fae_options do |t|
4
+ t.string :title
5
+ t.string :time_zone
6
+ t.string :colorway
7
+ t.string :stage_url
8
+ t.string :live_url
9
+ t.integer :singleton_guard
10
+
11
+ t.timestamps
12
+ end
13
+
14
+ add_index :fae_options, :singleton_guard, unique: true
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ class CreateFaeFiles < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :fae_files do |t|
4
+ t.string :name
5
+ t.string :asset
6
+ t.references :fileable, polymorphic: true, index: true
7
+ t.integer :file_size
8
+ t.integer :position, default: 0
9
+ t.string :attached_as, index: true
10
+ t.boolean :on_stage, default: true
11
+ t.boolean :on_prod, default: false
12
+ t.boolean :required, default: false
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ class CreateFaeTextAreas < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :fae_text_areas do |t|
4
+ t.string :label
5
+ t.text :content
6
+ t.integer :position, default: 0, index: true
7
+ t.boolean :on_stage, default: true, index: true
8
+ t.boolean :on_prod, default: false, index: true
9
+ t.integer :contentable_id, index: true
10
+ t.string :contentable_type, index: true
11
+ t.string :attached_as, index: true
12
+
13
+ t.timestamps
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ class CreateFaePages < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :fae_static_pages do |t|
4
+ t.string :title
5
+ t.integer :position, default: 0
6
+ t.boolean :on_stage, default: true
7
+ t.boolean :on_prod, default: false
8
+ t.string :slug, index: true
9
+
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ class CreateFaeTextFields < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :fae_text_fields do |t|
4
+ t.references :contentable, polymorphic: true, index: true
5
+ t.string :attached_as, index: true
6
+ t.string :label
7
+ t.string :content
8
+ t.integer :position, default: 0, index: true
9
+ t.boolean :on_stage, default: true, index: true
10
+ t.boolean :on_prod, default: false, index: true
11
+
12
+ t.timestamps
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ class CreateFaeChanges < ActiveRecord::Migration[4.2]
2
+ def change
3
+ create_table :fae_changes do |t|
4
+ t.integer :changeable_id
5
+ t.string :changeable_type
6
+ t.integer :user_id
7
+ t.string :change_type
8
+ t.text :updated_attributes
9
+
10
+ t.timestamps null: false
11
+ end
12
+
13
+ add_index :fae_changes, :changeable_id
14
+ add_index :fae_changes, :changeable_type
15
+ add_index :fae_changes, :user_id
16
+ end
17
+ end
@@ -0,0 +1,6 @@
1
+ require "fae/engine"
2
+ require "fae/options"
3
+ require 'carrierwave'
4
+
5
+ module Fae
6
+ end
@@ -0,0 +1,8 @@
1
+ # moved to app/models/concerns/fae/base_model_concern.rb
2
+ # keep for backwards compatibility
3
+ module Fae::Concerns::Models::Base
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ include Fae::BaseModelConcern
7
+ end
8
+ end
@@ -0,0 +1,37 @@
1
+ require 'devise'
2
+
3
+ module Fae
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace Fae
6
+
7
+ # include libraries
8
+ require 'simple_form'
9
+ require 'remotipart'
10
+ require 'jquery-rails'
11
+ require 'jquery-ui-rails'
12
+ require 'judge'
13
+ require 'judge/simple_form'
14
+ require 'acts_as_list'
15
+ require 'slim'
16
+ require 'kaminari'
17
+ require 'fae/version'
18
+
19
+ config.autoload_paths += %W(#{config.root}/lib)
20
+
21
+ config.to_prepare do
22
+ # Require decorators from main application
23
+ Dir.glob(Rails.root.join('app', 'decorators', '**', '*_decorator.rb')).each do |decorator|
24
+ Rails.configuration.cache_classes ? require(decorator) : load(decorator)
25
+ end
26
+
27
+ ApplicationController.helper(ApplicationHelper)
28
+ end
29
+
30
+ config.generators do |g|
31
+ g.test_framework :rspec, fixture: false
32
+ g.fixture_replacement :factory_girl, dir: 'spec/factories'
33
+ g.assets false
34
+ g.helper false
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ require 'devise'
2
+ require 'judge'
3
+ require_relative 'validation_helper_collection'
4
+
5
+ module Fae
6
+ # configurable defaults
7
+ class << self
8
+ mattr_accessor :devise_secret_key, :devise_mailer_sender, :dashboard_exclusions, :max_image_upload_size, :max_file_upload_size, :languages, :recreate_versions, :validation_helpers, :track_changes, :tracker_history_length, :slug_separator, :disabled_environments, :per_page, :use_cache
9
+
10
+ self.devise_secret_key = ''
11
+ self.devise_mailer_sender = 'change-me@example.com'
12
+ self.dashboard_exclusions = []
13
+ self.max_image_upload_size = 2
14
+ self.max_file_upload_size = 5
15
+ self.languages = {}
16
+ self.recreate_versions = false
17
+ self.validation_helpers = ValidationHelperCollection.new
18
+ self.track_changes = true
19
+ self.tracker_history_length = 15
20
+ self.slug_separator = '-'
21
+ self.disabled_environments = []
22
+ self.per_page = 25
23
+ self.use_cache = false
24
+ end
25
+
26
+ # this function maps the vars from your app into your engine
27
+ def self.setup(&block)
28
+ yield self
29
+
30
+ # assign initializer configs
31
+ Devise.secret_key = Fae.devise_secret_key
32
+ Devise.mailer_sender = Fae.devise_mailer_sender
33
+ Kaminari.config.default_per_page = Fae.per_page
34
+ end
35
+ end
@@ -0,0 +1,76 @@
1
+ class ValidationHelperCollection
2
+
3
+ def slug_regex
4
+ /\A[-_a-zA-Z0-9]+\z/
5
+ end
6
+
7
+ def email_regex
8
+ /\A\s*(([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})[\s\/,;]*)+\z/
9
+ end
10
+
11
+ def url_regex
12
+ /\A(https?:\/\/)/
13
+ end
14
+
15
+ def zip_regex
16
+ /\A(\d{5})?\z/
17
+ end
18
+
19
+ def youtube_regex
20
+ /[a-zA-Z0-9_-]{11}/
21
+ end
22
+
23
+ ### Complete Hash Validations
24
+
25
+ def slug
26
+ {
27
+ uniqueness: true,
28
+ presence: true,
29
+ format: {
30
+ with: self.slug_regex,
31
+ message: 'cannot have spaces or special characters'
32
+ }
33
+ }
34
+ end
35
+
36
+ def email
37
+ {
38
+ allow_blank: true,
39
+ format: {
40
+ with: self.email_regex,
41
+ message: 'is invalid'
42
+ }
43
+ }
44
+ end
45
+
46
+ def url
47
+ {
48
+ allow_blank: true,
49
+ format: {
50
+ with: self.url_regex,
51
+ message: 'is invalid'
52
+ }
53
+ }
54
+ end
55
+
56
+ def zip
57
+ {
58
+ allow_blank: true,
59
+ format: {
60
+ with: self.zip_regex,
61
+ message: 'is invalid'
62
+ }
63
+ }
64
+ end
65
+
66
+ def youtube_url
67
+ {
68
+ allow_blank: true,
69
+ format: {
70
+ with: self.youtube_regex,
71
+ message: 'is invalid'
72
+ }
73
+ }
74
+ end
75
+
76
+ end
@@ -0,0 +1,3 @@
1
+ module Fae
2
+ VERSION = '2.1.0'
3
+ end
@@ -0,0 +1,71 @@
1
+ # From https://gist.github.com/chrisbloom7/1009861 based on https://gist.github.com/795665
2
+
3
+ class FileSizeValidator < ActiveModel::EachValidator
4
+ MESSAGES = { :is => :wrong_size, :minimum => :size_too_small, :maximum => :size_too_big }.freeze
5
+ CHECKS = { :is => :==, :minimum => :>=, :maximum => :<= }.freeze
6
+
7
+ DEFAULT_TOKENIZER = lambda { |value| value.split(//) }
8
+ RESERVED_OPTIONS = [:minimum, :maximum, :within, :is, :tokenizer, :too_short, :too_long]
9
+
10
+ def initialize(options)
11
+ if range = (options.delete(:in) || options.delete(:within))
12
+ raise ArgumentError, ":in and :within must be a Range" unless range.is_a?(Range)
13
+ options[:minimum], options[:maximum] = range.begin, range.end
14
+ options[:maximum] -= 1 if range.exclude_end?
15
+ end
16
+
17
+ super
18
+ end
19
+
20
+ def check_validity!
21
+ keys = CHECKS.keys & options.keys
22
+
23
+ if keys.empty?
24
+ raise ArgumentError, 'Range unspecified. Specify the :within, :maximum, :minimum, or :is option.'
25
+ end
26
+
27
+ keys.each do |key|
28
+ value = options[key]
29
+
30
+ unless value.is_a?(Integer) && value >= 0
31
+ raise ArgumentError, ":#{key} must be a nonnegative Integer"
32
+ end
33
+ end
34
+ end
35
+
36
+ def validate_each(record, attribute, value)
37
+ raise(ArgumentError, "A CarrierWave::Uploader::Base object was expected") unless value.kind_of? CarrierWave::Uploader::Base
38
+
39
+ value = (options[:tokenizer] || DEFAULT_TOKENIZER).call(value) if value.kind_of?(String)
40
+
41
+ CHECKS.each do |key, validity_check|
42
+ next unless check_value = options[key]
43
+
44
+ value ||= [] if key == :maximum
45
+
46
+ begin
47
+ value_size = value.size
48
+ next if value_size.send(validity_check, check_value)
49
+ rescue
50
+ next
51
+ end
52
+
53
+ errors_options = options.except(*RESERVED_OPTIONS)
54
+ errors_options[:file_size] = help.number_to_human_size check_value
55
+
56
+ default_message = options[MESSAGES[key]]
57
+ errors_options[:message] ||= default_message if default_message
58
+
59
+ record.errors.add(attribute, MESSAGES[key], errors_options)
60
+ end
61
+ end
62
+
63
+ def help
64
+ Helper.instance
65
+ end
66
+
67
+ class Helper
68
+ include Singleton
69
+ include ActionView::Helpers::NumberHelper
70
+ end
71
+ end
@@ -0,0 +1,156 @@
1
+ module Fae
2
+ class BaseGenerator < Rails::Generators::NamedBase
3
+ source_root ::File.expand_path('../templates', __FILE__)
4
+ argument :attributes, type: :array, default: [], banner: "field[:type][:index] field[:type][:index]"
5
+ class_option :namespace, type: :string, default: 'admin', desc: 'Sets the namespace of the generator'
6
+ class_option :template, type: :string, default: 'slim', desc: 'Sets the template engine of the generator'
7
+
8
+ @@attributes_flat = []
9
+ @@attribute_names = []
10
+ @@association_names = []
11
+ @@attachments = []
12
+ @@has_position = false
13
+ @@display_field = ''
14
+
15
+ def check_template_support
16
+ supported_templates = ['slim']
17
+ raise "Fae::UnsupportedTemplate: the template engine you defined isn't supported" unless supported_templates.include?(options.template)
18
+ end
19
+
20
+ def set_globals
21
+ if attributes.present?
22
+ attributes.each do |arg|
23
+ # :image and :file args get used to generate association defs and form elements
24
+ # we don't want them in attributes_flat or attribute_names as they are not real model generator field options
25
+ if is_attachment(arg)
26
+ @@attachments << arg
27
+ else
28
+ @@attributes_flat << "#{arg.name}:#{arg.type}"
29
+ end
30
+
31
+ if arg.name['_id'] || arg.type.to_s == 'references'
32
+ @@association_names << arg.name.gsub('_id', '')
33
+ elsif !is_attachment(arg)
34
+ @@attribute_names << arg.name
35
+ end
36
+ @@has_position = true if arg.name === 'position'
37
+ end
38
+
39
+ @@attributes_flat = @@attributes_flat.uniq.join(' ')
40
+ @@association_names.uniq!
41
+ @@attribute_names.uniq!
42
+ @@attachments.uniq!
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ ## Generator Methods
49
+
50
+ def generate_model
51
+ generate "model #{file_name} #{@@attributes_flat}"
52
+ inject_concern
53
+ inject_display_field_to_model
54
+ inject_model_attachments
55
+ inject_position_scope
56
+ end
57
+
58
+ def generate_controller_file
59
+ @attachments = @@attachments
60
+ template "controllers/scaffold_controller.rb", "app/controllers/#{options.namespace}/#{file_name.pluralize}_controller.rb"
61
+ end
62
+
63
+ def generate_view_files
64
+ @toggle_attrs = set_toggle_attrs
65
+ @form_attrs = set_form_attrs
66
+ @association_names = @@association_names
67
+ @attachments = @@attachments
68
+ @has_position = @@has_position
69
+ @display_field = @@display_field
70
+ template "views/index.html.#{options.template}", "app/views/#{options.namespace}/#{plural_file_name}/index.html.#{options.template}"
71
+ template "views/_form.html.#{options.template}", "app/views/#{options.namespace}/#{plural_file_name}/_form.html.#{options.template}"
72
+ copy_file "views/new.html.#{options.template}", "app/views/#{options.namespace}/#{plural_file_name}/new.html.#{options.template}"
73
+ copy_file "views/edit.html.#{options.template}", "app/views/#{options.namespace}/#{plural_file_name}/edit.html.#{options.template}"
74
+ end
75
+
76
+ def add_route
77
+ inject_into_file "config/routes.rb", after: "namespace :#{options.namespace} do\n" do <<-RUBY
78
+ resources :#{plural_file_name}
79
+ RUBY
80
+ end
81
+ end
82
+
83
+ ## Helper Methods
84
+
85
+ def set_toggle_attrs
86
+ ['active', 'on_stage', 'on_prod'] & @@attribute_names
87
+ end
88
+
89
+ def set_form_attrs
90
+ rejected_attrs = ['position', 'on_stage', 'on_prod']
91
+ @@attribute_names.delete_if { |i| rejected_attrs.include?(i)}
92
+ end
93
+
94
+ def inject_concern
95
+ inject_into_file "app/models/#{file_name}.rb", after: /(ActiveRecord::Base|ApplicationRecord)\n/ do <<-RUBY
96
+ include Fae::BaseModelConcern\n
97
+ RUBY
98
+ end
99
+ end
100
+
101
+ def inject_display_field_to_model
102
+ if @@attribute_names.include? 'name'
103
+ @@display_field = 'name'
104
+ elsif @@attribute_names.include? 'title'
105
+ @@display_field = 'title'
106
+ end
107
+
108
+ inject_into_file "app/models/#{file_name}.rb", after: "include Fae::BaseModelConcern\n" do <<-RUBY
109
+ def fae_display_field
110
+ #{@@display_field}
111
+ end
112
+ RUBY
113
+ end
114
+
115
+ end
116
+
117
+ def inject_position_scope
118
+ if @@has_position
119
+ inject_into_file "app/models/#{file_name}.rb", after: "include Fae::BaseModelConcern\n" do <<-RUBY
120
+ \n acts_as_list add_new_at: :top
121
+ default_scope { order(:position) }\n
122
+ RUBY
123
+ end
124
+ end
125
+ end
126
+
127
+ def inject_model_attachments
128
+ return if @@attachments.blank?
129
+ @@attachments.each do |attachment|
130
+ if attachment.type == :image
131
+ inject_into_file "app/models/#{file_name}.rb", after: "include Fae::BaseModelConcern\n" do
132
+ <<-RUBY
133
+ has_fae_image :#{attachment.name}\n
134
+ RUBY
135
+ end
136
+ elsif attachment.type == :file
137
+ inject_into_file "app/models/#{file_name}.rb", after: "include Fae::BaseModelConcern\n" do
138
+ <<-RUBY
139
+ has_fae_file :#{attachment.name}\n
140
+ RUBY
141
+ end
142
+ end
143
+ end
144
+ end
145
+
146
+ def inject_nav_item
147
+ line = "item('#{plural_file_name.humanize.titlecase}', path: #{options.namespace}_#{plural_file_name}_path),\n\s\s\s\s\s\s\s\s"
148
+ inject_into_file 'app/models/concerns/fae/navigation_concern.rb', line, before: '# scaffold inject marker'
149
+ end
150
+
151
+ def is_attachment(arg)
152
+ [:image,:file].include?(arg.type)
153
+ end
154
+
155
+ end
156
+ end