plutonium 0.16.4 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/plutonium.css +9 -1
- data/app/assets/plutonium.js +23273 -9599
- data/app/assets/plutonium.js.map +4 -4
- data/app/assets/plutonium.min.js +159 -49
- data/app/assets/plutonium.min.js.map +4 -4
- data/app/views/plutonium/_resource_header.html.erb +33 -24
- data/app/views/plutonium/_resource_sidebar.html.erb +10 -8
- data/app/views/rodauth/otp_unlock.html.erb +22 -0
- data/app/views/rodauth/otp_unlock_not_available.html.erb +14 -0
- data/app/views/rodauth/webauthn_remove.html.erb +1 -0
- data/docs/guide/getting-started/resources.md +2 -2
- data/docs/guide/tutorial.md +4 -4
- data/gemfiles/rails_7.gemfile.lock +406 -0
- data/lib/generators/pu/core/assets/assets_generator.rb +1 -1
- data/lib/generators/pu/res/conn/conn_generator.rb +24 -10
- data/lib/generators/pu/rodauth/concerns/configuration.rb +11 -0
- data/lib/generators/pu/rodauth/concerns/feature_selector.rb +4 -0
- data/lib/generators/pu/rodauth/install_generator.rb +3 -1
- data/lib/generators/pu/rodauth/migration/active_record/otp_unlock.erb +7 -0
- data/lib/generators/pu/rodauth/templates/INSTRUCTIONS +2 -46
- data/lib/generators/pu/rodauth/templates/app/controllers/plugin_controller.rb.tt +3 -3
- data/lib/generators/pu/rodauth/templates/app/mailers/rodauth_mailer.rb.tt +50 -1
- data/lib/generators/pu/rodauth/templates/app/rodauth/account_rodauth_plugin.rb.tt +37 -3
- data/lib/generators/pu/rodauth/templates/app/rodauth/rodauth_plugin.rb.tt +33 -8
- data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/otp_disabled.text.erb +2 -0
- data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/otp_locked_out.text.erb +9 -0
- data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/otp_setup.text.erb +2 -0
- data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/otp_unlock_failed.text.erb +8 -0
- data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/otp_unlocked.text.erb +2 -0
- data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/webauthn_authenticator_added.text.erb +3 -0
- data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/webauthn_authenticator_removed.text.erb +3 -0
- data/lib/generators/pu/rodauth/views_generator.rb +1 -12
- data/lib/plutonium/core/controllers/authorizable.rb +3 -1
- data/lib/plutonium/helpers/application_helper.rb +0 -8
- data/lib/plutonium/helpers.rb +0 -3
- data/lib/plutonium/railtie.rb +0 -14
- data/lib/plutonium/reloader.rb +2 -12
- data/lib/plutonium/rodauth/controller_methods.rb +1 -3
- data/lib/plutonium/ui/component/behaviour.rb +1 -1
- data/lib/plutonium/ui/component/kit.rb +59 -15
- data/lib/plutonium/ui/display/base.rb +6 -2
- data/lib/plutonium/ui/display/{component → components}/association.rb +1 -1
- data/lib/plutonium/ui/display/components/attachment.rb +93 -0
- data/lib/plutonium/ui/display/{component → components}/markdown.rb +2 -1
- data/lib/plutonium/ui/display/resource.rb +21 -6
- data/lib/plutonium/ui/display/theme.rb +2 -1
- data/lib/plutonium/ui/form/base.rb +7 -0
- data/lib/plutonium/ui/form/components/belongs_to.rb +45 -1
- data/lib/plutonium/ui/form/components/has_many.rb +45 -1
- data/lib/plutonium/ui/form/components/uppy.rb +173 -0
- data/lib/plutonium/ui/form/query.rb +5 -5
- data/lib/plutonium/ui/form/resource.rb +6 -6
- data/lib/plutonium/ui/form/theme.rb +6 -2
- data/lib/plutonium/ui/frame_navigator_panel.rb +25 -4
- data/lib/plutonium/ui/layout/base.rb +1 -1
- data/lib/plutonium/ui/layout/header.rb +1 -1
- data/lib/plutonium/ui/layout/sidebar.rb +0 -1
- data/lib/plutonium/ui/nav_grid_menu.rb +93 -0
- data/lib/plutonium/ui/nav_user.rb +121 -0
- data/lib/plutonium/ui/panel.rb +2 -2
- data/lib/plutonium/ui/sidebar_menu.rb +19 -39
- data/lib/plutonium/ui/tab_list.rb +73 -0
- data/lib/plutonium/ui/table/base.rb +7 -1
- data/lib/plutonium/ui/table/components/attachment.rb +71 -0
- data/lib/plutonium/ui/table/components/pagy_info.rb +12 -4
- data/lib/plutonium/ui/table/components/pagy_pagination.rb +5 -5
- data/lib/plutonium/ui/table/display_theme.rb +2 -1
- data/lib/plutonium/ui/table/resource.rb +11 -12
- data/lib/plutonium/version.rb +1 -1
- data/package-lock.json +356 -18
- data/package.json +6 -2
- data/src/css/plutonium.css +3 -0
- data/src/js/controllers/attachment_input_controller.js +241 -0
- data/src/js/controllers/attachment_preview_container_controller.js +15 -0
- data/src/js/controllers/attachment_preview_controller.js +63 -0
- data/src/js/controllers/color_mode_controller.js +0 -1
- data/src/js/controllers/easymde_controller.js +0 -1
- data/src/js/controllers/flatpickr_controller.js +0 -1
- data/src/js/controllers/form_controller.js +0 -1
- data/src/js/controllers/frame_navigator_controller.js +16 -12
- data/src/js/controllers/intl_tel_input_controller.js +0 -1
- data/src/js/controllers/register_controllers.js +12 -30
- data/src/js/controllers/resource_collapse_controller.js +0 -1
- data/src/js/controllers/resource_dismiss_controller.js +0 -1
- data/src/js/controllers/resource_drop_down_controller.js +161 -9
- data/src/js/controllers/{header_controller.js → resource_header_controller.js} +1 -0
- data/src/js/controllers/resource_tab_list_controller.js +64 -0
- data/src/js/controllers/select_navigator.js +16 -0
- data/src/js/controllers/slim_select_controller.js +0 -1
- data/src/js/support/dom_element.js +78 -0
- data/src/js/support/mime_icon.js +127 -0
- data/tailwind.options.js +0 -5
- metadata +29 -642
- data/README copy.md +0 -83
- data/app/assets/application.js.bk +0 -31419
- data/app/assets/icons/flags/ghana.svg +0 -49
- data/app/assets/icons/outline/address-book.svg +0 -3
- data/app/assets/icons/outline/adjustments-horizontal.svg +0 -3
- data/app/assets/icons/outline/adjustments-vertical.svg +0 -3
- data/app/assets/icons/outline/align-center.svg +0 -3
- data/app/assets/icons/outline/angle-down.svg +0 -3
- data/app/assets/icons/outline/angle-left.svg +0 -3
- data/app/assets/icons/outline/angle-right.svg +0 -3
- data/app/assets/icons/outline/angle-up.svg +0 -3
- data/app/assets/icons/outline/annotation.svg +0 -3
- data/app/assets/icons/outline/archive-arrow-down.svg +0 -3
- data/app/assets/icons/outline/archive.svg +0 -3
- data/app/assets/icons/outline/arrow-down-to-bracket.svg +0 -3
- data/app/assets/icons/outline/arrow-down.svg +0 -3
- data/app/assets/icons/outline/arrow-left-to-bracket.svg +0 -3
- data/app/assets/icons/outline/arrow-left.svg +0 -3
- data/app/assets/icons/outline/arrow-right-alt.svg +0 -3
- data/app/assets/icons/outline/arrow-right-to-bracket.svg +0 -3
- data/app/assets/icons/outline/arrow-right.svg +0 -3
- data/app/assets/icons/outline/arrow-sort-letters.svg +0 -3
- data/app/assets/icons/outline/arrow-up-down.svg +0 -3
- data/app/assets/icons/outline/arrow-up-from-bracket.svg +0 -3
- data/app/assets/icons/outline/arrow-up-right-down-left.svg +0 -3
- data/app/assets/icons/outline/arrow-up-right-from-square.svg +0 -3
- data/app/assets/icons/outline/arrow-up.svg +0 -3
- data/app/assets/icons/outline/arrows-repeat-count.svg +0 -3
- data/app/assets/icons/outline/arrows-repeat.svg +0 -3
- data/app/assets/icons/outline/atom.svg +0 -3
- data/app/assets/icons/outline/backward-step.svg +0 -3
- data/app/assets/icons/outline/badge-check.svg +0 -3
- data/app/assets/icons/outline/bars-from-left.svg +0 -3
- data/app/assets/icons/outline/bars.svg +0 -3
- data/app/assets/icons/outline/bell-active-alt.svg +0 -3
- data/app/assets/icons/outline/bell-active.svg +0 -3
- data/app/assets/icons/outline/bell-ring.svg +0 -3
- data/app/assets/icons/outline/bell.svg +0 -3
- data/app/assets/icons/outline/blender-phone.svg +0 -3
- data/app/assets/icons/outline/book-open.svg +0 -3
- data/app/assets/icons/outline/book.svg +0 -3
- data/app/assets/icons/outline/bookmark.svg +0 -3
- data/app/assets/icons/outline/brain.svg +0 -3
- data/app/assets/icons/outline/briefcase.svg +0 -3
- data/app/assets/icons/outline/bug.svg +0 -3
- data/app/assets/icons/outline/building.svg +0 -3
- data/app/assets/icons/outline/bullhorn.svg +0 -3
- data/app/assets/icons/outline/calendar-edit.svg +0 -3
- data/app/assets/icons/outline/calendar-month.svg +0 -3
- data/app/assets/icons/outline/calendar-plus.svg +0 -3
- data/app/assets/icons/outline/calendar-week.svg +0 -3
- data/app/assets/icons/outline/camera-photo.svg +0 -4
- data/app/assets/icons/outline/caption.svg +0 -3
- data/app/assets/icons/outline/caret-down.svg +0 -3
- data/app/assets/icons/outline/caret-left.svg +0 -3
- data/app/assets/icons/outline/caret-right.svg +0 -3
- data/app/assets/icons/outline/caret-sort.svg +0 -3
- data/app/assets/icons/outline/caret-up.svg +0 -3
- data/app/assets/icons/outline/cart-plus-alt.svg +0 -3
- data/app/assets/icons/outline/cart-plus.svg +0 -3
- data/app/assets/icons/outline/cart.svg +0 -3
- data/app/assets/icons/outline/cash.svg +0 -3
- data/app/assets/icons/outline/chart-line-down.svg +0 -3
- data/app/assets/icons/outline/chart-line-up.svg +0 -3
- data/app/assets/icons/outline/chart-mixed-dollar.svg +0 -3
- data/app/assets/icons/outline/chart-mixed.svg +0 -3
- data/app/assets/icons/outline/chart-pie.svg +0 -4
- data/app/assets/icons/outline/chart.svg +0 -3
- data/app/assets/icons/outline/check-circle.svg +0 -3
- data/app/assets/icons/outline/check-plus-circle.svg +0 -3
- data/app/assets/icons/outline/check.svg +0 -3
- data/app/assets/icons/outline/chevron-double-down.svg +0 -3
- data/app/assets/icons/outline/chevron-double-left.svg +0 -3
- data/app/assets/icons/outline/chevron-double-right.svg +0 -3
- data/app/assets/icons/outline/chevron-double-up.svg +0 -3
- data/app/assets/icons/outline/chevron-down.svg +0 -3
- data/app/assets/icons/outline/chevron-left.svg +0 -3
- data/app/assets/icons/outline/chevron-right.svg +0 -3
- data/app/assets/icons/outline/chevron-sort.svg +0 -3
- data/app/assets/icons/outline/chevron-up.svg +0 -3
- data/app/assets/icons/outline/circle-pause.svg +0 -3
- data/app/assets/icons/outline/circle-plus.svg +0 -3
- data/app/assets/icons/outline/clapperboard-play.svg +0 -3
- data/app/assets/icons/outline/clipboard-check.svg +0 -3
- data/app/assets/icons/outline/clipboard-list.svg +0 -3
- data/app/assets/icons/outline/clipboard.svg +0 -3
- data/app/assets/icons/outline/clock.svg +0 -3
- data/app/assets/icons/outline/close-circle.svg +0 -3
- data/app/assets/icons/outline/close.svg +0 -3
- data/app/assets/icons/outline/cloud-arrow-up.svg +0 -3
- data/app/assets/icons/outline/code-branch.svg +0 -3
- data/app/assets/icons/outline/code-fork.svg +0 -3
- data/app/assets/icons/outline/code-merge.svg +0 -3
- data/app/assets/icons/outline/code-pull-request.svg +0 -3
- data/app/assets/icons/outline/code.svg +0 -3
- data/app/assets/icons/outline/cog.svg +0 -4
- data/app/assets/icons/outline/column.svg +0 -3
- data/app/assets/icons/outline/command.svg +0 -3
- data/app/assets/icons/outline/compress.svg +0 -3
- data/app/assets/icons/outline/computer-speaker.svg +0 -3
- data/app/assets/icons/outline/credit-card.svg +0 -3
- data/app/assets/icons/outline/database.svg +0 -3
- data/app/assets/icons/outline/desktop-pc.svg +0 -3
- data/app/assets/icons/outline/dna.svg +0 -3
- data/app/assets/icons/outline/dollar.svg +0 -3
- data/app/assets/icons/outline/dots-horizontal.svg +0 -3
- data/app/assets/icons/outline/dots-vertical.svg +0 -3
- data/app/assets/icons/outline/download.svg +0 -3
- data/app/assets/icons/outline/draw-square.svg +0 -3
- data/app/assets/icons/outline/edit.svg +0 -3
- data/app/assets/icons/outline/envelope-open.svg +0 -3
- data/app/assets/icons/outline/envelope.svg +0 -3
- data/app/assets/icons/outline/euro.svg +0 -3
- data/app/assets/icons/outline/exclamation-circle.svg +0 -3
- data/app/assets/icons/outline/expand.svg +0 -3
- data/app/assets/icons/outline/eye-slash.svg +0 -3
- data/app/assets/icons/outline/eye.svg +0 -4
- data/app/assets/icons/outline/face-explode.svg +0 -4
- data/app/assets/icons/outline/face-grin-stars.svg +0 -6
- data/app/assets/icons/outline/face-grin.svg +0 -3
- data/app/assets/icons/outline/face-laugh.svg +0 -3
- data/app/assets/icons/outline/file-chart-bar.svg +0 -3
- data/app/assets/icons/outline/file-check.svg +0 -3
- data/app/assets/icons/outline/file-circle-plus.svg +0 -3
- data/app/assets/icons/outline/file-clone.svg +0 -3
- data/app/assets/icons/outline/file-code.svg +0 -3
- data/app/assets/icons/outline/file-copy-alt.svg +0 -3
- data/app/assets/icons/outline/file-copy.svg +0 -3
- data/app/assets/icons/outline/file-csv.svg +0 -3
- data/app/assets/icons/outline/file-export.svg +0 -3
- data/app/assets/icons/outline/file-image.svg +0 -4
- data/app/assets/icons/outline/file-import.svg +0 -3
- data/app/assets/icons/outline/file-invoice.svg +0 -3
- data/app/assets/icons/outline/file-lines.svg +0 -3
- data/app/assets/icons/outline/file-music.svg +0 -3
- data/app/assets/icons/outline/file-paste.svg +0 -3
- data/app/assets/icons/outline/file-pdf.svg +0 -3
- data/app/assets/icons/outline/file-pen.svg +0 -3
- data/app/assets/icons/outline/file-ppt.svg +0 -3
- data/app/assets/icons/outline/file-search.svg +0 -3
- data/app/assets/icons/outline/file-shield.svg +0 -3
- data/app/assets/icons/outline/file-video.svg +0 -3
- data/app/assets/icons/outline/file-word.svg +0 -3
- data/app/assets/icons/outline/file-zip.svg +0 -3
- data/app/assets/icons/outline/file.svg +0 -3
- data/app/assets/icons/outline/filter.svg +0 -3
- data/app/assets/icons/outline/fingerprint.svg +0 -3
- data/app/assets/icons/outline/fire.svg +0 -3
- data/app/assets/icons/outline/flag.svg +0 -3
- data/app/assets/icons/outline/folder-arrow-right.svg +0 -3
- data/app/assets/icons/outline/folder-duplicate.svg +0 -3
- data/app/assets/icons/outline/folder-open.svg +0 -3
- data/app/assets/icons/outline/folder-plus.svg +0 -3
- data/app/assets/icons/outline/folder.svg +0 -3
- data/app/assets/icons/outline/forward-step.svg +0 -3
- data/app/assets/icons/outline/forward.svg +0 -3
- data/app/assets/icons/outline/gift-box.svg +0 -3
- data/app/assets/icons/outline/globe.svg +0 -3
- data/app/assets/icons/outline/grid-plus.svg +0 -3
- data/app/assets/icons/outline/grid.svg +0 -3
- data/app/assets/icons/outline/headphones.svg +0 -3
- data/app/assets/icons/outline/heart.svg +0 -3
- data/app/assets/icons/outline/home.svg +0 -3
- data/app/assets/icons/outline/hourglass.svg +0 -3
- data/app/assets/icons/outline/image.svg +0 -3
- data/app/assets/icons/outline/inbox-full.svg +0 -3
- data/app/assets/icons/outline/inbox.svg +0 -3
- data/app/assets/icons/outline/indent.svg +0 -3
- data/app/assets/icons/outline/info-circle.svg +0 -3
- data/app/assets/icons/outline/keyboard.svg +0 -5
- data/app/assets/icons/outline/label.svg +0 -3
- data/app/assets/icons/outline/landmark.svg +0 -3
- data/app/assets/icons/outline/layers.svg +0 -3
- data/app/assets/icons/outline/letter-bold.svg +0 -3
- data/app/assets/icons/outline/letter-italic.svg +0 -3
- data/app/assets/icons/outline/letter-underline.svg +0 -3
- data/app/assets/icons/outline/life-saver.svg +0 -3
- data/app/assets/icons/outline/lightbulb.svg +0 -3
- data/app/assets/icons/outline/link.svg +0 -3
- data/app/assets/icons/outline/list-music.svg +0 -3
- data/app/assets/icons/outline/list.svg +0 -3
- data/app/assets/icons/outline/lock-open.svg +0 -3
- data/app/assets/icons/outline/lock-time.svg +0 -3
- data/app/assets/icons/outline/lock.svg +0 -3
- data/app/assets/icons/outline/mail-box.svg +0 -3
- data/app/assets/icons/outline/map-pin-alt.svg +0 -4
- data/app/assets/icons/outline/map-pin.svg +0 -3
- data/app/assets/icons/outline/message-caption.svg +0 -3
- data/app/assets/icons/outline/message-dots.svg +0 -3
- data/app/assets/icons/outline/messages.svg +0 -3
- data/app/assets/icons/outline/microphone.svg +0 -3
- data/app/assets/icons/outline/minimize.svg +0 -3
- data/app/assets/icons/outline/minus.svg +0 -3
- data/app/assets/icons/outline/mobile-phone.svg +0 -3
- data/app/assets/icons/outline/moon.svg +0 -3
- data/app/assets/icons/outline/newspaper.svg +0 -3
- data/app/assets/icons/outline/ordered-list.svg +0 -3
- data/app/assets/icons/outline/outdent.svg +0 -3
- data/app/assets/icons/outline/palette.svg +0 -3
- data/app/assets/icons/outline/paper-clip.svg +0 -3
- data/app/assets/icons/outline/paper-plane.svg +0 -3
- data/app/assets/icons/outline/paragraph.svg +0 -3
- data/app/assets/icons/outline/pause.svg +0 -3
- data/app/assets/icons/outline/pen-nib.svg +0 -3
- data/app/assets/icons/outline/pen.svg +0 -3
- data/app/assets/icons/outline/phone.svg +0 -3
- data/app/assets/icons/outline/play.svg +0 -3
- data/app/assets/icons/outline/plus.svg +0 -3
- data/app/assets/icons/outline/printer.svg +0 -3
- data/app/assets/icons/outline/profile-card.svg +0 -3
- data/app/assets/icons/outline/question-circle.svg +0 -3
- data/app/assets/icons/outline/quote.svg +0 -3
- data/app/assets/icons/outline/receipt.svg +0 -3
- data/app/assets/icons/outline/rectangle-list.svg +0 -3
- data/app/assets/icons/outline/redo.svg +0 -3
- data/app/assets/icons/outline/refresh.svg +0 -3
- data/app/assets/icons/outline/reply-all.svg +0 -3
- data/app/assets/icons/outline/reply.svg +0 -3
- data/app/assets/icons/outline/restore-window.svg +0 -3
- data/app/assets/icons/outline/rocket.svg +0 -3
- data/app/assets/icons/outline/ruler-combined.svg +0 -3
- data/app/assets/icons/outline/sale-percent.svg +0 -3
- data/app/assets/icons/outline/scale-balanced.svg +0 -3
- data/app/assets/icons/outline/search.svg +0 -3
- data/app/assets/icons/outline/share-all.svg +0 -3
- data/app/assets/icons/outline/share-nodes.svg +0 -3
- data/app/assets/icons/outline/shield-check.svg +0 -3
- data/app/assets/icons/outline/shield.svg +0 -3
- data/app/assets/icons/outline/shopping-bag.svg +0 -3
- data/app/assets/icons/outline/shuffle.svg +0 -3
- data/app/assets/icons/outline/sort-horizontal.svg +0 -3
- data/app/assets/icons/outline/sort.svg +0 -3
- data/app/assets/icons/outline/star-half-stroke.svg +0 -3
- data/app/assets/icons/outline/star-half.svg +0 -3
- data/app/assets/icons/outline/star.svg +0 -3
- data/app/assets/icons/outline/store.svg +0 -3
- data/app/assets/icons/outline/sun.svg +0 -3
- data/app/assets/icons/outline/swatchbook.svg +0 -3
- data/app/assets/icons/outline/table-column.svg +0 -3
- data/app/assets/icons/outline/table-row.svg +0 -3
- data/app/assets/icons/outline/tablet.svg +0 -3
- data/app/assets/icons/outline/tag.svg +0 -3
- data/app/assets/icons/outline/terminal.svg +0 -3
- data/app/assets/icons/outline/text-size.svg +0 -3
- data/app/assets/icons/outline/text-slash.svg +0 -3
- data/app/assets/icons/outline/thumbs-down.svg +0 -3
- data/app/assets/icons/outline/thumbs-up.svg +0 -3
- data/app/assets/icons/outline/ticket.svg +0 -3
- data/app/assets/icons/outline/trash-bin.svg +0 -3
- data/app/assets/icons/outline/truck.svg +0 -3
- data/app/assets/icons/outline/undo.svg +0 -3
- data/app/assets/icons/outline/upload.svg +0 -3
- data/app/assets/icons/outline/user-add.svg +0 -3
- data/app/assets/icons/outline/user-circle.svg +0 -3
- data/app/assets/icons/outline/user-edit.svg +0 -3
- data/app/assets/icons/outline/user-headset.svg +0 -3
- data/app/assets/icons/outline/user-remove.svg +0 -3
- data/app/assets/icons/outline/user-settings.svg +0 -3
- data/app/assets/icons/outline/user.svg +0 -3
- data/app/assets/icons/outline/users-group.svg +0 -3
- data/app/assets/icons/outline/users.svg +0 -3
- data/app/assets/icons/outline/video-camera.svg +0 -3
- data/app/assets/icons/outline/volume-down.svg +0 -3
- data/app/assets/icons/outline/volume-up.svg +0 -3
- data/app/assets/icons/outline/wallet.svg +0 -3
- data/app/assets/icons/outline/wand-magic-sparkles.svg +0 -3
- data/app/assets/icons/outline/window.svg +0 -3
- data/app/assets/icons/outline/zoom-in.svg +0 -3
- data/app/assets/icons/outline/zoom-out.svg +0 -3
- data/app/assets/icons/solid/X.svg +0 -3
- data/app/assets/icons/solid/address-book.svg +0 -3
- data/app/assets/icons/solid/adjustments-horizontal.svg +0 -3
- data/app/assets/icons/solid/adjustments-vertical.svg +0 -3
- data/app/assets/icons/solid/annotation.svg +0 -3
- data/app/assets/icons/solid/apple.svg +0 -3
- data/app/assets/icons/solid/archive-arrow-down.svg +0 -3
- data/app/assets/icons/solid/archive.svg +0 -4
- data/app/assets/icons/solid/arrow-right-alt.svg +0 -3
- data/app/assets/icons/solid/arrow-up-right-from-square.svg +0 -4
- data/app/assets/icons/solid/backward-step.svg +0 -3
- data/app/assets/icons/solid/badge-check.svg +0 -3
- data/app/assets/icons/solid/bell-active-alt.svg +0 -3
- data/app/assets/icons/solid/bell-active.svg +0 -5
- data/app/assets/icons/solid/bell-ring.svg +0 -3
- data/app/assets/icons/solid/bell.svg +0 -3
- data/app/assets/icons/solid/blender-phone.svg +0 -3
- data/app/assets/icons/solid/book-open.svg +0 -3
- data/app/assets/icons/solid/book.svg +0 -3
- data/app/assets/icons/solid/bookmark.svg +0 -3
- data/app/assets/icons/solid/brain.svg +0 -3
- data/app/assets/icons/solid/briefcase.svg +0 -3
- data/app/assets/icons/solid/bug.svg +0 -3
- data/app/assets/icons/solid/building.svg +0 -3
- data/app/assets/icons/solid/bullhorn.svg +0 -3
- data/app/assets/icons/solid/calendar-edit.svg +0 -4
- data/app/assets/icons/solid/calendar-month.svg +0 -3
- data/app/assets/icons/solid/calendar-plus.svg +0 -3
- data/app/assets/icons/solid/calendar-week.svg +0 -3
- data/app/assets/icons/solid/camera-photo.svg +0 -3
- data/app/assets/icons/solid/caption.svg +0 -3
- data/app/assets/icons/solid/caret-down.svg +0 -3
- data/app/assets/icons/solid/caret-left.svg +0 -3
- data/app/assets/icons/solid/caret-right.svg +0 -3
- data/app/assets/icons/solid/caret-sort.svg +0 -3
- data/app/assets/icons/solid/caret-up.svg +0 -3
- data/app/assets/icons/solid/cart-plus-alt.svg +0 -4
- data/app/assets/icons/solid/cart-plus.svg +0 -4
- data/app/assets/icons/solid/cart.svg +0 -3
- data/app/assets/icons/solid/cash.svg +0 -5
- data/app/assets/icons/solid/chart-mixed-dollar.svg +0 -3
- data/app/assets/icons/solid/chart-pie.svg +0 -4
- data/app/assets/icons/solid/check-circle.svg +0 -3
- data/app/assets/icons/solid/check-plus-circle.svg +0 -4
- data/app/assets/icons/solid/circle-pause.svg +0 -3
- data/app/assets/icons/solid/circle-plus.svg +0 -3
- data/app/assets/icons/solid/clapperboard-play.svg +0 -3
- data/app/assets/icons/solid/clipboard-check.svg +0 -3
- data/app/assets/icons/solid/clipboard-list.svg +0 -3
- data/app/assets/icons/solid/clipboard.svg +0 -3
- data/app/assets/icons/solid/clock.svg +0 -3
- data/app/assets/icons/solid/close-circle.svg +0 -3
- data/app/assets/icons/solid/cloud-arrow-up.svg +0 -4
- data/app/assets/icons/solid/code-branch.svg +0 -3
- data/app/assets/icons/solid/code-fork.svg +0 -3
- data/app/assets/icons/solid/code-merge.svg +0 -3
- data/app/assets/icons/solid/code-pull-request.svg +0 -3
- data/app/assets/icons/solid/cog.svg +0 -3
- data/app/assets/icons/solid/column.svg +0 -3
- data/app/assets/icons/solid/computer-speaker.svg +0 -4
- data/app/assets/icons/solid/credit-card.svg +0 -4
- data/app/assets/icons/solid/css.svg +0 -3
- data/app/assets/icons/solid/database.svg +0 -3
- data/app/assets/icons/solid/desktop-pc.svg +0 -3
- data/app/assets/icons/solid/discord.svg +0 -3
- data/app/assets/icons/solid/download.svg +0 -4
- data/app/assets/icons/solid/draw-square.svg +0 -4
- data/app/assets/icons/solid/dribbble.svg +0 -3
- data/app/assets/icons/solid/dropbox.svg +0 -4
- data/app/assets/icons/solid/edit.svg +0 -4
- data/app/assets/icons/solid/envelope-open.svg +0 -4
- data/app/assets/icons/solid/envelope.svg +0 -4
- data/app/assets/icons/solid/exclamation-circle.svg +0 -3
- data/app/assets/icons/solid/eye-slash.svg +0 -5
- data/app/assets/icons/solid/eye.svg +0 -3
- data/app/assets/icons/solid/face-explode.svg +0 -3
- data/app/assets/icons/solid/face-grin-stars.svg +0 -3
- data/app/assets/icons/solid/face-grin.svg +0 -3
- data/app/assets/icons/solid/face-laugh.svg +0 -3
- data/app/assets/icons/solid/facebook.svg +0 -3
- data/app/assets/icons/solid/file-chart-bar.svg +0 -3
- data/app/assets/icons/solid/file-check.svg +0 -4
- data/app/assets/icons/solid/file-circle-plus.svg +0 -4
- data/app/assets/icons/solid/file-clone.svg +0 -4
- data/app/assets/icons/solid/file-code.svg +0 -3
- data/app/assets/icons/solid/file-copy-alt.svg +0 -4
- data/app/assets/icons/solid/file-copy.svg +0 -4
- data/app/assets/icons/solid/file-csv.svg +0 -3
- data/app/assets/icons/solid/file-export.svg +0 -3
- data/app/assets/icons/solid/file-image.svg +0 -3
- data/app/assets/icons/solid/file-import.svg +0 -3
- data/app/assets/icons/solid/file-invoice.svg +0 -3
- data/app/assets/icons/solid/file-lines.svg +0 -3
- data/app/assets/icons/solid/file-music.svg +0 -3
- data/app/assets/icons/solid/file-paste.svg +0 -4
- data/app/assets/icons/solid/file-pdf.svg +0 -3
- data/app/assets/icons/solid/file-pen.svg +0 -4
- data/app/assets/icons/solid/file-ppt.svg +0 -3
- data/app/assets/icons/solid/file-search.svg +0 -3
- data/app/assets/icons/solid/file-shield.svg +0 -4
- data/app/assets/icons/solid/file-video.svg +0 -3
- data/app/assets/icons/solid/file-word.svg +0 -3
- data/app/assets/icons/solid/file-zip.svg +0 -3
- data/app/assets/icons/solid/file.svg +0 -3
- data/app/assets/icons/solid/filter.svg +0 -3
- data/app/assets/icons/solid/fire.svg +0 -3
- data/app/assets/icons/solid/flag.svg +0 -3
- data/app/assets/icons/solid/flowbite.svg +0 -6
- data/app/assets/icons/solid/folder-arrow-right.svg +0 -3
- data/app/assets/icons/solid/folder-duplicate.svg +0 -4
- data/app/assets/icons/solid/folder-open.svg +0 -3
- data/app/assets/icons/solid/folder-plus.svg +0 -3
- data/app/assets/icons/solid/folder.svg +0 -3
- data/app/assets/icons/solid/forward-step.svg +0 -3
- data/app/assets/icons/solid/forward.svg +0 -3
- data/app/assets/icons/solid/gift-box.svg +0 -3
- data/app/assets/icons/solid/github.svg +0 -3
- data/app/assets/icons/solid/globe.svg +0 -3
- data/app/assets/icons/solid/google.svg +0 -3
- data/app/assets/icons/solid/grid-plus.svg +0 -3
- data/app/assets/icons/solid/grid.svg +0 -3
- data/app/assets/icons/solid/headphones.svg +0 -3
- data/app/assets/icons/solid/heart.svg +0 -3
- data/app/assets/icons/solid/home.svg +0 -3
- data/app/assets/icons/solid/hourglass.svg +0 -3
- data/app/assets/icons/solid/html.svg +0 -3
- data/app/assets/icons/solid/image.svg +0 -4
- data/app/assets/icons/solid/inbox-full.svg +0 -3
- data/app/assets/icons/solid/inbox.svg +0 -3
- data/app/assets/icons/solid/indent.svg +0 -3
- data/app/assets/icons/solid/info-circle.svg +0 -3
- data/app/assets/icons/solid/keyboard.svg +0 -3
- data/app/assets/icons/solid/label.svg +0 -3
- data/app/assets/icons/solid/landmark.svg +0 -4
- data/app/assets/icons/solid/layers.svg +0 -4
- data/app/assets/icons/solid/life-saver.svg +0 -3
- data/app/assets/icons/solid/lightbulb.svg +0 -3
- data/app/assets/icons/solid/linkedin.svg +0 -4
- data/app/assets/icons/solid/list-music.svg +0 -3
- data/app/assets/icons/solid/lock-open.svg +0 -3
- data/app/assets/icons/solid/lock-time.svg +0 -4
- data/app/assets/icons/solid/lock.svg +0 -3
- data/app/assets/icons/solid/mail-box.svg +0 -3
- data/app/assets/icons/solid/map-pin-alt.svg +0 -3
- data/app/assets/icons/solid/map-pin.svg +0 -3
- data/app/assets/icons/solid/message-caption.svg +0 -3
- data/app/assets/icons/solid/message-dots.svg +0 -3
- data/app/assets/icons/solid/messages.svg +0 -4
- data/app/assets/icons/solid/microphone.svg +0 -4
- data/app/assets/icons/solid/mobile-phone.svg +0 -3
- data/app/assets/icons/solid/moon.svg +0 -3
- data/app/assets/icons/solid/newspaper.svg +0 -3
- data/app/assets/icons/solid/npm.svg +0 -3
- data/app/assets/icons/solid/outdent.svg +0 -3
- data/app/assets/icons/solid/palette.svg +0 -3
- data/app/assets/icons/solid/paper-plane.svg +0 -3
- data/app/assets/icons/solid/paragraph.svg +0 -3
- data/app/assets/icons/solid/pause.svg +0 -3
- data/app/assets/icons/solid/pen-nib.svg +0 -3
- data/app/assets/icons/solid/pen.svg +0 -3
- data/app/assets/icons/solid/phone.svg +0 -3
- data/app/assets/icons/solid/play.svg +0 -3
- data/app/assets/icons/solid/printer.svg +0 -3
- data/app/assets/icons/solid/profile-card.svg +0 -3
- data/app/assets/icons/solid/question-circle.svg +0 -3
- data/app/assets/icons/solid/quote.svg +0 -3
- data/app/assets/icons/solid/react.svg +0 -4
- data/app/assets/icons/solid/receipt.svg +0 -3
- data/app/assets/icons/solid/rectangle-list.svg +0 -3
- data/app/assets/icons/solid/reply-all.svg +0 -3
- data/app/assets/icons/solid/reply.svg +0 -3
- data/app/assets/icons/solid/rocket.svg +0 -3
- data/app/assets/icons/solid/sale-percent.svg +0 -3
- data/app/assets/icons/solid/scale-balanced.svg +0 -3
- data/app/assets/icons/solid/search.svg +0 -4
- data/app/assets/icons/solid/share-all.svg +0 -3
- data/app/assets/icons/solid/share-nodes.svg +0 -3
- data/app/assets/icons/solid/shield-check.svg +0 -3
- data/app/assets/icons/solid/shield.svg +0 -3
- data/app/assets/icons/solid/shopping-bag.svg +0 -3
- data/app/assets/icons/solid/stackoverflow.svg +0 -4
- data/app/assets/icons/solid/star-half-stroke.svg +0 -3
- data/app/assets/icons/solid/star-half.svg +0 -3
- data/app/assets/icons/solid/star.svg +0 -3
- data/app/assets/icons/solid/store.svg +0 -3
- data/app/assets/icons/solid/sun.svg +0 -3
- data/app/assets/icons/solid/swatchbook.svg +0 -3
- data/app/assets/icons/solid/table-column.svg +0 -3
- data/app/assets/icons/solid/table-row.svg +0 -3
- data/app/assets/icons/solid/tablet.svg +0 -3
- data/app/assets/icons/solid/tag.svg +0 -3
- data/app/assets/icons/solid/tailwind.svg +0 -3
- data/app/assets/icons/solid/terminal.svg +0 -3
- data/app/assets/icons/solid/thumbs-down.svg +0 -3
- data/app/assets/icons/solid/thumbs-up.svg +0 -3
- data/app/assets/icons/solid/ticket.svg +0 -3
- data/app/assets/icons/solid/trash-bin.svg +0 -3
- data/app/assets/icons/solid/truck.svg +0 -3
- data/app/assets/icons/solid/twitter.svg +0 -3
- data/app/assets/icons/solid/upload.svg +0 -3
- data/app/assets/icons/solid/user-add.svg +0 -3
- data/app/assets/icons/solid/user-circle.svg +0 -3
- data/app/assets/icons/solid/user-edit.svg +0 -3
- data/app/assets/icons/solid/user-headset.svg +0 -3
- data/app/assets/icons/solid/user-remove.svg +0 -3
- data/app/assets/icons/solid/user-settings.svg +0 -3
- data/app/assets/icons/solid/user.svg +0 -3
- data/app/assets/icons/solid/users-group.svg +0 -3
- data/app/assets/icons/solid/users.svg +0 -3
- data/app/assets/icons/solid/video-camera.svg +0 -3
- data/app/assets/icons/solid/volume-down.svg +0 -4
- data/app/assets/icons/solid/volume-up.svg +0 -5
- data/app/assets/icons/solid/vue.svg +0 -3
- data/app/assets/icons/solid/wallet.svg +0 -4
- data/app/assets/icons/solid/wand-magic-sparkles.svg +0 -4
- data/app/assets/icons/solid/window-restore.svg +0 -4
- data/app/assets/icons/solid/window.svg +0 -3
- data/app/assets/icons/solid/youtube.svg +0 -3
- data/app/assets/icons/solid/zoom-in.svg +0 -3
- data/app/assets/icons/solid/zoom-out.svg +0 -3
- data/app/views/components/action_button/action_button_component.html.erb +0 -7
- data/app/views/components/action_button/action_button_component.rb +0 -15
- data/app/views/components/attributes.rb +0 -184
- data/app/views/components/base.rb +0 -29
- data/app/views/components/block/block_component.html.erb +0 -3
- data/app/views/components/block/block_component.rb +0 -44
- data/app/views/components/breadcrumbs/breadcrumbs_component.html.erb +0 -96
- data/app/views/components/breadcrumbs/breadcrumbs_component.rb +0 -9
- data/app/views/components/button/button_component.html.erb +0 -11
- data/app/views/components/button/button_component.rb +0 -128
- data/app/views/components/dyna_frame_content/dyna_frame_content_component.html.erb +0 -8
- data/app/views/components/dyna_frame_content/dyna_frame_content_component.rb +0 -6
- data/app/views/components/dyna_frame_host/dyna_frame_host_component.html.erb +0 -3
- data/app/views/components/dyna_frame_host/dyna_frame_host_component.rb +0 -18
- data/app/views/components/empty_card/empty_card_component.html.erb +0 -6
- data/app/views/components/empty_card/empty_card_component.rb +0 -7
- data/app/views/components/form/form_builder.rb +0 -75
- data/app/views/components/form/form_component.html.erb +0 -73
- data/app/views/components/form/form_component.rb +0 -23
- data/app/views/components/has_many_panel/has_many_panel_component.html.erb +0 -25
- data/app/views/components/has_many_panel/has_many_panel_component.rb +0 -16
- data/app/views/components/header/header_component.html.erb +0 -1
- data/app/views/components/header/header_component.rb +0 -7
- data/app/views/components/interactive_action_form/interactive_action_form_component.html.erb +0 -39
- data/app/views/components/interactive_action_form/interactive_action_form_component.rb +0 -8
- data/app/views/components/nav_grid_menu/nav_grid_menu_component.html.erb +0 -24
- data/app/views/components/nav_grid_menu/nav_grid_menu_component.rb +0 -23
- data/app/views/components/nav_grid_menu_item/nav_grid_menu_item_component.html.erb +0 -4
- data/app/views/components/nav_grid_menu_item/nav_grid_menu_item_component.rb +0 -20
- data/app/views/components/nav_user/nav_user_component.html.erb +0 -50
- data/app/views/components/nav_user/nav_user_component.rb +0 -32
- data/app/views/components/nav_user_link/nav_user_link_component.html.erb +0 -7
- data/app/views/components/nav_user_link/nav_user_link_component.rb +0 -23
- data/app/views/components/nav_user_section/nav_user_section_component.html.erb +0 -7
- data/app/views/components/nav_user_section/nav_user_section_component.rb +0 -18
- data/app/views/components/nested_resource_form_fields/nested_resource_form_fields_component.html.erb +0 -64
- data/app/views/components/nested_resource_form_fields/nested_resource_form_fields_component.rb +0 -29
- data/app/views/components/pagination/pagination_component.html.erb +0 -6
- data/app/views/components/pagination/pagination_component.rb +0 -94
- data/app/views/components/panel/panel_component.html.erb +0 -17
- data/app/views/components/panel/panel_component.rb +0 -17
- data/app/views/components/resource_header/resource_header_component.html.erb +0 -83
- data/app/views/components/resource_header/resource_header_component.rb +0 -30
- data/app/views/components/resource_layout/resource_layout_component.html.erb +0 -53
- data/app/views/components/resource_layout/resource_layout_component.rb +0 -41
- data/app/views/components/sidebar/sidebar_component.html.erb +0 -69
- data/app/views/components/sidebar/sidebar_component.rb +0 -23
- data/app/views/components/sidebar_menu/sidebar_menu_component.html.erb +0 -5
- data/app/views/components/sidebar_menu/sidebar_menu_component.rb +0 -17
- data/app/views/components/sidebar_menu_item/sidebar_menu_item_component.html.erb +0 -64
- data/app/views/components/sidebar_menu_item/sidebar_menu_item_component.rb +0 -52
- data/app/views/components/skeleton/table/table_component.html.erb +0 -18
- data/app/views/components/skeleton/table/table_component.rb +0 -6
- data/app/views/components/table/table_component.html.erb +0 -43
- data/app/views/components/table/table_component.rb +0 -159
- data/app/views/components/table_search_input/table_search_input_component.html.erb +0 -48
- data/app/views/components/table_search_input/table_search_input_component.rb +0 -15
- data/app/views/components/table_toolbar/table_toolbar_component.html.erb +0 -7
- data/app/views/components/table_toolbar/table_toolbar_component.rb +0 -17
- data/app/views/components/toolbar/toolbar_component.html.erb +0 -67
- data/app/views/components/toolbar/toolbar_component.rb +0 -26
- data/app/views/layouts/resource.html copy.erb +0 -49
- data/app/views/plutonium/_resource_header.html copy.erb +0 -287
- data/lib/generators/pu/gen/component/component_generator.rb +0 -99
- data/lib/generators/pu/gen/component/templates/component.html.erb.tt +0 -3
- data/lib/generators/pu/gen/component/templates/component.rb.tt +0 -15
- data/lib/generators/pu/gen/component/templates/controller.js.tt +0 -8
- data/lib/plutonium/builders/menus/sidebar_menu.rb.bk +0 -26
- data/lib/plutonium/builders/menus/sidebar_menu_item.rb.bk +0 -28
- data/lib/plutonium/component_registry.rb +0 -19
- data/lib/plutonium/core/action.rb +0 -49
- data/lib/plutonium/core/actions/basic_action.rb +0 -16
- data/lib/plutonium/core/actions/collection.rb +0 -37
- data/lib/plutonium/core/actions/destroy_action.rb +0 -23
- data/lib/plutonium/core/actions/edit_action.rb +0 -21
- data/lib/plutonium/core/actions/interactive_action.rb +0 -64
- data/lib/plutonium/core/actions/new_action.rb +0 -20
- data/lib/plutonium/core/actions/show_action.rb +0 -19
- data/lib/plutonium/core/associations/renderers/base.rb +0 -77
- data/lib/plutonium/core/associations/renderers/factory.rb +0 -36
- data/lib/plutonium/core/associations/renderers/has_many_renderer.rb +0 -18
- data/lib/plutonium/core/autodiscovery/association_renderer_discoverer.rb +0 -31
- data/lib/plutonium/core/autodiscovery/discoverer.rb +0 -15
- data/lib/plutonium/core/autodiscovery/input_discoverer.rb +0 -31
- data/lib/plutonium/core/autodiscovery/renderer_discoverer.rb +0 -31
- data/lib/plutonium/core/definers/action_definer.rb +0 -25
- data/lib/plutonium/core/definers/association_renderer_definer.rb +0 -33
- data/lib/plutonium/core/definers/field_definer.rb +0 -19
- data/lib/plutonium/core/definers/field_input_definer.rb +0 -77
- data/lib/plutonium/core/definers/field_renderer_definer.rb +0 -37
- data/lib/plutonium/core/fields/inputs/attachment_input.rb +0 -24
- data/lib/plutonium/core/fields/inputs/base.rb +0 -110
- data/lib/plutonium/core/fields/inputs/belongs_to_association_input.rb +0 -15
- data/lib/plutonium/core/fields/inputs/checkbox_input.rb +0 -15
- data/lib/plutonium/core/fields/inputs/date_time_input.rb +0 -15
- data/lib/plutonium/core/fields/inputs/factory.rb +0 -50
- data/lib/plutonium/core/fields/inputs/has_many_association_input.rb +0 -15
- data/lib/plutonium/core/fields/inputs/nested_input.rb +0 -72
- data/lib/plutonium/core/fields/inputs/noop_input.rb +0 -16
- data/lib/plutonium/core/fields/inputs/phone_input.rb +0 -22
- data/lib/plutonium/core/fields/inputs/polymorphic_belongs_to_association_input.rb +0 -48
- data/lib/plutonium/core/fields/inputs/simple_form_association_input.rb +0 -26
- data/lib/plutonium/core/fields/inputs/simple_form_input.rb +0 -13
- data/lib/plutonium/core/fields/renderers/association_renderer.rb +0 -28
- data/lib/plutonium/core/fields/renderers/attachment_renderer.rb +0 -21
- data/lib/plutonium/core/fields/renderers/base.rb +0 -83
- data/lib/plutonium/core/fields/renderers/basic_renderer.rb +0 -13
- data/lib/plutonium/core/fields/renderers/factory.rb +0 -37
- data/lib/plutonium/core/renderable.rb +0 -20
- data/lib/plutonium/core/ui/collection.rb +0 -18
- data/lib/plutonium/core/ui/detail.rb +0 -15
- data/lib/plutonium/core/ui/form.rb +0 -12
- data/lib/plutonium/helpers/action_buttons_helper.rb +0 -32
- data/lib/plutonium/helpers/component_helper.rb +0 -14
- data/lib/plutonium/helpers/form_helper.rb +0 -50
- data/lib/plutonium/icons.rb +0 -32
- data/lib/plutonium/preserved__/field.rb.bk +0 -65
- data/lib/plutonium/preserved__/input.rb.bk +0 -93
- data/lib/plutonium/ui/table/components/pagy_page_info.rb +0 -70
- data/src/js/controllers/has_many_panel_controller.js +0 -8
- data/src/js/controllers/interactive_action_form_controller.js +0 -13
- data/src/js/controllers/nav_grid_menu_controller.js +0 -8
- data/src/js/controllers/nav_grid_menu_item_controller.js +0 -8
- data/src/js/controllers/nav_user_controller.js +0 -8
- data/src/js/controllers/nav_user_link_controller.js +0 -8
- data/src/js/controllers/nav_user_section_controller.js +0 -8
- data/src/js/controllers/resource_layout_controller.js +0 -8
- data/src/js/controllers/sidebar_controller.js +0 -8
- data/src/js/controllers/sidebar_menu_controller.js +0 -8
- data/src/js/controllers/sidebar_menu_item_controller.js +0 -8
- data/src/js/controllers/table_controller.js +0 -8
- data/src/js/controllers/table_search_input_controller.js +0 -8
- data/src/js/controllers/table_toolbar_controller.js +0 -8
- data/src/js/controllers/toolbar_controller.js +0 -8
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Used by the otp_unlock feature
|
|
2
|
+
create_table :<%= table_prefix %>_otp_unlocks, id: false do |t|
|
|
3
|
+
t.<%= primary_key_type(nil) %> :id, primary_key: true
|
|
4
|
+
t.foreign_key :<%= table_prefix.pluralize %>, column: :id
|
|
5
|
+
t.integer :num_successes, null: false, default: 1
|
|
6
|
+
t.datetime :next_auth_attempt_after, null: false, default: -> { "<%= current_timestamp %>" }
|
|
7
|
+
end
|
|
@@ -1,52 +1,8 @@
|
|
|
1
1
|
===============================================================================
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
* You can copy Rodauth views into your app by running:
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
is an example of default_url_options appropriate for a development environment
|
|
7
|
-
in config/environments/development.rb:
|
|
5
|
+
rails g pu:rodauth:views account_name --features=change_login reset_password
|
|
8
6
|
|
|
9
|
-
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
|
|
10
|
-
|
|
11
|
-
In production, :host should be set to the actual host of your application.
|
|
12
|
-
|
|
13
|
-
* Required for all applications. *
|
|
14
|
-
|
|
15
|
-
2. Ensure you have defined root_url to *something* in your config/routes.rb.
|
|
16
|
-
For example:
|
|
17
|
-
|
|
18
|
-
root to: "home#index"
|
|
19
|
-
|
|
20
|
-
* Not required for API-only Applications *
|
|
21
|
-
|
|
22
|
-
3. Ensure you have flash messages in app/views/layouts/application.html.erb.
|
|
23
|
-
For example:
|
|
24
|
-
|
|
25
|
-
<% if notice %>
|
|
26
|
-
<div class="alert alert-success"><%= notice %></div>
|
|
27
|
-
<% end %>
|
|
28
|
-
<% if alert %>
|
|
29
|
-
<div class="alert alert-danger"><%= alert %></div>
|
|
30
|
-
<% end %>
|
|
31
|
-
|
|
32
|
-
* Not required for API-only Applications *
|
|
33
|
-
|
|
34
|
-
4. Titles for Rodauth pages are available via @page_title instance variable
|
|
35
|
-
by default, you can use it in your layout file:
|
|
36
|
-
|
|
37
|
-
<head>
|
|
38
|
-
<title><%= @page_title || "Default title" %></title>
|
|
39
|
-
...
|
|
40
|
-
</head>
|
|
41
|
-
|
|
42
|
-
* Not required *
|
|
43
|
-
|
|
44
|
-
5. You can copy Rodauth views (for customization) to your app by running:
|
|
45
|
-
|
|
46
|
-
rails g rodauth:views # default bootstrap views
|
|
47
|
-
|
|
48
|
-
rails g rodauth:views --css=tailwind # tailwind views (requires @tailwindcss/forms plugin)
|
|
49
|
-
|
|
50
|
-
* Not required *
|
|
51
7
|
|
|
52
8
|
===============================================================================
|
|
@@ -5,12 +5,12 @@ module Rodauth
|
|
|
5
5
|
|
|
6
6
|
private
|
|
7
7
|
|
|
8
|
-
def current_account
|
|
9
|
-
|
|
8
|
+
def current_account
|
|
9
|
+
rodauth.rails_account
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def rodauth(name = <%= ":#{table_prefix}" %>)
|
|
13
|
-
super
|
|
13
|
+
super
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
end
|
|
@@ -51,12 +51,61 @@ class RodauthMailer < ApplicationMailer
|
|
|
51
51
|
mail subject: @rodauth.email_subject_prefix + @rodauth.unlock_account_email_subject
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
+
def otp_locked_out(name, account_id)
|
|
55
|
+
@rodauth = rodauth(name, account_id)
|
|
56
|
+
@account = @rodauth.rails_account
|
|
57
|
+
|
|
58
|
+
mail subject: @rodauth.email_subject_prefix + @rodauth.otp_locked_out_email_subject
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def otp_unlocked(name, account_id)
|
|
62
|
+
@rodauth = rodauth(name, account_id)
|
|
63
|
+
@account = @rodauth.rails_account
|
|
64
|
+
|
|
65
|
+
mail subject: @rodauth.email_subject_prefix + @rodauth.otp_unlocked_email_subject
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def otp_unlock_failed(name, account_id)
|
|
69
|
+
@rodauth = rodauth(name, account_id)
|
|
70
|
+
@account = @rodauth.rails_account
|
|
71
|
+
|
|
72
|
+
mail subject: @rodauth.email_subject_prefix + @rodauth.otp_unlock_failed_email_subject
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def otp_setup(name, account_id)
|
|
76
|
+
@rodauth = rodauth(name, account_id)
|
|
77
|
+
@account = @rodauth.rails_account
|
|
78
|
+
|
|
79
|
+
mail subject: @rodauth.email_subject_prefix + @rodauth.otp_setup_email_subject
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def otp_disabled(name, account_id)
|
|
83
|
+
@rodauth = rodauth(name, account_id)
|
|
84
|
+
@account = @rodauth.rails_account
|
|
85
|
+
|
|
86
|
+
mail subject: @rodauth.email_subject_prefix + @rodauth.otp_disabled_email_subject
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def webauthn_authenticator_added(name, account_id)
|
|
90
|
+
@rodauth = rodauth(name, account_id)
|
|
91
|
+
@account = @rodauth.rails_account
|
|
92
|
+
|
|
93
|
+
mail subject: @rodauth.email_subject_prefix + @rodauth.webauthn_authenticator_added_email_subject
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def webauthn_authenticator_removed(name, account_id)
|
|
97
|
+
@rodauth = rodauth(name, account_id)
|
|
98
|
+
@account = @rodauth.rails_account
|
|
99
|
+
|
|
100
|
+
mail subject: @rodauth.email_subject_prefix + @rodauth.webauthn_authenticator_removed_email_subject
|
|
101
|
+
end
|
|
102
|
+
|
|
54
103
|
private
|
|
55
104
|
|
|
56
105
|
def rodauth(name, account_id, &block)
|
|
57
106
|
instance = RodauthApp.rodauth(name).allocate
|
|
58
107
|
instance.url_options = default_url_options
|
|
59
|
-
instance.
|
|
108
|
+
instance.account_from_id(account_id)
|
|
60
109
|
instance.instance_eval(&block) if block
|
|
61
110
|
instance
|
|
62
111
|
end
|
|
@@ -16,6 +16,9 @@ class <%= account_path.classify %>RodauthPlugin < RodauthPlugin
|
|
|
16
16
|
|
|
17
17
|
# ==> General
|
|
18
18
|
|
|
19
|
+
# Prevent rodauth from introspecting the database if we are not using UUIDs
|
|
20
|
+
convert_token_id_to_integer? { <%= account_path.classify %>.columns_hash["id"].type == :integer }
|
|
21
|
+
|
|
19
22
|
# Change prefix of table and foreign key column names from default "account"
|
|
20
23
|
# accounts_table: 'players'
|
|
21
24
|
|
|
@@ -129,6 +132,40 @@ class <%= account_path.classify %>RodauthPlugin < RodauthPlugin
|
|
|
129
132
|
Rodauth::<%= account_path.classify %>Mailer.unlock_account(self.class.configuration_name, account_id, unlock_account_key_value)
|
|
130
133
|
end
|
|
131
134
|
<% end -%>
|
|
135
|
+
<% if otp_lockout_email? -%>
|
|
136
|
+
|
|
137
|
+
create_otp_locked_out_email do
|
|
138
|
+
Rodauth::<%= account_path.classify %>Mailer.otp_locked_out(self.class.configuration_name, account_id)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
create_otp_unlocked_email do
|
|
142
|
+
Rodauth::<%= account_path.classify %>Mailer.otp_unlocked(self.class.configuration_name, account_id)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
create_otp_unlock_failed_email do
|
|
146
|
+
Rodauth::<%= account_path.classify %>Mailer.otp_unlock_failed(self.class.configuration_name, account_id)
|
|
147
|
+
end
|
|
148
|
+
<% end -%>
|
|
149
|
+
<% if otp_modify_email? -%>
|
|
150
|
+
|
|
151
|
+
create_otp_setup_email do
|
|
152
|
+
Rodauth::<%= account_path.classify %>Mailer.otp_setup(self.class.configuration_name, account_id)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
create_otp_disabled_email do
|
|
156
|
+
Rodauth::<%= account_path.classify %>Mailer.otp_disabled(self.class.configuration_name, account_id)
|
|
157
|
+
end
|
|
158
|
+
<% end -%>
|
|
159
|
+
<% if webauthn_modify_email? -%>
|
|
160
|
+
|
|
161
|
+
create_webauthn_authenticator_added_email do
|
|
162
|
+
Rodauth::<%= account_path.classify %>Mailer.webauthn_authenticator_added(self.class.configuration_name, account_id)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
create_webauthn_authenticator_removed_email do
|
|
166
|
+
Rodauth::<%= account_path.classify %>Mailer.webauthn_authenticator_removed(self.class.configuration_name, account_id)
|
|
167
|
+
end
|
|
168
|
+
<% end -%>
|
|
132
169
|
|
|
133
170
|
send_email do |email|
|
|
134
171
|
# queue email delivery on the mailer after the transaction commits
|
|
@@ -253,9 +290,6 @@ class <%= account_path.classify %>RodauthPlugin < RodauthPlugin
|
|
|
253
290
|
# Redirect to login page after password reset.
|
|
254
291
|
reset_password_redirect { login_path }
|
|
255
292
|
<% end -%>
|
|
256
|
-
|
|
257
|
-
# Ensure requiring login follows login route changes.
|
|
258
|
-
require_login_redirect { login_path }
|
|
259
293
|
<% end -%>
|
|
260
294
|
|
|
261
295
|
# ==> Deadlines
|
|
@@ -23,10 +23,6 @@ class RodauthPlugin < Rodauth::Rails::Auth
|
|
|
23
23
|
db Sequel.<%= sequel_adapter %>(extensions: :activerecord_connection, keep_reference: false)
|
|
24
24
|
<% end -%>
|
|
25
25
|
|
|
26
|
-
# Prevent rodauth from introspecting the database if we are not using UUIDs
|
|
27
|
-
# https://github.com/janko/rodauth-rails/issues/244
|
|
28
|
-
convert_token_id_to_integer? true
|
|
29
|
-
|
|
30
26
|
# Change prefix of table and foreign key column names from default "account"
|
|
31
27
|
# accounts_table :users
|
|
32
28
|
# verify_account_table :user_verification_keys
|
|
@@ -66,7 +62,11 @@ class RodauthPlugin < Rodauth::Rails::Auth
|
|
|
66
62
|
# delete_account_on_close? true
|
|
67
63
|
|
|
68
64
|
# Redirect to the app from login and registration pages if already logged in.
|
|
69
|
-
already_logged_in
|
|
65
|
+
already_logged_in do
|
|
66
|
+
uri = URI(login_redirect)
|
|
67
|
+
uri.query = URI.encode_www_form(rails_request.query_parameters)
|
|
68
|
+
redirect uri.to_s
|
|
69
|
+
end
|
|
70
70
|
|
|
71
71
|
# ==> JWT
|
|
72
72
|
|
|
@@ -115,6 +115,34 @@ class RodauthPlugin < Rodauth::Rails::Auth
|
|
|
115
115
|
# RodauthMailer.unlock_account(self.class.configuration_name, account_id, unlock_account_key_value)
|
|
116
116
|
# end
|
|
117
117
|
|
|
118
|
+
# create_otp_locked_out_email do
|
|
119
|
+
# RodauthMailer.otp_locked_out(self.class.configuration_name, account_id)
|
|
120
|
+
# end
|
|
121
|
+
|
|
122
|
+
# create_otp_unlocked_email do
|
|
123
|
+
# RodauthMailer.otp_unlocked(self.class.configuration_name, account_id)
|
|
124
|
+
# end
|
|
125
|
+
|
|
126
|
+
# create_otp_unlock_failed_email do
|
|
127
|
+
# RodauthMailer.otp_unlock_failed(self.class.configuration_name, account_id)
|
|
128
|
+
# end
|
|
129
|
+
|
|
130
|
+
# create_otp_setup_email do
|
|
131
|
+
# RodauthMailer.otp_setup(self.class.configuration_name, account_id)
|
|
132
|
+
# end
|
|
133
|
+
|
|
134
|
+
# create_otp_disabled_email do
|
|
135
|
+
# RodauthMailer.otp_disabled(self.class.configuration_name, account_id)
|
|
136
|
+
# end
|
|
137
|
+
|
|
138
|
+
# create_webauthn_authenticator_added_email do
|
|
139
|
+
# RodauthMailer.webauthn_authenticator_added(self.class.configuration_name, account_id)
|
|
140
|
+
# end
|
|
141
|
+
|
|
142
|
+
# create_webauthn_authenticator_removed_email do
|
|
143
|
+
# RodauthMailer.webauthn_authenticator_removed(self.class.configuration_name, account_id)
|
|
144
|
+
# end
|
|
145
|
+
|
|
118
146
|
# send_email do |email|
|
|
119
147
|
# # queue email delivery on the mailer after the transaction commits
|
|
120
148
|
# db.after_commit { email.deliver_later }
|
|
@@ -216,9 +244,6 @@ class RodauthPlugin < Rodauth::Rails::Auth
|
|
|
216
244
|
# Redirect to login page after password reset.
|
|
217
245
|
# reset_password_redirect { login_path }
|
|
218
246
|
|
|
219
|
-
# Ensure requiring login follows login route changes.
|
|
220
|
-
# require_login_redirect { login_path }
|
|
221
|
-
|
|
222
247
|
# ==> Deadlines
|
|
223
248
|
# Change default deadlines for some actions.
|
|
224
249
|
# verify_account_grace_period 3.days.to_i
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
TOTP authentication has been locked out on your account due to too many
|
|
2
|
+
consecutive authentication failures. You can attempt to unlock TOTP
|
|
3
|
+
authentication for your account by consecutively authenticating via
|
|
4
|
+
TOTP multiple times.
|
|
5
|
+
|
|
6
|
+
If you did not initiate the TOTP authentication failures that
|
|
7
|
+
caused TOTP authentication to be locked out, that means someone already
|
|
8
|
+
has partial access to your account, but is unable to use TOTP
|
|
9
|
+
authentication to fully authenticate themselves.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Someone (hopefully you) attempted to unlock TOTP authentication for the
|
|
2
|
+
account associated to this email address, but failed as the
|
|
3
|
+
authentication code submitted was not correct.
|
|
4
|
+
|
|
5
|
+
If you did not initiate the TOTP authentication failure that generated
|
|
6
|
+
this email, that means someone already has partial access to your
|
|
7
|
+
account, but is unable to use TOTP authentication to fully authenticate
|
|
8
|
+
themselves.
|
|
@@ -42,7 +42,6 @@ module Pu
|
|
|
42
42
|
copy_file view_location(view), "app/views/#{directory}/#{view}.html.erb" do |content|
|
|
43
43
|
content = content.gsub("rodauth.", "rodauth(:#{configuration_name}).") if configuration_name
|
|
44
44
|
content = content.gsub("rodauth/", "#{directory}/")
|
|
45
|
-
content = form_helpers_compatibility(content) if ActionView.version < Gem::Version.new("5.1")
|
|
46
45
|
content
|
|
47
46
|
end
|
|
48
47
|
end
|
|
@@ -94,18 +93,8 @@ module Pu
|
|
|
94
93
|
plugin_name
|
|
95
94
|
end
|
|
96
95
|
|
|
97
|
-
# We need to use the *_tag helpers on versions lower than Rails 5.1.
|
|
98
|
-
def form_helpers_compatibility(content)
|
|
99
|
-
content
|
|
100
|
-
.gsub(/form_with url: (.+) do \|form\|/, 'form_tag \1 do')
|
|
101
|
-
.gsub(/form\.(label|submit)/, '\1_tag')
|
|
102
|
-
.gsub(/form\.(email|password|text|telephone|hidden)_field (\S+), value:/, '\1_field_tag \2,')
|
|
103
|
-
.gsub(/form\.radio_button (\S+), (\S+),/, 'radio_button_tag \1, \2, false,')
|
|
104
|
-
.gsub(/form\.check_box (\S+), (.+) /, 'check_box_tag \1, "t", false, \2 ')
|
|
105
|
-
end
|
|
106
|
-
|
|
107
96
|
def view_location(view)
|
|
108
|
-
"app/views/rodauth/#{view}.html.erb"
|
|
97
|
+
File.join Plutonium.root, "app/views/rodauth/#{view}.html.erb"
|
|
109
98
|
end
|
|
110
99
|
end
|
|
111
100
|
end
|
|
@@ -19,7 +19,9 @@ module Plutonium
|
|
|
19
19
|
# Use this when getting a scope for a resource that is not the current
|
|
20
20
|
# Use this instead of authorized_scope directly
|
|
21
21
|
def authorized_resource_scope(resource, relation: nil, **options)
|
|
22
|
-
|
|
22
|
+
unless resource.instance_of?(Class) && resource < ActiveRecord::Base
|
|
23
|
+
raise ArgumentError("Expected resource to be a class inheriting ActiveRecord::Base")
|
|
24
|
+
end
|
|
23
25
|
|
|
24
26
|
options[:with] ||= ActionPolicy.lookup(resource, namespace: authorization_namespace)
|
|
25
27
|
relation ||= resource.all
|
|
@@ -4,14 +4,6 @@ module Plutonium
|
|
|
4
4
|
def application_name
|
|
5
5
|
Plutonium.application_name
|
|
6
6
|
end
|
|
7
|
-
|
|
8
|
-
# Renders an icon using the Plutonium Icons library.
|
|
9
|
-
#
|
|
10
|
-
# @param icon [Symbol, String] The name or identifier of the icon to render.
|
|
11
|
-
# @return [String] The HTML-safe string for the rendered icon.
|
|
12
|
-
def render_icon(icon, **)
|
|
13
|
-
Plutonium::Icons.render(icon, **)
|
|
14
|
-
end
|
|
15
7
|
end
|
|
16
8
|
end
|
|
17
9
|
end
|
data/lib/plutonium/helpers.rb
CHANGED
|
@@ -2,13 +2,10 @@ module Plutonium
|
|
|
2
2
|
module Helpers
|
|
3
3
|
def self.included(base)
|
|
4
4
|
base.class_eval do
|
|
5
|
-
include Plutonium::Helpers::ActionButtonsHelper
|
|
6
5
|
include Plutonium::Helpers::ApplicationHelper
|
|
7
6
|
include Plutonium::Helpers::AttachmentHelper
|
|
8
|
-
include Plutonium::Helpers::ComponentHelper
|
|
9
7
|
include Plutonium::Helpers::ContentHelper
|
|
10
8
|
include Plutonium::Helpers::DisplayHelper
|
|
11
|
-
include Plutonium::Helpers::FormHelper
|
|
12
9
|
include Plutonium::Helpers::TableHelper
|
|
13
10
|
include Plutonium::Helpers::TurboHelper
|
|
14
11
|
include Plutonium::Helpers::TurboStreamActionsHelper
|
data/lib/plutonium/railtie.rb
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "view_component"
|
|
4
|
-
|
|
5
3
|
module Plutonium
|
|
6
4
|
# Plutonium::Railtie integrates Plutonium with Rails applications.
|
|
7
5
|
#
|
|
@@ -33,10 +31,6 @@ module Plutonium
|
|
|
33
31
|
setup_asset_pipeline if Rails.application.config.respond_to?(:assets)
|
|
34
32
|
end
|
|
35
33
|
|
|
36
|
-
initializer "plutonium.load_components" do
|
|
37
|
-
load_base_component
|
|
38
|
-
end
|
|
39
|
-
|
|
40
34
|
initializer "plutonium.initializers" do
|
|
41
35
|
load_plutonium_initializers
|
|
42
36
|
end
|
|
@@ -45,10 +39,6 @@ module Plutonium
|
|
|
45
39
|
setup_development_asset_server if Plutonium.configuration.development?
|
|
46
40
|
end
|
|
47
41
|
|
|
48
|
-
initializer "plutonium.view_components_capture_compat" do
|
|
49
|
-
config.view_component.capture_compatibility_patch_enabled = true
|
|
50
|
-
end
|
|
51
|
-
|
|
52
42
|
initializer "plutonium.action_dispatch_extensions" do
|
|
53
43
|
extend_action_dispatch
|
|
54
44
|
end
|
|
@@ -74,10 +64,6 @@ module Plutonium
|
|
|
74
64
|
Rails.application.config.assets.paths << Plutonium.root.join("app/assets").to_s
|
|
75
65
|
end
|
|
76
66
|
|
|
77
|
-
def load_base_component
|
|
78
|
-
load Plutonium.root.join("app", "views", "components", "base.rb")
|
|
79
|
-
end
|
|
80
|
-
|
|
81
67
|
def load_plutonium_initializers
|
|
82
68
|
Dir.glob(Plutonium.root.join("config", "initializers", "**", "*.rb")) { |file| load file }
|
|
83
69
|
end
|
data/lib/plutonium/reloader.rb
CHANGED
|
@@ -5,8 +5,7 @@ require "active_support/notifications"
|
|
|
5
5
|
module Plutonium
|
|
6
6
|
# Reloader class for Plutonium
|
|
7
7
|
#
|
|
8
|
-
# This class is responsible for
|
|
9
|
-
# and related files during development.
|
|
8
|
+
# This class is responsible for reloading during development.
|
|
10
9
|
class Reloader
|
|
11
10
|
class << self
|
|
12
11
|
# Start the reloader
|
|
@@ -46,11 +45,11 @@ module Plutonium
|
|
|
46
45
|
if Plutonium.configuration.development?
|
|
47
46
|
reload_paths.concat([
|
|
48
47
|
Plutonium.lib_root.to_s,
|
|
49
|
-
Plutonium.root.join("app", "views", "components").to_s,
|
|
50
48
|
Plutonium.root.join("config", "initializers").to_s
|
|
51
49
|
])
|
|
52
50
|
end
|
|
53
51
|
|
|
52
|
+
# Add the application's packages dir
|
|
54
53
|
packages_dir = Rails.root.join("packages").to_s
|
|
55
54
|
reload_paths << packages_dir if File.directory?(packages_dir)
|
|
56
55
|
|
|
@@ -120,15 +119,6 @@ module Plutonium
|
|
|
120
119
|
Plutonium.logger.debug { "[plutonium] reloading: app+framework" }
|
|
121
120
|
Rails.application.reloader.reload!
|
|
122
121
|
Plutonium::Loader.reload
|
|
123
|
-
reload_components
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# Reload components
|
|
127
|
-
#
|
|
128
|
-
# @return [void]
|
|
129
|
-
def reload_components
|
|
130
|
-
Object.send(:remove_const, "PlutoniumUi")
|
|
131
|
-
load Plutonium.root.join("app", "views", "components", "base.rb")
|
|
132
122
|
end
|
|
133
123
|
|
|
134
124
|
# Reload a single file
|
|
@@ -5,9 +5,7 @@ module Plutonium
|
|
|
5
5
|
|
|
6
6
|
included do
|
|
7
7
|
helper Plutonium::Helpers::ApplicationHelper
|
|
8
|
-
helper Plutonium::Helpers::ComponentHelper
|
|
9
8
|
helper Plutonium::Helpers::AssetsHelper
|
|
10
|
-
helper Plutonium::Helpers::FormHelper
|
|
11
9
|
|
|
12
10
|
layout "rodauth"
|
|
13
11
|
append_view_path File.expand_path("app/views", Plutonium.root)
|
|
@@ -17,7 +15,7 @@ module Plutonium
|
|
|
17
15
|
private
|
|
18
16
|
|
|
19
17
|
def root_path
|
|
20
|
-
|
|
18
|
+
rodauth.login_redirect
|
|
21
19
|
end
|
|
22
20
|
end
|
|
23
21
|
end
|
|
@@ -5,38 +5,82 @@ require "phlex"
|
|
|
5
5
|
module Plutonium
|
|
6
6
|
module UI
|
|
7
7
|
module Component
|
|
8
|
+
# Component Kit automatically handles component instantiation and rendering
|
|
9
|
+
# through a convention-based approach using Build* methods.
|
|
10
|
+
#
|
|
11
|
+
# @example Basic component usage
|
|
12
|
+
# class MyView
|
|
13
|
+
# include Plutonium::UI::Component::Kit
|
|
14
|
+
#
|
|
15
|
+
# def template
|
|
16
|
+
# PageHeader(title: "Dashboard")
|
|
17
|
+
# TabList(items: tabs)
|
|
18
|
+
# Panel(class: "mt-4") do
|
|
19
|
+
# content
|
|
20
|
+
# end
|
|
21
|
+
# end
|
|
22
|
+
# end
|
|
23
|
+
#
|
|
24
|
+
# @example Adding a new component
|
|
25
|
+
# def BuildCustomComponent(title:, **options)
|
|
26
|
+
# Plutonium::UI::CustomComponent.new(
|
|
27
|
+
# title: title,
|
|
28
|
+
# **options
|
|
29
|
+
# )
|
|
30
|
+
# end
|
|
31
|
+
#
|
|
32
|
+
# @note All components are automatically rendered when called without the 'Build' prefix.
|
|
33
|
+
# For example, calling `TabList(...)` will internally call `BuildTabList(...)` and
|
|
34
|
+
# render the result.
|
|
8
35
|
module Kit
|
|
9
36
|
extend ActiveSupport::Concern
|
|
10
37
|
|
|
11
|
-
def
|
|
38
|
+
def method_missing(method_name, *args, **kwargs, &block)
|
|
39
|
+
build_method = "Build#{method_name}"
|
|
12
40
|
|
|
13
|
-
|
|
41
|
+
if self.class.method_defined?(build_method)
|
|
42
|
+
render send(build_method, *args, **kwargs, &block)
|
|
43
|
+
else
|
|
44
|
+
super
|
|
45
|
+
end
|
|
46
|
+
end
|
|
14
47
|
|
|
15
|
-
def
|
|
48
|
+
def respond_to_missing?(method_name, include_private = false)
|
|
49
|
+
build_method = "Build#{method_name}"
|
|
50
|
+
self.class.method_defined?(build_method) || super
|
|
51
|
+
end
|
|
16
52
|
|
|
17
|
-
def
|
|
53
|
+
def BuildBreadcrumbs(...) = Plutonium::UI::Breadcrumbs.new(...)
|
|
18
54
|
|
|
19
|
-
def
|
|
55
|
+
def BuildSkeletonTable(...) = Plutonium::UI::SkeletonTable.new(...)
|
|
20
56
|
|
|
21
|
-
def
|
|
57
|
+
def BuildBlock(...) = Plutonium::UI::Block.new(...)
|
|
22
58
|
|
|
23
|
-
def
|
|
59
|
+
def BuildPanel(...) = Plutonium::UI::Panel.new(...)
|
|
24
60
|
|
|
25
|
-
def
|
|
61
|
+
def BuildFrameNavigatorPanel(...) = Plutonium::UI::FrameNavigatorPanel.new(...)
|
|
26
62
|
|
|
27
|
-
def
|
|
63
|
+
def BuildTabList(...) = Plutonium::UI::TabList.new(...)
|
|
28
64
|
|
|
29
|
-
def
|
|
65
|
+
def BuildDynaFrameHost(...) = Plutonium::UI::DynaFrame::Host.new(...)
|
|
30
66
|
|
|
31
|
-
def
|
|
67
|
+
def BuildDynaFrameContent(...) = Plutonium::UI::DynaFrame::Content.new(...)
|
|
32
68
|
|
|
33
|
-
def
|
|
69
|
+
def BuildPageHeader(...) = Plutonium::UI::PageHeader.new(...)
|
|
34
70
|
|
|
35
|
-
def
|
|
71
|
+
def BuildActionButton(...) = Plutonium::UI::ActionButton.new(...)
|
|
36
72
|
|
|
37
|
-
def
|
|
73
|
+
def BuildEmptyCard(...) = Plutonium::UI::EmptyCard.new(...)
|
|
38
74
|
|
|
39
|
-
def
|
|
75
|
+
def BuildTableSearchBar(...) = Plutonium::UI::Table::Components::SearchBar.new(...)
|
|
76
|
+
|
|
77
|
+
def BuildTableScopesBar(...) = Plutonium::UI::Table::Components::ScopesBar.new(...)
|
|
78
|
+
|
|
79
|
+
def BuildTableInfo(...) = Plutonium::UI::Table::Components::PagyInfo.new(...)
|
|
80
|
+
|
|
81
|
+
def BuildTablePagination(...) = Plutonium::UI::Table::Components::PagyPagination.new(...)
|
|
82
|
+
|
|
83
|
+
def BuildColorModeSelector(...) = Plutonium::UI::ColorModeSelector.new(...)
|
|
40
84
|
end
|
|
41
85
|
end
|
|
42
86
|
end
|
|
@@ -8,11 +8,15 @@ module Plutonium
|
|
|
8
8
|
|
|
9
9
|
class Builder < Builder
|
|
10
10
|
def association_tag(**, &)
|
|
11
|
-
create_component(Plutonium::UI::Display::
|
|
11
|
+
create_component(Plutonium::UI::Display::Components::Association, :association, **, &)
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def markdown_tag(**, &)
|
|
15
|
-
create_component(Plutonium::UI::Display::
|
|
15
|
+
create_component(Plutonium::UI::Display::Components::Markdown, :markdown, **, &)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def attachment_tag(**, &)
|
|
19
|
+
create_component(Plutonium::UI::Display::Components::Attachment, :attachment, **, &)
|
|
16
20
|
end
|
|
17
21
|
end
|
|
18
22
|
|