(using vue 3)
Hello,
I have a simple requirement for my grid, 4 columns: Reference, UnitPrice, Quantity and Total.
Total column is computed column UnitPrice x Quantity
<ejs-grid :dataSource="data" :allowGrouping='true' :groupSettings='groupSettings' :editSettings='editSettings' :toolbar='toolbar'>
<e-columns>
<e-column field="Reference" width="100"></e-column>
<e-column field="UnitPrice" width="80"></e-column>
<e-column field="Quantity" editType='numericedit'></e-column>
<e-column headerText='Total Price' textAlign='Right' :valueAccessor='totalPrice'></e-column>
</e-columns>
<e-aggregates>
<e-aggregate>
<e-columns>
<e-column type="Sum" field="TotalPrice" format="C2" :footerTemplate="sumTemplate" >
</e-column>
</e-columns>
</e-aggregate>
</e-aggregates>
</ejs-grid>
.../...
var sumVue = app.component('sumTemplate', {
data: () => ({}),
template:`<b>Sum:{{data.Sum}}</b>`});
.../...
methods: {
totalPrice: function(field, data) {
return data.Quantity * data.UnitPrice;
}
}
How can I locate the sum aggregate in the footer of column Total price ?
How can I get the sum of column Total price ?
Thanks for your help !
Hi,
Thanks for your reply. Let me describe better my requirements using the table below.
The header/columns is in bold
The rows are grouped by category column
The total per row (in red) is price x quantity, a computed column
The aggregates are in yellow per group
The summary is in green.
Is this scenario possible ? Thanks again.
category | reference | price | quantity | total |
shirts | 3 | 125 | ||
turtle neck | 55 | 1 | 55 | |
t-shirt | 35 | 2 | 70 | |
pants | 5 | 478 | ||
Jeans | 110 | 2 | 220 | |
Jogger | 86 | 3 | 258 | |
Total | 8 | 603 |
The data for the above would look like this :
[
{category: shirts, reference: turtle neck, price: 55, quantity: 1},
{category: shirts, reference: t-shirt, price: 35, quantity: 2},
{category: pants, reference: jeans, price: 110, quantity: 2},
{category: pants, reference: jogger, price: 86, quantity: 3}
]
<ejs-grid
:dataSource="data"
:allowFiltering="true"
:filterSettings="filterSettings"
:allowPaging="true"
:pageSettings="pageSettings"
:queryCellInfo="queryCellInfo"
>
<e-columns>
. . . . . . . . .
. . . . . . . . .
<e-column field="Total" headerText="Total"></e-column>
</e-columns>
<e-aggregates>
<e-aggregate>
<e-columns>
<e-column
columnName="Total"
type="Custom"
:customAggregate="customAggregateFn"
:footerTemplate="footerTemp"
></e-column>
</e-columns>
</e-aggregate>
</e-aggregates>
</ejs-grid>
export default {
data() {
return {
data: [
{
category: "shirts",
reference: "turtle neck",
price: 55,
quantity: 1,
},
{ category: "shirts", reference: "t-shirt", price: 35, quantity: 2 },
{ category: "pants", reference: "jeans", price: 110, quantity: 2 },
{ category: "pants", reference: "jogger", price: 86, quantity: 3 },
],
footerTemp: function () {
return {
template: Vue.component("footerTemplate", {
template: `<span>Total: {{data.Custom}}</span>`,
data() {
return { data: {} };
},
}),
};
},
filterSettings: { type: "Menu" },
pageSettings: { pageCount: 3 },
};
},
methods: {
customAggregateFn: function (data) {
var sum = 0;
var grid = document.getElementsByClassName("e-grid")[0].ej2_instances[0];
var val = grid.dataSource.filter((e) => {
sum = sum + e.price * e.quantity;
});
return sum; //here we have calculated the price and quantity manually then return the sum value
},
queryCellInfo: function (args) {
if (args.column.field === "Total") {
args.cell.innerText = args.data.price * args.data.quantity; //in initial rendering we have calculate and set the price and quantity for the Total column
}
},
},
provide: {
grid: [Filter, Page, Aggregate],
},
};
</script>
<style>
@import "https://cdn.syncfusion.com/ej2/material.css";
</style>
|
Hi,
Thank you very much for your help. We are getting close !
It is still missing grouping and group aggregates.
Please have a look as this fork from your original code: https://codesandbox.io/s/vue-forked-zgj0f
When I edit a quantity, the total is not correct.
Julien
methods: {
customAggregateFn: function (data) {
var sum = 0;
var grid = document.getElementsByClassName("e-grid")[0].ej2_instances[0];
var val = grid.dataSource.filter((e) => {
sum = sum + e.price * e.quantity;
});
return sum;
},
valueAccess: function (field, data, column) {
return data.price * data.quantity;
},
actionComplete: function (args) {
if (args.requestType === "save" && args.action === "edit") {
var grid = document.getElementsByClassName("e-grid")[0]
.ej2_instances[0];
grid.aggregateModule.refresh(); //refresh the aggregate value after update
}
},
},
|