@jvsoft/utils 1.0.0-alpha.5 → 1.0.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +5 -0
  2. package/directives/autocomplete-match-validator.directive.d.ts +10 -0
  3. package/directives/autocomplete.directive.d.ts +23 -0
  4. package/{src/pipes → directives}/index.d.ts +1 -1
  5. package/directives/public-api.d.ts +2 -0
  6. package/fesm2022/jvsoft-utils-directives.mjs +150 -0
  7. package/fesm2022/jvsoft-utils-directives.mjs.map +1 -0
  8. package/fesm2022/jvsoft-utils.mjs +270 -41
  9. package/fesm2022/jvsoft-utils.mjs.map +1 -1
  10. package/package.json +8 -16
  11. package/public-api.d.ts +5 -4
  12. package/src/functions/mat-form-controls/autocomplete.d.ts +21 -2
  13. package/src/pipes/display-with.pipe.d.ts +14 -0
  14. package/src/pipes/public-api.d.ts +1 -0
  15. package/fesm2022/jvsoft-utils-src-functions.mjs +0 -1707
  16. package/fesm2022/jvsoft-utils-src-functions.mjs.map +0 -1
  17. package/fesm2022/jvsoft-utils-src-interfaces.mjs +0 -6
  18. package/fesm2022/jvsoft-utils-src-interfaces.mjs.map +0 -1
  19. package/fesm2022/jvsoft-utils-src-pipes.mjs +0 -290
  20. package/fesm2022/jvsoft-utils-src-pipes.mjs.map +0 -1
  21. package/functions/base64.d.ts +0 -89
  22. package/functions/browser.d.ts +0 -1
  23. package/functions/crypto-js.d.ts +0 -2
  24. package/functions/date.d.ts +0 -3
  25. package/functions/dev-log.d.ts +0 -97
  26. package/functions/email.d.ts +0 -2
  27. package/functions/file.d.ts +0 -10
  28. package/functions/forms.d.ts +0 -23
  29. package/functions/http-client.d.ts +0 -2
  30. package/functions/index.d.ts +0 -1
  31. package/functions/local-storage.d.ts +0 -29
  32. package/functions/mat-form-controls/autocomplete.d.ts +0 -48
  33. package/functions/mat-form-controls/index.d.ts +0 -2
  34. package/functions/number.d.ts +0 -2
  35. package/functions/object-transformation.d.ts +0 -2
  36. package/functions/objects-arrays.d.ts +0 -63
  37. package/functions/public-api.d.ts +0 -17
  38. package/functions/string.d.ts +0 -23
  39. package/functions/sweetalert.d.ts +0 -5
  40. package/functions/utiles.d.ts +0 -1
  41. package/interfaces/datos.d.ts +0 -4
  42. package/interfaces/index.d.ts +0 -1
  43. package/interfaces/public-api.d.ts +0 -1
  44. package/pipes/data-en-lista.pipe.d.ts +0 -8
  45. package/pipes/date-diff-string.pipe.d.ts +0 -17
  46. package/pipes/filtro.pipe.d.ts +0 -18
  47. package/pipes/form-control-is-required.pipe.d.ts +0 -9
  48. package/pipes/index.d.ts +0 -1
  49. package/pipes/json-parse.pipe.d.ts +0 -7
  50. package/pipes/no-sanitize.pipe.d.ts +0 -10
  51. package/pipes/public-api.d.ts +0 -8
  52. package/pipes/tipo-valor-funcion.pipe.d.ts +0 -9
  53. package/pipes/zero-fill.pipe.d.ts +0 -8
  54. package/src/functions/index.d.ts +0 -5
  55. package/src/interfaces/index.d.ts +0 -5
  56. /package/{classes → src/classes}/data-model.d.ts +0 -0
package/README.md CHANGED
@@ -58,6 +58,11 @@ ng e2e
58
58
 
59
59
  Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
60
60
 
61
+ ## Documentación
62
+
63
+ - [Directiva JvAutocomplete](./docs/autocomplete.md): Guía detallada de uso, ejemplos y referencia de la API.
64
+ - [Utilidades de Logging](./docs/logging.md): Guía para el uso de logs en desarrollo.
65
+
61
66
  ## Additional Resources
62
67
 
63
68
  For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,10 @@
1
+ import { AbstractControl, ValidationErrors, Validator } from '@angular/forms';
2
+ import * as i0 from "@angular/core";
3
+ export declare class AutocompleteMatchValidatorDirective implements Validator {
4
+ opciones: import("@angular/core").InputSignal<any[]>;
5
+ formControlName: import("@angular/core").InputSignal<any>;
6
+ idLista: import("@angular/core").InputSignal<string | undefined>;
7
+ validate(control: AbstractControl): ValidationErrors | null;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<AutocompleteMatchValidatorDirective, never>;
9
+ static ɵdir: i0.ɵɵDirectiveDeclaration<AutocompleteMatchValidatorDirective, "[jvsAutocompleteMatch]", never, { "opciones": { "alias": "jvsAutocompleteMatch"; "required": false; "isSignal": true; }; "formControlName": { "alias": "formControlName"; "required": false; "isSignal": true; }; "idLista": { "alias": "idLista"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
10
+ }
@@ -0,0 +1,23 @@
1
+ import { OnInit } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class JvsAutocompleteDirective implements OnInit {
4
+ private readonly destroyRef;
5
+ private readonly ngControl;
6
+ private readonly focus$;
7
+ data: import("@angular/core").InputSignal<any[] | null>;
8
+ fields: import("@angular/core").InputSignal<string | string[]>;
9
+ typeReq: import("@angular/core").InputSignal<string>;
10
+ queryService: import("@angular/core").InputSignal<any>;
11
+ minLength: import("@angular/core").InputSignal<number>;
12
+ dataExtra: import("@angular/core").InputSignal<any>;
13
+ anonimo: import("@angular/core").InputSignal<boolean>;
14
+ debounce: import("@angular/core").InputSignal<number>;
15
+ filtered: import("@angular/core").OutputEmitterRef<any[]>;
16
+ loading: import("@angular/core").OutputEmitterRef<boolean>;
17
+ onFocus(): void;
18
+ ngOnInit(): void;
19
+ private filterLocal;
20
+ private fetchApi;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<JvsAutocompleteDirective, never>;
22
+ static ɵdir: i0.ɵɵDirectiveDeclaration<JvsAutocompleteDirective, "[jvsAutocomplete]", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "fields": { "alias": "fields"; "required": false; "isSignal": true; }; "typeReq": { "alias": "typeReq"; "required": false; "isSignal": true; }; "queryService": { "alias": "queryService"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "dataExtra": { "alias": "dataExtra"; "required": false; "isSignal": true; }; "anonimo": { "alias": "anonimo"; "required": false; "isSignal": true; }; "debounce": { "alias": "debounce"; "required": false; "isSignal": true; }; }, { "filtered": "filtered"; "loading": "loading"; }, never, never, true, never>;
23
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
- /// <amd-module name="@jvsoft/utils/src/pipes" />
4
+ /// <amd-module name="@jvsoft/utils/directives" />
5
5
  export * from './public-api';
@@ -0,0 +1,2 @@
1
+ export * from './autocomplete-match-validator.directive';
2
+ export * from './autocomplete.directive';
@@ -0,0 +1,150 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, forwardRef, Directive, inject, DestroyRef, output, HostListener } from '@angular/core';
3
+ import { NG_VALIDATORS, NgControl } from '@angular/forms';
4
+ import { Subject, merge, debounceTime, startWith, distinctUntilChanged, tap, switchMap, of, map, finalize } from 'rxjs';
5
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
+
7
+ class AutocompleteMatchValidatorDirective {
8
+ opciones = input([], { alias: 'jvsAutocompleteMatch' });
9
+ formControlName = input();
10
+ idLista = input();
11
+ validate(control) {
12
+ const idLista = this.idLista() ?? this.formControlName();
13
+ const value = control.value;
14
+ const opciones = this.opciones();
15
+ if (!value)
16
+ return null;
17
+ if (!opciones) {
18
+ console.error('Debe definir opciones para el validador jvsAutocompleteMatch');
19
+ return { itemSelected: true };
20
+ }
21
+ const encontrado = opciones.some(item => typeof value === 'object'
22
+ ? item[idLista] === value[idLista]
23
+ : item[idLista] === value);
24
+ return encontrado ? null : { itemSelected: true };
25
+ }
26
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AutocompleteMatchValidatorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
27
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.14", type: AutocompleteMatchValidatorDirective, isStandalone: true, selector: "[jvsAutocompleteMatch]", inputs: { opciones: { classPropertyName: "opciones", publicName: "jvsAutocompleteMatch", isSignal: true, isRequired: false, transformFunction: null }, formControlName: { classPropertyName: "formControlName", publicName: "formControlName", isSignal: true, isRequired: false, transformFunction: null }, idLista: { classPropertyName: "idLista", publicName: "idLista", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
28
+ {
29
+ provide: NG_VALIDATORS,
30
+ useExisting: forwardRef(() => AutocompleteMatchValidatorDirective),
31
+ multi: true,
32
+ },
33
+ ], ngImport: i0 });
34
+ }
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AutocompleteMatchValidatorDirective, decorators: [{
36
+ type: Directive,
37
+ args: [{
38
+ selector: '[jvsAutocompleteMatch]',
39
+ providers: [
40
+ {
41
+ provide: NG_VALIDATORS,
42
+ useExisting: forwardRef(() => AutocompleteMatchValidatorDirective),
43
+ multi: true,
44
+ },
45
+ ],
46
+ standalone: true
47
+ }]
48
+ }] });
49
+
50
+ class JvsAutocompleteDirective {
51
+ destroyRef = inject(DestroyRef);
52
+ ngControl = inject(NgControl, { optional: true });
53
+ focus$ = new Subject();
54
+ // Signal-based Inputs
55
+ data = input(null);
56
+ fields = input('');
57
+ typeReq = input('');
58
+ queryService = input(null);
59
+ minLength = input(3);
60
+ dataExtra = input({});
61
+ anonimo = input(false);
62
+ debounce = input(300);
63
+ // Modern Outputs
64
+ filtered = output();
65
+ loading = output();
66
+ onFocus() {
67
+ this.focus$.next();
68
+ }
69
+ ngOnInit() {
70
+ const control = this.ngControl;
71
+ if (!control || !control.valueChanges) {
72
+ console.warn('JvsAutocompleteDirective: No se encontró ngControl o valueChanges. Asegúrate de que el input tenga un formControl o formControlName.');
73
+ return;
74
+ }
75
+ // Si es data local, bajamos el debounce por defecto a 0 si no se ha especificado
76
+ const isLocal = this.data() && !this.typeReq();
77
+ const actualDebounce = (isLocal && this.debounce() === 300) ? 0 : this.debounce();
78
+ merge(control.valueChanges.pipe(debounceTime(actualDebounce)), this.focus$).pipe(takeUntilDestroyed(this.destroyRef), startWith(control.value), distinctUntilChanged(), tap(() => {
79
+ if (this.typeReq())
80
+ this.loading.emit(true);
81
+ }), switchMap(() => {
82
+ const value = control.value;
83
+ // Si el valor es un objeto (proviene de seleccionar una opción), no volvemos a filtrar
84
+ if (typeof value === 'object' && value !== null) {
85
+ if (this.typeReq())
86
+ this.loading.emit(false);
87
+ return of(null);
88
+ }
89
+ if (this.typeReq() && this.queryService()) {
90
+ return this.fetchApi(value?.toString() || '');
91
+ }
92
+ else if (this.data()) {
93
+ const res = this.filterLocal(value?.toString() || '');
94
+ return of(res);
95
+ }
96
+ if (this.typeReq())
97
+ this.loading.emit(false);
98
+ return of([]);
99
+ })).subscribe((result) => {
100
+ if (result !== null) {
101
+ this.filtered.emit(result);
102
+ }
103
+ });
104
+ }
105
+ filterLocal(value) {
106
+ const data = this.data();
107
+ if (!value)
108
+ return data || [];
109
+ const search = value.toLowerCase();
110
+ const rawFields = this.fields();
111
+ const fields = Array.isArray(rawFields) ? rawFields : [rawFields];
112
+ return (data || []).filter(item => {
113
+ return fields.some(field => {
114
+ const val = item[field];
115
+ return val && val.toString().toLowerCase().includes(search);
116
+ });
117
+ });
118
+ }
119
+ fetchApi(value) {
120
+ const typeReq = this.typeReq();
121
+ const queryService = this.queryService();
122
+ if (!value || value.length < this.minLength()) {
123
+ this.loading.emit(false);
124
+ return of([]);
125
+ }
126
+ return queryService.getDataMethod('GET', typeReq, {
127
+ ...this.dataExtra(),
128
+ txtBuscar: value
129
+ }, this.anonimo()).pipe(map((res) => res[typeReq] ?? []), finalize(() => this.loading.emit(false)));
130
+ }
131
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JvsAutocompleteDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
132
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.14", type: JvsAutocompleteDirective, isStandalone: true, selector: "[jvsAutocomplete]", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, fields: { classPropertyName: "fields", publicName: "fields", isSignal: true, isRequired: false, transformFunction: null }, typeReq: { classPropertyName: "typeReq", publicName: "typeReq", isSignal: true, isRequired: false, transformFunction: null }, queryService: { classPropertyName: "queryService", publicName: "queryService", isSignal: true, isRequired: false, transformFunction: null }, minLength: { classPropertyName: "minLength", publicName: "minLength", isSignal: true, isRequired: false, transformFunction: null }, dataExtra: { classPropertyName: "dataExtra", publicName: "dataExtra", isSignal: true, isRequired: false, transformFunction: null }, anonimo: { classPropertyName: "anonimo", publicName: "anonimo", isSignal: true, isRequired: false, transformFunction: null }, debounce: { classPropertyName: "debounce", publicName: "debounce", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filtered: "filtered", loading: "loading" }, host: { listeners: { "focus": "onFocus()" } }, ngImport: i0 });
133
+ }
134
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JvsAutocompleteDirective, decorators: [{
135
+ type: Directive,
136
+ args: [{
137
+ selector: '[jvsAutocomplete]',
138
+ standalone: true
139
+ }]
140
+ }], propDecorators: { onFocus: [{
141
+ type: HostListener,
142
+ args: ['focus']
143
+ }] } });
144
+
145
+ /**
146
+ * Generated bundle index. Do not edit.
147
+ */
148
+
149
+ export { AutocompleteMatchValidatorDirective, JvsAutocompleteDirective };
150
+ //# sourceMappingURL=jvsoft-utils-directives.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jvsoft-utils-directives.mjs","sources":["../../../projects/utils/directives/autocomplete-match-validator.directive.ts","../../../projects/utils/directives/autocomplete.directive.ts","../../../projects/utils/directives/jvsoft-utils-directives.ts"],"sourcesContent":["import { Directive, forwardRef, input } from '@angular/core';\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\n\n@Directive({\n selector: '[jvsAutocompleteMatch]',\n providers: [\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => AutocompleteMatchValidatorDirective),\n multi: true,\n },\n ],\n standalone: true\n})\nexport class AutocompleteMatchValidatorDirective implements Validator {\n opciones = input<any[]>([], { alias: 'jvsAutocompleteMatch' });\n formControlName = input<any>();\n idLista = input<string>();\n\n validate(control: AbstractControl): ValidationErrors | null {\n const idLista = this.idLista() ?? this.formControlName();\n const value = control.value;\n const opciones = this.opciones();\n\n if (!value) return null;\n\n if (!opciones) {\n console.error('Debe definir opciones para el validador jvsAutocompleteMatch');\n return { itemSelected: true };\n }\n\n const encontrado = opciones.some(item =>\n typeof value === 'object'\n ? item[idLista] === value[idLista]\n : item[idLista] === value\n );\n\n return encontrado ? null : { itemSelected: true };\n }\n}\n","import { Directive, ElementRef, EventEmitter, inject, OnInit, DestroyRef, HostListener, input, output } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { debounceTime, distinctUntilChanged, isObservable, of, switchMap, takeUntil, tap, finalize, map, Observable, startWith, merge, Subject } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Directive({\n selector: '[jvsAutocomplete]',\n standalone: true\n})\nexport class JvsAutocompleteDirective implements OnInit {\n private readonly destroyRef = inject(DestroyRef);\n private readonly ngControl = inject(NgControl, { optional: true });\n private readonly focus$ = new Subject<void>();\n \n // Signal-based Inputs\n data = input<any[] | null>(null);\n fields = input<string | string[]>('');\n typeReq = input<string>('');\n queryService = input<any>(null);\n minLength = input<number>(3);\n dataExtra = input<any>({});\n anonimo = input<boolean>(false);\n debounce = input<number>(300);\n \n // Modern Outputs\n filtered = output<any[]>();\n loading = output<boolean>();\n\n @HostListener('focus')\n onFocus() {\n this.focus$.next();\n }\n\n ngOnInit(): void {\n const control = this.ngControl;\n if (!control || !control.valueChanges) {\n console.warn('JvsAutocompleteDirective: No se encontró ngControl o valueChanges. Asegúrate de que el input tenga un formControl o formControlName.');\n return;\n }\n\n // Si es data local, bajamos el debounce por defecto a 0 si no se ha especificado\n const isLocal = this.data() && !this.typeReq();\n const actualDebounce = (isLocal && this.debounce() === 300) ? 0 : this.debounce();\n\n merge(\n control.valueChanges.pipe(debounceTime(actualDebounce)),\n this.focus$\n ).pipe(\n takeUntilDestroyed(this.destroyRef),\n startWith(control.value),\n distinctUntilChanged(),\n tap(() => {\n if (this.typeReq()) this.loading.emit(true);\n }),\n switchMap((): Observable<any[] | null> => {\n const value = control.value;\n // Si el valor es un objeto (proviene de seleccionar una opción), no volvemos a filtrar\n if (typeof value === 'object' && value !== null) {\n if (this.typeReq()) this.loading.emit(false);\n return of(null);\n }\n\n if (this.typeReq() && this.queryService()) {\n return this.fetchApi(value?.toString() || '');\n } else if (this.data()) {\n const res = this.filterLocal(value?.toString() || '');\n return of(res);\n }\n \n if (this.typeReq()) this.loading.emit(false);\n return of([]);\n })\n ).subscribe((result) => {\n if (result !== null) {\n this.filtered.emit(result);\n }\n });\n }\n\n private filterLocal(value: string): any[] {\n const data = this.data();\n if (!value) return data || [];\n \n const search = value.toLowerCase();\n const rawFields = this.fields();\n const fields = Array.isArray(rawFields) ? rawFields : [rawFields];\n\n return (data || []).filter(item => {\n return fields.some(field => {\n const val = item[field];\n return val && val.toString().toLowerCase().includes(search);\n });\n });\n }\n\n private fetchApi(value: string): Observable<any[]> {\n const typeReq = this.typeReq();\n const queryService = this.queryService();\n\n if (!value || value.length < this.minLength()) {\n this.loading.emit(false);\n return of([]);\n }\n\n return queryService.getDataMethod('GET', typeReq, {\n ...this.dataExtra(),\n txtBuscar: value\n }, this.anonimo()).pipe(\n map((res: any) => res[typeReq] ?? []),\n finalize(() => this.loading.emit(false))\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}