use of org.zkoss.zul.Groupbox in project adempiere by adempiere.
the class WPOSDocumentPanel method init.
@Override
public void init() {
int C_POSKeyLayout_ID = posPanel.getC_POSKeyLayout_ID();
if (C_POSKeyLayout_ID == 0)
return;
m_Format = DisplayType.getNumberFormat(DisplayType.Amount);
isKeyboard = false;
v_TotalsPanel = GridFactory.newGridLayout();
v_TotalsPanel.setHeight("100%");
v_TotalsPanel.setStyle("width:130%;height:100%");
v_OrderPanel = GridFactory.newGridLayout();
v_OrderPanel.setStyle("border: none; width:130%; height:100%");
v_GroupPanel = GridFactory.newGridLayout();
v_GroupPanel.setWidth("100%");
v_GroupPanel.setHeight("auto");
// Define the criteria rows and grid
Rows rows = new Rows();
//
row = new Row();
rows.appendChild(row);
rows.setHeight("100%");
rows.setWidth("100%");
v_TotalsGroup = new Groupbox();
v_InfOrderGroup = new Groupbox();
v_InfOrderGroup.appendChild(v_OrderPanel);
v_InfOrderGroup.setWidth("85%");
row.appendChild(v_InfOrderGroup);
row.appendChild(v_TotalsGroup);
// BP
bPartnerName = new WPOSTextField(Msg.translate(Env.getCtx(), "IsCustomer"), posPanel.getKeyboard());
bPartnerName.setHeight("35px");
bPartnerName.setStyle(WPOS.FONTSIZEMEDIUM + "; font-weight:bold");
bPartnerName.setWidth("97%");
bPartnerName.addEventListener(this);
row = rows.newRow();
row.setSpans("2");
row.setHeight("10px");
row.appendChild(bPartnerName);
v_GroupPanel.appendChild(rows);
v_GroupPanel.setStyle("Overflow:hidden;");
v_OrderPanel.setStyle("Overflow:hidden;");
v_TotalsGroup.appendChild(v_TotalsPanel);
v_TotalsGroup.setWidth("65%");
v_TitleBorder = new Caption(Msg.getMsg(Env.getCtx(), "Totals"));
Style style = new Style();
style.setContent(".z-fieldset { margin-left:-5px }" + ".z-combo-item-text { Font-family:Courier New}" + ".z-fieldset legend {font-size: medium; font-weight:bold; width:100%;} " + ".input-search table tr td input{font-size: medium; font-weight:bold; width:100%; height:20px;}" + ".Table-OrderLine tr th div{font-size: 13px; padding:5px} " + ".Table-OrderLine tr td div, .Table-OrderLine tr td div input{font-size: 13; height:auto}" + ".label-description {" + WPOS.FONTSIZEMEDIUM + " display:block; height:15px; font-weight:bold; width: 415px; overflow:hidden;}" + ".fontLarge label {font-size: medium;}" + "div.z-grid-body {-moz-box-shadow: 0 0 0px #888;-webkit-box-shadow: 0 0 0px #888;box-shadow: 0 0 0px #888;}");
style.setParent(v_TitleBorder);
v_TotalsGroup.appendChild(v_TitleBorder);
v_TitleInfo = new Caption(Msg.getMsg(Env.getCtx(), "InfoOrder"));
v_InfOrderGroup.appendChild(v_TitleInfo);
rows = null;
row = null;
rows = v_OrderPanel.newRows();
appendChild(v_GroupPanel);
//
row = rows.newRow();
row.setHeight("10px");
Label f_lb_DocumentNo = new Label(Msg.translate(Env.getCtx(), I_C_Order.COLUMNNAME_DocumentNo) + ":");
f_lb_DocumentNo.setStyle(WPOS.FONTSIZEMEDIUM);
row.appendChild(f_lb_DocumentNo.rightAlign());
documentNo = new Label();
documentNo.setStyle(WPOS.FONTSIZEMEDIUM + "; font-weight:bold");
row.appendChild(documentNo.rightAlign());
row = rows.newRow();
row.setHeight("20px");
row.setWidth("100%");
Label f_lb_DocumentType = new Label(Msg.translate(Env.getCtx(), I_C_Order.COLUMNNAME_C_DocType_ID) + ":");
f_lb_DocumentType.setStyle(WPOS.FONTSIZEMEDIUM);
row.appendChild(f_lb_DocumentType.rightAlign());
documentType = new Label();
documentType.setClass("label-description");
documentType.setStyle(WPOS.FONTSIZEMEDIUM + "; font-weight:bold; width:auto !important;max-width:225px !important; white-space:pre;");
row.appendChild(documentType.rightAlign());
row = rows.newRow();
row.setHeight("20px");
Label f_lb_DocumentStatus = new Label(Msg.translate(Env.getCtx(), I_C_Order.COLUMNNAME_DocStatus) + ":");
f_lb_DocumentStatus.setStyle(WPOS.FONTSIZEMEDIUM);
row.appendChild(f_lb_DocumentStatus.rightAlign());
documentStatus = new Label();
documentStatus.setStyle(WPOS.FONTSIZEMEDIUM + "; font-weight:bold");
row.appendChild(documentStatus.rightAlign());
row = rows.newRow();
row.setHeight("20px");
Label f_lb_SalesRep = new Label(Msg.translate(Env.getCtx(), I_C_Order.COLUMNNAME_SalesRep_ID) + ":");
f_lb_SalesRep.setStyle(WPOS.FONTSIZEMEDIUM);
row.appendChild(f_lb_SalesRep.rightAlign());
salesRep = new Label(posPanel.getSalesRepName());
salesRep.setStyle(WPOS.FONTSIZEMEDIUM + "; font-weight:bold");
row.appendChild(salesRep.rightAlign());
row = rows.newRow();
rows = v_TotalsPanel.newRows();
//
row = rows.newRow();
row.setHeight("10px");
Label lDocumentDate = new Label(Msg.translate(Env.getCtx(), I_C_Order.COLUMNNAME_DateOrdered) + ":");
lDocumentDate.setStyle(WPOS.FONTSIZEMEDIUM);
row.appendChild(lDocumentDate);
documentDate = new Label();
documentDate.setStyle(WPOS.FONTSIZEMEDIUM + "; font-weight:bold");
row.appendChild(documentDate.rightAlign());
row = rows.newRow();
row.setHeight("10px");
Label lNet = new Label(Msg.translate(Env.getCtx(), "SubTotal") + ":");
lNet.setStyle(WPOS.FONTSIZEMEDIUM);
row.appendChild(lNet);
totalLines = new Label(String.valueOf(DisplayType.Amount));
totalLines.setStyle(WPOS.FONTSIZEMEDIUM);
row.appendChild(totalLines.rightAlign());
totalLines.setText("0.00");
row = rows.newRow();
row.setHeight("20px");
Label lTax = new Label(Msg.translate(Env.getCtx(), "C_Tax_ID") + ":");
lTax.setStyle(WPOS.FONTSIZEMEDIUM);
row.appendChild(lTax);
taxAmount = new Label(String.valueOf(DisplayType.Amount));
taxAmount.setStyle(WPOS.FONTSIZEMEDIUM);
row.appendChild(taxAmount.rightAlign());
taxAmount.setText(Env.ZERO.toString());
row = rows.newRow();
Label lTotal = new Label(Msg.translate(Env.getCtx(), "GrandTotal") + ":");
lTotal.setStyle(WPOS.FONTSIZEMEDIUM);
row.appendChild(lTotal);
grandTotal = new Label(String.valueOf(DisplayType.Amount));
row.appendChild(grandTotal.rightAlign());
grandTotal.setText(Env.ZERO.toString());
grandTotal.setStyle("Font-size:1.9em;font-weight:bold");
// Center Panel
Grid layout = GridFactory.newGridLayout();
org.adempiere.webui.component.Panel centerPanel = new org.adempiere.webui.component.Panel();
appendChild(centerPanel);
centerPanel.setStyle("overflow:auto; height:75%");
centerPanel.appendChild(layout);
layout.setWidth("100%");
layout.setStyle("");
rows = layout.newRows();
keyboardPanel = new WPOSKeyPanel(C_POSKeyLayout_ID, this);
row = rows.newRow();
row.setHeight("50%");
row.setSpans("4");
row.appendChild(keyboardPanel);
collectPayment = new WCollect(posPanel);
scalesPanel = new WPOSScalesPanel(posPanel);
scalesPanel.hidePanel();
//add(scalesPanel.getPanel(), scalesConstraint);
// Refresh
totalLines.setText(m_Format.format(Env.ZERO));
grandTotal.setText(m_Format.format(Env.ZERO));
taxAmount.setText(m_Format.format(Env.ZERO));
// Refresh
refreshPanel();
}
use of org.zkoss.zul.Groupbox in project adempiere by adempiere.
the class WQueryBPartner method init.
/**
* Set up Panel
*/
protected void init() {
setTitle(Msg.translate(Env.getCtx(), "C_BPartner_ID"));
Panel panel = new Panel();
setVisible(true);
Panel mainPanel = new Panel();
Grid bPartnerLayout = GridFactory.newGridLayout();
Groupbox groupPanel = new Groupbox();
Caption v_TitleBorder = new Caption(Msg.getMsg(ctx, "Query"));
// Set title window
this.setClosable(true);
// add listener on 'ENTER' key
addEventListener(Events.ON_OK, this);
appendChild(panel);
// North
northPanel = new Panel();
mainPanel.appendChild(mainLayout);
mainPanel.setStyle("width: 100%; height: 100%; padding: 0; margin: 0");
mainLayout.setHeight("100%");
mainLayout.setWidth("100%");
Center center = new Center();
//
North north = new North();
north.setStyle("border: none");
mainLayout.appendChild(north);
north.appendChild(groupPanel);
groupPanel.appendChild(v_TitleBorder);
groupPanel.appendChild(bPartnerLayout);
appendChild(mainPanel);
bPartnerLayout.setWidth("100%");
Rows rows = null;
Row row = null;
rows = bPartnerLayout.newRows();
row = rows.newRow();
Label labelValue = new Label(Msg.translate(ctx, "Value"));
row.appendChild(labelValue.rightAlign());
labelValue.setStyle(WPOS.FONTSIZESMALL);
fieldValue = new WPOSTextField(null, posPanel.getKeyboard());
row.appendChild(fieldValue);
fieldValue.setWidth("120px");
fieldValue.addEventListener(this);
fieldValue.setStyle(WPOS.FONTSIZESMALL);
Label labelTaxID = new Label(Msg.translate(ctx, "TaxID"));
row.appendChild(labelTaxID.rightAlign());
labelValue.setStyle(WPOS.FONTSIZESMALL);
fieldTaxID = new WPOSTextField(null, posPanel.getKeyboard());
row.appendChild(fieldTaxID);
fieldTaxID.setWidth("120px");
fieldTaxID.addEventListener(this);
fieldTaxID.setStyle(WPOS.FONTSIZESMALL);
Label labelContact = new Label(Msg.translate(ctx, "Contact"));
row.appendChild(labelContact.rightAlign());
labelContact.setStyle(WPOS.FONTSIZESMALL);
fieldContact = new WPOSTextField(null, posPanel.getKeyboard());
row.appendChild(fieldContact);
fieldContact.setWidth("120px");
fieldContact.addEventListener(this);
fieldContact.setStyle(WPOS.FONTSIZESMALL);
Label labelPhone = new Label(Msg.translate(ctx, "Phone"));
row.appendChild(labelPhone.rightAlign());
labelPhone.setStyle(WPOS.FONTSIZESMALL);
fieldPhone = new WPOSTextField(null, posPanel.getKeyboard());
row.appendChild(fieldPhone);
fieldPhone.setWidth("120px");
fieldPhone.addEventListener(this);
fieldPhone.setStyle(WPOS.FONTSIZESMALL);
// New Line
row = rows.newRow();
Label labelName = new Label(Msg.translate(ctx, "Name"));
row.appendChild(labelName.rightAlign());
labelName.setStyle(WPOS.FONTSIZESMALL);
fieldName = new WPOSTextField(null, posPanel.getKeyboard());
row.appendChild(fieldName);
fieldName.addEventListener(this);
fieldName.setWidth("120px");
fieldName.setStyle(WPOS.FONTSIZESMALL);
Label labelName2 = new Label(Msg.translate(ctx, "Name2"));
row.appendChild(labelName2.rightAlign());
labelName2.setStyle(WPOS.FONTSIZESMALL);
fieldName2 = new WPOSTextField(null, posPanel.getKeyboard());
row.appendChild(fieldName2);
fieldName2.addEventListener(this);
fieldName2.setWidth("120px");
fieldName2.setStyle(WPOS.FONTSIZESMALL);
//
Label labelEmail = new Label(Msg.translate(ctx, "Email"));
row.appendChild(labelEmail.rightAlign());
labelEmail.setStyle(WPOS.FONTSIZESMALL);
fieldEmail = new WPOSTextField(null, posPanel.getKeyboard());
row.appendChild(fieldEmail);
fieldEmail.addEventListener(this);
fieldEmail.setWidth("120px");
fieldEmail.setStyle(WPOS.FONTSIZESMALL);
//
Label labelCity = new Label(Msg.translate(ctx, "City"));
row.appendChild(labelCity.rightAlign());
labelCity.setStyle(WPOS.FONTSIZESMALL);
fieldCity = new WPOSTextField(null, posPanel.getKeyboard());
fieldCity.setWidth("120px");
row.appendChild(fieldCity);
fieldCity.addEventListener("onFocus", this);
fieldCity.setStyle(WPOS.FONTSIZESMALL);
posTable = ListboxFactory.newDataTable();
posTable.prepareTable(columnInfos, "C_Order", "C_POS_ID = " + posPanel.getC_POS_ID(), false, "C_Order");
center = new Center();
center.setStyle("border: none");
posTable.setWidth("100%");
posTable.setHeight("99%");
posTable.addActionListener(this);
center.appendChild(posTable);
mainLayout.appendChild(center);
posTable.setClass("Table-OrderLine");
posTable.autoSize();
posTable.addEventListener(Events.ON_DOUBLE_CLICK, this);
addNewAction();
}
use of org.zkoss.zul.Groupbox in project adempiere by adempiere.
the class WQueryDocType method init.
/**
* Set up Panel
*/
protected void init() {
setTitle(Msg.translate(Env.getCtx(), "C_DocType_ID"));
Panel panel = new Panel();
setVisible(true);
Panel mainPanel = new Panel();
Grid productLayout = GridFactory.newGridLayout();
Groupbox groupPanel = new Groupbox();
Caption v_TitleBorder = new Caption(Msg.getMsg(ctx, QUERY));
// Set title window
this.setClosable(true);
// add listener on 'ENTER' key
addEventListener(Events.ON_OK, this);
appendChild(panel);
northPanel = new Panel();
mainPanel.appendChild(mainLayout);
groupPanel.appendChild(v_TitleBorder);
mainPanel.setStyle("width: 100%; height: 100%; padding: 0; margin: 0");
mainLayout.setHeight("100%");
mainLayout.setWidth("100%");
Center center = new Center();
//
North north = new North();
north.setStyle("border: none");
mainLayout.appendChild(north);
north.appendChild(groupPanel);
groupPanel.appendChild(productLayout);
appendChild(mainPanel);
productLayout.setWidth("100%");
Rows rows = null;
Row row = null;
rows = productLayout.newRows();
row = rows.newRow();
Label labelName = new Label(Msg.translate(ctx, NAME));
labelName.setStyle(WPOS.FONTSIZESMALL);
row.setHeight("60px");
row.appendChild(labelName.rightAlign());
fieldName = new WPOSTextField("", posPanel.getKeyboard());
row.appendChild(fieldName);
fieldName.addEventListener(this);
fieldName.setWidth("120px");
fieldName.setStyle(WPOS.FONTSIZESMALL);
Label labelDescription = new Label(Msg.translate(ctx, DESCRIPTION));
labelDescription.setStyle(WPOS.FONTSIZESMALL);
row.setHeight("60px");
row.appendChild(labelDescription.rightAlign());
fieldDescription = new WPOSTextField(null, posPanel.getKeyboard());
row.appendChild(fieldDescription);
fieldDescription.addEventListener(this);
fieldDescription.setWidth("120px");
fieldDescription.setStyle(WPOS.FONTSIZESMALL);
// Center
posTable = ListboxFactory.newDataTable();
posTable.prepareTable(columnInfos, "C_DocType", null, false, "C_DocType");
enableButtons();
center = new Center();
center.setStyle("border: none");
posTable.setWidth("100%");
posTable.setHeight("99%");
posTable.addActionListener(this);
center.appendChild(posTable);
mainLayout.appendChild(center);
posTable.setClass("Table-OrderLine");
posTable.autoSize();
posTable.addEventListener(Events.ON_DOUBLE_CLICK, this);
refresh();
}
use of org.zkoss.zul.Groupbox in project adempiere by adempiere.
the class WQueryOrderHistory method init.
/**
* Set up Panel
*/
protected void init() {
setTitle(Msg.translate(Env.getCtx(), "C_Order_ID"));
Panel panel = new Panel();
setVisible(true);
Panel mainPanel = new Panel();
Grid productLayout = GridFactory.newGridLayout();
Groupbox groupPanel = new Groupbox();
Caption v_TitleBorder = new Caption(Msg.getMsg(ctx, QUERY));
// Set title window
this.setClosable(true);
// add listener on 'ENTER' key
addEventListener(Events.ON_OK, this);
appendChild(panel);
northPanel = new Panel();
mainPanel.appendChild(mainLayout);
groupPanel.appendChild(v_TitleBorder);
mainPanel.setStyle("width: 100%; height: 100%; padding: 0; margin: 0");
mainLayout.setHeight("100%");
mainLayout.setWidth("100%");
Center center = new Center();
//
North north = new North();
north.setStyle("border: none");
mainLayout.appendChild(north);
north.appendChild(groupPanel);
groupPanel.appendChild(productLayout);
appendChild(mainPanel);
productLayout.setWidth("100%");
Rows rows = null;
Row row = null;
rows = productLayout.newRows();
row = rows.newRow();
Label labelDocumentNo = new Label(Msg.translate(ctx, DOCUMENTNO));
labelDocumentNo.setStyle(WPOS.FONTSIZESMALL);
row.setHeight("20px");
row.appendChild(labelDocumentNo.rightAlign());
fieldDocumentNo = new WPOSTextField("", posPanel.getKeyboard());
row.appendChild(fieldDocumentNo);
fieldDocumentNo.addEventListener(this);
fieldDocumentNo.setWidth("120px");
fieldDocumentNo.setStyle(WPOS.FONTSIZESMALL);
//
Label labelDateFrom = new Label(Msg.translate(ctx, DATEORDEREDFROM));
labelDateFrom.setStyle(WPOS.FONTSIZESMALL);
row.appendChild(labelDateFrom.rightAlign());
fieldDateFrom = new Datebox();
fieldDateFrom.setValue(Env.getContextAsDate(Env.getCtx(), "#Date"));
fieldDateFrom.addEventListener("onBlur", this);
fieldDateFrom.setStyle(WPOS.FONTSIZESMALL);
row.appendChild(fieldDateFrom);
fieldAllowDate = new Checkbox();
fieldAllowDate.setLabel(Msg.translate(ctx, DATE));
fieldAllowDate.setSelected(false);
row.appendChild(fieldAllowDate);
fieldAllowDate.addActionListener(this);
fieldAllowDate.setStyle(WPOS.FONTSIZESMALL);
row = rows.newRow();
Label labelBPartner = new Label(Msg.translate(ctx, BPARTNERID));
labelBPartner.setStyle(WPOS.FONTSIZESMALL);
row.setHeight("60px");
row.appendChild(labelBPartner.rightAlign());
fieldBPartner = new WPOSTextField("", posPanel.getKeyboard());
row.appendChild(fieldBPartner);
fieldBPartner.addEventListener(this);
fieldBPartner.setWidth("120px");
fieldBPartner.setStyle(WPOS.FONTSIZESMALL);
Label labelDateTo = new Label(Msg.translate(ctx, DATEORDEREDTO));
labelDateTo.setStyle(WPOS.FONTSIZESMALL);
row.appendChild(labelDateTo.rightAlign());
fieldDateTo = new Datebox();
fieldDateTo.setValue(Env.getContextAsDate(Env.getCtx(), "#Date"));
fieldDateTo.addEventListener("onBlur", this);
fieldDateTo.setStyle(WPOS.FONTSIZESMALL);
row.appendChild(fieldDateTo);
fieldProcessed = new Checkbox();
fieldProcessed.setLabel(Msg.translate(ctx, PROCESSED));
fieldProcessed.setSelected(false);
row.appendChild(fieldProcessed);
fieldProcessed.addActionListener(this);
fieldProcessed.setStyle(WPOS.FONTSIZESMALL);
// Center
posTable = ListboxFactory.newDataTable();
posTable.prepareTable(columnInfos, "C_Order", "C_POS_ID = " + posPanel.getC_POS_ID(), false, "C_Order");
enableButtons();
center = new Center();
center.setStyle("border: none");
posTable.setWidth("100%");
posTable.setHeight("99%");
posTable.addActionListener(this);
center.appendChild(posTable);
mainLayout.appendChild(center);
posTable.setClass("Table-OrderLine");
posTable.autoSize();
posTable.addEventListener(Events.ON_DOUBLE_CLICK, this);
refresh();
}
use of org.zkoss.zul.Groupbox in project adempiere by adempiere.
the class WPOSInfoProduct method init.
@Override
protected void init() {
parameterPanel = new Panel();
Groupbox groupPanel = new Groupbox();
infoProductLayout = GridFactory.newGridLayout();
Caption v_TitleBorder = new Caption(Msg.getMsg(Env.getCtx(), "InfoProduct"));
groupPanel.appendChild(v_TitleBorder);
groupPanel.appendChild(infoProductLayout);
labelLayout = GridFactory.newGridLayout();
buttonPanel = new Panel();
buttonPanel.appendChild(labelLayout);
parameterPanel.appendChild(groupPanel);
buttonPanel.setStyle("border: none; width:99%;moz-box-shadow: 0 0 0px #888;-webkit-box-shadow: 0 0 0px #888;box-shadow: 0 0 0px #888;");
labelLayout.setStyle("border: none; width:100%;moz-box-shadow: 0 0 0px #888;-webkit-box-shadow: 0 0 0px #888;box-shadow: 0 0 0px #888;");
infoProductLayout.setStyle("border: none; width:100%; moz-box-shadow: 0 0 0px #888;-webkit-box-shadow: 0 0 0px #888;box-shadow: 0 0 0px #888;");
parameterPanel.setStyle("border: none; width:99%;");
Rows rows = null;
Row row = null;
rows = infoProductLayout.newRows();
row = rows.newRow();
// For Image
buttonImage = new Panel();
row.appendChild(buttonImage);
buttonImage.setWidth("138px");
buttonImage.setHeight("130px");
row.appendChild(buttonPanel);
rows = labelLayout.newRows();
row = rows.newRow();
// For Value
labelValue = new Label();
labelValue.setStyle(WPOS.FONTSIZEMEDIUM + " font-weight:bold");
// Add
row.appendChild(labelValue);
row = rows.newRow();
// For Price List
labelPriceName = new Label();
labelPriceName.setStyle(WPOS.FONTSIZEMEDIUM + " font-weight:bold");
// Add
row.appendChild(labelPriceName);
labelPrice = new Label();
labelPrice.setStyle(WPOS.FONTSIZELARGE + "font-weight:bold");
// Add
row.appendChild(labelPrice);
labelPriceList = new Label();
labelPriceList.setStyle(WPOS.FONTSIZELARGE + "font-weight:bold");
// Add
row.appendChild(labelPriceList);
row = rows.newRow();
// For Name
labelName = new Label();
labelName.setStyle(WPOS.FONTSIZEMEDIUM + " font-weight:bold");
// Add
row.appendChild(labelName);
row = rows.newRow();
// For UOM
labelUOMSymbol = new Label(Msg.getElement(Env.getCtx(), "C_UOM_ID"));
labelUOMSymbol.setStyle(WPOS.FONTSIZEMEDIUM + " font-weight:bold");
// Add
row.appendChild(labelUOMSymbol);
row = rows.newRow();
// For Category
labelProductCategory = new Label(Msg.getElement(Env.getCtx(), "M_Product_Category_ID"));
labelProductCategory.setStyle(WPOS.FONTSIZEMEDIUM + " font-weight:bold");
// Add
row.appendChild(labelProductCategory);
row = rows.newRow();
// For Category
labelProductTax = new Label(Msg.getElement(Env.getCtx(), "C_TaxCategory_ID"));
labelProductTax.setStyle(WPOS.FONTSIZEMEDIUM + " font-weight:bold");
// Add
row.appendChild(labelProductTax);
row = rows.newRow();
// For Description
labelDescription = new Label();
labelDescription.setHeight("19px");
labelDescription.setClass("label-description");
// Add
row.appendChild(labelDescription);
initialValue();
}
Aggregations