diff --git a/packages/main/src/MultiComboBox.js b/packages/main/src/MultiComboBox.js index 18e37978b1ed..18c11842f477 100644 --- a/packages/main/src/MultiComboBox.js +++ b/packages/main/src/MultiComboBox.js @@ -625,23 +625,37 @@ class MultiComboBox extends UI5Element { } _listSelectionChange(event) { - event.target.items.forEach(item => { - this.items.forEach(mcbItem => { - if (mcbItem._id === item.getAttribute("data-ui5-token-id")) { - mcbItem.selected = item.selected; - } - }); - }); + // sync list items and cb items + this.syncItems(event.target.items); - this.fireSelectionChange(); + // don't call selection change right after selection as user can cancel it on phone + if (!isPhone()) { + this.fireSelectionChange(); + } if (!event.detail.selectionComponentPressed && !isSpace(event.detail)) { this.allItemsPopover.close(); this.value = ""; + + // if the item (not checkbox) is clicked, call the selection change + if (isPhone()) { + this.fireSelectionChange(); + } + this.fireEvent("input"); } } + syncItems(listItems) { + listItems.forEach(item => { + this.items.forEach(mcbItem => { + if (mcbItem._id === item.getAttribute("data-ui5-token-id")) { + mcbItem.selected = item.selected; + } + }); + }); + } + fireSelectionChange() { this.fireEvent("selection-change", { items: this._getSelectedItems() }); // Angular 2 way data binding @@ -697,6 +711,15 @@ class MultiComboBox extends UI5Element { } } + _beforeOpen() { + this._itemsBeforeOpen = this.items.map(item => { + return { + ref: item, + selected: item.selected, + }; + }); + } + async onAfterRendering() { await this._getRespPopover(); await this._getList(); @@ -727,6 +750,22 @@ class MultiComboBox extends UI5Element { } } + handleCancel() { + this._itemsBeforeOpen.forEach(item => { + item.ref.selected = item.selected; + }); + + this.togglePopover(); + } + + handleOK() { + if (isPhone()) { + this.fireSelectionChange(); + } + + this.togglePopover(); + } + async openPopover() { const popover = await this._getPopover(); diff --git a/packages/main/src/MultiComboBoxPopover.hbs b/packages/main/src/MultiComboBoxPopover.hbs index 5dd35e035b55..cf63a5db95d8 100644 --- a/packages/main/src/MultiComboBoxPopover.hbs +++ b/packages/main/src/MultiComboBoxPopover.hbs @@ -4,8 +4,8 @@ class="ui5-multi-combobox-all-items-responsive-popover" hide-arrow _disable-initial-focus - @ui5-selection-change={{_listSelectionChange}} @ui5-after-close={{_toggle}} + @ui5-before-open={{_beforeOpen}} @ui5-after-open={{_toggle}} > {{#if _isPhone}} @@ -16,7 +16,7 @@ class="ui5-responsive-popover-close-btn" icon="decline" design="Transparent" - @click="{{togglePopover}}" + @click="{{handleCancel}}" > @@ -65,7 +65,7 @@ {{/if}} {{/unless}} - + {{#each _filteredItems}} {{_dialogOkButton}} {{/if}}