Negociações
class NegociacaoController { constructor() { const $ = document.querySelector.bind(document); this._inputData = $('#data'); this._inputQuantidade = $('#quantidade'); this._inputValor = $('#valor'); this._negociacoes = new Negociacoes(); this._negociacoesView = new NegociacoesView('#negociacoes'); this._negociacoesView.update(this._negociacoes); this._mensagem = new Mensagem(); this._mensagemView = new MensagemView('#mensagemView'); this._mensagemView.update(this._mensagem); } adiciona(event) { event.preventDefault(); this._negociacoes.adiciona(this._criaNegociacao()); this._mensagem.texto = 'Negociação adicionada com sucesso'; this._negociacoesView.update(this._negociacoes); this._limpaFormulario(); this._mensagemView.update(this._mensagem); this._limpaFormulario(); } _limpaFormulario() { this._inputData.value = ''; this._inputQuantidade.value = 1; this._inputValor.value = 0.0 this._inputData.focus(); } _criaNegociacao() { return new Negociacao( DateConverter.paraData(this._inputData.value), parseInt(this._inputQuantidade.value), parseFloat(this._inputValor.value) ); } } // class DateConverter { constructor() { throw new Error('Esta classe não pode ser instanciada'); } static paraTexto(data) { return `${data.getDate()}/${data.getMonth() + 1}/${data.getFullYear()}`; } static paraData(texto) { if (!/^\d{4}-\d{2}-\d{2}$/.test(texto)) throw new Error('Deve estar no formato aaaa-mm-dd'); return new Date(...texto.split('-').map((item, indice) => item - indice % 2)); } } // class Negociacoes { constructor() { this._negociacoes = []; } adiciona(negociacao) { this._negociacoes.push(negociacao); } paraArray() { return [].concat(this._negociacoes); } get volumeTotal() { return this._negociacoes .reduce((total, negociacao) => total + negociacao.volume, 0); } } // class View { constructor(seletor) { this._elemento = document.querySelector(seletor); } update(model) { this._elemento.innerHTML = this.template(model); } template(model) { throw new Error('Você precisa implementar o método template'); } } // class NegociacoesView extends View { template(model) { return `
DATA | QUANTIDADE | VALOR | VOLUME |
---|---|---|---|
${DateConverter.paraTexto(negociacao.data)} | ${negociacao.quantidade} | ${negociacao.valor} | ${negociacao.volume} |
${model.volumeTotal} |
${model.texto}
` : ``; } } // const controller = new NegociacaoController(); document .querySelector('.form') .addEventListener('submit', controller.adiciona.bind(controller));
Nenhum comentário:
Postar um comentário