wallaby 5.0.1 → 5.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (350) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -3
  3. data/app/assets/images/wallaby/404.png +0 -0
  4. data/app/assets/images/wallaby/422.png +0 -0
  5. data/app/assets/images/wallaby/500.png +0 -0
  6. data/app/assets/javascripts/wallaby/application.js +1 -15
  7. data/app/assets/javascripts/wallaby/auto_select.js +77 -0
  8. data/app/assets/javascripts/wallaby/base.js +17 -0
  9. data/app/assets/javascripts/wallaby/setup.js.erb +60 -0
  10. data/app/assets/stylesheets/wallaby/application.scss +1 -51
  11. data/app/assets/stylesheets/wallaby/base/_layout.scss +257 -9
  12. data/app/assets/stylesheets/wallaby/base/_layout_desktop.scss +53 -0
  13. data/app/assets/stylesheets/wallaby/base/_mixins.scss +119 -0
  14. data/app/assets/stylesheets/wallaby/base/_override.scss +10 -0
  15. data/app/assets/stylesheets/wallaby/base/_vars.scss +72 -2
  16. data/app/assets/stylesheets/wallaby/base.scss +27 -0
  17. data/app/assets/stylesheets/wallaby/components/_auto_select.scss +119 -0
  18. data/app/assets/stylesheets/wallaby/components/_auto_select_desktop.scss +7 -0
  19. data/app/assets/stylesheets/wallaby/components/_color_square.scss +8 -0
  20. data/app/assets/stylesheets/wallaby/components/_filters.scss +14 -0
  21. data/app/assets/stylesheets/wallaby/components/_links.scss +25 -0
  22. data/app/assets/stylesheets/wallaby/components/_pagination.scss +35 -91
  23. data/app/assets/stylesheets/wallaby/components/_query.scss +101 -0
  24. data/app/assets/stylesheets/wallaby/components/_text.scss +6 -6
  25. data/app/assets/stylesheets/wallaby/pages/_error.scss +108 -0
  26. data/app/assets/stylesheets/wallaby/pages/_form.scss +40 -0
  27. data/app/assets/stylesheets/wallaby/pages/_index.scss +193 -0
  28. data/app/assets/stylesheets/wallaby/pages/_index_desktop.scss +22 -0
  29. data/app/assets/stylesheets/wallaby/pages/_show.scss +21 -0
  30. data/app/controllers/wallaby/abstract_resources_controller.rb +334 -0
  31. data/app/controllers/wallaby/application_controller.rb +45 -15
  32. data/app/controllers/wallaby/base_controller.rb +30 -0
  33. data/app/controllers/wallaby/resources_controller.rb +2 -131
  34. data/app/controllers/wallaby/secure_controller.rb +38 -24
  35. data/app/routes/wallaby/resources_router.rb +40 -43
  36. data/app/security/ability.rb +4 -28
  37. data/app/views/layouts/wallaby/application.html.erb +11 -6
  38. data/app/views/layouts/wallaby/error.html.erb +26 -4
  39. data/app/views/wallaby/error.html.erb +11 -0
  40. data/app/views/wallaby/error.json.jbuilder +8 -0
  41. data/app/views/wallaby/{shared → resources}/_flash_messages.html.erb +0 -0
  42. data/app/views/wallaby/resources/_footer.html.erb +1 -0
  43. data/app/views/wallaby/resources/_form.html.erb +2 -2
  44. data/app/views/wallaby/resources/_header.html.erb +38 -0
  45. data/app/views/wallaby/resources/_imodal.html.erb +13 -0
  46. data/app/views/wallaby/resources/_index_actions.html.erb +4 -1
  47. data/app/views/wallaby/resources/_index_filters.html.erb +23 -0
  48. data/app/views/wallaby/resources/_index_pagination.html.erb +63 -0
  49. data/app/views/wallaby/resources/_index_query.html.erb +23 -0
  50. data/app/views/wallaby/resources/_logo.html.erb +1 -0
  51. data/app/views/wallaby/resources/_navs.html.erb +9 -0
  52. data/app/views/wallaby/resources/_resource_actions.html.erb +3 -3
  53. data/app/views/wallaby/resources/{shared/_resource_nav.html.erb → _resource_navs.html.erb} +6 -6
  54. data/app/views/wallaby/resources/_title.html.erb +1 -0
  55. data/app/views/wallaby/resources/_user_menu.html.erb +5 -0
  56. data/app/views/wallaby/resources/bad_request.json.jbuilder +7 -0
  57. data/app/views/wallaby/resources/edit.html.erb +16 -12
  58. data/app/views/wallaby/resources/form/_belongs_to.html.erb +63 -12
  59. data/app/views/wallaby/resources/form/_bigint.html.erb +10 -1
  60. data/app/views/wallaby/resources/form/_bigserial.html.erb +18 -0
  61. data/app/views/wallaby/resources/form/_binary.html.erb +11 -2
  62. data/app/views/wallaby/resources/form/_bit.html.erb +10 -1
  63. data/app/views/wallaby/resources/form/_bit_varying.html.erb +10 -1
  64. data/app/views/wallaby/resources/form/_blob.html.erb +21 -0
  65. data/app/views/wallaby/resources/form/_boolean.html.erb +9 -0
  66. data/app/views/wallaby/resources/form/_box.html.erb +21 -0
  67. data/app/views/wallaby/resources/form/_cidr.html.erb +13 -1
  68. data/app/views/wallaby/resources/form/_circle.html.erb +21 -0
  69. data/app/views/wallaby/resources/form/_citext.html.erb +11 -2
  70. data/app/views/wallaby/resources/form/_color.html.erb +11 -2
  71. data/app/views/wallaby/resources/form/_date.html.erb +12 -3
  72. data/app/views/wallaby/resources/form/_daterange.html.erb +14 -5
  73. data/app/views/wallaby/resources/form/_datetime.html.erb +12 -3
  74. data/app/views/wallaby/resources/form/_decimal.html.erb +10 -1
  75. data/app/views/wallaby/resources/form/_dropdown.html.erb +18 -0
  76. data/app/views/wallaby/resources/form/_email.html.erb +9 -0
  77. data/app/views/wallaby/resources/form/_file.html.erb +21 -0
  78. data/app/views/wallaby/resources/form/_float.html.erb +10 -1
  79. data/app/views/wallaby/resources/form/_has_and_belongs_to_many.html.erb +53 -7
  80. data/app/views/wallaby/resources/form/_has_many.html.erb +52 -7
  81. data/app/views/wallaby/resources/form/_has_one.html.erb +10 -2
  82. data/app/views/wallaby/resources/form/_hstore.html.erb +12 -5
  83. data/app/views/wallaby/resources/form/_inet.html.erb +13 -1
  84. data/app/views/wallaby/resources/form/_int4range.html.erb +11 -2
  85. data/app/views/wallaby/resources/form/_int8range.html.erb +11 -2
  86. data/app/views/wallaby/resources/form/_integer.html.erb +10 -1
  87. data/app/views/wallaby/resources/form/_json.html.erb +13 -6
  88. data/app/views/wallaby/resources/form/_jsonb.html.erb +13 -6
  89. data/app/views/wallaby/resources/form/_line.html.erb +21 -0
  90. data/app/views/wallaby/resources/form/_longblob.html.erb +21 -0
  91. data/app/views/wallaby/resources/form/_longtext.html.erb +30 -0
  92. data/app/views/wallaby/resources/form/_lseg.html.erb +21 -0
  93. data/app/views/wallaby/resources/form/_ltree.html.erb +17 -1
  94. data/app/views/wallaby/resources/form/_macaddr.html.erb +13 -1
  95. data/app/views/wallaby/resources/form/_markdown.html.erb +29 -0
  96. data/app/views/wallaby/resources/form/_mediumblob.html.erb +21 -0
  97. data/app/views/wallaby/resources/form/_mediumtext.html.erb +30 -0
  98. data/app/views/wallaby/resources/form/_money.html.erb +10 -1
  99. data/app/views/wallaby/resources/form/_numrange.html.erb +11 -2
  100. data/app/views/wallaby/resources/form/_password.html.erb +14 -1
  101. data/app/views/wallaby/resources/form/_path.html.erb +17 -0
  102. data/app/views/wallaby/resources/form/_point.html.erb +11 -2
  103. data/app/views/wallaby/resources/form/_polygon.html.erb +17 -0
  104. data/app/views/wallaby/resources/form/_serial.html.erb +18 -0
  105. data/app/views/wallaby/resources/form/_sti.html.erb +18 -0
  106. data/app/views/wallaby/resources/form/_string.html.erb +14 -1
  107. data/app/views/wallaby/resources/form/_text.html.erb +11 -2
  108. data/app/views/wallaby/resources/form/_time.html.erb +12 -3
  109. data/app/views/wallaby/resources/form/_tinyblob.html.erb +21 -0
  110. data/app/views/wallaby/resources/form/_tinytext.html.erb +30 -0
  111. data/app/views/wallaby/resources/form/_tsrange.html.erb +14 -5
  112. data/app/views/wallaby/resources/form/_tstzrange.html.erb +14 -5
  113. data/app/views/wallaby/resources/form/_tsvector.html.erb +9 -0
  114. data/app/views/wallaby/resources/form/_unsigned_bigint.html.erb +18 -0
  115. data/app/views/wallaby/resources/form/_unsigned_decimal.html.erb +18 -0
  116. data/app/views/wallaby/resources/form/_unsigned_float.html.erb +18 -0
  117. data/app/views/wallaby/resources/form/_unsigned_integer.html.erb +18 -0
  118. data/app/views/wallaby/resources/form/_uuid.html.erb +10 -1
  119. data/app/views/wallaby/resources/form/_xml.html.erb +11 -5
  120. data/app/views/wallaby/resources/form.json.jbuilder +5 -0
  121. data/app/views/wallaby/{core → resources}/home.html.erb +1 -1
  122. data/app/views/wallaby/resources/index/_belongs_to.html.erb +5 -1
  123. data/app/views/wallaby/resources/index/_bigint.html.erb +4 -0
  124. data/app/views/wallaby/resources/index/_bigserial.html.erb +5 -0
  125. data/app/views/wallaby/resources/index/_binary.html.erb +5 -1
  126. data/app/views/wallaby/resources/index/_bit.html.erb +4 -0
  127. data/app/views/wallaby/resources/index/_bit_varying.html.erb +4 -0
  128. data/app/views/wallaby/resources/index/_blob.html.erb +5 -0
  129. data/app/views/wallaby/resources/index/_boolean.html.erb +5 -1
  130. data/app/views/wallaby/resources/index/_box.html.erb +16 -0
  131. data/app/views/wallaby/resources/index/_cidr.html.erb +5 -1
  132. data/app/views/wallaby/resources/index/_circle.html.erb +16 -0
  133. data/app/views/wallaby/resources/index/_citext.html.erb +5 -1
  134. data/app/views/wallaby/resources/index/_color.html.erb +6 -1
  135. data/app/views/wallaby/resources/index/_date.html.erb +4 -0
  136. data/app/views/wallaby/resources/index/_daterange.html.erb +5 -1
  137. data/app/views/wallaby/resources/index/_datetime.html.erb +5 -1
  138. data/app/views/wallaby/resources/index/_decimal.html.erb +4 -0
  139. data/app/views/wallaby/resources/index/_email.html.erb +4 -0
  140. data/app/views/wallaby/resources/index/_float.html.erb +4 -0
  141. data/app/views/wallaby/resources/index/_has_and_belongs_to_many.html.erb +6 -2
  142. data/app/views/wallaby/resources/index/_has_many.html.erb +6 -2
  143. data/app/views/wallaby/resources/index/_has_one.html.erb +5 -1
  144. data/app/views/wallaby/resources/index/_hstore.html.erb +6 -2
  145. data/app/views/wallaby/resources/index/_inet.html.erb +5 -1
  146. data/app/views/wallaby/resources/index/_int4range.html.erb +4 -0
  147. data/app/views/wallaby/resources/index/_int8range.html.erb +4 -0
  148. data/app/views/wallaby/resources/index/_integer.html.erb +4 -0
  149. data/app/views/wallaby/resources/index/_json.html.erb +5 -2
  150. data/app/views/wallaby/resources/index/_jsonb.html.erb +5 -2
  151. data/app/views/wallaby/resources/index/_line.html.erb +16 -0
  152. data/app/views/wallaby/resources/index/_longblob.html.erb +5 -0
  153. data/app/views/wallaby/resources/index/_longtext.html.erb +16 -0
  154. data/app/views/wallaby/resources/index/_lseg.html.erb +16 -0
  155. data/app/views/wallaby/resources/index/_ltree.html.erb +5 -1
  156. data/app/views/wallaby/resources/index/_macaddr.html.erb +4 -0
  157. data/app/views/wallaby/resources/index/_mediumblob.html.erb +5 -0
  158. data/app/views/wallaby/resources/index/_mediumtext.html.erb +16 -0
  159. data/app/views/wallaby/resources/index/_money.html.erb +4 -0
  160. data/app/views/wallaby/resources/index/_numrange.html.erb +4 -0
  161. data/app/views/wallaby/resources/index/_password.html.erb +9 -0
  162. data/app/views/wallaby/resources/index/_path.html.erb +16 -0
  163. data/app/views/wallaby/resources/index/_point.html.erb +4 -0
  164. data/app/views/wallaby/resources/index/_polygon.html.erb +16 -0
  165. data/app/views/wallaby/resources/index/_raw.html.erb +9 -0
  166. data/app/views/wallaby/resources/index/_serial.html.erb +5 -0
  167. data/app/views/wallaby/resources/index/_sti.html.erb +16 -0
  168. data/app/views/wallaby/resources/index/_string.html.erb +5 -1
  169. data/app/views/wallaby/resources/index/_text.html.erb +5 -1
  170. data/app/views/wallaby/resources/index/_time.html.erb +4 -0
  171. data/app/views/wallaby/resources/index/_tinyblob.html.erb +5 -0
  172. data/app/views/wallaby/resources/index/_tinytext.html.erb +16 -0
  173. data/app/views/wallaby/resources/index/_tsrange.html.erb +5 -1
  174. data/app/views/wallaby/resources/index/_tstzrange.html.erb +5 -1
  175. data/app/views/wallaby/resources/index/_tsvector.html.erb +5 -1
  176. data/app/views/wallaby/resources/index/_unsigned_bigint.html.erb +5 -0
  177. data/app/views/wallaby/resources/index/_unsigned_decimal.html.erb +5 -0
  178. data/app/views/wallaby/resources/index/_unsigned_float.html.erb +5 -0
  179. data/app/views/wallaby/resources/index/_unsigned_integer.html.erb +5 -0
  180. data/app/views/wallaby/resources/index/_uuid.html.erb +5 -1
  181. data/app/views/wallaby/resources/index/_xml.html.erb +5 -1
  182. data/app/views/wallaby/resources/index.csv.erb +26 -0
  183. data/app/views/wallaby/resources/index.html.erb +47 -59
  184. data/app/views/wallaby/resources/index.json.jbuilder +5 -0
  185. data/app/views/wallaby/resources/new.html.erb +12 -11
  186. data/app/views/wallaby/resources/show/_belongs_to.html.erb +5 -1
  187. data/app/views/wallaby/resources/show/_bigint.html.erb +4 -0
  188. data/app/views/wallaby/resources/show/_bigserial.html.erb +5 -0
  189. data/app/views/wallaby/resources/show/_binary.html.erb +5 -1
  190. data/app/views/wallaby/resources/show/_bit.html.erb +4 -0
  191. data/app/views/wallaby/resources/show/_bit_varying.html.erb +4 -0
  192. data/app/views/wallaby/resources/show/_blob.html.erb +5 -0
  193. data/app/views/wallaby/resources/show/_boolean.html.erb +5 -1
  194. data/app/views/wallaby/resources/show/_box.html.erb +9 -0
  195. data/app/views/wallaby/resources/show/_cidr.html.erb +5 -1
  196. data/app/views/wallaby/resources/show/_circle.html.erb +9 -0
  197. data/app/views/wallaby/resources/show/_citext.html.erb +4 -0
  198. data/app/views/wallaby/resources/show/_color.html.erb +6 -1
  199. data/app/views/wallaby/resources/show/_date.html.erb +4 -0
  200. data/app/views/wallaby/resources/show/_daterange.html.erb +4 -0
  201. data/app/views/wallaby/resources/show/_datetime.html.erb +4 -0
  202. data/app/views/wallaby/resources/show/_decimal.html.erb +4 -0
  203. data/app/views/wallaby/resources/show/_email.html.erb +4 -0
  204. data/app/views/wallaby/resources/show/_float.html.erb +4 -0
  205. data/app/views/wallaby/resources/show/_has_and_belongs_to_many.html.erb +6 -2
  206. data/app/views/wallaby/resources/show/_has_many.html.erb +6 -2
  207. data/app/views/wallaby/resources/show/_has_one.html.erb +5 -1
  208. data/app/views/wallaby/resources/show/_hstore.html.erb +4 -0
  209. data/app/views/wallaby/resources/show/_image.html.erb +9 -0
  210. data/app/views/wallaby/resources/show/_inet.html.erb +5 -1
  211. data/app/views/wallaby/resources/show/_int4range.html.erb +4 -0
  212. data/app/views/wallaby/resources/show/_int8range.html.erb +4 -0
  213. data/app/views/wallaby/resources/show/_integer.html.erb +4 -0
  214. data/app/views/wallaby/resources/show/_json.html.erb +4 -0
  215. data/app/views/wallaby/resources/show/_jsonb.html.erb +4 -0
  216. data/app/views/wallaby/resources/show/_line.html.erb +9 -0
  217. data/app/views/wallaby/resources/show/_longblob.html.erb +5 -0
  218. data/app/views/wallaby/resources/show/_longtext.html.erb +5 -0
  219. data/app/views/wallaby/resources/show/_lseg.html.erb +9 -0
  220. data/app/views/wallaby/resources/show/_ltree.html.erb +4 -0
  221. data/app/views/wallaby/resources/show/_macaddr.html.erb +4 -0
  222. data/app/views/wallaby/resources/show/_mediumblob.html.erb +5 -0
  223. data/app/views/wallaby/resources/show/_mediumtext.html.erb +5 -0
  224. data/app/views/wallaby/resources/show/_money.html.erb +4 -0
  225. data/app/views/wallaby/resources/show/_numrange.html.erb +4 -0
  226. data/app/views/wallaby/resources/show/_password.html.erb +9 -0
  227. data/app/views/wallaby/resources/show/_path.html.erb +9 -0
  228. data/app/views/wallaby/resources/show/_point.html.erb +4 -0
  229. data/app/views/wallaby/resources/show/_polygon.html.erb +9 -0
  230. data/app/views/wallaby/resources/show/_raw.html.erb +9 -0
  231. data/app/views/wallaby/resources/show/_serial.html.erb +5 -0
  232. data/app/views/wallaby/resources/show/_sti.html.erb +5 -0
  233. data/app/views/wallaby/resources/show/_string.html.erb +4 -0
  234. data/app/views/wallaby/resources/show/_text.html.erb +4 -0
  235. data/app/views/wallaby/resources/show/_time.html.erb +4 -0
  236. data/app/views/wallaby/resources/show/_tinyblob.html.erb +5 -0
  237. data/app/views/wallaby/resources/show/_tinytext.html.erb +5 -0
  238. data/app/views/wallaby/resources/show/_tsrange.html.erb +4 -0
  239. data/app/views/wallaby/resources/show/_tstzrange.html.erb +4 -0
  240. data/app/views/wallaby/resources/show/_tsvector.html.erb +4 -0
  241. data/app/views/wallaby/resources/show/_unsigned_bigint.html.erb +5 -0
  242. data/app/views/wallaby/resources/show/_unsigned_decimal.html.erb +5 -0
  243. data/app/views/wallaby/resources/show/_unsigned_float.html.erb +5 -0
  244. data/app/views/wallaby/resources/show/_unsigned_integer.html.erb +5 -0
  245. data/app/views/wallaby/resources/show/_uuid.html.erb +4 -0
  246. data/app/views/wallaby/resources/show/_xml.html.erb +4 -0
  247. data/app/views/wallaby/resources/show.html.erb +14 -24
  248. data/app/views/wallaby/resources/show.json.jbuilder +5 -0
  249. data/config/brakeman.ignore +26 -0
  250. data/config/locales/wallaby.en.yml +91 -0
  251. data/config/massa.yml +45 -0
  252. data/config/rails_best_practices.yml +42 -0
  253. data/config/routes.rb +29 -23
  254. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/association_builder.rb +39 -0
  255. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/polymorphic_builder.rb +44 -0
  256. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb +42 -0
  257. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder.rb +41 -94
  258. data/lib/adaptors/wallaby/active_record/model_decorator/title_field_finder.rb +24 -14
  259. data/lib/adaptors/wallaby/active_record/model_decorator.rb +118 -64
  260. data/lib/adaptors/wallaby/active_record/model_finder.rb +44 -15
  261. data/lib/adaptors/wallaby/active_record/model_pagination_provider.rb +30 -0
  262. data/lib/adaptors/wallaby/active_record/model_service_provider/normalizer.rb +42 -0
  263. data/lib/adaptors/wallaby/active_record/model_service_provider/permitter.rb +64 -0
  264. data/lib/adaptors/wallaby/active_record/model_service_provider/querier/transformer.rb +70 -0
  265. data/lib/adaptors/wallaby/active_record/model_service_provider/querier.rb +102 -0
  266. data/lib/adaptors/wallaby/active_record/model_service_provider/validator.rb +29 -0
  267. data/lib/adaptors/wallaby/active_record/model_service_provider.rb +137 -0
  268. data/lib/adaptors/wallaby/active_record.rb +4 -1
  269. data/lib/decorators/wallaby/abstract_resource_decorator.rb +74 -0
  270. data/lib/decorators/wallaby/resource_decorator.rb +5 -76
  271. data/lib/errors/wallaby/model_not_found.rb +5 -1
  272. data/lib/errors/wallaby/not_found.rb +4 -0
  273. data/lib/errors/wallaby/resource_not_found.rb +5 -1
  274. data/lib/forms/wallaby/form_builder.rb +42 -19
  275. data/lib/helpers/wallaby/application_helper.rb +34 -24
  276. data/lib/helpers/wallaby/base_helper.rb +52 -0
  277. data/lib/helpers/wallaby/form_helper.rb +40 -16
  278. data/lib/helpers/wallaby/index_helper.rb +59 -0
  279. data/lib/helpers/wallaby/links_helper.rb +150 -81
  280. data/lib/helpers/wallaby/resources_helper.rb +41 -46
  281. data/lib/helpers/wallaby/secure_helper.rb +36 -19
  282. data/lib/helpers/wallaby/styling_helper.rb +53 -44
  283. data/lib/interfaces/wallaby/mode.rb +19 -12
  284. data/lib/interfaces/wallaby/model_decorator.rb +176 -50
  285. data/lib/interfaces/wallaby/model_finder.rb +7 -3
  286. data/lib/interfaces/wallaby/model_pagination_provider.rb +104 -0
  287. data/lib/interfaces/wallaby/model_service_provider.rb +71 -0
  288. data/lib/paginators/wallaby/abstract_resource_paginator.rb +23 -0
  289. data/lib/paginators/wallaby/resource_paginator.rb +6 -0
  290. data/lib/parsers/wallaby/parser.rb +32 -0
  291. data/lib/responders/wallaby/abstract_responder.rb +68 -0
  292. data/lib/responders/wallaby/resources_responder.rb +6 -0
  293. data/lib/servicers/wallaby/abstract_model_servicer.rb +48 -0
  294. data/lib/servicers/wallaby/model_servicer.rb +5 -0
  295. data/lib/services/wallaby/link_options_normalizer.rb +16 -0
  296. data/lib/services/wallaby/lookup_context_wrapper.rb +23 -30
  297. data/lib/services/wallaby/map/mode_mapper.rb +19 -0
  298. data/lib/services/wallaby/map/model_class_collector.rb +41 -0
  299. data/lib/services/wallaby/map/model_class_mapper.rb +24 -0
  300. data/lib/services/wallaby/map.rb +76 -39
  301. data/lib/services/wallaby/partial_renderer.rb +60 -0
  302. data/lib/services/wallaby/prefixes_builder.rb +54 -0
  303. data/lib/services/wallaby/sorting/hash_builder.rb +16 -0
  304. data/lib/services/wallaby/sorting/link_builder.rb +45 -0
  305. data/lib/services/wallaby/sorting/next_builder.rb +54 -0
  306. data/lib/services/wallaby/url_for.rb +36 -0
  307. data/lib/tree/wallaby/node.rb +17 -0
  308. data/lib/utils/wallaby/utils.rb +67 -22
  309. data/lib/wallaby/configuration/features.rb +12 -0
  310. data/lib/wallaby/configuration/metadata.rb +12 -0
  311. data/lib/wallaby/configuration/models.rb +27 -12
  312. data/lib/wallaby/configuration/pagination.rb +12 -0
  313. data/lib/wallaby/configuration/security.rb +55 -24
  314. data/lib/wallaby/configuration.rb +38 -19
  315. data/lib/wallaby/engine.rb +84 -39
  316. data/lib/wallaby/version.rb +1 -1
  317. data/lib/wallaby.rb +22 -3
  318. metadata +200 -55
  319. data/app/assets/javascripts/wallaby/form.js +0 -8
  320. data/app/assets/stylesheets/wallaby/base/_functions.scss +0 -0
  321. data/app/assets/stylesheets/wallaby/base/_normalize.scss +0 -0
  322. data/app/assets/stylesheets/wallaby/base/_reset.scss +0 -0
  323. data/app/assets/stylesheets/wallaby/components/_forms.scss +0 -53
  324. data/app/assets/stylesheets/wallaby/components/_nav.scss +0 -19
  325. data/app/assets/stylesheets/wallaby/components/_tables.scss +0 -78
  326. data/app/assets/stylesheets/wallaby/form.scss +0 -11
  327. data/app/controllers/wallaby/core_controller.rb +0 -28
  328. data/app/views/layouts/wallaby/_footer.html.erb +0 -2
  329. data/app/views/layouts/wallaby/_header.html.erb +0 -57
  330. data/app/views/layouts/wallaby/_navs.html.erb +0 -1
  331. data/app/views/wallaby/errors/access_denied.html.erb +0 -1
  332. data/app/views/wallaby/errors/not_authenticated.html.erb +0 -1
  333. data/app/views/wallaby/errors/not_found.html.erb +0 -6
  334. data/app/views/wallaby/errors/unprocessable_entity.erb +0 -1
  335. data/config/locales/en.yml +0 -29
  336. data/lib/adaptors/wallaby/active_record/model_operator/normalizer.rb +0 -44
  337. data/lib/adaptors/wallaby/active_record/model_operator/permitter.rb +0 -50
  338. data/lib/adaptors/wallaby/active_record/model_operator/querier.rb +0 -47
  339. data/lib/adaptors/wallaby/active_record/model_operator/validator.rb +0 -16
  340. data/lib/adaptors/wallaby/active_record/model_operator.rb +0 -82
  341. data/lib/errors/wallaby/deprecated.rb +0 -4
  342. data/lib/errors/wallaby/operation_not_found.rb +0 -4
  343. data/lib/handlers/wallaby/cached_compiled_erb.rb +0 -14
  344. data/lib/helpers/wallaby/core_helper.rb +0 -50
  345. data/lib/helpers/wallaby/paginatable_helper.rb +0 -9
  346. data/lib/helpers/wallaby/sorting_helper.rb +0 -43
  347. data/lib/interfaces/wallaby/model_operator.rb +0 -31
  348. data/lib/services/wallaby/decorator_finder.rb +0 -16
  349. data/lib/services/wallaby/model_servicer.rb +0 -38
  350. data/lib/services/wallaby/servicer_finder.rb +0 -5
@@ -0,0 +1,193 @@
1
+ .index {
2
+ .resources__header {
3
+ > nav {
4
+ @include divider;
5
+ margin-left: 6px;
6
+ }
7
+ }
8
+
9
+ .resources {
10
+ section {
11
+ margin-bottom: 4px;
12
+ }
13
+
14
+ &__not-found {
15
+ font-size: 24px;
16
+ padding-left: 105px;
17
+ padding-top: 140px;
18
+ position: relative;
19
+ text-align: left;
20
+
21
+ img {
22
+ height: 80px;
23
+ margin-left: -90px;
24
+ margin-top: 12px;
25
+ position: absolute;
26
+ }
27
+ }
28
+
29
+ &__data, &__actions {
30
+ @extend .table;
31
+ border-collapse: separate;
32
+ margin-bottom: 0;
33
+
34
+ tbody td.resource__actions {
35
+ min-width: 85px;
36
+ text-align: right;
37
+
38
+ a {
39
+ @extend .fa, .fa-info;
40
+
41
+ background-color: $light-primary-color;
42
+ border-radius: 2px;
43
+ border: none;
44
+ color: $white;
45
+ display: inline-block;
46
+ height: 16px;
47
+ line-height: 16px;
48
+ margin-right: 3px;
49
+ text-align: center;
50
+ text-decoration: none;
51
+ width: 16px;
52
+
53
+ &:hover {
54
+ background-color: $default-primary-color;
55
+ color: $white;
56
+ }
57
+
58
+ &.resource__update {
59
+ @extend .fa-pencil;
60
+ background-color: $light-yellow-color;
61
+
62
+ &:hover {
63
+ background-color: $default-yellow-color;
64
+ }
65
+ }
66
+
67
+ &.resource__destroy {
68
+ @extend .fa-remove;
69
+ background-color: $light-red-color;
70
+
71
+ &:hover {
72
+ background-color: $default-red-color;
73
+ }
74
+ }
75
+
76
+ &:last-child {
77
+ margin-right: 0px;
78
+ }
79
+ }
80
+ }
81
+
82
+ thead tr th, tbody tr td {
83
+ background-color: white;
84
+ border: none;
85
+ border-bottom: 6px solid $background-color;
86
+ font-weight: normal;
87
+ height: 40px;
88
+ padding: 8px 12px;
89
+ white-space: nowrap;
90
+ }
91
+
92
+ thead tr th {
93
+ color: $light-grey-color;
94
+ font-weight: bold;
95
+ line-height: 20px;
96
+ position: relative;
97
+ text-transform: uppercase;
98
+
99
+ a {
100
+ border-bottom: none;
101
+ display: block;
102
+ padding-right: 11px;
103
+ position: relative;
104
+ transition: 0.5s;
105
+
106
+ &:before {
107
+ @extend .fa;
108
+ color: $light-primary-color;
109
+ margin-top: -6px;
110
+ position: absolute;
111
+ right: 0;
112
+ top: 50%;
113
+ transition: 0.5s;
114
+ }
115
+
116
+ &:hover {
117
+ color: $default-primary-color;
118
+ &:before {
119
+ color: $default-primary-color;
120
+ content: $fa-var-sort-asc;
121
+ }
122
+ }
123
+ }
124
+
125
+ &.asc {
126
+ a {
127
+ &:before {
128
+ content: $fa-var-sort-asc;
129
+ }
130
+ &:hover {
131
+ &:before {
132
+ content: $fa-var-sort-desc;
133
+ }
134
+ }
135
+ }
136
+ }
137
+
138
+ &.desc {
139
+ a {
140
+ &:before {
141
+ content: $fa-var-sort-desc;
142
+ }
143
+ &:hover {
144
+ &:before {
145
+ content: $fa-var-sort;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+
152
+ tbody tr {
153
+ td {
154
+ a {
155
+ display: inline-block;
156
+ }
157
+ }
158
+ }
159
+ }
160
+
161
+ &__actions {
162
+ position: absolute;
163
+ right: 0;
164
+ top: 0;
165
+ width: inherit;
166
+
167
+ thead tr th {
168
+ @extend .fa;
169
+ display: table-cell;
170
+ font-size: 14px;
171
+
172
+ &:before, &:after {
173
+ display: inline-block;
174
+ margin-top: -10px;
175
+ position: absolute;
176
+ top: 50%;
177
+ }
178
+
179
+ &.resources--forward:after {
180
+ content: $fa-var-angle-double-right;
181
+ right: 16px;
182
+ }
183
+
184
+ &.resources--backward:before {
185
+ content: $fa-var-angle-double-left;
186
+ left: 16px;
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+
193
+ @import '_index_desktop';
@@ -0,0 +1,22 @@
1
+ @media (min-width: $screen-sm-min) {
2
+ body.index {
3
+ padding-top: 131px;
4
+
5
+ .resources__header {
6
+ padding-top: 15px;
7
+ }
8
+
9
+ .resources {
10
+ section {
11
+ margin-bottom: 24px;
12
+ }
13
+
14
+ &__not-found img {
15
+ margin-left: -95px;
16
+ margin-top: -21px;
17
+ }
18
+ }
19
+ }
20
+ }
21
+
22
+
@@ -0,0 +1,21 @@
1
+ .show {
2
+ section {
3
+ dl {
4
+ margin: 0;
5
+ padding: 15px 20px;
6
+ }
7
+
8
+ dt {
9
+ border-bottom: 1px solid $background-color;
10
+ color: $default-primary-color;
11
+ font-style: italic;
12
+ font-weight: bold;
13
+ padding-bottom: 8px;
14
+ text-transform: uppercase;
15
+ }
16
+
17
+ dd {
18
+ padding-top: 8px;
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,334 @@
1
+ module Wallaby
2
+ # Generic CRUD controller
3
+ class AbstractResourcesController < ::Wallaby::BaseController
4
+ self.responder = ResourcesResponder
5
+ respond_to :html
6
+ respond_to :json
7
+ respond_to :csv, only: :index
8
+ helper ResourcesHelper
9
+ helper_method :resource_id, :resource, :collection,
10
+ :current_model_decorator, :authorizer
11
+
12
+ # Fetch resources name from its class name
13
+ def self.resources_name
14
+ return unless self < ::Wallaby::ResourcesController
15
+ Map.resources_name_map name.gsub('Controller', EMPTY_STRING)
16
+ end
17
+
18
+ # Find model class from its resources name
19
+ def self.model_class
20
+ return unless self < ::Wallaby::ResourcesController
21
+ Map.model_class_map resources_name
22
+ end
23
+
24
+ # home page
25
+ def home
26
+ # do nothing
27
+ end
28
+
29
+ # Index page to list data
30
+ def index
31
+ authorize! :index, current_model_class
32
+ yield if block_given? # after_index
33
+ respond_with collection
34
+ end
35
+
36
+ # Form page for creation
37
+ # You could override this method in subclasses in the following ways:
38
+ # - To perform action before `new` is run
39
+ #
40
+ # ```
41
+ # def new
42
+ # # do something beforehand
43
+ # super
44
+ # end
45
+ # ```
46
+ #
47
+ # - To perform action after `new`, but before rendering.
48
+ # The reason is that we use responder at the end of the action
49
+ #
50
+ # ```
51
+ # def new
52
+ # super do
53
+ # # do something after new
54
+ # end
55
+ # end
56
+ # ```
57
+ #
58
+ # - To perform completely different action
59
+ #
60
+ # ```
61
+ # def new
62
+ # # do something completely different
63
+ # end
64
+ # ```
65
+ def new
66
+ authorize! :new, resource
67
+ yield if block_given? # after_new
68
+ respond_with resource
69
+ end
70
+
71
+ # Data creation
72
+ # You could override this method in subclasses in the following ways:
73
+ # - To perform action before `new` is run
74
+ #
75
+ # ```
76
+ # def create
77
+ # # do something beforehand
78
+ # super
79
+ # end
80
+ # ```
81
+ #
82
+ # - To perform action after `create`, but before rendering.
83
+ # The reason is that we use responder at the end of the action
84
+ #
85
+ # ```
86
+ # def create
87
+ # super do
88
+ # # do something after create
89
+ # end
90
+ # end
91
+ # ```
92
+ #
93
+ # - To perform completely different action
94
+ #
95
+ # ```
96
+ # def create
97
+ # # do something completely different
98
+ # end
99
+ # ```
100
+ def create
101
+ authorize! :create, resource
102
+ current_model_service.create resource, params
103
+ yield if block_given? # after_create
104
+ respond_with resource, location: helpers.show_path(resource)
105
+ end
106
+
107
+ # Show page for a single record
108
+ # You could override this method in subclasses in the following ways:
109
+ # - To perform action before `show` is run
110
+ #
111
+ # ```
112
+ # def show
113
+ # # do something beforehand
114
+ # super
115
+ # end
116
+ # ```
117
+ #
118
+ # - To perform action after `show`, but before rendering.
119
+ # The reason is that we use responder at the end of the action
120
+ #
121
+ # ```
122
+ # def show
123
+ # super do
124
+ # # do something after show
125
+ # end
126
+ # end
127
+ # ```
128
+ #
129
+ # - To perform completely different action
130
+ #
131
+ # ```
132
+ # def show
133
+ # # do something completely different
134
+ # end
135
+ # ```
136
+ def show
137
+ authorize! :show, resource
138
+ yield if block_given? # after_show
139
+ respond_with resource
140
+ end
141
+
142
+ # Edit page for a single record
143
+ # You could override this method in subclasses in the following ways:
144
+ # - To perform action before `edit` is run
145
+ #
146
+ # ```
147
+ # def edit
148
+ # # do something beforehand
149
+ # super
150
+ # end
151
+ # ```
152
+ #
153
+ # - To perform action after `edit`, but before rendering.
154
+ # The reason is that we use responder at the end of the action
155
+ #
156
+ # ```
157
+ # def edit
158
+ # super do
159
+ # # do something after edit
160
+ # end
161
+ # end
162
+ # ```
163
+ #
164
+ # - To perform completely different action
165
+ #
166
+ # ```
167
+ # def edit
168
+ # # do something completely different
169
+ # end
170
+ # ```
171
+ def edit
172
+ authorize! :edit, resource
173
+ yield if block_given? # after_edit
174
+ respond_with resource
175
+ end
176
+
177
+ # Date update
178
+ # You could override this method in subclasses in the following ways:
179
+ # - To perform action before `update` is run
180
+ #
181
+ # ```
182
+ # def update
183
+ # # do something beforehand
184
+ # super
185
+ # end
186
+ # ```
187
+ #
188
+ # - To perform action after `update`, but before rendering.
189
+ # The reason is that we use responder at the end of the action
190
+ #
191
+ # ```
192
+ # def update
193
+ # super do
194
+ # # do something after update
195
+ # end
196
+ # end
197
+ # ```
198
+ #
199
+ # - To perform completely different action
200
+ #
201
+ # ```
202
+ # def update
203
+ # # do something completely different
204
+ # end
205
+ # ```
206
+ def update
207
+ authorize! :update, resource
208
+ current_model_service.update resource, params
209
+ yield if block_given? # after_update
210
+ respond_with resource, location: helpers.show_path(resource)
211
+ end
212
+
213
+ # Data deletion
214
+ # You could override this method in subclasses in the following ways:
215
+ # - To perform action before `destroy` is run
216
+ #
217
+ # ```
218
+ # def destroy
219
+ # # do something beforehand
220
+ # super
221
+ # end
222
+ # ```
223
+ #
224
+ # - To perform action after `destroy`, but before rendering.
225
+ # The reason is that we use responder at the end of the action
226
+ #
227
+ # ```
228
+ # def destroy
229
+ # super do
230
+ # # do something after destroy
231
+ # end
232
+ # end
233
+ # ```
234
+ #
235
+ # - To perform completely different action
236
+ #
237
+ # ```
238
+ # def destroy
239
+ # # do something completely different
240
+ # end
241
+ # ```
242
+ def destroy
243
+ authorize! :destroy, resource
244
+ current_model_service.destroy resource, params
245
+ yield if block_given? # after_destroy
246
+ respond_with resource, location: helpers.index_path(current_model_class)
247
+ end
248
+
249
+ protected
250
+
251
+ # Override origin ActionView::ViewPaths::ClassMethods#_prefixes
252
+ # to add more paths so that it could look up partials in the following
253
+ # order:
254
+ # - mounted_path/resources_name/action_name (e.g. `admin/products/index)
255
+ # - mounted_path/resources_name (e.g. `admin/products)
256
+ # - full_path_of_custom_resources_controller/action_name
257
+ # (e.g. `management/custom_products/index)
258
+ # - full_path_of_custom_resources_controller
259
+ # (e.g. `management/custom_products)
260
+ # - wallaby_resources_controller_name/action_name
261
+ # (e.g. `wallaby/resources/index)
262
+ # - wallaby_resources_controller_name
263
+ # (e.g. `wallaby/resources)
264
+ def _prefixes
265
+ @_prefixes ||= PrefixesBuilder.new(
266
+ super, controller_path, current_resources_name, params
267
+ ).build
268
+ end
269
+
270
+ # A wrapped lookup content
271
+ # Its aim is to render string partial when given partial is not found
272
+ def lookup_context
273
+ @_lookup_context ||= LookupContextWrapper.new super
274
+ end
275
+
276
+ # Current model service to take care of all the CRUD actions
277
+ # For how to override model service, see (Wallaby::ModelServicer)
278
+ def current_model_service
279
+ @current_model_service ||= begin
280
+ model_class = current_model_class
281
+ Map.servicer_map(model_class).new model_class, authorizer
282
+ end
283
+ end
284
+
285
+ # To paginate the collection but only when either `page` or `per` param is
286
+ # given, or requesting HTML response
287
+ # @see Wallaby::ModelServicer#paginate
288
+ def paginate(query)
289
+ if params[:page] || params[:per] || request.format.symbol == :html
290
+ current_model_service.paginate(query, params)
291
+ else
292
+ query
293
+ end
294
+ end
295
+
296
+ # To whitelist the params for CRUD actions
297
+ # @see Wallaby::ModelServicer#permit
298
+ def resource_params
299
+ @resource_params ||= current_model_service.permit params
300
+ end
301
+
302
+ # Shorthand of params[:id]
303
+ def resource_id
304
+ params[:id]
305
+ end
306
+
307
+ # @return [#each] a collection of all the records
308
+ def collection
309
+ @collection ||= paginate current_model_service.collection params
310
+ end
311
+
312
+ # @return either persisted or unpersisted resource instance
313
+ def resource
314
+ @resource ||=
315
+ if resource_id.present?
316
+ current_model_service.find resource_id, resource_params
317
+ else
318
+ current_model_service.new resource_params
319
+ end
320
+ end
321
+
322
+ # Get current model decorator so that we could retrive metadata for given
323
+ # model class.
324
+ def current_model_decorator
325
+ @current_model_decorator ||= helpers.model_decorator current_model_class
326
+ end
327
+
328
+ # A wrapper method for authorizer
329
+ # @todo to add support to pundit in the future
330
+ def authorizer
331
+ current_ability
332
+ end
333
+ end
334
+ end
@@ -1,21 +1,51 @@
1
- class Wallaby::ApplicationController < ::Wallaby.configuration.base_controller
2
- helper Wallaby::ApplicationHelper
1
+ module Wallaby
2
+ # Wallaby's application controller
3
+ # It defaults to inherit from ::ApplicationController, which can be configured
4
+ # via `Wallaby.configuration.base_controller`
5
+ # It only contains the error handling logics
6
+ class ApplicationController < configuration.base_controller
7
+ helper ApplicationHelper
3
8
 
4
- rescue_from \
5
- Wallaby::ResourceNotFound,
6
- Wallaby::ModelNotFound,
7
- with: :not_found
8
- rescue_from ActionController::ParameterMissing, with: :unprocessable_entity
9
+ ERROR_PATH = ERROR_LAYOUT = 'wallaby/error'.freeze
9
10
 
10
- layout 'wallaby/application'
11
+ # NOTE: we want to see the error blown up in development environment
12
+ unless Rails.env.development?
13
+ rescue_from NotFound, with: :not_found
14
+ rescue_from ::ActionController::ParameterMissing, with: :bad_request
15
+ rescue_from ::ActiveRecord::StatementInvalid, with: :unprocessable_entity
16
+ end
11
17
 
12
- def not_found(exception = nil)
13
- @exception = exception
14
- render 'wallaby/errors/not_found', status: 404
15
- end
18
+ layout 'wallaby/application'
19
+
20
+ # Not found page
21
+ def not_found(exception = nil)
22
+ error_rendering(exception, __callee__)
23
+ end
24
+
25
+ # Bad request page
26
+ def bad_request(exception = nil)
27
+ error_rendering(exception, __callee__)
28
+ end
29
+
30
+ # Unprocessable entity page
31
+ def unprocessable_entity(exception = nil)
32
+ error_rendering(exception, __callee__)
33
+ end
34
+
35
+ protected
36
+
37
+ def configuration
38
+ ::Wallaby.configuration
39
+ end
40
+
41
+ # capture exceptions and display the error using error layout and view
42
+ def error_rendering(exception, symbol)
43
+ @exception = exception
44
+ @symbol = symbol
45
+ @code = Rack::Utils::SYMBOL_TO_STATUS_CODE[@symbol].to_i
16
46
 
17
- def unprocessable_entity(exception)
18
- @exception = exception
19
- render 'wallaby/errors/unprocessable_entity', status: 422
47
+ Rails.logger.error @exception
48
+ render ERROR_PATH, layout: ERROR_LAYOUT, status: symbol
49
+ end
20
50
  end
21
51
  end
@@ -0,0 +1,30 @@
1
+ module Wallaby
2
+ # Base controller to provide basic helper methods for sub classes
3
+ class BaseController < ::Wallaby::SecureController
4
+ helper BaseHelper
5
+ helper_method \
6
+ :current_resources_name,
7
+ :current_model_class
8
+
9
+ before_action :authenticate_user!, except: [:status]
10
+
11
+ # health check
12
+ def healthy
13
+ render plain: 'healthy'
14
+ end
15
+
16
+ protected
17
+
18
+ # @return [String] the resources name coming from params
19
+ def current_resources_name
20
+ @current_resources_name ||= params[:resources]
21
+ end
22
+
23
+ # @return [Class] the model class that links to the resources name
24
+ def current_model_class
25
+ @current_model_class ||=
26
+ self.class.respond_to?(:model_class) && self.class.model_class \
27
+ || Map.model_class_map(current_resources_name)
28
+ end
29
+ end
30
+ end