Skip to content

Commit d29197c

Browse files
Felipe Langjavier-godoy
authored andcommitted
feat: add i18n support to YearMonthField
Close #64
1 parent eb345ff commit d29197c

File tree

3 files changed

+72
-25
lines changed

3 files changed

+72
-25
lines changed

src/main/java/com/flowingcode/addons/ycalendar/YearMonthField.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@
2222
import com.vaadin.flow.component.AbstractSinglePropertyField;
2323
import com.vaadin.flow.component.HasTheme;
2424
import com.vaadin.flow.component.Tag;
25+
import com.vaadin.flow.component.datepicker.DatePicker.DatePickerI18n;
2526
import com.vaadin.flow.component.dependency.JsModule;
2627
import com.vaadin.flow.function.SerializableFunction;
28+
import com.vaadin.flow.internal.JsonSerializer;
2729
import java.time.YearMonth;
30+
import java.util.Objects;
2831
import java.util.Optional;
2932

3033
@SuppressWarnings("serial")
@@ -43,5 +46,15 @@ public <P> YearMonthField() {
4346
super(VALUE_PROPERTY, null, String.class, map(YearMonth::parse), map(YearMonth::toString));
4447
setValue(YearMonth.now());
4548
}
46-
49+
50+
/**
51+
* Sets the i18n object.
52+
*
53+
* @param i18n the DatepickerI18n object used to initialize i18n
54+
*/
55+
public void setI18n(DatePickerI18n i18n) {
56+
Objects.requireNonNull(i18n, "The I18N properties object should not be null");
57+
getElement().setPropertyJson("i18n", JsonSerializer.toJson(i18n));
58+
}
59+
4760
}

src/main/resources/META-INF/frontend/fc-year-month-field/fc-year-month-field.js

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,26 @@ export class YearMonthField extends LitElement {
3535

3636
constructor() {
3737
super();
38-
this.i18n = {
39-
formatTitle : (monthName, fullYear) => monthName + ' ' + fullYear,
40-
monthNames: [
41-
'January',
42-
'February',
43-
'March',
44-
'April',
45-
'May',
46-
'June',
47-
'July',
48-
'August',
49-
'September',
50-
'October',
51-
'November',
52-
'December'
53-
],
54-
};
38+
39+
this._i18n = {};
40+
this.__setDefaultFormatTitle(this._i18n);
41+
this.__setDefaultMonthNames(this._i18n);
5542
}
43+
44+
set i18n(value) {
45+
let oldValue = this._i18n;
46+
this._i18n = value;
47+
48+
if(!this._i18n.formatTitle){
49+
this.__setDefaultFormatTitle(this._i18n);
50+
}
51+
if(!this._i18n.monthNames){
52+
this.__setDefaultMonthNames(this._i18n);
53+
}
54+
this.requestUpdate('i18n', oldValue);
55+
}
56+
57+
get i18n() { return this._i18n; }
5658

5759
willUpdate(changedProperties) {
5860
if (changedProperties.has('value')) {
@@ -128,7 +130,15 @@ export class YearMonthField extends LitElement {
128130
__incMonth() {
129131
this.__addMonths(1);
130132
}
131-
133+
134+
__setDefaultFormatTitle(obj){
135+
obj.formatTitle = (monthName, fullYear) => monthName + ' ' + fullYear;
136+
}
137+
138+
__setDefaultMonthNames(obj){
139+
obj.monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
140+
}
141+
132142
}
133143

134144
customElements.define(YearMonthField.is, YearMonthField);

src/test/java/com/flowingcode/addons/ycalendar/YearMonthFieldDemo.java

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,48 @@
2020
package com.flowingcode.addons.ycalendar;
2121

2222
import com.flowingcode.vaadin.addons.demo.DemoSource;
23-
import com.vaadin.flow.component.dependency.CssImport;
23+
import com.vaadin.flow.component.datepicker.DatePicker.DatePickerI18n;
2424
import com.vaadin.flow.component.html.Div;
25-
import com.vaadin.flow.component.html.Span;
26-
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
25+
import com.vaadin.flow.component.radiobutton.RadioButtonGroup;
2726
import com.vaadin.flow.router.PageTitle;
2827
import com.vaadin.flow.router.Route;
29-
import java.time.DayOfWeek;
28+
import java.util.List;
3029

3130
@DemoSource
3231
@PageTitle("Year-Month Field")
3332
@Route(value = "year-month-calendar/year-month-field", layout = YearMonthCalendarDemoView.class)
3433
public class YearMonthFieldDemo extends Div {
3534

36-
public YearMonthFieldDemo() {
35+
private static final String FRENCH = "French";
36+
private static final String SPANISH = "Spanish";
37+
private static final String ENGLISH = "English";
3738

39+
public YearMonthFieldDemo() {
3840
YearMonthField field = new YearMonthField();
39-
4041
add(field);
42+
43+
RadioButtonGroup<String> languageSelector = new RadioButtonGroup<>("Choose language:");
44+
languageSelector.setItems(ENGLISH, SPANISH, FRENCH);
45+
languageSelector.setValue(ENGLISH);
46+
languageSelector.addValueChangeListener(e -> {
47+
DatePickerI18n i18n = new DatePickerI18n();
48+
switch (e.getValue()) {
49+
case SPANISH:
50+
i18n.setMonthNames(List.of("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio",
51+
"Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"));
52+
break;
53+
case FRENCH:
54+
i18n.setMonthNames(
55+
List.of("janvier", "février", "mars", "avril", "mai", "juin", "juillet",
56+
"août", "septembre", "octobre", "novembre", "décembre"));
57+
break;
58+
default:
59+
// english
60+
}
61+
field.setI18n(i18n);
62+
});
63+
64+
add(languageSelector);
4165
}
4266

4367
}

0 commit comments

Comments
 (0)