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,134 +1,5 @@
1
1
  module Wallaby
2
- class ResourcesController < CoreController
3
- helper Wallaby::ResourcesHelper
4
-
5
- def self.resources_name
6
- if self < Wallaby::ResourcesController
7
- Wallaby::Utils.to_resources_name name.gsub('Controller', '')
8
- end
9
- end
10
-
11
- def self.model_class
12
- if self < Wallaby::ResourcesController
13
- Wallaby::Utils.to_model_class name.gsub('Controller', ''), name
14
- end
15
- end
16
-
17
- def index
18
- authorize! :index, current_model_class
19
- collection
20
- end
21
-
22
- def new
23
- authorize! :new, new_resource
24
- end
25
-
26
- def create
27
- authorize! :create, current_model_class
28
- @resource, is_success = current_model_service.create params, current_ability
29
- if is_success
30
- redirect_to resources_index_path, notice: 'successfully created'
31
- else
32
- flash.now[:error] = 'failed to create'
33
- render :new
34
- end
35
- end
36
-
37
- def show
38
- authorize! :show, resource
39
- end
40
-
41
- def edit
42
- authorize! :edit, resource
43
- end
44
-
45
- def update
46
- authorize! :update, resource
47
- @resource, is_success = current_model_service.update resource, params, current_ability
48
- if is_success
49
- redirect_to resources_show_path, notice: 'successfully updated'
50
- else
51
- flash.now[:error] = 'failed to update'
52
- render :edit
53
- end
54
- end
55
-
56
- def destroy
57
- authorize! :destroy, resource
58
- if current_model_service.destroy resource, params
59
- redirect_to resources_index_path, notice: 'successfully destroyed'
60
- else
61
- redirect_to resources_show_path, error: 'failed to destroy'
62
- end
63
- end
64
-
65
- protected
66
- def _prefixes
67
- @_prefixes ||= begin
68
- current_script = request.env['SCRIPT_NAME'].try(:[], 1..-1).presence
69
- resource_path = current_resources_name.gsub '::', '/'
70
- script_prefix = [ current_script, resource_path ].compact.join '/'
71
-
72
- wallaby_path = Wallaby::ResourcesController.controller_path
73
- suffix = %w( new create edit update ).include?(params[:action]) ? 'form' : params[:action]
74
-
75
- minimal_prefixes = super[0..super.index(wallaby_path)]
76
- if resource_path != controller_path
77
- minimal_prefixes.unshift script_prefix
78
- end
79
-
80
- minimal_prefixes.map do |prefix|
81
- [ "#{ prefix }/#{ suffix }", prefix ]
82
- end.flatten
83
- end
84
- end
85
-
86
- def lookup_context
87
- @_lookup_context ||= Wallaby::LookupContextWrapper.new super
88
- end
89
-
90
- def resources_index_path(name = current_resources_name)
91
- wallaby_engine.resources_path name
92
- end
93
-
94
- def resources_show_path(name = current_resources_name, id = resource_id)
95
- wallaby_engine.resource_path name, id
96
- end
97
-
98
- def current_model_service
99
- @current_model_service ||= Wallaby::ServicerFinder.find(current_model_class).new current_model_class, current_model_decorator
100
- end
101
-
102
- def new_resource
103
- @resource ||= current_model_service.new params
104
- end
105
-
106
- begin # helper methods
107
- helper_method :resource_id, :resource, :collection, :current_model_decorator
108
-
109
- def resource_id
110
- params[:id]
111
- end
112
-
113
- def collection
114
- @collection ||= begin
115
- page_number = params.delete :page
116
- per_number = params.delete(:per) || 50
117
-
118
- query = current_model_service.collection params, current_ability
119
- query = query.page page_number if query.respond_to? :page
120
- query = query.per per_number if query.respond_to? :per
121
- query
122
- end
123
- end
124
-
125
- def resource
126
- @resource ||= current_model_service.find resource_id, params
127
- end
128
-
129
- def current_model_decorator
130
- @current_model_decorator ||= Wallaby::DecoratorFinder.find_model current_model_class
131
- end
132
- end
2
+ # Resources controller, superclass for all customized controllers
3
+ class ResourcesController < Wallaby::AbstractResourcesController
133
4
  end
134
5
  end
@@ -1,42 +1,56 @@
1
1
  module Wallaby
2
- class SecureController < ApplicationController
3
- helper Wallaby::SecureHelper
4
-
5
- rescue_from Wallaby::NotAuthenticated, with: :not_authenticated
6
- rescue_from CanCan::AccessDenied, with: :access_denied
2
+ # This controller only contains authentication logics
3
+ class SecureController < ::Wallaby::ApplicationController
4
+ helper SecureHelper
7
5
  helper_method :current_user
8
6
 
9
- protected
10
- def not_authenticated(exception)
11
- @exception = exception
12
- render 'wallaby/errors/not_authenticated', status: 401, layout: 'wallaby/error'
7
+ rescue_from NotAuthenticated, with: :unauthorized
8
+ rescue_from ::CanCan::AccessDenied, with: :forbidden
9
+
10
+ # Unauthorized page
11
+ def unauthorized(exception = nil)
12
+ error_rendering(exception, __callee__)
13
13
  end
14
14
 
15
- def access_denied(exception)
16
- @exception = exception
17
- render 'wallaby/errors/access_denied', status: 403
15
+ # Forbidden page
16
+ def forbidden(exception = nil)
17
+ error_rendering(exception, __callee__)
18
18
  end
19
19
 
20
+ protected
21
+
22
+ # Precedence of current_user:
23
+ # - [Security] @see Wallaby::SecureController#security_config
24
+ # - super
25
+ # - do nothing
26
+ # @see Devise::Controllers::Helpers#define_helpers
20
27
  def current_user
21
- @current_user ||= if security_config.current_user? || !defined? super
22
- instance_exec &security_config.current_user
23
- else
24
- super
25
- end
28
+ @current_user ||=
29
+ if security_config.current_user? || !defined? super
30
+ instance_exec(&security_config.current_user)
31
+ else
32
+ super
33
+ end
26
34
  end
27
35
 
36
+ # Precedence of authenticate_user!:
37
+ # - [Security] @see Wallaby::SecureController#security_config
38
+ # - super
39
+ # - do nothing
40
+ # @see Devise::Controllers::Helpers#define_helpers
28
41
  def authenticate_user!
29
- authenticated = if security_config.authenticate? || !defined? super
30
- instance_exec &security_config.authenticate
31
- else
32
- super
33
- end
34
- fail Wallaby::NotAuthenticated if !authenticated
42
+ authenticated =
43
+ if security_config.authenticate? || !defined? super
44
+ instance_exec(&security_config.authenticate)
45
+ else
46
+ super
47
+ end
48
+ raise NotAuthenticated unless authenticated
35
49
  true
36
50
  end
37
51
 
38
52
  def security_config
39
- Wallaby.configuration.security
53
+ configuration.security
40
54
  end
41
55
  end
42
56
  end
@@ -1,50 +1,47 @@
1
- if Rails.env.development?
2
- # NOTE: Rails reload! will hit here
3
- Rails.logger.debug '--> [ Wallaby ] Ready to preload and clear cache on reload. <--'
4
- GC.start
5
- Rails.cache.delete_matched 'wallaby/*'
6
-
7
- # NOTE: we search for subclasses of Wallaby::ResourcesController and Wallaby::ResourceDecorator.
8
- # therefore, under development environment, we need to preload all classes under /app folder in main_app
9
- # using `require` is not working for preloading, we need to constantize the class names to make Rails reload classes properly
10
- Wallaby::ApplicationController
11
-
12
- def preload(file_pattern)
13
- Dir[ file_pattern ].each do |file_path|
14
- begin
15
- name = file_path[ %r(app/[^/]+/(.+)\.rb), 1 ].gsub('concerns/', '')
16
- name.classify.constantize
17
- rescue NameError, LoadError => e
18
- Rails.logger.debug "PRELOAD ERROR: #{ e.message }"
19
- end
1
+ module Wallaby
2
+ # This is the core of wallaby that dynamically dispatches request to
3
+ # appropriate controller and action.
4
+ class ResourcesRouter
5
+ # @see http://edgeguides.rubyonrails.org/routing.html#routing-to-rack-applications
6
+ # It tries to find out the controller that has the same model class from
7
+ # converted resources name. Otherwise, it falls back to generic controller
8
+ # `Wallaby::ResourcesController`.
9
+ # @param env [Hash] @see http://www.rubydoc.info/github/rack/rack/master/file/SPEC
10
+ def call(env)
11
+ params = env[ActionDispatch::Http::Parameters::PARAMETERS_KEY]
12
+ controller = find_controller_by params[:resources]
13
+ params[:action] = find_action_by params
14
+
15
+ controller.action(params[:action]).call env
16
+ rescue ::AbstractController::ActionNotFound, ModelNotFound => e
17
+ params[:error] = e
18
+ ResourcesController.action(:not_found).call env
20
19
  end
21
- end
22
-
23
- preload 'app/models/**.rb'
24
- preload 'app/**/*.rb'
25
- end
26
-
27
- class Wallaby::ResourcesRouter
28
- DEFAULT_CONTROLLER = Wallaby::ResourcesController
29
20
 
30
- def call(env)
31
- params = env['action_dispatch.request.path_parameters']
32
- controller = find_controller_by params[:resources]
33
- params[:action] = find_action_by params
21
+ private
34
22
 
35
- controller.action(params[:action]).call env
36
- rescue AbstractController::ActionNotFound, Wallaby::ModelNotFound => e
37
- params[:error] = e
38
- DEFAULT_CONTROLLER.action(:not_found).call env
39
- end
23
+ def find_controller_by(resources_name)
24
+ model_class = Map.model_class_map resources_name
25
+ Map.controller_map model_class
26
+ end
40
27
 
41
- private
42
- def find_controller_by(resources_name)
43
- model_class = Wallaby::Utils.to_model_class resources_name
44
- Wallaby::Map.controller_map[model_class] || DEFAULT_CONTROLLER
28
+ def find_action_by(params)
29
+ # Action name comes from either the defaults or :action param
30
+ # @see Wallaby::Engine.routes
31
+ (params.delete(:defaults) || params)[:action]
32
+ end
45
33
  end
34
+ end
46
35
 
47
- def find_action_by(params)
48
- (params.delete(:defaults) || params)[:action]
49
- end
36
+ # NOTE: please keep this block at the end.
37
+ # otherwise, it might go into a endless reloading loop
38
+ # NOTE: Rails reload! will hit here
39
+ if Rails.env.development?
40
+ puts <<-DEBUG
41
+ [ WALLABY ] reload! triggered
42
+ 1. Clear all the maps
43
+ 2. Preload all files under folder `app` (instead of eager load)
44
+ DEBUG
45
+ Wallaby::Map.clear
46
+ Wallaby::Utils.preload_all
50
47
  end
@@ -1,33 +1,9 @@
1
+ # Defualt ability for wallaby
2
+ # If main app has defined `ability.rb`, this file will not be loaded/used.
1
3
  class Ability
2
- include CanCan::Ability
4
+ include ::CanCan::Ability
3
5
 
4
- def initialize(user)
5
- # Define abilities for the passed in user here. For example:
6
- #
7
- # user ||= User.new # guest user (not logged in)
8
- # if user.admin?
9
- # can :manage, :all
10
- # else
11
- # can :read, :all
12
- # end
13
- #
14
- # The first argument to `can` is the action you are giving the user
15
- # permission to do.
16
- # If you pass :manage it will apply to every action. Other common actions
17
- # here are :read, :create, :update and :destroy.
18
- #
19
- # The second argument is the resource the user can perform the action on.
20
- # If you pass :all it will apply to every resource. Otherwise pass a Ruby
21
- # class of the resource.
22
- #
23
- # The third argument is an optional hash of conditions to further filter the
24
- # objects.
25
- # For example, here the user can only update published articles.
26
- #
27
- # can :update, Article, :published => true
28
- #
29
- # See the wiki for details:
30
- # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
6
+ def initialize(_user)
31
7
  can :manage, :all
32
8
  end
33
9
  end
@@ -3,20 +3,25 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <% if Wallaby.configuration.features.turbolinks_enabled %>
7
+ <meta name="turbolinks-cache-control" content="no-cache">
8
+ <% end %>
9
+ <%= csrf_meta_tags %>
6
10
 
7
- <title><%= page_title %></title>
11
+ <title><%= render 'title' %></title>
8
12
 
9
- <%= stylesheet_link_tag 'wallaby/application', media: 'all', 'data-turbolinks-track' => true %>
13
+ <%= stylesheet_link_tag 'wallaby/application', media: 'all' %>
10
14
  <%= yield :custom_stylesheet %>
11
- <%= csrf_meta_tags %>
15
+ <%= javascript_include_tag 'turbolinks' if Wallaby.configuration.features.turbolinks_enabled %>
16
+ <%= javascript_include_tag 'wallaby/application' %>
12
17
  </head>
13
18
  <body class="application <%= body_class %>">
14
- <%= render 'layouts/wallaby/header' %>
19
+ <%= render 'header' %>
15
20
  <main>
16
21
  <%= yield %>
17
22
  </main>
18
- <%= render 'layouts/wallaby/footer' %>
19
- <%= javascript_include_tag 'wallaby/application', 'data-turbolinks-track' => true %>
23
+ <%= render 'footer' %>
24
+ <%= render 'imodal' %>
20
25
  <%= yield :custom_javascript %>
21
26
  </body>
22
27
  </html>
@@ -3,18 +3,40 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <% if Wallaby.configuration.features.turbolinks_enabled %>
7
+ <meta name="turbolinks-cache-control" content="no-cache">
8
+ <% end %>
9
+ <%= csrf_meta_tags %>
6
10
 
7
- <title><%= page_title %></title>
11
+ <title><%= render 'title' %></title>
8
12
 
9
- <%= stylesheet_link_tag 'wallaby/application', media: 'all', 'data-turbolinks-track' => true %>
13
+ <%= stylesheet_link_tag 'wallaby/application', media: 'all' %>
10
14
  <%= yield :custom_stylesheet %>
11
- <%= csrf_meta_tags %>
15
+ <%= javascript_include_tag 'turbolinks' if Wallaby.configuration.features.turbolinks_enabled %>
16
+ <%= javascript_include_tag 'wallaby/application' %>
12
17
  </head>
13
18
  <body class="error <%= body_class %>">
19
+ <header>
20
+ <nav class="navbar">
21
+ <div class="container-fluid">
22
+ <%# Brand %>
23
+ <div class="navbar-header">
24
+ <%# Mobile Menu Toggler %>
25
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#top-menu" aria-expanded="false">
26
+ <span class="fa fa-bars"></span>
27
+ </button>
28
+ <%# //Mobile Menu Toggler %>
29
+ <a class="navbar-brand" href="<%= wallaby_engine.root_path %>"><span>Wallaby</span> Admin</a>
30
+ </div>
31
+ <%# //Brand %>
32
+ </div>
33
+ </nav>
34
+ </header>
35
+
14
36
  <main>
15
37
  <%= yield %>
16
38
  </main>
17
- <%= javascript_include_tag 'wallaby/application', 'data-turbolinks-track' => true %>
39
+ <%= render 'footer' %>
18
40
  <%= yield :custom_javascript %>
19
41
  </body>
20
42
  </html>
@@ -0,0 +1,11 @@
1
+ <article class="<%= @symbol %>">
2
+ <h1>
3
+ <em><%= @code %></em>
4
+ <span><%= t "http_errors.#{@symbol}" %></span>
5
+ </h1>
6
+ <% if @code >= 500 %>
7
+ <%= t "http_errors.report_error_html" %>
8
+ <% else %>
9
+ <p><%= @exception.try :message %></p>
10
+ <% end %>
11
+ </article>
@@ -0,0 +1,8 @@
1
+ json.error do
2
+ json.code @code
3
+ if @code < 500 && @exception.present?
4
+ json.message @exception.message
5
+ else
6
+ json.message t("json_errors.#{@symbol}")
7
+ end
8
+ end
@@ -0,0 +1 @@
1
+ <footer></footer>
@@ -6,7 +6,7 @@
6
6
  <% end %>
7
7
  <% end %>
8
8
  <% decorated.form_field_names.each do |field_name| %>
9
- <%= form_type_partial_render decorated.form_type_of(field_name).to_s, field_name: field_name, form: form %>
9
+ <%= form_type_partial_render decorated.form_type_of(field_name), field_name: field_name, form: form %>
10
10
  <% end %>
11
- <%= form.submit class: 'btn btn-primary' %>
11
+ <%= form.button t('buttons.save'), class: 'btn btn-primary' %>
12
12
  <%= cancel_link class: 'btn btn-default' %>
@@ -0,0 +1,38 @@
1
+ <header>
2
+ <nav class="navbar">
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="fa fa-bars"></span>
9
+ </button>
10
+ <%# //Mobile Menu Toggler %>
11
+ <%= render 'logo' %>
12
+ </div>
13
+ <%# //Brand %>
14
+
15
+ <div id="top-menu" class="collapse navbar-collapse">
16
+ <%# Resources navigation %>
17
+ <%= render 'navs' %>
18
+ <%# //Resources navigation %>
19
+ <%# User account %>
20
+ <ul class="nav navbar-nav navbar-right">
21
+ <li><span class=""></span></li>
22
+ <% if current_user.present? %>
23
+ <li role="separator" class="divider"></li>
24
+ <li>
25
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
26
+ <%= user_portrait %>
27
+ <span class="visible-xs-inline-block">User</span>
28
+ <span class="caret"></span>
29
+ </a>
30
+ <%= render 'user_menu' %>
31
+ </li>
32
+ <% end %>
33
+ </ul>
34
+ <%# //User account %>
35
+ </div>
36
+ </div>
37
+ </nav>
38
+ </header>
@@ -0,0 +1,13 @@
1
+ <div id="imodal" class="modal fade" tabindex="-1" role="dialog">
2
+ <div class="modal-dialog modal-lg" role="document">
3
+ <div class="modal-content">
4
+ <div class="modal-header">
5
+ <button class="close" type="button" data-dismiss="modal" aria-label="Close">
6
+ <span aria-hidden="true">&times;</span>
7
+ </button>
8
+ <h4 class="modal-title"></h4>
9
+ </div>
10
+ <div class="modal-body"></div>
11
+ </div>
12
+ </div>
13
+ </div>
@@ -1 +1,4 @@
1
- <%= new_link(current_model_class, class: 'btn btn-primary') { ct 'link.new' } %>
1
+ <% # can be overriden %>
2
+ <ul aria-labelledby="actions_list">
3
+ <li><%= export_link current_model_class %></li>
4
+ </ul>
@@ -0,0 +1,23 @@
1
+ <%
2
+ filters = current_model_decorator.filters
3
+ filter = ::Wallaby::Utils.find_filter_name index_params[:filter], filters
4
+ html_options = proc do |filter_name|
5
+ { class: filter.to_s == filter_name.to_s ? 'filters--current' : '' }
6
+ end
7
+ %>
8
+ <nav class="filters">
9
+ <% if filters.present? %>
10
+ <a role="button" data-target="#" data-toggle="dropdown"
11
+ aria-haspopup="true" aria-expanded="true">
12
+ <%= filter_label(filter, filters) || all_label %>
13
+ </a>
14
+ <ul>
15
+ <li><em><%= t 'filters.title' %></em></li>
16
+ <% filters.keys.unshift(:all).each do |filter_name| %>
17
+ <%= content_tag :li, filter_link(current_model_class, filter_name, filters), html_options.call(filter_name) %>
18
+ <% end %>
19
+ </ul>
20
+ <% else %>
21
+ <%= all_label %>
22
+ <% end %>
23
+ </nav>
@@ -0,0 +1,63 @@
1
+ <%
2
+ paginator = paginate(current_model_class, collection, index_params)
3
+ %>
4
+ <% if paginator.paginatable? %>
5
+ <%
6
+ active_per = proc do |per|
7
+ paginator.page_size == per && 'pagination__pers--current'
8
+ end
9
+ from_to = t 'pagination.from_to', from: paginator.from, to: paginator.to
10
+ of = t 'pagination.of'
11
+ total_count = t 'pagination.total_count', total: paginator.total
12
+ pers_title = t 'pagination.pers'
13
+ pages_title = t 'pagination.pages'
14
+ %>
15
+ <nav class="pagination">
16
+ <span class="pagination__metadata">
17
+ <% if paginator.number_of_pages > 1 # more than one page%>
18
+ <span class="pagination__pers">
19
+ <a role="button" data-target="#" data-toggle="dropdown"
20
+ aria-haspopup="true" aria-expanded="true">
21
+ <%= from_to %>
22
+ </a>
23
+ <ul aria-labelledby="all_pers">
24
+ <li><em><%= t 'pagination.pers' %></em></li>
25
+ <% Wallaby::PERS.each do |per| %>
26
+ <%= content_tag :li, class: active_per.call(per) do %>
27
+ <%= index_link(current_model_class, url_params: index_params.merge(per: per)) { per.to_s } %>
28
+ <% end %>
29
+ <% end %>
30
+ </ul>
31
+ </span>
32
+ <%= t 'pagination.of' %>
33
+ <span class="pagination__pages">
34
+ <a role="button" data-target="#" data-toggle="dropdown"
35
+ aria-haspopup="true" aria-expanded="true">
36
+ <%= total_count %>
37
+ </a>
38
+ <%= content_tag :form, action: index_path(current_model_class), method: :get, aria: { labelledby: 'all_pages' } do %>
39
+ <% index_params.except(:page).each do |permitted, value| %>
40
+ <%= hidden_field_tag permitted, value %>
41
+ <% end %>
42
+ <label for="page_number">
43
+ <%= t 'pagination.pages' %>
44
+ </label>
45
+ <%= number_field_tag 'page', paginator.page_number, id: 'page_number' %>
46
+ <% end %>
47
+ </span>
48
+ <% else # only one page %>
49
+ <%= from_to + of + total_count %>
50
+ <% end %>
51
+ </span>
52
+ <% if paginator.prev_page? # has prev page %>
53
+ <span>
54
+ <%= index_link(current_model_class, url_params: index_params.merge(page: paginator.prev_page_number)) { t 'pagination.prev' } %>
55
+ </span>
56
+ <% end %>
57
+ <% if paginator.next_page? # has next page %>
58
+ <span>
59
+ <%= index_link(current_model_class, url_params: index_params.merge(page: paginator.next_page_number)) { t 'pagination.next' } %>
60
+ </span>
61
+ <% end %>
62
+ </nav>
63
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <%
2
+ query_classes = proc do
3
+ classes = %w(query)
4
+ classes.push 'query--filtered' if index_params.present?
5
+ classes
6
+ end
7
+ %>
8
+ <%= content_tag :div, class: query_classes.call do %>
9
+ <nav class="query__actions">
10
+ <%= index_link(current_model_class, html_classes('query__clear')) {} if index_params.present? %>
11
+ <%= new_link(current_model_class, html_classes('query__create')) {} %>
12
+ <a id="actions_list" class="query__more"
13
+ role="button" data-target="#" data-toggle="dropdown"
14
+ aria-haspopup="true" aria-expanded="true"></a>
15
+ <%= render 'index_actions' %>
16
+ </nav>
17
+ <%= form_tag index_path(current_model_class), method: :get, class: 'query__search' do %>
18
+ <%= hidden_field_tag :sort, index_params[:sort] %>
19
+ <label for="q">
20
+ <%= text_field_tag :q, index_params[:q], placeholder: t('search.hint') %>
21
+ </label>
22
+ <% end %>
23
+ <% end %>
@@ -0,0 +1 @@
1
+ <a class="navbar-brand" href="<%= wallaby_engine.root_path %>"><span>Wallaby</span> Admin</a>
@@ -0,0 +1,9 @@
1
+ <% # can be overriden %>
2
+ <ul class="nav navbar-nav">
3
+ <li class="dropdown">
4
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
5
+ Data <span class="caret"></span>
6
+ </a>
7
+ <%= model_tree model_classes %>
8
+ </li>
9
+ </ul>
@@ -1,3 +1,3 @@
1
- <%= show_link(decorated, class: 'text-info') { itooltip ct('link.show'), 'link' } %>
2
- <%= edit_link(decorated) { itooltip ct('link.edit'), 'pencil' } %>
3
- <%= delete_link(decorated) { itooltip ct('link.delete'), 'trash' } %>
1
+ <%= show_link(decorated) {} %>
2
+ <%= edit_link(decorated) {} %>
3
+ <%= delete_link(decorated) {} %>