@unifylib/ui-lib 1.2.3 → 1.2.4

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.
@@ -0,0 +1,73 @@
1
+ import { Directive, HostListener, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class PhoneNumberOnlyDirective {
4
+ constructor() {
5
+ this.phoneNumberOnly = false;
6
+ }
7
+ onKeyDown(event) {
8
+ if (!this.phoneNumberOnly)
9
+ return;
10
+ const key = event.key;
11
+ const input = event.target;
12
+ const cursor = input.selectionStart ?? 0;
13
+ const value = input.value;
14
+ // Allow control keys
15
+ if (event.ctrlKey || event.metaKey || event.altKey ||
16
+ ['Backspace', 'Tab', 'ArrowLeft', 'ArrowRight', 'Delete', 'Home', 'End', 'Enter'].includes(key)) {
17
+ return;
18
+ }
19
+ // Allow '+' only at the first position
20
+ if (key === '+') {
21
+ if (cursor !== 0 || value.includes('+')) {
22
+ event.preventDefault();
23
+ }
24
+ return;
25
+ }
26
+ // Allow only digits
27
+ if (key >= '0' && key <= '9') {
28
+ // Check for max length 15 (if not already handled by maxLength attribute)
29
+ // Note: We should account for the selected text being replaced
30
+ const selectedText = value.substring(cursor, input.selectionEnd ?? cursor);
31
+ if (value.length - selectedText.length >= 15) {
32
+ event.preventDefault();
33
+ }
34
+ return;
35
+ }
36
+ // Block everything else
37
+ event.preventDefault();
38
+ }
39
+ onPaste(event) {
40
+ if (!this.phoneNumberOnly)
41
+ return;
42
+ const pastedData = event.clipboardData?.getData('text') ?? '';
43
+ const input = event.target;
44
+ const value = input.value;
45
+ const cursor = input.selectionStart ?? 0;
46
+ const selectedText = value.substring(cursor, input.selectionEnd ?? cursor);
47
+ // Construct what the new value would be
48
+ const newValue = value.slice(0, cursor) + pastedData + value.slice(input.selectionEnd ?? cursor);
49
+ // Regex: starts with optional +, followed by only digits, max 15 characters total
50
+ const regex = /^\+?\d{0,15}$/;
51
+ if (!regex.test(newValue)) {
52
+ event.preventDefault();
53
+ }
54
+ }
55
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PhoneNumberOnlyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
56
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: PhoneNumberOnlyDirective, isStandalone: true, selector: "[phoneNumberOnly]", inputs: { phoneNumberOnly: "phoneNumberOnly" }, host: { listeners: { "keydown": "onKeyDown($event)", "paste": "onPaste($event)" } }, ngImport: i0 }); }
57
+ }
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PhoneNumberOnlyDirective, decorators: [{
59
+ type: Directive,
60
+ args: [{
61
+ selector: '[phoneNumberOnly]',
62
+ standalone: true
63
+ }]
64
+ }], propDecorators: { phoneNumberOnly: [{
65
+ type: Input
66
+ }], onKeyDown: [{
67
+ type: HostListener,
68
+ args: ['keydown', ['$event']]
69
+ }], onPaste: [{
70
+ type: HostListener,
71
+ args: ['paste', ['$event']]
72
+ }] } });
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtbnVtYmVyLW9ubHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52b2ljZXEvdWktbGliL3NyYy9saWIvZGlyZWN0aXZlcy9waG9uZS1udW1iZXItb25seS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU0vRCxNQUFNLE9BQU8sd0JBQXdCO0lBSnJDO1FBS1csb0JBQWUsR0FBRyxLQUFLLENBQUM7S0E0RGxDO0lBekRDLFNBQVMsQ0FBQyxLQUFvQjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPO1FBRWxDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDdEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQTBCLENBQUM7UUFDL0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUUxQixxQkFBcUI7UUFDckIsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU07WUFDOUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEcsT0FBTztRQUNULENBQUM7UUFFRCx1Q0FBdUM7UUFDdkMsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDaEIsSUFBSSxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELG9CQUFvQjtRQUNwQixJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQzdCLDBFQUEwRTtZQUMxRSwrREFBK0Q7WUFDL0QsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsQ0FBQztZQUMzRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDN0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELHdCQUF3QjtRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUdELE9BQU8sQ0FBQyxLQUFxQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPO1FBRWxDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5RCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUMvQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLENBQUM7UUFFM0Usd0NBQXdDO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLENBQUM7UUFFakcsa0ZBQWtGO1FBQ2xGLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQztRQUU5QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQzsrR0E1RFUsd0JBQXdCO21HQUF4Qix3QkFBd0I7OzRGQUF4Qix3QkFBd0I7a0JBSnBDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQUVVLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR04sU0FBUztzQkFEUixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF1Q25DLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW3Bob25lTnVtYmVyT25seV0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIFBob25lTnVtYmVyT25seURpcmVjdGl2ZSB7XHJcbiAgQElucHV0KCkgcGhvbmVOdW1iZXJPbmx5ID0gZmFsc2U7XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLnBob25lTnVtYmVyT25seSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjdXJzb3IgPSBpbnB1dC5zZWxlY3Rpb25TdGFydCA/PyAwO1xyXG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWx1ZTtcclxuXHJcbiAgICAvLyBBbGxvdyBjb250cm9sIGtleXNcclxuICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5IHx8XHJcbiAgICAgICAgWydCYWNrc3BhY2UnLCAnVGFiJywgJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0JywgJ0RlbGV0ZScsICdIb21lJywgJ0VuZCcsICdFbnRlciddLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFsbG93ICcrJyBvbmx5IGF0IHRoZSBmaXJzdCBwb3NpdGlvblxyXG4gICAgaWYgKGtleSA9PT0gJysnKSB7XHJcbiAgICAgIGlmIChjdXJzb3IgIT09IDAgfHwgdmFsdWUuaW5jbHVkZXMoJysnKSkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFsbG93IG9ubHkgZGlnaXRzXHJcbiAgICBpZiAoa2V5ID49ICcwJyAmJiBrZXkgPD0gJzknKSB7XHJcbiAgICAgIC8vIENoZWNrIGZvciBtYXggbGVuZ3RoIDE1IChpZiBub3QgYWxyZWFkeSBoYW5kbGVkIGJ5IG1heExlbmd0aCBhdHRyaWJ1dGUpXHJcbiAgICAgIC8vIE5vdGU6IFdlIHNob3VsZCBhY2NvdW50IGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBiZWluZyByZXBsYWNlZFxyXG4gICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSB2YWx1ZS5zdWJzdHJpbmcoY3Vyc29yLCBpbnB1dC5zZWxlY3Rpb25FbmQgPz8gY3Vyc29yKTtcclxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCAtIHNlbGVjdGVkVGV4dC5sZW5ndGggPj0gMTUpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCbG9jayBldmVyeXRoaW5nIGVsc2VcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pXHJcbiAgb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5waG9uZU51bWJlck9ubHkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBwYXN0ZWREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpID8/ICcnO1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IHZhbHVlID0gaW5wdXQudmFsdWU7XHJcbiAgICBjb25zdCBjdXJzb3IgPSBpbnB1dC5zZWxlY3Rpb25TdGFydCA/PyAwO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gdmFsdWUuc3Vic3RyaW5nKGN1cnNvciwgaW5wdXQuc2VsZWN0aW9uRW5kID8/IGN1cnNvcik7XHJcblxyXG4gICAgLy8gQ29uc3RydWN0IHdoYXQgdGhlIG5ldyB2YWx1ZSB3b3VsZCBiZVxyXG4gICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBjdXJzb3IpICsgcGFzdGVkRGF0YSArIHZhbHVlLnNsaWNlKGlucHV0LnNlbGVjdGlvbkVuZCA/PyBjdXJzb3IpO1xyXG5cclxuICAgIC8vIFJlZ2V4OiBzdGFydHMgd2l0aCBvcHRpb25hbCArLCBmb2xsb3dlZCBieSBvbmx5IGRpZ2l0cywgbWF4IDE1IGNoYXJhY3RlcnMgdG90YWxcclxuICAgIGNvbnN0IHJlZ2V4ID0gL15cXCs/XFxkezAsMTV9JC87XHJcblxyXG4gICAgaWYgKCFyZWdleC50ZXN0KG5ld1ZhbHVlKSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=