From 25d0c857188c19347c869f803530289762199f92 Mon Sep 17 00:00:00 2001 From: Alexander Schmitz Date: Thu, 28 Aug 2014 15:16:51 -0400 Subject: [PATCH] Checkboxradio: Initial commit of new widget --- demos/checkboxradio/default.html | 70 +++++ demos/checkboxradio/images/jquery-mobile.png | Bin 0 -> 6296 bytes demos/checkboxradio/images/jquery-ui.png | Bin 0 -> 7044 bytes demos/checkboxradio/images/jquery.png | Bin 0 -> 7206 bytes demos/checkboxradio/images/qunit.png | Bin 0 -> 6740 bytes demos/checkboxradio/images/sizzle.png | Bin 0 -> 8875 bytes demos/checkboxradio/index.html | 18 ++ demos/checkboxradio/no-icons.html | 70 +++++ demos/checkboxradio/product-selector.html | 127 ++++++++ demos/checkboxradio/radiogroup.html | 39 +++ demos/controlgroup/default.html | 90 ++++++ demos/controlgroup/index.html | 17 ++ demos/controlgroup/splitbutton.html | 58 ++++ demos/controlgroup/toolbar.html | 256 ++++++++++++++++ demos/index.html | 1 + tests/unit/checkboxradio/checkboxradio.html | 69 +++++ tests/unit/checkboxradio/common.js | 22 ++ tests/unit/checkboxradio/core.js | 102 +++++++ tests/unit/checkboxradio/events.js | 113 +++++++ tests/unit/checkboxradio/methods.js | 97 ++++++ tests/unit/checkboxradio/options.js | 189 ++++++++++++ tests/unit/controlgroup/controlgroup_core.js | 0 tests/unit/index.html | 1 + tests/visual/checkboxradio/checkboxradio.html | 65 ++++ tests/visual/index.html | 5 + themes/base/base.css | 1 + themes/base/checkboxradio.css | 33 ++ themes/base/theme.css | 12 +- ui/checkboxradio.js | 289 ++++++++++++++++++ 29 files changed, 1741 insertions(+), 3 deletions(-) create mode 100644 demos/checkboxradio/default.html create mode 100644 demos/checkboxradio/images/jquery-mobile.png create mode 100644 demos/checkboxradio/images/jquery-ui.png create mode 100644 demos/checkboxradio/images/jquery.png create mode 100644 demos/checkboxradio/images/qunit.png create mode 100644 demos/checkboxradio/images/sizzle.png create mode 100644 demos/checkboxradio/index.html create mode 100644 demos/checkboxradio/no-icons.html create mode 100644 demos/checkboxradio/product-selector.html create mode 100644 demos/checkboxradio/radiogroup.html create mode 100644 demos/controlgroup/default.html create mode 100644 demos/controlgroup/index.html create mode 100644 demos/controlgroup/splitbutton.html create mode 100644 demos/controlgroup/toolbar.html create mode 100644 tests/unit/checkboxradio/checkboxradio.html create mode 100644 tests/unit/checkboxradio/common.js create mode 100644 tests/unit/checkboxradio/core.js create mode 100644 tests/unit/checkboxradio/events.js create mode 100644 tests/unit/checkboxradio/methods.js create mode 100644 tests/unit/checkboxradio/options.js create mode 100644 tests/unit/controlgroup/controlgroup_core.js create mode 100644 tests/visual/checkboxradio/checkboxradio.html create mode 100644 themes/base/checkboxradio.css create mode 100644 ui/checkboxradio.js diff --git a/demos/checkboxradio/default.html b/demos/checkboxradio/default.html new file mode 100644 index 000000000..c8f4c5566 --- /dev/null +++ b/demos/checkboxradio/default.html @@ -0,0 +1,70 @@ + + + + + jQuery UI Checkboxradio - Default functionality + + + + + + + + + +
+

Checkbox and radio button widgets

+ +

Radio Group

+
+ Select a Location: + + + + + + +
+ +

Checkbox

+
+ Hotel Ratings: + + + + + + + + +
+ +

Checkbox nested in label

+
+ Bed Type: + + + + +
+
+ +
+

Examples of the markup that can be used with checkboxes and radio buttons.

+
+ + diff --git a/demos/checkboxradio/images/jquery-mobile.png b/demos/checkboxradio/images/jquery-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2c36376d4dd8f1627d34e3982d4e924f138176 GIT binary patch literal 6296 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 literal 0 HcmV?d00001 diff --git a/demos/checkboxradio/images/qunit.png b/demos/checkboxradio/images/qunit.png new file mode 100644 index 0000000000000000000000000000000000000000..048bcfddbdd6f02e3ae9522098014c2510b39f38 GIT binary patch literal 6740 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 literal 0 HcmV?d00001 diff --git a/demos/checkboxradio/images/sizzle.png b/demos/checkboxradio/images/sizzle.png new file mode 100644 index 0000000000000000000000000000000000000000..6145cd8ec488a6ea924ecb9c4ef4fb4a41fac5ac GIT binary patch literal 8875 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 literal 0 HcmV?d00001 diff --git a/demos/checkboxradio/index.html b/demos/checkboxradio/index.html new file mode 100644 index 000000000..08e598dbc --- /dev/null +++ b/demos/checkboxradio/index.html @@ -0,0 +1,18 @@ + + + + + + jQuery UI Checkboxradio Demos + + + + + + + diff --git a/demos/checkboxradio/no-icons.html b/demos/checkboxradio/no-icons.html new file mode 100644 index 000000000..64b511246 --- /dev/null +++ b/demos/checkboxradio/no-icons.html @@ -0,0 +1,70 @@ + + + + + jQuery UI Checkboxradio - No Icons + + + + + + + + + +
+

Checkbox and radio button widgets

+ +

Radio Group

+
+ Select a Location: + + + + + + +
+ +

Checkbox

+
+ Hotel Ratings: + + + + + + + + +
+ +

Checkbox nested in label

+
+ Bed Type: + + + + +
+
+ +
+

Examples of the markup that can be used with checkboxes and radio buttons, here showing both without icons.

+
+ + \ No newline at end of file diff --git a/demos/checkboxradio/product-selector.html b/demos/checkboxradio/product-selector.html new file mode 100644 index 000000000..f8da07118 --- /dev/null +++ b/demos/checkboxradio/product-selector.html @@ -0,0 +1,127 @@ + + + + + jQuery UI Checkboxradio - Product Selector + + + + + + + + + + + +
+
+

1.) Select a brand

+
+ + + + + + + + + + +
+
+
+

2.) Select a shape

+
+ + + + + + + + +
+
+
+

3.) Customize

+
+ + + + + + + + +
+
+
+
+ +
+

Using two sets of radio buttons, as horizontal controlgroups, and one group of checkboxes, as a vertical controlgroup, to implement a product selector.

+
+ + diff --git a/demos/checkboxradio/radiogroup.html b/demos/checkboxradio/radiogroup.html new file mode 100644 index 000000000..b307db82d --- /dev/null +++ b/demos/checkboxradio/radiogroup.html @@ -0,0 +1,39 @@ + + + + + jQuery UI Checkboxradio - Radio Group + + + + + + + + + + +
+ +

Radio Group

+
+ Select a Location: + + + + + + +
+
+ +
+

Example markup using the controlgroup widget to create a radio group.

+
+ + diff --git a/demos/controlgroup/default.html b/demos/controlgroup/default.html new file mode 100644 index 000000000..9e4bcdd80 --- /dev/null +++ b/demos/controlgroup/default.html @@ -0,0 +1,90 @@ + + + + + jQuery UI Controlgroup - Default Functionality + + + + + + + + + + + + + + + +
+

A Controlgroup featuring various form controls

+
+
+

Controlgroup

+
+ Rental Car +
+ + + + + + + + +
+
+
+
+ Rental Car +
+ + + + + + + + +
+
+>>>>>>> 423b976... Checkboxradio: Fixed demos and tests +
+ + + diff --git a/demos/controlgroup/index.html b/demos/controlgroup/index.html new file mode 100644 index 000000000..58e2f7eda --- /dev/null +++ b/demos/controlgroup/index.html @@ -0,0 +1,17 @@ + + + + + + jQuery UI Checkboxradio Demos + + + + + + + diff --git a/demos/controlgroup/splitbutton.html b/demos/controlgroup/splitbutton.html new file mode 100644 index 000000000..5d4c7b3ce --- /dev/null +++ b/demos/controlgroup/splitbutton.html @@ -0,0 +1,58 @@ + + + + + jQuery UI Controlgroup - Split Button + + + + + + + + + + + + + + + +
+

A Controlgroup creating a split button

+
+
+

Split button

+
+ + +
+
+
+

A Controlgroup creating a split button

+
+ + diff --git a/demos/controlgroup/toolbar.html b/demos/controlgroup/toolbar.html new file mode 100644 index 000000000..f90fb3040 --- /dev/null +++ b/demos/controlgroup/toolbar.html @@ -0,0 +1,256 @@ + + + + + jQuery UI Controlgroup - Toolbar + + + + + + + + + + + + + + + +
+

A sample editor toolbar

+

Highlight text and edit it using the buttons and dropdowns in the toolbar

+
+
+ + + + + + + + + + + + +
+

+
+The Rime of the Ancient Mariner (text of 1834)
+BY SAMUEL TAYLOR COLERIDGE
+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 
+of the strange things that befell; and in what manner the Ancyent Marinere came back to his own
+Country.
+
+PART I
+It is an ancient Mariner,
+And he stoppeth one of three.
+'By thy long grey beard and glittering eye,
+Now wherefore stopp'st thou me?
+
+The Bridegroom's doors are opened wide,
+And I am next of kin;
+The guests are met, the feast is set:
+May'st hear the merry din.'
+
+He holds him with his skinny hand,
+'There was a ship,' quoth he.
+'Hold off! unhand me, grey-beard loon!'
+Eftsoons his hand dropt he.
+
+He holds him with his glittering eye—
+The Wedding-Guest stood still,
+And listens like a three years' child:
+The Mariner hath his will.
+
+The Wedding-Guest sat on a stone:
+He cannot choose but hear;
+And thus spake on that ancient man,
+The bright-eyed Mariner.
+
+'The ship was cheered, the harbour cleared,
+Merrily did we drop
+Below the kirk, below the hill,
+Below the lighthouse top.
+
+The Sun came up upon the left,
+Out of the sea came he!
+And he shone bright, and on the right
+Went down into the sea.
+
+Higher and higher every day,
+Till over the mast at noon—'
+The Wedding-Guest here beat his breast,
+For he heard the loud bassoon.
+
+The bride hath paced into the hall,
+Red as a rose is she;
+Nodding their heads before her goes
+The merry minstrelsy.
+
+The Wedding-Guest he beat his breast,
+Yet he cannot choose but hear;
+And thus spake on that ancient man,
+The bright-eyed Mariner.
+
+And now the STORM-BLAST came, and he
+Was tyrannous and strong:
+He struck with his o'ertaking wings,
+And chased us south along.
+
+With sloping masts and dipping prow,
+As who pursued with yell and blow
+Still treads the shadow of his foe,
+And forward bends his head,
+The ship drove fast, loud roared the blast,
+And southward aye we fled.
+
+And now there came both mist and snow,
+And it grew wondrous cold:
+And ice, mast-high, came floating by,
+As green as emerald.
+
+And through the drifts the snowy clifts
+Did send a dismal sheen:
+Nor shapes of men nor beasts we ken—
+The ice was all between.
+
+The ice was here, the ice was there,
+The ice was all around:
+It cracked and growled, and roared and howled,
+Like noises in a swound!
+
+At length did cross an Albatross,
+Thorough the fog it came;
+As if it had been a Christian soul,
+We hailed it in God's name.
+
+It ate the food it ne'er had eat,
+And round and round it flew.
+The ice did split with a thunder-fit;
+The helmsman steered us through!
+
+And a good south wind sprung up behind;
+The Albatross did follow,
+And every day, for food or play,
+Came to the mariner's hollo!
+
+In mist or cloud, on mast or shroud,
+It perched for vespers nine;
+Whiles all the night, through fog-smoke white,
+Glimmered the white Moon-shine.'
+
+'God save thee, ancient Mariner!
+From the fiends, that plague thee thus!—
+Why look'st thou so?'—With my cross-bow
+I shot the ALBATROSS.
+
+ + diff --git a/demos/index.html b/demos/index.html index f37874a44..4b4d04e06 100644 --- a/demos/index.html +++ b/demos/index.html @@ -11,6 +11,7 @@
  • accordion
  • autocomplete
  • button
  • +
  • checkboxradio
  • datepicker
  • dialog
  • draggable
  • diff --git a/tests/unit/checkboxradio/checkboxradio.html b/tests/unit/checkboxradio/checkboxradio.html new file mode 100644 index 000000000..92db788c5 --- /dev/null +++ b/tests/unit/checkboxradio/checkboxradio.html @@ -0,0 +1,69 @@ + + + + + jQuery UI Checkboxradio Test Suite + + + + + + + +
    +
    + +
    + + + +
    +
    +
    + + + +
    +
    +
    +
    + + + +
    +
    +
    +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/tests/unit/checkboxradio/common.js b/tests/unit/checkboxradio/common.js new file mode 100644 index 000000000..6a739435f --- /dev/null +++ b/tests/unit/checkboxradio/common.js @@ -0,0 +1,22 @@ +define( [ + "lib/common", + "ui/checkboxradio" +], function( common ) { + +common.testWidget( "checkboxradio", { + noDefaultElement: true, + defaults: { + disabled: null, + label: null, + icon: true, + classes: { + "ui-checkboxradio-label": "ui-corner-all", + "ui-checkboxradio-icon": "ui-corner-all" + }, + + // Callbacks + create: null + } +}); + +} ); diff --git a/tests/unit/checkboxradio/core.js b/tests/unit/checkboxradio/core.js new file mode 100644 index 000000000..e70ca58c1 --- /dev/null +++ b/tests/unit/checkboxradio/core.js @@ -0,0 +1,102 @@ +define( [ + "jquery", + "ui/checkboxradio" +], function( $ ) { + +module( "Checkboxradio: core" ); +test( "Checkbox - Initial class structure", function( assert ) { + expect( 2 ); + var input = $("#check"), + label = $("label[for=check]"); + + input.checkboxradio(); + assert.hasClasses( input, "ui-helper-hidden-accessible ui-checkboxradio" ); + assert.hasClasses( label, "ui-button ui-widget ui-checkboxradio-label ui-corner-all" ); +}); + +test( "Radios - Initial class structure", function( assert ) { + expect( 6 ); + var inputs = $( "#radio0 input" ), + labels = $( "#radio0 label" ); + + inputs.checkboxradio(); + inputs.each( function() { + assert.hasClasses( this, "ui-helper-hidden-accessible" ); + }); + labels.each( function() { + assert.hasClasses( this, "ui-button" ); + }); +}); + +asyncTest( "Ensure checked after single click on checkbox label button", function( assert ) { + expect( 2 ); + + $( "#check2" ).checkboxradio().change( function() { + var label = $( this ).checkboxradio( "widget" ); + ok( this.checked, "checked ok" ); + + assert.hasClasses( label, "ui-state-active" ); + }); + + // Support: Opera + // Opera doesn't trigger a change event when this is done synchronously. + // This seems to be a side effect of another test, but until that can be + // tracked down, this delay will have to do. + setTimeout(function() { + $( "#check2" ).checkboxradio( "widget" ).simulate( "click" ); + start(); + }); +}); + +test( "Checkbox creation requires a label, and finds it in all cases", function( assert ) { + expect( 7 ); + var groups = [ + "", + "", + "", + "", + "", + "", + "" + ]; + + $.each( groups, function( index, markup ) { + var group = $( markup ); + + group.find( "input[type=checkbox]" ).checkboxradio(); + assert.hasClasses( group.find( "label" ), "ui-button" ); + } ); +}); + +test( "Calling checkboxradio on an unsupported element throws an error", function( assert ) { + expect( 2 ); + var error = new Error( "Can't create checkboxradio on element.nodeName=div and element.type=undefined" ); + assert.raises( + function() { + $( "
    " ).checkboxradio(); + }, + error, + "Proper error thrown" + ); + error = new Error( "Can't create checkboxradio on element.nodeName=input and element.type=button" ); + assert.raises( + function() { + $( "" ).checkboxradio(); + }, + error, + "Proper error thrown" + ); +}); +test( "Calling checkboxradio on an input with no label throws an error", function( assert ) { + expect( 1 ); + var error = new Error( "No label found for checkboxradio widget" ); + assert.raises( + function() { + $( "" ).checkboxradio(); + }, + error, + "Proper error thrown" + ); +}); + +} ); diff --git a/tests/unit/checkboxradio/events.js b/tests/unit/checkboxradio/events.js new file mode 100644 index 000000000..e5909a386 --- /dev/null +++ b/tests/unit/checkboxradio/events.js @@ -0,0 +1,113 @@ +define( [ + "jquery", + "ui/checkboxradio" +], function( $ ) { + +module( "Checkboxradio: events" ); + +asyncTest( "form reset / click", function( assert ) { + expect( 35 ); + + var radios = [ + $( "#radio11" ).checkboxradio(), + $( "#radio12" ).checkboxradio(), + $( "#radio13" ).checkboxradio() + ], + widgets = [ + radios[ 0 ].checkboxradio( "widget" ), + radios[ 1 ].checkboxradio( "widget" ), + radios[ 2 ].checkboxradio( "widget" ) + ], + form1 = $( "#form1" ), + form2 = $( "#form2" ); + + // Checkes that only the specified radio is checked in the group + function assertChecked( checked ) { + $.each( widgets, function( index ) { + var method = index === checked ? "hasClasses" : "lacksClasses"; + + assert[ method ]( widgets[ index ], "ui-checkboxradio-checked ui-state-active" ); + } ); + } + + // Checks the form count on each form + function assertFormCount( count ) { + equal( form1.data( "uiCheckboxradioCount" ), count, "Form1 has a count of " + count ); + equal( form2.data( "uiCheckboxradioCount" ), 3, "Form2 has a count of 3" ); + } + + // Run the tests + function testForms( current, start ) { + assertChecked( 2 ); + + if ( !start && current !== 0 ) { + radios[ current - 1 ].checkboxradio( "destroy" ); + } + + assertFormCount( 3 - current ); + + radios[ current ].prop( "checked", true ); + radios[ current ].trigger( "change" ); + assertChecked( current ); + + form1.trigger( "reset" ); + } + + // Recoursivly run the tests in a setTimeout with call back for the resets + function iterate( i ) { + setTimeout( function() { + if ( i < 3 ) { + testForms( i ); + iterate( i + 1 ); + return; + } + radios[ 2 ].checkboxradio( "destroy" ); + assertChecked( false ); + start(); + } ); + } + + $( "#form2 input" ).checkboxradio(); + + // Check the starting state then kick everything off + testForms( 0, true ); + iterate( 0 ); + +} ); + +asyncTest( + "Resetting a checkbox's form should refresh the visual state of the checkbox", + function( assert ) { + expect( 2 ); + var form = $( "
    " + + "" + + "
    " ), + checkbox = form.find( "input[type=checkbox]" ).checkboxradio(), + widget = checkbox.checkboxradio( "widget" ); + + checkbox.prop( "checked", false ).checkboxradio( "refresh" ); + assert.lacksClasses( widget, "ui-state-active" ); + + form.get( 0 ).reset(); + + setTimeout(function() { + assert.hasClasses( widget, "ui-state-active" ); + start(); + }, 1 ); + } +); + +asyncTest( "Checkbox shows focus when using keyboard navigation", function( assert ) { + expect( 2 ); + var check = $( "#check" ).checkboxradio(), + label = $( "label[for='check']" ); + assert.lacksClasses( label, "ui-state-focus" ); + check.focus(); + setTimeout(function() { + assert.hasClasses( label, "ui-state-focus" ); + start(); + } ); + } +); + +} ); diff --git a/tests/unit/checkboxradio/methods.js b/tests/unit/checkboxradio/methods.js new file mode 100644 index 000000000..f189c9eea --- /dev/null +++ b/tests/unit/checkboxradio/methods.js @@ -0,0 +1,97 @@ +define( [ + "jquery", + "ui/checkboxradio" +], function( $ ) { + +module( "Checkboxradio: methods" ); + +$.each( [ "checkbox", "radio" ], function( index, value ) { + test( value + ": refresh", function( assert ) { + var widget, icon, + checkbox = value === "checkbox", + input = $( "#" + value + "-method-refresh" ); + + expect( checkbox ? 11 : 8 ); + + input.checkboxradio(); + + widget = input.checkboxradio( "widget" ); + icon = widget.find( ".ui-icon" ); + strictEqual( icon.length, 1, + "There is initally one icon" ); + + icon.remove(); + input.checkboxradio( "refresh" ); + icon = widget.find( ".ui-icon" ); + strictEqual( icon.length, 1, + "Icon is recreated on refresh if absent" ); + assert.hasClasses( icon, "ui-icon-blank" ); + if ( checkbox ) { + assert.lacksClasses( icon, "ui-icon-check" ); + } + assert.lacksClasses( widget, "ui-checkboxradio-checked" ); + + input.prop( "checked", true ); + input.checkboxradio( "refresh" ); + if ( checkbox ) { + assert.hasClasses( icon, "ui-icon-check" ); + } + assert[ !checkbox ? "hasClasses" : "lacksClasses" ]( icon, "ui-icon-blank" ); + assert.hasClasses( widget, "ui-checkboxradio-checked" ); + + input.prop( "checked", false ); + input.checkboxradio( "refresh" ); + assert.hasClasses( icon, "ui-icon-blank" ); + if ( checkbox ) { + assert.lacksClasses( icon, "ui-icon-check" ); + } + assert.lacksClasses( widget, "ui-checkboxradio-checked" ); + }); + + test( value + ": destroy", function( assert ){ + expect( 1 ); + assert.domEqual( "#" + value + "-method-destroy", function() { + $( "#" + value + "-method-destroy" ).checkboxradio().checkboxradio( "destroy" ); + }); + }); + + test( value + ": disable / enable", function( assert ) { + expect( 4 ); + var input = $( "#" + value + "-method-disable" ), + widget = input.checkboxradio().checkboxradio( "widget" ); + + input.checkboxradio( "disable" ); + assert.hasClasses( widget, "ui-state-disabled" ); + strictEqual( input.is( ":disabled" ), true, + value + " is disabled when disable is called" ); + + input.checkboxradio( "enable" ); + assert.lacksClasses( widget, "ui-state-disabled" ); + strictEqual( input.is( ":disabled" ), false, + value + " has disabled prop removed when enable is called" ); + }); + + test( value + ": widget returns the label", function(){ + var input = $( "#" + value + "-method-refresh" ), + label = $( "#" + value + "-method-refresh-label" ); + + expect( 1 ); + + input.checkboxradio(); + strictEqual( input.checkboxradio( "widget" )[ 0 ], label[ 0 ], + "widget method returns label" ); + }); + +} ); + +test( "Input wrapped in a label preserved on refresh", function() { + var input = $( "#label-with-no-for" ).checkboxradio(), + element = input.checkboxradio( "widget" ); + + expect( 1 ); + + input.checkboxradio( "refresh" ); + strictEqual( input.parent()[ 0 ], element[ 0 ], "Input preserved" ); +}); + +} ); diff --git a/tests/unit/checkboxradio/options.js b/tests/unit/checkboxradio/options.js new file mode 100644 index 000000000..11bd072ca --- /dev/null +++ b/tests/unit/checkboxradio/options.js @@ -0,0 +1,189 @@ +define( [ + "jquery", + "ui/checkboxradio" +], function( $ ) { + +module( "Checkboxradio: options" ); + +function assertDisabled( checkbox, assert ) { + assert.hasClasses( checkbox.checkboxradio( "widget" ), "ui-state-disabled", + "label gets ui-state-disabled" ); + strictEqual( checkbox.is( ":disabled" ), true, + "checkbox is disabled" ); +} + +function assertEnabled( checkbox, assert ) { + assert.lacksClasses( checkbox.checkboxradio( "widget" ), "ui-state-disabled", + "label has ui-state-disabled removed when disabled set to false" ); + strictEqual( checkbox.is( ":disabled" ), false, + "checkbox has disabled prop removed when disabled set to false" ); +} + +test( "disabled", function( assert ) { + var checkbox = $( "#checkbox-option-disabled" ); + expect( 6 ); + checkbox.checkboxradio({ + disabled: true + }); + + assertDisabled( checkbox, assert ); + + checkbox.checkboxradio( "option", "disabled", false ); + assertEnabled( checkbox, assert ); + + checkbox.checkboxradio( "option", "disabled", true ); + assertDisabled( checkbox, assert ); +}); +test( "disabled - prop true on init", function( assert ) { + expect( 2 ); + var checkbox = $( "#checkbox-option-disabled" ); + + checkbox.prop( "disabled", true ); + checkbox.checkboxradio(); + + assertDisabled( checkbox, assert ); +}); +test( "disabled - explicit null value, checks the DOM", function( assert ) { + expect( 2 ); + var checkbox = $( "#checkbox-option-disabled" ); + + checkbox.prop( "disabled", true ); + checkbox.checkboxradio({ + disabled: null + }); + assertDisabled( checkbox, assert ); +}); + +function assertNoIcon( checkbox ) { + strictEqual( checkbox.checkboxradio( "widget" ).find( "span.ui-icon" ).length, 0, + "Label does not contain an icon" ); +} +function assertIcon( checkbox, icon, assert ) { + var iconElement = checkbox.checkboxradio( "widget" ).find( ".ui-icon" ); + + icon = icon || "blank"; + strictEqual( iconElement.length, 1, + "Label contains icon" ); + assert.hasClasses( iconElement, "ui-checkboxradio-icon ui-corner-all ui-icon " + + "ui-icon-background ui-icon-" + icon, + "Icon has proper classes" ); +} +test( "icon - false on init", function() { + var checkbox = $( "#checkbox-option-icon" ); + + expect( 1 ); + + checkbox.checkboxradio({ icon: false }); + assertNoIcon( checkbox ); +}); + +test( "icon - default unchecked", function( assert ) { + var checkbox = $( "#checkbox-option-icon" ); + + expect( 2 ); + + checkbox.checkboxradio(); + assertIcon( checkbox, false, assert ); +}); +test( "icon", function( assert ){ + var checkbox = $( "#checkbox-option-icon" ); + + expect( 8 ); + + checkbox.prop( "checked", true ); + + checkbox.checkboxradio(); + assertIcon( checkbox, "check", assert ); + + checkbox.checkboxradio( "option", "icon", false ); + assertNoIcon( checkbox ); + + checkbox.checkboxradio( "option", "icon", true ); + assertIcon( checkbox, "check", assert ); + + checkbox.checkboxradio( "option", "icon", false ); + assertNoIcon( checkbox ); + + checkbox.prop( "checked", false ).checkboxradio( "refresh" ); + checkbox.checkboxradio( "option", "icon", true ); + assertIcon( checkbox, false, assert ); + +}); + +test( "label - default", function() { + var checkbox = $( "#checkbox-option-label" ), + widget; + + expect( 2 ); + + checkbox.checkboxradio(); + widget = checkbox.checkboxradio( "widget" ); + strictEqual( checkbox.checkboxradio( "option", "label" ), + "checkbox label", "When no value passed on create text from dom is used for option" ); + strictEqual( widget.text(), + " checkbox label", "When no value passed on create text from dom is used in dom" ); +}); +test( "label - explicit value", function() { + expect( 5 ); + var checkbox = $( "#checkbox-option-label" ).checkboxradio({ + label: "foo" + }), + widget = checkbox.checkboxradio( "widget" ), + icon = widget.find( ".ui-icon" ), + iconSpace = widget.find( ".ui-checkboxradio-icon-space" ); + + strictEqual( checkbox.checkboxradio( "option", "label" ), + "foo", "When value is passed on create value is used for option" ); + strictEqual( widget.text(), + " foo", "When value is passed on create value is used in dom" ); + strictEqual( icon.length, 1, + "Icon is preserved when label is set on init when wrapped in label" ); + strictEqual( iconSpace.length, 1, + "Icon space is preserved when label is set on init when wrapped in label" ); + strictEqual( $( "#checkbox-option-label" ).length, 1, + "Element is preserved when label is set on init when wrapped in label" ); +}); + +test( "label - explicit null value", function() { + var checkbox = $( "#checkbox-option-label" ), + widget; + + expect( 2 ); + + // We are testing the default here because the default null is a special value which means to check + // the DOM, so we need to make sure this happens correctly checking the options should never return + // null. It should always be true or false + checkbox.checkboxradio({ + label: null + }); + widget = checkbox.checkboxradio( "widget" ); + strictEqual( checkbox.checkboxradio( "option", "label" ), + "checkbox label", "When null is passed on create text from dom is used for option" ); + strictEqual( widget.text(), + " checkbox label", "When null is passed on create text from dom is used in dom" ); + +}); + +test( "label", function() { + var checkbox = $( "#checkbox-option-label" ), + widget; + + expect( 4 ); + + checkbox.checkboxradio(); + widget = checkbox.checkboxradio( "widget" ); + checkbox.checkboxradio( "option", "label", "bar" ); + strictEqual( checkbox.checkboxradio( "option", "label" ), + "bar", "When value is passed value is used for option" ); + strictEqual( widget.text(), + " bar", "When value is passed value is used in dom" ); + + checkbox.checkboxradio( "option", "label", null ); + strictEqual( checkbox.checkboxradio( "option", "label" ), + "bar", "When null is passed text from dom is used for option" ); + strictEqual( widget.text(), + " bar", "When null is passed text from dom is used in dom" ); + +}); + +} ); diff --git a/tests/unit/controlgroup/controlgroup_core.js b/tests/unit/controlgroup/controlgroup_core.js new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/index.html b/tests/unit/index.html index 418cfd34c..fe358cb6c 100644 --- a/tests/unit/index.html +++ b/tests/unit/index.html @@ -40,6 +40,7 @@
  • Accordion
  • Autocomplete
  • Button
  • +
  • Checkboxradio
  • Datepicker
  • Dialog
  • Menu
  • diff --git a/tests/visual/checkboxradio/checkboxradio.html b/tests/visual/checkboxradio/checkboxradio.html new file mode 100644 index 000000000..634e8df81 --- /dev/null +++ b/tests/visual/checkboxradio/checkboxradio.html @@ -0,0 +1,65 @@ + + + + + jQuery UI - Checkboxes + + + + + + + + + + +

    + Easy way to toggle through various combinations of options and states to make sure non lead to + a broken appearence. +

    +
    + + + + + + + + +
    +
    + + + + + + + +
    + + diff --git a/tests/visual/index.html b/tests/visual/index.html index 98753c827..39168c9f4 100644 --- a/tests/visual/index.html +++ b/tests/visual/index.html @@ -31,6 +31,11 @@
  • Performance
  • +

    Checkboxradio

    + +

    Dialog

    • Animations
    • diff --git a/themes/base/base.css b/themes/base/base.css index 3ed02661f..7194eba27 100644 --- a/themes/base/base.css +++ b/themes/base/base.css @@ -13,6 +13,7 @@ @import url("accordion.css"); @import url("autocomplete.css"); @import url("button.css"); +@import url("checkboxradio.css"); @import url("datepicker.css"); @import url("dialog.css"); @import url("draggable.css"); diff --git a/themes/base/checkboxradio.css b/themes/base/checkboxradio.css new file mode 100644 index 000000000..063ed5b5c --- /dev/null +++ b/themes/base/checkboxradio.css @@ -0,0 +1,33 @@ +/*! + * jQuery UI Checkboxradio @VERSION + * http://jqueryui.com + * + * Copyright 2013 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/checkboxradio/#theming + */ + +.ui-checkboxradio-label .ui-icon-background { + border-radius: .12em; + border: none; +} +.ui-checkboxradio-radio-label .ui-icon-background { + width: 16px; + height: 16px; + border-radius: 1em; + overflow: visible; + border: none; +} +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { + background-image: none; + width: 8px; + height: 8px; + border-width: 4px; + border-style: solid; +} +.ui-checkboxradio-disabled { + pointer-events: none; +} diff --git a/themes/base/theme.css b/themes/base/theme.css index eddbc8a0b..7553d4c58 100644 --- a/themes/base/theme.css +++ b/themes/base/theme.css @@ -102,12 +102,18 @@ a.ui-button:focus { .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active, a.ui-button:active, -.ui-button:active { +.ui-button:active, +.ui-button.ui-state-active:hover { border: 1px solid #003eff/*{borderColorActive}*/; background: #007fff/*{bgColorActive}*/ /*{bgImgUrlActive}*/ /*{bgActiveXPos}*/ /*{bgActiveYPos}*/ /*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #ffffff/*{fcActive}*/; } +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff/*{borderColorActive}*/; + background-color: #ffffff/*{bgColorActive}*/; +} .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { @@ -184,7 +190,6 @@ a.ui-button:active, .ui-widget-header .ui-icon { background-image: url("images/ui-icons_444444_256x240.png")/*{iconsHeader}*/; } -.ui-state-default .ui-icon, .ui-button .ui-icon { background-image: url("images/ui-icons_777777_256x240.png")/*{iconsDefault}*/; } @@ -198,7 +203,8 @@ a.ui-button:active, .ui-button:active .ui-icon { background-image: url("images/ui-icons_ffffff_256x240.png")/*{iconsActive}*/; } -.ui-state-highlight .ui-icon { +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { background-image: url("images/ui-icons_777620_256x240.png")/*{iconsHighlight}*/; } .ui-state-error .ui-icon, diff --git a/ui/checkboxradio.js b/ui/checkboxradio.js new file mode 100644 index 000000000..84f69afaa --- /dev/null +++ b/ui/checkboxradio.js @@ -0,0 +1,289 @@ +/*! + * jQuery UI Checkboxradio @VERSION + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/checkboxradio/ + */ +( 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( $ ) { + +// Remove and replace with reset handler extension +var formResetHandler = function() { + var form = $( this ); + + // Wait for the form reset to actually happen before refreshing + setTimeout( function() { + + // We dont filter for css only versions since css only is not supported + form.find( ".ui-checkboxradio" ).checkboxradio( "refresh" ); + } ); + }; + +$.widget( "ui.checkboxradio", { + version: "@VERSION", + options: { + disabled: null, + label: null, + icon: true, + classes: { + "ui-checkboxradio-label": "ui-corner-all", + "ui-checkboxradio-icon": "ui-corner-all" + } + }, + + _getCreateOptions: function() { + var disabled, labels, + that = this, + options = this._super() || {}; + + // We read the type here, because it makes more sense to throw a element type error first, + // rather then the error for lack of a label. Often if its the wrong type, it + // won't have a label (e.g. calling on a div, btn, etc) + this._readType(); + + labels = this.element.labels(); + + // Todo: For now we will use the last label we need to check about the best + // way to handle multiple labels with some accessability experts + this.label = $( labels[ labels.length - 1 ] ); + if ( !this.label.length ) { + $.error( "No label found for checkboxradio widget" ); + } + + this.originalLabel = ""; + + // We need to get the label text but this may also need to make sure it does not contain the + // input itself. + this.label.contents().not( this.element ).each( function() { + + // The label contents could be text html or a mix we concat each element to get a string + // representation of the label without the input as part of it. + that.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML; + } ); + + // Set the label option if we found label text + if ( this.originalLabel ) { + options.label = this.originalLabel; + } + + disabled = this.element[ 0 ].disabled; + if ( disabled != null ) { + options.disabled = disabled; + } + return options; + }, + + _create: function() { + var formCount, + checked = this.element[ 0 ].checked, + form = this.element.form(); + this.formParent = !!form.length ? form : $( "body" ); + + formCount = this.formParent.data( "uiCheckboxradioCount" ) || 0; + + // We don't use _on and _off here because we want all the checkboxes in the same form to use + // single handler which handles all the checkboxradio widgets in the form + if ( formCount === 0 ) { + this.formParent.on( "reset." + this.widgetFullName, formResetHandler ); + } + + this.formParent.data( "uiCheckboxradioCount", formCount + 1 ); + + if ( this.options.disabled == null ) { + this.options.disabled = this.element[ 0 ].disabled || false; + } + + this._setOption( "disabled", this.options.disabled ); + this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" ); + this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" ); + + if ( this.type === "radio" ) { + this._addClass( this.label, "ui-checkboxradio-radio-label" ); + } + + if ( this.options.label && this.options.label !== this.originalLabel ) { + this._updateLabel(); + } else if ( this.originalLabel ) { + this.options.label = this.originalLabel; + } + + this._enhance(); + + if ( checked ) { + this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" ); + this._addClass( this.icon, null, "ui-state-hover" ); + } + + this._on( { + "change": "_toggleClasses", + "focus": function() { + this._addClass( this.label, null, "ui-state-focus ui-visual-focus" ); + }, + "blur": function() { + this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" ); + } + } ); + }, + + _readType: function() { + var nodeName = this.element[ 0 ].nodeName.toLowerCase(); + this.type = this.element[ 0 ].type; + if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) { + $.error( "Can't create checkboxradio on element.nodeName=" + nodeName + + " and element.type=" + this.type ); + } + }, + + // Support jQuery Mobile enhanced option + _enhance: function() { + this._updateIcon( this.element[ 0 ].checked ); + }, + + widget: function() { + return this.label; + }, + + _getRadioGroup: function() { + var name = this.element[ 0 ].name, + that = this, + radios = $( [] ); + + if ( name ) { + name = $.ui.escapeSelector( name ); + radios = this.formParent.find( "[name='" + $.ui.escapeSelector( name ) + "']" ).filter( function() { + var form = $( this ).form(); + return ( form.length ? form : $( "body" ) )[ 0 ] === that.formParent[ 0 ]; + } ); + } + return radios.not( this.element ); + }, + + _toggleClasses: function() { + var checked = this.element[ 0 ].checked; + this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked ); + + if ( this.options.icon && this.type === "checkbox" ) { + + // We add ui-state-highlight to change the icon color + this._toggleClass( this.icon, null, "ui-icon-check ui-state-highlight", checked ) + ._toggleClass( this.icon, null, "ui-icon-blank", !checked ); + } + if ( this.type === "radio" ) { + this._getRadioGroup() + .each( function() { + var instance = $( this ).checkboxradio( "instance" ); + + if ( instance ) { + instance._removeClass( instance.label, + "ui-checkboxradio-checked", "ui-state-active" ); + } + } ); + } + }, + + _destroy: function() { + var formCount = this.formParent.data( "uiCheckboxradioCount" ) - 1; + + this.formParent.data( "uiCheckboxradioCount", formCount ); + + if ( formCount === 0 ) { + this.formParent.off( "reset." + this.widgetFullName, formResetHandler ); + } + + if ( this.icon ) { + this.icon.remove(); + this.iconSpace.remove(); + } + }, + + _setOption: function( key, value ) { + + // We don't alow the value to be set to nothing + if ( key === "label" && !value ) { + return; + } + + this._super( key, value ); + + if ( key === "disabled" ) { + this._toggleClass( this.label, null, "ui-state-disabled", value ); + this.element[ 0 ].disabled = value; + + // Don't refresh if disabled + return; + } + this.refresh(); + }, + + _updateIcon: function( checked ) { + var toAdd = "ui-icon ui-icon-background "; + + if ( this.options.icon ) { + if ( !this.icon ) { + this.icon = $( "" ); + this.iconSpace = $( " " ); + this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" ); + } + + if ( this.type === "checkbox" ) { + toAdd += checked ? "ui-icon-check" : "ui-icon-blank"; + this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" ); + } else { + toAdd += "ui-icon-blank"; + } + this._addClass( this.icon, "ui-checkboxradio-icon", toAdd ); + if ( !checked ) { + this._removeClass( this.icon, null, "ui-icon-check" ); + } + this.icon.prependTo( this.label ).after( this.iconSpace ); + } else if ( this.icon !== undefined ) { + this.icon.remove(); + this.iconSpace.remove(); + delete this.icon; + } + }, + + _updateLabel: function() { + + // Remove the contents of the label ( minus the icon, icon space, and input ) + this.label.contents().not( this.element.add( this.icon ).add( this.iconSpace ) ).remove(); + this.label.append( this.options.label ); + }, + + refresh: function() { + var checked = this.element[ 0 ].checked, + isDisabled = this.element[ 0 ].disabled; + + this._updateIcon( checked ); + this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked ); + if ( this.options.label !== null ) { + this._updateLabel(); + } + + if ( isDisabled !== this.options.disabled ) { + this._setOptions( { "disabled": isDisabled } ); + } + } + +} ); + +return $.ui.checkboxradio; + +} ) ); -- 2.39.5