As I said above, you can do this using jsViews, as in the example below:
For this you will need an Entity that would serve as a template, in this case the following:
{
Codigo: "",
Designacao: "",
Quantidade: "",
Unidade: "",
Preco: "",
Desconto: "",
IVA: "",
SubTotal: ""
}
You will have the templates for each Row state (Details, Insert and Create):
<script id="tmplDetails" type="text/x-jsrender">
<tr data-type="details">
<td><input name="btEditar" type="button" value="Editar" /></td>
<td>{{:Codigo}}</td>
<td>{{:Designacao}}</td>
<td>{{:Quantidade}}</td>
<td>{{:Unidade}}</td>
<td>{{:Preco}}</td>
<td>{{:Desconto}}</td>
<td>{{:IVA}}</td>
<td>{{:SubTotal}}</td>
</tr>
</script>
<script id="tmplEdit" type="text/x-jsrender">
<tr data-type="edit">
<td><input name="btSalvar" type="button" value="Salvar" /></td>
<td><input name="txtCodigo" type="text" value="{{:Codigo}}" /></td>
<td><input name="txtDesignacao" type="text" value="{{:Designacao}}" /></td>
<td><input name="txtQuantidade" type="text" value="{{:Quantidade}}" /></td>
<td><input name="txtUnidade" type="text" value="{{:Unidade}}" /></td>
<td><input name="txtPreco" type="text" value="{{:Preco}}" /></td>
<td><input name="txtDesconto" type="text" value="{{:Desconto}}" /></td>
<td><input name="txtIVA" type="text" value="{{:IVA}}" /></td>
<td><input name="txtSubTotal" type="text" value="{{:SubTotal}}" /></td>
</tr>
</script>
<script id="tmplCreate" type="text/x-jsrender">
<tr data-type="create">
<td><input name="btSalvar" type="button" value="Salvar" /></td>
<td><input name="txtCodigo" type="text" value="{{:Codigo}}" /></td>
<td><input name="txtDesignacao" type="text" value="{{:Designacao}}" /></td>
<td><input name="txtQuantidade" type="text" value="{{:Quantidade}}" /></td>
<td><input name="txtUnidade" type="text" value="{{:Unidade}}" /></td>
<td><input name="txtPreco" type="text" value="{{:Preco}}" /></td>
<td><input name="txtDesconto" type="text" value="{{:Desconto}}" /></td>
<td><input name="txtIVA" type="text" value="{{:IVA}}" /></td>
<td><input name="txtSubTotal" type="text" value="{{:SubTotal}}" /></td>
</tr>
</script>
Remembering that you can use aritimeticas operations in the template, then {{:Quantidade * Preco}}
is valid and can be used in SubTotal.
Note that I used the template properties in the templates, so we know how to fill in the template.
Finally we will have the HTML of the table itself:
<table id="vendaTabela">
<thead>
<tr>
<th></th>
<th data-class="expand">Cód.</th>
<th data-hide="phone">Designação</th>
<th data-hide="phone">Qnt.</th>
<th data-hide="phone,tablet">Uni.</th>
<th>Preço</th>
<th>Desconto</th>
<th>IVA</th>
<th>Sub-Total</th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<td><input name="btCreate" type="button" value="Criar" /></td>
<td colspan="8"></td>
</tr>
<tfoot>
<table>
The script below is mounting the table using a Source, which in this case can be an AJAX request, however I am using a list with 10 Entities.
var documento = $(document);
var vendaTabela = $("#vendaTabela");
var tabelaBody = $("tbody", vendaTabela);
var tmplDetails = $.templates("#tmplDetails");
var tmplEdit = $.templates("#tmplEdit");
var tmplCreate = $.templates("#tmplCreate");
var entidades = [];
for (var i = 1; i <= 10; i++) {
entidades.push({
Codigo: "Codigo" + i,
Designacao: "Designacao" + i,
Quantidade: "Quantidade" + i,
Unidade: "Unidade" + i,
Preco: "Preco" + i,
Desconto: "Desconto" + i,
IVA: "IVA" + i,
SubTotal: "SubTotal" + i
});
}
tabelaBody.empty();
$.each(entidades, function (indice, entidade) {
var novaLinha = $(tmplDetails.render(entidade));
novaLinha.data("Entidade", entidade);
tabelaBody.append(novaLinha);
});
documento.on("click", "#vendaTabela input[name='btCreate']", function () {
var novaEntidade = {};
var novaLinha = $(tmplCreate.render(novaEntidade));
novaLinha.data("Entidade", novaEntidade);
tabelaBody.append(novaLinha);
});
documento.on("click", "#vendaTabela input[name='btEditar']", function () {
var linha = $(this).closest("[data-type]");
var entidade = linha.data("Entidade");
var novaLinha = $(tmplCreate.render(entidade));
novaLinha.data("Entidade", entidade);
linha.replaceWith(novaLinha);
});
documento.on("click", "#vendaTabela input[name='btSalvar']", function () {
var linha = $(this).closest("[data-type]");
var txtCodigo = $("[name='txtCodigo']", linha);
var txtDesignacao = $("[name='txtDesignacao']", linha);
var txtQuantidade = $("[name='txtQuantidade']", linha);
var txtUnidade = $("[name='txtUnidade']", linha);
var txtPreco = $("[name='txtPreco']", linha);
var txtDesconto = $("[name='txtDesconto']", linha);
var txtIVA = $("[name='txtIVA']", linha);
var txtSubTotal = $("[name='txtSubTotal']", linha);
var entidade = linha.data("Entidade");
entidade.Codigo = txtCodigo.val();
entidade.Designacao = txtDesignacao.val();
entidade.Quantidade = txtQuantidade.val();
entidade.Unidade = txtUnidade.val();
entidade.Preco = txtPreco.val();
entidade.Desconto = txtDesconto.val();
entidade.IVA = txtIVA.val();
entidade.SubTotal = txtSubTotal.val();
var novaLinha = $(tmplDetails.render(entidade));
novaLinha.data("Entidade", entidade);
linha.replaceWith(novaLinha);
});
Note that I bind events using on
direct in document
, I made this so that these events are available for elements created through the template.
end the code in its entirety:
var documento = $(document);
var vendaTabela = $("#vendaTabela");
var tabelaBody = $("tbody", vendaTabela);
var tmplDetails = $.templates("#tmplDetails");
var tmplEdit = $.templates("#tmplEdit");
var tmplCreate = $.templates("#tmplCreate");
var entidades = [];
for (var i = 1; i <= 10; i++) {
entidades.push({
Codigo: "Codigo" + i,
Designacao: "Designacao" + i,
Quantidade: "Quantidade" + i,
Unidade: "Unidade" + i,
Preco: "Preco" + i,
Desconto: "Desconto" + i,
IVA: "IVA" + i,
SubTotal: "SubTotal" + i
});
}
tabelaBody.empty();
$.each(entidades, function (indice, entidade) {
var novaLinha = $(tmplDetails.render(entidade));
novaLinha.data("Entidade", entidade);
tabelaBody.append(novaLinha);
});
documento.on("click", "#vendaTabela input[name='btCreate']", function () {
var novaEntidade = {};
var novaLinha = $(tmplCreate.render(novaEntidade));
novaLinha.data("Entidade", novaEntidade);
tabelaBody.append(novaLinha);
});
documento.on("click", "#vendaTabela input[name='btEditar']", function () {
var linha = $(this).closest("[data-type]");
var entidade = linha.data("Entidade");
var novaLinha = $(tmplEdit.render(entidade));
novaLinha.data("Entidade", entidade);
linha.replaceWith(novaLinha);
});
documento.on("click", "#vendaTabela input[name='btSalvar']", function () {
var linha = $(this).closest("[data-type]");
var txtCodigo = $("[name='txtCodigo']", linha);
var txtDesignacao = $("[name='txtDesignacao']", linha);
var txtQuantidade = $("[name='txtQuantidade']", linha);
var txtUnidade = $("[name='txtUnidade']", linha);
var txtPreco = $("[name='txtPreco']", linha);
var txtDesconto = $("[name='txtDesconto']", linha);
var txtIVA = $("[name='txtIVA']", linha);
var txtSubTotal = $("[name='txtSubTotal']", linha);
var entidade = linha.data("Entidade");
entidade.Codigo = txtCodigo.val();
entidade.Designacao = txtDesignacao.val();
entidade.Quantidade = txtQuantidade.val();
entidade.Unidade = txtUnidade.val();
entidade.Preco = txtPreco.val();
entidade.Desconto = txtDesconto.val();
entidade.IVA = txtIVA.val();
entidade.SubTotal = txtSubTotal.val();
var novaLinha = $(tmplDetails.render(entidade));
novaLinha.data("Entidade", entidade);
linha.replaceWith(novaLinha);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><scriptsrc="http://www.jsviews.com/download/jsviews.js"></script>
<script src="http://cdn.foundation5.zurb.com/foundation.js"></script><linkhref="http://cdn.foundation5.zurb.com/foundation.css" rel="stylesheet"/>
<table id="vendaTabela">
<thead>
<tr>
<th></th>
<th data-class="expand">Cód.</th>
<th data-hide="phone">Designação</th>
<th data-hide="phone">Qnt.</th>
<th data-hide="phone,tablet">Uni.</th>
<th>Preço</th>
<th>Desconto</th>
<th>IVA</th>
<th>Sub-Total</th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<td><input name="btCreate" type="button" value="Criar" /></td>
<td colspan="8"></td>
</tr>
<tfoot>
<table>
<script id="tmplDetails" type="text/x-jsrender">
<tr data-type="details">
<td><input name="btEditar" type="button" value="Editar" /></td>
<td>{{:Codigo}}</td>
<td>{{:Designacao}}</td>
<td>{{:Quantidade}}</td>
<td>{{:Unidade}}</td>
<td>{{:Preco}}</td>
<td>{{:Desconto}}</td>
<td>{{:IVA}}</td>
<td>{{:SubTotal}}</td>
</tr>
</script>
<script id="tmplEdit" type="text/x-jsrender">
<tr data-type="edit">
<td><input name="btSalvar" type="button" value="Salvar" /></td>
<td><input name="txtCodigo" type="text" value="{{:Codigo}}" /></td>
<td><input name="txtDesignacao" type="text" value="{{:Designacao}}" /></td>
<td><input name="txtQuantidade" type="text" value="{{:Quantidade}}" /></td>
<td><input name="txtUnidade" type="text" value="{{:Unidade}}" /></td>
<td><input name="txtPreco" type="text" value="{{:Preco}}" /></td>
<td><input name="txtDesconto" type="text" value="{{:Desconto}}" /></td>
<td><input name="txtIVA" type="text" value="{{:IVA}}" /></td>
<td><input name="txtSubTotal" type="text" value="{{:SubTotal}}" /></td>
</tr>
</script>
<script id="tmplCreate" type="text/x-jsrender">
<tr data-type="create">
<td><input name="btSalvar" type="button" value="Salvar" /></td>
<td><input name="txtCodigo" type="text" value="{{:Codigo}}" /></td>
<td><input name="txtDesignacao" type="text" value="{{:Designacao}}" /></td>
<td><input name="txtQuantidade" type="text" value="{{:Quantidade}}" /></td>
<td><input name="txtUnidade" type="text" value="{{:Unidade}}" /></td>
<td><input name="txtPreco" type="text" value="{{:Preco}}" /></td>
<td><input name="txtDesconto" type="text" value="{{:Desconto}}" /></td>
<td><input name="txtIVA" type="text" value="{{:IVA}}" /></td>
<td><input name="txtSubTotal" type="text" value="{{:SubTotal}}" /></td>
</tr>
</script>