Skip to content

Commit 6d6c12d

Browse files
mmalerbatinayuangao
authored andcommitted
fix(input): don't add empty prefix & suffix wrappers (#3724)
* fix(input): don't add empty prefix & suffix wrappers * add tests
1 parent 07793a4 commit 6d6c12d

File tree

4 files changed

+111
-59
lines changed

4 files changed

+111
-59
lines changed

src/lib/input/index.ts

+18-12
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import {NgModule, ModuleWithProviders} from '@angular/core';
1+
import {ModuleWithProviders, NgModule} from '@angular/core';
22
import {
3-
MdPlaceholder,
4-
MdInputContainer,
3+
MdErrorDirective,
54
MdHint,
5+
MdInputContainer,
66
MdInputDirective,
7-
MdErrorDirective,
7+
MdPlaceholder,
8+
MdPrefix,
9+
MdSuffix
810
} from './input-container';
911
import {MdTextareaAutosize} from './autosize';
1012
import {CommonModule} from '@angular/common';
@@ -14,25 +16,29 @@ import {PlatformModule} from '../core/platform/index';
1416

1517
@NgModule({
1618
declarations: [
17-
MdPlaceholder,
18-
MdInputContainer,
19+
MdErrorDirective,
1920
MdHint,
20-
MdTextareaAutosize,
21+
MdInputContainer,
2122
MdInputDirective,
22-
MdErrorDirective
23+
MdPlaceholder,
24+
MdPrefix,
25+
MdSuffix,
26+
MdTextareaAutosize,
2327
],
2428
imports: [
2529
CommonModule,
2630
FormsModule,
2731
PlatformModule,
2832
],
2933
exports: [
30-
MdPlaceholder,
31-
MdInputContainer,
34+
MdErrorDirective,
3235
MdHint,
33-
MdTextareaAutosize,
36+
MdInputContainer,
3437
MdInputDirective,
35-
MdErrorDirective
38+
MdPlaceholder,
39+
MdPrefix,
40+
MdSuffix,
41+
MdTextareaAutosize,
3642
],
3743
})
3844
export class MdInputModule {

src/lib/input/input-container.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<div class="mat-input-wrapper">
22
<div class="mat-input-table">
3-
<div class="mat-input-prefix">
3+
<div class="mat-input-prefix" *ngIf="_prefixChildren.length">
44
<!-- TODO(andrewseguin): remove [md-prefix] -->
55
<ng-content select="[mdPrefix], [matPrefix], [md-prefix]"></ng-content>
66
</div>
@@ -23,7 +23,7 @@
2323
</span>
2424
</div>
2525

26-
<div class="mat-input-suffix">
26+
<div class="mat-input-suffix" *ngIf="_suffixChildren.length">
2727
<!-- TODO(andrewseguin): remove [md-suffix] -->
2828
<ng-content select="[mdSuffix], [matSuffix], [md-suffix]"></ng-content>
2929
</div>

src/lib/input/input-container.spec.ts

+66-32
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import {async, TestBed, inject, ComponentFixture} from '@angular/core/testing';
1+
import {async, ComponentFixture, inject, TestBed} from '@angular/core/testing';
22
import {Component, ViewChild} from '@angular/core';
33
import {
4-
FormsModule,
5-
ReactiveFormsModule,
64
FormControl,
7-
NgForm,
8-
Validators,
9-
FormGroupDirective,
105
FormGroup,
6+
FormGroupDirective,
7+
FormsModule,
8+
NgForm,
9+
ReactiveFormsModule,
10+
Validators
1111
} from '@angular/forms';
1212
import {By} from '@angular/platform-browser';
1313
import {NoopAnimationsModule} from '@angular/platform-browser/animations';
@@ -18,52 +18,53 @@ import {PlatformModule} from '../core/platform/index';
1818
import {wrappedErrorMessage} from '../core/testing/wrapped-error-message';
1919
import {dispatchFakeEvent} from '../core/testing/dispatch-events';
2020
import {
21+
MdInputContainerDuplicatedHintError,
2122
MdInputContainerMissingMdInputError,
22-
MdInputContainerPlaceholderConflictError,
23-
MdInputContainerDuplicatedHintError
23+
MdInputContainerPlaceholderConflictError
2424
} from './input-container-errors';
2525

2626

2727
describe('MdInputContainer', function () {
2828
beforeEach(async(() => {
2929
TestBed.configureTestingModule({
3030
imports: [
31-
MdInputModule.forRoot(),
32-
PlatformModule.forRoot(),
3331
FormsModule,
32+
MdInputModule,
33+
NoopAnimationsModule,
34+
PlatformModule,
3435
ReactiveFormsModule,
35-
NoopAnimationsModule
3636
],
3737
declarations: [
38-
MdInputContainerPlaceholderRequiredTestComponent,
39-
MdInputContainerPlaceholderElementTestComponent,
40-
MdInputContainerPlaceholderAttrTestComponent,
38+
MdInputContainerBaseTestController,
39+
MdInputContainerDateTestController,
4140
MdInputContainerHintLabel2TestController,
4241
MdInputContainerHintLabelTestController,
43-
MdInputContainerInvalidTypeTestController,
44-
MdInputContainerInvalidPlaceholderTestController,
4542
MdInputContainerInvalidHint2TestController,
4643
MdInputContainerInvalidHintTestController,
47-
MdInputContainerBaseTestController,
48-
MdInputContainerWithId,
49-
MdInputContainerDateTestController,
50-
MdInputContainerTextTestController,
51-
MdInputContainerPasswordTestController,
44+
MdInputContainerInvalidPlaceholderTestController,
45+
MdInputContainerInvalidTypeTestController,
46+
MdInputContainerMissingMdInputTestController,
47+
MdInputContainerMultipleHintMixedTestController,
48+
MdInputContainerMultipleHintTestController,
5249
MdInputContainerNumberTestController,
53-
MdInputContainerZeroTestController,
54-
MdTextareaWithBindings,
50+
MdInputContainerPasswordTestController,
51+
MdInputContainerPlaceholderAttrTestComponent,
52+
MdInputContainerPlaceholderElementTestComponent,
53+
MdInputContainerPlaceholderRequiredTestComponent,
54+
MdInputContainerTextTestController,
5555
MdInputContainerWithDisabled,
56+
MdInputContainerWithDynamicPlaceholder,
57+
MdInputContainerWithFormControl,
58+
MdInputContainerWithFormErrorMessages,
59+
MdInputContainerWithFormGroupErrorMessages,
60+
MdInputContainerWithId,
61+
MdInputContainerWithPrefixAndSuffix,
5662
MdInputContainerWithRequired,
63+
MdInputContainerWithStaticPlaceholder,
5764
MdInputContainerWithType,
5865
MdInputContainerWithValueBinding,
59-
MdInputContainerWithFormControl,
60-
MdInputContainerWithStaticPlaceholder,
61-
MdInputContainerMissingMdInputTestController,
62-
MdInputContainerMultipleHintTestController,
63-
MdInputContainerMultipleHintMixedTestController,
64-
MdInputContainerWithDynamicPlaceholder,
65-
MdInputContainerWithFormErrorMessages,
66-
MdInputContainerWithFormGroupErrorMessages
66+
MdInputContainerZeroTestController,
67+
MdTextareaWithBindings,
6768
],
6869
});
6970

@@ -685,6 +686,29 @@ describe('MdInputContainer', function () {
685686

686687
});
687688

689+
it('should not have prefix and suffix elements when none are specified', () => {
690+
let fixture = TestBed.createComponent(MdInputContainerWithId);
691+
fixture.detectChanges();
692+
693+
let prefixEl = fixture.debugElement.query(By.css('.mat-input-prefix'));
694+
let suffixEl = fixture.debugElement.query(By.css('.mat-input-suffix'));
695+
696+
expect(prefixEl).toBeNull();
697+
expect(suffixEl).toBeNull();
698+
});
699+
700+
it('should add prefix and suffix elements when specified', () => {
701+
let fixture = TestBed.createComponent(MdInputContainerWithPrefixAndSuffix);
702+
fixture.detectChanges();
703+
704+
let prefixEl = fixture.debugElement.query(By.css('.mat-input-prefix'));
705+
let suffixEl = fixture.debugElement.query(By.css('.mat-input-suffix'));
706+
707+
expect(prefixEl).not.toBeNull();
708+
expect(suffixEl).not.toBeNull();
709+
expect(prefixEl.nativeElement.innerText.trim()).toEqual('Prefix');
710+
expect(suffixEl.nativeElement.innerText.trim()).toEqual('Suffix');
711+
});
688712
});
689713

690714
@Component({
@@ -927,7 +951,6 @@ class MdInputContainerWithFormErrorMessages {
927951
renderError = true;
928952
}
929953

930-
931954
@Component({
932955
template: `
933956
<form [formGroup]="formGroup" novalidate>
@@ -945,3 +968,14 @@ class MdInputContainerWithFormGroupErrorMessages {
945968
name: new FormControl('', Validators.required)
946969
});
947970
}
971+
972+
@Component({
973+
template: `
974+
<md-input-container>
975+
<div mdPrefix>Prefix</div>
976+
<input mdInput>
977+
<div mdSuffix>Suffix</div>
978+
</md-input-container>
979+
`
980+
})
981+
class MdInputContainerWithPrefixAndSuffix {}

src/lib/input/input-container.ts

+25-13
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,24 @@
11
import {
2-
AfterViewInit,
32
AfterContentInit,
3+
AfterViewInit,
4+
ChangeDetectorRef,
45
Component,
56
ContentChild,
67
ContentChildren,
78
Directive,
89
ElementRef,
10+
EventEmitter,
911
Input,
1012
Optional,
1113
Output,
12-
EventEmitter,
14+
QueryList,
1315
Renderer,
14-
ChangeDetectorRef,
15-
ViewEncapsulation,
1616
Self,
17-
QueryList,
17+
ViewEncapsulation
1818
} from '@angular/core';
19-
import {
20-
animate,
21-
state,
22-
style,
23-
transition,
24-
trigger,
25-
} from '@angular/animations';
19+
import {animate, state, style, transition, trigger} from '@angular/animations';
2620
import {coerceBooleanProperty} from '../core';
27-
import {NgControl, NgForm, FormGroupDirective} from '@angular/forms';
21+
import {FormGroupDirective, NgControl, NgForm} from '@angular/forms';
2822
import {getSupportedInputTypes} from '../core/platform/features';
2923
import {
3024
MdInputContainerDuplicatedHintError,
@@ -90,6 +84,20 @@ export class MdHint {
9084
})
9185
export class MdErrorDirective { }
9286

87+
/** The input prefix. */
88+
@Directive({
89+
selector: '[mdPrefix], [matPrefix], [md-prefix]'
90+
})
91+
export class MdPrefix {}
92+
93+
94+
/** The input suffix. */
95+
@Directive({
96+
selector: '[mdSuffix], [matSuffix], [md-suffix]'
97+
})
98+
export class MdSuffix {}
99+
100+
93101
/** The input directive, used to mark the input that `MdInputContainer` is wrapping. */
94102
@Directive({
95103
selector: `input[mdInput], textarea[mdInput], input[matInput], textarea[matInput]`,
@@ -327,6 +335,10 @@ export class MdInputContainer implements AfterViewInit, AfterContentInit {
327335

328336
@ContentChildren(MdHint) _hintChildren: QueryList<MdHint>;
329337

338+
@ContentChildren(MdPrefix) _prefixChildren: QueryList<MdPrefix>;
339+
340+
@ContentChildren(MdSuffix) _suffixChildren: QueryList<MdSuffix>;
341+
330342
constructor(
331343
private _changeDetectorRef: ChangeDetectorRef,
332344
@Optional() private _parentForm: NgForm,

0 commit comments

Comments
 (0)