nfg_ui 0.9.8.15
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +431 -0
- data/Rakefile +23 -0
- data/app/assets/config/nfg_ui_manifest.js +3 -0
- data/app/assets/images/nfg_ui/app_icon/android-chrome-192x192.png +0 -0
- data/app/assets/images/nfg_ui/app_icon/android-chrome-384x384.png +0 -0
- data/app/assets/images/nfg_ui/app_icon/apple-touch-icon.png +0 -0
- data/app/assets/images/nfg_ui/app_icon/browserconfig.xml.erb +9 -0
- data/app/assets/images/nfg_ui/app_icon/favicon-16x16.png +0 -0
- data/app/assets/images/nfg_ui/app_icon/favicon-32x32.png +0 -0
- data/app/assets/images/nfg_ui/app_icon/favicon.ico +0 -0
- data/app/assets/images/nfg_ui/app_icon/mstile-150x150.png +0 -0
- data/app/assets/images/nfg_ui/app_icon/safari-pinned-tab.svg +38 -0
- data/app/assets/images/nfg_ui/app_icon/site.webmanifest.erb +19 -0
- data/app/assets/images/nfg_ui/email/icons/fa-caret-right.png +0 -0
- data/app/assets/images/nfg_ui/email/icons/fa-facebook.png +0 -0
- data/app/assets/images/nfg_ui/email/icons/fa-linkedin.png +0 -0
- data/app/assets/images/nfg_ui/email/icons/fa-twitter.png +0 -0
- data/app/assets/images/nfg_ui/email/icons/fa-youtube.png +0 -0
- data/app/assets/images/nfg_ui/email/nfg-logo.png +0 -0
- data/app/assets/javascripts/nfg_ui/application.coffee +16 -0
- data/app/assets/javascripts/nfg_ui/collapsible_toggle.coffee +47 -0
- data/app/assets/javascripts/nfg_ui/prevent_clickable_disabled_element.coffee +47 -0
- data/app/assets/javascripts/nfg_ui/vendor/select2.coffee +26 -0
- data/app/assets/javascripts/nfg_ui/vendor/tooltips.coffee +18 -0
- data/app/assets/stylesheets/nfg_ui/bootstrap/application.scss +2 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/_variables.scss +1123 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/application.scss +23 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_alert.scss +2 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_backgrounds.scss +9 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_button-group.scss +8 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_buttons.scss +17 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_card.scss +20 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_custom.scss +20 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_custom_forms.scss +156 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_dropdown.scss +24 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_forms.scss +85 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_media.scss +2 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_nav.scss +22 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_navbar.scss +132 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_progress.scss +3 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_reboot.scss +31 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_tables.scss +7 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_tooltip.scss +5 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/_type.scss +82 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_campaign_card.scss +6 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_campaign_preview.scss +25 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_content_section_buttons.scss +11 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_custom_questions_questionnaire.scss +84 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_custom_receipt_language.scss +15 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_email_preview.scss +24 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_interaction.scss +2 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_mobile.scss +4 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_nav_step.scss +95 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_overlay_blocker.scss +49 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_page_header.scss +9 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_product_icons.scss +45 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_redactor.scss +25 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_share_dropdown.scss +53 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_slat.scss +113 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_social_share.scss +44 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_status_indicator.scss +9 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_ticket.scss +12 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/admin/nfg_theme/custom/_tile.scss +71 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/email/application.scss +38 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/email/foundation_emails/_alignment.scss +93 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/email/foundation_emails/_button.scss +345 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/email/nfg_theme/_backgrounds.scss +15 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/email/nfg_theme/_layout.scss +33 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/email/nfg_theme/_rainbow_bar.scss +47 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/email/nfg_theme/_spacers.scss +60 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/email/nfg_theme/_typography.scss +6 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/email/settings/_settings.scss +148 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/_variables.scss +1124 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/application.scss +23 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/application.scss +19 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_badge.scss +6 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_buttons.scss +43 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_custom.scss +3 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_custom_forms.scss +50 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_forms.scss +12 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_functions.scss +29 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_navbar.scss +18 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_reboot.scss +6 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_type.scss +16 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/_utilities.scss +8 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/custom/_everyday_default.scss +6 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/nfg_theme/custom/_nav_step.scss +20 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/entity_branding/plugins/_select2.scss +16 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/_variables.scss +13 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/application.scss +35 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_breadcrumb.scss +4 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_button-group.scss +10 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_card.scss +45 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_carousel.scss +18 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_custom-forms.scss +12 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_custom.scss +4 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_forms.scss +68 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_grid.scss +4 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_input-group.scss +25 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_list-group.scss +9 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_media.scss +5 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_mixins.scss +6 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_modal.scss +28 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_nav.scss +21 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_navbar.scss +54 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_pagination.scss +1 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_progress.scss +6 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/_utilities.scss +2 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/custom/_everyday_giving.scss +8 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/custom/_nav_step.scss +13 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/custom/_slat.scss +66 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/mixins/_breakpoints.scss +123 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/mixins/_grid-framework.scss +30 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/mixins/_grid.scss +10 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/utilities/_display.scss +9 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/nfg_theme/utilities/_flex.scss +49 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/legacy_browser_support/plugins/_sticky_div.scss +9 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_alert.scss +2 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_buttons.scss +17 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_card.scss +6 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_carousel.scss +9 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_custom.scss +12 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_custom_forms.scss +156 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_dropdown.scss +1 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_event.scss +19 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_forms.scss +83 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_list-group.scss +12 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_progress.scss +9 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_reboot.scss +31 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_tooltip.scss +5 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/_type.scss +81 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_admin_bar.scss +20 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_background_variations.scss +12 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_everyday_default.scss +43 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_everyday_story.scss +21 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_footer_links.scss +8 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_nav_step.scss +95 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_slat.scss +110 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_social_share.scss +44 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_ticket.scss +12 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_tile.scss +63 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/nfg_theme/custom/_user_navbar.scss +33 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/plugins/_datepicker.scss +2 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/plugins/_select2.scss +216 -0
- data/app/assets/stylesheets/nfg_ui/network_for_good/public/plugins/_sticky_div.scss +11 -0
- data/app/controllers/nfg_ui/application_controller.rb +5 -0
- data/app/helpers/nfg_ui/application_helper.rb +27 -0
- data/app/helpers/nfg_ui/components/email_helpers.rb +8 -0
- data/app/helpers/nfg_ui/components/resource_themes_helper.rb +8 -0
- data/app/helpers/nfg_ui/components/tooltip_helper.rb +24 -0
- data/app/models/nfg_ui/application_record.rb +5 -0
- data/app/views/nfg_ui/app_icons/_icons.html.haml +10 -0
- data/app/views/nfg_ui/email/README.md +12 -0
- data/app/views/nfg_ui/email/_button.html.haml +12 -0
- data/app/views/nfg_ui/email/_email_signature.html.haml +4 -0
- data/app/views/nfg_ui/email/_footer.html.haml +16 -0
- data/app/views/nfg_ui/email/_header.html.haml +6 -0
- data/app/views/nfg_ui/email/_logo.html.haml +6 -0
- data/app/views/nfg_ui/email/_product_content_image.html.haml +7 -0
- data/app/views/nfg_ui/email/_rainbow_bar.html.haml +10 -0
- data/app/views/nfg_ui/email/_section_header.html.haml +8 -0
- data/app/views/nfg_ui/email/_social_network_link.html.haml +12 -0
- data/app/views/nfg_ui/email/_sub_footer.html.haml +9 -0
- data/app/views/nfg_ui/email/_table_row.html.haml +13 -0
- data/config/initializers/web_app_manifest.rb +3 -0
- data/config/locales/email.yml +34 -0
- data/config/locales/en.yml +63 -0
- data/config/routes.rb +2 -0
- data/config/spring.rb +1 -0
- data/lib/nfg_ui/bootstrap/components/alert.rb +52 -0
- data/lib/nfg_ui/bootstrap/components/badge.rb +39 -0
- data/lib/nfg_ui/bootstrap/components/base.rb +151 -0
- data/lib/nfg_ui/bootstrap/components/breadcrumb.rb +23 -0
- data/lib/nfg_ui/bootstrap/components/breadcrumb_item.rb +28 -0
- data/lib/nfg_ui/bootstrap/components/button.rb +74 -0
- data/lib/nfg_ui/bootstrap/components/button_group.rb +36 -0
- data/lib/nfg_ui/bootstrap/components/button_toolbar.rb +21 -0
- data/lib/nfg_ui/bootstrap/components/card.rb +81 -0
- data/lib/nfg_ui/bootstrap/components/card_body.rb +15 -0
- data/lib/nfg_ui/bootstrap/components/card_footer.rb +15 -0
- data/lib/nfg_ui/bootstrap/components/card_header.rb +35 -0
- data/lib/nfg_ui/bootstrap/components/card_image.rb +33 -0
- data/lib/nfg_ui/bootstrap/components/card_image_overlay.rb +46 -0
- data/lib/nfg_ui/bootstrap/components/carousel.rb +57 -0
- data/lib/nfg_ui/bootstrap/components/carousel_caption.rb +34 -0
- data/lib/nfg_ui/bootstrap/components/carousel_control.rb +73 -0
- data/lib/nfg_ui/bootstrap/components/carousel_indicators.rb +54 -0
- data/lib/nfg_ui/bootstrap/components/carousel_item.rb +49 -0
- data/lib/nfg_ui/bootstrap/components/collapse.rb +32 -0
- data/lib/nfg_ui/bootstrap/components/dropdown.rb +51 -0
- data/lib/nfg_ui/bootstrap/components/dropdown_divider.rb +19 -0
- data/lib/nfg_ui/bootstrap/components/dropdown_header.rb +23 -0
- data/lib/nfg_ui/bootstrap/components/dropdown_item.rb +41 -0
- data/lib/nfg_ui/bootstrap/components/dropdown_menu.rb +32 -0
- data/lib/nfg_ui/bootstrap/components/dropdown_toggle.rb +82 -0
- data/lib/nfg_ui/bootstrap/components/embed.rb +80 -0
- data/lib/nfg_ui/bootstrap/components/form.rb +13 -0
- data/lib/nfg_ui/bootstrap/components/input_group.rb +13 -0
- data/lib/nfg_ui/bootstrap/components/jumbotron.rb +13 -0
- data/lib/nfg_ui/bootstrap/components/list_group.rb +39 -0
- data/lib/nfg_ui/bootstrap/components/list_group_item.rb +69 -0
- data/lib/nfg_ui/bootstrap/components/media.rb +15 -0
- data/lib/nfg_ui/bootstrap/components/media_body.rb +15 -0
- data/lib/nfg_ui/bootstrap/components/media_object.rb +23 -0
- data/lib/nfg_ui/bootstrap/components/modal.rb +66 -0
- data/lib/nfg_ui/bootstrap/components/modal_body.rb +16 -0
- data/lib/nfg_ui/bootstrap/components/modal_footer.rb +16 -0
- data/lib/nfg_ui/bootstrap/components/modal_header.rb +37 -0
- data/lib/nfg_ui/bootstrap/components/nav.rb +71 -0
- data/lib/nfg_ui/bootstrap/components/nav_item.rb +103 -0
- data/lib/nfg_ui/bootstrap/components/nav_link.rb +62 -0
- data/lib/nfg_ui/bootstrap/components/navbar.rb +97 -0
- data/lib/nfg_ui/bootstrap/components/navbar_brand.rb +25 -0
- data/lib/nfg_ui/bootstrap/components/navbar_nav.rb +48 -0
- data/lib/nfg_ui/bootstrap/components/navbar_text.rb +21 -0
- data/lib/nfg_ui/bootstrap/components/navbar_toggler.rb +38 -0
- data/lib/nfg_ui/bootstrap/components/page_item.rb +66 -0
- data/lib/nfg_ui/bootstrap/components/pagination.rb +30 -0
- data/lib/nfg_ui/bootstrap/components/popover.rb +12 -0
- data/lib/nfg_ui/bootstrap/components/progress.rb +44 -0
- data/lib/nfg_ui/bootstrap/components/progress_bar.rb +51 -0
- data/lib/nfg_ui/bootstrap/components/tab_content.rb +15 -0
- data/lib/nfg_ui/bootstrap/components/tab_pane.rb +49 -0
- data/lib/nfg_ui/bootstrap/components/table.rb +17 -0
- data/lib/nfg_ui/bootstrap/readme.md +1 -0
- data/lib/nfg_ui/bootstrap/utilities/activatable.rb +32 -0
- data/lib/nfg_ui/bootstrap/utilities/alignable.rb +33 -0
- data/lib/nfg_ui/bootstrap/utilities/collapse_toggleable.rb +35 -0
- data/lib/nfg_ui/bootstrap/utilities/collapsible.rb +42 -0
- data/lib/nfg_ui/bootstrap/utilities/disableable.rb +49 -0
- data/lib/nfg_ui/bootstrap/utilities/dismissible.rb +24 -0
- data/lib/nfg_ui/bootstrap/utilities/dropdown_directionable.rb +40 -0
- data/lib/nfg_ui/bootstrap/utilities/headable.rb +20 -0
- data/lib/nfg_ui/bootstrap/utilities/modalable.rb +104 -0
- data/lib/nfg_ui/bootstrap/utilities/progressable.rb +42 -0
- data/lib/nfg_ui/bootstrap/utilities/remotable.rb +24 -0
- data/lib/nfg_ui/bootstrap/utilities/sizable.rb +40 -0
- data/lib/nfg_ui/bootstrap/utilities/themeable.rb +51 -0
- data/lib/nfg_ui/bootstrap/utilities/tooltipable.rb +95 -0
- data/lib/nfg_ui/bootstrap/utilities/wrappable.rb +48 -0
- data/lib/nfg_ui/components/base.rb +14 -0
- data/lib/nfg_ui/components/elements/activity.rb +10 -0
- data/lib/nfg_ui/components/elements/alert.rb +63 -0
- data/lib/nfg_ui/components/elements/badge.rb +32 -0
- data/lib/nfg_ui/components/elements/breadcrumb.rb +16 -0
- data/lib/nfg_ui/components/elements/breadcrumb_item.rb +16 -0
- data/lib/nfg_ui/components/elements/button.rb +97 -0
- data/lib/nfg_ui/components/elements/card_body.rb +15 -0
- data/lib/nfg_ui/components/elements/card_footer.rb +14 -0
- data/lib/nfg_ui/components/elements/card_header.rb +14 -0
- data/lib/nfg_ui/components/elements/card_image.rb +14 -0
- data/lib/nfg_ui/components/elements/card_image_overlay.rb +14 -0
- data/lib/nfg_ui/components/elements/carousel_caption.rb +14 -0
- data/lib/nfg_ui/components/elements/carousel_control.rb +14 -0
- data/lib/nfg_ui/components/elements/carousel_indicators.rb +23 -0
- data/lib/nfg_ui/components/elements/carousel_item.rb +16 -0
- data/lib/nfg_ui/components/elements/chart.rb +11 -0
- data/lib/nfg_ui/components/elements/dropdown_divider.rb +14 -0
- data/lib/nfg_ui/components/elements/dropdown_header.rb +14 -0
- data/lib/nfg_ui/components/elements/dropdown_item.rb +78 -0
- data/lib/nfg_ui/components/elements/dropdown_toggle.rb +37 -0
- data/lib/nfg_ui/components/elements/embed.rb +15 -0
- data/lib/nfg_ui/components/elements/form_control.rb +18 -0
- data/lib/nfg_ui/components/elements/input_group.rb +14 -0
- data/lib/nfg_ui/components/elements/key.rb +11 -0
- data/lib/nfg_ui/components/elements/list_group_item.rb +14 -0
- data/lib/nfg_ui/components/elements/loader.rb +11 -0
- data/lib/nfg_ui/components/elements/media_body.rb +14 -0
- data/lib/nfg_ui/components/elements/media_object.rb +12 -0
- data/lib/nfg_ui/components/elements/modal_body.rb +14 -0
- data/lib/nfg_ui/components/elements/modal_footer.rb +14 -0
- data/lib/nfg_ui/components/elements/modal_header.rb +14 -0
- data/lib/nfg_ui/components/elements/nav.rb +19 -0
- data/lib/nfg_ui/components/elements/nav_item.rb +39 -0
- data/lib/nfg_ui/components/elements/nav_link.rb +33 -0
- data/lib/nfg_ui/components/elements/navbar_brand.rb +15 -0
- data/lib/nfg_ui/components/elements/navbar_text.rb +14 -0
- data/lib/nfg_ui/components/elements/navbar_toggler.rb +14 -0
- data/lib/nfg_ui/components/elements/page_item.rb +14 -0
- data/lib/nfg_ui/components/elements/popover.rb +14 -0
- data/lib/nfg_ui/components/elements/progress_bar.rb +62 -0
- data/lib/nfg_ui/components/elements/slat_action.rb +14 -0
- data/lib/nfg_ui/components/elements/slat_body.rb +14 -0
- data/lib/nfg_ui/components/elements/slat_item.rb +62 -0
- data/lib/nfg_ui/components/elements/stat.rb +11 -0
- data/lib/nfg_ui/components/elements/step.rb +55 -0
- data/lib/nfg_ui/components/elements/step_indicator.rb +41 -0
- data/lib/nfg_ui/components/elements/tab_pane.rb +15 -0
- data/lib/nfg_ui/components/elements/table.rb +14 -0
- data/lib/nfg_ui/components/elements/task.rb +11 -0
- data/lib/nfg_ui/components/elements.rb +58 -0
- data/lib/nfg_ui/components/foundations/color.rb +11 -0
- data/lib/nfg_ui/components/foundations/grid.rb +11 -0
- data/lib/nfg_ui/components/foundations/icon.rb +82 -0
- data/lib/nfg_ui/components/foundations/image.rb +14 -0
- data/lib/nfg_ui/components/foundations/input.rb +11 -0
- data/lib/nfg_ui/components/foundations/typeface.rb +122 -0
- data/lib/nfg_ui/components/patterns/activity_feed.rb +11 -0
- data/lib/nfg_ui/components/patterns/button_group.rb +23 -0
- data/lib/nfg_ui/components/patterns/button_toolbar.rb +20 -0
- data/lib/nfg_ui/components/patterns/card.rb +39 -0
- data/lib/nfg_ui/components/patterns/carousel.rb +31 -0
- data/lib/nfg_ui/components/patterns/collapse.rb +31 -0
- data/lib/nfg_ui/components/patterns/dropdown.rb +27 -0
- data/lib/nfg_ui/components/patterns/dropdown_menu.rb +16 -0
- data/lib/nfg_ui/components/patterns/empty_state.rb +11 -0
- data/lib/nfg_ui/components/patterns/filter_bar.rb +11 -0
- data/lib/nfg_ui/components/patterns/form_group.rb +11 -0
- data/lib/nfg_ui/components/patterns/graph.rb +11 -0
- data/lib/nfg_ui/components/patterns/jumbotron.rb +14 -0
- data/lib/nfg_ui/components/patterns/list_group.rb +16 -0
- data/lib/nfg_ui/components/patterns/media.rb +14 -0
- data/lib/nfg_ui/components/patterns/modal.rb +15 -0
- data/lib/nfg_ui/components/patterns/navbar.rb +17 -0
- data/lib/nfg_ui/components/patterns/navbar_nav.rb +17 -0
- data/lib/nfg_ui/components/patterns/page_header.rb +85 -0
- data/lib/nfg_ui/components/patterns/pagination.rb +14 -0
- data/lib/nfg_ui/components/patterns/progress.rb +24 -0
- data/lib/nfg_ui/components/patterns/slat.rb +14 -0
- data/lib/nfg_ui/components/patterns/slat_actions.rb +115 -0
- data/lib/nfg_ui/components/patterns/slat_header.rb +23 -0
- data/lib/nfg_ui/components/patterns/slat_list.rb +18 -0
- data/lib/nfg_ui/components/patterns/slats.rb +14 -0
- data/lib/nfg_ui/components/patterns/steps.rb +27 -0
- data/lib/nfg_ui/components/patterns/tab_content.rb +14 -0
- data/lib/nfg_ui/components/patterns/task_list.rb +11 -0
- data/lib/nfg_ui/components/patterns/tile.rb +58 -0
- data/lib/nfg_ui/components/patterns/tile_body.rb +29 -0
- data/lib/nfg_ui/components/patterns/tile_header.rb +40 -0
- data/lib/nfg_ui/components/patterns/tile_section.rb +29 -0
- data/lib/nfg_ui/components/traits/active.rb +14 -0
- data/lib/nfg_ui/components/traits/alert.rb +36 -0
- data/lib/nfg_ui/components/traits/alignment.rb +26 -0
- data/lib/nfg_ui/components/traits/button.rb +47 -0
- data/lib/nfg_ui/components/traits/button_group.rb +22 -0
- data/lib/nfg_ui/components/traits/card.rb +14 -0
- data/lib/nfg_ui/components/traits/collapse.rb +29 -0
- data/lib/nfg_ui/components/traits/disable.rb +19 -0
- data/lib/nfg_ui/components/traits/disable_with.rb +14 -0
- data/lib/nfg_ui/components/traits/dismiss.rb +16 -0
- data/lib/nfg_ui/components/traits/dropdown_toggle.rb +14 -0
- data/lib/nfg_ui/components/traits/icon.rb +16 -0
- data/lib/nfg_ui/components/traits/list_group.rb +16 -0
- data/lib/nfg_ui/components/traits/muted.rb +16 -0
- data/lib/nfg_ui/components/traits/nav.rb +26 -0
- data/lib/nfg_ui/components/traits/nav_item.rb +16 -0
- data/lib/nfg_ui/components/traits/navbar.rb +18 -0
- data/lib/nfg_ui/components/traits/page_header.rb +16 -0
- data/lib/nfg_ui/components/traits/pill.rb +14 -0
- data/lib/nfg_ui/components/traits/progress_bar.rb +24 -0
- data/lib/nfg_ui/components/traits/remote.rb +14 -0
- data/lib/nfg_ui/components/traits/size.rb +18 -0
- data/lib/nfg_ui/components/traits/slat_item.rb +28 -0
- data/lib/nfg_ui/components/traits/step.rb +14 -0
- data/lib/nfg_ui/components/traits/theme.rb +57 -0
- data/lib/nfg_ui/components/traits/typeface.rb +53 -0
- data/lib/nfg_ui/components/traits/vertical.rb +16 -0
- data/lib/nfg_ui/components/traits.rb +43 -0
- data/lib/nfg_ui/components/utilities/browser_detectable.rb +16 -0
- data/lib/nfg_ui/components/utilities/confirmable.rb +24 -0
- data/lib/nfg_ui/components/utilities/describable.rb +22 -0
- data/lib/nfg_ui/components/utilities/disable_withable.rb +26 -0
- data/lib/nfg_ui/components/utilities/emailable.rb +44 -0
- data/lib/nfg_ui/components/utilities/iconable.rb +20 -0
- data/lib/nfg_ui/components/utilities/left_iconable.rb +22 -0
- data/lib/nfg_ui/components/utilities/methodable.rb +24 -0
- data/lib/nfg_ui/components/utilities/renderable.rb +24 -0
- data/lib/nfg_ui/components/utilities/resource_themeable.rb +49 -0
- data/lib/nfg_ui/components/utilities/titleable.rb +20 -0
- data/lib/nfg_ui/components/utilities/traitable.rb +32 -0
- data/lib/nfg_ui/components/utilities/vertically_alignable.rb +31 -0
- data/lib/nfg_ui/components/utilities.rb +22 -0
- data/lib/nfg_ui/engine.rb +45 -0
- data/lib/nfg_ui/ui/base.rb +35 -0
- data/lib/nfg_ui/ui/bootstrap.rb +44 -0
- data/lib/nfg_ui/ui/network_for_good.rb +54 -0
- data/lib/nfg_ui/ui/utilities/initializer.rb +88 -0
- data/lib/nfg_ui/ui/utilities.rb +10 -0
- data/lib/nfg_ui/version.rb +5 -0
- data/lib/nfg_ui.rb +174 -0
- data/lib/tasks/nfg_ui_tasks.rake +53 -0
- metadata +741 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Components
|
|
6
|
+
# Bootstrap Pagination - Page Item Component
|
|
7
|
+
# https://getbootstrap.com/docs/4.1/components/pagination/
|
|
8
|
+
class PageItem < NfgUi::Bootstrap::Components::Base
|
|
9
|
+
# include Bootstrap::Utilities::Disableable
|
|
10
|
+
include Bootstrap::Utilities::Activatable
|
|
11
|
+
|
|
12
|
+
def component_family
|
|
13
|
+
:pagination
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def disabled
|
|
17
|
+
options.fetch(:disabled, false)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def href
|
|
21
|
+
options[:href] || '#' # return # when nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Send href through to the "page link" that's embedded within
|
|
25
|
+
# the page item component
|
|
26
|
+
def html_options
|
|
27
|
+
super.except!(:href)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def page_link_html_options
|
|
31
|
+
{ class: 'page-link',
|
|
32
|
+
**(disabled ? { tabindex: '-1' } : {}),
|
|
33
|
+
href: href }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def render
|
|
37
|
+
super do
|
|
38
|
+
content_tag(:a, page_link_html_options) do
|
|
39
|
+
capture do
|
|
40
|
+
concat(block_given? ? yield : body)
|
|
41
|
+
concat(content_tag(:span, '(current)', class: 'sr-only')) if active
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def base_element
|
|
50
|
+
:li
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def css_classes
|
|
54
|
+
[
|
|
55
|
+
super,
|
|
56
|
+
('disabled' if disabled)
|
|
57
|
+
].join(' ').squish
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def non_html_attribute_options
|
|
61
|
+
super.push(:disabled)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Components
|
|
6
|
+
# Bootstrap Pagination Component
|
|
7
|
+
# https://getbootstrap.com/docs/4.1/components/pagination/
|
|
8
|
+
class Pagination < NfgUi::Bootstrap::Components::Base
|
|
9
|
+
include Bootstrap::Utilities::Alignable
|
|
10
|
+
include Bootstrap::Utilities::Sizable
|
|
11
|
+
|
|
12
|
+
def component_family
|
|
13
|
+
:pagination
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def render
|
|
17
|
+
content_tag(:nav) do
|
|
18
|
+
super
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def base_element
|
|
25
|
+
:ul
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Components
|
|
6
|
+
# Bootstrap Parent Progress Component
|
|
7
|
+
# https://getbootstrap.com/docs/4.1/components/progress/
|
|
8
|
+
class Progress < NfgUi::Bootstrap::Components::Base
|
|
9
|
+
include Bootstrap::Utilities::Progressable
|
|
10
|
+
|
|
11
|
+
def component_family
|
|
12
|
+
:progress
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def height
|
|
16
|
+
options.fetch(:height, nil)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def style
|
|
20
|
+
[
|
|
21
|
+
super,
|
|
22
|
+
("height: #{height}px;" if height)
|
|
23
|
+
].join(' ').squish
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def render
|
|
27
|
+
super do
|
|
28
|
+
if body
|
|
29
|
+
(block_given? ? yield : body)
|
|
30
|
+
else
|
|
31
|
+
NfgUi::Bootstrap::Components::ProgressBar.new({ theme: theme, label: label, progress: progress, striped: striped, animated: animated }, view_context).render
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def non_html_attribute_options
|
|
39
|
+
super.push(:height)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Components
|
|
6
|
+
# Bootstrap Progress Bar Component
|
|
7
|
+
# https://getbootstrap.com/docs/4.1/components/progress/
|
|
8
|
+
class ProgressBar < NfgUi::Bootstrap::Components::Progress
|
|
9
|
+
include Bootstrap::Utilities::Progressable
|
|
10
|
+
include Bootstrap::Utilities::Themeable
|
|
11
|
+
|
|
12
|
+
def component_family
|
|
13
|
+
:progress
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def style
|
|
17
|
+
[
|
|
18
|
+
options[:style],
|
|
19
|
+
("width: #{progress.to_i}%;" if progress)
|
|
20
|
+
].join(' ').squish
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def render
|
|
24
|
+
content_tag(:div, label, html_options)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def css_classes
|
|
30
|
+
[
|
|
31
|
+
super,
|
|
32
|
+
("#{component_css_class}-striped" if striped),
|
|
33
|
+
("#{component_css_class}-animated" if animated)
|
|
34
|
+
].join(' ').squish
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def assistive_html_attributes
|
|
38
|
+
super.merge!(role: 'progressbar', aria: { valuenow: progress, valuemin: 0, valuemax: 100 })
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def theme_css_class_prefix
|
|
42
|
+
'bg-'
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def outlineable?
|
|
46
|
+
false
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Components
|
|
6
|
+
# Bootstrap Progress Component
|
|
7
|
+
# https://getbootstrap.com/docs/4.1/components/progress/
|
|
8
|
+
class TabContent < NfgUi::Bootstrap::Components::Base
|
|
9
|
+
def component_family
|
|
10
|
+
:tab
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Components
|
|
6
|
+
# Bootstrap Progress Component
|
|
7
|
+
# https://getbootstrap.com/docs/4.1/components/progress/
|
|
8
|
+
class TabPane < NfgUi::Bootstrap::Components::Base
|
|
9
|
+
include Bootstrap::Utilities::Activatable
|
|
10
|
+
|
|
11
|
+
def component_family
|
|
12
|
+
:tab
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def tab
|
|
16
|
+
options.fetch(:tab, nil)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def id
|
|
20
|
+
tab ? tab.tr('#', '') : super
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Fade is turned on by default
|
|
24
|
+
# This should probably be a global setting
|
|
25
|
+
def fade
|
|
26
|
+
options.fetch(:fade, true)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def css_classes
|
|
32
|
+
[
|
|
33
|
+
super,
|
|
34
|
+
('fade' if fade),
|
|
35
|
+
('show' if active)
|
|
36
|
+
].join(' ').squish
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def non_html_attribute_options
|
|
40
|
+
super.push(:tab)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def assistive_html_attributes
|
|
44
|
+
{ role: 'tabpanel' }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Components
|
|
6
|
+
# Bootstrap Table Component
|
|
7
|
+
# https://getbootstrap.com/docs/4.1/content/tables/
|
|
8
|
+
class Table < NfgUi::Bootstrap::Components::Base
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def base_element
|
|
12
|
+
:table
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Bootstrap4 code will be isolated into its own gem later.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Utilities
|
|
6
|
+
# Passes in necessary attributes to allow a component to have an active state
|
|
7
|
+
module Activatable
|
|
8
|
+
|
|
9
|
+
def active
|
|
10
|
+
options.fetch(:active, default_active)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def css_classes
|
|
16
|
+
[
|
|
17
|
+
super,
|
|
18
|
+
('active' if active)
|
|
19
|
+
].join(' ').squish
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def non_html_attribute_options
|
|
23
|
+
super.push(:active)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def default_active
|
|
27
|
+
false
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Utilities
|
|
6
|
+
# Allow components to be right and center aligned
|
|
7
|
+
module Alignable
|
|
8
|
+
def center
|
|
9
|
+
options.fetch(:center, false)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def right
|
|
13
|
+
options.fetch(:right, false)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def css_classes
|
|
19
|
+
[
|
|
20
|
+
super,
|
|
21
|
+
('justify-content-center' if center),
|
|
22
|
+
('justify-content-end' if right)
|
|
23
|
+
].join(' ').squish
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def non_html_attribute_options
|
|
27
|
+
super.push(:right,
|
|
28
|
+
:center)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Utilities
|
|
6
|
+
# Allows components to have a collapsed state when appropriate
|
|
7
|
+
module CollapseToggleable
|
|
8
|
+
include Bootstrap::Utilities::Collapsible
|
|
9
|
+
|
|
10
|
+
def data
|
|
11
|
+
collapse ? super.merge!(collapse_data_attributes) : super
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
# Buttons need to be able to to set a target on :buttons
|
|
17
|
+
# and an href on links -- so this attribute is customizable if needed
|
|
18
|
+
def collapse_data_attributes
|
|
19
|
+
@collapse_data_attributes ||= { toggle: 'collapse', target: collapse }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# To do: currently collapsible doesn't control the actual collapse
|
|
23
|
+
# As such, there's no way to set aria-expanded on the button / toggle...
|
|
24
|
+
# based on whether or not the collapse component is expanded or not
|
|
25
|
+
#
|
|
26
|
+
# To solve: how to address aria-expanded to accurately reflect the expanded status
|
|
27
|
+
def assistive_html_attributes
|
|
28
|
+
return super unless collapse
|
|
29
|
+
super.merge!(aria: (options[:aria] || {}).merge!(expanded: 'false', controls: collapse.tr('#','')),
|
|
30
|
+
role: 'button')
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Utilities
|
|
6
|
+
# Allows components to carry collapse attributes
|
|
7
|
+
# to more easily pass collapse status to a collapsible target
|
|
8
|
+
#
|
|
9
|
+
# Example:
|
|
10
|
+
# Tile & TileHeader both include Collapsible
|
|
11
|
+
# because they both pass collapse attributes to
|
|
12
|
+
# a collapse button within TileHeader
|
|
13
|
+
#
|
|
14
|
+
# They do not, however need a collapse toggle
|
|
15
|
+
# unlike a NavbarToggle / Button, and thus they do not include
|
|
16
|
+
# The CollapseToggleable module
|
|
17
|
+
#
|
|
18
|
+
# CollapseToggleable components have this module included
|
|
19
|
+
# by default via the CollapseToggleable module.
|
|
20
|
+
module Collapsible
|
|
21
|
+
def collapse
|
|
22
|
+
options.fetch(:collapse, nil)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def collapsed
|
|
26
|
+
options.fetch(:collapsed, nil)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Collapsible checks if collapse is manually set true or false and thus, collapsible
|
|
30
|
+
def collapsible
|
|
31
|
+
options[:collapsible] || collapse || !collapsed.nil?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def non_html_attribute_options
|
|
37
|
+
super.push(:collapse, :collapsed, :collapsible)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Utilities
|
|
6
|
+
# Allows components to have a disabled state when appropriate
|
|
7
|
+
module Disableable
|
|
8
|
+
attr_reader :as
|
|
9
|
+
|
|
10
|
+
def disabled
|
|
11
|
+
options.fetch(:disabled, false)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def css_classes
|
|
17
|
+
# when the tag does not take a disabled attribute we
|
|
18
|
+
# assigne the disabled class
|
|
19
|
+
[
|
|
20
|
+
super,
|
|
21
|
+
('disabled' if disabled && !tag_allows_for_disable_attribute?)
|
|
22
|
+
].join(' ').squish
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def non_html_attribute_options
|
|
26
|
+
# if tag accepts the disabled attribute
|
|
27
|
+
# push it through, otherwise remove it from the
|
|
28
|
+
# html options. We do this regardless of whether or not
|
|
29
|
+
# disabled was actually set to ensure that those
|
|
30
|
+
# tags that can't take a disabled option never receive it
|
|
31
|
+
tag_allows_for_disable_attribute? ? super : super.push(:disabled)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def assistive_html_attributes
|
|
35
|
+
if disabled
|
|
36
|
+
super.merge!(tabindex: '-1',
|
|
37
|
+
**(tag_allows_for_disable_attribute?) ? { disabled: true } : {})
|
|
38
|
+
else
|
|
39
|
+
super
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def tag_allows_for_disable_attribute?
|
|
44
|
+
[:button, :input, :fieldset, :optgroup, :option, :select, :textarea].include?(as)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Utilities
|
|
6
|
+
# Delivers the dismissibility of the component to the HAML partial
|
|
7
|
+
module Dismissible
|
|
8
|
+
def dismissible
|
|
9
|
+
options.fetch(:dismissible, default_dismissible)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def non_html_attribute_options
|
|
15
|
+
super.push(:dismissible)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def default_dismissible
|
|
19
|
+
true
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Utilities
|
|
6
|
+
# Allows components to supply the dropDIRECTION for menus
|
|
7
|
+
# This is applicable to more than just the Dropdown component
|
|
8
|
+
module DropdownDirectionable
|
|
9
|
+
def dropleft
|
|
10
|
+
options.fetch(:dropleft, false)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def dropright
|
|
14
|
+
options.fetch(:dropright, false)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def dropup
|
|
18
|
+
options.fetch(:dropup, false)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def css_classes
|
|
24
|
+
[
|
|
25
|
+
super,
|
|
26
|
+
('dropleft' if dropleft),
|
|
27
|
+
('dropright' if dropright),
|
|
28
|
+
('dropup' if dropup)
|
|
29
|
+
].join(' ').squish
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def non_html_attribute_options
|
|
33
|
+
super.push(:dropleft,
|
|
34
|
+
:dropright,
|
|
35
|
+
:dropup)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Utilities
|
|
6
|
+
# Delivers the dismissibility of the component to the HAML partial
|
|
7
|
+
module Headable
|
|
8
|
+
def heading
|
|
9
|
+
options.fetch(:heading, nil)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def non_html_attribute_options
|
|
15
|
+
super.push(:heading)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module NfgUi
|
|
4
|
+
module Bootstrap
|
|
5
|
+
module Utilities
|
|
6
|
+
# Allows a component to utilize the :modal option
|
|
7
|
+
# Which then formats the component's HTML data attributes
|
|
8
|
+
# to connect to the desired modal. Note the :modal option requires the '#'
|
|
9
|
+
# preceding the CSS ID per bootstrap docs
|
|
10
|
+
#
|
|
11
|
+
# Correct: { modal: '#the_modal_id' } <-- note the '#'
|
|
12
|
+
# Incorrect: { modal: 'the_modal_id' }
|
|
13
|
+
#
|
|
14
|
+
# USAGE:
|
|
15
|
+
# When to use the :modal option on a component:
|
|
16
|
+
# The :modal option should only be used when activating a modal
|
|
17
|
+
# that has been embedded on the HTML page and is not being injected
|
|
18
|
+
# from a remote ajax request via remote: true.
|
|
19
|
+
#
|
|
20
|
+
# INVALID USAGE:
|
|
21
|
+
# Do not set a modal option on a remote link in Rails
|
|
22
|
+
# Setting a component to remote: true in addition to suppling a modal
|
|
23
|
+
# will result in an ArgumentError. This is due to poor / buggy behavior resulting from
|
|
24
|
+
# remotely re-rendering a modal that is already on the page
|
|
25
|
+
#
|
|
26
|
+
# (basically: there's a high likelihood that the targeted modal will
|
|
27
|
+
# be shown / animated twice)
|
|
28
|
+
#
|
|
29
|
+
# Like when remote: true, components that contain tooltips
|
|
30
|
+
# Will also raise an ArgumentError due to the competing data-toggles
|
|
31
|
+
# and the subsequent silent failure of the tooltip.
|
|
32
|
+
#
|
|
33
|
+
# EXCEPTIONS:
|
|
34
|
+
# Exception for a modalable component with a tooltip:
|
|
35
|
+
# *Disabled* components may use a modal and a tooltip in its options
|
|
36
|
+
# (thanks to how disabled components are wrapped with an html element & the tooltip
|
|
37
|
+
# is applied to the wrapping element, not the component itself)
|
|
38
|
+
#
|
|
39
|
+
# Valid example:
|
|
40
|
+
# = ui.bootstrap :button, disabled: true, tooltip: 'The tooltip', modal: '#the_modal', ...
|
|
41
|
+
#
|
|
42
|
+
# Extra care is taken with the modal and competing options given its typical wide-ranging
|
|
43
|
+
# use in rails applications.
|
|
44
|
+
module Modalable
|
|
45
|
+
def data
|
|
46
|
+
# Raise an error when a component utilizes 'illegal' options (which are options that
|
|
47
|
+
# result in silent failures and/or directly compete with a
|
|
48
|
+
# modalable component's necessary HTML)
|
|
49
|
+
if component_includes_problematic_options_for_modal?
|
|
50
|
+
raise ArgumentError.new(I18n.t("nfg_ui.errors.argument_error.modalable.#{error_message_i18n_path}",
|
|
51
|
+
modal: modal,
|
|
52
|
+
class_name: self.class.name,
|
|
53
|
+
options: options,
|
|
54
|
+
file: __FILE__,
|
|
55
|
+
method: __method__))
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Overwrites data-toggle and data-target
|
|
59
|
+
# forcing the modal to take precedence.
|
|
60
|
+
# If a tooltip is present in the options, an ArgumentError is raised
|
|
61
|
+
modal ? super.merge!(toggle: 'modal', target: options[:modal]) : super
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def modal
|
|
65
|
+
options.fetch(:modal, nil)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
# Corresponds to i18n locale: config/locales/en.yml
|
|
71
|
+
# Remote is checked first, given its importance and impact on the application
|
|
72
|
+
# Then, check for tooltip.
|
|
73
|
+
def error_message_i18n_path
|
|
74
|
+
return 'remote' if options[:remote]
|
|
75
|
+
return 'tooltip' if options[:tooltip]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Force an error when:
|
|
79
|
+
# 1. The component includes remote: true (and the modal option is present)
|
|
80
|
+
# 2. The component includes a :tooltip in the options
|
|
81
|
+
#
|
|
82
|
+
# When a tooltip is present, the data-toggle would be overwritten with
|
|
83
|
+
# the modal data attributes (given the `data.merge!`) causing a silent failure
|
|
84
|
+
# of the tooltip (it doesn't get added to the component)
|
|
85
|
+
#
|
|
86
|
+
# Exception: when tooltip is not "illegal" (the component has a tooltip *and* is disabled)
|
|
87
|
+
def component_includes_problematic_options_for_modal?
|
|
88
|
+
modal.present? && (options.fetch(:remote, nil) || illegal_tooltip?)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# When a modalable component is disabled
|
|
92
|
+
# the tooltip is applied to a wrapping element
|
|
93
|
+
# and will not compete with the modal's data attributes.
|
|
94
|
+
def illegal_tooltip?
|
|
95
|
+
options[:tooltip].present? && !options[:disabled]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def non_html_attribute_options
|
|
99
|
+
super.push(:modal)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|