|
|
|
@@ -291,17 +291,28 @@ class TpDateInput extends EventHelpers(ControlState(FormElement(LitElement))) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const date = parse(i0 + '-' + i1 + '-' + i2, this._inputAssign.join('-'), new Date());
|
|
|
|
// Convert luxon format to match input assignment
|
|
|
|
|
|
|
|
const format = this._inputAssign.map(part => {
|
|
|
|
|
|
|
|
switch (part) {
|
|
|
|
|
|
|
|
case 'MM': return 'LL';
|
|
|
|
|
|
|
|
case 'dd': return 'dd';
|
|
|
|
|
|
|
|
case 'y': return 'yyyy';
|
|
|
|
|
|
|
|
default: return part;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}).join('-');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Parse the entered values as a plain calendar date, then store as UTC midnight.
|
|
|
|
|
|
|
|
// Date-only fields are timezone-agnostic — April 7 means April 7 for everyone.
|
|
|
|
|
|
|
|
const dt = DateTime.fromFormat(i0 + '-' + i1 + '-' + i2, format);
|
|
|
|
|
|
|
|
|
|
|
|
if (dt.isValid) {
|
|
|
|
if (dt.isValid) {
|
|
|
|
this.inputs[0].invalid = false;
|
|
|
|
this.inputs[0].invalid = false;
|
|
|
|
this.inputs[1].invalid = false;
|
|
|
|
this.inputs[1].invalid = false;
|
|
|
|
this.inputs[2].invalid = false;
|
|
|
|
this.inputs[2].invalid = false;
|
|
|
|
|
|
|
|
|
|
|
|
// Convert to specified timezone or use system timezone
|
|
|
|
const utcMidnight = DateTime.utc(dt.year, dt.month, dt.day);
|
|
|
|
const finalDt = this.timeZone ? dt.setZone(this.timeZone) : dt;
|
|
|
|
this.date = utcMidnight.toJSDate();
|
|
|
|
this.date = finalDt.toJSDate();
|
|
|
|
this.value = utcMidnight.toISO();
|
|
|
|
this.value = finalDt.toISO();
|
|
|
|
|
|
|
|
this.invalid = false;
|
|
|
|
this.invalid = false;
|
|
|
|
this.dispatchEvent(new CustomEvent('value-changed', { detail: this.value, bubbles: true, composed: true }));
|
|
|
|
this.dispatchEvent(new CustomEvent('value-changed', { detail: this.value, bubbles: true, composed: true }));
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
@@ -455,9 +466,10 @@ class TpDateInput extends EventHelpers(ControlState(FormElement(LitElement))) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const dt = this._toDateTime(this.value);
|
|
|
|
let dt = this._toDateTime(this.value);
|
|
|
|
if (dt && dt.isValid) {
|
|
|
|
if (dt && dt.isValid) {
|
|
|
|
// Convert luxon format parts to match display format
|
|
|
|
// Values are stored as UTC midnight — display the UTC calendar date as-is.
|
|
|
|
|
|
|
|
dt = dt.toUTC();
|
|
|
|
this._input0 = dt.toFormat(this._getLuxonFormat(this._inputAssign[0]));
|
|
|
|
this._input0 = dt.toFormat(this._getLuxonFormat(this._inputAssign[0]));
|
|
|
|
this._input1 = dt.toFormat(this._getLuxonFormat(this._inputAssign[1]));
|
|
|
|
this._input1 = dt.toFormat(this._getLuxonFormat(this._inputAssign[1]));
|
|
|
|
this._input2 = dt.toFormat(this._getLuxonFormat(this._inputAssign[2]));
|
|
|
|
this._input2 = dt.toFormat(this._getLuxonFormat(this._inputAssign[2]));
|
|
|
|
@@ -478,7 +490,8 @@ class TpDateInput extends EventHelpers(ControlState(FormElement(LitElement))) {
|
|
|
|
if (this.today) {
|
|
|
|
if (this.today) {
|
|
|
|
setTimeout(() => {
|
|
|
|
setTimeout(() => {
|
|
|
|
if (!this.value) {
|
|
|
|
if (!this.value) {
|
|
|
|
this.value = DateTime.now().toISO();
|
|
|
|
const now = DateTime.utc();
|
|
|
|
|
|
|
|
this.value = DateTime.utc(now.year, now.month, now.day).toISO();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -512,4 +525,4 @@ class TpDateInput extends EventHelpers(ControlState(FormElement(LitElement))) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
window.customElements.define('tp-date-input', TpDateInput);
|
|
|
|
window.customElements.define('tp-date-input', TpDateInput);
|