fix(select): wrong item order in label in rtl (#3567)

Fixes selected items not having the proper order in the label when `md-select` is in `multiple` mode and in RTL.
This commit is contained in:
Kristiyan Kostadinov
2017-03-29 23:30:32 +02:00
committed by tinayuangao
parent 8e6720b602
commit 52ea7a34e2
2 changed files with 41 additions and 4 deletions
+29 -1
View File
@@ -26,7 +26,7 @@ import {wrappedErrorMessage} from '../core/testing/wrapped-error-message';
describe('MdSelect', () => {
let overlayContainerElement: HTMLElement;
let dir: {value: string};
let dir: {value: 'ltr'|'rtl'};
beforeEach(async(() => {
TestBed.configureTestingModule({
@@ -1571,6 +1571,23 @@ describe('MdSelect', () => {
expect(fixture.componentInstance.control.value).toEqual(['steak-0', 'pizza-1', 'tacos-2']);
});
it('should sort the selected options in reverse in rtl', () => {
dir.value = 'rtl';
trigger.click();
fixture.detectChanges();
const options = overlayContainerElement.querySelectorAll('md-option') as
NodeListOf<HTMLElement>;
options[2].click();
options[0].click();
options[1].click();
fixture.detectChanges();
expect(trigger.textContent).toContain('Tacos, Pizza, Steak');
expect(fixture.componentInstance.control.value).toEqual(['steak-0', 'pizza-1', 'tacos-2']);
});
it('should sort the values, that get set via the model, based on the panel order', () => {
trigger.click();
fixture.detectChanges();
@@ -1581,6 +1598,17 @@ describe('MdSelect', () => {
expect(trigger.textContent).toContain('Steak, Pizza, Tacos');
});
it('should reverse sort the values, that get set via the model in rtl', () => {
dir.value = 'rtl';
trigger.click();
fixture.detectChanges();
testInstance.control.setValue(['tacos-2', 'steak-0', 'pizza-1']);
fixture.detectChanges();
expect(trigger.textContent).toContain('Tacos, Pizza, Steak');
});
it('should throw an exception when trying to set a non-array value', () => {
expect(() => {
testInstance.control.setValue('not-an-array');
+12 -3
View File
@@ -420,9 +420,18 @@ export class MdSelect implements AfterContentInit, ControlValueAccessor, OnDestr
/** The value displayed in the trigger. */
get triggerValue(): string {
return this.multiple ?
this._selectionModel.selected.map(option => option.viewValue).join(', ') :
this._selectionModel.selected[0].viewValue;
if (this._multiple) {
let selectedOptions = this._selectionModel.selected.map(option => option.viewValue);
if (this._isRtl()) {
selectedOptions.reverse();
}
// TODO(crisbeto): delimiter should be configurable for proper localization.
return selectedOptions.join(', ');
}
return this._selectionModel.selected[0].viewValue;
}
/** Whether the element is in RTL mode. */