avo 1.24.2 → 2.1.0

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 (715) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +11 -2
  3. data/Gemfile.lock +21 -6
  4. data/README.md +33 -28
  5. data/app/assets/stylesheets/avo.css +7 -2
  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/autocomplete_component.html.erb +1 -1
  510. data/app/components/avo/fields/belongs_to_field/autocomplete_component.rb +10 -2
  511. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +2 -1
  512. data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
  513. data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
  514. data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +1 -1
  515. data/app/components/avo/fields/common/boolean_check_component.html.erb +4 -4
  516. data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
  517. data/app/components/avo/fields/common/files_list_viewer_component.html.erb +2 -2
  518. data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
  519. data/app/components/avo/fields/common/heading_component.html.erb +2 -2
  520. data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
  521. data/app/components/avo/fields/common/single_file_viewer_component.html.erb +42 -23
  522. data/app/components/avo/fields/common/single_file_viewer_component.rb +34 -6
  523. data/app/components/avo/fields/common/status_viewer_component.html.erb +2 -2
  524. data/app/components/avo/fields/external_image_field/index_component.html.erb +2 -3
  525. data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
  526. data/app/components/avo/fields/file_field/index_component.html.erb +3 -3
  527. data/app/components/avo/fields/file_field/index_component.rb +11 -0
  528. data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
  529. data/app/components/avo/fields/gravatar_field/index_component.html.erb +1 -1
  530. data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
  531. data/app/components/avo/fields/has_one_field/show_component.html.erb +4 -4
  532. data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
  533. data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
  534. data/app/components/avo/fields/progress_bar_field/index_component.html.erb +1 -1
  535. data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -0
  536. data/app/components/avo/filters_component.html.erb +37 -0
  537. data/app/components/avo/filters_component.rb +14 -0
  538. data/app/components/avo/{alerts_component.html.erb → flash_alerts_component.html.erb} +1 -1
  539. data/app/components/avo/flash_alerts_component.rb +9 -0
  540. data/app/components/avo/index/field_wrapper_component.html.erb +8 -2
  541. data/app/components/avo/index/field_wrapper_component.rb +13 -1
  542. data/app/components/avo/index/grid_item_component.html.erb +13 -10
  543. data/app/components/avo/index/ordering/buttons_component.rb +2 -0
  544. data/app/components/avo/index/resource_controls_component.html.erb +11 -6
  545. data/app/components/avo/index/resource_grid_component.html.erb +3 -3
  546. data/app/components/avo/index/resource_table_component.html.erb +10 -14
  547. data/app/components/avo/index/table_row_component.html.erb +1 -1
  548. data/app/components/avo/modal_component.html.erb +9 -7
  549. data/app/{views/avo/partials/_paginator.html.erb → components/avo/paginator_component.html.erb} +16 -16
  550. data/app/components/avo/paginator_component.rb +17 -0
  551. data/app/components/avo/panel_component.html.erb +29 -17
  552. data/app/components/avo/panel_component.rb +17 -2
  553. data/app/components/avo/profile_item_component.html.erb +3 -0
  554. data/app/components/avo/profile_item_component.rb +11 -0
  555. data/app/components/avo/referrer_params_component.html.erb +4 -0
  556. data/app/components/avo/referrer_params_component.rb +9 -0
  557. data/app/components/avo/resource_component.rb +1 -1
  558. data/app/components/avo/show/field_wrapper_component.html.erb +8 -15
  559. data/app/components/avo/show/field_wrapper_component.rb +0 -4
  560. data/app/components/avo/sidebar_component.html.erb +51 -0
  561. data/app/components/avo/sidebar_component.rb +21 -0
  562. data/app/components/avo/sidebar_heading_component.html.erb +3 -0
  563. data/app/components/avo/sidebar_heading_component.rb +11 -0
  564. data/app/components/avo/sidebar_item_component.html.erb +3 -0
  565. data/app/components/avo/sidebar_item_component.rb +10 -0
  566. data/app/components/avo/sidebar_profile_component.html.erb +36 -0
  567. data/app/components/avo/sidebar_profile_component.rb +43 -0
  568. data/app/components/avo/turbo_frame_wrapper_component.html.erb +8 -9
  569. data/app/components/avo/views/resource_edit_component.html.erb +27 -17
  570. data/app/components/avo/views/resource_index_component.html.erb +44 -35
  571. data/app/components/avo/views/resource_new_component.html.erb +31 -16
  572. data/app/components/avo/views/resource_show_component.html.erb +37 -34
  573. data/app/components/avo/views/resource_show_component.rb +2 -3
  574. data/app/controllers/avo/application_controller.rb +44 -13
  575. data/app/controllers/avo/{relations_controller.rb → associations_controller.rb} +15 -7
  576. data/app/controllers/avo/attachments_controller.rb +1 -5
  577. data/app/controllers/avo/base_controller.rb +75 -49
  578. data/app/controllers/avo/dashboards_controller.rb +28 -0
  579. data/app/controllers/avo/private_controller.rb +8 -0
  580. data/app/controllers/avo/search_controller.rb +5 -1
  581. data/app/helpers/avo/application_helper.rb +29 -47
  582. data/app/helpers/avo/resources_helper.rb +2 -2
  583. data/app/helpers/avo/url_helpers.rb +3 -3
  584. data/app/javascript/avo.js +26 -5
  585. data/app/javascript/js/application.js +2 -1
  586. data/app/javascript/js/controllers/actions_picker_controller.js +12 -10
  587. data/app/javascript/js/controllers/dashboard_card_controller.js +33 -0
  588. data/app/javascript/js/controllers/item_selector_controller.js +8 -4
  589. data/app/javascript/js/controllers/mobile_controller.js +9 -0
  590. data/app/javascript/js/controllers/select_controller.js +23 -0
  591. data/app/javascript/js/controllers.js +6 -0
  592. data/app/views/avo/actions/show.html.erb +23 -17
  593. data/app/views/avo/associations/new.html.erb +45 -0
  594. data/app/views/avo/base/_multiple_select_filter.html.erb +5 -1
  595. data/app/views/avo/base/_text_filter.html.erb +3 -1
  596. data/app/views/avo/base/show.html.erb +1 -1
  597. data/app/views/avo/dashboards/_chartkick_card.html.erb +3 -0
  598. data/app/views/avo/dashboards/_metric_card.html.erb +5 -0
  599. data/app/views/avo/dashboards/card.html.erb +3 -0
  600. data/app/views/avo/dashboards/show.html.erb +35 -0
  601. data/app/views/avo/home/failed_to_load.html.erb +21 -1
  602. data/app/views/avo/home/index.html.erb +1 -5
  603. data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
  604. data/app/views/avo/partials/_global_search.html.erb +3 -3
  605. data/app/views/avo/partials/_header.html.erb +1 -1
  606. data/app/views/avo/partials/_logo.html.erb +1 -1
  607. data/app/views/avo/partials/_navbar.html.erb +11 -0
  608. data/app/views/avo/partials/_resource_search.html.erb +1 -1
  609. data/app/views/avo/partials/_sortable_component.html.erb +1 -1
  610. data/app/views/avo/partials/_table_header.html.erb +4 -4
  611. data/app/views/avo/partials/_view_toggle_button.html.erb +36 -16
  612. data/app/views/avo/private/_links_and_buttons.html.erb +57 -0
  613. data/app/views/avo/private/design.html.erb +27 -0
  614. data/app/views/layouts/avo/application.html.erb +26 -30
  615. data/avo.gemspec +4 -2
  616. data/bin/dev +7 -6
  617. data/config/routes.rb +19 -11
  618. data/lib/avo/app.rb +38 -4
  619. data/lib/avo/base_action.rb +4 -4
  620. data/lib/avo/base_resource.rb +36 -15
  621. data/lib/avo/configuration.rb +2 -0
  622. data/lib/avo/dashboards/base_card.rb +151 -0
  623. data/lib/avo/dashboards/base_dashboard.rb +71 -0
  624. data/lib/avo/dashboards/base_divider.rb +23 -0
  625. data/lib/avo/dashboards/chartkick_card.rb +77 -0
  626. data/lib/avo/dashboards/metric_card.rb +9 -0
  627. data/lib/avo/dashboards/partial_card.rb +7 -0
  628. data/lib/avo/dynamic_router.rb +3 -0
  629. data/lib/avo/engine.rb +5 -1
  630. data/lib/avo/fields/base_field.rb +20 -7
  631. data/lib/avo/fields/belongs_to_field.rb +2 -2
  632. data/lib/avo/fields/external_image_field.rb +2 -2
  633. data/lib/avo/fields/gravatar_field.rb +2 -2
  634. data/lib/avo/fields/has_base_field.rb +24 -1
  635. data/lib/avo/hosts/dashboard_card.rb +21 -0
  636. data/lib/avo/hosts/dashboard_visibility.rb +19 -0
  637. data/lib/avo/hosts/ordering.rb +1 -1
  638. data/lib/avo/licensing/license.rb +4 -2
  639. data/lib/avo/licensing/pro_license.rb +3 -1
  640. data/lib/avo/version.rb +1 -1
  641. data/lib/avo.rb +24 -0
  642. data/lib/generators/avo/chartkick_card_generator.rb +16 -0
  643. data/lib/generators/avo/dashboard_generator.rb +16 -0
  644. data/lib/generators/avo/metric_card_generator.rb +16 -0
  645. data/lib/generators/avo/partial_card_generator.rb +17 -0
  646. data/lib/generators/avo/templates/cards/chartkick_card.tt +16 -0
  647. data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +26 -0
  648. data/lib/generators/avo/templates/cards/metric_card.tt +8 -0
  649. data/lib/generators/avo/templates/cards/metric_card_sample.tt +38 -0
  650. data/lib/generators/avo/templates/cards/partial_card.tt +8 -0
  651. data/lib/generators/avo/templates/cards/partial_card_partial.tt +8 -0
  652. data/lib/generators/avo/templates/cards/partial_card_sample.tt +8 -0
  653. data/lib/generators/avo/templates/dashboards/dashboard.tt +12 -0
  654. data/lib/generators/avo/templates/locales/avo.en.yml +11 -4
  655. data/lib/generators/avo/templates/locales/avo.nb-NO.yml +5 -2
  656. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +4 -2
  657. data/lib/generators/avo/templates/locales/avo.ro.yml +4 -1
  658. data/lib/generators/avo/templates/tool/sidebar_item.tt +1 -1
  659. data/public/avo-assets/avo.css +1321 -1126
  660. data/public/avo-assets/avo.js +349 -88688
  661. data/public/avo-assets/avo.js.map +3 -3
  662. data/public/avo-assets/fonts/inter-v7-latin-500.eot +0 -0
  663. data/public/avo-assets/fonts/inter-v7-latin-500.svg +351 -0
  664. data/public/avo-assets/fonts/inter-v7-latin-500.ttf +0 -0
  665. data/public/avo-assets/fonts/inter-v7-latin-500.woff +0 -0
  666. data/public/avo-assets/fonts/inter-v7-latin-500.woff2 +0 -0
  667. data/public/avo-assets/fonts/inter-v7-latin-600.eot +0 -0
  668. data/public/avo-assets/fonts/inter-v7-latin-600.svg +351 -0
  669. data/public/avo-assets/fonts/inter-v7-latin-600.ttf +0 -0
  670. data/public/avo-assets/fonts/inter-v7-latin-600.woff +0 -0
  671. data/public/avo-assets/fonts/inter-v7-latin-600.woff2 +0 -0
  672. data/public/avo-assets/fonts/inter-v7-latin-700.eot +0 -0
  673. data/public/avo-assets/fonts/inter-v7-latin-700.svg +352 -0
  674. data/public/avo-assets/fonts/inter-v7-latin-700.ttf +0 -0
  675. data/public/avo-assets/fonts/inter-v7-latin-700.woff +0 -0
  676. data/public/avo-assets/fonts/inter-v7-latin-700.woff2 +0 -0
  677. data/public/avo-assets/fonts/inter-v7-latin-regular.eot +0 -0
  678. data/public/avo-assets/fonts/inter-v7-latin-regular.svg +351 -0
  679. data/public/avo-assets/fonts/inter-v7-latin-regular.ttf +0 -0
  680. data/public/avo-assets/fonts/inter-v7-latin-regular.woff +0 -0
  681. data/public/avo-assets/fonts/inter-v7-latin-regular.woff2 +0 -0
  682. data/public/avo-assets/logo-on-white.png +0 -0
  683. data/public/avo-assets/logo.png +0 -0
  684. metadata +584 -42
  685. data/app/assets/images/avo/logo.png +0 -0
  686. data/app/assets/svgs/check-circle-sm.svg +0 -3
  687. data/app/components/avo/alerts_component.rb +0 -5
  688. data/app/components/avo/fields/common/multiple_file_viewer_component.html.erb +0 -35
  689. data/app/components/avo/fields/common/multiple_file_viewer_component.rb +0 -15
  690. data/app/components/avo/navigation_heading_component.html.erb +0 -3
  691. data/app/components/avo/navigation_heading_component.rb +0 -7
  692. data/app/components/avo/navigation_link_component.html.erb +0 -3
  693. data/app/components/avo/navigation_link_component.rb +0 -11
  694. data/app/javascript/js/toastr.js +0 -10
  695. data/app/views/avo/attachments/show.html.erb +0 -14
  696. data/app/views/avo/base/_actions.html.erb +0 -36
  697. data/app/views/avo/base/_filters.html.erb +0 -34
  698. data/app/views/avo/partials/_a_button.html.erb +0 -7
  699. data/app/views/avo/partials/_a_link.html.erb +0 -7
  700. data/app/views/avo/partials/_empty_state.html.erb +0 -17
  701. data/app/views/avo/partials/_failed_state.html.erb +0 -16
  702. data/app/views/avo/partials/_profile_dropdown.html.erb +0 -25
  703. data/app/views/avo/relations/new.html.erb +0 -31
  704. data/app/views/avo/sidebar/_sidebar.html.erb +0 -31
  705. data/lib/avo/services/panel_service.rb +0 -27
  706. data/public/avo-assets/fonts/nunito-v16-latin-700.eot +0 -0
  707. data/public/avo-assets/fonts/nunito-v16-latin-700.svg +0 -388
  708. data/public/avo-assets/fonts/nunito-v16-latin-700.ttf +0 -0
  709. data/public/avo-assets/fonts/nunito-v16-latin-700.woff +0 -0
  710. data/public/avo-assets/fonts/nunito-v16-latin-700.woff2 +0 -0
  711. data/public/avo-assets/fonts/nunito-v16-latin-regular.eot +0 -0
  712. data/public/avo-assets/fonts/nunito-v16-latin-regular.svg +0 -380
  713. data/public/avo-assets/fonts/nunito-v16-latin-regular.ttf +0 -0
  714. data/public/avo-assets/fonts/nunito-v16-latin-regular.woff +0 -0
  715. data/public/avo-assets/fonts/nunito-v16-latin-regular.woff2 +0 -0
@@ -7,20 +7,21 @@ module Avo
7
7
  before_action :hydrate_resource
8
8
  before_action :set_model, only: [:show, :edit, :destroy, :update, :order]
9
9
  before_action :set_model_to_fill
10
+ before_action :set_edit_title_and_breadcrumbs, only: [:edit, :update]
10
11
  before_action :fill_model, only: [:create, :update]
11
12
  before_action :authorize_action
12
13
  before_action :reset_pagination_if_filters_changed, only: :index
13
14
  before_action :cache_applied_filters, only: :index
14
15
 
15
16
  def index
16
- @page_title = resource_name.humanize
17
- add_breadcrumb resource_name.humanize
17
+ @page_title = @resource.plural_name.humanize
18
+ add_breadcrumb @resource.plural_name.humanize
18
19
 
19
20
  set_index_params
20
21
  set_filters
21
22
  set_actions
22
23
 
23
- # If we don't get a query object predefined from a child controller like relations, just spin one up
24
+ # If we don't get a query object predefined from a child controller like associations, just spin one up
24
25
  unless defined? @query
25
26
  @query = @resource.class.query_scope
26
27
  end
@@ -30,7 +31,7 @@ module Avo
30
31
  @query = @query.unscoped
31
32
  end
32
33
 
33
- # Eager load the relations
34
+ # Eager load the associations
34
35
  if @resource.includes.present?
35
36
  @query = @query.includes(*@resource.includes)
36
37
  end
@@ -62,9 +63,9 @@ module Avo
62
63
  def show
63
64
  set_actions
64
65
 
65
- @resource = @resource.hydrate(model: @model, view: :show, user: _current_user, params: params)
66
+ @resource.hydrate(model: @model, view: :show, user: _current_user, params: params)
66
67
 
67
- @page_title = @resource.default_panel_name
68
+ @page_title = @resource.default_panel_name.to_s
68
69
 
69
70
  # If we're accessing this resource via another resource add the parent to the breadcrumbs.
70
71
  if params[:via_resource_class].present? && params[:via_resource_id].present?
@@ -75,45 +76,25 @@ module Avo
75
76
  add_breadcrumb via_resource.plural_name, resources_path(resource: via_resource)
76
77
  add_breadcrumb via_resource.model_title, resource_path(model: via_model, resource: via_resource)
77
78
  else
78
- add_breadcrumb resource_name.humanize, resources_path(resource: @resource)
79
+ add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
79
80
  end
80
81
 
81
82
  add_breadcrumb @resource.model_title
83
+ add_breadcrumb I18n.t("avo.details").upcase_first
82
84
  end
83
85
 
84
86
  def new
85
87
  @model = @resource.model_class.new
86
88
  @resource = @resource.hydrate(model: @model, view: :new, user: _current_user)
87
89
 
88
- @page_title = @resource.default_panel_name
89
- add_breadcrumb resource_name.humanize, resources_path(resource: @resource)
90
+ @page_title = @resource.default_panel_name.to_s
91
+ add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
90
92
  add_breadcrumb t("avo.new").humanize
91
93
  end
92
94
 
93
- def edit
94
- @resource = @resource.hydrate(model: @model, view: :edit, user: _current_user)
95
-
96
- @page_title = @resource.default_panel_name
97
-
98
- # If we're accessing this resource via another resource add the parent to the breadcrumbs.
99
- if params[:via_resource_class].present? && params[:via_resource_id].present?
100
- via_resource = Avo::App.get_resource_by_model_name params[:via_resource_class]
101
- via_model = via_resource.class.find_scope.find params[:via_resource_id]
102
- via_resource.hydrate model: via_model
103
-
104
- add_breadcrumb via_resource.plural_name, resources_path(resource: @resource)
105
- add_breadcrumb via_resource.model_title, resource_path(model: via_model, resource: via_resource)
106
- else
107
- add_breadcrumb resource_name.humanize, resources_path(resource: @resource)
108
- end
109
-
110
- add_breadcrumb @resource.model_title, resource_path(model: @resource.model, resource: @resource)
111
- add_breadcrumb t("avo.edit").humanize
112
- end
113
-
114
95
  def create
115
96
  # model gets instantiated and filled in the fill_model method
116
- saved = @model.save
97
+ saved = save_model
117
98
  @resource.hydrate(model: @model, view: :new, user: _current_user)
118
99
 
119
100
  # This means that the record has been created through another parent record and we need to attach it somehow.
@@ -155,38 +136,40 @@ module Avo
155
136
  end
156
137
 
157
138
  format.html { redirect_to redirect_path, notice: "#{@model.class.name} #{t("avo.was_successfully_created")}." }
158
- format.json { render :show, status: :created, location: @model }
159
139
  else
160
- flash[:error] = t "avo.you_missed_something_check_form"
140
+ flash.now[:error] = t "avo.you_missed_something_check_form"
161
141
  format.html { render :new, status: :unprocessable_entity }
162
- format.json { render json: @model.errors, status: :unprocessable_entity }
163
142
  end
164
143
  end
165
144
  end
166
145
 
146
+ def edit
147
+ end
148
+
167
149
  def update
168
150
  # model gets instantiated and filled in the fill_model method
169
- saved = @model.save
151
+ saved = save_model
170
152
  @resource = @resource.hydrate(model: @model, view: :edit, user: _current_user)
171
153
 
172
154
  respond_to do |format|
173
155
  if saved
174
156
  format.html { redirect_to params[:referrer] || resource_path(model: @model, resource: @resource), notice: "#{@model.class.name} #{t("avo.was_successfully_updated")}." }
175
- format.json { render :show, status: :ok, location: @model }
176
157
  else
177
- flash[:error] = t "avo.you_missed_something_check_form"
158
+ flash.now[:error] = t "avo.you_missed_something_check_form"
178
159
  format.html { render :edit, status: :unprocessable_entity }
179
- format.json { render json: @model.errors, status: :unprocessable_entity }
180
160
  end
181
161
  end
182
162
  end
183
163
 
184
164
  def destroy
185
- @model.destroy!
186
-
187
165
  respond_to do |format|
188
- format.html { redirect_to params[:referrer] || resources_path(resource: @resource, turbo_frame: params[:turbo_frame], view_type: params[:view_type]), notice: t("avo.resource_destroyed", attachment_class: @attachment_class) }
189
- format.json { head :no_content }
166
+ if destroy_model
167
+ format.html { redirect_to params[:referrer] || resources_path(resource: @resource, turbo_frame: params[:turbo_frame], view_type: params[:view_type]), notice: t("avo.resource_destroyed", attachment_class: @attachment_class) }
168
+ else
169
+ error_message = @errors.present? ? @errors.first : t("avo.failed")
170
+
171
+ format.html { redirect_back fallback_location: params[:referrer] || resources_path(resource: @resource, turbo_frame: params[:turbo_frame], view_type: params[:view_type]), error: error_message }
172
+ end
190
173
  end
191
174
  end
192
175
 
@@ -207,6 +190,31 @@ module Avo
207
190
 
208
191
  private
209
192
 
193
+ def save_model
194
+ perform_action_and_record_errors do
195
+ @model.save!
196
+ end
197
+ end
198
+
199
+ def destroy_model
200
+ perform_action_and_record_errors do
201
+ @model.destroy!
202
+ end
203
+ end
204
+
205
+ def perform_action_and_record_errors(&block)
206
+ begin
207
+ succeeded = block.call
208
+ rescue => exception
209
+ # In case there's an error somewhere else than the model
210
+ # Example: When you save a license that should create a user for it and creating that user throws and error.
211
+ # Example: When you Try to delete a record and has a foreign key constraint.
212
+ @errors = Array.wrap(exception.message)
213
+ end
214
+
215
+ succeeded
216
+ end
217
+
210
218
  def model_params
211
219
  request_params = params.require(model_param_key).permit(permitted_params)
212
220
 
@@ -291,13 +299,12 @@ module Avo
291
299
  model = @resource.class.find_scope.find params[:resource_id]
292
300
  end
293
301
 
294
- @actions =
295
- @resource
296
- .get_actions
297
- .map do |action|
298
- action.new(model: model, resource: @resource, view: @view)
299
- end
300
- .select { |action| action.visible_in_view }
302
+ @actions = @resource
303
+ .get_actions
304
+ .map do |action|
305
+ action.new(model: model, resource: @resource, view: @view)
306
+ end
307
+ .select { |action| action.visible_in_view }
301
308
  end
302
309
 
303
310
  def applied_filters
@@ -331,5 +338,24 @@ module Avo
331
338
  def applied_filters_cache_key
332
339
  "avo.base_controller.#{@resource.model_key}.applied_filters"
333
340
  end
341
+
342
+ def set_edit_title_and_breadcrumbs
343
+ @resource = @resource.hydrate(model: @model, view: :edit, user: _current_user)
344
+ @page_title = @resource.default_panel_name.to_s
345
+ # If we're accessing this resource via another resource add the parent to the breadcrumbs.
346
+ if params[:via_resource_class].present? && params[:via_resource_id].present?
347
+ via_resource = Avo::App.get_resource_by_model_name params[:via_resource_class]
348
+ via_model = via_resource.class.find_scope.find params[:via_resource_id]
349
+ via_resource.hydrate model: via_model
350
+
351
+ add_breadcrumb via_resource.plural_name, resources_path(resource: @resource)
352
+ add_breadcrumb via_resource.model_title, resource_path(model: via_model, resource: via_resource)
353
+ else
354
+ add_breadcrumb @resource.plural_name.humanize, resources_path(resource: @resource)
355
+ end
356
+
357
+ add_breadcrumb @resource.model_title, resource_path(model: @resource.model, resource: @resource)
358
+ add_breadcrumb t("avo.edit").humanize
359
+ end
334
360
  end
335
361
  end
@@ -0,0 +1,28 @@
1
+ require_dependency "avo/application_controller"
2
+
3
+ module Avo
4
+ class DashboardsController < ApplicationController
5
+ before_action :set_dashboard
6
+
7
+ def show
8
+ end
9
+
10
+ def card
11
+ @card = @dashboard.items.find do |item|
12
+ next unless item.is_card?
13
+
14
+ item.id.to_s == params[:card_id]
15
+ end.tap do |card|
16
+ card.hydrate(dashboard: @dashboard, params: params)
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def set_dashboard
23
+ @dashboard = Avo::App.get_dashboard_by_id params[:dashboard_id]
24
+
25
+ raise ActionController::RoutingError.new("Not Found") if @dashboard.nil? || @dashboard.is_hidden?
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,8 @@
1
+ require_dependency "avo/application_controller"
2
+
3
+ module Avo
4
+ class PrivateController < ApplicationController
5
+ def design
6
+ end
7
+ end
8
+ end
@@ -10,7 +10,11 @@ module Avo
10
10
  def index
11
11
  raise ActionController::BadRequest.new("This feature requires the pro license https://avohq.io/purchase/pro") if App.license.lacks_with_trial(:global_search)
12
12
 
13
- render json: search_resources(Avo::App.resources)
13
+ resources = Avo::App.resources.reject do |resource|
14
+ resource.class.search_hide_from_global_search
15
+ end
16
+
17
+ render json: search_resources(resources)
14
18
  end
15
19
 
16
20
  def show
@@ -16,8 +16,8 @@ module Avo
16
16
  }
17
17
  end
18
18
 
19
- def empty_state(resource_name)
20
- render partial: "avo/partials/empty_state", locals: {resource_name: resource_name}
19
+ def empty_state(**args)
20
+ render Avo::EmptyStateComponent.new **args
21
21
  end
22
22
 
23
23
  def turbo_frame_wrap(name, &block)
@@ -26,56 +26,26 @@ module Avo
26
26
  end
27
27
  end
28
28
 
29
- def a_button(label = nil, **args, &block)
30
- args[:class] = button_classes(args[:class], color: args[:color], variant: args[:variant], size: args[:size])
31
- if args[:spinner]
32
- args[:"data-controller"] = "loading-button"
33
- end
34
-
35
- locals = {
36
- label: label,
37
- args: args
38
- }
39
-
40
- if block
41
- render layout: "avo/partials/a_button", locals: locals do
42
- capture(&block)
43
- end
44
- else
45
- render partial: "avo/partials/a_button", locals: locals
29
+ def a_button(**args, &block)
30
+ render Avo::ButtonComponent.new(is_link: false, **args) do
31
+ capture(&block) if block_given?
46
32
  end
47
33
  end
48
34
 
49
- def a_link(label, url = nil, **args, &block)
50
- args[:class] = button_classes(args[:class], color: args[:color], variant: args[:variant], size: args[:size])
51
-
52
- if block
53
- url = label
54
- end
55
-
56
- locals = {
57
- label: label,
58
- url: url,
59
- args: args
60
- }
61
-
62
- if block
63
- render layout: "avo/partials/a_link", locals: locals do
64
- capture(&block)
65
- end
66
- else
67
- render partial: "avo/partials/a_link", locals: locals
35
+ def a_link(path = nil, **args, &block)
36
+ render Avo::ButtonComponent.new(path, is_link: true, **args) do
37
+ capture(&block) if block_given?
68
38
  end
69
39
  end
70
40
 
71
- def button_classes(extra_classes = nil, color: nil, variant: nil, size: :md)
72
- classes = "inline-flex flex-grow-0 items-center text-sm font-bold leading-none fill-current whitespace-nowrap transition duration-100 rounded-lg shadow-xl transform transition duration-100 active:translate-x-px active:translate-y-px cursor-pointer disabled:cursor-not-allowed #{extra_classes}"
41
+ def button_classes(extra_classes = nil, color: nil, variant: nil, size: :md, active: false)
42
+ classes = "inline-flex flex-grow-0 items-center text-sm font-semibold leading-6 fill-current whitespace-nowrap transition duration-100 rounded transform transition duration-100 active:translate-x-px active:translate-y-px cursor-pointer disabled:cursor-not-allowed #{extra_classes}"
73
43
 
74
44
  if color.present?
75
45
  if variant.present? && (variant.to_sym == :outlined)
76
46
  classes += " bg-white border"
77
47
 
78
- classes += " hover:border-#{color}-700 border-#{color}-600 text-#{color}-600 hover:text-#{color}-700 disabled:border-gray-300 disabled:text-gray-600"
48
+ classes += " hover:border-#{color}-700 border-#{color}-500 text-#{color}-600 hover:text-#{color}-700 disabled:border-gray-300 disabled:text-gray-600"
79
49
  else
80
50
  classes += " text-white bg-#{color}-500 hover:bg-#{color}-600 disabled:bg-#{color}-300"
81
51
  end
@@ -88,9 +58,11 @@ module Avo
88
58
  when :xs
89
59
  " p-2 py-1"
90
60
  when :sm
91
- " p-3"
61
+ " py-1 px-4"
92
62
  when :md
93
- " p-4"
63
+ " py-2 px-4"
64
+ when :xl
65
+ " py-3 px-4"
94
66
  else
95
67
  " p-4"
96
68
  end
@@ -100,9 +72,19 @@ module Avo
100
72
 
101
73
  def svg(file_name, **args)
102
74
  options = {}
103
- options[:class] = args[:class].present? ? args[:class] : "h-4 mr-1"
75
+ options[:class] = args[:class].present? ? args[:class] : ""
104
76
  options[:class] += args[:extra_class].present? ? " #{args[:extra_class]}" : ""
105
77
 
78
+ if args[:'data-target'].present?
79
+ options[:'data-target'] = args[:'data-target']
80
+ end
81
+ if args[:'data-tippy'].present?
82
+ options[:'data-tippy'] = args[:'data-tippy']
83
+ end
84
+ if args[:title].present?
85
+ options[:title] = args[:title]
86
+ end
87
+
106
88
  # Create the path to the svgs directory
107
89
  file_path = "#{Avo::Engine.root}/app/assets/svgs/#{file_name}"
108
90
  file_path = "#{file_path}.svg" unless file_path.end_with? ".svg"
@@ -110,7 +92,7 @@ module Avo
110
92
  # Create a cache hash
111
93
  hash = Digest::MD5.hexdigest "#{file_path.underscore}_#{options}"
112
94
 
113
- svg_content = Avo::App.cache_store.fetch "svg_file_#{hash}", expires_in: 1.year, cache_nils: false do
95
+ svg_content = Avo::App.cache_store.fetch "svg_file_#{hash}", expires_in: 1.week, cache_nils: false do
114
96
  if File.exist?(file_path)
115
97
  file = File.read(file_path)
116
98
 
@@ -134,12 +116,12 @@ module Avo
134
116
  end
135
117
 
136
118
  def input_classes(extra_classes = "", has_error: false)
137
- classes = "appearance-none inline-flex bg-slate-100 disabled:bg-slate-300 disabled:cursor-not-allowed focus:bg-white text-slate-700 disabled:text-slate-700 rounded-md py-2 px-3 leading-tight border outline-none outline"
119
+ classes = "appearance-none inline-flex bg-gray-100 disabled:cursor-not-allowed text-gray-600 disabled:opacity-50 rounded py-2 px-3 leading-tight border focus:border-gray-600 focus-visible:ring-0 focus:text-gray-700"
138
120
 
139
121
  classes += if has_error
140
122
  " border-red-600"
141
123
  else
142
- " border-slate-300"
124
+ " border-gray-200"
143
125
  end
144
126
 
145
127
  classes += " #{extra_classes}"
@@ -47,7 +47,7 @@ module Avo
47
47
 
48
48
  def item_selector_input(floating: false, size: :md)
49
49
  "<input type='checkbox'
50
- class='mx-3 #{"absolute inset-auto left-0 mt-2 z-10 hidden group-hover:block checked:block" if floating} #{size.to_sym == :lg ? "w-5 h-5" : "w-4 h-4"}'
50
+ class='mx-3 rounded #{"absolute inset-auto left-0 mt-2 z-10 hidden group-hover:block checked:block" if floating} #{size.to_sym == :lg ? "w-5 h-5" : "w-4 h-4"}'
51
51
  data-action='input->item-selector#toggle input->item-select-all#update'
52
52
  data-item-select-all-target='itemCheckbox'
53
53
  name='#{t "avo.select_item"}'
@@ -58,7 +58,7 @@ module Avo
58
58
 
59
59
  def item_select_all_input
60
60
  "<input type='checkbox'
61
- class='mx-3 w-4 h-4'
61
+ class='mx-3 rounded w-4 h-4'
62
62
  data-action='input->item-select-all#toggle'
63
63
  data-item-select-all-target='checkbox'
64
64
  name='#{t "avo.select_all"}'
@@ -4,12 +4,12 @@ module Avo
4
4
  return if resource.nil?
5
5
 
6
6
  existing_params = {}
7
- begin
8
- if keep_query_params
7
+ if keep_query_params
8
+ begin
9
9
  existing_params =
10
10
  Addressable::URI.parse(request.fullpath).query_values.symbolize_keys
11
+ rescue
11
12
  end
12
- rescue
13
13
  end
14
14
 
15
15
  # This entry uses `route_key` instead of `model_key` because it's rails that needs `fish_index` to build the correct path
@@ -8,16 +8,23 @@ import { Turbo } from '@hotwired/turbo-rails'
8
8
  import Rails from '@rails/ujs'
9
9
  import tippy from 'tippy.js'
10
10
 
11
+ import 'chartkick/chart.js/chart.esm'
12
+
11
13
  // Toastr alerts
12
14
  import './js/active-storage'
13
15
  import './js/controllers'
14
- import './js/toastr'
15
16
 
16
17
  Rails.start()
17
18
 
18
19
  window.Turbolinks = Turbo
19
20
 
20
- Mousetrap.bind('r r r', () => Turbo.visit(window.location.href, { action: 'replace' }))
21
+ let scrollTop = null
22
+ Mousetrap.bind('r r r', () => {
23
+ // Cpture scroll position
24
+ scrollTop = document.scrollingElement.scrollTop
25
+
26
+ Turbo.visit(window.location.href, { action: 'replace' })
27
+ })
21
28
 
22
29
  function isMac() {
23
30
  const isMac = window.navigator.userAgent.indexOf('Mac OS X')
@@ -36,6 +43,7 @@ function initTippy() {
36
43
  content(reference) {
37
44
  const title = reference.getAttribute('title')
38
45
  reference.removeAttribute('title')
46
+ reference.removeAttribute('data-tippy')
39
47
 
40
48
  return title
41
49
  },
@@ -49,14 +57,27 @@ document.addEventListener('turbo:load', () => {
49
57
  document.body.classList.remove('turbo-loading')
50
58
  initTippy()
51
59
  isMac()
60
+
61
+ // Restore scroll position after r r r turbo reload
62
+ if (scrollTop) {
63
+ setTimeout(() => {
64
+ document.scrollingElement.scrollTo(0, scrollTop)
65
+ scrollTop = 0
66
+ }, 50)
67
+ }
52
68
  })
53
69
 
54
- document.addEventListener('turbo:before-fetch-response', (e) => {
70
+ document.addEventListener('turbo:frame-load', () => {
71
+ initTippy()
72
+ })
73
+
74
+ document.addEventListener('turbo:before-fetch-response', async (e) => {
55
75
  if (e.detail.fetchResponse.response.status === 500) {
56
- const id = e.srcElement.getAttribute('id')
57
- e.srcElement.src = `${window.Avo.configuration.root_path}/failed_to_load?turbo_frame=${id}`
76
+ const { id, src } = e.target
77
+ e.target.src = `${window.Avo.configuration.root_path}/failed_to_load?turbo_frame=${id}&src=${src}`
58
78
  }
59
79
  })
80
+
60
81
  document.addEventListener('turbo:visit', () => document.body.classList.add('turbo-loading'))
61
82
  document.addEventListener('turbo:submit-start', () => document.body.classList.add('turbo-loading'))
62
83
  document.addEventListener('turbo:submit-end', () => document.body.classList.remove('turbo-loading'))
@@ -1,5 +1,5 @@
1
+ import { Alert, Popover } from 'tailwindcss-stimulus-components'
1
2
  import { Application } from '@hotwired/stimulus'
2
- import { Popover } from 'tailwindcss-stimulus-components'
3
3
 
4
4
  const application = Application.start()
5
5
 
@@ -8,6 +8,7 @@ application.debug = false
8
8
  window.Stimulus = application
9
9
 
10
10
  // Register stimulus-components controller
11
+ application.register('alert', Alert)
11
12
  application.register('popover', Popover)
12
13
 
13
14
  export { application }
@@ -4,30 +4,32 @@ import { Controller } from '@hotwired/stimulus'
4
4
  export default class extends Controller {
5
5
  static targets = ['resourceAction', 'standaloneAction']
6
6
 
7
+ static classes = ['enabled', 'disabled']
8
+
7
9
  target = {}
8
10
 
11
+ get targetIsDisabled() {
12
+ return this.target.dataset.disabled === 'true'
13
+ }
14
+
9
15
  enableTarget() {
10
- if (this.targetIsDisabled(this.target)) {
11
- this.target.classList.remove('cursor-wait', 'text-gray-500', 'hover:bg-blue-300')
12
- this.target.classList.add('text-gray-700', 'hover:bg-blue-500')
16
+ if (this.targetIsDisabled) {
17
+ this.target.classList.remove(...this.disabledClasses)
18
+ this.target.classList.add(...this.enabledClasses)
13
19
  this.target.dataset.disabled = false
14
20
  }
15
21
  }
16
22
 
17
23
  disableTarget() {
18
- this.target.classList.add('cursor-wait', 'text-gray-500', 'hover:bg-blue-300')
19
- this.target.classList.remove('text-gray-700', 'hover:bg-blue-500')
24
+ this.target.classList.remove(...this.enabledClasses)
25
+ this.target.classList.add(...this.disabledClasses)
20
26
  this.target.dataset.disabled = true
21
27
  }
22
28
 
23
- targetIsDisabled() {
24
- return this.target.dataset.disabled === 'true'
25
- }
26
-
27
29
  visitAction(event) {
28
30
  this.target = event.target
29
31
 
30
- if (this.targetIsDisabled()) {
32
+ if (this.targetIsDisabled) {
31
33
  event.preventDefault()
32
34
 
33
35
  return
@@ -0,0 +1,33 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+
3
+ export default class extends Controller {
4
+ static targets = ['card'];
5
+
6
+ interval;
7
+
8
+ get parentTurboFrame() {
9
+ return this.context.scope.element.closest('turbo-frame')
10
+ }
11
+
12
+ get refreshInterval() {
13
+ if (this.cardTarget.dataset.refreshEvery) {
14
+ return parseInt(this.cardTarget.dataset.refreshEvery, 10) * 1000
15
+ }
16
+
17
+ return undefined
18
+ }
19
+
20
+ connect() {
21
+ if (this.refreshInterval) {
22
+ this.interval = setInterval(() => {
23
+ this.parentTurboFrame.reload()
24
+ }, this.refreshInterval)
25
+ }
26
+ }
27
+
28
+ cardTargetDisconnected() {
29
+ if (this.interval) {
30
+ clearInterval(this.interval)
31
+ }
32
+ }
33
+ }
@@ -5,6 +5,10 @@ export default class extends Controller {
5
5
 
6
6
  checkbox = {};
7
7
 
8
+ enabledClasses = ['text-black', 'hover:bg-blue-500', 'hover:text-white']
9
+
10
+ disabledClasses = ['text-gray-500']
11
+
8
12
  get actionsPanelPresent() {
9
13
  return this.actionsButtonElement !== null
10
14
  }
@@ -72,8 +76,8 @@ export default class extends Controller {
72
76
 
73
77
  enableResourceActions() {
74
78
  this.actionLinks.forEach((link) => {
75
- link.classList.add('text-gray-700')
76
- link.classList.remove('text-gray-500')
79
+ link.classList.add(...this.enabledClasses)
80
+ link.classList.remove(...this.disabledClasses)
77
81
  link.setAttribute('data-href', link.getAttribute('href'))
78
82
  link.dataset.disabled = false
79
83
  })
@@ -81,8 +85,8 @@ export default class extends Controller {
81
85
 
82
86
  disableResourceActions() {
83
87
  this.actionLinks.forEach((link) => {
84
- link.classList.remove('text-gray-700')
85
- link.classList.add('text-gray-500')
88
+ link.classList.remove(...this.enabledClasses)
89
+ link.classList.add(...this.disabledClasses)
86
90
  link.setAttribute('href', link.getAttribute('data-href'))
87
91
  link.dataset.disabled = true
88
92
  })
@@ -0,0 +1,9 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+
3
+ export default class extends Controller {
4
+ static targets = ['sidebar']
5
+
6
+ toggleSidebar() {
7
+ this.sidebarTarget.classList.toggle('hidden')
8
+ }
9
+ }
@@ -0,0 +1,23 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+ import URI from 'urijs'
3
+
4
+ export default class extends Controller {
5
+ static targets = ['select']
6
+
7
+ get parentTurboFrame() {
8
+ return this.context.scope.element.closest('turbo-frame')
9
+ }
10
+
11
+ onChange(e) {
12
+ if (!this.parentTurboFrame.src) return
13
+
14
+ // Get the frame URL
15
+ const url = new URI(this.parentTurboFrame.src)
16
+ // update the url with the new range param
17
+ url.search({ ...url.query(true), range: e.currentTarget.value })
18
+ // change the src of the frame
19
+ this.parentTurboFrame.src = url.toString()
20
+ // reload the frame with new range
21
+ this.parentTurboFrame.reload()
22
+ }
23
+ }