]> source.dussan.org Git - jquery-ui.git/commitdiff
Controlgroup: Inital commit of new widget
authorAlexander Schmitz <arschmitz@gmail.com>
Sat, 23 Aug 2014 03:39:35 +0000 (23:39 -0400)
committerAlexander Schmitz <arschmitz@gmail.com>
Wed, 7 Oct 2015 14:57:59 +0000 (10:57 -0400)
This widget replaces the buttonset widget

19 files changed:
demos/button/icons.html
demos/controlgroup/default.html
demos/controlgroup/index.html
demos/controlgroup/splitbutton.html
demos/controlgroup/toolbar.html
demos/index.html
demos/tooltip/video-player.html
tests/unit/controlgroup/common.js [new file with mode: 0644]
tests/unit/controlgroup/controlgroup.html [new file with mode: 0644]
tests/unit/controlgroup/controlgroup_core.js
tests/unit/controlgroup/core.js [new file with mode: 0644]
tests/unit/controlgroup/methods.js [new file with mode: 0644]
tests/unit/controlgroup/options.js [new file with mode: 0644]
tests/unit/index.html
themes/base/base.css
themes/base/button.css
themes/base/controlgroup.css [new file with mode: 0644]
ui/.DS_Store [new file with mode: 0644]
ui/controlgroup.js [new file with mode: 0644]

index f0b0f90fb57227ad365432c14e1f5d42cad99059..a8deca9cd6ff5fdd29e2f2977a310f90e41a9285 100644 (file)
@@ -41,6 +41,7 @@
        <button>Button with icon on the right</button>
        <button>Button with icon on the top</button>
        <button>Button with icon on the bottom</button>
+       <button>Button with icon on the top</button>
 </div>
 <div class="css">
        <h1>CSS</h1>
index 9e4bcdd80efa12c641c52732220417674842f4d9..0fc9635379da90cfa1c7ba7bc9e9734e0d772bae 100644 (file)
        <link rel="stylesheet" href="../demos.css">
        <script>
        $(function() {
-               $( ".controlgroup" ).eq( 0 ).controlgroup()
-                       .end().eq( 1 ).controlgroup({
-                               "direction": "vertical"
-                       });
+               $( ".controlgroup" ).controlgroup()
+               $( ".controlgroup-vertical" ).controlgroup({
+                       "direction": "vertical"
+               });
        });
        </script>
        <style>
                .ui-controlgroup-vertical {
-                       width: 300px;
-               }
-               .ui-controlgroup-vertical select {
-                       width: 100%;
+                       width: 150px;
                }
                .ui-controlgroup.ui-controlgroup-vertical > button.ui-button {
                        text-align: center;
@@ -35,9 +32,6 @@
        </style>
 </head>
 <body>
-<div class="demo-description">
-<p>A Controlgroup featuring various form controls</p>
-</div>
 <div class="widget">
        <h1>Controlgroup</h1>
        <fieldset>
@@ -64,7 +58,7 @@
        <br/>
        <fieldset>
                <legend>Rental Car</legend>
-               <div class="controlgroup-horizontal">
+               <div class="controlgroup-vertical">
                        <select>
                                <option>Compact car</option>
                                <option>Midsize car</option>
@@ -83,8 +77,9 @@
                        <button>Book Now!</button>
                </div>
        </fieldset>
->>>>>>> 423b976... Checkboxradio: Fixed demos and tests
 </div>
-
+<div class="demo-description">
+<p>A controlgroup featuring various form controls. The first features a horizontal toolbar like orientation, the second is in a space saving vertical orientation for usages like mobile devices and panels.</p>
+</div>
 </body>
 </html>
index 58e2f7eda7a3ce8bfe9b497455ffe357c3035425..5aa4f5fd6a08de717a4049fc829c181f4f4f6e23 100644 (file)
@@ -3,7 +3,7 @@
 <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
-       <title>jQuery UI Checkboxradio Demos</title>
+       <title>jQuery UI Controlgroup Demos</title>
 </head>
 <body>
 
index 5d4c7b3ce55c6d2f89e5e5a2315bee27d9cf3284..a72cefd96de79c9283fb3c61391d8fad25eaa28b 100644 (file)
                $( "select" ).selectmenu({
                        classes: {
                                "ui-selectmenu-button": "ui-button-icon-only"
+                       },
+                       change: function(){
+                               $( ".output" ).append( "<li>" + this.value + "</li>" );
                        }
-               }).selectmenu( "widget" ).removeClass( "ui-icon-end" );
-               $( ".controlgroup" ).controlgroup();
-               $( "select" ).on( "selectmenuchange", function(){
-                       alert( this.value );
                });
+               $( ".controlgroup" ).controlgroup();
                $( "button" ).click(function() {
-                       alert( "Running the last action" );
+                       $( ".output" ).append( "<li>Running Last Action...</li>" );
                });
        });
        </script>
-       <style>
-               select {
-                       width: 2em;
-               }
-       </style>
 </head>
 <body>
-<div class="demo-description">
-<p>A Controlgroup creating a split button</p>
-</div>
 <div class="widget">
        <h1>Split button</h1>
        <div class="controlgroup">
                        <option>Delete</option>
                </select>
        </div>
+       <br/>
+       <h3>Output:</h3>
+       <ul class="output"></ul>
 </div>
 <div class="demo-description">
-       <p>A Controlgroup creating a split button</p>
+       <p>A controlgroup creating a split button, by combining a button and a selectmenu. We adjust the classes option on the selectmenu to show only the icon</p>
 </div>
 </body>
 </html>
index f90fb304009b7337662184a881d1afee1d66369a..fb3172418ffab9f0ec41af171c4acfdf86aceaf8 100644 (file)
                var iframe = $( "<iframe id='display' contenteditable='true'>" ),
                        contents = iframe.appendTo( "body" );
 
-               // Firefox and IE require us to wait for next tick before interacting with the iframe
+               // Support: Firefox <= 36, IE <= 11
+               // These browsers require us to wait for next tick before interacting with the iframe
                setTimeout(function(){
 
-                       contents = contents.contents()
+                       contents = contents.contents();
                        contents[ 0 ].designMode = "On";
                        contents[ 0 ].contenteditable = true;
                        contents.find( "body" ).append( $( "#input" ).clone().attr( "id", "output" ) );
@@ -43,7 +44,7 @@
                                contents[ 0 ].execCommand( this.id );
                        });
                        $( "#fontsize, #forecolor, #hilitecolor, #backcolor, #fontname" ).on( "change selectmenuchange", function() {
-                               contents[ 0 ].execCommand( this.id ,false, $( this ).val() );
+                               contents[ 0 ].execCommand( this.idfalse, $( this ).val() );
                        });
                        $( ".toolbar" ).controlgroup();
                        $( "#zoom" ).on( "selectmenuchange", function() {
@@ -57,7 +58,7 @@
        </script>
        <style>
                #zoom, #fontsize {
-                       min-width:75px;
+                       min-width: 75px;
                }
                #input {
                        display: none;
        </style>
 </head>
 <body>
-<div class="demo-description">
-<p>A sample editor toolbar</p>
-<p>Highlight text and edit it using the buttons and dropdowns in the toolbar</p>
-</div>
-       <div class="toolbar">
-                       <button id="print">Print</button>
-                       <button id="undo">Undo</button>
-                       <button id="redo">Redo</button>
-                       <select id="zoom">
-                               <option>50%</option>
-                               <option>75%</option>
-                               <option>90%</option>
-                               <option selected>100%</option>
-                               <option>125%</option>
-                               <option>150%</option>
-                               <option>200%</option>
-                       </select>
-                       <select id="fontname">
-                               <option>Arial</option>
-                               <option>Comic Sans MS</option>
-                               <option>Courier New</option>
-                               <option>Georgia</option>
-                               <option>Impact</option>
-                               <option selected>Lucida Grande</option>
-                               <option>Times New Roman</option>
-                               <option>Verdana</option>
-                       </select>
-                       <select id="fontsize">
-                               <option value="1">8px</option>
-                               <option value="2">9px</option>
-                               <option value="3" selected>10px</option>
-                               <option value="4">11px</option>
-                               <option value="5">12px</option>
-                               <option value="6">14px</option>
-                               <option value="7">18px</option>
-                               <option value="8">24px</option>
-                               <option value="9">30px</option>
-                               <option value="10">36px</option>
-                       </select>
-                       <select id="hilitecolor">
-                               <option value="white">Highlight: None</option>
-                               <option value="red">Highlight: Red</option>
-                               <option value="yellow">Highlight: Yellow</option>
-                               <option value="green">Highlight: Green</option>
-                               <option value="blue">Highlight: Blue</option>
-                               <option value="grey">Highlight: Grey</option>
-                               <option value="purple">Highlight: Purple</option>
-                               <option value="orange">Highlight: Orange</option>
-                       </select>
-                       <select id="forecolor">
-                               <option value="white">Font: None</option>
-                               <option value="red">Font: Red</option>
-                               <option value="yellow">Font: Yellow</option>
-                               <option value="green">Font: Green</option>
-                               <option value="blue">Font: Blue</option>
-                               <option value="#ccc">Font: Grey</option>
-                               <option value="purple">Font: Purple</option>
-                               <option value="orange">Font: Orange</option>
-                       </select>
-                       <button id="bold">B</button>
-                       <button id="italic">I</button>
-                       <button id="underline">U</button>
+<div class="toolbar">
+               <button id="print">Print</button>
+               <button id="undo">Undo</button>
+               <button id="redo">Redo</button>
+               <select id="zoom">
+                       <option>50%</option>
+                       <option>75%</option>
+                       <option>90%</option>
+                       <option selected>100%</option>
+                       <option>125%</option>
+                       <option>150%</option>
+                       <option>200%</option>
+               </select>
+               <select id="fontname">
+                       <option>Arial</option>
+                       <option>Comic Sans MS</option>
+                       <option>Courier New</option>
+                       <option>Georgia</option>
+                       <option>Impact</option>
+                       <option selected>Lucida Grande</option>
+                       <option>Times New Roman</option>
+                       <option>Verdana</option>
+               </select>
+               <select id="fontsize">
+                       <option value="1">8px</option>
+                       <option value="2">9px</option>
+                       <option value="3" selected>10px</option>
+                       <option value="4">11px</option>
+                       <option value="5">12px</option>
+                       <option value="6">14px</option>
+                       <option value="7">18px</option>
+                       <option value="8">24px</option>
+                       <option value="9">30px</option>
+                       <option value="10">36px</option>
+               </select>
+               <select id="hilitecolor" title="Background color">
+                       <option value="white">Highlight: None</option>
+                       <option value="red">Highlight: Red</option>
+                       <option value="yellow">Highlight: Yellow</option>
+                       <option value="green">Highlight: Green</option>
+                       <option value="blue">Highlight: Blue</option>
+                       <option value="grey">Highlight: Grey</option>
+                       <option value="purple">Highlight: Purple</option>
+                       <option value="orange">Highlight: Orange</option>
+               </select>
+               <select id="forecolor">
+                       <option value="black" selected>Font: Black</option>
+                       <option value="white">Font: White</option>
+                       <option value="red">Font: Red</option>
+                       <option value="yellow">Font: Yellow</option>
+                       <option value="green">Font: Green</option>
+                       <option value="blue">Font: Blue</option>
+                       <option value="#ccc">Font: Grey</option>
+                       <option value="purple">Font: Purple</option>
+                       <option value="orange">Font: Orange</option>
+               </select>
+               <button id="bold">B</button>
+               <button id="italic">I</button>
+               <button id="underline">U</button>
 
-       </div>
-       <br/><br/>
+</div>
+<br/><br/>
 <pre id="input">
 The Rime of the Ancient Mariner (text of 1834)
 BY SAMUEL TAYLOR COLERIDGE
-Argument 
+Argument
 
 How a Ship having passed the Line was driven by storms to the cold Country towards the South Pole;
 and how from thence she made her course to the tropical Latitude of the Great Pacific Ocean; and 
@@ -252,5 +250,9 @@ From the fiends, that plague thee thus!—
 Why look'st thou so?'—With my cross-bow
 I shot the ALBATROSS.
 </pre>
+<div class="demo-description">
+       <p>A sample editor toolbar</p>
+       <p>Highlight text and edit it using the buttons and dropdowns in the toolbar</p>
+</div>
 </body>
 </html>
index 4b4d04e06b5d17c4c7e32db8fd5fa24b03855036..89375dde7041c7306df5b46474dd2d5a3a62dcda 100644 (file)
@@ -12,6 +12,7 @@
        <li><a href="autocomplete/">autocomplete</a></li>
        <li><a href="button/">button</a></li>
        <li><a href="checkboxradio/">checkboxradio</a></li>
+       <li><a href="controlgroup/">controlgroup</a></li>
        <li><a href="datepicker/">datepicker</a></li>
        <li><a href="dialog/">dialog</a></li>
        <li><a href="draggable/">draggable</a></li>
index cbcce3db0b6615e81a656ecfd288ac64fb9c808f..e1ebac24f3288e25b2c3e5e078cb54a7f760ea74 100644 (file)
@@ -35,7 +35,7 @@
        }
        </style>
        <script src="../../external/requirejs/require.js"></script>
-       <script src="../bootstrap.js" data-modules="button menu effect effect-blind">
+       <script src="../bootstrap.js" data-modules="button controlgroup menu effect effect-blind">
                function notify( input ) {
                        var msg = "Selected " + $.trim( input.data( "tooltip-title" ) || input.text() );
                        $( "<div>" )
                                notify( button );
                        });
                });
-               $( ".set" ).buttonset({
-                       items: "button"
+               $( ".set" ).controlgroup({
+                       items: {
+                               "button" : "button"
+                       }
                });
 
                $( "button.menu" )
diff --git a/tests/unit/controlgroup/common.js b/tests/unit/controlgroup/common.js
new file mode 100644 (file)
index 0000000..421e92e
--- /dev/null
@@ -0,0 +1,26 @@
+define( [
+       "lib/common",
+       "ui/controlgroup",
+       "ui/checkboxradio",
+       "ui/selectmenu",
+       "ui/button"
+], function( common ) {
+
+common.testWidget( "controlgroup", {
+       defaults: {
+               disabled: null,
+               items: {
+                       "button": "input[type=button], input[type=submit], input[type=reset], button, a",
+                       "checkboxradio": "input[type='checkbox'], input[type='radio']",
+                       "selectmenu": "select"
+               },
+               direction: "horizontal",
+               excludeInvisible: true,
+               classes: {},
+
+               // Callbacks
+               create: null
+       }
+});
+
+} );
diff --git a/tests/unit/controlgroup/controlgroup.html b/tests/unit/controlgroup/controlgroup.html
new file mode 100644 (file)
index 0000000..df77ed6
--- /dev/null
@@ -0,0 +1,39 @@
+<!doctype html>
+<html lang="en">
+<head>
+       <meta charset="utf-8">
+       <title>jQuery UI Controlgroup Test Suite</title>
+
+       <script src="../../../external/requirejs/require.js"></script>
+       <script src="../../lib/css.js" data-modules="core button checboxradio selectmenu controlgroup"></script>
+       <script src="../../lib/bootstrap.js" data-modules="common core methods options"></script>
+</head>
+<body>
+
+<div id="qunit"></div>
+<div id="qunit-fixture">
+       <div class="controlgroup">
+               <button style="display:none">Button with icon only</button>
+               <select>
+                       <option>Fast</option>
+                       <option>Medium</option>
+                       <option>Slow</option>
+               </select>
+               <label for="checkbox">Checkbox</label>
+               <input type="checkbox" value="checkbox" id="checkbox" />
+               <select>
+                       <option>Fast</option>
+                       <option>Medium</option>
+                       <option>Slow</option>
+               </select>
+               <div class="test"></div>
+               <button>Button with icon on the bottom</button>
+               <select>
+                       <option>Fast</option>
+                       <option>Medium</option>
+                       <option>Slow</option>
+               </select>
+       </div>
+</div>
+</body>
+</html>
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2177c767b87cc001379f845560bea8b84c143d22 100644 (file)
@@ -0,0 +1,77 @@
+module( "Controlgroup: Core" );
+
+function hasCornerClass( element ) {
+       return !!element.attr( "class" ).match( /ui-corner/g );
+}
+
+test( "selectmenu: open/close corners", function( assert ) {
+       expect( 1 );
+       var element = $( ".controlgroup" ).controlgroup(),
+               selects = element.find( "select" ),
+               selectButton = selects.eq( 0 ).selectmenu( "widget" );
+
+       expect( 12 );
+
+       selects.eq( 0 ).selectmenu( "open" );
+       assert.hasClasses( selectButton, "ui-corner-tl",
+               "Horizontal: First selectmenu gets ui-corner-tl when opened" );
+
+       selects.eq( 0 ).selectmenu( "close" );
+       assert.hasClasses( selectButton, "ui-corner-left",
+               "Horizontal: First selectmenu gets ui-corner-left when closed" );
+
+       selectButton = selects.eq( 1 ).selectmenu( "widget" );
+       selects.eq( 1 ).selectmenu( "open" );
+       strictEqual( hasCornerClass( selectButton ), false,
+               "Horizontal: Middle selectmenu does not get corner class when opened" );
+
+       selects.eq( 1 ).selectmenu( "close" );
+       strictEqual( hasCornerClass( selectButton ), false,
+               "Horizontal: Middle selectmenu does not get corner class when closed" );
+
+       selectButton = selects.eq( 2 ).selectmenu( "widget" );
+       selects.eq( 2 ).selectmenu( "open" );
+       assert.hasClasses( selectButton, "ui-corner-tr",
+               "Horizontal: Last selectmenu gets ui-corner-tr when opened" );
+
+       selects.eq( 2 ).selectmenu( "close" );
+       assert.hasClasses( selectButton, "ui-corner-right",
+               "Horizontal: Last selectmenu gets ui-corner-right when closed" );
+
+       element.controlgroup( "option", "direction", "vertical" );
+       selectButton = selects.eq( 0 ).selectmenu( "widget" );
+       selects.eq( 0 ).selectmenu( "open" );
+       assert.hasClasses( selectButton, "ui-corner-top",
+               "vertical: First selectmenu gets ui-corner-top when opened" );
+
+       selects.eq( 0 ).selectmenu( "close" );
+       assert.hasClasses( selectButton, "ui-corner-top",
+               "vertical: First selectmenu gets ui-corner-top when closed" );
+
+       selectButton = selects.eq( 1 ).selectmenu( "widget" );
+       selects.eq( 1 ).selectmenu( "open" );
+       strictEqual( hasCornerClass( selectButton ), false,
+               "vertical: Middle selectmenu does not get corner class when opened" );
+
+       selects.eq( 1 ).selectmenu( "close" );
+       strictEqual( hasCornerClass( selectButton ), false,
+               "vertical: Middle selectmenu does not get corner class when closed" );
+
+       selectButton = selects.eq( 2 ).selectmenu( "widget" );
+       selects.eq( 2 ).selectmenu( "open" );
+       strictEqual( hasCornerClass( selectButton ), false,
+               "vertical: Last selectmenu does not get corner class when opened" );
+
+       selects.eq( 2 ).selectmenu( "close" );
+       assert.hasClasses( selectButton, "ui-corner-bottom",
+               "vertical: Last selectmenu gets ui-corner-bottom when closed" );
+});
+test( "invisibles excluded from corner classes", function( assert ) {
+       expect( 2 );
+       var element = $( ".controlgroup" ).controlgroup(),
+               buttons = element.children( ".ui-button" );
+       strictEqual( hasCornerClass( buttons.eq( 0 ) ), false,
+               "ExcludeInvisible: true: Hidden first element does not get a corner class" );
+       assert.hasClasses( buttons.eq( 1 ), "ui-corner-left",
+               "ExcludeInvisible: true: First button is hidden second button get corner class" );
+});
\ No newline at end of file
diff --git a/tests/unit/controlgroup/core.js b/tests/unit/controlgroup/core.js
new file mode 100644 (file)
index 0000000..f84136b
--- /dev/null
@@ -0,0 +1,69 @@
+define( [
+       "jquery",
+       "ui/controlgroup",
+       "ui/checkboxradio",
+       "ui/selectmenu",
+       "ui/button"
+], function( $ ) {
+
+module( "Controlgroup: Core" );
+
+test( "selectmenu: open/close corners", function( assert ) {
+       expect( 1 );
+       var element = $( ".controlgroup" ).controlgroup(),
+               selects = element.find( "select" ),
+               selectButton = selects.eq( 0 ).selectmenu( "widget" );
+
+       expect( 12 );
+
+       selects.eq( 0 ).selectmenu( "open" );
+       assert.hasClasses( selectButton, "ui-corner-tl",
+               "Horizontal: First selectmenu gets ui-corner-tl when opened" );
+
+       selects.eq( 0 ).selectmenu( "close" );
+       assert.hasClasses( selectButton, "ui-corner-left",
+               "Horizontal: First selectmenu gets ui-corner-left when closed" );
+
+       selectButton = selects.eq( 1 ).selectmenu( "widget" );
+       selects.eq( 1 ).selectmenu( "open" );
+       assert.lacksClassStart( selectButton, "ui-corner" );
+
+       selects.eq( 1 ).selectmenu( "close" );
+       assert.lacksClassStart( selectButton, "ui-corner" );
+
+       selectButton = selects.eq( 2 ).selectmenu( "widget" );
+       selects.eq( 2 ).selectmenu( "open" );
+       assert.hasClasses( selectButton, "ui-corner-tr",
+               "Horizontal: Last selectmenu gets ui-corner-tr when opened" );
+
+       selects.eq( 2 ).selectmenu( "close" );
+       assert.hasClasses( selectButton, "ui-corner-right",
+               "Horizontal: Last selectmenu gets ui-corner-right when closed" );
+
+       element.controlgroup( "option", "direction", "vertical" );
+       selectButton = selects.eq( 0 ).selectmenu( "widget" );
+       selects.eq( 0 ).selectmenu( "open" );
+       assert.hasClasses( selectButton, "ui-corner-top",
+               "vertical: First selectmenu gets ui-corner-top when opened" );
+
+       selects.eq( 0 ).selectmenu( "close" );
+       assert.hasClasses( selectButton, "ui-corner-top",
+               "vertical: First selectmenu gets ui-corner-top when closed" );
+
+       selectButton = selects.eq( 1 ).selectmenu( "widget" );
+       selects.eq( 1 ).selectmenu( "open" );
+       assert.lacksClassStart( selectButton, "ui-corner" );
+
+       selects.eq( 1 ).selectmenu( "close" );
+       assert.lacksClassStart( selectButton, "ui-corner" );
+
+       selectButton = selects.eq( 2 ).selectmenu( "widget" );
+       selects.eq( 2 ).selectmenu( "open" );
+       assert.lacksClassStart( selectButton, "ui-corner" );
+
+       selects.eq( 2 ).selectmenu( "close" );
+       assert.hasClasses( selectButton, "ui-corner-bottom",
+               "vertical: Last selectmenu gets ui-corner-bottom when closed" );
+});
+
+} );
diff --git a/tests/unit/controlgroup/methods.js b/tests/unit/controlgroup/methods.js
new file mode 100644 (file)
index 0000000..c691e4c
--- /dev/null
@@ -0,0 +1,150 @@
+define( [
+       "jquery",
+       "ui/controlgroup",
+       "ui/checkboxradio",
+       "ui/selectmenu",
+       "ui/button"
+], function( $ ) {
+
+module( "Controlgroup: methods" );
+
+test( "destroy", function( assert ) {
+       expect( 1 );
+       assert.domEqual( ".controlgroup", function() {
+               $( ".controlgroup" ).controlgroup().controlgroup( "destroy" );
+       });
+});
+test( "disable", function( assert ) {
+       expect( 2 );
+       var element = $( ".controlgroup" ).controlgroup().controlgroup( "disable" );
+       assert.lacksClasses( element, "ui-state-disabled",
+               "The widget does not get the disabled class, because we disable each child widget" );
+       strictEqual( element.find( ".ui-state-disabled" ).length, 6,
+               "Child widgets are disabled" );
+});
+
+test( "enable", function( assert ) {
+       expect( 2 );
+       var element = $( ".controlgroup" ).controlgroup().controlgroup( "enable" );
+       assert.lacksClasses( element, "ui-state-disabled",
+               "ui-state-disabled is not present on widget after enabling" );
+       strictEqual( element.find( "ui-state-disabled" ).length, 0,
+               "Child widgets are disabled" );
+});
+
+var tests = {
+               "checkboxradio": "<input type='checkbox'>",
+               "selectmenu": "<select><option>foo</option></select>",
+               "button": "<button>"
+       },
+       orientations = {
+               "horizontal": [
+                       "ui-corner-left",
+                       false,
+                       false,
+                       "ui-corner-right"
+               ],
+               "vertical": [
+                       "ui-corner-top",
+                       false,
+                       false,
+                       "ui-corner-bottom"
+               ]
+       };
+
+// Iterate through supported element markup
+$.each( tests, function( widget, html ) {
+
+       // Check in both horizontal and vertical orientations
+       $.each( orientations, function( name, classes ) {
+
+               test( "refresh: " + widget + ": " + name, function( assert ) {
+                       expect( 41 );
+
+                       var i, control, currentClasses,
+                               controls = [],
+                               element = $( "<div>" ).controlgroup({
+                                       direction: name
+                               }).appendTo( "body" );
+
+                       // checks the elements with in the controlgroup against the expected class list
+                       function checkCornerClasses( classList ) {
+                               for ( var j = 0; j < 4; j++ ) {
+                                       if ( classList[ j ] ) {
+                                               assert.hasClasses( controls[ j ][ widget ]( "widget" ), classList[ j ] );
+                                       } else {
+                                               assert.lacksClassStart( controls[ j ][ widget ]( "widget" ), "ui-corner" );
+                                       }
+                               }
+                       }
+
+                       function showElements( index, value ) {
+                               $( value )[ widget ]( "widget" ).show();
+                       }
+
+                       // Hide each element and check the corner classes
+                       function iterateHidden( excludeInvisible ) {
+                               for ( i = 0; i < 4; i++ ) {
+
+                                       $( controls ).each( showElements );
+
+                                       controls[ i ][ widget ]( "widget" ).hide();
+
+                                       currentClasses = classes.slice( 0 );
+                                       if ( excludeInvisible ) {
+                                               if ( i === 0 ) {
+                                                       currentClasses[ i + 1 ] = classes[ i ];
+                                                       currentClasses[ i ] = false;
+                                               } else if ( i === 3 ) {
+                                                       currentClasses[ i - 1 ] = classes[ i ];
+                                                       currentClasses[ i ] = false;
+                                               }
+                                       }
+                                       element.controlgroup( "refresh" );
+                                       checkCornerClasses( currentClasses );
+                               }
+                       }
+
+                       // Add a label for each element and then append the element to the control group
+                       for ( i = 0; i < 4; i++ ) {
+                               control = $( html ).attr( "id", "id" + i )
+                                       .add( $( "<label>" ).clone().attr( "for", "id" + i ) );
+
+                               controls.push( control );
+                               element.append( control );
+                       }
+
+                       // Refresh the controlgroup now that its populated
+                       element.controlgroup( "refresh" );
+                       for ( i = 0; i < 4; i++ ) {
+                               strictEqual( controls[ i ].is( ":ui-" + widget ), true,
+                                       name + ": " + widget + " " + i + ": is a " + widget + " widget" );
+                       }
+
+                       // Check that we have the right classes
+                       checkCornerClasses( classes );
+
+                       // hide each element and then check its classes
+                       iterateHidden( true );
+
+                       // Set the exclude option to false so we no longer care about hidden
+                       element.controlgroup( "option", "excludeInvisible", false );
+
+                       // Iterate hiding the elements again and check their corner classes
+                       iterateHidden();
+
+                       // Disable the first control
+                       controls[ 0 ].prop( "disabled", true );
+
+                       element.controlgroup( "refresh" );
+
+                       assert.hasClasses( controls[ 0 ][ widget ]( "widget" ), "ui-state-disabled" );
+
+                       // remove the controlgroup before we start the next set
+                       element.remove();
+
+               });
+       });
+});
+
+} );
diff --git a/tests/unit/controlgroup/options.js b/tests/unit/controlgroup/options.js
new file mode 100644 (file)
index 0000000..8237538
--- /dev/null
@@ -0,0 +1,108 @@
+define( [
+       "jquery",
+       "ui/controlgroup",
+       "ui/checkboxradio",
+       "ui/selectmenu",
+       "ui/button"
+], function( $ ) {
+
+module( "Controlgroup: options" );
+
+test( "disabled", function( assert ) {
+       expect( 4 );
+       var element = $( ".controlgroup" ).controlgroup().controlgroup( "option", "disabled", true );
+       assert.lacksClasses( element, "ui-state-disabled" );
+       equal( element.find( ".ui-state-disabled" ).length, 6, "Child widgets are disabled" );
+
+       element.controlgroup( "option", "disabled", false );
+       assert.lacksClasses( element, "ui-state-disabled" );
+       strictEqual( element.find( ".ui-state-disabled" ).length, 0, "Child widgets are not disabled" );
+
+});
+
+test( "items - null", function() {
+       expect( 2 );
+       var element = $( ".controlgroup" ).controlgroup({
+               items: {
+                       "button": null,
+                       "selectmenu": null,
+                       "checkboxradio": null
+               }
+       });
+
+       strictEqual( element.children( ".ui-button" ).length, 0,
+               "Child widgets are not called when selector is null" );
+
+       element.controlgroup( "option", "items", {
+               "button": "button"
+       });
+       strictEqual( element.children( ".ui-button" ).length, 2,
+               "Correct child widgets are called when selector is updated" );
+});
+
+test( "items: custom selector", function() {
+       expect( 1 );
+       var element = $( ".controlgroup" ).controlgroup({
+               items: {
+                       "button": ".button"
+               }
+       });
+       strictEqual( element.children( ".ui-button" ).length, 4,
+               "Correct child widgets are called when custom selector used" );
+});
+
+$.widget( "ui.test", {
+       _create: function (){
+               this.element.addClass( "ui-test ui-button" );
+       },
+
+       // Controlgroup requires a refresh method to exist
+       refresh: $.noop
+});
+test( "items: custom widget", function() {
+       expect( 2 );
+       var element = $( ".controlgroup" ).controlgroup({
+               items: {
+                       "test": ".test"
+               }
+       });
+
+       strictEqual( element.children( ".ui-button" ).length, 7,
+               "Correct child widgets are called when custom selector used" );
+       strictEqual( element.children( ".ui-test" ).length, 1,
+               "Custom widget called" );
+});
+
+test( "excludeInvisible", function( assert ) {
+       expect( 4 );
+       var element = $( ".controlgroup" ).controlgroup({
+                       excludeInvisible: false
+               }),
+               buttons = element.children( ".ui-button" );
+
+       assert.lacksClassStart( buttons.eq( 1 ), "ui-corner" );
+       assert.hasClasses( buttons.eq( 0 ), "ui-corner-left",
+               "ExcludeInvisible: false: First button hidden second button doesn't get a corner class" );
+
+       element.controlgroup( "option", "excludeInvisible", true );
+       assert.lacksClassStart( buttons.eq( 0 ), "ui-corner" );
+       assert.hasClasses( buttons.eq( 1 ), "ui-corner-left",
+               "ExcludeInvisible: true: First button is hidden second button get corner class" );
+});
+
+test( "direction", function( assert ) {
+       expect( 6 );
+       var element = $( ".controlgroup" ).controlgroup(),
+               buttons = element.children( ".ui-button" ).filter( ":visible" );
+
+       assert.hasClasses( element, "ui-controlgroup-horizontal" );
+       assert.hasClasses( buttons.first(), "ui-corner-left" );
+       assert.hasClasses( buttons.last(), "ui-corner-right" );
+
+       element.controlgroup( "option", "direction", "vertical" );
+       assert.hasClasses( element, "ui-controlgroup-vertical" );
+       assert.hasClasses( buttons.first(), "ui-corner-top" );
+       assert.hasClasses( buttons.last(), "ui-corner-bottom" );
+});
+
+} );
index fe358cb6c811bb5fd7edd83ce00d113a43eeaa20..091e39c4185328f5f0c673d6bdbba74ec431c0de 100644 (file)
@@ -41,6 +41,7 @@
                        <li><a href="autocomplete/autocomplete.html">Autocomplete</a></li>
                        <li><a href="button/button.html">Button</a></li>
                        <li><a href="checkboxradio/checkboxradio.html">Checkboxradio</a></li>
+                       <li><a href="controlgroup/controlgroup.html">Controlgroup</a></li>
                        <li><a href="datepicker/datepicker.html">Datepicker</a></li>
                        <li><a href="dialog/dialog.html">Dialog</a></li>
                        <li><a href="menu/menu.html">Menu</a></li>
index 7194eba275612298974414f60c521e721b1c5a15..3b33e9bc00106b5b3d19ef2c78a20fe5afbb78d8 100644 (file)
@@ -14,6 +14,7 @@
 @import url("autocomplete.css");
 @import url("button.css");
 @import url("checkboxradio.css");
+@import url("controlgroup.css");
 @import url("datepicker.css");
 @import url("dialog.css");
 @import url("draggable.css");
index fcbcda7bbe936e729b61018e38f7ce166b466ac6..599b5ea6a5540e6b479f3af40ffd3b41c4fa7d27 100644 (file)
@@ -56,6 +56,23 @@ input.ui-button.ui-button-icon-only {
        margin-left: -8px;
 }
 
+.ui-button.ui-icon-notext .ui-icon {
+       padding: 0;
+       width: 2.1em;
+       height: 2.1em;
+       text-indent: -9999px;
+       white-space: nowrap;
+
+}
+
+input.ui-button.ui-icon-notext .ui-icon {
+       width: auto;
+       height: auto;
+       text-indent: 0;
+       white-space: normal;
+       padding: .4em 1em;
+}
+
 /* workarounds */
 /* Support: FireFox >= 4 */
 input.ui-button::-moz-focus-inner,
diff --git a/themes/base/controlgroup.css b/themes/base/controlgroup.css
new file mode 100644 (file)
index 0000000..befbdfe
--- /dev/null
@@ -0,0 +1,30 @@
+/*!
+ * jQuery UI Controlgroup @VERSION
+ * http://jqueryui.com
+ *
+ * Copyright 2013 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/controlgroup/#theming
+ */
+
+.ui-controlgroup {
+       vertical-align: middle;
+}
+.ui-controlgroup > .ui-button {
+       float: left;
+       margin-left: 0;
+       margin-right: 0;
+}
+.ui-controlgroup-vertical > .ui-button {
+       display: block;
+       float: none;
+       width: 100%;
+       margin-top: 0;
+       margin-bottom: 0;
+       text-align: left;
+}
+.ui-controlgroup-vertical label.ui-button {
+       box-sizing: border-box;
+}
\ No newline at end of file
diff --git a/ui/.DS_Store b/ui/.DS_Store
new file mode 100644 (file)
index 0000000..94db3a5
Binary files /dev/null and b/ui/.DS_Store differ
diff --git a/ui/controlgroup.js b/ui/controlgroup.js
new file mode 100644 (file)
index 0000000..effe42d
--- /dev/null
@@ -0,0 +1,205 @@
+/*!
+ * jQuery UI Controlgroup @VERSION
+ * http://jqueryui.com
+ *
+ * Copyright 2014 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/controlgroup/
+ */
+( function( factory ) {
+       if ( typeof define === "function" && define.amd ) {
+
+               // AMD. Register as an anonymous module.
+               define( [
+                       "jquery",
+                       "./core",
+                       "./widget"
+               ], factory );
+       } else {
+
+               // Browser globals
+               factory( jQuery );
+       }
+}( function( $ ) {
+
+return $.widget( "ui.controlgroup", {
+       version: "@VERSION",
+       defaultElement: "<div>",
+       options: {
+               disabled: null,
+               items: {
+                       "button": "input[type=button], input[type=submit], input[type=reset], button, a",
+                       "checkboxradio": "input[type='checkbox'], input[type='radio']",
+                       "selectmenu": "select"
+               },
+               direction: "horizontal",
+               excludeInvisible: true
+       },
+
+       _create: function() {
+               this._enhance();
+       },
+
+       // To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
+       _enhance: function() {
+               this.element.attr( "role", "toolbar" );
+               this.refresh();
+       },
+
+       _destroy: function() {
+               this._callChildMethod( "destroy" );
+               this.childWidgets.removeData( "ui-controlgroup-data" );
+               this.element.removeAttr( "role" );
+       },
+
+       _initWidgets: function() {
+               var that = this,
+                       childWidgets = [];
+
+               // First we iterate over each of the items options
+               $.each( this.options.items, function( widget, selector ) {
+                       var widgets,
+                               options = {};
+
+                       // We assume everything is in the middle to start because we can't determine
+                       // first / last elements until all enhancments are done.
+                       if ( that[ "_" + widget + "_options" ] ) {
+                               options = that[ "_" + widget + "_options" ]( "middle" );
+                       }
+
+                       // Make sure the widget actually exists and has a selector set
+                       if ( $.fn[ widget ] && selector ) {
+
+                               // Find instances of this widget inside controlgroup and run method or set options
+                               widgets = that.element.find( selector )[ widget ]( options );
+
+                               // Don't set data or add to the collection if the method is destroy
+                               widgets.each( function() {
+
+                                       // Set data on the widget element pointing to the this.element of the widget
+                                       // and telling us what type of widget this is
+                                       var widgetElement =
+                                               $( this )[ widget ]( "widget" ).data( "ui-controlgroup-data", {
+                                                       "widgetType": widget,
+                                                       "element": $( this )
+                                               } );
+
+                                       childWidgets.push( widgetElement[ 0 ] );
+                               } );
+                       }
+               } );
+
+               this.childWidgets = $( $.unique( childWidgets ) );
+       },
+
+       _callChildMethod: function( method ) {
+               this.childWidgets.each( function() {
+                       var element = $( this ),
+                               data = element.data( "ui-controlgroup-data" );
+
+                       data.element[ data.widgetType ]( method );
+               } );
+       },
+
+       _buildSimpleOptions: function( position, direction, key ) {
+               var result = {
+                       classes: {}
+               };
+               result.classes[ key ] = {
+                       "middle": null,
+                       "first": "ui-corner-" + ( direction ? "top" : "left" ),
+                       "last": "ui-corner-" + ( direction ? "bottom" : "right" )
+               }[ position ];
+
+               return result;
+       },
+
+       _button_options: function( position, direction ) {
+               return this._buildSimpleOptions( position, direction, "ui-button" );
+       },
+
+       _checkboxradio_options: function( position, direction ) {
+               return this._buildSimpleOptions( position, direction, "ui-checkboxradio-label" );
+       },
+
+       _selectmenu_options: function( position, direction ) {
+               return {
+                       width: direction ? "auto" : false,
+                       classes: {
+                               middle: {
+                                       "ui-selectmenu-button-open": null,
+                                       "ui-selectmenu-button-closed": null
+                               },
+                               first: {
+                                       "ui-selectmenu-button-open":
+                                       "ui-corner-" + ( direction ? "top" : "tl" ),
+                                       "ui-selectmenu-button-closed":
+                                       "ui-corner-" + ( direction ? "top" : "left" )
+                               },
+                               last: {
+                                       "ui-selectmenu-button-open":
+                                       direction ? null : "ui-corner-tr",
+                                       "ui-selectmenu-button-closed":
+                                       "ui-corner-" + ( direction ? "bottom" : "right" )
+                               }
+
+                       }[ position ]
+               };
+       },
+
+       _setOption: function( key, value ) {
+               if ( key === "direction" ) {
+                       this._removeClass( "ui-controlgroup-" + this.options.direction );
+               }
+
+               this._super( key, value );
+               if ( key === "disabled" ) {
+                       this._callChildMethod( value ? "disable" : "enable" );
+                       return;
+               }
+
+               this.refresh();
+       },
+
+       refresh: function() {
+               var children,
+                       that = this;
+
+               this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
+
+               if ( this.options.direction === "horizontal" ) {
+                       this._addClass( null, "ui-helper-clearfix" );
+               }
+               this._initWidgets();
+
+               children = this.childWidgets;
+
+               // We filter here because we need to track all childWidgets not just the visible ones
+               if ( this.options.excludeInvisible ) {
+                       children = children.filter( ":visible" );
+               }
+
+               if ( children.length ) {
+
+                       // We do this last because we need to make sure all enhancment is done
+                       // before determining first and last
+                       [ "first", "last" ].forEach( function( value ) {
+                               var data = children[ value ]().data( "ui-controlgroup-data" );
+                               if ( that[ "_" + data.widgetType + "_options" ] ) {
+                                       data.element[ data.widgetType ](
+                                               that[ "_" + data.widgetType + "_options" ](
+                                                       value,
+                                                       that.options.direction === "vertical"
+                                               )
+                                       );
+                               }
+                       } );
+
+                       // Finally call the refresh method on each of the child widgets.
+                       this._callChildMethod( "refresh" );
+               }
+       }
+} );
+} ) );