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