avo 1.25.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of avo might be problematic. Click here for more details.

Files changed (711) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +10 -1
  3. data/Gemfile.lock +18 -3
  4. data/README.md +33 -28
  5. data/app/assets/stylesheets/avo.css +8 -3
  6. data/app/assets/stylesheets/css/breadcrumbs.css +6 -2
  7. data/app/assets/stylesheets/css/buttons.css +16 -0
  8. data/app/assets/stylesheets/css/fonts.css +42 -16
  9. data/app/assets/stylesheets/css/pagination.css +9 -9
  10. data/app/assets/stylesheets/css/search.css +18 -7
  11. data/app/assets/stylesheets/css/tooltips.css +1 -0
  12. data/app/assets/stylesheets/css/typography.css +4 -2
  13. data/app/assets/svgs/bell.svg +3 -0
  14. data/app/assets/svgs/dashboards-icon.svg +6 -0
  15. data/app/assets/svgs/detach.svg +8 -0
  16. data/app/assets/svgs/edit.svg +5 -1
  17. data/app/assets/svgs/grid-empty-state.svg +37 -0
  18. data/app/assets/svgs/grid-view-type.svg +5 -0
  19. data/app/assets/svgs/heroicons/outline/academic-cap.svg +5 -0
  20. data/app/assets/svgs/heroicons/outline/adjustments.svg +3 -0
  21. data/app/assets/svgs/heroicons/outline/annotation.svg +3 -0
  22. data/app/assets/svgs/heroicons/outline/archive.svg +3 -0
  23. data/app/assets/svgs/heroicons/outline/arrow-circle-down.svg +3 -0
  24. data/app/assets/svgs/heroicons/outline/arrow-circle-left.svg +3 -0
  25. data/app/assets/svgs/heroicons/outline/arrow-circle-right.svg +3 -0
  26. data/app/assets/svgs/heroicons/outline/arrow-circle-up.svg +3 -0
  27. data/app/assets/svgs/heroicons/outline/arrow-down.svg +3 -0
  28. data/app/assets/svgs/heroicons/outline/arrow-left.svg +3 -0
  29. data/app/assets/svgs/heroicons/outline/arrow-narrow-down.svg +3 -0
  30. data/app/assets/svgs/heroicons/outline/arrow-narrow-left.svg +3 -0
  31. data/app/assets/svgs/heroicons/outline/arrow-narrow-right.svg +3 -0
  32. data/app/assets/svgs/heroicons/outline/arrow-narrow-up.svg +3 -0
  33. data/app/assets/svgs/heroicons/outline/arrow-right.svg +3 -0
  34. data/app/assets/svgs/heroicons/outline/arrow-sm-down.svg +3 -0
  35. data/app/assets/svgs/heroicons/outline/arrow-sm-left.svg +3 -0
  36. data/app/assets/svgs/heroicons/outline/arrow-sm-right.svg +3 -0
  37. data/app/assets/svgs/heroicons/outline/arrow-sm-up.svg +3 -0
  38. data/app/assets/svgs/heroicons/outline/arrow-up.svg +3 -0
  39. data/app/assets/svgs/heroicons/outline/arrows-expand.svg +3 -0
  40. data/app/assets/svgs/heroicons/outline/at-symbol.svg +3 -0
  41. data/app/assets/svgs/heroicons/outline/backspace.svg +3 -0
  42. data/app/assets/svgs/heroicons/outline/badge-check.svg +3 -0
  43. data/app/assets/svgs/heroicons/outline/ban.svg +3 -0
  44. data/app/assets/svgs/heroicons/outline/beaker.svg +3 -0
  45. data/app/assets/svgs/heroicons/outline/bell.svg +3 -0
  46. data/app/assets/svgs/heroicons/outline/book-open.svg +3 -0
  47. data/app/assets/svgs/heroicons/outline/bookmark-alt.svg +3 -0
  48. data/app/assets/svgs/heroicons/outline/bookmark.svg +3 -0
  49. data/app/assets/svgs/heroicons/outline/briefcase.svg +3 -0
  50. data/app/assets/svgs/heroicons/outline/cake.svg +3 -0
  51. data/app/assets/svgs/heroicons/outline/calculator.svg +3 -0
  52. data/app/assets/svgs/heroicons/outline/calendar.svg +3 -0
  53. data/app/assets/svgs/heroicons/outline/camera.svg +4 -0
  54. data/app/assets/svgs/heroicons/outline/cash.svg +3 -0
  55. data/app/assets/svgs/heroicons/outline/chart-bar.svg +3 -0
  56. data/app/assets/svgs/heroicons/outline/chart-pie.svg +4 -0
  57. data/app/assets/svgs/heroicons/outline/chart-square-bar.svg +3 -0
  58. data/app/assets/svgs/heroicons/outline/chat-alt-2.svg +3 -0
  59. data/app/assets/svgs/heroicons/outline/chat-alt.svg +3 -0
  60. data/app/assets/svgs/heroicons/outline/chat.svg +3 -0
  61. data/app/assets/svgs/heroicons/outline/check-circle.svg +3 -0
  62. data/app/assets/svgs/heroicons/outline/check.svg +3 -0
  63. data/app/assets/svgs/heroicons/outline/chevron-double-down.svg +3 -0
  64. data/app/assets/svgs/heroicons/outline/chevron-double-left.svg +3 -0
  65. data/app/assets/svgs/heroicons/outline/chevron-double-right.svg +3 -0
  66. data/app/assets/svgs/heroicons/outline/chevron-double-up.svg +3 -0
  67. data/app/assets/svgs/heroicons/outline/chevron-down.svg +3 -0
  68. data/app/assets/svgs/heroicons/outline/chevron-left.svg +3 -0
  69. data/app/assets/svgs/heroicons/outline/chevron-right.svg +3 -0
  70. data/app/assets/svgs/heroicons/outline/chevron-up.svg +3 -0
  71. data/app/assets/svgs/heroicons/outline/chip.svg +3 -0
  72. data/app/assets/svgs/heroicons/outline/clipboard-check.svg +3 -0
  73. data/app/assets/svgs/heroicons/outline/clipboard-copy.svg +3 -0
  74. data/app/assets/svgs/heroicons/outline/clipboard-list.svg +3 -0
  75. data/app/assets/svgs/heroicons/outline/clipboard.svg +3 -0
  76. data/app/assets/svgs/heroicons/outline/clock.svg +3 -0
  77. data/app/assets/svgs/heroicons/outline/cloud-download.svg +3 -0
  78. data/app/assets/svgs/heroicons/outline/cloud-upload.svg +3 -0
  79. data/app/assets/svgs/heroicons/outline/cloud.svg +3 -0
  80. data/app/assets/svgs/heroicons/outline/code.svg +3 -0
  81. data/app/assets/svgs/heroicons/outline/cog.svg +4 -0
  82. data/app/assets/svgs/heroicons/outline/collection.svg +3 -0
  83. data/app/assets/svgs/heroicons/outline/color-swatch.svg +3 -0
  84. data/app/assets/svgs/heroicons/outline/credit-card.svg +3 -0
  85. data/app/assets/svgs/heroicons/outline/cube-transparent.svg +3 -0
  86. data/app/assets/svgs/heroicons/outline/cube.svg +3 -0
  87. data/app/assets/svgs/heroicons/outline/currency-bangladeshi.svg +3 -0
  88. data/app/assets/svgs/heroicons/outline/currency-dollar.svg +3 -0
  89. data/app/assets/svgs/heroicons/outline/currency-euro.svg +3 -0
  90. data/app/assets/svgs/heroicons/outline/currency-pound.svg +3 -0
  91. data/app/assets/svgs/heroicons/outline/currency-rupee.svg +3 -0
  92. data/app/assets/svgs/heroicons/outline/currency-yen.svg +3 -0
  93. data/app/assets/svgs/heroicons/outline/cursor-click.svg +3 -0
  94. data/app/assets/svgs/heroicons/outline/database.svg +3 -0
  95. data/app/assets/svgs/heroicons/outline/desktop-computer.svg +3 -0
  96. data/app/assets/svgs/heroicons/outline/device-mobile.svg +3 -0
  97. data/app/assets/svgs/heroicons/outline/device-tablet.svg +3 -0
  98. data/app/assets/svgs/heroicons/outline/document-add.svg +3 -0
  99. data/app/assets/svgs/heroicons/outline/document-download.svg +3 -0
  100. data/app/assets/svgs/heroicons/outline/document-duplicate.svg +3 -0
  101. data/app/assets/svgs/heroicons/outline/document-remove.svg +3 -0
  102. data/app/assets/svgs/heroicons/outline/document-report.svg +3 -0
  103. data/app/assets/svgs/heroicons/outline/document-search.svg +3 -0
  104. data/app/assets/svgs/heroicons/outline/document-text.svg +3 -0
  105. data/app/assets/svgs/heroicons/outline/document.svg +3 -0
  106. data/app/assets/svgs/heroicons/outline/dots-circle-horizontal.svg +3 -0
  107. data/app/assets/svgs/heroicons/outline/dots-horizontal.svg +3 -0
  108. data/app/assets/svgs/heroicons/outline/dots-vertical.svg +3 -0
  109. data/app/assets/svgs/heroicons/outline/download.svg +3 -0
  110. data/app/assets/svgs/heroicons/outline/duplicate.svg +3 -0
  111. data/app/assets/svgs/heroicons/outline/emoji-happy.svg +3 -0
  112. data/app/assets/svgs/heroicons/outline/emoji-sad.svg +3 -0
  113. data/app/assets/svgs/heroicons/outline/exclamation-circle.svg +3 -0
  114. data/app/assets/svgs/heroicons/outline/exclamation.svg +3 -0
  115. data/app/assets/svgs/heroicons/outline/external-link.svg +3 -0
  116. data/app/assets/svgs/heroicons/outline/eye-off.svg +3 -0
  117. data/app/assets/svgs/heroicons/outline/eye.svg +4 -0
  118. data/app/assets/svgs/heroicons/outline/fast-forward.svg +3 -0
  119. data/app/assets/svgs/heroicons/outline/film.svg +3 -0
  120. data/app/assets/svgs/heroicons/outline/filter.svg +3 -0
  121. data/app/assets/svgs/heroicons/outline/finger-print.svg +3 -0
  122. data/app/assets/svgs/heroicons/outline/fire.svg +4 -0
  123. data/app/assets/svgs/heroicons/outline/flag.svg +3 -0
  124. data/app/assets/svgs/heroicons/outline/folder-add.svg +3 -0
  125. data/app/assets/svgs/heroicons/outline/folder-download.svg +3 -0
  126. data/app/assets/svgs/heroicons/outline/folder-open.svg +3 -0
  127. data/app/assets/svgs/heroicons/outline/folder-remove.svg +3 -0
  128. data/app/assets/svgs/heroicons/outline/folder.svg +3 -0
  129. data/app/assets/svgs/heroicons/outline/gift.svg +3 -0
  130. data/app/assets/svgs/heroicons/outline/globe-alt.svg +3 -0
  131. data/app/assets/svgs/heroicons/outline/globe.svg +3 -0
  132. data/app/assets/svgs/heroicons/outline/hand.svg +3 -0
  133. data/app/assets/svgs/heroicons/outline/hashtag.svg +3 -0
  134. data/app/assets/svgs/heroicons/outline/heart.svg +3 -0
  135. data/app/assets/svgs/heroicons/outline/home.svg +3 -0
  136. data/app/assets/svgs/heroicons/outline/identification.svg +3 -0
  137. data/app/assets/svgs/heroicons/outline/inbox-in.svg +3 -0
  138. data/app/assets/svgs/heroicons/outline/inbox.svg +3 -0
  139. data/app/assets/svgs/heroicons/outline/information-circle.svg +3 -0
  140. data/app/assets/svgs/heroicons/outline/key.svg +3 -0
  141. data/app/assets/svgs/heroicons/outline/library.svg +3 -0
  142. data/app/assets/svgs/heroicons/outline/light-bulb.svg +3 -0
  143. data/app/assets/svgs/heroicons/outline/lightning-bolt.svg +3 -0
  144. data/app/assets/svgs/heroicons/outline/link.svg +3 -0
  145. data/app/assets/svgs/heroicons/outline/location-marker.svg +4 -0
  146. data/app/assets/svgs/heroicons/outline/lock-closed.svg +3 -0
  147. data/app/assets/svgs/heroicons/outline/lock-open.svg +3 -0
  148. data/app/assets/svgs/heroicons/outline/login.svg +3 -0
  149. data/app/assets/svgs/heroicons/outline/logout.svg +3 -0
  150. data/app/assets/svgs/heroicons/outline/mail-open.svg +3 -0
  151. data/app/assets/svgs/heroicons/outline/mail.svg +3 -0
  152. data/app/assets/svgs/heroicons/outline/map.svg +3 -0
  153. data/app/assets/svgs/heroicons/outline/menu-alt-1.svg +3 -0
  154. data/app/assets/svgs/heroicons/outline/menu-alt-2.svg +3 -0
  155. data/app/assets/svgs/heroicons/outline/menu-alt-3.svg +3 -0
  156. data/app/assets/svgs/heroicons/outline/menu-alt-4.svg +3 -0
  157. data/app/assets/svgs/heroicons/outline/menu.svg +3 -0
  158. data/app/assets/svgs/heroicons/outline/microphone.svg +3 -0
  159. data/app/assets/svgs/heroicons/outline/minus-circle.svg +3 -0
  160. data/app/assets/svgs/heroicons/outline/minus-sm.svg +3 -0
  161. data/app/assets/svgs/heroicons/outline/minus.svg +3 -0
  162. data/app/assets/svgs/heroicons/outline/moon.svg +3 -0
  163. data/app/assets/svgs/heroicons/outline/music-note.svg +3 -0
  164. data/app/assets/svgs/heroicons/outline/newspaper.svg +3 -0
  165. data/app/assets/svgs/heroicons/outline/office-building.svg +3 -0
  166. data/app/assets/svgs/heroicons/outline/paper-airplane.svg +3 -0
  167. data/app/assets/svgs/heroicons/outline/paper-clip.svg +3 -0
  168. data/app/assets/svgs/heroicons/outline/pause.svg +3 -0
  169. data/app/assets/svgs/heroicons/outline/pencil-alt.svg +3 -0
  170. data/app/assets/svgs/heroicons/outline/pencil.svg +3 -0
  171. data/app/assets/svgs/heroicons/outline/phone-incoming.svg +3 -0
  172. data/app/assets/svgs/heroicons/outline/phone-missed-call.svg +3 -0
  173. data/app/assets/svgs/heroicons/outline/phone-outgoing.svg +3 -0
  174. data/app/assets/svgs/heroicons/outline/phone.svg +3 -0
  175. data/app/assets/svgs/heroicons/outline/photograph.svg +3 -0
  176. data/app/assets/svgs/heroicons/outline/play.svg +4 -0
  177. data/app/assets/svgs/heroicons/outline/plus-circle.svg +3 -0
  178. data/app/assets/svgs/heroicons/outline/plus-sm.svg +3 -0
  179. data/app/assets/svgs/heroicons/outline/plus.svg +3 -0
  180. data/app/assets/svgs/heroicons/outline/presentation-chart-bar.svg +3 -0
  181. data/app/assets/svgs/heroicons/outline/presentation-chart-line.svg +3 -0
  182. data/app/assets/svgs/heroicons/outline/printer.svg +3 -0
  183. data/app/assets/svgs/heroicons/outline/puzzle.svg +3 -0
  184. data/app/assets/svgs/heroicons/outline/qrcode.svg +3 -0
  185. data/app/assets/svgs/heroicons/outline/question-mark-circle.svg +3 -0
  186. data/app/assets/svgs/heroicons/outline/receipt-refund.svg +3 -0
  187. data/app/assets/svgs/heroicons/outline/receipt-tax.svg +3 -0
  188. data/app/assets/svgs/heroicons/outline/refresh.svg +3 -0
  189. data/app/assets/svgs/heroicons/outline/reply.svg +3 -0
  190. data/app/assets/svgs/heroicons/outline/rewind.svg +3 -0
  191. data/app/assets/svgs/heroicons/outline/rss.svg +3 -0
  192. data/app/assets/svgs/heroicons/outline/save-as.svg +3 -0
  193. data/app/assets/svgs/heroicons/outline/save.svg +3 -0
  194. data/app/assets/svgs/heroicons/outline/scale.svg +3 -0
  195. data/app/assets/svgs/heroicons/outline/scissors.svg +3 -0
  196. data/app/assets/svgs/heroicons/outline/search-circle.svg +3 -0
  197. data/app/assets/svgs/heroicons/outline/search.svg +3 -0
  198. data/app/assets/svgs/heroicons/outline/selector.svg +3 -0
  199. data/app/assets/svgs/heroicons/outline/server.svg +3 -0
  200. data/app/assets/svgs/heroicons/outline/share.svg +3 -0
  201. data/app/assets/svgs/heroicons/outline/shield-check.svg +3 -0
  202. data/app/assets/svgs/heroicons/outline/shield-exclamation.svg +3 -0
  203. data/app/assets/svgs/heroicons/outline/shopping-bag.svg +3 -0
  204. data/app/assets/svgs/heroicons/outline/shopping-cart.svg +3 -0
  205. data/app/assets/svgs/heroicons/outline/sort-ascending.svg +3 -0
  206. data/app/assets/svgs/heroicons/outline/sort-descending.svg +3 -0
  207. data/app/assets/svgs/heroicons/outline/sparkles.svg +3 -0
  208. data/app/assets/svgs/heroicons/outline/speakerphone.svg +3 -0
  209. data/app/assets/svgs/heroicons/outline/star.svg +3 -0
  210. data/app/assets/svgs/heroicons/outline/status-offline.svg +3 -0
  211. data/app/assets/svgs/heroicons/outline/status-online.svg +3 -0
  212. data/app/assets/svgs/heroicons/outline/stop.svg +4 -0
  213. data/app/assets/svgs/heroicons/outline/sun.svg +3 -0
  214. data/app/assets/svgs/heroicons/outline/support.svg +3 -0
  215. data/app/assets/svgs/heroicons/outline/switch-horizontal.svg +3 -0
  216. data/app/assets/svgs/heroicons/outline/switch-vertical.svg +3 -0
  217. data/app/assets/svgs/heroicons/outline/table.svg +3 -0
  218. data/app/assets/svgs/heroicons/outline/tag.svg +3 -0
  219. data/app/assets/svgs/heroicons/outline/template.svg +3 -0
  220. data/app/assets/svgs/heroicons/outline/terminal.svg +3 -0
  221. data/app/assets/svgs/heroicons/outline/thumb-down.svg +3 -0
  222. data/app/assets/svgs/heroicons/outline/thumb-up.svg +3 -0
  223. data/app/assets/svgs/heroicons/outline/ticket.svg +3 -0
  224. data/app/assets/svgs/heroicons/outline/translate.svg +3 -0
  225. data/app/assets/svgs/heroicons/outline/trash.svg +3 -0
  226. data/app/assets/svgs/heroicons/outline/trending-down.svg +3 -0
  227. data/app/assets/svgs/heroicons/outline/trending-up.svg +3 -0
  228. data/app/assets/svgs/heroicons/outline/truck.svg +4 -0
  229. data/app/assets/svgs/heroicons/outline/upload.svg +3 -0
  230. data/app/assets/svgs/heroicons/outline/user-add.svg +3 -0
  231. data/app/assets/svgs/heroicons/outline/user-circle.svg +3 -0
  232. data/app/assets/svgs/heroicons/outline/user-group.svg +3 -0
  233. data/app/assets/svgs/heroicons/outline/user-remove.svg +3 -0
  234. data/app/assets/svgs/heroicons/outline/user.svg +3 -0
  235. data/app/assets/svgs/heroicons/outline/users.svg +3 -0
  236. data/app/assets/svgs/heroicons/outline/variable.svg +3 -0
  237. data/app/assets/svgs/heroicons/outline/video-camera.svg +3 -0
  238. data/app/assets/svgs/heroicons/outline/view-boards.svg +3 -0
  239. data/app/assets/svgs/heroicons/outline/view-grid-add.svg +3 -0
  240. data/app/assets/svgs/heroicons/outline/view-grid.svg +3 -0
  241. data/app/assets/svgs/heroicons/outline/view-list.svg +3 -0
  242. data/app/assets/svgs/heroicons/outline/volume-off.svg +4 -0
  243. data/app/assets/svgs/heroicons/outline/volume-up.svg +3 -0
  244. data/app/assets/svgs/heroicons/outline/wifi.svg +3 -0
  245. data/app/assets/svgs/heroicons/outline/x-circle.svg +3 -0
  246. data/app/assets/svgs/heroicons/outline/x.svg +3 -0
  247. data/app/assets/svgs/heroicons/outline/zoom-in.svg +3 -0
  248. data/app/assets/svgs/heroicons/outline/zoom-out.svg +3 -0
  249. data/app/assets/svgs/heroicons/solid/academic-cap.svg +3 -0
  250. data/app/assets/svgs/heroicons/solid/adjustments.svg +3 -0
  251. data/app/assets/svgs/heroicons/solid/annotation.svg +3 -0
  252. data/app/assets/svgs/heroicons/solid/archive.svg +4 -0
  253. data/app/assets/svgs/heroicons/solid/arrow-circle-down.svg +3 -0
  254. data/app/assets/svgs/heroicons/solid/arrow-circle-left.svg +3 -0
  255. data/app/assets/svgs/heroicons/solid/arrow-circle-right.svg +3 -0
  256. data/app/assets/svgs/heroicons/solid/arrow-circle-up.svg +3 -0
  257. data/app/assets/svgs/heroicons/solid/arrow-down.svg +3 -0
  258. data/app/assets/svgs/heroicons/solid/arrow-left.svg +3 -0
  259. data/app/assets/svgs/heroicons/solid/arrow-narrow-down.svg +3 -0
  260. data/app/assets/svgs/heroicons/solid/arrow-narrow-left.svg +3 -0
  261. data/app/assets/svgs/heroicons/solid/arrow-narrow-right.svg +3 -0
  262. data/app/assets/svgs/heroicons/solid/arrow-narrow-up.svg +3 -0
  263. data/app/assets/svgs/heroicons/solid/arrow-right.svg +3 -0
  264. data/app/assets/svgs/heroicons/solid/arrow-sm-down.svg +3 -0
  265. data/app/assets/svgs/heroicons/solid/arrow-sm-left.svg +3 -0
  266. data/app/assets/svgs/heroicons/solid/arrow-sm-right.svg +3 -0
  267. data/app/assets/svgs/heroicons/solid/arrow-sm-up.svg +3 -0
  268. data/app/assets/svgs/heroicons/solid/arrow-up.svg +3 -0
  269. data/app/assets/svgs/heroicons/solid/arrows-expand.svg +3 -0
  270. data/app/assets/svgs/heroicons/solid/at-symbol.svg +3 -0
  271. data/app/assets/svgs/heroicons/solid/backspace.svg +3 -0
  272. data/app/assets/svgs/heroicons/solid/badge-check.svg +3 -0
  273. data/app/assets/svgs/heroicons/solid/ban.svg +3 -0
  274. data/app/assets/svgs/heroicons/solid/beaker.svg +3 -0
  275. data/app/assets/svgs/heroicons/solid/bell.svg +3 -0
  276. data/app/assets/svgs/heroicons/solid/book-open.svg +3 -0
  277. data/app/assets/svgs/heroicons/solid/bookmark-alt.svg +3 -0
  278. data/app/assets/svgs/heroicons/solid/bookmark.svg +3 -0
  279. data/app/assets/svgs/heroicons/solid/briefcase.svg +4 -0
  280. data/app/assets/svgs/heroicons/solid/cake.svg +3 -0
  281. data/app/assets/svgs/heroicons/solid/calculator.svg +3 -0
  282. data/app/assets/svgs/heroicons/solid/calendar.svg +3 -0
  283. data/app/assets/svgs/heroicons/solid/camera.svg +3 -0
  284. data/app/assets/svgs/heroicons/solid/cash.svg +3 -0
  285. data/app/assets/svgs/heroicons/solid/chart-bar.svg +3 -0
  286. data/app/assets/svgs/heroicons/solid/chart-pie.svg +4 -0
  287. data/app/assets/svgs/heroicons/solid/chart-square-bar.svg +3 -0
  288. data/app/assets/svgs/heroicons/solid/chat-alt-2.svg +4 -0
  289. data/app/assets/svgs/heroicons/solid/chat-alt.svg +3 -0
  290. data/app/assets/svgs/heroicons/solid/chat.svg +3 -0
  291. data/app/assets/svgs/heroicons/solid/check-circle.svg +3 -0
  292. data/app/assets/svgs/heroicons/solid/check.svg +3 -0
  293. data/app/assets/svgs/heroicons/solid/chevron-double-down.svg +3 -0
  294. data/app/assets/svgs/heroicons/solid/chevron-double-left.svg +3 -0
  295. data/app/assets/svgs/heroicons/solid/chevron-double-right.svg +4 -0
  296. data/app/assets/svgs/heroicons/solid/chevron-double-up.svg +3 -0
  297. data/app/assets/svgs/heroicons/solid/chevron-down.svg +3 -0
  298. data/app/assets/svgs/heroicons/solid/chevron-left.svg +3 -0
  299. data/app/assets/svgs/heroicons/solid/chevron-right.svg +3 -0
  300. data/app/assets/svgs/heroicons/solid/chevron-up.svg +3 -0
  301. data/app/assets/svgs/heroicons/solid/chip.svg +4 -0
  302. data/app/assets/svgs/heroicons/solid/clipboard-check.svg +4 -0
  303. data/app/assets/svgs/heroicons/solid/clipboard-copy.svg +4 -0
  304. data/app/assets/svgs/heroicons/solid/clipboard-list.svg +4 -0
  305. data/app/assets/svgs/heroicons/solid/clipboard.svg +4 -0
  306. data/app/assets/svgs/heroicons/solid/clock.svg +3 -0
  307. data/app/assets/svgs/heroicons/solid/cloud-download.svg +3 -0
  308. data/app/assets/svgs/heroicons/solid/cloud-upload.svg +4 -0
  309. data/app/assets/svgs/heroicons/solid/cloud.svg +3 -0
  310. data/app/assets/svgs/heroicons/solid/code.svg +3 -0
  311. data/app/assets/svgs/heroicons/solid/cog.svg +3 -0
  312. data/app/assets/svgs/heroicons/solid/collection.svg +3 -0
  313. data/app/assets/svgs/heroicons/solid/color-swatch.svg +3 -0
  314. data/app/assets/svgs/heroicons/solid/credit-card.svg +4 -0
  315. data/app/assets/svgs/heroicons/solid/cube-transparent.svg +3 -0
  316. data/app/assets/svgs/heroicons/solid/cube.svg +3 -0
  317. data/app/assets/svgs/heroicons/solid/currency-bangladeshi.svg +3 -0
  318. data/app/assets/svgs/heroicons/solid/currency-dollar.svg +4 -0
  319. data/app/assets/svgs/heroicons/solid/currency-euro.svg +3 -0
  320. data/app/assets/svgs/heroicons/solid/currency-pound.svg +3 -0
  321. data/app/assets/svgs/heroicons/solid/currency-rupee.svg +3 -0
  322. data/app/assets/svgs/heroicons/solid/currency-yen.svg +3 -0
  323. data/app/assets/svgs/heroicons/solid/cursor-click.svg +3 -0
  324. data/app/assets/svgs/heroicons/solid/database.svg +5 -0
  325. data/app/assets/svgs/heroicons/solid/desktop-computer.svg +3 -0
  326. data/app/assets/svgs/heroicons/solid/device-mobile.svg +3 -0
  327. data/app/assets/svgs/heroicons/solid/device-tablet.svg +3 -0
  328. data/app/assets/svgs/heroicons/solid/document-add.svg +3 -0
  329. data/app/assets/svgs/heroicons/solid/document-download.svg +3 -0
  330. data/app/assets/svgs/heroicons/solid/document-duplicate.svg +4 -0
  331. data/app/assets/svgs/heroicons/solid/document-remove.svg +3 -0
  332. data/app/assets/svgs/heroicons/solid/document-report.svg +3 -0
  333. data/app/assets/svgs/heroicons/solid/document-search.svg +4 -0
  334. data/app/assets/svgs/heroicons/solid/document-text.svg +3 -0
  335. data/app/assets/svgs/heroicons/solid/document.svg +3 -0
  336. data/app/assets/svgs/heroicons/solid/dots-circle-horizontal.svg +3 -0
  337. data/app/assets/svgs/heroicons/solid/dots-horizontal.svg +3 -0
  338. data/app/assets/svgs/heroicons/solid/dots-vertical.svg +3 -0
  339. data/app/assets/svgs/heroicons/solid/download.svg +3 -0
  340. data/app/assets/svgs/heroicons/solid/duplicate.svg +4 -0
  341. data/app/assets/svgs/heroicons/solid/emoji-happy.svg +3 -0
  342. data/app/assets/svgs/heroicons/solid/emoji-sad.svg +3 -0
  343. data/app/assets/svgs/heroicons/solid/exclamation-circle.svg +3 -0
  344. data/app/assets/svgs/heroicons/solid/exclamation.svg +3 -0
  345. data/app/assets/svgs/heroicons/solid/external-link.svg +4 -0
  346. data/app/assets/svgs/heroicons/solid/eye-off.svg +4 -0
  347. data/app/assets/svgs/heroicons/solid/eye.svg +4 -0
  348. data/app/assets/svgs/heroicons/solid/fast-forward.svg +3 -0
  349. data/app/assets/svgs/heroicons/solid/film.svg +3 -0
  350. data/app/assets/svgs/heroicons/solid/filter.svg +3 -0
  351. data/app/assets/svgs/heroicons/solid/finger-print.svg +5 -0
  352. data/app/assets/svgs/heroicons/solid/fire.svg +3 -0
  353. data/app/assets/svgs/heroicons/solid/flag.svg +3 -0
  354. data/app/assets/svgs/heroicons/solid/folder-add.svg +3 -0
  355. data/app/assets/svgs/heroicons/solid/folder-download.svg +3 -0
  356. data/app/assets/svgs/heroicons/solid/folder-open.svg +4 -0
  357. data/app/assets/svgs/heroicons/solid/folder-remove.svg +3 -0
  358. data/app/assets/svgs/heroicons/solid/folder.svg +3 -0
  359. data/app/assets/svgs/heroicons/solid/gift.svg +4 -0
  360. data/app/assets/svgs/heroicons/solid/globe-alt.svg +3 -0
  361. data/app/assets/svgs/heroicons/solid/globe.svg +3 -0
  362. data/app/assets/svgs/heroicons/solid/hand.svg +3 -0
  363. data/app/assets/svgs/heroicons/solid/hashtag.svg +3 -0
  364. data/app/assets/svgs/heroicons/solid/heart.svg +3 -0
  365. data/app/assets/svgs/heroicons/solid/home.svg +3 -0
  366. data/app/assets/svgs/heroicons/solid/identification.svg +3 -0
  367. data/app/assets/svgs/heroicons/solid/inbox-in.svg +4 -0
  368. data/app/assets/svgs/heroicons/solid/inbox.svg +3 -0
  369. data/app/assets/svgs/heroicons/solid/information-circle.svg +3 -0
  370. data/app/assets/svgs/heroicons/solid/key.svg +3 -0
  371. data/app/assets/svgs/heroicons/solid/library.svg +3 -0
  372. data/app/assets/svgs/heroicons/solid/light-bulb.svg +3 -0
  373. data/app/assets/svgs/heroicons/solid/lightning-bolt.svg +3 -0
  374. data/app/assets/svgs/heroicons/solid/link.svg +3 -0
  375. data/app/assets/svgs/heroicons/solid/location-marker.svg +3 -0
  376. data/app/assets/svgs/heroicons/solid/lock-closed.svg +3 -0
  377. data/app/assets/svgs/heroicons/solid/lock-open.svg +3 -0
  378. data/app/assets/svgs/heroicons/solid/login.svg +3 -0
  379. data/app/assets/svgs/heroicons/solid/logout.svg +3 -0
  380. data/app/assets/svgs/heroicons/solid/mail-open.svg +3 -0
  381. data/app/assets/svgs/heroicons/solid/mail.svg +4 -0
  382. data/app/assets/svgs/heroicons/solid/map.svg +3 -0
  383. data/app/assets/svgs/heroicons/solid/menu-alt-1.svg +3 -0
  384. data/app/assets/svgs/heroicons/solid/menu-alt-2.svg +3 -0
  385. data/app/assets/svgs/heroicons/solid/menu-alt-3.svg +3 -0
  386. data/app/assets/svgs/heroicons/solid/menu-alt-4.svg +3 -0
  387. data/app/assets/svgs/heroicons/solid/menu.svg +3 -0
  388. data/app/assets/svgs/heroicons/solid/microphone.svg +3 -0
  389. data/app/assets/svgs/heroicons/solid/minus-circle.svg +3 -0
  390. data/app/assets/svgs/heroicons/solid/minus-sm.svg +3 -0
  391. data/app/assets/svgs/heroicons/solid/minus.svg +3 -0
  392. data/app/assets/svgs/heroicons/solid/moon.svg +3 -0
  393. data/app/assets/svgs/heroicons/solid/music-note.svg +3 -0
  394. data/app/assets/svgs/heroicons/solid/newspaper.svg +4 -0
  395. data/app/assets/svgs/heroicons/solid/office-building.svg +3 -0
  396. data/app/assets/svgs/heroicons/solid/paper-airplane.svg +3 -0
  397. data/app/assets/svgs/heroicons/solid/paper-clip.svg +3 -0
  398. data/app/assets/svgs/heroicons/solid/pause.svg +3 -0
  399. data/app/assets/svgs/heroicons/solid/pencil-alt.svg +4 -0
  400. data/app/assets/svgs/heroicons/solid/pencil.svg +3 -0
  401. data/app/assets/svgs/heroicons/solid/phone-incoming.svg +4 -0
  402. data/app/assets/svgs/heroicons/solid/phone-missed-call.svg +4 -0
  403. data/app/assets/svgs/heroicons/solid/phone-outgoing.svg +4 -0
  404. data/app/assets/svgs/heroicons/solid/phone.svg +3 -0
  405. data/app/assets/svgs/heroicons/solid/photograph.svg +3 -0
  406. data/app/assets/svgs/heroicons/solid/play.svg +3 -0
  407. data/app/assets/svgs/heroicons/solid/plus-circle.svg +3 -0
  408. data/app/assets/svgs/heroicons/solid/plus-sm.svg +3 -0
  409. data/app/assets/svgs/heroicons/solid/plus.svg +3 -0
  410. data/app/assets/svgs/heroicons/solid/presentation-chart-bar.svg +3 -0
  411. data/app/assets/svgs/heroicons/solid/presentation-chart-line.svg +3 -0
  412. data/app/assets/svgs/heroicons/solid/printer.svg +3 -0
  413. data/app/assets/svgs/heroicons/solid/puzzle.svg +3 -0
  414. data/app/assets/svgs/heroicons/solid/qrcode.svg +4 -0
  415. data/app/assets/svgs/heroicons/solid/question-mark-circle.svg +3 -0
  416. data/app/assets/svgs/heroicons/solid/receipt-refund.svg +3 -0
  417. data/app/assets/svgs/heroicons/solid/receipt-tax.svg +3 -0
  418. data/app/assets/svgs/heroicons/solid/refresh.svg +3 -0
  419. data/app/assets/svgs/heroicons/solid/reply.svg +3 -0
  420. data/app/assets/svgs/heroicons/solid/rewind.svg +3 -0
  421. data/app/assets/svgs/heroicons/solid/rss.svg +4 -0
  422. data/app/assets/svgs/heroicons/solid/save-as.svg +4 -0
  423. data/app/assets/svgs/heroicons/solid/save.svg +3 -0
  424. data/app/assets/svgs/heroicons/solid/scale.svg +3 -0
  425. data/app/assets/svgs/heroicons/solid/scissors.svg +4 -0
  426. data/app/assets/svgs/heroicons/solid/search-circle.svg +4 -0
  427. data/app/assets/svgs/heroicons/solid/search.svg +3 -0
  428. data/app/assets/svgs/heroicons/solid/selector.svg +3 -0
  429. data/app/assets/svgs/heroicons/solid/server.svg +3 -0
  430. data/app/assets/svgs/heroicons/solid/share.svg +3 -0
  431. data/app/assets/svgs/heroicons/solid/shield-check.svg +3 -0
  432. data/app/assets/svgs/heroicons/solid/shield-exclamation.svg +3 -0
  433. data/app/assets/svgs/heroicons/solid/shopping-bag.svg +3 -0
  434. data/app/assets/svgs/heroicons/solid/shopping-cart.svg +3 -0
  435. data/app/assets/svgs/heroicons/solid/sort-ascending.svg +3 -0
  436. data/app/assets/svgs/heroicons/solid/sort-descending.svg +3 -0
  437. data/app/assets/svgs/heroicons/solid/sparkles.svg +3 -0
  438. data/app/assets/svgs/heroicons/solid/speakerphone.svg +3 -0
  439. data/app/assets/svgs/heroicons/solid/star.svg +3 -0
  440. data/app/assets/svgs/heroicons/solid/status-offline.svg +3 -0
  441. data/app/assets/svgs/heroicons/solid/status-online.svg +3 -0
  442. data/app/assets/svgs/heroicons/solid/stop.svg +3 -0
  443. data/app/assets/svgs/heroicons/solid/sun.svg +3 -0
  444. data/app/assets/svgs/heroicons/solid/support.svg +3 -0
  445. data/app/assets/svgs/heroicons/solid/switch-horizontal.svg +3 -0
  446. data/app/assets/svgs/heroicons/solid/switch-vertical.svg +3 -0
  447. data/app/assets/svgs/heroicons/solid/table.svg +3 -0
  448. data/app/assets/svgs/heroicons/solid/tag.svg +3 -0
  449. data/app/assets/svgs/heroicons/solid/template.svg +3 -0
  450. data/app/assets/svgs/heroicons/solid/terminal.svg +3 -0
  451. data/app/assets/svgs/heroicons/solid/thumb-down.svg +3 -0
  452. data/app/assets/svgs/heroicons/solid/thumb-up.svg +3 -0
  453. data/app/assets/svgs/heroicons/solid/ticket.svg +3 -0
  454. data/app/assets/svgs/heroicons/solid/translate.svg +3 -0
  455. data/app/assets/svgs/heroicons/solid/trash.svg +3 -0
  456. data/app/assets/svgs/heroicons/solid/trending-down.svg +3 -0
  457. data/app/assets/svgs/heroicons/solid/trending-up.svg +3 -0
  458. data/app/assets/svgs/heroicons/solid/truck.svg +4 -0
  459. data/app/assets/svgs/heroicons/solid/upload.svg +3 -0
  460. data/app/assets/svgs/heroicons/solid/user-add.svg +3 -0
  461. data/app/assets/svgs/heroicons/solid/user-circle.svg +3 -0
  462. data/app/assets/svgs/heroicons/solid/user-group.svg +3 -0
  463. data/app/assets/svgs/heroicons/solid/user-remove.svg +3 -0
  464. data/app/assets/svgs/heroicons/solid/user.svg +3 -0
  465. data/app/assets/svgs/heroicons/solid/users.svg +3 -0
  466. data/app/assets/svgs/heroicons/solid/variable.svg +3 -0
  467. data/app/assets/svgs/heroicons/solid/video-camera.svg +3 -0
  468. data/app/assets/svgs/heroicons/solid/view-boards.svg +3 -0
  469. data/app/assets/svgs/heroicons/solid/view-grid-add.svg +3 -0
  470. data/app/assets/svgs/heroicons/solid/view-grid.svg +3 -0
  471. data/app/assets/svgs/heroicons/solid/view-list.svg +3 -0
  472. data/app/assets/svgs/heroicons/solid/volume-off.svg +3 -0
  473. data/app/assets/svgs/heroicons/solid/volume-up.svg +3 -0
  474. data/app/assets/svgs/heroicons/solid/wifi.svg +3 -0
  475. data/app/assets/svgs/{x-circle-sm.svg → heroicons/solid/x-circle.svg} +2 -2
  476. data/app/assets/svgs/heroicons/solid/x.svg +3 -0
  477. data/app/assets/svgs/heroicons/solid/zoom-in.svg +4 -0
  478. data/app/assets/svgs/heroicons/solid/zoom-out.svg +4 -0
  479. data/app/assets/svgs/logout.svg +3 -0
  480. data/app/assets/svgs/menu-back.svg +4 -0
  481. data/app/assets/svgs/menu.svg +3 -0
  482. data/app/assets/svgs/resources-icon.svg +13 -0
  483. data/app/assets/svgs/save.svg +8 -1
  484. data/app/assets/svgs/table-empty-state.svg +57 -0
  485. data/app/assets/svgs/table-view-type.svg +6 -0
  486. data/app/assets/svgs/three-dots.svg +5 -0
  487. data/app/assets/svgs/tools-icon.svg +3 -0
  488. data/app/assets/svgs/trash.svg +7 -1
  489. data/app/assets/svgs/user-circle.svg +3 -0
  490. data/app/components/avo/actions_component.html.erb +43 -0
  491. data/app/components/avo/actions_component.rb +14 -0
  492. data/app/components/avo/alert_component.html.erb +25 -1
  493. data/app/components/avo/alert_component.rb +24 -0
  494. data/app/components/avo/blank_field_component.html.erb +0 -0
  495. data/app/components/avo/blank_field_component.rb +4 -0
  496. data/app/components/avo/button_component.html.erb +1 -0
  497. data/app/components/avo/button_component.rb +143 -0
  498. data/app/components/avo/card_component.html.erb +40 -0
  499. data/app/components/avo/card_component.rb +11 -0
  500. data/app/components/avo/common_field_wrapper_component.html.erb +15 -0
  501. data/app/components/avo/common_field_wrapper_component.rb +20 -0
  502. data/app/components/avo/dashboards/divider_component.html.erb +9 -0
  503. data/app/components/avo/dashboards/divider_component.rb +19 -0
  504. data/app/components/avo/edit/field_wrapper_component.html.erb +10 -19
  505. data/app/components/avo/edit/field_wrapper_component.rb +0 -8
  506. data/app/components/avo/empty_state_component.html.erb +12 -0
  507. data/app/components/avo/empty_state_component.rb +24 -0
  508. data/app/components/avo/fields/badge_field/index_component.html.erb +1 -1
  509. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +2 -1
  510. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  511. data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
  512. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +1 -1
  513. data/app/components/avo/fields/common/boolean_check_component.html.erb +4 -4
  514. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  515. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +2 -2
  516. data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
  517. data/app/components/avo/fields/common/heading_component.html.erb +2 -2
  518. data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
  519. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +42 -23
  520. data/app/components/avo/fields/common/single_file_viewer_component.rb +34 -6
  521. data/app/components/avo/fields/common/status_viewer_component.html.erb +2 -2
  522. data/app/components/avo/fields/external_image_field/index_component.html.erb +2 -3
  523. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  524. data/app/components/avo/fields/file_field/index_component.html.erb +3 -3
  525. data/app/components/avo/fields/file_field/index_component.rb +11 -0
  526. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  527. data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
  528. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  529. data/app/components/avo/fields/has_one_field/show_component.html.erb +4 -4
  530. data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
  531. data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
  532. data/app/components/avo/fields/progress_bar_field/index_component.html.erb +1 -1
  533. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -0
  534. data/app/components/avo/filters_component.html.erb +37 -0
  535. data/app/components/avo/filters_component.rb +14 -0
  536. data/app/components/avo/{alerts_component.html.erb → flash_alerts_component.html.erb} +1 -1
  537. data/app/components/avo/flash_alerts_component.rb +9 -0
  538. data/app/components/avo/index/field_wrapper_component.html.erb +8 -2
  539. data/app/components/avo/index/field_wrapper_component.rb +13 -1
  540. data/app/components/avo/index/grid_item_component.html.erb +13 -10
  541. data/app/components/avo/index/ordering/buttons_component.rb +2 -0
  542. data/app/components/avo/index/resource_controls_component.html.erb +11 -6
  543. data/app/components/avo/index/resource_grid_component.html.erb +3 -3
  544. data/app/components/avo/index/resource_table_component.html.erb +10 -14
  545. data/app/components/avo/index/table_row_component.html.erb +1 -1
  546. data/app/components/avo/modal_component.html.erb +9 -7
  547. data/app/{views/avo/partials/_paginator.html.erb → components/avo/paginator_component.html.erb} +16 -16
  548. data/app/components/avo/paginator_component.rb +17 -0
  549. data/app/components/avo/panel_component.html.erb +29 -17
  550. data/app/components/avo/panel_component.rb +17 -2
  551. data/app/components/avo/profile_item_component.html.erb +3 -0
  552. data/app/components/avo/profile_item_component.rb +11 -0
  553. data/app/components/avo/referrer_params_component.html.erb +4 -0
  554. data/app/components/avo/referrer_params_component.rb +9 -0
  555. data/app/components/avo/resource_component.rb +1 -1
  556. data/app/components/avo/show/field_wrapper_component.html.erb +8 -15
  557. data/app/components/avo/show/field_wrapper_component.rb +0 -4
  558. data/app/components/avo/sidebar_component.html.erb +51 -0
  559. data/app/components/avo/sidebar_component.rb +21 -0
  560. data/app/components/avo/sidebar_heading_component.html.erb +3 -0
  561. data/app/components/avo/sidebar_heading_component.rb +11 -0
  562. data/app/components/avo/sidebar_item_component.html.erb +3 -0
  563. data/app/components/avo/sidebar_item_component.rb +10 -0
  564. data/app/components/avo/sidebar_profile_component.html.erb +36 -0
  565. data/app/components/avo/sidebar_profile_component.rb +43 -0
  566. data/app/components/avo/turbo_frame_wrapper_component.html.erb +8 -9
  567. data/app/components/avo/views/resource_edit_component.html.erb +27 -17
  568. data/app/components/avo/views/resource_index_component.html.erb +44 -35
  569. data/app/components/avo/views/resource_new_component.html.erb +31 -16
  570. data/app/components/avo/views/resource_show_component.html.erb +37 -34
  571. data/app/components/avo/views/resource_show_component.rb +2 -3
  572. data/app/controllers/avo/application_controller.rb +44 -13
  573. data/app/controllers/avo/{relations_controller.rb → associations_controller.rb} +1 -3
  574. data/app/controllers/avo/attachments_controller.rb +1 -5
  575. data/app/controllers/avo/base_controller.rb +75 -49
  576. data/app/controllers/avo/dashboards_controller.rb +28 -0
  577. data/app/controllers/avo/private_controller.rb +8 -0
  578. data/app/controllers/avo/search_controller.rb +5 -1
  579. data/app/helpers/avo/application_helper.rb +29 -47
  580. data/app/helpers/avo/resources_helper.rb +2 -2
  581. data/app/helpers/avo/url_helpers.rb +3 -3
  582. data/app/javascript/avo.js +26 -5
  583. data/app/javascript/js/application.js +2 -1
  584. data/app/javascript/js/controllers/actions_picker_controller.js +12 -10
  585. data/app/javascript/js/controllers/dashboard_card_controller.js +33 -0
  586. data/app/javascript/js/controllers/item_selector_controller.js +8 -4
  587. data/app/javascript/js/controllers/mobile_controller.js +9 -0
  588. data/app/javascript/js/controllers/select_controller.js +23 -0
  589. data/app/javascript/js/controllers.js +6 -0
  590. data/app/views/avo/actions/show.html.erb +23 -17
  591. data/app/views/avo/{relations → associations}/new.html.erb +17 -6
  592. data/app/views/avo/base/_multiple_select_filter.html.erb +5 -1
  593. data/app/views/avo/base/_text_filter.html.erb +3 -1
  594. data/app/views/avo/base/show.html.erb +1 -1
  595. data/app/views/avo/dashboards/_chartkick_card.html.erb +3 -0
  596. data/app/views/avo/dashboards/_metric_card.html.erb +5 -0
  597. data/app/views/avo/dashboards/card.html.erb +3 -0
  598. data/app/views/avo/dashboards/show.html.erb +35 -0
  599. data/app/views/avo/home/failed_to_load.html.erb +21 -1
  600. data/app/views/avo/home/index.html.erb +1 -5
  601. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  602. data/app/views/avo/partials/_global_search.html.erb +3 -3
  603. data/app/views/avo/partials/_header.html.erb +1 -1
  604. data/app/views/avo/partials/_logo.html.erb +1 -1
  605. data/app/views/avo/partials/_navbar.html.erb +11 -0
  606. data/app/views/avo/partials/_resource_search.html.erb +1 -1
  607. data/app/views/avo/partials/_sortable_component.html.erb +1 -1
  608. data/app/views/avo/partials/_table_header.html.erb +4 -4
  609. data/app/views/avo/partials/_view_toggle_button.html.erb +36 -16
  610. data/app/views/avo/private/_links_and_buttons.html.erb +57 -0
  611. data/app/views/avo/private/design.html.erb +27 -0
  612. data/app/views/layouts/avo/application.html.erb +26 -30
  613. data/avo.gemspec +4 -2
  614. data/bin/dev +7 -6
  615. data/config/routes.rb +19 -11
  616. data/lib/avo/app.rb +38 -4
  617. data/lib/avo/base_action.rb +4 -4
  618. data/lib/avo/base_resource.rb +31 -10
  619. data/lib/avo/configuration.rb +2 -0
  620. data/lib/avo/dashboards/base_card.rb +151 -0
  621. data/lib/avo/dashboards/base_dashboard.rb +71 -0
  622. data/lib/avo/dashboards/base_divider.rb +23 -0
  623. data/lib/avo/dashboards/chartkick_card.rb +77 -0
  624. data/lib/avo/dashboards/metric_card.rb +9 -0
  625. data/lib/avo/dashboards/partial_card.rb +7 -0
  626. data/lib/avo/dynamic_router.rb +3 -0
  627. data/lib/avo/engine.rb +5 -1
  628. data/lib/avo/fields/base_field.rb +19 -6
  629. data/lib/avo/fields/belongs_to_field.rb +1 -1
  630. data/lib/avo/fields/external_image_field.rb +2 -2
  631. data/lib/avo/fields/gravatar_field.rb +2 -2
  632. data/lib/avo/hosts/dashboard_card.rb +21 -0
  633. data/lib/avo/hosts/dashboard_visibility.rb +19 -0
  634. data/lib/avo/hosts/ordering.rb +1 -1
  635. data/lib/avo/licensing/license.rb +4 -2
  636. data/lib/avo/licensing/pro_license.rb +3 -1
  637. data/lib/avo/version.rb +1 -1
  638. data/lib/avo.rb +24 -0
  639. data/lib/generators/avo/chartkick_card_generator.rb +16 -0
  640. data/lib/generators/avo/dashboard_generator.rb +16 -0
  641. data/lib/generators/avo/metric_card_generator.rb +16 -0
  642. data/lib/generators/avo/partial_card_generator.rb +17 -0
  643. data/lib/generators/avo/templates/cards/chartkick_card.tt +16 -0
  644. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +26 -0
  645. data/lib/generators/avo/templates/cards/metric_card.tt +8 -0
  646. data/lib/generators/avo/templates/cards/metric_card_sample.tt +38 -0
  647. data/lib/generators/avo/templates/cards/partial_card.tt +8 -0
  648. data/lib/generators/avo/templates/cards/partial_card_partial.tt +8 -0
  649. data/lib/generators/avo/templates/cards/partial_card_sample.tt +8 -0
  650. data/lib/generators/avo/templates/dashboards/dashboard.tt +12 -0
  651. data/lib/generators/avo/templates/locales/avo.en.yml +11 -4
  652. data/lib/generators/avo/templates/locales/avo.nb-NO.yml +5 -2
  653. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +4 -2
  654. data/lib/generators/avo/templates/locales/avo.ro.yml +4 -1
  655. data/lib/generators/avo/templates/tool/sidebar_item.tt +1 -1
  656. data/public/avo-assets/avo.css +1322 -1127
  657. data/public/avo-assets/avo.js +346 -88687
  658. data/public/avo-assets/avo.js.map +3 -3
  659. data/public/avo-assets/fonts/inter-v7-latin-500.eot +0 -0
  660. data/public/avo-assets/fonts/inter-v7-latin-500.svg +351 -0
  661. data/public/avo-assets/fonts/inter-v7-latin-500.ttf +0 -0
  662. data/public/avo-assets/fonts/inter-v7-latin-500.woff +0 -0
  663. data/public/avo-assets/fonts/inter-v7-latin-500.woff2 +0 -0
  664. data/public/avo-assets/fonts/inter-v7-latin-600.eot +0 -0
  665. data/public/avo-assets/fonts/inter-v7-latin-600.svg +351 -0
  666. data/public/avo-assets/fonts/inter-v7-latin-600.ttf +0 -0
  667. data/public/avo-assets/fonts/inter-v7-latin-600.woff +0 -0
  668. data/public/avo-assets/fonts/inter-v7-latin-600.woff2 +0 -0
  669. data/public/avo-assets/fonts/inter-v7-latin-700.eot +0 -0
  670. data/public/avo-assets/fonts/inter-v7-latin-700.svg +352 -0
  671. data/public/avo-assets/fonts/inter-v7-latin-700.ttf +0 -0
  672. data/public/avo-assets/fonts/inter-v7-latin-700.woff +0 -0
  673. data/public/avo-assets/fonts/inter-v7-latin-700.woff2 +0 -0
  674. data/public/avo-assets/fonts/inter-v7-latin-regular.eot +0 -0
  675. data/public/avo-assets/fonts/inter-v7-latin-regular.svg +351 -0
  676. data/public/avo-assets/fonts/inter-v7-latin-regular.ttf +0 -0
  677. data/public/avo-assets/fonts/inter-v7-latin-regular.woff +0 -0
  678. data/public/avo-assets/fonts/inter-v7-latin-regular.woff2 +0 -0
  679. data/public/avo-assets/logo-on-white.png +0 -0
  680. data/public/avo-assets/logo.png +0 -0
  681. metadata +584 -42
  682. data/app/assets/images/avo/logo.png +0 -0
  683. data/app/assets/svgs/check-circle-sm.svg +0 -3
  684. data/app/components/avo/alerts_component.rb +0 -5
  685. data/app/components/avo/fields/common/multiple_file_viewer_component.html.erb +0 -35
  686. data/app/components/avo/fields/common/multiple_file_viewer_component.rb +0 -15
  687. data/app/components/avo/navigation_heading_component.html.erb +0 -3
  688. data/app/components/avo/navigation_heading_component.rb +0 -7
  689. data/app/components/avo/navigation_link_component.html.erb +0 -3
  690. data/app/components/avo/navigation_link_component.rb +0 -11
  691. data/app/javascript/js/toastr.js +0 -10
  692. data/app/views/avo/attachments/show.html.erb +0 -14
  693. data/app/views/avo/base/_actions.html.erb +0 -36
  694. data/app/views/avo/base/_filters.html.erb +0 -34
  695. data/app/views/avo/partials/_a_button.html.erb +0 -7
  696. data/app/views/avo/partials/_a_link.html.erb +0 -7
  697. data/app/views/avo/partials/_empty_state.html.erb +0 -17
  698. data/app/views/avo/partials/_failed_state.html.erb +0 -16
  699. data/app/views/avo/partials/_profile_dropdown.html.erb +0 -25
  700. data/app/views/avo/sidebar/_sidebar.html.erb +0 -31
  701. data/lib/avo/services/panel_service.rb +0 -27
  702. data/public/avo-assets/fonts/nunito-v16-latin-700.eot +0 -0
  703. data/public/avo-assets/fonts/nunito-v16-latin-700.svg +0 -388
  704. data/public/avo-assets/fonts/nunito-v16-latin-700.ttf +0 -0
  705. data/public/avo-assets/fonts/nunito-v16-latin-700.woff +0 -0
  706. data/public/avo-assets/fonts/nunito-v16-latin-700.woff2 +0 -0
  707. data/public/avo-assets/fonts/nunito-v16-latin-regular.eot +0 -0
  708. data/public/avo-assets/fonts/nunito-v16-latin-regular.svg +0 -380
  709. data/public/avo-assets/fonts/nunito-v16-latin-regular.ttf +0 -0
  710. data/public/avo-assets/fonts/nunito-v16-latin-regular.woff +0 -0
  711. data/public/avo-assets/fonts/nunito-v16-latin-regular.woff2 +0 -0
@@ -1,9 +1,5 @@
1
1
  <div class="flex flex-col">
2
- <%= render Avo::PanelComponent.new title: 'Welcome to Avo' do |c| %>
3
- <% c.tools do %>
4
- <div class="text-sm italic">This page is visible only in development. It will be hidden in other environments.</div>
5
- <% end %>
6
-
2
+ <%= render Avo::PanelComponent.new title: 'Welcome to Avo', description: 'This page is visible only in development. It will be hidden in other environments.' do |c| %>
7
3
  <% c.body do %>
8
4
  <div class="flex flex-col justify-between py-6 min-h-24">
9
5
  <div class="px-6 space-y-4">
@@ -1,6 +1,6 @@
1
1
  <div class="w-full inset-auto bottom-0 z-50 mb-4 opacity-75 hover:opacity-100 transition-opacity duration-150">
2
- <a href="https://avohq.io/pricing" target="_blank" class="rounded bg-green-700 text-white py-2 px-4 text-sm block items-center flex leading-tight">
3
- <%= svg "exclamation", class: "h-6 inline mr-2 text-bold flex-shrink-0" %> Warning. Your license is invalid or doesn't support custom tools. This page will not be visible in a production environment.
2
+ <a href="https://avohq.io/pricing" target="_blank" class="rounded bg-orange-700 text-white py-2 px-4 text-sm block items-center flex leading-tight">
3
+ <%= svg "exclamation", class: "h-6 inline mr-2 text-bold flex-shrink-0 mr-1" %> Warning. <%= @custom_tools_alert_visible %> This page will not be visible in a production environment.
4
4
  </a>
5
5
  </div>
6
6
 
@@ -1,11 +1,11 @@
1
- <div data-controller="search" class="global-search" data-turbo-remove-before-cache>
2
- <div class="inline-block"
1
+ <div data-controller="search" class="relative flex global-search rounded border border-gray-200 sm:min-w-[16rem]" data-turbo-remove-before-cache>
2
+ <div class="flex-1 text-gray-500"
3
3
  data-search-target="autocomplete"
4
4
  data-search-resource="global"
5
5
  data-translation-keys='{"no_item_found": "<%= I18n.translate 'avo.no_item_found' %>", "placeholder": "<%= I18n.translate 'avo.search.placeholder' %>", "cancel_button": "<%= I18n.translate 'avo.search.cancel_button' %>"}'
6
6
  >
7
7
  </div>
8
- <div class="relative top-[-5px] inline-flex text-gray-400 text-sm leading-5 py-0.5 px-1.5 border border-gray-300 rounded-md cursor-pointer"
8
+ <div class="absolute top-1/2 hidden sm:inline-flex text-gray-400 text-sm leading-5 py-0.5 px-1.5 border border-gray-300 rounded-md cursor-pointer -translate-y-1/2 left-auto right-0 mr-4"
9
9
  data-search-target="button"
10
10
  >
11
11
  <span class="sr-only">Press </span>
@@ -1 +1 @@
1
- <%= link_to Avo.configuration.app_name, '/', class: 'text-green-600 font-semibold', target: :_blank %>
1
+ <%= link_to Avo.configuration.app_name, '/', class: 'text-blue-500 font-semibold', target: :_blank %>
@@ -1,3 +1,3 @@
1
- <%= link_to root_path, class: 'logo-placeholder h-16 bg-white p-2 flex justify-center' do %>
1
+ <%= link_to root_path, class: 'logo-placeholder h-20 bg-white p-4 flex justify-start' do %>
2
2
  <%= image_tag '/avo-assets/logo.png', class: 'h-full', title: 'Avo' %>
3
3
  <% end %>
@@ -0,0 +1,11 @@
1
+ <div class="relative bg-white p-2 w-full flex flex-shrink-0 items-center z-50 px-4 lg:px-8 border-b space-x-4 lg:space-x-0 min-h-[4rem]" v-if="layout !== 'blank'">
2
+ <%= a_button class: 'lg:hidden', icon: 'menu', data: { action: 'click->mobile#toggleSidebar' } %>
3
+ <div class="flex-1 flex items-center justify-between lg:justify-start space-x-8">
4
+ <div class="m-0">
5
+ <%= render partial: "avo/partials/header" %>
6
+ </div>
7
+ <div class="flex">
8
+ <%= render partial: "avo/partials/global_search" if ::Avo::App.license.has_with_trial(:global_search) && ::Avo.configuration.feature_enabled?(:global_search) %>
9
+ </div>
10
+ </div>
11
+ </div>
@@ -5,5 +5,5 @@
5
5
  data-translation-keys='{"no_item_found": "<%= I18n.translate 'avo.no_item_found' %>"}'
6
6
  >
7
7
  </div>
8
- <div class="hidden relative inline-flex text-gray-400 text-sm border border-gray-300 rounded-full cursor-pointer" data-search-target="button"></div>
8
+ <div class="hidden relative inline-flex text-gray-400 text-sm border border-gray-300 rounded cursor-pointer" data-search-target="button"></div>
9
9
  </div>
@@ -11,4 +11,4 @@
11
11
  end
12
12
  %>
13
13
 
14
- <%= svg icon, class: 'inline-block fill-current text-gray-500 relative leading-none min-w-4 min-h-full ml-1 h-4' %>
14
+ <%= svg icon, class: 'inline-block fill-current text-gray-500 relative leading-none min-w-[1rem] min-h-full ml-1 h-4' %>
@@ -1,6 +1,6 @@
1
1
 
2
- <thead class="bg-slate-100 border-t border-b border-gray-300 pb-1">
3
- <th>
2
+ <thead class="bg-white border-b border-gray-200 pb-1">
3
+ <th class="rounded-lg">
4
4
  <%== item_select_all_input %>
5
5
  </th>
6
6
  <%
@@ -28,9 +28,9 @@
28
28
  sort_by = field.id
29
29
  sort_direction = 'desc'
30
30
  end
31
- classes = "text-slate-600 tracking-tight leading-tight text-xs font-semibold"
31
+ classes = "text-gray-500 tracking-tight leading-tight text-sm font-semibold"
32
32
  %>
33
- <th class="text-left uppercase px-3 py-2 whitespace-nowrap">
33
+ <th class="text-left uppercase px-3 py-4 whitespace-nowrap rounded-l">
34
34
  <% if field.sortable %>
35
35
  <%= link_to params.permit!.merge(sort_by: sort_by, sort_direction: sort_direction), class: "flex items-center #{classes} #{'cursor-pointer' if field.sortable}", 'data-turbo-frame': params[:turbo_frame] do %>
36
36
  <%= field.name %>
@@ -1,17 +1,37 @@
1
- <%
2
- if available_view_types.count > 1
3
- case view_type.to_sym
4
- when :table
5
- new_view_type = 'grid'
6
- new_icon = 'view-grid'
7
- translation_key = 'avo.grid_view'
8
- when :grid
9
- new_view_type = 'table'
10
- new_icon = 'view-list'
11
- translation_key = 'avo.table_view'
12
- end
13
- %>
14
- <%= a_link params.permit!.merge(view_type: new_view_type), color: :blue, 'data-turbo-frame': turbo_frame, title: t('avo.switch_to_view', view_type: new_view_type), 'data-tippy': 'tooltip' do %>
15
- <%= svg new_icon %> <%= t translation_key, item: @resource.model_class.model_name.human.downcase %>
16
- <% end %>
1
+ <% if available_view_types.count > 1 %>
2
+ <%
3
+ info = {
4
+ table: {
5
+ new_view_type: 'table',
6
+ new_icon: 'table-view-type',
7
+ translation_key: 'avo.table_view',
8
+ },
9
+ grid: {
10
+ new_view_type: 'grid',
11
+ new_icon: 'grid-view-type',
12
+ translation_key: 'avo.grid_view',
13
+ },
14
+ }
15
+ %>
16
+ <div class="flex">
17
+ <div class="button-group">
18
+ <% available_view_types.each do |type| %>
19
+ <% is_active_view = view_type.to_s == type.to_s %>
20
+
21
+ <%= a_link url_for(params.permit!.merge(view_type: type)).to_s,
22
+ icon: info[type][:new_icon],
23
+ color: is_active_view ? :gray : :primary,
24
+ rounded: false,
25
+ size: :sm,
26
+ class: is_active_view ? ' bg-gray-100 border-gray-300' : ' z-20',
27
+ title: t('avo.switch_to_view', view_type: type),
28
+ data: {
29
+ tippy: 'tooltip',
30
+ 'turbo-frame': turbo_frame,
31
+ control: "view-type-toggle-#{type}"
32
+ }
33
+ %>
34
+ <% end %>
35
+ </div>
36
+ </div>
17
37
  <% end %>
@@ -0,0 +1,57 @@
1
+ <%
2
+ entities = [:button, :link]
3
+ sizes = [:lg, :md, :sm, :xs]
4
+ styles = [:primary, :outline]
5
+ colors = [:primary, :gray, :red, :orange, :green]
6
+ states = [:regular, :hover, :disabled, :active]
7
+ %>
8
+ <div class="px-6 space-y-4">
9
+ <% entities.each do |entity| %>
10
+ <h3><%= entity.to_s.humanize.capitalize.pluralize %></h3>
11
+ <div class="flex flex-col space-y-4">
12
+ <% sizes.each do |size| %>
13
+ <div class="text-lg">size: <%= size %></div>
14
+ <div class="flex flex-col space-y-1">
15
+ <% styles.each do |style| %>
16
+ <% colors.each do |color| %>
17
+ <% next if style == :primary && color != :primary %>
18
+ <div class="flex space-x-1">
19
+ <% states.each do |state| %>
20
+ <%
21
+ extra_classes = ""
22
+ case state
23
+ when :active
24
+ extra_classes += " active"
25
+ when :hover
26
+ extra_classes += " hover"
27
+ end
28
+ %>
29
+ <%
30
+ a_button_or_link = "a_#{entity}"
31
+ args = {icon: 'arrow-left', style: style, color: color, size: size, class: extra_classes, disabled: state == :disabled}
32
+ %>
33
+ <% if entity == :link %>
34
+ <div>
35
+ <%= send a_button_or_link, '/admin/avo_private/design', **args do %>
36
+ <%= entity.to_s.humanize.capitalize %> <%= state %>
37
+ <% end %>
38
+ </div>
39
+ <% else %>
40
+ <div>
41
+ <%= send a_button_or_link, **args do %>
42
+ <%= entity.to_s.humanize.capitalize %> <%= state %>
43
+ <% end %>
44
+ </div>
45
+ <div>
46
+ <%= a_button icon: 'bell', style: style, color: color, size: size, class: extra_classes, disabled: state == :disabled %>
47
+ </div>
48
+ <% end %>
49
+ <% end %>
50
+ </div>
51
+ <% end %>
52
+ <% end %>
53
+ </div>
54
+ <% end %>
55
+ </div>
56
+ <% end %>
57
+ </div>
@@ -0,0 +1,27 @@
1
+ <div class="flex flex-col">
2
+ <%= render Avo::PanelComponent.new title: 'Welcome to Avo', description: 'This page is visible only in development. It will be hidden in other environments.' do |c| %>
3
+ <% c.tools do %>
4
+ <%= a_link('/admin', icon: 'arrow-left', style: :primary, is_link: true) do %>
5
+ Primary
6
+ <% end %>
7
+
8
+ <%= a_link('/admin', icon: 'arrow-left', style: :outline, is_link: true) do %>
9
+ Secondary
10
+ <% end %>
11
+
12
+ <%= a_link('/admin', icon: 'arrow-left', style: :outline, color: :red, is_link: true) do %>
13
+ Red
14
+ <% end %>
15
+
16
+ <%= a_link('/admin', icon: 'arrow-left', style: :outline, color: :orange, is_link: true) do %>
17
+ Red
18
+ <% end %>
19
+ <% end %>
20
+
21
+ <% c.body do %>
22
+ <div class="flex flex-col justify-between py-6 min-h-24">
23
+ <%= render 'links_and_buttons' %>
24
+ </div>
25
+ <% end %>
26
+ <% end %>
27
+ </div>
@@ -1,6 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1">
4
5
  <%= display_meta_tags site: Avo.configuration.app_name, reverse: true, separator: "—" %>
5
6
 
6
7
  <%= csrf_meta_tags %>
@@ -17,43 +18,38 @@
17
18
  <%= stylesheet_link_tag "avo", "data-turbo-track": "reload", defer: true %>
18
19
  <% end %>
19
20
  </head>
20
- <body class="bg-slate-200 os-mac">
21
-
22
- <div id="app" class="flex min-h-screen flex-row h-full">
23
- <div class="flex flex-1 w-full">
24
- <%= render partial: 'avo/sidebar/sidebar' %>
25
-
26
- <div class="flex-1 flex flex-col h-full overflow-auto">
27
- <div class="relative bg-white p-2 shadow-md h-16 w-full flex flex-shrink-0 items-center z-50 px-6" v-if="layout !== 'blank'">
28
- <div>
29
- <%= render partial: "avo/partials/header" %>
30
- </div>
31
- <div class="flex-1 flex ml-4 pl-4">
32
- <%= render partial: "avo/partials/global_search" if ::Avo::App.license.has_with_trial(:global_search) && ::Avo.configuration.feature_enabled?(:global_search) %>
33
- </div>
34
- <div class="align-end">
35
- <%= render partial: "avo/partials/profile_dropdown" %>
36
- </div>
37
- </div>
21
+ <body class="bg-application os-mac">
22
+ <div class="relative flex flex-1 w-full min-h-full" data-controller="mobile">
23
+ <%= render Avo::SidebarComponent.new %>
24
+
25
+ <div class="lg:pl-64 flex-1 flex flex-col min-h-full max-w-full">
26
+ <%= render partial: "avo/partials/navbar" %>
38
27
 
39
- <div class="content p-8 flex-1 flex flex-col justify-between items-stretch <%= @container_classes %>">
40
- <%= render partial: "avo/partials/custom_tools_alert" if @custom_tools_alert_visible %>
28
+ <div class="content py-4 lg:py-8 px-4 lg:px-8 flex-1 flex flex-col justify-between items-stretch <%= @container_classes %>">
29
+ <%= render partial: "avo/partials/custom_tools_alert" if @custom_tools_alert_visible %>
41
30
 
42
- <div class="flex flex-1 flex-col justify-between items-stretch">
43
- <%= yield %>
44
- <%= render partial: "avo/partials/footer" %>
45
- </div>
31
+ <div class="flex flex-1 flex-col justify-between items-stretch space-y-8">
32
+ <%= yield %>
33
+ <%= render partial: "avo/partials/footer" %>
46
34
  </div>
47
35
  </div>
48
36
  </div>
49
- <%= turbo_frame_tag 'actions_show' %>
50
- <%= turbo_frame_tag 'attach_modal' %>
51
- <%= turbo_frame_tag 'destroy_attachment_form' %>
37
+ </div>
52
38
 
53
- <%= turbo_frame_tag 'alerts' do %>
54
- <%= render Avo::AlertsComponent.new %>
39
+ <%= turbo_frame_tag 'actions_show' %>
40
+ <%= turbo_frame_tag 'attach_modal' %>
41
+ <%= turbo_frame_tag 'destroy_attachment_form' %>
42
+
43
+ <%= turbo_frame_tag 'alerts', class: "fixed inset-0 bottom-0 flex flex-col space-y-4 items-end justify-right px-4 py-6 sm:p-6 justify-end z-50 pointer-events-none" do %>
44
+ <%= render Avo::FlashAlertsComponent.new flashes: flash %>
45
+
46
+ <% # In case we have other general error messages %>
47
+ <% if @errors.present? %>
48
+ <% @errors.each do |message| %>
49
+ <%= render Avo::AlertComponent.new :error, message %>
50
+ <% end %>
55
51
  <% end %>
56
- </div>
52
+ <% end %>
57
53
 
58
54
  <%= render partial: "avo/partials/scripts" %>
59
55
  <!-- Avo version: <%= Avo::VERSION %> -->
data/avo.gemspec CHANGED
@@ -10,8 +10,8 @@ Gem::Specification.new do |spec|
10
10
  spec.authors = ["Adrian Marin", "Mihai Marin"]
11
11
  spec.email = ["avo@avohq.io"]
12
12
  spec.homepage = "https://avohq.io"
13
- spec.summary = "Configuration-based, no-maintenance, extendable Ruby on Rails admin."
14
- spec.description = "Avo is a beautiful next-generation framework that empowers you, the developer, to create fantastic admin panels for your Ruby on Rails apps with the flexibility to fit your needs as you grow."
13
+ spec.summary = "Configuration-based, no-maintenance, extendable Ruby on Rails admin panel framework."
14
+ spec.description = "Avo abstracts away the common parts of building apps, letting your engineers work on your app's essential components. The result is a full-featured admin panel that works out of the box, ready to give to your end-users."
15
15
  spec.license = "Commercial"
16
16
 
17
17
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
27
27
  "public gem pushes."
28
28
  end
29
29
 
30
+ spec.required_ruby_version = ">= 2.4.0"
30
31
  spec.post_install_message = "Thank you for using Avo 💪 Docs are available at https://docs.avohq.io"
31
32
 
32
33
  spec.files = Dir["{bin,app,config,db,lib,public}/**/*", "MIT-LICENSE", "Rakefile", "README.md", "avo.gemspec", "Gemfile", "Gemfile.lock"]
@@ -44,5 +45,6 @@ Gem::Specification.new do |spec|
44
45
  spec.add_dependency "addressable"
45
46
  spec.add_dependency "meta-tags"
46
47
  spec.add_dependency "breadcrumbs_on_rails"
48
+ spec.add_dependency "chartkick"
47
49
  spec.add_dependency "dry-initializer"
48
50
  end
data/bin/dev CHANGED
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
- if ! command -v foreman &> /dev/null
4
- then
5
- echo "Installing foreman..."
6
- gem install foreman
7
- fi
3
+ PORT="${PORT:-3030}"
4
+ export PORT
8
5
 
9
- foreman start -f Procfile.dev
6
+ if command -v overmind &> /dev/null; then
7
+ overmind start -f Procfile.dev "$@"
8
+ else
9
+ foreman start -f Procfile.dev "$@"
10
+ fi
data/config/routes.rb CHANGED
@@ -4,6 +4,9 @@ Avo::Engine.routes.draw do
4
4
  get "resources", to: redirect("/admin")
5
5
  post "/rails/active_storage/direct_uploads", to: "/active_storage/direct_uploads#create"
6
6
 
7
+ get "/dashboards/:dashboard_id", to: "dashboards#show"
8
+ get "/dashboards/:dashboard_id/cards/:card_id", to: "dashboards#card"
9
+
7
10
  scope "avo_api", as: "avo_api" do
8
11
  get "/search", to: "search#index"
9
12
  get "/:resource_name/search", to: "search#show"
@@ -14,12 +17,11 @@ Avo::Engine.routes.draw do
14
17
 
15
18
  scope "resources", as: "resources" do
16
19
  # Attachments
17
- get "/:resource_name/:id/active_storage_attachments/:attachment_name/:signed_attachment_id", to: "attachments#show"
18
- delete "/:resource_name/:id/active_storage_attachments/:attachment_name/:signed_attachment_id", to: "attachments#destroy"
20
+ delete "/:resource_name/:id/active_storage_attachments/:attachment_name/:attachment_id", to: "attachments#destroy"
19
21
 
20
22
  # Ordering
21
23
  patch "/:resource_name/:id/order", to: "resources#order"
22
- patch "/:resource_name/:id/:related_name/:related_id/order", to: "relations#order", as: "associations_order"
24
+ patch "/:resource_name/:id/:related_name/:related_id/order", to: "associations#order", as: "associations_order"
23
25
 
24
26
  # Actions
25
27
  get "/:resource_name(/:id)/actions/:action_id", to: "actions#show"
@@ -27,13 +29,19 @@ Avo::Engine.routes.draw do
27
29
 
28
30
  # Generate resource routes as below:
29
31
  # resources :posts
30
- Avo::DynamicRouter::routes(self)
31
-
32
- # Relations
33
- get "/:resource_name/:id/:related_name/new", to: "relations#new", as: "associations_new"
34
- get "/:resource_name/:id/:related_name/", to: "relations#index", as: "associations_index"
35
- get "/:resource_name/:id/:related_name/:related_id", to: "relations#show", as: "associations_show"
36
- post "/:resource_name/:id/:related_name", to: "relations#create", as: "associations_create"
37
- delete "/:resource_name/:id/:related_name/:related_id", to: "relations#destroy", as: "associations_destroy"
32
+ Avo::DynamicRouter.routes(self)
33
+
34
+ # Associations
35
+ get "/:resource_name/:id/:related_name/new", to: "associations#new", as: "associations_new"
36
+ get "/:resource_name/:id/:related_name/", to: "associations#index", as: "associations_index"
37
+ get "/:resource_name/:id/:related_name/:related_id", to: "associations#show", as: "associations_show"
38
+ post "/:resource_name/:id/:related_name", to: "associations#create", as: "associations_create"
39
+ delete "/:resource_name/:id/:related_name/:related_id", to: "associations#destroy", as: "associations_destroy"
40
+ end
41
+
42
+ if Rails.env.development? or Rails.env.staging?
43
+ scope "avo_private", as: "avo_private" do
44
+ get "/design", to: "private#design"
45
+ end
38
46
  end
39
47
  end
data/lib/avo/app.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  module Avo
2
2
  class App
3
3
  class_attribute :resources, default: []
4
+ class_attribute :dashboards, default: []
4
5
  class_attribute :cache_store, default: nil
5
6
  class_attribute :fields, default: []
6
7
  class_attribute :request, default: nil
@@ -9,6 +10,8 @@ module Avo
9
10
  class_attribute :current_user, default: nil
10
11
  class_attribute :root_path, default: nil
11
12
  class_attribute :view_context, default: nil
13
+ class_attribute :params, default: {}
14
+ class_attribute :translation_enabled, default: false
12
15
 
13
16
  class << self
14
17
  def boot
@@ -23,14 +26,16 @@ module Avo
23
26
  end
24
27
  end
25
28
 
26
- def init(request:, context:, current_user:, root_path:, view_context:)
29
+ def init(request:, context:, current_user:, root_path:, view_context:, params:)
27
30
  self.request = request
28
31
  self.context = context
29
32
  self.current_user = current_user
30
33
  self.root_path = root_path
31
34
  self.view_context = view_context
35
+ self.params = params
32
36
 
33
37
  self.license = Licensing::LicenseManager.new(Licensing::HQ.new(request).response).license
38
+ self.translation_enabled = license.has(:localization)
34
39
 
35
40
  # Set the current host for ActiveStorage
36
41
  begin
@@ -44,6 +49,7 @@ module Avo
44
49
  end
45
50
 
46
51
  init_resources
52
+ init_dashboards if license.has_with_trial(:dashboards)
47
53
  end
48
54
 
49
55
  # This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array
@@ -82,6 +88,23 @@ module Avo
82
88
  end
83
89
  end
84
90
 
91
+ def init_dashboards
92
+ self.dashboards = Dashboards::BaseDashboard.descendants
93
+ .select do |dashboard|
94
+ dashboard != Dashboards::BaseDashboard
95
+ end
96
+ .uniq do |dashboard|
97
+ dashboard.id
98
+ end
99
+ end
100
+
101
+ # Returns the Avo dashboard by id
102
+ def get_dashboard_by_id(id)
103
+ dashboards.find do |dashboard|
104
+ dashboard.id == id
105
+ end
106
+ end
107
+
85
108
  # Returns the Avo resource by camelized name
86
109
  #
87
110
  # get_resource_by_name('User') => UserResource
@@ -132,15 +155,26 @@ module Avo
132
155
  .sort_by { |r| r.name }
133
156
  end
134
157
 
158
+ def get_available_dashboards(user = nil)
159
+ dashboards.sort_by { |r| r.name }
160
+ end
161
+
135
162
  def resources_navigation(user = nil)
136
- get_available_resources(user).select do |resource|
137
- resource.model_class.present?
138
- end
163
+ get_available_resources(user)
164
+ .select do |resource|
165
+ resource.model_class.present?
166
+ end
139
167
  .select do |resource|
140
168
  resource.visible_on_sidebar
141
169
  end
142
170
  end
143
171
 
172
+ def get_dashboards(user = nil)
173
+ return [] unless App.license.has_with_trial(:resource_ordering)
174
+
175
+ get_available_dashboards(user)
176
+ end
177
+
144
178
  # Insert any partials that we find in app/views/avo/sidebar/items.
145
179
  def get_sidebar_partials
146
180
  Dir.glob(Rails.root.join("app", "views", "avo", "sidebar", "items", "*.html.erb"))
@@ -27,16 +27,16 @@ module Avo
27
27
  def form_data_attributes
28
28
  # We can't respond with a file download from Turbo se we disable it on the form
29
29
  if may_download_file
30
- { 'turbo': false }
30
+ {turbo: false, remote: false}
31
31
  else
32
- { 'turbo-frame': '_top', 'action-target': 'form' }
32
+ {"turbo-frame": "_top", "action-target": "form"}
33
33
  end
34
34
  end
35
35
 
36
36
  # We can't respond with a file download from Turbo se we disable close the modal manually after a while (it's a hack, we know)
37
37
  def submit_button_data_attributes
38
38
  if may_download_file
39
- { action: 'click->modal#delayedClose' }
39
+ {action: "click->modal#delayedClose"}
40
40
  else
41
41
  {}
42
42
  end
@@ -109,7 +109,7 @@ module Avo
109
109
  args = {
110
110
  fields: processed_fields,
111
111
  current_user: current_user,
112
- resource: resource,
112
+ resource: resource
113
113
  }
114
114
 
115
115
  args[:models] = models unless standalone
@@ -11,6 +11,7 @@ module Avo
11
11
  delegate :avo, to: :view_context
12
12
  delegate :resource_path, to: :view_context
13
13
  delegate :resources_path, to: :view_context
14
+ delegate :t, to: ::I18n
14
15
 
15
16
  attr_accessor :view
16
17
  attr_accessor :model
@@ -26,7 +27,7 @@ module Avo
26
27
  class_attribute :includes, default: []
27
28
  class_attribute :model_class
28
29
  class_attribute :translation_key
29
- class_attribute :translation_enabled
30
+ class_attribute :translation_enabled, default: false
30
31
  class_attribute :default_view_type, default: :table
31
32
  class_attribute :devise_password_optional, default: false
32
33
  class_attribute :actions_loader
@@ -38,8 +39,11 @@ module Avo
38
39
  class_attribute :resolve_query_scope
39
40
  class_attribute :resolve_find_scope
40
41
  class_attribute :ordering
42
+ class_attribute :hide_from_global_search, default: false
41
43
 
42
44
  class << self
45
+ delegate :t, to: ::I18n
46
+
43
47
  def grid(&block)
44
48
  grid_collector = GridCollector.new
45
49
  grid_collector.instance_eval(&block)
@@ -92,8 +96,12 @@ module Avo
92
96
 
93
97
  def initialize
94
98
  unless self.class.model_class.present?
95
- self.class.model_class = model_class.base_class
99
+ if model_class.present?
100
+ self.class.model_class = model_class.base_class
101
+ end
96
102
  end
103
+
104
+ self.class.translation_enabled = ::Avo::App.translation_enabled
97
105
  end
98
106
 
99
107
  def hydrate(model: nil, view: nil, user: nil, params: nil)
@@ -209,11 +217,11 @@ module Avo
209
217
 
210
218
  case @view
211
219
  when :show
212
- I18n.t("avo.resource_details", item: name.downcase, title: model_title).upcase_first
220
+ model_title
213
221
  when :edit
214
- I18n.t("avo.update_item", item: name.downcase, title: model_title).upcase_first
222
+ model_title
215
223
  when :new
216
- I18n.t("avo.create_new_item", item: name.downcase).upcase_first
224
+ t("avo.create_new_item", item: name.downcase).upcase_first
217
225
  end
218
226
  end
219
227
 
@@ -242,9 +250,18 @@ module Avo
242
250
  class_name_without_resource.safe_constantize
243
251
  end
244
252
 
253
+ def model_id
254
+ @model.send id
255
+ end
256
+
245
257
  def model_title
246
- return @model.send title if @model.present?
258
+ return name if @model.nil?
247
259
 
260
+ the_title = @model.send title
261
+ return the_title if the_title.present?
262
+
263
+ model_id
264
+ rescue
248
265
  name
249
266
  end
250
267
 
@@ -265,11 +282,13 @@ module Avo
265
282
  end
266
283
 
267
284
  def name
285
+ default = class_name_without_resource.titlecase
286
+
268
287
  return @name if @name.present?
269
288
 
270
- return I18n.t(translation_key, count: 1).capitalize if translation_key
289
+ return t(translation_key, count: 1, default: default).capitalize if translation_key
271
290
 
272
- class_name_without_resource.titlecase
291
+ default
273
292
  end
274
293
 
275
294
  def singular_name
@@ -277,9 +296,11 @@ module Avo
277
296
  end
278
297
 
279
298
  def plural_name
280
- return I18n.t(translation_key, count: 2).capitalize if translation_key
299
+ default = name.pluralize
300
+
301
+ return t(translation_key, count: 2, default: default).capitalize if translation_key
281
302
 
282
- name.pluralize
303
+ default
283
304
  end
284
305
 
285
306
  def underscore_name