diff options
| author | rr- | 2016-06-14 10:31:48 +0200 |
|---|---|---|
| committer | rr- | 2016-06-18 10:35:20 +0200 |
| commit | 54e3099c5696e0b4fc7b05fb5ecc41ab4726628b (patch) | |
| tree | 29127e1c3d3d3d9bebfccefdf148da7305e2d5b3 /client/js/views/password_reset_view.js | |
| parent | c74f06da35af3c35d565a3c96e3d048f7a1ec011 (diff) | |
client/general: refactor control flow
- Controller lifetime is bound to route lifetime
- View lifetime is bound to controller lifetime
- Control lifetime is bound to view lifetime
- Enhanced event dispatching
- Enhanced responsiveness in some places
- Views communicate user input to controllers via new event system
Diffstat (limited to 'client/js/views/password_reset_view.js')
| -rw-r--r-- | client/js/views/password_reset_view.js | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/client/js/views/password_reset_view.js b/client/js/views/password_reset_view.js index 0d67a19..73e782d 100644 --- a/client/js/views/password_reset_view.js +++ b/client/js/views/password_reset_view.js @@ -1,31 +1,54 @@ 'use strict'; +const events = require('../events.js'); const views = require('../util/views.js'); -class PasswordResetView { +const template = views.getTemplate('password-reset'); + +class PasswordResetView extends events.EventTarget { constructor() { - this._template = views.getTemplate('password-reset'); + super(); + this._hostNode = document.getElementById('content-holder'); + + views.replaceContent(this._hostNode, template()); + views.decorateValidator(this._formNode); + + this._hostNode.addEventListener('submit', e => { + e.preventDefault(); + this.dispatchEvent(new CustomEvent('submit', { + detail: { + userNameOrEmail: this._userNameOrEmailFieldNode.value, + }, + })); + }); } - render(ctx) { - const target = document.getElementById('content-holder'); - const source = this._template(); + showSuccess(message) { + views.showSuccess(this._hostNode, message); + } - const form = source.querySelector('form'); - const userNameOrEmailField = source.querySelector('#user-name'); + showError(message) { + views.showError(this._hostNode, message); + } - views.decorateValidator(form); + clearMessages() { + views.clearMessages(this._hostNode); + } - form.addEventListener('submit', e => { - e.preventDefault(); - views.clearMessages(target); - views.disableForm(form); - ctx.proceed(userNameOrEmailField.value) - .catch(() => { views.enableForm(form); }); - }); + enableForm() { + views.enableForm(this._formNode); + } + + disableForm() { + views.disableForm(this._formNode); + } + + get _formNode() { + return this._hostNode.querySelector('form'); + } - views.listenToMessages(source); - views.showView(target, source); + get _userNameOrEmailFieldNode() { + return this._formNode.querySelector('#user-name'); } } |