Calculator is a highly configurable component that attaches a popup calculator to an input field. Features include a Scientific or Standard button layout, localization and RTL support, and it works with any input field including InputNumber. Based on jQuery Calculator by Keith Wood.
Attach a calculator to h:inputText, p:inputText and p:inputNumber. It can be embedded in the input component or configured externally with for.
Calculator can be localized. Select a language to change the text and tooltips. RTL (right to left) is supported as well.
Control the calculator from JavaScript, use the onopen, onclose and onbutton callbacks and handle the server side open, close and button events with p:ajax.
<div class="card">
<h5>Basic Usage</h5>
<p>Attach a calculator to <code>h:inputText</code>, <code>p:inputText</code> and <code>p:inputNumber</code>. It can be embedded in the input component or configured externally with <code>for</code>.</p>
<h:form id="formBasicUsage">
<h:panelGrid columns="2" cellpadding="4">
<h:outputText value="Calculator with defaults on h:inputText"/>
<h:inputText id="hInputText" value="#{calculatorController.hInputText}">
<pe:calculator/>
</h:inputText>
<h:outputText value="Calculator scientific layout on a p:inputText"/>
<p:inputText id="pInputText" value="#{calculatorController.pInputText}">
<pe:calculator layout="scientific"/>
</p:inputText>
<h:outputText value="Calculator with button on a p:inputNumber"/>
<p:inputNumber id="pInputNumber" value="#{calculatorController.pInputNumber}" symbol=" $USD" symbolPosition="s"
decimalSeparator="." thousandSeparator="," decimalPlaces="2"/>
</h:panelGrid>
<pe:calculator for="pInputNumber" showOn="both" precision="2"/>
</h:form>
</div>
<div class="card">
<h5>Localization and RTL</h5>
<p>Calculator can be localized. Select a language to change the text and tooltips. RTL (right to left) is supported as well.</p>
<h:form id="formLocalization">
<p:messages id="msgLocalization"/>
<h:panelGrid columns="6" id="pnlDetails" cellpadding="4">
<p:outputLabel value="Locale:" for="cboLocale"/>
<p:selectOneMenu id="cboLocale" value="#{calculatorController.language}" style="width:200px" required="true">
<f:selectItems value="#{calculatorController.languages}"/>
<p:ajax update="pInputText msgLocalization" process="@this"/>
</p:selectOneMenu>
<p:outputLabel value="RTL:" for="chkRtl"/>
<p:selectBooleanCheckbox id="chkRtl" value="#{calculatorController.rtl}">
<p:ajax update="pInputText msgLocalization" process="@this"/>
</p:selectBooleanCheckbox>
<p:outputLabel value="Calc:" for="pInputText"/>
<p:inputText id="pInputText" value="#{calculatorController.pInputText}">
<pe:calculator dir="#{calculatorController.rtl ? 'rtl' : 'ltr'}" locale="#{calculatorController.language}" showOn="both"/>
</p:inputText>
</h:panelGrid>
</h:form>
</div>
<div class="card">
<h5>Advanced Usage, events and callbacks</h5>
<p>Control the calculator from JavaScript, use the <code>onopen</code>, <code>onclose</code> and <code>onbutton</code> callbacks and handle the server side <i>open</i>, <i>close</i> and <i>button</i> events with <code>p:ajax</code>.</p>
<h:form id="formJavascript">
<p:growl id="growl" showDetail="true" showSummary="true"/>
<h:panelGrid columns="3" cellpadding="4">
<p:outputLabel value="Callback: onOpen and onClose"/>
<p:inputText id="txtOnOpenClose" value="867">
<pe:calculator id="calculator1" widgetVar="calc1" showOn="both"
onopen="$(PrimeFaces.escapeClientId('formJavascript:lblOnOpenClose')).text('Open Event: ' + value);"
onclose="$(PrimeFaces.escapeClientId('formJavascript:lblOnOpenClose')).text('Close Event: ' + value);">
<p:ajax event="open" listener="#{calculatorController.openListener}" update="growl"/>
<p:ajax event="close" listener="#{calculatorController.closeListener}" update="growl"/>
<p:ajax event="button" listener="#{calculatorController.buttonListener}" update="growl"/>
</pe:calculator>
</p:inputText>
<h:outputText id="lblOnOpenClose" value="Event Result" style="font-weight:bold"/>
<p:outputLabel value="Callback: onButton"/>
<p:inputText widgetVar="txtOnButton" value="5309">
<pe:calculator id="calculator2" widgetVar="calc2" showOn="both"
onbutton="$(PrimeFaces.escapeClientId('formJavascript:lblOnButton')).text('Button: ' + label + ' Current Value: ' + value)">
<p:ajax event="button" listener="#{calculatorController.buttonListener}" update="growl"/>
</pe:calculator>
</p:inputText>
<h:outputText id="lblOnButton" value="Event Result" style="font-weight:bold"/>
</h:panelGrid>
<div class="mt-3">
<p:commandButton value="Show" type="button" onclick="PF('calc1').show();"/>
<p:commandButton value="Hide" type="button" onclick="PF('calc1').hide();"/>
<p:commandButton value="Disable" type="button" onclick="PF('calc1').disable();PF('calc2').disable();"/>
<p:commandButton value="Enable" type="button" onclick="PF('calc1').enable();PF('calc2').enable();"/>
<p:commandButton value="Destroy" type="button" onclick="PF('calc1').destroy();PF('calc2').destroy();"/>
</div>
</h:form>
</div>
package org.primefaces.extensions.showcase.controller;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.faces.model.SelectItem;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import org.primefaces.extensions.event.ButtonEvent;
import org.primefaces.extensions.event.CloseEvent;
import org.primefaces.extensions.event.OpenEvent;
/**
* Calculator Controller.
*
* @author Melloware [email protected]
*/
@Named
@ViewScoped
public class CalculatorController implements Serializable {
@Serial
private static final long serialVersionUID = 20120224L;
private BigDecimal hInputText;
private BigDecimal pInputText;
private BigDecimal pInputNumber = new BigDecimal("0.00");
private String language = "fr";
private boolean rtl = false;
public List<SelectItem> getLanguages() {
final List<SelectItem> results = new ArrayList<>();
results.add(new SelectItem("ms", "Bahasa Melayu (Malaysian)"));
results.add(new SelectItem("ca", "Català (Catalan)"));
results.add(new SelectItem("da", "Dansk (Danish)"));
results.add(new SelectItem("de", "Deutsch (German)"));
results.add(new SelectItem("es", "Español (Spanish)"));
results.add(new SelectItem("fr", "Français (French)"));
results.add(new SelectItem("hr", "Hrvatski jezik (Croatian)"));
results.add(new SelectItem("it", "Italiano (Italian)"));
results.add(new SelectItem("nl", "Nederlands (Dutch)"));
results.add(new SelectItem("no", "Norsk (Norwegian)"));
results.add(new SelectItem("pl", "Polski (Polish)"));
results.add(new SelectItem("pt_BR", "Português (Portuguese/Brazilian)"));
results.add(new SelectItem("ru", "\u0420\u0443\u0441\u0441\u043a\u0438\u0439 (Russian)"));
results.add(new SelectItem("sl", "Slovenski Jezik (Slovenian)"));
results.add(new SelectItem("sr", "\u0421\u0440\u043f\u0441\u043a\u0438 (Serbian)"));
results.add(new SelectItem("tr", "Türkçe (Turkish)"));
results.add(new SelectItem("uk", "\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430 (Ukrainian)"));
results.add(new SelectItem("zh_CN", "\u4e2d\u6587 (\u7b80\u4f53) (Chinese, Simplified)"));
results.add(new SelectItem("zh_TW", "\u6b63\u9ad4\u4e2d\u6587 (\u7e41\u9ad4) (Chinese, Traditional)"));
return results;
}
public void closeListener(final CloseEvent closeEvent) {
final FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Close fired",
"Component id: " + closeEvent.getComponent().getId());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void openListener(final OpenEvent openEvent) {
final FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Open fired",
"Component id: " + openEvent.getComponent().getId());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void buttonListener(final ButtonEvent buttonEvent) {
final FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Button fired",
"Name: " + buttonEvent.getName() + " Value: " + buttonEvent.getValue());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public BigDecimal gethInputText() {
return hInputText;
}
public void sethInputText(final BigDecimal hInputText) {
this.hInputText = hInputText;
}
public BigDecimal getpInputText() {
return pInputText;
}
public void setpInputText(final BigDecimal pInputText) {
this.pInputText = pInputText;
}
public BigDecimal getpInputNumber() {
return pInputNumber;
}
public void setpInputNumber(final BigDecimal pInputNumber) {
this.pInputNumber = pInputNumber;
}
public String getLanguage() {
return language;
}
public void setLanguage(final String language) {
this.language = language;
}
public boolean isRtl() {
return rtl;
}
public void setRtl(final boolean rtl) {
this.rtl = rtl;
}
}