Skip to content

Commit cb0d6fc

Browse files
devversiontinayuangao
authored andcommitted
feat(button-toggle): add option for vertical toggle groups (#1936)
* feat(button-toggle): add option for vertical toggle groups Adds a new input for showing the associated toggles in a group vertically. Closes #1892. * Prefix md-vertical class with component name
1 parent e09ff61 commit cb0d6fc

File tree

6 files changed

+75
-6
lines changed

6 files changed

+75
-6
lines changed

src/demo-app/button-toggle/button-toggle-demo.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
<p>
2+
<md-checkbox (change)="isVertical = $event.checked">Show Button Toggles Vertical</md-checkbox>
3+
</p>
4+
15
<h1>Exclusive Selection</h1>
26

37
<section class="demo-section">
4-
<md-button-toggle-group name="alignment">
8+
<md-button-toggle-group name="alignment" [vertical]="isVertical">
59
<md-button-toggle value="left"><md-icon>format_align_left</md-icon></md-button-toggle>
610
<md-button-toggle value="center"><md-icon>format_align_center</md-icon></md-button-toggle>
711
<md-button-toggle value="right"><md-icon>format_align_right</md-icon></md-button-toggle>
@@ -12,7 +16,7 @@ <h1>Exclusive Selection</h1>
1216
<h1>Disabled Group</h1>
1317

1418
<section class="demo-section">
15-
<md-button-toggle-group name="checkbox" disabled>
19+
<md-button-toggle-group name="checkbox" [vertical]="isVertical" disabled>
1620
<md-button-toggle value="bold">
1721
<md-icon class="md-24">format_bold</md-icon>
1822
</md-button-toggle>
@@ -27,7 +31,7 @@ <h1>Disabled Group</h1>
2731

2832
<h1>Multiple Selection</h1>
2933
<section class="demo-section">
30-
<md-button-toggle-group multiple>
34+
<md-button-toggle-group multiple [vertical]="isVertical">
3135
<md-button-toggle>Flour</md-button-toggle>
3236
<md-button-toggle>Eggs</md-button-toggle>
3337
<md-button-toggle>Sugar</md-button-toggle>
@@ -40,7 +44,7 @@ <h1>Single Toggle</h1>
4044

4145
<h1>Dynamic Exclusive Selection</h1>
4246
<section class="demo-section">
43-
<md-button-toggle-group name="pies" [(ngModel)]="favoritePie">
47+
<md-button-toggle-group name="pies" [(ngModel)]="favoritePie" [vertical]="isVertical">
4448
<md-button-toggle *ngFor="let pie of pieOptions" [value]="pie">
4549
{{pie}}
4650
</md-button-toggle>

src/demo-app/button-toggle/button-toggle-demo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {MdUniqueSelectionDispatcher} from '@angular/material';
88
providers: [MdUniqueSelectionDispatcher],
99
})
1010
export class ButtonToggleDemo {
11+
isVertical = false;
1112
favoritePie = 'Apple';
1213
pieOptions = [
1314
'Apple',

src/lib/button-toggle/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ Output:
124124
| `disabled` | boolean | Optional, default = `false`. |
125125
| `value` | any | The current value for the group. Will be set to the value of the selected toggle or a list of values from the selected toggles. |
126126
| `selected` | `mdButtonToggle` | The current selected toggle or a list of the selected toggles. |
127+
| `vertical` | boolean | Whether the group should show the toggles vertically. Default is `false`. |
127128

128129
### Attributes
129130

src/lib/button-toggle/button-toggle.scss

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,25 @@ md-button-toggle-group {
99
@include md-elevation(2);
1010
position: relative;
1111
display: inline-flex;
12+
flex-direction: row;
13+
1214
border-radius: $md-button-toggle-border-radius;
15+
1316
cursor: pointer;
1417
white-space: nowrap;
1518
}
1619

20+
.md-button-toggle-vertical {
21+
flex-direction: column;
22+
23+
.md-button-toggle-label-content {
24+
// Vertical button toggles shouldn't be an inline-block, because the toggles should
25+
// fill the available width in the group.
26+
display: block;
27+
}
28+
}
29+
30+
1731
.md-button-toggle-disabled .md-button-toggle-label-content {
1832
cursor: default;
1933
}

src/lib/button-toggle/button-toggle.spec.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,15 @@ describe('MdButtonToggle', () => {
126126
expect(groupInstance.value);
127127
});
128128

129+
it('should change the vertical state', () => {
130+
expect(groupNativeElement.classList).not.toContain('md-button-toggle-vertical');
131+
132+
groupInstance.vertical = true;
133+
fixture.detectChanges();
134+
135+
expect(groupNativeElement.classList).toContain('md-button-toggle-vertical');
136+
});
137+
129138
it('should emit a change event from button toggles', fakeAsync(() => {
130139
expect(buttonToggleInstances[0].checked).toBe(false);
131140

@@ -412,6 +421,15 @@ describe('MdButtonToggle', () => {
412421
expect(buttonToggleInstances[0].checked).toBe(true);
413422
});
414423

424+
it('should change the vertical state', () => {
425+
expect(groupNativeElement.classList).not.toContain('md-button-toggle-vertical');
426+
427+
groupInstance.vertical = true;
428+
fixture.detectChanges();
429+
430+
expect(groupNativeElement.classList).toContain('md-button-toggle-vertical');
431+
});
432+
415433
it('should deselect a button toggle when selected twice', () => {
416434
buttonToggleNativeElements[0].click();
417435
fixture.detectChanges();
@@ -506,7 +524,7 @@ describe('MdButtonToggle', () => {
506524

507525
@Component({
508526
template: `
509-
<md-button-toggle-group [disabled]="isGroupDisabled" [value]="groupValue">
527+
<md-button-toggle-group [disabled]="isGroupDisabled" [vertical]="isVertical" [value]="groupValue">
510528
<md-button-toggle value="test1">Test1</md-button-toggle>
511529
<md-button-toggle value="test2">Test2</md-button-toggle>
512530
<md-button-toggle value="test3">Test3</md-button-toggle>
@@ -515,6 +533,7 @@ describe('MdButtonToggle', () => {
515533
})
516534
class ButtonTogglesInsideButtonToggleGroup {
517535
isGroupDisabled: boolean = false;
536+
isVertical: boolean = false;
518537
groupValue: string = null;
519538
}
520539

@@ -539,7 +558,7 @@ class ButtonToggleGroupWithNgModel {
539558

540559
@Component({
541560
template: `
542-
<md-button-toggle-group [disabled]="isGroupDisabled" multiple>
561+
<md-button-toggle-group [disabled]="isGroupDisabled" [vertical]="isVertical" multiple>
543562
<md-button-toggle value="eggs">Eggs</md-button-toggle>
544563
<md-button-toggle value="flour">Flour</md-button-toggle>
545564
<md-button-toggle value="sugar">Sugar</md-button-toggle>
@@ -548,6 +567,7 @@ class ButtonToggleGroupWithNgModel {
548567
})
549568
class ButtonTogglesInsideButtonToggleGroupMultiple {
550569
isGroupDisabled: boolean = false;
570+
isVertical: boolean = false;
551571
}
552572

553573
@Component({

src/lib/button-toggle/button-toggle.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export class MdButtonToggleChange {
4747
providers: [MD_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR],
4848
host: {
4949
'role': 'radiogroup',
50+
'[class.md-button-toggle-vertical]': 'vertical'
5051
},
5152
exportAs: 'mdButtonToggleGroup',
5253
})
@@ -60,6 +61,9 @@ export class MdButtonToggleGroup implements AfterViewInit, ControlValueAccessor
6061
/** Disables all toggles in the group. */
6162
private _disabled: boolean = null;
6263

64+
/** Whether the button toggle group should be vertical. */
65+
private _vertical: boolean = false;
66+
6367
/** The currently selected button toggle, should match the value. */
6468
private _selected: MdButtonToggle = null;
6569

@@ -109,6 +113,15 @@ export class MdButtonToggleGroup implements AfterViewInit, ControlValueAccessor
109113
this._disabled = coerceBooleanProperty(value);
110114
}
111115

116+
@Input()
117+
get vertical(): boolean {
118+
return this._vertical;
119+
}
120+
121+
set vertical(value) {
122+
this._vertical = coerceBooleanProperty(value);
123+
}
124+
112125
@Input()
113126
get value(): any {
114127
return this._value;
@@ -207,11 +220,17 @@ export class MdButtonToggleGroup implements AfterViewInit, ControlValueAccessor
207220
@Directive({
208221
selector: 'md-button-toggle-group[multiple]',
209222
exportAs: 'mdButtonToggleGroup',
223+
host: {
224+
'[class.md-button-toggle-vertical]': 'vertical'
225+
}
210226
})
211227
export class MdButtonToggleGroupMultiple {
212228
/** Disables all toggles in the group. */
213229
private _disabled: boolean = null;
214230

231+
/** Whether the button toggle group should be vertical. */
232+
private _vertical: boolean = false;
233+
215234
@Input()
216235
get disabled(): boolean {
217236
return this._disabled;
@@ -220,6 +239,16 @@ export class MdButtonToggleGroupMultiple {
220239
set disabled(value) {
221240
this._disabled = (value != null && value !== false) ? true : null;
222241
}
242+
243+
@Input()
244+
get vertical(): boolean {
245+
return this._vertical;
246+
}
247+
248+
set vertical(value) {
249+
this._vertical = coerceBooleanProperty(value);
250+
}
251+
223252
}
224253

225254
@Component({

0 commit comments

Comments
 (0)