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