chaqui-catalog-frontend-lib 1.1.29 → 1.1.30

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.
@@ -110,6 +110,10 @@ class CatalogItemsSelectComponent {
110
110
  * ID del item actualmente seleccionado (opcional)
111
111
  */
112
112
  selectedItemId;
113
+ /**
114
+ * Indica si el componente debe mostrarse en modo solo lectura
115
+ */
116
+ readOnly = false;
113
117
  /**
114
118
  * Label del input del catálogo
115
119
  */
@@ -129,18 +133,26 @@ class CatalogItemsSelectComponent {
129
133
  items = [];
130
134
  isLoading = false;
131
135
  errorMessage = "";
136
+ selectedItemDisplayName = "";
132
137
  destroy$ = new Subject();
133
138
  constructor(catalogService) {
134
139
  this.catalogService = catalogService;
135
140
  }
136
141
  ngOnChanges(changes) {
137
- if (changes["catalogId"] && !changes["catalogId"].firstChange) {
138
- this.loadItems();
139
- }
140
- else if (changes["catalogId"] && changes["catalogId"].firstChange) {
142
+ const catalogIdChanged = !!changes["catalogId"];
143
+ const selectedItemIdChanged = !!changes["selectedItemId"];
144
+ if (catalogIdChanged) {
141
145
  if (this.catalogId) {
142
146
  this.loadItems();
143
147
  }
148
+ else {
149
+ this.items = [];
150
+ this.selectedItemDisplayName = "";
151
+ }
152
+ return;
153
+ }
154
+ if (selectedItemIdChanged) {
155
+ this.updateSelectedItemDisplayName();
144
156
  }
145
157
  }
146
158
  ngOnDestroy() {
@@ -166,6 +178,7 @@ class CatalogItemsSelectComponent {
166
178
  next: (items) => {
167
179
  this.items = items;
168
180
  this.isLoading = false;
181
+ this.updateSelectedItemDisplayName();
169
182
  },
170
183
  error: (err) => {
171
184
  this.isLoading = false;
@@ -195,9 +208,21 @@ class CatalogItemsSelectComponent {
195
208
  const itemId = Number(event.target.value);
196
209
  const selectedItem = this.items.find((item) => item.id === itemId);
197
210
  if (selectedItem) {
211
+ this.selectedItemId = selectedItem.id;
212
+ this.updateSelectedItemDisplayName();
198
213
  this.itemSelected.emit(selectedItem);
199
214
  }
200
215
  }
216
+ updateSelectedItemDisplayName() {
217
+ if (!this.selectedItemId) {
218
+ this.selectedItemDisplayName = "";
219
+ return;
220
+ }
221
+ const selectedItem = this.items.find((item) => item.id === this.selectedItemId);
222
+ this.selectedItemDisplayName = selectedItem
223
+ ? this.getItemDisplayName(selectedItem)
224
+ : this.itemSelectPlaceholder;
225
+ }
201
226
  /**
202
227
  * Obtiene el valor del item para mostrar en el select
203
228
  * @param item Item del catálogo
@@ -207,15 +232,17 @@ class CatalogItemsSelectComponent {
207
232
  return item.value || `Item ${item.id}`;
208
233
  }
209
234
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: CatalogItemsSelectComponent, deps: [{ token: CatalogService }], target: i0.ɵɵFactoryTarget.Component });
210
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.19", type: CatalogItemsSelectComponent, isStandalone: true, selector: "catalog-items-select", inputs: { catalogId: "catalogId", selectedItemId: "selectedItemId", catalogLabel: "catalogLabel", itemSelectPlaceholder: "itemSelectPlaceholder" }, outputs: { itemSelected: "itemSelected", error: "error" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"catalog-items-select-container\">\n\n <div class=\"form-group\">\n <label for=\"itemSelect\" class=\"form-label\">{{catalogLabel}}</label>\n \n <div *ngIf=\"isLoading\" class=\"loading\">\n Cargando items...\n </div>\n\n <div *ngIf=\"errorMessage && !isLoading\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n\n <select\n *ngIf=\"!isLoading && items.length > 0\"\n id=\"itemSelect\"\n class=\"form-select\"\n [value]=\"selectedItemId || ''\"\n (change)=\"onItemSelected($event)\"\n >\n <option value=\"\">{{ itemSelectPlaceholder }}</option>\n <option *ngFor=\"let item of items\" [value]=\"item.id\">\n {{ getItemDisplayName(item) }}\n </option>\n </select>\n\n <div *ngIf=\"!isLoading && items.length === 0 && !errorMessage\" class=\"no-items\">\n No hay items disponibles\n </div>\n </div>\n</div>\n", styles: [".catalog-items-select-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.form-group{margin-bottom:1.5rem;display:flex;flex-direction:column}.form-label{margin-bottom:.5rem;font-weight:500;color:#333;font-size:.95rem}.form-input,.form-select{padding:.75rem;border:1px solid #ddd;border-radius:4px;font-size:1rem;font-family:inherit;transition:border-color .2s,box-shadow .2s}.form-input:focus,.form-select:focus{outline:none;border-color:#06c;box-shadow:0 0 0 3px #0066cc1a}.form-input:disabled,.form-select:disabled{background-color:#f5f5f5;color:#999;cursor:not-allowed}.loading{color:#666;font-style:italic;padding:.75rem;text-align:center;background-color:#f0f0f0;border-radius:4px}.error-message{color:#d32f2f;background-color:#ffebee;padding:.75rem;border-radius:4px;border-left:4px solid #d32f2f;font-size:.9rem}.no-items{color:#666;padding:.75rem;text-align:center;background-color:#f5f5f5;border-radius:4px;font-style:italic}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
235
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.19", type: CatalogItemsSelectComponent, isStandalone: true, selector: "catalog-items-select", inputs: { catalogId: "catalogId", selectedItemId: "selectedItemId", readOnly: "readOnly", catalogLabel: "catalogLabel", itemSelectPlaceholder: "itemSelectPlaceholder" }, outputs: { itemSelected: "itemSelected", error: "error" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"catalog-items-select-container\">\n\n <div class=\"form-group\">\n <label for=\"itemSelect\" class=\"form-label\">{{catalogLabel}}</label>\n \n <div *ngIf=\"isLoading\" class=\"loading\">\n Cargando items...\n </div>\n\n <div *ngIf=\"errorMessage && !isLoading\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n\n <div *ngIf=\"!isLoading && readOnly\" class=\"form-input readonly-value\">\n {{ selectedItemDisplayName || itemSelectPlaceholder }}\n </div>\n\n <select\n *ngIf=\"!isLoading && !readOnly && items.length > 0\"\n id=\"itemSelect\"\n class=\"form-select\"\n [value]=\"selectedItemId || ''\"\n (change)=\"onItemSelected($event)\"\n >\n <option value=\"\">{{ itemSelectPlaceholder }}</option>\n <option *ngFor=\"let item of items\" [value]=\"item.id\">\n {{ getItemDisplayName(item) }}\n </option>\n </select>\n\n <div *ngIf=\"!isLoading && !readOnly && items.length === 0 && !errorMessage\" class=\"no-items\">\n No hay items disponibles\n </div>\n </div>\n</div>\n", styles: [".catalog-items-select-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.form-group{margin-bottom:1.5rem;display:flex;flex-direction:column}.form-label{margin-bottom:.5rem;font-weight:500;color:#333;font-size:.95rem}.form-input,.form-select{padding:.75rem;border:1px solid #ddd;border-radius:4px;font-size:1rem;font-family:inherit;transition:border-color .2s,box-shadow .2s}.form-input:focus,.form-select:focus{outline:none;border-color:#06c;box-shadow:0 0 0 3px #0066cc1a}.form-input:disabled,.form-select:disabled{background-color:#f5f5f5;color:#999;cursor:not-allowed}.readonly-value{background-color:#f5f5f5;color:#666}.loading{color:#666;font-style:italic;padding:.75rem;text-align:center;background-color:#f0f0f0;border-radius:4px}.error-message{color:#d32f2f;background-color:#ffebee;padding:.75rem;border-radius:4px;border-left:4px solid #d32f2f;font-size:.9rem}.no-items{color:#666;padding:.75rem;text-align:center;background-color:#f5f5f5;border-radius:4px;font-style:italic}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
211
236
  }
212
237
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: CatalogItemsSelectComponent, decorators: [{
213
238
  type: Component,
214
- args: [{ selector: "catalog-items-select", standalone: true, imports: [CommonModule], template: "<div class=\"catalog-items-select-container\">\n\n <div class=\"form-group\">\n <label for=\"itemSelect\" class=\"form-label\">{{catalogLabel}}</label>\n \n <div *ngIf=\"isLoading\" class=\"loading\">\n Cargando items...\n </div>\n\n <div *ngIf=\"errorMessage && !isLoading\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n\n <select\n *ngIf=\"!isLoading && items.length > 0\"\n id=\"itemSelect\"\n class=\"form-select\"\n [value]=\"selectedItemId || ''\"\n (change)=\"onItemSelected($event)\"\n >\n <option value=\"\">{{ itemSelectPlaceholder }}</option>\n <option *ngFor=\"let item of items\" [value]=\"item.id\">\n {{ getItemDisplayName(item) }}\n </option>\n </select>\n\n <div *ngIf=\"!isLoading && items.length === 0 && !errorMessage\" class=\"no-items\">\n No hay items disponibles\n </div>\n </div>\n</div>\n", styles: [".catalog-items-select-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.form-group{margin-bottom:1.5rem;display:flex;flex-direction:column}.form-label{margin-bottom:.5rem;font-weight:500;color:#333;font-size:.95rem}.form-input,.form-select{padding:.75rem;border:1px solid #ddd;border-radius:4px;font-size:1rem;font-family:inherit;transition:border-color .2s,box-shadow .2s}.form-input:focus,.form-select:focus{outline:none;border-color:#06c;box-shadow:0 0 0 3px #0066cc1a}.form-input:disabled,.form-select:disabled{background-color:#f5f5f5;color:#999;cursor:not-allowed}.loading{color:#666;font-style:italic;padding:.75rem;text-align:center;background-color:#f0f0f0;border-radius:4px}.error-message{color:#d32f2f;background-color:#ffebee;padding:.75rem;border-radius:4px;border-left:4px solid #d32f2f;font-size:.9rem}.no-items{color:#666;padding:.75rem;text-align:center;background-color:#f5f5f5;border-radius:4px;font-style:italic}\n"] }]
239
+ args: [{ selector: "catalog-items-select", standalone: true, imports: [CommonModule], template: "<div class=\"catalog-items-select-container\">\n\n <div class=\"form-group\">\n <label for=\"itemSelect\" class=\"form-label\">{{catalogLabel}}</label>\n \n <div *ngIf=\"isLoading\" class=\"loading\">\n Cargando items...\n </div>\n\n <div *ngIf=\"errorMessage && !isLoading\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n\n <div *ngIf=\"!isLoading && readOnly\" class=\"form-input readonly-value\">\n {{ selectedItemDisplayName || itemSelectPlaceholder }}\n </div>\n\n <select\n *ngIf=\"!isLoading && !readOnly && items.length > 0\"\n id=\"itemSelect\"\n class=\"form-select\"\n [value]=\"selectedItemId || ''\"\n (change)=\"onItemSelected($event)\"\n >\n <option value=\"\">{{ itemSelectPlaceholder }}</option>\n <option *ngFor=\"let item of items\" [value]=\"item.id\">\n {{ getItemDisplayName(item) }}\n </option>\n </select>\n\n <div *ngIf=\"!isLoading && !readOnly && items.length === 0 && !errorMessage\" class=\"no-items\">\n No hay items disponibles\n </div>\n </div>\n</div>\n", styles: [".catalog-items-select-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.form-group{margin-bottom:1.5rem;display:flex;flex-direction:column}.form-label{margin-bottom:.5rem;font-weight:500;color:#333;font-size:.95rem}.form-input,.form-select{padding:.75rem;border:1px solid #ddd;border-radius:4px;font-size:1rem;font-family:inherit;transition:border-color .2s,box-shadow .2s}.form-input:focus,.form-select:focus{outline:none;border-color:#06c;box-shadow:0 0 0 3px #0066cc1a}.form-input:disabled,.form-select:disabled{background-color:#f5f5f5;color:#999;cursor:not-allowed}.readonly-value{background-color:#f5f5f5;color:#666}.loading{color:#666;font-style:italic;padding:.75rem;text-align:center;background-color:#f0f0f0;border-radius:4px}.error-message{color:#d32f2f;background-color:#ffebee;padding:.75rem;border-radius:4px;border-left:4px solid #d32f2f;font-size:.9rem}.no-items{color:#666;padding:.75rem;text-align:center;background-color:#f5f5f5;border-radius:4px;font-style:italic}\n"] }]
215
240
  }], ctorParameters: () => [{ type: CatalogService }], propDecorators: { catalogId: [{
216
241
  type: Input
217
242
  }], selectedItemId: [{
218
243
  type: Input
244
+ }], readOnly: [{
245
+ type: Input
219
246
  }], catalogLabel: [{
220
247
  type: Input
221
248
  }], itemSelectPlaceholder: [{
@@ -1 +1 @@
1
- {"version":3,"file":"chaqui-catalog-frontend-lib.mjs","sources":["../../src/lib/config/catalog.config.ts","../../src/lib/services/catalog.service.ts","../../src/lib/components/catalog-items-select/catalog-items-select.component.ts","../../src/lib/components/catalog-items-select/catalog-items-select.component.html","../../src/lib/components/catalog-select/catalog-select.component.ts","../../src/lib/components/catalog-select/catalog-select.component.html","../../src/lib/catalog.module.ts","../../src/public-api.ts","../../src/chaqui-catalog-frontend-lib.ts"],"sourcesContent":["import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\n\n/**\n * Configuración de la librería de Catálogos\n */\nexport interface CatalogConfig {\n /**\n * URL base del servicio de catálogos\n * Ejemplo: 'http://localhost:3001/api'\n */\n apiBaseUrl: string;\n}\n\n/**\n * Token de inyección para la configuración\n */\nexport const CATALOG_CONFIG_TOKEN = new InjectionToken<CatalogConfig>('CATALOG_CONFIG');\n\n/**\n * Proveedor para configurar la librería en aplicaciones standalone.\n *\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideHttpClient(),\n * provideCatalog({ apiBaseUrl: 'http://localhost:3001/api' })\n * ]\n * });\n */\nexport function provideCatalog(config: CatalogConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: CATALOG_CONFIG_TOKEN,\n useValue: config\n }\n ]);\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { Catalog, CatalogItem, ApiErrorResponse } from '../models/catalog.model';\nimport { CATALOG_CONFIG_TOKEN } from '../config/catalog.config';\nimport type { CatalogConfig } from '../config/catalog.config';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CatalogService {\n private apiBaseUrl: string;\n\n constructor(\n private http: HttpClient,\n @Inject(CATALOG_CONFIG_TOKEN) config: CatalogConfig\n ) {\n this.apiBaseUrl = config.apiBaseUrl;\n }\n\n /**\n * Obtiene todos los catálogos disponibles\n * @returns Observable con la lista de catálogos\n */\n getCatalogs(): Observable<Catalog[]> {\n return this.http.get<Catalog[]>(`${this.apiBaseUrl}/catalogs`)\n .pipe(\n catchError(this.handleError)\n );\n }\n\n /**\n * Obtiene un catálogo específico por su ID\n * @param catalogId ID del catálogo\n * @returns Observable con los datos del catálogo\n */\n getCatalogById(catalogId: number): Observable<Catalog> {\n return this.http.get<Catalog>(`${this.apiBaseUrl}/catalogs/${catalogId}`)\n .pipe(\n catchError(this.handleError)\n );\n }\n\n /**\n * Obtiene todos los items de un catálogo específico\n * @param catalogId ID del catálogo\n * @returns Observable con la lista de items\n */\n getItemsByCatalogId(catalogId: number): Observable<CatalogItem[]> {\n return this.http.get<CatalogItem[]>(`${this.apiBaseUrl}/catalog/${catalogId}/items`)\n .pipe(\n catchError(this.handleError)\n );\n }\n\n /**\n * Obtiene un item específico por su ID\n * @param itemId ID del item\n * @returns Observable con los datos del item\n */\n getItemById(itemId: number): Observable<CatalogItem> {\n return this.http.get<CatalogItem>(`${this.apiBaseUrl}/items/${itemId}`)\n .pipe(\n catchError(this.handleError)\n );\n }\n\n /**\n * Maneja los errores de las peticiones HTTP\n * @param error Error de la petición\n * @returns Observable con el error\n */\n private handleError(error: any) {\n const errorResponse: ApiErrorResponse = {\n message: error.message || 'Error en la petición',\n status: error.status,\n error: error.error\n };\n console.error('Error en CatalogService:', errorResponse);\n return throwError(() => errorResponse);\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n OnChanges,\n} from \"@angular/core\";\nimport { CatalogService } from \"../../services/catalog.service\";\nimport { CatalogItem } from \"../../models/catalog.model\";\nimport { Subject } from \"rxjs\";\nimport { takeUntil } from \"rxjs/operators\";\n\n@Component({\n selector: \"catalog-items-select\",\n standalone: true,\n imports: [CommonModule],\n templateUrl: \"./catalog-items-select.component.html\",\n styleUrls: [\"./catalog-items-select.component.css\"],\n})\nexport class CatalogItemsSelectComponent implements OnChanges, OnDestroy {\n /**\n * ID del catálogo del cual cargar los items\n */\n @Input() catalogId!: number;\n\n /**\n * ID del item actualmente seleccionado (opcional)\n */\n @Input() selectedItemId?: number;\n\n /**\n * Label del input del catálogo\n */\n @Input() catalogLabel: string = \"Items\";\n\n /**\n * Placeholder del select de items\n */\n @Input() itemSelectPlaceholder: string = \"Selecciona un item\";\n\n /**\n * Emite cuando se selecciona un item\n */\n @Output() itemSelected = new EventEmitter<CatalogItem>();\n\n /**\n * Emite cuando hay un error al cargar los items\n */\n @Output() error = new EventEmitter<string>();\n\n items: CatalogItem[] = [];\n isLoading: boolean = false;\n errorMessage: string = \"\";\n\n private destroy$ = new Subject<void>();\n\n constructor(private catalogService: CatalogService) {}\n\n ngOnChanges(changes: any): void {\n if (changes[\"catalogId\"] && !changes[\"catalogId\"].firstChange) {\n this.loadItems();\n } else if (changes[\"catalogId\"] && changes[\"catalogId\"].firstChange) {\n if (this.catalogId) {\n this.loadItems();\n }\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Carga los items del catálogo especificado\n */\n loadItems(): void {\n if (!this.catalogId) {\n this.errorMessage = \"Por favor ingresa un ID de catálogo válido\";\n this.error.emit(this.errorMessage);\n return;\n }\n\n this.isLoading = true;\n this.errorMessage = \"\";\n this.items = [];\n\n this.catalogService\n .getItemsByCatalogId(this.catalogId)\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (items: CatalogItem[]) => {\n this.items = items;\n this.isLoading = false;\n },\n error: (err: any) => {\n this.isLoading = false;\n this.errorMessage =\n err?.message || \"Error al cargar los items del catálogo\";\n this.error.emit(this.errorMessage);\n console.error(\"Error cargando items:\", err);\n },\n });\n }\n\n /**\n * Maneja el cambio de catálogo\n * @param event Evento del input\n */\n onCatalogIdChange(event: any): void {\n const value = event.target.value;\n this.catalogId = value ? Number(value) : (null as any);\n if (this.catalogId) {\n this.loadItems();\n }\n }\n\n /**\n * Maneja la selección de un item\n * @param event Evento del select\n */\n onItemSelected(event: any): void {\n const itemId = Number(event.target.value);\n const selectedItem = this.items.find((item) => item.id === itemId);\n\n if (selectedItem) {\n this.itemSelected.emit(selectedItem);\n }\n }\n\n /**\n * Obtiene el valor del item para mostrar en el select\n * @param item Item del catálogo\n * @returns Valor del item o ID si no hay valor\n */\n getItemDisplayName(item: CatalogItem): string {\n return item.value || `Item ${item.id}`;\n }\n}\n","<div class=\"catalog-items-select-container\">\n\n <div class=\"form-group\">\n <label for=\"itemSelect\" class=\"form-label\">{{catalogLabel}}</label>\n \n <div *ngIf=\"isLoading\" class=\"loading\">\n Cargando items...\n </div>\n\n <div *ngIf=\"errorMessage && !isLoading\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n\n <select\n *ngIf=\"!isLoading && items.length > 0\"\n id=\"itemSelect\"\n class=\"form-select\"\n [value]=\"selectedItemId || ''\"\n (change)=\"onItemSelected($event)\"\n >\n <option value=\"\">{{ itemSelectPlaceholder }}</option>\n <option *ngFor=\"let item of items\" [value]=\"item.id\">\n {{ getItemDisplayName(item) }}\n </option>\n </select>\n\n <div *ngIf=\"!isLoading && items.length === 0 && !errorMessage\" class=\"no-items\">\n No hay items disponibles\n </div>\n </div>\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CatalogService } from '../../services/catalog.service';\nimport { Catalog } from '../../models/catalog.model';\nimport { Subject, forkJoin } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'catalog-select',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './catalog-select.component.html',\n styleUrls: ['./catalog-select.component.css']\n})\nexport class CatalogSelectComponent implements OnInit, OnDestroy, OnChanges {\n /**\n * Lista de IDs de catálogos a mostrar en el selector\n */\n @Input() catalogIds: number[] = [];\n\n /**\n * ID del catálogo actualmente seleccionado (opcional, para valor inicial)\n */\n @Input() selectedCatalogId?: number;\n\n /**\n * Placeholder del select de catálogos\n */\n @Input() placeholder: string = 'Selecciona un catálogo';\n\n /**\n * Label del selector\n */\n @Input() label: string = 'Catálogo';\n\n /**\n * Emite el ID del catálogo seleccionado\n */\n @Output() catalogSelected = new EventEmitter<number>();\n\n /**\n * Emite el objeto Catalog completo del catálogo seleccionado\n */\n @Output() catalogChange = new EventEmitter<Catalog>();\n\n /**\n * Emite cuando hay un error al cargar los catálogos\n */\n @Output() error = new EventEmitter<string>();\n\n catalogs: Catalog[] = [];\n isLoading: boolean = false;\n errorMessage: string = '';\n\n private destroy$ = new Subject<void>();\n\n constructor(private catalogService: CatalogService) {}\n\n ngOnInit(): void {\n if (this.catalogIds && this.catalogIds.length > 0) {\n this.loadCatalogs();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['catalogIds'] && !changes['catalogIds'].firstChange) {\n this.loadCatalogs();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Carga la información de cada catálogo a partir de los IDs recibidos\n */\n loadCatalogs(): void {\n if (!this.catalogIds || this.catalogIds.length === 0) {\n this.catalogs = [];\n return;\n }\n\n this.isLoading = true;\n this.errorMessage = '';\n this.catalogs = [];\n\n const requests = this.catalogIds.map(id =>\n this.catalogService.getCatalogById(id)\n );\n\n forkJoin(requests)\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (catalogs: Catalog[]) => {\n this.catalogs = catalogs;\n this.isLoading = false;\n },\n error: (err: any) => {\n this.isLoading = false;\n this.errorMessage = err?.message || 'Error al cargar los catálogos';\n this.error.emit(this.errorMessage);\n console.error('Error cargando catálogos:', err);\n }\n });\n }\n\n /**\n * Maneja la selección de un catálogo en el select\n * @param event Evento del select\n */\n onCatalogSelected(event: any): void {\n const catalogId = Number(event.target.value);\n const selected = this.catalogs.find(c => c.id === catalogId);\n\n if (selected) {\n this.selectedCatalogId = catalogId;\n this.catalogSelected.emit(catalogId);\n this.catalogChange.emit(selected);\n }\n }\n\n /**\n * Obtiene el nombre del catálogo para mostrar en el select\n * @param catalog Catálogo\n * @returns Nombre del catálogo o ID si no hay nombre\n */\n getCatalogDisplayName(catalog: Catalog): string {\n return catalog.name || `Catálogo ${catalog.id}`;\n }\n}\n","<div class=\"catalog-select-container\">\n <div class=\"form-group\">\n <label for=\"catalogSelect\" class=\"form-label\">{{ label }}</label>\n\n <div *ngIf=\"isLoading\" class=\"loading\">\n Cargando catálogos...\n </div>\n\n <div *ngIf=\"errorMessage && !isLoading\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n\n <select\n *ngIf=\"!isLoading && !errorMessage\"\n id=\"catalogSelect\"\n class=\"form-select\"\n [value]=\"selectedCatalogId || ''\"\n (change)=\"onCatalogSelected($event)\"\n >\n <option value=\"\">{{ placeholder }}</option>\n <option *ngFor=\"let catalog of catalogs\" [value]=\"catalog.id\">\n {{ getCatalogDisplayName(catalog) }}\n </option>\n </select>\n\n <div *ngIf=\"!isLoading && catalogs.length === 0 && !errorMessage && catalogIds.length > 0\" class=\"no-items\">\n No hay catálogos disponibles\n </div>\n </div>\n</div>\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { CatalogItemsSelectComponent } from './components/catalog-items-select/catalog-items-select.component';\nimport { CatalogSelectComponent } from './components/catalog-select/catalog-select.component';\nimport { CatalogService } from './services/catalog.service';\nimport { CATALOG_CONFIG_TOKEN } from './config/catalog.config';\nimport type { CatalogConfig } from './config/catalog.config';\n\n@NgModule({\n imports: [CommonModule, HttpClientModule, CatalogItemsSelectComponent, CatalogSelectComponent],\n exports: [CatalogItemsSelectComponent, CatalogSelectComponent]\n})\nexport class CatalogModule {\n /**\n * Configura el módulo con la URL base del servicio de catálogos\n * @param config Configuración del módulo\n * @returns Módulo configurado con los proveedores\n * \n * @example\n * // En tu app.module.ts\n * imports: [\n * CatalogModule.forRoot({\n * apiBaseUrl: 'http://localhost:3001/api'\n * })\n * ]\n */\n static forRoot(config: CatalogConfig): ModuleWithProviders<CatalogModule> {\n return {\n ngModule: CatalogModule,\n providers: [\n CatalogService,\n {\n provide: CATALOG_CONFIG_TOKEN,\n useValue: config\n }\n ]\n };\n }\n}\n","/**\n * Exporta todos los módulos, servicios y componentes públicos de la librería\n */\nexport * from './lib/catalog.module';\nexport * from './lib/services/index';\nexport * from './lib/models/index';\nexport * from './lib/components/index';\nexport * from './lib/config/catalog.config';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CatalogService"],"mappings":"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"}
1
+ {"version":3,"file":"chaqui-catalog-frontend-lib.mjs","sources":["../../src/lib/config/catalog.config.ts","../../src/lib/services/catalog.service.ts","../../src/lib/components/catalog-items-select/catalog-items-select.component.ts","../../src/lib/components/catalog-items-select/catalog-items-select.component.html","../../src/lib/components/catalog-select/catalog-select.component.ts","../../src/lib/components/catalog-select/catalog-select.component.html","../../src/lib/catalog.module.ts","../../src/public-api.ts","../../src/chaqui-catalog-frontend-lib.ts"],"sourcesContent":["import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\n\n/**\n * Configuración de la librería de Catálogos\n */\nexport interface CatalogConfig {\n /**\n * URL base del servicio de catálogos\n * Ejemplo: 'http://localhost:3001/api'\n */\n apiBaseUrl: string;\n}\n\n/**\n * Token de inyección para la configuración\n */\nexport const CATALOG_CONFIG_TOKEN = new InjectionToken<CatalogConfig>('CATALOG_CONFIG');\n\n/**\n * Proveedor para configurar la librería en aplicaciones standalone.\n *\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideHttpClient(),\n * provideCatalog({ apiBaseUrl: 'http://localhost:3001/api' })\n * ]\n * });\n */\nexport function provideCatalog(config: CatalogConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: CATALOG_CONFIG_TOKEN,\n useValue: config\n }\n ]);\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { Catalog, CatalogItem, ApiErrorResponse } from '../models/catalog.model';\nimport { CATALOG_CONFIG_TOKEN } from '../config/catalog.config';\nimport type { CatalogConfig } from '../config/catalog.config';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CatalogService {\n private apiBaseUrl: string;\n\n constructor(\n private http: HttpClient,\n @Inject(CATALOG_CONFIG_TOKEN) config: CatalogConfig\n ) {\n this.apiBaseUrl = config.apiBaseUrl;\n }\n\n /**\n * Obtiene todos los catálogos disponibles\n * @returns Observable con la lista de catálogos\n */\n getCatalogs(): Observable<Catalog[]> {\n return this.http.get<Catalog[]>(`${this.apiBaseUrl}/catalogs`)\n .pipe(\n catchError(this.handleError)\n );\n }\n\n /**\n * Obtiene un catálogo específico por su ID\n * @param catalogId ID del catálogo\n * @returns Observable con los datos del catálogo\n */\n getCatalogById(catalogId: number): Observable<Catalog> {\n return this.http.get<Catalog>(`${this.apiBaseUrl}/catalogs/${catalogId}`)\n .pipe(\n catchError(this.handleError)\n );\n }\n\n /**\n * Obtiene todos los items de un catálogo específico\n * @param catalogId ID del catálogo\n * @returns Observable con la lista de items\n */\n getItemsByCatalogId(catalogId: number): Observable<CatalogItem[]> {\n return this.http.get<CatalogItem[]>(`${this.apiBaseUrl}/catalog/${catalogId}/items`)\n .pipe(\n catchError(this.handleError)\n );\n }\n\n /**\n * Obtiene un item específico por su ID\n * @param itemId ID del item\n * @returns Observable con los datos del item\n */\n getItemById(itemId: number): Observable<CatalogItem> {\n return this.http.get<CatalogItem>(`${this.apiBaseUrl}/items/${itemId}`)\n .pipe(\n catchError(this.handleError)\n );\n }\n\n /**\n * Maneja los errores de las peticiones HTTP\n * @param error Error de la petición\n * @returns Observable con el error\n */\n private handleError(error: any) {\n const errorResponse: ApiErrorResponse = {\n message: error.message || 'Error en la petición',\n status: error.status,\n error: error.error\n };\n console.error('Error en CatalogService:', errorResponse);\n return throwError(() => errorResponse);\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n OnDestroy,\n OnChanges,\n} from \"@angular/core\";\nimport { CatalogService } from \"../../services/catalog.service\";\nimport { CatalogItem } from \"../../models/catalog.model\";\nimport { Subject } from \"rxjs\";\nimport { takeUntil } from \"rxjs/operators\";\n\n@Component({\n selector: \"catalog-items-select\",\n standalone: true,\n imports: [CommonModule],\n templateUrl: \"./catalog-items-select.component.html\",\n styleUrls: [\"./catalog-items-select.component.css\"],\n})\nexport class CatalogItemsSelectComponent implements OnChanges, OnDestroy {\n /**\n * ID del catálogo del cual cargar los items\n */\n @Input() catalogId!: number;\n\n /**\n * ID del item actualmente seleccionado (opcional)\n */\n @Input() selectedItemId?: number;\n\n /**\n * Indica si el componente debe mostrarse en modo solo lectura\n */\n @Input() readOnly: boolean = false;\n\n /**\n * Label del input del catálogo\n */\n @Input() catalogLabel: string = \"Items\";\n\n /**\n * Placeholder del select de items\n */\n @Input() itemSelectPlaceholder: string = \"Selecciona un item\";\n\n /**\n * Emite cuando se selecciona un item\n */\n @Output() itemSelected = new EventEmitter<CatalogItem>();\n\n /**\n * Emite cuando hay un error al cargar los items\n */\n @Output() error = new EventEmitter<string>();\n\n items: CatalogItem[] = [];\n isLoading: boolean = false;\n errorMessage: string = \"\";\n selectedItemDisplayName: string = \"\";\n\n private destroy$ = new Subject<void>();\n\n constructor(private catalogService: CatalogService) {}\n\n ngOnChanges(changes: any): void {\n const catalogIdChanged = !!changes[\"catalogId\"];\n const selectedItemIdChanged = !!changes[\"selectedItemId\"];\n\n if (catalogIdChanged) {\n if (this.catalogId) {\n this.loadItems();\n } else {\n this.items = [];\n this.selectedItemDisplayName = \"\";\n }\n return;\n }\n\n if (selectedItemIdChanged) {\n this.updateSelectedItemDisplayName();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Carga los items del catálogo especificado\n */\n loadItems(): void {\n if (!this.catalogId) {\n this.errorMessage = \"Por favor ingresa un ID de catálogo válido\";\n this.error.emit(this.errorMessage);\n return;\n }\n\n this.isLoading = true;\n this.errorMessage = \"\";\n this.items = [];\n\n this.catalogService\n .getItemsByCatalogId(this.catalogId)\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (items: CatalogItem[]) => {\n this.items = items;\n this.isLoading = false;\n this.updateSelectedItemDisplayName();\n },\n error: (err: any) => {\n this.isLoading = false;\n this.errorMessage =\n err?.message || \"Error al cargar los items del catálogo\";\n this.error.emit(this.errorMessage);\n console.error(\"Error cargando items:\", err);\n },\n });\n }\n\n /**\n * Maneja el cambio de catálogo\n * @param event Evento del input\n */\n onCatalogIdChange(event: any): void {\n const value = event.target.value;\n this.catalogId = value ? Number(value) : (null as any);\n if (this.catalogId) {\n this.loadItems();\n }\n }\n\n /**\n * Maneja la selección de un item\n * @param event Evento del select\n */\n onItemSelected(event: any): void {\n const itemId = Number(event.target.value);\n const selectedItem = this.items.find((item) => item.id === itemId);\n\n if (selectedItem) {\n this.selectedItemId = selectedItem.id;\n this.updateSelectedItemDisplayName();\n this.itemSelected.emit(selectedItem);\n }\n }\n\n private updateSelectedItemDisplayName(): void {\n if (!this.selectedItemId) {\n this.selectedItemDisplayName = \"\";\n return;\n }\n\n const selectedItem = this.items.find((item) => item.id === this.selectedItemId);\n this.selectedItemDisplayName = selectedItem\n ? this.getItemDisplayName(selectedItem)\n : this.itemSelectPlaceholder;\n }\n\n /**\n * Obtiene el valor del item para mostrar en el select\n * @param item Item del catálogo\n * @returns Valor del item o ID si no hay valor\n */\n getItemDisplayName(item: CatalogItem): string {\n return item.value || `Item ${item.id}`;\n }\n}\n","<div class=\"catalog-items-select-container\">\n\n <div class=\"form-group\">\n <label for=\"itemSelect\" class=\"form-label\">{{catalogLabel}}</label>\n \n <div *ngIf=\"isLoading\" class=\"loading\">\n Cargando items...\n </div>\n\n <div *ngIf=\"errorMessage && !isLoading\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n\n <div *ngIf=\"!isLoading && readOnly\" class=\"form-input readonly-value\">\n {{ selectedItemDisplayName || itemSelectPlaceholder }}\n </div>\n\n <select\n *ngIf=\"!isLoading && !readOnly && items.length > 0\"\n id=\"itemSelect\"\n class=\"form-select\"\n [value]=\"selectedItemId || ''\"\n (change)=\"onItemSelected($event)\"\n >\n <option value=\"\">{{ itemSelectPlaceholder }}</option>\n <option *ngFor=\"let item of items\" [value]=\"item.id\">\n {{ getItemDisplayName(item) }}\n </option>\n </select>\n\n <div *ngIf=\"!isLoading && !readOnly && items.length === 0 && !errorMessage\" class=\"no-items\">\n No hay items disponibles\n </div>\n </div>\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CatalogService } from '../../services/catalog.service';\nimport { Catalog } from '../../models/catalog.model';\nimport { Subject, forkJoin } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'catalog-select',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './catalog-select.component.html',\n styleUrls: ['./catalog-select.component.css']\n})\nexport class CatalogSelectComponent implements OnInit, OnDestroy, OnChanges {\n /**\n * Lista de IDs de catálogos a mostrar en el selector\n */\n @Input() catalogIds: number[] = [];\n\n /**\n * ID del catálogo actualmente seleccionado (opcional, para valor inicial)\n */\n @Input() selectedCatalogId?: number;\n\n /**\n * Placeholder del select de catálogos\n */\n @Input() placeholder: string = 'Selecciona un catálogo';\n\n /**\n * Label del selector\n */\n @Input() label: string = 'Catálogo';\n\n /**\n * Emite el ID del catálogo seleccionado\n */\n @Output() catalogSelected = new EventEmitter<number>();\n\n /**\n * Emite el objeto Catalog completo del catálogo seleccionado\n */\n @Output() catalogChange = new EventEmitter<Catalog>();\n\n /**\n * Emite cuando hay un error al cargar los catálogos\n */\n @Output() error = new EventEmitter<string>();\n\n catalogs: Catalog[] = [];\n isLoading: boolean = false;\n errorMessage: string = '';\n\n private destroy$ = new Subject<void>();\n\n constructor(private catalogService: CatalogService) {}\n\n ngOnInit(): void {\n if (this.catalogIds && this.catalogIds.length > 0) {\n this.loadCatalogs();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['catalogIds'] && !changes['catalogIds'].firstChange) {\n this.loadCatalogs();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Carga la información de cada catálogo a partir de los IDs recibidos\n */\n loadCatalogs(): void {\n if (!this.catalogIds || this.catalogIds.length === 0) {\n this.catalogs = [];\n return;\n }\n\n this.isLoading = true;\n this.errorMessage = '';\n this.catalogs = [];\n\n const requests = this.catalogIds.map(id =>\n this.catalogService.getCatalogById(id)\n );\n\n forkJoin(requests)\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (catalogs: Catalog[]) => {\n this.catalogs = catalogs;\n this.isLoading = false;\n },\n error: (err: any) => {\n this.isLoading = false;\n this.errorMessage = err?.message || 'Error al cargar los catálogos';\n this.error.emit(this.errorMessage);\n console.error('Error cargando catálogos:', err);\n }\n });\n }\n\n /**\n * Maneja la selección de un catálogo en el select\n * @param event Evento del select\n */\n onCatalogSelected(event: any): void {\n const catalogId = Number(event.target.value);\n const selected = this.catalogs.find(c => c.id === catalogId);\n\n if (selected) {\n this.selectedCatalogId = catalogId;\n this.catalogSelected.emit(catalogId);\n this.catalogChange.emit(selected);\n }\n }\n\n /**\n * Obtiene el nombre del catálogo para mostrar en el select\n * @param catalog Catálogo\n * @returns Nombre del catálogo o ID si no hay nombre\n */\n getCatalogDisplayName(catalog: Catalog): string {\n return catalog.name || `Catálogo ${catalog.id}`;\n }\n}\n","<div class=\"catalog-select-container\">\n <div class=\"form-group\">\n <label for=\"catalogSelect\" class=\"form-label\">{{ label }}</label>\n\n <div *ngIf=\"isLoading\" class=\"loading\">\n Cargando catálogos...\n </div>\n\n <div *ngIf=\"errorMessage && !isLoading\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n\n <select\n *ngIf=\"!isLoading && !errorMessage\"\n id=\"catalogSelect\"\n class=\"form-select\"\n [value]=\"selectedCatalogId || ''\"\n (change)=\"onCatalogSelected($event)\"\n >\n <option value=\"\">{{ placeholder }}</option>\n <option *ngFor=\"let catalog of catalogs\" [value]=\"catalog.id\">\n {{ getCatalogDisplayName(catalog) }}\n </option>\n </select>\n\n <div *ngIf=\"!isLoading && catalogs.length === 0 && !errorMessage && catalogIds.length > 0\" class=\"no-items\">\n No hay catálogos disponibles\n </div>\n </div>\n</div>\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { CatalogItemsSelectComponent } from './components/catalog-items-select/catalog-items-select.component';\nimport { CatalogSelectComponent } from './components/catalog-select/catalog-select.component';\nimport { CatalogService } from './services/catalog.service';\nimport { CATALOG_CONFIG_TOKEN } from './config/catalog.config';\nimport type { CatalogConfig } from './config/catalog.config';\n\n@NgModule({\n imports: [CommonModule, HttpClientModule, CatalogItemsSelectComponent, CatalogSelectComponent],\n exports: [CatalogItemsSelectComponent, CatalogSelectComponent]\n})\nexport class CatalogModule {\n /**\n * Configura el módulo con la URL base del servicio de catálogos\n * @param config Configuración del módulo\n * @returns Módulo configurado con los proveedores\n * \n * @example\n * // En tu app.module.ts\n * imports: [\n * CatalogModule.forRoot({\n * apiBaseUrl: 'http://localhost:3001/api'\n * })\n * ]\n */\n static forRoot(config: CatalogConfig): ModuleWithProviders<CatalogModule> {\n return {\n ngModule: CatalogModule,\n providers: [\n CatalogService,\n {\n provide: CATALOG_CONFIG_TOKEN,\n useValue: config\n }\n ]\n };\n }\n}\n","/**\n * Exporta todos los módulos, servicios y componentes públicos de la librería\n */\nexport * from './lib/catalog.module';\nexport * from './lib/services/index';\nexport * from './lib/models/index';\nexport * from './lib/components/index';\nexport * from './lib/config/catalog.config';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CatalogService"],"mappings":"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"}
@@ -12,6 +12,10 @@ export declare class CatalogItemsSelectComponent implements OnChanges, OnDestroy
12
12
  * ID del item actualmente seleccionado (opcional)
13
13
  */
14
14
  selectedItemId?: number;
15
+ /**
16
+ * Indica si el componente debe mostrarse en modo solo lectura
17
+ */
18
+ readOnly: boolean;
15
19
  /**
16
20
  * Label del input del catálogo
17
21
  */
@@ -31,6 +35,7 @@ export declare class CatalogItemsSelectComponent implements OnChanges, OnDestroy
31
35
  items: CatalogItem[];
32
36
  isLoading: boolean;
33
37
  errorMessage: string;
38
+ selectedItemDisplayName: string;
34
39
  private destroy$;
35
40
  constructor(catalogService: CatalogService);
36
41
  ngOnChanges(changes: any): void;
@@ -49,6 +54,7 @@ export declare class CatalogItemsSelectComponent implements OnChanges, OnDestroy
49
54
  * @param event Evento del select
50
55
  */
51
56
  onItemSelected(event: any): void;
57
+ private updateSelectedItemDisplayName;
52
58
  /**
53
59
  * Obtiene el valor del item para mostrar en el select
54
60
  * @param item Item del catálogo
@@ -56,5 +62,5 @@ export declare class CatalogItemsSelectComponent implements OnChanges, OnDestroy
56
62
  */
57
63
  getItemDisplayName(item: CatalogItem): string;
58
64
  static ɵfac: i0.ɵɵFactoryDeclaration<CatalogItemsSelectComponent, never>;
59
- static ɵcmp: i0.ɵɵComponentDeclaration<CatalogItemsSelectComponent, "catalog-items-select", never, { "catalogId": { "alias": "catalogId"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "catalogLabel": { "alias": "catalogLabel"; "required": false; }; "itemSelectPlaceholder": { "alias": "itemSelectPlaceholder"; "required": false; }; }, { "itemSelected": "itemSelected"; "error": "error"; }, never, never, true, never>;
65
+ static ɵcmp: i0.ɵɵComponentDeclaration<CatalogItemsSelectComponent, "catalog-items-select", never, { "catalogId": { "alias": "catalogId"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "catalogLabel": { "alias": "catalogLabel"; "required": false; }; "itemSelectPlaceholder": { "alias": "itemSelectPlaceholder"; "required": false; }; }, { "itemSelected": "itemSelected"; "error": "error"; }, never, never, true, never>;
60
66
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chaqui-catalog-frontend-lib",
3
- "version": "1.1.29",
3
+ "version": "1.1.30",
4
4
  "description": "Librería Angular para consumir el servicio de catálogos, los componentes son standalone",
5
5
  "type": "module",
6
6
  "author": "",