Skip to content
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "office-ui-fabric-react",
"comment": "ComboBox: Add Event as additional paramater to onChanged callback for saving pending changes",
"type": "minor"
}
],
"packageName": "office-ui-fabric-react",
"email": "chiechan@microsoft.com"
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import {
getClassNames,
getComboBoxOptionClassNames
} from './ComboBox.classNames';
import { BaseButton, Button } from 'src/index.bundle';

export interface IComboBoxState {

Expand Down Expand Up @@ -750,7 +751,7 @@ export class ComboBox extends BaseComponent<IComboBoxProps, IComboBoxState> {
* @param index - the index to set (or the index to set from if a search direction is provided)
* @param searchDirection - the direction to search along the options from the given index
*/
private _setSelectedIndex(index: number, searchDirection: SearchDirection = SearchDirection.none) {
private _setSelectedIndex(index: number, submitPendingValueEvent: any, searchDirection: SearchDirection = SearchDirection.none) {
const { onChanged, onPendingValueChanged } = this.props;
const { currentOptions } = this.state;
let { selectedIndices } = this.state;
Expand Down Expand Up @@ -798,7 +799,7 @@ export class ComboBox extends BaseComponent<IComboBoxProps, IComboBoxState> {

// Did the creator give us an onChanged callback?
if (onChanged) {
onChanged(option, index);
onChanged(option, index, undefined, submitPendingValueEvent);
}

// if we have a new selected index,
Expand Down Expand Up @@ -874,15 +875,15 @@ export class ComboBox extends BaseComponent<IComboBoxProps, IComboBoxState> {
if (this.state.focused) {
this.setState({ focused: false });
if (!this.props.multiSelect) {
this._submitPendingValue();
this._submitPendingValue(event);
}
}
}

/**
* Submit a pending value if there is one
*/
private _submitPendingValue() {
private _submitPendingValue(submitPendingValueEvent: any) {
const {
onChanged,
allowFreeform,
Expand Down Expand Up @@ -914,14 +915,14 @@ export class ComboBox extends BaseComponent<IComboBoxProps, IComboBoxState> {
currentPendingValue.length + (this._autofill.value.selectionEnd! - this._autofill.value.selectionStart!) === pendingOptionText.length) ||
(this._autofill.value && this._autofill.value.inputElement && this._autofill.value.inputElement.value.toLocaleLowerCase() === pendingOptionText)
)) {
this._setSelectedIndex(currentPendingValueValidIndex);
this._setSelectedIndex(currentPendingValueValidIndex, submitPendingValueEvent);
this._clearPendingInfo();
return;
}
}

if (onChanged) {
onChanged(undefined, undefined, currentPendingValue);
onChanged(undefined, undefined, currentPendingValue, submitPendingValueEvent);
} else {
// If we are not controlled, create a new option
const newOption: IComboBoxOption = { key: currentPendingValue, text: currentPendingValue };
Expand All @@ -940,10 +941,10 @@ export class ComboBox extends BaseComponent<IComboBoxProps, IComboBoxState> {
} else if (currentPendingValueValidIndex >= 0) {
// Since we are not allowing freeform, we must have a matching
// to be able to update state
this._setSelectedIndex(currentPendingValueValidIndex);
this._setSelectedIndex(currentPendingValueValidIndex, submitPendingValueEvent);
} else if (currentPendingValueValidIndexOnHover >= 0) {
// If all else failed and we were hovering over an item, select it
this._setSelectedIndex(currentPendingValueValidIndexOnHover);
this._setSelectedIndex(currentPendingValueValidIndexOnHover, submitPendingValueEvent, );
}

// Finally, clear the pending info
Expand Down Expand Up @@ -1241,9 +1242,9 @@ export class ComboBox extends BaseComponent<IComboBoxProps, IComboBoxState> {
* to select the item and also close the menu
* @param index - the index of the item that was clicked
*/
private _onItemClick(index: number | undefined): () => void {
return (): void => {
this._setSelectedIndex(index as number);
private _onItemClick(index: number | undefined): (ev: any) => void {
return (ev: any): void => {
this._setSelectedIndex(index as number, ev);
if (!this.props.multiSelect) {
// only close the callout when it's in single-select mode
this.setState({
Expand Down Expand Up @@ -1471,7 +1472,7 @@ export class ComboBox extends BaseComponent<IComboBoxProps, IComboBoxState> {

switch (ev.which) {
case KeyCodes.enter:
this._submitPendingValue();
this._submitPendingValue(ev);
if (this.props.multiSelect && isOpen) {
this.setState({
currentPendingValueValidIndex: index
Expand Down Expand Up @@ -1499,7 +1500,7 @@ export class ComboBox extends BaseComponent<IComboBoxProps, IComboBoxState> {
case KeyCodes.tab:
// On enter submit the pending value
if (!this.props.multiSelect) {
this._submitPendingValue();
this._submitPendingValue(ev);
}

// If we are not allowing freeform
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export interface IComboBoxProps extends ISelectableDroppableTextProps<IComboBox>
* 2) a manually edited value is submitted. In this case there may not be a matched option if allowFreeform is also true
* (and hence only value would be true, the other parameter would be null in this case)
*/
onChanged?: (option?: IComboBoxOption, index?: number, value?: string) => void;
onChanged?: (option?: IComboBoxOption, index?: number, value?: string, submitPendingValueEvent?: any) => void;

/**
* Callback issued when the user changes the pending value in ComboBox
Expand Down