avo 1.25.2 → 2.0.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.
- checksums.yaml +4 -4
- data/Gemfile +10 -1
- data/Gemfile.lock +19 -6
- data/README.md +33 -28
- data/app/assets/stylesheets/avo.css +7 -2
- data/app/assets/stylesheets/css/breadcrumbs.css +6 -2
- data/app/assets/stylesheets/css/buttons.css +16 -0
- data/app/assets/stylesheets/css/fonts.css +42 -16
- data/app/assets/stylesheets/css/pagination.css +9 -9
- data/app/assets/stylesheets/css/search.css +18 -7
- data/app/assets/stylesheets/css/tooltips.css +1 -0
- data/app/assets/stylesheets/css/typography.css +4 -2
- data/app/assets/svgs/bell.svg +3 -0
- data/app/assets/svgs/dashboards-icon.svg +6 -0
- data/app/assets/svgs/detach.svg +8 -0
- data/app/assets/svgs/edit.svg +5 -1
- data/app/assets/svgs/grid-empty-state.svg +37 -0
- data/app/assets/svgs/grid-view-type.svg +5 -0
- data/app/assets/svgs/heroicons/outline/academic-cap.svg +5 -0
- data/app/assets/svgs/heroicons/outline/adjustments.svg +3 -0
- data/app/assets/svgs/heroicons/outline/annotation.svg +3 -0
- data/app/assets/svgs/heroicons/outline/archive.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-circle-down.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-circle-left.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-circle-right.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-circle-up.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-down.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-left.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-narrow-down.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-narrow-left.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-narrow-right.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-narrow-up.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-right.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-sm-down.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-sm-left.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-sm-right.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-sm-up.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrow-up.svg +3 -0
- data/app/assets/svgs/heroicons/outline/arrows-expand.svg +3 -0
- data/app/assets/svgs/heroicons/outline/at-symbol.svg +3 -0
- data/app/assets/svgs/heroicons/outline/backspace.svg +3 -0
- data/app/assets/svgs/heroicons/outline/badge-check.svg +3 -0
- data/app/assets/svgs/heroicons/outline/ban.svg +3 -0
- data/app/assets/svgs/heroicons/outline/beaker.svg +3 -0
- data/app/assets/svgs/heroicons/outline/bell.svg +3 -0
- data/app/assets/svgs/heroicons/outline/book-open.svg +3 -0
- data/app/assets/svgs/heroicons/outline/bookmark-alt.svg +3 -0
- data/app/assets/svgs/heroicons/outline/bookmark.svg +3 -0
- data/app/assets/svgs/heroicons/outline/briefcase.svg +3 -0
- data/app/assets/svgs/heroicons/outline/cake.svg +3 -0
- data/app/assets/svgs/heroicons/outline/calculator.svg +3 -0
- data/app/assets/svgs/heroicons/outline/calendar.svg +3 -0
- data/app/assets/svgs/heroicons/outline/camera.svg +4 -0
- data/app/assets/svgs/heroicons/outline/cash.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chart-bar.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chart-pie.svg +4 -0
- data/app/assets/svgs/heroicons/outline/chart-square-bar.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chat-alt-2.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chat-alt.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chat.svg +3 -0
- data/app/assets/svgs/heroicons/outline/check-circle.svg +3 -0
- data/app/assets/svgs/heroicons/outline/check.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chevron-double-down.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chevron-double-left.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chevron-double-right.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chevron-double-up.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chevron-down.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chevron-left.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chevron-right.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chevron-up.svg +3 -0
- data/app/assets/svgs/heroicons/outline/chip.svg +3 -0
- data/app/assets/svgs/heroicons/outline/clipboard-check.svg +3 -0
- data/app/assets/svgs/heroicons/outline/clipboard-copy.svg +3 -0
- data/app/assets/svgs/heroicons/outline/clipboard-list.svg +3 -0
- data/app/assets/svgs/heroicons/outline/clipboard.svg +3 -0
- data/app/assets/svgs/heroicons/outline/clock.svg +3 -0
- data/app/assets/svgs/heroicons/outline/cloud-download.svg +3 -0
- data/app/assets/svgs/heroicons/outline/cloud-upload.svg +3 -0
- data/app/assets/svgs/heroicons/outline/cloud.svg +3 -0
- data/app/assets/svgs/heroicons/outline/code.svg +3 -0
- data/app/assets/svgs/heroicons/outline/cog.svg +4 -0
- data/app/assets/svgs/heroicons/outline/collection.svg +3 -0
- data/app/assets/svgs/heroicons/outline/color-swatch.svg +3 -0
- data/app/assets/svgs/heroicons/outline/credit-card.svg +3 -0
- data/app/assets/svgs/heroicons/outline/cube-transparent.svg +3 -0
- data/app/assets/svgs/heroicons/outline/cube.svg +3 -0
- data/app/assets/svgs/heroicons/outline/currency-bangladeshi.svg +3 -0
- data/app/assets/svgs/heroicons/outline/currency-dollar.svg +3 -0
- data/app/assets/svgs/heroicons/outline/currency-euro.svg +3 -0
- data/app/assets/svgs/heroicons/outline/currency-pound.svg +3 -0
- data/app/assets/svgs/heroicons/outline/currency-rupee.svg +3 -0
- data/app/assets/svgs/heroicons/outline/currency-yen.svg +3 -0
- data/app/assets/svgs/heroicons/outline/cursor-click.svg +3 -0
- data/app/assets/svgs/heroicons/outline/database.svg +3 -0
- data/app/assets/svgs/heroicons/outline/desktop-computer.svg +3 -0
- data/app/assets/svgs/heroicons/outline/device-mobile.svg +3 -0
- data/app/assets/svgs/heroicons/outline/device-tablet.svg +3 -0
- data/app/assets/svgs/heroicons/outline/document-add.svg +3 -0
- data/app/assets/svgs/heroicons/outline/document-download.svg +3 -0
- data/app/assets/svgs/heroicons/outline/document-duplicate.svg +3 -0
- data/app/assets/svgs/heroicons/outline/document-remove.svg +3 -0
- data/app/assets/svgs/heroicons/outline/document-report.svg +3 -0
- data/app/assets/svgs/heroicons/outline/document-search.svg +3 -0
- data/app/assets/svgs/heroicons/outline/document-text.svg +3 -0
- data/app/assets/svgs/heroicons/outline/document.svg +3 -0
- data/app/assets/svgs/heroicons/outline/dots-circle-horizontal.svg +3 -0
- data/app/assets/svgs/heroicons/outline/dots-horizontal.svg +3 -0
- data/app/assets/svgs/heroicons/outline/dots-vertical.svg +3 -0
- data/app/assets/svgs/heroicons/outline/download.svg +3 -0
- data/app/assets/svgs/heroicons/outline/duplicate.svg +3 -0
- data/app/assets/svgs/heroicons/outline/emoji-happy.svg +3 -0
- data/app/assets/svgs/heroicons/outline/emoji-sad.svg +3 -0
- data/app/assets/svgs/heroicons/outline/exclamation-circle.svg +3 -0
- data/app/assets/svgs/heroicons/outline/exclamation.svg +3 -0
- data/app/assets/svgs/heroicons/outline/external-link.svg +3 -0
- data/app/assets/svgs/heroicons/outline/eye-off.svg +3 -0
- data/app/assets/svgs/heroicons/outline/eye.svg +4 -0
- data/app/assets/svgs/heroicons/outline/fast-forward.svg +3 -0
- data/app/assets/svgs/heroicons/outline/film.svg +3 -0
- data/app/assets/svgs/heroicons/outline/filter.svg +3 -0
- data/app/assets/svgs/heroicons/outline/finger-print.svg +3 -0
- data/app/assets/svgs/heroicons/outline/fire.svg +4 -0
- data/app/assets/svgs/heroicons/outline/flag.svg +3 -0
- data/app/assets/svgs/heroicons/outline/folder-add.svg +3 -0
- data/app/assets/svgs/heroicons/outline/folder-download.svg +3 -0
- data/app/assets/svgs/heroicons/outline/folder-open.svg +3 -0
- data/app/assets/svgs/heroicons/outline/folder-remove.svg +3 -0
- data/app/assets/svgs/heroicons/outline/folder.svg +3 -0
- data/app/assets/svgs/heroicons/outline/gift.svg +3 -0
- data/app/assets/svgs/heroicons/outline/globe-alt.svg +3 -0
- data/app/assets/svgs/heroicons/outline/globe.svg +3 -0
- data/app/assets/svgs/heroicons/outline/hand.svg +3 -0
- data/app/assets/svgs/heroicons/outline/hashtag.svg +3 -0
- data/app/assets/svgs/heroicons/outline/heart.svg +3 -0
- data/app/assets/svgs/heroicons/outline/home.svg +3 -0
- data/app/assets/svgs/heroicons/outline/identification.svg +3 -0
- data/app/assets/svgs/heroicons/outline/inbox-in.svg +3 -0
- data/app/assets/svgs/heroicons/outline/inbox.svg +3 -0
- data/app/assets/svgs/heroicons/outline/information-circle.svg +3 -0
- data/app/assets/svgs/heroicons/outline/key.svg +3 -0
- data/app/assets/svgs/heroicons/outline/library.svg +3 -0
- data/app/assets/svgs/heroicons/outline/light-bulb.svg +3 -0
- data/app/assets/svgs/heroicons/outline/lightning-bolt.svg +3 -0
- data/app/assets/svgs/heroicons/outline/link.svg +3 -0
- data/app/assets/svgs/heroicons/outline/location-marker.svg +4 -0
- data/app/assets/svgs/heroicons/outline/lock-closed.svg +3 -0
- data/app/assets/svgs/heroicons/outline/lock-open.svg +3 -0
- data/app/assets/svgs/heroicons/outline/login.svg +3 -0
- data/app/assets/svgs/heroicons/outline/logout.svg +3 -0
- data/app/assets/svgs/heroicons/outline/mail-open.svg +3 -0
- data/app/assets/svgs/heroicons/outline/mail.svg +3 -0
- data/app/assets/svgs/heroicons/outline/map.svg +3 -0
- data/app/assets/svgs/heroicons/outline/menu-alt-1.svg +3 -0
- data/app/assets/svgs/heroicons/outline/menu-alt-2.svg +3 -0
- data/app/assets/svgs/heroicons/outline/menu-alt-3.svg +3 -0
- data/app/assets/svgs/heroicons/outline/menu-alt-4.svg +3 -0
- data/app/assets/svgs/heroicons/outline/menu.svg +3 -0
- data/app/assets/svgs/heroicons/outline/microphone.svg +3 -0
- data/app/assets/svgs/heroicons/outline/minus-circle.svg +3 -0
- data/app/assets/svgs/heroicons/outline/minus-sm.svg +3 -0
- data/app/assets/svgs/heroicons/outline/minus.svg +3 -0
- data/app/assets/svgs/heroicons/outline/moon.svg +3 -0
- data/app/assets/svgs/heroicons/outline/music-note.svg +3 -0
- data/app/assets/svgs/heroicons/outline/newspaper.svg +3 -0
- data/app/assets/svgs/heroicons/outline/office-building.svg +3 -0
- data/app/assets/svgs/heroicons/outline/paper-airplane.svg +3 -0
- data/app/assets/svgs/heroicons/outline/paper-clip.svg +3 -0
- data/app/assets/svgs/heroicons/outline/pause.svg +3 -0
- data/app/assets/svgs/heroicons/outline/pencil-alt.svg +3 -0
- data/app/assets/svgs/heroicons/outline/pencil.svg +3 -0
- data/app/assets/svgs/heroicons/outline/phone-incoming.svg +3 -0
- data/app/assets/svgs/heroicons/outline/phone-missed-call.svg +3 -0
- data/app/assets/svgs/heroicons/outline/phone-outgoing.svg +3 -0
- data/app/assets/svgs/heroicons/outline/phone.svg +3 -0
- data/app/assets/svgs/heroicons/outline/photograph.svg +3 -0
- data/app/assets/svgs/heroicons/outline/play.svg +4 -0
- data/app/assets/svgs/heroicons/outline/plus-circle.svg +3 -0
- data/app/assets/svgs/heroicons/outline/plus-sm.svg +3 -0
- data/app/assets/svgs/heroicons/outline/plus.svg +3 -0
- data/app/assets/svgs/heroicons/outline/presentation-chart-bar.svg +3 -0
- data/app/assets/svgs/heroicons/outline/presentation-chart-line.svg +3 -0
- data/app/assets/svgs/heroicons/outline/printer.svg +3 -0
- data/app/assets/svgs/heroicons/outline/puzzle.svg +3 -0
- data/app/assets/svgs/heroicons/outline/qrcode.svg +3 -0
- data/app/assets/svgs/heroicons/outline/question-mark-circle.svg +3 -0
- data/app/assets/svgs/heroicons/outline/receipt-refund.svg +3 -0
- data/app/assets/svgs/heroicons/outline/receipt-tax.svg +3 -0
- data/app/assets/svgs/heroicons/outline/refresh.svg +3 -0
- data/app/assets/svgs/heroicons/outline/reply.svg +3 -0
- data/app/assets/svgs/heroicons/outline/rewind.svg +3 -0
- data/app/assets/svgs/heroicons/outline/rss.svg +3 -0
- data/app/assets/svgs/heroicons/outline/save-as.svg +3 -0
- data/app/assets/svgs/heroicons/outline/save.svg +3 -0
- data/app/assets/svgs/heroicons/outline/scale.svg +3 -0
- data/app/assets/svgs/heroicons/outline/scissors.svg +3 -0
- data/app/assets/svgs/heroicons/outline/search-circle.svg +3 -0
- data/app/assets/svgs/heroicons/outline/search.svg +3 -0
- data/app/assets/svgs/heroicons/outline/selector.svg +3 -0
- data/app/assets/svgs/heroicons/outline/server.svg +3 -0
- data/app/assets/svgs/heroicons/outline/share.svg +3 -0
- data/app/assets/svgs/heroicons/outline/shield-check.svg +3 -0
- data/app/assets/svgs/heroicons/outline/shield-exclamation.svg +3 -0
- data/app/assets/svgs/heroicons/outline/shopping-bag.svg +3 -0
- data/app/assets/svgs/heroicons/outline/shopping-cart.svg +3 -0
- data/app/assets/svgs/heroicons/outline/sort-ascending.svg +3 -0
- data/app/assets/svgs/heroicons/outline/sort-descending.svg +3 -0
- data/app/assets/svgs/heroicons/outline/sparkles.svg +3 -0
- data/app/assets/svgs/heroicons/outline/speakerphone.svg +3 -0
- data/app/assets/svgs/heroicons/outline/star.svg +3 -0
- data/app/assets/svgs/heroicons/outline/status-offline.svg +3 -0
- data/app/assets/svgs/heroicons/outline/status-online.svg +3 -0
- data/app/assets/svgs/heroicons/outline/stop.svg +4 -0
- data/app/assets/svgs/heroicons/outline/sun.svg +3 -0
- data/app/assets/svgs/heroicons/outline/support.svg +3 -0
- data/app/assets/svgs/heroicons/outline/switch-horizontal.svg +3 -0
- data/app/assets/svgs/heroicons/outline/switch-vertical.svg +3 -0
- data/app/assets/svgs/heroicons/outline/table.svg +3 -0
- data/app/assets/svgs/heroicons/outline/tag.svg +3 -0
- data/app/assets/svgs/heroicons/outline/template.svg +3 -0
- data/app/assets/svgs/heroicons/outline/terminal.svg +3 -0
- data/app/assets/svgs/heroicons/outline/thumb-down.svg +3 -0
- data/app/assets/svgs/heroicons/outline/thumb-up.svg +3 -0
- data/app/assets/svgs/heroicons/outline/ticket.svg +3 -0
- data/app/assets/svgs/heroicons/outline/translate.svg +3 -0
- data/app/assets/svgs/heroicons/outline/trash.svg +3 -0
- data/app/assets/svgs/heroicons/outline/trending-down.svg +3 -0
- data/app/assets/svgs/heroicons/outline/trending-up.svg +3 -0
- data/app/assets/svgs/heroicons/outline/truck.svg +4 -0
- data/app/assets/svgs/heroicons/outline/upload.svg +3 -0
- data/app/assets/svgs/heroicons/outline/user-add.svg +3 -0
- data/app/assets/svgs/heroicons/outline/user-circle.svg +3 -0
- data/app/assets/svgs/heroicons/outline/user-group.svg +3 -0
- data/app/assets/svgs/heroicons/outline/user-remove.svg +3 -0
- data/app/assets/svgs/heroicons/outline/user.svg +3 -0
- data/app/assets/svgs/heroicons/outline/users.svg +3 -0
- data/app/assets/svgs/heroicons/outline/variable.svg +3 -0
- data/app/assets/svgs/heroicons/outline/video-camera.svg +3 -0
- data/app/assets/svgs/heroicons/outline/view-boards.svg +3 -0
- data/app/assets/svgs/heroicons/outline/view-grid-add.svg +3 -0
- data/app/assets/svgs/heroicons/outline/view-grid.svg +3 -0
- data/app/assets/svgs/heroicons/outline/view-list.svg +3 -0
- data/app/assets/svgs/heroicons/outline/volume-off.svg +4 -0
- data/app/assets/svgs/heroicons/outline/volume-up.svg +3 -0
- data/app/assets/svgs/heroicons/outline/wifi.svg +3 -0
- data/app/assets/svgs/heroicons/outline/x-circle.svg +3 -0
- data/app/assets/svgs/heroicons/outline/x.svg +3 -0
- data/app/assets/svgs/heroicons/outline/zoom-in.svg +3 -0
- data/app/assets/svgs/heroicons/outline/zoom-out.svg +3 -0
- data/app/assets/svgs/heroicons/solid/academic-cap.svg +3 -0
- data/app/assets/svgs/heroicons/solid/adjustments.svg +3 -0
- data/app/assets/svgs/heroicons/solid/annotation.svg +3 -0
- data/app/assets/svgs/heroicons/solid/archive.svg +4 -0
- data/app/assets/svgs/heroicons/solid/arrow-circle-down.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-circle-left.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-circle-right.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-circle-up.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-down.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-left.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-narrow-down.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-narrow-left.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-narrow-right.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-narrow-up.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-right.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-sm-down.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-sm-left.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-sm-right.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-sm-up.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrow-up.svg +3 -0
- data/app/assets/svgs/heroicons/solid/arrows-expand.svg +3 -0
- data/app/assets/svgs/heroicons/solid/at-symbol.svg +3 -0
- data/app/assets/svgs/heroicons/solid/backspace.svg +3 -0
- data/app/assets/svgs/heroicons/solid/badge-check.svg +3 -0
- data/app/assets/svgs/heroicons/solid/ban.svg +3 -0
- data/app/assets/svgs/heroicons/solid/beaker.svg +3 -0
- data/app/assets/svgs/heroicons/solid/bell.svg +3 -0
- data/app/assets/svgs/heroicons/solid/book-open.svg +3 -0
- data/app/assets/svgs/heroicons/solid/bookmark-alt.svg +3 -0
- data/app/assets/svgs/heroicons/solid/bookmark.svg +3 -0
- data/app/assets/svgs/heroicons/solid/briefcase.svg +4 -0
- data/app/assets/svgs/heroicons/solid/cake.svg +3 -0
- data/app/assets/svgs/heroicons/solid/calculator.svg +3 -0
- data/app/assets/svgs/heroicons/solid/calendar.svg +3 -0
- data/app/assets/svgs/heroicons/solid/camera.svg +3 -0
- data/app/assets/svgs/heroicons/solid/cash.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chart-bar.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chart-pie.svg +4 -0
- data/app/assets/svgs/heroicons/solid/chart-square-bar.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chat-alt-2.svg +4 -0
- data/app/assets/svgs/heroicons/solid/chat-alt.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chat.svg +3 -0
- data/app/assets/svgs/heroicons/solid/check-circle.svg +3 -0
- data/app/assets/svgs/heroicons/solid/check.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chevron-double-down.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chevron-double-left.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chevron-double-right.svg +4 -0
- data/app/assets/svgs/heroicons/solid/chevron-double-up.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chevron-down.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chevron-left.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chevron-right.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chevron-up.svg +3 -0
- data/app/assets/svgs/heroicons/solid/chip.svg +4 -0
- data/app/assets/svgs/heroicons/solid/clipboard-check.svg +4 -0
- data/app/assets/svgs/heroicons/solid/clipboard-copy.svg +4 -0
- data/app/assets/svgs/heroicons/solid/clipboard-list.svg +4 -0
- data/app/assets/svgs/heroicons/solid/clipboard.svg +4 -0
- data/app/assets/svgs/heroicons/solid/clock.svg +3 -0
- data/app/assets/svgs/heroicons/solid/cloud-download.svg +3 -0
- data/app/assets/svgs/heroicons/solid/cloud-upload.svg +4 -0
- data/app/assets/svgs/heroicons/solid/cloud.svg +3 -0
- data/app/assets/svgs/heroicons/solid/code.svg +3 -0
- data/app/assets/svgs/heroicons/solid/cog.svg +3 -0
- data/app/assets/svgs/heroicons/solid/collection.svg +3 -0
- data/app/assets/svgs/heroicons/solid/color-swatch.svg +3 -0
- data/app/assets/svgs/heroicons/solid/credit-card.svg +4 -0
- data/app/assets/svgs/heroicons/solid/cube-transparent.svg +3 -0
- data/app/assets/svgs/heroicons/solid/cube.svg +3 -0
- data/app/assets/svgs/heroicons/solid/currency-bangladeshi.svg +3 -0
- data/app/assets/svgs/heroicons/solid/currency-dollar.svg +4 -0
- data/app/assets/svgs/heroicons/solid/currency-euro.svg +3 -0
- data/app/assets/svgs/heroicons/solid/currency-pound.svg +3 -0
- data/app/assets/svgs/heroicons/solid/currency-rupee.svg +3 -0
- data/app/assets/svgs/heroicons/solid/currency-yen.svg +3 -0
- data/app/assets/svgs/heroicons/solid/cursor-click.svg +3 -0
- data/app/assets/svgs/heroicons/solid/database.svg +5 -0
- data/app/assets/svgs/heroicons/solid/desktop-computer.svg +3 -0
- data/app/assets/svgs/heroicons/solid/device-mobile.svg +3 -0
- data/app/assets/svgs/heroicons/solid/device-tablet.svg +3 -0
- data/app/assets/svgs/heroicons/solid/document-add.svg +3 -0
- data/app/assets/svgs/heroicons/solid/document-download.svg +3 -0
- data/app/assets/svgs/heroicons/solid/document-duplicate.svg +4 -0
- data/app/assets/svgs/heroicons/solid/document-remove.svg +3 -0
- data/app/assets/svgs/heroicons/solid/document-report.svg +3 -0
- data/app/assets/svgs/heroicons/solid/document-search.svg +4 -0
- data/app/assets/svgs/heroicons/solid/document-text.svg +3 -0
- data/app/assets/svgs/heroicons/solid/document.svg +3 -0
- data/app/assets/svgs/heroicons/solid/dots-circle-horizontal.svg +3 -0
- data/app/assets/svgs/heroicons/solid/dots-horizontal.svg +3 -0
- data/app/assets/svgs/heroicons/solid/dots-vertical.svg +3 -0
- data/app/assets/svgs/heroicons/solid/download.svg +3 -0
- data/app/assets/svgs/heroicons/solid/duplicate.svg +4 -0
- data/app/assets/svgs/heroicons/solid/emoji-happy.svg +3 -0
- data/app/assets/svgs/heroicons/solid/emoji-sad.svg +3 -0
- data/app/assets/svgs/heroicons/solid/exclamation-circle.svg +3 -0
- data/app/assets/svgs/heroicons/solid/exclamation.svg +3 -0
- data/app/assets/svgs/heroicons/solid/external-link.svg +4 -0
- data/app/assets/svgs/heroicons/solid/eye-off.svg +4 -0
- data/app/assets/svgs/heroicons/solid/eye.svg +4 -0
- data/app/assets/svgs/heroicons/solid/fast-forward.svg +3 -0
- data/app/assets/svgs/heroicons/solid/film.svg +3 -0
- data/app/assets/svgs/heroicons/solid/filter.svg +3 -0
- data/app/assets/svgs/heroicons/solid/finger-print.svg +5 -0
- data/app/assets/svgs/heroicons/solid/fire.svg +3 -0
- data/app/assets/svgs/heroicons/solid/flag.svg +3 -0
- data/app/assets/svgs/heroicons/solid/folder-add.svg +3 -0
- data/app/assets/svgs/heroicons/solid/folder-download.svg +3 -0
- data/app/assets/svgs/heroicons/solid/folder-open.svg +4 -0
- data/app/assets/svgs/heroicons/solid/folder-remove.svg +3 -0
- data/app/assets/svgs/heroicons/solid/folder.svg +3 -0
- data/app/assets/svgs/heroicons/solid/gift.svg +4 -0
- data/app/assets/svgs/heroicons/solid/globe-alt.svg +3 -0
- data/app/assets/svgs/heroicons/solid/globe.svg +3 -0
- data/app/assets/svgs/heroicons/solid/hand.svg +3 -0
- data/app/assets/svgs/heroicons/solid/hashtag.svg +3 -0
- data/app/assets/svgs/heroicons/solid/heart.svg +3 -0
- data/app/assets/svgs/heroicons/solid/home.svg +3 -0
- data/app/assets/svgs/heroicons/solid/identification.svg +3 -0
- data/app/assets/svgs/heroicons/solid/inbox-in.svg +4 -0
- data/app/assets/svgs/heroicons/solid/inbox.svg +3 -0
- data/app/assets/svgs/heroicons/solid/information-circle.svg +3 -0
- data/app/assets/svgs/heroicons/solid/key.svg +3 -0
- data/app/assets/svgs/heroicons/solid/library.svg +3 -0
- data/app/assets/svgs/heroicons/solid/light-bulb.svg +3 -0
- data/app/assets/svgs/heroicons/solid/lightning-bolt.svg +3 -0
- data/app/assets/svgs/heroicons/solid/link.svg +3 -0
- data/app/assets/svgs/heroicons/solid/location-marker.svg +3 -0
- data/app/assets/svgs/heroicons/solid/lock-closed.svg +3 -0
- data/app/assets/svgs/heroicons/solid/lock-open.svg +3 -0
- data/app/assets/svgs/heroicons/solid/login.svg +3 -0
- data/app/assets/svgs/heroicons/solid/logout.svg +3 -0
- data/app/assets/svgs/heroicons/solid/mail-open.svg +3 -0
- data/app/assets/svgs/heroicons/solid/mail.svg +4 -0
- data/app/assets/svgs/heroicons/solid/map.svg +3 -0
- data/app/assets/svgs/heroicons/solid/menu-alt-1.svg +3 -0
- data/app/assets/svgs/heroicons/solid/menu-alt-2.svg +3 -0
- data/app/assets/svgs/heroicons/solid/menu-alt-3.svg +3 -0
- data/app/assets/svgs/heroicons/solid/menu-alt-4.svg +3 -0
- data/app/assets/svgs/heroicons/solid/menu.svg +3 -0
- data/app/assets/svgs/heroicons/solid/microphone.svg +3 -0
- data/app/assets/svgs/heroicons/solid/minus-circle.svg +3 -0
- data/app/assets/svgs/heroicons/solid/minus-sm.svg +3 -0
- data/app/assets/svgs/heroicons/solid/minus.svg +3 -0
- data/app/assets/svgs/heroicons/solid/moon.svg +3 -0
- data/app/assets/svgs/heroicons/solid/music-note.svg +3 -0
- data/app/assets/svgs/heroicons/solid/newspaper.svg +4 -0
- data/app/assets/svgs/heroicons/solid/office-building.svg +3 -0
- data/app/assets/svgs/heroicons/solid/paper-airplane.svg +3 -0
- data/app/assets/svgs/heroicons/solid/paper-clip.svg +3 -0
- data/app/assets/svgs/heroicons/solid/pause.svg +3 -0
- data/app/assets/svgs/heroicons/solid/pencil-alt.svg +4 -0
- data/app/assets/svgs/heroicons/solid/pencil.svg +3 -0
- data/app/assets/svgs/heroicons/solid/phone-incoming.svg +4 -0
- data/app/assets/svgs/heroicons/solid/phone-missed-call.svg +4 -0
- data/app/assets/svgs/heroicons/solid/phone-outgoing.svg +4 -0
- data/app/assets/svgs/heroicons/solid/phone.svg +3 -0
- data/app/assets/svgs/heroicons/solid/photograph.svg +3 -0
- data/app/assets/svgs/heroicons/solid/play.svg +3 -0
- data/app/assets/svgs/heroicons/solid/plus-circle.svg +3 -0
- data/app/assets/svgs/heroicons/solid/plus-sm.svg +3 -0
- data/app/assets/svgs/heroicons/solid/plus.svg +3 -0
- data/app/assets/svgs/heroicons/solid/presentation-chart-bar.svg +3 -0
- data/app/assets/svgs/heroicons/solid/presentation-chart-line.svg +3 -0
- data/app/assets/svgs/heroicons/solid/printer.svg +3 -0
- data/app/assets/svgs/heroicons/solid/puzzle.svg +3 -0
- data/app/assets/svgs/heroicons/solid/qrcode.svg +4 -0
- data/app/assets/svgs/heroicons/solid/question-mark-circle.svg +3 -0
- data/app/assets/svgs/heroicons/solid/receipt-refund.svg +3 -0
- data/app/assets/svgs/heroicons/solid/receipt-tax.svg +3 -0
- data/app/assets/svgs/heroicons/solid/refresh.svg +3 -0
- data/app/assets/svgs/heroicons/solid/reply.svg +3 -0
- data/app/assets/svgs/heroicons/solid/rewind.svg +3 -0
- data/app/assets/svgs/heroicons/solid/rss.svg +4 -0
- data/app/assets/svgs/heroicons/solid/save-as.svg +4 -0
- data/app/assets/svgs/heroicons/solid/save.svg +3 -0
- data/app/assets/svgs/heroicons/solid/scale.svg +3 -0
- data/app/assets/svgs/heroicons/solid/scissors.svg +4 -0
- data/app/assets/svgs/heroicons/solid/search-circle.svg +4 -0
- data/app/assets/svgs/heroicons/solid/search.svg +3 -0
- data/app/assets/svgs/heroicons/solid/selector.svg +3 -0
- data/app/assets/svgs/heroicons/solid/server.svg +3 -0
- data/app/assets/svgs/heroicons/solid/share.svg +3 -0
- data/app/assets/svgs/heroicons/solid/shield-check.svg +3 -0
- data/app/assets/svgs/heroicons/solid/shield-exclamation.svg +3 -0
- data/app/assets/svgs/heroicons/solid/shopping-bag.svg +3 -0
- data/app/assets/svgs/heroicons/solid/shopping-cart.svg +3 -0
- data/app/assets/svgs/heroicons/solid/sort-ascending.svg +3 -0
- data/app/assets/svgs/heroicons/solid/sort-descending.svg +3 -0
- data/app/assets/svgs/heroicons/solid/sparkles.svg +3 -0
- data/app/assets/svgs/heroicons/solid/speakerphone.svg +3 -0
- data/app/assets/svgs/heroicons/solid/star.svg +3 -0
- data/app/assets/svgs/heroicons/solid/status-offline.svg +3 -0
- data/app/assets/svgs/heroicons/solid/status-online.svg +3 -0
- data/app/assets/svgs/heroicons/solid/stop.svg +3 -0
- data/app/assets/svgs/heroicons/solid/sun.svg +3 -0
- data/app/assets/svgs/heroicons/solid/support.svg +3 -0
- data/app/assets/svgs/heroicons/solid/switch-horizontal.svg +3 -0
- data/app/assets/svgs/heroicons/solid/switch-vertical.svg +3 -0
- data/app/assets/svgs/heroicons/solid/table.svg +3 -0
- data/app/assets/svgs/heroicons/solid/tag.svg +3 -0
- data/app/assets/svgs/heroicons/solid/template.svg +3 -0
- data/app/assets/svgs/heroicons/solid/terminal.svg +3 -0
- data/app/assets/svgs/heroicons/solid/thumb-down.svg +3 -0
- data/app/assets/svgs/heroicons/solid/thumb-up.svg +3 -0
- data/app/assets/svgs/heroicons/solid/ticket.svg +3 -0
- data/app/assets/svgs/heroicons/solid/translate.svg +3 -0
- data/app/assets/svgs/heroicons/solid/trash.svg +3 -0
- data/app/assets/svgs/heroicons/solid/trending-down.svg +3 -0
- data/app/assets/svgs/heroicons/solid/trending-up.svg +3 -0
- data/app/assets/svgs/heroicons/solid/truck.svg +4 -0
- data/app/assets/svgs/heroicons/solid/upload.svg +3 -0
- data/app/assets/svgs/heroicons/solid/user-add.svg +3 -0
- data/app/assets/svgs/heroicons/solid/user-circle.svg +3 -0
- data/app/assets/svgs/heroicons/solid/user-group.svg +3 -0
- data/app/assets/svgs/heroicons/solid/user-remove.svg +3 -0
- data/app/assets/svgs/heroicons/solid/user.svg +3 -0
- data/app/assets/svgs/heroicons/solid/users.svg +3 -0
- data/app/assets/svgs/heroicons/solid/variable.svg +3 -0
- data/app/assets/svgs/heroicons/solid/video-camera.svg +3 -0
- data/app/assets/svgs/heroicons/solid/view-boards.svg +3 -0
- data/app/assets/svgs/heroicons/solid/view-grid-add.svg +3 -0
- data/app/assets/svgs/heroicons/solid/view-grid.svg +3 -0
- data/app/assets/svgs/heroicons/solid/view-list.svg +3 -0
- data/app/assets/svgs/heroicons/solid/volume-off.svg +3 -0
- data/app/assets/svgs/heroicons/solid/volume-up.svg +3 -0
- data/app/assets/svgs/heroicons/solid/wifi.svg +3 -0
- data/app/assets/svgs/{x-circle-sm.svg → heroicons/solid/x-circle.svg} +2 -2
- data/app/assets/svgs/heroicons/solid/x.svg +3 -0
- data/app/assets/svgs/heroicons/solid/zoom-in.svg +4 -0
- data/app/assets/svgs/heroicons/solid/zoom-out.svg +4 -0
- data/app/assets/svgs/logout.svg +3 -0
- data/app/assets/svgs/menu-back.svg +4 -0
- data/app/assets/svgs/menu.svg +3 -0
- data/app/assets/svgs/resources-icon.svg +13 -0
- data/app/assets/svgs/table-empty-state.svg +57 -0
- data/app/assets/svgs/table-view-type.svg +6 -0
- data/app/assets/svgs/three-dots.svg +5 -0
- data/app/assets/svgs/tools-icon.svg +3 -0
- data/app/assets/svgs/trash.svg +7 -1
- data/app/assets/svgs/user-circle.svg +3 -0
- data/app/components/avo/actions_component.html.erb +43 -0
- data/app/components/avo/actions_component.rb +14 -0
- data/app/components/avo/alert_component.html.erb +25 -1
- data/app/components/avo/alert_component.rb +24 -0
- data/app/components/avo/button_component.html.erb +1 -0
- data/app/components/avo/button_component.rb +143 -0
- data/app/components/avo/card_component.html.erb +40 -0
- data/app/components/avo/card_component.rb +11 -0
- data/app/components/avo/common_field_wrapper_component.html.erb +15 -0
- data/app/components/avo/common_field_wrapper_component.rb +20 -0
- data/app/components/avo/dashboards/divider_component.html.erb +9 -0
- data/app/components/avo/dashboards/divider_component.rb +19 -0
- data/app/components/avo/edit/field_wrapper_component.html.erb +10 -19
- data/app/components/avo/edit/field_wrapper_component.rb +0 -8
- data/app/components/avo/empty_state_component.html.erb +12 -0
- data/app/components/avo/empty_state_component.rb +24 -0
- data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +2 -1
- data/app/components/avo/fields/boolean_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/boolean_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/boolean_group_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/common/boolean_check_component.html.erb +4 -4
- data/app/components/avo/fields/common/boolean_group_component.html.erb +2 -2
- data/app/components/avo/fields/common/files_list_viewer_component.html.erb +2 -2
- data/app/components/avo/fields/common/gravatar_viewer_component.html.erb +1 -1
- data/app/components/avo/fields/common/heading_component.html.erb +2 -2
- data/app/components/avo/fields/common/key_value_component.html.erb +2 -2
- data/app/components/avo/fields/common/single_file_viewer_component.html.erb +42 -23
- data/app/components/avo/fields/common/single_file_viewer_component.rb +34 -6
- data/app/components/avo/fields/common/status_viewer_component.html.erb +2 -2
- data/app/components/avo/fields/external_image_field/index_component.html.erb +1 -1
- data/app/components/avo/fields/file_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/file_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_many_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/has_one_field/show_component.html.erb +4 -4
- data/app/components/avo/fields/heading_field/edit_component.html.erb +1 -1
- data/app/components/avo/fields/heading_field/show_component.html.erb +1 -1
- data/app/components/avo/fields/trix_field/edit_component.html.erb +1 -0
- data/app/components/avo/filters_component.html.erb +37 -0
- data/app/components/avo/filters_component.rb +14 -0
- data/app/components/avo/{alerts_component.html.erb → flash_alerts_component.html.erb} +1 -1
- data/app/components/avo/flash_alerts_component.rb +9 -0
- data/app/components/avo/index/field_wrapper_component.html.erb +8 -2
- data/app/components/avo/index/field_wrapper_component.rb +2 -1
- data/app/components/avo/index/grid_item_component.html.erb +13 -10
- data/app/components/avo/index/ordering/buttons_component.rb +2 -0
- data/app/components/avo/index/resource_controls_component.html.erb +6 -5
- data/app/components/avo/index/resource_grid_component.html.erb +3 -3
- data/app/components/avo/index/resource_table_component.html.erb +10 -14
- data/app/components/avo/index/table_row_component.html.erb +1 -1
- data/app/components/avo/modal_component.html.erb +9 -7
- data/app/{views/avo/partials/_paginator.html.erb → components/avo/paginator_component.html.erb} +16 -16
- data/app/components/avo/paginator_component.rb +17 -0
- data/app/components/avo/panel_component.html.erb +21 -17
- data/app/components/avo/panel_component.rb +8 -2
- data/app/components/avo/profile_item_component.html.erb +3 -0
- data/app/components/avo/profile_item_component.rb +11 -0
- data/app/components/avo/resource_component.rb +1 -1
- data/app/components/avo/show/field_wrapper_component.html.erb +8 -15
- data/app/components/avo/show/field_wrapper_component.rb +0 -4
- data/app/components/avo/sidebar_component.html.erb +51 -0
- data/app/components/avo/sidebar_component.rb +19 -0
- data/app/components/avo/sidebar_heading_component.html.erb +3 -0
- data/app/components/avo/sidebar_heading_component.rb +11 -0
- data/app/components/avo/sidebar_item_component.html.erb +3 -0
- data/app/components/avo/sidebar_item_component.rb +10 -0
- data/app/components/avo/sidebar_profile_component.html.erb +36 -0
- data/app/components/avo/sidebar_profile_component.rb +43 -0
- data/app/components/avo/turbo_frame_wrapper_component.html.erb +8 -9
- data/app/components/avo/views/resource_edit_component.html.erb +16 -19
- data/app/components/avo/views/resource_index_component.html.erb +44 -35
- data/app/components/avo/views/resource_new_component.html.erb +18 -16
- data/app/components/avo/views/resource_show_component.html.erb +36 -34
- data/app/components/avo/views/resource_show_component.rb +2 -3
- data/app/controllers/avo/application_controller.rb +43 -12
- data/app/controllers/avo/{relations_controller.rb → associations_controller.rb} +1 -3
- data/app/controllers/avo/attachments_controller.rb +1 -5
- data/app/controllers/avo/base_controller.rb +20 -24
- data/app/controllers/avo/dashboards_controller.rb +28 -0
- data/app/controllers/avo/private_controller.rb +8 -0
- data/app/helpers/avo/application_helper.rb +29 -47
- data/app/helpers/avo/resources_helper.rb +2 -2
- data/app/helpers/avo/url_helpers.rb +5 -9
- data/app/javascript/avo.js +22 -2
- data/app/javascript/js/application.js +2 -1
- data/app/javascript/js/controllers/actions_picker_controller.js +12 -10
- data/app/javascript/js/controllers/dashboard_card_controller.js +33 -0
- data/app/javascript/js/controllers/item_selector_controller.js +8 -4
- data/app/javascript/js/controllers/mobile_controller.js +9 -0
- data/app/javascript/js/controllers/select_controller.js +23 -0
- data/app/javascript/js/controllers.js +6 -0
- data/app/views/avo/actions/show.html.erb +22 -17
- data/app/views/avo/{relations → associations}/new.html.erb +16 -6
- data/app/views/avo/base/_multiple_select_filter.html.erb +5 -1
- data/app/views/avo/base/_text_filter.html.erb +3 -1
- data/app/views/avo/base/show.html.erb +1 -1
- data/app/views/avo/dashboards/_chartkick_card.html.erb +3 -0
- data/app/views/avo/dashboards/_metric_card.html.erb +5 -0
- data/app/views/avo/dashboards/card.html.erb +3 -0
- data/app/views/avo/dashboards/show.html.erb +35 -0
- data/app/views/avo/home/index.html.erb +1 -5
- data/app/views/avo/partials/_custom_tools_alert.html.erb +2 -2
- data/app/views/avo/partials/_global_search.html.erb +3 -3
- data/app/views/avo/partials/_header.html.erb +1 -1
- data/app/views/avo/partials/_logo.html.erb +1 -1
- data/app/views/avo/partials/_navbar.html.erb +11 -0
- data/app/views/avo/partials/_resource_search.html.erb +1 -1
- data/app/views/avo/partials/_sortable_component.html.erb +1 -1
- data/app/views/avo/partials/_table_header.html.erb +4 -4
- data/app/views/avo/partials/_view_toggle_button.html.erb +36 -16
- data/app/views/avo/private/_links_and_buttons.html.erb +57 -0
- data/app/views/avo/private/design.html.erb +27 -0
- data/app/views/layouts/avo/application.html.erb +20 -31
- data/avo.gemspec +4 -2
- data/config/routes.rb +19 -11
- data/lib/avo/app.rb +30 -3
- data/lib/avo/base_resource.rb +6 -8
- data/lib/avo/dashboards/base_card.rb +151 -0
- data/lib/avo/dashboards/base_dashboard.rb +54 -0
- data/lib/avo/dashboards/base_divider.rb +23 -0
- data/lib/avo/dashboards/chartkick_card.rb +77 -0
- data/lib/avo/dashboards/metric_card.rb +9 -0
- data/lib/avo/dashboards/partial_card.rb +7 -0
- data/lib/avo/dynamic_router.rb +3 -0
- data/lib/avo/engine.rb +5 -1
- data/lib/avo/fields/date_field.rb +1 -1
- data/lib/avo/fields/gravatar_field.rb +2 -2
- data/lib/avo/hosts/dashboard_card.rb +21 -0
- data/lib/avo/hosts/ordering.rb +1 -1
- data/lib/avo/licensing/license.rb +4 -2
- data/lib/avo/licensing/pro_license.rb +2 -1
- data/lib/avo/version.rb +1 -1
- data/lib/avo.rb +24 -1
- data/lib/generators/avo/chartkick_card_generator.rb +16 -0
- data/lib/generators/avo/dashboard_generator.rb +16 -0
- data/lib/generators/avo/metric_card_generator.rb +16 -0
- data/lib/generators/avo/partial_card_generator.rb +17 -0
- data/lib/generators/avo/templates/cards/chartkick_card.tt +16 -0
- data/lib/generators/avo/templates/cards/chartkick_card_sample.tt +26 -0
- data/lib/generators/avo/templates/cards/metric_card.tt +8 -0
- data/lib/generators/avo/templates/cards/metric_card_sample.tt +38 -0
- data/lib/generators/avo/templates/cards/partial_card.tt +8 -0
- data/lib/generators/avo/templates/cards/partial_card_partial.tt +8 -0
- data/lib/generators/avo/templates/cards/partial_card_sample.tt +8 -0
- data/lib/generators/avo/templates/dashboards/dashboard.tt +9 -0
- data/lib/generators/avo/templates/locales/avo.en.yml +11 -4
- data/lib/generators/avo/templates/locales/avo.nb-NO.yml +5 -2
- data/lib/generators/avo/templates/locales/avo.pt-BR.yml +4 -2
- data/lib/generators/avo/templates/locales/avo.ro.yml +4 -1
- data/lib/generators/avo/templates/tool/sidebar_item.tt +1 -1
- data/public/avo-assets/avo.css +1300 -1121
- data/public/avo-assets/avo.js +348 -88688
- data/public/avo-assets/avo.js.map +3 -3
- data/public/avo-assets/fonts/inter-v7-latin-500.eot +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-500.svg +351 -0
- data/public/avo-assets/fonts/inter-v7-latin-500.ttf +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-500.woff +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-500.woff2 +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-600.eot +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-600.svg +351 -0
- data/public/avo-assets/fonts/inter-v7-latin-600.ttf +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-600.woff +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-600.woff2 +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-700.eot +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-700.svg +352 -0
- data/public/avo-assets/fonts/inter-v7-latin-700.ttf +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-700.woff +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-700.woff2 +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-regular.eot +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-regular.svg +351 -0
- data/public/avo-assets/fonts/inter-v7-latin-regular.ttf +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-regular.woff +0 -0
- data/public/avo-assets/fonts/inter-v7-latin-regular.woff2 +0 -0
- data/public/avo-assets/logo-on-white.png +0 -0
- data/public/avo-assets/logo.png +0 -0
- metadata +579 -50
- data/app/assets/builds/action_cable.js +0 -2
- data/app/assets/builds/action_cable.js.map +0 -7
- data/app/assets/builds/application.js +0 -2
- data/app/assets/builds/application.js.map +0 -7
- data/app/assets/builds/avo.css +0 -8610
- data/app/assets/builds/avo.js +0 -88762
- data/app/assets/builds/avo.js.map +0 -7
- data/app/assets/builds/avo_custom.js +0 -6
- data/app/assets/builds/avo_custom.js.map +0 -7
- data/app/assets/images/avo/logo.png +0 -0
- data/app/assets/svgs/check-circle-sm.svg +0 -3
- data/app/components/avo/alerts_component.rb +0 -5
- data/app/components/avo/fields/common/multiple_file_viewer_component.html.erb +0 -35
- data/app/components/avo/fields/common/multiple_file_viewer_component.rb +0 -15
- data/app/components/avo/navigation_heading_component.html.erb +0 -3
- data/app/components/avo/navigation_heading_component.rb +0 -7
- data/app/components/avo/navigation_link_component.html.erb +0 -3
- data/app/components/avo/navigation_link_component.rb +0 -11
- data/app/javascript/js/toastr.js +0 -10
- data/app/views/avo/attachments/show.html.erb +0 -14
- data/app/views/avo/base/_actions.html.erb +0 -36
- data/app/views/avo/base/_filters.html.erb +0 -34
- data/app/views/avo/partials/_a_button.html.erb +0 -7
- data/app/views/avo/partials/_a_link.html.erb +0 -7
- data/app/views/avo/partials/_empty_state.html.erb +0 -17
- data/app/views/avo/partials/_profile_dropdown.html.erb +0 -25
- data/app/views/avo/sidebar/_sidebar.html.erb +0 -31
- data/lib/avo/services/panel_service.rb +0 -27
- data/public/avo-assets/fonts/nunito-v16-latin-700.eot +0 -0
- data/public/avo-assets/fonts/nunito-v16-latin-700.svg +0 -388
- data/public/avo-assets/fonts/nunito-v16-latin-700.ttf +0 -0
- data/public/avo-assets/fonts/nunito-v16-latin-700.woff +0 -0
- data/public/avo-assets/fonts/nunito-v16-latin-700.woff2 +0 -0
- data/public/avo-assets/fonts/nunito-v16-latin-regular.eot +0 -0
- data/public/avo-assets/fonts/nunito-v16-latin-regular.svg +0 -380
- data/public/avo-assets/fonts/nunito-v16-latin-regular.ttf +0 -0
- data/public/avo-assets/fonts/nunito-v16-latin-regular.woff +0 -0
- data/public/avo-assets/fonts/nunito-v16-latin-regular.woff2 +0 -0
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
|
@@ -44,6 +45,7 @@ module Avo
|
|
44
45
|
end
|
45
46
|
|
46
47
|
init_resources
|
48
|
+
init_dashboards if license.has_with_trial(:dashboards)
|
47
49
|
end
|
48
50
|
|
49
51
|
# This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array
|
@@ -82,6 +84,20 @@ module Avo
|
|
82
84
|
end
|
83
85
|
end
|
84
86
|
|
87
|
+
def init_dashboards
|
88
|
+
self.dashboards = Dashboards::BaseDashboard.descendants
|
89
|
+
.select do |dashboard|
|
90
|
+
dashboard != Dashboards::BaseDashboard
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Returns the Avo dashboard by id
|
95
|
+
def get_dashboard_by_id(id)
|
96
|
+
dashboards.find do |dashboard|
|
97
|
+
dashboard.id == id
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
85
101
|
# Returns the Avo resource by camelized name
|
86
102
|
#
|
87
103
|
# get_resource_by_name('User') => UserResource
|
@@ -132,15 +148,26 @@ module Avo
|
|
132
148
|
.sort_by { |r| r.name }
|
133
149
|
end
|
134
150
|
|
151
|
+
def get_available_dashboards(user = nil)
|
152
|
+
dashboards.sort_by { |r| r.name }
|
153
|
+
end
|
154
|
+
|
135
155
|
def resources_navigation(user = nil)
|
136
|
-
get_available_resources(user)
|
137
|
-
resource
|
138
|
-
|
156
|
+
get_available_resources(user)
|
157
|
+
.select do |resource|
|
158
|
+
resource.model_class.present?
|
159
|
+
end
|
139
160
|
.select do |resource|
|
140
161
|
resource.visible_on_sidebar
|
141
162
|
end
|
142
163
|
end
|
143
164
|
|
165
|
+
def get_dashboards(user = nil)
|
166
|
+
return [] unless App.license.has_with_trial(:resource_ordering)
|
167
|
+
|
168
|
+
get_available_dashboards(user)
|
169
|
+
end
|
170
|
+
|
144
171
|
# Insert any partials that we find in app/views/avo/sidebar/items.
|
145
172
|
def get_sidebar_partials
|
146
173
|
Dir.glob(Rails.root.join("app", "views", "avo", "sidebar", "items", "*.html.erb"))
|
data/lib/avo/base_resource.rb
CHANGED
@@ -92,7 +92,9 @@ module Avo
|
|
92
92
|
|
93
93
|
def initialize
|
94
94
|
unless self.class.model_class.present?
|
95
|
-
|
95
|
+
if model_class.present?
|
96
|
+
self.class.model_class = model_class.base_class
|
97
|
+
end
|
96
98
|
end
|
97
99
|
end
|
98
100
|
|
@@ -209,9 +211,9 @@ module Avo
|
|
209
211
|
|
210
212
|
case @view
|
211
213
|
when :show
|
212
|
-
|
214
|
+
model_title
|
213
215
|
when :edit
|
214
|
-
|
216
|
+
model_title
|
215
217
|
when :new
|
216
218
|
I18n.t("avo.create_new_item", item: name.downcase).upcase_first
|
217
219
|
end
|
@@ -406,15 +408,11 @@ module Avo
|
|
406
408
|
# This is used as the model class ID
|
407
409
|
# We use this instead of the route_key to maintain compatibility with uncountable models
|
408
410
|
# With uncountable models route key appends an _index suffix (Fish->fish_index)
|
409
|
-
# Example: User->users, MediaItem->
|
411
|
+
# Example: User->users, MediaItem->medie_items, Fish->fish
|
410
412
|
def model_key
|
411
413
|
model_class.model_name.plural
|
412
414
|
end
|
413
415
|
|
414
|
-
def model_name
|
415
|
-
model_class.model_name
|
416
|
-
end
|
417
|
-
|
418
416
|
def singular_model_key
|
419
417
|
model_class.model_name.singular
|
420
418
|
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
module Avo
|
2
|
+
module Dashboards
|
3
|
+
class BaseCard
|
4
|
+
class_attribute :id
|
5
|
+
class_attribute :label
|
6
|
+
class_attribute :description
|
7
|
+
class_attribute :cols, default: 1
|
8
|
+
class_attribute :rows, default: 1
|
9
|
+
class_attribute :initial_range
|
10
|
+
class_attribute :ranges, default: []
|
11
|
+
class_attribute :refresh_every
|
12
|
+
class_attribute :display_header, default: true
|
13
|
+
# private
|
14
|
+
class_attribute :result_data
|
15
|
+
class_attribute :query_block
|
16
|
+
|
17
|
+
attr_accessor :dashboard
|
18
|
+
attr_accessor :params
|
19
|
+
|
20
|
+
delegate :context, to: ::Avo::App
|
21
|
+
|
22
|
+
class << self
|
23
|
+
def query(&block)
|
24
|
+
self.query_block = block
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(dashboard:)
|
29
|
+
@dashboard = dashboard
|
30
|
+
end
|
31
|
+
|
32
|
+
def label
|
33
|
+
return self.class.label.to_s if self.class.label.to_s.present?
|
34
|
+
|
35
|
+
self.class.id.to_s.humanize
|
36
|
+
end
|
37
|
+
|
38
|
+
def translated_range(range)
|
39
|
+
return "#{range} days" if range.is_a? Integer
|
40
|
+
|
41
|
+
case range
|
42
|
+
when "MTD"
|
43
|
+
"Month to date"
|
44
|
+
when "QTD"
|
45
|
+
"Quarter to date"
|
46
|
+
when "YTD"
|
47
|
+
"Year to date"
|
48
|
+
when "TODAY"
|
49
|
+
"Today"
|
50
|
+
else
|
51
|
+
range
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def parsed_ranges
|
56
|
+
return unless ranges.present?
|
57
|
+
|
58
|
+
ranges.map { |range| [translated_range(range), range] }
|
59
|
+
end
|
60
|
+
|
61
|
+
def turbo_frame
|
62
|
+
"#{dashboard.id}_#{id}"
|
63
|
+
end
|
64
|
+
|
65
|
+
def frame_url(enforced_range: nil)
|
66
|
+
enforced_range ||= initial_range || ranges.first
|
67
|
+
"#{Avo::App.root_path}/dashboards/#{dashboard.id}/cards/#{id}?turbo_frame=#{turbo_frame}&range=#{enforced_range}"
|
68
|
+
end
|
69
|
+
|
70
|
+
def card_classes
|
71
|
+
result = ""
|
72
|
+
|
73
|
+
result += case self.class.cols.to_i
|
74
|
+
when 1
|
75
|
+
" sm:col-span-1"
|
76
|
+
when 2
|
77
|
+
" sm:col-span-2"
|
78
|
+
when 3
|
79
|
+
" sm:col-span-3"
|
80
|
+
when 4
|
81
|
+
" sm:col-span-4"
|
82
|
+
when 5
|
83
|
+
" sm:col-span-5"
|
84
|
+
when 6
|
85
|
+
" sm:col-span-6"
|
86
|
+
else
|
87
|
+
" sm:col-span-1"
|
88
|
+
end
|
89
|
+
|
90
|
+
result += case self.class.rows.to_i
|
91
|
+
when 1
|
92
|
+
" h-36"
|
93
|
+
when 2
|
94
|
+
" h-72"
|
95
|
+
when 3
|
96
|
+
" h-[27rem]"
|
97
|
+
when 4
|
98
|
+
" h-[36rem]"
|
99
|
+
when 5
|
100
|
+
" h-[45rem]"
|
101
|
+
when 6
|
102
|
+
" h-[54rem]"
|
103
|
+
end
|
104
|
+
|
105
|
+
result
|
106
|
+
end
|
107
|
+
|
108
|
+
def type
|
109
|
+
return :metric if self.class.superclass == ::Avo::Dashboards::MetricCard
|
110
|
+
return :chartkick if self.class.superclass == ::Avo::Dashboards::ChartkickCard
|
111
|
+
return :partial if self.class.superclass == ::Avo::Dashboards::PartialCard
|
112
|
+
end
|
113
|
+
|
114
|
+
def compute_result
|
115
|
+
Avo::Hosts::DashboardCard.new(card: self, dashboard: dashboard, params: params, context: context, range: range)
|
116
|
+
.compute_result
|
117
|
+
|
118
|
+
self
|
119
|
+
end
|
120
|
+
|
121
|
+
def hydrate(dashboard: nil, params: nil)
|
122
|
+
@dashboard = dashboard if dashboard.present?
|
123
|
+
@params = params if params.present?
|
124
|
+
|
125
|
+
self
|
126
|
+
end
|
127
|
+
|
128
|
+
def range
|
129
|
+
return params[:range] if params.present? && params[:range].present?
|
130
|
+
|
131
|
+
return initial_range if initial_range.present?
|
132
|
+
|
133
|
+
ranges.first
|
134
|
+
end
|
135
|
+
|
136
|
+
def result(data)
|
137
|
+
self.result_data = data
|
138
|
+
|
139
|
+
self
|
140
|
+
end
|
141
|
+
|
142
|
+
def is_card?
|
143
|
+
true
|
144
|
+
end
|
145
|
+
|
146
|
+
def is_divider?
|
147
|
+
false
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Avo
|
2
|
+
module Dashboards
|
3
|
+
class BaseDashboard
|
4
|
+
extend ActiveSupport::DescendantsTracker
|
5
|
+
|
6
|
+
class_attribute :id
|
7
|
+
class_attribute :name
|
8
|
+
class_attribute :description
|
9
|
+
class_attribute :items_holder
|
10
|
+
class_attribute :grid_cols, default: 3
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def card(klass)
|
14
|
+
self.items_holder ||= []
|
15
|
+
|
16
|
+
self.items_holder << klass.new(dashboard: self)
|
17
|
+
end
|
18
|
+
|
19
|
+
def divider(**args)
|
20
|
+
self.items_holder ||= []
|
21
|
+
|
22
|
+
self.items_holder << BaseDivider.new(**args)
|
23
|
+
end
|
24
|
+
|
25
|
+
def items
|
26
|
+
self.items_holder
|
27
|
+
end
|
28
|
+
|
29
|
+
def classes
|
30
|
+
case grid_cols
|
31
|
+
when 3
|
32
|
+
"sm:grid-cols-3"
|
33
|
+
when 4
|
34
|
+
"sm:grid-cols-4"
|
35
|
+
when 5
|
36
|
+
"sm:grid-cols-5"
|
37
|
+
when 6
|
38
|
+
"sm:grid-cols-6"
|
39
|
+
else
|
40
|
+
"sm:grid-cols-3"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def navigation_label
|
45
|
+
name
|
46
|
+
end
|
47
|
+
|
48
|
+
def navigation_path
|
49
|
+
"#{Avo::App.root_path}/dashboards/#{id}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Avo
|
2
|
+
module Dashboards
|
3
|
+
class BaseDivider
|
4
|
+
attr_reader :label
|
5
|
+
attr_reader :invisible
|
6
|
+
|
7
|
+
class_attribute :id
|
8
|
+
|
9
|
+
def initialize(label: nil, invisible: false)
|
10
|
+
@label = label
|
11
|
+
@invisible = invisible
|
12
|
+
end
|
13
|
+
|
14
|
+
def is_divider?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
18
|
+
def is_card?
|
19
|
+
false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module Avo
|
2
|
+
module Dashboards
|
3
|
+
class ChartkickCard < BaseCard
|
4
|
+
class_attribute :chart_type
|
5
|
+
class_attribute :chart_options, default: {}
|
6
|
+
class_attribute :flush, default: true
|
7
|
+
class_attribute :legend, default: false
|
8
|
+
class_attribute :scale, default: false
|
9
|
+
class_attribute :legend_on_left, default: false
|
10
|
+
class_attribute :legend_on_right, default: false
|
11
|
+
|
12
|
+
def chartkick_classes
|
13
|
+
case chart_type
|
14
|
+
when :area_chart, :line_chart, :scatter_chart, :bar_chart, :column_chart
|
15
|
+
if self.class.flush
|
16
|
+
"-mx-1.5 top-auto -bottom-1.5"
|
17
|
+
else
|
18
|
+
"px-2"
|
19
|
+
end
|
20
|
+
else
|
21
|
+
""
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def chartkick_options
|
26
|
+
card_height = 144
|
27
|
+
card_heading = 32
|
28
|
+
|
29
|
+
default = {
|
30
|
+
# figure our the available height for the chart
|
31
|
+
height: "#{(rows * card_height) - card_heading}px",
|
32
|
+
colors: %w[#0B8AE2 #34C683 #2AB1EE #34C6A8],
|
33
|
+
library: {
|
34
|
+
discrete: false,
|
35
|
+
points: false,
|
36
|
+
animation: true
|
37
|
+
},
|
38
|
+
id: "#{dashboard.id}-#{rand(10_000..99_999)}"
|
39
|
+
}
|
40
|
+
|
41
|
+
no_scale_options = {display: false}
|
42
|
+
no_scale = {
|
43
|
+
library: {
|
44
|
+
scales: {
|
45
|
+
x: no_scale_options,
|
46
|
+
y: no_scale_options
|
47
|
+
}
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
no_legend = {library: {plugins: {legend: {display: false}}}}
|
52
|
+
legend_on_left = {library: {plugins: {legend: {position: "left"}}}}
|
53
|
+
legend_on_right = {library: {plugins: {legend: {position: "right"}}}}
|
54
|
+
|
55
|
+
# Add chart.js configuration for the different states
|
56
|
+
unless self.class.legend
|
57
|
+
default = default.deep_merge(no_legend)
|
58
|
+
end
|
59
|
+
|
60
|
+
unless self.class.scale
|
61
|
+
default = default.deep_merge(no_scale)
|
62
|
+
end
|
63
|
+
|
64
|
+
if self.class.legend_on_left
|
65
|
+
default = default.deep_merge(legend_on_left)
|
66
|
+
end
|
67
|
+
|
68
|
+
if self.class.legend_on_right
|
69
|
+
default = default.deep_merge(legend_on_right)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Add the custom chart options at the end
|
73
|
+
default.deep_merge(self.class.chart_options)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/lib/avo/dynamic_router.rb
CHANGED
data/lib/avo/engine.rb
CHANGED
@@ -24,7 +24,9 @@ module Avo
|
|
24
24
|
["app", "avo", "fields"],
|
25
25
|
["app", "avo", "filters"],
|
26
26
|
["app", "avo", "actions"],
|
27
|
-
["app", "avo", "resources"]
|
27
|
+
["app", "avo", "resources"],
|
28
|
+
["app", "avo", "dashboards"],
|
29
|
+
["app", "avo", "cards"]
|
28
30
|
].each do |path_params|
|
29
31
|
path = Rails.root.join(*path_params)
|
30
32
|
|
@@ -42,6 +44,8 @@ module Avo
|
|
42
44
|
initializer "avo.reload_avo_files" do |app|
|
43
45
|
if Avo::IN_DEVELOPMENT && ENV["RELOAD_AVO_FILES"]
|
44
46
|
avo_root_path = Avo::Engine.root.to_s
|
47
|
+
# This should only be happening when ENV["RELOAD_AVO_FILES"] is true because it loads all the files into memory on every change and makes rails sluggish.
|
48
|
+
app.config.autoload_paths += [Avo::Engine.root.join("lib", "avo").to_s]
|
45
49
|
# Register reloader
|
46
50
|
app.reloaders << app.config.file_watcher.new([], {
|
47
51
|
Avo::Engine.root.join("lib", "avo").to_s => ["rb"]
|
@@ -17,8 +17,8 @@ module Avo
|
|
17
17
|
hide_on [:edit, :new]
|
18
18
|
|
19
19
|
@link_to_resource = args[:link_to_resource].present? ? args[:link_to_resource] : false
|
20
|
-
@rounded = args[:rounded].
|
21
|
-
@size = args[:size].present? ? args[:size].to_i :
|
20
|
+
@rounded = args[:rounded].nil? ? true : args[:rounded]
|
21
|
+
@size = args[:size].present? ? args[:size].to_i : 32
|
22
22
|
@default = args[:default].present? ? ERB::Util.url_encode(args[:default]).to_s : ""
|
23
23
|
end
|
24
24
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "dry-initializer"
|
2
|
+
|
3
|
+
module Avo
|
4
|
+
module Hosts
|
5
|
+
class DashboardCard
|
6
|
+
extend Dry::Initializer
|
7
|
+
|
8
|
+
option :context
|
9
|
+
option :range
|
10
|
+
option :dashboard
|
11
|
+
option :card
|
12
|
+
option :params
|
13
|
+
|
14
|
+
delegate :result, to: :card
|
15
|
+
|
16
|
+
def compute_result
|
17
|
+
instance_exec(&card.query_block)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/avo/hosts/ordering.rb
CHANGED
@@ -50,12 +50,14 @@ module Avo
|
|
50
50
|
|
51
51
|
# Returns if has ability and if is a valid license or app is in development.
|
52
52
|
def has_with_trial(ability)
|
53
|
-
can(ability) &&
|
53
|
+
return can(ability) && valid? if Rails.env.production?
|
54
|
+
|
55
|
+
true
|
54
56
|
end
|
55
57
|
|
56
58
|
# Returns if lacks ability and if is a valid license or app is in development.
|
57
59
|
def lacks_with_trial(ability)
|
58
|
-
!
|
60
|
+
!has_with_trial ability
|
59
61
|
end
|
60
62
|
end
|
61
63
|
end
|
data/lib/avo/version.rb
CHANGED
data/lib/avo.rb
CHANGED
@@ -3,9 +3,32 @@ require_relative "avo/version"
|
|
3
3
|
require_relative "avo/engine" if defined?(Rails)
|
4
4
|
|
5
5
|
loader = Zeitwerk::Loader.for_gem
|
6
|
-
loader.ignore("#{__dir__}/generators")
|
7
6
|
loader.setup
|
8
7
|
|
8
|
+
# .//*,,.....,,*/(*
|
9
|
+
# **,,..............,*#.
|
10
|
+
# ,*,,..... .....*/#.
|
11
|
+
# **,,.... ....,*/%%
|
12
|
+
# ,**,,....... . ....*/#&%
|
13
|
+
# **,,,...... . . ....*/#&&%
|
14
|
+
# **,,........ . . ...,//#&&&.
|
15
|
+
# */*,,..*//***,,,,*/(,.. .. .....*//%&%&*
|
16
|
+
# ,/**,..**/******,,***/(###,...........,//(%&&%.
|
17
|
+
# /**,,..((//*****////((##%%%%%*.........*//%%&&%
|
18
|
+
# ****,...#/**,,,*,*/(#%##%%%%&&&(*,.....,*/(%&&&/
|
19
|
+
# /**,....(/*,,,,,,,*(##%%%%%&&&&&(,.....,*(#&&&&.
|
20
|
+
# ,//*,.....(/*,,**//(##%%%%&&&&@&&%/,....,*((&&&&*
|
21
|
+
# .//*,,.....(((//(((##%%%&&&&&&&&@#/,....,*/#%&&&#
|
22
|
+
# (/**,,......###%%%%%&&&&&&&&&&@#/,,...,,*/#&&&&&
|
23
|
+
# (/**,,........%%%%%&&&&&&&&@%(*,...,,,*//(&&&&%.
|
24
|
+
# ///*,,,.........,*#&&&&#(/,,.....,,,*//(%&&&&%*
|
25
|
+
# (//**,,,.....................,,,,*//(%&&&&&&*
|
26
|
+
# *(///**,,,,............,,,,,,**/((&&&&&&&%.
|
27
|
+
# ((///*****,,,,,,,,,,,,***//((&&&&&%&%&#
|
28
|
+
# .((((////********///(((%&%&&&&%%%%%
|
29
|
+
# (############%%%%%%%%%%%%%%%*
|
30
|
+
# ,(############%%%%%#*
|
31
|
+
|
9
32
|
module Avo
|
10
33
|
ROOT_PATH = Pathname.new(File.join(__dir__, ".."))
|
11
34
|
IN_DEVELOPMENT = ENV["AVO_IN_DEVELOPMENT"] == "1"
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
|
3
|
+
module Generators
|
4
|
+
module Avo
|
5
|
+
class ChartkickCardGenerator < ::Rails::Generators::NamedBase
|
6
|
+
source_root File.expand_path("templates", __dir__)
|
7
|
+
|
8
|
+
namespace "avo:card:chartkick"
|
9
|
+
desc "Add a chartkick card for your Avo dashboard."
|
10
|
+
|
11
|
+
def handle
|
12
|
+
template "cards/chartkick_card_sample.tt", "app/avo/cards/#{name.underscore}.rb"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
|
3
|
+
module Generators
|
4
|
+
module Avo
|
5
|
+
class DashboardGenerator < ::Rails::Generators::NamedBase
|
6
|
+
source_root File.expand_path("templates", __dir__)
|
7
|
+
|
8
|
+
namespace "avo:dashboard"
|
9
|
+
desc "Add an Avo dashboard to your project."
|
10
|
+
|
11
|
+
def handle
|
12
|
+
template "dashboards/dashboard.tt", "app/avo/dashboards/#{name.underscore}.rb"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
|
3
|
+
module Generators
|
4
|
+
module Avo
|
5
|
+
class MetricCardGenerator < ::Rails::Generators::NamedBase
|
6
|
+
source_root File.expand_path("templates", __dir__)
|
7
|
+
|
8
|
+
namespace "avo:card:metric"
|
9
|
+
desc "Add a metric card for your Avo dashboard."
|
10
|
+
|
11
|
+
def handle
|
12
|
+
template "cards/metric_card_sample.tt", "app/avo/cards/#{name.underscore}.rb"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
|
3
|
+
module Generators
|
4
|
+
module Avo
|
5
|
+
class PartialCardGenerator < ::Rails::Generators::NamedBase
|
6
|
+
source_root File.expand_path("templates", __dir__)
|
7
|
+
|
8
|
+
namespace "avo:card:partial"
|
9
|
+
desc "Add a partial card for your Avo dashboard."
|
10
|
+
|
11
|
+
def handle
|
12
|
+
template "cards/partial_card_sample.tt", "app/avo/cards/#{name.underscore}.rb"
|
13
|
+
template "cards/partial_card_partial.tt", "app/views/avo/cards/_#{name.underscore}.html.erb"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class <%= class_name.camelize %> < Avo::Dashboards::ChartkickCard
|
2
|
+
self.id = "<%= name.underscore %>"
|
3
|
+
self.label = "<%= name.underscore.humanize %>"
|
4
|
+
self.chart_type = :area_chart
|
5
|
+
|
6
|
+
query do
|
7
|
+
data = 3.times.map do |index|
|
8
|
+
{
|
9
|
+
name: "Batch #{index}",
|
10
|
+
data: 17.times.map { |i| [i, Random.rand(32)] }
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
result data
|
15
|
+
end
|
16
|
+
end
|