| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-form-field-Checkbox'>/**</span> * @docauthor Robert Dougan <rob@sencha.com> * * Single checkbox field. Can be used as a direct replacement for traditional checkbox fields. Also serves as a * parent class for {@link Ext.form.field.Radio radio buttons}. * * # Labeling * * In addition to the {@link Ext.form.Labelable standard field labeling options}, checkboxes * may be given an optional {@link #boxLabel} which will be displayed immediately after checkbox. Also see * {@link Ext.form.CheckboxGroup} for a convenient method of grouping related checkboxes. * * # Values * * The main value of a checkbox is a boolean, indicating whether or not the checkbox is checked. * The following values will check the checkbox: * * - `true` * - `'true'` * - `'1'` * - `'on'` * * Any other value will uncheck the checkbox. * * In addition to the main boolean value, you may also specify a separate {@link #inputValue}. This will be * sent as the parameter value when the form is {@link Ext.form.Basic#submit submitted}. You will want to set * this value if you have multiple checkboxes with the same {@link #name}. If not specified, the value `on` * will be used. * * # Example usage * *     @example *     Ext.create('Ext.form.Panel', { *         bodyPadding: 10, *         width: 300, *         title: 'Pizza Order', *         items: [ *             { *                 xtype: 'fieldcontainer', *                 fieldLabel: 'Toppings', *                 defaultType: 'checkboxfield', *                 items: [ *                     { *                         boxLabel  : 'Anchovies', *                         name      : 'topping', *                         inputValue: '1', *                         id        : 'checkbox1' *                     }, { *                         boxLabel  : 'Artichoke Hearts', *                         name      : 'topping', *                         inputValue: '2', *                         checked   : true, *                         id        : 'checkbox2' *                     }, { *                         boxLabel  : 'Bacon', *                         name      : 'topping', *                         inputValue: '3', *                         id        : 'checkbox3' *                     } *                 ] *             } *         ], *         bbar: [ *             { *                 text: 'Select Bacon', *                 handler: function() { *                     Ext.getCmp('checkbox3').setValue(true); *                 } *             }, *             '-', *             { *                 text: 'Select All', *                 handler: function() { *                     Ext.getCmp('checkbox1').setValue(true); *                     Ext.getCmp('checkbox2').setValue(true); *                     Ext.getCmp('checkbox3').setValue(true); *                 } *             }, *             { *                 text: 'Deselect All', *                 handler: function() { *                     Ext.getCmp('checkbox1').setValue(false); *                     Ext.getCmp('checkbox2').setValue(false); *                     Ext.getCmp('checkbox3').setValue(false); *                 } *             } *         ], *         renderTo: Ext.getBody() *     }); */Ext.define('Ext.form.field.Checkbox', {    extend: 'Ext.form.field.Base',    alias: ['widget.checkboxfield', 'widget.checkbox'],    alternateClassName: 'Ext.form.Checkbox',    requires: ['Ext.XTemplate', 'Ext.form.CheckboxManager' ],    componentLayout: 'field',    childEls: [<span id='Ext-form-field-Checkbox-property-boxLabelEl'>        /**</span>         * @property {Ext.Element} boxLabelEl         * A reference to the label element created for the {@link #boxLabel}. Only present if the component has been         * rendered and has a boxLabel configured.         */        'boxLabelEl'    ],    // note: {id} here is really {inputId}, but {cmpId} is available    fieldSubTpl: [        '<tpl if="boxLabel && boxLabelAlign == \'before\'">',            '{beforeBoxLabelTpl}',            '<label id="{cmpId}-boxLabelEl" {boxLabelAttrTpl} class="{boxLabelCls} {boxLabelCls}-{boxLabelAlign}" for="{id}">',                '{beforeBoxLabelTextTpl}',                '{boxLabel}',                '{afterBoxLabelTextTpl}',            '</label>',            '{afterBoxLabelTpl}',        '</tpl>',        // Creates not an actual checkbox, but a button which is given aria role="checkbox" (If ARIA is required) and        // styled with a custom checkbox image. This allows greater control and consistency in        // styling, and using a button allows it to gain focus and handle keyboard nav properly.        '<input type="button" id="{id}" {inputAttrTpl}',            '<tpl if="tabIdx"> tabIndex="{tabIdx}"</tpl>',            '<tpl if="disabled"> disabled="disabled"</tpl>',            '<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',            ' class="{fieldCls} {typeCls}" autocomplete="off" hidefocus="true" />',        '<tpl if="boxLabel && boxLabelAlign == \'after\'">',            '{beforeBoxLabelTpl}',            '<label id="{cmpId}-boxLabelEl" {boxLabelAttrTpl} class="{boxLabelCls} {boxLabelCls}-{boxLabelAlign}" for="{id}">',                '{beforeBoxLabelTextTpl}',                '{boxLabel}',                '{afterBoxLabelTextTpl}',            '</label>',            '{afterBoxLabelTpl}',        '</tpl>',        {            disableFormats: true,            compiled: true        }    ],    subTplInsertions: [<span id='Ext-form-field-Checkbox-cfg-beforeBoxLabelTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} beforeBoxLabelTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * before the box label element. If an `XTemplate` is used, the component's         * {@link Ext.form.field.Base#getSubTplData subTpl data} serves as the context.         */        'beforeBoxLabelTpl',<span id='Ext-form-field-Checkbox-cfg-afterBoxLabelTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} afterBoxLabelTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * after the box label element. If an `XTemplate` is used, the component's         * {@link Ext.form.field.Base#getSubTplData subTpl data} serves as the context.         */        'afterBoxLabelTpl',<span id='Ext-form-field-Checkbox-cfg-beforeBoxLabelTextTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} beforeBoxLabelTextTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * before the box label text. If an `XTemplate` is used, the component's         * {@link Ext.form.field.Base#getSubTplData subTpl data} serves as the context.         */        'beforeBoxLabelTextTpl',<span id='Ext-form-field-Checkbox-cfg-afterBoxLabelTextTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} afterBoxLabelTextTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * after the box label text. If an `XTemplate` is used, the component's         * {@link Ext.form.field.Base#getSubTplData subTpl data} serves as the context.         */        'afterBoxLabelTextTpl',<span id='Ext-form-field-Checkbox-cfg-boxLabelAttrTpl'>        /**</span>         * @cfg {String/Array/Ext.XTemplate} boxLabelAttrTpl         * An optional string or `XTemplate` configuration to insert in the field markup         * inside the box label element (as attributes). If an `XTemplate` is used, the component's         * {@link Ext.form.field.Base#getSubTplData subTpl data} serves as the context.         */        'boxLabelAttrTpl',        // inherited        'inputAttrTpl'    ],    /*     * @property {Boolean} isCheckbox     * `true` in this class to identify an object as an instantiated Checkbox, or subclass thereof.     */    isCheckbox: true,<span id='Ext-form-field-Checkbox-cfg-focusCls'>    /**</span>     * @cfg {String} [focusCls='x-form-cb-focus']     * The CSS class to use when the checkbox receives focus     */    focusCls: 'form-cb-focus',<span id='Ext-form-field-Checkbox-cfg-fieldCls'>    /**</span>     * @cfg {String} [fieldCls='x-form-field']     * The default CSS class for the checkbox     */<span id='Ext-form-field-Checkbox-cfg-fieldBodyCls'>    /**</span>     * @cfg {String} [fieldBodyCls='x-form-cb-wrap']     * An extra CSS class to be applied to the body content element in addition to {@link #fieldBodyCls}.     * .     */    fieldBodyCls: Ext.baseCSSPrefix + 'form-cb-wrap',<span id='Ext-form-field-Checkbox-cfg-checked'>    /**</span>     * @cfg {Boolean} checked     * true if the checkbox should render initially checked     */    checked: false,<span id='Ext-form-field-Checkbox-cfg-checkedCls'>    /**</span>     * @cfg {String} [checkedCls='x-form-cb-checked']     * The CSS class added to the component's main element when it is in the checked state.     */    checkedCls: Ext.baseCSSPrefix + 'form-cb-checked',<span id='Ext-form-field-Checkbox-cfg-boxLabel'>    /**</span>     * @cfg {String} boxLabel     * An optional text label that will appear next to the checkbox. Whether it appears before or after the checkbox is     * determined by the {@link #boxLabelAlign} config.     */<span id='Ext-form-field-Checkbox-cfg-boxLabelCls'>    /**</span>     * @cfg {String} [boxLabelCls='x-form-cb-label']     * The CSS class to be applied to the {@link #boxLabel} element     */    boxLabelCls: Ext.baseCSSPrefix + 'form-cb-label',<span id='Ext-form-field-Checkbox-cfg-boxLabelAlign'>    /**</span>     * @cfg {String} boxLabelAlign     * The position relative to the checkbox where the {@link #boxLabel} should appear. Recognized values are 'before'     * and 'after'.     */    boxLabelAlign: 'after',<span id='Ext-form-field-Checkbox-cfg-inputValue'>    /**</span>     * @cfg {String} inputValue     * The value that should go into the generated input element's value attribute and should be used as the parameter     * value when submitting as part of a form.     */    inputValue: 'on',<span id='Ext-form-field-Checkbox-cfg-uncheckedValue'>    /**</span>     * @cfg {String} uncheckedValue     * If configured, this will be submitted as the checkbox's value during form submit if the checkbox is unchecked. By     * default this is undefined, which results in nothing being submitted for the checkbox field when the form is     * submitted (the default behavior of HTML checkboxes).     */<span id='Ext-form-field-Checkbox-cfg-handler'>    /**</span>     * @cfg {Function} handler     * A function called when the {@link #checked} value changes (can be used instead of handling the {@link #change     * change event}).     * @cfg {Ext.form.field.Checkbox} handler.checkbox The Checkbox being toggled.     * @cfg {Boolean} handler.checked The new checked state of the checkbox.     */<span id='Ext-form-field-Checkbox-cfg-scope'>    /**</span>     * @cfg {Object} scope     * An object to use as the scope ('this' reference) of the {@link #handler} function.     *     * Defaults to this Checkbox.     */    // private overrides    checkChangeEvents: [],    inputType: 'checkbox',    // private    onRe: /^on$/i,    initComponent: function() {        this.callParent(arguments);        this.getManager().add(this);    },    initValue: function() {        var me = this,            checked = !!me.checked;<span id='Ext-form-field-Checkbox-property-originalValue'>        /**</span>         * @property {Object} originalValue         * The original value of the field as configured in the {@link #checked} configuration, or as loaded by the last         * form load operation if the form's {@link Ext.form.Basic#trackResetOnLoad trackResetOnLoad} setting is `true`.         */        me.originalValue = me.lastValue = checked;        // Set the initial checked state        me.setValue(checked);    },    getElConfig: function() {        var me = this;        // Add the checked class if this begins checked        if (me.isChecked(me.rawValue, me.inputValue)) {            me.addCls(me.checkedCls);        }        return me.callParent();    },    getFieldStyle: function() {        return Ext.isObject(this.fieldStyle) ? Ext.DomHelper.generateStyles(this.fieldStyle) : this.fieldStyle ||'';    },    getSubTplData: function() {        var me = this;        return Ext.apply(me.callParent(), {            disabled      : me.readOnly || me.disabled,            boxLabel      : me.boxLabel,            boxLabelCls   : me.boxLabelCls,            boxLabelAlign : me.boxLabelAlign        });    },    initEvents: function() {        var me = this;        me.callParent();        me.mon(me.inputEl, 'click', me.onBoxClick, me);    },<span id='Ext-form-field-Checkbox-method-onBoxClick'>    /**</span>     * @private Handle click on the checkbox button     */    onBoxClick: function(e) {        var me = this;        if (!me.disabled && !me.readOnly) {            this.setValue(!this.checked);        }    },<span id='Ext-form-field-Checkbox-method-getRawValue'>    /**</span>     * Returns the checked state of the checkbox.     * @return {Boolean} True if checked, else false     */    getRawValue: function() {        return this.checked;    },<span id='Ext-form-field-Checkbox-method-getValue'>    /**</span>     * Returns the checked state of the checkbox.     * @return {Boolean} True if checked, else false     */    getValue: function() {        return this.checked;    },<span id='Ext-form-field-Checkbox-method-getSubmitValue'>    /**</span>     * Returns the submit value for the checkbox which can be used when submitting forms.     * @return {String} If checked the {@link #inputValue} is returned; otherwise the {@link #uncheckedValue}     * (or null if the latter is not configured).     */    getSubmitValue: function() {        var unchecked = this.uncheckedValue,            uncheckedVal = Ext.isDefined(unchecked) ? unchecked : null;        return this.checked ? this.inputValue : uncheckedVal;    },    isChecked: function(rawValue, inputValue) {        return (rawValue === true || rawValue === 'true' || rawValue === '1' || rawValue === 1 ||                      (((Ext.isString(rawValue) || Ext.isNumber(rawValue)) && inputValue) ? rawValue == inputValue : this.onRe.test(rawValue)));    },<span id='Ext-form-field-Checkbox-method-setRawValue'>    /**</span>     * Sets the checked state of the checkbox.     *     * @param {Boolean/String/Number} value The following values will check the checkbox:     * `true, 'true', '1', 1, or 'on'`, as well as a String that matches the {@link #inputValue}.     * Any other value will uncheck the checkbox.     * @return {Boolean} the new checked state of the checkbox     */    setRawValue: function(value) {        var me = this,            inputEl = me.inputEl,            checked = me.isChecked(value, me.inputValue);        if (inputEl) {            me[checked ? 'addCls' : 'removeCls'](me.checkedCls);        }        me.checked = me.rawValue = checked;        return checked;    },<span id='Ext-form-field-Checkbox-method-setValue'>    /**</span>     * Sets the checked state of the checkbox, and invokes change detection.     * @param {Boolean/String} checked The following values will check the checkbox: `true, 'true', '1', or 'on'`, as     * well as a String that matches the {@link #inputValue}. Any other value will uncheck the checkbox.     * @return {Ext.form.field.Checkbox} this     */    setValue: function(checked) {        var me = this,            boxes, i, len, box;        // If an array of strings is passed, find all checkboxes in the group with the same name as this        // one and check all those whose inputValue is in the array, unchecking all the others. This is to        // facilitate setting values from Ext.form.Basic#setValues, but is not publicly documented as we        // don't want users depending on this behavior.        if (Ext.isArray(checked)) {            boxes = me.getManager().getByName(me.name, me.getFormId()).items;            len = boxes.length;            for (i = 0; i < len; ++i) {                box = boxes[i];                box.setValue(Ext.Array.contains(checked, box.inputValue));            }        } else {            me.callParent(arguments);        }        return me;    },    // private    valueToRaw: function(value) {        // No extra conversion for checkboxes        return value;    },<span id='Ext-form-field-Checkbox-method-onChange'>    /**</span>     * @private     * Called when the checkbox's checked state changes. Invokes the {@link #handler} callback     * function if specified.     */    onChange: function(newVal, oldVal) {        var me = this,            handler = me.handler;        if (handler) {            handler.call(me.scope || me, me, newVal);        }        me.callParent(arguments);    },        resetOriginalValue: function(/* private */ fromBoxInGroup){        var me = this,            boxes,            box,            len,            i;                    // If we're resetting the value of a field in a group, also reset the others.        if (!fromBoxInGroup) {            boxes = me.getManager().getByName(me.name, me.getFormId()).items;            len  = boxes.length;                        for (i = 0; i < len; ++i) {                box = boxes[i];                if (box !== me) {                    boxes[i].resetOriginalValue(true);                }            }        }        me.callParent();    },    // inherit docs    beforeDestroy: function(){        this.callParent();        this.getManager().removeAtKey(this.id);    },    // inherit docs    getManager: function() {        return Ext.form.CheckboxManager;    },    onEnable: function() {        var me = this,            inputEl = me.inputEl;        me.callParent();        if (inputEl) {            // Can still be disabled if the field is readOnly            inputEl.dom.disabled = me.readOnly;        }    },    setReadOnly: function(readOnly) {        var me = this,            inputEl = me.inputEl;        if (inputEl) {            // Set the button to disabled when readonly            inputEl.dom.disabled = !!readOnly || me.disabled;        }        me.callParent(arguments);    },    getFormId: function(){        var me = this,            form;        if (!me.formId) {            form = me.up('form');            if (form) {                me.formId = form.id;            }        }        return me.formId;    }});</pre></body></html>
 |