parent
31cbec0857
commit
ad23921814
|
@ -1,17 +1,126 @@
|
||||||
import {Directive} from 'angular2/src/core/annotations_impl/annotations';
|
import {Directive, onAllChangesDone} from 'angular2/src/core/annotations_impl/annotations';
|
||||||
|
import {Attribute} from 'angular2/src/core/annotations_impl/di';
|
||||||
|
import {Parent} from 'angular2/src/core/annotations_impl/visibility';
|
||||||
|
|
||||||
|
import {ObservableWrapper, EventEmitter} from 'angular2/src/facade/async';
|
||||||
|
|
||||||
|
// TODO(jelbourn): validation (will depend on Forms API).
|
||||||
|
// TODO(jelbourn): textarea resizing
|
||||||
|
// TODO(jelbourn): max-length counter
|
||||||
|
// TODO(jelbourn): placeholder property
|
||||||
|
|
||||||
@Directive({
|
@Directive({
|
||||||
selector: 'md-input-container input'
|
selector: 'md-input-container input',
|
||||||
|
events: ['mdChange', 'mdFocusChange'],
|
||||||
|
hostProperties: {
|
||||||
|
'yes': 'class.md-input'
|
||||||
|
},
|
||||||
|
hostListeners: {
|
||||||
|
'input': 'updateValue($event)',
|
||||||
|
'focus': 'setHasFocus(true)',
|
||||||
|
'blur': 'setHasFocus(false)'
|
||||||
|
}
|
||||||
})
|
})
|
||||||
export class MdInput {
|
export class MdInput {
|
||||||
constructor() {
|
value: string;
|
||||||
|
yes: boolean;
|
||||||
|
|
||||||
|
// Events emitted by this directive. We use these special 'md-' events to communicate
|
||||||
|
// to the parent MdInputContainer.
|
||||||
|
mdChange: EventEmitter;
|
||||||
|
mdFocusChange: EventEmitter;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@Attribute('value') value: String,
|
||||||
|
@Parent() container: MdInputContainer) {
|
||||||
|
// TODO(jelbourn): Remove this when #1402 is done.
|
||||||
|
this.yes = true;
|
||||||
|
|
||||||
|
this.value = value == null ? '' : value;
|
||||||
|
this.mdChange = new EventEmitter();
|
||||||
|
this.mdFocusChange = new EventEmitter();
|
||||||
|
|
||||||
|
container.registerInput(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateValue(event) {
|
||||||
|
this.value = event.target.value;
|
||||||
|
ObservableWrapper.callNext(this.mdChange, this.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
setHasFocus(hasFocus: boolean) {
|
||||||
|
ObservableWrapper.callNext(this.mdFocusChange, hasFocus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Directive({
|
||||||
|
selector: 'md-input-container textarea',
|
||||||
|
events: ['mdChange', 'mdFocusChange'],
|
||||||
|
hostProperties: {
|
||||||
|
'yes': 'class.md-input'
|
||||||
|
},
|
||||||
|
hostListeners: {
|
||||||
|
'input': 'updateValue($event)',
|
||||||
|
'focus': 'setHasFocus(true)',
|
||||||
|
'blur': 'setHasFocus(false)'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
export class MdTextarea extends MdInput {
|
||||||
|
constructor(
|
||||||
|
@Attribute('value') value: String,
|
||||||
|
@Parent() container: MdInputContainer) {
|
||||||
|
super(value, container);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Directive({
|
@Directive({
|
||||||
selector: 'md-input-container'
|
selector: 'md-input-container',
|
||||||
|
lifecycle: [onAllChangesDone],
|
||||||
|
hostProperties: {
|
||||||
|
'inputHasValue': 'class.md-input-has-value',
|
||||||
|
'inputHasFocus': 'class.md-input-focused'
|
||||||
|
}
|
||||||
})
|
})
|
||||||
export class MdInputContainer {
|
export class MdInputContainer {
|
||||||
|
// The MdInput or MdTextarea inside of this container.
|
||||||
|
_input: MdInput;
|
||||||
|
|
||||||
|
// Whether the input inside of this container has a non-empty value.
|
||||||
|
inputHasValue: boolean;
|
||||||
|
|
||||||
|
// Whether the input inside of this container has focus.
|
||||||
|
inputHasFocus: boolean;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this._input = null;
|
||||||
|
this.inputHasValue = false;
|
||||||
|
this.inputHasFocus = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
onAllChangesDone() {
|
||||||
|
// Enforce that this directive actually contains a text input.
|
||||||
|
if (this._input == null) {
|
||||||
|
throw 'No <input> or <textarea> found inside of <md-input-container>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Registers the child MdInput or MdTextarea. */
|
||||||
|
registerInput(input) {
|
||||||
|
if (this._input != null) {
|
||||||
|
throw 'Only one text input is allowed per <md-input-container>.';
|
||||||
|
}
|
||||||
|
|
||||||
|
this._input = input;
|
||||||
|
this.inputHasValue = input.value != '';
|
||||||
|
|
||||||
|
// Listen to input changes and focus events so that we can apply the appropriate CSS
|
||||||
|
// classes based on the input state.
|
||||||
|
ObservableWrapper.subscribe(input.mdChange, value => {
|
||||||
|
this.inputHasValue = value != '';
|
||||||
|
});
|
||||||
|
|
||||||
|
ObservableWrapper.subscribe(input.mdFocusChange, hasFocus => {
|
||||||
|
this.inputHasFocus = hasFocus
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,43 @@
|
||||||
<style>@import "angular2_material/src/components/input/input.css";</style>
|
<style>@import "angular2_material/src/components/input/input.css";</style>
|
||||||
<div md-theme="default">
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
max-width: 500px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div>
|
||||||
<h2>input demo</h2>
|
<h2>input demo</h2>
|
||||||
|
|
||||||
|
|
||||||
|
<h3>Normal input</h3>
|
||||||
<md-input-container>
|
<md-input-container>
|
||||||
<label>Name</label>
|
<label>Name</label>
|
||||||
<input>
|
<input md-input>
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<h3>Pre-filled value</h3>
|
||||||
|
<md-input-container>
|
||||||
|
<label>Favorite Framework</label>
|
||||||
|
<input value="Angular">
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<h3>Disabled input</h3>
|
||||||
|
<md-input-container>
|
||||||
|
<label>ID Number</label>
|
||||||
|
<input disabled>
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<h3>Disabled, pre-filled input</h3>
|
||||||
|
<md-input-container>
|
||||||
|
<label>Best TV show</label>
|
||||||
|
<input disabled value="Firefly">
|
||||||
|
</md-input-container>
|
||||||
|
|
||||||
|
<h3>textarea</h3>
|
||||||
|
<md-input-container>
|
||||||
|
<label>What I did on my summer vaccation</label>
|
||||||
|
<textarea></textarea>
|
||||||
</md-input-container>
|
</md-input-container>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -4,12 +4,11 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>ng-material input demo</title>
|
<title>ng-material input demo</title>
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=RobotoDraft:400,500,700,400italic">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=RobotoDraft:400,500,700,400italic">
|
||||||
<style> * { font-family: RobotoDraft, Roboto; } </style>
|
<style> * { font-family: RobotoDraft, Roboto; }
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<demo-app>Loading...</demo-app>
|
<demo-app>Loading...</demo-app>
|
||||||
|
|
||||||
$SCRIPTS$
|
$SCRIPTS$
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import {bootstrap} from 'angular2/angular2';
|
import {bootstrap} from 'angular2/angular2';
|
||||||
import {MdCheckbox} from 'angular2_material/src/components/checkbox/checkbox'
|
import {MdInputContainer, MdInput, MdTextarea} from 'angular2_material/src/components/input/input'
|
||||||
import {UrlResolver} from 'angular2/src/services/url_resolver';
|
import {UrlResolver} from 'angular2/src/services/url_resolver';
|
||||||
import {commonDemoSetup, DemoUrlResolver} from '../demo_common';
|
import {commonDemoSetup, DemoUrlResolver} from '../demo_common';
|
||||||
import {bind} from 'angular2/di';
|
import {bind} from 'angular2/di';
|
||||||
|
@ -14,17 +14,11 @@ import {View} from 'angular2/src/core/annotations_impl/view';
|
||||||
})
|
})
|
||||||
@View({
|
@View({
|
||||||
templateUrl: './demo_app.html',
|
templateUrl: './demo_app.html',
|
||||||
directives: [MdCheckbox]
|
directives: [MdInputContainer, MdInput, MdTextarea]
|
||||||
})
|
})
|
||||||
class DemoApp {
|
class DemoApp {
|
||||||
toggleCount: number;
|
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.toggleCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
increment() {
|
|
||||||
this.toggleCount++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue