Skip to content

Commit a64fdf6

Browse files
committed
Fix leaks and load issues with MaterialDatePicker.
1 parent 16850e1 commit a64fdf6

File tree

4 files changed

+83
-123
lines changed

4 files changed

+83
-123
lines changed

gwt-material/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<dependency>
1818
<groupId>com.github.gwtmaterialdesign</groupId>
1919
<artifactId>gwt-material-jquery</artifactId>
20-
<version>1.0-rc1</version>
20+
<version>1.0-SNAPSHOT</version>
2121
</dependency>
2222
<dependency>
2323
<groupId>com.google.gwt</groupId>

gwt-material/src/main/java/gwt/material/design/client/js/JsMaterialElement.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ public class JsMaterialElement extends JQueryElement {
187187
@JsMethod
188188
public native void clear();
189189

190+
@JsMethod
191+
public native JsMaterialElement off(JsDatePickerOptions options);
192+
190193
@JsMethod
191194
public native JsMaterialElement on(JsDatePickerOptions options);
192195

gwt-material/src/main/java/gwt/material/design/client/ui/MaterialDatePicker.java

Lines changed: 76 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,11 @@ public enum MaterialDatePickerType {
8787
private Element pickatizedDateInput;
8888
private MaterialLabel lblError = new MaterialLabel();
8989
private DatePickerLanguage language;
90+
private JsDatePickerOptions options;
9091

9192
private MaterialDatePickerType selectionType = MaterialDatePickerType.DAY;
9293

93-
private boolean initialize = false;
94+
private boolean initialized = false;
9495
private MaterialIcon icon = new MaterialIcon();
9596

9697
private ErrorMixin<AbstractValueWidget, MaterialLabel> errorMixin = new ErrorMixin<>(this, lblError, dateInput, lblPlaceholder);
@@ -126,10 +127,9 @@ public MaterialDatePicker(String placeholder, Date value, MaterialDatePickerType
126127
@Override
127128
public void onLoad() {
128129
super.onLoad();
129-
if (!initialize) {
130+
131+
if(!initialized) {
130132
initialize();
131-
} else {
132-
reinitialize();
133133
}
134134
}
135135

@@ -138,12 +138,75 @@ public void onUnload() {
138138
super.onUnload();
139139

140140
dateTemp = getValue();
141-
initialize = false;
141+
}
142+
143+
protected void initialize() {
144+
if(options == null) {
145+
options = new JsDatePickerOptions();
146+
}
147+
options.container = "body";
148+
options.format = getFormat();
149+
switch (getSelectionType()) {
150+
case MONTH_DAY:
151+
options.selectMonths = true;
152+
break;
153+
case YEAR_MONTH_DAY:
154+
options.selectYears = true;
155+
options.selectMonths = true;
156+
break;
157+
case YEAR:
158+
options.selectYears = true;
159+
break;
160+
}
161+
pickatizedDateInput = $(dateInput.getElement()).pickadate(options).asElement();
162+
label.getElement().setAttribute("for", getPickerId());
163+
setDate(date);
164+
setDateMin(dateMin);
165+
setDateMax(dateMax);
166+
setPlaceholder(placeholder);
167+
168+
if(options.open == null) {
169+
options.open = this::onOpen;
170+
}
171+
if(options.close == null) {
172+
options.close = () -> {
173+
onClose();
174+
$(pickatizedDateInput).blur();
175+
};
176+
}
177+
if(options.set == null) {
178+
options.set = thing -> {
179+
if (thing.hasOwnProperty("clear")) {
180+
onClear();
181+
} else if (thing.hasOwnProperty("select")) {
182+
onSelect();
183+
}
184+
};
185+
}
186+
187+
$(pickatizedDateInput).pickadate("picker")
188+
.off(options)
189+
.on(options);
190+
initialized = true;
191+
}
192+
193+
/**
194+
* Reinitialize the datepicker.
195+
*/
196+
public void reinitialize() {
197+
Scheduler.get().scheduleDeferred(() -> {
198+
initialize();
199+
if (pickatizedDateInput != null && dateTemp != null) {
200+
$(pickatizedDateInput).pickadate("picker").set("select", dateTemp, () -> {
201+
DOM.createFieldSet().setPropertyObject("muted", true);
202+
});
203+
}
204+
});
142205
}
143206

144207
@Override
145208
public void clear() {
146-
if (initialize) {
209+
if (initialized) {
147210
clearErrorOrSuccess();
148211
label.removeStyleName(CssName.ACTIVE);
149212
dateInput.removeStyleName(CssName.VALID);
@@ -162,38 +225,16 @@ public void setDateSelectionType(MaterialDatePickerType type) {
162225
}
163226
}
164227

165-
protected void initHandlers(Element picker) {
166-
JsDatePickerOptions events = new JsDatePickerOptions();
167-
events.open = this::onOpen;
168-
169-
events.close = () -> {
170-
onClose();
171-
$(picker).blur();
172-
};
173-
174-
events.set = thing -> {
175-
if (thing.hasOwnProperty("clear")) {
176-
onClear();
177-
} else if (thing.hasOwnProperty("select")) {
178-
onSelect();
179-
}
180-
};
181-
182-
$(picker).pickadate("picker").on(events);
183-
}
184-
185228
protected void onClose() {
186229
CloseEvent.fire(this, this);
187-
fireEvent(new BlurEvent() {
188-
});
230+
fireEvent(new BlurEvent(){});
189231
}
190232

191233
protected void onOpen() {
192234
label.addStyleName(CssName.ACTIVE);
193235
dateInput.setFocus(true);
194236
OpenEvent.fire(this, this);
195-
fireEvent(new FocusEvent() {
196-
});
237+
fireEvent(new FocusEvent(){});
197238
}
198239

199240
/**
@@ -231,32 +272,6 @@ public String getPickerId() {
231272
return $(pickatizedDateInput).pickadate("picker").get("id").toString();
232273
}
233274

234-
protected void initialize() {
235-
JsDatePickerOptions options = new JsDatePickerOptions();
236-
options.container = "body";
237-
options.format = getFormat();
238-
switch (getSelectionType()) {
239-
case MONTH_DAY:
240-
options.selectMonths = true;
241-
break;
242-
case YEAR_MONTH_DAY:
243-
options.selectYears = true;
244-
options.selectMonths = true;
245-
break;
246-
case YEAR:
247-
options.selectYears = true;
248-
break;
249-
}
250-
pickatizedDateInput = $(dateInput.getElement()).pickadate(options).asElement();
251-
initialize = true;
252-
label.getElement().setAttribute("for", getPickerId());
253-
setDate(this.date);
254-
setDateMin(dateMin);
255-
setDateMax(dateMax);
256-
setPlaceholder(this.placeholder);
257-
initHandlers(pickatizedDateInput);
258-
}
259-
260275
/**
261276
* Sets the current date of the picker.
262277
*
@@ -278,7 +293,7 @@ public Date getDateMin() {
278293
*/
279294
public void setDateMin(Date dateMin) {
280295
this.dateMin = dateMin;
281-
if (initialize && dateMin != null) {
296+
if (initialized && dateMin != null) {
282297
$(pickatizedDateInput).pickadate("picker").set("min", JsDate.create((double) dateMin.getTime()));
283298
}
284299
}
@@ -295,7 +310,7 @@ public Date getDateMax() {
295310
*/
296311
public void setDateMax(Date dateMax) {
297312
this.dateMax = dateMax;
298-
if (initialize && dateMax != null) {
313+
if (initialized && dateMax != null) {
299314
$(pickatizedDateInput).pickadate("picker").set("max", JsDate.create((double) dateMax.getTime()));
300315
}
301316
}
@@ -349,7 +364,7 @@ public String getPlaceholder() {
349364
public void setPlaceholder(String placeholder) {
350365
this.placeholder = placeholder;
351366

352-
if (initialize && placeholder != null) {
367+
if (initialized && placeholder != null) {
353368
lblPlaceholder.setText(placeholder);
354369
}
355370
}
@@ -427,7 +442,7 @@ public void setValue(Date value, boolean fireEvents) {
427442
return;
428443
}
429444
this.date = value;
430-
if (initialize) {
445+
if (initialized) {
431446
setPickerDate(JsDate.create((double) value.getTime()), pickatizedDateInput);
432447
label.addStyleName(CssName.ACTIVE);
433448
}
@@ -465,24 +480,7 @@ public void setLanguage(DatePickerLanguage language) {
465480
}
466481

467482
/**
468-
* Re initialize the datepicker.
469-
*/
470-
public void reinitialize() {
471-
Scheduler.get().scheduleDeferred(() -> {
472-
initialize();
473-
if (pickatizedDateInput != null) {
474-
if (dateTemp != null) {
475-
$(pickatizedDateInput).pickadate("picker").set("select", dateTemp, () -> {
476-
DOM.createFieldSet().setPropertyObject("muted", true);
477-
});
478-
}
479-
}
480-
});
481-
482-
}
483-
484-
/**
485-
* Stop the datepicker instance
483+
* Stop the datepicker instance.
486484
*/
487485
public void stop() {
488486
$(pickatizedDateInput).pickadate("picker").stop();

0 commit comments

Comments
 (0)