class NegociacaoController {
constructor() {
let $ = document.querySelector.bind(document);
this._inputData = $('#data');
this._inputQuantidade = $('#quantidade');
this._inputValor = $('#valor');
this._listaNegociacoes = new ListaNegociacoes();
this._negociacoesView = new NegociacoesView($('#negociacoesView'));
this._negociacoesView.update(this._listaNegociacoes);
this._mensagem = new Mensagem();
this._mensagemView = new MensagemView($('#mensagemView'));
this._mensagemView.update(this._mensagem);
}
adiciona(event) {
event.preventDefault();
this._listaNegociacoes.adiciona(this._criaNegociacao());
this._negociacoesView.update(this._listaNegociacoes);
this._mensagem.texto = 'Negociação adicionada com sucesso';
this._mensagemView.update(this._mensagem);
this._limpaFormulario(); }
_criaNegociacao() {
return new Negociacao(
DateHelper.textoParaData(this._inputData.value),
this._inputQuantidade.value,
this._inputValor.value); }
_limpaFormulario() {
this._inputData.value = '';
this._inputQuantidade.value = 1;
this._inputValor.value = 0.0;
this._inputData.focus(); }
}
class Mensagem {
constructor(texto='') {
this._texto = texto;
}
get texto() {
return this._texto;
}
set texto(texto) {
this._texto = texto;
}
}
class MensagemView extends View {
constructor(elemento) {
super(elemento);
}
template(model) {
return model.texto ? <p class="alert alert-info">${model.texto}</p>
: '
';
}
}
class NegociacoesView extends View {
constructor(elemento) {
super(elemento);
}
template(model) {
return `
DATA | QUANTIDADE | VALOR | VOLUME |
---|
${model.negociacoes.map(n => <tr>
<td>${DateHelper.dataParaTexto(n.data)}</td>
<td>${n.quantidade}</td>
<td>${n.valor}</td>
<td>${n.volume}</td>
</tr>
).join('')}
|
${model.negociacoes.reduce((total, n) => total + n.volume, 0.0)}
|
`;
}
}
class View {
constructor(elemento) {
this._elemento = elemento;
}
template() {
throw new Error('O método template deve ser implementado');
}
update(model) {
this._elemento.innerHTML = this.template(model);
}
}