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,82 @@
1
+
2
+ module Templet
3
+ module Mixins
4
+ # Helper methods for rendering HTML tables, forms and lists
5
+ module HtmlPresenters
6
+ include Constants
7
+
8
+ # Html table
9
+
10
+ # +controls+:: Is a Hash of field name by Proc which is passed a record
11
+ def html_table(renderer, controls, records, **options)
12
+ unless options.key? :html_class
13
+ options[:html_class] = default_table_class
14
+ end
15
+
16
+ Templet::Html::Table.new(renderer).(controls, records, **options)
17
+ end
18
+
19
+ def default_table_class
20
+ BS_TABLE
21
+ end
22
+
23
+ # Renders the outside of an HTML form.
24
+ # Usually you feed it a block to specify the various fields.
25
+ def html_form(renderer, form_opts, **group_opts)
26
+ if not form_opts.key?(:remote) and respond_to?(:remote?) and remote?
27
+ form_opts[:remote] = true
28
+ end
29
+
30
+ height = form_opts.delete(:height) || group_opts[:height]
31
+ group_opts[:height] = height
32
+
33
+ Forms::BsForm.new(renderer).(**form_opts) do |renderer|
34
+ field, group = Forms::BsForm.(renderer, model, **group_opts)
35
+
36
+ if block_given?
37
+ yield field, group
38
+ else
39
+ form_inputs(field, group) << field.submit
40
+ end
41
+ end
42
+ end
43
+
44
+ # Html lists
45
+
46
+ # +controls+:: A Hash of field name by Proc which is paassed a model
47
+ def html_definition_list(renderer, controls, record=nil)
48
+ Templet::Html::DefinitionList.new(renderer)
49
+ .(controls, record, html_class: 'dl-horizontal')
50
+ end
51
+
52
+ # +items+ is an Array of (literal) list elements
53
+ def html_list(renderer, items, html_class: nil, item_class: nil)
54
+ html_class = get_list_class(html_class)
55
+
56
+ Templet::Html::List.new(renderer).(items, html_class: html_class,
57
+ item_class: item_class)
58
+ end
59
+
60
+ def get_list_class(html_class)
61
+ case html_class
62
+ when nil, :default, :inline
63
+ default_list_class
64
+ when true, :stacked
65
+ stacked_list_class
66
+ when false, :none
67
+ else
68
+ html_class
69
+ end
70
+ end
71
+
72
+ def default_list_class
73
+ BS_LIST_INLINE
74
+ end
75
+
76
+ def stacked_list_class
77
+ BS_LIST_UNSTYLED
78
+ end
79
+ end
80
+ end
81
+ end
82
+
@@ -0,0 +1,45 @@
1
+
2
+ # Requires the whole framework - in case the framework is placed outside of
3
+ # the Rails autoload paths, e.g. under the directory lib/
4
+ =begin
5
+ require 'templet'
6
+ #require 'templet/component'
7
+ #require 'templet/html'
8
+
9
+ require 'templet/viewer_base'
10
+ require 'templet/viewer_rest'
11
+ require 'templet/constants'
12
+
13
+ require 'templet/forms/bs_form_errors'
14
+ require 'templet/forms/bs_form_field'
15
+ require 'templet/forms/bs_form_group'
16
+ require 'templet/forms/bs_form'
17
+
18
+ require 'templet/links/rest_link_text'
19
+ require 'templet/links/bs_btn_class'
20
+ require 'templet/links/rest_link_procs_sets'
21
+ require 'templet/links/rest_link_procs_parent'
22
+ require 'templet/links/rest_link_procs'
23
+ require 'templet/links/bs_link_set_base'
24
+ require 'templet/links/bs_link_set_collection'
25
+ require 'templet/links/bs_link_set_navigation'
26
+ require 'templet/links/bs_btn_class'
27
+ require 'templet/links/rest_link_text'
28
+
29
+ require 'templet/mixins'
30
+ require 'templet/mixins/bs'
31
+ require 'templet/mixins/html_presenters'
32
+ require 'templet/mixins/bs/lists'
33
+ require 'templet/mixins/bs/grid'
34
+
35
+ require 'templet/utils/html_search_form'
36
+ require 'templet/utils/list_model_parents'
37
+
38
+ require 'templet/viewer'
39
+ require 'templet/viewer/presenters'
40
+ require 'templet/viewer/rest_actions'
41
+ require 'templet/viewer/meta_model_defaults'
42
+ require 'templet/viewer/meta_model'
43
+ require 'templet/viewer/rest_actions'
44
+ =end
45
+
@@ -0,0 +1,53 @@
1
+
2
+ module Templet
3
+ module Utils
4
+ # Renders a form (inline) for string searches, primarily for index actions.
5
+ class HtmlSearchForm < Templet::Component::Partial
6
+ include Constants
7
+
8
+ include Mixins::Bs
9
+
10
+ def call(url, field_name: 'q', submit_text: 'Search',
11
+ label: nil, remote: false)
12
+ label ||= submit_text.underscore
13
+
14
+ super() do
15
+ Forms::BsForm.new(renderer).(**form_opts(url, remote)) do |renderer|
16
+ group = Forms::BsFormGroup.(renderer)
17
+
18
+ btn_class = "#{BS_BUTTON_SUBMIT_SEARCH} #{BS_BUTTON}-#{group.height}"
19
+ submit = button(submit_text, btn_class, type: 'submit')
20
+
21
+ [
22
+ group.(field_name, label_name: label) do |renderer, record_name|
23
+ renderer.call do
24
+ text_field record_name, field_name, value: params[field_name],
25
+ class: group.field_class
26
+ end
27
+ end,
28
+ submit
29
+ ]
30
+ end
31
+ end
32
+ end
33
+
34
+ def self.call(renderer, model, parent=nil, scope: nil,
35
+ action: nil,
36
+ remote: nil)
37
+ rest_path = Links::RestPath.new(model, parent, scope: scope)
38
+
39
+ path = action ? rest_path.action(action) : rest_path.index
40
+
41
+ new(renderer).(path, remote: remote)
42
+ end
43
+
44
+ private
45
+
46
+ def form_opts(url, remote=nil)
47
+ { url: url, inline: true, method: 'get' }.tap do |options|
48
+ options.merge!(remote: true) if remote
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,46 @@
1
+
2
+ module Templet
3
+ module Utils
4
+ # Creates lists of HTML links for REST actions
5
+ class LinkSetFactory < Struct.new(:renderer, :action, :klass, :options)
6
+ def call(**extra_options)
7
+ create extra_options
8
+ end
9
+
10
+ private
11
+
12
+ def create(**extra_options)
13
+ get_class.new(*link_set_args(extra_options)).(action)
14
+ end
15
+
16
+ def link_set_args(**extra_options)
17
+ renderer.link_set_args_proc.(renderer, get_options(extra_options))
18
+ end
19
+
20
+ def get_class
21
+ case klass
22
+ when Class
23
+ klass
24
+ when String
25
+ klass.constantize
26
+ when :navigation, :nav
27
+ Templet::Links::BsLinkSetNavigation
28
+ else
29
+ Templet::Links::BsLinkSetCollection
30
+ end
31
+ end
32
+
33
+ def get_options(**extra_options)
34
+ { html_class: %i(default md) }
35
+ .merge(options || {})
36
+ .merge(extra_options)
37
+ end
38
+
39
+ =begin
40
+ def class_name_defined?(class_name)
41
+ class_name.constantize rescue false
42
+ end
43
+ =end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,53 @@
1
+
2
+ module Templet
3
+ module Utils
4
+ # Creates HTML links for REST actions in Bootstrap containers
5
+ class LinkSetFactoryWrapper < LinkSetFactory
6
+ include Mixins::Bs::Lists
7
+
8
+ def call(type=nil, **options)
9
+ stacked = options.delete(:stacked) || false
10
+
11
+ wrap type, create(link_set_options(type).merge options), stacked: stacked
12
+ end
13
+
14
+ private
15
+
16
+ def link_set_options(type)
17
+ case type
18
+ when :pills, :tabs
19
+ { html_class: '', wrapper: nav_li_wrapper }
20
+ when :buttons, :toolbar
21
+ { html_class: %i(default md) }
22
+ when :links
23
+ { html_class: %i(link sm), selected: 'disabled' }
24
+ else
25
+ { html_class: :item }
26
+ end
27
+ end
28
+
29
+ def wrap(type, links, stacked: false)
30
+ case type
31
+ when :pills
32
+ in_nav renderer, links.flatten, stacked: stacked
33
+ when :tabs
34
+ in_nav renderer, links.flatten, tabs: true, stacked: stacked
35
+ when :buttons
36
+ in_button_group renderer, links.flatten, stacked: stacked
37
+ when :toolbar
38
+ in_button_toolbar renderer, links, stacked: stacked
39
+ when :links
40
+ in_list_group_links renderer, links.flatten
41
+ else
42
+ in_list_group_buttons renderer, links.flatten
43
+ end
44
+ end
45
+
46
+ def nav_li_wrapper
47
+ { regular: '<li role="presentation">%s</li>',
48
+ selected: '<li role="presentation" class="active">%s</li>' }
49
+ end
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,27 @@
1
+
2
+ module Templet
3
+ module Utils
4
+ # To list info on a model's parents, and optionally in HTML.
5
+ class ListModelParents
6
+ def call(model, parent_names, out=[])
7
+ if model
8
+ if parent_name = parent_names&.shift
9
+ parent = model.send(parent_name)
10
+
11
+ call(parent, parent_names, out)
12
+ end
13
+
14
+ out << [ model.model_name.to_s, model.to_s ]
15
+ end
16
+
17
+ out
18
+ end
19
+
20
+ def in_html(*args)
21
+ call(*args).map do |(name, value)|
22
+ "<b>#{name}</b>: <em class='small'>#{value[0, 25]}</em>"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+
2
+ module Templet
3
+ module Utils
4
+ # Renders a Bootstrap navbar form for string searches.
5
+ class NavbarForm < Templet::Component::Partial
6
+ include Constants
7
+
8
+ include Mixins::Bs
9
+
10
+ def call(url, field_name: 'q', submit_text: 'Search', remote: false)
11
+ super() do
12
+ form action: url, class: "navbar-form navbar-left", role: "search" do
13
+ div class: "form-group" do
14
+ [ input(name: field_name, type: "text", value: params[field_name],
15
+ class: "form-control", placeholder: "Name"),
16
+ button(submit_text, type: "submit", class: "btn btn-default") ]
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,40 @@
1
+
2
+ module Templet
3
+ module Utils
4
+ # Wraps (in a tag) some given content according to a condition.
5
+ class SelectedWrapper
6
+ attr_accessor :wrapper, :selected_class
7
+
8
+ def initialize(wrapper, selected_class)
9
+ self.selected_class = selected_class
10
+
11
+ self.wrapper = get_wrapper wrapper
12
+ end
13
+
14
+ def call(content, is_selected=false)
15
+ if wrapper
16
+ wrapper[is_selected ? :selected : :regular] % content
17
+ else
18
+ content
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def get_wrapper(wrapper)
25
+ if wrapper
26
+ if Hash === wrapper
27
+ wrapper
28
+ else
29
+ { regular: tag(wrapper),
30
+ selected: tag(wrapper, " class='#{selected_class}'") }
31
+ end
32
+ end
33
+ end
34
+
35
+ def tag(name, atts_string='')
36
+ "<#{name}#{atts_string}>%s</#{name}>"
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,11 @@
1
+
2
+ module Templet
3
+ module Viewer
4
+ include Presenters
5
+
6
+ include RestActions
7
+
8
+ include MetaModelDefaults
9
+ end
10
+ end
11
+
@@ -0,0 +1,66 @@
1
+
2
+ module Templet
3
+ module Viewer
4
+ # Model introspection
5
+ class MetaModel < Struct.new(:model_proto)
6
+ def names
7
+ #dictionary {|column| column.name.to_sym }
8
+ field_info.map(&:name).map(&:to_sym)
9
+ end
10
+
11
+ def listing_names
12
+ names.reject do |name|
13
+ %i(id created_at updated_at).include?(name) or name.to_s =~ /_id$/
14
+ end
15
+ end
16
+
17
+ def input_names
18
+ listing_names
19
+ end
20
+
21
+ def type(name)
22
+ (@types ||= types)[name]
23
+ end
24
+
25
+ def types
26
+ dictionary &:type
27
+ end
28
+
29
+ def input(name)
30
+ type = type(name)
31
+
32
+ inputs[type] or type
33
+ end
34
+
35
+ def inputs
36
+ { string: :text, text: :text_area, boolean: :check_box, integer: :text }
37
+ end
38
+
39
+ def field_info
40
+ model_class.content_columns
41
+ end
42
+
43
+ private
44
+
45
+ def dictionary
46
+ field_info.inject Hash.new do |acc, column|
47
+ acc[column.name.to_sym] = yield column
48
+
49
+ acc
50
+ end
51
+ end
52
+
53
+ def model_class
54
+ case model_proto
55
+ when Class
56
+ model_proto
57
+ when String, Symbol
58
+ model_proto.to_s.classify.constantize
59
+ else
60
+ model_proto.class
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+