1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.html;
16
17 import static org.htmlunit.BrowserVersionFeatures.HTMLINPUT_TYPE_WEEK_SUPPORTED;
18 import static org.htmlunit.BrowserVersionFeatures.JS_INPUT_CHANGE_TYPE_DROPS_VALUE_WEEK_MONTH;
19
20 import java.time.LocalDate;
21 import java.time.format.DateTimeFormatter;
22 import java.time.format.DateTimeParseException;
23 import java.util.Map;
24
25 import org.apache.commons.lang3.StringUtils;
26 import org.htmlunit.BrowserVersion;
27 import org.htmlunit.SgmlPage;
28
29
30
31
32
33
34
35
36 public class HtmlWeekInput extends HtmlInput implements LabelableElement {
37
38 private static final DateTimeFormatter FORMATTER_ = DateTimeFormatter.ofPattern("yyyy-'W'ww");
39
40
41
42
43
44
45
46
47 HtmlWeekInput(final String qualifiedName, final SgmlPage page,
48 final Map<String, DomAttr> attributes) {
49 super(qualifiedName, page, attributes);
50 }
51
52
53
54
55 @Override
56 public void setDefaultChecked(final boolean defaultChecked) {
57
58 }
59
60
61
62
63 @Override
64 public void setValue(final String newValue) {
65 if (!hasFeature(HTMLINPUT_TYPE_WEEK_SUPPORTED)
66 || StringUtils.isEmpty(newValue)) {
67 super.setValue(newValue);
68 return;
69 }
70
71 try {
72 FORMATTER_.parse(newValue);
73 super.setValue(newValue);
74 }
75 catch (final DateTimeParseException ignored) {
76
77 }
78 }
79
80
81
82
83 @Override
84 public boolean isValid() {
85 return super.isValid() && isMaxValid() && isMinValid();
86 }
87
88
89
90
91
92
93
94
95 private boolean isMinValid() {
96 if (hasFeature(HTMLINPUT_TYPE_WEEK_SUPPORTED) && !getMin().isEmpty()) {
97 try {
98 final LocalDate dateValue = LocalDate.parse(getRawValue() + "-1",
99 DateTimeFormatter.ISO_WEEK_DATE);
100 final LocalDate minDate = LocalDate.parse(getMin() + "-1", DateTimeFormatter.ISO_WEEK_DATE);
101 return minDate.isEqual(dateValue) || minDate.isBefore(dateValue);
102 }
103 catch (final DateTimeParseException ignored) {
104
105 }
106 }
107 return true;
108 }
109
110
111
112
113
114
115
116
117 private boolean isMaxValid() {
118 if (hasFeature(HTMLINPUT_TYPE_WEEK_SUPPORTED) && !getMax().isEmpty()) {
119 try {
120 final LocalDate dateValue = LocalDate.parse(getRawValue() + "-1",
121 DateTimeFormatter.ISO_WEEK_DATE);
122 final LocalDate maxDate = LocalDate.parse(getMax() + "-1", DateTimeFormatter.ISO_WEEK_DATE);
123 return maxDate.isEqual(dateValue) || maxDate.isAfter(dateValue);
124 }
125 catch (final DateTimeParseException ignored) {
126
127 }
128 }
129 return true;
130 }
131
132 @Override
133 protected void adjustValueAfterTypeChange(final HtmlInput oldInput, final BrowserVersion browserVersion) {
134 if (browserVersion.hasFeature(JS_INPUT_CHANGE_TYPE_DROPS_VALUE_WEEK_MONTH)) {
135 setValue("");
136 return;
137 }
138 super.adjustValueAfterTypeChange(oldInput, browserVersion);
139 }
140 }