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
@@ -1,78 +0,0 @@
1
- //
2
- // Tables
3
- // --------------------------------------------------
4
- table.data-table {
5
- @extend .table;
6
- thead tr th {
7
- color: $gray-light;
8
- text-transform: uppercase;
9
- &.asc, &.desc {
10
- a {
11
- display: block;
12
- position: relative;
13
- padding-right: 22px;
14
- }
15
- a:after {
16
- position: absolute;
17
- top: 50%;
18
- margin-top: -7px;
19
- right: 4px;
20
- @extend .glyphicon;
21
- }
22
- }
23
- &.asc {
24
- a:after {
25
- @extend .glyphicon-sort-by-attributes:before;
26
- }
27
- }
28
- &.desc {
29
- a:after {
30
- @extend .glyphicon-sort-by-attributes-alt:before;
31
- }
32
- }
33
- }
34
- tbody tr td {
35
- padding: 8px 12px;
36
- a, a:hover {
37
- text-decoration: none;
38
- }
39
- }
40
- i.glyphicon {
41
- color: $gray-lighter;
42
- &:hover {
43
- color: $gray-light;
44
- }
45
- }
46
- a {
47
- i.glyphicon {
48
- margin-right: 2px;
49
- color: inherit;
50
- &:hover {
51
- color: inherit;
52
- }
53
- }
54
- i.glyphicon.glyphicon-circle-arrow-up {
55
- color: $gray-lighter;
56
- &:hover {
57
- color: $gray-light;
58
- }
59
- }
60
- }
61
- }
62
-
63
- table.detail-table {
64
- @extend .table;
65
- thead tr th, tbody tr th {
66
- color: $gray-light;
67
- text-transform: uppercase;
68
- }
69
- tbody tr {
70
- td {
71
- padding: 8px 12px;
72
-
73
- a, a:hover {
74
- text-decoration: none;
75
- }
76
- }
77
- }
78
- }
@@ -1,11 +0,0 @@
1
- //= require codemirror
2
- //= require jquery.minicolors
3
- @import 'bootstrap-sprockets';
4
- @import 'bootstrap';
5
- @import 'bootstrap-datetimepicker';
6
- @import 'wallaby/summernote';
7
-
8
- .CodeMirror {
9
- height: 168px;
10
- border: 1px solid #eeeeee;
11
- }
@@ -1,28 +0,0 @@
1
- module Wallaby
2
- class CoreController < SecureController
3
- helper Wallaby::CoreHelper
4
-
5
- before_action :authenticate_user!, except: [ :status ]
6
-
7
- def status
8
- render plain: 'healthy'
9
- end
10
-
11
- protected
12
- begin # helper methods
13
- helper_method \
14
- :current_resources_name,
15
- :current_model_class
16
-
17
- def current_resources_name
18
- @current_resources_name ||= params[:resources]
19
- end
20
-
21
- def current_model_class
22
- @current_model_class ||= if self.class.respond_to? :model_class
23
- self.class.model_class
24
- end || Wallaby::Utils.to_model_class(current_resources_name)
25
- end
26
- end
27
- end
28
- end
@@ -1,2 +0,0 @@
1
- <footer>
2
- </footer>
@@ -1,57 +0,0 @@
1
- <header>
2
- <nav class="top-nav navbar navbar-default">
3
- <div class="container-fluid">
4
- <%# Brand %>
5
- <div class="navbar-header">
6
- <%# Mobile Menu Toggler %>
7
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#top-menu" aria-expanded="false">
8
- <span class="sr-only">Toggle navigation</span>
9
- <span class="icon-bar"></span>
10
- <span class="icon-bar"></span>
11
- <span class="icon-bar"></span>
12
- </button>
13
- <%# //Mobile Menu Toggler %>
14
- <a class="navbar-brand" href="<%= wallaby_engine.root_path %>">Wallaby Admin</a>
15
- </div>
16
- <%# //Brand %>
17
-
18
- <div id="top-menu" class="collapse navbar-collapse">
19
- <%# Resources navigation %>
20
- <ul class="nav navbar-nav">
21
- <li class="dropdown">
22
- <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
23
- <%= current_model_label %>
24
- <span class="caret"></span>
25
- </a>
26
- <ul class="dropdown-menu">
27
- <% model_classes.each do |model_class| %>
28
- <li><%= index_link model_class %> </li>
29
- <% end %>
30
- </ul>
31
- </li>
32
- </ul>
33
- <%= render 'layouts/wallaby/navs' %>
34
- <%# //Resources navigation %>
35
- <%# User account %>
36
- <% if current_user.present? %>
37
- <ul class="nav navbar-nav navbar-right">
38
- <li role="separator" class="divider"></li>
39
- <li>
40
- <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
41
- <%= user_portrait %>
42
- <span class="visible-xs-inline-block">User</span>
43
- <span class="caret"></span>
44
- </a>
45
- <% if logout_path.present? %>
46
- <ul class="dropdown-menu">
47
- <li><%= link_to 'Sign out', logout_path, method: logout_method %></li>
48
- </ul>
49
- <% end %>
50
- </li>
51
- </ul>
52
- <% end %>
53
- <%# //User account %>
54
- </div>
55
- </div>
56
- </nav>
57
- </header>
@@ -1 +0,0 @@
1
- <% # can be overriden %>
@@ -1 +0,0 @@
1
- <%= @exception.message %>
@@ -1 +0,0 @@
1
- <%= @exception.message %>
@@ -1,6 +0,0 @@
1
- <% error = @exception || params[:error] %>
2
- <% if error %>
3
- <p>
4
- <%= error.message %> not found.
5
- </p>
6
- <% end %>
@@ -1 +0,0 @@
1
- <%= @exception.message %>
@@ -1,29 +0,0 @@
1
- # Files in the config/locales directory are used for internationalization
2
- # and are automatically loaded by Rails. If you want to use locales other
3
- # than English, add the necessary files in this directory.
4
- #
5
- # To use the locales, use `I18n.t`:
6
- #
7
- # I18n.t 'hello'
8
- #
9
- # In views, this is aliased to just `t`:
10
- #
11
- # <%= t('hello') %>
12
- #
13
- # To use a different locale, set it with `I18n.locale`:
14
- #
15
- # I18n.locale = :es
16
- #
17
- # This would use the information in config/locales/es.yml.
18
- #
19
- # To learn more, please read the Rails Internationalization guide
20
- # available at http://guides.rubyonrails.org/i18n.html.
21
-
22
- en:
23
- link:
24
- new: Create
25
- show: Show
26
- edit: Edit
27
- delete: Delete
28
- confirm:
29
- delete: Please confirm to delete
@@ -1,44 +0,0 @@
1
- class Wallaby::ActiveRecord::ModelOperator::Normalizer
2
- def initialize(model_decorator)
3
- @model_decorator = model_decorator
4
- end
5
-
6
- def normalize(params)
7
- params.each do |field_name, values|
8
- next unless metadata = @model_decorator.fields[field_name]
9
-
10
- case metadata[:type]
11
- when /range/
12
- normalize_range_values params, field_name, values
13
- when /point/
14
- normalize_point_values params, field_name, values
15
- when /binary/
16
- normalize_binary_values params, field_name, values
17
- end
18
- end
19
- end
20
-
21
- def normalize_range_values(params, field_name, values)
22
- normalized = Array(values).map(&:presence).compact
23
- if normalized.length > 0 && values.length == 2
24
- params[field_name] = values.first...values.last
25
- else
26
- params[field_name] = nil
27
- end
28
- end
29
-
30
- def normalize_point_values(params, field_name, values)
31
- normalized = Array(values).map(&:presence).compact
32
- if normalized.length > 0
33
- params[field_name] = values.map &:to_f
34
- else
35
- params[field_name] = nil
36
- end
37
- end
38
-
39
- def normalize_binary_values(params, field_name, values)
40
- if values.is_a?(ActionDispatch::Http::UploadedFile)
41
- params[field_name] = values.read
42
- end
43
- end
44
- end
@@ -1,50 +0,0 @@
1
- class Wallaby::ActiveRecord::ModelOperator::Permitter
2
- def initialize(model_decorator)
3
- @model_decorator = model_decorator
4
- end
5
-
6
- def simple_field_names
7
- field_names = non_range_fields.keys + belongs_to_fields.map do |_, metadata|
8
- [ metadata[:foreign_key], metadata[:polymorphic_type] ]
9
- end.flatten.compact
10
- field_names.reject do |field_name|
11
- [ @model_decorator.primary_key, 'created_at', 'updated_at' ].include? field_name
12
- end
13
- end
14
-
15
- def compound_hashed_fields
16
- field_names = range_fields.keys + many_association_fields.map{ |_, metadata| metadata[:foreign_key] }
17
- Wallaby::Utils.to_hash(field_names.map{ |field_name| [ field_name, [] ] })
18
- end
19
-
20
- protected
21
- def non_association_fields
22
- @model_decorator.fields.select{ |_, metadata| !metadata[:is_association] }
23
- end
24
-
25
- def non_range_fields
26
- non_association_fields.select{ |_, metadata| !(/range|point/ =~ metadata[:type]) }
27
- end
28
-
29
- def range_fields
30
- non_association_fields.select do |_, metadata|
31
- /range|point/ =~ metadata[:type]
32
- end
33
- end
34
-
35
- def association_fields
36
- @model_decorator.fields.select do |_, metadata|
37
- metadata[:is_association] && !metadata[:has_scope] && !metadata[:is_through]
38
- end
39
- end
40
-
41
- def many_association_fields
42
- association_fields.select{ |_, metadata| /many/ =~ metadata[:type] }
43
- end
44
-
45
- def belongs_to_fields
46
- association_fields.select do |field_name, metadata|
47
- 'belongs_to' == metadata[:type]
48
- end
49
- end
50
- end
@@ -1,47 +0,0 @@
1
- class Wallaby::ActiveRecord::ModelOperator::Querier
2
- def initialize(model_decorator)
3
- @model_decorator = model_decorator
4
- @model_class = @model_decorator.model_class
5
- end
6
-
7
- def search(params)
8
- text_keywords, field_keywords = extract params
9
- query = @model_class.where nil
10
- query = text_search text_keywords, query
11
- query = field_search field_keywords, query
12
- query
13
- end
14
-
15
- protected
16
- def extract(params)
17
- all_keywords = (params[:q] || '').split(' ').compact
18
- field_keywords = all_keywords.select{ |v| v.split(':').length == 2 }
19
- [ all_keywords - field_keywords, field_keywords ]
20
- end
21
-
22
- def text_search(keywords, query)
23
- return query if keywords.blank?
24
-
25
- queries = text_fields.inject([]) do |queries, field_name|
26
- likes = keywords.map do |keyword|
27
- [ "UPPER(#{ field_name }) LIKE ?", "%#{ keyword.upcase }%" ]
28
- end
29
- queries << [ "(#{ likes.map(&:first).join ' AND ' })", likes.map(&:last) ]
30
- end
31
- query.where queries.map(&:first).join(' OR '), *queries.map(&:last).flatten
32
- end
33
-
34
- def field_search(keywords, query)
35
- return query if keywords.blank?
36
-
37
- hashed_queries = Wallaby::Utils.to_hash(keywords.map{ |v| v.split ':' })
38
- query.where hashed_queries
39
- end
40
-
41
- def text_fields
42
- @model_decorator.fields.select do |field_name, metadata|
43
- @model_decorator.index_field_names.include?(field_name) &&
44
- %w( string text citext ).include?(metadata[:type])
45
- end.keys
46
- end
47
- end
@@ -1,16 +0,0 @@
1
- class Wallaby::ActiveRecord::ModelOperator::Validator
2
- def initialize(model_decorator)
3
- @model_decorator = model_decorator
4
- end
5
-
6
- def valid?(resource)
7
- resource.attributes.each do |field_name, values|
8
- next unless metadata = @model_decorator.fields[field_name]
9
- if %w( daterange tsrange tstzrange ).include?(metadata[:type]) &&
10
- values.try(:any?, &:blank?)
11
- resource.errors.add field_name, 'required for range data'
12
- end
13
- end
14
- resource.errors.blank?
15
- end
16
- end
@@ -1,82 +0,0 @@
1
- class Wallaby::ActiveRecord::ModelOperator < Wallaby::ModelOperator
2
- def collection(params, ability)
3
- query = querier.search params
4
- query = query.order params[:sort] if params[:sort].present?
5
- query.accessible_by ability
6
- end
7
-
8
- def new(params)
9
- permitted = permit params rescue {}
10
- @model_class.new permitted
11
- end
12
-
13
- def find(id, params)
14
- @model_class.find id
15
- rescue ActiveRecord::RecordNotFound
16
- fail Wallaby::ResourceNotFound
17
- end
18
-
19
- def create(params, ability)
20
- resource = @model_class.new
21
- resource.assign_attributes normalize permit(params)
22
- ensure_attributes_for ability, :create, resource
23
- resource.save if valid? resource
24
- [ resource, resource.errors.blank? ]
25
- rescue ActiveRecord::StatementInvalid => e
26
- resource.errors.add :base, e.message
27
- [ resource, false ]
28
- end
29
-
30
- def update(resource, params, ability)
31
- resource.assign_attributes normalize permit(params)
32
- ensure_attributes_for ability, :update, resource
33
- resource.save if valid? resource
34
- [ resource, resource.errors.blank? ]
35
- rescue ActiveRecord::StatementInvalid => e
36
- resource.errors.add :base, e.message
37
- [ resource, false ]
38
- end
39
-
40
- def destroy(resource, params)
41
- resource.destroy
42
- end
43
-
44
- protected
45
- def permit(params)
46
- params.require(param_key).permit(permitter.simple_field_names << permitter.compound_hashed_fields)
47
- end
48
-
49
- def normalize(params)
50
- normalizer.normalize params
51
- end
52
-
53
- def valid?(resource)
54
- validator.valid? resource
55
- end
56
-
57
- def ensure_attributes_for(ability, action, resource)
58
- return if ability.blank?
59
- restricted_conditions = ability.attributes_for action, resource
60
- resource.assign_attributes restricted_conditions
61
- end
62
-
63
- def param_key
64
- @model_class.model_name.param_key
65
- end
66
-
67
- def permitter
68
- @permitter ||= Wallaby::ActiveRecord::ModelOperator::Permitter.new @model_decorator
69
- end
70
-
71
- def querier
72
- @querier ||= Wallaby::ActiveRecord::ModelOperator::Querier.new @model_decorator
73
- end
74
-
75
- def normalizer
76
- @normalizer ||= Wallaby::ActiveRecord::ModelOperator::Normalizer.new @model_decorator
77
- end
78
-
79
- def validator
80
- @validator ||= Wallaby::ActiveRecord::ModelOperator::Validator.new @model_decorator
81
- end
82
- end
@@ -1,4 +0,0 @@
1
- module Wallaby
2
- class Deprecated < GeneralError
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module Wallaby
2
- class OperationNotFound < GeneralError
3
- end
4
- end
@@ -1,14 +0,0 @@
1
- require 'erubis'
2
-
3
- # TODO: move this kind of logic into a gem called faster rails :)
4
- class Wallaby::CachedCompiledErb < ActionView::Template::Handlers::ERB
5
- def call(template)
6
- if Rails.env.development?
7
- super
8
- else
9
- Rails.cache.fetch "wallaby/views/erb/#{ template.inspect }" do
10
- super
11
- end
12
- end
13
- end
14
- end
@@ -1,50 +0,0 @@
1
- require 'securerandom'
2
-
3
- # NOTE: Global helper methods should go in here
4
- module Wallaby::CoreHelper
5
- include Wallaby::StylingHelper
6
- include Wallaby::LinksHelper
7
-
8
- def to_model_label(model_class)
9
- Wallaby::Utils.to_model_label model_class
10
- end
11
-
12
- def to_resources_name(model_class)
13
- Wallaby::Utils.to_resources_name model_class
14
- end
15
-
16
- def current_model_label
17
- if current_resources_name.present?
18
- label = to_model_label current_resources_name
19
- return "Resource: #{ label }" if label.present?
20
- end
21
- 'Resources'
22
- end
23
-
24
- def body_class
25
- [
26
- params[:action],
27
- current_resources_name.try(:gsub, '::', '__'),
28
- content_for(:custom_body_class)
29
- ].compact.join ' '
30
- end
31
-
32
- def page_title
33
- 'Wallaby::Admin'
34
- end
35
-
36
- def ct(key, options = {})
37
- t key, { raise: true }.merge(options)
38
- rescue I18n::MissingTranslationData => e
39
- keys = I18n.normalize_keys(e.locale, e.key, e.options[:scope])
40
- keys.last.to_s.titleize
41
- end
42
-
43
- def random_uuid
44
- SecureRandom.uuid
45
- end
46
-
47
- def model_classes
48
- Wallaby::Map.model_classes.sort_by &:name
49
- end
50
- end
@@ -1,9 +0,0 @@
1
- module Wallaby::PaginatableHelper
2
- def paginatable?(collection)
3
- defined?(Kaminari) && collection.present? && collection.respond_to?(:total_pages)
4
- end
5
-
6
- def custom_pagination_stats(collection)
7
- "Showing #{ content_tag :b, collection.size }".html_safe
8
- end
9
- end
@@ -1,43 +0,0 @@
1
- module Wallaby::SortingHelper
2
- def sort_link(field_name, model_decorator = current_model_decorator)
3
- metadata = model_decorator.index_metadata_of field_name
4
-
5
- if metadata[:is_origin] && !metadata[:is_association] || metadata[:sort_field_name]
6
- sort_field_name = metadata[:sort_field_name] || field_name
7
- extra_params = next_sort_param(sort_field_name).permit!.to_h
8
- index_link(model_decorator.model_class, extra_params: extra_params) { metadata[:label] }
9
- else
10
- metadata[:label]
11
- end
12
- end
13
-
14
- def sort_hash
15
- @sort_hash ||= begin
16
- array = params[:sort].to_s.split(%r(\s*,\s*)).map{ |v| v.split %r(\s+) }
17
- Wallaby::Utils.to_hash array
18
- end
19
- end
20
-
21
- def next_sort_param(field_name)
22
- field_name = field_name.to_s
23
- orders = [ 'asc', 'desc', nil ]
24
- clean_params.tap do |hash|
25
- sortings = sort_hash.dup
26
- next_index = (orders.index(sortings[field_name]) + 1) % orders.length
27
- if orders[next_index].nil?
28
- sortings.delete field_name
29
- else
30
- sortings[field_name] = orders[next_index]
31
- end
32
- if sortings.present?
33
- hash[:sort] = sortings.to_a.map{ |v| v.join ' ' }.join ','
34
- else
35
- hash.delete :sort
36
- end
37
- end
38
- end
39
-
40
- def sort_class(field_name)
41
- sort_hash[ field_name.to_s ]
42
- end
43
- end
@@ -1,31 +0,0 @@
1
- class Wallaby::ModelOperator
2
- def initialize(model_class, model_decorator = nil)
3
- fail ArgumentError, 'model class required' unless model_class
4
- @model_class = model_class
5
- @model_decorator = model_decorator || Wallaby::DecoratorFinder.find_model(@model_class)
6
- end
7
-
8
- def collection(params, ability)
9
- fail Wallaby::NotImplemented
10
- end
11
-
12
- def new(params)
13
- fail Wallaby::NotImplemented
14
- end
15
-
16
- def find(id, params)
17
- fail Wallaby::NotImplemented
18
- end
19
-
20
- def create(params, ability)
21
- fail Wallaby::NotImplemented
22
- end
23
-
24
- def update(resource, params, ability)
25
- fail Wallaby::NotImplemented
26
- end
27
-
28
- def destroy(resource, params)
29
- fail Wallaby::NotImplemented
30
- end
31
- end
@@ -1,16 +0,0 @@
1
- class Wallaby::DecoratorFinder
2
- DEFAULT_DECORATOR = Wallaby::ResourceDecorator
3
-
4
- def self.find_model(model_class)
5
- Wallaby::Map.decorator_map[model_class] || new_model(model_class)
6
- end
7
-
8
- def self.find_resource(model_class)
9
- Wallaby::Map.decorator_map[model_class] || DEFAULT_DECORATOR
10
- end
11
-
12
- def self.new_model(model_class)
13
- mode = Wallaby::ActiveRecord
14
- mode.model_decorator.new model_class
15
- end
16
- end