As I said above, you can do this using jsViews, as in the example below:
For this you will need an Entity that will serve as a model, in the following case:
{
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 arithmetic operations in the template, then {{:Quantidade * Preco}}
is validated and can be used in Subtotal.
Note that I used the Template properties in templates, so we know how to fill 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 may be an AJAX request, but 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 made the bind of the events using the on
right in the document
, I have done this so that these events are available for elements created through the template.
pro fim the code in full:
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>
<script src="http://www.jsviews.com/download/jsviews.js"></script>
<script src="http://cdn.foundation5.zurb.com/foundation.js"></script>
<link href="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>
can you add a plugin to the project? in this case I advise using jsView to help.
– Tobias Mesquita
Can I, but I don’t know this plugin, I have to search about its use.
– Hugo Machado
then put an example on it, it will help at the time to add a new line already with some data.
– Tobias Mesquita
The lines I add will always start empty. Thank you :)
– Hugo Machado
posted an alternative way to make this table using jsViews, you can take a look if you have interrese.
– Tobias Mesquita