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,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) {} %>