ngxsmk-tel-input 1.5.8 → 1.6.1
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.
|
@@ -25,21 +25,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
25
25
|
}] });
|
|
26
26
|
|
|
27
27
|
class NgxsmkTelInputComponent {
|
|
28
|
-
set telI18n(v) {
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
set telLocalizedCountries(v) {
|
|
32
|
-
this.localizedCountries = v;
|
|
33
|
-
}
|
|
28
|
+
set telI18n(v) { this.i18n = v; }
|
|
29
|
+
set telLocalizedCountries(v) { this.localizedCountries = v; }
|
|
34
30
|
constructor(zone, tel) {
|
|
35
31
|
this.zone = zone;
|
|
36
32
|
this.tel = tel;
|
|
37
33
|
/* Core config */
|
|
38
34
|
this.initialCountry = 'US';
|
|
39
35
|
this.preferredCountries = ['US', 'GB'];
|
|
40
|
-
|
|
36
|
+
/** UI-only: flag/dial code. Input will ALWAYS show national digits only. */
|
|
41
37
|
this.separateDialCode = false;
|
|
42
38
|
this.allowDropdown = true;
|
|
39
|
+
/** UI “valid lock” while typing digits */
|
|
43
40
|
this.lockWhenValid = true;
|
|
44
41
|
this.autocomplete = 'tel';
|
|
45
42
|
this.disabled = false;
|
|
@@ -56,29 +53,29 @@ class NgxsmkTelInputComponent {
|
|
|
56
53
|
this.clearAriaLabel = 'Clear phone number';
|
|
57
54
|
this.dir = 'ltr';
|
|
58
55
|
/* Placeholders (intl-tel-input) */
|
|
59
|
-
this.autoPlaceholder = 'off';
|
|
56
|
+
this.autoPlaceholder = 'off';
|
|
57
|
+
/** When to live-format while typing (NATIONAL visible only) */
|
|
60
58
|
this.formatWhenValid = 'blur';
|
|
61
|
-
/* Digits-only controls */
|
|
59
|
+
/* Digits-only controls (visible input is digits-only regardless; these affect typing filters) */
|
|
62
60
|
this.digitsOnly = true;
|
|
63
|
-
this.allowLeadingPlus =
|
|
61
|
+
this.allowLeadingPlus = false;
|
|
64
62
|
/* Outputs */
|
|
65
63
|
this.countryChange = new EventEmitter();
|
|
66
64
|
this.validityChange = new EventEmitter();
|
|
67
65
|
this.inputChange = new EventEmitter();
|
|
68
66
|
/* Internal */
|
|
69
67
|
this.iti = null;
|
|
70
|
-
this.onChange = () => {
|
|
71
|
-
};
|
|
72
|
-
this.onTouchedCb = () => {
|
|
73
|
-
};
|
|
68
|
+
this.onChange = () => { };
|
|
69
|
+
this.onTouchedCb = () => { };
|
|
74
70
|
this.lastEmittedValid = false;
|
|
75
71
|
this.pendingWrite = null;
|
|
76
72
|
this.touched = false;
|
|
73
|
+
this.allowDropdownWasTrue = false;
|
|
74
|
+
this.suppressEvents = false;
|
|
77
75
|
this.resolvedId = this.inputId || ('tel-' + Math.random().toString(36).slice(2));
|
|
78
76
|
this.platformId = inject(PLATFORM_ID);
|
|
79
|
-
this.allowDropdownWasTrue = false;
|
|
80
|
-
this.suppressEvents = false; // already used elsewhere if you added it
|
|
81
77
|
}
|
|
78
|
+
// ---------- Lifecycle ----------
|
|
82
79
|
ngAfterViewInit() {
|
|
83
80
|
if (!isPlatformBrowser(this.platformId))
|
|
84
81
|
return;
|
|
@@ -88,7 +85,6 @@ class NgxsmkTelInputComponent {
|
|
|
88
85
|
await this.initIntlTelInput();
|
|
89
86
|
this.bindDomListeners();
|
|
90
87
|
if (this.pendingWrite !== null) {
|
|
91
|
-
// IMPORTANT: use writeValue so the plugin sets country, then we normalize input
|
|
92
88
|
const v = this.pendingWrite;
|
|
93
89
|
this.pendingWrite = null;
|
|
94
90
|
this.writeValue(v);
|
|
@@ -101,95 +97,70 @@ class NgxsmkTelInputComponent {
|
|
|
101
97
|
return;
|
|
102
98
|
const configChanged = [
|
|
103
99
|
'initialCountry', 'preferredCountries', 'onlyCountries',
|
|
104
|
-
'separateDialCode', 'allowDropdown',
|
|
100
|
+
'separateDialCode', 'allowDropdown',
|
|
105
101
|
'i18n', 'localizedCountries', 'dir',
|
|
106
|
-
'autoPlaceholder', 'utilsScript', 'customPlaceholder'
|
|
107
|
-
'digitsOnly', 'allowLeadingPlus'
|
|
102
|
+
'autoPlaceholder', 'utilsScript', 'customPlaceholder'
|
|
108
103
|
].some(k => k in changes && !changes[k]?.firstChange);
|
|
109
104
|
if (configChanged && this.iti) {
|
|
110
105
|
this.reinitPlugin();
|
|
111
106
|
this.validatorChange?.();
|
|
112
107
|
}
|
|
113
108
|
}
|
|
114
|
-
ngOnDestroy() {
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
// ----- CVA -----
|
|
109
|
+
ngOnDestroy() { this.destroyPlugin(); }
|
|
110
|
+
// ---------- CVA ----------
|
|
118
111
|
writeValue(val) {
|
|
119
112
|
if (!this.inputRef)
|
|
120
113
|
return;
|
|
121
|
-
if (!this.iti) {
|
|
114
|
+
if (!this.iti) { // not initialized yet
|
|
122
115
|
this.pendingWrite = val ?? '';
|
|
123
116
|
return;
|
|
124
117
|
}
|
|
125
118
|
this.suppressEvents = true;
|
|
126
119
|
try {
|
|
127
|
-
// Let plugin infer
|
|
120
|
+
// Let the plugin infer selected country from E.164
|
|
128
121
|
this.iti.setNumber(val || '');
|
|
129
122
|
const iso2 = this.currentIso2();
|
|
130
123
|
const normalized = this.stripTrunkZeroIfNeeded(val ?? '', iso2);
|
|
131
|
-
if (!normalized) {
|
|
132
|
-
this.setInputValue('');
|
|
133
|
-
this.zone.run(() => this.onChange(null));
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
124
|
const parsed = this.tel.parse(normalized, iso2);
|
|
137
|
-
//
|
|
138
|
-
this.
|
|
139
|
-
|
|
125
|
+
// Visible input: ALWAYS NATIONAL digits only
|
|
126
|
+
const nsn = this.toNSN(parsed.national ?? normalized.replace(/^\+\d+/, ''));
|
|
127
|
+
this.setInputValue(nsn);
|
|
128
|
+
// FormControl value: ALWAYS E.164 (or null)
|
|
140
129
|
this.zone.run(() => this.onChange(parsed.e164));
|
|
141
|
-
this.zone.run(() => this.inputChange.emit({ raw:
|
|
130
|
+
this.zone.run(() => this.inputChange.emit({ raw: nsn, e164: parsed.e164, iso2 }));
|
|
142
131
|
}
|
|
143
132
|
finally {
|
|
144
133
|
this.suppressEvents = false;
|
|
145
134
|
}
|
|
146
135
|
}
|
|
147
|
-
registerOnChange(fn) {
|
|
148
|
-
|
|
149
|
-
}
|
|
150
|
-
registerOnTouched(fn) {
|
|
151
|
-
this.onTouchedCb = fn;
|
|
152
|
-
}
|
|
136
|
+
registerOnChange(fn) { this.onChange = fn; }
|
|
137
|
+
registerOnTouched(fn) { this.onTouchedCb = fn; }
|
|
153
138
|
setDisabledState(isDisabled) {
|
|
154
139
|
this.disabled = isDisabled;
|
|
155
|
-
// 1) native input
|
|
140
|
+
// 1) native input state
|
|
156
141
|
if (this.inputRef)
|
|
157
142
|
this.inputRef.nativeElement.disabled = isDisabled;
|
|
158
|
-
// 2)
|
|
143
|
+
// 2) disable/enable dropdown robustly by toggling allowDropdown and reinit
|
|
159
144
|
if (this.iti) {
|
|
160
145
|
if (isDisabled && this.allowDropdown) {
|
|
161
146
|
this.allowDropdownWasTrue = true;
|
|
162
147
|
this.allowDropdown = false;
|
|
163
|
-
this.reinitPlugin();
|
|
148
|
+
this.reinitPlugin();
|
|
164
149
|
}
|
|
165
150
|
else if (!isDisabled && this.allowDropdownWasTrue) {
|
|
166
151
|
this.allowDropdown = true;
|
|
167
152
|
this.allowDropdownWasTrue = false;
|
|
168
|
-
this.reinitPlugin();
|
|
153
|
+
this.reinitPlugin();
|
|
169
154
|
}
|
|
170
155
|
else {
|
|
171
|
-
// even if we didn't reinit, harden UI
|
|
172
156
|
this.applyDisabledUi(isDisabled);
|
|
173
157
|
}
|
|
174
158
|
}
|
|
175
159
|
else {
|
|
176
|
-
// Not initialized yet; just harden UI for first paint
|
|
177
160
|
this.applyDisabledUi(isDisabled);
|
|
178
161
|
}
|
|
179
162
|
}
|
|
180
|
-
|
|
181
|
-
// wrapper already gets [class.disabled]="disabled" from template
|
|
182
|
-
const input = this.inputRef?.nativeElement;
|
|
183
|
-
if (!input)
|
|
184
|
-
return;
|
|
185
|
-
// Make the flag button non-focusable/non-clickable
|
|
186
|
-
const flag = input.parentElement?.querySelector('.iti__selected-flag');
|
|
187
|
-
if (flag) {
|
|
188
|
-
flag.tabIndex = disabled ? -1 : 0;
|
|
189
|
-
flag.setAttribute('aria-disabled', String(disabled));
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
// ----- Validator -----
|
|
163
|
+
// ---------- Validator ----------
|
|
193
164
|
validate(_) {
|
|
194
165
|
const raw = this.currentRaw();
|
|
195
166
|
if (!raw)
|
|
@@ -201,10 +172,8 @@ class NgxsmkTelInputComponent {
|
|
|
201
172
|
}
|
|
202
173
|
return valid ? null : { phoneInvalid: true };
|
|
203
174
|
}
|
|
204
|
-
registerOnValidatorChange(fn) {
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
// ----- Public helpers -----
|
|
175
|
+
registerOnValidatorChange(fn) { this.validatorChange = fn; }
|
|
176
|
+
// ---------- Public helpers ----------
|
|
208
177
|
focus() {
|
|
209
178
|
this.inputRef?.nativeElement.focus();
|
|
210
179
|
if (this.selectOnFocus) {
|
|
@@ -223,27 +192,28 @@ class NgxsmkTelInputComponent {
|
|
|
223
192
|
this.handleInput();
|
|
224
193
|
this.inputRef.nativeElement.focus();
|
|
225
194
|
}
|
|
226
|
-
//
|
|
195
|
+
// ---------- intl-tel-input wiring ----------
|
|
227
196
|
async initIntlTelInput() {
|
|
228
197
|
const [{ default: intlTelInput }] = await Promise.all([import('intl-tel-input')]);
|
|
229
198
|
const toLowerKeys = (m) => {
|
|
230
199
|
if (!m)
|
|
231
200
|
return undefined;
|
|
232
201
|
const out = {};
|
|
233
|
-
for (const k in m)
|
|
202
|
+
for (const k in m)
|
|
234
203
|
if (Object.prototype.hasOwnProperty.call(m, k)) {
|
|
235
204
|
const v = m[k];
|
|
236
205
|
if (v != null)
|
|
237
206
|
out[k.toLowerCase()] = v;
|
|
238
207
|
}
|
|
239
|
-
}
|
|
240
208
|
return out;
|
|
241
209
|
};
|
|
242
210
|
const config = {
|
|
243
211
|
initialCountry: this.initialCountry === 'auto' ? 'auto' : (this.initialCountry?.toLowerCase() || 'us'),
|
|
244
212
|
preferredCountries: (this.preferredCountries ?? []).map(c => c.toLowerCase()),
|
|
245
213
|
onlyCountries: (this.onlyCountries ?? []).map(c => c.toLowerCase()),
|
|
246
|
-
|
|
214
|
+
// We ALWAYS show national digits in the input ourselves,
|
|
215
|
+
// but enabling nationalMode prevents plugin from forcing a '+' back in.
|
|
216
|
+
nationalMode: true,
|
|
247
217
|
allowDropdown: this.allowDropdown,
|
|
248
218
|
separateDialCode: this.separateDialCode,
|
|
249
219
|
geoIpLookup: (cb) => cb('us'),
|
|
@@ -260,7 +230,9 @@ class NgxsmkTelInputComponent {
|
|
|
260
230
|
this.zone.runOutsideAngular(() => {
|
|
261
231
|
this.iti = intlTelInput(this.inputRef.nativeElement, config);
|
|
262
232
|
});
|
|
233
|
+
// ensure dropdown is above app UI & apply disabled UI
|
|
263
234
|
this.inputRef.nativeElement.style.setProperty('--tel-dd-z', String(this.dropdownZIndex));
|
|
235
|
+
this.applyDisabledUi(this.disabled);
|
|
264
236
|
}
|
|
265
237
|
async reinitPlugin() {
|
|
266
238
|
const prevIso2 = (this.iti?.getSelectedCountryData?.().iso2 || this.initialCountry || 'US').toString().toLowerCase();
|
|
@@ -268,7 +240,6 @@ class NgxsmkTelInputComponent {
|
|
|
268
240
|
this.destroyPlugin();
|
|
269
241
|
await this.initIntlTelInput();
|
|
270
242
|
this.bindDomListeners();
|
|
271
|
-
// restore country & value
|
|
272
243
|
try {
|
|
273
244
|
this.iti?.setCountry(prevIso2);
|
|
274
245
|
}
|
|
@@ -277,7 +248,6 @@ class NgxsmkTelInputComponent {
|
|
|
277
248
|
this.setInputValue(prevValue);
|
|
278
249
|
this.handleInput();
|
|
279
250
|
}
|
|
280
|
-
this.inputRef.nativeElement.style.setProperty('--tel-dd-z', String(this.dropdownZIndex));
|
|
281
251
|
this.applyDisabledUi(this.disabled);
|
|
282
252
|
}
|
|
283
253
|
destroyPlugin() {
|
|
@@ -288,55 +258,19 @@ class NgxsmkTelInputComponent {
|
|
|
288
258
|
if (this.inputRef?.nativeElement) {
|
|
289
259
|
const el = this.inputRef.nativeElement;
|
|
290
260
|
const clone = el.cloneNode(true);
|
|
291
|
-
// preserve
|
|
261
|
+
// preserve state across clone
|
|
292
262
|
clone.disabled = this.disabled;
|
|
293
|
-
clone.id = this.resolvedId;
|
|
263
|
+
clone.id = this.resolvedId;
|
|
294
264
|
clone.name = this.name ?? clone.name;
|
|
295
265
|
clone.value = el.value;
|
|
296
266
|
el.parentNode?.replaceChild(clone, el);
|
|
297
267
|
this.inputRef.nativeElement = clone;
|
|
298
268
|
}
|
|
299
269
|
}
|
|
300
|
-
//
|
|
270
|
+
// ---------- Input filtering (digits-only) ----------
|
|
301
271
|
sanitizeDigits(value) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
let v = value.replace(/[^\d+]/g, '');
|
|
305
|
-
if (this.allowLeadingPlus) {
|
|
306
|
-
const hasLeadingPlus = v.startsWith('+');
|
|
307
|
-
v = (hasLeadingPlus ? '+' : '') + v.replace(/\+/g, '');
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
v = v.replace(/\+/g, '');
|
|
311
|
-
}
|
|
312
|
-
return v;
|
|
313
|
-
}
|
|
314
|
-
/** Remove a single trunk '0' when that makes the number valid.
|
|
315
|
-
* Works for: "+<cc>0..." and "0..." (national), but only if the stripped form parses valid.
|
|
316
|
-
*/
|
|
317
|
-
stripTrunkZeroIfNeeded(raw, iso2) {
|
|
318
|
-
if (!raw)
|
|
319
|
-
return raw;
|
|
320
|
-
const dial = this.iti?.getSelectedCountryData?.().dialCode ?? '';
|
|
321
|
-
// If already valid, don't touch.
|
|
322
|
-
const parsed0 = this.tel.parse(raw, iso2);
|
|
323
|
-
if (parsed0.isValid)
|
|
324
|
-
return raw;
|
|
325
|
-
// Try: +<dial>0xxxx → +<dial>xxxx
|
|
326
|
-
if (dial && raw.startsWith(`+${dial}0`)) {
|
|
327
|
-
const attempt = `+${dial}${raw.slice(dial.length + 2)}`;
|
|
328
|
-
const p = this.tel.parse(attempt, iso2);
|
|
329
|
-
if (p.isValid)
|
|
330
|
-
return attempt;
|
|
331
|
-
}
|
|
332
|
-
// Try: 0xxxx → xxxx (national)
|
|
333
|
-
if (!raw.startsWith('+') && raw.startsWith('0')) {
|
|
334
|
-
const attemptNat = raw.slice(1);
|
|
335
|
-
const p = this.tel.parse(attemptNat, iso2);
|
|
336
|
-
if (p.isValid)
|
|
337
|
-
return attemptNat;
|
|
338
|
-
}
|
|
339
|
-
return raw;
|
|
272
|
+
// visible input is digits-only regardless of props
|
|
273
|
+
return (value || '').replace(/\D/g, '');
|
|
340
274
|
}
|
|
341
275
|
bindDomListeners() {
|
|
342
276
|
const el = this.inputRef.nativeElement;
|
|
@@ -349,35 +283,19 @@ class NgxsmkTelInputComponent {
|
|
|
349
283
|
if (this.lockWhenValid && this.isCurrentlyValid()) {
|
|
350
284
|
const selCollapsed = (el.selectionStart ?? 0) === (el.selectionEnd ?? 0);
|
|
351
285
|
const isDigit = !!data && ev.inputType === 'insertText' && data >= '0' && data <= '9';
|
|
352
|
-
|
|
353
|
-
if (selCollapsed && (isDigit || isPlusAtStart)) {
|
|
286
|
+
if (selCollapsed && isDigit) {
|
|
354
287
|
ev.preventDefault();
|
|
355
288
|
return;
|
|
356
289
|
}
|
|
357
290
|
}
|
|
358
|
-
// normal filtering when not valid (or replacing text)
|
|
359
291
|
if (!data || ev.inputType !== 'insertText')
|
|
360
292
|
return;
|
|
361
|
-
const pos = el.selectionStart ?? 0;
|
|
362
293
|
const isDigit = data >= '0' && data <= '9';
|
|
363
|
-
|
|
364
|
-
if (!isDigit && !isPlusAtStart)
|
|
294
|
+
if (!isDigit)
|
|
365
295
|
ev.preventDefault();
|
|
366
296
|
});
|
|
367
297
|
el.addEventListener('paste', (e) => {
|
|
368
|
-
if (!this.digitsOnly)
|
|
369
|
-
return;
|
|
370
298
|
const text = (e.clipboardData || window.clipboardData).getData('text') || '';
|
|
371
|
-
const hasAnyDigit = /[0-9]/.test(text);
|
|
372
|
-
// block pasting extra digits if valid and there is no selection
|
|
373
|
-
if (this.lockWhenValid && this.isCurrentlyValid()) {
|
|
374
|
-
const selCollapsed = (el.selectionStart ?? 0) === (el.selectionEnd ?? 0);
|
|
375
|
-
if (selCollapsed && hasAnyDigit) {
|
|
376
|
-
e.preventDefault();
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
// sanitize paste
|
|
381
299
|
e.preventDefault();
|
|
382
300
|
const sanitized = this.sanitizeDigits(text);
|
|
383
301
|
const start = el.selectionStart ?? el.value.length;
|
|
@@ -386,14 +304,12 @@ class NgxsmkTelInputComponent {
|
|
|
386
304
|
queueMicrotask(() => this.handleInput());
|
|
387
305
|
});
|
|
388
306
|
el.addEventListener('input', () => {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
el.setSelectionRange(caret, caret);
|
|
396
|
-
}
|
|
307
|
+
const val = el.value;
|
|
308
|
+
const sanitized = this.sanitizeDigits(val);
|
|
309
|
+
if (val !== sanitized) {
|
|
310
|
+
const caret = el.selectionStart ?? sanitized.length;
|
|
311
|
+
el.value = sanitized;
|
|
312
|
+
el.setSelectionRange(caret, caret);
|
|
397
313
|
}
|
|
398
314
|
this.handleInput();
|
|
399
315
|
});
|
|
@@ -408,16 +324,19 @@ class NgxsmkTelInputComponent {
|
|
|
408
324
|
el.addEventListener('blur', () => this.onBlur());
|
|
409
325
|
});
|
|
410
326
|
}
|
|
327
|
+
// ---------- UX handlers ----------
|
|
411
328
|
onBlur() {
|
|
412
329
|
this.touched = true;
|
|
413
330
|
this.zone.run(() => this.onTouchedCb());
|
|
414
331
|
if (!this.formatOnBlur)
|
|
415
332
|
return;
|
|
333
|
+
const raw = this.currentRaw();
|
|
334
|
+
if (!raw)
|
|
335
|
+
return;
|
|
416
336
|
const iso2 = this.currentIso2();
|
|
417
|
-
const raw = this.stripTrunkZeroIfNeeded(this.currentRaw(), iso2);
|
|
418
337
|
const parsed = this.tel.parse(raw, iso2);
|
|
419
338
|
if (parsed.isValid && parsed.national) {
|
|
420
|
-
this.setInputValue(parsed.national
|
|
339
|
+
this.setInputValue(this.toNSN(parsed.national)); // keep digits only
|
|
421
340
|
}
|
|
422
341
|
}
|
|
423
342
|
onFocus() {
|
|
@@ -426,63 +345,105 @@ class NgxsmkTelInputComponent {
|
|
|
426
345
|
queueMicrotask(() => el.setSelectionRange(0, el.value.length));
|
|
427
346
|
}
|
|
428
347
|
}
|
|
348
|
+
// ---------- Core input pipeline ----------
|
|
429
349
|
handleInput() {
|
|
430
350
|
if (this.suppressEvents)
|
|
431
351
|
return;
|
|
432
|
-
let raw = this.currentRaw();
|
|
352
|
+
let raw = this.toNSN(this.currentRaw());
|
|
433
353
|
const iso2 = this.currentIso2();
|
|
434
|
-
//
|
|
354
|
+
// Try a generic trunk-0 strip only if it makes the number valid
|
|
435
355
|
const fixed = this.stripTrunkZeroIfNeeded(raw, iso2);
|
|
436
356
|
if (fixed !== raw) {
|
|
437
|
-
this.setInputValue(fixed);
|
|
438
|
-
raw =
|
|
357
|
+
this.setInputValue(this.toNSN(fixed));
|
|
358
|
+
raw = this.currentRaw();
|
|
439
359
|
}
|
|
360
|
+
// Parse once
|
|
440
361
|
const parsed = this.tel.parse(raw, iso2);
|
|
441
|
-
//
|
|
362
|
+
// Emit E.164 to the form
|
|
442
363
|
this.zone.run(() => this.onChange(parsed.e164));
|
|
443
364
|
this.zone.run(() => this.inputChange.emit({ raw, e164: parsed.e164, iso2 }));
|
|
444
|
-
//
|
|
445
|
-
if (parsed.isValid && parsed.national
|
|
446
|
-
this.
|
|
447
|
-
|
|
448
|
-
|
|
365
|
+
// Keep visible as NATIONAL digits only
|
|
366
|
+
if (parsed.isValid && parsed.national) {
|
|
367
|
+
const nsn = this.toNSN(parsed.national).replace(/\s{2,}/g, ' ');
|
|
368
|
+
if (nsn !== raw)
|
|
369
|
+
this.setInputValue(nsn);
|
|
370
|
+
}
|
|
371
|
+
// optional live formatting (we keep digits-only anyway)
|
|
372
|
+
if (this.formatWhenValid === 'typing' && raw && parsed.isValid) {
|
|
373
|
+
const natPretty = this.toNSN(this.formatAsYouType(raw, iso2));
|
|
374
|
+
if (natPretty !== raw)
|
|
375
|
+
this.setInputValue(natPretty);
|
|
449
376
|
}
|
|
450
377
|
}
|
|
378
|
+
// ---------- Utilities ----------
|
|
379
|
+
/** NATIONAL-only formatter while typing, using region for rules */
|
|
451
380
|
formatAsYouType(raw, iso2) {
|
|
452
381
|
try {
|
|
453
|
-
// When a region is provided, AsYouType returns NATIONAL formatting
|
|
454
382
|
const fmt = new AsYouType(iso2);
|
|
455
|
-
return fmt.input(raw);
|
|
383
|
+
return this.toNSN(fmt.input(raw));
|
|
456
384
|
}
|
|
457
385
|
catch {
|
|
458
386
|
return raw;
|
|
459
387
|
}
|
|
460
388
|
}
|
|
461
|
-
|
|
462
|
-
|
|
389
|
+
/** Convert any string to NSN (digits only). */
|
|
390
|
+
toNSN(v) {
|
|
391
|
+
return (v ?? '').replace(/\D/g, '');
|
|
392
|
+
}
|
|
393
|
+
/** Generic: remove one trunk '0' after +<dial> or at national start, only if it makes a valid number */
|
|
394
|
+
stripTrunkZeroIfNeeded(raw, iso2) {
|
|
395
|
+
if (!raw)
|
|
396
|
+
return raw;
|
|
397
|
+
const dial = this.iti?.getSelectedCountryData?.().dialCode ?? '';
|
|
398
|
+
const p0 = this.tel.parse(raw, iso2);
|
|
399
|
+
if (p0.isValid)
|
|
400
|
+
return raw;
|
|
401
|
+
// Case 1: "+<dial>0xxxx" -> try "+<dial>xxxx"
|
|
402
|
+
if (raw.startsWith('+') && dial && raw.startsWith(`+${dial}0`)) {
|
|
403
|
+
const attempt = `+${dial}${raw.slice(dial.length + 2)}`;
|
|
404
|
+
const p1 = this.tel.parse(attempt, iso2);
|
|
405
|
+
if (p1.isValid)
|
|
406
|
+
return attempt;
|
|
407
|
+
}
|
|
408
|
+
// Case 2: national "0xxxx" -> try "xxxx"
|
|
409
|
+
if (!raw.startsWith('+') && raw.startsWith('0')) {
|
|
410
|
+
const attemptNat = raw.slice(1);
|
|
411
|
+
const p2 = this.tel.parse(attemptNat, iso2);
|
|
412
|
+
if (p2.isValid)
|
|
413
|
+
return attemptNat;
|
|
414
|
+
}
|
|
415
|
+
return raw;
|
|
463
416
|
}
|
|
417
|
+
currentRaw() { return (this.inputRef?.nativeElement.value ?? '').trim(); }
|
|
464
418
|
currentIso2() {
|
|
465
419
|
const iso2 = (this.iti?.getSelectedCountryData?.().iso2 ?? this.initialCountry ?? 'US')
|
|
466
420
|
.toString().toUpperCase();
|
|
467
421
|
return iso2;
|
|
468
422
|
}
|
|
469
|
-
setInputValue(v) {
|
|
470
|
-
this.inputRef.nativeElement.value = v ?? '';
|
|
471
|
-
}
|
|
423
|
+
setInputValue(v) { this.inputRef.nativeElement.value = v ?? ''; }
|
|
472
424
|
get showError() {
|
|
473
425
|
const invalid = !!this.validate({});
|
|
474
426
|
return this.showErrorWhenTouched ? (this.touched && invalid) : invalid;
|
|
475
427
|
}
|
|
476
|
-
isCurrentlyValid() {
|
|
477
|
-
|
|
428
|
+
isCurrentlyValid() { return this.tel.isValid(this.currentRaw(), this.currentIso2()); }
|
|
429
|
+
/** Make flag/dropdown non-interactive when disabled */
|
|
430
|
+
applyDisabledUi(disabled) {
|
|
431
|
+
const input = this.inputRef?.nativeElement;
|
|
432
|
+
if (!input)
|
|
433
|
+
return;
|
|
434
|
+
const flag = input.parentElement?.querySelector('.iti__selected-flag');
|
|
435
|
+
if (flag) {
|
|
436
|
+
flag.tabIndex = disabled ? -1 : 0;
|
|
437
|
+
flag.setAttribute('aria-disabled', String(disabled));
|
|
438
|
+
}
|
|
478
439
|
}
|
|
479
440
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgxsmkTelInputComponent, deps: [{ token: i0.NgZone }, { token: NgxsmkTelInputService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
480
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: NgxsmkTelInputComponent, isStandalone: true, selector: "ngxsmk-tel-input", inputs: { initialCountry: "initialCountry", preferredCountries: "preferredCountries", onlyCountries: "onlyCountries",
|
|
441
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: NgxsmkTelInputComponent, isStandalone: true, selector: "ngxsmk-tel-input", inputs: { initialCountry: "initialCountry", preferredCountries: "preferredCountries", onlyCountries: "onlyCountries", separateDialCode: "separateDialCode", allowDropdown: "allowDropdown", lockWhenValid: "lockWhenValid", placeholder: "placeholder", autocomplete: "autocomplete", name: "name", inputId: "inputId", disabled: "disabled", label: "label", hint: "hint", errorText: "errorText", size: "size", variant: "variant", showClear: "showClear", autoFocus: "autoFocus", selectOnFocus: "selectOnFocus", formatOnBlur: "formatOnBlur", showErrorWhenTouched: "showErrorWhenTouched", dropdownAttachToBody: "dropdownAttachToBody", dropdownZIndex: "dropdownZIndex", i18n: "i18n", telI18n: "telI18n", localizedCountries: "localizedCountries", telLocalizedCountries: "telLocalizedCountries", clearAriaLabel: "clearAriaLabel", dir: "dir", autoPlaceholder: "autoPlaceholder", utilsScript: "utilsScript", customPlaceholder: "customPlaceholder", formatWhenValid: "formatWhenValid", digitsOnly: "digitsOnly", allowLeadingPlus: "allowLeadingPlus" }, outputs: { countryChange: "countryChange", validityChange: "validityChange", inputChange: "inputChange" }, providers: [
|
|
481
442
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true },
|
|
482
443
|
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true }
|
|
483
444
|
], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["telInput"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
484
445
|
<div class="ngxsmk-tel"
|
|
485
|
-
[class.
|
|
446
|
+
[class.disabled]="disabled"
|
|
486
447
|
[attr.data-size]="size"
|
|
487
448
|
[attr.data-variant]="variant"
|
|
488
449
|
[attr.dir]="dir">
|
|
@@ -502,14 +463,14 @@ class NgxsmkTelInputComponent {
|
|
|
502
463
|
[attr.autocomplete]="autocomplete"
|
|
503
464
|
[attr.inputmode]="digitsOnly ? 'numeric' : 'tel'"
|
|
504
465
|
[attr.pattern]="digitsOnly ? (allowLeadingPlus ? '\\\\+?[0-9]*' : '[0-9]*') : null"
|
|
505
|
-
[
|
|
466
|
+
[disabled]="disabled"
|
|
506
467
|
[attr.aria-invalid]="showError ? 'true' : 'false'"
|
|
507
468
|
(blur)="onBlur()"
|
|
508
469
|
(focus)="onFocus()"
|
|
509
470
|
/>
|
|
510
471
|
</div>
|
|
511
472
|
|
|
512
|
-
@if (showClear && currentRaw()
|
|
473
|
+
@if (showClear && currentRaw()) {
|
|
513
474
|
<button type="button"
|
|
514
475
|
class="ngxsmk-tel__clear"
|
|
515
476
|
(click)="clearInput()"
|
|
@@ -523,13 +484,13 @@ class NgxsmkTelInputComponent {
|
|
|
523
484
|
<div class="ngxsmk-tel__hint">{{ hint }}</div>
|
|
524
485
|
}
|
|
525
486
|
</div>
|
|
526
|
-
`, isInline: true, styles: [":host{--tel-bg: #fff;--tel-fg: #0f172a;--tel-border: #c0c0c0;--tel-border-hover: #9aa0a6;--tel-ring: #2563eb;--tel-placeholder: #9ca3af;--tel-error: #ef4444;--tel-radius: 12px;--tel-focus-shadow: 0 0 0 3px rgba(37, 99, 235, .25);--tel-dd-bg: var(--tel-bg);--tel-dd-border: var(--tel-border);--tel-dd-shadow: 0 24px 60px rgba(0, 0, 0, .18);--tel-dd-radius: 12px;--tel-dd-item-hover: rgba(37, 99, 235, .08);--tel-dd-z: 2000;--tel-dd-search-bg: rgba(148, 163, 184, .08);display:block}:host-context(.dark){--tel-bg: #0b0f17;--tel-fg: #e5e7eb;--tel-border: #334155;--tel-border-hover: #475569;--tel-ring: #60a5fa;--tel-placeholder: #94a3b8;--tel-dd-bg: #0f1521;--tel-dd-border: #324056;--tel-dd-search-bg: rgba(148, 163, 184, .12)}.ngxsmk-tel{width:100%;color:var(--tel-fg)}.ngxsmk-tel.disabled{opacity:.7;cursor:not-allowed}.ngxsmk-tel__label{display:inline-block;margin-bottom:6px;font-size:.875rem;font-weight:500}.ngxsmk-tel__wrap{position:relative}.ngxsmk-tel-input__wrapper,:host ::ng-deep .iti{width:100%}.ngxsmk-tel-input__control{width:100%;height:40px;font:inherit;color:var(--tel-fg);background:var(--tel-bg);border:1px solid var(--tel-border);border-radius:var(--tel-radius);padding:10px 40px 10px 12px;outline:none;transition:border-color .15s,box-shadow .15s,background .15s}.ngxsmk-tel-input__control::placeholder{color:var(--tel-placeholder)}.ngxsmk-tel-input__control:hover{border-color:var(--tel-border-hover)}.ngxsmk-tel-input__control:focus{border-color:var(--tel-ring);box-shadow:var(--tel-focus-shadow)}[data-size=sm] .ngxsmk-tel-input__control{height:34px;font-size:13px;padding:6px 36px 6px 10px;border-radius:10px}[data-size=lg] .ngxsmk-tel-input__control{height:46px;font-size:16px;padding:12px 44px 12px 14px;border-radius:14px}[data-variant=filled] .ngxsmk-tel-input__control{background:#94a3b814}[data-variant=underline] .ngxsmk-tel-input__control{border:0;border-bottom:2px solid var(--tel-border);border-radius:0;padding-left:0;padding-right:34px}[data-variant=underline] .ngxsmk-tel-input__control:focus{border-bottom-color:var(--tel-ring);box-shadow:none}:host ::ng-deep .iti__flag-container{border-top-left-radius:var(--tel-radius);border-bottom-left-radius:var(--tel-radius);border:1px solid var(--tel-border);border-right:none;background:var(--tel-bg)}:host ::ng-deep .iti__selected-flag{height:100%;padding:0 10px;display:inline-flex;align-items:center}:host ::ng-deep .iti__country-list{background:var(--tel-dd-bg);border:1px solid var(--tel-dd-border);border-radius:var(--tel-dd-radius);box-shadow:var(--tel-dd-shadow);max-height:min(50vh,360px);overflow:auto;padding:6px 0;width:max(280px,100%);z-index:var(--tel-dd-z)}:host ::ng-deep .iti--container .iti__country-list{z-index:var(--tel-dd-z)}:host ::ng-deep .iti__search-input{position:sticky;top:0;margin:0;padding:10px 12px;width:100%;border:0;border-bottom:1px solid var(--tel-dd-border);outline:none;background:var(--tel-dd-search-bg);color:var(--tel-fg)}:host ::ng-deep .iti__country{display:grid;grid-template-columns:28px 1fr auto;align-items:center;column-gap:.5rem;padding:10px 12px;cursor:pointer}:host ::ng-deep .iti__dial-code{color:var(--tel-placeholder);font-weight:600;margin-left:10px}.ngxsmk-tel__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:0;background:transparent;font-size:18px;line-height:1;width:28px;height:28px;border-radius:50%;cursor:pointer;color:var(--tel-placeholder)}.ngxsmk-tel__clear:hover{background:#94a3b826}.ngxsmk-tel__hint{margin-top:6px;font-size:12px;color:var(--tel-placeholder)}.ngxsmk-tel__error{margin-top:6px;font-size:12px;color:var(--tel-error)}.ngxsmk-tel__wrap.has-error .ngxsmk-tel-input__control{border-color:var(--tel-error);box-shadow:0 0 0 3px #ef444426}.ngxsmk-tel-disabled{pointer-events:none;opacity:.6}\n"] }); }
|
|
487
|
+
`, isInline: true, styles: [":host{--tel-bg: #fff;--tel-fg: #0f172a;--tel-border: #c0c0c0;--tel-border-hover: #9aa0a6;--tel-ring: #2563eb;--tel-placeholder: #9ca3af;--tel-error: #ef4444;--tel-radius: 12px;--tel-focus-shadow: 0 0 0 3px rgba(37, 99, 235, .25);--tel-dd-bg: var(--tel-bg);--tel-dd-border: var(--tel-border);--tel-dd-shadow: 0 24px 60px rgba(0, 0, 0, .18);--tel-dd-radius: 12px;--tel-dd-item-hover: rgba(37, 99, 235, .08);--tel-dd-z: 2000;--tel-dd-search-bg: rgba(148, 163, 184, .08);display:block}:host-context(.dark){--tel-bg: #0b0f17;--tel-fg: #e5e7eb;--tel-border: #334155;--tel-border-hover: #475569;--tel-ring: #60a5fa;--tel-placeholder: #94a3b8;--tel-dd-bg: #0f1521;--tel-dd-border: #324056;--tel-dd-search-bg: rgba(148, 163, 184, .12)}.ngxsmk-tel{width:100%;color:var(--tel-fg)}.ngxsmk-tel.disabled{opacity:.7;cursor:not-allowed}.ngxsmk-tel__label{display:inline-block;margin-bottom:6px;font-size:.875rem;font-weight:500}.ngxsmk-tel__wrap{position:relative}.ngxsmk-tel-input__wrapper,:host ::ng-deep .iti{width:100%}.ngxsmk-tel-input__control{width:100%;height:40px;font:inherit;color:var(--tel-fg);background:var(--tel-bg);border:1px solid var(--tel-border);border-radius:var(--tel-radius);padding:10px 40px 10px 12px;outline:none;transition:border-color .15s,box-shadow .15s,background .15s}.ngxsmk-tel-input__control::placeholder{color:var(--tel-placeholder)}.ngxsmk-tel-input__control:hover{border-color:var(--tel-border-hover)}.ngxsmk-tel-input__control:focus{border-color:var(--tel-ring);box-shadow:var(--tel-focus-shadow)}[data-size=sm] .ngxsmk-tel-input__control{height:34px;font-size:13px;padding:6px 36px 6px 10px;border-radius:10px}[data-size=lg] .ngxsmk-tel-input__control{height:46px;font-size:16px;padding:12px 44px 12px 14px;border-radius:14px}[data-variant=filled] .ngxsmk-tel-input__control{background:#94a3b814}[data-variant=underline] .ngxsmk-tel-input__control{border:0;border-bottom:2px solid var(--tel-border);border-radius:0;padding-left:0;padding-right:34px}[data-variant=underline] .ngxsmk-tel-input__control:focus{border-bottom-color:var(--tel-ring);box-shadow:none}:host ::ng-deep .iti__flag-container{border-top-left-radius:var(--tel-radius);border-bottom-left-radius:var(--tel-radius);border:1px solid var(--tel-border);border-right:none;background:var(--tel-bg)}:host ::ng-deep .iti__selected-flag{height:100%;padding:0 10px;display:inline-flex;align-items:center}:host ::ng-deep .iti__country-list{background:var(--tel-dd-bg);border:1px solid var(--tel-dd-border);border-radius:var(--tel-dd-radius);box-shadow:var(--tel-dd-shadow);max-height:min(50vh,360px);overflow:auto;padding:6px 0;width:max(280px,100%);z-index:var(--tel-dd-z)}:host ::ng-deep .iti--container .iti__country-list{z-index:var(--tel-dd-z)}:host ::ng-deep .iti__search-input{position:sticky;top:0;margin:0;padding:10px 12px;width:100%;border:0;border-bottom:1px solid var(--tel-dd-border);outline:none;background:var(--tel-dd-search-bg);color:var(--tel-fg)}:host ::ng-deep .iti__country{display:grid;grid-template-columns:28px 1fr auto;align-items:center;column-gap:.5rem;padding:10px 12px;cursor:pointer}:host ::ng-deep .iti__dial-code{color:var(--tel-placeholder);font-weight:600;margin-left:10px}.ngxsmk-tel__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:0;background:transparent;font-size:18px;line-height:1;width:28px;height:28px;border-radius:50%;cursor:pointer;color:var(--tel-placeholder)}.ngxsmk-tel__clear:hover{background:#94a3b826}.ngxsmk-tel__hint{margin-top:6px;font-size:12px;color:var(--tel-placeholder)}.ngxsmk-tel__error{margin-top:6px;font-size:12px;color:var(--tel-error)}.ngxsmk-tel__wrap.has-error .ngxsmk-tel-input__control{border-color:var(--tel-error);box-shadow:0 0 0 3px #ef444426}.ngxsmk-tel.disabled .iti__flag-container,.ngxsmk-tel.disabled .iti__selected-flag{pointer-events:none;opacity:.6}\n"] }); }
|
|
527
488
|
}
|
|
528
489
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgxsmkTelInputComponent, decorators: [{
|
|
529
490
|
type: Component,
|
|
530
491
|
args: [{ selector: 'ngxsmk-tel-input', standalone: true, imports: [], template: `
|
|
531
492
|
<div class="ngxsmk-tel"
|
|
532
|
-
[class.
|
|
493
|
+
[class.disabled]="disabled"
|
|
533
494
|
[attr.data-size]="size"
|
|
534
495
|
[attr.data-variant]="variant"
|
|
535
496
|
[attr.dir]="dir">
|
|
@@ -549,14 +510,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
549
510
|
[attr.autocomplete]="autocomplete"
|
|
550
511
|
[attr.inputmode]="digitsOnly ? 'numeric' : 'tel'"
|
|
551
512
|
[attr.pattern]="digitsOnly ? (allowLeadingPlus ? '\\\\+?[0-9]*' : '[0-9]*') : null"
|
|
552
|
-
[
|
|
513
|
+
[disabled]="disabled"
|
|
553
514
|
[attr.aria-invalid]="showError ? 'true' : 'false'"
|
|
554
515
|
(blur)="onBlur()"
|
|
555
516
|
(focus)="onFocus()"
|
|
556
517
|
/>
|
|
557
518
|
</div>
|
|
558
519
|
|
|
559
|
-
@if (showClear && currentRaw()
|
|
520
|
+
@if (showClear && currentRaw()) {
|
|
560
521
|
<button type="button"
|
|
561
522
|
class="ngxsmk-tel__clear"
|
|
562
523
|
(click)="clearInput()"
|
|
@@ -573,7 +534,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
573
534
|
`, providers: [
|
|
574
535
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true },
|
|
575
536
|
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true }
|
|
576
|
-
], styles: [":host{--tel-bg: #fff;--tel-fg: #0f172a;--tel-border: #c0c0c0;--tel-border-hover: #9aa0a6;--tel-ring: #2563eb;--tel-placeholder: #9ca3af;--tel-error: #ef4444;--tel-radius: 12px;--tel-focus-shadow: 0 0 0 3px rgba(37, 99, 235, .25);--tel-dd-bg: var(--tel-bg);--tel-dd-border: var(--tel-border);--tel-dd-shadow: 0 24px 60px rgba(0, 0, 0, .18);--tel-dd-radius: 12px;--tel-dd-item-hover: rgba(37, 99, 235, .08);--tel-dd-z: 2000;--tel-dd-search-bg: rgba(148, 163, 184, .08);display:block}:host-context(.dark){--tel-bg: #0b0f17;--tel-fg: #e5e7eb;--tel-border: #334155;--tel-border-hover: #475569;--tel-ring: #60a5fa;--tel-placeholder: #94a3b8;--tel-dd-bg: #0f1521;--tel-dd-border: #324056;--tel-dd-search-bg: rgba(148, 163, 184, .12)}.ngxsmk-tel{width:100%;color:var(--tel-fg)}.ngxsmk-tel.disabled{opacity:.7;cursor:not-allowed}.ngxsmk-tel__label{display:inline-block;margin-bottom:6px;font-size:.875rem;font-weight:500}.ngxsmk-tel__wrap{position:relative}.ngxsmk-tel-input__wrapper,:host ::ng-deep .iti{width:100%}.ngxsmk-tel-input__control{width:100%;height:40px;font:inherit;color:var(--tel-fg);background:var(--tel-bg);border:1px solid var(--tel-border);border-radius:var(--tel-radius);padding:10px 40px 10px 12px;outline:none;transition:border-color .15s,box-shadow .15s,background .15s}.ngxsmk-tel-input__control::placeholder{color:var(--tel-placeholder)}.ngxsmk-tel-input__control:hover{border-color:var(--tel-border-hover)}.ngxsmk-tel-input__control:focus{border-color:var(--tel-ring);box-shadow:var(--tel-focus-shadow)}[data-size=sm] .ngxsmk-tel-input__control{height:34px;font-size:13px;padding:6px 36px 6px 10px;border-radius:10px}[data-size=lg] .ngxsmk-tel-input__control{height:46px;font-size:16px;padding:12px 44px 12px 14px;border-radius:14px}[data-variant=filled] .ngxsmk-tel-input__control{background:#94a3b814}[data-variant=underline] .ngxsmk-tel-input__control{border:0;border-bottom:2px solid var(--tel-border);border-radius:0;padding-left:0;padding-right:34px}[data-variant=underline] .ngxsmk-tel-input__control:focus{border-bottom-color:var(--tel-ring);box-shadow:none}:host ::ng-deep .iti__flag-container{border-top-left-radius:var(--tel-radius);border-bottom-left-radius:var(--tel-radius);border:1px solid var(--tel-border);border-right:none;background:var(--tel-bg)}:host ::ng-deep .iti__selected-flag{height:100%;padding:0 10px;display:inline-flex;align-items:center}:host ::ng-deep .iti__country-list{background:var(--tel-dd-bg);border:1px solid var(--tel-dd-border);border-radius:var(--tel-dd-radius);box-shadow:var(--tel-dd-shadow);max-height:min(50vh,360px);overflow:auto;padding:6px 0;width:max(280px,100%);z-index:var(--tel-dd-z)}:host ::ng-deep .iti--container .iti__country-list{z-index:var(--tel-dd-z)}:host ::ng-deep .iti__search-input{position:sticky;top:0;margin:0;padding:10px 12px;width:100%;border:0;border-bottom:1px solid var(--tel-dd-border);outline:none;background:var(--tel-dd-search-bg);color:var(--tel-fg)}:host ::ng-deep .iti__country{display:grid;grid-template-columns:28px 1fr auto;align-items:center;column-gap:.5rem;padding:10px 12px;cursor:pointer}:host ::ng-deep .iti__dial-code{color:var(--tel-placeholder);font-weight:600;margin-left:10px}.ngxsmk-tel__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:0;background:transparent;font-size:18px;line-height:1;width:28px;height:28px;border-radius:50%;cursor:pointer;color:var(--tel-placeholder)}.ngxsmk-tel__clear:hover{background:#94a3b826}.ngxsmk-tel__hint{margin-top:6px;font-size:12px;color:var(--tel-placeholder)}.ngxsmk-tel__error{margin-top:6px;font-size:12px;color:var(--tel-error)}.ngxsmk-tel__wrap.has-error .ngxsmk-tel-input__control{border-color:var(--tel-error);box-shadow:0 0 0 3px #ef444426}.ngxsmk-tel-disabled{pointer-events:none;opacity:.6}\n"] }]
|
|
537
|
+
], styles: [":host{--tel-bg: #fff;--tel-fg: #0f172a;--tel-border: #c0c0c0;--tel-border-hover: #9aa0a6;--tel-ring: #2563eb;--tel-placeholder: #9ca3af;--tel-error: #ef4444;--tel-radius: 12px;--tel-focus-shadow: 0 0 0 3px rgba(37, 99, 235, .25);--tel-dd-bg: var(--tel-bg);--tel-dd-border: var(--tel-border);--tel-dd-shadow: 0 24px 60px rgba(0, 0, 0, .18);--tel-dd-radius: 12px;--tel-dd-item-hover: rgba(37, 99, 235, .08);--tel-dd-z: 2000;--tel-dd-search-bg: rgba(148, 163, 184, .08);display:block}:host-context(.dark){--tel-bg: #0b0f17;--tel-fg: #e5e7eb;--tel-border: #334155;--tel-border-hover: #475569;--tel-ring: #60a5fa;--tel-placeholder: #94a3b8;--tel-dd-bg: #0f1521;--tel-dd-border: #324056;--tel-dd-search-bg: rgba(148, 163, 184, .12)}.ngxsmk-tel{width:100%;color:var(--tel-fg)}.ngxsmk-tel.disabled{opacity:.7;cursor:not-allowed}.ngxsmk-tel__label{display:inline-block;margin-bottom:6px;font-size:.875rem;font-weight:500}.ngxsmk-tel__wrap{position:relative}.ngxsmk-tel-input__wrapper,:host ::ng-deep .iti{width:100%}.ngxsmk-tel-input__control{width:100%;height:40px;font:inherit;color:var(--tel-fg);background:var(--tel-bg);border:1px solid var(--tel-border);border-radius:var(--tel-radius);padding:10px 40px 10px 12px;outline:none;transition:border-color .15s,box-shadow .15s,background .15s}.ngxsmk-tel-input__control::placeholder{color:var(--tel-placeholder)}.ngxsmk-tel-input__control:hover{border-color:var(--tel-border-hover)}.ngxsmk-tel-input__control:focus{border-color:var(--tel-ring);box-shadow:var(--tel-focus-shadow)}[data-size=sm] .ngxsmk-tel-input__control{height:34px;font-size:13px;padding:6px 36px 6px 10px;border-radius:10px}[data-size=lg] .ngxsmk-tel-input__control{height:46px;font-size:16px;padding:12px 44px 12px 14px;border-radius:14px}[data-variant=filled] .ngxsmk-tel-input__control{background:#94a3b814}[data-variant=underline] .ngxsmk-tel-input__control{border:0;border-bottom:2px solid var(--tel-border);border-radius:0;padding-left:0;padding-right:34px}[data-variant=underline] .ngxsmk-tel-input__control:focus{border-bottom-color:var(--tel-ring);box-shadow:none}:host ::ng-deep .iti__flag-container{border-top-left-radius:var(--tel-radius);border-bottom-left-radius:var(--tel-radius);border:1px solid var(--tel-border);border-right:none;background:var(--tel-bg)}:host ::ng-deep .iti__selected-flag{height:100%;padding:0 10px;display:inline-flex;align-items:center}:host ::ng-deep .iti__country-list{background:var(--tel-dd-bg);border:1px solid var(--tel-dd-border);border-radius:var(--tel-dd-radius);box-shadow:var(--tel-dd-shadow);max-height:min(50vh,360px);overflow:auto;padding:6px 0;width:max(280px,100%);z-index:var(--tel-dd-z)}:host ::ng-deep .iti--container .iti__country-list{z-index:var(--tel-dd-z)}:host ::ng-deep .iti__search-input{position:sticky;top:0;margin:0;padding:10px 12px;width:100%;border:0;border-bottom:1px solid var(--tel-dd-border);outline:none;background:var(--tel-dd-search-bg);color:var(--tel-fg)}:host ::ng-deep .iti__country{display:grid;grid-template-columns:28px 1fr auto;align-items:center;column-gap:.5rem;padding:10px 12px;cursor:pointer}:host ::ng-deep .iti__dial-code{color:var(--tel-placeholder);font-weight:600;margin-left:10px}.ngxsmk-tel__clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:0;background:transparent;font-size:18px;line-height:1;width:28px;height:28px;border-radius:50%;cursor:pointer;color:var(--tel-placeholder)}.ngxsmk-tel__clear:hover{background:#94a3b826}.ngxsmk-tel__hint{margin-top:6px;font-size:12px;color:var(--tel-placeholder)}.ngxsmk-tel__error{margin-top:6px;font-size:12px;color:var(--tel-error)}.ngxsmk-tel__wrap.has-error .ngxsmk-tel-input__control{border-color:var(--tel-error);box-shadow:0 0 0 3px #ef444426}.ngxsmk-tel.disabled .iti__flag-container,.ngxsmk-tel.disabled .iti__selected-flag{pointer-events:none;opacity:.6}\n"] }]
|
|
577
538
|
}], ctorParameters: () => [{ type: i0.NgZone }, { type: NgxsmkTelInputService }], propDecorators: { inputRef: [{
|
|
578
539
|
type: ViewChild,
|
|
579
540
|
args: ['telInput', { static: true }]
|
|
@@ -583,8 +544,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
583
544
|
type: Input
|
|
584
545
|
}], onlyCountries: [{
|
|
585
546
|
type: Input
|
|
586
|
-
}], nationalMode: [{
|
|
587
|
-
type: Input
|
|
588
547
|
}], separateDialCode: [{
|
|
589
548
|
type: Input
|
|
590
549
|
}], allowDropdown: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-tel-input.mjs","sources":["../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.service.ts","../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.component.ts","../../../projects/ngxsmk-tel-input/src/ngxsmk-tel-input.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { parsePhoneNumberFromString, type CountryCode } from 'libphonenumber-js';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxsmkTelInputService {\r\n parse(input: string, iso2: CountryCode): { e164: string | null; national: string | null; isValid: boolean } {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n if (!phone) return { e164: null, national: null, isValid: false };\r\n const isValid = phone.isValid();\r\n return { e164: isValid ? phone.number : null, national: phone.formatNational(), isValid };\r\n }\r\n\r\n isValid(input: string, iso2: CountryCode): boolean {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n return !!phone && phone.isValid();\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n inject,\r\n Input,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n PLATFORM_ID,\r\n SimpleChanges,\r\n ViewChild\r\n} from '@angular/core';\r\nimport {isPlatformBrowser} from '@angular/common';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n NG_VALIDATORS,\r\n NG_VALUE_ACCESSOR,\r\n ValidationErrors,\r\n Validator\r\n} from '@angular/forms';\r\nimport {AsYouType, CountryCode} from 'libphonenumber-js';\r\nimport {NgxsmkTelInputService} from './ngxsmk-tel-input.service';\r\nimport {CountryMap, IntlTelI18n} from './types';\r\n\r\ntype IntlTelInstance = any;\r\n\r\n@Component({\r\n selector: 'ngxsmk-tel-input',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <div class=\"ngxsmk-tel\"\r\n [class.ngxsmk-tel-disabled]=\"disabled\"\r\n [attr.data-size]=\"size\"\r\n [attr.data-variant]=\"variant\"\r\n [attr.dir]=\"dir\">\r\n @if (label) {\r\n <label class=\"ngxsmk-tel__label\" [for]=\"resolvedId\">{{ label }}</label>\r\n }\r\n\r\n <div class=\"ngxsmk-tel__wrap\" [class.has-error]=\"showError\">\r\n <div class=\"ngxsmk-tel-input__wrapper\">\r\n <input\r\n #telInput\r\n type=\"tel\"\r\n class=\"ngxsmk-tel-input__control\"\r\n [id]=\"resolvedId\"\r\n [attr.name]=\"name || null\"\r\n [attr.placeholder]=\"placeholder || null\"\r\n [attr.autocomplete]=\"autocomplete\"\r\n [attr.inputmode]=\"digitsOnly ? 'numeric' : 'tel'\"\r\n [attr.pattern]=\"digitsOnly ? (allowLeadingPlus ? '\\\\\\\\+?[0-9]*' : '[0-9]*') : null\"\r\n [class.ngxsmk-tel-disabled]=\"disabled\"\r\n [attr.aria-invalid]=\"showError ? 'true' : 'false'\"\r\n (blur)=\"onBlur()\"\r\n (focus)=\"onFocus()\"\r\n />\r\n </div>\r\n\r\n @if (showClear && currentRaw() && !disabled) {\r\n <button type=\"button\"\r\n class=\"ngxsmk-tel__clear\"\r\n (click)=\"clearInput()\"\r\n [attr.aria-label]=\"clearAriaLabel\">\r\n ×\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (hint && !showError) {\r\n <div class=\"ngxsmk-tel__hint\">{{ hint }}</div>\r\n }\r\n </div>\r\n `,\r\n styleUrls: ['./ngxsmk-tel-input.component.scss'],\r\n providers: [\r\n {provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true},\r\n {provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true}\r\n ]\r\n})\r\nexport class NgxsmkTelInputComponent implements AfterViewInit, OnChanges, OnDestroy, ControlValueAccessor, Validator {\r\n\r\n @ViewChild('telInput', {static: true}) inputRef!: ElementRef<HTMLInputElement>;\r\n\r\n /* Core config */\r\n @Input() initialCountry: CountryCode | 'auto' = 'US';\r\n @Input() preferredCountries: CountryCode[] = ['US', 'GB'];\r\n @Input() onlyCountries?: CountryCode[];\r\n @Input() nationalMode: boolean = false;\r\n @Input() separateDialCode: boolean = false;\r\n @Input() allowDropdown: boolean = true;\r\n\r\n @Input() lockWhenValid: boolean = true;\r\n\r\n /* UX */\r\n @Input() placeholder?: string;\r\n @Input() autocomplete = 'tel';\r\n @Input() name?: string;\r\n @Input() inputId?: string;\r\n @Input() disabled: boolean = false;\r\n\r\n @Input() label?: string;\r\n @Input() hint?: string;\r\n @Input() errorText?: string;\r\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\r\n @Input() variant: 'outline' | 'filled' | 'underline' = 'outline';\r\n @Input() showClear: boolean = true;\r\n @Input() autoFocus: boolean = false;\r\n @Input() selectOnFocus: boolean = false;\r\n @Input() formatOnBlur: boolean = true;\r\n @Input() showErrorWhenTouched: boolean = true;\r\n\r\n /* Dropdown plumbing */\r\n @Input() dropdownAttachToBody: boolean = true;\r\n @Input() dropdownZIndex: number = 2000;\r\n\r\n /* Localization + RTL */\r\n @Input('i18n') i18n?: IntlTelI18n;\r\n\r\n @Input('telI18n') set telI18n(v: IntlTelI18n | undefined) {\r\n this.i18n = v;\r\n }\r\n\r\n @Input('localizedCountries') localizedCountries?: CountryMap;\r\n\r\n @Input('telLocalizedCountries') set telLocalizedCountries(v: CountryMap | undefined) {\r\n this.localizedCountries = v;\r\n }\r\n\r\n @Input() clearAriaLabel: string = 'Clear phone number';\r\n @Input() dir: 'ltr' | 'rtl' = 'ltr';\r\n\r\n /* Placeholders (intl-tel-input) */\r\n @Input() autoPlaceholder: 'off' | 'polite' | 'aggressive' = 'off'; // default OFF since no utils fallback\r\n @Input() utilsScript?: string;\r\n @Input() customPlaceholder?: (example: string, country: any) => string;\r\n\r\n @Input() formatWhenValid: 'off' | 'blur' | 'typing' = 'blur';\r\n\r\n /* Digits-only controls */\r\n @Input() digitsOnly: boolean = true;\r\n @Input() allowLeadingPlus: boolean = true;\r\n\r\n /* Outputs */\r\n @Output() countryChange = new EventEmitter<{ iso2: CountryCode }>();\r\n @Output() validityChange = new EventEmitter<boolean>();\r\n @Output() inputChange = new EventEmitter<{ raw: string; e164: string | null; iso2: CountryCode }>();\r\n\r\n /* Internal */\r\n private iti: IntlTelInstance | null = null;\r\n private onChange: (val: string | null) => void = () => {\r\n };\r\n private onTouchedCb: () => void = () => {\r\n };\r\n private validatorChange?: () => void;\r\n private lastEmittedValid = false;\r\n private pendingWrite: string | null = null;\r\n private touched: boolean = false;\r\n\r\n readonly resolvedId: string = this.inputId || ('tel-' + Math.random().toString(36).slice(2));\r\n\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n private allowDropdownWasTrue = false;\r\n private suppressEvents = false; // already used elsewhere if you added it\r\n\r\n constructor(\r\n private readonly zone: NgZone,\r\n private readonly tel: NgxsmkTelInputService\r\n ) {\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n void this.initAndWire();\r\n }\r\n\r\n private async initAndWire(): Promise<void> {\r\n await this.initIntlTelInput();\r\n this.bindDomListeners();\r\n\r\n if (this.pendingWrite !== null) {\r\n // IMPORTANT: use writeValue so the plugin sets country, then we normalize input\r\n const v = this.pendingWrite;\r\n this.pendingWrite = null;\r\n this.writeValue(v);\r\n }\r\n\r\n if (this.autoFocus) setTimeout(() => this.focus(), 0);\r\n }\r\n\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n const configChanged = [\r\n 'initialCountry', 'preferredCountries', 'onlyCountries',\r\n 'separateDialCode', 'allowDropdown', 'nationalMode',\r\n 'i18n', 'localizedCountries', 'dir',\r\n 'autoPlaceholder', 'utilsScript', 'customPlaceholder',\r\n 'digitsOnly', 'allowLeadingPlus'\r\n ].some(k => k in changes && !changes[k]?.firstChange);\r\n if (configChanged && this.iti) {\r\n this.reinitPlugin();\r\n this.validatorChange?.();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyPlugin();\r\n }\r\n\r\n // ----- CVA -----\r\n writeValue(val: string | null): void {\r\n if (!this.inputRef) return;\r\n\r\n if (!this.iti) { this.pendingWrite = val ?? ''; return; }\r\n\r\n this.suppressEvents = true;\r\n try {\r\n // Let plugin infer/select country when val is E.164\r\n this.iti.setNumber(val || '');\r\n const iso2 = this.currentIso2();\r\n\r\n const normalized = this.stripTrunkZeroIfNeeded(val ?? '', iso2);\r\n if (!normalized) {\r\n this.setInputValue('');\r\n this.zone.run(() => this.onChange(null));\r\n return;\r\n }\r\n\r\n const parsed = this.tel.parse(normalized, iso2);\r\n\r\n // 👀 Visible input: ALWAYS national (no dial code)\r\n this.setInputValue(parsed.national ?? normalized.replace(/^\\+\\d+/, ''));\r\n\r\n // 🔗 FormControl value: ALWAYS E.164 (or null)\r\n this.zone.run(() => this.onChange(parsed.e164));\r\n this.zone.run(() => this.inputChange.emit({ raw: this.currentRaw(), e164: parsed.e164, iso2 }));\r\n } finally {\r\n this.suppressEvents = false;\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouchedCb = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n\r\n // 1) native input\r\n if (this.inputRef) this.inputRef.nativeElement.disabled = isDisabled;\r\n\r\n // 2) toggle dropdown by re-init with allowDropdown=false when disabled\r\n if (this.iti) {\r\n if (isDisabled && this.allowDropdown) {\r\n this.allowDropdownWasTrue = true;\r\n this.allowDropdown = false;\r\n this.reinitPlugin(); // closes popup & removes handlers\r\n } else if (!isDisabled && this.allowDropdownWasTrue) {\r\n this.allowDropdown = true;\r\n this.allowDropdownWasTrue = false;\r\n this.reinitPlugin(); // restore dropdown\r\n } else {\r\n // even if we didn't reinit, harden UI\r\n this.applyDisabledUi(isDisabled);\r\n }\r\n } else {\r\n // Not initialized yet; just harden UI for first paint\r\n this.applyDisabledUi(isDisabled);\r\n }\r\n }\r\n\r\n private applyDisabledUi(disabled: boolean) {\r\n // wrapper already gets [class.disabled]=\"disabled\" from template\r\n const input = this.inputRef?.nativeElement;\r\n if (!input) return;\r\n\r\n // Make the flag button non-focusable/non-clickable\r\n const flag = input.parentElement?.querySelector('.iti__selected-flag') as HTMLElement | null;\r\n if (flag) {\r\n flag.tabIndex = disabled ? -1 : 0;\r\n flag.setAttribute('aria-disabled', String(disabled));\r\n }\r\n }\r\n\r\n\r\n // ----- Validator -----\r\n validate(_: AbstractControl): ValidationErrors | null {\r\n const raw = this.currentRaw();\r\n if (!raw) return null;\r\n const valid = this.tel.isValid(raw, this.currentIso2());\r\n if (valid !== this.lastEmittedValid) {\r\n this.lastEmittedValid = valid;\r\n this.validityChange.emit(valid);\r\n }\r\n return valid ? null : {phoneInvalid: true};\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void {\r\n this.validatorChange = fn;\r\n }\r\n\r\n // ----- Public helpers -----\r\n focus(): void {\r\n this.inputRef?.nativeElement.focus();\r\n if (this.selectOnFocus) {\r\n const el = this.inputRef.nativeElement;\r\n queueMicrotask(() => el.setSelectionRange(0, el.value.length));\r\n }\r\n }\r\n\r\n selectCountry(iso2: CountryCode): void {\r\n if (this.iti) {\r\n this.iti.setCountry(iso2.toLowerCase());\r\n this.handleInput();\r\n }\r\n }\r\n\r\n clearInput() {\r\n this.setInputValue('');\r\n this.handleInput();\r\n this.inputRef.nativeElement.focus();\r\n }\r\n\r\n // ----- Plugin wiring -----\r\n private async initIntlTelInput() {\r\n const [{default: intlTelInput}] = await Promise.all([import('intl-tel-input')]);\r\n\r\n const toLowerKeys = (m?: CountryMap) => {\r\n if (!m) return undefined;\r\n const out: Record<string, string> = {};\r\n for (const k in m) {\r\n if (Object.prototype.hasOwnProperty.call(m, k)) {\r\n const v = (m as Record<string, string | undefined>)[k];\r\n if (v != null) out[k.toLowerCase()] = v;\r\n }\r\n }\r\n return out;\r\n };\r\n\r\n const config: any = {\r\n initialCountry: this.initialCountry === 'auto' ? 'auto' : (this.initialCountry?.toLowerCase() || 'us'),\r\n preferredCountries: (this.preferredCountries ?? []).map(c => c.toLowerCase()),\r\n onlyCountries: (this.onlyCountries ?? []).map(c => c.toLowerCase()),\r\n nationalMode: this.nationalMode,\r\n allowDropdown: this.allowDropdown,\r\n separateDialCode: this.separateDialCode,\r\n geoIpLookup: (cb: (iso2: string) => void) => cb('us'),\r\n\r\n // placeholders\r\n autoPlaceholder: this.autoPlaceholder,\r\n utilsScript: this.utilsScript,\r\n customPlaceholder: this.customPlaceholder,\r\n\r\n // localization\r\n i18n: this.i18n,\r\n localizedCountries: toLowerKeys(this.localizedCountries),\r\n\r\n // dropdown container\r\n dropdownContainer: this.dropdownAttachToBody && typeof document !== 'undefined' ? document.body : undefined\r\n };\r\n\r\n this.zone.runOutsideAngular(() => {\r\n this.iti = intlTelInput(this.inputRef.nativeElement, config);\r\n });\r\n\r\n (this.inputRef.nativeElement as HTMLElement).style.setProperty('--tel-dd-z', String(this.dropdownZIndex));\r\n }\r\n\r\n private async reinitPlugin() {\r\n const prevIso2 = (this.iti?.getSelectedCountryData?.().iso2 || this.initialCountry || 'US').toString().toLowerCase();\r\n const prevValue = this.currentRaw();\r\n\r\n this.destroyPlugin();\r\n await this.initIntlTelInput();\r\n this.bindDomListeners();\r\n\r\n // restore country & value\r\n try { this.iti?.setCountry(prevIso2); } catch {}\r\n if (prevValue) {\r\n this.setInputValue(prevValue);\r\n this.handleInput();\r\n }\r\n\r\n (this.inputRef.nativeElement as HTMLElement).style.setProperty('--tel-dd-z', String(this.dropdownZIndex));\r\n this.applyDisabledUi(this.disabled);\r\n }\r\n\r\n private destroyPlugin() {\r\n if (this.iti) {\r\n this.iti.destroy();\r\n this.iti = null;\r\n }\r\n if (this.inputRef?.nativeElement) {\r\n const el = this.inputRef.nativeElement;\r\n const clone = el.cloneNode(true) as HTMLInputElement;\r\n\r\n // preserve important state across clone\r\n clone.disabled = this.disabled;\r\n clone.id = this.resolvedId; // keep the same id\r\n clone.name = this.name ?? clone.name;\r\n clone.value = el.value;\r\n\r\n el.parentNode?.replaceChild(clone, el);\r\n (this.inputRef as any).nativeElement = clone;\r\n }\r\n }\r\n\r\n\r\n // ----- Input filtering (digits-only) -----\r\n private sanitizeDigits(value: string): string {\r\n if (!this.digitsOnly) return value;\r\n let v = value.replace(/[^\\d+]/g, '');\r\n if (this.allowLeadingPlus) {\r\n const hasLeadingPlus = v.startsWith('+');\r\n v = (hasLeadingPlus ? '+' : '') + v.replace(/\\+/g, '');\r\n } else {\r\n v = v.replace(/\\+/g, '');\r\n }\r\n return v;\r\n }\r\n\r\n\r\n /** Remove a single trunk '0' when that makes the number valid.\r\n * Works for: \"+<cc>0...\" and \"0...\" (national), but only if the stripped form parses valid.\r\n */\r\n private stripTrunkZeroIfNeeded(raw: string, iso2: CountryCode): string {\r\n if (!raw) return raw;\r\n\r\n const dial = this.iti?.getSelectedCountryData?.().dialCode ?? '';\r\n\r\n // If already valid, don't touch.\r\n const parsed0 = this.tel.parse(raw, iso2);\r\n if (parsed0.isValid) return raw;\r\n\r\n // Try: +<dial>0xxxx → +<dial>xxxx\r\n if (dial && raw.startsWith(`+${dial}0`)) {\r\n const attempt = `+${dial}${raw.slice(dial.length + 2)}`;\r\n const p = this.tel.parse(attempt, iso2);\r\n if (p.isValid) return attempt;\r\n }\r\n\r\n // Try: 0xxxx → xxxx (national)\r\n if (!raw.startsWith('+') && raw.startsWith('0')) {\r\n const attemptNat = raw.slice(1);\r\n const p = this.tel.parse(attemptNat, iso2);\r\n if (p.isValid) return attemptNat;\r\n }\r\n\r\n return raw;\r\n }\r\n\r\n private bindDomListeners() {\r\n const el = this.inputRef.nativeElement;\r\n\r\n this.zone.runOutsideAngular(() => {\r\n el.addEventListener('beforeinput', (ev: InputEvent) => {\r\n if (!this.digitsOnly) return;\r\n\r\n const data = (ev as any).data as string | null;\r\n\r\n // If already valid, block extra digit insertions when no selection\r\n if (this.lockWhenValid && this.isCurrentlyValid()) {\r\n const selCollapsed = (el.selectionStart ?? 0) === (el.selectionEnd ?? 0);\r\n const isDigit = !!data && ev.inputType === 'insertText' && data >= '0' && data <= '9';\r\n const isPlusAtStart = this.allowLeadingPlus && data === '+' && (el.selectionStart ?? 0) === 0 && !el.value.includes('+');\r\n\r\n if (selCollapsed && (isDigit || isPlusAtStart)) {\r\n ev.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n // normal filtering when not valid (or replacing text)\r\n if (!data || ev.inputType !== 'insertText') return;\r\n\r\n const pos = el.selectionStart ?? 0;\r\n const isDigit = data >= '0' && data <= '9';\r\n const isPlusAtStart = this.allowLeadingPlus && data === '+' && pos === 0 && !el.value.includes('+');\r\n\r\n if (!isDigit && !isPlusAtStart) ev.preventDefault();\r\n });\r\n\r\n el.addEventListener('paste', (e: ClipboardEvent) => {\r\n if (!this.digitsOnly) return;\r\n\r\n const text = (e.clipboardData || (window as any).clipboardData).getData('text') || '';\r\n const hasAnyDigit = /[0-9]/.test(text);\r\n\r\n // block pasting extra digits if valid and there is no selection\r\n if (this.lockWhenValid && this.isCurrentlyValid()) {\r\n const selCollapsed = (el.selectionStart ?? 0) === (el.selectionEnd ?? 0);\r\n if (selCollapsed && hasAnyDigit) {\r\n e.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n // sanitize paste\r\n e.preventDefault();\r\n const sanitized = this.sanitizeDigits(text);\r\n const start = el.selectionStart ?? el.value.length;\r\n const end = el.selectionEnd ?? el.value.length;\r\n el.setRangeText(sanitized, start, end, 'end');\r\n queueMicrotask(() => this.handleInput());\r\n });\r\n\r\n el.addEventListener('input', () => {\r\n if (this.digitsOnly) {\r\n const val = el.value;\r\n const sanitized = this.sanitizeDigits(val);\r\n if (val !== sanitized) {\r\n const caret = el.selectionStart ?? sanitized.length;\r\n el.value = sanitized;\r\n el.setSelectionRange(caret, caret);\r\n }\r\n }\r\n this.handleInput();\r\n });\r\n\r\n el.addEventListener('countrychange', () => {\r\n const iso2 = this.currentIso2();\r\n this.zone.run(() => {\r\n this.countryChange.emit({iso2});\r\n this.validatorChange?.();\r\n });\r\n this.handleInput();\r\n });\r\n\r\n el.addEventListener('blur', () => this.onBlur());\r\n });\r\n }\r\n\r\n onBlur() {\r\n this.touched = true;\r\n this.zone.run(() => this.onTouchedCb());\r\n if (!this.formatOnBlur) return;\r\n\r\n const iso2 = this.currentIso2();\r\n const raw = this.stripTrunkZeroIfNeeded(this.currentRaw(), iso2);\r\n const parsed = this.tel.parse(raw, iso2);\r\n\r\n if (parsed.isValid && parsed.national) {\r\n this.setInputValue(parsed.national.replace(/\\s{2,}/g, ' '));\r\n }\r\n }\r\n\r\n onFocus() {\r\n if (this.selectOnFocus) {\r\n const el = this.inputRef.nativeElement;\r\n queueMicrotask(() => el.setSelectionRange(0, el.value.length));\r\n }\r\n }\r\n\r\n private handleInput() {\r\n if (this.suppressEvents) return;\r\n\r\n let raw = this.currentRaw();\r\n const iso2 = this.currentIso2();\r\n\r\n // normalize trunk '0' if that yields a valid parse\r\n const fixed = this.stripTrunkZeroIfNeeded(raw, iso2);\r\n if (fixed !== raw) {\r\n this.setInputValue(fixed);\r\n raw = fixed;\r\n }\r\n\r\n const parsed = this.tel.parse(raw, iso2);\r\n\r\n // 🔗 Emit E.164 (or null) to the FormControl\r\n this.zone.run(() => this.onChange(parsed.e164));\r\n this.zone.run(() => this.inputChange.emit({ raw, e164: parsed.e164, iso2 }));\r\n\r\n // 👀 Keep the visible value national only (once valid)\r\n if (parsed.isValid && parsed.national && raw !== parsed.national) {\r\n this.suppressEvents = true;\r\n this.setInputValue(parsed.national.replace(/\\s{2,}/g, ' '));\r\n this.suppressEvents = false;\r\n }\r\n }\r\n\r\n private formatAsYouType(raw: string, iso2: CountryCode): string {\r\n try {\r\n // When a region is provided, AsYouType returns NATIONAL formatting\r\n const fmt = new AsYouType(iso2);\r\n return fmt.input(raw);\r\n } catch {\r\n return raw;\r\n }\r\n }\r\n\r\n currentRaw(): string {\r\n return (this.inputRef?.nativeElement.value ?? '').trim();\r\n }\r\n\r\n private currentIso2(): CountryCode {\r\n const iso2 = (this.iti?.getSelectedCountryData?.().iso2 ?? this.initialCountry ?? 'US')\r\n .toString().toUpperCase();\r\n return iso2 as CountryCode;\r\n }\r\n\r\n private setInputValue(v: string) {\r\n this.inputRef.nativeElement.value = v ?? '';\r\n }\r\n\r\n get showError(): boolean {\r\n const invalid = !!this.validate({} as AbstractControl);\r\n return this.showErrorWhenTouched ? (this.touched && invalid) : invalid;\r\n }\r\n\r\n private isCurrentlyValid(): boolean {\r\n return this.tel.isValid(this.currentRaw(), this.currentIso2());\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgxsmkTelInputService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngxsmk-tel-input.mjs","sources":["../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.service.ts","../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.component.ts","../../../projects/ngxsmk-tel-input/src/ngxsmk-tel-input.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { parsePhoneNumberFromString, type CountryCode } from 'libphonenumber-js';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxsmkTelInputService {\r\n parse(input: string, iso2: CountryCode): { e164: string | null; national: string | null; isValid: boolean } {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n if (!phone) return { e164: null, national: null, isValid: false };\r\n const isValid = phone.isValid();\r\n return { e164: isValid ? phone.number : null, national: phone.formatNational(), isValid };\r\n }\r\n\r\n isValid(input: string, iso2: CountryCode): boolean {\r\n const phone = parsePhoneNumberFromString(input || '', iso2);\r\n return !!phone && phone.isValid();\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n inject,\r\n Input,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n PLATFORM_ID,\r\n SimpleChanges,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n NG_VALIDATORS,\r\n NG_VALUE_ACCESSOR,\r\n ValidationErrors,\r\n Validator\r\n} from '@angular/forms';\r\nimport { AsYouType, CountryCode } from 'libphonenumber-js';\r\nimport { NgxsmkTelInputService } from './ngxsmk-tel-input.service';\r\nimport { CountryMap, IntlTelI18n } from './types';\r\n\r\ntype IntlTelInstance = any;\r\n\r\n@Component({\r\n selector: 'ngxsmk-tel-input',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <div class=\"ngxsmk-tel\"\r\n [class.disabled]=\"disabled\"\r\n [attr.data-size]=\"size\"\r\n [attr.data-variant]=\"variant\"\r\n [attr.dir]=\"dir\">\r\n @if (label) {\r\n <label class=\"ngxsmk-tel__label\" [for]=\"resolvedId\">{{ label }}</label>\r\n }\r\n\r\n <div class=\"ngxsmk-tel__wrap\" [class.has-error]=\"showError\">\r\n <div class=\"ngxsmk-tel-input__wrapper\">\r\n <input\r\n #telInput\r\n type=\"tel\"\r\n class=\"ngxsmk-tel-input__control\"\r\n [id]=\"resolvedId\"\r\n [attr.name]=\"name || null\"\r\n [attr.placeholder]=\"placeholder || null\"\r\n [attr.autocomplete]=\"autocomplete\"\r\n [attr.inputmode]=\"digitsOnly ? 'numeric' : 'tel'\"\r\n [attr.pattern]=\"digitsOnly ? (allowLeadingPlus ? '\\\\\\\\+?[0-9]*' : '[0-9]*') : null\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-invalid]=\"showError ? 'true' : 'false'\"\r\n (blur)=\"onBlur()\"\r\n (focus)=\"onFocus()\"\r\n />\r\n </div>\r\n\r\n @if (showClear && currentRaw()) {\r\n <button type=\"button\"\r\n class=\"ngxsmk-tel__clear\"\r\n (click)=\"clearInput()\"\r\n [attr.aria-label]=\"clearAriaLabel\">\r\n ×\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (hint && !showError) {\r\n <div class=\"ngxsmk-tel__hint\">{{ hint }}</div>\r\n }\r\n </div>\r\n `,\r\n styleUrls: ['./ngxsmk-tel-input.component.scss'],\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true },\r\n { provide: NG_VALIDATORS, useExisting: forwardRef(() => NgxsmkTelInputComponent), multi: true }\r\n ]\r\n})\r\nexport class NgxsmkTelInputComponent implements AfterViewInit, OnChanges, OnDestroy, ControlValueAccessor, Validator {\r\n @ViewChild('telInput', { static: true }) inputRef!: ElementRef<HTMLInputElement>;\r\n\r\n /* Core config */\r\n @Input() initialCountry: CountryCode | 'auto' = 'US';\r\n @Input() preferredCountries: CountryCode[] = ['US', 'GB'];\r\n @Input() onlyCountries?: CountryCode[];\r\n /** UI-only: flag/dial code. Input will ALWAYS show national digits only. */\r\n @Input() separateDialCode: boolean = false;\r\n @Input() allowDropdown: boolean = true;\r\n /** UI “valid lock” while typing digits */\r\n @Input() lockWhenValid: boolean = true;\r\n\r\n /* UX */\r\n @Input() placeholder?: string;\r\n @Input() autocomplete = 'tel';\r\n @Input() name?: string;\r\n @Input() inputId?: string;\r\n @Input() disabled: boolean = false;\r\n\r\n @Input() label?: string;\r\n @Input() hint?: string;\r\n @Input() errorText?: string;\r\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\r\n @Input() variant: 'outline' | 'filled' | 'underline' = 'outline';\r\n @Input() showClear: boolean = true;\r\n @Input() autoFocus: boolean = false;\r\n @Input() selectOnFocus: boolean = false;\r\n @Input() formatOnBlur: boolean = true;\r\n @Input() showErrorWhenTouched: boolean = true;\r\n\r\n /* Dropdown plumbing */\r\n @Input() dropdownAttachToBody: boolean = true;\r\n @Input() dropdownZIndex: number = 2000;\r\n\r\n /* Localization + RTL */\r\n @Input('i18n') i18n?: IntlTelI18n;\r\n @Input('telI18n') set telI18n(v: IntlTelI18n | undefined) { this.i18n = v; }\r\n @Input('localizedCountries') localizedCountries?: CountryMap;\r\n @Input('telLocalizedCountries') set telLocalizedCountries(v: CountryMap | undefined) { this.localizedCountries = v; }\r\n\r\n @Input() clearAriaLabel: string = 'Clear phone number';\r\n @Input() dir: 'ltr' | 'rtl' = 'ltr';\r\n\r\n /* Placeholders (intl-tel-input) */\r\n @Input() autoPlaceholder: 'off' | 'polite' | 'aggressive' = 'off';\r\n @Input() utilsScript?: string;\r\n @Input() customPlaceholder?: (example: string, country: any) => string;\r\n\r\n /** When to live-format while typing (NATIONAL visible only) */\r\n @Input() formatWhenValid: 'off' | 'blur' | 'typing' = 'blur';\r\n\r\n /* Digits-only controls (visible input is digits-only regardless; these affect typing filters) */\r\n @Input() digitsOnly: boolean = true;\r\n @Input() allowLeadingPlus: boolean = false;\r\n\r\n /* Outputs */\r\n @Output() countryChange = new EventEmitter<{ iso2: CountryCode }>();\r\n @Output() validityChange = new EventEmitter<boolean>();\r\n @Output() inputChange = new EventEmitter<{ raw: string; e164: string | null; iso2: CountryCode }>();\r\n\r\n /* Internal */\r\n private iti: IntlTelInstance | null = null;\r\n private onChange: (val: string | null) => void = () => {};\r\n private onTouchedCb: () => void = () => {};\r\n private validatorChange?: () => void;\r\n private lastEmittedValid = false;\r\n private pendingWrite: string | null = null;\r\n private touched: boolean = false;\r\n\r\n private allowDropdownWasTrue = false;\r\n private suppressEvents = false;\r\n\r\n readonly resolvedId: string = this.inputId || ('tel-' + Math.random().toString(36).slice(2));\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n constructor(\r\n private readonly zone: NgZone,\r\n private readonly tel: NgxsmkTelInputService\r\n ) {}\r\n\r\n // ---------- Lifecycle ----------\r\n ngAfterViewInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n void this.initAndWire();\r\n }\r\n\r\n private async initAndWire(): Promise<void> {\r\n await this.initIntlTelInput();\r\n this.bindDomListeners();\r\n\r\n if (this.pendingWrite !== null) {\r\n const v = this.pendingWrite;\r\n this.pendingWrite = null;\r\n this.writeValue(v);\r\n }\r\n\r\n if (this.autoFocus) setTimeout(() => this.focus(), 0);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n const configChanged = [\r\n 'initialCountry', 'preferredCountries', 'onlyCountries',\r\n 'separateDialCode', 'allowDropdown',\r\n 'i18n', 'localizedCountries', 'dir',\r\n 'autoPlaceholder', 'utilsScript', 'customPlaceholder'\r\n ].some(k => k in changes && !changes[k]?.firstChange);\r\n\r\n if (configChanged && this.iti) {\r\n this.reinitPlugin();\r\n this.validatorChange?.();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void { this.destroyPlugin(); }\r\n\r\n // ---------- CVA ----------\r\n writeValue(val: string | null): void {\r\n if (!this.inputRef) return;\r\n\r\n if (!this.iti) { // not initialized yet\r\n this.pendingWrite = val ?? '';\r\n return;\r\n }\r\n\r\n this.suppressEvents = true;\r\n try {\r\n // Let the plugin infer selected country from E.164\r\n this.iti.setNumber(val || '');\r\n\r\n const iso2 = this.currentIso2();\r\n const normalized = this.stripTrunkZeroIfNeeded(val ?? '', iso2);\r\n const parsed = this.tel.parse(normalized, iso2);\r\n\r\n // Visible input: ALWAYS NATIONAL digits only\r\n const nsn = this.toNSN(parsed.national ?? normalized.replace(/^\\+\\d+/, ''));\r\n this.setInputValue(nsn);\r\n\r\n // FormControl value: ALWAYS E.164 (or null)\r\n this.zone.run(() => this.onChange(parsed.e164));\r\n this.zone.run(() => this.inputChange.emit({ raw: nsn, e164: parsed.e164, iso2 }));\r\n } finally {\r\n this.suppressEvents = false;\r\n }\r\n }\r\n\r\n registerOnChange(fn: any): void { this.onChange = fn; }\r\n registerOnTouched(fn: any): void { this.onTouchedCb = fn; }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n\r\n // 1) native input state\r\n if (this.inputRef) this.inputRef.nativeElement.disabled = isDisabled;\r\n\r\n // 2) disable/enable dropdown robustly by toggling allowDropdown and reinit\r\n if (this.iti) {\r\n if (isDisabled && this.allowDropdown) {\r\n this.allowDropdownWasTrue = true;\r\n this.allowDropdown = false;\r\n this.reinitPlugin();\r\n } else if (!isDisabled && this.allowDropdownWasTrue) {\r\n this.allowDropdown = true;\r\n this.allowDropdownWasTrue = false;\r\n this.reinitPlugin();\r\n } else {\r\n this.applyDisabledUi(isDisabled);\r\n }\r\n } else {\r\n this.applyDisabledUi(isDisabled);\r\n }\r\n }\r\n\r\n // ---------- Validator ----------\r\n validate(_: AbstractControl): ValidationErrors | null {\r\n const raw = this.currentRaw();\r\n if (!raw) return null;\r\n const valid = this.tel.isValid(raw, this.currentIso2());\r\n if (valid !== this.lastEmittedValid) {\r\n this.lastEmittedValid = valid;\r\n this.validityChange.emit(valid);\r\n }\r\n return valid ? null : { phoneInvalid: true };\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void { this.validatorChange = fn; }\r\n\r\n // ---------- Public helpers ----------\r\n focus(): void {\r\n this.inputRef?.nativeElement.focus();\r\n if (this.selectOnFocus) {\r\n const el = this.inputRef.nativeElement;\r\n queueMicrotask(() => el.setSelectionRange(0, el.value.length));\r\n }\r\n }\r\n\r\n selectCountry(iso2: CountryCode): void {\r\n if (this.iti) {\r\n this.iti.setCountry(iso2.toLowerCase());\r\n this.handleInput();\r\n }\r\n }\r\n\r\n clearInput(): void {\r\n this.setInputValue('');\r\n this.handleInput();\r\n this.inputRef.nativeElement.focus();\r\n }\r\n\r\n // ---------- intl-tel-input wiring ----------\r\n private async initIntlTelInput() {\r\n const [{ default: intlTelInput }] = await Promise.all([import('intl-tel-input')]);\r\n\r\n const toLowerKeys = (m?: CountryMap) => {\r\n if (!m) return undefined;\r\n const out: Record<string, string> = {};\r\n for (const k in m) if (Object.prototype.hasOwnProperty.call(m, k)) {\r\n const v = (m as Record<string, string | undefined>)[k];\r\n if (v != null) out[k.toLowerCase()] = v;\r\n }\r\n return out;\r\n };\r\n\r\n const config: any = {\r\n initialCountry: this.initialCountry === 'auto' ? 'auto' : (this.initialCountry?.toLowerCase() || 'us'),\r\n preferredCountries: (this.preferredCountries ?? []).map(c => c.toLowerCase()),\r\n onlyCountries: (this.onlyCountries ?? []).map(c => c.toLowerCase()),\r\n\r\n // We ALWAYS show national digits in the input ourselves,\r\n // but enabling nationalMode prevents plugin from forcing a '+' back in.\r\n nationalMode: true,\r\n\r\n allowDropdown: this.allowDropdown,\r\n separateDialCode: this.separateDialCode,\r\n geoIpLookup: (cb: (iso2: string) => void) => cb('us'),\r\n\r\n // placeholders\r\n autoPlaceholder: this.autoPlaceholder,\r\n utilsScript: this.utilsScript,\r\n customPlaceholder: this.customPlaceholder,\r\n\r\n // localization\r\n i18n: this.i18n,\r\n localizedCountries: toLowerKeys(this.localizedCountries),\r\n\r\n // dropdown container\r\n dropdownContainer: this.dropdownAttachToBody && typeof document !== 'undefined' ? document.body : undefined\r\n };\r\n\r\n this.zone.runOutsideAngular(() => {\r\n this.iti = intlTelInput(this.inputRef.nativeElement, config);\r\n });\r\n\r\n // ensure dropdown is above app UI & apply disabled UI\r\n (this.inputRef.nativeElement as HTMLElement).style.setProperty('--tel-dd-z', String(this.dropdownZIndex));\r\n this.applyDisabledUi(this.disabled);\r\n }\r\n\r\n private async reinitPlugin() {\r\n const prevIso2 = (this.iti?.getSelectedCountryData?.().iso2 || this.initialCountry || 'US').toString().toLowerCase();\r\n const prevValue = this.currentRaw();\r\n\r\n this.destroyPlugin();\r\n await this.initIntlTelInput();\r\n this.bindDomListeners();\r\n\r\n try { this.iti?.setCountry(prevIso2); } catch {}\r\n if (prevValue) {\r\n this.setInputValue(prevValue);\r\n this.handleInput();\r\n }\r\n this.applyDisabledUi(this.disabled);\r\n }\r\n\r\n private destroyPlugin() {\r\n if (this.iti) {\r\n this.iti.destroy();\r\n this.iti = null;\r\n }\r\n if (this.inputRef?.nativeElement) {\r\n const el = this.inputRef.nativeElement;\r\n const clone = el.cloneNode(true) as HTMLInputElement;\r\n\r\n // preserve state across clone\r\n clone.disabled = this.disabled;\r\n clone.id = this.resolvedId;\r\n clone.name = this.name ?? clone.name;\r\n clone.value = el.value;\r\n\r\n el.parentNode?.replaceChild(clone, el);\r\n (this.inputRef as any).nativeElement = clone;\r\n }\r\n }\r\n\r\n // ---------- Input filtering (digits-only) ----------\r\n private sanitizeDigits(value: string): string {\r\n // visible input is digits-only regardless of props\r\n return (value || '').replace(/\\D/g, '');\r\n }\r\n\r\n private bindDomListeners() {\r\n const el = this.inputRef.nativeElement;\r\n\r\n this.zone.runOutsideAngular(() => {\r\n el.addEventListener('beforeinput', (ev: InputEvent) => {\r\n if (!this.digitsOnly) return;\r\n const data = (ev as any).data as string | null;\r\n\r\n // If already valid, block extra digit insertions when no selection\r\n if (this.lockWhenValid && this.isCurrentlyValid()) {\r\n const selCollapsed = (el.selectionStart ?? 0) === (el.selectionEnd ?? 0);\r\n const isDigit = !!data && ev.inputType === 'insertText' && data >= '0' && data <= '9';\r\n if (selCollapsed && isDigit) { ev.preventDefault(); return; }\r\n }\r\n\r\n if (!data || ev.inputType !== 'insertText') return;\r\n const isDigit = data >= '0' && data <= '9';\r\n if (!isDigit) ev.preventDefault();\r\n });\r\n\r\n el.addEventListener('paste', (e: ClipboardEvent) => {\r\n const text = (e.clipboardData || (window as any).clipboardData).getData('text') || '';\r\n e.preventDefault();\r\n const sanitized = this.sanitizeDigits(text);\r\n const start = el.selectionStart ?? el.value.length;\r\n const end = el.selectionEnd ?? el.value.length;\r\n el.setRangeText(sanitized, start, end, 'end');\r\n queueMicrotask(() => this.handleInput());\r\n });\r\n\r\n el.addEventListener('input', () => {\r\n const val = el.value;\r\n const sanitized = this.sanitizeDigits(val);\r\n if (val !== sanitized) {\r\n const caret = el.selectionStart ?? sanitized.length;\r\n el.value = sanitized;\r\n el.setSelectionRange(caret, caret);\r\n }\r\n this.handleInput();\r\n });\r\n\r\n el.addEventListener('countrychange', () => {\r\n const iso2 = this.currentIso2();\r\n this.zone.run(() => {\r\n this.countryChange.emit({ iso2 });\r\n this.validatorChange?.();\r\n });\r\n this.handleInput();\r\n });\r\n\r\n el.addEventListener('blur', () => this.onBlur());\r\n });\r\n }\r\n\r\n // ---------- UX handlers ----------\r\n onBlur() {\r\n this.touched = true;\r\n this.zone.run(() => this.onTouchedCb());\r\n if (!this.formatOnBlur) return;\r\n\r\n const raw = this.currentRaw();\r\n if (!raw) return;\r\n\r\n const iso2 = this.currentIso2();\r\n const parsed = this.tel.parse(raw, iso2);\r\n\r\n if (parsed.isValid && parsed.national) {\r\n this.setInputValue(this.toNSN(parsed.national)); // keep digits only\r\n }\r\n }\r\n\r\n onFocus() {\r\n if (this.selectOnFocus) {\r\n const el = this.inputRef.nativeElement;\r\n queueMicrotask(() => el.setSelectionRange(0, el.value.length));\r\n }\r\n }\r\n\r\n // ---------- Core input pipeline ----------\r\n private handleInput() {\r\n if (this.suppressEvents) return;\r\n\r\n let raw = this.toNSN(this.currentRaw());\r\n const iso2 = this.currentIso2();\r\n\r\n // Try a generic trunk-0 strip only if it makes the number valid\r\n const fixed = this.stripTrunkZeroIfNeeded(raw, iso2);\r\n if (fixed !== raw) {\r\n this.setInputValue(this.toNSN(fixed));\r\n raw = this.currentRaw();\r\n }\r\n\r\n // Parse once\r\n const parsed = this.tel.parse(raw, iso2);\r\n\r\n // Emit E.164 to the form\r\n this.zone.run(() => this.onChange(parsed.e164));\r\n this.zone.run(() => this.inputChange.emit({ raw, e164: parsed.e164, iso2 }));\r\n\r\n // Keep visible as NATIONAL digits only\r\n if (parsed.isValid && parsed.national) {\r\n const nsn = this.toNSN(parsed.national).replace(/\\s{2,}/g, ' ');\r\n if (nsn !== raw) this.setInputValue(nsn);\r\n }\r\n\r\n // optional live formatting (we keep digits-only anyway)\r\n if (this.formatWhenValid === 'typing' && raw && parsed.isValid) {\r\n const natPretty = this.toNSN(this.formatAsYouType(raw, iso2));\r\n if (natPretty !== raw) this.setInputValue(natPretty);\r\n }\r\n }\r\n\r\n // ---------- Utilities ----------\r\n /** NATIONAL-only formatter while typing, using region for rules */\r\n private formatAsYouType(raw: string, iso2: CountryCode): string {\r\n try {\r\n const fmt = new AsYouType(iso2);\r\n return this.toNSN(fmt.input(raw));\r\n } catch {\r\n return raw;\r\n }\r\n }\r\n\r\n /** Convert any string to NSN (digits only). */\r\n private toNSN(v: string | null | undefined): string {\r\n return (v ?? '').replace(/\\D/g, '');\r\n }\r\n\r\n /** Generic: remove one trunk '0' after +<dial> or at national start, only if it makes a valid number */\r\n private stripTrunkZeroIfNeeded(raw: string, iso2: CountryCode): string {\r\n if (!raw) return raw;\r\n\r\n const dial = this.iti?.getSelectedCountryData?.().dialCode ?? '';\r\n const p0 = this.tel.parse(raw, iso2);\r\n if (p0.isValid) return raw;\r\n\r\n // Case 1: \"+<dial>0xxxx\" -> try \"+<dial>xxxx\"\r\n if (raw.startsWith('+') && dial && raw.startsWith(`+${dial}0`)) {\r\n const attempt = `+${dial}${raw.slice(dial.length + 2)}`;\r\n const p1 = this.tel.parse(attempt, iso2);\r\n if (p1.isValid) return attempt;\r\n }\r\n\r\n // Case 2: national \"0xxxx\" -> try \"xxxx\"\r\n if (!raw.startsWith('+') && raw.startsWith('0')) {\r\n const attemptNat = raw.slice(1);\r\n const p2 = this.tel.parse(attemptNat, iso2);\r\n if (p2.isValid) return attemptNat;\r\n }\r\n\r\n return raw;\r\n }\r\n\r\n currentRaw(): string { return (this.inputRef?.nativeElement.value ?? '').trim(); }\r\n\r\n private currentIso2(): CountryCode {\r\n const iso2 = (this.iti?.getSelectedCountryData?.().iso2 ?? this.initialCountry ?? 'US')\r\n .toString().toUpperCase();\r\n return iso2 as CountryCode;\r\n }\r\n\r\n private setInputValue(v: string) { this.inputRef.nativeElement.value = v ?? ''; }\r\n\r\n get showError(): boolean {\r\n const invalid = !!this.validate({} as AbstractControl);\r\n return this.showErrorWhenTouched ? (this.touched && invalid) : invalid;\r\n }\r\n\r\n private isCurrentlyValid(): boolean { return this.tel.isValid(this.currentRaw(), this.currentIso2()); }\r\n\r\n /** Make flag/dropdown non-interactive when disabled */\r\n private applyDisabledUi(disabled: boolean) {\r\n const input = this.inputRef?.nativeElement;\r\n if (!input) return;\r\n const flag = input.parentElement?.querySelector('.iti__selected-flag') as HTMLElement | null;\r\n if (flag) {\r\n flag.tabIndex = disabled ? -1 : 0;\r\n flag.setAttribute('aria-disabled', String(disabled));\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgxsmkTelInputService"],"mappings":"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"}
|
|
@@ -11,9 +11,10 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
11
11
|
initialCountry: CountryCode | 'auto';
|
|
12
12
|
preferredCountries: CountryCode[];
|
|
13
13
|
onlyCountries?: CountryCode[];
|
|
14
|
-
|
|
14
|
+
/** UI-only: flag/dial code. Input will ALWAYS show national digits only. */
|
|
15
15
|
separateDialCode: boolean;
|
|
16
16
|
allowDropdown: boolean;
|
|
17
|
+
/** UI “valid lock” while typing digits */
|
|
17
18
|
lockWhenValid: boolean;
|
|
18
19
|
placeholder?: string;
|
|
19
20
|
autocomplete: string;
|
|
@@ -41,6 +42,7 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
41
42
|
autoPlaceholder: 'off' | 'polite' | 'aggressive';
|
|
42
43
|
utilsScript?: string;
|
|
43
44
|
customPlaceholder?: (example: string, country: any) => string;
|
|
45
|
+
/** When to live-format while typing (NATIONAL visible only) */
|
|
44
46
|
formatWhenValid: 'off' | 'blur' | 'typing';
|
|
45
47
|
digitsOnly: boolean;
|
|
46
48
|
allowLeadingPlus: boolean;
|
|
@@ -60,10 +62,10 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
60
62
|
private lastEmittedValid;
|
|
61
63
|
private pendingWrite;
|
|
62
64
|
private touched;
|
|
63
|
-
readonly resolvedId: string;
|
|
64
|
-
private readonly platformId;
|
|
65
65
|
private allowDropdownWasTrue;
|
|
66
66
|
private suppressEvents;
|
|
67
|
+
readonly resolvedId: string;
|
|
68
|
+
private readonly platformId;
|
|
67
69
|
constructor(zone: NgZone, tel: NgxsmkTelInputService);
|
|
68
70
|
ngAfterViewInit(): void;
|
|
69
71
|
private initAndWire;
|
|
@@ -73,7 +75,6 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
73
75
|
registerOnChange(fn: any): void;
|
|
74
76
|
registerOnTouched(fn: any): void;
|
|
75
77
|
setDisabledState(isDisabled: boolean): void;
|
|
76
|
-
private applyDisabledUi;
|
|
77
78
|
validate(_: AbstractControl): ValidationErrors | null;
|
|
78
79
|
registerOnValidatorChange(fn: () => void): void;
|
|
79
80
|
focus(): void;
|
|
@@ -83,21 +84,24 @@ export declare class NgxsmkTelInputComponent implements AfterViewInit, OnChanges
|
|
|
83
84
|
private reinitPlugin;
|
|
84
85
|
private destroyPlugin;
|
|
85
86
|
private sanitizeDigits;
|
|
86
|
-
/** Remove a single trunk '0' when that makes the number valid.
|
|
87
|
-
* Works for: "+<cc>0..." and "0..." (national), but only if the stripped form parses valid.
|
|
88
|
-
*/
|
|
89
|
-
private stripTrunkZeroIfNeeded;
|
|
90
87
|
private bindDomListeners;
|
|
91
88
|
onBlur(): void;
|
|
92
89
|
onFocus(): void;
|
|
93
90
|
private handleInput;
|
|
91
|
+
/** NATIONAL-only formatter while typing, using region for rules */
|
|
94
92
|
private formatAsYouType;
|
|
93
|
+
/** Convert any string to NSN (digits only). */
|
|
94
|
+
private toNSN;
|
|
95
|
+
/** Generic: remove one trunk '0' after +<dial> or at national start, only if it makes a valid number */
|
|
96
|
+
private stripTrunkZeroIfNeeded;
|
|
95
97
|
currentRaw(): string;
|
|
96
98
|
private currentIso2;
|
|
97
99
|
private setInputValue;
|
|
98
100
|
get showError(): boolean;
|
|
99
101
|
private isCurrentlyValid;
|
|
102
|
+
/** Make flag/dropdown non-interactive when disabled */
|
|
103
|
+
private applyDisabledUi;
|
|
100
104
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkTelInputComponent, never>;
|
|
101
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkTelInputComponent, "ngxsmk-tel-input", never, { "initialCountry": { "alias": "initialCountry"; "required": false; }; "preferredCountries": { "alias": "preferredCountries"; "required": false; }; "onlyCountries": { "alias": "onlyCountries"; "required": false; }; "
|
|
105
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkTelInputComponent, "ngxsmk-tel-input", never, { "initialCountry": { "alias": "initialCountry"; "required": false; }; "preferredCountries": { "alias": "preferredCountries"; "required": false; }; "onlyCountries": { "alias": "onlyCountries"; "required": false; }; "separateDialCode": { "alias": "separateDialCode"; "required": false; }; "allowDropdown": { "alias": "allowDropdown"; "required": false; }; "lockWhenValid": { "alias": "lockWhenValid"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "name": { "alias": "name"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "label": { "alias": "label"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "errorText": { "alias": "errorText"; "required": false; }; "size": { "alias": "size"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "showClear": { "alias": "showClear"; "required": false; }; "autoFocus": { "alias": "autoFocus"; "required": false; }; "selectOnFocus": { "alias": "selectOnFocus"; "required": false; }; "formatOnBlur": { "alias": "formatOnBlur"; "required": false; }; "showErrorWhenTouched": { "alias": "showErrorWhenTouched"; "required": false; }; "dropdownAttachToBody": { "alias": "dropdownAttachToBody"; "required": false; }; "dropdownZIndex": { "alias": "dropdownZIndex"; "required": false; }; "i18n": { "alias": "i18n"; "required": false; }; "telI18n": { "alias": "telI18n"; "required": false; }; "localizedCountries": { "alias": "localizedCountries"; "required": false; }; "telLocalizedCountries": { "alias": "telLocalizedCountries"; "required": false; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; }; "dir": { "alias": "dir"; "required": false; }; "autoPlaceholder": { "alias": "autoPlaceholder"; "required": false; }; "utilsScript": { "alias": "utilsScript"; "required": false; }; "customPlaceholder": { "alias": "customPlaceholder"; "required": false; }; "formatWhenValid": { "alias": "formatWhenValid"; "required": false; }; "digitsOnly": { "alias": "digitsOnly"; "required": false; }; "allowLeadingPlus": { "alias": "allowLeadingPlus"; "required": false; }; }, { "countryChange": "countryChange"; "validityChange": "validityChange"; "inputChange": "inputChange"; }, never, never, true, never>;
|
|
102
106
|
}
|
|
103
107
|
//# sourceMappingURL=ngxsmk-tel-input.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-tel-input.component.d.ts","sourceRoot":"","sources":["../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,UAAU,EACV,YAAY,EAIZ,MAAM,EACN,SAAS,EACT,SAAS,EAGT,aAAa,EAEd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,oBAAoB,EAGpB,gBAAgB,EAChB,SAAS,EACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"ngxsmk-tel-input.component.d.ts","sourceRoot":"","sources":["../../../projects/ngxsmk-tel-input/src/lib/ngxsmk-tel-input.component.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED