diff --git a/core/src/main/java/org/primefaces/extensions/component/clockpicker/ClockPicker.java b/core/src/main/java/org/primefaces/extensions/component/clockpicker/ClockPicker.java
index 473002769..407ac4243 100644
--- a/core/src/main/java/org/primefaces/extensions/component/clockpicker/ClockPicker.java
+++ b/core/src/main/java/org/primefaces/extensions/component/clockpicker/ClockPicker.java
@@ -68,7 +68,8 @@ protected enum PropertyKeys {
onafterhourselect,
onafterampmselect,
onbeforedone,
- onafterdone
+ onafterdone,
+ appendTo
}
public ClockPicker() {
@@ -240,6 +241,14 @@ public boolean isShowOnButton() {
return !"focus".equals(getShowOn());
}
+ public String getAppendTo() {
+ return (String) getStateHelper().eval(PropertyKeys.appendTo, "@(body)");
+ }
+
+ public void setAppendTo(String appendTo) {
+ getStateHelper().put(PropertyKeys.appendTo, appendTo);
+ }
+
public Locale calculateLocale(FacesContext fc) {
if (appropriateLocale == null) {
appropriateLocale = LocaleUtils.resolveLocale(fc, getLocale(), getClientId(fc));
diff --git a/core/src/main/java/org/primefaces/extensions/component/clockpicker/ClockPickerRenderer.java b/core/src/main/java/org/primefaces/extensions/component/clockpicker/ClockPickerRenderer.java
index e65863f74..52fe5dc52 100644
--- a/core/src/main/java/org/primefaces/extensions/component/clockpicker/ClockPickerRenderer.java
+++ b/core/src/main/java/org/primefaces/extensions/component/clockpicker/ClockPickerRenderer.java
@@ -35,6 +35,7 @@
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
+import org.primefaces.expression.SearchExpressionUtils;
import org.primefaces.extensions.util.Attrs;
import org.primefaces.renderkit.InputRenderer;
import org.primefaces.util.HTML;
@@ -138,6 +139,7 @@ private void encodeScript(final FacesContext context, final ClockPicker clockPic
final WidgetBuilder wb = getWidgetBuilder(context);
wb.init("ExtClockPicker", clockPicker);
+ wb.attr("appendTo", SearchExpressionUtils.resolveClientId(clockPicker.getAppendTo(), clockPicker));
wb.attr("placement", clockPicker.getPlacement(), "bottom");
wb.attr("align", clockPicker.getAlign(), "left");
wb.attr("autoclose", clockPicker.isAutoClose(), false);
diff --git a/core/src/main/resources/META-INF/resources/primefaces-extensions/clockpicker/0-clockpicker.js b/core/src/main/resources/META-INF/resources/primefaces-extensions/clockpicker/0-clockpicker.js
index c4594e4c6..accbc039e 100644
--- a/core/src/main/resources/META-INF/resources/primefaces-extensions/clockpicker/0-clockpicker.js
+++ b/core/src/main/resources/META-INF/resources/primefaces-extensions/clockpicker/0-clockpicker.js
@@ -366,7 +366,8 @@
pmtext: 'PM', // PM text
autoclose: false, // auto close when minute is selected
twelvehour: false, // change to 12 hour AM/PM clock from 24 hour
- vibrate: true // vibrate the device when dragging clock hand
+ vibrate: true, // vibrate the device when dragging clock hand
+ appendTo: $(document.body), // object to append popover
};
// Show or hide popover
@@ -383,10 +384,15 @@
height = element.outerHeight(),
placement = this.options.placement,
align = this.options.align,
+ appendToOffset = this.options.appendTo.offset(),
styles = {};
popover.show();
+ // Remove the referential offset
+ offset.left -= appendToOffset.left;
+ offset.top -= appendToOffset.top;
+
// Place the popover
switch (placement) {
case 'bottom':
@@ -438,8 +444,8 @@
// Initialize
if (! this.isAppended) {
- // Append popover to body
- $body = $(document.body).append(this.popover);
+ // Append popover to body or appendTo
+ $body = this.options.appendTo.append(this.popover);
this.isAppended = true;
}
diff --git a/core/src/main/resources/META-INF/resources/primefaces-extensions/clockpicker/1-clockpicker-widget.js b/core/src/main/resources/META-INF/resources/primefaces-extensions/clockpicker/1-clockpicker-widget.js
index f694fd218..d810d70f8 100644
--- a/core/src/main/resources/META-INF/resources/primefaces-extensions/clockpicker/1-clockpicker-widget.js
+++ b/core/src/main/resources/META-INF/resources/primefaces-extensions/clockpicker/1-clockpicker-widget.js
@@ -14,11 +14,18 @@ PrimeFaces.widget.ExtClockPicker = PrimeFaces.widget.BaseWidget.extend({
this.jqId = PrimeFaces.escapeClientId(cfg.id);
this.container = $(this.jqId);
this.jqEl = this.jqId + '_input';
- this.input = $(this.jqEl);
this.jq = $(this.jqEl);
this.cfg.donetext = PrimeFaces.getAriaLabel('close') || 'Close';
+ this.cfg.appendTo = PrimeFaces.utils.resolveDynamicOverlayContainer(this);
+ // setup input
+ this.input = $(this.jqEl);
PrimeFaces.skinInput(this.input);
+
+ // check if being used in dialog and set the parent
+ this.setupDialogSupport();
+
+ // create the clock picker
this.clockpicker = this.createClockPicker();
// pfs metadata
@@ -40,6 +47,17 @@ PrimeFaces.widget.ExtClockPicker = PrimeFaces.widget.BaseWidget.extend({
this.remove();
},
+ /**
+ * Sets up support for using the overlay color picker within an overlay dialog.
+ * @private
+ */
+ setupDialogSupport: function() {
+ var dialog = this.input[0].closest('.ui-dialog');
+ if (dialog) {
+ this.cfg.appendTo = $(PrimeFaces.escapeClientId(dialog.id));
+ }
+ },
+
/**
* Creates the clock picker and sets up events.
* @returns {JQuery} the clock picker
diff --git a/showcase/src/main/java/org/primefaces/extensions/showcase/controller/ClockPickerController.java b/showcase/src/main/java/org/primefaces/extensions/showcase/controller/ClockPickerController.java
index b665601c3..692bdad0b 100644
--- a/showcase/src/main/java/org/primefaces/extensions/showcase/controller/ClockPickerController.java
+++ b/showcase/src/main/java/org/primefaces/extensions/showcase/controller/ClockPickerController.java
@@ -43,11 +43,13 @@ public class ClockPickerController implements Serializable {
private LocalTime time;
private LocalTime time2;
+ private LocalTime time3;
public ClockPickerController() {
// Initialize time to 8:15 AM
time = LocalTime.of(8, 15);
time2 = LocalTime.of(9, 28);
+ time3 = LocalTime.of(13, 44);
}
public void showTime1() {
@@ -72,6 +74,15 @@ public void showTime2() {
}
}
+ public void showTime3() {
+ if (time3 != null) {
+ addMessage(FacesMessage.SEVERITY_INFO, "Info Message", String.format("Ajax Event: %s", time3));
+ }
+ else {
+ addMessage(FacesMessage.SEVERITY_ERROR, "Error Message", "Time is not selected.");
+ }
+ }
+
private void addMessage(FacesMessage.Severity severity, String summary, String detail) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity, summary, detail));
}
@@ -92,4 +103,12 @@ public void setTime2(LocalTime time2) {
this.time2 = time2;
}
+ public LocalTime getTime3() {
+ return time3;
+ }
+
+ public void setTime3(LocalTime time3) {
+ this.time3 = time3;
+ }
+
}
\ No newline at end of file
diff --git a/showcase/src/main/webapp/sections/clockpicker/example-basicUsage.xhtml b/showcase/src/main/webapp/sections/clockpicker/example-basicUsage.xhtml
index 6e250f3fa..3810b88d5 100644
--- a/showcase/src/main/webapp/sections/clockpicker/example-basicUsage.xhtml
+++ b/showcase/src/main/webapp/sections/clockpicker/example-basicUsage.xhtml
@@ -19,6 +19,15 @@
Open In Dialog
+