`
})
-class FocusTrapTestApp {
+class FocusTrapWithBindings {
@ViewChild(FocusTrapDirective) focusTrapDirective: FocusTrapDirective;
renderFocusTrap = true;
isFocusTrapEnabled = true;
@@ -131,6 +153,6 @@ class FocusTrapTestApp {
`
})
-class FocusTrapTargetTestApp {
+class FocusTrapTargets {
@ViewChild(FocusTrapDirective) focusTrapDirective: FocusTrapDirective;
}
diff --git a/src/lib/core/a11y/focus-trap.ts b/src/lib/core/a11y/focus-trap.ts
index f8289d42b75a..7bdbd42f5574 100644
--- a/src/lib/core/a11y/focus-trap.ts
+++ b/src/lib/core/a11y/focus-trap.ts
@@ -222,7 +222,7 @@ export class FocusTrapDirective implements OnDestroy, AfterContentInit {
/** Whether the focus trap is active. */
@Input('cdkTrapFocus')
get enabled(): boolean { return this.focusTrap.enabled; }
- set enabled(val: boolean) { this.focusTrap.enabled = val; }
+ set enabled(value: boolean) { this.focusTrap.enabled = coerceBooleanProperty(value); }
constructor(private _elementRef: ElementRef, private _focusTrapFactory: FocusTrapFactory) {
this.focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement, true);
From 1bf1df734b8cd27e8885aa2754ac3ba466d66ed6 Mon Sep 17 00:00:00 2001
From: Kara Erickson
Date: Thu, 2 Mar 2017 18:00:50 -0800
Subject: [PATCH 02/24] docs(autocomplete): fix a11y of autocomplete example
---
src/demo-app/autocomplete/autocomplete-demo.ts | 3 ++-
.../autocomplete-overview/autocomplete-overview-example.ts | 3 ++-
src/lib/autocomplete/autocomplete.md | 4 ++--
3 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/demo-app/autocomplete/autocomplete-demo.ts b/src/demo-app/autocomplete/autocomplete-demo.ts
index 7f9ed2de234b..00fbeeb1a15c 100644
--- a/src/demo-app/autocomplete/autocomplete-demo.ts
+++ b/src/demo-app/autocomplete/autocomplete-demo.ts
@@ -88,7 +88,8 @@ export class AutocompleteDemo {
}
filterStates(val: string) {
- return val ? this.states.filter((s) => s.name.match(new RegExp(val, 'gi'))) : this.states;
+ return val ? this.states.filter(s => new RegExp(`^${val}`, 'gi').test(s.name))
+ : this.states;
}
}
diff --git a/src/examples/autocomplete-overview/autocomplete-overview-example.ts b/src/examples/autocomplete-overview/autocomplete-overview-example.ts
index 515e35e9e501..7b28b28b998b 100644
--- a/src/examples/autocomplete-overview/autocomplete-overview-example.ts
+++ b/src/examples/autocomplete-overview/autocomplete-overview-example.ts
@@ -71,7 +71,8 @@ export class AutocompleteOverviewExample {
}
filterStates(val: string) {
- return val ? this.states.filter((s) => new RegExp(val, 'gi').test(s)) : this.states;
+ return val ? this.states.filter(s => new RegExp(`^${val}`, 'gi').test(s))
+ : this.states;
}
}
diff --git a/src/lib/autocomplete/autocomplete.md b/src/lib/autocomplete/autocomplete.md
index 19f4acbededa..f0b21b3effbf 100644
--- a/src/lib/autocomplete/autocomplete.md
+++ b/src/lib/autocomplete/autocomplete.md
@@ -75,7 +75,7 @@ class MyComp {
}
filter(val: string): string[] {
- return this.options.filter(option => new RegExp(val, 'gi').test(option));
+ return this.options.filter(option => new RegExp(`^${val}`, 'gi').test(option));
}
}
```
@@ -134,7 +134,7 @@ class MyComp {
}
filter(name: string): User[] {
- return this.options.filter(option => new RegExp(name, 'gi').test(option));
+ return this.options.filter(option => new RegExp(`^${name}`, 'gi').test(option));
}
displayFn(user: User): string {
From 0ac6e183a5e5f6eaea2745c853a0496166ef8e12 Mon Sep 17 00:00:00 2001
From: Kara Erickson
Date: Fri, 3 Mar 2017 16:06:14 -0800
Subject: [PATCH 03/24] docs(autocomplete): add guidance about filter criteria
---
src/lib/autocomplete/autocomplete.md | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/lib/autocomplete/autocomplete.md b/src/lib/autocomplete/autocomplete.md
index f0b21b3effbf..7d2884c48fa7 100644
--- a/src/lib/autocomplete/autocomplete.md
+++ b/src/lib/autocomplete/autocomplete.md
@@ -48,15 +48,19 @@ local template variable (here we called it "auto"), and binding that variable to
At this point, the autocomplete panel should be toggleable on focus and options should be selectable. But if we want
our options to filter when we type, we need to add a custom filter.
-You can filter the options in any way you want based on the text input. Here we will do a simple string test on the
-input value to see if it matches the option value. We already have access to the built-in `valueChanges` observable on
-the `FormControl`, so we can simply map the text input's values to the suggested options by passing them through this
-filter. The resulting observable (`filteredOptions`) can be added to the template in place of the `options` property
-using the `async` pipe.
+You can filter the options in any way you like based on the text input*. Here we will perform a simple string test on
+the option value to see if it matches the input value, starting from the option's first letter. We already have access
+to the built-in `valueChanges` observable on the `FormControl`, so we can simply map the text input's values to the
+suggested options by passing them through this filter. The resulting observable (`filteredOptions`) can be added to the
+template in place of the `options` property using the `async` pipe.
Below we are also priming our value change stream with `null` so that the options are filtered by that value on init
(before there are any value changes).
+*For optimal accessibility, you may want to consider adding text guidance on the page to explain filter criteria.
+This is especially helpful for screenreader users if you're using a non-standard filter that doesn't limit matches
+to the beginning of the string.
+
*my-comp.ts*
```ts
class MyComp {
From 5cc50d2de503f64b57124efc3016b01571a65551 Mon Sep 17 00:00:00 2001
From: Paul Gschwendtner
Date: Sat, 4 Mar 2017 02:00:53 +0100
Subject: [PATCH 04/24] fix(ripple): fade-out-all should hide all ripples
(#3400)
---
src/lib/core/ripple/index.ts | 2 +-
src/lib/core/ripple/ripple-ref.ts | 8 +++
src/lib/core/ripple/ripple-renderer.ts | 29 +++++++---
src/lib/core/ripple/ripple.spec.ts | 76 +++++++++++++++++++++++++-
4 files changed, 104 insertions(+), 11 deletions(-)
diff --git a/src/lib/core/ripple/index.ts b/src/lib/core/ripple/index.ts
index 9625c70743c9..45dea58ec64f 100644
--- a/src/lib/core/ripple/index.ts
+++ b/src/lib/core/ripple/index.ts
@@ -5,7 +5,7 @@ import {VIEWPORT_RULER_PROVIDER} from '../overlay/position/viewport-ruler';
import {SCROLL_DISPATCHER_PROVIDER} from '../overlay/scroll/scroll-dispatcher';
export {MdRipple} from './ripple';
-export {RippleRef} from './ripple-ref';
+export {RippleRef, RippleState} from './ripple-ref';
export {RippleConfig} from './ripple-renderer';
@NgModule({
diff --git a/src/lib/core/ripple/ripple-ref.ts b/src/lib/core/ripple/ripple-ref.ts
index 78a293802be1..91dbc430c4ad 100644
--- a/src/lib/core/ripple/ripple-ref.ts
+++ b/src/lib/core/ripple/ripple-ref.ts
@@ -1,10 +1,18 @@
import {RippleConfig, RippleRenderer} from './ripple-renderer';
+/** Possible states for a ripple element. */
+export enum RippleState {
+ FADING_IN, VISIBLE, FADING_OUT, HIDDEN
+}
+
/**
* Reference to a previously launched ripple element.
*/
export class RippleRef {
+ /** Current state of the ripple reference. */
+ state: RippleState = RippleState.HIDDEN;
+
constructor(
private _renderer: RippleRenderer,
public element: HTMLElement,
diff --git a/src/lib/core/ripple/ripple-renderer.ts b/src/lib/core/ripple/ripple-renderer.ts
index 6b31dbd2473d..f4e15d869213 100644
--- a/src/lib/core/ripple/ripple-renderer.ts
+++ b/src/lib/core/ripple/ripple-renderer.ts
@@ -1,6 +1,6 @@
import {ElementRef, NgZone} from '@angular/core';
import {ViewportRuler} from '../overlay/position/viewport-ruler';
-import {RippleRef} from './ripple-ref';
+import {RippleRef, RippleState} from './ripple-ref';
/** Fade-in duration for the ripples. Can be modified with the speedFactor option. */
export const RIPPLE_FADE_IN_DURATION = 450;
@@ -101,12 +101,17 @@ export class RippleRenderer {
// Exposed reference to the ripple that will be returned.
let rippleRef = new RippleRef(this, ripple, config);
+ rippleRef.state = RippleState.FADING_IN;
+
+ // Add the ripple reference to the list of all active ripples.
+ this._activeRipples.add(rippleRef);
+
// Wait for the ripple element to be completely faded in.
// Once it's faded in, the ripple can be hidden immediately if the mouse is released.
this.runTimeoutOutsideZone(() => {
- if (config.persistent || this._isMousedown) {
- this._activeRipples.add(rippleRef);
- } else {
+ rippleRef.state = RippleState.VISIBLE;
+
+ if (!config.persistent && !this._isMousedown) {
rippleRef.fadeOut();
}
}, duration);
@@ -115,16 +120,22 @@ export class RippleRenderer {
}
/** Fades out a ripple reference. */
- fadeOutRipple(ripple: RippleRef) {
- let rippleEl = ripple.element;
+ fadeOutRipple(rippleRef: RippleRef) {
+ // For ripples that are not active anymore, don't re-un the fade-out animation.
+ if (!this._activeRipples.delete(rippleRef)) {
+ return;
+ }
- this._activeRipples.delete(ripple);
+ let rippleEl = rippleRef.element;
rippleEl.style.transitionDuration = `${RIPPLE_FADE_OUT_DURATION}ms`;
rippleEl.style.opacity = '0';
+ rippleRef.state = RippleState.FADING_OUT;
+
// Once the ripple faded out, the ripple can be safely removed from the DOM.
this.runTimeoutOutsideZone(() => {
+ rippleRef.state = RippleState.HIDDEN;
rippleEl.parentNode.removeChild(rippleEl);
}, RIPPLE_FADE_OUT_DURATION);
}
@@ -163,9 +174,9 @@ export class RippleRenderer {
private onMouseup() {
this._isMousedown = false;
- // On mouseup, fade-out all ripples that are active and not persistent.
+ // Fade-out all ripples that are completely visible and not persistent.
this._activeRipples.forEach(ripple => {
- if (!ripple.config.persistent) {
+ if (!ripple.config.persistent && ripple.state === RippleState.VISIBLE) {
ripple.fadeOut();
}
});
diff --git a/src/lib/core/ripple/ripple.spec.ts b/src/lib/core/ripple/ripple.spec.ts
index 71531a9abbff..6db9435fdd0a 100644
--- a/src/lib/core/ripple/ripple.spec.ts
+++ b/src/lib/core/ripple/ripple.spec.ts
@@ -1,6 +1,6 @@
import {TestBed, ComponentFixture, fakeAsync, tick, inject} from '@angular/core/testing';
import {Component, ViewChild} from '@angular/core';
-import {MdRipple, MdRippleModule} from './index';
+import {MdRipple, MdRippleModule, RippleState} from './index';
import {ViewportRuler} from '../overlay/position/viewport-ruler';
import {RIPPLE_FADE_OUT_DURATION, RIPPLE_FADE_IN_DURATION} from './ripple-renderer';
import {dispatchMouseEvent} from '../testing/dispatch-events';
@@ -77,6 +77,39 @@ describe('MdRipple', () => {
expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
}));
+ it('should remove ripples after mouseup', fakeAsync(() => {
+ dispatchMouseEvent(rippleTarget, 'mousedown');
+
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1);
+
+ // Fakes the duration of fading-in and fading-out normal ripples.
+ // The fade-out duration has been added to ensure that didn't start fading out.
+ tick(RIPPLE_FADE_IN_DURATION + RIPPLE_FADE_OUT_DURATION);
+
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1);
+
+ dispatchMouseEvent(rippleTarget, 'mouseup');
+ tick(RIPPLE_FADE_OUT_DURATION);
+
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
+ }));
+
+ it('should not hide ripples while animating.', fakeAsync(() => {
+ // Calculates the duration for fading-in and fading-out the ripple.
+ let hideDuration = RIPPLE_FADE_IN_DURATION + RIPPLE_FADE_OUT_DURATION;
+
+ dispatchMouseEvent(rippleTarget, 'mousedown');
+ dispatchMouseEvent(rippleTarget, 'mouseup');
+
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1);
+
+ tick(hideDuration - 10);
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1);
+
+ tick(10);
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
+ }));
+
it('creates ripples when manually triggered', () => {
expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
@@ -270,6 +303,47 @@ describe('MdRipple', () => {
expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
}));
+ it('should remove ripples that are not done fading-in', fakeAsync(() => {
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
+
+ rippleDirective.launch(0, 0);
+
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1);
+
+ tick(RIPPLE_FADE_IN_DURATION / 2);
+
+ rippleDirective.fadeOutAll();
+
+ tick(RIPPLE_FADE_OUT_DURATION);
+
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length)
+ .toBe(0, 'Expected no ripples to be active after calling fadeOutAll.');
+ }));
+
+ it('should properly set ripple states', fakeAsync(() => {
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
+
+ let rippleRef = rippleDirective.launch(0, 0, { persistent: true });
+
+ expect(rippleRef.state).toBe(RippleState.FADING_IN);
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1);
+
+ tick(RIPPLE_FADE_IN_DURATION);
+
+ expect(rippleRef.state).toBe(RippleState.VISIBLE);
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1);
+
+ rippleRef.fadeOut();
+
+ expect(rippleRef.state).toBe(RippleState.FADING_OUT);
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1);
+
+ tick(RIPPLE_FADE_OUT_DURATION);
+
+ expect(rippleRef.state).toBe(RippleState.HIDDEN);
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
+ }));
+
});
describe('configuring behavior', () => {
From f4323b2c0f80a81284402a12852522c72b781346 Mon Sep 17 00:00:00 2001
From: tinayuangao
Date: Fri, 3 Mar 2017 17:18:30 -0800
Subject: [PATCH 05/24] fix(checkbox): show checkbox animation only if user
click or indeterminate state (#3137)
Fixes #2783
---
src/lib/checkbox/checkbox.spec.ts | 4 ++--
src/lib/checkbox/checkbox.ts | 19 +++++++++++--------
2 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/src/lib/checkbox/checkbox.spec.ts b/src/lib/checkbox/checkbox.spec.ts
index 47d7a1efbc37..c278585214fe 100644
--- a/src/lib/checkbox/checkbox.spec.ts
+++ b/src/lib/checkbox/checkbox.spec.ts
@@ -384,11 +384,11 @@ describe('MdCheckbox', () => {
describe('state transition css classes', () => {
it('should transition unchecked -> checked -> unchecked', () => {
- testComponent.isChecked = true;
+ inputElement.click();
fixture.detectChanges();
expect(checkboxNativeElement.classList).toContain('mat-checkbox-anim-unchecked-checked');
- testComponent.isChecked = false;
+ inputElement.click();
fixture.detectChanges();
expect(checkboxNativeElement.classList)
.not.toContain('mat-checkbox-anim-unchecked-checked');
diff --git a/src/lib/checkbox/checkbox.ts b/src/lib/checkbox/checkbox.ts
index 14e7d642be5e..a6196e0e3fdf 100644
--- a/src/lib/checkbox/checkbox.ts
+++ b/src/lib/checkbox/checkbox.ts
@@ -195,8 +195,6 @@ export class MdCheckbox implements ControlValueAccessor {
this.indeterminateChange.emit(this._indeterminate);
}
this._checked = checked;
- this._transitionCheckState(
- this._checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked);
this._changeDetectorRef.markForCheck();
}
}
@@ -217,13 +215,14 @@ export class MdCheckbox implements ControlValueAccessor {
set indeterminate(indeterminate: boolean) {
let changed = indeterminate != this._indeterminate;
this._indeterminate = indeterminate;
- if (this._indeterminate) {
- this._transitionCheckState(TransitionCheckState.Indeterminate);
- } else {
- this._transitionCheckState(
- this.checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked);
- }
+
if (changed) {
+ if (this._indeterminate) {
+ this._transitionCheckState(TransitionCheckState.Indeterminate);
+ } else {
+ this._transitionCheckState(
+ this.checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked);
+ }
this.indeterminateChange.emit(this._indeterminate);
}
}
@@ -348,6 +347,8 @@ export class MdCheckbox implements ControlValueAccessor {
if (!this.disabled) {
this.toggle();
+ this._transitionCheckState(
+ this._checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked);
// Emit our custom change event if the native input emitted one.
// It is important to only emit it, if the native input triggered one, because
@@ -379,6 +380,8 @@ export class MdCheckbox implements ControlValueAccessor {
// [checked] bound to it.
if (newState === TransitionCheckState.Checked) {
animSuffix = 'unchecked-checked';
+ } else if (newState == TransitionCheckState.Indeterminate) {
+ animSuffix = 'unchecked-indeterminate';
} else {
return '';
}
From fb565c01172797a7ddc32e5631ab1ec3c42e913c Mon Sep 17 00:00:00 2001
From: tinayuangao
Date: Fri, 3 Mar 2017 17:20:00 -0800
Subject: [PATCH 06/24] feat(checkbox): add value attribute to md-checkbox
(#2701)
Fixes #2583
---
src/demo-app/checkbox/checkbox-demo.html | 3 ++-
src/lib/checkbox/checkbox.html | 1 +
src/lib/checkbox/checkbox.spec.ts | 10 +++++++++-
src/lib/checkbox/checkbox.ts | 3 +++
4 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/src/demo-app/checkbox/checkbox-demo.html b/src/demo-app/checkbox/checkbox-demo.html
index 73fdfc6e2c91..28760dac161c 100644
--- a/src/demo-app/checkbox/checkbox-demo.html
+++ b/src/demo-app/checkbox/checkbox-demo.html
@@ -1,7 +1,8 @@
md-checkbox: Basic Example
diff --git a/src/lib/input/input-container.scss b/src/lib/input/input-container.scss
index 4f8fc4f17659..134a05e9df1f 100644
--- a/src/lib/input/input-container.scss
+++ b/src/lib/input/input-container.scss
@@ -234,8 +234,16 @@ $mat-input-underline-disabled-background-image:
}
}
-// Prevents the prefix and suffix from stretching together with the container.
.mat-input-prefix, .mat-input-suffix {
+ // Prevents the prefix and suffix from stretching together with the container.
width: 0.1px;
white-space: nowrap;
+
+ // Allow icons in a prefix/suffix to adapt to the correct size.
+ & .mat-icon {
+ width: auto;
+ height: auto;
+ font-size: 100%;
+ vertical-align: top;
+ }
}
From 94adecdb5e40be6f5c48dcb0c37c6bed100ea0cd Mon Sep 17 00:00:00 2001
From: Kristiyan Kostadinov
Date: Sat, 4 Mar 2017 03:46:41 +0100
Subject: [PATCH 11/24] refactor(focus-origin-monitor): complete stream when
stopping monitor (#3404)
---
src/lib/core/style/focus-origin-monitor.ts | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/lib/core/style/focus-origin-monitor.ts b/src/lib/core/style/focus-origin-monitor.ts
index bbb61f284700..42d83bb012cd 100644
--- a/src/lib/core/style/focus-origin-monitor.ts
+++ b/src/lib/core/style/focus-origin-monitor.ts
@@ -102,12 +102,15 @@ export class FocusOriginMonitor {
* @param element The element to stop monitoring.
*/
unmonitor(element: Element): void {
- if (!this._elementInfo.has(element)) {
- return;
+ let elementInfo = this._elementInfo.get(element);
+
+ if (elementInfo) {
+ elementInfo.unlisten();
+ elementInfo.subject.complete();
+
+ this._setClasses(element, null);
+ this._elementInfo.delete(element);
}
- this._elementInfo.get(element).unlisten();
- this._setClasses(element, null);
- this._elementInfo.delete(element);
}
/**
From b80825602da7bca92125bdb73f3b9d634ff32c2f Mon Sep 17 00:00:00 2001
From: Heo
Date: Sun, 5 Mar 2017 07:53:23 +0900
Subject: [PATCH 12/24] docs(dialog): update dialog afterClosed (#3411)
---
src/lib/dialog/dialog.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/lib/dialog/dialog.md b/src/lib/dialog/dialog.md
index 3b858bf38e39..622f4b724294 100644
--- a/src/lib/dialog/dialog.md
+++ b/src/lib/dialog/dialog.md
@@ -17,7 +17,7 @@ The `MdDialogRef` provides a handle on the opened dialog. It can be used to clos
receive notification when the dialog has been closed.
```ts
-dialogRef.afterClosed.subscribe(result => {
+dialogRef.afterClosed().subscribe(result => {
console.log(`Dialog result: ${result}`); // Pizza!
});
@@ -76,4 +76,4 @@ that the AOT compiler knows to create the `ComponentFactory` for it.
bootstrap: [AppComponent]
})
export class AppModule() {}
-```
\ No newline at end of file
+```
From 9d4d692cf0dfea472c1216cc7b15e4ea790d5cbb Mon Sep 17 00:00:00 2001
From: Irfan Hudda
Date: Sun, 5 Mar 2017 04:23:41 +0530
Subject: [PATCH 13/24] docs(progress-spinner): fix typo in progress spinner
example (#3299)
Fixes #3148
---
.../progress-spinner-configurable-example.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/examples/progress-spinner-configurable/progress-spinner-configurable-example.ts b/src/examples/progress-spinner-configurable/progress-spinner-configurable-example.ts
index e8538a0f8ed1..b621aaa51e6f 100644
--- a/src/examples/progress-spinner-configurable/progress-spinner-configurable-example.ts
+++ b/src/examples/progress-spinner-configurable/progress-spinner-configurable-example.ts
@@ -7,7 +7,7 @@ import {Component} from '@angular/core';
styleUrls: ['./progress-spinner-configurable-example.css'],
})
export class ProgressSpinnerConfigurableExample {
- color = 'praimry';
+ color = 'primary';
mode = 'determinate';
value = 50;
}
From 01188d933e03320aa2d128defd1cd786df24f70a Mon Sep 17 00:00:00 2001
From: Kristiyan Kostadinov
Date: Sat, 4 Mar 2017 23:54:10 +0100
Subject: [PATCH 14/24] fix(checkbox): add focus indication (#3403)
Fixes #3102
---
src/lib/checkbox/checkbox.html | 1 -
src/lib/checkbox/checkbox.spec.ts | 39 ++++++++++++++++++-
src/lib/checkbox/checkbox.ts | 64 ++++++++++++++++++++++++-------
3 files changed, 89 insertions(+), 15 deletions(-)
diff --git a/src/lib/checkbox/checkbox.html b/src/lib/checkbox/checkbox.html
index 209ceb8b8605..8c979eff04ef 100644
--- a/src/lib/checkbox/checkbox.html
+++ b/src/lib/checkbox/checkbox.html
@@ -12,7 +12,6 @@
[indeterminate]="indeterminate"
[attr.aria-label]="ariaLabel"
[attr.aria-labelledby]="ariaLabelledby"
- (focus)="_onInputFocus()"
(blur)="_onInputBlur()"
(change)="_onInteractionEvent($event)"
(click)="_onInputClick($event)">
diff --git a/src/lib/checkbox/checkbox.spec.ts b/src/lib/checkbox/checkbox.spec.ts
index 857c44348208..a6342eaa76e1 100644
--- a/src/lib/checkbox/checkbox.spec.ts
+++ b/src/lib/checkbox/checkbox.spec.ts
@@ -1,4 +1,11 @@
-import {async, fakeAsync, flushMicrotasks, ComponentFixture, TestBed} from '@angular/core/testing';
+import {
+ async,
+ fakeAsync,
+ flushMicrotasks,
+ ComponentFixture,
+ TestBed,
+ tick,
+} from '@angular/core/testing';
import {NgControl, FormsModule, ReactiveFormsModule, FormControl} from '@angular/forms';
import {Component, DebugElement} from '@angular/core';
import {By} from '@angular/platform-browser';
@@ -6,10 +13,22 @@ import {MdCheckbox, MdCheckboxChange, MdCheckboxModule} from './checkbox';
import {ViewportRuler} from '../core/overlay/position/viewport-ruler';
import {FakeViewportRuler} from '../core/overlay/position/fake-viewport-ruler';
import {dispatchFakeEvent} from '../core/testing/dispatch-events';
+import {FocusOriginMonitor, FocusOrigin} from '../core';
+import {RIPPLE_FADE_IN_DURATION, RIPPLE_FADE_OUT_DURATION} from '../core/ripple/ripple-renderer';
+import {Subject} from 'rxjs/Subject';
describe('MdCheckbox', () => {
let fixture: ComponentFixture;
+ let fakeFocusOriginMonitorSubject: Subject = new Subject();
+ let fakeFocusOriginMonitor = {
+ monitor: () => fakeFocusOriginMonitorSubject.asObservable(),
+ unmonitor: () => {},
+ focusVia: (element: HTMLElement, renderer: any, focusOrigin: FocusOrigin) => {
+ element.focus();
+ fakeFocusOriginMonitorSubject.next(focusOrigin);
+ }
+ };
beforeEach(async(() => {
TestBed.configureTestingModule({
@@ -27,6 +46,7 @@ describe('MdCheckbox', () => {
],
providers: [
{provide: ViewportRuler, useClass: FakeViewportRuler},
+ {provide: FocusOriginMonitor, useValue: fakeFocusOriginMonitor}
]
});
@@ -321,6 +341,23 @@ describe('MdCheckbox', () => {
expect(inputElement.value).toBe('basic_checkbox');
});
+ it('should show a ripple when focused by a keyboard action', fakeAsync(() => {
+ expect(fixture.nativeElement.querySelectorAll('.mat-ripple-element').length)
+ .toBe(0, 'Expected no ripples on load.');
+
+ fakeFocusOriginMonitorSubject.next('keyboard');
+ tick(RIPPLE_FADE_IN_DURATION);
+
+ expect(fixture.nativeElement.querySelectorAll('.mat-ripple-element').length)
+ .toBe(1, 'Expected ripple after element is focused.');
+
+ dispatchFakeEvent(checkboxInstance._inputElement.nativeElement, 'blur');
+ tick(RIPPLE_FADE_OUT_DURATION);
+
+ expect(fixture.nativeElement.querySelectorAll('.mat-ripple-element').length)
+ .toBe(0, 'Expected no ripple after element is blurred.');
+ }));
+
describe('ripple elements', () => {
it('should show ripples on label mousedown', () => {
diff --git a/src/lib/checkbox/checkbox.ts b/src/lib/checkbox/checkbox.ts
index 429666335b65..a935e2d2ef14 100644
--- a/src/lib/checkbox/checkbox.ts
+++ b/src/lib/checkbox/checkbox.ts
@@ -12,11 +12,20 @@ import {
NgModule,
ModuleWithProviders,
ViewChild,
+ AfterViewInit,
+ OnDestroy,
} from '@angular/core';
import {CommonModule} from '@angular/common';
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms';
import {coerceBooleanProperty} from '../core/coercion/boolean-property';
-import {MdRippleModule, CompatibilityModule} from '../core';
+import {Subscription} from 'rxjs/Subscription';
+import {
+ CompatibilityModule,
+ MdRippleModule,
+ MdRipple,
+ RippleRef,
+ FocusOriginMonitor,
+} from '../core';
/** Monotonically increasing integer used to auto-generate unique ids for checkbox components. */
@@ -73,13 +82,12 @@ export class MdCheckboxChange {
'[class.mat-checkbox-checked]': 'checked',
'[class.mat-checkbox-disabled]': 'disabled',
'[class.mat-checkbox-label-before]': 'labelPosition == "before"',
- '[class.mat-checkbox-focused]': '_hasFocus',
},
providers: [MD_CHECKBOX_CONTROL_VALUE_ACCESSOR],
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush
})
-export class MdCheckbox implements ControlValueAccessor {
+export class MdCheckbox implements ControlValueAccessor, AfterViewInit, OnDestroy {
/**
* Attached to the aria-label attribute of the host element. In most cases, arial-labelledby will
* take precedence so this may be omitted.
@@ -157,6 +165,8 @@ export class MdCheckbox implements ControlValueAccessor {
/** The native ` element */
@ViewChild('input') _inputElement: ElementRef;
+ @ViewChild(MdRipple) _ripple: MdRipple;
+
/**
* Called when the checkbox is blurred. Needed to properly implement ControlValueAccessor.
* @docs-private
@@ -175,14 +185,38 @@ export class MdCheckbox implements ControlValueAccessor {
private _controlValueAccessorChangeFn: (value: any) => void = (value) => {};
- _hasFocus: boolean = false;
+ /** Reference to the focused state ripple. */
+ private _focusedRipple: RippleRef;
+
+ /** Reference to the focus origin monitor subscription. */
+ private _focusedSubscription: Subscription;
constructor(private _renderer: Renderer,
private _elementRef: ElementRef,
- private _changeDetectorRef: ChangeDetectorRef) {
+ private _changeDetectorRef: ChangeDetectorRef,
+ private _focusOriginMonitor: FocusOriginMonitor) {
this.color = 'accent';
}
+ ngAfterViewInit() {
+ this._focusedSubscription = this._focusOriginMonitor
+ .monitor(this._inputElement.nativeElement, this._renderer, false)
+ .subscribe(focusOrigin => {
+ if (!this._focusedRipple && focusOrigin === 'keyboard') {
+ this._focusedRipple = this._ripple.launch(0, 0, { persistent: true, centered: true });
+ }
+ });
+ }
+
+ ngOnDestroy() {
+ this._focusOriginMonitor.unmonitor(this._inputElement.nativeElement);
+
+ if (this._focusedSubscription) {
+ this._focusedSubscription.unsubscribe();
+ this._focusedSubscription = null;
+ }
+ }
+
/**
* Whether the checkbox is checked. Note that setting `checked` will immediately set
* `indeterminate` to false.
@@ -315,14 +349,9 @@ export class MdCheckbox implements ControlValueAccessor {
this.change.emit(event);
}
- /** Informs the component when the input has focus so that we can style accordingly */
- _onInputFocus() {
- this._hasFocus = true;
- }
-
/** Informs the component when we lose focus in order to style accordingly */
_onInputBlur() {
- this._hasFocus = false;
+ this._removeFocusedRipple();
this.onTouched();
}
@@ -348,6 +377,8 @@ export class MdCheckbox implements ControlValueAccessor {
// Preventing bubbling for the second event will solve that issue.
event.stopPropagation();
+ this._removeFocusedRipple();
+
if (!this.disabled) {
this.toggle();
this._transitionCheckState(
@@ -362,8 +393,7 @@ export class MdCheckbox implements ControlValueAccessor {
/** Focuses the checkbox. */
focus(): void {
- this._renderer.invokeElementMethod(this._inputElement.nativeElement, 'focus');
- this._onInputFocus();
+ this._focusOriginMonitor.focusVia(this._inputElement.nativeElement, this._renderer, 'keyboard');
}
_onInteractionEvent(event: Event) {
@@ -405,6 +435,13 @@ export class MdCheckbox implements ControlValueAccessor {
return `mat-checkbox-anim-${animSuffix}`;
}
+ /** Fades out the focused state ripple. */
+ private _removeFocusedRipple(): void {
+ if (this._focusedRipple) {
+ this._focusedRipple.fadeOut();
+ this._focusedRipple = null;
+ }
+ }
}
@@ -412,6 +449,7 @@ export class MdCheckbox implements ControlValueAccessor {
imports: [CommonModule, MdRippleModule, CompatibilityModule],
exports: [MdCheckbox, CompatibilityModule],
declarations: [MdCheckbox],
+ providers: [FocusOriginMonitor]
})
export class MdCheckboxModule {
/** @deprecated */
From 3ff383c839f6c8f592001baa6181a57fb604fe92 Mon Sep 17 00:00:00 2001
From: Paul Gschwendtner
Date: Sat, 4 Mar 2017 23:54:48 +0100
Subject: [PATCH 15/24] feat(ripple): add way to globally disable ripples
(#3383)
---
src/lib/core/ripple/index.ts | 2 +-
src/lib/core/ripple/ripple.spec.ts | 48 +++++++++++++++++++++++--
src/lib/core/ripple/ripple.ts | 11 ++++--
src/lib/tabs/tab-nav-bar/tab-nav-bar.ts | 9 +----
4 files changed, 57 insertions(+), 13 deletions(-)
diff --git a/src/lib/core/ripple/index.ts b/src/lib/core/ripple/index.ts
index 45dea58ec64f..aab611db0302 100644
--- a/src/lib/core/ripple/index.ts
+++ b/src/lib/core/ripple/index.ts
@@ -4,7 +4,7 @@ import {CompatibilityModule} from '../compatibility/compatibility';
import {VIEWPORT_RULER_PROVIDER} from '../overlay/position/viewport-ruler';
import {SCROLL_DISPATCHER_PROVIDER} from '../overlay/scroll/scroll-dispatcher';
-export {MdRipple} from './ripple';
+export {MdRipple, MD_DISABLE_RIPPLES} from './ripple';
export {RippleRef, RippleState} from './ripple-ref';
export {RippleConfig} from './ripple-renderer';
diff --git a/src/lib/core/ripple/ripple.spec.ts b/src/lib/core/ripple/ripple.spec.ts
index 6db9435fdd0a..330da08fea53 100644
--- a/src/lib/core/ripple/ripple.spec.ts
+++ b/src/lib/core/ripple/ripple.spec.ts
@@ -1,6 +1,6 @@
import {TestBed, ComponentFixture, fakeAsync, tick, inject} from '@angular/core/testing';
import {Component, ViewChild} from '@angular/core';
-import {MdRipple, MdRippleModule, RippleState} from './index';
+import {MdRipple, MdRippleModule, MD_DISABLE_RIPPLES, RippleState} from './index';
import {ViewportRuler} from '../overlay/position/viewport-ruler';
import {RIPPLE_FADE_OUT_DURATION, RIPPLE_FADE_IN_DURATION} from './ripple-renderer';
import {dispatchMouseEvent} from '../testing/dispatch-events';
@@ -18,7 +18,7 @@ describe('MdRipple', () => {
beforeEach(() => {
TestBed.configureTestingModule({
- imports: [MdRippleModule.forRoot()],
+ imports: [MdRippleModule],
declarations: [
BasicRippleContainer,
RippleContainerWithInputBindings,
@@ -346,6 +346,50 @@ describe('MdRipple', () => {
});
+ describe('with ripples disabled', () => {
+ let rippleDirective: MdRipple;
+
+ beforeEach(() => {
+ // Reset the previously configured testing module to be able to disable ripples globally.
+ // The testing module has been initialized in the root describe group for the ripples.
+ TestBed.resetTestingModule();
+ TestBed.configureTestingModule({
+ imports: [MdRippleModule],
+ declarations: [BasicRippleContainer],
+ providers: [{ provide: MD_DISABLE_RIPPLES, useValue: true }]
+ });
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(BasicRippleContainer);
+ fixture.detectChanges();
+
+ rippleTarget = fixture.nativeElement.querySelector('[mat-ripple]');
+ rippleDirective = fixture.componentInstance.ripple;
+ });
+
+ it('should not show any ripples on mousedown', () => {
+ dispatchMouseEvent(rippleTarget, 'mousedown');
+ dispatchMouseEvent(rippleTarget, 'mouseup');
+
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
+
+ dispatchMouseEvent(rippleTarget, 'mousedown');
+ dispatchMouseEvent(rippleTarget, 'mouseup');
+
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
+ });
+
+ it('should still allow manual ripples', () => {
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(0);
+
+ rippleDirective.launch(0, 0);
+
+ expect(rippleTarget.querySelectorAll('.mat-ripple-element').length).toBe(1);
+ });
+
+ });
+
describe('configuring behavior', () => {
let controller: RippleContainerWithInputBindings;
let rippleComponent: MdRipple;
diff --git a/src/lib/core/ripple/ripple.ts b/src/lib/core/ripple/ripple.ts
index 5218e7e75e94..844cf20144b7 100644
--- a/src/lib/core/ripple/ripple.ts
+++ b/src/lib/core/ripple/ripple.ts
@@ -2,15 +2,20 @@ import {
Directive,
ElementRef,
Input,
+ Inject,
NgZone,
OnChanges,
SimpleChanges,
OnDestroy,
+ OpaqueToken,
+ Optional,
} from '@angular/core';
import {RippleConfig, RippleRenderer} from './ripple-renderer';
import {ViewportRuler} from '../overlay/position/viewport-ruler';
import {RippleRef} from './ripple-ref';
+/** OpaqueToken that can be used to globally disable all ripples. Except programmatic ones. */
+export const MD_DISABLE_RIPPLES = new OpaqueToken('md-disable-ripples');
@Directive({
selector: '[md-ripple], [mat-ripple]',
@@ -65,7 +70,9 @@ export class MdRipple implements OnChanges, OnDestroy {
/** Renderer for the ripple DOM manipulations. */
private _rippleRenderer: RippleRenderer;
- constructor(elementRef: ElementRef, ngZone: NgZone, ruler: ViewportRuler) {
+ constructor(elementRef: ElementRef, ngZone: NgZone, ruler: ViewportRuler,
+ @Optional() @Inject(MD_DISABLE_RIPPLES) private _forceDisableRipples: boolean) {
+
this._rippleRenderer = new RippleRenderer(elementRef, ngZone, ruler);
}
@@ -74,7 +81,7 @@ export class MdRipple implements OnChanges, OnDestroy {
this._rippleRenderer.setTriggerElement(this.trigger);
}
- this._rippleRenderer.rippleDisabled = this.disabled;
+ this._rippleRenderer.rippleDisabled = this._forceDisableRipples || this.disabled;
this._rippleRenderer.rippleConfig = this.rippleConfig;
}
diff --git a/src/lib/tabs/tab-nav-bar/tab-nav-bar.ts b/src/lib/tabs/tab-nav-bar/tab-nav-bar.ts
index 930f8a9a2f1e..5a0968b36f7f 100644
--- a/src/lib/tabs/tab-nav-bar/tab-nav-bar.ts
+++ b/src/lib/tabs/tab-nav-bar/tab-nav-bar.ts
@@ -5,11 +5,9 @@ import {
ElementRef,
ViewEncapsulation,
Directive,
- NgZone,
} from '@angular/core';
import {MdInkBar} from '../ink-bar';
import {MdRipple} from '../../core/ripple/index';
-import {ViewportRuler} from '../../core/overlay/position/viewport-ruler';
/**
* Navigation component matching the styles of the tab group header.
@@ -81,9 +79,4 @@ export class MdTabLink {
'[class.mat-tab-link]': 'true',
},
})
-export class MdTabLinkRipple extends MdRipple {
- constructor(elementRef: ElementRef, ngZone: NgZone, ruler: ViewportRuler) {
- super(elementRef, ngZone, ruler);
- }
-
-}
+export class MdTabLinkRipple extends MdRipple {}
From 02f4bc3730ad12a13fa5ce3572bb07fe1d1c8753 Mon Sep 17 00:00:00 2001
From: Kristiyan Kostadinov
Date: Sun, 5 Mar 2017 00:09:06 +0100
Subject: [PATCH 16/24] refactor: consistent module declaration (#3095)
---
src/lib/autocomplete/index.ts | 6 +-
src/lib/button-toggle/button-toggle.spec.ts | 11 ++--
src/lib/button-toggle/button-toggle.ts | 66 +++++--------------
src/lib/button-toggle/index.ts | 32 +++++++++
src/lib/button/button.spec.ts | 2 +-
src/lib/button/button.ts | 38 +----------
src/lib/button/index.ts | 47 +++++++++++++
src/lib/card/card.ts | 39 -----------
src/lib/card/index.ts | 56 ++++++++++++++++
src/lib/checkbox/checkbox.spec.ts | 2 +-
src/lib/checkbox/checkbox.ts | 48 ++++----------
src/lib/checkbox/index.ts | 23 +++++++
src/lib/chips/chip-list.ts | 17 -----
src/lib/chips/index.ts | 21 ++++++
.../core/compatibility/compatibility.spec.ts | 2 +-
src/lib/core/platform/index.ts | 7 +-
src/lib/core/selection/index.ts | 4 +-
src/lib/core/style/index.ts | 7 +-
src/lib/grid-list/grid-list.spec.ts | 2 +-
src/lib/grid-list/grid-list.ts | 40 +----------
src/lib/grid-list/index.ts | 41 ++++++++++++
src/lib/icon/icon.spec.ts | 2 +-
src/lib/icon/icon.ts | 23 +------
src/lib/icon/index.ts | 24 +++++++
src/lib/input/index.ts | 11 ++--
src/lib/list/index.ts | 53 +++++++++++++++
src/lib/list/list.spec.ts | 2 +-
src/lib/list/list.ts | 60 +++--------------
src/lib/menu/index.ts | 25 +++++++
src/lib/menu/menu.spec.ts | 2 +-
src/lib/menu/menu.ts | 23 -------
src/lib/progress-bar/index.ts | 22 +++++++
src/lib/progress-bar/progress-bar.spec.ts | 2 +-
src/lib/progress-bar/progress-bar.ts | 28 ++------
src/lib/progress-spinner/index.ts | 42 +++++++++++-
src/lib/progress-spinner/progress-circle.ts | 4 --
.../progress-spinner/progress-spinner.spec.ts | 2 +-
src/lib/progress-spinner/progress-spinner.ts | 30 ---------
src/lib/radio/index.ts | 29 ++++++++
src/lib/radio/radio.spec.ts | 2 +-
src/lib/radio/radio.ts | 24 -------
src/lib/select/index.ts | 6 +-
src/lib/sidenav/index.ts | 24 +++++++
src/lib/sidenav/sidenav.spec.ts | 2 +-
src/lib/sidenav/sidenav.ts | 23 +------
src/lib/slide-toggle/index.ts | 25 +++++++
src/lib/slide-toggle/slide-toggle.spec.ts | 6 +-
src/lib/slide-toggle/slide-toggle.ts | 31 +--------
src/lib/slider/index.ts | 25 +++++++
src/lib/slider/slider.spec.ts | 2 +-
src/lib/slider/slider.ts | 31 +--------
src/lib/snack-bar/index.ts | 2 +
src/lib/tabs/index.ts | 36 ++++++++++
src/lib/tabs/tab-group.spec.ts | 2 +-
src/lib/tabs/tab-group.ts | 38 +----------
src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts | 2 +-
src/lib/toolbar/index.ts | 21 ++++++
src/lib/toolbar/toolbar.spec.ts | 2 +-
src/lib/toolbar/toolbar.ts | 19 ------
src/lib/tooltip/index.ts | 23 +++++++
src/lib/tooltip/tooltip.spec.ts | 2 +-
src/lib/tooltip/tooltip.ts | 23 +------
62 files changed, 679 insertions(+), 587 deletions(-)
delete mode 100644 src/lib/progress-spinner/progress-circle.ts
diff --git a/src/lib/autocomplete/index.ts b/src/lib/autocomplete/index.ts
index 9cbfc471ee27..7694e665ebbc 100644
--- a/src/lib/autocomplete/index.ts
+++ b/src/lib/autocomplete/index.ts
@@ -4,8 +4,6 @@ import {MdOptionModule, OverlayModule, OVERLAY_PROVIDERS, CompatibilityModule} f
import {CommonModule} from '@angular/common';
import {MdAutocomplete} from './autocomplete';
import {MdAutocompleteTrigger} from './autocomplete-trigger';
-export * from './autocomplete';
-export * from './autocomplete-trigger';
@NgModule({
imports: [MdOptionModule, OverlayModule, CompatibilityModule, CommonModule],
@@ -21,3 +19,7 @@ export class MdAutocompleteModule {
};
}
}
+
+
+export * from './autocomplete';
+export * from './autocomplete-trigger';
diff --git a/src/lib/button-toggle/button-toggle.spec.ts b/src/lib/button-toggle/button-toggle.spec.ts
index d6907b557ccb..6050dd4449a9 100644
--- a/src/lib/button-toggle/button-toggle.spec.ts
+++ b/src/lib/button-toggle/button-toggle.spec.ts
@@ -9,11 +9,12 @@ import {NgControl, FormsModule, ReactiveFormsModule, FormControl} from '@angular
import {Component, DebugElement} from '@angular/core';
import {By} from '@angular/platform-browser';
import {
- MdButtonToggleGroup,
- MdButtonToggle,
- MdButtonToggleGroupMultiple,
- MdButtonToggleChange, MdButtonToggleModule,
-} from './button-toggle';
+ MdButtonToggleGroup,
+ MdButtonToggle,
+ MdButtonToggleGroupMultiple,
+ MdButtonToggleChange,
+ MdButtonToggleModule,
+} from './index';
describe('MdButtonToggle', () => {
diff --git a/src/lib/button-toggle/button-toggle.ts b/src/lib/button-toggle/button-toggle.ts
index 7bc964988040..3cc0a0c21209 100644
--- a/src/lib/button-toggle/button-toggle.ts
+++ b/src/lib/button-toggle/button-toggle.ts
@@ -1,32 +1,24 @@
import {
- NgModule,
- ModuleWithProviders,
- Component,
- ContentChildren,
- Directive,
- ElementRef,
- Renderer,
- EventEmitter,
- HostBinding,
- Input,
- OnInit,
- Optional,
- Output,
- QueryList,
- ViewChild,
- ViewEncapsulation,
- forwardRef,
- AfterViewInit
+ Component,
+ ContentChildren,
+ Directive,
+ ElementRef,
+ Renderer,
+ EventEmitter,
+ HostBinding,
+ Input,
+ OnInit,
+ Optional,
+ Output,
+ QueryList,
+ ViewChild,
+ ViewEncapsulation,
+ forwardRef,
+ AfterViewInit,
} from '@angular/core';
-import {NG_VALUE_ACCESSOR, ControlValueAccessor, FormsModule} from '@angular/forms';
+import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms';
import {Observable} from 'rxjs/Observable';
-import {
- FocusOriginMonitor,
- UniqueSelectionDispatcher,
- coerceBooleanProperty,
- UNIQUE_SELECTION_DISPATCHER_PROVIDER,
- CompatibilityModule,
-} from '../core';
+import {UniqueSelectionDispatcher, coerceBooleanProperty, FocusOriginMonitor} from '../core';
/** Acceptable types for a button toggle. */
export type ToggleType = 'checkbox' | 'radio';
@@ -469,25 +461,3 @@ export class MdButtonToggle implements OnInit {
this._renderer.invokeElementMethod(this._inputElement.nativeElement, 'focus');
}
}
-
-
-@NgModule({
- imports: [FormsModule, CompatibilityModule],
- exports: [
- MdButtonToggleGroup,
- MdButtonToggleGroupMultiple,
- MdButtonToggle,
- CompatibilityModule,
- ],
- declarations: [MdButtonToggleGroup, MdButtonToggleGroupMultiple, MdButtonToggle],
- providers: [UNIQUE_SELECTION_DISPATCHER_PROVIDER, FocusOriginMonitor]
-})
-export class MdButtonToggleModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdButtonToggleModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/button-toggle/index.ts b/src/lib/button-toggle/index.ts
index 9c447d60f111..a2967210997c 100644
--- a/src/lib/button-toggle/index.ts
+++ b/src/lib/button-toggle/index.ts
@@ -1 +1,33 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {FormsModule} from '@angular/forms';
+import {MdButtonToggleGroup, MdButtonToggleGroupMultiple, MdButtonToggle} from './button-toggle';
+import {
+ UNIQUE_SELECTION_DISPATCHER_PROVIDER,
+ CompatibilityModule,
+ FocusOriginMonitor,
+} from '../core';
+
+
+@NgModule({
+ imports: [FormsModule, CompatibilityModule],
+ exports: [
+ MdButtonToggleGroup,
+ MdButtonToggleGroupMultiple,
+ MdButtonToggle,
+ CompatibilityModule,
+ ],
+ declarations: [MdButtonToggleGroup, MdButtonToggleGroupMultiple, MdButtonToggle],
+ providers: [UNIQUE_SELECTION_DISPATCHER_PROVIDER, FocusOriginMonitor]
+})
+export class MdButtonToggleModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdButtonToggleModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './button-toggle';
diff --git a/src/lib/button/button.spec.ts b/src/lib/button/button.spec.ts
index 564a3a29d0f3..aba70a71e02e 100644
--- a/src/lib/button/button.spec.ts
+++ b/src/lib/button/button.spec.ts
@@ -1,7 +1,7 @@
import {async, TestBed, ComponentFixture} from '@angular/core/testing';
import {Component} from '@angular/core';
import {By} from '@angular/platform-browser';
-import {MdButtonModule} from './button';
+import {MdButtonModule} from './index';
import {ViewportRuler} from '../core/overlay/position/viewport-ruler';
import {FakeViewportRuler} from '../core/overlay/position/fake-viewport-ruler';
diff --git a/src/lib/button/button.ts b/src/lib/button/button.ts
index 029e152a12dc..8cddd0d647a3 100644
--- a/src/lib/button/button.ts
+++ b/src/lib/button/button.ts
@@ -6,11 +6,9 @@ import {
ChangeDetectionStrategy,
ElementRef,
Renderer,
- NgModule,
- ModuleWithProviders, Directive,
+ Directive,
} from '@angular/core';
-import {CommonModule} from '@angular/common';
-import {MdRippleModule, coerceBooleanProperty, CompatibilityModule} from '../core';
+import {coerceBooleanProperty} from '../core';
// TODO(jelbourn): Make the `isMouseDown` stuff done with one global listener.
@@ -219,35 +217,3 @@ export class MdAnchor extends MdButton {
}
}
}
-
-
-@NgModule({
- imports: [CommonModule, MdRippleModule, CompatibilityModule],
- exports: [
- MdButton, MdAnchor,
- CompatibilityModule,
- MdButtonCssMatStyler,
- MdRaisedButtonCssMatStyler,
- MdIconButtonCssMatStyler,
- MdFabCssMatStyler,
- MdMiniFabCssMatStyler
- ],
- declarations: [
- MdButton,
- MdAnchor,
- MdButtonCssMatStyler,
- MdRaisedButtonCssMatStyler,
- MdIconButtonCssMatStyler,
- MdFabCssMatStyler,
- MdMiniFabCssMatStyler
- ],
-})
-export class MdButtonModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdButtonModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/button/index.ts b/src/lib/button/index.ts
index eaf5eea7f1c1..1f96453f5290 100644
--- a/src/lib/button/index.ts
+++ b/src/lib/button/index.ts
@@ -1 +1,48 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {MdRippleModule, CompatibilityModule} from '../core';
+import {
+ MdButton,
+ MdAnchor,
+ MdButtonCssMatStyler,
+ MdRaisedButtonCssMatStyler,
+ MdIconButtonCssMatStyler,
+ MdFabCssMatStyler,
+ MdMiniFabCssMatStyler,
+} from './button';
+
+
+@NgModule({
+ imports: [CommonModule, MdRippleModule, CompatibilityModule],
+ exports: [
+ MdButton,
+ MdAnchor,
+ CompatibilityModule,
+ MdButtonCssMatStyler,
+ MdRaisedButtonCssMatStyler,
+ MdIconButtonCssMatStyler,
+ MdFabCssMatStyler,
+ MdMiniFabCssMatStyler
+ ],
+ declarations: [
+ MdButton,
+ MdAnchor,
+ MdButtonCssMatStyler,
+ MdRaisedButtonCssMatStyler,
+ MdIconButtonCssMatStyler,
+ MdFabCssMatStyler,
+ MdMiniFabCssMatStyler
+ ],
+})
+export class MdButtonModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdButtonModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './button';
diff --git a/src/lib/card/card.ts b/src/lib/card/card.ts
index 8db5bbabe612..68745e0027b7 100644
--- a/src/lib/card/card.ts
+++ b/src/lib/card/card.ts
@@ -1,12 +1,9 @@
import {
- NgModule,
- ModuleWithProviders,
Component,
ViewEncapsulation,
ChangeDetectionStrategy,
Directive
} from '@angular/core';
-import {CompatibilityModule} from '../core';
/**
@@ -188,39 +185,3 @@ export class MdCardHeader {}
}
})
export class MdCardTitleGroup {}
-
-
-@NgModule({
- imports: [CompatibilityModule],
- exports: [
- MdCard,
- MdCardHeader,
- MdCardTitleGroup,
- MdCardContent,
- MdCardTitle,
- MdCardSubtitle,
- MdCardActions,
- MdCardFooter,
- MdCardSmImage,
- MdCardMdImage,
- MdCardLgImage,
- MdCardImage,
- MdCardXlImage,
- MdCardAvatar,
- CompatibilityModule,
- ],
- declarations: [
- MdCard, MdCardHeader, MdCardTitleGroup, MdCardContent, MdCardTitle, MdCardSubtitle,
- MdCardActions, MdCardFooter, MdCardSmImage, MdCardMdImage, MdCardLgImage, MdCardImage,
- MdCardXlImage, MdCardAvatar,
- ],
-})
-export class MdCardModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdCardModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/card/index.ts b/src/lib/card/index.ts
index cb5809fedb2d..1b6a7934ce3e 100644
--- a/src/lib/card/index.ts
+++ b/src/lib/card/index.ts
@@ -1 +1,57 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CompatibilityModule} from '../core';
+import {
+ MdCard,
+ MdCardHeader,
+ MdCardTitleGroup,
+ MdCardContent,
+ MdCardTitle,
+ MdCardSubtitle,
+ MdCardActions,
+ MdCardFooter,
+ MdCardSmImage,
+ MdCardMdImage,
+ MdCardLgImage,
+ MdCardImage,
+ MdCardXlImage,
+ MdCardAvatar,
+} from './card';
+
+
+@NgModule({
+ imports: [CompatibilityModule],
+ exports: [
+ MdCard,
+ MdCardHeader,
+ MdCardTitleGroup,
+ MdCardContent,
+ MdCardTitle,
+ MdCardSubtitle,
+ MdCardActions,
+ MdCardFooter,
+ MdCardSmImage,
+ MdCardMdImage,
+ MdCardLgImage,
+ MdCardImage,
+ MdCardXlImage,
+ MdCardAvatar,
+ CompatibilityModule,
+ ],
+ declarations: [
+ MdCard, MdCardHeader, MdCardTitleGroup, MdCardContent, MdCardTitle, MdCardSubtitle,
+ MdCardActions, MdCardFooter, MdCardSmImage, MdCardMdImage, MdCardLgImage, MdCardImage,
+ MdCardXlImage, MdCardAvatar,
+ ],
+})
+export class MdCardModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdCardModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './card';
diff --git a/src/lib/checkbox/checkbox.spec.ts b/src/lib/checkbox/checkbox.spec.ts
index a6342eaa76e1..4f75c88051b0 100644
--- a/src/lib/checkbox/checkbox.spec.ts
+++ b/src/lib/checkbox/checkbox.spec.ts
@@ -9,7 +9,7 @@ import {
import {NgControl, FormsModule, ReactiveFormsModule, FormControl} from '@angular/forms';
import {Component, DebugElement} from '@angular/core';
import {By} from '@angular/platform-browser';
-import {MdCheckbox, MdCheckboxChange, MdCheckboxModule} from './checkbox';
+import {MdCheckbox, MdCheckboxChange, MdCheckboxModule} from './index';
import {ViewportRuler} from '../core/overlay/position/viewport-ruler';
import {FakeViewportRuler} from '../core/overlay/position/fake-viewport-ruler';
import {dispatchFakeEvent} from '../core/testing/dispatch-events';
diff --git a/src/lib/checkbox/checkbox.ts b/src/lib/checkbox/checkbox.ts
index a935e2d2ef14..dcbc59074de5 100644
--- a/src/lib/checkbox/checkbox.ts
+++ b/src/lib/checkbox/checkbox.ts
@@ -1,27 +1,22 @@
import {
- ChangeDetectorRef,
- ChangeDetectionStrategy,
- Component,
- ElementRef,
- EventEmitter,
- Input,
- Output,
- Renderer,
- ViewEncapsulation,
- forwardRef,
- NgModule,
- ModuleWithProviders,
- ViewChild,
- AfterViewInit,
- OnDestroy,
+ ChangeDetectorRef,
+ ChangeDetectionStrategy,
+ Component,
+ ElementRef,
+ EventEmitter,
+ Input,
+ Output,
+ Renderer,
+ ViewEncapsulation,
+ forwardRef,
+ ViewChild,
+ AfterViewInit,
+ OnDestroy,
} from '@angular/core';
-import {CommonModule} from '@angular/common';
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms';
import {coerceBooleanProperty} from '../core/coercion/boolean-property';
import {Subscription} from 'rxjs/Subscription';
import {
- CompatibilityModule,
- MdRippleModule,
MdRipple,
RippleRef,
FocusOriginMonitor,
@@ -443,20 +438,3 @@ export class MdCheckbox implements ControlValueAccessor, AfterViewInit, OnDestro
}
}
}
-
-
-@NgModule({
- imports: [CommonModule, MdRippleModule, CompatibilityModule],
- exports: [MdCheckbox, CompatibilityModule],
- declarations: [MdCheckbox],
- providers: [FocusOriginMonitor]
-})
-export class MdCheckboxModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdCheckboxModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/checkbox/index.ts b/src/lib/checkbox/index.ts
index 8d78b3e23f25..f468d3a5560c 100644
--- a/src/lib/checkbox/index.ts
+++ b/src/lib/checkbox/index.ts
@@ -1 +1,24 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {MdRippleModule, CompatibilityModule, FocusOriginMonitor} from '../core';
+import {MdCheckbox} from './checkbox';
+
+
+@NgModule({
+ imports: [CommonModule, MdRippleModule, CompatibilityModule],
+ exports: [MdCheckbox, CompatibilityModule],
+ declarations: [MdCheckbox],
+ providers: [FocusOriginMonitor]
+})
+export class MdCheckboxModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdCheckboxModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './checkbox';
diff --git a/src/lib/chips/chip-list.ts b/src/lib/chips/chip-list.ts
index af563c4660c6..7c4a396cf84c 100644
--- a/src/lib/chips/chip-list.ts
+++ b/src/lib/chips/chip-list.ts
@@ -5,8 +5,6 @@ import {
ContentChildren,
ElementRef,
Input,
- ModuleWithProviders,
- NgModule,
QueryList,
ViewEncapsulation
} from '@angular/core';
@@ -208,18 +206,3 @@ export class MdChipList implements AfterContentInit {
}
}
-
-@NgModule({
- imports: [],
- exports: [MdChipList, MdChip],
- declarations: [MdChipList, MdChip]
-})
-export class MdChipsModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdChipsModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/chips/index.ts b/src/lib/chips/index.ts
index 938151ce2bea..6b6d4e4e3192 100644
--- a/src/lib/chips/index.ts
+++ b/src/lib/chips/index.ts
@@ -1,2 +1,23 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {MdChipList} from './chip-list';
+import {MdChip} from './chip';
+
+
+@NgModule({
+ imports: [],
+ exports: [MdChipList, MdChip],
+ declarations: [MdChipList, MdChip]
+})
+export class MdChipsModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdChipsModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './chip-list';
export * from './chip';
diff --git a/src/lib/core/compatibility/compatibility.spec.ts b/src/lib/core/compatibility/compatibility.spec.ts
index 4e9e754fac81..479ee3b13bf0 100644
--- a/src/lib/core/compatibility/compatibility.spec.ts
+++ b/src/lib/core/compatibility/compatibility.spec.ts
@@ -1,6 +1,6 @@
import {Component, NgModule} from '@angular/core';
import {async, TestBed} from '@angular/core/testing';
-import {MdCheckboxModule} from '../../checkbox/checkbox';
+import {MdCheckboxModule} from '../../checkbox/index';
import {
NoConflictStyleCompatibilityMode,
MAT_ELEMENTS_SELECTOR,
diff --git a/src/lib/core/platform/index.ts b/src/lib/core/platform/index.ts
index edb7dae39703..0009bf35f80f 100644
--- a/src/lib/core/platform/index.ts
+++ b/src/lib/core/platform/index.ts
@@ -1,9 +1,6 @@
import {NgModule, ModuleWithProviders} from '@angular/core';
import {Platform} from './platform';
-export * from './platform';
-export * from './features';
-
@NgModule({
providers: [Platform]
@@ -17,3 +14,7 @@ export class PlatformModule {
};
}
}
+
+
+export * from './platform';
+export * from './features';
diff --git a/src/lib/core/selection/index.ts b/src/lib/core/selection/index.ts
index 4ebd17960d72..5a6f826091fd 100644
--- a/src/lib/core/selection/index.ts
+++ b/src/lib/core/selection/index.ts
@@ -1,10 +1,12 @@
import {NgModule} from '@angular/core';
import {MdPseudoCheckbox} from './pseudo-checkbox/pseudo-checkbox';
-export * from './pseudo-checkbox/pseudo-checkbox';
@NgModule({
exports: [MdPseudoCheckbox],
declarations: [MdPseudoCheckbox]
})
export class MdSelectionModule { }
+
+
+export * from './pseudo-checkbox/pseudo-checkbox';
diff --git a/src/lib/core/style/index.ts b/src/lib/core/style/index.ts
index b5f487f54223..a61a25dbb43a 100644
--- a/src/lib/core/style/index.ts
+++ b/src/lib/core/style/index.ts
@@ -1,9 +1,6 @@
import {NgModule} from '@angular/core';
import {CdkMonitorFocus, FOCUS_ORIGIN_MONITOR_PROVIDER} from './focus-origin-monitor';
-export * from './focus-origin-monitor';
-export * from './apply-transform';
-
@NgModule({
declarations: [CdkMonitorFocus],
@@ -11,3 +8,7 @@ export * from './apply-transform';
providers: [FOCUS_ORIGIN_MONITOR_PROVIDER],
})
export class StyleModule {}
+
+
+export * from './focus-origin-monitor';
+export * from './apply-transform';
diff --git a/src/lib/grid-list/grid-list.spec.ts b/src/lib/grid-list/grid-list.spec.ts
index 8683f55d8c85..5cc78dacb03b 100644
--- a/src/lib/grid-list/grid-list.spec.ts
+++ b/src/lib/grid-list/grid-list.spec.ts
@@ -1,7 +1,7 @@
import {async, TestBed} from '@angular/core/testing';
import {Component, DebugElement} from '@angular/core';
import {By} from '@angular/platform-browser';
-import {MdGridList, MdGridListModule} from './grid-list';
+import {MdGridList, MdGridListModule} from './index';
import {MdGridTile, MdGridTileText} from './grid-tile';
diff --git a/src/lib/grid-list/grid-list.ts b/src/lib/grid-list/grid-list.ts
index 92064ed024f4..8da4a76bceae 100644
--- a/src/lib/grid-list/grid-list.ts
+++ b/src/lib/grid-list/grid-list.ts
@@ -1,6 +1,4 @@
import {
- NgModule,
- ModuleWithProviders,
Component,
ViewEncapsulation,
AfterContentChecked,
@@ -12,14 +10,11 @@ import {
ElementRef,
Optional,
} from '@angular/core';
-import {
- MdGridTile, MdGridTileText, MdGridTileFooterCssMatStyler,
- MdGridTileHeaderCssMatStyler, MdGridAvatarCssMatStyler
-} from './grid-tile';
+import {MdGridTile} from './grid-tile';
import {TileCoordinator} from './tile-coordinator';
import {TileStyler, FitTileStyler, RatioTileStyler, FixedTileStyler} from './tile-styler';
import {MdGridListColsError} from './grid-list-errors';
-import {Dir, MdLineModule, CompatibilityModule} from '../core';
+import {Dir} from '../core';
import {
coerceToString,
coerceToNumber,
@@ -145,34 +140,3 @@ export class MdGridList implements OnInit, AfterContentChecked {
}
}
}
-
-
-@NgModule({
- imports: [MdLineModule, CompatibilityModule],
- exports: [
- MdGridList,
- MdGridTile,
- MdGridTileText,
- MdLineModule,
- CompatibilityModule,
- MdGridTileHeaderCssMatStyler,
- MdGridTileFooterCssMatStyler,
- MdGridAvatarCssMatStyler
- ],
- declarations: [
- MdGridList,
- MdGridTile,
- MdGridTileText,
- MdGridTileHeaderCssMatStyler,
- MdGridTileFooterCssMatStyler,
- MdGridAvatarCssMatStyler],
-})
-export class MdGridListModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdGridListModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/grid-list/index.ts b/src/lib/grid-list/index.ts
index 981d0024533e..5206d2f7134c 100644
--- a/src/lib/grid-list/index.ts
+++ b/src/lib/grid-list/index.ts
@@ -1 +1,42 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {MdLineModule, CompatibilityModule} from '../core';
+import {
+ MdGridTile, MdGridTileText, MdGridTileFooterCssMatStyler,
+ MdGridTileHeaderCssMatStyler, MdGridAvatarCssMatStyler
+} from './grid-tile';
+import {MdGridList} from './grid-list';
+
+
+@NgModule({
+ imports: [MdLineModule, CompatibilityModule],
+ exports: [
+ MdGridList,
+ MdGridTile,
+ MdGridTileText,
+ MdLineModule,
+ CompatibilityModule,
+ MdGridTileHeaderCssMatStyler,
+ MdGridTileFooterCssMatStyler,
+ MdGridAvatarCssMatStyler
+ ],
+ declarations: [
+ MdGridList,
+ MdGridTile,
+ MdGridTileText,
+ MdGridTileHeaderCssMatStyler,
+ MdGridTileFooterCssMatStyler,
+ MdGridAvatarCssMatStyler
+ ],
+})
+export class MdGridListModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdGridListModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './grid-list';
diff --git a/src/lib/icon/icon.spec.ts b/src/lib/icon/icon.spec.ts
index 156cd20408fc..ec94136d117f 100644
--- a/src/lib/icon/icon.spec.ts
+++ b/src/lib/icon/icon.spec.ts
@@ -3,7 +3,7 @@ import {SafeResourceUrl, DomSanitizer} from '@angular/platform-browser';
import {XHRBackend} from '@angular/http';
import {MockBackend} from '@angular/http/testing';
import {Component} from '@angular/core';
-import {MdIconModule} from './icon';
+import {MdIconModule} from './index';
import {MdIconRegistry} from './icon-registry';
import {getFakeSvgHttpResponse} from './fake-svgs';
diff --git a/src/lib/icon/icon.ts b/src/lib/icon/icon.ts
index d5922050f5a7..d9e0e038ca6d 100644
--- a/src/lib/icon/icon.ts
+++ b/src/lib/icon/icon.ts
@@ -1,6 +1,4 @@
import {
- NgModule,
- ModuleWithProviders,
ChangeDetectionStrategy,
Component,
ElementRef,
@@ -14,11 +12,10 @@ import {
Optional,
SkipSelf,
} from '@angular/core';
-import {HttpModule, Http} from '@angular/http';
+import {Http} from '@angular/http';
import {DomSanitizer} from '@angular/platform-browser';
-import {MdError, CompatibilityModule} from '../core';
+import {MdError} from '../core';
import {MdIconRegistry, MdIconNameNotFoundError} from './icon-registry';
-export {MdIconRegistry} from './icon-registry';
/** Exception thrown when an invalid icon name is passed to an md-icon component. */
export class MdIconInvalidNameError extends MdError {
@@ -261,19 +258,3 @@ export const ICON_REGISTRY_PROVIDER = {
deps: [[new Optional(), new SkipSelf(), MdIconRegistry], Http, DomSanitizer],
useFactory: ICON_REGISTRY_PROVIDER_FACTORY,
};
-
-@NgModule({
- imports: [HttpModule, CompatibilityModule],
- exports: [MdIcon, CompatibilityModule],
- declarations: [MdIcon],
- providers: [ICON_REGISTRY_PROVIDER],
-})
-export class MdIconModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdIconModule,
- providers: [],
- };
- }
-}
diff --git a/src/lib/icon/index.ts b/src/lib/icon/index.ts
index af77d84efccf..c2b2f7bcba31 100644
--- a/src/lib/icon/index.ts
+++ b/src/lib/icon/index.ts
@@ -1 +1,25 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {HttpModule} from '@angular/http';
+import {CompatibilityModule} from '../core';
+import {MdIcon, ICON_REGISTRY_PROVIDER} from './icon';
+
+
+@NgModule({
+ imports: [HttpModule, CompatibilityModule],
+ exports: [MdIcon, CompatibilityModule],
+ declarations: [MdIcon],
+ providers: [ICON_REGISTRY_PROVIDER],
+})
+export class MdIconModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdIconModule,
+ providers: [],
+ };
+ }
+}
+
+
export * from './icon';
+export {MdIconRegistry} from './icon-registry';
diff --git a/src/lib/input/index.ts b/src/lib/input/index.ts
index db45cf0dde0e..d0a7d8a6532f 100644
--- a/src/lib/input/index.ts
+++ b/src/lib/input/index.ts
@@ -6,11 +6,6 @@ import {FormsModule} from '@angular/forms';
import {PlatformModule} from '../core/platform/index';
-export * from './autosize'
-export * from './input-container';
-export * from './input-container-errors';
-
-
@NgModule({
declarations: [
MdPlaceholder,
@@ -41,3 +36,9 @@ export class MdInputModule {
};
}
}
+
+
+export * from './autosize'
+export * from './input-container';
+export * from './input-container-errors';
+
diff --git a/src/lib/list/index.ts b/src/lib/list/index.ts
index 71825137f468..78100824d63f 100644
--- a/src/lib/list/index.ts
+++ b/src/lib/list/index.ts
@@ -1 +1,54 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {MdLineModule, CompatibilityModule} from '../core';
+import {
+ MdList,
+ MdListItem,
+ MdListDivider,
+ MdListAvatarCssMatStyler,
+ MdListIconCssMatStyler,
+ MdListCssMatStyler,
+ MdNavListCssMatStyler,
+ MdDividerCssMatStyler,
+ MdListSubheaderCssMatStyler,
+} from './list';
+
+
+@NgModule({
+ imports: [MdLineModule, CompatibilityModule],
+ exports: [
+ MdList,
+ MdListItem,
+ MdListDivider,
+ MdListAvatarCssMatStyler,
+ MdLineModule,
+ CompatibilityModule,
+ MdListIconCssMatStyler,
+ MdListCssMatStyler,
+ MdNavListCssMatStyler,
+ MdDividerCssMatStyler,
+ MdListSubheaderCssMatStyler
+ ],
+ declarations: [
+ MdList,
+ MdListItem,
+ MdListDivider,
+ MdListAvatarCssMatStyler,
+ MdListIconCssMatStyler,
+ MdListCssMatStyler,
+ MdNavListCssMatStyler,
+ MdDividerCssMatStyler,
+ MdListSubheaderCssMatStyler
+ ],
+})
+export class MdListModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdListModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './list';
diff --git a/src/lib/list/list.spec.ts b/src/lib/list/list.spec.ts
index c4f1c43c6331..db1937370472 100644
--- a/src/lib/list/list.spec.ts
+++ b/src/lib/list/list.spec.ts
@@ -1,7 +1,7 @@
import {async, TestBed} from '@angular/core/testing';
import {Component} from '@angular/core';
import {By} from '@angular/platform-browser';
-import {MdListItem, MdListModule} from './list';
+import {MdListItem, MdListModule} from './index';
describe('MdList', () => {
diff --git a/src/lib/list/list.ts b/src/lib/list/list.ts
index a6a675065367..7a2c2c6929d5 100644
--- a/src/lib/list/list.ts
+++ b/src/lib/list/list.ts
@@ -1,17 +1,15 @@
import {
- Component,
- ViewEncapsulation,
- ContentChildren,
- ContentChild,
- QueryList,
- Directive,
- ElementRef,
- Renderer,
- AfterContentInit,
- NgModule,
- ModuleWithProviders,
+ Component,
+ ViewEncapsulation,
+ ContentChildren,
+ ContentChild,
+ QueryList,
+ Directive,
+ ElementRef,
+ Renderer,
+ AfterContentInit,
} from '@angular/core';
-import {MdLine, MdLineSetter, MdLineModule, CompatibilityModule} from '../core';
+import {MdLine, MdLineSetter} from '../core';
@Directive({
selector: 'md-divider, mat-divider'
@@ -130,41 +128,3 @@ export class MdListItem implements AfterContentInit {
this._hasFocus = false;
}
}
-
-
-@NgModule({
- imports: [MdLineModule, CompatibilityModule],
- exports: [
- MdList,
- MdListItem,
- MdListDivider,
- MdListAvatarCssMatStyler,
- MdLineModule,
- CompatibilityModule,
- MdListIconCssMatStyler,
- MdListCssMatStyler,
- MdNavListCssMatStyler,
- MdDividerCssMatStyler,
- MdListSubheaderCssMatStyler
- ],
- declarations: [
- MdList,
- MdListItem,
- MdListDivider,
- MdListAvatarCssMatStyler,
- MdListIconCssMatStyler,
- MdListCssMatStyler,
- MdNavListCssMatStyler,
- MdDividerCssMatStyler,
- MdListSubheaderCssMatStyler
- ],
-})
-export class MdListModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdListModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/menu/index.ts b/src/lib/menu/index.ts
index e85efa8bca0a..87b541aca49e 100644
--- a/src/lib/menu/index.ts
+++ b/src/lib/menu/index.ts
@@ -1,3 +1,28 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {OverlayModule, CompatibilityModule} from '../core';
+import {MdMenu} from './menu-directive';
+import {MdMenuItem} from './menu-item';
+import {MdMenuTrigger} from './menu-trigger';
+import {MdRippleModule} from '../core/ripple/index';
+
+
+@NgModule({
+ imports: [OverlayModule, CommonModule, MdRippleModule, CompatibilityModule],
+ exports: [MdMenu, MdMenuItem, MdMenuTrigger, CompatibilityModule],
+ declarations: [MdMenu, MdMenuItem, MdMenuTrigger],
+})
+export class MdMenuModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdMenuModule,
+ providers: [],
+ };
+ }
+}
+
+
export * from './menu';
export {MdMenuTrigger} from './menu-trigger';
export {fadeInItems, transformMenu} from './menu-animations';
diff --git a/src/lib/menu/menu.spec.ts b/src/lib/menu/menu.spec.ts
index fbf23d4bed85..1ccdbc698d3a 100644
--- a/src/lib/menu/menu.spec.ts
+++ b/src/lib/menu/menu.spec.ts
@@ -15,7 +15,7 @@ import {
MdMenuPanel,
MenuPositionX,
MenuPositionY
-} from './menu';
+} from './index';
import {OverlayContainer} from '../core/overlay/overlay-container';
import {ViewportRuler} from '../core/overlay/position/viewport-ruler';
import {Dir, LayoutDirection} from '../core/rtl/dir';
diff --git a/src/lib/menu/menu.ts b/src/lib/menu/menu.ts
index 262ca5e7623e..d5041a9068f7 100644
--- a/src/lib/menu/menu.ts
+++ b/src/lib/menu/menu.ts
@@ -1,28 +1,5 @@
-import {NgModule, ModuleWithProviders} from '@angular/core';
-import {CommonModule} from '@angular/common';
-import {OverlayModule, CompatibilityModule} from '../core';
-import {MdMenu} from './menu-directive';
-import {MdMenuItem} from './menu-item';
-import {MdMenuTrigger} from './menu-trigger';
-import {MdRippleModule} from '../core/ripple/index';
export {MdMenu} from './menu-directive';
export {MdMenuItem} from './menu-item';
export {MdMenuTrigger} from './menu-trigger';
export {MdMenuPanel} from './menu-panel';
export {MenuPositionX, MenuPositionY} from './menu-positions';
-
-
-@NgModule({
- imports: [OverlayModule, CommonModule, MdRippleModule, CompatibilityModule],
- exports: [MdMenu, MdMenuItem, MdMenuTrigger, CompatibilityModule],
- declarations: [MdMenu, MdMenuItem, MdMenuTrigger],
-})
-export class MdMenuModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdMenuModule,
- providers: [],
- };
- }
-}
diff --git a/src/lib/progress-bar/index.ts b/src/lib/progress-bar/index.ts
index d71d9b1bf740..89730762bd34 100644
--- a/src/lib/progress-bar/index.ts
+++ b/src/lib/progress-bar/index.ts
@@ -1 +1,23 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {CompatibilityModule} from '../core/compatibility/compatibility';
+import {MdProgressBar} from './progress-bar';
+
+
+@NgModule({
+ imports: [CommonModule, CompatibilityModule],
+ exports: [MdProgressBar, CompatibilityModule],
+ declarations: [MdProgressBar],
+})
+export class MdProgressBarModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdProgressBarModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './progress-bar';
diff --git a/src/lib/progress-bar/progress-bar.spec.ts b/src/lib/progress-bar/progress-bar.spec.ts
index 264977087de9..d071e0fee566 100644
--- a/src/lib/progress-bar/progress-bar.spec.ts
+++ b/src/lib/progress-bar/progress-bar.spec.ts
@@ -1,7 +1,7 @@
import {TestBed, async, ComponentFixture} from '@angular/core/testing';
import {Component} from '@angular/core';
import {By} from '@angular/platform-browser';
-import {MdProgressBarModule} from './progress-bar';
+import {MdProgressBarModule} from './index';
describe('MdProgressBar', () => {
diff --git a/src/lib/progress-bar/progress-bar.ts b/src/lib/progress-bar/progress-bar.ts
index 38d67f0c2975..a5dc0184b1e9 100644
--- a/src/lib/progress-bar/progress-bar.ts
+++ b/src/lib/progress-bar/progress-bar.ts
@@ -1,13 +1,9 @@
import {
- NgModule,
- ModuleWithProviders,
- Component,
- ChangeDetectionStrategy,
- HostBinding,
- Input,
+ Component,
+ ChangeDetectionStrategy,
+ HostBinding,
+ Input,
} from '@angular/core';
-import {CommonModule} from '@angular/common';
-import {CompatibilityModule} from '../core/compatibility/compatibility';
// TODO(josephperrott): Benchpress tests.
// TODO(josephperrott): Add ARIA attributes for progressbar "for".
@@ -84,19 +80,3 @@ export class MdProgressBar {
function clamp(v: number, min = 0, max = 100) {
return Math.max(min, Math.min(max, v));
}
-
-
-@NgModule({
- imports: [CommonModule, CompatibilityModule],
- exports: [MdProgressBar, CompatibilityModule],
- declarations: [MdProgressBar],
-})
-export class MdProgressBarModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdProgressBarModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/progress-spinner/index.ts b/src/lib/progress-spinner/index.ts
index 03eb3d7fcc76..113dc6f84d66 100644
--- a/src/lib/progress-spinner/index.ts
+++ b/src/lib/progress-spinner/index.ts
@@ -1,2 +1,42 @@
-export * from './progress-circle';
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CompatibilityModule} from '../core';
+import {
+ MdProgressSpinner,
+ MdSpinner,
+ MdProgressSpinnerCssMatStyler,
+ MdProgressCircleCssMatStyler
+} from './progress-spinner';
+
+
+@NgModule({
+ imports: [CompatibilityModule],
+ exports: [
+ MdProgressSpinner,
+ MdSpinner,
+ CompatibilityModule,
+ MdProgressSpinnerCssMatStyler,
+ MdProgressCircleCssMatStyler
+ ],
+ declarations: [
+ MdProgressSpinner,
+ MdSpinner,
+ MdProgressSpinnerCssMatStyler,
+ MdProgressCircleCssMatStyler
+ ],
+})
+class MdProgressSpinnerModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdProgressSpinnerModule,
+ providers: []
+ };
+ }
+}
+
+export {MdProgressSpinnerModule};
export * from './progress-spinner';
+
+/** @deprecated */
+export {MdProgressSpinnerModule as MdProgressCircleModule};
+export {MdProgressSpinner as MdProgressCircle};
diff --git a/src/lib/progress-spinner/progress-circle.ts b/src/lib/progress-spinner/progress-circle.ts
deleted file mode 100644
index 4b8d8bb0d906..000000000000
--- a/src/lib/progress-spinner/progress-circle.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-/** @deprecated */
-export {MdProgressSpinner as MdProgressCircle} from './progress-spinner';
-/** @deprecated */
-export {MdProgressSpinnerModule as MdProgressCircleModule} from './progress-spinner';
diff --git a/src/lib/progress-spinner/progress-spinner.spec.ts b/src/lib/progress-spinner/progress-spinner.spec.ts
index 7153eebfb5fe..0db59707ec16 100644
--- a/src/lib/progress-spinner/progress-spinner.spec.ts
+++ b/src/lib/progress-spinner/progress-spinner.spec.ts
@@ -1,7 +1,7 @@
import {TestBed, async} from '@angular/core/testing';
import {Component} from '@angular/core';
import {By} from '@angular/platform-browser';
-import {MdProgressSpinnerModule} from './progress-spinner';
+import {MdProgressSpinnerModule} from './index';
describe('MdProgressSpinner', () => {
diff --git a/src/lib/progress-spinner/progress-spinner.ts b/src/lib/progress-spinner/progress-spinner.ts
index 2ebdeb8d3c06..1f56143478f0 100644
--- a/src/lib/progress-spinner/progress-spinner.ts
+++ b/src/lib/progress-spinner/progress-spinner.ts
@@ -1,6 +1,4 @@
import {
- NgModule,
- ModuleWithProviders,
Component,
HostBinding,
ChangeDetectionStrategy,
@@ -10,7 +8,6 @@ import {
NgZone,
Renderer, Directive
} from '@angular/core';
-import {CompatibilityModule} from '../core';
// TODO(josephperrott): Benchpress tests.
@@ -382,30 +379,3 @@ function getSvgArc(currentValue: number, rotation: number) {
return `M${start}A${pathRadius},${pathRadius} 0 ${largeArcFlag},${arcSweep} ${end}`;
}
-
-
-@NgModule({
- imports: [CompatibilityModule],
- exports: [
- MdProgressSpinner,
- MdSpinner,
- CompatibilityModule,
- MdProgressSpinnerCssMatStyler,
- MdProgressCircleCssMatStyler
- ],
- declarations: [
- MdProgressSpinner,
- MdSpinner,
- MdProgressSpinnerCssMatStyler,
- MdProgressCircleCssMatStyler
- ],
-})
-export class MdProgressSpinnerModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdProgressSpinnerModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/radio/index.ts b/src/lib/radio/index.ts
index 1140e08e216f..586a2734c855 100644
--- a/src/lib/radio/index.ts
+++ b/src/lib/radio/index.ts
@@ -1 +1,30 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {VIEWPORT_RULER_PROVIDER} from '../core/overlay/position/viewport-ruler';
+import {
+ MdRippleModule,
+ CompatibilityModule,
+ UNIQUE_SELECTION_DISPATCHER_PROVIDER,
+ FocusOriginMonitor,
+} from '../core';
+import {MdRadioGroup, MdRadioButton} from './radio';
+
+
+@NgModule({
+ imports: [CommonModule, MdRippleModule, CompatibilityModule],
+ exports: [MdRadioGroup, MdRadioButton, CompatibilityModule],
+ providers: [UNIQUE_SELECTION_DISPATCHER_PROVIDER, VIEWPORT_RULER_PROVIDER, FocusOriginMonitor],
+ declarations: [MdRadioGroup, MdRadioButton],
+})
+export class MdRadioModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdRadioModule,
+ providers: [],
+ };
+ }
+}
+
+
export * from './radio';
diff --git a/src/lib/radio/radio.spec.ts b/src/lib/radio/radio.spec.ts
index eaccd2ca4099..238949c9488a 100644
--- a/src/lib/radio/radio.spec.ts
+++ b/src/lib/radio/radio.spec.ts
@@ -2,7 +2,7 @@ import {async, ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/t
import {NgControl, FormsModule, ReactiveFormsModule, FormControl} from '@angular/forms';
import {Component, DebugElement} from '@angular/core';
import {By} from '@angular/platform-browser';
-import {MdRadioGroup, MdRadioButton, MdRadioChange, MdRadioModule} from './radio';
+import {MdRadioGroup, MdRadioButton, MdRadioChange, MdRadioModule} from './index';
import {ViewportRuler} from '../core/overlay/position/viewport-ruler';
import {FakeViewportRuler} from '../core/overlay/position/fake-viewport-ruler';
import {dispatchFakeEvent} from '../core/testing/dispatch-events';
diff --git a/src/lib/radio/radio.ts b/src/lib/radio/radio.ts
index 1ccc01990fd8..9bf104b21af1 100644
--- a/src/lib/radio/radio.ts
+++ b/src/lib/radio/radio.ts
@@ -13,25 +13,18 @@ import {
QueryList,
ViewEncapsulation,
forwardRef,
- NgModule,
- ModuleWithProviders,
ViewChild,
OnDestroy,
AfterViewInit,
} from '@angular/core';
-import {CommonModule} from '@angular/common';
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms';
import {
- MdRippleModule,
RippleRef,
UniqueSelectionDispatcher,
- CompatibilityModule,
- UNIQUE_SELECTION_DISPATCHER_PROVIDER,
MdRipple,
FocusOriginMonitor,
} from '../core';
import {coerceBooleanProperty} from '../core/coercion/boolean-property';
-import {VIEWPORT_RULER_PROVIDER} from '../core/overlay/position/viewport-ruler';
import {Subscription} from 'rxjs/Subscription';
@@ -527,20 +520,3 @@ export class MdRadioButton implements OnInit, AfterViewInit, OnDestroy {
}
}
-
-
-@NgModule({
- imports: [CommonModule, MdRippleModule, CompatibilityModule],
- exports: [MdRadioGroup, MdRadioButton, CompatibilityModule],
- providers: [UNIQUE_SELECTION_DISPATCHER_PROVIDER, VIEWPORT_RULER_PROVIDER, FocusOriginMonitor],
- declarations: [MdRadioGroup, MdRadioButton],
-})
-export class MdRadioModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdRadioModule,
- providers: [],
- };
- }
-}
diff --git a/src/lib/select/index.ts b/src/lib/select/index.ts
index 1a2e4afe6a88..c1e58f3ed157 100644
--- a/src/lib/select/index.ts
+++ b/src/lib/select/index.ts
@@ -6,8 +6,6 @@ import {
CompatibilityModule,
OverlayModule,
} from '../core';
-export * from './select';
-export {fadeInContent, transformPanel, transformPlaceholder} from './select-animations';
@NgModule({
@@ -24,3 +22,7 @@ export class MdSelectModule {
};
}
}
+
+
+export * from './select';
+export {fadeInContent, transformPanel, transformPlaceholder} from './select-animations';
diff --git a/src/lib/sidenav/index.ts b/src/lib/sidenav/index.ts
index b126f2c842e3..cd2f2a879f1a 100644
--- a/src/lib/sidenav/index.ts
+++ b/src/lib/sidenav/index.ts
@@ -1 +1,25 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {CompatibilityModule} from '../core';
+import {A11yModule} from '../core/a11y/index';
+import {OverlayModule} from '../core/overlay/overlay-directives';
+import {MdSidenav, MdSidenavContainer} from './sidenav';
+
+
+@NgModule({
+ imports: [CommonModule, CompatibilityModule, A11yModule, OverlayModule],
+ exports: [MdSidenavContainer, MdSidenav, CompatibilityModule],
+ declarations: [MdSidenavContainer, MdSidenav],
+})
+export class MdSidenavModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdSidenavModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './sidenav';
diff --git a/src/lib/sidenav/sidenav.spec.ts b/src/lib/sidenav/sidenav.spec.ts
index 31a59669134e..073a3f5378b5 100644
--- a/src/lib/sidenav/sidenav.spec.ts
+++ b/src/lib/sidenav/sidenav.spec.ts
@@ -1,7 +1,7 @@
import {fakeAsync, async, tick, ComponentFixture, TestBed} from '@angular/core/testing';
import {Component} from '@angular/core';
import {By} from '@angular/platform-browser';
-import {MdSidenav, MdSidenavModule, MdSidenavToggleResult} from './sidenav';
+import {MdSidenav, MdSidenavModule, MdSidenavToggleResult} from './index';
import {A11yModule} from '../core/a11y/index';
import {PlatformModule} from '../core/platform/index';
import {ESCAPE} from '../core/keyboard/keycodes';
diff --git a/src/lib/sidenav/sidenav.ts b/src/lib/sidenav/sidenav.ts
index c81e797d9224..b86b0c156d82 100644
--- a/src/lib/sidenav/sidenav.ts
+++ b/src/lib/sidenav/sidenav.ts
@@ -1,6 +1,4 @@
import {
- NgModule,
- ModuleWithProviders,
AfterContentInit,
Component,
ContentChildren,
@@ -16,12 +14,9 @@ import {
NgZone,
OnDestroy,
} from '@angular/core';
-import {CommonModule} from '@angular/common';
-import {Dir, MdError, coerceBooleanProperty, CompatibilityModule} from '../core';
-import {A11yModule} from '../core/a11y/index';
+import {Dir, MdError, coerceBooleanProperty} from '../core';
import {FocusTrapFactory, FocusTrap} from '../core/a11y/focus-trap';
import {ESCAPE} from '../core/keyboard/keycodes';
-import {OverlayModule} from '../core/overlay/overlay-directives';
import 'rxjs/add/operator/first';
@@ -507,19 +502,3 @@ export class MdSidenavContainer implements AfterContentInit {
};
}
}
-
-
-@NgModule({
- imports: [CommonModule, CompatibilityModule, A11yModule, OverlayModule],
- exports: [MdSidenavContainer, MdSidenav, CompatibilityModule],
- declarations: [MdSidenavContainer, MdSidenav],
-})
-export class MdSidenavModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdSidenavModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/slide-toggle/index.ts b/src/lib/slide-toggle/index.ts
index e2f2f602f25c..2c7409e1c60d 100644
--- a/src/lib/slide-toggle/index.ts
+++ b/src/lib/slide-toggle/index.ts
@@ -1 +1,26 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {FormsModule} from '@angular/forms';
+import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
+import {GestureConfig, CompatibilityModule} from '../core';
+import {MdSlideToggle} from './slide-toggle';
+import {MdRippleModule} from '../core/ripple/index';
+
+
+@NgModule({
+ imports: [FormsModule, MdRippleModule, CompatibilityModule],
+ exports: [MdSlideToggle, CompatibilityModule],
+ declarations: [MdSlideToggle],
+ providers: [{provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}],
+})
+export class MdSlideToggleModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdSlideToggleModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './slide-toggle';
diff --git a/src/lib/slide-toggle/slide-toggle.spec.ts b/src/lib/slide-toggle/slide-toggle.spec.ts
index 2d2441909dbf..92d851c950f5 100644
--- a/src/lib/slide-toggle/slide-toggle.spec.ts
+++ b/src/lib/slide-toggle/slide-toggle.spec.ts
@@ -1,8 +1,8 @@
-import {async, ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/testing';
-import {By, HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
import {Component} from '@angular/core';
-import {MdSlideToggle, MdSlideToggleChange, MdSlideToggleModule} from './slide-toggle';
+import {By, HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
+import {async, ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/testing';
import {FormsModule, NgControl, ReactiveFormsModule, FormControl} from '@angular/forms';
+import {MdSlideToggle, MdSlideToggleChange, MdSlideToggleModule} from './index';
import {TestGestureConfig} from '../slider/test-gesture-config';
import {dispatchFakeEvent} from '../core/testing/dispatch-events';
diff --git a/src/lib/slide-toggle/slide-toggle.ts b/src/lib/slide-toggle/slide-toggle.ts
index 2cc0edde5064..ab4a5de00d66 100644
--- a/src/lib/slide-toggle/slide-toggle.ts
+++ b/src/lib/slide-toggle/slide-toggle.ts
@@ -8,22 +8,12 @@ import {
Output,
EventEmitter,
AfterContentInit,
- NgModule,
- ModuleWithProviders,
ViewChild,
ViewEncapsulation,
} from '@angular/core';
-import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
-import {FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
-import {
- applyCssTransform,
- coerceBooleanProperty,
- GestureConfig,
- HammerInput,
- CompatibilityModule,
-} from '../core';
+import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
+import {applyCssTransform, coerceBooleanProperty, HammerInput} from '../core';
import {Observable} from 'rxjs/Observable';
-import {MdRippleModule} from '../core/ripple/index';
export const MD_SLIDE_TOGGLE_VALUE_ACCESSOR: any = {
@@ -352,20 +342,3 @@ class SlideToggleRenderer {
}
}
-
-
-@NgModule({
- imports: [FormsModule, MdRippleModule, CompatibilityModule],
- exports: [MdSlideToggle, CompatibilityModule],
- declarations: [MdSlideToggle],
- providers: [{provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}],
-})
-export class MdSlideToggleModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdSlideToggleModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/slider/index.ts b/src/lib/slider/index.ts
index eb0742f8019b..a37d19c4c8cf 100644
--- a/src/lib/slider/index.ts
+++ b/src/lib/slider/index.ts
@@ -1 +1,26 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
+import {CommonModule} from '@angular/common';
+import {FormsModule} from '@angular/forms';
+import {GestureConfig, CompatibilityModule} from '../core';
+import {MdSlider} from './slider';
+
+
+@NgModule({
+ imports: [CommonModule, FormsModule, CompatibilityModule],
+ exports: [MdSlider, CompatibilityModule],
+ declarations: [MdSlider],
+ providers: [{provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}]
+})
+export class MdSliderModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdSliderModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './slider';
diff --git a/src/lib/slider/slider.spec.ts b/src/lib/slider/slider.spec.ts
index e029442694db..35ce2babed86 100644
--- a/src/lib/slider/slider.spec.ts
+++ b/src/lib/slider/slider.spec.ts
@@ -2,7 +2,7 @@ import {async, ComponentFixture, TestBed} from '@angular/core/testing';
import {ReactiveFormsModule, FormControl, FormsModule} from '@angular/forms';
import {Component, DebugElement} from '@angular/core';
import {By, HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
-import {MdSlider, MdSliderModule} from './slider';
+import {MdSlider, MdSliderModule} from './index';
import {TestGestureConfig} from './test-gesture-config';
import {RtlModule} from '../core/rtl/dir';
import {
diff --git a/src/lib/slider/slider.ts b/src/lib/slider/slider.ts
index c6158f55c477..758a4ffd5ba1 100644
--- a/src/lib/slider/slider.ts
+++ b/src/lib/slider/slider.ts
@@ -1,6 +1,4 @@
import {
- NgModule,
- ModuleWithProviders,
Component,
ElementRef,
Input,
@@ -10,17 +8,9 @@ import {
EventEmitter,
Optional
} from '@angular/core';
-import {NG_VALUE_ACCESSOR, ControlValueAccessor, FormsModule} from '@angular/forms';
-import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
-import {
- GestureConfig,
- HammerInput,
- coerceBooleanProperty,
- coerceNumberProperty,
- CompatibilityModule,
-} from '../core';
+import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms';
+import {HammerInput, coerceBooleanProperty, coerceNumberProperty} from '../core';
import {Dir} from '../core/rtl/dir';
-import {CommonModule} from '@angular/common';
import {
PAGE_UP,
PAGE_DOWN,
@@ -652,20 +642,3 @@ export class SliderRenderer {
this._sliderElement.focus();
}
}
-
-
-@NgModule({
- imports: [CommonModule, FormsModule, CompatibilityModule],
- exports: [MdSlider, CompatibilityModule],
- declarations: [MdSlider],
- providers: [{provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}]
-})
-export class MdSliderModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdSliderModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/snack-bar/index.ts b/src/lib/snack-bar/index.ts
index 2425ecce98e9..99dfe54532c1 100644
--- a/src/lib/snack-bar/index.ts
+++ b/src/lib/snack-bar/index.ts
@@ -5,6 +5,7 @@ import {MdSnackBar} from './snack-bar';
import {MdSnackBarContainer} from './snack-bar-container';
import {SimpleSnackBar} from './simple-snack-bar';
+
@NgModule({
imports: [OverlayModule, PortalModule, CommonModule, CompatibilityModule],
exports: [MdSnackBarContainer, CompatibilityModule],
@@ -22,6 +23,7 @@ export class MdSnackBarModule {
}
}
+
export * from './snack-bar';
export * from './snack-bar-container';
export * from './snack-bar-config';
diff --git a/src/lib/tabs/index.ts b/src/lib/tabs/index.ts
index 47c6cb9c3587..51dcf3760728 100644
--- a/src/lib/tabs/index.ts
+++ b/src/lib/tabs/index.ts
@@ -1,3 +1,39 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {PortalModule} from '../core';
+import {MdRippleModule} from '../core/ripple/index';
+import {ObserveContentModule} from '../core/observe-content/observe-content';
+import {MdTab} from './tab';
+import {MdTabGroup} from './tab-group';
+import {MdTabLabel} from './tab-label';
+import {MdTabLabelWrapper} from './tab-label-wrapper';
+import {MdTabNavBar, MdTabLink, MdTabLinkRipple} from './tab-nav-bar/tab-nav-bar';
+import {MdInkBar} from './ink-bar';
+import {MdTabBody} from './tab-body';
+import {VIEWPORT_RULER_PROVIDER} from '../core/overlay/position/viewport-ruler';
+import {MdTabHeader} from './tab-header';
+import {SCROLL_DISPATCHER_PROVIDER} from '../core/overlay/scroll/scroll-dispatcher';
+
+
+@NgModule({
+ imports: [CommonModule, PortalModule, MdRippleModule, ObserveContentModule],
+ // Don't export all components because some are only to be used internally.
+ exports: [MdTabGroup, MdTabLabel, MdTab, MdTabNavBar, MdTabLink, MdTabLinkRipple],
+ declarations: [MdTabGroup, MdTabLabel, MdTab, MdInkBar, MdTabLabelWrapper,
+ MdTabNavBar, MdTabLink, MdTabBody, MdTabLinkRipple, MdTabHeader],
+ providers: [VIEWPORT_RULER_PROVIDER, SCROLL_DISPATCHER_PROVIDER],
+})
+export class MdTabsModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdTabsModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './tab-group';
export {MdInkBar} from './ink-bar';
export {MdTabBody, MdTabBodyOriginState, MdTabBodyPositionState} from './tab-body';
diff --git a/src/lib/tabs/tab-group.spec.ts b/src/lib/tabs/tab-group.spec.ts
index 661ed10d8e17..3ae944edcfc9 100644
--- a/src/lib/tabs/tab-group.spec.ts
+++ b/src/lib/tabs/tab-group.spec.ts
@@ -1,7 +1,7 @@
import {
async, fakeAsync, tick, ComponentFixture, TestBed
} from '@angular/core/testing';
-import {MdTabGroup, MdTabsModule, MdTabHeaderPosition} from './tab-group';
+import {MdTabGroup, MdTabsModule, MdTabHeaderPosition} from './index';
import {Component, ViewChild} from '@angular/core';
import {By} from '@angular/platform-browser';
import {Observable} from 'rxjs/Observable';
diff --git a/src/lib/tabs/tab-group.ts b/src/lib/tabs/tab-group.ts
index 3b7b8d62d639..751767813409 100644
--- a/src/lib/tabs/tab-group.ts
+++ b/src/lib/tabs/tab-group.ts
@@ -1,6 +1,4 @@
import {
- NgModule,
- ModuleWithProviders,
ViewChild,
Component,
Input,
@@ -11,24 +9,10 @@ import {
ElementRef,
Renderer
} from '@angular/core';
-import {CommonModule} from '@angular/common';
-import {
- PortalModule,
- coerceBooleanProperty
-} from '../core';
-import {MdTabLabel} from './tab-label';
-import {MdTabLabelWrapper} from './tab-label-wrapper';
-import {MdTabNavBar, MdTabLink, MdTabLinkRipple} from './tab-nav-bar/tab-nav-bar';
-import {MdInkBar} from './ink-bar';
+import {coerceBooleanProperty} from '../core';
import {Observable} from 'rxjs/Observable';
-import 'rxjs/add/operator/map';
-import {MdRippleModule} from '../core/ripple/index';
-import {ObserveContentModule} from '../core/observe-content/observe-content';
import {MdTab} from './tab';
-import {MdTabBody} from './tab-body';
-import {VIEWPORT_RULER_PROVIDER} from '../core/overlay/position/viewport-ruler';
-import {MdTabHeader} from './tab-header';
-import {SCROLL_DISPATCHER_PROVIDER} from '../core/overlay/scroll/scroll-dispatcher';
+import 'rxjs/add/operator/map';
/** Used to generate unique ID's for each tab component */
@@ -209,21 +193,3 @@ export class MdTabGroup {
this._renderer.setElementStyle(this._tabBodyWrapper.nativeElement, 'height', '');
}
}
-
-@NgModule({
- imports: [CommonModule, PortalModule, MdRippleModule, ObserveContentModule],
- // Don't export all components because some are only to be used internally.
- exports: [MdTabGroup, MdTabLabel, MdTab, MdTabNavBar, MdTabLink, MdTabLinkRipple],
- declarations: [MdTabGroup, MdTabLabel, MdTab, MdInkBar, MdTabLabelWrapper,
- MdTabNavBar, MdTabLink, MdTabBody, MdTabLinkRipple, MdTabHeader],
- providers: [VIEWPORT_RULER_PROVIDER, SCROLL_DISPATCHER_PROVIDER],
-})
-export class MdTabsModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdTabsModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts b/src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts
index facdca13203a..54d98ad04de5 100644
--- a/src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts
+++ b/src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts
@@ -1,5 +1,5 @@
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
-import {MdTabsModule} from '../tab-group';
+import {MdTabsModule} from '../index';
import {Component} from '@angular/core';
import {By} from '@angular/platform-browser';
import {ViewportRuler} from '../../core/overlay/position/viewport-ruler';
diff --git a/src/lib/toolbar/index.ts b/src/lib/toolbar/index.ts
index 316a52a324ed..ac40454a80ce 100644
--- a/src/lib/toolbar/index.ts
+++ b/src/lib/toolbar/index.ts
@@ -1 +1,22 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CompatibilityModule} from '../core';
+import {MdToolbar, MdToolbarRow} from './toolbar';
+
+
+@NgModule({
+ imports: [CompatibilityModule],
+ exports: [MdToolbar, MdToolbarRow, CompatibilityModule],
+ declarations: [MdToolbar, MdToolbarRow],
+})
+export class MdToolbarModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdToolbarModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './toolbar';
diff --git a/src/lib/toolbar/toolbar.spec.ts b/src/lib/toolbar/toolbar.spec.ts
index bb142afdd8e7..b688ae430c57 100644
--- a/src/lib/toolbar/toolbar.spec.ts
+++ b/src/lib/toolbar/toolbar.spec.ts
@@ -1,7 +1,7 @@
import {Component} from '@angular/core';
import {TestBed, async, ComponentFixture} from '@angular/core/testing';
import {By} from '@angular/platform-browser';
-import {MdToolbarModule} from './toolbar';
+import {MdToolbarModule} from './index';
describe('MdToolbar', () => {
diff --git a/src/lib/toolbar/toolbar.ts b/src/lib/toolbar/toolbar.ts
index 1b1212010b4d..49f6620437fb 100644
--- a/src/lib/toolbar/toolbar.ts
+++ b/src/lib/toolbar/toolbar.ts
@@ -1,6 +1,4 @@
import {
- NgModule,
- ModuleWithProviders,
Component,
ChangeDetectionStrategy,
Input,
@@ -9,7 +7,6 @@ import {
ElementRef,
Renderer
} from '@angular/core';
-import {CompatibilityModule} from '../core';
@Directive({
@@ -61,19 +58,3 @@ export class MdToolbar {
}
}
-
-
-@NgModule({
- imports: [CompatibilityModule],
- exports: [MdToolbar, MdToolbarRow, CompatibilityModule],
- declarations: [MdToolbar, MdToolbarRow],
-})
-export class MdToolbarModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdToolbarModule,
- providers: []
- };
- }
-}
diff --git a/src/lib/tooltip/index.ts b/src/lib/tooltip/index.ts
index ed8326d5e7c1..50d1e0df12dc 100644
--- a/src/lib/tooltip/index.ts
+++ b/src/lib/tooltip/index.ts
@@ -1 +1,24 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {OverlayModule, CompatibilityModule} from '../core';
+import {PlatformModule} from '../core/platform/index';
+import {MdTooltip, TooltipComponent} from './tooltip';
+
+
+@NgModule({
+ imports: [OverlayModule, CompatibilityModule, PlatformModule],
+ exports: [MdTooltip, TooltipComponent, CompatibilityModule],
+ declarations: [MdTooltip, TooltipComponent],
+ entryComponents: [TooltipComponent],
+})
+export class MdTooltipModule {
+ /** @deprecated */
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: MdTooltipModule,
+ providers: []
+ };
+ }
+}
+
+
export * from './tooltip';
diff --git a/src/lib/tooltip/tooltip.spec.ts b/src/lib/tooltip/tooltip.spec.ts
index 81f4c0c9e816..f13af21eca89 100644
--- a/src/lib/tooltip/tooltip.spec.ts
+++ b/src/lib/tooltip/tooltip.spec.ts
@@ -14,7 +14,7 @@ import {
ChangeDetectionStrategy
} from '@angular/core';
import {By} from '@angular/platform-browser';
-import {TooltipPosition, MdTooltip, MdTooltipModule, SCROLL_THROTTLE_MS} from './tooltip';
+import {TooltipPosition, MdTooltip, MdTooltipModule, SCROLL_THROTTLE_MS} from './index';
import {OverlayContainer} from '../core';
import {Dir, LayoutDirection} from '../core/rtl/dir';
import {OverlayModule} from '../core/overlay/overlay-directives';
diff --git a/src/lib/tooltip/tooltip.ts b/src/lib/tooltip/tooltip.ts
index fc621826beaf..65817c0aa6db 100644
--- a/src/lib/tooltip/tooltip.ts
+++ b/src/lib/tooltip/tooltip.ts
@@ -1,6 +1,4 @@
import {
- NgModule,
- ModuleWithProviders,
Component,
Directive,
Input,
@@ -22,18 +20,16 @@ import {
import {
Overlay,
OverlayState,
- OverlayModule,
OverlayRef,
ComponentPortal,
OverlayConnectionPosition,
OriginConnectionPosition,
- CompatibilityModule
} from '../core';
import {MdTooltipInvalidPositionError} from './tooltip-errors';
import {Observable} from 'rxjs/Observable';
import {Subject} from 'rxjs/Subject';
import {Dir} from '../core/rtl/dir';
-import {PlatformModule, Platform} from '../core/platform/index';
+import {Platform} from '../core/platform/index';
import 'rxjs/add/operator/first';
import {ScrollDispatcher} from '../core/overlay/scroll/scroll-dispatcher';
import {Subscription} from 'rxjs/Subscription';
@@ -445,20 +441,3 @@ export class TooltipComponent {
}
}
}
-
-
-@NgModule({
- imports: [OverlayModule, CompatibilityModule, PlatformModule],
- exports: [MdTooltip, TooltipComponent, CompatibilityModule],
- declarations: [MdTooltip, TooltipComponent],
- entryComponents: [TooltipComponent],
-})
-export class MdTooltipModule {
- /** @deprecated */
- static forRoot(): ModuleWithProviders {
- return {
- ngModule: MdTooltipModule,
- providers: []
- };
- }
-}
From 8b2ae0d8aab6d348a2e2ca947c7625b57abbd368 Mon Sep 17 00:00:00 2001
From: Kristiyan Kostadinov
Date: Mon, 6 Mar 2017 18:24:48 +0100
Subject: [PATCH 17/24] fix(focus-trap): avoid closure compiler issues when
adding anchors (#3448)
---
src/lib/core/a11y/focus-trap.ts | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/src/lib/core/a11y/focus-trap.ts b/src/lib/core/a11y/focus-trap.ts
index 7bdbd42f5574..c2d4c95b2d5d 100644
--- a/src/lib/core/a11y/focus-trap.ts
+++ b/src/lib/core/a11y/focus-trap.ts
@@ -72,13 +72,11 @@ export class FocusTrap {
}
this._ngZone.runOutsideAngular(() => {
- this._element
- .insertAdjacentElement('beforebegin', this._startAnchor)
- .addEventListener('focus', () => this.focusLastTabbableElement());
+ this._startAnchor.addEventListener('focus', () => this.focusLastTabbableElement());
+ this._endAnchor.addEventListener('focus', () => this.focusFirstTabbableElement());
- this._element
- .insertAdjacentElement('afterend', this._endAnchor)
- .addEventListener('focus', () => this.focusFirstTabbableElement());
+ this._element.parentNode.insertBefore(this._startAnchor, this._element);
+ this._element.parentNode.insertBefore(this._endAnchor, this._element.nextSibling);
});
}
From b135b64a8e1201e3d32616de2c58801a8ef36e2a Mon Sep 17 00:00:00 2001
From: Kristiyan Kostadinov
Date: Tue, 7 Mar 2017 01:51:27 +0100
Subject: [PATCH 18/24] chore(menu): switch menu-item to common coercion logic
(#3065)
* `MdMenuItem` to use the common coercion logic when determining the disabled state.
* Gets rid of the `@HostBinding` in favor of passing them through the `host` option.
Relates to #2985.
---
src/lib/menu/menu-item.ts | 38 ++++++++++++++++++++++++--------------
1 file changed, 24 insertions(+), 14 deletions(-)
diff --git a/src/lib/menu/menu-item.ts b/src/lib/menu/menu-item.ts
index bb6f14811bcc..76d00955ce67 100644
--- a/src/lib/menu/menu-item.ts
+++ b/src/lib/menu/menu-item.ts
@@ -1,5 +1,6 @@
-import {Component, ElementRef, Input, HostBinding, Renderer} from '@angular/core';
+import {Component, ElementRef, Input, Renderer} from '@angular/core';
import {Focusable} from '../core/a11y/focus-key-manager';
+import {coerceBooleanProperty} from '../core/coercion/boolean-property';
/**
* This directive is intended to be used inside an md-menu tag.
@@ -11,40 +12,49 @@ import {Focusable} from '../core/a11y/focus-key-manager';
host: {
'role': 'menuitem',
'[class.mat-menu-item]': 'true',
+ '[attr.tabindex]': '_getTabIndex()',
+ '[attr.aria-disabled]': 'disabled.toString()',
+ '[attr.disabled]': '_getDisabledAttr()',
'(click)': '_checkDisabled($event)',
- '[attr.tabindex]': '_tabindex'
},
templateUrl: 'menu-item.html',
exportAs: 'mdMenuItem'
})
export class MdMenuItem implements Focusable {
- _disabled: boolean;
+ /** Whether the menu item is disabled */
+ private _disabled: boolean = false;
constructor(private _renderer: Renderer, private _elementRef: ElementRef) {}
+ /** Focuses the menu item. */
focus(): void {
- this._renderer.invokeElementMethod(this._elementRef.nativeElement, 'focus');
+ this._renderer.invokeElementMethod(this._getHostElement(), 'focus');
}
- // this is necessary to support anchors
/** Whether the menu item is disabled. */
- @HostBinding('attr.disabled')
@Input()
- get disabled(): boolean { return this._disabled; }
- set disabled(value: boolean) {
- this._disabled = (value === false || value === undefined) ? null : true;
+ get disabled() { return this._disabled; }
+ set disabled(value: any) {
+ this._disabled = coerceBooleanProperty(value);
}
- /** Sets the aria-disabled property on the menu item. */
- @HostBinding('attr.aria-disabled')
- get isAriaDisabled(): string { return String(!!this.disabled); }
- get _tabindex() { return this.disabled ? '-1' : '0'; }
+ /** Used to set the `tabindex`. */
+ _getTabIndex(): string {
+ return this._disabled ? '-1' : '0';
+ }
+
+ /** Used to set the HTML `disabled` attribute. Necessary for links to be disabled properly. */
+ _getDisabledAttr(): boolean {
+ return this._disabled ? true : null;
+ }
+ /** Returns the host DOM element. */
_getHostElement(): HTMLElement {
return this._elementRef.nativeElement;
}
- _checkDisabled(event: Event) {
+ /** Prevents the default element actions if it is disabled. */
+ _checkDisabled(event: Event): void {
if (this.disabled) {
event.preventDefault();
event.stopPropagation();
From 842896be3e8bdbadf70ce26afba8cd451f65cfdb Mon Sep 17 00:00:00 2001
From: Kristiyan Kostadinov
Date: Tue, 7 Mar 2017 01:51:46 +0100
Subject: [PATCH 19/24] fix(list-key-manager): exception when no initial active
item (#3431)
* fix(list-key-manager): exception when no initial active item
Fixes an exception that is thrown when the user presses a key on ListKeyManager that doesn't have a default active item. The problem was due to the fact that we have a check for `null` a little bit down, that handles cases like this, however the active index is `undefined` by default.
Fixes #3317.
* fix: it it
---
src/lib/core/a11y/list-key-manager.spec.ts | 10 ++++++++++
src/lib/core/a11y/list-key-manager.ts | 2 +-
src/lib/tabs/tab-body.spec.ts | 2 +-
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/src/lib/core/a11y/list-key-manager.spec.ts b/src/lib/core/a11y/list-key-manager.spec.ts
index 2f6bd8657f8e..4a64bac10cd1 100644
--- a/src/lib/core/a11y/list-key-manager.spec.ts
+++ b/src/lib/core/a11y/list-key-manager.spec.ts
@@ -240,6 +240,16 @@ describe('Key managers', () => {
expect(TAB_EVENT.defaultPrevented).toBe(false);
});
+ it('should activate the first item when pressing down on a clean key manager', () => {
+ keyManager = new ListKeyManager(itemList);
+
+ expect(keyManager.activeItemIndex).toBeNull('Expected active index to default to null.');
+
+ keyManager.onKeydown(DOWN_ARROW_EVENT);
+
+ expect(keyManager.activeItemIndex).toBe(0, 'Expected first item to become active.');
+ });
+
});
describe('programmatic focus', () => {
diff --git a/src/lib/core/a11y/list-key-manager.ts b/src/lib/core/a11y/list-key-manager.ts
index 308e10a67dca..d54bf1a1521d 100644
--- a/src/lib/core/a11y/list-key-manager.ts
+++ b/src/lib/core/a11y/list-key-manager.ts
@@ -16,7 +16,7 @@ export interface CanDisable {
* of items, it will set the active item correctly when arrow events occur.
*/
export class ListKeyManager {
- private _activeItemIndex: number;
+ private _activeItemIndex: number = null;
private _activeItem: T;
private _tabOut: Subject = new Subject();
private _wrap: boolean = false;
diff --git a/src/lib/tabs/tab-body.spec.ts b/src/lib/tabs/tab-body.spec.ts
index 4ff41baf642a..4d6840097c4a 100644
--- a/src/lib/tabs/tab-body.spec.ts
+++ b/src/lib/tabs/tab-body.spec.ts
@@ -169,7 +169,7 @@ describe('MdTabBody', () => {
}));
});
- it('it should toggle the canBeAnimated flag', () => {
+ it('should toggle the canBeAnimated flag', () => {
let fixture: ComponentFixture;
let tabBody: MdTabBody;
From d06ad753e844f4feaf42f32706d2e64313cea3fc Mon Sep 17 00:00:00 2001
From: Kristiyan Kostadinov
Date: Tue, 7 Mar 2017 01:51:59 +0100
Subject: [PATCH 20/24] fix(focus-trap): exception when element contains SVG on
IE (#3432)
Fixes an exception being thrown by the focus trap, if it contains an SVG element on IE. The problem was that on IE, SVG elements don't have the `children` property, which means that we have to fall back to `childNodes`.
Fixes #3410.
---
src/lib/core/a11y/focus-trap.spec.ts | 36 +++++++++++++++++++++++++++-
src/lib/core/a11y/focus-trap.ts | 22 ++++++++++++-----
2 files changed, 51 insertions(+), 7 deletions(-)
diff --git a/src/lib/core/a11y/focus-trap.spec.ts b/src/lib/core/a11y/focus-trap.spec.ts
index 80a72e1b0f0a..49900604f4ff 100644
--- a/src/lib/core/a11y/focus-trap.spec.ts
+++ b/src/lib/core/a11y/focus-trap.spec.ts
@@ -9,7 +9,13 @@ describe('FocusTrap', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
- declarations: [FocusTrapDirective, FocusTrapWithBindings, SimpleFocusTrap, FocusTrapTargets],
+ declarations: [
+ FocusTrapDirective,
+ FocusTrapWithBindings,
+ SimpleFocusTrap,
+ FocusTrapTargets,
+ FocusTrapWithSvg
+ ],
providers: [InteractivityChecker, Platform, FocusTrapFactory]
});
@@ -112,6 +118,20 @@ describe('FocusTrap', () => {
expect(document.activeElement.id).toBe('last');
});
});
+
+ describe('special cases', () => {
+ it('should not throw when it has a SVG child', () => {
+ let fixture = TestBed.createComponent(FocusTrapWithSvg);
+
+ fixture.detectChanges();
+
+ let focusTrapInstance = fixture.componentInstance.focusTrapDirective.focusTrap;
+
+ expect(() => focusTrapInstance.focusFirstTabbableElement()).not.toThrow();
+ expect(() => focusTrapInstance.focusLastTabbableElement()).not.toThrow();
+ });
+ });
+
});
@@ -156,3 +176,17 @@ class FocusTrapWithBindings {
class FocusTrapTargets {
@ViewChild(FocusTrapDirective) focusTrapDirective: FocusTrapDirective;
}
+
+
+@Component({
+ template: `
+