From c6c78ec572dbf7eccbac9d3836dce272cacf8fed Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Fri, 26 Jan 2024 22:22:24 +0000 Subject: [PATCH 01/11] Upgrade boostrap --- Gemfile.lock | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6e71ae32dc..1b651fc4a2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -111,7 +111,7 @@ GEM addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) ast (2.4.2) - autoprefixer-rails (10.4.7.0) + autoprefixer-rails (10.4.16.0) execjs (~> 2) axe-core-api (4.8.1) dumb_delegator @@ -145,15 +145,14 @@ GEM bonsai-elasticsearch-rails (7.0.1) elasticsearch-model (< 8) elasticsearch-rails (< 8) - bootstrap (4.6.2) + bootstrap (5.3.2) autoprefixer-rails (>= 9.1.0) - popper_js (>= 1.16.1, < 2) - sassc-rails (>= 2.0.0) + popper_js (>= 2.11.8, < 3) bootstrap-datepicker-rails (1.9.0.1) railties (>= 3.0) - bootstrap_form (4.5.0) - actionpack (>= 5.2) - activemodel (>= 5.2) + bootstrap_form (5.4.0) + actionpack (>= 6.1) + activemodel (>= 6.1) builder (3.2.4) bullet (7.1.6) activesupport (>= 3.0.0) @@ -243,7 +242,7 @@ GEM erubi (1.12.0) erubis (2.7.0) excon (0.109.0) - execjs (2.8.1) + execjs (2.9.1) factory_bot (6.4.5) activesupport (>= 5.0.0) factory_bot_rails (6.4.3) @@ -422,7 +421,7 @@ GEM heroics (~> 0.1.1) moneta (~> 1.0.0) rate_throttle_client (~> 0.1.0) - popper_js (1.16.1) + popper_js (2.11.8) pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) From bf0584457222aae93277154ad5101ef56dc4fd21 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Fri, 26 Jan 2024 22:54:02 +0000 Subject: [PATCH 02/11] Remove deprecated bootstrap toggles --- app/assets/javascripts/bootstrap-accessibility.min.js | 4 ---- app/assets/javascripts/bootstrap.js.coffee | 1 - app/assets/javascripts/nav.js | 1 - app/assets/javascripts/tooltips.js | 2 +- app/views/comments/_single.html.haml | 2 +- app/views/crops/_alternate_names.html.haml | 2 +- app/views/crops/_image_with_popover.html.haml | 9 +++++---- app/views/crops/_scientific_names.html.haml | 2 +- app/views/crops/_wrangle.html.haml | 2 +- app/views/devise/registrations/edit.html.haml | 10 +++++----- app/views/gardens/_actions.html.haml | 2 +- app/views/harvests/_actions.html.haml | 2 +- app/views/harvests/_image_with_popover.haml | 9 +++++---- app/views/harvests/_modal.html.haml | 2 +- app/views/layouts/_header.html.haml | 2 +- app/views/layouts/_menu.haml | 10 +++++----- app/views/photos/_actions.html.haml | 2 +- app/views/plantings/_actions.html.haml | 2 +- app/views/plantings/_badges.html.haml | 4 ++-- app/views/plantings/_card.html.haml | 2 +- app/views/plantings/_descendants.html.haml | 2 +- app/views/plantings/_image_with_popover.html.haml | 9 +++++---- app/views/plantings/_modal.html.haml | 2 +- app/views/plantings/_quick_actions.haml | 2 +- app/views/plantings/_timeline.html.haml | 2 +- app/views/posts/_actions.html.haml | 2 +- app/views/seeds/_actions.html.haml | 2 +- app/views/seeds/_modal.html.haml | 2 +- 28 files changed, 46 insertions(+), 49 deletions(-) delete mode 100644 app/assets/javascripts/bootstrap-accessibility.min.js delete mode 100644 app/assets/javascripts/nav.js diff --git a/app/assets/javascripts/bootstrap-accessibility.min.js b/app/assets/javascripts/bootstrap-accessibility.min.js deleted file mode 100644 index 41a37c453c..0000000000 --- a/app/assets/javascripts/bootstrap-accessibility.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! bootstrap-accessibility-plugin - v1.0.5 - 2016-07-19 -* https://github.com/paypal/bootstrap-accessibility-plugin -* Copyright (c) 2016 PayPal Accessibility Team; Licensed BSD */ -!function($){"use strict";var uniqueId=function(prefix){return(prefix||"ui-id")+"-"+Math.floor(1e3*Math.random()+1)},focusable=function(element,isTabIndexNotNaN){var map,mapName,img,nodeName=element.nodeName.toLowerCase();return"area"===nodeName?(map=element.parentNode,mapName=map.name,element.href&&mapName&&"map"===map.nodeName.toLowerCase()?(img=$("img[usemap='#"+mapName+"']")[0],!!img&&visible(img)):!1):(/input|select|textarea|button|object/.test(nodeName)?!element.disabled:"a"===nodeName?element.href||isTabIndexNotNaN:isTabIndexNotNaN)&&visible(element)},visible=function(element){return $.expr.filters.visible(element)&&!$(element).parents().addBack().filter(function(){return"hidden"===$.css(this,"visibility")}).length};$.extend($.expr[":"],{data:$.expr.createPseudo?$.expr.createPseudo(function(dataName){return function(elem){return!!$.data(elem,dataName)}}):function(elem,i,match){return!!$.data(elem,match[3])},focusable:function(element){return focusable(element,!isNaN($.attr(element,"tabindex")))},tabbable:function(element){var tabIndex=$.attr(element,"tabindex"),isTabIndexNaN=isNaN(tabIndex);return(isTabIndexNaN||tabIndex>=0)&&focusable(element,!isTabIndexNaN)}}),$(".modal-dialog").attr({role:"document"});var modalhide=$.fn.modal.Constructor.prototype.hide;$.fn.modal.Constructor.prototype.hide=function(){modalhide.apply(this,arguments),$(document).off("keydown.bs.modal")};var modalfocus=$.fn.modal.Constructor.prototype.enforceFocus;$.fn.modal.Constructor.prototype.enforceFocus=function(){var $content=this.$element.find(".modal-content"),focEls=$content.find(":tabbable"),$lastEl=$(focEls[focEls.length-1]),$firstEl=$(focEls[0]);$lastEl.on("keydown.bs.modal",$.proxy(function(ev){9!==ev.keyCode||ev.shiftKey|ev.ctrlKey|ev.metaKey|ev.altKey||(ev.preventDefault(),$firstEl.focus())},this)),$firstEl.on("keydown.bs.modal",$.proxy(function(ev){9===ev.keyCode&&ev.shiftKey&&(ev.preventDefault(),$lastEl.focus())},this)),modalfocus.apply(this,arguments)};var $par,firstItem,toggle="[data-toggle=dropdown]",focusDelay=200,menus=$(toggle).parent().find("ul").attr("role","menu"),lis=menus.find("li").attr("role","presentation");lis.find("a").attr({role:"menuitem",tabIndex:"-1"}),$(toggle).attr({"aria-haspopup":"true","aria-expanded":"false"}),$(toggle).parent().on("shown.bs.dropdown",function(e){$par=$(this);var $toggle=$par.find(toggle);$toggle.attr("aria-expanded","true"),$toggle.on("keydown.bs.dropdown",$.proxy(function(ev){setTimeout(function(){firstItem=$(".dropdown-menu [role=menuitem]:visible",$par)[0];try{firstItem.focus()}catch(ex){}},focusDelay)},this))}).on("hidden.bs.dropdown",function(e){$par=$(this);var $toggle=$par.find(toggle);$toggle.attr("aria-expanded","false")}),$(document).on("focusout.dropdown.data-api",".dropdown-menu",function(e){var $this=$(this),that=this;$this.parent().hasClass("open")&&setTimeout(function(){$.contains(that,document.activeElement)||$this.parent().find("[data-toggle=dropdown]").dropdown("toggle")},150)}).on("keydown.bs.dropdown.data-api",toggle+", [role=menu]",$.fn.dropdown.Constructor.prototype.keydown);var $tablist=$(".nav-tabs, .nav-pills"),$lis=$tablist.children("li"),$tabs=$tablist.find('[data-toggle="tab"], [data-toggle="pill"]');$tabs&&($tablist.attr("role","tablist"),$lis.attr("role","presentation"),$tabs.attr("role","tab")),$tabs.each(function(index){var tabpanel=$($(this).attr("href")),tab=$(this),tabid=tab.attr("id")||uniqueId("ui-tab");tab.attr("id",tabid),tab.parent().hasClass("active")?(tab.attr({tabIndex:"0","aria-selected":"true","aria-controls":tab.attr("href").substr(1)}),tabpanel.attr({role:"tabpanel",tabIndex:"0","aria-hidden":"false","aria-labelledby":tabid})):(tab.attr({tabIndex:"-1","aria-selected":"false","aria-controls":tab.attr("href").substr(1)}),tabpanel.attr({role:"tabpanel",tabIndex:"-1","aria-hidden":"true","aria-labelledby":tabid}))}),$.fn.tab.Constructor.prototype.keydown=function(e){var $items,index,$this=$(this),$ul=$this.closest("ul[role=tablist] "),k=e.which||e.keyCode;if($this=$(this),/(37|38|39|40)/.test(k)){$items=$ul.find("[role=tab]:visible"),index=$items.index($items.filter(":focus")),(38==k||37==k)&&index--,(39==k||40==k)&&index++,0>index&&(index=$items.length-1),index==$items.length&&(index=0);var nextTab=$items.eq(index);"tab"===nextTab.attr("role")&&nextTab.tab("show").focus(),e.preventDefault(),e.stopPropagation()}},$(document).on("keydown.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',$.fn.tab.Constructor.prototype.keydown);var tabactivate=$.fn.tab.Constructor.prototype.activate;$.fn.tab.Constructor.prototype.activate=function(element,container,callback){var $active=container.find("> .active");$active.find("[data-toggle=tab], [data-toggle=pill]").attr({tabIndex:"-1","aria-selected":!1}),$active.filter(".tab-pane").attr({"aria-hidden":!0,tabIndex:"-1"}),tabactivate.apply(this,arguments),element.addClass("active"),element.find("[data-toggle=tab], [data-toggle=pill]").attr({tabIndex:"0","aria-selected":!0}),element.filter(".tab-pane").attr({"aria-hidden":!1,tabIndex:"0"})};var $colltabs=$('[data-toggle="collapse"]');$colltabs.each(function(index){var colltab=$(this),collpanel=$(colltab.attr("data-target")?colltab.attr("data-target"):colltab.attr("href")),parent=colltab.attr("data-parent"),collparent=parent&&$(parent),collid=colltab.attr("id")||uniqueId("ui-collapse");colltab.attr("id",collid),collparent&&(colltab.attr({role:"tab","aria-selected":"false","aria-expanded":"false"}),$(collparent).find("div:not(.collapse,.panel-body), h4").attr("role","presentation"),collparent.attr({role:"tablist","aria-multiselectable":"true"}),collpanel.hasClass("in")?(colltab.attr({"aria-controls":collpanel.attr("id"),"aria-selected":"true","aria-expanded":"true",tabindex:"0"}),collpanel.attr({role:"tabpanel",tabindex:"0","aria-labelledby":collid,"aria-hidden":"false"})):(colltab.attr({"aria-controls":collpanel.attr("id"),tabindex:"-1"}),collpanel.attr({role:"tabpanel",tabindex:"-1","aria-labelledby":collid,"aria-hidden":"true"})))});var collToggle=$.fn.collapse.Constructor.prototype.toggle;$.fn.collapse.Constructor.prototype.toggle=function(){var href,prevTab=this.$parent&&this.$parent.find('[aria-expanded="true"]');if(prevTab){var curTab,prevPanel=prevTab.attr("data-target")||(href=prevTab.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""),$prevPanel=$(prevPanel),$curPanel=this.$element;this.$parent;this.$parent&&(curTab=this.$parent.find('[data-toggle=collapse][href="#'+this.$element.attr("id")+'"]')),collToggle.apply(this,arguments),$.support.transition&&this.$element.one($.support.transition.end,function(){prevTab.attr({"aria-selected":"false","aria-expanded":"false",tabIndex:"-1"}),$prevPanel.attr({"aria-hidden":"true",tabIndex:"-1"}),curTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:"0"}),$curPanel.hasClass("in")?$curPanel.attr({"aria-hidden":"false",tabIndex:"0"}):(curTab.attr({"aria-selected":"false","aria-expanded":"false"}),$curPanel.attr({"aria-hidden":"true",tabIndex:"-1"}))})}else collToggle.apply(this,arguments)},$.fn.collapse.Constructor.prototype.keydown=function(e){var $items,index,$this=$(this),$tablist=$this.closest("div[role=tablist] "),k=e.which||e.keyCode;$this=$(this),/(32|37|38|39|40)/.test(k)&&(32==k&&$this.click(),$items=$tablist.find("[role=tab]"),index=$items.index($items.filter(":focus")),(38==k||37==k)&&index--,(39==k||40==k)&&index++,0>index&&(index=$items.length-1),index==$items.length&&(index=0),$items.eq(index).focus(),e.preventDefault(),e.stopPropagation())},$(document).on("keydown.collapse.data-api",'[data-toggle="collapse"]',$.fn.collapse.Constructor.prototype.keydown),$(".carousel").each(function(index){function setTablistHighlightBox(){var $tab,offset,height,width,highlightBox={};highlightBox.top=0,highlightBox.left=32e3,highlightBox.height=0,highlightBox.width=0;for(var i=0;i<$tabs.length;i++){$tab=$tabs[i],offset=$($tab).offset(),height=$($tab).height(),width=$($tab).width(),highlightBox.topoffset.left&&(highlightBox.left=Math.round(offset.left));var w=offset.left-highlightBox.left+Math.round(width);highlightBox.widthA carousel is a rotating set of images, rotation stops on keyboard focus on carousel tab controls or hovering the mouse pointer over images. Use the tabs or the previous and next buttons to change the displayed slide.

'),$this.prepend('

Carousel content with '+$tabpanels.length+" slides.

")),i=0;i<$tabs.length;i++){$tab=$tabs[i],$tab.setAttribute("role","tab"),$tab.setAttribute("id","tab-"+index+"-"+i),$tab.setAttribute("aria-controls","tabpanel-"+index+"-"+i);var tpId="#tabpanel-"+index+"-"+i,caption=$this.find(tpId).find("h1").text();("string"!=typeof caption||0===caption.length)&&(caption=$this.find(tpId).text()),("string"!=typeof caption||0===caption.length)&&(caption=$this.find(tpId).find("h3").text()),("string"!=typeof caption||0===caption.length)&&(caption=$this.find(tpId).find("h4").text()),("string"!=typeof caption||0===caption.length)&&(caption=$this.find(tpId).find("h5").text()),("string"!=typeof caption||0===caption.length)&&(caption=$this.find(tpId).find("h6").text()),("string"!=typeof caption||0===caption.length)&&(caption="no title");var tabName=document.createElement("span");tabName.setAttribute("class","sr-only"),tabName.innerHTML="Slide "+(i+1),caption&&(tabName.innerHTML+=": "+caption),$tab.appendChild(tabName)}$tablistHighlight=document.createElement("div"),$tablistHighlight.className="carousel-tablist-highlight",document.body.appendChild($tablistHighlight),$complementaryLandmark=document.createElement("aside"),$complementaryLandmark.setAttribute("class","carousel-aside-pause"),$complementaryLandmark.setAttribute("aria-label","carousel pause/play control"),$this.prepend($complementaryLandmark),$pauseCarousel=document.createElement("button"),$pauseCarousel.className="carousel-pause-button",$pauseCarousel.innerHTML="Pause Carousel",$pauseCarousel.setAttribute("title","Pause/Play carousel button can be used by screen reader users to stop carousel animations"),$($complementaryLandmark).append($pauseCarousel),$($pauseCarousel).click(function(){$is_paused?($pauseCarousel.innerHTML="Pause Carousel",$this.carousel("cycle"),$is_paused=!1):($pauseCarousel.innerHTML="Play Carousel",$this.carousel("pause"),$is_paused=!0)}),$($pauseCarousel).focus(function(){$(this).addClass("focus")}),$($pauseCarousel).blur(function(){$(this).removeClass("focus")}),setTablistHighlightBox(),$(window).resize(function(){setTablistHighlightBox()}),$prev.attr("aria-label","Previous Slide"),$prev.keydown(function(e){var k=e.which||e.keyCode;/(13|32)/.test(k)&&(e.preventDefault(),e.stopPropagation(),$prev.trigger("click"))}),$prev.focus(function(){$(this).parents(".carousel").addClass("contrast")}),$prev.blur(function(){$(this).parents(".carousel").removeClass("contrast")}),$next.attr("aria-label","Next Slide"),$next.keydown(function(e){var k=e.which||e.keyCode;/(13|32)/.test(k)&&(e.preventDefault(),e.stopPropagation(),$next.trigger("click"))}),$next.focus(function(){$(this).parents(".carousel").addClass("contrast")}),$next.blur(function(){$(this).parents(".carousel").removeClass("contrast")}),$(".carousel-inner a").focus(function(){$(this).parents(".carousel").addClass("contrast")}),$(".carousel-inner a").blur(function(){$(this).parents(".carousel").removeClass("contrast")}),$tabs.each(function(){var item=$(this);item.hasClass("active")?item.attr({"aria-selected":"true",tabindex:"0"}):item.attr({"aria-selected":"false",tabindex:"-1"})})});var slideCarousel=$.fn.carousel.Constructor.prototype.slide;$.fn.carousel.Constructor.prototype.slide=function(type,next){var $id,$element=this.$element,$active=$element.find("[role=tabpanel].active"),$next=next||$active[type](),$tab_count=$element.find("[role=tabpanel]").size(),$prev_side=$element.find('[data-slide="prev"]'),$next_side=$element.find('[data-slide="next"]'),$index=0,$prev_index=$tab_count-1,$next_index=1;$next&&$next.attr("id")&&($id=$next.attr("id"),$index=$id.lastIndexOf("-"),$index>=0&&($index=parseInt($id.substring($index+1),10)),$prev_index=$index-1,1>$prev_index&&($prev_index=$tab_count-1),$next_index=$index+1,$next_index>=$tab_count&&($next_index=0)),$prev_side.attr("aria-label","Show slide "+($prev_index+1)+" of "+$tab_count),$next_side.attr("aria-label","Show slide "+($next_index+1)+" of "+$tab_count),slideCarousel.apply(this,arguments),$active.one("bsTransitionEnd",function(){var $tab;$tab=$element.find('li[aria-controls="'+$active.attr("id")+'"]'),$tab&&$tab.attr({"aria-selected":!1,tabIndex:"-1"}),$tab=$element.find('li[aria-controls="'+$next.attr("id")+'"]'),$tab&&$tab.attr({"aria-selected":!0,tabIndex:"0"})})};var $this;$.fn.carousel.Constructor.prototype.keydown=function(e){function selectTab(index){index>=$tabs.length||0>index||($carousel.carousel(index),setTimeout(function(){$tabs[index].focus()},150))}$this=$this||$(this),this instanceof Node&&($this=$(this));var index,$carousel=$(e.target).closest(".carousel"),$tabs=$carousel.find("[role=tab]"),k=e.which||e.keyCode;/(37|38|39|40)/.test(k)&&(index=$tabs.index($tabs.filter(".active")),(37==k||38==k)&&(index--,selectTab(index)),(39==k||40==k)&&(index++,selectTab(index)),e.preventDefault(),e.stopPropagation())},$(document).on("keydown.carousel.data-api","li[role=tab]",$.fn.carousel.Constructor.prototype.keydown)}(jQuery); \ No newline at end of file diff --git a/app/assets/javascripts/bootstrap.js.coffee b/app/assets/javascripts/bootstrap.js.coffee index c9404a8e2f..d7093d7e1d 100644 --- a/app/assets/javascripts/bootstrap.js.coffee +++ b/app/assets/javascripts/bootstrap.js.coffee @@ -1,4 +1,3 @@ jQuery -> - $("a[rel=popover]").popover() $(".tooltip").tooltip() $("a[rel=tooltip]").tooltip() \ No newline at end of file diff --git a/app/assets/javascripts/nav.js b/app/assets/javascripts/nav.js deleted file mode 100644 index eb3d7297a7..0000000000 --- a/app/assets/javascripts/nav.js +++ /dev/null @@ -1 +0,0 @@ -$('.dropdown-toggle').dropdown(); diff --git a/app/assets/javascripts/tooltips.js b/app/assets/javascripts/tooltips.js index fe6e698300..7f496a43c2 100644 --- a/app/assets/javascripts/tooltips.js +++ b/app/assets/javascripts/tooltips.js @@ -1,3 +1,3 @@ $(function() { - $('[data-toggle="tooltip"]').tooltip(); + $('[data-bs-toggle="tooltip"]').tooltip(); }); diff --git a/app/views/comments/_single.html.haml b/app/views/comments/_single.html.haml index 30db5ad15d..4927963626 100644 --- a/app/views/comments/_single.html.haml +++ b/app/views/comments/_single.html.haml @@ -6,7 +6,7 @@ - if can?(:edit, comment) || can?(:destroy, comment) %hr/ .dropdown - %button#comment-edit-button.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button"} Actions + %button#comment-edit-button.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", type: "button"} Actions .dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "comment-edit-button"} - if can? :edit, comment = link_to edit_comment_path(comment), class: 'dropdown-item' do diff --git a/app/views/crops/_alternate_names.html.haml b/app/views/crops/_alternate_names.html.haml index 04c4314fc8..310e2dd0ca 100644 --- a/app/views/crops/_alternate_names.html.haml +++ b/app/views/crops/_alternate_names.html.haml @@ -4,7 +4,7 @@ - crop.alternate_names.each do |an| - if can? :edit, an .dropdown.planting-actions - %a#crop-actions-altnames.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :type => "button", :href => '#'} + %a#crop-actions-altnames.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", :type => "button", :href => '#'} = an.name .dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "crop-actions-altnames"} - if can? :edit, an diff --git a/app/views/crops/_image_with_popover.html.haml b/app/views/crops/_image_with_popover.html.haml index 6176c6bba7..6deb844f4c 100644 --- a/app/views/crops/_image_with_popover.html.haml +++ b/app/views/crops/_image_with_popover.html.haml @@ -3,7 +3,8 @@ alt: "Image of #{crop.name}", class: 'image-responsive crop-image'), crop.name, rel: "popover", - 'data-trigger': 'hover', - 'data-title': crop.name, - 'data-content': render(partial: 'crops/popover', locals: { crop: crop }), - 'data-html': true + 'data-bs-toggle': 'popover', + 'data-bs-trigger': 'hover', + 'data-bs-title': crop.name, + 'data-bs-content': render(partial: 'crops/popover', locals: { crop: crop }), + 'data-bs-html': true diff --git a/app/views/crops/_scientific_names.html.haml b/app/views/crops/_scientific_names.html.haml index fcdfd4c3f7..a55dc967f0 100644 --- a/app/views/crops/_scientific_names.html.haml +++ b/app/views/crops/_scientific_names.html.haml @@ -6,7 +6,7 @@ - crop.scientific_names.each do |sn| - if can? :edit, sn .dropdown.planting-actions - %a#planting-actions-scinames.dropdown-toggle.card-link{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :type => "button", :href => '#'}= sn.name + %a#planting-actions-scinames.dropdown-toggle.card-link{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", :type => "button", :href => '#'}= sn.name .dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "planting-actions-button"} = link_to edit_scientific_name_path(sn), class: 'dropdown-item' do = edit_icon diff --git a/app/views/crops/_wrangle.html.haml b/app/views/crops/_wrangle.html.haml index 6129d46c4a..f9ea9ede18 100644 --- a/app/views/crops/_wrangle.html.haml +++ b/app/views/crops/_wrangle.html.haml @@ -4,7 +4,7 @@ You are a %strong CROP WRANGLER .dropdown.crop-actions - %a#crop-actions-button.btn.btn-info.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :type => "button", href: '#'} Actions + %a#crop-actions-button.btn.btn-info.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", :type => "button", href: '#'} Actions .dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "crop-actions-button"} = link_to edit_crop_path(crop), class: 'dropdown-item' do = edit_icon diff --git a/app/views/devise/registrations/edit.html.haml b/app/views/devise/registrations/edit.html.haml index 3a3fe90b4f..7a6c9829c7 100644 --- a/app/views/devise/registrations/edit.html.haml +++ b/app/views/devise/registrations/edit.html.haml @@ -10,15 +10,15 @@ .card %ul#myTab.nav.nav-tabs{role: "tablist"} %li.nav-item - %a#profile-tab.nav-link.active{"aria-controls" => "profile", "aria-selected" => "true", "data-toggle" => "tab", href: "#profile", role: "tab"} Profile + %a#profile-tab.nav-link.active{"aria-controls" => "profile", "aria-selected" => "true", "data-bs-toggle" => "tab", href: "#profile", role: "tab"} Profile %li.nav-item - %a#email-tab.nav-link{"aria-controls" => "email", "aria-selected" => "false", "data-toggle" => "tab", href: "#email", role: "tab"} Email + %a#email-tab.nav-link{"aria-controls" => "email", "aria-selected" => "false", "data-bs-toggle" => "tab", href: "#email", role: "tab"} Email %li.nav-item - %a#apps-tab.nav-link{"aria-controls" => "apps", "aria-selected" => "false", "data-toggle" => "tab", href: "#apps", role: "tab"} Apps + %a#apps-tab.nav-link{"aria-controls" => "apps", "aria-selected" => "false", "data-bs-toggle" => "tab", href: "#apps", role: "tab"} Apps %li.nav-item - %a#password-tab.nav-link{"aria-controls" => "password", "aria-selected" => "false", "data-toggle" => "tab", href: "#password", role: "tab"} Password + %a#password-tab.nav-link{"aria-controls" => "password", "aria-selected" => "false", "data-bs-toggle" => "tab", href: "#password", role: "tab"} Password %li.nav-item - %a#delete-tab.nav-link.text-danger{"aria-controls" => "delete", "aria-selected" => "false", "data-toggle" => "tab", href: "#delete", role: "tab"} Delete Account + %a#delete-tab.nav-link.text-danger{"aria-controls" => "delete", "aria-selected" => "false", "data-bs-toggle" => "tab", href: "#delete", role: "tab"} Delete Account .card-body #myTabContent.tab-content #profile.tab-pane.fade.show.active{"aria-labelledby" => "profile-tab", role: "tabpanel"} diff --git a/app/views/gardens/_actions.html.haml b/app/views/gardens/_actions.html.haml index 554d7e3fa7..87970db94b 100644 --- a/app/views/gardens/_actions.html.haml +++ b/app/views/gardens/_actions.html.haml @@ -1,6 +1,6 @@ - if can?(:edit, garden) .dropdown.garden-actions - %a#garden-actions-button.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button", href: '#'} Actions + %a#garden-actions-button.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", type: "button", href: '#'} Actions .dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "garden-actions-button"} - if can?(:edit, garden) = garden_plant_something_button(garden, classes: 'dropdown-item') if garden.active diff --git a/app/views/harvests/_actions.html.haml b/app/views/harvests/_actions.html.haml index cafe428114..c3dbfa8369 100644 --- a/app/views/harvests/_actions.html.haml +++ b/app/views/harvests/_actions.html.haml @@ -1,6 +1,6 @@ - if can?(:edit, harvest) .dropdown.harvest-actions - %a#harvest-actions-button.btn.btn-info.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button", href: '#'} Actions + %a#harvest-actions-button.btn.btn-info.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", type: "button", href: '#'} Actions .dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "harvest-actions-button"} = harvest_edit_button(harvest, classes: 'dropdown-item') = add_photo_button(harvest, classes: 'dropdown-item') diff --git a/app/views/harvests/_image_with_popover.haml b/app/views/harvests/_image_with_popover.haml index ebfb187f62..c5e78ad286 100644 --- a/app/views/harvests/_image_with_popover.haml +++ b/app/views/harvests/_image_with_popover.haml @@ -3,7 +3,8 @@ class: 'image-responsive crop-image'), harvest, rel: "popover", - 'data-trigger': 'hover', - 'data-title': harvest.to_s, - 'data-content': render('harvests/popover', harvest: harvest), - 'data-html': true + 'data-bs-toggle': 'popover', + 'data-bs-trigger': 'hover', + 'data-bs-title': harvest.to_s, + 'data-bs-content': render('harvests/popover', harvest: harvest), + 'data-bs-html': true \ No newline at end of file diff --git a/app/views/harvests/_modal.html.haml b/app/views/harvests/_modal.html.haml index 79f9ada06c..7781e9a196 100644 --- a/app/views/harvests/_modal.html.haml +++ b/app/views/harvests/_modal.html.haml @@ -26,6 +26,6 @@ = plant_part_icon(plant_part.name) = plant_part -%a.btn#modalHarvestButton{"data-target" => "#modelHarvestForm", "data-toggle" => "modal", href: ""} +%a.btn#modalHarvestButton{"data-target" => "#modelHarvestForm", "data-bs-toggle" => "modal", href: ""} = harvest_icon Record harvest diff --git a/app/views/layouts/_header.html.haml b/app/views/layouts/_header.html.haml index 86e2110f9e..b761945cd9 100644 --- a/app/views/layouts/_header.html.haml +++ b/app/views/layouts/_header.html.haml @@ -6,6 +6,6 @@ %span.site-name Growstuff .nav= render 'crops/search_bar' .nav - %button.navbar-toggler{ "aria-controls" => "navbarSupportedContent", "aria-expanded" => "false", "aria-label" => "Toggle navigation", "data-target" => "#navbarSupportedContent", "data-toggle" => "collapse", type: "button" } + %button.navbar-toggler{ "aria-controls" => "navbarSupportedContent", "aria-expanded" => "false", "aria-label" => "Toggle navigation", "data-bs-target" => "#navbarSupportedContent", "data-bs-toggle" => "collapse", type: "button" } %i.fas.fa-ellipsis-v.navbar-toggler-icon = render 'layouts/menu' diff --git a/app/views/layouts/_menu.haml b/app/views/layouts/_menu.haml index 3db3f3beee..65808c4503 100644 --- a/app/views/layouts/_menu.haml +++ b/app/views/layouts/_menu.haml @@ -8,7 +8,7 @@ = link_to member_gardens_path(current_member), class: 'nav-link text-white', title: "My gardens" do = image_icon 'gardens' %li.nav-item.dropdown - %a.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", href: "#", role: "button"} + %a.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", href: "#", role: "button"} = image_tag "icons/gardener.svg", class: 'img img-icon', alt: t('.record'), aria: { hidden: "true" } = t('.record') .dropdown-menu @@ -27,7 +27,7 @@ - cache("everyone-menu", expires_in: 1.week) do %li.nav-item.dropdown - %a.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", href: "#", role: "button"}= t('.crops') + %a.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", href: "#", role: "button"}= t('.crops') .dropdown-menu = link_to crops_path, class: 'dropdown-item' do = t('.browse_crops') @@ -41,7 +41,7 @@ = harvest_icon = t('.harvests') %li.nav-item.dropdown - %a.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", href: "#", role: "button"}= t('.community') + %a.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", href: "#", role: "button"}= t('.community') .dropdown-menu{"aria-labelledby" => "navbarDropdown"} = link_to t('.community_map'), places_path, class: 'dropdown-item' = link_to t('.browse_members'), members_path, class: 'dropdown-item' @@ -51,7 +51,7 @@ - if member_signed_in? - if current_member.role?(:crop_wrangler) || current_member.role?(:admin) %li.nav-item.dropdown - %a.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", href: "#", role: "button"}= t('.admin') + %a.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", href: "#", role: "button"}= t('.admin') .dropdown-menu{"aria-labelledby" => "navbarDropdown"} - if current_member.role?(:crop_wrangler) = link_to t('.crop_wrangling'), wrangle_crops_path, class: 'dropdown-item' @@ -59,7 +59,7 @@ = link_to t('.admin'), admin_path, class: 'dropdown-item' %li.nav-item.dropdown - %a.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", href: "#", role: "button"} + %a.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", href: "#", role: "button"} = image_tag(avatar_uri(current_member, 50), alt: 'Avatar of current member', height: 25, width: 25, aria: { hidden: "true" }) = current_member.login_name - if current_member.unread_count.positive? diff --git a/app/views/photos/_actions.html.haml b/app/views/photos/_actions.html.haml index 1329e04f51..1ab3e14bd4 100644 --- a/app/views/photos/_actions.html.haml +++ b/app/views/photos/_actions.html.haml @@ -1,6 +1,6 @@ - if can?(:edit, @photo) && can?(:destroy, @photo) .dropdown.float-right.photo-actions - %a#harvest-actions-button.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button", href: '#'} Actions + %a#harvest-actions-button.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", type: "button", href: '#'} Actions .dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "harvest-actions-button"} = edit_button(edit_photo_path(@photo), classes: 'dropdown-item') .dropdown-divider diff --git a/app/views/plantings/_actions.html.haml b/app/views/plantings/_actions.html.haml index aa58542e3e..7007106c25 100644 --- a/app/views/plantings/_actions.html.haml +++ b/app/views/plantings/_actions.html.haml @@ -1,6 +1,6 @@ - if can?(:edit, planting) .dropdown.planting-actions - %a#planting-actions-button.btn.btn-info.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button", href: '#'} Actions + %a#planting-actions-button.btn.btn-info.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", type: "button", href: '#'} Actions .dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "planting-actions-button"} = planting_edit_button(planting, classes: 'dropdown-item') = add_photo_button(planting, classes: 'dropdown-item') diff --git a/app/views/plantings/_badges.html.haml b/app/views/plantings/_badges.html.haml index e01d72d5f8..23cd1db57a 100644 --- a/app/views/plantings/_badges.html.haml +++ b/app/views/plantings/_badges.html.haml @@ -10,8 +10,8 @@ // Harvest times - unless planting.super_late? - if planting.harvest_time? - %span.badge.badge-info.badge-harvest{'data-toggle': "tooltip", 'data-placement': "top", title: 'Planting is ready for harvesting now'} + %span.badge.badge-info.badge-harvest{'data-bs-toggle': "tooltip", 'data-placement': "top", title: 'Planting is ready for harvesting now'} = t('label.harvesting_now') - elsif planting.before_harvest_time? - %span.badge.badge-info{'data-toggle': "tooltip", 'data-placement': "top", title: 'Predicted weeks until harvest'} + %span.badge.badge-info{'data-bs-toggle': "tooltip", 'data-placement': "top", title: 'Predicted weeks until harvest'} = t('label.weeks_until_harvest', number: in_weeks(days_from_now_to_first_harvest(planting))) diff --git a/app/views/plantings/_card.html.haml b/app/views/plantings/_card.html.haml index 1c593fbd8c..ded3b6773e 100644 --- a/app/views/plantings/_card.html.haml +++ b/app/views/plantings/_card.html.haml @@ -7,7 +7,7 @@ = link_to planting_path(slug: planting.slug) do .planting-quick-actions .dropdown - %a.planting-menu.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button", href: '#'} + %a.planting-menu.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", type: "button", href: '#'} .dropdown-menu{"aria-labelledby" => "planting-menu"} = link_to edit_planting_path(slug: planting.slug), class: 'dropdown-item' do diff --git a/app/views/plantings/_descendants.html.haml b/app/views/plantings/_descendants.html.haml index 2dd31b8d00..81bf3dedea 100644 --- a/app/views/plantings/_descendants.html.haml +++ b/app/views/plantings/_descendants.html.haml @@ -1,6 +1,6 @@ %h2 Seeds saved -%a.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", role: "button"} +%a.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", role: "button"} = seed_icon = t('buttons.save_seeds') .dropdown-menu.dropdown-secondary diff --git a/app/views/plantings/_image_with_popover.html.haml b/app/views/plantings/_image_with_popover.html.haml index 41a5c3b26f..ce99413718 100644 --- a/app/views/plantings/_image_with_popover.html.haml +++ b/app/views/plantings/_image_with_popover.html.haml @@ -4,7 +4,8 @@ class: 'image-responsive'), planting, rel: "popover", - 'data-trigger': 'hover', - 'data-title': planting.crop.name, - 'data-content': render('plantings/popover', planting: planting), - 'data-html': true + 'data-bs-toggle': 'popover', + 'data-bs-trigger': 'hover', + 'data-bs-title': planting.crop.name, + 'data-bs-content': render('plantings/popover', planting: planting), + 'data-bs-html': true diff --git a/app/views/plantings/_modal.html.haml b/app/views/plantings/_modal.html.haml index c27a4fceff..e454654f0b 100644 --- a/app/views/plantings/_modal.html.haml +++ b/app/views/plantings/_modal.html.haml @@ -23,6 +23,6 @@ = link_to 'add new garden', new_garden_path -%a.btn{"data-target" => "#modelPlantingForm", "data-toggle" => "modal", href: "", id: 'planting-button'} +%a.btn{"data-target" => "#modelPlantingForm", "data-bs-toggle" => "modal", href: "", id: 'planting-button'} = planting_icon Add to my garden diff --git a/app/views/plantings/_quick_actions.haml b/app/views/plantings/_quick_actions.haml index 74ac39314c..71947a9ffc 100644 --- a/app/views/plantings/_quick_actions.haml +++ b/app/views/plantings/_quick_actions.haml @@ -1,5 +1,5 @@ - if can?(:edit, planting) - %a#planting-actions-menu.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", href: "#"} + %a#planting-actions-menu.nav-link.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", href: "#"} /=icon('fas', 'ellipsis-v') %ul.dropdown-menu.dropdown-menu-left{"aria-labelledby" => "planting-actions-menu"} %li= link_to t('view'), planting, class: 'dropdown-item' diff --git a/app/views/plantings/_timeline.html.haml b/app/views/plantings/_timeline.html.haml index ee317f299d..cd7df0d3a6 100644 --- a/app/views/plantings/_timeline.html.haml +++ b/app/views/plantings/_timeline.html.haml @@ -15,7 +15,7 @@ .progress-bar{"aria-valuemax" => "100", "aria-valuemin" => "0", "aria-valuenow" => planting.percentage_grown, role: "progressbar", style: "width: #{planting.percentage_grown}%"} %ul.list-unstyled.d-flex.justify-content-between - in_weeks(planting.expected_lifespan).times do |week_number| - %li{class: planting.planted_at + week_number.weeks > Time.zone.today ? 'text-muted progress-fade' : '', 'data-toggle': "tooltip", 'data-placement': "top", title: I18n.l(planting.planted_at + week_number.weeks)} + %li{class: planting.planted_at + week_number.weeks > Time.zone.today ? 'text-muted progress-fade' : '', 'data-bs-toggle': "tooltip", 'data-placement': "top", title: I18n.l(planting.planted_at + week_number.weeks)} = render 'timeline_icon', planting: planting, week_number: week_number, diff --git a/app/views/posts/_actions.html.haml b/app/views/posts/_actions.html.haml index 30617062f2..0302dfdfd4 100644 --- a/app/views/posts/_actions.html.haml +++ b/app/views/posts/_actions.html.haml @@ -1,6 +1,6 @@ - if can? :edit, post .dropdown.float-right - %button#post-edit-button.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :type => "button"} Actions + %button#post-edit-button.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", :type => "button"} Actions .dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "post-edit-button"} - if can? :edit, post = link_to edit_post_path(post), class: 'dropdown-item' do diff --git a/app/views/seeds/_actions.html.haml b/app/views/seeds/_actions.html.haml index 1d337eea41..3aff5f45b9 100644 --- a/app/views/seeds/_actions.html.haml +++ b/app/views/seeds/_actions.html.haml @@ -1,6 +1,6 @@ - if can?(:edit, seed) .dropdown.seed-actions - %a#seed-actions-button.btn.btn-info.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button", href: '#'} + %a#seed-actions-button.btn.btn-info.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-bs-toggle" => "dropdown", type: "button", href: '#'} Actions .dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "seed-actions-button"} - if can?(:create, Planting) && can?(:update, seed) && seed.active diff --git a/app/views/seeds/_modal.html.haml b/app/views/seeds/_modal.html.haml index fd216dfaa7..030f909332 100644 --- a/app/views/seeds/_modal.html.haml +++ b/app/views/seeds/_modal.html.haml @@ -30,6 +30,6 @@ Save #{seed.crop_name} seeds. -%a.btn{"data-target" => "#modelSeedForm", "data-toggle" => "modal", href: ""} +%a.btn{"data-target" => "#modelSeedForm", "data-bs-toggle" => "modal", href: ""} = seed_icon Save seeds From 27e99f240e45ba311233fc5d4331216ce1dbefdd Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Fri, 26 Jan 2024 23:33:51 +0000 Subject: [PATCH 03/11] Migrate other details --- app/assets/javascripts/application.js | 24 +++++++++++++++++++++- app/assets/javascripts/bootstrap.js.coffee | 3 --- app/assets/javascripts/tooltips.js | 3 --- app/views/harvests/_modal.html.haml | 4 ++-- app/views/layouts/modal.html.haml | 2 +- app/views/plantings/_badges.html.haml | 4 ++-- app/views/plantings/_modal.html.haml | 4 ++-- app/views/plantings/_timeline.html.haml | 2 +- app/views/seeds/_modal.html.haml | 4 ++-- app/views/shared/_flash_messages.html.haml | 2 +- 10 files changed, 34 insertions(+), 18 deletions(-) delete mode 100644 app/assets/javascripts/bootstrap.js.coffee diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 253c02f55f..69f0c8e9ac 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -15,9 +15,31 @@ // = require popper // = require jquery // = require jquery_ujs -// = require jquery-ui/widgets/autocomplete +// = require jquery-ui/widgets/autocomplete // = require bootstrap-sprockets // = require bootstrap-datepicker // = require bootstrap // = require material // = require_tree . + +document.addEventListener("DOMContentLoaded", function (event) { + // var dropdownTrigger = [].slice.call(document.querySelectorAll('[data-bs-toggle="dropdown"]')) + // var dropdownList = dropdownTrigger.map(function (dropdownTrigger2) { + // return new bootstrap.Dropdown(dropdownTrigger2) + // }); + + // var dropdownTrigger = [].slice.call(document.querySelectorAll('.dropdown-toggle')) + // var dropdownList = dropdownTrigger.map(function (dropdownTrigger2) { + // return new bootstrap.Dropdown(dropdownTrigger2) + // }); + + var popoverTrigger = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')) + var popoverList = popoverTrigger.map(function (popoverTrigger2) { + return new bootstrap.Popover(popoverTrigger2) + }); + + var tooltipTrigger = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) + var tooltipList = tooltipTrigger.map(function (tooltipTrigger2) { + return new bootstrap.Tooltip(tooltipTrigger2) + }); + }); diff --git a/app/assets/javascripts/bootstrap.js.coffee b/app/assets/javascripts/bootstrap.js.coffee deleted file mode 100644 index d7093d7e1d..0000000000 --- a/app/assets/javascripts/bootstrap.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -jQuery -> - $(".tooltip").tooltip() - $("a[rel=tooltip]").tooltip() \ No newline at end of file diff --git a/app/assets/javascripts/tooltips.js b/app/assets/javascripts/tooltips.js index 7f496a43c2..e69de29bb2 100644 --- a/app/assets/javascripts/tooltips.js +++ b/app/assets/javascripts/tooltips.js @@ -1,3 +0,0 @@ -$(function() { - $('[data-bs-toggle="tooltip"]').tooltip(); -}); diff --git a/app/views/harvests/_modal.html.haml b/app/views/harvests/_modal.html.haml index 7781e9a196..d1ce63f620 100644 --- a/app/views/harvests/_modal.html.haml +++ b/app/views/harvests/_modal.html.haml @@ -3,7 +3,7 @@ .modal-content .modal-header.text-center %h4.modal-title.w-100.font-weight-bold Record #{harvest.crop.name} harvest - %button.close{"aria-label" => "Close", "data-dismiss" => "modal", type: "button"} + %button.close{"aria-label" => "Close", "data-bs-dismiss" => "modal", type: "button"} %span{"aria-hidden" => "true"} × .modal-body %p Select which plant part you have havested @@ -26,6 +26,6 @@ = plant_part_icon(plant_part.name) = plant_part -%a.btn#modalHarvestButton{"data-target" => "#modelHarvestForm", "data-bs-toggle" => "modal", href: ""} +%a.btn#modalHarvestButton{"data-bs-target" => "#modelHarvestForm", "data-bs-toggle" => "modal", href: ""} = harvest_icon Record harvest diff --git a/app/views/layouts/modal.html.haml b/app/views/layouts/modal.html.haml index 8468a6b4c9..d77cbba9ca 100644 --- a/app/views/layouts/modal.html.haml +++ b/app/views/layouts/modal.html.haml @@ -2,7 +2,7 @@ .modal-dialog .modal-content .modal-header - %button.close{"data-dismiss" => "modal", type: "button"} + %button.close{"data-bs-dismiss" => "modal", type: "button"} %span{"aria-hidden" => "true"} × %span.sr-only Close %h4#mainModalLabel.modal-title diff --git a/app/views/plantings/_badges.html.haml b/app/views/plantings/_badges.html.haml index 23cd1db57a..842c22977e 100644 --- a/app/views/plantings/_badges.html.haml +++ b/app/views/plantings/_badges.html.haml @@ -10,8 +10,8 @@ // Harvest times - unless planting.super_late? - if planting.harvest_time? - %span.badge.badge-info.badge-harvest{'data-bs-toggle': "tooltip", 'data-placement': "top", title: 'Planting is ready for harvesting now'} + %span.badge.badge-info.badge-harvest{'data-bs-toggle': "tooltip", 'data-bs-placement': "top", title: 'Planting is ready for harvesting now'} = t('label.harvesting_now') - elsif planting.before_harvest_time? - %span.badge.badge-info{'data-bs-toggle': "tooltip", 'data-placement': "top", title: 'Predicted weeks until harvest'} + %span.badge.badge-info{'data-bs-toggle': "tooltip", 'data-bs-placement': "top", title: 'Predicted weeks until harvest'} = t('label.weeks_until_harvest', number: in_weeks(days_from_now_to_first_harvest(planting))) diff --git a/app/views/plantings/_modal.html.haml b/app/views/plantings/_modal.html.haml index e454654f0b..d00c6d3f46 100644 --- a/app/views/plantings/_modal.html.haml +++ b/app/views/plantings/_modal.html.haml @@ -3,7 +3,7 @@ .modal-content .modal-header.text-center %h4.modal-title.w-100.font-weight-bold Record #{planting.crop.name} planting - %button.close{"aria-label" => "Close", "data-dismiss" => "modal", type: "button"} + %button.close{"aria-label" => "Close", "data-bs-dismiss" => "modal", type: "button"} %span{"aria-hidden" => "true"} × .modal-body %p Which garden is the planting in? @@ -23,6 +23,6 @@ = link_to 'add new garden', new_garden_path -%a.btn{"data-target" => "#modelPlantingForm", "data-bs-toggle" => "modal", href: "", id: 'planting-button'} +%a.btn{"data-bs-target" => "#modelPlantingForm", "data-bs-toggle" => "modal", href: "", id: 'planting-button'} = planting_icon Add to my garden diff --git a/app/views/plantings/_timeline.html.haml b/app/views/plantings/_timeline.html.haml index cd7df0d3a6..227799ec9b 100644 --- a/app/views/plantings/_timeline.html.haml +++ b/app/views/plantings/_timeline.html.haml @@ -15,7 +15,7 @@ .progress-bar{"aria-valuemax" => "100", "aria-valuemin" => "0", "aria-valuenow" => planting.percentage_grown, role: "progressbar", style: "width: #{planting.percentage_grown}%"} %ul.list-unstyled.d-flex.justify-content-between - in_weeks(planting.expected_lifespan).times do |week_number| - %li{class: planting.planted_at + week_number.weeks > Time.zone.today ? 'text-muted progress-fade' : '', 'data-bs-toggle': "tooltip", 'data-placement': "top", title: I18n.l(planting.planted_at + week_number.weeks)} + %li{class: planting.planted_at + week_number.weeks > Time.zone.today ? 'text-muted progress-fade' : '', 'data-bs-toggle': "tooltip", 'data-bs-placement': "top", title: I18n.l(planting.planted_at + week_number.weeks)} = render 'timeline_icon', planting: planting, week_number: week_number, diff --git a/app/views/seeds/_modal.html.haml b/app/views/seeds/_modal.html.haml index 030f909332..d08c348d8a 100644 --- a/app/views/seeds/_modal.html.haml +++ b/app/views/seeds/_modal.html.haml @@ -5,7 +5,7 @@ %h4.modal-title.w-100.font-weight-bold = seed_icon Save #{seed.crop.name} seeds - %button.close{"aria-label" => "Close", "data-dismiss" => "modal", type: "button"} + %button.close{"aria-label" => "Close", "data-bs-dismiss" => "modal", type: "button"} %span{"aria-hidden" => "true"} × .modal-body @@ -30,6 +30,6 @@ Save #{seed.crop_name} seeds. -%a.btn{"data-target" => "#modelSeedForm", "data-bs-toggle" => "modal", href: ""} +%a.btn{"data-bs-target" => "#modelSeedForm", "data-bs-toggle" => "modal", href: ""} = seed_icon Save seeds diff --git a/app/views/shared/_flash_messages.html.haml b/app/views/shared/_flash_messages.html.haml index abea6b9aca..9575184666 100644 --- a/app/views/shared/_flash_messages.html.haml +++ b/app/views/shared/_flash_messages.html.haml @@ -1,6 +1,6 @@ - flash.each do |type, content| %div{ class: build_alert_classes(type), role: "alert" } - %button.close{ type: "button", "data-dismiss" => "alert" } + %button.close{ type: "button", "data-bs-dismiss" => "alert" } %span{ "aria-hidden" => true } × %span.sr-only Close = content From 560622bfc5a26eb73ff8093994f3ca8f38f6e2fb Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Fri, 26 Jan 2024 23:35:04 +0000 Subject: [PATCH 04/11] Avoid accidentally including bootstrap twice --- app/assets/javascripts/application.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 69f0c8e9ac..e10ace396e 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -18,7 +18,6 @@ // = require jquery-ui/widgets/autocomplete // = require bootstrap-sprockets // = require bootstrap-datepicker -// = require bootstrap // = require material // = require_tree . From ab18006a5c7f5e493d5ce20faea8fb725c2fb0ef Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Fri, 26 Jan 2024 23:35:49 +0000 Subject: [PATCH 05/11] Avoid accidentally including bootstrap twice --- app/assets/javascripts/application.js | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index e10ace396e..dce6cf83fa 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -22,23 +22,13 @@ // = require_tree . document.addEventListener("DOMContentLoaded", function (event) { - // var dropdownTrigger = [].slice.call(document.querySelectorAll('[data-bs-toggle="dropdown"]')) - // var dropdownList = dropdownTrigger.map(function (dropdownTrigger2) { - // return new bootstrap.Dropdown(dropdownTrigger2) - // }); - - // var dropdownTrigger = [].slice.call(document.querySelectorAll('.dropdown-toggle')) - // var dropdownList = dropdownTrigger.map(function (dropdownTrigger2) { - // return new bootstrap.Dropdown(dropdownTrigger2) - // }); - - var popoverTrigger = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')) - var popoverList = popoverTrigger.map(function (popoverTrigger2) { - return new bootstrap.Popover(popoverTrigger2) + var popoverTrigger = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')); + var popoverList = popoverTrigger.map(function (popoverTrigger2) { + return new bootstrap.Popover(popoverTrigger2); }); - var tooltipTrigger = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) - var tooltipList = tooltipTrigger.map(function (tooltipTrigger2) { - return new bootstrap.Tooltip(tooltipTrigger2) + var tooltipTrigger = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); + var tooltipList = tooltipTrigger.map(function (tooltipTrigger2) { + return new bootstrap.Tooltip(tooltipTrigger2); }); }); From c8bfd4815ebd926df54ba01a344fe7a5f8795df6 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Fri, 26 Jan 2024 23:35:59 +0000 Subject: [PATCH 06/11] Avoid accidentally including bootstrap twice --- app/assets/javascripts/application.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index dce6cf83fa..c21a9b8843 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -15,7 +15,7 @@ // = require popper // = require jquery // = require jquery_ujs -// = require jquery-ui/widgets/autocomplete +// = require jquery-ui/widgets/autocomplete // = require bootstrap-sprockets // = require bootstrap-datepicker // = require material From cdefb8cb379563e6b62182950a6452ed452982dc Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Fri, 26 Jan 2024 23:48:59 +0000 Subject: [PATCH 07/11] Fix spec --- spec/features/shared_examples/crop_suggest.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spec/features/shared_examples/crop_suggest.rb b/spec/features/shared_examples/crop_suggest.rb index 03ac664d63..702d9cc656 100644 --- a/spec/features/shared_examples/crop_suggest.rb +++ b/spec/features/shared_examples/crop_suggest.rb @@ -65,6 +65,10 @@ it "Submitting a crop that doesn't exist in the database produces a meaningful error" do within "form#new_#{resource}" do fill_autocomplete "crop", with: "Ryan Gosling" + # Some forms require additional selections before submission. + if resource == "harvest" + choose plant_part.name + end click_button "Save" end From 288158be9b8bf393c582a3b8156334c602682f7a Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sat, 27 Jan 2024 00:04:36 +0000 Subject: [PATCH 08/11] Fix spec, where the size of the screen has gone to a partial breakpoint/you can't click on your own name in tablet view --- spec/features/crops/crop_wranglers_spec.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spec/features/crops/crop_wranglers_spec.rb b/spec/features/crops/crop_wranglers_spec.rb index 7307d6e6a8..555669c0db 100644 --- a/spec/features/crops/crop_wranglers_spec.rb +++ b/spec/features/crops/crop_wranglers_spec.rb @@ -79,8 +79,7 @@ end it "can't see wrangling page with js" do - visit root_path - click_link member.login_name + visit member_path(member) expect(page).not_to have_link "Crop Wrangling" end end From cd959bb1284aae748075b765b43c42e4f061a82f Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sat, 27 Jan 2024 00:12:00 +0000 Subject: [PATCH 09/11] Fix spec --- app/views/forums/_form.html.haml | 6 +++--- spec/features/admin/forums_spec.rb | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/forums/_form.html.haml b/app/views/forums/_form.html.haml index ba4382749e..81955ef70b 100644 --- a/app/views/forums/_form.html.haml +++ b/app/views/forums/_form.html.haml @@ -14,8 +14,8 @@ - @forum.errors.full_messages.each do |msg| %li= msg - = f.text_field :name - = f.text_area :description, rows: 6 - = f.select(:owner_id, Member.all.order(:login_name).pluck(:login_name, :id)) + = f.text_field :name, required: true + = f.text_area :description, rows: 6, required: true + = f.select(:owner_id, Member.all.order(:login_name).pluck(:login_name, :id), required: true) .card-footer .text-right= f.submit 'Save' diff --git a/spec/features/admin/forums_spec.rb b/spec/features/admin/forums_spec.rb index 5c0847cdbd..0fe6e61d26 100644 --- a/spec/features/admin/forums_spec.rb +++ b/spec/features/admin/forums_spec.rb @@ -25,6 +25,7 @@ expect(page).to have_current_path new_forum_path, ignore_query: true fill_in 'Name', with: 'Discussion' fill_in 'Description', with: "this is a new forum" + select member.login_name, from: "Owner" click_button 'Save' end From 3251dd3f35dee1816fe93ffa2a197ede583e90b7 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sat, 27 Jan 2024 00:13:29 +0000 Subject: [PATCH 10/11] Cleanup --- Gemfile | 2 +- Gemfile.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index ac264bd7fd..961e794db9 100644 --- a/Gemfile +++ b/Gemfile @@ -24,7 +24,7 @@ gem 'rswag-api' gem 'rswag-ui' # CSS framework -gem "bootstrap", ">= 4.6.2" +gem "bootstrap", ">= 5.0.0" gem 'material-sass', '4.1.1' # Icons used by bootstrap/material-sass diff --git a/Gemfile.lock b/Gemfile.lock index ac891d5f98..87d5f8b7d7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -697,7 +697,7 @@ DEPENDENCIES better_errors bluecloth bonsai-elasticsearch-rails - bootstrap (>= 4.6.2) + bootstrap (>= 5.0.0) bootstrap-datepicker-rails bootstrap_form (>= 4.5.0) bullet From 52ef36f580e5de7561954b4c379dd55dab77b7c2 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sat, 27 Jan 2024 00:19:03 +0000 Subject: [PATCH 11/11] Cleanup --- app/assets/javascripts/application.js | 8 ++++---- app/views/harvests/_image_with_popover.haml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index c21a9b8843..15dfe1b24f 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -21,14 +21,14 @@ // = require material // = require_tree . -document.addEventListener("DOMContentLoaded", function (event) { +document.addEventListener('DOMContentLoaded', function(event) { var popoverTrigger = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')); - var popoverList = popoverTrigger.map(function (popoverTrigger2) { + popoverTrigger.map(function(popoverTrigger2) { return new bootstrap.Popover(popoverTrigger2); }); var tooltipTrigger = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); - var tooltipList = tooltipTrigger.map(function (tooltipTrigger2) { + tooltipTrigger.map(function(tooltipTrigger2) { return new bootstrap.Tooltip(tooltipTrigger2); - }); + }); }); diff --git a/app/views/harvests/_image_with_popover.haml b/app/views/harvests/_image_with_popover.haml index c5e78ad286..9dd870f5bf 100644 --- a/app/views/harvests/_image_with_popover.haml +++ b/app/views/harvests/_image_with_popover.haml @@ -7,4 +7,4 @@ 'data-bs-trigger': 'hover', 'data-bs-title': harvest.to_s, 'data-bs-content': render('harvests/popover', harvest: harvest), - 'data-bs-html': true \ No newline at end of file + 'data-bs-html': true