@api-client/ui 0.5.5 → 0.5.7
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/highlight/MarkdownStyles.d.ts.map +1 -1
- package/build/src/elements/highlight/MarkdownStyles.js +0 -13
- package/build/src/elements/highlight/MarkdownStyles.js.map +1 -1
- package/build/src/elements/http/BodyEditor.d.ts +0 -13
- package/build/src/elements/http/BodyEditor.d.ts.map +1 -1
- package/build/src/elements/http/BodyEditor.js +0 -13
- package/build/src/elements/http/BodyEditor.js.map +1 -1
- package/build/src/elements/http/BodyTextEditor.d.ts +0 -13
- package/build/src/elements/http/BodyTextEditor.d.ts.map +1 -1
- package/build/src/elements/http/BodyTextEditor.js +0 -13
- package/build/src/elements/http/BodyTextEditor.js.map +1 -1
- package/build/src/elements/http/BodyUrlEncodedEditor.d.ts +0 -13
- package/build/src/elements/http/BodyUrlEncodedEditor.d.ts.map +1 -1
- package/build/src/elements/http/BodyUrlEncodedEditor.js +0 -13
- package/build/src/elements/http/BodyUrlEncodedEditor.js.map +1 -1
- package/build/src/elements/http/UrlInput.d.ts +0 -13
- package/build/src/elements/http/UrlInput.d.ts.map +1 -1
- package/build/src/elements/http/UrlInput.js +0 -13
- package/build/src/elements/http/UrlInput.js.map +1 -1
- package/build/src/index.d.ts +2 -0
- package/build/src/index.d.ts.map +1 -1
- package/build/src/index.js +2 -0
- package/build/src/index.js.map +1 -1
- 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/button/internals/button.styles.js +1 -1
- package/build/src/md/button/internals/button.styles.js.map +1 -1
- package/build/src/md/date/internals/DateTime.d.ts +0 -13
- package/build/src/md/date/internals/DateTime.d.ts.map +1 -1
- package/build/src/md/date/internals/DateTime.js +0 -13
- package/build/src/md/date/internals/DateTime.js.map +1 -1
- package/build/src/md/date-picker/index.d.ts +13 -0
- package/build/src/md/date-picker/index.d.ts.map +1 -0
- package/build/src/md/date-picker/index.js +13 -0
- package/build/src/md/date-picker/index.js.map +1 -0
- package/build/src/md/date-picker/internals/DatePicker.styles.d.ts +4 -0
- package/build/src/md/date-picker/internals/DatePicker.styles.d.ts.map +1 -0
- package/build/src/md/date-picker/internals/DatePicker.styles.js +409 -0
- package/build/src/md/date-picker/internals/DatePicker.styles.js.map +1 -0
- package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts +272 -0
- package/build/src/md/date-picker/internals/DatePickerCalendar.d.ts.map +1 -0
- package/build/src/md/date-picker/internals/DatePickerCalendar.js +1062 -0
- package/build/src/md/date-picker/internals/DatePickerCalendar.js.map +1 -0
- package/build/src/md/date-picker/internals/DatePickerUtils.d.ts +93 -0
- package/build/src/md/date-picker/internals/DatePickerUtils.d.ts.map +1 -0
- package/build/src/md/date-picker/internals/DatePickerUtils.js +221 -0
- package/build/src/md/date-picker/internals/DatePickerUtils.js.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-input.d.ts +160 -0
- package/build/src/md/date-picker/ui-date-picker-input.d.ts.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-input.js +464 -0
- package/build/src/md/date-picker/ui-date-picker-input.js.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts +178 -0
- package/build/src/md/date-picker/ui-date-picker-modal-input.d.ts.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-modal-input.js +538 -0
- package/build/src/md/date-picker/ui-date-picker-modal-input.js.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-modal.d.ts +156 -0
- package/build/src/md/date-picker/ui-date-picker-modal.d.ts.map +1 -0
- package/build/src/md/date-picker/ui-date-picker-modal.js +423 -0
- package/build/src/md/date-picker/ui-date-picker-modal.js.map +1 -0
- package/build/src/md/dialog/internals/Dialog.styles.d.ts.map +1 -1
- package/build/src/md/dialog/internals/Dialog.styles.js +1 -0
- package/build/src/md/dialog/internals/Dialog.styles.js.map +1 -1
- package/demo/elements/currency/index.html +91 -0
- package/demo/elements/currency/index.ts +272 -0
- package/demo/elements/har/har2.json +1 -1
- package/demo/elements/index.html +3 -0
- package/demo/md/date-picker/date-picker.ts +336 -0
- package/demo/md/date-picker/index.html +171 -0
- package/demo/md/index.html +2 -0
- package/package.json +1 -1
- 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/highlight/MarkdownStyles.ts +0 -13
- package/src/elements/http/BodyEditor.ts +0 -13
- package/src/elements/http/BodyTextEditor.ts +0 -13
- package/src/elements/http/BodyUrlEncodedEditor.ts +0 -13
- package/src/elements/http/UrlInput.ts +0 -13
- package/src/index.ts +17 -0
- package/src/md/button/internals/base.ts +7 -0
- package/src/md/button/internals/button.styles.ts +1 -1
- package/src/md/date/internals/DateTime.ts +0 -14
- package/src/md/date-picker/README.md +184 -0
- package/src/md/date-picker/index.ts +17 -0
- package/src/md/date-picker/internals/DatePicker.styles.ts +411 -0
- package/src/md/date-picker/internals/DatePickerCalendar.ts +1031 -0
- package/src/md/date-picker/internals/DatePickerUtils.ts +288 -0
- package/src/md/date-picker/ui-date-picker-input.ts +333 -0
- package/src/md/date-picker/ui-date-picker-modal-input.ts +440 -0
- package/src/md/date-picker/ui-date-picker-modal.ts +346 -0
- package/src/md/dialog/internals/Dialog.styles.ts +1 -0
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-date-picker-modal-input.d.ts","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-modal-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,cAAc,EAAE,MAAM,KAAK,CAAA;AAGtD,OAAO,EAAE,SAAS,EAAyB,MAAM,gCAAgC,CAAA;AACjF,OAAO,8BAA8B,CAAA;AACrC,OAAO,8BAA8B,CAAA;AACrC,OAAO,wCAAwC,CAAA;AAC/C,OAAO,+CAA+C,CAAA;AACtD,OAAO,2BAA2B,CAAA;AAElC,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,SAAS,CAAA;IAChB,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KACnB,CAAA;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFG;AACH,qBACa,sBAAuB,SAAQ,UAAU;IACpD,OAAgB,MAAM,0BAAc;IAEpC;;OAEG;IAC0B,QAAQ,CAAC,IAAI,UAAQ;IAElD;;OAEG;IACH,SAA8C,KAAK,SAAgB;IAEnE;;OAEG;IAC0B,QAAQ,CAAC,SAAS,UAAQ;IAEvD;;OAEG;IACyB,QAAQ,CAAC,UAAU,SAAe;IAE9D;;OAEG;IACyB,QAAQ,CAAC,QAAQ,SAAa;IAE1D;;OAEG;IACyB,QAAQ,CAAC,WAAW,SAAe;IAE/D;;OAEG;IACyB,QAAQ,CAAC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAO;IAErE;;OAEG;IACyB,QAAQ,CAAC,aAAa,EAAE,SAAS,GAAG,IAAI,CAAO;IAE3E;;OAEG;IACyB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAY;IAE1E;;OAEG;IACyB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAY;IAE1E;;OAEG;IACyB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAY;IAElE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAK;IAEhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAK;IAE9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAK;IAEhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAK;;IAS9B,iBAAiB,IAAI,IAAI;IAKzB,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMpF,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,YAAY;IAkDpB,OAAO,CAAC,aAAa;IAaZ,MAAM,IAAI,cAAc;CAOlC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,4BAA4B,EAAE,sBAAsB,CAAA;KACrD;IAED,UAAU,mBAAmB;QAC3B,mBAAmB,EAAE,WAAW,CAC5B,+BAA+B,GAC/B;YACE,IAAI,EAAE,IAAI,CAAA;YACV,aAAa,EAAE,MAAM,CAAA;SACtB,CACJ,CAAA;QACD,mBAAmB,EAAE,WAAW,CAAC;YAC/B,SAAS,EAAE,OAAO,CAAA;YAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;YAClB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;SACzB,CAAC,CAAA;KACH;CACF"}
|
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
+
import { LitElement, html } from 'lit';
|
|
3
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
|
4
|
+
import { modalStyles } from './internals/DatePicker.styles.js';
|
|
5
|
+
import { formatDate, parseDate } from './internals/DatePickerUtils.js';
|
|
6
|
+
import '../../md/dialog/ui-dialog.js';
|
|
7
|
+
import '../../md/button/ui-button.js';
|
|
8
|
+
import '../../md/icon-button/ui-icon-button.js';
|
|
9
|
+
import '../../md/text-field/ui-outlined-text-field.js';
|
|
10
|
+
import '../../md/icons/ui-icon.js';
|
|
11
|
+
/**
|
|
12
|
+
* A modal date input picker for manual date entry using keyboard.
|
|
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
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* ## Usage
|
|
62
|
+
*
|
|
63
|
+
* ### Range mode (default)
|
|
64
|
+
* ```html
|
|
65
|
+
* <ui-date-picker-modal-input
|
|
66
|
+
* .open=${true}
|
|
67
|
+
* .selectedRange=${{ start: new Date(), end: null }}
|
|
68
|
+
* @date-input-change=${this.handleRangeChange}
|
|
69
|
+
* @modal-input-close=${this.handleClose}
|
|
70
|
+
* ></ui-date-picker-modal-input>
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* ### Single date mode
|
|
74
|
+
* ```html
|
|
75
|
+
* <ui-date-picker-modal-input
|
|
76
|
+
* .rangeMode=${false}
|
|
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'}
|
|
89
|
+
* ></ui-date-picker-modal-input>
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
let UiDatePickerModalInput = (() => {
|
|
93
|
+
let _classDecorators = [customElement('ui-date-picker-modal-input')];
|
|
94
|
+
let _classDescriptor;
|
|
95
|
+
let _classExtraInitializers = [];
|
|
96
|
+
let _classThis;
|
|
97
|
+
let _classSuper = LitElement;
|
|
98
|
+
let _open_decorators;
|
|
99
|
+
let _open_initializers = [];
|
|
100
|
+
let _open_extraInitializers = [];
|
|
101
|
+
let _title_decorators;
|
|
102
|
+
let _title_initializers = [];
|
|
103
|
+
let _title_extraInitializers = [];
|
|
104
|
+
let _rangeMode_decorators;
|
|
105
|
+
let _rangeMode_initializers = [];
|
|
106
|
+
let _rangeMode_extraInitializers = [];
|
|
107
|
+
let _startLabel_decorators;
|
|
108
|
+
let _startLabel_initializers = [];
|
|
109
|
+
let _startLabel_extraInitializers = [];
|
|
110
|
+
let _endLabel_decorators;
|
|
111
|
+
let _endLabel_initializers = [];
|
|
112
|
+
let _endLabel_extraInitializers = [];
|
|
113
|
+
let _placeholder_decorators;
|
|
114
|
+
let _placeholder_initializers = [];
|
|
115
|
+
let _placeholder_extraInitializers = [];
|
|
116
|
+
let _selectedDate_decorators;
|
|
117
|
+
let _selectedDate_initializers = [];
|
|
118
|
+
let _selectedDate_extraInitializers = [];
|
|
119
|
+
let _selectedRange_decorators;
|
|
120
|
+
let _selectedRange_initializers = [];
|
|
121
|
+
let _selectedRange_extraInitializers = [];
|
|
122
|
+
let _minDate_decorators;
|
|
123
|
+
let _minDate_initializers = [];
|
|
124
|
+
let _minDate_extraInitializers = [];
|
|
125
|
+
let _maxDate_decorators;
|
|
126
|
+
let _maxDate_initializers = [];
|
|
127
|
+
let _maxDate_extraInitializers = [];
|
|
128
|
+
let _locale_decorators;
|
|
129
|
+
let _locale_initializers = [];
|
|
130
|
+
let _locale_extraInitializers = [];
|
|
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 = [];
|
|
143
|
+
var UiDatePickerModalInput = class extends _classSuper {
|
|
144
|
+
static { _classThis = this; }
|
|
145
|
+
static {
|
|
146
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
147
|
+
_open_decorators = [property({ type: Boolean })];
|
|
148
|
+
_title_decorators = [property({ type: String })];
|
|
149
|
+
_rangeMode_decorators = [property({ type: Boolean })];
|
|
150
|
+
_startLabel_decorators = [property({ type: String })];
|
|
151
|
+
_endLabel_decorators = [property({ type: String })];
|
|
152
|
+
_placeholder_decorators = [property({ type: String })];
|
|
153
|
+
_selectedDate_decorators = [property({ type: Object })];
|
|
154
|
+
_selectedRange_decorators = [property({ type: Object })];
|
|
155
|
+
_minDate_decorators = [property({ type: Object })];
|
|
156
|
+
_maxDate_decorators = [property({ type: Object })];
|
|
157
|
+
_locale_decorators = [property({ type: String })];
|
|
158
|
+
_startInput_decorators = [state()];
|
|
159
|
+
_endInput_decorators = [state()];
|
|
160
|
+
_startError_decorators = [state()];
|
|
161
|
+
_endError_decorators = [state()];
|
|
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);
|
|
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);
|
|
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);
|
|
165
|
+
__esDecorate(this, null, _startLabel_decorators, { kind: "accessor", name: "startLabel", static: false, private: false, access: { has: obj => "startLabel" in obj, get: obj => obj.startLabel, set: (obj, value) => { obj.startLabel = value; } }, metadata: _metadata }, _startLabel_initializers, _startLabel_extraInitializers);
|
|
166
|
+
__esDecorate(this, null, _endLabel_decorators, { kind: "accessor", name: "endLabel", static: false, private: false, access: { has: obj => "endLabel" in obj, get: obj => obj.endLabel, set: (obj, value) => { obj.endLabel = value; } }, metadata: _metadata }, _endLabel_initializers, _endLabel_extraInitializers);
|
|
167
|
+
__esDecorate(this, null, _placeholder_decorators, { kind: "accessor", name: "placeholder", static: false, private: false, access: { has: obj => "placeholder" in obj, get: obj => obj.placeholder, set: (obj, value) => { obj.placeholder = value; } }, metadata: _metadata }, _placeholder_initializers, _placeholder_extraInitializers);
|
|
168
|
+
__esDecorate(this, null, _selectedDate_decorators, { kind: "accessor", name: "selectedDate", static: false, private: false, access: { has: obj => "selectedDate" in obj, get: obj => obj.selectedDate, set: (obj, value) => { obj.selectedDate = value; } }, metadata: _metadata }, _selectedDate_initializers, _selectedDate_extraInitializers);
|
|
169
|
+
__esDecorate(this, null, _selectedRange_decorators, { kind: "accessor", name: "selectedRange", static: false, private: false, access: { has: obj => "selectedRange" in obj, get: obj => obj.selectedRange, set: (obj, value) => { obj.selectedRange = value; } }, metadata: _metadata }, _selectedRange_initializers, _selectedRange_extraInitializers);
|
|
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);
|
|
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);
|
|
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);
|
|
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);
|
|
177
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
178
|
+
UiDatePickerModalInput = _classThis = _classDescriptor.value;
|
|
179
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
180
|
+
}
|
|
181
|
+
static styles = modalStyles;
|
|
182
|
+
#open_accessor_storage = __runInitializers(this, _open_initializers, false
|
|
183
|
+
/**
|
|
184
|
+
* The modal title
|
|
185
|
+
*/
|
|
186
|
+
);
|
|
187
|
+
/**
|
|
188
|
+
* Whether the modal is open
|
|
189
|
+
*/
|
|
190
|
+
get open() { return this.#open_accessor_storage; }
|
|
191
|
+
set open(value) { this.#open_accessor_storage = value; }
|
|
192
|
+
#title_accessor_storage = (__runInitializers(this, _open_extraInitializers), __runInitializers(this, _title_initializers, 'Enter dates'
|
|
193
|
+
/**
|
|
194
|
+
* Whether to use range mode (two date inputs) or single date mode
|
|
195
|
+
*/
|
|
196
|
+
));
|
|
197
|
+
/**
|
|
198
|
+
* The modal title
|
|
199
|
+
*/
|
|
200
|
+
get title() { return this.#title_accessor_storage; }
|
|
201
|
+
set title(value) { this.#title_accessor_storage = value; }
|
|
202
|
+
#rangeMode_accessor_storage = (__runInitializers(this, _title_extraInitializers), __runInitializers(this, _rangeMode_initializers, false
|
|
203
|
+
/**
|
|
204
|
+
* Label for the start date (or single date)
|
|
205
|
+
*/
|
|
206
|
+
));
|
|
207
|
+
/**
|
|
208
|
+
* Whether to use range mode (two date inputs) or single date mode
|
|
209
|
+
*/
|
|
210
|
+
get rangeMode() { return this.#rangeMode_accessor_storage; }
|
|
211
|
+
set rangeMode(value) { this.#rangeMode_accessor_storage = value; }
|
|
212
|
+
#startLabel_accessor_storage = (__runInitializers(this, _rangeMode_extraInitializers), __runInitializers(this, _startLabel_initializers, 'Start date'
|
|
213
|
+
/**
|
|
214
|
+
* Label for the end date (only used in range mode)
|
|
215
|
+
*/
|
|
216
|
+
));
|
|
217
|
+
/**
|
|
218
|
+
* Label for the start date (or single date)
|
|
219
|
+
*/
|
|
220
|
+
get startLabel() { return this.#startLabel_accessor_storage; }
|
|
221
|
+
set startLabel(value) { this.#startLabel_accessor_storage = value; }
|
|
222
|
+
#endLabel_accessor_storage = (__runInitializers(this, _startLabel_extraInitializers), __runInitializers(this, _endLabel_initializers, 'End date'
|
|
223
|
+
/**
|
|
224
|
+
* Placeholder for date inputs
|
|
225
|
+
*/
|
|
226
|
+
));
|
|
227
|
+
/**
|
|
228
|
+
* Label for the end date (only used in range mode)
|
|
229
|
+
*/
|
|
230
|
+
get endLabel() { return this.#endLabel_accessor_storage; }
|
|
231
|
+
set endLabel(value) { this.#endLabel_accessor_storage = value; }
|
|
232
|
+
#placeholder_accessor_storage = (__runInitializers(this, _endLabel_extraInitializers), __runInitializers(this, _placeholder_initializers, 'MM/DD/YYYY'
|
|
233
|
+
/**
|
|
234
|
+
* The selected date (single mode)
|
|
235
|
+
*/
|
|
236
|
+
));
|
|
237
|
+
/**
|
|
238
|
+
* Placeholder for date inputs
|
|
239
|
+
*/
|
|
240
|
+
get placeholder() { return this.#placeholder_accessor_storage; }
|
|
241
|
+
set placeholder(value) { this.#placeholder_accessor_storage = value; }
|
|
242
|
+
#selectedDate_accessor_storage = (__runInitializers(this, _placeholder_extraInitializers), __runInitializers(this, _selectedDate_initializers, null
|
|
243
|
+
/**
|
|
244
|
+
* The selected date range (range mode)
|
|
245
|
+
*/
|
|
246
|
+
));
|
|
247
|
+
/**
|
|
248
|
+
* The selected date (single mode)
|
|
249
|
+
*/
|
|
250
|
+
get selectedDate() { return this.#selectedDate_accessor_storage; }
|
|
251
|
+
set selectedDate(value) { this.#selectedDate_accessor_storage = value; }
|
|
252
|
+
#selectedRange_accessor_storage = (__runInitializers(this, _selectedDate_extraInitializers), __runInitializers(this, _selectedRange_initializers, null
|
|
253
|
+
/**
|
|
254
|
+
* Minimum selectable date
|
|
255
|
+
*/
|
|
256
|
+
));
|
|
257
|
+
/**
|
|
258
|
+
* The selected date range (range mode)
|
|
259
|
+
*/
|
|
260
|
+
get selectedRange() { return this.#selectedRange_accessor_storage; }
|
|
261
|
+
set selectedRange(value) { this.#selectedRange_accessor_storage = value; }
|
|
262
|
+
#minDate_accessor_storage = (__runInitializers(this, _selectedRange_extraInitializers), __runInitializers(this, _minDate_initializers, undefined
|
|
263
|
+
/**
|
|
264
|
+
* Maximum selectable date
|
|
265
|
+
*/
|
|
266
|
+
));
|
|
267
|
+
/**
|
|
268
|
+
* Minimum selectable date
|
|
269
|
+
*/
|
|
270
|
+
get minDate() { return this.#minDate_accessor_storage; }
|
|
271
|
+
set minDate(value) { this.#minDate_accessor_storage = value; }
|
|
272
|
+
#maxDate_accessor_storage = (__runInitializers(this, _minDate_extraInitializers), __runInitializers(this, _maxDate_initializers, undefined
|
|
273
|
+
/**
|
|
274
|
+
* Locale for date formatting
|
|
275
|
+
*/
|
|
276
|
+
));
|
|
277
|
+
/**
|
|
278
|
+
* Maximum selectable date
|
|
279
|
+
*/
|
|
280
|
+
get maxDate() { return this.#maxDate_accessor_storage; }
|
|
281
|
+
set maxDate(value) { this.#maxDate_accessor_storage = value; }
|
|
282
|
+
#locale_accessor_storage = (__runInitializers(this, _maxDate_extraInitializers), __runInitializers(this, _locale_initializers, undefined));
|
|
283
|
+
/**
|
|
284
|
+
* Locale for date formatting
|
|
285
|
+
*/
|
|
286
|
+
get locale() { return this.#locale_accessor_storage; }
|
|
287
|
+
set locale(value) { this.#locale_accessor_storage = value; }
|
|
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
|
+
}
|
|
307
|
+
connectedCallback() {
|
|
308
|
+
super.connectedCallback();
|
|
309
|
+
this.updateInputValues();
|
|
310
|
+
}
|
|
311
|
+
willUpdate(changedProperties) {
|
|
312
|
+
if (changedProperties.has('selectedDate') || changedProperties.has('selectedRange')) {
|
|
313
|
+
this.updateInputValues();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
updateInputValues() {
|
|
317
|
+
if (this.rangeMode && this.selectedRange) {
|
|
318
|
+
this.startInput = this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : '';
|
|
319
|
+
this.endInput = this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : '';
|
|
320
|
+
}
|
|
321
|
+
else if (!this.rangeMode && this.selectedDate) {
|
|
322
|
+
this.startInput = formatDate(this.selectedDate, this.locale);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
validateDate(dateString, isEndDate = false) {
|
|
326
|
+
if (!dateString.trim())
|
|
327
|
+
return null;
|
|
328
|
+
const parsedDate = parseDate(dateString);
|
|
329
|
+
if (!parsedDate)
|
|
330
|
+
return null;
|
|
331
|
+
// Check min/max constraints
|
|
332
|
+
if (this.minDate && parsedDate < this.minDate)
|
|
333
|
+
return null;
|
|
334
|
+
if (this.maxDate && parsedDate > this.maxDate)
|
|
335
|
+
return null;
|
|
336
|
+
// For range mode, validate end date is after start date
|
|
337
|
+
if (this.rangeMode && isEndDate) {
|
|
338
|
+
const startDate = parseDate(this.startInput);
|
|
339
|
+
if (startDate && parsedDate < startDate)
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
return parsedDate;
|
|
343
|
+
}
|
|
344
|
+
handleStartInput(event) {
|
|
345
|
+
const target = event.target;
|
|
346
|
+
this.startInput = target.value;
|
|
347
|
+
this.startError = '';
|
|
348
|
+
if (this.startInput.trim()) {
|
|
349
|
+
const date = this.validateDate(this.startInput);
|
|
350
|
+
if (!date) {
|
|
351
|
+
this.startError = 'Invalid date format or out of range';
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
if (this.rangeMode) {
|
|
355
|
+
const currentRange = this.selectedRange || { start: null, end: null };
|
|
356
|
+
this.selectedRange = { ...currentRange, start: date };
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
this.selectedDate = date;
|
|
360
|
+
}
|
|
361
|
+
this.dispatchChangeEvent();
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
handleEndInput(event) {
|
|
365
|
+
const target = event.target;
|
|
366
|
+
this.endInput = target.value;
|
|
367
|
+
this.endError = '';
|
|
368
|
+
if (this.endInput.trim()) {
|
|
369
|
+
const date = this.validateDate(this.endInput, true);
|
|
370
|
+
if (!date) {
|
|
371
|
+
this.endError = 'Invalid date format, out of range, or before start date';
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
const currentRange = this.selectedRange || { start: null, end: null };
|
|
375
|
+
this.selectedRange = { ...currentRange, end: date };
|
|
376
|
+
this.dispatchChangeEvent();
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
handleCancel() {
|
|
380
|
+
this.dispatchCloseEvent(false);
|
|
381
|
+
}
|
|
382
|
+
handleConfirm() {
|
|
383
|
+
// Validate all inputs before confirming
|
|
384
|
+
let hasErrors = false;
|
|
385
|
+
if (this.rangeMode) {
|
|
386
|
+
if (!this.startInput.trim()) {
|
|
387
|
+
this.startError = 'Start date is required';
|
|
388
|
+
hasErrors = true;
|
|
389
|
+
}
|
|
390
|
+
else if (!this.validateDate(this.startInput)) {
|
|
391
|
+
this.startError = 'Invalid start date';
|
|
392
|
+
hasErrors = true;
|
|
393
|
+
}
|
|
394
|
+
if (!this.endInput.trim()) {
|
|
395
|
+
this.endError = 'End date is required';
|
|
396
|
+
hasErrors = true;
|
|
397
|
+
}
|
|
398
|
+
else if (!this.validateDate(this.endInput, true)) {
|
|
399
|
+
this.endError = 'Invalid end date';
|
|
400
|
+
hasErrors = true;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
if (!this.startInput.trim()) {
|
|
405
|
+
this.startError = 'Date is required';
|
|
406
|
+
hasErrors = true;
|
|
407
|
+
}
|
|
408
|
+
else if (!this.validateDate(this.startInput)) {
|
|
409
|
+
this.startError = 'Invalid date';
|
|
410
|
+
hasErrors = true;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
if (!hasErrors) {
|
|
414
|
+
this.dispatchCloseEvent(true);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
dispatchChangeEvent() {
|
|
418
|
+
if (this.rangeMode && this.selectedRange) {
|
|
419
|
+
const event = {
|
|
420
|
+
range: this.selectedRange,
|
|
421
|
+
formattedRange: {
|
|
422
|
+
start: this.selectedRange.start ? formatDate(this.selectedRange.start, this.locale) : null,
|
|
423
|
+
end: this.selectedRange.end ? formatDate(this.selectedRange.end, this.locale) : null,
|
|
424
|
+
},
|
|
425
|
+
};
|
|
426
|
+
this.dispatchEvent(new CustomEvent('date-input-change', {
|
|
427
|
+
detail: event,
|
|
428
|
+
bubbles: true,
|
|
429
|
+
composed: true,
|
|
430
|
+
}));
|
|
431
|
+
}
|
|
432
|
+
else if (!this.rangeMode && this.selectedDate) {
|
|
433
|
+
this.dispatchEvent(new CustomEvent('date-input-change', {
|
|
434
|
+
detail: {
|
|
435
|
+
date: this.selectedDate,
|
|
436
|
+
formattedDate: formatDate(this.selectedDate, this.locale),
|
|
437
|
+
},
|
|
438
|
+
bubbles: true,
|
|
439
|
+
composed: true,
|
|
440
|
+
}));
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
dispatchCloseEvent(confirmed) {
|
|
444
|
+
this.dispatchEvent(new CustomEvent('modal-input-close', {
|
|
445
|
+
detail: {
|
|
446
|
+
confirmed,
|
|
447
|
+
date: confirmed && !this.rangeMode ? this.selectedDate : null,
|
|
448
|
+
range: confirmed && this.rangeMode ? this.selectedRange : null,
|
|
449
|
+
},
|
|
450
|
+
bubbles: true,
|
|
451
|
+
composed: true,
|
|
452
|
+
}));
|
|
453
|
+
}
|
|
454
|
+
renderHeader() {
|
|
455
|
+
return html `
|
|
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">
|
|
459
|
+
<ui-icon icon="close"></ui-icon>
|
|
460
|
+
</ui-icon-button>
|
|
461
|
+
</header>
|
|
462
|
+
`;
|
|
463
|
+
}
|
|
464
|
+
renderInputs() {
|
|
465
|
+
return html `
|
|
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>
|
|
483
|
+
|
|
484
|
+
${this.rangeMode
|
|
485
|
+
? html `
|
|
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
|
+
`
|
|
499
|
+
: ''}
|
|
500
|
+
</fieldset>
|
|
501
|
+
|
|
502
|
+
<aside id="format-help" class="format-help" role="note" aria-label="Date format information">
|
|
503
|
+
<p class="help-title">
|
|
504
|
+
<strong>Supported formats:</strong><br />
|
|
505
|
+
MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD
|
|
506
|
+
</p>
|
|
507
|
+
<p class="help-examples"><strong>Examples:</strong> 12/25/2024, 12-25-2024, 2024-12-25</p>
|
|
508
|
+
</aside>
|
|
509
|
+
</div>
|
|
510
|
+
</main>
|
|
511
|
+
`;
|
|
512
|
+
}
|
|
513
|
+
renderActions() {
|
|
514
|
+
const hasValidInput = this.rangeMode
|
|
515
|
+
? this.startInput.trim() && this.endInput.trim() && !this.startError && !this.endError
|
|
516
|
+
: this.startInput.trim() && !this.startError;
|
|
517
|
+
return html `
|
|
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>
|
|
522
|
+
`;
|
|
523
|
+
}
|
|
524
|
+
render() {
|
|
525
|
+
return html `
|
|
526
|
+
<ui-dialog .open=${this.open} @close=${this.handleCancel}>
|
|
527
|
+
${this.renderHeader()} ${this.renderInputs()} ${this.renderActions()}
|
|
528
|
+
</ui-dialog>
|
|
529
|
+
`;
|
|
530
|
+
}
|
|
531
|
+
static {
|
|
532
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
533
|
+
}
|
|
534
|
+
};
|
|
535
|
+
return UiDatePickerModalInput = _classThis;
|
|
536
|
+
})();
|
|
537
|
+
export { UiDatePickerModalInput };
|
|
538
|
+
//# sourceMappingURL=ui-date-picker-modal-input.js.map
|
|
@@ -0,0 +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. 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"]}
|