From d564731f20a5eee6c6e373344a2bd6fc9d047e63 Mon Sep 17 00:00:00 2001 From: Ralf Koller <1665422+rpkoller@users.noreply.github.com> Date: Mon, 9 Sep 2024 17:55:58 +0200 Subject: [PATCH] Dialog: Add option to put the dialog title in a header element Implement a new option: `uiDialogTitleHeadingLevel`, allowing to change the `span` wrapping the dialog title into a heading element (`h1`-`h6`). Value `0` represents the `span`, values 1-6 - a heading at the specified level. Fixes gh-2271 Closes gh-2275 --- tests/unit/dialog/common-deprecated.js | 1 + tests/unit/dialog/common.js | 1 + tests/unit/dialog/core.js | 38 ++++++++++++++++++++++++++ ui/widgets/dialog.js | 9 +++++- 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/tests/unit/dialog/common-deprecated.js b/tests/unit/dialog/common-deprecated.js index 1efdcb03018..2cdae9681d8 100644 --- a/tests/unit/dialog/common-deprecated.js +++ b/tests/unit/dialog/common-deprecated.js @@ -34,6 +34,7 @@ common.testWidget( "dialog", { resizable: true, show: null, title: null, + uiDialogTitleHeadingLevel: 0, width: 300, // Callbacks diff --git a/tests/unit/dialog/common.js b/tests/unit/dialog/common.js index c8d885ad03f..f3118104760 100644 --- a/tests/unit/dialog/common.js +++ b/tests/unit/dialog/common.js @@ -33,6 +33,7 @@ common.testWidget( "dialog", { resizable: true, show: null, title: null, + uiDialogTitleHeadingLevel: 0, width: 300, // Callbacks diff --git a/tests/unit/dialog/core.js b/tests/unit/dialog/core.js index c6bdec778c1..a8cc9678e53 100644 --- a/tests/unit/dialog/core.js +++ b/tests/unit/dialog/core.js @@ -117,6 +117,44 @@ QUnit.test( "aria-modal", function( assert ) { element.remove(); } ); +QUnit.test( "ui dialog title heading level", function( assert ) { + assert.expect( 8 ); + + var element, nodeName; + + element = $( "
" ).dialog( { modal: true } ); + nodeName = element.dialog( "widget" ).find( ".ui-dialog-title" ).get( 0 ).nodeName.toLowerCase(); + assert.equal( nodeName, "span", "Element wrapping the dialog title is span" ); + + element = $( "
" ).dialog( { modal: true, uiDialogTitleHeadingLevel: 0 } ); + nodeName = element.dialog( "widget" ).find( ".ui-dialog-title" ).get( 0 ).nodeName.toLowerCase(); + assert.equal( nodeName, "span", "Element wrapping the dialog title is span" ); + + element = $( "
" ).dialog( { modal: true, uiDialogTitleHeadingLevel: 1 } ); + nodeName = element.dialog( "widget" ).find( ".ui-dialog-title" ).get( 0 ).nodeName.toLowerCase(); + assert.equal( nodeName, "h1", "Element wrapping the dialog title is h1" ); + + element = $( "
" ).dialog( { modal: true, uiDialogTitleHeadingLevel: 6 } ); + nodeName = element.dialog( "widget" ).find( ".ui-dialog-title" ).get( 0 ).nodeName.toLowerCase(); + assert.equal( nodeName, "h6", "Element wrapping the dialog title is h6" ); + + element = $( "
" ).dialog( { modal: true, uiDialogTitleHeadingLevel: 9 } ); + nodeName = element.dialog( "widget" ).find( ".ui-dialog-title" ).get( 0 ).nodeName.toLowerCase(); + assert.equal( nodeName, "span", "Element wrapping the dialog title is span" ); + + element = $( "
" ).dialog( { modal: true, uiDialogTitleHeadingLevel: -9 } ); + nodeName = element.dialog( "widget" ).find( ".ui-dialog-title" ).get( 0 ).nodeName.toLowerCase(); + assert.equal( nodeName, "span", "Element wrapping the dialog title is span" ); + + element = $( "
" ).dialog( { modal: true, uiDialogTitleHeadingLevel: 2.3 } ); + nodeName = element.dialog( "widget" ).find( ".ui-dialog-title" ).get( 0 ).nodeName.toLowerCase(); + assert.equal( nodeName, "span", "Element wrapping the dialog title is span" ); + + element = $( "
" ).dialog( { modal: true, uiDialogTitleHeadingLevel: "foo" } ); + nodeName = element.dialog( "widget" ).find( ".ui-dialog-title" ).get( 0 ).nodeName.toLowerCase(); + assert.equal( nodeName, "span", "Element wrapping the dialog title is span" ); +} ); + QUnit.test( "widget method", function( assert ) { assert.expect( 1 ); var dialog = $( "
" ).appendTo( "#qunit-fixture" ).dialog(); diff --git a/ui/widgets/dialog.js b/ui/widgets/dialog.js index 756ad1cb10b..1ef2fa3d6f4 100644 --- a/ui/widgets/dialog.js +++ b/ui/widgets/dialog.js @@ -81,6 +81,7 @@ $.widget( "ui.dialog", { resizable: true, show: null, title: null, + uiDialogTitleHeadingLevel: 0, width: 300, // Callbacks @@ -437,7 +438,13 @@ $.widget( "ui.dialog", { } } ); - uiDialogTitle = $( "" ).uniqueId().prependTo( this.uiDialogTitlebar ); + var uiDialogHeadingLevel = Number.isInteger( this.options.uiDialogTitleHeadingLevel ) && + this.options.uiDialogTitleHeadingLevel > 0 && + this.options.uiDialogTitleHeadingLevel <= 6 ? + "h" + this.options.uiDialogTitleHeadingLevel : "span"; + + uiDialogTitle = $( "<" + uiDialogHeadingLevel + ">" ) + .uniqueId().prependTo( this.uiDialogTitlebar ); this._addClass( uiDialogTitle, "ui-dialog-title" ); this._title( uiDialogTitle );