@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,13 +10,52 @@ import '../../md/icons/ui-icon.js';
|
|
|
10
10
|
* A docked date picker that opens from a text field input.
|
|
11
11
|
* Ideal for forms and date selection in medium to large layouts.
|
|
12
12
|
*
|
|
13
|
+
* ## Features
|
|
14
|
+
* - Text field input with calendar dropdown
|
|
15
|
+
* - Keyboard navigation support (Arrow Down, Enter, Escape)
|
|
16
|
+
* - Custom date formatting
|
|
17
|
+
* - Input validation and error handling
|
|
18
|
+
* - Min/max date constraints
|
|
19
|
+
* - Disabled dates support
|
|
20
|
+
* - Accessible design with proper ARIA attributes
|
|
21
|
+
* - CSS Anchor Positioning API for dropdown placement
|
|
22
|
+
*
|
|
23
|
+
* ## Events
|
|
24
|
+
*
|
|
25
|
+
* ### `change`
|
|
26
|
+
* Fired when the selected date changes.
|
|
27
|
+
*
|
|
28
|
+
* **Detail:**
|
|
29
|
+
* ```typescript
|
|
30
|
+
* {
|
|
31
|
+
* value: Date | null,
|
|
32
|
+
* formattedValue: string
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
13
36
|
* ## Usage
|
|
14
37
|
*
|
|
38
|
+
* ### Basic usage
|
|
15
39
|
* ```html
|
|
16
40
|
* <ui-date-picker-input
|
|
17
41
|
* label="Select date"
|
|
42
|
+
* name="birthDate"
|
|
18
43
|
* placeholder="MM/DD/YYYY"
|
|
19
44
|
* .value=${new Date()}
|
|
45
|
+
* @change=${this.handleDateChange}
|
|
46
|
+
* ></ui-date-picker-input>
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* ### With validation
|
|
50
|
+
* ```html
|
|
51
|
+
* <ui-date-picker-input
|
|
52
|
+
* label="Birth date"
|
|
53
|
+
* name="birthDate"
|
|
54
|
+
* required
|
|
55
|
+
* .error=${this.hasError}
|
|
56
|
+
* .errorMessage=${"Please select a valid date"}
|
|
57
|
+
* .minDate=${new Date('1900-01-01')}
|
|
58
|
+
* .maxDate=${new Date()}
|
|
20
59
|
* ></ui-date-picker-input>
|
|
21
60
|
* ```
|
|
22
61
|
*
|
|
@@ -27,6 +66,14 @@ import '../../md/icons/ui-icon.js';
|
|
|
27
66
|
* .dateFormat=${date => date.toLocaleDateString('en-GB')}
|
|
28
67
|
* ></ui-date-picker-input>
|
|
29
68
|
* ```
|
|
69
|
+
*
|
|
70
|
+
* ### With disabled dates
|
|
71
|
+
* ```html
|
|
72
|
+
* <ui-date-picker-input
|
|
73
|
+
* label="Appointment date"
|
|
74
|
+
* .disabledDates=${[new Date('2024-12-25'), new Date('2024-01-01')]}
|
|
75
|
+
* ></ui-date-picker-input>
|
|
76
|
+
* ```
|
|
30
77
|
*/
|
|
31
78
|
let UiDatePickerInput = (() => {
|
|
32
79
|
let _classDecorators = [customElement('ui-date-picker-input')];
|
|
@@ -37,6 +84,9 @@ let UiDatePickerInput = (() => {
|
|
|
37
84
|
let _label_decorators;
|
|
38
85
|
let _label_initializers = [];
|
|
39
86
|
let _label_extraInitializers = [];
|
|
87
|
+
let _name_decorators;
|
|
88
|
+
let _name_initializers = [];
|
|
89
|
+
let _name_extraInitializers = [];
|
|
40
90
|
let _placeholder_decorators;
|
|
41
91
|
let _placeholder_initializers = [];
|
|
42
92
|
let _placeholder_extraInitializers = [];
|
|
@@ -70,20 +120,21 @@ let UiDatePickerInput = (() => {
|
|
|
70
120
|
let _dateFormat_decorators;
|
|
71
121
|
let _dateFormat_initializers = [];
|
|
72
122
|
let _dateFormat_extraInitializers = [];
|
|
73
|
-
let
|
|
74
|
-
let
|
|
75
|
-
let
|
|
76
|
-
let
|
|
77
|
-
let
|
|
78
|
-
let
|
|
79
|
-
let
|
|
80
|
-
let
|
|
81
|
-
let
|
|
123
|
+
let _isOpen_decorators;
|
|
124
|
+
let _isOpen_initializers = [];
|
|
125
|
+
let _isOpen_extraInitializers = [];
|
|
126
|
+
let _inputValue_decorators;
|
|
127
|
+
let _inputValue_initializers = [];
|
|
128
|
+
let _inputValue_extraInitializers = [];
|
|
129
|
+
let _textField_decorators;
|
|
130
|
+
let _textField_initializers = [];
|
|
131
|
+
let _textField_extraInitializers = [];
|
|
82
132
|
var UiDatePickerInput = class extends _classSuper {
|
|
83
133
|
static { _classThis = this; }
|
|
84
134
|
static {
|
|
85
135
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
86
136
|
_label_decorators = [property({ type: String })];
|
|
137
|
+
_name_decorators = [property({ type: String })];
|
|
87
138
|
_placeholder_decorators = [property({ type: String })];
|
|
88
139
|
_value_decorators = [property({ type: Object })];
|
|
89
140
|
_disabled_decorators = [property({ type: Boolean })];
|
|
@@ -95,10 +146,11 @@ let UiDatePickerInput = (() => {
|
|
|
95
146
|
_disabledDates_decorators = [property({ type: Array })];
|
|
96
147
|
_locale_decorators = [property({ type: String })];
|
|
97
148
|
_dateFormat_decorators = [property({ type: Object })];
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
149
|
+
_isOpen_decorators = [state()];
|
|
150
|
+
_inputValue_decorators = [state()];
|
|
151
|
+
_textField_decorators = [query('ui-outlined-text-field')];
|
|
101
152
|
__esDecorate(this, null, _label_decorators, { kind: "accessor", name: "label", static: false, private: false, access: { has: obj => "label" in obj, get: obj => obj.label, set: (obj, value) => { obj.label = value; } }, metadata: _metadata }, _label_initializers, _label_extraInitializers);
|
|
153
|
+
__esDecorate(this, null, _name_decorators, { kind: "accessor", name: "name", static: false, private: false, access: { has: obj => "name" in obj, get: obj => obj.name, set: (obj, value) => { obj.name = value; } }, metadata: _metadata }, _name_initializers, _name_extraInitializers);
|
|
102
154
|
__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);
|
|
103
155
|
__esDecorate(this, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } }, metadata: _metadata }, _value_initializers, _value_extraInitializers);
|
|
104
156
|
__esDecorate(this, null, _disabled_decorators, { kind: "accessor", name: "disabled", static: false, private: false, access: { has: obj => "disabled" in obj, get: obj => obj.disabled, set: (obj, value) => { obj.disabled = value; } }, metadata: _metadata }, _disabled_initializers, _disabled_extraInitializers);
|
|
@@ -110,9 +162,9 @@ let UiDatePickerInput = (() => {
|
|
|
110
162
|
__esDecorate(this, null, _disabledDates_decorators, { kind: "accessor", name: "disabledDates", static: false, private: false, access: { has: obj => "disabledDates" in obj, get: obj => obj.disabledDates, set: (obj, value) => { obj.disabledDates = value; } }, metadata: _metadata }, _disabledDates_initializers, _disabledDates_extraInitializers);
|
|
111
163
|
__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);
|
|
112
164
|
__esDecorate(this, null, _dateFormat_decorators, { kind: "accessor", name: "dateFormat", static: false, private: false, access: { has: obj => "dateFormat" in obj, get: obj => obj.dateFormat, set: (obj, value) => { obj.dateFormat = value; } }, metadata: _metadata }, _dateFormat_initializers, _dateFormat_extraInitializers);
|
|
113
|
-
__esDecorate(this, null,
|
|
114
|
-
__esDecorate(this, null,
|
|
115
|
-
__esDecorate(this, null,
|
|
165
|
+
__esDecorate(this, null, _isOpen_decorators, { kind: "accessor", name: "isOpen", static: false, private: false, access: { has: obj => "isOpen" in obj, get: obj => obj.isOpen, set: (obj, value) => { obj.isOpen = value; } }, metadata: _metadata }, _isOpen_initializers, _isOpen_extraInitializers);
|
|
166
|
+
__esDecorate(this, null, _inputValue_decorators, { kind: "accessor", name: "inputValue", static: false, private: false, access: { has: obj => "inputValue" in obj, get: obj => obj.inputValue, set: (obj, value) => { obj.inputValue = value; } }, metadata: _metadata }, _inputValue_initializers, _inputValue_extraInitializers);
|
|
167
|
+
__esDecorate(this, null, _textField_decorators, { kind: "accessor", name: "textField", static: false, private: false, access: { has: obj => "textField" in obj, get: obj => obj.textField, set: (obj, value) => { obj.textField = value; } }, metadata: _metadata }, _textField_initializers, _textField_extraInitializers);
|
|
116
168
|
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
117
169
|
UiDatePickerInput = _classThis = _classDescriptor.value;
|
|
118
170
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
@@ -124,7 +176,7 @@ let UiDatePickerInput = (() => {
|
|
|
124
176
|
};
|
|
125
177
|
#label_accessor_storage = __runInitializers(this, _label_initializers, ''
|
|
126
178
|
/**
|
|
127
|
-
*
|
|
179
|
+
* The name attribute for the input field (for form handling)
|
|
128
180
|
*/
|
|
129
181
|
);
|
|
130
182
|
/**
|
|
@@ -132,7 +184,17 @@ let UiDatePickerInput = (() => {
|
|
|
132
184
|
*/
|
|
133
185
|
get label() { return this.#label_accessor_storage; }
|
|
134
186
|
set label(value) { this.#label_accessor_storage = value; }
|
|
135
|
-
#
|
|
187
|
+
#name_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _name_initializers, ''
|
|
188
|
+
/**
|
|
189
|
+
* Placeholder text for the input
|
|
190
|
+
*/
|
|
191
|
+
));
|
|
192
|
+
/**
|
|
193
|
+
* The name attribute for the input field (for form handling)
|
|
194
|
+
*/
|
|
195
|
+
get name() { return this.#name_accessor_storage; }
|
|
196
|
+
set name(value) { this.#name_accessor_storage = value; }
|
|
197
|
+
#placeholder_accessor_storage = (__runInitializers(this, _name_extraInitializers), __runInitializers(this, _placeholder_initializers, 'MM/DD/YYYY'
|
|
136
198
|
/**
|
|
137
199
|
* The currently selected date
|
|
138
200
|
*/
|
|
@@ -238,109 +300,117 @@ let UiDatePickerInput = (() => {
|
|
|
238
300
|
*/
|
|
239
301
|
get dateFormat() { return this.#dateFormat_accessor_storage; }
|
|
240
302
|
set dateFormat(value) { this.#dateFormat_accessor_storage = value; }
|
|
241
|
-
#
|
|
242
|
-
get
|
|
243
|
-
set
|
|
244
|
-
#
|
|
245
|
-
get
|
|
246
|
-
set
|
|
247
|
-
#
|
|
248
|
-
get
|
|
249
|
-
set
|
|
303
|
+
#isOpen_accessor_storage = (__runInitializers(this, _dateFormat_extraInitializers), __runInitializers(this, _isOpen_initializers, false));
|
|
304
|
+
get isOpen() { return this.#isOpen_accessor_storage; }
|
|
305
|
+
set isOpen(value) { this.#isOpen_accessor_storage = value; }
|
|
306
|
+
#inputValue_accessor_storage = (__runInitializers(this, _isOpen_extraInitializers), __runInitializers(this, _inputValue_initializers, ''));
|
|
307
|
+
get inputValue() { return this.#inputValue_accessor_storage; }
|
|
308
|
+
set inputValue(value) { this.#inputValue_accessor_storage = value; }
|
|
309
|
+
#textField_accessor_storage = (__runInitializers(this, _inputValue_extraInitializers), __runInitializers(this, _textField_initializers, void 0));
|
|
310
|
+
get textField() { return this.#textField_accessor_storage; }
|
|
311
|
+
set textField(value) { this.#textField_accessor_storage = value; }
|
|
312
|
+
constructor() {
|
|
313
|
+
super();
|
|
314
|
+
__runInitializers(this, _textField_extraInitializers);
|
|
315
|
+
// Initialize boolean properties to false as per Lit best practices
|
|
316
|
+
this.disabled = false;
|
|
317
|
+
this.required = false;
|
|
318
|
+
this.error = false;
|
|
319
|
+
}
|
|
250
320
|
connectedCallback() {
|
|
251
321
|
super.connectedCallback();
|
|
252
|
-
this.
|
|
253
|
-
document.addEventListener('click', this.
|
|
322
|
+
this.updateInputValue();
|
|
323
|
+
document.addEventListener('click', this.handleDocumentClick.bind(this));
|
|
254
324
|
}
|
|
255
325
|
disconnectedCallback() {
|
|
256
326
|
super.disconnectedCallback();
|
|
257
|
-
document.removeEventListener('click', this.
|
|
327
|
+
document.removeEventListener('click', this.handleDocumentClick.bind(this));
|
|
258
328
|
}
|
|
259
329
|
willUpdate(changedProperties) {
|
|
260
330
|
if (changedProperties.has('value')) {
|
|
261
|
-
this.
|
|
331
|
+
this.updateInputValue();
|
|
262
332
|
}
|
|
263
333
|
}
|
|
264
334
|
updated(changedProperties) {
|
|
265
|
-
if (changedProperties.has('
|
|
335
|
+
if (changedProperties.has('isOpen') && this.isOpen) {
|
|
266
336
|
// Set anchor name on text field for CSS Anchor Positioning API
|
|
267
|
-
if (this.
|
|
337
|
+
if (this.textField) {
|
|
268
338
|
// Using setProperty since anchorName is not in TypeScript types yet
|
|
269
|
-
this.
|
|
339
|
+
this.textField.style.setProperty('anchor-name', '--ui-date-picker-anchor');
|
|
270
340
|
}
|
|
271
341
|
}
|
|
272
342
|
}
|
|
273
|
-
|
|
343
|
+
updateInputValue() {
|
|
274
344
|
if (this.value) {
|
|
275
|
-
this.
|
|
345
|
+
this.inputValue = this.dateFormat ? this.dateFormat(this.value) : formatDate(this.value, this.locale);
|
|
276
346
|
}
|
|
277
347
|
else {
|
|
278
|
-
this.
|
|
348
|
+
this.inputValue = '';
|
|
279
349
|
}
|
|
280
350
|
}
|
|
281
|
-
|
|
351
|
+
handleDocumentClick(event) {
|
|
282
352
|
if (!this.contains(event.target)) {
|
|
283
|
-
this.
|
|
353
|
+
this.isOpen = false;
|
|
284
354
|
}
|
|
285
355
|
}
|
|
286
|
-
|
|
356
|
+
handleInputClick() {
|
|
287
357
|
if (!this.disabled) {
|
|
288
|
-
this.
|
|
358
|
+
this.isOpen = !this.isOpen;
|
|
289
359
|
}
|
|
290
360
|
}
|
|
291
|
-
|
|
361
|
+
handleInputChange(event) {
|
|
292
362
|
const target = event.target;
|
|
293
|
-
this.
|
|
294
|
-
const parsedDate = parseDate(this.
|
|
363
|
+
this.inputValue = target.value;
|
|
364
|
+
const parsedDate = parseDate(this.inputValue);
|
|
295
365
|
if (parsedDate) {
|
|
296
366
|
this.value = parsedDate;
|
|
297
|
-
this.
|
|
367
|
+
this.dispatchChangeEvent();
|
|
298
368
|
}
|
|
299
369
|
}
|
|
300
|
-
|
|
370
|
+
handleCalendarDateSelect(event) {
|
|
301
371
|
this.value = event.detail.date;
|
|
302
|
-
this.
|
|
303
|
-
this.
|
|
372
|
+
this.isOpen = false;
|
|
373
|
+
this.dispatchChangeEvent();
|
|
304
374
|
}
|
|
305
|
-
|
|
306
|
-
this.
|
|
375
|
+
handleCalendarDateCancel() {
|
|
376
|
+
this.isOpen = false;
|
|
307
377
|
}
|
|
308
|
-
|
|
378
|
+
handleKeyDown(event) {
|
|
309
379
|
switch (event.key) {
|
|
310
380
|
case 'Escape':
|
|
311
|
-
this.
|
|
381
|
+
this.isOpen = false;
|
|
312
382
|
break;
|
|
313
383
|
case 'ArrowDown':
|
|
314
|
-
if (!this.
|
|
384
|
+
if (!this.isOpen) {
|
|
315
385
|
event.preventDefault();
|
|
316
|
-
this.
|
|
386
|
+
this.isOpen = true;
|
|
317
387
|
}
|
|
318
388
|
break;
|
|
319
389
|
case 'Enter':
|
|
320
|
-
if (this.
|
|
390
|
+
if (this.isOpen) {
|
|
321
391
|
event.preventDefault();
|
|
322
|
-
this.
|
|
392
|
+
this.isOpen = false;
|
|
323
393
|
}
|
|
324
394
|
break;
|
|
325
395
|
}
|
|
326
396
|
}
|
|
327
|
-
|
|
397
|
+
dispatchChangeEvent() {
|
|
328
398
|
this.dispatchEvent(new CustomEvent('change', {
|
|
329
399
|
detail: {
|
|
330
400
|
value: this.value,
|
|
331
|
-
formattedValue: this.
|
|
401
|
+
formattedValue: this.inputValue,
|
|
332
402
|
},
|
|
333
403
|
bubbles: true,
|
|
334
404
|
composed: true,
|
|
335
405
|
}));
|
|
336
406
|
}
|
|
337
|
-
|
|
407
|
+
renderCalendarIcon() {
|
|
338
408
|
return html `
|
|
339
|
-
<ui-icon slot="suffix" icon="calendarToday" @click=${this.
|
|
409
|
+
<ui-icon slot="suffix" icon="calendarToday" @click=${this.handleInputClick} class="calendar-icon"></ui-icon>
|
|
340
410
|
`;
|
|
341
411
|
}
|
|
342
|
-
|
|
343
|
-
if (!this.
|
|
412
|
+
renderDropdown() {
|
|
413
|
+
if (!this.isOpen)
|
|
344
414
|
return null;
|
|
345
415
|
const currentDate = this.value || new Date();
|
|
346
416
|
return html `
|
|
@@ -354,8 +424,8 @@ let UiDatePickerInput = (() => {
|
|
|
354
424
|
.disabledDates=${this.disabledDates}
|
|
355
425
|
.locale=${this.locale}
|
|
356
426
|
showActions
|
|
357
|
-
@date-select=${this.
|
|
358
|
-
@date-cancel=${this.
|
|
427
|
+
@date-select=${this.handleCalendarDateSelect}
|
|
428
|
+
@date-cancel=${this.handleCalendarDateCancel}
|
|
359
429
|
></ui-date-picker-calendar>
|
|
360
430
|
</div>
|
|
361
431
|
`;
|
|
@@ -363,30 +433,27 @@ let UiDatePickerInput = (() => {
|
|
|
363
433
|
render() {
|
|
364
434
|
return html `
|
|
365
435
|
<div class="input-container">
|
|
366
|
-
${this.
|
|
436
|
+
${this.isOpen ? html `<div class="backdrop" @click=${() => (this.isOpen = false)}></div>` : ''}
|
|
367
437
|
<ui-outlined-text-field
|
|
368
438
|
.label=${this.label}
|
|
439
|
+
.name=${this.name}
|
|
369
440
|
.placeholder=${this.placeholder}
|
|
370
|
-
.value=${this.
|
|
441
|
+
.value=${this.inputValue}
|
|
371
442
|
.disabled=${this.disabled}
|
|
372
443
|
.required=${this.required}
|
|
373
|
-
|
|
374
|
-
.
|
|
444
|
+
?invalid=${this.error}
|
|
445
|
+
.invalidText=${this.errorMessage}
|
|
375
446
|
readonly
|
|
376
|
-
@click=${this.
|
|
377
|
-
@input=${this.
|
|
378
|
-
@keydown=${this.
|
|
447
|
+
@click=${this.handleInputClick}
|
|
448
|
+
@input=${this.handleInputChange}
|
|
449
|
+
@keydown=${this.handleKeyDown}
|
|
379
450
|
>
|
|
380
|
-
${this.
|
|
451
|
+
${this.renderCalendarIcon()}
|
|
381
452
|
</ui-outlined-text-field>
|
|
382
|
-
${this.
|
|
453
|
+
${this.renderDropdown()}
|
|
383
454
|
</div>
|
|
384
455
|
`;
|
|
385
456
|
}
|
|
386
|
-
constructor() {
|
|
387
|
-
super(...arguments);
|
|
388
|
-
__runInitializers(this, __textField_extraInitializers);
|
|
389
|
-
}
|
|
390
457
|
static {
|
|
391
458
|
__runInitializers(_classThis, _classExtraInitializers);
|
|
392
459
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-date-picker-input.js","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, TemplateResult } from 'lit'\nimport { customElement, property, state, query } from 'lit/decorators.js'\nimport { inputStyles } from './internals/DatePicker.styles.js'\nimport { formatDate, parseDate } from './internals/DatePickerUtils.js'\nimport type { DateSelectEvent } from './internals/DatePickerCalendar.js'\nimport './internals/DatePickerCalendar.js'\nimport '../../md/text-field/ui-outlined-text-field.js'\nimport '../../md/icons/ui-icon.js'\n\n/**\n * A docked date picker that opens from a text field input.\n * Ideal for forms and date selection in medium to large layouts.\n *\n * ## Usage\n *\n * ```html\n * <ui-date-picker-input\n * label=\"Select date\"\n * placeholder=\"MM/DD/YYYY\"\n * .value=${new Date()}\n * ></ui-date-picker-input>\n * ```\n *\n * ### Custom date format\n * ```html\n * <ui-date-picker-input\n * label=\"Birth date\"\n * .dateFormat=${date => date.toLocaleDateString('en-GB')}\n * ></ui-date-picker-input>\n * ```\n */\n@customElement('ui-date-picker-input')\nexport class UiDatePickerInput extends LitElement {\n static override styles = inputStyles\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n }\n\n /**\n * The label for the input field\n */\n @property({ type: String }) accessor label = ''\n\n /**\n * Placeholder text for the input\n */\n @property({ type: String }) accessor placeholder = 'MM/DD/YYYY'\n\n /**\n * The currently selected date\n */\n @property({ type: Object }) accessor value: Date | null = null\n\n /**\n * Whether the date picker is disabled\n */\n @property({ type: Boolean }) accessor disabled = false\n\n /**\n * Whether the input is required\n */\n @property({ type: Boolean }) accessor required = false\n\n /**\n * Error message to display\n */\n @property({ type: String }) accessor errorMessage = ''\n\n /**\n * Whether the input has an error state\n */\n @property({ type: Boolean }) accessor error = false\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 * Array of disabled dates\n */\n @property({ type: Array }) accessor disabledDates: Date[] | undefined = undefined\n\n /**\n * Locale for date formatting\n */\n @property({ type: String }) accessor locale: string | undefined = undefined\n\n /**\n * Custom date format function\n */\n @property({ type: Object }) accessor dateFormat: ((date: Date) => string) | undefined = undefined\n\n @state() private accessor _isOpen = false\n\n @state() private accessor _inputValue = ''\n\n @query('ui-outlined-text-field') private accessor _textField!: HTMLElement\n\n override connectedCallback(): void {\n super.connectedCallback()\n this._updateInputValue()\n document.addEventListener('click', this._handleDocumentClick.bind(this))\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback()\n document.removeEventListener('click', this._handleDocumentClick.bind(this))\n }\n\n override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('value')) {\n this._updateInputValue()\n }\n }\n\n override updated(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('_isOpen') && this._isOpen) {\n // Set anchor name on text field for CSS Anchor Positioning API\n if (this._textField) {\n // Using setProperty since anchorName is not in TypeScript types yet\n this._textField.style.setProperty('anchor-name', '--ui-date-picker-anchor')\n }\n }\n }\n\n private _updateInputValue(): void {\n if (this.value) {\n this._inputValue = this.dateFormat ? this.dateFormat(this.value) : formatDate(this.value, this.locale)\n } else {\n this._inputValue = ''\n }\n }\n\n private _handleDocumentClick(event: Event): void {\n if (!this.contains(event.target as Node)) {\n this._isOpen = false\n }\n }\n\n private _handleInputClick(): void {\n if (!this.disabled) {\n this._isOpen = !this._isOpen\n }\n }\n\n private _handleInputChange(event: Event): void {\n const target = event.target as HTMLInputElement\n this._inputValue = target.value\n\n const parsedDate = parseDate(this._inputValue)\n if (parsedDate) {\n this.value = parsedDate\n this._dispatchChangeEvent()\n }\n }\n\n private _handleCalendarDateSelect(event: CustomEvent<DateSelectEvent>): void {\n this.value = event.detail.date\n this._isOpen = false\n this._dispatchChangeEvent()\n }\n\n private _handleCalendarDateCancel(): void {\n this._isOpen = false\n }\n\n private _handleKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n this._isOpen = false\n break\n case 'ArrowDown':\n if (!this._isOpen) {\n event.preventDefault()\n this._isOpen = true\n }\n break\n case 'Enter':\n if (this._isOpen) {\n event.preventDefault()\n this._isOpen = false\n }\n break\n }\n }\n\n private _dispatchChangeEvent(): void {\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: {\n value: this.value,\n formattedValue: this._inputValue,\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private _renderCalendarIcon(): TemplateResult {\n return html`\n <ui-icon slot=\"suffix\" icon=\"calendarToday\" @click=${this._handleInputClick} style=\"cursor: pointer;\"></ui-icon>\n `\n }\n\n private _renderDropdown(): TemplateResult | null {\n if (!this._isOpen) return null\n\n const currentDate = this.value || new Date()\n\n return html`\n <div class=\"dropdown-container\">\n <ui-date-picker-calendar\n .year=${currentDate.getFullYear()}\n .month=${currentDate.getMonth()}\n .selectedDate=${this.value}\n .minDate=${this.minDate}\n .maxDate=${this.maxDate}\n .disabledDates=${this.disabledDates}\n .locale=${this.locale}\n showActions\n @date-select=${this._handleCalendarDateSelect}\n @date-cancel=${this._handleCalendarDateCancel}\n ></ui-date-picker-calendar>\n </div>\n `\n }\n\n override render(): TemplateResult {\n return html`\n <div class=\"input-container\">\n ${this._isOpen ? html`<div class=\"backdrop\" @click=${() => (this._isOpen = false)}></div>` : ''}\n <ui-outlined-text-field\n .label=${this.label}\n .placeholder=${this.placeholder}\n .value=${this._inputValue}\n .disabled=${this.disabled}\n .required=${this.required}\n .errorMessage=${this.errorMessage}\n .error=${this.error}\n readonly\n @click=${this._handleInputClick}\n @input=${this._handleInputChange}\n @keydown=${this._handleKeyDown}\n >\n ${this._renderCalendarIcon()}\n </ui-outlined-text-field>\n ${this._renderDropdown()}\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-input': UiDatePickerInput\n }\n\n interface HTMLElementEventMap {\n change: CustomEvent<{\n value: Date | null\n formattedValue: string\n }>\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ui-date-picker-input.js","sourceRoot":"","sources":["../../../../src/md/date-picker/ui-date-picker-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, TemplateResult } from 'lit'\nimport { customElement, property, state, query } from 'lit/decorators.js'\nimport { inputStyles } from './internals/DatePicker.styles.js'\nimport { formatDate, parseDate } from './internals/DatePickerUtils.js'\nimport type { DateSelectEvent } from './internals/DatePickerCalendar.js'\nimport './internals/DatePickerCalendar.js'\nimport '../../md/text-field/ui-outlined-text-field.js'\nimport '../../md/icons/ui-icon.js'\n\n/**\n * A docked date picker that opens from a text field input.\n * Ideal for forms and date selection in medium to large layouts.\n *\n * ## Features\n * - Text field input with calendar dropdown\n * - Keyboard navigation support (Arrow Down, Enter, Escape)\n * - Custom date formatting\n * - Input validation and error handling\n * - Min/max date constraints\n * - Disabled dates support\n * - Accessible design with proper ARIA attributes\n * - CSS Anchor Positioning API for dropdown placement\n *\n * ## Events\n *\n * ### `change`\n * Fired when the selected date changes.\n *\n * **Detail:**\n * ```typescript\n * {\n * value: Date | null,\n * formattedValue: string\n * }\n * ```\n *\n * ## Usage\n *\n * ### Basic usage\n * ```html\n * <ui-date-picker-input\n * label=\"Select date\"\n * name=\"birthDate\"\n * placeholder=\"MM/DD/YYYY\"\n * .value=${new Date()}\n * @change=${this.handleDateChange}\n * ></ui-date-picker-input>\n * ```\n *\n * ### With validation\n * ```html\n * <ui-date-picker-input\n * label=\"Birth date\"\n * name=\"birthDate\"\n * required\n * .error=${this.hasError}\n * .errorMessage=${\"Please select a valid date\"}\n * .minDate=${new Date('1900-01-01')}\n * .maxDate=${new Date()}\n * ></ui-date-picker-input>\n * ```\n *\n * ### Custom date format\n * ```html\n * <ui-date-picker-input\n * label=\"Birth date\"\n * .dateFormat=${date => date.toLocaleDateString('en-GB')}\n * ></ui-date-picker-input>\n * ```\n *\n * ### With disabled dates\n * ```html\n * <ui-date-picker-input\n * label=\"Appointment date\"\n * .disabledDates=${[new Date('2024-12-25'), new Date('2024-01-01')]}\n * ></ui-date-picker-input>\n * ```\n */\n@customElement('ui-date-picker-input')\nexport class UiDatePickerInput extends LitElement {\n static override styles = inputStyles\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n }\n\n /**\n * The label for the input field\n */\n @property({ type: String }) accessor label = ''\n\n /**\n * The name attribute for the input field (for form handling)\n */\n @property({ type: String }) accessor name = ''\n\n /**\n * Placeholder text for the input\n */\n @property({ type: String }) accessor placeholder = 'MM/DD/YYYY'\n\n /**\n * The currently selected date\n */\n @property({ type: Object }) accessor value: Date | null = null\n\n /**\n * Whether the date picker is disabled\n */\n @property({ type: Boolean }) accessor disabled = false\n\n /**\n * Whether the input is required\n */\n @property({ type: Boolean }) accessor required = false\n\n /**\n * Error message to display\n */\n @property({ type: String }) accessor errorMessage = ''\n\n /**\n * Whether the input has an error state\n */\n @property({ type: Boolean }) accessor error = false\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 * Array of disabled dates\n */\n @property({ type: Array }) accessor disabledDates: Date[] | undefined = undefined\n\n /**\n * Locale for date formatting\n */\n @property({ type: String }) accessor locale: string | undefined = undefined\n\n /**\n * Custom date format function\n */\n @property({ type: Object }) accessor dateFormat: ((date: Date) => string) | undefined = undefined\n\n @state() private accessor isOpen = false\n\n @state() private accessor inputValue = ''\n\n @query('ui-outlined-text-field') private accessor textField!: HTMLElement\n\n constructor() {\n super()\n // Initialize boolean properties to false as per Lit best practices\n this.disabled = false\n this.required = false\n this.error = false\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.updateInputValue()\n document.addEventListener('click', this.handleDocumentClick.bind(this))\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback()\n document.removeEventListener('click', this.handleDocumentClick.bind(this))\n }\n\n override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('value')) {\n this.updateInputValue()\n }\n }\n\n override updated(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('isOpen') && this.isOpen) {\n // Set anchor name on text field for CSS Anchor Positioning API\n if (this.textField) {\n // Using setProperty since anchorName is not in TypeScript types yet\n this.textField.style.setProperty('anchor-name', '--ui-date-picker-anchor')\n }\n }\n }\n\n private updateInputValue(): void {\n if (this.value) {\n this.inputValue = this.dateFormat ? this.dateFormat(this.value) : formatDate(this.value, this.locale)\n } else {\n this.inputValue = ''\n }\n }\n\n private handleDocumentClick(event: Event): void {\n if (!this.contains(event.target as Node)) {\n this.isOpen = false\n }\n }\n\n private handleInputClick(): void {\n if (!this.disabled) {\n this.isOpen = !this.isOpen\n }\n }\n\n private handleInputChange(event: Event): void {\n const target = event.target as HTMLInputElement\n this.inputValue = target.value\n\n const parsedDate = parseDate(this.inputValue)\n if (parsedDate) {\n this.value = parsedDate\n this.dispatchChangeEvent()\n }\n }\n\n private handleCalendarDateSelect(event: CustomEvent<DateSelectEvent>): void {\n this.value = event.detail.date\n this.isOpen = false\n this.dispatchChangeEvent()\n }\n\n private handleCalendarDateCancel(): void {\n this.isOpen = false\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n this.isOpen = false\n break\n case 'ArrowDown':\n if (!this.isOpen) {\n event.preventDefault()\n this.isOpen = true\n }\n break\n case 'Enter':\n if (this.isOpen) {\n event.preventDefault()\n this.isOpen = false\n }\n break\n }\n }\n\n private dispatchChangeEvent(): void {\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: {\n value: this.value,\n formattedValue: this.inputValue,\n },\n bubbles: true,\n composed: true,\n })\n )\n }\n\n private renderCalendarIcon(): TemplateResult {\n return html`\n <ui-icon slot=\"suffix\" icon=\"calendarToday\" @click=${this.handleInputClick} class=\"calendar-icon\"></ui-icon>\n `\n }\n\n private renderDropdown(): TemplateResult | null {\n if (!this.isOpen) return null\n\n const currentDate = this.value || new Date()\n\n return html`\n <div class=\"dropdown-container\">\n <ui-date-picker-calendar\n .year=${currentDate.getFullYear()}\n .month=${currentDate.getMonth()}\n .selectedDate=${this.value}\n .minDate=${this.minDate}\n .maxDate=${this.maxDate}\n .disabledDates=${this.disabledDates}\n .locale=${this.locale}\n showActions\n @date-select=${this.handleCalendarDateSelect}\n @date-cancel=${this.handleCalendarDateCancel}\n ></ui-date-picker-calendar>\n </div>\n `\n }\n\n override render(): TemplateResult {\n return html`\n <div class=\"input-container\">\n ${this.isOpen ? html`<div class=\"backdrop\" @click=${() => (this.isOpen = false)}></div>` : ''}\n <ui-outlined-text-field\n .label=${this.label}\n .name=${this.name}\n .placeholder=${this.placeholder}\n .value=${this.inputValue}\n .disabled=${this.disabled}\n .required=${this.required}\n ?invalid=${this.error}\n .invalidText=${this.errorMessage}\n readonly\n @click=${this.handleInputClick}\n @input=${this.handleInputChange}\n @keydown=${this.handleKeyDown}\n >\n ${this.renderCalendarIcon()}\n </ui-outlined-text-field>\n ${this.renderDropdown()}\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-date-picker-input': UiDatePickerInput\n }\n\n interface HTMLElementEventMap {\n change: CustomEvent<{\n value: Date | null\n formattedValue: string\n }>\n }\n}\n"]}
|
|
@@ -14,16 +14,63 @@ export interface ModalInputDatePickerChangeEvent {
|
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* A modal date input picker for manual date entry using keyboard.
|
|
17
|
-
* Ideal for compact layouts and precise date entry.
|
|
17
|
+
* Ideal for compact layouts and precise date entry. Supports both single
|
|
18
|
+
* date selection and date range selection modes.
|
|
19
|
+
*
|
|
20
|
+
* ## Features
|
|
21
|
+
* - Manual date entry with keyboard input
|
|
22
|
+
* - Single date and date range modes
|
|
23
|
+
* - Input validation with error messages
|
|
24
|
+
* - Min/max date constraints
|
|
25
|
+
* - Multiple date format support (MM/DD/YYYY, MM-DD-YYYY, YYYY-MM-DD)
|
|
26
|
+
* - Accessible design with proper ARIA labels and semantic HTML
|
|
27
|
+
* - Real-time validation feedback
|
|
28
|
+
*
|
|
29
|
+
* ## Events
|
|
30
|
+
*
|
|
31
|
+
* ### `date-input-change`
|
|
32
|
+
* Fired when a valid date is entered in the input fields.
|
|
33
|
+
*
|
|
34
|
+
* **Detail for range mode:**
|
|
35
|
+
* ```typescript
|
|
36
|
+
* {
|
|
37
|
+
* range: DateRange,
|
|
38
|
+
* formattedRange: {
|
|
39
|
+
* start: string | null,
|
|
40
|
+
* end: string | null
|
|
41
|
+
* }
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* **Detail for single date mode:**
|
|
46
|
+
* ```typescript
|
|
47
|
+
* {
|
|
48
|
+
* date: Date,
|
|
49
|
+
* formattedDate: string
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* ### `modal-input-close`
|
|
54
|
+
* Fired when the modal is closed, either by confirmation or cancellation.
|
|
55
|
+
*
|
|
56
|
+
* **Detail:**
|
|
57
|
+
* ```typescript
|
|
58
|
+
* {
|
|
59
|
+
* confirmed: boolean,
|
|
60
|
+
* date?: Date | null, // Available in single date mode
|
|
61
|
+
* range?: DateRange | null // Available in range mode
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
18
64
|
*
|
|
19
65
|
* ## Usage
|
|
20
66
|
*
|
|
67
|
+
* ### Range mode (default)
|
|
21
68
|
* ```html
|
|
22
69
|
* <ui-date-picker-modal-input
|
|
23
70
|
* .open=${true}
|
|
24
71
|
* .selectedRange=${{ start: new Date(), end: null }}
|
|
25
72
|
* @date-input-change=${this.handleRangeChange}
|
|
26
|
-
* @close=${this.handleClose}
|
|
73
|
+
* @modal-input-close=${this.handleClose}
|
|
27
74
|
* ></ui-date-picker-modal-input>
|
|
28
75
|
* ```
|
|
29
76
|
*
|
|
@@ -32,6 +79,17 @@ export interface ModalInputDatePickerChangeEvent {
|
|
|
32
79
|
* <ui-date-picker-modal-input
|
|
33
80
|
* .rangeMode=${false}
|
|
34
81
|
* .selectedDate=${new Date()}
|
|
82
|
+
* @date-input-change=${this.handleDateChange}
|
|
83
|
+
* @modal-input-close=${this.handleClose}
|
|
84
|
+
* ></ui-date-picker-modal-input>
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* ### With constraints
|
|
88
|
+
* ```html
|
|
89
|
+
* <ui-date-picker-modal-input
|
|
90
|
+
* .minDate=${new Date('2024-01-01')}
|
|
91
|
+
* .maxDate=${new Date('2024-12-31')}
|
|
92
|
+
* .locale=${'en-US'}
|
|
35
93
|
* ></ui-date-picker-modal-input>
|
|
36
94
|
* ```
|
|
37
95
|
*/
|
|
@@ -81,23 +139,24 @@ export declare class UiDatePickerModalInput extends LitElement {
|
|
|
81
139
|
* Locale for date formatting
|
|
82
140
|
*/
|
|
83
141
|
accessor locale: string | undefined;
|
|
84
|
-
private accessor
|
|
85
|
-
private accessor
|
|
86
|
-
private accessor
|
|
87
|
-
private accessor
|
|
142
|
+
private accessor startInput;
|
|
143
|
+
private accessor endInput;
|
|
144
|
+
private accessor startError;
|
|
145
|
+
private accessor endError;
|
|
146
|
+
constructor();
|
|
88
147
|
connectedCallback(): void;
|
|
89
148
|
willUpdate(changedProperties: Map<string | number | symbol, unknown>): void;
|
|
90
|
-
private
|
|
91
|
-
private
|
|
92
|
-
private
|
|
93
|
-
private
|
|
94
|
-
private
|
|
95
|
-
private
|
|
96
|
-
private
|
|
97
|
-
private
|
|
98
|
-
private
|
|
99
|
-
private
|
|
100
|
-
private
|
|
149
|
+
private updateInputValues;
|
|
150
|
+
private validateDate;
|
|
151
|
+
private handleStartInput;
|
|
152
|
+
private handleEndInput;
|
|
153
|
+
private handleCancel;
|
|
154
|
+
private handleConfirm;
|
|
155
|
+
private dispatchChangeEvent;
|
|
156
|
+
private dispatchCloseEvent;
|
|
157
|
+
private renderHeader;
|
|
158
|
+
private renderInputs;
|
|
159
|
+
private renderActions;
|
|
101
160
|
render(): TemplateResult;
|
|
102
161
|
}
|
|
103
162
|
declare global {
|
|
@@ -1 +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
|
|
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"}
|