This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch fix/spring-security-ui-jquery4-bootstrap5
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 416eb8a22ec43bf43f00c3af8beb4b3424b96693
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Mon Jul 27 17:39:33 2026 -0500

    Fix spring-security-ui jQuery 4 / Bootstrap 5 compatibility
    
    grails-spring-security-ui and its example apps used jQuery/Bootstrap-3
    APIs removed in jQuery 4 (.bind()/.unbind()/.andSelf()/$.isFunction) and
    Bootstrap 3 data-* attributes, blocking the pending jQuery 4.0.0 and
    Bootstrap 5.3.8 dependency bumps (both currently cause regressions if
    merged as-is). Migrates the plugin's JS to jQuery-4-safe APIs, bumps
    DataTables/jQuery/jQuery UI/Bootstrap webjar versions across the plugin
    and cas/ldap/ui example apps (verified against actual webjar jar
    layouts), and updates Bootstrap 3 data-toggle/data-target attributes to
    data-bs-toggle/data-bs-target in the ldap example apps' navbar/dropdown
    markup.
    
    Verified via assetCompile across all touched example apps, and via
    DefaultSecurityInfoSpec/RegisterSpec integration tests plus the
    ldap functional-test-app's full Geb functional suite.
    
    Co-Authored-By: Claude Sonnet 5 <[email protected]>
---
 .../springSecurity/ui/customization.adoc             |  6 +++---
 grails-spring-security/ui/plugin/build.gradle        | 10 +++++-----
 .../assets/javascripts/jquery/jquery.jdMenu.js       | 20 ++++++++++----------
 .../javascripts/spring-security-ui-ajaxLogin.js      |  2 +-
 .../javascripts/spring-security-ui-register.js       |  4 ++--
 .../assets/javascripts/spring-security-ui.js         |  6 +++---
 .../grails-app/assets/stylesheets/jquery-ui.css      |  2 +-
 .../assets/stylesheets/jquery.dataTables.css         |  2 +-
 .../assets/stylesheets/spring-security-ui.css        |  2 +-
 .../plugin/springsecurity/ui/SecurityUiTagLib.groovy |  4 ++--
 .../plugin/grails-app/views/securityInfo/config.gsp  |  2 +-
 .../ui/plugin/grails-app/views/user/edit.gsp         |  2 +-
 .../grails/plugin/springsecurity/ui/Constants.groovy |  4 ++--
 .../spring-security/cas/test1/build.gradle           |  4 ++--
 .../grails-app/assets/javascripts/application.js     |  4 ++--
 .../grails-app/assets/stylesheets/application.css    |  2 +-
 .../custom-user-details-context-mapper/build.gradle  |  4 ++--
 .../grails-app/assets/javascripts/application.js     |  4 ++--
 .../grails-app/assets/stylesheets/application.css    |  2 +-
 .../grails-app/views/index.gsp                       |  6 +++---
 .../grails-app/views/layouts/main.gsp                |  2 +-
 .../ldap/functional-test-app/build.gradle            |  4 ++--
 .../grails-app/assets/javascripts/application.js     |  4 ++--
 .../grails-app/assets/stylesheets/application.css    |  2 +-
 .../functional-test-app/grails-app/views/index.gsp   |  6 +++---
 .../grails-app/views/layouts/main.gsp                |  2 +-
 .../ldap/retrieve-db-roles/build.gradle              |  4 ++--
 .../grails-app/assets/javascripts/application.js     |  4 ++--
 .../grails-app/assets/stylesheets/application.css    |  2 +-
 .../retrieve-db-roles/grails-app/views/index.gsp     |  6 +++---
 .../grails-app/views/layouts/main.gsp                |  2 +-
 .../ldap/retrieve-group-roles/build.gradle           |  4 ++--
 .../grails-app/assets/javascripts/application.js     |  4 ++--
 .../grails-app/assets/stylesheets/application.css    |  2 +-
 .../retrieve-group-roles/grails-app/views/index.gsp  |  6 +++---
 .../grails-app/views/layouts/main.gsp                |  2 +-
 .../ui/extended/grails-app/views/user/edit.gsp       |  2 +-
 .../simple/grails-app/views/securityInfo/config.gsp  |  2 +-
 .../ui/simple/grails-app/views/user/edit.gsp         |  2 +-
 39 files changed, 77 insertions(+), 77 deletions(-)

diff --git 
a/grails-doc/src/en/guide/security/securityPlugins/springSecurity/ui/customization.adoc
 
b/grails-doc/src/en/guide/security/securityPlugins/springSecurity/ui/customization.adoc
index af10b7a801..8e3ec5f076 100644
--- 
a/grails-doc/src/en/guide/security/securityPlugins/springSecurity/ui/customization.adoc
+++ 
b/grails-doc/src/en/guide/security/securityPlugins/springSecurity/ui/customization.adoc
@@ -177,7 +177,7 @@ The layouts use `grails-app/assets/javascripts/jquery.js`, 
which contains this:
 //=require 
jquery/jquery-${grails.plugin.springsecurity.ui.Constants.JQUERY_VERSION}.js
 ----
 
-This resolves to `grails-app/assets/javascripts/jquery/jquery-2.1.4.js`, and 
to use your own version, either use the same approach in a file called 
`jquery.js` or rename your file to `jquery.js`.
+This resolves to `grails-app/assets/javascripts/jquery/jquery-4.0.0.js`, and 
to use your own version, either use the same approach in a file called 
`jquery.js` or rename your file to `jquery.js`.
 
 Likewise for jQuery UI, the JavaScript file is 
`grails-app/assets/javascripts/jquery-ui.js`, which contains this
 
@@ -195,9 +195,9 @@ and the CSS file 
`grails-app/assets/stylesheets/jquery-ui.css`, which contains
  */
 ----
 
-The JavaScript file resolves to 
`grails-app/assets/javascripts/jquery-ui/jquery-ui-1.10.3.custom.js`, and to 
use your own version, either use the same approach in a file called 
`jquery-ui.js` or rename your file to `jquery-ui.js`.
+The JavaScript file resolves to 
`grails-app/assets/javascripts/jquery-ui/jquery-ui-1.14.1.js`, and to use your 
own version, either use the same approach in a file called `jquery-ui.js` or 
rename your file to `jquery-ui.js`.
 
-The CSS file resolves to 
`grails-app/assets/stylesheets/smoothness/jquery-ui-1.10.3.custom.css`, and to 
use your own version, either use the same approach in a file called 
`jquery-ui.js` or rename your file to `jquery-ui.js`.
+The CSS file resolves to 
`grails-app/assets/stylesheets/smoothness/jquery-ui-1.14.1.css`, and to use 
your own version, either use the same approach in a file called `jquery-ui.js` 
or rename your file to `jquery-ui.js`.
 
 Use your own `jquery-ui.js` and/or `jquery-ui.css` to override the plugin's.
 
diff --git a/grails-spring-security/ui/plugin/build.gradle 
b/grails-spring-security/ui/plugin/build.gradle
index 0bfdb18c76..d7c063c099 100644
--- a/grails-spring-security/ui/plugin/build.gradle
+++ b/grails-spring-security/ui/plugin/build.gradle
@@ -52,11 +52,11 @@ dependencies {
     implementation 'org.springframework.security:spring-security-web'
 
     // 3rd party client-side assets bundled in webjars
-    implementation 'org.webjars:datatables:1.10.25'
-    implementation 'org.webjars:jquery:2.1.4'
-    implementation 'org.webjars:jquery-form:3.51'
-    implementation 'org.webjars:jquery-ui:1.10.3'
-    implementation 'org.webjars:jquery-ui-themes:1.10.3'
+    implementation 'org.webjars:datatables:2.3.0'
+    implementation 'org.webjars:jquery:4.0.0'
+    implementation 'org.webjars:jquery-form:4.2.2'
+    implementation 'org.webjars:jquery-ui:1.14.1'
+    implementation 'org.webjars:jquery-ui-themes:1.13.2'
     implementation 'org.webjars.bower:bgiframe:3.0.1'
     implementation 'org.webjars.bower:jgrowl:1.4.6'
 
diff --git 
a/grails-spring-security/ui/plugin/grails-app/assets/javascripts/jquery/jquery.jdMenu.js
 
b/grails-spring-security/ui/plugin/grails-app/assets/javascripts/jquery/jquery.jdMenu.js
index 3b59ceda87..2ce82793ed 100644
--- 
a/grails-spring-security/ui/plugin/grails-app/assets/javascripts/jquery/jquery.jdMenu.js
+++ 
b/grails-spring-security/ui/plugin/grails-app/assets/javascripts/jquery/jquery.jdMenu.js
@@ -18,9 +18,9 @@ $(function() {
 
 (function($){
        function addEvents(ul) {
-               var settings = $.data( 
$(ul).parents().andSelf().filter('ul.jd_menu')[0], 'jdMenuSettings' );
+               var settings = $.data( 
$(ul).parents().addBack().filter('ul.jd_menu')[0], 'jdMenuSettings' );
                $('> li', ul)
-                       .bind('mouseenter.jdmenu mouseleave.jdmenu', 
function(evt) {
+                       .on('mouseenter.jdmenu mouseleave.jdmenu', 
function(evt) {
                                $(this).toggleClass('jdm_hover');
                                var ul = $('> ul', this);
                                if ( ul.length == 1 ) {
@@ -32,7 +32,7 @@ $(function() {
                                        }, enter ? settings.showDelay : 
settings.hideDelay );
                                }
                        })
-                       .bind('click.jdmenu', function(evt) {
+                       .on('click.jdmenu', function(evt) {
                                var ul = $('> ul', this);
                                if ( ul.length == 1 && 
                                        ( settings.disableLinks == true || 
$(this).hasClass('accessible') ) ) {
@@ -59,16 +59,16 @@ $(function() {
                                }
                        })
                        .find('> a')
-                               .bind('focus.jdmenu blur.jdmenu', function(evt) 
{
+                               .on('focus.jdmenu blur.jdmenu', function(evt) {
                                        var p = $(this).parents('li:eq(0)');
                                        if ( evt.type == 'focus' ) {
                                                p.addClass('jdm_hover');
-                                       } else { 
+                                       } else {
                                                p.removeClass('jdm_hover');
                                        }
                                })
                                .filter('.accessible')
-                                       .bind('click.jdmenu', function(evt) {
+                                       .on('click.jdmenu', function(evt) {
                                                evt.preventDefault();
                                        });
        }
@@ -139,7 +139,7 @@ $(function() {
                                                                        // This 
callback allows for you to animate menus
                                                                        
//onAnimate:    null
                                                                        }, 
settings);
-               if ( !$.isFunction( settings.onAnimate ) ) {
+               if ( typeof settings.onAnimate !== 'function' ) {
                        settings.onAnimate = undefined;
                }
                return this.filter('ul.jd_menu').each(function() {
@@ -153,8 +153,8 @@ $(function() {
        
        $.fn.jdMenuUnbind = function() {
                $('ul.jdm_events', this)
-                       .unbind('.jdmenu')
-                       .find('> a').unbind('.jdmenu');
+                       .off('.jdmenu')
+                       .find('> a').off('.jdmenu');
        };
        $.fn.jdMenuHide = function() {
                return this.filter('ul').each(function(){ 
@@ -165,7 +165,7 @@ $(function() {
        // Private methods and logic
        $(window)
                // Bind a click event to hide all visible menus when the 
document is clicked
-               .bind('click.jdmenu', function(){
+               .on('click.jdmenu', function(){
                        $('ul.jd_menu ul:visible').jdMenuHide();
                });
 })(jQuery);
diff --git 
a/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui-ajaxLogin.js
 
b/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui-ajaxLogin.js
index 38fbad7ec8..35abbf3970 100644
--- 
a/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui-ajaxLogin.js
+++ 
b/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui-ajaxLogin.js
@@ -34,7 +34,7 @@ $(function() {
                buttons: buttons
        });
 
-       $('#loginForm').bind('submit', function() {
+       $('#loginForm').on('submit', function() {
                $(this).ajaxSubmit({
                        target: '#loginMessage',
                        beforeSubmit: function() {
diff --git 
a/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui-register.js
 
b/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui-register.js
index 531680f51d..27ab08e8b8 100644
--- 
a/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui-register.js
+++ 
b/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui-register.js
@@ -17,6 +17,6 @@
  *  under the License.
  */
 
-//= require webjars/jquery/2.1.4/jquery.min.js
-//= require webjars/jquery-ui/1.10.3/ui/minified/jquery-ui.min.js
+//= require webjars/jquery/4.0.0/jquery.min.js
+//= require webjars/jquery-ui/1.14.1/jquery-ui.min.js
 //= require webjars/jgrowl/1.4.6/jquery.jgrowl.min.js
diff --git 
a/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui.js
 
b/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui.js
index 26b0bb25ae..45bf320359 100644
--- 
a/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui.js
+++ 
b/grails-spring-security/ui/plugin/grails-app/assets/javascripts/spring-security-ui.js
@@ -17,11 +17,11 @@
  *  under the License.
  */
 
-//= require webjars/jquery/2.1.4/jquery.min.js
-//= require webjars/jquery-ui/1.10.3/ui/minified/jquery-ui.min.js
+//= require webjars/jquery/4.0.0/jquery.min.js
+//= require webjars/jquery-ui/1.14.1/jquery-ui.min.js
 //= require webjars/jgrowl/1.4.6/jquery.jgrowl.min.js
 //= require jquery/jquery.positionBy.js
 //= require webjars/bgiframe/3.0.1/jquery.bgiframe.js
-//= require webjars/jquery-form/3.51/jquery.form.js
+//= require webjars/jquery-form/4.2.2/jquery.form.min.js
 //= require jquery/jquery.jdMenu.js
 //= require spring-security-ui-ajaxLogin.js
diff --git 
a/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/jquery-ui.css 
b/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/jquery-ui.css
index 3e9ff224ae..d8cddc8aa7 100644
--- 
a/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/jquery-ui.css
+++ 
b/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/jquery-ui.css
@@ -18,5 +18,5 @@
  */
 
 /*
- *= require webjars/jquery-ui-themes/1.10.3/smoothness/jquery-ui
+ *= require webjars/jquery-ui-themes/1.13.2/smoothness/jquery-ui
  */
diff --git 
a/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/jquery.dataTables.css
 
b/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/jquery.dataTables.css
index fbeedcc8f7..6175c5f28a 100644
--- 
a/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/jquery.dataTables.css
+++ 
b/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/jquery.dataTables.css
@@ -18,5 +18,5 @@
  */
 
 /*
- *= require webjars/datatables/1.10.25/css/jquery.dataTables
+ *= require webjars/datatables/2.3.0/css/dataTables.dataTables
  */
\ No newline at end of file
diff --git 
a/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/spring-security-ui.css
 
b/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/spring-security-ui.css
index 01a3d79f86..6ca354eefa 100644
--- 
a/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/spring-security-ui.css
+++ 
b/grails-spring-security/ui/plugin/grails-app/assets/stylesheets/spring-security-ui.css
@@ -19,7 +19,7 @@
 
 /*
  *= require reset
- *= require webjars/jquery-ui-themes/1.10.3/smoothness/jquery-ui
+ *= require webjars/jquery-ui-themes/1.13.2/smoothness/jquery-ui
  *= require jquery.jdMenu
  *= require jquery.jdMenu.slate
  *= require webjars/jgrowl/1.4.6/jquery.jgrowl
diff --git 
a/grails-spring-security/ui/plugin/grails-app/taglib/grails/plugin/springsecurity/ui/SecurityUiTagLib.groovy
 
b/grails-spring-security/ui/plugin/grails-app/taglib/grails/plugin/springsecurity/ui/SecurityUiTagLib.groovy
index 2b71e00a18..cf12878d76 100644
--- 
a/grails-spring-security/ui/plugin/grails-app/taglib/grails/plugin/springsecurity/ui/SecurityUiTagLib.groovy
+++ 
b/grails-spring-security/ui/plugin/grails-app/taglib/grails/plugin/springsecurity/ui/SecurityUiTagLib.groovy
@@ -155,7 +155,7 @@ class SecurityUiTagLib {
             <div id="deleteConfirmDialog" title="${message(code: 
'default.button.delete.confirm.message')}"></div>"""
 
         writeDocumentReady out, """
-    \$("#deleteButton").button().bind('click', function() {
+    \$("#deleteButton").button().on('click', function() {
         \$('#deleteConfirmDialog').dialog('open');
     });
 
@@ -711,7 +711,7 @@ class SecurityUiTagLib {
 
         writeDocumentReady out, """\
     \$("#$elementId").button();
-    \$('#$elementId').bind('click', function() {
+    \$('#$elementId').on('click', function() {
         document.forms.${formName}.submit();
     });"""
     }
diff --git 
a/grails-spring-security/ui/plugin/grails-app/views/securityInfo/config.gsp 
b/grails-spring-security/ui/plugin/grails-app/views/securityInfo/config.gsp
index 384575fc79..22cd8738f9 100644
--- a/grails-spring-security/ui/plugin/grails-app/views/securityInfo/config.gsp
+++ b/grails-spring-security/ui/plugin/grails-app/views/securityInfo/config.gsp
@@ -54,7 +54,7 @@
         </tbody>
     </table>
 </div>
-<s2ui:deferredScript src='webjars/datatables/1.10.25/js/jquery.dataTables.js'/>
+<s2ui:deferredScript src='webjars/datatables/2.3.0/js/dataTables.js'/>
 <s2ui:documentReady>
     $('#config').DataTable();
 </s2ui:documentReady>
diff --git a/grails-spring-security/ui/plugin/grails-app/views/user/edit.gsp 
b/grails-spring-security/ui/plugin/grails-app/views/user/edit.gsp
index 2d810d887b..4435bf5b64 100644
--- a/grails-spring-security/ui/plugin/grails-app/views/user/edit.gsp
+++ b/grails-spring-security/ui/plugin/grails-app/views/user/edit.gsp
@@ -68,7 +68,7 @@
 </g:if>
 <s2ui:documentReady>
        $("#runAsButton").button();
-       $('#runAsButton').bind('click', function() {
+       $('#runAsButton').on('click', function() {
                document.forms.runAsForm.submit();
        });
 </s2ui:documentReady>
diff --git 
a/grails-spring-security/ui/plugin/src/main/groovy/grails/plugin/springsecurity/ui/Constants.groovy
 
b/grails-spring-security/ui/plugin/src/main/groovy/grails/plugin/springsecurity/ui/Constants.groovy
index ce9d22c738..8d37929bfd 100644
--- 
a/grails-spring-security/ui/plugin/src/main/groovy/grails/plugin/springsecurity/ui/Constants.groovy
+++ 
b/grails-spring-security/ui/plugin/src/main/groovy/grails/plugin/springsecurity/ui/Constants.groovy
@@ -28,6 +28,6 @@ import groovy.transform.CompileStatic
 @CompileStatic
 final class Constants {
 
-    public static final String JQUERY_VERSION = '2.1.4'
-    public static final String JQUERY_UI_VERSION = '1.10.3.custom'
+    public static final String JQUERY_VERSION = '4.0.0'
+    public static final String JQUERY_UI_VERSION = '1.14.1'
 }
diff --git a/grails-test-examples/spring-security/cas/test1/build.gradle 
b/grails-test-examples/spring-security/cas/test1/build.gradle
index 7269dc728c..eacae0ab19 100644
--- a/grails-test-examples/spring-security/cas/test1/build.gradle
+++ b/grails-test-examples/spring-security/cas/test1/build.gradle
@@ -38,8 +38,8 @@ dependencies {
     implementation 'org.apache.grails:grails-layout'
 
     // 3rd party client-side assets bundled in webjars
-    implementation 'org.webjars:bootstrap:3.3.6'
-    implementation 'org.webjars:jquery:2.2.0'
+    implementation 'org.webjars:bootstrap:5.3.8'
+    implementation 'org.webjars:jquery:4.0.0'
 
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
diff --git 
a/grails-test-examples/spring-security/cas/test1/grails-app/assets/javascripts/application.js
 
b/grails-test-examples/spring-security/cas/test1/grails-app/assets/javascripts/application.js
index e52f1ad2cd..8df368ef16 100644
--- 
a/grails-test-examples/spring-security/cas/test1/grails-app/assets/javascripts/application.js
+++ 
b/grails-test-examples/spring-security/cas/test1/grails-app/assets/javascripts/application.js
@@ -24,8 +24,8 @@
 // You're free to add application-wide JavaScript to this file, but it's 
generally better
 // to create separate JavaScript files as needed.
 //
-//= require webjars/jquery/2.2.0/jquery
-//= require webjars/bootstrap/3.3.6/js/bootstrap.js
+//= require webjars/jquery/4.0.0/jquery
+//= require webjars/bootstrap/5.3.8/js/bootstrap.js
 //= require_self
 
 if (typeof jQuery !== 'undefined') {
diff --git 
a/grails-test-examples/spring-security/cas/test1/grails-app/assets/stylesheets/application.css
 
b/grails-test-examples/spring-security/cas/test1/grails-app/assets/stylesheets/application.css
index 48a8dee2bd..b2dddb5d43 100644
--- 
a/grails-test-examples/spring-security/cas/test1/grails-app/assets/stylesheets/application.css
+++ 
b/grails-test-examples/spring-security/cas/test1/grails-app/assets/stylesheets/application.css
@@ -26,7 +26,7 @@
 * You're free to add application-wide styles to this file and they'll appear 
at the top of the
 * compiled file, but it's generally better to create a new file per style 
scope.
 *
-*= require webjars/bootstrap/3.3.6/css/bootstrap
+*= require webjars/bootstrap/5.3.8/css/bootstrap
 *= require grails
 *= require_self
 */
diff --git 
a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/build.gradle
 
b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/build.gradle
index 2faa88f11d..543b349e03 100644
--- 
a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/build.gradle
+++ 
b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/build.gradle
@@ -38,8 +38,8 @@ dependencies {
     implementation 'org.apache.grails:grails-layout'
 
     // 3rd party client-side assets bundled in webjars
-    implementation 'org.webjars:bootstrap:4.1.3'
-    implementation 'org.webjars:jquery:3.3.1'
+    implementation 'org.webjars:bootstrap:5.3.8'
+    implementation 'org.webjars:jquery:4.0.0'
 
     // to not depend on an external ldap server
     implementation 'com.unboundid:unboundid-ldapsdk'
diff --git 
a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/assets/javascripts/application.js
 
b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/assets/javascripts/application.js
index abf33100b5..ae77b46a6f 100644
--- 
a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/assets/javascripts/application.js
+++ 
b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/assets/javascripts/application.js
@@ -24,6 +24,6 @@
 // You're free to add application-wide JavaScript to this file, but it's 
generally better
 // to create separate JavaScript files as needed.
 //
-//= require webjars/jquery/3.3.1/jquery
-//= require webjars/bootstrap/4.1.3/js/bootstrap.bundle
+//= require webjars/jquery/4.0.0/jquery
+//= require webjars/bootstrap/5.3.8/js/bootstrap.bundle
 //= require_self
diff --git 
a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/assets/stylesheets/application.css
 
b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/assets/stylesheets/application.css
index 83d31ebbcc..0ae6f8edee 100644
--- 
a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/assets/stylesheets/application.css
+++ 
b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/assets/stylesheets/application.css
@@ -26,7 +26,7 @@
 * You're free to add application-wide styles to this file and they'll appear 
at the top of the
 * compiled file, but it's generally better to create a new file per style 
scope.
 *
-*= require webjars/bootstrap/4.1.3/css/bootstrap
+*= require webjars/bootstrap/5.3.8/css/bootstrap
 *= require grails
 *= require main
 *= require mobile
diff --git 
a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/views/index.gsp
 
b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/views/index.gsp
index d6eef452c1..4182776ea5 100644
--- 
a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/views/index.gsp
+++ 
b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/views/index.gsp
@@ -25,7 +25,7 @@
 <body>
 <content tag="nav">
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Application Status 
<span class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Application Status 
<span class="caret"></span></a>
         <ul class="dropdown-menu">
             <li class="dropdown-item"><a href="#">Environment: 
${grails.util.Environment.current.name}</a></li>
             <li class="dropdown-item"><a href="#">App profile: 
${grailsApplication.config.grails?.profile}</a></li>
@@ -43,7 +43,7 @@
         </ul>
     </li>
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Artefacts <span 
class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Artefacts <span 
class="caret"></span></a>
         <ul class="dropdown-menu">
             <li class="dropdown-item"><a href="#">Controllers: 
${grailsApplication.controllerClasses.size()}</a></li>
             <li class="dropdown-item"><a href="#">Domains: 
${grailsApplication.domainClasses.size()}</a></li>
@@ -52,7 +52,7 @@
         </ul>
     </li>
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins 
<span class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins 
<span class="caret"></span></a>
         <ul class="dropdown-menu">
             <g:each var="plugin" 
in="${applicationContext.getBean('pluginManager').allPlugins}">
                 <li class="dropdown-item"><a href="#">${plugin.name} - 
${plugin.version}</a></li>
diff --git 
a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/views/layouts/main.gsp
 
b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/views/layouts/main.gsp
index 311332f762..addbb8bc21 100644
--- 
a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/views/layouts/main.gsp
+++ 
b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/grails-app/views/layouts/main.gsp
@@ -36,7 +36,7 @@
 
 <nav class="navbar navbar-expand-lg navbar-dark navbar-static-top" 
role="navigation">
     <a class="navbar-brand" href="/#"><asset:image src="grails.svg" 
alt="Grails Logo"/></a>
-    <button class="navbar-toggler" type="button" data-toggle="collapse" 
data-target="#navbarContent" aria-controls="navbarContent" 
aria-expanded="false" aria-label="Toggle navigation">
+    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" 
data-bs-target="#navbarContent" aria-controls="navbarContent" 
aria-expanded="false" aria-label="Toggle navigation">
         <span class="navbar-toggler-icon"></span>
     </button>
 
diff --git 
a/grails-test-examples/spring-security/ldap/functional-test-app/build.gradle 
b/grails-test-examples/spring-security/ldap/functional-test-app/build.gradle
index cd84de6070..e244bf3d74 100644
--- a/grails-test-examples/spring-security/ldap/functional-test-app/build.gradle
+++ b/grails-test-examples/spring-security/ldap/functional-test-app/build.gradle
@@ -40,8 +40,8 @@ dependencies {
     implementation 'org.apache.grails:grails-layout'
 
     // 3rd party client-side assets bundled in webjars
-    implementation 'org.webjars:bootstrap:4.1.3'
-    implementation 'org.webjars:jquery:3.3.1'
+    implementation 'org.webjars:bootstrap:5.3.8'
+    implementation 'org.webjars:jquery:4.0.0'
 
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
diff --git 
a/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/assets/javascripts/application.js
 
b/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/assets/javascripts/application.js
index abf33100b5..ae77b46a6f 100644
--- 
a/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/assets/javascripts/application.js
+++ 
b/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/assets/javascripts/application.js
@@ -24,6 +24,6 @@
 // You're free to add application-wide JavaScript to this file, but it's 
generally better
 // to create separate JavaScript files as needed.
 //
-//= require webjars/jquery/3.3.1/jquery
-//= require webjars/bootstrap/4.1.3/js/bootstrap.bundle
+//= require webjars/jquery/4.0.0/jquery
+//= require webjars/bootstrap/5.3.8/js/bootstrap.bundle
 //= require_self
diff --git 
a/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/assets/stylesheets/application.css
 
b/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/assets/stylesheets/application.css
index 83d31ebbcc..0ae6f8edee 100644
--- 
a/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/assets/stylesheets/application.css
+++ 
b/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/assets/stylesheets/application.css
@@ -26,7 +26,7 @@
 * You're free to add application-wide styles to this file and they'll appear 
at the top of the
 * compiled file, but it's generally better to create a new file per style 
scope.
 *
-*= require webjars/bootstrap/4.1.3/css/bootstrap
+*= require webjars/bootstrap/5.3.8/css/bootstrap
 *= require grails
 *= require main
 *= require mobile
diff --git 
a/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/views/index.gsp
 
b/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/views/index.gsp
index d6eef452c1..4182776ea5 100644
--- 
a/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/views/index.gsp
+++ 
b/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/views/index.gsp
@@ -25,7 +25,7 @@
 <body>
 <content tag="nav">
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Application Status 
<span class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Application Status 
<span class="caret"></span></a>
         <ul class="dropdown-menu">
             <li class="dropdown-item"><a href="#">Environment: 
${grails.util.Environment.current.name}</a></li>
             <li class="dropdown-item"><a href="#">App profile: 
${grailsApplication.config.grails?.profile}</a></li>
@@ -43,7 +43,7 @@
         </ul>
     </li>
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Artefacts <span 
class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Artefacts <span 
class="caret"></span></a>
         <ul class="dropdown-menu">
             <li class="dropdown-item"><a href="#">Controllers: 
${grailsApplication.controllerClasses.size()}</a></li>
             <li class="dropdown-item"><a href="#">Domains: 
${grailsApplication.domainClasses.size()}</a></li>
@@ -52,7 +52,7 @@
         </ul>
     </li>
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins 
<span class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins 
<span class="caret"></span></a>
         <ul class="dropdown-menu">
             <g:each var="plugin" 
in="${applicationContext.getBean('pluginManager').allPlugins}">
                 <li class="dropdown-item"><a href="#">${plugin.name} - 
${plugin.version}</a></li>
diff --git 
a/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/views/layouts/main.gsp
 
b/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/views/layouts/main.gsp
index 311332f762..addbb8bc21 100644
--- 
a/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/views/layouts/main.gsp
+++ 
b/grails-test-examples/spring-security/ldap/functional-test-app/grails-app/views/layouts/main.gsp
@@ -36,7 +36,7 @@
 
 <nav class="navbar navbar-expand-lg navbar-dark navbar-static-top" 
role="navigation">
     <a class="navbar-brand" href="/#"><asset:image src="grails.svg" 
alt="Grails Logo"/></a>
-    <button class="navbar-toggler" type="button" data-toggle="collapse" 
data-target="#navbarContent" aria-controls="navbarContent" 
aria-expanded="false" aria-label="Toggle navigation">
+    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" 
data-bs-target="#navbarContent" aria-controls="navbarContent" 
aria-expanded="false" aria-label="Toggle navigation">
         <span class="navbar-toggler-icon"></span>
     </button>
 
diff --git 
a/grails-test-examples/spring-security/ldap/retrieve-db-roles/build.gradle 
b/grails-test-examples/spring-security/ldap/retrieve-db-roles/build.gradle
index 9021327e0c..32a8c71b87 100644
--- a/grails-test-examples/spring-security/ldap/retrieve-db-roles/build.gradle
+++ b/grails-test-examples/spring-security/ldap/retrieve-db-roles/build.gradle
@@ -38,8 +38,8 @@ dependencies {
     implementation 'org.apache.grails:grails-layout'
 
     // 3rd party client-side assets bundled in webjars
-    implementation 'org.webjars:bootstrap:4.1.3'
-    implementation 'org.webjars:jquery:3.3.1'
+    implementation 'org.webjars:bootstrap:5.3.8'
+    implementation 'org.webjars:jquery:4.0.0'
 
     // in-memory ldap server for testing
     implementation 'com.unboundid:unboundid-ldapsdk'
diff --git 
a/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/assets/javascripts/application.js
 
b/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/assets/javascripts/application.js
index abf33100b5..ae77b46a6f 100644
--- 
a/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/assets/javascripts/application.js
+++ 
b/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/assets/javascripts/application.js
@@ -24,6 +24,6 @@
 // You're free to add application-wide JavaScript to this file, but it's 
generally better
 // to create separate JavaScript files as needed.
 //
-//= require webjars/jquery/3.3.1/jquery
-//= require webjars/bootstrap/4.1.3/js/bootstrap.bundle
+//= require webjars/jquery/4.0.0/jquery
+//= require webjars/bootstrap/5.3.8/js/bootstrap.bundle
 //= require_self
diff --git 
a/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/assets/stylesheets/application.css
 
b/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/assets/stylesheets/application.css
index 83d31ebbcc..0ae6f8edee 100644
--- 
a/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/assets/stylesheets/application.css
+++ 
b/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/assets/stylesheets/application.css
@@ -26,7 +26,7 @@
 * You're free to add application-wide styles to this file and they'll appear 
at the top of the
 * compiled file, but it's generally better to create a new file per style 
scope.
 *
-*= require webjars/bootstrap/4.1.3/css/bootstrap
+*= require webjars/bootstrap/5.3.8/css/bootstrap
 *= require grails
 *= require main
 *= require mobile
diff --git 
a/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/views/index.gsp
 
b/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/views/index.gsp
index d6eef452c1..4182776ea5 100644
--- 
a/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/views/index.gsp
+++ 
b/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/views/index.gsp
@@ -25,7 +25,7 @@
 <body>
 <content tag="nav">
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Application Status 
<span class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Application Status 
<span class="caret"></span></a>
         <ul class="dropdown-menu">
             <li class="dropdown-item"><a href="#">Environment: 
${grails.util.Environment.current.name}</a></li>
             <li class="dropdown-item"><a href="#">App profile: 
${grailsApplication.config.grails?.profile}</a></li>
@@ -43,7 +43,7 @@
         </ul>
     </li>
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Artefacts <span 
class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Artefacts <span 
class="caret"></span></a>
         <ul class="dropdown-menu">
             <li class="dropdown-item"><a href="#">Controllers: 
${grailsApplication.controllerClasses.size()}</a></li>
             <li class="dropdown-item"><a href="#">Domains: 
${grailsApplication.domainClasses.size()}</a></li>
@@ -52,7 +52,7 @@
         </ul>
     </li>
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins 
<span class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins 
<span class="caret"></span></a>
         <ul class="dropdown-menu">
             <g:each var="plugin" 
in="${applicationContext.getBean('pluginManager').allPlugins}">
                 <li class="dropdown-item"><a href="#">${plugin.name} - 
${plugin.version}</a></li>
diff --git 
a/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/views/layouts/main.gsp
 
b/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/views/layouts/main.gsp
index 311332f762..addbb8bc21 100644
--- 
a/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/views/layouts/main.gsp
+++ 
b/grails-test-examples/spring-security/ldap/retrieve-db-roles/grails-app/views/layouts/main.gsp
@@ -36,7 +36,7 @@
 
 <nav class="navbar navbar-expand-lg navbar-dark navbar-static-top" 
role="navigation">
     <a class="navbar-brand" href="/#"><asset:image src="grails.svg" 
alt="Grails Logo"/></a>
-    <button class="navbar-toggler" type="button" data-toggle="collapse" 
data-target="#navbarContent" aria-controls="navbarContent" 
aria-expanded="false" aria-label="Toggle navigation">
+    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" 
data-bs-target="#navbarContent" aria-controls="navbarContent" 
aria-expanded="false" aria-label="Toggle navigation">
         <span class="navbar-toggler-icon"></span>
     </button>
 
diff --git 
a/grails-test-examples/spring-security/ldap/retrieve-group-roles/build.gradle 
b/grails-test-examples/spring-security/ldap/retrieve-group-roles/build.gradle
index de683ed0e1..62e6575ec4 100644
--- 
a/grails-test-examples/spring-security/ldap/retrieve-group-roles/build.gradle
+++ 
b/grails-test-examples/spring-security/ldap/retrieve-group-roles/build.gradle
@@ -38,8 +38,8 @@ dependencies {
     implementation 'org.apache.grails:grails-layout'
 
     // 3rd party client-side assets bundled in webjars
-    implementation 'org.webjars:bootstrap:4.1.3'
-    implementation 'org.webjars:jquery:3.3.1'
+    implementation 'org.webjars:bootstrap:5.3.8'
+    implementation 'org.webjars:jquery:4.0.0'
 
     // to not depend on an external ldap server
     implementation 'com.unboundid:unboundid-ldapsdk'
diff --git 
a/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/assets/javascripts/application.js
 
b/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/assets/javascripts/application.js
index abf33100b5..ae77b46a6f 100644
--- 
a/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/assets/javascripts/application.js
+++ 
b/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/assets/javascripts/application.js
@@ -24,6 +24,6 @@
 // You're free to add application-wide JavaScript to this file, but it's 
generally better
 // to create separate JavaScript files as needed.
 //
-//= require webjars/jquery/3.3.1/jquery
-//= require webjars/bootstrap/4.1.3/js/bootstrap.bundle
+//= require webjars/jquery/4.0.0/jquery
+//= require webjars/bootstrap/5.3.8/js/bootstrap.bundle
 //= require_self
diff --git 
a/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/assets/stylesheets/application.css
 
b/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/assets/stylesheets/application.css
index 83d31ebbcc..0ae6f8edee 100644
--- 
a/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/assets/stylesheets/application.css
+++ 
b/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/assets/stylesheets/application.css
@@ -26,7 +26,7 @@
 * You're free to add application-wide styles to this file and they'll appear 
at the top of the
 * compiled file, but it's generally better to create a new file per style 
scope.
 *
-*= require webjars/bootstrap/4.1.3/css/bootstrap
+*= require webjars/bootstrap/5.3.8/css/bootstrap
 *= require grails
 *= require main
 *= require mobile
diff --git 
a/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/views/index.gsp
 
b/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/views/index.gsp
index d6eef452c1..4182776ea5 100644
--- 
a/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/views/index.gsp
+++ 
b/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/views/index.gsp
@@ -25,7 +25,7 @@
 <body>
 <content tag="nav">
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Application Status 
<span class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Application Status 
<span class="caret"></span></a>
         <ul class="dropdown-menu">
             <li class="dropdown-item"><a href="#">Environment: 
${grails.util.Environment.current.name}</a></li>
             <li class="dropdown-item"><a href="#">App profile: 
${grailsApplication.config.grails?.profile}</a></li>
@@ -43,7 +43,7 @@
         </ul>
     </li>
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Artefacts <span 
class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Artefacts <span 
class="caret"></span></a>
         <ul class="dropdown-menu">
             <li class="dropdown-item"><a href="#">Controllers: 
${grailsApplication.controllerClasses.size()}</a></li>
             <li class="dropdown-item"><a href="#">Domains: 
${grailsApplication.domainClasses.size()}</a></li>
@@ -52,7 +52,7 @@
         </ul>
     </li>
     <li class="dropdown">
-        <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins 
<span class="caret"></span></a>
+        <a href="#" class="dropdown-toggle" data-bs-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins 
<span class="caret"></span></a>
         <ul class="dropdown-menu">
             <g:each var="plugin" 
in="${applicationContext.getBean('pluginManager').allPlugins}">
                 <li class="dropdown-item"><a href="#">${plugin.name} - 
${plugin.version}</a></li>
diff --git 
a/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/views/layouts/main.gsp
 
b/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/views/layouts/main.gsp
index 311332f762..addbb8bc21 100644
--- 
a/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/views/layouts/main.gsp
+++ 
b/grails-test-examples/spring-security/ldap/retrieve-group-roles/grails-app/views/layouts/main.gsp
@@ -36,7 +36,7 @@
 
 <nav class="navbar navbar-expand-lg navbar-dark navbar-static-top" 
role="navigation">
     <a class="navbar-brand" href="/#"><asset:image src="grails.svg" 
alt="Grails Logo"/></a>
-    <button class="navbar-toggler" type="button" data-toggle="collapse" 
data-target="#navbarContent" aria-controls="navbarContent" 
aria-expanded="false" aria-label="Toggle navigation">
+    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" 
data-bs-target="#navbarContent" aria-controls="navbarContent" 
aria-expanded="false" aria-label="Toggle navigation">
         <span class="navbar-toggler-icon"></span>
     </button>
 
diff --git 
a/grails-test-examples/spring-security/ui/extended/grails-app/views/user/edit.gsp
 
b/grails-test-examples/spring-security/ui/extended/grails-app/views/user/edit.gsp
index 2d810d887b..4435bf5b64 100644
--- 
a/grails-test-examples/spring-security/ui/extended/grails-app/views/user/edit.gsp
+++ 
b/grails-test-examples/spring-security/ui/extended/grails-app/views/user/edit.gsp
@@ -68,7 +68,7 @@
 </g:if>
 <s2ui:documentReady>
        $("#runAsButton").button();
-       $('#runAsButton').bind('click', function() {
+       $('#runAsButton').on('click', function() {
                document.forms.runAsForm.submit();
        });
 </s2ui:documentReady>
diff --git 
a/grails-test-examples/spring-security/ui/simple/grails-app/views/securityInfo/config.gsp
 
b/grails-test-examples/spring-security/ui/simple/grails-app/views/securityInfo/config.gsp
index a1db1d20cc..e9140d54d4 100644
--- 
a/grails-test-examples/spring-security/ui/simple/grails-app/views/securityInfo/config.gsp
+++ 
b/grails-test-examples/spring-security/ui/simple/grails-app/views/securityInfo/config.gsp
@@ -53,7 +53,7 @@ if (value instanceof Class) {
                </tbody>
        </table>
 </div>
-<s2ui:deferredScript src='webjars/datatables/1.10.25/js/jquery.dataTables.js'/>
+<s2ui:deferredScript src='webjars/datatables/2.3.0/js/dataTables.js'/>
 <s2ui:documentReady>
 $('#config').DataTable();
 </s2ui:documentReady>
diff --git 
a/grails-test-examples/spring-security/ui/simple/grails-app/views/user/edit.gsp 
b/grails-test-examples/spring-security/ui/simple/grails-app/views/user/edit.gsp
index 2d810d887b..4435bf5b64 100644
--- 
a/grails-test-examples/spring-security/ui/simple/grails-app/views/user/edit.gsp
+++ 
b/grails-test-examples/spring-security/ui/simple/grails-app/views/user/edit.gsp
@@ -68,7 +68,7 @@
 </g:if>
 <s2ui:documentReady>
        $("#runAsButton").button();
-       $('#runAsButton').bind('click', function() {
+       $('#runAsButton').on('click', function() {
                document.forms.runAsForm.submit();
        });
 </s2ui:documentReady>


Reply via email to