Browse files

Enhancements:

* Added createOnBlur option to create new records when forceSelection is false
* Added addValue and removeValue functions to allow for discrete programmatic management of values
Bug Fixes:
* Modified some ordering of value tracking to ensure the current values were available for select/change events
* Modified render processing for multiselect items to better manage the input dom element
* Updated field templates to be forward compatible with 4.0.5 (4.0.2a still supported)
* Added requirements statement for use by Ext.Loader
Documentation:
* Added example showing some usages of value changing and event listening
* Minor documentation updates and refactoring
  • Loading branch information...
1 parent 3e245e4 commit 9fd2d53a38d97e896798cbe9c2a862ed134f3953 @kveeiv committed Aug 3, 2011
Showing with 315 additions and 48 deletions.
  1. +56 −0 CHANGELOG.txt
  2. +22 −2 examples/boxselect.html
  3. +99 −2 examples/boxselect.js
  4. +2 −8 src/BoxSelect.css
  5. +136 −36 src/BoxSelect.js
View
56 CHANGELOG.txt
@@ -0,0 +1,56 @@
+CURRENT RELEASE
+---------------
+v1.1 - 27 Jul 2011
+Enhancements:
+* Added createOnBlur option to create new records when forceSelection is false
+* Added addValue and removeValue functions to allow for discrete programmatic management of values
+Bug Fixes:
+* Modified some ordering of value tracking to ensure the current values were available for select/change events
+* Modified render processing for multiselect items to better manage the input dom element
+* Updated field templates to be forward compatible with 4.0.5 (4.0.2a still supported)
+* Added requirements statement for use by Ext.Loader
+Documentation:
+* Added example showing some usages of value changing and event listening
+* Minor documentation updates and refactoring
+
+
+
+Previous Updates
+----------------
+
+v1.0 - 20 Jul 2011
+* Fixes to rendering of field validation
+* Integration of features from kleins boxselect implementation
+* Fixes to value management for remote stores
+* Changes to value setting to allow for delimiter split strings of values, arrays of values, arrays of records,
+ and arrays of unknown values (for on-demand remote store loading when queryMode 'remote' and forceSelection true)
+* Added keyboard based navigation
+* Added support for forceSelection false for use-cases like entry of multiple email addresses with auto-suggest
+* Added configuration option for collapsing the open list when multiSelect is true
+* Added stacked rendering style option; added full examples page
+* Added to github with github pages hosting of examples page
+* Significant documentation updates and refactoring
+
+v0.5 - 16 Jun 2011
+* Added support for multiSelect false
+* Added typeAhead support (not possible with ComboBox's multiSelect)
+* Improved automatic field resizing
+* Ensured compatibility with 4.0.2a and with the Ext.ux.form.field.ClearButton plugin
+* Minor documentation updates and refactoring
+
+v0.4 - 8 Jun 2011
+* Styling updates for multi-selected item removal controls to match tab removal controls and improve rendering performance
+* Remote queryMode support
+* Addition of autosize event to indicate change in height similar to the textarea field
+* Fixes to value tracking to ensure the change event is properly fired
+* Minor documentation updates and reorganization of functions
+
+v0.3 - 1 Jun 2011
+* Change sizing of user input area to adjust dynamically with remaining width
+* Fix various issues with display of emptyText
+
+v0.2 - 27 May 2011
+* Change to use default value setting if store is unfiltered
+
+v0.1 - 25 May 2011
+* Initial release
View
24 examples/boxselect.html
@@ -7,7 +7,7 @@
<!-- ExtJS -->
<link rel="stylesheet" type="text/css" href="http://dev.sencha.com/deploy/ext-4.0.2a/resources/css/ext-all.css" />
<script type="text/javascript" src="http://dev.sencha.com/deploy/ext-4.0.2a/bootstrap.js"></script>
-
+
<link rel="stylesheet" type="text/css" href="../src/BoxSelect.css" />
<script type="text/javascript" src="../src/BoxSelect.js"></script>
@@ -112,7 +112,7 @@
<a href="http://docs.sencha.com/ext-js/4-0/#/api/Ext.form.field.ComboBox-cfg-displayField">displayField</a> and
<a href="http://docs.sencha.com/ext-js/4-0/#/api/Ext.form.field.ComboBox-cfg-valueField">valueField</a>. These new
records are <b>not</b> added to the combo's store automatically.</p>
- <p>There are two methods of determining when a new entry will be created:</p>
+ <p>There are three methods of determining when a new entry will be created:</p>
<ul class="config-options">
<li>
When the user types the configured <a href="http://docs.sencha.com/ext-js/4-0/#/api/Ext.form.field.ComboBox-cfg-delimiter">delimiter</a> (defaults to ', '),
@@ -122,6 +122,12 @@
<a href="#">createNewOnEnter</a> is defaulted to false. If set to true, a new entry will be created when the user presses Enter.
This configuration option only applies if forceSelection is false.
</li>
+ <li>
+ <a href="#">createNewOnBlur</a> is defaulted to false. If set to true, a new entry will be created when focus leaves the input
+ field. This configuration option only applies if forceSelection is false, and is superceded by
+ <a href="http://docs.sencha.com/ext-js/4-0/#/api/Ext.form.field.ComboBox-cfg-autoSelect">autoSelect</a> and
+ <a href="http://docs.sencha.com/ext-js/4-0/#/api/Ext.form.field.ComboBox-cfg-selectOnTab">selectOnTab</a>.
+ </li>
</ul>
<div id="emailSuggest"></div>
</div>
@@ -131,6 +137,7 @@
<p>The following configuration options are specific to the BoxSelect.</p>
<ul class="config-options">
<li><a href="#">createNewOnEnter</a> - please see the above forceSelection: false example.</li>
+ <li><a href="#">createNewOnBlur</a> - please see the above forceSelection: false example.</li>
<li><a href="#">stacked</a> is defaulted to false. If set to true, the labelled items will fill to the width of the list instead
of being only as wide as the displayed value</li>
<li><a href="#">pinList</a> is defaulted to true. If set to false, the pick list will automatically collapse after a selection is made
@@ -139,5 +146,18 @@
<div id="stackedSelect"></div>
</div>
+<div class="example">
+ <h2>Value setting and events</h2>
+ <p>The following shows examples of manually managing the values of the field and displays the value-based events. Except where noted,
+ the mixedValue parameters can be specified in any of the forms listed in the Basic Configuration examples above. In general, getRawValue
+ and setRawValue should not be used, as of ExtJS 4 they are formally for the rendered field output only.</p>
+ <ul class="config-options">
+ <li><a href="#">addValue(mixedValue)</a></li>
+ <li><a href="#">removeValue(mixedValue)</a></li>
+ <li><a href="#">getValueRecords()</a></li>
+ </ul>
+ <div id="valueSetting"></div>
+</div>
+
</body>
</html>
View
101 examples/boxselect.js
@@ -99,6 +99,7 @@ Ext.onReady(function() {
'rumpelstiltskin@guessmyname.com', 'fakeaddresses@arefake.com', 'bob@thejoneses.com'
];
+ // Example of email address field with forceSelection: false
var emailSuggest = Ext.create('Ext.ux.form.field.BoxSelect', {
fieldLabel: 'Enter multiple email addresses',
renderTo: 'emailSuggest',
@@ -107,9 +108,13 @@ Ext.onReady(function() {
store: emails,
queryMode: 'local',
forceSelection: false,
- createNewOnEnter: true
+ createNewOnEnter: true,
+ createNewOnBlur: true
});
+ // End example of email address field with forceSelection: false
+
+ // Example of multiSelect: false
var singleSelect = Ext.create('Ext.ux.form.field.BoxSelect', {
fieldLabel: 'Select a state',
renderTo: 'singleSelect',
@@ -122,7 +127,10 @@ Ext.onReady(function() {
value: 'CA',
valueField: 'abbr'
});
+ // End example of multiSelect: false
+
+ // Example of stacked and pinList
var stackedView = Ext.create('Ext.ux.form.field.BoxSelect', {
fieldLabel: 'Select multiple states',
renderTo: 'stackedSelect',
@@ -136,7 +144,96 @@ Ext.onReady(function() {
stacked: true,
pinList: false
});
+ // End example of stacked and pinList
+
-
+ // Example of value setting, retrieving and value events
+ var valuesSelect;
+ var valuesExample = Ext.create('Ext.panel.Panel', {
+ width: 500,
+ bodyPadding: 5,
+ renderTo: 'valueSetting',
+ layout: {
+ type: 'anchor'
+ },
+ defaults: {
+ anchor: '100%',
+ border: false
+ },
+ items: [{
+ xtype: 'component',
+ itemId: 'eventMessages',
+ autoEl: {
+ tag: 'div',
+ html: 'Messages:'
+ }
+ }],
+ tbar: {
+ enableOverflow: true,
+ items: [{
+ text: 'Disable',
+ enableToggle: true,
+ toggleHandler: function(field, state) {
+ valuesSelect.setDisabled(state);
+ }
+ },{
+ text: 'addValue()',
+ handler: function() {
+ emailSuggest.addValue('test@bobbers.com');
+ }
+ },{
+ text: 'getValue()',
+ handler: function() {
+ window.alert(valuesSelect.getValue());
+ }
+ },{
+ text: 'getValueRecords().length',
+ handler: function() {
+ window.alert('# of records: ' + valuesSelect.getValueRecords().length);
+ }
+ },{
+ text: 'setValue("NY, NJ")',
+ handler: function() {
+ valuesSelect.setValue("NY, NJ");
+ }
+ },{
+ text: 'addValue("CA")',
+ handler: function() {
+ valuesSelect.addValue("CA");
+ }
+ },{
+ text: 'removeValue("NJ")',
+ handler: function() {
+ valuesSelect.removeValue("NJ");
+ }
+ }]
+ }
+ });
+ var messagesBlock = valuesExample.down('#eventMessages');
+ var addMessage = function(msg) {
+ messagesBlock.update(messagesBlock.el.dom.innerHTML + '<br />' + msg);
+ };
+ valuesSelect = valuesExample.insert(0, {
+ xtype: 'boxselect',
+ itemId: 'valuesSelect',
+ fieldLabel: 'Select multiple states',
+ displayField: 'name',
+ labelWidth: 130,
+ store: statesStore,
+ queryMode: 'local',
+ valueField: 'abbr',
+ value: 'WA, TX',
+ listeners: {
+ 'change': function(field, newValue, oldValue) {
+ addMessage('[Change event] New value is "' + newValue + '" (Old was "' + oldValue + '")');
+ addMessage('[Select event] ' + field.getValueRecords().length + ' records selected.');
+ },
+ 'select': function(field, records) {
+ addMessage('[Select event] ' + records.length + ' records selected.');
+ }
+ }
+ });
+ addMessage('[Init] Initialized with string "WA, TX"');
+ // End example of value setting, retrieving and value events
});
View
10 src/BoxSelect.css
@@ -29,11 +29,11 @@
background-color: #DEE7F8;
cursor: default;
}
-.x-boxselect-item:hover {
+.x-field:not(.x-item-disabled) .x-boxselect-item:hover {
background: #BBCEF1;
border: 1px solid #6D95E0;
}
-.x-boxselect-item.selected {
+.x-field:not(.x-item-disabled) .x-boxselect-item.selected {
border: 1px solid #316AD3 !important;
background: #658FDC !important;
}
@@ -43,10 +43,4 @@
}
.x-boxselect-item-close {
cursor: pointer;
-}
-.x-boxselect-item:hover .x-boxselect-item-close {
- color: #6D95E0;
-}
-.x-boxselect-item-close:hover {
- color: white !important;
}
View
172 src/BoxSelect.js
@@ -22,13 +22,14 @@
* possible without your help. Specific thanks to
*
* @author kvee_iv http://www.sencha.com/forum/member.php?29437-kveeiv
- * @version 1.0
+ * @version 1.1
* @requires BoxSelect.css
* @xtype boxselect
*/
Ext.define('Ext.ux.form.field.BoxSelect', {
extend:'Ext.form.field.ComboBox',
alias: ['widget.comboboxselect', 'widget.boxselect'],
+ requires: ['Ext.selection.Model', 'Ext.data.Store'],
/**
* @cfg {Boolean} multiSelect
@@ -45,8 +46,8 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
forceSelection: true,
/**
- * @cfg {Boolean} selectOnFocus <tt>true</tt> to automatically select any existing field text when the field
- * receives input focus (defaults to <tt>true</tt> for best multi-select usability during querying)
+ * @cfg {Boolean} selectOnFocus <code>true</code> to automatically select any existing field text when the field
+ * receives input focus (defaults to <code>true</code> for best multi-select usability during querying)
*/
selectOnFocus: true,
@@ -55,13 +56,25 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
* When forceSelection is false, new records can be created by the user. These records are not added to the
* combo's store. By default, this creation is triggered by typing the configured 'delimiter'. With
* createNewOnEnter set to true, this creation can also be triggered by the 'enter' key. This configuration
- * option has no effect if forceSelection is true.
+ * option has no effect if forceSelection is true. (defaults to <code>false</code>)
* <code>true</code> to allow the user to press 'enter' to create a new record
* <code>false</code> to only allow the user to type the configured 'delimiter' to create a new record
*/
createNewOnEnter: false,
/**
+ * @cfg {Boolean} createNewOnBlur
+ * Similar to {@link #createNewOnEnter}, createNewOnBlur will create a new record when the field loses focus.
+ * This configuration option has no effect if forceSelection is true. Please note that this behavior is also
+ * affected by the configuration options {@link #autoSelect} and {@link #selectOnTab}. If those are true
+ * and an existing item would have been selected as a result, the partial text the user has entered will
+ * be discarded.
+ * <code>true</code> to create a new record when the field loses focus
+ * <code>false</code> to not create a new record on blur
+ */
+ createNewOnBlur: false,
+
+ /**
* @cfg {Boolean} stacked
* When stacked is true, each labelled item will fill to the width of the form field
* <code>true</code> to have each labelled item fill the width of the form field
@@ -90,7 +103,7 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
'class="x-boxselect-input-field" autocomplete="off" />',
'</li>',
'</ul>',
- '<div class="{triggerWrapCls}" role="presentation">',
+ '<div id="{cmpId}-triggerWrap" class="{triggerWrapCls}" role="presentation">',
'{triggerEl}',
'<div class="{clearCls}" role="presentation"></div>',
'</div>',
@@ -144,7 +157,7 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Register events for multiSelect management controls
+ * Register events for management controls of labelled items
*/
initEvents: function() {
var me = this;
@@ -159,7 +172,7 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Create a store for our selected records based on the main store's model
+ * Create a store for the records of our current value based on the main store's model
*/
bindStore: function(store, initial) {
var me = this,
@@ -200,7 +213,7 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Clean up multiSelect management controls
+ * Clean up labelled items management controls
*/
onDestroy: function() {
var me = this;
@@ -287,7 +300,8 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Used to determine if a record is filtered (for retaining as a multi-select value)
+ * @private
+ * Used to determine if a record is filtered (for retaining as a multiSelect value)
*/
isFilteredRecord: function(record) {
var me = this,
@@ -339,7 +353,8 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Overridden to preserve multiSelect selections when list is refiltered via overridden doRawQuery
+ * Overridden to preserve current labelled items when list is filtered/paged/loaded
+ * and does not include our current value.
*/
onListSelectionChange: function(list, selectedRecords) {
var me = this,
@@ -437,6 +452,7 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
+ * @private
* Get the current cursor position in the input field
*/
getCursorPosition: function() {
@@ -453,6 +469,7 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
+ * @private
* Check to see if the input field has selected text
*/
hasSelectedText: function() {
@@ -478,8 +495,13 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
stopEvent = false,
rec, i;
- if (!me.readOnly && !me.disabled && (valueStore.getCount() > 0) &&
- ((rawValue == '') || ((me.getCursorPosition() === 0) && !me.hasSelectedText()))) {
+ if (me.readOnly || me.disabled || !me.editable) {
+ return;
+ }
+
+ // Handle keyboard based navigation of selected labelled items
+ if ((valueStore.getCount() > 0) &&
+ ((rawValue == '') || ((me.getCursorPosition() === 0) && !me.hasSelectedText()))) {
if ((key == e.BACKSPACE) || (key == e.DELETE)) {
if (selModel.getCount() > 0) {
me.valueStore.remove(selModel.getSelection());
@@ -523,6 +545,11 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
e.stopEvent();
return;
}
+
+ // Prevent key up processing for enter if it is being handled by the picker
+ if (me.isExpanded && (key == e.ENTER) && me.picker.highlightedItem) {
+ me.preventKeyUpEvent = true;
+ }
if (me.enableKeyEvents) {
me.callParent(arguments);
@@ -535,8 +562,8 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Handles auto-selection of multiSelect items based on this field's delimiter, and
- * the keyUp processing of key-based selection of labelled items.
+ * Handles auto-selection of labelled items based on this field's delimiter, as well
+ * as the keyUp processing of key-based selection of labelled items.
*/
onKeyUp: function(e, t) {
var me = this,
@@ -545,7 +572,6 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
if (me.preventKeyUpEvent) {
e.stopEvent();
- me.selectText(0, 0);
if ((me.preventKeyUpEvent === true) || (e.getKey() === me.preventKeyUpEvent)) {
delete me.preventKeyUpEvent;
}
@@ -610,13 +636,17 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Delegation control for selecting and removing labelled items items or triggering list collapse/expansion
+ * Delegation control for selecting and removing labelled items or triggering list collapse/expansion
*/
onItemListClick: function(evt, el, o) {
var me = this,
itemEl = evt.getTarget('.x-boxselect-item'),
closeEl = itemEl ? evt.getTarget('.x-boxselect-item-close') : false;
+ if (me.readOnly || me.disabled) {
+ return;
+ }
+
if (itemEl) {
if (closeEl) {
me.removeByListItemNode(itemEl);
@@ -630,7 +660,7 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Build the markup for the multi-selected items. Template must be built on demand due to combobox initComponent
+ * Build the markup for the labelled items. Template must be built on demand due to ComboBox initComponent
* lifecycle for the creation of on-demand stores (to account for automatic valueField/displayField setting)
*/
getMultiSelectItemMarkup: function() {
@@ -668,12 +698,15 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
* Update the labelled items rendering
*/
applyMultiselectItemMarkup: function() {
- var me = this;
+ var me = this,
+ itemList = me.itemList,
+ item;
- if (me.itemList) {
- me.el.appendChild(me.inputElCt);
- me.itemList.update(me.getMultiSelectItemMarkup());
- me.itemList.appendChild(me.inputElCt);
+ if (itemList) {
+ while ((item = me.inputElCt.prev()) != null) {
+ item.remove();
+ }
+ me.inputElCt.insertHtml('beforeBegin', me.getMultiSelectItemMarkup());
me.autoSize();
me.alignPicker();
}
@@ -720,7 +753,7 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Removal of value by node reference
+ * Removal of labelled item by node reference
*/
removeByListItemNode: function(itemEl) {
var me = this,
@@ -735,6 +768,9 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
/**
* Intercept calls to getRawValue to pretend there is no inputEl for rawValue handling,
* so that we can use inputEl for just the user input.
+ *
+ * **Note that in general, raw values are the rendered value for the input field,
+ * and therefore should not be used for comboboxes or most programmatic logic.**
*/
getRawValue: function() {
var me = this,
@@ -747,8 +783,11 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Intercept calls to setRawValue to pretend there is no inputEl for rawValue handling, so that we can use inputEl
- * for just the user input. Update the multiSelect items list display based on the new values.
+ * Intercept calls to setRawValue to pretend there is no inputEl for rawValue handling,
+ * so that we can use inputEl for just the user input.
+ *
+ * **Note that in general, raw values are the rendered value for the input field,
+ * and therefore should not be used for comboboxes or most programmatic logic.**
*/
setRawValue: function(value) {
var me = this,
@@ -763,6 +802,29 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
+ * Adds a value or values to the current value of the field
+ * @param {mixed} valueMixed The value or values to add to the current value
+ */
+ addValue: function(valueMixed) {
+ var me = this;
+ if (valueMixed) {
+ me.setValue(Ext.Array.merge(me.value, Ext.Array.from(valueMixed)));
+ }
+ },
+
+ /**
+ * Removes a value or values from the current value of the field
+ * @param {mixed} valueMixed The value or values to remove from the current value
+ */
+ removeValue: function(valueMixed) {
+ var me = this;
+
+ if (valueMixed) {
+ me.setValue(Ext.Array.difference(me.value, Ext.Array.from(valueMixed)));
+ }
+ },
+
+ /**
* Intercept calls to setValue to use records from the valueStore when available.
* Unknown values (if forceSelection is true) will trigger a call to store.load
* once to try to retrieve those records. The list of unknown values will be
@@ -789,10 +851,18 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
value[i] = valueStore.getAt(valueRecord);
} else {
valueRecord = me.findRecord(valueField, record);
+ if (!valueRecord) {
+ if (me.forceSelection) {
+ unknownValues.push(record);
+ } else {
+ valueRecord = {};
+ valueRecord[me.valueField] = record;
+ valueRecord[me.displayField] = record;
+ valueRecord = new me.valueStore.model(valueRecord);
+ }
+ }
if (valueRecord) {
value[i] = valueRecord;
- } else if (me.forceSelection) {
- unknownValues.push(record);
}
}
}
@@ -819,8 +889,6 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
}
me.callParent([value, doSelect]);
-
- me.updateValueStore();
},
/**
@@ -832,15 +900,45 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Overridden to handle forcing selections on multiSelect values more directly
+ * Overridden to handle creation of new value for unforced selections
+ */
+ beforeBlur: function() {
+ var me = this;
+ me.doQueryTask.cancel();
+ me.assertValue();
+ me.collapse();
+ },
+
+ /**
+ * Overridden to clear the input field if we are auto-setting a value as we blur.
+ */
+ mimicBlur: function() {
+ var me = this;
+
+ if (me.selectOnTab && me.picker && me.picker.highlightedItem) {
+ me.inputEl.dom.value = '';
+ }
+
+ me.callParent(arguments);
+ },
+
+ /**
+ * Overridden to handle partial-input selections more directly
*/
assertValue: function() {
- var me = this,
+ var me = this,
rawValue = me.inputEl.dom.value,
- rec = rawValue ? me.findRecordByDisplay(rawValue) : false;
+ rec = !Ext.isEmpty(rawValue) ? me.findRecordByDisplay(rawValue) : false,
+ value = false;
+
+ if (!rec && !me.forceSelection && me.createNewOnBlur && !Ext.isEmpty(rawValue)) {
+ value = rawValue;
+ } else if (rec) {
+ value = rec;
+ }
- if (rec && !Ext.Array.contains(me.value, rec.get(me.valueField))) {
- me.setValue(me.value.concat(rec.get(me.valueField)));
+ if (value) {
+ me.addValue(value);
}
me.inputEl.dom.value = '';
@@ -849,9 +947,9 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
},
/**
- * Update the valueStore from the new value and fire changed events for UI updates
+ * Update the valueStore from the new value and fire change events for UI to respond to
*/
- updateValueStore: function() {
+ checkChange: function() {
var me = this,
valueStore = me.valueStore;
@@ -862,6 +960,8 @@ Ext.define('Ext.ux.form.field.BoxSelect', {
}
valueStore.resumeEvents();
valueStore.fireEvent('datachanged', valueStore);
+
+ me.callParent(arguments);
},
/**

0 comments on commit 9fd2d53

Please sign in to comment.