|
| 1 | +/* eslint-disable no-console */ |
1 | 2 | import { Component, OnInit } from '@angular/core'; |
2 | 3 | import { ActivatedRoute, Router } from '@angular/router'; |
3 | 4 | import { SnomedService } from 'src/app/shared/snomed.service'; |
@@ -139,34 +140,71 @@ export class RUPMoleculaCreateUpdateComponent implements OnInit { |
139 | 140 | } |
140 | 141 | onSave() { |
141 | 142 | this.elemento.nombre = this.nombre; |
142 | | - this.elemento.conceptos = [...this.conceptos]; |
143 | | - const conceptosIds = this.conceptos.map(c => String(c.conceptId)); |
| 143 | + |
| 144 | + const conceptosExistentesOriginales = this.elemento.conceptos || []; |
| 145 | + const conceptosSeleccionadosAhora = this.conceptos || []; |
| 146 | + |
| 147 | + const conceptosNuevosAAgregar = conceptosSeleccionadosAhora.filter( |
| 148 | + nc => !conceptosExistentesOriginales.some(ec => String(ec.conceptId) === String(nc.conceptId)) |
| 149 | + ); |
| 150 | + |
| 151 | + const conceptosUnicos = [ |
| 152 | + ...conceptosExistentesOriginales, |
| 153 | + ...conceptosNuevosAAgregar |
| 154 | + ]; |
| 155 | + |
| 156 | + if (conceptosUnicos.length === 0) { |
| 157 | + this.plex.toast('danger', 'La molécula debe tener al menos un concepto.'); |
| 158 | + return; |
| 159 | + } |
| 160 | + |
| 161 | + this.elemento.conceptos = conceptosUnicos; |
| 162 | + const conceptosIdsNuevos = conceptosNuevosAAgregar.map(c => String(c.conceptId)); |
| 163 | + |
| 164 | + if (conceptosIdsNuevos.length === 0) { |
| 165 | + this.guardarMolecula(); |
| 166 | + return; |
| 167 | + } |
| 168 | + |
144 | 169 | const conceptoDuplicado = this.elementosRup |
145 | 170 | .filter(e => e.id !== this.id) |
146 | 171 | .map(e => e.conceptos || []) |
147 | 172 | .reduce((acc, val) => acc.concat(val), []) |
148 | | - .find(c => conceptosIds.includes(String(c.conceptId))); |
| 173 | + .find(c => conceptosIdsNuevos.includes(String(c.conceptId))); |
149 | 174 |
|
150 | 175 | if (conceptoDuplicado) { |
151 | | - this.plex.toast( |
152 | | - 'danger', |
153 | | - `El concepto "${conceptoDuplicado.term}" ya existe en otra molécula` |
154 | | - ); |
| 176 | + const rupersDuplicados = this.elementosRup |
| 177 | + .filter(e => e.id !== this.id && (e.conceptos || []).some(c => String(c.conceptId) === String(conceptoDuplicado.conceptId))); |
| 178 | + const nombresRuper = rupersDuplicados.map(e => `<b>${e.nombre}</b>`).join('; ') || 'desconocido'; |
| 179 | + |
| 180 | + this.plex.confirm( |
| 181 | + `⚠️ El concepto "${conceptoDuplicado.fsn}" ya existe en los Ruper: ${nombresRuper}.<br>¿Deseás igualmente agregarlo aquí?`, |
| 182 | + 'Concepto duplicado' |
| 183 | + ).then(confirmado => { |
| 184 | + if (confirmado) { |
| 185 | + this.guardarMolecula(); |
| 186 | + } else { |
| 187 | + this.plex.toast('info', 'Operación cancelada por el usuario'); |
| 188 | + } |
| 189 | + }); |
155 | 190 | return; |
156 | 191 | } |
157 | | - // Guardá la molécula completa (incluye todos los requeridos y sus params actualizados) |
| 192 | + |
| 193 | + this.guardarMolecula(); |
| 194 | + } |
| 195 | + guardarMolecula() { |
158 | 196 | this.elementosRUPService.save(this.elemento).subscribe( |
159 | 197 | () => { |
160 | 198 | this.plex.toast('success', 'Molécula guardada correctamente'); |
161 | | - this.router.navigate(['/rupers/elementos-rup'], { replaceUrl: true }); // 👈 redirige como antes |
162 | | - |
| 199 | + this.router.navigate(['/rupers/elementos-rup'], { replaceUrl: true }); |
163 | 200 | }, |
164 | 201 | (err) => { |
165 | 202 | this.plex.toast('danger', 'Error al guardar la molécula'); |
| 203 | + // 👇 Mostrá el error si ocurre |
| 204 | + console.error('Error al guardar:', err); |
166 | 205 | } |
167 | 206 | ); |
168 | 207 | } |
169 | | - |
170 | 208 | volver() { |
171 | 209 | this.router.navigate(['/rupers/elementos-rup'], { replaceUrl: true }); |
172 | 210 | } |
|
0 commit comments