@api-client/ui 0.5.6 → 0.5.8
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/.cursor/rules/html-and-css-best-practices.mdc +63 -0
- package/.cursor/rules/lit-best-practices.mdc +78 -0
- package/.github/instructions/html-and-css-best-practices.instructions.md +70 -0
- package/.github/instructions/lit-best-practices.instructions.md +86 -0
- package/build/src/elements/currency/currency-picker.d.ts +10 -0
- package/build/src/elements/currency/currency-picker.d.ts.map +1 -0
- package/build/src/elements/currency/currency-picker.js +27 -0
- package/build/src/elements/currency/currency-picker.js.map +1 -0
- package/build/src/elements/currency/internals/Picker.d.ts +311 -0
- package/build/src/elements/currency/internals/Picker.d.ts.map +1 -0
- package/build/src/elements/currency/internals/Picker.js +857 -0
- package/build/src/elements/currency/internals/Picker.js.map +1 -0
- package/build/src/elements/currency/internals/Picker.styles.d.ts +3 -0
- package/build/src/elements/currency/internals/Picker.styles.d.ts.map +1 -0
- package/build/src/elements/currency/internals/Picker.styles.js +58 -0
- package/build/src/elements/currency/internals/Picker.styles.js.map +1 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.d.ts +216 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.d.ts.map +1 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.js +1037 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.js.map +1 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.d.ts +3 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.d.ts.map +1 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.js +274 -0
- package/build/src/elements/mention-textarea/internals/MentionTextArea.styles.js.map +1 -0
- package/build/src/elements/mention-textarea/ui-mention-textarea.d.ts +13 -0
- package/build/src/elements/mention-textarea/ui-mention-textarea.d.ts.map +1 -0
- package/build/src/elements/mention-textarea/ui-mention-textarea.js +28 -0
- package/build/src/elements/mention-textarea/ui-mention-textarea.js.map +1 -0
- package/build/src/md/button/internals/base.d.ts +1 -0
- package/build/src/md/button/internals/base.d.ts.map +1 -1
- package/build/src/md/button/internals/base.js +7 -0
- package/build/src/md/button/internals/base.js.map +1 -1
- package/build/src/md/chip/internals/Chip.styles.d.ts.map +1 -1
- package/build/src/md/chip/internals/Chip.styles.js +2 -0
- package/build/src/md/chip/internals/Chip.styles.js.map +1 -1
- package/build/src/md/date-picker/internals/DatePicker.styles.d.ts.map +1 -1
- package/build/src/md/date-picker/internals/DatePicker.styles.js +73 -0
- package/build/src/md/date-picker/internals/DatePicker.styles.js.map +1 -1
- package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts +164 -51
- package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts.map +1 -1
- package/build/src/md/date-picker/internals/DatePickerCalendar.js +660 -368
- package/build/src/md/date-picker/internals/DatePickerCalendar.js.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-input.d.ts +65 -13
- package/build/src/md/date-picker/ui-date-picker-input.d.ts.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-input.js +143 -76
- package/build/src/md/date-picker/ui-date-picker-input.js.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts +76 -17
- package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-modal-input.js +192 -127
- package/build/src/md/date-picker/ui-date-picker-modal-input.js.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-modal.d.ts +63 -15
- package/build/src/md/date-picker/ui-date-picker-modal.d.ts.map +1 -1
- package/build/src/md/date-picker/ui-date-picker-modal.js +143 -64
- package/build/src/md/date-picker/ui-date-picker-modal.js.map +1 -1
- package/demo/elements/currency/index.html +91 -0
- package/demo/elements/currency/index.ts +272 -0
- package/demo/elements/index.html +6 -0
- package/demo/elements/mention-textarea/index.html +19 -0
- package/demo/elements/mention-textarea/index.ts +205 -0
- package/demo/md/date-picker/date-picker.ts +138 -103
- package/package.json +2 -2
- package/src/elements/currency/currency-picker.ts +14 -0
- package/src/elements/currency/internals/Picker.styles.ts +58 -0
- package/src/elements/currency/internals/Picker.ts +846 -0
- package/src/elements/mention-textarea/internals/MentionTextArea.styles.ts +274 -0
- package/src/elements/mention-textarea/internals/MentionTextArea.ts +1036 -0
- package/src/elements/mention-textarea/ui-mention-textarea.ts +18 -0
- package/src/md/button/internals/base.ts +7 -0
- package/src/md/chip/internals/Chip.styles.ts +2 -0
- package/src/md/date-picker/internals/DatePicker.styles.ts +73 -0
- package/src/md/date-picker/internals/DatePickerCalendar.ts +643 -309
- package/src/md/date-picker/ui-date-picker-input.ts +110 -49
- package/src/md/date-picker/ui-date-picker-modal-input.ts +168 -99
- package/src/md/date-picker/ui-date-picker-modal.ts +136 -53
- package/test/README.md +3 -2
- package/test/elements/currency/CurrencyPicker.accessibility.test.ts +328 -0
- package/test/elements/currency/CurrencyPicker.core.test.ts +318 -0
- package/test/elements/currency/CurrencyPicker.integration.test.ts +482 -0
- package/test/elements/currency/CurrencyPicker.test.ts +486 -0
- package/test/elements/mention-textarea/MentionTextArea.basic.test.ts +63 -0
- package/test/elements/mention-textarea/MentionTextArea.test.ts +321 -0
- package/tsconfig.json +1 -1
|
@@ -10,16 +10,63 @@ import '../../md/text-field/ui-outlined-text-field.js';
|
|
|
10
10
|
import '../../md/icons/ui-icon.js';
|
|
11
11
|
/**
|
|
12
12
|
* A modal date input picker for manual date entry using keyboard.
|
|
13
|
-
* Ideal for compact layouts and precise date entry.
|
|
13
|
+
* Ideal for compact layouts and precise date entry. Supports both single
|
|
14
|
+
* date selection and date range selection modes.
|
|
15
|
+
*
|
|
16
|
+
* ## Features
|
|
17
|
+
* - Manual date entry with keyboard input
|
|
18
|
+
* - Single date and date range modes
|
|
19
|
+
* - Input validation with error messages
|
|
20
|
+
* - Min/max date constraints
|
|
21
|
+
* - Multiple date format support (MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD)
|
|
22
|
+
* - Accessible design with proper ARIA labels and semantic HTML
|
|
23
|
+
* - Real-time validation feedback
|
|
24
|
+
*
|
|
25
|
+
* ## Events
|
|
26
|
+
*
|
|
27
|
+
* ### `date-input-change`
|
|
28
|
+
* Fired when a valid date is entered in the input fields.
|
|
29
|
+
*
|
|
30
|
+
* **Detail for range mode:**
|
|
31
|
+
* ```typescript
|
|
32
|
+
* {
|
|
33
|
+
* range: DateRange,
|
|
34
|
+
* formattedRange: {
|
|
35
|
+
* start: string | null,
|
|
36
|
+
* end: string | null
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* **Detail for single date mode:**
|
|
42
|
+
* ```typescript
|
|
43
|
+
* {
|
|
44
|
+
* date: Date,
|
|
45
|
+
* formattedDate: string
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* ### `modal-input-close`
|
|
50
|
+
* Fired when the modal is closed, either by confirmation or cancellation.
|
|
51
|
+
*
|
|
52
|
+
* **Detail:**
|
|
53
|
+
* ```typescript
|
|
54
|
+
* {
|
|
55
|
+
* confirmed: boolean,
|
|
56
|
+
* date?: Date | null, // Available in single date mode
|
|
57
|
+
* range?: DateRange | null // Available in range mode
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
14
60
|
*
|
|
15
61
|
* ## Usage
|
|
16
62
|
*
|
|
63
|
+
* ### Range mode (default)
|
|
17
64
|
* ```html
|
|
18
65
|
* <ui-date-picker-modal-input
|
|
19
66
|
* .open=${true}
|
|
20
67
|
* .selectedRange=${{ start: new Date(), end: null }}
|
|
21
68
|
* @date-input-change=${this.handleRangeChange}
|
|
22
|
-
* @close=${this.handleClose}
|
|
69
|
+
* @modal-input-close=${this.handleClose}
|
|
23
70
|
* ></ui-date-picker-modal-input>
|
|
24
71
|
* ```
|
|
25
72
|
*
|
|
@@ -28,6 +75,17 @@ import '../../md/icons/ui-icon.js';
|
|
|
28
75
|
* <ui-date-picker-modal-input
|
|
29
76
|
* .rangeMode=${false}
|
|
30
77
|
* .selectedDate=${new Date()}
|
|
78
|
+
* @date-input-change=${this.handleDateChange}
|
|
79
|
+
* @modal-input-close=${this.handleClose}
|
|
80
|
+
* ></ui-date-picker-modal-input>
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* ### With constraints
|
|
84
|
+
* ```html
|
|
85
|
+
* <ui-date-picker-modal-input
|
|
86
|
+
* .minDate=${new Date('2024-01-01')}
|
|
87
|
+
* .maxDate=${new Date('2024-12-31')}
|
|
88
|
+
* .locale=${'en-US'}
|
|
31
89
|
* ></ui-date-picker-modal-input>
|
|
32
90
|
* ```
|
|
33
91
|
*/
|
|
@@ -70,18 +128,18 @@ let UiDatePickerModalInput = (() => {
|
|
|
70
128
|
let _locale_decorators;
|
|
71
129
|
let _locale_initializers = [];
|
|
72
130
|
let _locale_extraInitializers = [];
|
|
73
|
-
let
|
|
74
|
-
let
|
|
75
|
-
let
|
|
76
|
-
let
|
|
77
|
-
let
|
|
78
|
-
let
|
|
79
|
-
let
|
|
80
|
-
let
|
|
81
|
-
let
|
|
82
|
-
let
|
|
83
|
-
let
|
|
84
|
-
let
|
|
131
|
+
let _startInput_decorators;
|
|
132
|
+
let _startInput_initializers = [];
|
|
133
|
+
let _startInput_extraInitializers = [];
|
|
134
|
+
let _endInput_decorators;
|
|
135
|
+
let _endInput_initializers = [];
|
|
136
|
+
let _endInput_extraInitializers = [];
|
|
137
|
+
let _startError_decorators;
|
|
138
|
+
let _startError_initializers = [];
|
|
139
|
+
let _startError_extraInitializers = [];
|
|
140
|
+
let _endError_decorators;
|
|
141
|
+
let _endError_initializers = [];
|
|
142
|
+
let _endError_extraInitializers = [];
|
|
85
143
|
var UiDatePickerModalInput = class extends _classSuper {
|
|
86
144
|
static { _classThis = this; }
|
|
87
145
|
static {
|
|
@@ -97,10 +155,10 @@ let UiDatePickerModalInput = (() => {
|
|
|
97
155
|
_minDate_decorators = [property({ type: Object })];
|
|
98
156
|
_maxDate_decorators = [property({ type: Object })];
|
|
99
157
|
_locale_decorators = [property({ type: String })];
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
158
|
+
_startInput_decorators = [state()];
|
|
159
|
+
_endInput_decorators = [state()];
|
|
160
|
+
_startError_decorators = [state()];
|
|
161
|
+
_endError_decorators = [state()];
|
|
104
162
|
__esDecorate(this, null, _open_decorators, { kind: "accessor", name: "open", static: false, private: false, access: { has: obj => "open" in obj, get: obj => obj.open, set: (obj, value) => { obj.open = value; } }, metadata: _metadata }, _open_initializers, _open_extraInitializers);
|
|
105
163
|
__esDecorate(this, null, _title_decorators, { kind: "accessor", name: "title", static: false, private: false, access: { has: obj => "title" in obj, get: obj => obj.title, set: (obj, value) => { obj.title = value; } }, metadata: _metadata }, _title_initializers, _title_extraInitializers);
|
|
106
164
|
__esDecorate(this, null, _rangeMode_decorators, { kind: "accessor", name: "rangeMode", static: false, private: false, access: { has: obj => "rangeMode" in obj, get: obj => obj.rangeMode, set: (obj, value) => { obj.rangeMode = value; } }, metadata: _metadata }, _rangeMode_initializers, _rangeMode_extraInitializers);
|
|
@@ -112,10 +170,10 @@ let UiDatePickerModalInput = (() => {
|
|
|
112
170
|
__esDecorate(this, null, _minDate_decorators, { kind: "accessor", name: "minDate", static: false, private: false, access: { has: obj => "minDate" in obj, get: obj => obj.minDate, set: (obj, value) => { obj.minDate = value; } }, metadata: _metadata }, _minDate_initializers, _minDate_extraInitializers);
|
|
113
171
|
__esDecorate(this, null, _maxDate_decorators, { kind: "accessor", name: "maxDate", static: false, private: false, access: { has: obj => "maxDate" in obj, get: obj => obj.maxDate, set: (obj, value) => { obj.maxDate = value; } }, metadata: _metadata }, _maxDate_initializers, _maxDate_extraInitializers);
|
|
114
172
|
__esDecorate(this, null, _locale_decorators, { kind: "accessor", name: "locale", static: false, private: false, access: { has: obj => "locale" in obj, get: obj => obj.locale, set: (obj, value) => { obj.locale = value; } }, metadata: _metadata }, _locale_initializers, _locale_extraInitializers);
|
|
115
|
-
__esDecorate(this, null,
|
|
116
|
-
__esDecorate(this, null,
|
|
117
|
-
__esDecorate(this, null,
|
|
118
|
-
__esDecorate(this, null,
|
|
173
|
+
__esDecorate(this, null, _startInput_decorators, { kind: "accessor", name: "startInput", static: false, private: false, access: { has: obj => "startInput" in obj, get: obj => obj.startInput, set: (obj, value) => { obj.startInput = value; } }, metadata: _metadata }, _startInput_initializers, _startInput_extraInitializers);
|
|
174
|
+
__esDecorate(this, null, _endInput_decorators, { kind: "accessor", name: "endInput", static: false, private: false, access: { has: obj => "endInput" in obj, get: obj => obj.endInput, set: (obj, value) => { obj.endInput = value; } }, metadata: _metadata }, _endInput_initializers, _endInput_extraInitializers);
|
|
175
|
+
__esDecorate(this, null, _startError_decorators, { kind: "accessor", name: "startError", static: false, private: false, access: { has: obj => "startError" in obj, get: obj => obj.startError, set: (obj, value) => { obj.startError = value; } }, metadata: _metadata }, _startError_initializers, _startError_extraInitializers);
|
|
176
|
+
__esDecorate(this, null, _endError_decorators, { kind: "accessor", name: "endError", static: false, private: false, access: { has: obj => "endError" in obj, get: obj => obj.endError, set: (obj, value) => { obj.endError = value; } }, metadata: _metadata }, _endError_initializers, _endError_extraInitializers);
|
|
119
177
|
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
120
178
|
UiDatePickerModalInput = _classThis = _classDescriptor.value;
|
|
121
179
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
@@ -141,7 +199,7 @@ let UiDatePickerModalInput = (() => {
|
|
|
141
199
|
*/
|
|
142
200
|
get title() { return this.#title_accessor_storage; }
|
|
143
201
|
set title(value) { this.#title_accessor_storage = value; }
|
|
144
|
-
#rangeMode_accessor_storage = (__runInitializers(this, _title_extraInitializers), __runInitializers(this, _rangeMode_initializers,
|
|
202
|
+
#rangeMode_accessor_storage = (__runInitializers(this, _title_extraInitializers), __runInitializers(this, _rangeMode_initializers, false
|
|
145
203
|
/**
|
|
146
204
|
* Label for the start date (or single date)
|
|
147
205
|
*/
|
|
@@ -227,37 +285,44 @@ let UiDatePickerModalInput = (() => {
|
|
|
227
285
|
*/
|
|
228
286
|
get locale() { return this.#locale_accessor_storage; }
|
|
229
287
|
set locale(value) { this.#locale_accessor_storage = value; }
|
|
230
|
-
#
|
|
231
|
-
get
|
|
232
|
-
set
|
|
233
|
-
#
|
|
234
|
-
get
|
|
235
|
-
set
|
|
236
|
-
#
|
|
237
|
-
get
|
|
238
|
-
set
|
|
239
|
-
#
|
|
240
|
-
get
|
|
241
|
-
set
|
|
288
|
+
#startInput_accessor_storage = (__runInitializers(this, _locale_extraInitializers), __runInitializers(this, _startInput_initializers, ''));
|
|
289
|
+
get startInput() { return this.#startInput_accessor_storage; }
|
|
290
|
+
set startInput(value) { this.#startInput_accessor_storage = value; }
|
|
291
|
+
#endInput_accessor_storage = (__runInitializers(this, _startInput_extraInitializers), __runInitializers(this, _endInput_initializers, ''));
|
|
292
|
+
get endInput() { return this.#endInput_accessor_storage; }
|
|
293
|
+
set endInput(value) { this.#endInput_accessor_storage = value; }
|
|
294
|
+
#startError_accessor_storage = (__runInitializers(this, _endInput_extraInitializers), __runInitializers(this, _startError_initializers, ''));
|
|
295
|
+
get startError() { return this.#startError_accessor_storage; }
|
|
296
|
+
set startError(value) { this.#startError_accessor_storage = value; }
|
|
297
|
+
#endError_accessor_storage = (__runInitializers(this, _startError_extraInitializers), __runInitializers(this, _endError_initializers, ''));
|
|
298
|
+
get endError() { return this.#endError_accessor_storage; }
|
|
299
|
+
set endError(value) { this.#endError_accessor_storage = value; }
|
|
300
|
+
constructor() {
|
|
301
|
+
super();
|
|
302
|
+
__runInitializers(this, _endError_extraInitializers);
|
|
303
|
+
// Initialize boolean properties to false first, then set intended defaults
|
|
304
|
+
this.open = false;
|
|
305
|
+
this.rangeMode = true; // Default to range mode as documented
|
|
306
|
+
}
|
|
242
307
|
connectedCallback() {
|
|
243
308
|
super.connectedCallback();
|
|
244
|
-
this.
|
|
309
|
+
this.updateInputValues();
|
|
245
310
|
}
|
|
246
311
|
willUpdate(changedProperties) {
|
|
247
312
|
if (changedProperties.has('selectedDate') || changedProperties.has('selectedRange')) {
|
|
248
|
-
this.
|
|
313
|
+
this.updateInputValues();
|
|
249
314
|
}
|
|
250
315
|
}
|
|
251
|
-
|
|
316
|
+
updateInputValues() {
|
|
252
317
|
if (this.rangeMode && this.selectedRange) {
|
|
253
|
-
this.
|
|
254
|
-
this.
|
|
318
|
+
this.startInput = this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : '';
|
|
319
|
+
this.endInput = this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : '';
|
|
255
320
|
}
|
|
256
321
|
else if (!this.rangeMode && this.selectedDate) {
|
|
257
|
-
this.
|
|
322
|
+
this.startInput = formatDate(this.selectedDate, this.locale);
|
|
258
323
|
}
|
|
259
324
|
}
|
|
260
|
-
|
|
325
|
+
validateDate(dateString, isEndDate = false) {
|
|
261
326
|
if (!dateString.trim())
|
|
262
327
|
return null;
|
|
263
328
|
const parsedDate = parseDate(dateString);
|
|
@@ -270,20 +335,20 @@ let UiDatePickerModalInput = (() => {
|
|
|
270
335
|
return null;
|
|
271
336
|
// For range mode, validate end date is after start date
|
|
272
337
|
if (this.rangeMode && isEndDate) {
|
|
273
|
-
const startDate = parseDate(this.
|
|
338
|
+
const startDate = parseDate(this.startInput);
|
|
274
339
|
if (startDate && parsedDate < startDate)
|
|
275
340
|
return null;
|
|
276
341
|
}
|
|
277
342
|
return parsedDate;
|
|
278
343
|
}
|
|
279
|
-
|
|
344
|
+
handleStartInput(event) {
|
|
280
345
|
const target = event.target;
|
|
281
|
-
this.
|
|
282
|
-
this.
|
|
283
|
-
if (this.
|
|
284
|
-
const date = this.
|
|
346
|
+
this.startInput = target.value;
|
|
347
|
+
this.startError = '';
|
|
348
|
+
if (this.startInput.trim()) {
|
|
349
|
+
const date = this.validateDate(this.startInput);
|
|
285
350
|
if (!date) {
|
|
286
|
-
this.
|
|
351
|
+
this.startError = 'Invalid date format or out of range';
|
|
287
352
|
return;
|
|
288
353
|
}
|
|
289
354
|
if (this.rangeMode) {
|
|
@@ -293,63 +358,63 @@ let UiDatePickerModalInput = (() => {
|
|
|
293
358
|
else {
|
|
294
359
|
this.selectedDate = date;
|
|
295
360
|
}
|
|
296
|
-
this.
|
|
361
|
+
this.dispatchChangeEvent();
|
|
297
362
|
}
|
|
298
363
|
}
|
|
299
|
-
|
|
364
|
+
handleEndInput(event) {
|
|
300
365
|
const target = event.target;
|
|
301
|
-
this.
|
|
302
|
-
this.
|
|
303
|
-
if (this.
|
|
304
|
-
const date = this.
|
|
366
|
+
this.endInput = target.value;
|
|
367
|
+
this.endError = '';
|
|
368
|
+
if (this.endInput.trim()) {
|
|
369
|
+
const date = this.validateDate(this.endInput, true);
|
|
305
370
|
if (!date) {
|
|
306
|
-
this.
|
|
371
|
+
this.endError = 'Invalid date format, out of range, or before start date';
|
|
307
372
|
return;
|
|
308
373
|
}
|
|
309
374
|
const currentRange = this.selectedRange || { start: null, end: null };
|
|
310
375
|
this.selectedRange = { ...currentRange, end: date };
|
|
311
|
-
this.
|
|
376
|
+
this.dispatchChangeEvent();
|
|
312
377
|
}
|
|
313
378
|
}
|
|
314
|
-
|
|
315
|
-
this.
|
|
379
|
+
handleCancel() {
|
|
380
|
+
this.dispatchCloseEvent(false);
|
|
316
381
|
}
|
|
317
|
-
|
|
382
|
+
handleConfirm() {
|
|
318
383
|
// Validate all inputs before confirming
|
|
319
384
|
let hasErrors = false;
|
|
320
385
|
if (this.rangeMode) {
|
|
321
|
-
if (!this.
|
|
322
|
-
this.
|
|
386
|
+
if (!this.startInput.trim()) {
|
|
387
|
+
this.startError = 'Start date is required';
|
|
323
388
|
hasErrors = true;
|
|
324
389
|
}
|
|
325
|
-
else if (!this.
|
|
326
|
-
this.
|
|
390
|
+
else if (!this.validateDate(this.startInput)) {
|
|
391
|
+
this.startError = 'Invalid start date';
|
|
327
392
|
hasErrors = true;
|
|
328
393
|
}
|
|
329
|
-
if (!this.
|
|
330
|
-
this.
|
|
394
|
+
if (!this.endInput.trim()) {
|
|
395
|
+
this.endError = 'End date is required';
|
|
331
396
|
hasErrors = true;
|
|
332
397
|
}
|
|
333
|
-
else if (!this.
|
|
334
|
-
this.
|
|
398
|
+
else if (!this.validateDate(this.endInput, true)) {
|
|
399
|
+
this.endError = 'Invalid end date';
|
|
335
400
|
hasErrors = true;
|
|
336
401
|
}
|
|
337
402
|
}
|
|
338
403
|
else {
|
|
339
|
-
if (!this.
|
|
340
|
-
this.
|
|
404
|
+
if (!this.startInput.trim()) {
|
|
405
|
+
this.startError = 'Date is required';
|
|
341
406
|
hasErrors = true;
|
|
342
407
|
}
|
|
343
|
-
else if (!this.
|
|
344
|
-
this.
|
|
408
|
+
else if (!this.validateDate(this.startInput)) {
|
|
409
|
+
this.startError = 'Invalid date';
|
|
345
410
|
hasErrors = true;
|
|
346
411
|
}
|
|
347
412
|
}
|
|
348
413
|
if (!hasErrors) {
|
|
349
|
-
this.
|
|
414
|
+
this.dispatchCloseEvent(true);
|
|
350
415
|
}
|
|
351
416
|
}
|
|
352
|
-
|
|
417
|
+
dispatchChangeEvent() {
|
|
353
418
|
if (this.rangeMode && this.selectedRange) {
|
|
354
419
|
const event = {
|
|
355
420
|
range: this.selectedRange,
|
|
@@ -375,7 +440,7 @@ let UiDatePickerModalInput = (() => {
|
|
|
375
440
|
}));
|
|
376
441
|
}
|
|
377
442
|
}
|
|
378
|
-
|
|
443
|
+
dispatchCloseEvent(confirmed) {
|
|
379
444
|
this.dispatchEvent(new CustomEvent('modal-input-close', {
|
|
380
445
|
detail: {
|
|
381
446
|
confirmed,
|
|
@@ -386,83 +451,83 @@ let UiDatePickerModalInput = (() => {
|
|
|
386
451
|
composed: true,
|
|
387
452
|
}));
|
|
388
453
|
}
|
|
389
|
-
|
|
454
|
+
renderHeader() {
|
|
390
455
|
return html `
|
|
391
|
-
<
|
|
392
|
-
<h2 class="modal-title">${this.title}</h2>
|
|
393
|
-
<ui-icon-button @click=${this.
|
|
456
|
+
<header class="modal-header">
|
|
457
|
+
<h2 id="modal-title" class="modal-title">${this.title}</h2>
|
|
458
|
+
<ui-icon-button @click=${this.handleCancel} aria-label="Close" title="Close">
|
|
394
459
|
<ui-icon icon="close"></ui-icon>
|
|
395
460
|
</ui-icon-button>
|
|
396
|
-
</
|
|
461
|
+
</header>
|
|
397
462
|
`;
|
|
398
463
|
}
|
|
399
|
-
|
|
464
|
+
renderInputs() {
|
|
400
465
|
return html `
|
|
401
|
-
<
|
|
402
|
-
<div
|
|
403
|
-
<
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
466
|
+
<main class="modal-content">
|
|
467
|
+
<div class="input-container" role="form" aria-labelledby="modal-title">
|
|
468
|
+
<fieldset>
|
|
469
|
+
<legend class="visually-hidden">${this.rangeMode ? 'Enter date range' : 'Enter date'}</legend>
|
|
470
|
+
|
|
471
|
+
<ui-outlined-text-field
|
|
472
|
+
.label=${this.rangeMode ? this.startLabel : 'Date'}
|
|
473
|
+
.placeholder=${this.placeholder}
|
|
474
|
+
.value=${this.startInput}
|
|
475
|
+
.invalidText=${this.startError}
|
|
476
|
+
?invalid=${!!this.startError}
|
|
477
|
+
@input=${this.handleStartInput}
|
|
478
|
+
required
|
|
479
|
+
aria-describedby="format-help"
|
|
480
|
+
>
|
|
481
|
+
<ui-icon slot="suffix" icon="calendarToday"></ui-icon>
|
|
482
|
+
</ui-outlined-text-field>
|
|
413
483
|
|
|
414
|
-
|
|
484
|
+
${this.rangeMode
|
|
415
485
|
? html `
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
486
|
+
<ui-outlined-text-field
|
|
487
|
+
.label=${this.endLabel}
|
|
488
|
+
.placeholder=${this.placeholder}
|
|
489
|
+
.value=${this.endInput}
|
|
490
|
+
.invalidText=${this.endError}
|
|
491
|
+
?invalid=${!!this.endError}
|
|
492
|
+
@input=${this.handleEndInput}
|
|
493
|
+
required
|
|
494
|
+
aria-describedby="format-help"
|
|
495
|
+
>
|
|
496
|
+
<ui-icon slot="suffix" icon="calendarToday"></ui-icon>
|
|
497
|
+
</ui-outlined-text-field>
|
|
498
|
+
`
|
|
427
499
|
: ''}
|
|
500
|
+
</fieldset>
|
|
428
501
|
|
|
429
|
-
<
|
|
430
|
-
|
|
431
|
-
>
|
|
432
|
-
<p style="margin: 0; font-size: 14px; color: var(--ui-color-on-surface-variant, #49454f);">
|
|
502
|
+
<aside id="format-help" class="format-help" role="note" aria-label="Date format information">
|
|
503
|
+
<p class="help-title">
|
|
433
504
|
<strong>Supported formats:</strong><br />
|
|
434
505
|
MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD
|
|
435
506
|
</p>
|
|
436
|
-
<p
|
|
437
|
-
|
|
438
|
-
</p>
|
|
439
|
-
</div>
|
|
507
|
+
<p class="help-examples"><strong>Examples:</strong> 12/25/2024, 12-25-2024, 2024-12-25</p>
|
|
508
|
+
</aside>
|
|
440
509
|
</div>
|
|
441
|
-
</
|
|
510
|
+
</main>
|
|
442
511
|
`;
|
|
443
512
|
}
|
|
444
|
-
|
|
513
|
+
renderActions() {
|
|
445
514
|
const hasValidInput = this.rangeMode
|
|
446
|
-
? this.
|
|
447
|
-
: this.
|
|
515
|
+
? this.startInput.trim() && this.endInput.trim() && !this.startError && !this.endError
|
|
516
|
+
: this.startInput.trim() && !this.startError;
|
|
448
517
|
return html `
|
|
449
|
-
<
|
|
450
|
-
<ui-button color="text" @click=${this.
|
|
451
|
-
<ui-button color="filled" @click=${this.
|
|
452
|
-
</
|
|
518
|
+
<footer class="modal-actions">
|
|
519
|
+
<ui-button color="text" @click=${this.handleCancel}>Cancel</ui-button>
|
|
520
|
+
<ui-button color="filled" @click=${this.handleConfirm} .disabled=${!hasValidInput}> Confirm </ui-button>
|
|
521
|
+
</footer>
|
|
453
522
|
`;
|
|
454
523
|
}
|
|
455
524
|
render() {
|
|
456
525
|
return html `
|
|
457
|
-
<ui-dialog .open=${this.open} @close=${this.
|
|
458
|
-
${this.
|
|
526
|
+
<ui-dialog .open=${this.open} @close=${this.handleCancel}>
|
|
527
|
+
${this.renderHeader()} ${this.renderInputs()} ${this.renderActions()}
|
|
459
528
|
</ui-dialog>
|
|
460
529
|
`;
|
|
461
530
|
}
|
|
462
|
-
constructor() {
|
|
463
|
-
super(...arguments);
|
|
464
|
-
__runInitializers(this, __endError_extraInitializers);
|
|
465
|
-
}
|
|
466
531
|
static {
|
|
467
532
|
__runInitializers(_classThis, _classExtraInitializers);
|
|
468
533
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-date-picker-modal-input.js","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-modal-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { modalStyles } from './internals/DatePicker.styles.js'\nimport { DateRange, formatDate, parseDate } from './internals/DatePickerUtils.js'\nimport '../../md/dialog/ui-dialog.js'\nimport '../../md/button/ui-button.js'\nimport '../../md/icon-button/ui-icon-button.js'\nimport '../../md/text-field/ui-outlined-text-field.js'\nimport '../../md/icons/ui-icon.js'\n\nexport interface ModalInputDatePickerChangeEvent {\n range: DateRange\n formattedRange: {\n start: string | null\n end: string | null\n }\n}\n\n/**\n * A modal date input picker for manual date entry using keyboard.\n * Ideal for compact layouts and precise date entry.\n *\n * ## Usage\n *\n * ```html\n * <ui-date-picker-modal-input\n * .open=${true}\n * .selectedRange=${{ start: new Date(), end: null }}\n * @date-input-change=${this.handleRangeChange}\n * @close=${this.handleClose}\n * ></ui-date-picker-modal-input>\n * ```\n *\n * ### Single date mode\n * ```html\n * <ui-date-picker-modal-input\n * .rangeMode=${false}\n * .selectedDate=${new Date()}\n * ></ui-date-picker-modal-input>\n * ```\n */\n@customElement('ui-date-picker-modal-input')\nexport class UiDatePickerModalInput extends LitElement {\n static override styles = modalStyles\n\n /**\n * Whether the modal is open\n */\n @property({ type: Boolean }) accessor open = false\n\n /**\n * The modal title\n */\n @property({ type: String }) override accessor title = 'Enter dates'\n\n /**\n * Whether to use range mode (two date inputs) or single date mode\n */\n @property({ type: Boolean }) accessor rangeMode = true\n\n /**\n * Label for the start date (or single date)\n */\n @property({ type: String }) accessor startLabel = 'Start date'\n\n /**\n * Label for the end date (only used in range mode)\n */\n @property({ type: String }) accessor endLabel = 'End date'\n\n /**\n * Placeholder for date inputs\n */\n @property({ type: String }) accessor placeholder = 'MM/DD/YYYY'\n\n /**\n * The selected date (single mode)\n */\n @property({ type: Object }) accessor selectedDate: Date | null = null\n\n /**\n * The selected date range (range mode)\n */\n @property({ type: Object }) accessor selectedRange: DateRange | null = null\n\n /**\n * Minimum selectable date\n */\n @property({ type: Object }) accessor minDate: Date | undefined = undefined\n\n /**\n * Maximum selectable date\n */\n @property({ type: Object }) accessor maxDate: Date | undefined = undefined\n\n /**\n * Locale for date formatting\n */\n @property({ type: String }) accessor locale: string | undefined = undefined\n\n @state() private accessor _startInput = ''\n\n @state() private accessor _endInput = ''\n\n @state() private accessor _startError = ''\n\n @state() private accessor _endError = ''\n\n override connectedCallback(): void {\n super.connectedCallback()\n this._updateInputValues()\n }\n\n override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('selectedDate') || changedProperties.has('selectedRange')) {\n this._updateInputValues()\n }\n }\n\n private _updateInputValues(): void {\n if (this.rangeMode && this.selectedRange) {\n this._startInput = this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : ''\n this._endInput = this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : ''\n } else if (!this.rangeMode && this.selectedDate) {\n this._startInput = formatDate(this.selectedDate, this.locale)\n }\n }\n\n private _validateDate(dateString: string, isEndDate = false): Date | null {\n if (!dateString.trim()) return null\n\n const parsedDate = parseDate(dateString)\n if (!parsedDate) return null\n\n // Check min/max constraints\n if (this.minDate && parsedDate < this.minDate) return null\n if (this.maxDate && parsedDate > this.maxDate) return null\n\n // For range mode, validate end date is after start date\n if (this.rangeMode && isEndDate) {\n const startDate = parseDate(this._startInput)\n if (startDate && parsedDate < startDate) return null\n }\n\n return parsedDate\n }\n\n private _handleStartInput(event: Event): void {\n const target = event.target as HTMLInputElement\n this._startInput = target.value\n this._startError = ''\n\n if (this._startInput.trim()) {\n const date = this._validateDate(this._startInput)\n if (!date) {\n this._startError = 'Invalid date format or out of range'\n return\n }\n\n if (this.rangeMode) {\n const currentRange = this.selectedRange || { start: null, end: null }\n this.selectedRange = { ...currentRange, start: date }\n } else {\n this.selectedDate = date\n }\n\n this._dispatchChangeEvent()\n }\n }\n\n private _handleEndInput(event: Event): void {\n const target = event.target as HTMLInputElement\n this._endInput = target.value\n this._endError = ''\n\n if (this._endInput.trim()) {\n const date = this._validateDate(this._endInput, true)\n if (!date) {\n this._endError = 'Invalid date format, out of range, or before start date'\n return\n }\n\n const currentRange = this.selectedRange || { start: null, end: null }\n this.selectedRange = { ...currentRange, end: date }\n this._dispatchChangeEvent()\n }\n }\n\n private _handleCancel(): void {\n this._dispatchCloseEvent(false)\n }\n\n private _handleConfirm(): void {\n // Validate all inputs before confirming\n let hasErrors = false\n\n if (this.rangeMode) {\n if (!this._startInput.trim()) {\n this._startError = 'Start date is required'\n hasErrors = true\n } else if (!this._validateDate(this._startInput)) {\n this._startError = 'Invalid start date'\n hasErrors = true\n }\n\n if (!this._endInput.trim()) {\n this._endError = 'End date is required'\n hasErrors = true\n } else if (!this._validateDate(this._endInput, true)) {\n this._endError = 'Invalid end date'\n hasErrors = true\n }\n } else {\n if (!this._startInput.trim()) {\n this._startError = 'Date is required'\n hasErrors = true\n } else if (!this._validateDate(this._startInput)) {\n this._startError = 'Invalid date'\n hasErrors = true\n }\n }\n\n if (!hasErrors) {\n this._dispatchCloseEvent(true)\n }\n }\n\n private _dispatchChangeEvent(): void {\n if (this.rangeMode && this.selectedRange) {\n const event: ModalInputDatePickerChangeEvent = {\n range: this.selectedRange,\n formattedRange: {\n start: this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : null,\n end: this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : null,\n },\n }\n\n this.dispatchEvent(\n new CustomEvent('date-input-change', {\n detail: event,\n bubbles: true,\n composed: true,\n })\n )\n } else if (!this.rangeMode && this.selectedDate) {\n this.dispatchEvent(\n new CustomEvent('date-input-change', {\n detail: {\n date: this.selectedDate,\n formattedDate: formatDate(this.selectedDate, this.locale),\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n }\n\n private _dispatchCloseEvent(confirmed: boolean): void {\n this.dispatchEvent(\n new CustomEvent('modal-input-close', {\n detail: {\n confirmed,\n date: confirmed && !this.rangeMode ? this.selectedDate : null,\n range: confirmed && this.rangeMode ? this.selectedRange : null,\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private _renderHeader(): TemplateResult {\n return html`\n <div class=\"modal-header\">\n <h2 class=\"modal-title\">${this.title}</h2>\n <ui-icon-button @click=${this._handleCancel} aria-label=\"Close\" title=\"Close\">\n <ui-icon icon=\"close\"></ui-icon>\n </ui-icon-button>\n </div>\n `\n }\n\n private _renderInputs(): TemplateResult {\n return html`\n <div class=\"modal-content\">\n <div style=\"display: flex; flex-direction: column; gap: 16px; width: 100%; max-width: 400px;\">\n <ui-outlined-text-field\n .label=${this.rangeMode ? this.startLabel : 'Date'}\n .placeholder=${this.placeholder}\n .value=${this._startInput}\n .errorMessage=${this._startError}\n .error=${!!this._startError}\n @input=${this._handleStartInput}\n >\n <ui-icon slot=\"trailing-icon\" icon=\"calendarToday\"></ui-icon>\n </ui-outlined-text-field>\n\n ${this.rangeMode\n ? html`\n <ui-outlined-text-field\n .label=${this.endLabel}\n .placeholder=${this.placeholder}\n .value=${this._endInput}\n .errorMessage=${this._endError}\n .error=${!!this._endError}\n @input=${this._handleEndInput}\n >\n <ui-icon slot=\"trailing-icon\" icon=\"calendarToday\"></ui-icon>\n </ui-outlined-text-field>\n `\n : ''}\n\n <div\n style=\"margin-top: 16px; padding: 16px; background: var(--ui-color-surface-variant, #e7e0ec); border-radius: 12px;\"\n >\n <p style=\"margin: 0; font-size: 14px; color: var(--ui-color-on-surface-variant, #49454f);\">\n <strong>Supported formats:</strong><br />\n MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD\n </p>\n <p style=\"margin: 8px 0 0; font-size: 14px; color: var(--ui-color-on-surface-variant, #49454f);\">\n <strong>Examples:</strong> 12/25/2024, 12-25-2024, 2024-12-25\n </p>\n </div>\n </div>\n </div>\n `\n }\n\n private _renderActions(): TemplateResult {\n const hasValidInput = this.rangeMode\n ? this._startInput.trim() && this._endInput.trim() && !this._startError && !this._endError\n : this._startInput.trim() && !this._startError\n\n return html`\n <div class=\"modal-actions\">\n <ui-button color=\"text\" @click=${this._handleCancel}>Cancel</ui-button>\n <ui-button color=\"filled\" @click=${this._handleConfirm} .disabled=${!hasValidInput}> Confirm </ui-button>\n </div>\n `\n }\n\n override render(): TemplateResult {\n return html`\n <ui-dialog .open=${this.open} @close=${this._handleCancel}>\n ${this._renderHeader()} ${this._renderInputs()} ${this._renderActions()}\n </ui-dialog>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-modal-input': UiDatePickerModalInput\n }\n\n interface HTMLElementEventMap {\n 'date-input-change': CustomEvent<\n | ModalInputDatePickerChangeEvent\n | {\n date: Date\n formattedDate: string\n }\n >\n 'modal-input-close': CustomEvent<{\n confirmed: boolean\n date?: Date | null\n range?: DateRange | null\n }>\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ui-date-picker-modal-input.js","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-modal-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { modalStyles } from './internals/DatePicker.styles.js'\nimport { DateRange, formatDate, parseDate } from './internals/DatePickerUtils.js'\nimport '../../md/dialog/ui-dialog.js'\nimport '../../md/button/ui-button.js'\nimport '../../md/icon-button/ui-icon-button.js'\nimport '../../md/text-field/ui-outlined-text-field.js'\nimport '../../md/icons/ui-icon.js'\n\nexport interface ModalInputDatePickerChangeEvent {\n range: DateRange\n formattedRange: {\n start: string | null\n end: string | null\n }\n}\n\n/**\n * A modal date input picker for manual date entry using keyboard.\n * Ideal for compact layouts and precise date entry. Supports both single\n * date selection and date range selection modes.\n *\n * ## Features\n * - Manual date entry with keyboard input\n * - Single date and date range modes\n * - Input validation with error messages\n * - Min/max date constraints\n * - Multiple date format support (MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD)\n * - Accessible design with proper ARIA labels and semantic HTML\n * - Real-time validation feedback\n *\n * ## Events\n *\n * ### `date-input-change`\n * Fired when a valid date is entered in the input fields.\n *\n * **Detail for range mode:**\n * ```typescript\n * {\n * range: DateRange,\n * formattedRange: {\n * start: string | null,\n * end: string | null\n * }\n * }\n * ```\n *\n * **Detail for single date mode:**\n * ```typescript\n * {\n * date: Date,\n * formattedDate: string\n * }\n * ```\n *\n * ### `modal-input-close`\n * Fired when the modal is closed, either by confirmation or cancellation.\n *\n * **Detail:**\n * ```typescript\n * {\n * confirmed: boolean,\n * date?: Date | null, // Available in single date mode\n * range?: DateRange | null // Available in range mode\n * }\n * ```\n *\n * ## Usage\n *\n * ### Range mode (default)\n * ```html\n * <ui-date-picker-modal-input\n * .open=${true}\n * .selectedRange=${{ start: new Date(), end: null }}\n * @date-input-change=${this.handleRangeChange}\n * @modal-input-close=${this.handleClose}\n * ></ui-date-picker-modal-input>\n * ```\n *\n * ### Single date mode\n * ```html\n * <ui-date-picker-modal-input\n * .rangeMode=${false}\n * .selectedDate=${new Date()}\n * @date-input-change=${this.handleDateChange}\n * @modal-input-close=${this.handleClose}\n * ></ui-date-picker-modal-input>\n * ```\n *\n * ### With constraints\n * ```html\n * <ui-date-picker-modal-input\n * .minDate=${new Date('2024-01-01')}\n * .maxDate=${new Date('2024-12-31')}\n * .locale=${'en-US'}\n * ></ui-date-picker-modal-input>\n * ```\n */\n@customElement('ui-date-picker-modal-input')\nexport class UiDatePickerModalInput extends LitElement {\n static override styles = modalStyles\n\n /**\n * Whether the modal is open\n */\n @property({ type: Boolean }) accessor open = false\n\n /**\n * The modal title\n */\n @property({ type: String }) override accessor title = 'Enter dates'\n\n /**\n * Whether to use range mode (two date inputs) or single date mode\n */\n @property({ type: Boolean }) accessor rangeMode = false\n\n /**\n * Label for the start date (or single date)\n */\n @property({ type: String }) accessor startLabel = 'Start date'\n\n /**\n * Label for the end date (only used in range mode)\n */\n @property({ type: String }) accessor endLabel = 'End date'\n\n /**\n * Placeholder for date inputs\n */\n @property({ type: String }) accessor placeholder = 'MM/DD/YYYY'\n\n /**\n * The selected date (single mode)\n */\n @property({ type: Object }) accessor selectedDate: Date | null = null\n\n /**\n * The selected date range (range mode)\n */\n @property({ type: Object }) accessor selectedRange: DateRange | null = null\n\n /**\n * Minimum selectable date\n */\n @property({ type: Object }) accessor minDate: Date | undefined = undefined\n\n /**\n * Maximum selectable date\n */\n @property({ type: Object }) accessor maxDate: Date | undefined = undefined\n\n /**\n * Locale for date formatting\n */\n @property({ type: String }) accessor locale: string | undefined = undefined\n\n @state() private accessor startInput = ''\n\n @state() private accessor endInput = ''\n\n @state() private accessor startError = ''\n\n @state() private accessor endError = ''\n\n constructor() {\n super()\n // Initialize boolean properties to false first, then set intended defaults\n this.open = false\n this.rangeMode = true // Default to range mode as documented\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.updateInputValues()\n }\n\n override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('selectedDate') || changedProperties.has('selectedRange')) {\n this.updateInputValues()\n }\n }\n\n private updateInputValues(): void {\n if (this.rangeMode && this.selectedRange) {\n this.startInput = this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : ''\n this.endInput = this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : ''\n } else if (!this.rangeMode && this.selectedDate) {\n this.startInput = formatDate(this.selectedDate, this.locale)\n }\n }\n\n private validateDate(dateString: string, isEndDate = false): Date | null {\n if (!dateString.trim()) return null\n\n const parsedDate = parseDate(dateString)\n if (!parsedDate) return null\n\n // Check min/max constraints\n if (this.minDate && parsedDate < this.minDate) return null\n if (this.maxDate && parsedDate > this.maxDate) return null\n\n // For range mode, validate end date is after start date\n if (this.rangeMode && isEndDate) {\n const startDate = parseDate(this.startInput)\n if (startDate && parsedDate < startDate) return null\n }\n\n return parsedDate\n }\n\n private handleStartInput(event: Event): void {\n const target = event.target as HTMLInputElement\n this.startInput = target.value\n this.startError = ''\n\n if (this.startInput.trim()) {\n const date = this.validateDate(this.startInput)\n if (!date) {\n this.startError = 'Invalid date format or out of range'\n return\n }\n\n if (this.rangeMode) {\n const currentRange = this.selectedRange || { start: null, end: null }\n this.selectedRange = { ...currentRange, start: date }\n } else {\n this.selectedDate = date\n }\n\n this.dispatchChangeEvent()\n }\n }\n\n private handleEndInput(event: Event): void {\n const target = event.target as HTMLInputElement\n this.endInput = target.value\n this.endError = ''\n\n if (this.endInput.trim()) {\n const date = this.validateDate(this.endInput, true)\n if (!date) {\n this.endError = 'Invalid date format, out of range, or before start date'\n return\n }\n\n const currentRange = this.selectedRange || { start: null, end: null }\n this.selectedRange = { ...currentRange, end: date }\n this.dispatchChangeEvent()\n }\n }\n\n private handleCancel(): void {\n this.dispatchCloseEvent(false)\n }\n\n private handleConfirm(): void {\n // Validate all inputs before confirming\n let hasErrors = false\n\n if (this.rangeMode) {\n if (!this.startInput.trim()) {\n this.startError = 'Start date is required'\n hasErrors = true\n } else if (!this.validateDate(this.startInput)) {\n this.startError = 'Invalid start date'\n hasErrors = true\n }\n\n if (!this.endInput.trim()) {\n this.endError = 'End date is required'\n hasErrors = true\n } else if (!this.validateDate(this.endInput, true)) {\n this.endError = 'Invalid end date'\n hasErrors = true\n }\n } else {\n if (!this.startInput.trim()) {\n this.startError = 'Date is required'\n hasErrors = true\n } else if (!this.validateDate(this.startInput)) {\n this.startError = 'Invalid date'\n hasErrors = true\n }\n }\n\n if (!hasErrors) {\n this.dispatchCloseEvent(true)\n }\n }\n\n private dispatchChangeEvent(): void {\n if (this.rangeMode && this.selectedRange) {\n const event: ModalInputDatePickerChangeEvent = {\n range: this.selectedRange,\n formattedRange: {\n start: this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : null,\n end: this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : null,\n },\n }\n\n this.dispatchEvent(\n new CustomEvent('date-input-change', {\n detail: event,\n bubbles: true,\n composed: true,\n })\n )\n } else if (!this.rangeMode && this.selectedDate) {\n this.dispatchEvent(\n new CustomEvent('date-input-change', {\n detail: {\n date: this.selectedDate,\n formattedDate: formatDate(this.selectedDate, this.locale),\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n }\n\n private dispatchCloseEvent(confirmed: boolean): void {\n this.dispatchEvent(\n new CustomEvent('modal-input-close', {\n detail: {\n confirmed,\n date: confirmed && !this.rangeMode ? this.selectedDate : null,\n range: confirmed && this.rangeMode ? this.selectedRange : null,\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private renderHeader(): TemplateResult {\n return html`\n <header class=\"modal-header\">\n <h2 id=\"modal-title\" class=\"modal-title\">${this.title}</h2>\n <ui-icon-button @click=${this.handleCancel} aria-label=\"Close\" title=\"Close\">\n <ui-icon icon=\"close\"></ui-icon>\n </ui-icon-button>\n </header>\n `\n }\n\n private renderInputs(): TemplateResult {\n return html`\n <main class=\"modal-content\">\n <div class=\"input-container\" role=\"form\" aria-labelledby=\"modal-title\">\n <fieldset>\n <legend class=\"visually-hidden\">${this.rangeMode ? 'Enter date range' : 'Enter date'}</legend>\n\n <ui-outlined-text-field\n .label=${this.rangeMode ? this.startLabel : 'Date'}\n .placeholder=${this.placeholder}\n .value=${this.startInput}\n .invalidText=${this.startError}\n ?invalid=${!!this.startError}\n @input=${this.handleStartInput}\n required\n aria-describedby=\"format-help\"\n >\n <ui-icon slot=\"suffix\" icon=\"calendarToday\"></ui-icon>\n </ui-outlined-text-field>\n\n ${this.rangeMode\n ? html`\n <ui-outlined-text-field\n .label=${this.endLabel}\n .placeholder=${this.placeholder}\n .value=${this.endInput}\n .invalidText=${this.endError}\n ?invalid=${!!this.endError}\n @input=${this.handleEndInput}\n required\n aria-describedby=\"format-help\"\n >\n <ui-icon slot=\"suffix\" icon=\"calendarToday\"></ui-icon>\n </ui-outlined-text-field>\n `\n : ''}\n </fieldset>\n\n <aside id=\"format-help\" class=\"format-help\" role=\"note\" aria-label=\"Date format information\">\n <p class=\"help-title\">\n <strong>Supported formats:</strong><br />\n MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD\n </p>\n <p class=\"help-examples\"><strong>Examples:</strong> 12/25/2024, 12-25-2024, 2024-12-25</p>\n </aside>\n </div>\n </main>\n `\n }\n\n private renderActions(): TemplateResult {\n const hasValidInput = this.rangeMode\n ? this.startInput.trim() && this.endInput.trim() && !this.startError && !this.endError\n : this.startInput.trim() && !this.startError\n\n return html`\n <footer class=\"modal-actions\">\n <ui-button color=\"text\" @click=${this.handleCancel}>Cancel</ui-button>\n <ui-button color=\"filled\" @click=${this.handleConfirm} .disabled=${!hasValidInput}> Confirm </ui-button>\n </footer>\n `\n }\n\n override render(): TemplateResult {\n return html`\n <ui-dialog .open=${this.open} @close=${this.handleCancel}>\n ${this.renderHeader()} ${this.renderInputs()} ${this.renderActions()}\n </ui-dialog>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-modal-input': UiDatePickerModalInput\n }\n\n interface HTMLElementEventMap {\n 'date-input-change': CustomEvent<\n | ModalInputDatePickerChangeEvent\n | {\n date: Date\n formattedDate: string\n }\n >\n 'modal-input-close': CustomEvent<{\n confirmed: boolean\n date?: Date | null\n range?: DateRange | null\n }>\n }\n}\n"]}
|