wallaby 5.0.1 → 5.1.3

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 (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