@acorex/components 20.10.1 → 20.10.3

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.
@@ -1,17 +1,25 @@
1
1
  import { MXInputBaseValueComponent, AXComponent, AXFocusableComponent, AXValuableComponent, AXClearableComponent } from '@acorex/cdk/common';
2
2
  import { AXCalendarService } from '@acorex/core/date-time';
3
- import { AXFormatService } from '@acorex/core/format';
4
- import { AXLocaleService } from '@acorex/core/locale';
3
+ import { AXLocaleService, AXIRLocaleProfile } from '@acorex/core/locale';
5
4
  import { AXPlatform } from '@acorex/core/platform';
6
5
  import { getWordBoundsAtPosition } from '@acorex/core/utils';
7
6
  import * as i0 from '@angular/core';
8
- import { inject, signal, input, computed, linkedSignal, viewChild, output, effect, untracked, forwardRef, HostBinding, HostListener, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
7
+ import { InjectionToken, inject, signal, input, output, computed, linkedSignal, viewChild, effect, untracked, forwardRef, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
9
8
  import * as i1 from '@angular/forms';
10
9
  import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
11
10
  import { map } from 'rxjs';
12
11
 
12
+ const AXDateTimeInputDefaultConfig = {
13
+ allowTyping: false,
14
+ };
15
+ const AX_DATETIME_INPUT_CONFIG = new InjectionToken('AX_DATETIME_INPUT_CONFIG', {
16
+ providedIn: 'root',
17
+ factory: () => AXDateTimeInputDefaultConfig,
18
+ });
19
+
13
20
  /**
14
- * A component for date and time input with various custom features.
21
+ * A component for date and time input with segment-based typing, keyboard navigation,
22
+ * and calendar-aware formatting (gregorian and solar-hijri).
15
23
  *
16
24
  * @category Components
17
25
  */
@@ -19,12 +27,10 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
19
27
  constructor() {
20
28
  super(...arguments);
21
29
  this.platformService = inject(AXPlatform);
22
- this.formatService = inject(AXFormatService);
23
30
  this.localeService = inject(AXLocaleService);
24
31
  this.calendarService = inject(AXCalendarService);
25
- /**
26
- * @ignore
27
- */
32
+ this.defaultConfig = inject(AX_DATETIME_INPUT_CONFIG);
33
+ /** @ignore */
28
34
  this._editingParts = {
29
35
  year: {
30
36
  key: 'year',
@@ -33,7 +39,7 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
33
39
  enabled: false,
34
40
  default: 2023,
35
41
  typedValue: null,
36
- realValue: () => this.formatService.format(this._editingDate(), 'datetime', this._editingParts.year.placeholder),
42
+ realValue: () => this._formatPart(this._editingDate(), this._editingParts.year.placeholder),
37
43
  },
38
44
  month: {
39
45
  key: 'month',
@@ -42,7 +48,7 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
42
48
  enabled: false,
43
49
  default: 1,
44
50
  typedValue: null,
45
- realValue: () => this.formatService.format(this._editingDate(), 'datetime', this._editingParts.month.placeholder),
51
+ realValue: () => this._formatPart(this._editingDate(), this._editingParts.month.placeholder),
46
52
  },
47
53
  day: {
48
54
  key: 'day',
@@ -51,7 +57,7 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
51
57
  enabled: false,
52
58
  default: 1,
53
59
  typedValue: null,
54
- realValue: () => this.formatService.format(this._editingDate(), 'datetime', this._editingParts.day.placeholder),
60
+ realValue: () => this._formatPart(this._editingDate(), this._editingParts.day.placeholder),
55
61
  },
56
62
  hour: {
57
63
  key: 'hour',
@@ -60,7 +66,7 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
60
66
  enabled: false,
61
67
  default: 0,
62
68
  typedValue: null,
63
- realValue: () => this.formatService.format(this._editingDate(), 'datetime', this._editingParts.hour.placeholder),
69
+ realValue: () => this._formatPart(this._editingDate(), this._editingParts.hour.placeholder),
64
70
  },
65
71
  minute: {
66
72
  key: 'minute',
@@ -69,7 +75,7 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
69
75
  enabled: false,
70
76
  default: 0,
71
77
  typedValue: null,
72
- realValue: () => this.formatService.format(this._editingDate(), 'datetime', this._editingParts.minute.placeholder),
78
+ realValue: () => this._formatPart(this._editingDate(), this._editingParts.minute.placeholder),
73
79
  },
74
80
  second: {
75
81
  key: 'second',
@@ -78,7 +84,7 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
78
84
  enabled: false,
79
85
  default: 0,
80
86
  typedValue: null,
81
- realValue: () => this.formatService.format(this._editingDate(), 'datetime', this._editingParts.second.placeholder),
87
+ realValue: () => this._formatPart(this._editingDate(), this._editingParts.second.placeholder),
82
88
  },
83
89
  AMPM: {
84
90
  key: 'AMPM',
@@ -87,65 +93,84 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
87
93
  enabled: false,
88
94
  default: 0,
89
95
  typedValue: null,
90
- realValue: () => this.formatService.format(this._editingDate(), 'datetime', this._editingParts.AMPM.placeholder),
96
+ realValue: () => this._formatPart(this._editingDate(), this._editingParts.AMPM.placeholder),
91
97
  },
92
98
  };
93
- /**
94
- * @ignore
95
- */
99
+ /** @ignore */
96
100
  this._editingText = signal('', ...(ngDevMode ? [{ debugName: "_editingText" }] : []));
97
- /**
98
- * @ignore
99
- */
101
+ /** @ignore */
100
102
  this._inputChars = [];
103
+ /** @ignore */
104
+ this._activePart = signal(null, ...(ngDevMode ? [{ debugName: "_activePart" }] : []));
101
105
  /**
102
- * Indicates whether typing is allowed in the input field.
106
+ * When true, the user can type digits and navigate segments with the keyboard.
107
+ * When false, keyboard input is blocked (used by datetime-box picker mode).
108
+ * Defaults to `AX_DATETIME_INPUT_CONFIG.allowTyping` when not set on the instance.
103
109
  * @defaultValue false
104
110
  */
105
- this.allowTyping = input(false, ...(ngDevMode ? [{ debugName: "allowTyping" }] : []));
111
+ this.allowTyping = input(this.defaultConfig.allowTyping, ...(ngDevMode ? [{ debugName: "allowTyping" }] : []));
106
112
  /**
107
113
  * @description The calendar type to use for the datetime input.
108
114
  */
109
115
  this.calendar = input(null, ...(ngDevMode ? [{ debugName: "calendar" }] : []));
110
- this._calendarSystem = computed(() => this.calendar() ?? this.localeService.activeProfile().calendar.system, ...(ngDevMode ? [{ debugName: "_calendarSystem" }] : []));
111
- this._activePart = signal(null, ...(ngDevMode ? [{ debugName: "_activePart" }] : []));
112
- // TODO: fix this
113
- // #effect = effect(() => {
114
- // this._activePart()
115
- // this._clearInputBuffer();
116
- // });
117
- this._editingDate = linkedSignal(() => this.calendarService.now(this._calendarSystem()), ...(ngDevMode ? [{ debugName: "_editingDate" }] : []));
118
- /**
119
- * @ignore
120
- */
121
- this.input = viewChild('input', ...(ngDevMode ? [{ debugName: "input" }] : []));
122
116
  this.minValue = input(null, ...(ngDevMode ? [{ debugName: "minValue" }] : []));
123
117
  this.maxValue = input(null, ...(ngDevMode ? [{ debugName: "maxValue" }] : []));
124
118
  /**
125
- * Emitted when a click event occurs on the datetime box.
119
+ * Emitted when a click event occurs on the datetime input.
126
120
  * @event
127
121
  */
128
122
  this.onClick = output();
129
123
  this.picker = input('datetime', ...(ngDevMode ? [{ debugName: "picker" }] : []));
130
- this._resolvedFormat = computed(() => this.format() ?? this.localeService.activeProfile().formats[this.picker()]?.short ?? '', ...(ngDevMode ? [{ debugName: "_resolvedFormat" }] : []));
131
124
  /**
132
125
  * @deprecated use locale & mode instead
133
126
  */
134
127
  this.format = input(...(ngDevMode ? [undefined, { debugName: "format" }] : []));
135
- this.#effect = effect(() => {
128
+ this._calendarSystem = computed(() => this.calendar() ?? this.localeService.activeProfile().calendar.system, ...(ngDevMode ? [{ debugName: "_calendarSystem" }] : []));
129
+ this._resolvedFormat = computed(() => {
130
+ if (this.format()) {
131
+ return this.format();
132
+ }
133
+ // Calendar override can differ from the active locale; solar-hijri uses day/month/year.
134
+ const formats = this._calendarSystem() === 'solar-hijri' ? AXIRLocaleProfile.formats : this.localeService.activeProfile().formats;
135
+ return formats[this.picker()]?.short ?? '';
136
+ }, ...(ngDevMode ? [{ debugName: "_resolvedFormat" }] : []));
137
+ /** @ignore */
138
+ this._editingDate = linkedSignal(() => this.calendarService.now(this._calendarSystem()), ...(ngDevMode ? [{ debugName: "_editingDate" }] : []));
139
+ /** @ignore */
140
+ this.inputRef = viewChild('input', ...(ngDevMode ? [{ debugName: "inputRef" }] : []));
141
+ /**
142
+ * @description check if page is in rtl or ltr
143
+ */
144
+ this.isRtl = signal(this.platformService.isRtl(), ...(ngDevMode ? [{ debugName: "isRtl" }] : []));
145
+ /** @ignore */
146
+ this.#formatEffect = effect(() => {
136
147
  this._resolvedFormat();
137
148
  this._calendarSystem();
138
149
  this._detectParts();
139
150
  untracked(() => {
140
- this._updateText();
151
+ this.internalValueChanged(this.value);
141
152
  });
142
- }, ...(ngDevMode ? [{ debugName: "#effect" }] : []));
143
- /**
144
- * @description check if page is in rtl or ltr
145
- */
146
- this.isRtl = signal(this.platformService.isRtl(), ...(ngDevMode ? [{ debugName: "isRtl" }] : []));
153
+ }, ...(ngDevMode ? [{ debugName: "#formatEffect" }] : []));
147
154
  }
148
- #effect;
155
+ /** @ignore */
156
+ get inputElement() {
157
+ return this.inputRef()?.nativeElement;
158
+ }
159
+ /** @ignore */
160
+ #formatEffect;
161
+ /** @ignore */
162
+ ngOnInit() {
163
+ super.ngOnInit();
164
+ this.platformService.directionChange.pipe(map((i) => i.data === 'rtl')).subscribe((isRtl) => this.isRtl.set(isRtl));
165
+ }
166
+ /**
167
+ * Formats a part using the calendar already attached to the AXDateTime.
168
+ * @ignore
169
+ */
170
+ _formatPart(date, placeholder) {
171
+ return date.format(placeholder);
172
+ }
173
+ /** @ignore */
149
174
  _detectParts() {
150
175
  Object.values(this._editingParts).forEach((e) => {
151
176
  e.enabled = false;
@@ -159,17 +184,8 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
159
184
  }
160
185
  });
161
186
  }
162
- /**
163
- * @description listen to direction change to react to it.
164
- */
165
- ngOnInit() {
166
- this.platformService.directionChange.pipe(map((i) => i.data === 'rtl')).subscribe((isRtl) => this.isRtl.set(isRtl));
167
- }
168
- /**
169
- * @ignore
170
- */
187
+ /** @ignore */
171
188
  _getOrderedParts() {
172
- // TODO: better spliter format
173
189
  const formatParts = this._resolvedFormat().split(/[^a-zA-Z]+/);
174
190
  const result = [];
175
191
  formatParts.forEach((f) => {
@@ -179,18 +195,13 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
179
195
  });
180
196
  return result;
181
197
  }
182
- /**
183
- * @ignore
184
- */
198
+ /** @ignore */
185
199
  _clearInputBuffer() {
186
200
  this._inputChars = [];
187
201
  }
188
- /**
189
- * @ignore
190
- */
202
+ /** @ignore */
191
203
  _updateText() {
192
204
  let text = this._resolvedFormat();
193
- //
194
205
  Object.values(this._editingParts).forEach((part) => {
195
206
  if (this._activePart() == part.key) {
196
207
  if (part.typedValue)
@@ -207,52 +218,50 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
207
218
  this._highlightActivePart();
208
219
  }
209
220
  }
210
- //TODO: fix this
211
- /**
212
- * Sets the internal date value, adjusting it based on editing parts.
213
- * @param value - The date to set. Returns `undefined` if no value is provided.
214
- * @ignore
215
- */
216
- // override internalSetValue(value?: Date) {
217
- // console.log('internalSetValue', value);
218
- // if (value) {
219
- // let editingDate = this.calendarService.create(value, this._calendarSystem());
220
- // let applyChanges = false;
221
- // Object.values(this._editingParts).forEach((part) => {
222
- // if (!part.enabled) {
223
- // editingDate = editingDate.set(part.key as TimeUnit, part.default);
224
- // applyChanges = true;
225
- // }
226
- // });
227
- // if (applyChanges) {
228
- // return editingDate.date;
229
- // }
230
- // }
231
- // return value;
232
- // }
233
221
  /**
234
222
  * Handles changes to the internal date value, updating editing parts and text representation.
235
- *
236
- * @param value - The new date value. If not provided, resets editing parts.
237
223
  * @ignore
238
224
  */
239
225
  internalValueChanged(value) {
240
226
  if (value && this.calendarService.isValidDate(value)) {
241
- this._editingDate.set(this.calendarService.create(value, this._calendarSystem()));
242
- }
243
- Object.values(this._editingParts).forEach((part) => {
244
- if (value) {
245
- if (part.typedValue != part.placeholder)
246
- part.typedValue = part.realValue();
227
+ const next = this.calendarService.create(value, this._calendarSystem());
228
+ const sameAsEditing = this._editingDate().date.getTime() === next.date.getTime();
229
+ this._editingDate.set(next);
230
+ // Parent ngModel echo after typing — keep the in-progress segment buffer.
231
+ if (sameAsEditing && this._activePart()) {
232
+ this._updateText();
233
+ return;
247
234
  }
248
- else
235
+ Object.values(this._editingParts).forEach((part) => {
236
+ part.typedValue = part.enabled ? part.realValue() : null;
237
+ });
238
+ this._clearInputBuffer();
239
+ }
240
+ else {
241
+ Object.values(this._editingParts).forEach((part) => {
249
242
  part.typedValue = null;
250
- });
243
+ });
244
+ this._clearInputBuffer();
245
+ }
251
246
  this._updateText();
252
247
  }
253
248
  /**
254
- * @ignore
249
+ * Normalizes Persian (U+06F0-U+06F9) and Arabic-Indic (U+0660-U+0669) digits to ASCII.
250
+ * @ignore
255
251
  */
252
+ _normalizeDigit(key) {
253
+ if (!key || key.length !== 1)
254
+ return null;
255
+ const code = key.charCodeAt(0);
256
+ if (code >= 0x30 && code <= 0x39)
257
+ return key;
258
+ if (code >= 0x06f0 && code <= 0x06f9)
259
+ return String.fromCharCode(code - 0x06f0 + 0x30);
260
+ if (code >= 0x0660 && code <= 0x0669)
261
+ return String.fromCharCode(code - 0x0660 + 0x30);
262
+ return null;
263
+ }
264
+ /** @ignore */
256
265
  _handleOnKeydownEvent(e) {
257
266
  const ignore = () => {
258
267
  if (e.key === 'Tab' || e.code === 'Space' || e.code === 'Enter') {
@@ -266,12 +275,10 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
266
275
  return;
267
276
  }
268
277
  const input = e.target;
269
- //
270
278
  const orderedParts = this._getOrderedParts();
271
279
  const part = this._activePart() ? this._editingParts[this._activePart()] : orderedParts[0];
272
280
  const nextPart = part ? orderedParts[orderedParts.indexOf(part) + 1] : null;
273
281
  const prevPart = part ? orderedParts[orderedParts.indexOf(part) - 1] : null;
274
- //
275
282
  const goNext = () => {
276
283
  this._clearInputBuffer();
277
284
  if (nextPart) {
@@ -286,41 +293,48 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
286
293
  this._highlightActivePart();
287
294
  }
288
295
  };
289
- /*************** Handle Left and Right **************/
296
+ const digit = this._normalizeDigit(e.key);
290
297
  if (e.code === 'ArrowRight' || e.code === 'ArrowLeft') {
291
298
  ignore();
292
- e.code === 'ArrowRight' ? goNext() : goPrev();
299
+ if (!this._activePart()) {
300
+ this._activePart.set(part?.key ?? null);
301
+ this._highlightActivePart();
302
+ }
303
+ else {
304
+ e.code === 'ArrowRight' ? goNext() : goPrev();
305
+ }
293
306
  }
294
307
  else if ((e.code === 'ArrowUp' || e.code === 'ArrowDown') && !e.ctrlKey) {
295
- /*************** Handle Up and Down **************/
296
- if (this.disabled || this.readonly) {
297
- ignore();
308
+ ignore();
309
+ if (this.disabled || this.readonly || !part) {
298
310
  return;
299
311
  }
300
- else {
301
- ignore();
302
- const sign = e.code === 'ArrowUp' ? +1 : -1;
303
- this._activePart.set(part.key);
304
- const newVal = this._editingDate().add(part.key, sign);
305
- this._editingParts[part.key].typedValue = this.formatService.format(newVal, 'datetime', this._editingParts[part.key].placeholder);
306
- this._editingDate.set(newVal);
307
- this._detectValueChanges();
308
- }
312
+ const sign = e.code === 'ArrowUp' ? +1 : -1;
313
+ this._activePart.set(part.key);
314
+ this._clearInputBuffer();
315
+ const unit = part.key === 'AMPM' ? 'hour' : part.key;
316
+ const amount = part.key === 'AMPM' ? sign * 12 : sign;
317
+ const newVal = this._editingDate().add(unit, amount);
318
+ this._editingDate.set(newVal);
319
+ this._getOrderedParts().forEach((p) => {
320
+ p.typedValue = p.realValue();
321
+ });
322
+ this._detectValueChanges();
309
323
  }
310
324
  else if (e.code == 'Backspace' || e.code == 'Delete') {
311
- /*************** Handle Backspace **************/
312
- if (this.disabled || this.readonly) {
325
+ if (this.disabled || this.readonly || !part) {
313
326
  return;
314
327
  }
315
328
  if (input.value) {
316
329
  ignore();
330
+ this._clearInputBuffer();
331
+ this._activePart.set(part.key);
317
332
  this._editingParts[part.key].typedValue = this._editingParts[part.key].placeholder;
318
- this._detectValueChanges();
333
+ this._updateText();
319
334
  goPrev();
320
335
  }
321
336
  }
322
337
  else if (e.code == 'Tab' || e.code == 'Space') {
323
- /*************** Handle Backspace **************/
324
338
  if (input.value) {
325
339
  if (!e.shiftKey && nextPart) {
326
340
  ignore();
@@ -331,192 +345,184 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
331
345
  goPrev();
332
346
  }
333
347
  }
334
- // TODO: FiX type in input
335
348
  }
336
- else if (e.key?.trim() && !isNaN(Number(e.key))) {
349
+ else if (digit != null) {
350
+ ignore();
351
+ if (this.disabled || this.readonly || !part) {
352
+ return;
353
+ }
354
+ this._activePart.set(part.key);
355
+ this._handleDigitInput(part, digit, goNext);
356
+ }
357
+ else if (part?.key === 'AMPM' && (e.key?.toLowerCase() === 'a' || e.key?.toLowerCase() === 'p')) {
337
358
  ignore();
338
- return;
339
359
  if (this.disabled || this.readonly) {
340
360
  return;
341
361
  }
342
- let next = false;
343
- const editing = this._editingParts[part.key];
344
- //
345
- switch (part.key) {
346
- case 'year': {
347
- if (editing.placeholder.length == 2 && this._inputChars.length == 0) {
348
- this._inputChars.push(...this.formatService
349
- .format(this.calendarService.now(this._calendarSystem()), 'datetime', 'yyyy')
350
- .substring(0, 2)
351
- .split(''));
352
- }
353
- if (this._inputChars.length < 4) {
354
- editing.typedValue = `${this._inputChars.join('')}${e.key}`;
355
- this._inputChars.push(e.key);
356
- if (this._inputChars.length > 3) {
357
- next = true;
358
- }
359
- }
360
- else {
361
- next = true;
362
- }
363
- editing.typedValue = ('0000' + editing.typedValue).slice(-4);
364
- const nv = parseInt(editing.typedValue);
365
- //if (nv > 0) {
366
- const newVal = this._editingDate().set('year', nv);
367
- this._editingDate.set(newVal);
368
- this._detectValueChanges();
369
- //}
370
- break;
362
+ const hour = this._editingDate().hour;
363
+ const wantsPM = e.key.toLowerCase() === 'p';
364
+ if (wantsPM && hour < 12) {
365
+ this._applyEditingDate(this._editingDate().add('hour', 12));
366
+ }
367
+ else if (!wantsPM && hour >= 12) {
368
+ this._applyEditingDate(this._editingDate().add('hour', -12));
369
+ }
370
+ }
371
+ else {
372
+ ignore();
373
+ }
374
+ super.emitOnKeydownEvent(e);
375
+ }
376
+ /** @ignore */
377
+ _handleDigitInput(part, digit, goNext) {
378
+ let next = false;
379
+ const editing = this._editingParts[part.key];
380
+ switch (part.key) {
381
+ case 'year': {
382
+ if (editing.placeholder.length == 2 && this._inputChars.length == 0) {
383
+ this._inputChars.push(...this._formatPart(this.calendarService.now(this._calendarSystem()), 'yyyy').substring(0, 2).split(''));
371
384
  }
372
- case 'month': {
373
- if (this._inputChars.length == 0) {
374
- this._inputChars.push(e.key);
375
- editing.typedValue = `0${e.key}`;
376
- if (parseInt(e.key) > 1) {
377
- this._clearInputBuffer();
378
- next = true;
379
- }
380
- }
381
- else if (this._inputChars.length == 1) {
382
- const newStr = parseInt(`${this._inputChars[0]}${e.key}`);
383
- if (newStr > 12) {
384
- editing.typedValue = `0${e.key}`;
385
- }
386
- else {
387
- editing.typedValue = newStr.toString();
388
- }
389
- this._clearInputBuffer();
385
+ this._inputChars.push(digit);
386
+ editing.typedValue = ('0000' + this._inputChars.join('')).slice(-4);
387
+ if (this._inputChars.length >= 4) {
388
+ next = true;
389
+ }
390
+ const nv = parseInt(editing.typedValue);
391
+ if (nv > 0) {
392
+ this._applyEditingDate(this._editingDate().set('year', nv));
393
+ }
394
+ break;
395
+ }
396
+ case 'month': {
397
+ if (this._inputChars.length == 0) {
398
+ this._inputChars.push(digit);
399
+ editing.typedValue = `0${digit}`;
400
+ if (parseInt(digit) > 1) {
390
401
  next = true;
391
402
  }
392
- editing.typedValue = editing.typedValue?.length === 1 ? '0' + editing.typedValue : editing.typedValue;
393
- const nv = parseInt(editing.typedValue);
394
- if (nv > 0) {
395
- const newVal = this._editingDate().set(part.key, nv);
396
- this._editingDate.set(newVal);
397
- this._detectValueChanges();
398
- }
399
- break;
400
403
  }
401
- case 'day': {
402
- if (this._inputChars.length == 0) {
403
- this._inputChars.push(e.key);
404
- editing.typedValue = `0${e.key}`;
405
- if (parseInt(e.key) > 3) {
406
- this._clearInputBuffer();
407
- next = true;
408
- }
409
- }
410
- else if (this._inputChars.length == 1) {
411
- const newStr = parseInt(`${this._inputChars[0]}${e.key}`);
412
- if (newStr > this._editingDate().month.totalDays) {
413
- editing.typedValue = `0${e.key}`;
414
- }
415
- else {
416
- editing.typedValue = newStr.toString();
417
- }
418
- this._clearInputBuffer();
404
+ else {
405
+ const combined = parseInt(`${this._inputChars[0]}${digit}`);
406
+ editing.typedValue = combined > 12 || combined < 1 ? `0${digit}` : `${combined}`.padStart(2, '0');
407
+ next = true;
408
+ }
409
+ const nv = parseInt(editing.typedValue);
410
+ if (nv > 0) {
411
+ this._applyEditingDate(this._editingDate().set('month', nv));
412
+ }
413
+ break;
414
+ }
415
+ case 'day': {
416
+ const totalDays = this._editingDate().month.totalDays;
417
+ if (this._inputChars.length == 0) {
418
+ this._inputChars.push(digit);
419
+ editing.typedValue = `0${digit}`;
420
+ if (parseInt(digit) > Math.floor(totalDays / 10)) {
419
421
  next = true;
420
422
  }
421
- editing.typedValue = editing.typedValue?.length === 1 ? '0' + editing.typedValue : editing.typedValue;
422
- const nv = parseInt(editing.typedValue);
423
- if (nv > 0) {
424
- const newVal = this._editingDate().set(part.key, nv);
425
- this._editingDate.set(newVal);
426
- this._detectValueChanges();
427
- }
428
- break;
429
423
  }
430
- case 'hour': {
431
- if (this._inputChars.length == 0) {
432
- this._inputChars.push(e.key);
433
- editing.typedValue = `0${e.key}`;
434
- if (parseInt(e.key) > 2) {
435
- next = true;
436
- }
437
- }
438
- else if (this._inputChars.length == 1) {
439
- const newStr = parseInt(`${this._inputChars[0]}${e.key}`);
440
- if (newStr > 23) {
441
- editing.typedValue = `0${e.key}`;
442
- }
443
- else {
444
- editing.typedValue = newStr.toString();
445
- }
424
+ else {
425
+ const combined = parseInt(`${this._inputChars[0]}${digit}`);
426
+ editing.typedValue = combined > totalDays || combined < 1 ? `0${digit}` : `${combined}`.padStart(2, '0');
427
+ next = true;
428
+ }
429
+ const nv = parseInt(editing.typedValue);
430
+ if (nv > 0) {
431
+ this._applyEditingDate(this._editingDate().set('day', nv));
432
+ }
433
+ break;
434
+ }
435
+ case 'hour': {
436
+ if (this._inputChars.length == 0) {
437
+ this._inputChars.push(digit);
438
+ editing.typedValue = `0${digit}`;
439
+ if (parseInt(digit) > 2) {
446
440
  next = true;
447
441
  }
448
- editing.typedValue = editing.typedValue?.length === 1 ? '0' + editing.typedValue : editing.typedValue;
449
- const newVal = this._editingDate().set('hour', parseInt(editing.typedValue));
450
- this._editingDate.set(newVal);
451
- this._detectValueChanges();
452
- break;
453
442
  }
454
- case 'minute':
455
- case 'second':
456
- if (this._inputChars.length == 0) {
457
- this._inputChars.push(e.key);
458
- editing.typedValue = `0${e.key}`;
459
- if (parseInt(e.key) > 5) {
460
- this._clearInputBuffer();
461
- next = true;
462
- }
463
- }
464
- else if (this._inputChars.length == 1) {
465
- const newStr = parseInt(`${this._inputChars[0]}${e.key}`);
466
- if (newStr > 59) {
467
- editing.typedValue = `0${e.key}`;
468
- }
469
- else {
470
- editing.typedValue = newStr.toString();
471
- }
472
- this._clearInputBuffer();
443
+ else {
444
+ const combined = parseInt(`${this._inputChars[0]}${digit}`);
445
+ editing.typedValue = combined > 23 ? `0${digit}` : `${combined}`.padStart(2, '0');
446
+ next = true;
447
+ }
448
+ this._applyEditingDate(this._editingDate().set('hour', parseInt(editing.typedValue)));
449
+ break;
450
+ }
451
+ case 'minute':
452
+ case 'second': {
453
+ if (this._inputChars.length == 0) {
454
+ this._inputChars.push(digit);
455
+ editing.typedValue = `0${digit}`;
456
+ if (parseInt(digit) > 5) {
473
457
  next = true;
474
458
  }
475
- editing.typedValue = editing.typedValue?.length === 1 ? '0' + editing.typedValue : editing.typedValue;
476
- // eslint-disable-next-line no-case-declarations
477
- const newVal = this._editingDate().set(part.key, parseInt(editing.typedValue));
478
- this._editingDate.set(newVal);
479
- this._detectValueChanges();
480
- break;
481
- default:
459
+ }
460
+ else {
461
+ const combined = parseInt(`${this._inputChars[0]}${digit}`);
462
+ editing.typedValue = combined > 59 ? `0${digit}` : `${combined}`.padStart(2, '0');
463
+ next = true;
464
+ }
465
+ this._applyEditingDate(this._editingDate().set(part.key, parseInt(editing.typedValue)));
466
+ break;
482
467
  }
483
- if (next) {
484
- goNext();
468
+ default:
485
469
  return;
486
- }
487
470
  }
488
- /*************** Emit Event **************/
489
- super.emitOnKeydownEvent(e);
471
+ if (next) {
472
+ goNext();
473
+ }
490
474
  }
491
- /**
492
- * @ignore
493
- */
475
+ /** @ignore */
476
+ _applyEditingDate(value) {
477
+ this._editingDate.set(value);
478
+ this._detectValueChanges();
479
+ }
480
+ /** @ignore */
494
481
  _handleKeyUpEvent() {
495
482
  if (this._activePart()) {
496
483
  this._highlightActivePart();
497
484
  }
498
485
  }
499
- /**
500
- * @ignore
501
- */
486
+ /** @ignore */
502
487
  _handleFocusEvent(e) {
503
- //this._highlightActivePart();
488
+ if (this.allowTyping()) {
489
+ setTimeout(() => this._selectFirstPart(), 0);
490
+ }
504
491
  super.emitOnFocusEvent(e);
505
492
  }
506
- /**
507
- * @ignore
508
- */
493
+ /** @ignore */
509
494
  _handleBlurEvent(e) {
495
+ this._activePart.set(null);
496
+ this._clearInputBuffer();
497
+ if (this.allowTyping()) {
498
+ this._clampToRange();
499
+ if (!this.value) {
500
+ Object.values(this._editingParts).forEach((part) => {
501
+ part.typedValue = null;
502
+ });
503
+ this._editingText.set('');
504
+ }
505
+ }
510
506
  super.emitOnBlurEvent(e);
511
507
  }
512
- /**
513
- * @ignore
514
- */
508
+ /** @ignore */
509
+ _clampToRange() {
510
+ const value = this.value;
511
+ if (!value)
512
+ return;
513
+ const min = this.minValue();
514
+ const max = this.maxValue();
515
+ if (min && value.getTime() < min.getTime()) {
516
+ this.commitValue(new Date(min), true);
517
+ }
518
+ else if (max && value.getTime() > max.getTime()) {
519
+ this.commitValue(new Date(max), true);
520
+ }
521
+ }
522
+ /** @ignore */
515
523
  _handleOnInputClickEvent(e) {
516
524
  if (this.allowTyping()) {
517
- setTimeout(() => {
518
- this._detectPartAtPosition();
519
- }, 0);
525
+ setTimeout(() => this._selectFirstPart(), 0);
520
526
  }
521
527
  this.onClick.emit({
522
528
  component: this,
@@ -524,26 +530,39 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
524
530
  nativeEvent: e,
525
531
  });
526
532
  }
527
- /**
528
- * @ignore
529
- */
530
- _detectPartAtPosition() {
531
- const input = this.input();
532
- if (!input || !input.value)
533
- return;
534
- const sStart = input.selectionEnd || 0;
535
- const re = /[a-zA-Z0-9]+/gi;
536
- const valueParts = Array.from(input.value.matchAll(re));
533
+ /** @ignore */
534
+ _selectFirstPart() {
537
535
  const orderedParts = this._getOrderedParts();
538
- const index = valueParts.findIndex((c) => c.index <= sStart && c.index + c[0].length >= sStart);
539
- this._activePart.set(orderedParts[index].key);
540
- this._highlightActivePart();
536
+ if (!orderedParts.length)
537
+ return;
538
+ this._clearInputBuffer();
539
+ this._activePart.set(orderedParts[0].key);
540
+ const wasEmpty = !this._editingText();
541
+ this._ensureEditableText();
542
+ if (wasEmpty) {
543
+ setTimeout(() => this._highlightActivePart(), 0);
544
+ }
545
+ else {
546
+ this._highlightActivePart();
547
+ }
541
548
  }
542
- /**
543
- * @ignore
544
- */
549
+ /** @ignore */
550
+ _ensureEditableText() {
551
+ if (this._editingText())
552
+ return;
553
+ const format = this._resolvedFormat();
554
+ if (!format)
555
+ return;
556
+ Object.values(this._editingParts).forEach((part) => {
557
+ if (part.enabled && part.typedValue == null) {
558
+ part.typedValue = part.placeholder;
559
+ }
560
+ });
561
+ this._editingText.set(format);
562
+ }
563
+ /** @ignore */
545
564
  _highlightActivePart() {
546
- const input = this.input();
565
+ const input = this.inputElement;
547
566
  if (!input || !input.value || !this._activePart())
548
567
  return;
549
568
  const orderedParts = this._getOrderedParts();
@@ -555,17 +574,12 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
555
574
  input.setSelectionRange(start, end);
556
575
  }
557
576
  }
558
- /**
559
- * @ignore
560
- */
577
+ /** @ignore */
561
578
  _detectValueChanges() {
562
579
  this.commitValue(this._editingDate().date, true);
563
580
  }
564
- get __hostName() {
565
- return this.name;
566
- }
567
581
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXDateTimeInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
568
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.3", type: AXDateTimeInputComponent, isStandalone: true, selector: "ax-datetime-input", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: false, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: false, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: false, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: false, isRequired: false, transformFunction: null }, allowTyping: { classPropertyName: "allowTyping", publicName: "allowTyping", isSignal: true, isRequired: false, transformFunction: null }, calendar: { classPropertyName: "calendar", publicName: "calendar", isSignal: true, isRequired: false, transformFunction: null }, minValue: { classPropertyName: "minValue", publicName: "minValue", isSignal: true, isRequired: false, transformFunction: null }, maxValue: { classPropertyName: "maxValue", publicName: "maxValue", isSignal: true, isRequired: false, transformFunction: null }, picker: { classPropertyName: "picker", publicName: "picker", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", stateChange: "stateChange", onValueChanged: "onValueChanged", onBlur: "onBlur", onFocus: "onFocus", readonlyChange: "readonlyChange", disabledChange: "disabledChange", onClick: "onClick" }, host: { listeners: { "keydown": "_handleOnKeydownEvent($event)", "keyup": "_handleKeyUpEvent()" }, properties: { "attr.name": "this.__hostName" } }, providers: [
582
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.3", type: AXDateTimeInputComponent, isStandalone: true, selector: "ax-datetime-input", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: false, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: false, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: false, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: false, isRequired: false, transformFunction: null }, allowTyping: { classPropertyName: "allowTyping", publicName: "allowTyping", isSignal: true, isRequired: false, transformFunction: null }, calendar: { classPropertyName: "calendar", publicName: "calendar", isSignal: true, isRequired: false, transformFunction: null }, minValue: { classPropertyName: "minValue", publicName: "minValue", isSignal: true, isRequired: false, transformFunction: null }, maxValue: { classPropertyName: "maxValue", publicName: "maxValue", isSignal: true, isRequired: false, transformFunction: null }, picker: { classPropertyName: "picker", publicName: "picker", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", stateChange: "stateChange", onValueChanged: "onValueChanged", onBlur: "onBlur", onFocus: "onFocus", readonlyChange: "readonlyChange", disabledChange: "disabledChange", onKeyDown: "onKeyDown", onKeyUp: "onKeyUp", onKeyPress: "onKeyPress", onClick: "onClick" }, host: { listeners: { "keydown": "_handleOnKeydownEvent($event)", "keyup": "_handleKeyUpEvent()" }, properties: { "attr.name": "name" } }, providers: [
569
583
  { provide: AXComponent, useExisting: AXDateTimeInputComponent },
570
584
  { provide: AXFocusableComponent, useExisting: AXDateTimeInputComponent },
571
585
  { provide: AXValuableComponent, useExisting: AXDateTimeInputComponent },
@@ -575,11 +589,22 @@ class AXDateTimeInputComponent extends MXInputBaseValueComponent {
575
589
  useExisting: forwardRef(() => AXDateTimeInputComponent),
576
590
  multi: true,
577
591
  },
578
- ], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<input\n #input\n id=\"input\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n class=\"ax-input\"\n type=\"text\"\n [attr.placeholder]=\"placeholder\"\n [class.ax-state-disabled]=\"disabled\"\n [class.ax-select-none]=\"!allowTyping()\"\n [class.ax-state-readonly]=\"readonly\"\n [disabled]=\"disabled\"\n [readonly]=\"true\"\n [ngModel]=\"_editingText()\"\n (mouseup)=\"_handleOnInputClickEvent($event)\"\n (blur)=\"_handleBlurEvent($event)\"\n (focus)=\"_handleFocusEvent($event)\"\n [style.text-align]=\"isRtl() ? 'end' : 'start'\"\n [tabindex]=\"tabIndex\"\n/>\n<ng-content select=\"ax-validation-rule\"> </ng-content>\n", styles: [".ax-select-none,.ax-select-none *{-webkit-user-select:none!important;user-select:none!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
592
+ ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<input\n #input\n id=\"input\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n class=\"ax-input\"\n type=\"text\"\n [dir]=\"isRtl() ? 'rtl' : 'ltr'\"\n [attr.placeholder]=\"placeholder || _resolvedFormat()\"\n [class.ax-state-disabled]=\"disabled\"\n [class.ax-select-none]=\"!allowTyping()\"\n [class.ax-state-readonly]=\"readonly\"\n [disabled]=\"disabled\"\n [readonly]=\"true\"\n [ngModel]=\"_editingText()\"\n (mouseup)=\"_handleOnInputClickEvent($event)\"\n (blur)=\"_handleBlurEvent($event)\"\n (focus)=\"_handleFocusEvent($event)\"\n [style.text-align]=\"isRtl() ? 'end' : 'start'\"\n [tabindex]=\"tabIndex\"\n/>\n<ng-content select=\"ax-validation-rule\"> </ng-content>\n", styles: [".ax-select-none,.ax-select-none *{-webkit-user-select:none!important;user-select:none!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
579
593
  }
580
594
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXDateTimeInputComponent, decorators: [{
581
595
  type: Component,
582
- args: [{ selector: 'ax-datetime-input', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, inputs: ['disabled', 'readonly', 'tabIndex', 'placeholder', 'value', 'state', 'name', 'id'], outputs: ['valueChange', 'stateChange', 'onValueChanged', 'onBlur', 'onFocus', 'readonlyChange', 'disabledChange'], providers: [
596
+ args: [{ selector: 'ax-datetime-input', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, inputs: ['disabled', 'readonly', 'tabIndex', 'placeholder', 'value', 'state', 'name', 'id'], outputs: [
597
+ 'valueChange',
598
+ 'stateChange',
599
+ 'onValueChanged',
600
+ 'onBlur',
601
+ 'onFocus',
602
+ 'readonlyChange',
603
+ 'disabledChange',
604
+ 'onKeyDown',
605
+ 'onKeyUp',
606
+ 'onKeyPress',
607
+ ], providers: [
583
608
  { provide: AXComponent, useExisting: AXDateTimeInputComponent },
584
609
  { provide: AXFocusableComponent, useExisting: AXDateTimeInputComponent },
585
610
  { provide: AXValuableComponent, useExisting: AXDateTimeInputComponent },
@@ -589,17 +614,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
589
614
  useExisting: forwardRef(() => AXDateTimeInputComponent),
590
615
  multi: true,
591
616
  },
592
- ], imports: [FormsModule], template: "<input\n #input\n id=\"input\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n class=\"ax-input\"\n type=\"text\"\n [attr.placeholder]=\"placeholder\"\n [class.ax-state-disabled]=\"disabled\"\n [class.ax-select-none]=\"!allowTyping()\"\n [class.ax-state-readonly]=\"readonly\"\n [disabled]=\"disabled\"\n [readonly]=\"true\"\n [ngModel]=\"_editingText()\"\n (mouseup)=\"_handleOnInputClickEvent($event)\"\n (blur)=\"_handleBlurEvent($event)\"\n (focus)=\"_handleFocusEvent($event)\"\n [style.text-align]=\"isRtl() ? 'end' : 'start'\"\n [tabindex]=\"tabIndex\"\n/>\n<ng-content select=\"ax-validation-rule\"> </ng-content>\n", styles: [".ax-select-none,.ax-select-none *{-webkit-user-select:none!important;user-select:none!important}\n"] }]
593
- }], propDecorators: { _handleOnKeydownEvent: [{
594
- type: HostListener,
595
- args: ['keydown', ['$event']]
596
- }], _handleKeyUpEvent: [{
597
- type: HostListener,
598
- args: ['keyup']
599
- }], __hostName: [{
600
- type: HostBinding,
601
- args: ['attr.name']
602
- }] } });
617
+ ], imports: [FormsModule], host: {
618
+ '(keydown)': '_handleOnKeydownEvent($event)',
619
+ '(keyup)': '_handleKeyUpEvent()',
620
+ '[attr.name]': 'name',
621
+ }, template: "<input\n #input\n id=\"input\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n class=\"ax-input\"\n type=\"text\"\n [dir]=\"isRtl() ? 'rtl' : 'ltr'\"\n [attr.placeholder]=\"placeholder || _resolvedFormat()\"\n [class.ax-state-disabled]=\"disabled\"\n [class.ax-select-none]=\"!allowTyping()\"\n [class.ax-state-readonly]=\"readonly\"\n [disabled]=\"disabled\"\n [readonly]=\"true\"\n [ngModel]=\"_editingText()\"\n (mouseup)=\"_handleOnInputClickEvent($event)\"\n (blur)=\"_handleBlurEvent($event)\"\n (focus)=\"_handleFocusEvent($event)\"\n [style.text-align]=\"isRtl() ? 'end' : 'start'\"\n [tabindex]=\"tabIndex\"\n/>\n<ng-content select=\"ax-validation-rule\"> </ng-content>\n", styles: [".ax-select-none,.ax-select-none *{-webkit-user-select:none!important;user-select:none!important}\n"] }]
622
+ }] });
603
623
 
604
624
  class AXDateTimeInputModule {
605
625
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXDateTimeInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -618,5 +638,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
618
638
  * Generated bundle index. Do not edit.
619
639
  */
620
640
 
621
- export { AXDateTimeInputComponent, AXDateTimeInputModule };
641
+ export { AXDateTimeInputComponent, AXDateTimeInputDefaultConfig, AXDateTimeInputModule, AX_DATETIME_INPUT_CONFIG };
622
642
  //# sourceMappingURL=acorex-components-datetime-input.mjs.map