@lekoala/date-picker 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -2
- package/custom-elements.json +42 -2
- package/dist/date-picker.js +187 -54
- package/dist/date-picker.min.js +13 -13
- package/dist/date-picker.standalone.min.js +13 -13
- package/dist/types/control-classes.d.ts +11 -1
- package/dist/types/control-classes.d.ts.map +1 -1
- package/dist/types/date-calendar.d.ts +26 -49
- package/dist/types/date-calendar.d.ts.map +1 -1
- package/dist/types/date-picker.d.ts +35 -59
- package/dist/types/date-picker.d.ts.map +1 -1
- package/dist/types/messages.d.ts +2 -0
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/upgrade-properties.d.ts +8 -0
- package/dist/types/upgrade-properties.d.ts.map +1 -0
- package/docs/API.md +15 -3
- package/docs/DECISIONS.md +6 -0
- package/package.json +2 -2
- package/src/control-classes.js +36 -6
- package/src/date-calendar.js +89 -23
- package/src/date-picker.js +93 -35
- package/src/messages.js +12 -0
- package/src/upgrade-properties.js +14 -0
package/README.md
CHANGED
|
@@ -266,7 +266,7 @@ Deliberately out of scope:
|
|
|
266
266
|
|
|
267
267
|
### Host control classes
|
|
268
268
|
|
|
269
|
-
Set application-wide header styles
|
|
269
|
+
Set application-wide header styles, including for calendars and pickers already in the page:
|
|
270
270
|
|
|
271
271
|
```js
|
|
272
272
|
import { setDefaultControlClasses } from "@lekoala/date-picker";
|
|
@@ -278,4 +278,17 @@ setDefaultControlClasses({
|
|
|
278
278
|
});
|
|
279
279
|
```
|
|
280
280
|
|
|
281
|
-
Each role with author classes uses the host design system's skin. Override
|
|
281
|
+
Each role with author classes uses the host design system's skin. Override individual roles through `controlClasses`: omitted roles follow current global defaults, `""` restores the library skin for a role, and `null` follows all defaults. Day cells and the field trigger are unchanged.
|
|
282
|
+
|
|
283
|
+
For a classic script (including the CDN build), use the registered constructor after the script has loaded:
|
|
284
|
+
|
|
285
|
+
```js
|
|
286
|
+
customElements.get("date-picker").setDefaultControlClasses({
|
|
287
|
+
month: "select sm",
|
|
288
|
+
year: "input sm",
|
|
289
|
+
nav: "btn outline sm icon-only",
|
|
290
|
+
});
|
|
291
|
+
customElements.get("date-picker").setDefaultMessages({ chooseDate: "Choose a date" });
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Both element constructors expose `setDefaultControlClasses`, `getDefaultControlClasses`, `setDefaultMessages` and `getDefaultMessages`, sharing the same defaults. Class defaults update inherited roles on connected elements, including instances with partial overrides. Message defaults update elements without a messages override. Properties assigned before definition are reapplied through their setters when the element connects, including `controlClasses`, `messages`, `source` and `range`.
|
package/custom-elements.json
CHANGED
|
@@ -43,6 +43,26 @@
|
|
|
43
43
|
}
|
|
44
44
|
],
|
|
45
45
|
"members": [
|
|
46
|
+
{
|
|
47
|
+
"kind": "method",
|
|
48
|
+
"name": "setDefaultControlClasses",
|
|
49
|
+
"static": true
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"kind": "method",
|
|
53
|
+
"name": "getDefaultControlClasses",
|
|
54
|
+
"static": true
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"kind": "method",
|
|
58
|
+
"name": "setDefaultMessages",
|
|
59
|
+
"static": true
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"kind": "method",
|
|
63
|
+
"name": "getDefaultMessages",
|
|
64
|
+
"static": true
|
|
65
|
+
},
|
|
46
66
|
{
|
|
47
67
|
"kind": "getter",
|
|
48
68
|
"name": "locale"
|
|
@@ -94,7 +114,7 @@
|
|
|
94
114
|
{
|
|
95
115
|
"kind": "getter",
|
|
96
116
|
"name": "controlClasses",
|
|
97
|
-
"description": "Author classes for header controls;
|
|
117
|
+
"description": "Author classes for header controls; omitted roles follow current global defaults."
|
|
98
118
|
},
|
|
99
119
|
{
|
|
100
120
|
"kind": "getter",
|
|
@@ -278,6 +298,26 @@
|
|
|
278
298
|
}
|
|
279
299
|
],
|
|
280
300
|
"members": [
|
|
301
|
+
{
|
|
302
|
+
"kind": "method",
|
|
303
|
+
"name": "setDefaultControlClasses",
|
|
304
|
+
"static": true
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
"kind": "method",
|
|
308
|
+
"name": "getDefaultControlClasses",
|
|
309
|
+
"static": true
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
"kind": "method",
|
|
313
|
+
"name": "setDefaultMessages",
|
|
314
|
+
"static": true
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"kind": "method",
|
|
318
|
+
"name": "getDefaultMessages",
|
|
319
|
+
"static": true
|
|
320
|
+
},
|
|
281
321
|
{
|
|
282
322
|
"kind": "getter",
|
|
283
323
|
"name": "input"
|
|
@@ -321,7 +361,7 @@
|
|
|
321
361
|
{
|
|
322
362
|
"kind": "getter",
|
|
323
363
|
"name": "controlClasses",
|
|
324
|
-
"description": "Author classes for header controls;
|
|
364
|
+
"description": "Author classes for header controls; omitted roles follow current global defaults."
|
|
325
365
|
},
|
|
326
366
|
{
|
|
327
367
|
"kind": "getter",
|
package/dist/date-picker.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*** @lekoala/date-picker v0.5.
|
|
1
|
+
/*** @lekoala/date-picker v0.5.1 - https://github.com/lekoala/date-picker ***/
|
|
2
2
|
(() => {
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -313,14 +313,37 @@
|
|
|
313
313
|
function getDefaultControlClasses() {
|
|
314
314
|
return { ...defaults };
|
|
315
315
|
}
|
|
316
|
-
function
|
|
317
|
-
|
|
316
|
+
function normalizeControlClasses(classes) {
|
|
317
|
+
if (classes == null)
|
|
318
|
+
return null;
|
|
319
|
+
const result = {};
|
|
318
320
|
for (const role of ["month", "year", "nav"]) {
|
|
319
|
-
if (
|
|
321
|
+
if (Object.hasOwn(classes, role))
|
|
320
322
|
result[role] = normalizeControlClass(classes[role]);
|
|
321
323
|
}
|
|
322
324
|
return result;
|
|
323
325
|
}
|
|
326
|
+
function usesDefaultControlClasses(classes) {
|
|
327
|
+
return classes == null || ["month", "year", "nav"].some((role) => !Object.hasOwn(classes, role));
|
|
328
|
+
}
|
|
329
|
+
function resolveControlClasses(classes) {
|
|
330
|
+
return { ...getDefaultControlClasses(), ...normalizeControlClasses(classes) };
|
|
331
|
+
}
|
|
332
|
+
function setDefaultControlClasses(classes) {
|
|
333
|
+
const next = resolveControlClasses(classes);
|
|
334
|
+
if (sameControlClasses(defaults, next))
|
|
335
|
+
return;
|
|
336
|
+
defaults = next;
|
|
337
|
+
for (const listener of listeners)
|
|
338
|
+
listener();
|
|
339
|
+
}
|
|
340
|
+
var listeners = new Set;
|
|
341
|
+
function subscribeDefaultControlClasses(listener) {
|
|
342
|
+
listeners.add(listener);
|
|
343
|
+
return () => {
|
|
344
|
+
listeners.delete(listener);
|
|
345
|
+
};
|
|
346
|
+
}
|
|
324
347
|
|
|
325
348
|
// src/date-range.js
|
|
326
349
|
function normalizeRange(range) {
|
|
@@ -703,6 +726,18 @@
|
|
|
703
726
|
function getDefaultMessages() {
|
|
704
727
|
return { ...defaults2 };
|
|
705
728
|
}
|
|
729
|
+
function setDefaultMessages(messages) {
|
|
730
|
+
defaults2 = { ...defaults2, ...messages };
|
|
731
|
+
for (const listener of listeners2)
|
|
732
|
+
listener();
|
|
733
|
+
}
|
|
734
|
+
var listeners2 = new Set;
|
|
735
|
+
function subscribeDefaultMessages(listener) {
|
|
736
|
+
listeners2.add(listener);
|
|
737
|
+
return () => {
|
|
738
|
+
listeners2.delete(listener);
|
|
739
|
+
};
|
|
740
|
+
}
|
|
706
741
|
|
|
707
742
|
// src/source.js
|
|
708
743
|
function normalizeDateStates(payload) {
|
|
@@ -725,6 +760,17 @@
|
|
|
725
760
|
return map;
|
|
726
761
|
}
|
|
727
762
|
|
|
763
|
+
// src/upgrade-properties.js
|
|
764
|
+
function upgradeProperties(element, properties) {
|
|
765
|
+
for (const property of properties) {
|
|
766
|
+
if (!Object.hasOwn(element, property))
|
|
767
|
+
continue;
|
|
768
|
+
const value = Reflect.get(element, property);
|
|
769
|
+
Reflect.deleteProperty(element, property);
|
|
770
|
+
Reflect.set(element, property, value);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
|
|
728
774
|
// src/date-calendar.js
|
|
729
775
|
var uid = 0;
|
|
730
776
|
function escapeHtml(value) {
|
|
@@ -783,6 +829,18 @@
|
|
|
783
829
|
"selection",
|
|
784
830
|
"month-format"
|
|
785
831
|
];
|
|
832
|
+
static setDefaultControlClasses(classes) {
|
|
833
|
+
setDefaultControlClasses(classes);
|
|
834
|
+
}
|
|
835
|
+
static getDefaultControlClasses() {
|
|
836
|
+
return getDefaultControlClasses();
|
|
837
|
+
}
|
|
838
|
+
static setDefaultMessages(messages) {
|
|
839
|
+
setDefaultMessages(messages);
|
|
840
|
+
}
|
|
841
|
+
static getDefaultMessages() {
|
|
842
|
+
return getDefaultMessages();
|
|
843
|
+
}
|
|
786
844
|
constructor() {
|
|
787
845
|
super();
|
|
788
846
|
this._id = `date-calendar-${++uid}`;
|
|
@@ -802,8 +860,10 @@
|
|
|
802
860
|
this._paintedRange = { start: "", end: "" };
|
|
803
861
|
this._paintedPreview = false;
|
|
804
862
|
this._renderedStates = new Map;
|
|
805
|
-
this._messages =
|
|
806
|
-
this._controlClasses =
|
|
863
|
+
this._messages = null;
|
|
864
|
+
this._controlClasses = null;
|
|
865
|
+
this._stopDefaultMessages = null;
|
|
866
|
+
this._stopDefaultControlClasses = null;
|
|
807
867
|
this._onClick = this._onClick.bind(this);
|
|
808
868
|
this._onChange = this._onChange.bind(this);
|
|
809
869
|
this._onKeyDown = this._onKeyDown.bind(this);
|
|
@@ -812,15 +872,47 @@
|
|
|
812
872
|
connectedCallback() {
|
|
813
873
|
if (this._connected)
|
|
814
874
|
return;
|
|
875
|
+
upgradeProperties(this, [
|
|
876
|
+
"locale",
|
|
877
|
+
"min",
|
|
878
|
+
"max",
|
|
879
|
+
"firstDay",
|
|
880
|
+
"selection",
|
|
881
|
+
"monthFormat",
|
|
882
|
+
"fixedWeeks",
|
|
883
|
+
"showWeekNumbers",
|
|
884
|
+
"controlClasses",
|
|
885
|
+
"messages",
|
|
886
|
+
"source",
|
|
887
|
+
"dateState",
|
|
888
|
+
"renderDay",
|
|
889
|
+
"isDateDisabled",
|
|
890
|
+
"highlightedRange",
|
|
891
|
+
"value",
|
|
892
|
+
"display"
|
|
893
|
+
]);
|
|
894
|
+
this._syncModel();
|
|
895
|
+
upgradeProperties(this, ["focusedDate"]);
|
|
896
|
+
this._stopDefaultControlClasses = subscribeDefaultControlClasses(() => {
|
|
897
|
+
if (usesDefaultControlClasses(this._controlClasses))
|
|
898
|
+
this.render();
|
|
899
|
+
});
|
|
900
|
+
this._stopDefaultMessages = subscribeDefaultMessages(() => {
|
|
901
|
+
if (this._messages === null)
|
|
902
|
+
this.render();
|
|
903
|
+
});
|
|
815
904
|
this._connected = true;
|
|
816
905
|
this.addEventListener("click", this._onClick);
|
|
817
906
|
this.addEventListener("change", this._onChange);
|
|
818
907
|
this.addEventListener("keydown", this._onKeyDown);
|
|
819
908
|
this.addEventListener("focusin", this._onFocusIn);
|
|
820
|
-
this._syncModel();
|
|
821
909
|
this.render();
|
|
822
910
|
}
|
|
823
911
|
disconnectedCallback() {
|
|
912
|
+
this._stopDefaultControlClasses?.();
|
|
913
|
+
this._stopDefaultControlClasses = null;
|
|
914
|
+
this._stopDefaultMessages?.();
|
|
915
|
+
this._stopDefaultMessages = null;
|
|
824
916
|
this._connected = false;
|
|
825
917
|
this._loadController?.abort();
|
|
826
918
|
this._loadController = null;
|
|
@@ -941,21 +1033,21 @@
|
|
|
941
1033
|
this.toggleAttribute("show-week-numbers", Boolean(value));
|
|
942
1034
|
}
|
|
943
1035
|
get controlClasses() {
|
|
944
|
-
return
|
|
1036
|
+
return resolveControlClasses(this._controlClasses);
|
|
945
1037
|
}
|
|
946
1038
|
set controlClasses(value) {
|
|
947
|
-
const
|
|
948
|
-
|
|
1039
|
+
const previous = this.controlClasses;
|
|
1040
|
+
this._controlClasses = normalizeControlClasses(value);
|
|
1041
|
+
if (sameControlClasses(previous, this.controlClasses))
|
|
949
1042
|
return;
|
|
950
|
-
this._controlClasses = classes;
|
|
951
1043
|
if (this._connected)
|
|
952
1044
|
this.render();
|
|
953
1045
|
}
|
|
954
1046
|
get messages() {
|
|
955
|
-
return this._messages;
|
|
1047
|
+
return this._messages ?? getDefaultMessages();
|
|
956
1048
|
}
|
|
957
1049
|
set messages(value) {
|
|
958
|
-
this._messages = { ...getDefaultMessages(), ...value
|
|
1050
|
+
this._messages = value == null ? null : { ...getDefaultMessages(), ...value };
|
|
959
1051
|
if (this._connected)
|
|
960
1052
|
this.render();
|
|
961
1053
|
}
|
|
@@ -1216,8 +1308,8 @@
|
|
|
1216
1308
|
return [
|
|
1217
1309
|
formatLongDate(date, this.locale),
|
|
1218
1310
|
description,
|
|
1219
|
-
rangeLabel ? this.
|
|
1220
|
-
state.disabled ? this.
|
|
1311
|
+
rangeLabel ? this.messages[rangeLabel] : "",
|
|
1312
|
+
state.disabled ? this.messages.unavailable : ""
|
|
1221
1313
|
].filter(Boolean).join(". ");
|
|
1222
1314
|
}
|
|
1223
1315
|
_updateRangeDom() {
|
|
@@ -1398,7 +1490,7 @@
|
|
|
1398
1490
|
const minYearAttr = this.min ? ` min="${Number(this.min.slice(0, 4))}"` : "";
|
|
1399
1491
|
const maxYearAttr = this.max ? ` max="${Number(this.max.slice(0, 4))}"` : "";
|
|
1400
1492
|
const showWeeks = this.showWeekNumbers && this.firstDay === 1;
|
|
1401
|
-
const weekHeader = showWeeks ? `<th scope="col" class="dp-week-heading" abbr="${escapeHtml(this.
|
|
1493
|
+
const weekHeader = showWeeks ? `<th scope="col" class="dp-week-heading" abbr="${escapeHtml(this.messages.week)}">#</th>` : "";
|
|
1402
1494
|
const monthOptions = names.map((name, index) => {
|
|
1403
1495
|
const month = index + 1;
|
|
1404
1496
|
const key = `${String(displayYear).padStart(4, "0")}-${String(month).padStart(2, "0")}`;
|
|
@@ -1426,22 +1518,22 @@
|
|
|
1426
1518
|
const focusKey = focusedElement instanceof HTMLElement && this.contains(focusedElement) ? this._focusTargetKey(focusedElement) : "";
|
|
1427
1519
|
const yearFirst = monthYearOrder(locale)[0] === "year";
|
|
1428
1520
|
this.toggleAttribute("data-year-first", yearFirst);
|
|
1429
|
-
const classes = this.
|
|
1521
|
+
const classes = this.controlClasses;
|
|
1430
1522
|
const monthClass = escapeHtml(classes.month || "dp-skin");
|
|
1431
1523
|
const yearClass = escapeHtml(classes.year || "dp-skin");
|
|
1432
1524
|
const navClass = escapeHtml(classes.nav || "dp-skin");
|
|
1433
|
-
const monthControl = `<label class="dp-visually-hidden" for="${this._id}-month">${escapeHtml(this.
|
|
1434
|
-
<select id="${this._id}-month" class="dp-month-select ${monthClass}" aria-label="${escapeHtml(this.
|
|
1435
|
-
const yearControl = `<label class="dp-visually-hidden" for="${this._id}-year">${escapeHtml(this.
|
|
1436
|
-
<input id="${this._id}-year" class="dp-year-input ${yearClass}" type="number" inputmode="numeric" value="${displayYear}"${minYearAttr}${maxYearAttr} aria-label="${escapeHtml(this.
|
|
1525
|
+
const monthControl = `<label class="dp-visually-hidden" for="${this._id}-month">${escapeHtml(this.messages.month)}</label>
|
|
1526
|
+
<select id="${this._id}-month" class="dp-month-select ${monthClass}" aria-label="${escapeHtml(this.messages.month)}">${monthOptions}</select>`;
|
|
1527
|
+
const yearControl = `<label class="dp-visually-hidden" for="${this._id}-year">${escapeHtml(this.messages.year)}</label>
|
|
1528
|
+
<input id="${this._id}-year" class="dp-year-input ${yearClass}" type="number" inputmode="numeric" value="${displayYear}"${minYearAttr}${maxYearAttr} aria-label="${escapeHtml(this.messages.year)}">`;
|
|
1437
1529
|
this._rendering = true;
|
|
1438
1530
|
this.innerHTML = `
|
|
1439
1531
|
<div class="dp-calendar-shell">
|
|
1440
1532
|
<div class="dp-calendar-header">
|
|
1441
1533
|
${yearFirst ? yearControl : monthControl}
|
|
1442
1534
|
${yearFirst ? monthControl : yearControl}
|
|
1443
|
-
<button type="button" class="dp-nav dp-prev ${navClass}" data-calendar-action="previous" aria-label="${escapeHtml(this.
|
|
1444
|
-
<button type="button" class="dp-nav dp-next ${navClass}" data-calendar-action="next" aria-label="${escapeHtml(this.
|
|
1535
|
+
<button type="button" class="dp-nav dp-prev ${navClass}" data-calendar-action="previous" aria-label="${escapeHtml(this.messages.previousMonth)}"${prevDisabled ? " disabled" : ""}><svg aria-hidden="true" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m4 10 4-4 4 4"/></svg></button>
|
|
1536
|
+
<button type="button" class="dp-nav dp-next ${navClass}" data-calendar-action="next" aria-label="${escapeHtml(this.messages.nextMonth)}"${nextDisabled ? " disabled" : ""}><svg aria-hidden="true" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m4 6 4 4 4-4"/></svg></button>
|
|
1445
1537
|
</div>
|
|
1446
1538
|
<h2 id="${headingId}" class="dp-calendar-heading dp-visually-hidden" aria-live="polite">${escapeHtml(formatMonthYear(`${display}-15`, locale))}</h2>
|
|
1447
1539
|
<table id="${gridId}" class="dp-grid" role="grid" aria-labelledby="${headingId}">
|
|
@@ -2045,6 +2137,18 @@
|
|
|
2045
2137
|
|
|
2046
2138
|
class DatePickerElement extends HTMLElement {
|
|
2047
2139
|
static observedAttributes = ["value", "locale", "min", "max", "open-on-focus", "month-format"];
|
|
2140
|
+
static setDefaultControlClasses(classes) {
|
|
2141
|
+
setDefaultControlClasses(classes);
|
|
2142
|
+
}
|
|
2143
|
+
static getDefaultControlClasses() {
|
|
2144
|
+
return getDefaultControlClasses();
|
|
2145
|
+
}
|
|
2146
|
+
static setDefaultMessages(messages) {
|
|
2147
|
+
setDefaultMessages(messages);
|
|
2148
|
+
}
|
|
2149
|
+
static getDefaultMessages() {
|
|
2150
|
+
return getDefaultMessages();
|
|
2151
|
+
}
|
|
2048
2152
|
constructor() {
|
|
2049
2153
|
super();
|
|
2050
2154
|
this._id = `date-picker-${++uid2}`;
|
|
@@ -2076,8 +2180,9 @@
|
|
|
2076
2180
|
this._stopTracking = null;
|
|
2077
2181
|
this._open = false;
|
|
2078
2182
|
this._suppressFocusOpen = false;
|
|
2079
|
-
this._messages =
|
|
2080
|
-
this._controlClasses =
|
|
2183
|
+
this._messages = null;
|
|
2184
|
+
this._controlClasses = null;
|
|
2185
|
+
this._stopDefaultMessages = null;
|
|
2081
2186
|
this._source = null;
|
|
2082
2187
|
this._dateState = null;
|
|
2083
2188
|
this._renderDay = null;
|
|
@@ -2090,11 +2195,31 @@
|
|
|
2090
2195
|
connectedCallback() {
|
|
2091
2196
|
if (this._connected)
|
|
2092
2197
|
return;
|
|
2093
|
-
|
|
2198
|
+
upgradeProperties(this, [
|
|
2199
|
+
"locale",
|
|
2200
|
+
"min",
|
|
2201
|
+
"max",
|
|
2202
|
+
"monthFormat",
|
|
2203
|
+
"openOnFocus",
|
|
2204
|
+
"coordinateSpace",
|
|
2205
|
+
"controlClasses",
|
|
2206
|
+
"messages",
|
|
2207
|
+
"source",
|
|
2208
|
+
"dateState",
|
|
2209
|
+
"renderDay",
|
|
2210
|
+
"isDateDisabled"
|
|
2211
|
+
]);
|
|
2212
|
+
if (this.hasAttribute("range"))
|
|
2094
2213
|
this._connectRange();
|
|
2095
|
-
|
|
2214
|
+
else
|
|
2215
|
+
this._connectSingle();
|
|
2216
|
+
if (this._connected) {
|
|
2217
|
+
upgradeProperties(this, ["value", "range"]);
|
|
2218
|
+
this._stopDefaultMessages = subscribeDefaultMessages(() => {
|
|
2219
|
+
if (this._messages === null)
|
|
2220
|
+
this._refreshMessages();
|
|
2221
|
+
});
|
|
2096
2222
|
}
|
|
2097
|
-
this._connectSingle();
|
|
2098
2223
|
}
|
|
2099
2224
|
_connectSingle() {
|
|
2100
2225
|
const input = this.querySelector(":scope > input:not([type=hidden]):not([type=time]):not([data-time-start]):not([data-time-end])");
|
|
@@ -2105,7 +2230,7 @@
|
|
|
2105
2230
|
this._connected = true;
|
|
2106
2231
|
this._input = input;
|
|
2107
2232
|
this._discoverTimeFields();
|
|
2108
|
-
this._field = new DateFieldController(input, { messages: this.
|
|
2233
|
+
this._field = new DateFieldController(input, { messages: this.messages, locale: this.locale });
|
|
2109
2234
|
this._field.onAttributesChanged = () => this._syncInputState();
|
|
2110
2235
|
this._field.confirm = (date, options) => this._confirmDate(date, options);
|
|
2111
2236
|
this._setupFormValue();
|
|
@@ -2120,7 +2245,7 @@
|
|
|
2120
2245
|
else if (!input.value)
|
|
2121
2246
|
this._setValue("", { emit: false, format: false });
|
|
2122
2247
|
else
|
|
2123
|
-
input.setCustomValidity(this.
|
|
2248
|
+
input.setCustomValidity(this.messages.invalidDate);
|
|
2124
2249
|
if (this._field.hidden)
|
|
2125
2250
|
this._field.hidden.defaultValue = this._value;
|
|
2126
2251
|
if (input.getAttribute("value") == null && input.defaultValue === "") {
|
|
@@ -2161,8 +2286,8 @@
|
|
|
2161
2286
|
this._connected = true;
|
|
2162
2287
|
this._input = null;
|
|
2163
2288
|
this._fields = [
|
|
2164
|
-
new DateFieldController(startInput, { messages: this.
|
|
2165
|
-
new DateFieldController(endInput, { messages: this.
|
|
2289
|
+
new DateFieldController(startInput, { messages: this.messages, locale: this.locale }),
|
|
2290
|
+
new DateFieldController(endInput, { messages: this.messages, locale: this.locale })
|
|
2166
2291
|
];
|
|
2167
2292
|
this._range = new DateRangeController;
|
|
2168
2293
|
this._rangeOriginalDescribedBy = [
|
|
@@ -2184,9 +2309,9 @@
|
|
|
2184
2309
|
const initialEnd = isDate(endInput.value) ? endInput.value : adapter.parse(endInput.value);
|
|
2185
2310
|
this._setRange(initialStart || "", initialEnd || "", { emit: false });
|
|
2186
2311
|
if (startInput.value.trim() && !isDate(initialStart))
|
|
2187
|
-
startInput.setCustomValidity(this.
|
|
2312
|
+
startInput.setCustomValidity(this.messages.invalidDate);
|
|
2188
2313
|
if (endInput.value.trim() && !isDate(initialEnd))
|
|
2189
|
-
endInput.setCustomValidity(this.
|
|
2314
|
+
endInput.setCustomValidity(this.messages.invalidDate);
|
|
2190
2315
|
if (this._fields[0].hidden)
|
|
2191
2316
|
this._fields[0].hidden.defaultValue = this._range.start;
|
|
2192
2317
|
if (this._fields[1].hidden)
|
|
@@ -2199,6 +2324,8 @@
|
|
|
2199
2324
|
}
|
|
2200
2325
|
}
|
|
2201
2326
|
disconnectedCallback() {
|
|
2327
|
+
this._stopDefaultMessages?.();
|
|
2328
|
+
this._stopDefaultMessages = null;
|
|
2202
2329
|
this._connected = false;
|
|
2203
2330
|
this.hide(false);
|
|
2204
2331
|
this._controller?.abort();
|
|
@@ -2333,28 +2460,34 @@
|
|
|
2333
2460
|
return this._open;
|
|
2334
2461
|
}
|
|
2335
2462
|
get controlClasses() {
|
|
2336
|
-
return
|
|
2463
|
+
return resolveControlClasses(this._controlClasses);
|
|
2337
2464
|
}
|
|
2338
2465
|
set controlClasses(value) {
|
|
2339
|
-
|
|
2340
|
-
if (sameControlClasses(classes, this._controlClasses))
|
|
2341
|
-
return;
|
|
2342
|
-
this._controlClasses = classes;
|
|
2466
|
+
this._controlClasses = normalizeControlClasses(value);
|
|
2343
2467
|
if (this._calendar)
|
|
2344
2468
|
this._calendar.controlClasses = this._controlClasses;
|
|
2345
2469
|
}
|
|
2346
2470
|
get messages() {
|
|
2347
|
-
return this._messages;
|
|
2471
|
+
return this._messages ?? getDefaultMessages();
|
|
2348
2472
|
}
|
|
2349
2473
|
set messages(value) {
|
|
2350
|
-
this._messages = { ...getDefaultMessages(), ...value
|
|
2474
|
+
this._messages = value == null ? null : { ...getDefaultMessages(), ...value };
|
|
2351
2475
|
if (this._calendar)
|
|
2352
2476
|
this._calendar.messages = this._messages;
|
|
2477
|
+
this._refreshMessages();
|
|
2478
|
+
}
|
|
2479
|
+
_refreshMessages() {
|
|
2480
|
+
const messages = this.messages;
|
|
2353
2481
|
for (const field of this._fields || [])
|
|
2354
|
-
field.setMessages(
|
|
2355
|
-
this._field?.setMessages(
|
|
2482
|
+
field.setMessages(messages);
|
|
2483
|
+
this._field?.setMessages(messages);
|
|
2484
|
+
this._panel?.setAttribute("aria-label", messages.calendar);
|
|
2485
|
+
const field = this._field ?? this._fields?.[0];
|
|
2486
|
+
if (this._formatHint && field)
|
|
2487
|
+
this._formatHint.textContent = `${messages.formatHint}: ${field.placeholder}`;
|
|
2356
2488
|
this._refreshButtonLabel();
|
|
2357
|
-
this.
|
|
2489
|
+
if (this._connected)
|
|
2490
|
+
this.validate();
|
|
2358
2491
|
}
|
|
2359
2492
|
get source() {
|
|
2360
2493
|
return this._source;
|
|
@@ -2482,7 +2615,7 @@
|
|
|
2482
2615
|
panel.className = "dp-picker-panel";
|
|
2483
2616
|
panel.setAttribute("popover", "manual");
|
|
2484
2617
|
panel.setAttribute("role", "dialog");
|
|
2485
|
-
panel.setAttribute("aria-label", this.
|
|
2618
|
+
panel.setAttribute("aria-label", this.messages.calendar);
|
|
2486
2619
|
const calendar = new DateCalendarElement;
|
|
2487
2620
|
calendar.selection = "none";
|
|
2488
2621
|
calendar.fixedWeeks = true;
|
|
@@ -2971,7 +3104,7 @@
|
|
|
2971
3104
|
if (!this._rangeMode() && this._value)
|
|
2972
3105
|
calendar.value = this._value;
|
|
2973
3106
|
if (panel)
|
|
2974
|
-
panel.setAttribute("aria-label", this.
|
|
3107
|
+
panel.setAttribute("aria-label", this.messages.calendar);
|
|
2975
3108
|
}
|
|
2976
3109
|
_refreshLocale() {
|
|
2977
3110
|
const hint = this._formatHint;
|
|
@@ -2980,7 +3113,7 @@
|
|
|
2980
3113
|
if (this._rangeMode() && this._fields) {
|
|
2981
3114
|
this._fields[0].setLocale(this.locale);
|
|
2982
3115
|
this._fields[1].setLocale(this.locale);
|
|
2983
|
-
hint.textContent = `${this.
|
|
3116
|
+
hint.textContent = `${this.messages.formatHint}: ${this._fields[0].placeholder}`;
|
|
2984
3117
|
for (const [index, field] of this._fields.entries()) {
|
|
2985
3118
|
if (!field.input.hasAttribute("placeholder") || this._generatedPlaceholder) {
|
|
2986
3119
|
field.input.placeholder = field.placeholder;
|
|
@@ -2997,7 +3130,7 @@
|
|
|
2997
3130
|
if (!field)
|
|
2998
3131
|
return;
|
|
2999
3132
|
field.setLocale(this.locale);
|
|
3000
|
-
hint.textContent = `${this.
|
|
3133
|
+
hint.textContent = `${this.messages.formatHint}: ${field.placeholder}`;
|
|
3001
3134
|
if (!field.input.hasAttribute("placeholder") || this._generatedPlaceholder) {
|
|
3002
3135
|
field.input.placeholder = field.placeholder;
|
|
3003
3136
|
this._generatedPlaceholder = true;
|
|
@@ -3014,7 +3147,7 @@
|
|
|
3014
3147
|
this._refreshRangeButtonLabel();
|
|
3015
3148
|
return;
|
|
3016
3149
|
}
|
|
3017
|
-
const prefix = this._value ? this.
|
|
3150
|
+
const prefix = this._value ? this.messages.changeDate : this.messages.chooseDate;
|
|
3018
3151
|
const suffix = this._value ? `, ${formatLongDate(this._value, this.locale)}` : "";
|
|
3019
3152
|
single.setAttribute("aria-label", `${prefix}${suffix}`);
|
|
3020
3153
|
}
|
|
@@ -3024,9 +3157,9 @@
|
|
|
3024
3157
|
const { start, end } = this._range;
|
|
3025
3158
|
for (const { button, endpoint } of this._buttons) {
|
|
3026
3159
|
const bound = endpoint === "end" ? end : start;
|
|
3027
|
-
const prefix = bound ? this.
|
|
3160
|
+
const prefix = bound ? this.messages.changeDate : this.messages.chooseDate;
|
|
3028
3161
|
const suffix = bound ? `, ${formatLongDate(bound, this.locale)}` : "";
|
|
3029
|
-
const boundLabel = endpoint === "end" ? this.
|
|
3162
|
+
const boundLabel = endpoint === "end" ? this.messages.rangeEnd : this.messages.rangeStart;
|
|
3030
3163
|
button.setAttribute("aria-label", `${prefix}${suffix}, ${boundLabel}`);
|
|
3031
3164
|
}
|
|
3032
3165
|
}
|
|
@@ -3073,7 +3206,7 @@
|
|
|
3073
3206
|
const confirmed = await calendar.ensureDate(date);
|
|
3074
3207
|
const state = calendar.getDateState(date);
|
|
3075
3208
|
if (!confirmed || state.disabled)
|
|
3076
|
-
return { ok: false, message: this.
|
|
3209
|
+
return { ok: false, message: this.messages.unavailableDate };
|
|
3077
3210
|
return { ok: true };
|
|
3078
3211
|
}
|
|
3079
3212
|
async _commitText(emit, options = {}) {
|
|
@@ -3189,7 +3322,7 @@
|
|
|
3189
3322
|
for (const bound of bounds) {
|
|
3190
3323
|
const index = bound === "end" ? 1 : 0;
|
|
3191
3324
|
const input = this._fields[index].input;
|
|
3192
|
-
const message = bound === "end" ? this.
|
|
3325
|
+
const message = bound === "end" ? this.messages.rangeOrderEnd : this.messages.rangeOrderStart;
|
|
3193
3326
|
const shouldHaveOrder = inverted && bound === which;
|
|
3194
3327
|
if (shouldHaveOrder) {
|
|
3195
3328
|
input.setCustomValidity(message);
|
|
@@ -3211,7 +3344,7 @@
|
|
|
3211
3344
|
const input = inputs[index];
|
|
3212
3345
|
if (!input)
|
|
3213
3346
|
continue;
|
|
3214
|
-
const message = bound === "end" ? this.
|
|
3347
|
+
const message = bound === "end" ? this.messages.rangeOrderEnd : this.messages.rangeOrderStart;
|
|
3215
3348
|
const shouldHaveOrder = inverted && bound === which;
|
|
3216
3349
|
if (shouldHaveOrder) {
|
|
3217
3350
|
input.setCustomValidity(message);
|