templet_rails 0.1.0 → 0.2.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 (276) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +334 -269
  4. data/Rakefile +21 -7
  5. data/app/assets/config/templet_rails_manifest.js +2 -0
  6. data/app/assets/javascripts/templet_rails/application.js +15 -0
  7. data/app/assets/stylesheets/templet_rails/application.css +15 -0
  8. data/app/controllers/templet/json_rendering_helpers.rb +12 -0
  9. data/app/controllers/templet/rendering_helpers.rb +53 -0
  10. data/app/controllers/templet/viewer_call_string.rb +144 -0
  11. data/app/controllers/templet/viewer_call_string_class.rb +65 -0
  12. data/app/controllers/templet/viewer_responders.rb +121 -0
  13. data/app/controllers/templet_rails/application_controller.rb +5 -0
  14. data/app/helpers/templet/constants.rb +54 -0
  15. data/app/helpers/templet/forms/bs_form.rb +73 -0
  16. data/app/helpers/templet/forms/bs_form_errors.rb +38 -0
  17. data/app/helpers/templet/forms/bs_form_field.rb +114 -0
  18. data/app/helpers/templet/forms/bs_form_group.rb +115 -0
  19. data/app/helpers/templet/layouts/html_rails.rb +36 -0
  20. data/app/helpers/templet/links.rb +28 -0
  21. data/app/helpers/templet/links/bs_btn_class.rb +61 -0
  22. data/app/helpers/templet/links/bs_link_set_base.rb +168 -0
  23. data/app/helpers/templet/links/bs_link_set_collection.rb +21 -0
  24. data/app/helpers/templet/links/bs_link_set_navigation.rb +62 -0
  25. data/app/helpers/templet/links/rest_link_procs.rb +163 -0
  26. data/app/helpers/templet/links/rest_link_procs_parent.rb +39 -0
  27. data/app/helpers/templet/links/rest_link_procs_sets.rb +30 -0
  28. data/app/helpers/templet/links/rest_link_text.rb +102 -0
  29. data/app/helpers/templet/links/rest_path.rb +90 -0
  30. data/app/helpers/templet/mixins.rb +9 -0
  31. data/app/helpers/templet/mixins/bs.rb +11 -0
  32. data/app/helpers/templet/mixins/bs/grid.rb +53 -0
  33. data/app/helpers/templet/mixins/bs/lists.rb +77 -0
  34. data/app/helpers/templet/mixins/field_procs.rb +140 -0
  35. data/app/helpers/templet/mixins/html_presenters.rb +82 -0
  36. data/app/helpers/templet/require_all.rb +45 -0
  37. data/app/helpers/templet/utils/html_search_form.rb +53 -0
  38. data/app/helpers/templet/utils/link_set_factory.rb +46 -0
  39. data/app/helpers/templet/utils/link_set_factory_wrapper.rb +53 -0
  40. data/app/helpers/templet/utils/list_model_parents.rb +27 -0
  41. data/app/helpers/templet/utils/navbar_form.rb +26 -0
  42. data/app/helpers/templet/utils/selected_wrapper.rb +40 -0
  43. data/app/helpers/templet/viewer.rb +11 -0
  44. data/app/helpers/templet/viewer/meta_model.rb +66 -0
  45. data/app/helpers/templet/viewer/meta_model_defaults.rb +56 -0
  46. data/app/helpers/templet/viewer/presenters.rb +44 -0
  47. data/app/helpers/templet/viewer/rest_actions.rb +24 -0
  48. data/app/helpers/templet/viewer_base.rb +111 -0
  49. data/app/helpers/templet/viewer_rest.rb +144 -0
  50. data/app/helpers/templet_helper.rb +10 -0
  51. data/app/helpers/templet_rails/application_helper.rb +4 -0
  52. data/app/jobs/templet_rails/application_job.rb +4 -0
  53. data/app/mailers/templet_rails/application_mailer.rb +6 -0
  54. data/app/models/templet_rails/application_record.rb +5 -0
  55. data/app/views/layouts/templet_rails/application.html.erb +16 -0
  56. data/config/routes.rb +2 -0
  57. data/lib/generators/templet/controller/controller_generator.rb +70 -68
  58. data/lib/generators/templet/core_install/USAGE +14 -0
  59. data/lib/generators/templet/core_install/core_install_generator.rb +77 -0
  60. data/lib/generators/templet/core_rspec/USAGE +5 -8
  61. data/lib/generators/templet/core_rspec/core_rspec_generator.rb +32 -47
  62. data/lib/generators/templet/destroy/USAGE +1 -1
  63. data/lib/generators/templet/destroy/destroy_generator.rb +87 -84
  64. data/lib/generators/templet/install/USAGE +16 -0
  65. data/lib/generators/templet/install/install_generator.rb +103 -0
  66. data/lib/generators/templet/routes/routes_generator.rb +43 -41
  67. data/lib/generators/templet/rspec/rspec_generator.rb +1 -0
  68. data/lib/generators/templet/scaffold/scaffold_generator.rb +66 -64
  69. data/lib/generators/templet/shared/core_helpers.rb +10 -0
  70. data/lib/generators/templet/shared/model_fields.rb +2 -2
  71. data/lib/generators/templet/templates/core/app/base_viewer.rb +1 -1
  72. data/lib/generators/templet/templates/core/app/{panel → layouts}/layout_base.rb +3 -3
  73. data/lib/generators/templet/templates/core/app/{panel → layouts}/layout_header.rb +3 -1
  74. data/lib/generators/templet/templates/core/app/{panel → layouts}/layout_header_sidebar.rb +2 -1
  75. data/lib/generators/templet/templates/core/app/{panel/nav.rb → layouts/navbar.rb} +2 -2
  76. data/lib/generators/templet/templates/core/app/layouts/navbar_args_option.rb +32 -0
  77. data/lib/generators/templet/templates/core/app/{link_sets/navbar.rb → layouts/navbar_links.rb} +2 -2
  78. data/lib/generators/templet/templates/core/app/{panel → layouts}/options_config.rb +3 -3
  79. data/lib/generators/templet/templates/core/app/layouts/panel/flash_messages.rb +35 -0
  80. data/lib/generators/templet/templates/core/app/layouts/panel/show_parents_option.rb +24 -0
  81. data/lib/generators/templet/templates/core/app/layouts/panel/sidebar_links_option.rb +26 -0
  82. data/lib/generators/templet/templates/core/spec/layouts/flash_messages_spec.rb +18 -0
  83. data/lib/generators/templet/templates/core/spec/layouts/navbar_spec.rb +19 -0
  84. data/lib/generators/templet/templates/core/spec/support/apis/api_helper.rb +2 -0
  85. data/lib/generators/templet/templates/core/spec/support/apis/shared_examples_a_json_controller.rb +1 -1
  86. data/lib/generators/templet/templates/core/spec/support/{viewer → shared}/partial_test_helpers.rb +0 -0
  87. data/lib/generators/templet/templates/core/templet/viewer_base.rb +3 -3
  88. data/lib/generators/templet/viewer/viewer_generator.rb +60 -58
  89. data/lib/tasks/templet_rails_tasks.rake +4 -0
  90. data/lib/templet_rails.rb +1 -1
  91. data/lib/templet_rails/engine.rb +5 -0
  92. data/lib/templet_rails/version.rb +1 -1
  93. data/spec/dummy/Rakefile +6 -0
  94. data/spec/dummy/app/assets/config/manifest.js +4 -0
  95. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  96. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  97. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  98. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  99. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  100. data/spec/dummy/app/controllers/answers_controller.rb +86 -0
  101. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  102. data/spec/dummy/app/controllers/categories_controller.rb +80 -0
  103. data/spec/dummy/app/controllers/questions_controller.rb +86 -0
  104. data/spec/dummy/app/helpers/app.rb +4 -0
  105. data/spec/dummy/app/helpers/app/answer_viewer.rb +21 -0
  106. data/spec/dummy/app/helpers/app/base_viewer.rb +7 -0
  107. data/spec/dummy/app/helpers/app/category_viewer.rb +26 -0
  108. data/spec/dummy/app/helpers/app/layouts/layout_base.rb +40 -0
  109. data/spec/dummy/app/helpers/app/layouts/layout_header.rb +24 -0
  110. data/spec/dummy/app/helpers/app/layouts/layout_header_sidebar.rb +19 -0
  111. data/spec/dummy/app/helpers/app/layouts/navbar.rb +55 -0
  112. data/spec/dummy/app/helpers/app/layouts/navbar_args_option.rb +32 -0
  113. data/spec/dummy/app/helpers/app/layouts/navbar_links.rb +12 -0
  114. data/spec/dummy/app/helpers/app/layouts/options_config.rb +19 -0
  115. data/spec/dummy/app/helpers/app/layouts/panel/flash_messages.rb +35 -0
  116. data/spec/dummy/app/helpers/app/layouts/panel/show_parents_option.rb +24 -0
  117. data/spec/dummy/app/helpers/app/layouts/panel/sidebar_links_option.rb +26 -0
  118. data/spec/dummy/app/helpers/app/question_viewer.rb +26 -0
  119. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  120. data/spec/dummy/app/jobs/application_job.rb +2 -0
  121. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  122. data/spec/dummy/app/models/answer.rb +12 -0
  123. data/spec/dummy/app/models/application_record.rb +3 -0
  124. data/spec/dummy/app/models/category.rb +11 -0
  125. data/spec/dummy/app/models/question.rb +15 -0
  126. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  127. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  128. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  129. data/spec/dummy/bin/bundle +3 -0
  130. data/spec/dummy/bin/rails +4 -0
  131. data/spec/dummy/bin/rake +4 -0
  132. data/spec/dummy/bin/setup +36 -0
  133. data/spec/dummy/bin/update +31 -0
  134. data/spec/dummy/bin/yarn +11 -0
  135. data/spec/dummy/config.ru +5 -0
  136. data/spec/dummy/config/application.rb +30 -0
  137. data/spec/dummy/config/boot.rb +5 -0
  138. data/spec/dummy/config/cable.yml +10 -0
  139. data/spec/dummy/config/database.yml +25 -0
  140. data/spec/dummy/config/environment.rb +5 -0
  141. data/spec/dummy/config/environments/development.rb +61 -0
  142. data/spec/dummy/config/environments/production.rb +94 -0
  143. data/spec/dummy/config/environments/test.rb +46 -0
  144. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  145. data/spec/dummy/config/initializers/assets.rb +14 -0
  146. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  147. data/spec/dummy/config/initializers/content_security_policy.rb +25 -0
  148. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  149. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  150. data/spec/dummy/config/initializers/inflections.rb +16 -0
  151. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  152. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  153. data/spec/dummy/config/locales/en.yml +33 -0
  154. data/spec/dummy/config/puma.rb +34 -0
  155. data/spec/dummy/config/routes.rb +9 -0
  156. data/spec/dummy/config/spring.rb +6 -0
  157. data/spec/dummy/config/storage.yml +34 -0
  158. data/spec/dummy/db/development.sqlite3 +0 -0
  159. data/spec/dummy/db/migrate/20190709192619_create_categories.rb +9 -0
  160. data/spec/dummy/db/migrate/20190709192656_create_questions.rb +12 -0
  161. data/spec/dummy/db/migrate/20190709192737_create_answers.rb +13 -0
  162. data/spec/dummy/db/schema.rb +42 -0
  163. data/spec/dummy/db/test.sqlite3 +0 -0
  164. data/spec/dummy/log/development.log +64 -0
  165. data/spec/dummy/log/test.log +40792 -0
  166. data/spec/dummy/package.json +5 -0
  167. data/spec/dummy/public/404.html +67 -0
  168. data/spec/dummy/public/422.html +67 -0
  169. data/spec/dummy/public/500.html +66 -0
  170. data/{lib/generators/templet/templates/core/controllers/.keep → spec/dummy/public/apple-touch-icon-precomposed.png} +0 -0
  171. data/spec/dummy/public/apple-touch-icon.png +0 -0
  172. data/spec/dummy/public/favicon.ico +0 -0
  173. data/spec/dummy/spec/apis/answers_controller_spec.rb +17 -0
  174. data/spec/dummy/spec/apis/categories_controller_spec.rb +13 -0
  175. data/spec/dummy/spec/apis/questions_controller_spec.rb +15 -0
  176. data/spec/dummy/spec/helpers/app/answer_viewer_spec.rb +18 -0
  177. data/spec/dummy/spec/helpers/app/category_viewer_spec.rb +14 -0
  178. data/spec/dummy/spec/helpers/app/layouts/flash_messages_spec.rb +18 -0
  179. data/spec/dummy/spec/helpers/app/layouts/navbar_spec.rb +19 -0
  180. data/spec/dummy/spec/helpers/app/question_viewer_spec.rb +16 -0
  181. data/spec/dummy/spec/support/apis/api_helper.rb +15 -0
  182. data/spec/dummy/spec/support/apis/shared_examples_a_json_controller.rb +196 -0
  183. data/spec/dummy/spec/support/templet/partial_test_helpers.rb +32 -0
  184. data/spec/dummy/spec/support/templet/shared_examples_a_viewer.rb +105 -0
  185. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-6/-6-48LISBeQVJvpEXNgFstDrCriEFNmvje6XhidzlV4.cache +1 -0
  186. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-D/-DLE9y_1ICajcEaHcprHYBO8vjXpHySH_56FSb0SLOs.cache +0 -0
  187. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-Y/-YJ1ILDQvu3hOKkF0VR9K_z04e2-EVHglO0MAFS8gpQ.cache +1 -0
  188. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-_/-_7FgdEon9WttcnvoyQAysmonCHN7FxsrcuDa5OTUJQ.cache +1 -0
  189. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0u/0u-iWymOJvpggI1uY7Na3322xwcjNY7egB-czjV96m4.cache +2 -0
  190. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0x/0xArd189AygdGItqWO0_5BfinFQjLZjwyVsAGWqOgKg.cache +1 -0
  191. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2S/2SfjLWkOp2BGM0OzwsshKpnXI8rlJFOV6ZJsIszRn6k.cache +1 -0
  192. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3h/3hFAACevvXtDja9zz3rMK6gA1MD1I7_puWyRRkV7sLk.cache +2 -0
  193. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4o/4oNwzIrltWrfajciBz7JHd5RT5_XVv04L6NdaBGN794.cache +3 -0
  194. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7F/7F3o6QQqoI0bDk6-A5qMN8LCZQALddlu23KiRWBxtWk.cache +0 -0
  195. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Af/AfFBDeKpi4wSUc7rcjxfjPbEgV6GOGXTjeZhHrfDX48.cache +0 -0
  196. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bf/BfD6ZVgFq-kWDMMVb2EE5ZAKgsgn1VUR9oVxD0hHVMI.cache +0 -0
  197. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bo/Bogjbc_D5J-6_m5KEgeXt_GHc-IbUt1_FDWP4PHV0P8.cache +1 -0
  198. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DF/DF3HgsSD9LO1Bz8d3GJi_G6wBExmsnBJ6b1pvZEGE7w.cache +1 -0
  199. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DO/DO8Gqh32jK2GrO9uIlH7qvDkelVw0VM8CTSOUj6iUEo.cache +1 -0
  200. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/GC/GCNwk_ABiY0z51bz8iC8tqLLWKhQwxW4-JLNKv-SRe0.cache +1 -0
  201. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gl/Gls_Zud1kxq7p08FGBfzalbaLMlLBl28bOYebh7Ljrg.cache +0 -0
  202. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gm/GmHHk4YNC0G2V_5gQZp0U6mKFPxGSgL7fwWI3_fajrk.cache +1 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gr/GreB3WHN8MyWMDFGNyqJJcxGblgo-5XepsEHvdJSQGI.cache +1 -0
  204. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HC/HCDOUd7-S45aJ_PjVAC_Vmjyud3i1aQv4cE3t9_Z3Dw.cache +2 -0
  205. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hd/HdvsElcHSt7aKjG9jocgIQJEvBjBbeSZ8HntI1pc38o.cache +1 -0
  206. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Iv/IvR5RxSTQkxfGWSoy5S2s7wO5u5qwCJ5mNAhqNJtJDY.cache +0 -0
  207. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/JS/JSYyQZJzLNqpmVR--ZDUW6PY7_HflyFFHDAOLenxlP4.cache +1 -0
  208. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Jx/JxJXzSistcpH4S_9CbGx_wyjVTaE77ZDDfOc4uTfvdM.cache +0 -0
  209. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MH/MHCZUSVJq62YPmcVVkfjp2B5uH_nDL7snLl4yqvlSJY.cache +1 -0
  210. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MY/MY5theanttko1gCnW9vKb0Z1GkJn8Ofk149HwOt0UAM.cache +0 -0
  211. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mn/MnGg5XDll2jo-E_CTC1htiNc0hOY6z80_bwGCvpYTXk.cache +1 -0
  212. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nt/NtYu5CjAvU5ZHxSOn6Q4LPukD3hBE-3vYe30d_uSBzM.cache +1 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nu/NuIepb7qomZzBDAJMUROsshKo8TJxdmFR4yOe64W58w.cache +1 -0
  214. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R7/R7ngeIqpdwSWkbjbxxzh6B-KczkWMcxYMIkj5inxrV8.cache +1 -0
  215. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/S9/S9MhILnM64qd2M9Z92TrNMtw7VUWZxf3H367OO8rlhs.cache +2 -0
  216. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SI/SIZUy2mtjUm_G1YIulRCovzgkCwV1eoR2NLiYcsR1Ws.cache +0 -0
  217. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Sl/SlECThrSAExfICiFGVi-zu240BVDaUldaRs4qcj354U.cache +0 -0
  218. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/St/St6dTA4niiCDLnnArKZV38uZNFf6MbEZ_jHGC-Upft0.cache +0 -0
  219. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/T6/T6p-BnPmMCmpJdaqrjWmLMsBW8SNJpSW6w-Azc3XGVk.cache +1 -0
  220. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vs/VsZPCEai1GtOT-vHjxMS8kAP9ASG5i_2O_EP76uI7Qs.cache +0 -0
  221. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vv/Vv6dack32HV3tIZ_6F4BF8Mrrnb7wZEG4VlEKumQ6L0.cache +2 -0
  222. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wp/WpV6mJwJX9dwIFJGLoJoa-gXNe1-ZHusE9SwvnWysa8.cache +0 -0
  223. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wy/Wya0wl0Q2nXYb5-bC5Fbo0sDZfKb3415AjtSjld7fQI.cache +1 -0
  224. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/b7/b7j7TIOE1nnqvMku0QePWFrwCkaKkNpxkiWST6PAplo.cache +1 -0
  225. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ck/ckDOh-FroVE8r1fwUNWmnRconIREuVdmkZEFkaP9KfU.cache +1 -0
  226. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eN/eNQPQP-9gB3xzxJBsG7soV6Ie0YZ3gxIS97PgYtZVT8.cache +0 -0
  227. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gb/gbUMPMF8S0OQVsFHyAjHpHVEg-3iZzTVIQZDmfq-ycE.cache +1 -0
  228. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/if/ifyb5SlIS8vkACz_6P0uTOGijMB4C5TyFWmrMq3DYIg.cache +2 -0
  229. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jg/jg-s5YLdnojCtHqzfDTsvcy6UHewDRl1X09qlGyvyag.cache +1 -0
  230. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ko/koPyQus8Oqrx18bnLj-5nJrKvFf6FDDQbv2qEa7Bl7M.cache +0 -0
  231. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lG/lGRRazgrFErFx1PkfDlca6r-0MGQR40i0tq0Wgm2FNU.cache +1 -0
  232. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lS/lStvx9Beg2l4s8L-QdTSKuc5_qQPQAZPnIcRI7JkpPE.cache +2 -0
  233. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lZ/lZIacHrJV5bDohEHsVOXDGIDrUH2h4YvwV9g-MWmh3k.cache +3 -0
  234. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lq/lqM4-wfprvp5FEBp1pSm88Jwx-Vb2oJab2rjLtUcIyM.cache +1 -0
  235. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +2 -0
  236. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +2 -0
  237. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ps/psGFyjvQcs8JpIV8BDeCqQfHaLYgIgSAi86n4RrFpFs.cache +1 -0
  238. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r1/r1IIabhuPhgB3n8V3ZMRN0SqIsXJ8bH0ABTRzHTG1SU.cache +2 -0
  239. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vt/vtskp0QTt72oDQNM6mYZ8pCclh2HICHeYZ1QtDvC5xo.cache +1 -0
  240. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wi/win_v0ZNu-l7AoRx8w3ls1xcy0mUExLBVMCSr5oaJFc.cache +2 -0
  241. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yo/yoggubxI12fIM1o5TtxUialrUN-LWOfRaV_tqc1HAC4.cache +0 -0
  242. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zH/zHnHpZP25wEHaF3mI_M9RGH1zeCApf6mwhLB3Lku1zs.cache +3 -0
  243. data/spec/dummy/tmp/development_secret.txt +1 -0
  244. data/spec/factories/answers.rb +10 -0
  245. data/spec/factories/categories.rb +5 -0
  246. data/spec/factories/questions.rb +8 -0
  247. data/spec/helpers/templet/forms/bs_form_errors_spec.rb +18 -0
  248. data/spec/helpers/templet/forms/bs_form_spec.rb +58 -0
  249. data/spec/helpers/templet/layout/html_rails_spec.rb +64 -0
  250. data/spec/helpers/templet/links/bs_link_set_collection_spec.rb +79 -0
  251. data/spec/helpers/templet/links/rest_link_procs_params_spec.rb +68 -0
  252. data/spec/helpers/templet/links/rest_link_procs_parents_spec.rb +78 -0
  253. data/spec/helpers/templet/links/rest_link_procs_spec.rb +140 -0
  254. data/spec/models/answer_spec.rb +9 -0
  255. data/spec/models/category_spec.rb +9 -0
  256. data/spec/models/question_spec.rb +9 -0
  257. data/spec/rails_helper.rb +61 -0
  258. data/spec/spec_helper.rb +108 -0
  259. data/spec/support/templet/model_parent_helpers.rb +36 -0
  260. data/spec/support/templet/partial_test_helpers.rb +32 -0
  261. data/spec/support/templet/rest_link_procs_assignments.rb +43 -0
  262. data/spec/support/templet/rest_link_procs_helpers.rb +15 -0
  263. metadata +470 -38
  264. data/.gitignore +0 -8
  265. data/.travis.yml +0 -5
  266. data/Gemfile +0 -6
  267. data/LICENSE.txt +0 -21
  268. data/bin/console +0 -14
  269. data/bin/setup +0 -8
  270. data/lib/generators/templet/core/USAGE +0 -23
  271. data/lib/generators/templet/core/core_generator.rb +0 -128
  272. data/lib/generators/templet/templates/core/app/panel/flash_messages.rb +0 -33
  273. data/lib/generators/templet/templates/core/app/panel/nav_args_option.rb +0 -30
  274. data/lib/generators/templet/templates/core/app/panel/show_parents_option.rb +0 -22
  275. data/lib/generators/templet/templates/core/app/panel/sidebar_links_option.rb +0 -24
  276. data/templet_rails.gemspec +0 -36
@@ -0,0 +1,5 @@
1
+ module TempletRails
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+ end
5
+ end
@@ -0,0 +1,54 @@
1
+
2
+ module Templet
3
+ # Bootstrap 3.6 HTML classes
4
+ module Constants
5
+ BS_SELECTED = 'active'
6
+
7
+ BS_FORM = 'form-horizontal'
8
+ BS_FORM_INLINE = 'form form-inline'
9
+
10
+ #BS_FORM_HELP_BLOCK = 'help-block'
11
+
12
+ BS_LIST_UNSTYLED = 'list-unstyled'
13
+ BS_LIST_INLINE = 'list-inline'
14
+
15
+ BS_PANEL = 'panel panel-danger'
16
+ BS_PANEL_HEADING = 'panel-heading'
17
+ BS_PANEL_TITLE = 'panel-title'
18
+ BS_PANEL_BODY = 'panel-body'
19
+
20
+ BS_BUTTON = 'btn'
21
+
22
+ BS_BUTTON_SUBMIT = "#{BS_BUTTON} #{BS_BUTTON}-primary"
23
+ BS_BUTTON_SUBMIT_SEARCH = "#{BS_BUTTON} #{BS_BUTTON}-default"
24
+
25
+ BS_BUTTON_TYPE = 'default'
26
+ BS_BUTTON_SIZE = 'md'
27
+
28
+ BS_BUTTON_GROUP = "#{BS_BUTTON}-group"
29
+ BS_BUTTON_GROUP_VERTICAL = "#{BS_BUTTON_GROUP}-vertical"
30
+ BS_BUTTON_GROUP_JUSTIFIED = "#{BS_BUTTON_GROUP}-justified"
31
+
32
+ BS_TOOLBAR = "toolbar"
33
+ BS_BUTTON_TOOLBAR = "#{BS_BUTTON}-#{BS_TOOLBAR}"
34
+
35
+ BS_BUTTON_DROPDOWN = "dropdown-menu"
36
+
37
+ BS_BUTTON_BLOCK = 'btn btn-info btn-md btn-block'
38
+
39
+ BS_LIST_GROUP = "list-group"
40
+ BS_LIST_GROUP_ITEM = "list-group-item"
41
+
42
+ BS_NAV = "nav"
43
+ BS_NAV_PILLS = "#{BS_NAV} nav-pills"
44
+ BS_NAV_TABS = "#{BS_NAV} nav-tabs"
45
+ BS_NAV_PILLS_STACKED = "nav-stacked"
46
+
47
+ BS_TABLE = 'table table-responsive table-hover table-condensed table-striped'
48
+
49
+ # TODO:
50
+ BS_COL = 'col-md-'
51
+ BS_COL_OFFSET = 'col-md-offset-'
52
+ end
53
+ end
54
+
@@ -0,0 +1,73 @@
1
+
2
+ module Templet
3
+ module Forms
4
+ # Entry point for rendering forms
5
+ # It writes out the HTML form tag, error meesages and hidden fields
6
+ class BsForm < Templet::Component::Partial
7
+ include Constants
8
+
9
+ # Renders the outside of an HTML form
10
+ # it renders the <form> tag, the model's errors, and two hiiden fields
11
+ def call(url: nil,
12
+ remote: false,
13
+ html_class: nil,
14
+ inline: false,
15
+ method: nil)
16
+ super() do
17
+ url, model = url.for_form if url.respond_to?(:for_form)
18
+
19
+ url = url_for(url) if Array === url or ActiveRecord::Base === url
20
+
21
+ atts = form_atts(html_class, remote, inline, method)
22
+
23
+ method ||= http_method(model)
24
+
25
+ hidden_form_fields = if get?(method)
26
+ []
27
+ else
28
+ [ hidden_field_tag(:authenticity_token, form_authenticity_token),
29
+ hidden_field_tag(:_method, method) ]
30
+ end
31
+
32
+ [ BsFormErrors.new(self).(model),
33
+ form(atts.merge action: url) { hidden_form_fields << yield(self) }
34
+ ]
35
+ end
36
+ end
37
+
38
+ # Shortcut method used in rendering a REST form with specified fields
39
+ def self.call(renderer, record, **form_group_options)
40
+ form_group = BsFormGroup.new(renderer, record, **form_group_options)
41
+
42
+ return BsFormField.new(form_group), form_group
43
+ end
44
+
45
+ private
46
+
47
+ def get?(method)
48
+ method&.to_s =~ /get/i
49
+ end
50
+
51
+ def form_atts(html_class, remote, inline, method)
52
+ html_class ||= form_class(inline)
53
+
54
+ atts = { class: html_class, role: 'form' }
55
+
56
+ atts[:method] = get?(method) ? 'get' : 'post'
57
+
58
+ atts[:"data-remote"] = 'true' if remote
59
+
60
+ atts
61
+ end
62
+
63
+ def form_class(inline=false)
64
+ inline ? BS_FORM_INLINE : BS_FORM
65
+ end
66
+
67
+ def http_method(record)
68
+ record&.persisted? ? 'patch' : 'post'
69
+ end
70
+ end
71
+ end
72
+ end
73
+
@@ -0,0 +1,38 @@
1
+
2
+ module Templet
3
+ module Forms
4
+ # Shows error messages from validation failures
5
+ class BsFormErrors < Templet::Component::Partial
6
+ include Constants
7
+
8
+ def call(model)
9
+ if model and model.errors.any?
10
+ super() do
11
+ div id: "error_expl", class: BS_PANEL do
12
+ [ div(BS_PANEL_HEADING) { h3(error_title(model), BS_PANEL_TITLE) },
13
+
14
+ div(BS_PANEL_BODY) do
15
+ ul(BS_LIST_UNSTYLED) do
16
+ model.errors.full_messages.map {|msg| li msg }
17
+ end
18
+ end
19
+ ]
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def error_title(model)
28
+ compose do
29
+ error_count = model.errors.count
30
+ model_name = model.class.name.underscore
31
+
32
+ "#{pluralize error_count, "error"} on #{model_name}"
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,114 @@
1
+
2
+ module Templet
3
+ module Forms
4
+ # Renders the different types of HTML input fields
5
+ class BsFormField < Struct.new(:form_group)
6
+ include Constants
7
+
8
+ def text(field_name, mandatory: false, help: nil)
9
+ field_class = field_class()
10
+
11
+ group_opts = { mandatory: mandatory, help: help }
12
+
13
+ form_group.(field_name, **group_opts) do |renderer, record_name|
14
+ renderer.call do
15
+ text_field record_name, field_name, class: field_class
16
+ end
17
+ end
18
+ end
19
+
20
+ def text_area(field_name, rows: 2, mandatory: false, help: nil)
21
+ field_class = field_class()
22
+
23
+ group_opts = { mandatory: mandatory, help: help }
24
+
25
+ form_group.(field_name, **group_opts) do |renderer, record_name|
26
+ renderer.call do
27
+ text_area record_name, field_name, class: field_class, rows: rows
28
+ end
29
+ end
30
+ end
31
+
32
+ def check_box(field_name, help: nil)
33
+ form_group.(field_name, help: help) do |renderer, record_name|
34
+ renderer.call do
35
+ check_box record_name, field_name
36
+ end
37
+ end
38
+ end
39
+
40
+ def check_box_inline(field_name, help: nil)
41
+ form_group.checkbox(field_name, help: help) do |renderer, record_name|
42
+ renderer.call do
43
+ check_box record_name, field_name
44
+ end
45
+ end
46
+ end
47
+
48
+ def select(field_name, selections, select_id: :id,
49
+ select_name: :name,
50
+ include_blank: false,
51
+ size: nil,
52
+ help: nil)
53
+ html_options = { class: field_class }
54
+
55
+ group_opts = { input_size: size, help: help }
56
+
57
+ options = { include_blank: include_blank }
58
+
59
+ form_group.(field_name, **group_opts) do |renderer, record_name|
60
+ renderer.call do
61
+ collection_select record_name, field_name,
62
+ selections, select_id, select_name,
63
+ options, html_options
64
+ end
65
+ end
66
+ end
67
+
68
+ DATE_INLINE_STYLE = 'display: inline; width: auto; float: left;'
69
+
70
+ def date(field_name, include_blank: true, help: nil)
71
+ html_options = { class: field_class, style: DATE_INLINE_STYLE }
72
+
73
+ options = { include_blank: include_blank }
74
+
75
+ form_group.(field_name, help: help) do |renderer, record_name|
76
+ renderer.call do
77
+ date_select record_name, field_name, options, html_options
78
+ end
79
+ end
80
+ end
81
+
82
+ def datetime(field_name, include_blank: true, help: nil)
83
+ html_options = { class: field_class, style: DATE_INLINE_STYLE }
84
+
85
+ options = { include_blank: include_blank,
86
+ datetime_separator: '', time_separator: '' }
87
+
88
+ form_group.(field_name, help: help) do |renderer, record_name|
89
+ renderer.call do
90
+ datetime_select record_name, field_name, options, html_options
91
+ end
92
+ end
93
+ end
94
+
95
+ def submit(text: 'Submit', html_class: BS_BUTTON_SUBMIT,
96
+ offset: nil, height: form_group.height)
97
+ html_class += " btn-#{height}" if height
98
+
99
+ offset ||= form_group.label_cols
100
+
101
+ form_group.renderer.call do
102
+ submit_button = button(text, html_class, type: 'submit')
103
+
104
+ div(:form_group) { div submit_button, "#{BS_COL_OFFSET}#{offset}" }
105
+ end
106
+ end
107
+
108
+ def field_class
109
+ form_group.field_class
110
+ end
111
+ end
112
+ end
113
+ end
114
+
@@ -0,0 +1,115 @@
1
+
2
+ module Templet
3
+ module Forms
4
+ # Renders the various tags that surround a Bootstrap form field
5
+ class BsFormGroup < Templet::Component::Partial
6
+ include Constants
7
+
8
+ MANDATORY_MARKER = ' *'
9
+
10
+ NBSP = ' &nbsp; '
11
+
12
+ attr_accessor :record, :record_name
13
+
14
+ attr_accessor :field_cols, :input_cols, :height
15
+
16
+ attr_accessor :label_cols, :hide_label
17
+
18
+ def initialize(renderer, record, record_name: record.model_name.singular,
19
+ field_cols: 12,
20
+ input_cols: 8,
21
+ label_cols: 2,
22
+ height: nil,
23
+ hide_label: false)
24
+ super(renderer)
25
+
26
+ self.record = record
27
+
28
+ self.record_name = record_name
29
+
30
+ self.field_cols = field_cols
31
+ self.input_cols = input_cols
32
+
33
+ self.height = height
34
+
35
+ self.label_cols = label_cols
36
+
37
+ self.hide_label = hide_label
38
+ end
39
+
40
+ # An alternative constructor for plain (usually inline) forms
41
+ def self.call(renderer, model=nil, hide_label: true, height: 'md')
42
+ new renderer, model, record_name: '',
43
+ field_cols: nil,
44
+ input_cols: nil,
45
+ label_cols: nil,
46
+ height: height,
47
+ hide_label: hide_label
48
+ end
49
+
50
+ def call(field_name, label_name: nil, field_size: nil,
51
+ input_size: nil, label_size: nil,
52
+ mandatory: false, help: nil)
53
+ label_name ||= field_name.to_s.sub(/_id$/, '').tr('_', ' ').capitalize
54
+
55
+ label_name += mandatory ? MANDATORY_MARKER : ''
56
+
57
+ field_class = "form-group #{col_class field_size || field_cols}"
58
+
59
+ if hide_label
60
+ label_class = "sr-only"
61
+ else
62
+ label_class = "control-label #{col_class label_size || label_cols}"
63
+
64
+ label_class += height ? " input-#{height}" : ''
65
+ end
66
+
67
+ input_class = col_class(input_size || input_cols)
68
+
69
+ inner_self = self
70
+
71
+ renderer.call do
72
+ div(field_class) do
73
+ [ label(record_name, field_name, label_name, class: label_class),
74
+ div(input_class) do
75
+ [ yield(self, record_name, inner_self), *help_block(help) ]
76
+ end
77
+ ]
78
+ end
79
+ end
80
+ end
81
+
82
+ # Checkboxes can be rendered with a different form-group layout
83
+ def checkbox(field_name, text=field_name.to_s.capitalize, help: nil)
84
+ inner_self = self
85
+
86
+ renderer.call do
87
+ div("form-group #{col_class field_cols}") do
88
+ div :checkbox do
89
+ _label col_class(label_cols, offset: true) do
90
+ [ NBSP,
91
+ yield(self, record_name, inner_self),
92
+ text,
93
+ help_block(help) || '<br><br>'
94
+ ]
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ def help_block(help)
102
+ "<p class='help-block'>#{help}</p>" if help
103
+ end
104
+
105
+ def col_class(cols, offset=false)
106
+ "#{offset ? BS_COL_OFFSET : BS_COL}#{cols}" if cols
107
+ end
108
+
109
+ def field_class
110
+ 'form-control' + (height ? " input-#{height}" : '')
111
+ end
112
+ end
113
+ end
114
+ end
115
+
@@ -0,0 +1,36 @@
1
+
2
+ module Templet
3
+ module Layouts
4
+ # Renders a standard HTML layout
5
+ # Basically, it's the same layout that Rails uses
6
+ class HtmlRails < Templet::Component::Layout
7
+ APP = 'application'
8
+
9
+ TURBOS = { 'data-turbolinks-track' => true }
10
+
11
+ SCALE = '<meta name="viewport" content="width=device-width, initial-scale=1.0">'
12
+
13
+ DESC_TEMPLATE = '<meta name="description" content="%s">'
14
+
15
+ def call(title, description='', head_extras: nil)
16
+ super() do
17
+ header = [ SCALE,
18
+ (DESC_TEMPLATE % description),
19
+ _title(title),
20
+ stylesheet_link_tag(APP, TURBOS.merge(media: 'all')),
21
+ javascript_include_tag(APP, TURBOS),
22
+ csrf_meta_tags,
23
+ head_extras,
24
+ rear_head ]
25
+
26
+ html { [ head(header), body(yield renderer) ] }
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def rear_head
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+
2
+ module Templet
3
+ # Some shortcut methods for the main library classes
4
+ module Links
5
+ extend self
6
+
7
+ def collection(*args)
8
+ BsLinkSetCollection.new *args
9
+ end
10
+
11
+ def navigation(*args)
12
+ BsLinkSetNavigation.new *args
13
+ end
14
+
15
+ def rest_link_procs(*args)
16
+ RestLinkProcs.new *args
17
+ end
18
+
19
+ def btn_class(*args)
20
+ BsBtnClass.new *args
21
+ end
22
+
23
+ def link_text(*args)
24
+ RestLinkText.new *args
25
+ end
26
+ end
27
+ end
28
+