Merge branch 'desarrollo' into 'master'

controles en proyecto

See merge request !11
parents f62691bf 3ca5b574
......@@ -82,7 +82,7 @@ export class ActaCompromisoCarrerasComponent implements OnInit {
return fileName.toLocaleLowerCase().endsWith('.pdf');
}
openModal() {
openModal(mensaje: string) {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
width: '400px',
disableClose: true
......@@ -107,7 +107,7 @@ export class ActaCompromisoCarrerasComponent implements OnInit {
this.proyecto.uzytavproyec_com_part2_nom = pdfData.filename;
this.proyectosService.modificarParametros(this.proyecto.uzytavproyec_id, this.proyecto).subscribe(
response => {
this.openModal();
this.openModal('El PDF ha sido Enviado');
console.log('Datos Actualizados', this.proyecto);
this.myForm.disable();
this.cambio = false;
......
......@@ -94,7 +94,7 @@ export class ListarAnexosImagenesComponent implements OnInit {
eliminarParametro(id: number) {
this.openModalDelete('¿Desea eliminar la Entidad?').subscribe(result => {
this.openModalDelete('¿Desea eliminar el Anexo?').subscribe(result => {
if (result) {
this.anexosImagenesService.eliminarParametros(id).subscribe(
() => {
......@@ -110,6 +110,8 @@ export class ListarAnexosImagenesComponent implements OnInit {
});
}
formatFecha(fecha: Date): string {
const dateObj = new Date(fecha);
return format(dateObj, 'dd-MM-yyyy');
......
......@@ -67,7 +67,7 @@
<ng-container matColumnDef="resultado">
<th mat-header-cell *matHeaderCellDef> Resultado </th>
<td mat-cell *matCellDef="let actividad">
<input matInput type="number" [formControlName]="'resultado' + actividad.uzytavobjetivo_programa_id"
<input matInput [formControlName]="'resultado' + actividad.uzytavobjetivo_programa_id"
placeholder="Resultado">
</td>
</ng-container>
......@@ -82,7 +82,7 @@
<ng-container matColumnDef="observacion">
<th mat-header-cell *matHeaderCellDef> Observación </th>
<td mat-cell *matCellDef="let actividad">
<input matInput type="number" [formControlName]="'observacion' + actividad.uzytavobjetivo_programa_id"
<input matInput [formControlName]="'observacion' + actividad.uzytavobjetivo_programa_id"
placeholder="Observación">
</td>
</ng-container>
......
......@@ -173,7 +173,7 @@ export class AddInformeComponent implements OnInit {
this.guardarBody(this.informeS.obtenerIdCabe());
this.cancelarF();
this.datosCompartidos.actualizarDatos(this.cabeM);
this.openModal();
this.openModal('Los datos han sido Enviados');
});
}
}
......@@ -222,7 +222,7 @@ export class AddInformeComponent implements OnInit {
}
openModal() {
openModal(mensaje: string) {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
disableClose: true
});
......
......@@ -38,10 +38,10 @@
<mat-icon color="warn"
(click)="eliminarHeader(item.uzytavactproy_id)">delete</mat-icon>
</button>
<button>
<!-- <button>
<mat-icon color="azul"
(click)="editarCabecera(item.uzytavactproy_id)">edit</mat-icon>
</button>
</button>-->
</td>
</tr>
......
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { format } from 'date-fns';
import { Observable } from 'rxjs';
import { actproy } from 'src/app/modules/main/Models/actproy';
import { detactproy } from 'src/app/modules/main/Models/detactproy';
import { objetivoprograma } from 'src/app/modules/main/Models/objetivoPrograma';
......@@ -8,6 +9,8 @@ import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/
import { Informes_avanceService } from 'src/app/modules/main/services/informes_avance/informes_avance.service';
import { MostrarOcultarService } from 'src/app/modules/main/services/mostrar-ocultar.service';
import { Objetivo_programaService } from 'src/app/modules/main/services/objetivo_programa/objetivo_programa.service';
import { ConfirmacionEliminacionComponent } from '../../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
import { MatDialog } from '@angular/material/dialog';
@Component({
selector: 'vex-list-informe',
......@@ -35,7 +38,8 @@ export class ListInformeComponent implements OnInit {
private bodyM: detactproy,
private compartirDatos: Actualiza_datosService,
private mostrarOcultarService: MostrarOcultarService,
public idCompartido: Compartir_idService
public idCompartido: Compartir_idService,
private dialog: MatDialog
) { }
ngOnInit(): void {
......@@ -113,23 +117,34 @@ export class ListInformeComponent implements OnInit {
}
eliminarHeader(id: number){
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.informeS.eliminarParametrosCabecera(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.obtenerRegistros();
},
(error) => {
// No mostrar el error en la consola
console.log('Error durante el tratamiento al registro');
}
);
}
this.openModalDelete('¿Desea Eliminar el Registro?').subscribe(result => {
if (result) {
this.informeS.eliminarParametrosCabecera(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.obtenerRegistros();
},
(error) => {
// No mostrar el error en la consola
console.log('Error durante el tratamiento al registro');
}
);
}
});
}
formatFecha(fecha: Date): string {
const dateObj = new Date(fecha);
return format(dateObj, 'dd-MM-yyyy');
}
formularioEnviado:boolean;
openModalDelete(mensaje: string): Observable<string>{
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
......@@ -12,6 +12,10 @@ import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/
import { Objetivo_programaService } from 'src/app/modules/main/services/objetivo_programa/objetivo_programa.service';
import { DatePipe } from "@angular/common";
import { Observable } from 'rxjs';
import { ConfirmacionEliminacionComponent } from '../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
import { MatDialog } from '@angular/material/dialog';
import { EnvioFormularioComponent } from '../../../programa/opciones/envio-formulario/envio-formulario.component';
@Component({
selector: 'vex-add-cronograma-acti',
......@@ -44,7 +48,8 @@ export class AddCronogramaActiComponent implements OnInit {
private objPS: Objetivo_programaService,
private idCompartido: Compartir_idService,
private datosCompartidos: Actualiza_datosService,
private objM: objetivoprograma
private objM: objetivoprograma,
private dialog: MatDialog
) {
this.myForm = this.formBuilder.group({
Actividades: ['', Validators.required],
......@@ -94,6 +99,7 @@ export class AddCronogramaActiComponent implements OnInit {
console.log('yo digo', this.objM.uzytavobjetivo_programafec_fin)
this.objPS.modificarParametros(id_recuperado, this.objM).subscribe(response => {
this.showDataAdd = false;
this.openModal('Los Datos han sido agregados');
this.ocultar = true;
this.myForm.reset();
this.datosCompartidos.actualizarDatos(this.objM);
......@@ -153,18 +159,42 @@ export class AddCronogramaActiComponent implements OnInit {
}
eliminarFechas(id: number) {
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.objPS.modificarFechas(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.obtenerRegistros();
},
(error) => {
console.log('Error durante el tratamiento al registro');
}
);
}
this.openModalDelete('¿Desea eliminar el registro?').subscribe(result=>{
if (result) {
this.objPS.modificarFechas(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.obtenerRegistros();
},
(error) => {
console.log('Error durante el tratamiento al registro');
}
);
}
});
}
openModal(mensaje: string) {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
width: '400px',
disableClose: true,
data: { mensaje: mensaje }
});
dialogRef.afterClosed().subscribe(result => {
this.formularioEnviado = true;
});
}
formularioEnviado:boolean;
openModalDelete(mensaje: string): Observable<string>{
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
......@@ -3,12 +3,16 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { CalendarOptions, EventApi, EventClickArg, EventInput } from '@fullcalendar/core';
import dayGridPlugin from '@fullcalendar/daygrid';
import moment from 'moment';
import { Observable } from 'rxjs';
import { seguim } from 'src/app/modules/main/Models/hito';
import { objetivoprograma } from 'src/app/modules/main/Models/objetivoPrograma';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { HitosService } from 'src/app/modules/main/services/hitos/hitos.service';
import { Objetivo_programaService } from 'src/app/modules/main/services/objetivo_programa/objetivo_programa.service';
import { ConfirmacionEliminacionComponent } from '../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
import { MatDialog } from '@angular/material/dialog';
import { EnvioFormularioComponent } from '../../../programa/opciones/envio-formulario/envio-formulario.component';
@Component({
selector: 'vex-add-hitos',
templateUrl: './add-hitos.component.html',
......@@ -38,7 +42,8 @@ export class AddHitosComponent implements OnInit {
private objM: objetivoprograma,
private objPS: Objetivo_programaService,
private hitoS: HitosService,
private hitoM: seguim
private hitoM: seguim,
private dialog: MatDialog
) {
this.myForm = this.formBuilder.group({
hitos: ['', Validators.required],
......@@ -105,6 +110,7 @@ export class AddHitosComponent implements OnInit {
this.objM.uzytavobjetivo_programafec_fin = fechaHoraSecond;
this.objPS.modificarParametros(id_recuperado, this.objM).subscribe(response => {
this.showDataAdd = false;
this.openModal('Los Datos han sido agregados');
this.ocultar = true;
this.myForm.reset();
this.datosCompartidos.actualizarDatos(this.objM);
......@@ -141,19 +147,43 @@ export class AddHitosComponent implements OnInit {
return color;
}
openModal(mensaje: string) {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
width: '400px',
disableClose: true,
data: { mensaje: mensaje }
});
dialogRef.afterClosed().subscribe(result => {
this.formularioEnviado = true;
});
}
eliminarFechas(id: number) {
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.objPS.modificarFechas(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.obtenerRegistros();
},
(error) => {
// No mostrar el error en la consola
console.log('Error durante el tratamiento al registro');
}
);
}
this.openModalDelete('¿Desea eliminar el registro?').subscribe(result => {
if (result) {
this.objPS.modificarFechas(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.obtenerRegistros();
},
(error) => {
// No mostrar el error en la consola
console.log('Error durante el tratamiento al registro');
}
);
}
});
}
formularioEnviado:boolean;
openModalDelete(mensaje: string): Observable<string>{
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
/* Estilos para el formulario */
.formulario {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
max-width: 96%;
margin: 0 auto;
background-color: white;
border-radius: 10px;
}
.botones{
width: 100px;
height: 40px;
text-align: center;
padding: 0;
}
/* Estilos para la columna única */
.columna-unico {
width: 100%;
box-sizing: border-box;
padding-right: 0;
padding-left: 0;
}
/* Estilos para los labels */
label {
display: block;
margin-bottom: 8px;
font-weight: bold;
}
/* Estilos para los inputs y selects */
input[type="text"],
select {
width: 100%;
padding: 10px;
border: none;
border-bottom: 1px solid #ccc;
background-color: transparent;
font-size: 16px;
margin-bottom: 16px;
transition: border-color 0.3s ease;
}
input[type="text"]:focus,
select:focus {
outline: none;
border-color: #4caf50;
}
/* Estilos para los mensajes de error */
.error-message {
color: red;
font-size: 14px;
margin-top: 4px;
}
/* Estilos para el botón */
button {
display: block;
margin: 20px auto;
padding: 10px 20px;
background-color: rgb(71, 127, 75);
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s ease;
}
button:hover {
background-color: rgb(90, 159, 95);
}
/* Estilos para el contenedor principal */
.contenedor {
width: 96%;
margin-left: 2%;
margin-right: 2%;
margin-top: 10%;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
background-color: #ffffff;
position: relative;
z-index: 1;
}
/* Estilos para el contenedor del formulario */
.contenedor-dos {
padding: 0.9375rem 20px;
position: relative;
}
/* Estilos para el título sobremontado */
.sobremontado {
position: relative;
width: 96%;
top: -20px;
left: 2%;
background-color: #477f4b;
color: #fff;
text-align: center;
padding: 10px;
box-sizing: border-box;
margin-bottom: -50px;
z-index: 2;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
}
/* Estilos para el icono de instituciones */
.icono-instituciones {
display: flex;
align-items: center;
justify-content: center;
margin-right: 5px;
font-size: 20px;
}
.volver{
position: absolute;
top: 25%;
right: 10px;
transform: translateY(-50%);
border-radius: 50%;
background-color: white;
display: flex;
color: rgb(71, 127, 75);
align-items: center;
justify-content: center;
padding: 0;
width: 32px;
height: 32px;
border: none;
outline: none;
cursor: pointer;
}
.save-button {
display: flex;
justify-content: flex-end;
margin-bottom: 16px;
}
.input-container {
width: 100%;
display: flex;
flex-direction: column;
}
/* Estilos para el formulario */
.formulario {
display: flex;
flex-wrap: wrap;
......@@ -295,7 +142,7 @@ button:hover {
.save-button {
display: flex;
justify-content: flex-end;
margin-bottom: 5px;
margin-bottom: 16px;
}
......@@ -303,5 +150,158 @@ button:hover {
width: 100%;
display: flex;
flex-direction: column;
margin-bottom: 5px;
}
/* Estilos para el formulario */
.formulario {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
max-width: 96%;
margin: 0 auto;
background-color: white;
border-radius: 10px;
}
.botones{
width: 100px;
height: 40px;
text-align: center;
padding: 0;
}
/* Estilos para la columna única */
.columna-unico {
width: 100%;
box-sizing: border-box;
padding-right: 0;
padding-left: 0;
}
/* Estilos para los labels */
label {
display: block;
margin-bottom: 8px;
font-weight: bold;
}
/* Estilos para los inputs y selects */
input[type="text"],
select {
width: 100%;
padding: 10px;
border: none;
border-bottom: 1px solid #ccc;
background-color: transparent;
font-size: 16px;
margin-bottom: 16px;
transition: border-color 0.3s ease;
}
input[type="text"]:focus,
select:focus {
outline: none;
border-color: #4caf50;
}
/* Estilos para los mensajes de error */
.error-message {
color: red;
font-size: 14px;
margin-top: 4px;
}
/* Estilos para el botón */
button {
display: block;
margin: 20px auto;
padding: 10px 20px;
background-color: rgb(71, 127, 75);
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s ease;
}
button:hover {
background-color: rgb(90, 159, 95);
}
/* Estilos para el contenedor principal */
.contenedor {
width: 96%;
margin-left: 2%;
margin-right: 2%;
margin-top: 10%;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
background-color: #ffffff;
position: relative;
z-index: 1;
}
/* Estilos para el contenedor del formulario */
.contenedor-dos {
padding: 0.9375rem 20px;
position: relative;
}
/* Estilos para el título sobremontado */
.sobremontado {
position: relative;
width: 96%;
top: -20px;
left: 2%;
background-color: #477f4b;
color: #fff;
text-align: center;
padding: 10px;
box-sizing: border-box;
margin-bottom: -50px;
z-index: 2;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
}
/* Estilos para el icono de instituciones */
.icono-instituciones {
display: flex;
align-items: center;
justify-content: center;
margin-right: 5px;
font-size: 20px;
}
.volver{
position: absolute;
top: 25%;
right: 10px;
transform: translateY(-50%);
border-radius: 50%;
background-color: white;
display: flex;
color: rgb(71, 127, 75);
align-items: center;
justify-content: center;
padding: 0;
width: 32px;
height: 32px;
border: none;
outline: none;
cursor: pointer;
}
.save-button {
display: flex;
justify-content: flex-end;
margin-bottom: 5px;
}
.input-container {
width: 100%;
display: flex;
flex-direction: column;
margin-bottom: 5px;
}
<div class="contenedor-dos">
<form class="formulario" [formGroup]="myForm" (ngSubmit)="onSubmit()">
<!-- Información de la institución -->
<div class="columna-unico">
<!-- Control de fechas inicio -->
<div class="save-button">
<button mat-raised-button class="botones" color="primary" *ngIf="!cambio" (click)="cambiar()">Agregar</button>
<button mat-raised-button class="botones" color="primary" *ngIf="cambio"
[disabled]="myForm.invalid">Guardar</button>
[disabled]="myForm.invalid">Guardar</button>
<span class="separator"></span>
<button mat-raised-button class="botones" color="warn" *ngIf="cambio" (click)="cancelado()">Cancelar</button>
<button mat-raised-button class="botones" color="warn" *ngIf="cambio"
(click)="cancelado()">Cancelar</button>
</div>
<div class="input-container">
<mat-form-field class="contenedor-dos">
<mat-label>Nombres</mat-label>
<input matInput [formControl]="myControl" formControlName="nombres"
placeholder="Realizar búsqueda" />
<input matInput #searchInput id="#searchInput"
(input)="resetAutocompleteVisibility();realizarBusqueda(searchInput.value)"
[value]="selectedUsuario ? selectedUsuario.uzytusuario_nombres + ' ' + selectedUsuario.uzytusuario_apellidos : ''"
placeholder="Realizar búsqueda" [disabled]="!cambio" />
</mat-form-field>
<mat-autocomplete *ngIf="usuarios" autoActiveFirstOption >
<mat-option *ngFor="let usuario of filteredOptions | async" [value]="usuario"
(click)="onUsuarioSelected(usuario)">
<mat-autocomplete *ngIf="usuarios && autocompleteVisible" [displayWith]="displayFn">
<mat-option *ngFor="let usuario of usuarios" [value]="usuario" (click)="onUsuarioSelected(usuario)">
{{ usuario.uzytusuario_nombres }} {{ usuario.uzytusuario_apellidos }}
</mat-option>
</mat-autocomplete>
</div>
<div class="input-container">
<mat-form-field class="contenedor-dos">
<mat-label>Seleccionar Funcion</mat-label>
......
import { Component, OnInit, ViewChild } from '@angular/core';
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { FormBuilder, Validators, FormGroup, FormControl } from '@angular/forms';
import { MatDialog } from '@angular/material/dialog';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
......@@ -6,51 +6,40 @@ import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/
import { Programa } from 'src/app/modules/main/Models/programa-v';
import { DocenteParticipante } from 'src/app/modules/main/Models/docente-participante';
import { DocentesParticipantesService } from 'src/app/modules/main/services/docentes-participantes/docentes-participantes.service';
import { ProgramaService } from 'src/app/modules/main/services/programa/programa.service';
import { DatosEspeService } from 'src/app/modules/main/services/APIs Externas/Datos espe/datos-espe.service';
import { UsuariosService } from 'src/app/modules/main/services/usuarios/usuarios.service';
import { Usuario } from 'src/app/modules/main/Models/usuario';
import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
import { TiPres } from 'src/app/modules/main/Models/tiv-pres';
import { TipresService } from 'src/app/modules/main/services/tipres/tipres.service';
import { ResponsableProg } from 'src/app/modules/main/Models/responsable-prog';
import { Observable } from 'rxjs';
import { map, startWith } from 'rxjs/operators';
import { ResponsableProgService } from 'src/app/modules/main/services/responsable-prog/responsable-prog.service';
import { TipresService } from 'src/app/modules/main/services/tipres/tipres.service';
import { EnvioFormularioComponent } from '../../../../programa/opciones/envio-formulario/envio-formulario.component';
interface Funcion {
value: string;
viewValue: string;
}
@Component({
selector: 'app-asignacion-docentes',
templateUrl: './asignacion-docentes.component.html',
styleUrls: ['./asignacion-docentes.component.css']
})
export class AsignacionDocentesComponent implements OnInit {
@ViewChild(MatAutocomplete) autocomplete: MatAutocomplete;
@ViewChild(MatAutocompleteTrigger) autocompleteTrigger: MatAutocompleteTrigger;
@ViewChild('searchInput', { static: false }) searchInput: ElementRef;
autocompleteVisible: boolean = true;
idRecuperado: number;
myForm: FormGroup;
docenteParticipante: DocenteParticipante;
responsableProg: ResponsableProg;
responsableProgAll!: ResponsableProg[]
selectedDepartamentoId: number;
selectedCampusId: number;
searchTerm: string;
debounceTimeout: any;
tipres!: TiPres []
tipres!: TiPres[]
selectedUsuario: Usuario;
idUsuario: number
filteredOptions: Observable<Usuario[]>;
myControl = new FormControl('');
usuarios: Usuario[];
enviarSolicitud = false;
......@@ -81,36 +70,26 @@ export class AsignacionDocentesComponent implements OnInit {
ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10);
this.cambio = false;
this.obtenerCampus()
this.obtenerFuncion()
this.obtenerUsuarios()
this.obtenerDepartamento()
this.filteredOptions = this.myControl.valueChanges.pipe(
startWith(''),
map(value => this._filter(value || '')),
);
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'), 10);
this.cambio = false; // Set initial value to false
this.obtenerCampus();
this.obtenerFuncion();
this.obtenerDepartamento();
this.obtenerRegistros()
this.myForm = this.formBuilder.group({
numero: [{ value: '', disabled: true }, Validators.required],
funcion: [{ value: '', disabled: true }, Validators.required],
//nombres: [{ value: '', disabled: true }, Validators.required],
nombre: [{ value: '', disabled: true }, Validators.required],
});
}
private _filter(value: string): Usuario[] {
const filterValue = value.toLowerCase();
return this.usuarios.filter(option =>
(option.uzytusuario_nombres + ' ' + option.uzytusuario_apellidos).toLowerCase().includes(filterValue)
);
}
openModal() {
openModal(mensaje: string) {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
disableClose: true
disableClose: true,
data: { mensaje: mensaje }
});
dialogRef.afterClosed().subscribe(result => {
......@@ -118,48 +97,52 @@ export class AsignacionDocentesComponent implements OnInit {
});
}
realizarBusqueda() {
clearTimeout(this.debounceTimeout);
realizarBusqueda(searchTerm: string) {
clearTimeout(this.debounceTimeout);
this.debounceTimeout = setTimeout(() => {
this.usuariosService.obtenerParametros().subscribe(data => {
this.usuariosService.obtenerUsuarios(searchTerm).subscribe(data => {
this.usuarios = data;
console.log(this.usuarios)
});
}, 300);
}, 0);
}
obtenerUsuarios() {
this.usuariosService.obtenerParametros().subscribe(
usuarios => {
this.usuarios = usuarios;
},
error => {
console.log('Error al obtener los usuarios:', error);
}
);
}
displayFn(usuario: Usuario): string {
return usuario ? usuario.uzytusuario_nombres + ' ' + usuario.uzytusuario_apellidos : '';
}
onUsuarioSelected(usuario: Usuario): void {
if (usuario) {
this.idUsuario = usuario.uzytusuario_id;
console.log("id idUsuario ",this.idUsuario)
this.selectedUsuario = usuario;
const nombreCompleto = usuario.uzytusuario_nombres + " " + usuario.uzytusuario_apellidos;
this.myControl.setValue(nombreCompleto); // Asigna el nombre completo al FormControl
resetAutocompleteVisibility() {
this.autocompleteVisible = true;
}
async onUsuarioSelected(usuario: Usuario): Promise<void> {
await this.datosCompartidos.datos$.subscribe(() => {
this.obtenerRegistros();
});
// Cierra el componente de autocompletar manualmente usando el trigger
if (this.autocompleteTrigger) {
this.autocompleteTrigger.closePanel();
console.log("this.responsableProgAll2", this.responsableProgAll)
if (usuario) {
// Verificar si el idUsuario ya existe en los registros
const usuarioExistente = this.responsableProgAll.find(responsable => responsable.uzytusuario_id_docente === usuario.uzytusuario_id);
if (usuarioExistente) {
this.openModal("El usuario ya existe en los registros.");
// Puedes mostrar un mensaje en la interfaz aquí si lo deseas
} else {
this.idUsuario = usuario.uzytusuario_id;
console.log("idUsuario", this.idUsuario);
this.selectedUsuario = usuario;
this.myForm.get('nombre').patchValue(usuario.uzytusuario_nombres + ' ' + usuario.uzytusuario_apellidos);
this.autocompleteVisible = false;
}
} else {
console.log("no existe el usuario");
console.log("No existe el usuario.");
}
}
......@@ -167,30 +150,32 @@ export class AsignacionDocentesComponent implements OnInit {
obtenerRegistros() {
if (this.idRecuperado !== undefined) {
this.responsableProgService.obtenerParametrosRelacionados(this.idRecuperado)
.subscribe(data => {
this.responsableProgAll = data;
});
}
}
onSubmit() {
if (this.myForm.valid && this.myControl.valid) {
console.log("id idUsuario ",this.idUsuario)
if (this.myForm.valid) {
console.log("id idUsuario ", this.idUsuario)
this.responsableProg.uzytavproyec_id = this.idRecuperado;
this.responsableProg.uzytusuario_id_docente = this.idUsuario;
this.responsableProg.uzytavtipres_id = this.myForm.value.funcion
this.responsableProg.uzytavresponsable_prog_g_horas_planif = this.myForm.value.numero
/*/
this.docenteParticipante.uzytavcamp_code = this.selectedCampusId.toString();
this.docenteParticipante.uzytavsubj_code = this.selectedDepartamentoId.toString();
this.docenteParticipante.uzytavdocparti_numero = this.myForm.value.numero;
*/
this.responsableProgService.guardarParametros(this.responsableProg).subscribe(
response => {
console.log("Datos enviados ",this.responsableProg)
this.openModal();
console.log("Datos enviados ", this.responsableProg)
this.openModal('El Docente ha sido Agregado');
this.guardar()
this.datosCompartidos.actualizarDatos(this.responsableProg);
},
error => {
console.log(error)
//this.router.navigate(['main/Convocatorias']);
}
);
}
......@@ -215,7 +200,7 @@ export class AsignacionDocentesComponent implements OnInit {
this.tipresService.obtenerParametros().subscribe(
tipres => {
this.tipres = tipres.filter(item => item.uzytavtipres_id === 1 || item.uzytavtipres_id === 2);
console.log("obtenido ",tipres)
console.log("obtenido ", tipres)
},
error => {
console.log('Error al obtener los tipresService:', error);
......@@ -244,15 +229,19 @@ export class AsignacionDocentesComponent implements OnInit {
this.cambio = false;
this.myForm.disable();
this.myForm.reset()
this.myControl.reset()
if (this.searchInput && this.searchInput.nativeElement) {
this.searchInput.nativeElement.value = ''; // Vacía el contenido del input
}
}
guardar() {
this.cambio = false;
this.myForm.disable();
this.myForm.reset()
this.myControl.disable();
this.myControl.reset()
this.myForm.reset();
if (this.searchInput && this.searchInput.nativeElement) {
this.searchInput.nativeElement.value = ''; // Vacía el contenido del input
}
}
}
.principal {
text-align: center;
margin-bottom: 2%;
}
.grid-container {
display: grid;
grid-template-columns: 5% 10% 45% 10% 5% 10% 15%;
border: 1px solid #ccc;
}
#cabecera {
background: linear-gradient(135deg,
var(--background-base) 22px,
var(--background-hover) 22px,
var(--background-hover) 24px,
transparent 24px,
transparent 67px,
var(--background-hover) 67px,
var(--background-hover) 69px,
transparent 69px),
linear-gradient(225deg,
var(--background-base) 22px,
var(--background-hover) 22px,
var(--background-hover) 24px,
transparent 24px,
transparent 67px,
var(--background-hover) 67px,
var(--background-hover) 69px,
transparent 69px) 0 64px;
background-color: var(--background-base);
background-size: 64px 128px;
}
.Column {
padding-left: 0px;
padding-right: 0px;
width: 100px;
white-space: inherit;
/* overflow: visible;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis; */
}
.Column1 {
padding-left: 0px;
padding-right: 0px;
width: 10px;
white-space: normal;
overflow: visible;
}
.Column2 {
width: 25px;
padding-left: 0px;
padding-right: 0px;
}
.volver{
position: absolute;
top: 50%;
right: 10px;
transform: translateY(-50%);
border-radius: 50%;
background-color: white;
display: flex;
color: rgb(71, 127, 75);
align-items: center;
justify-content: center;
padding: 0;
width: 32px;
height: 32px;
border: none;
outline: none;
cursor: pointer;
}
.grid-item {
font-weight: bold;
}
.grid-opciones {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
}
.titulo {
display: flex;
align-items: center;
justify-content: center;
}
.titulo-texto {
font-weight: bold;
font-size: 18px;
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
margin-right: 10px;
}
.componente {
justify-content: center;
align-items: center;
}
.card {
background-color: rgb(252, 252, 251)
}
.colorEditar {
color: blue;
}
.colorEditar svg {
fill: blue;
}
.contenedorP {
width: 96%;
margin-left: 2%;
margin-right: 2%;
margin: 10px auto;
border-radius: 10px;
text-align: center;
margin-top: 10%;
background-color: white;
}
.contenedor:not(:last-child) {
margin-bottom: 2px;
}
.separador{
margin-top: 5%;
}
.contenedor {
width: 96%;
margin-left: 2%;
margin-right: 2%;
padding-bottom: 2%;
border-radius: 10px;
background-color: white;
position: relative;
z-index: 1;
}
.sobremontado {
position: relative;
align-items: center;
justify-content: center;
padding: 10px;
width: 96%;
top: -20px;
left: 2%;
background-color: rgb(71, 127, 75);
color: #fff;
text-align: center;
padding: 10px;
box-sizing: border-box;
margin-bottom: -50px;
z-index: 2;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
}
.sobremontado span {
display: flex;
align-items: center;
justify-content: center;
margin: 0;
}
.sobremontado mat-icon {
margin-right: 5px;
}
.icono-instituciones {
display: flex;
align-items: center;
justify-content: center;
margin-right: 5px;
font-size: 20px;
cursor: pointer;
}
text-align: center;
margin-bottom: 2%;
}
.grid-container {
display: grid;
grid-template-columns: 5% 10% 45% 10% 5% 10% 15%;
border: 1px solid #ccc;
}
#cabecera {
background: linear-gradient(135deg,
var(--background-base) 22px,
var(--background-hover) 22px,
var(--background-hover) 24px,
transparent 24px,
transparent 67px,
var(--background-hover) 67px,
var(--background-hover) 69px,
transparent 69px),
linear-gradient(225deg,
var(--background-base) 22px,
var(--background-hover) 22px,
var(--background-hover) 24px,
transparent 24px,
transparent 67px,
var(--background-hover) 67px,
var(--background-hover) 69px,
transparent 69px) 0 64px;
background-color: var(--background-base);
background-size: 64px 128px;
}
.Column {
padding-left: 0px;
padding-right: 0px;
width: 100px;
white-space: inherit;
/* overflow: visible;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis; */
}
.Column1 {
padding-left: 0px;
padding-right: 0px;
width: 10px;
white-space: normal;
overflow: visible;
}
.Column2 {
width: 25px;
padding-left: 0px;
padding-right: 0px;
}
.volver{
position: absolute;
top: 50%;
right: 10px;
transform: translateY(-50%);
border-radius: 50%;
background-color: white;
display: flex;
color: rgb(71, 127, 75);
align-items: center;
justify-content: center;
padding: 0;
width: 32px;
height: 32px;
border: none;
outline: none;
cursor: pointer;
}
.grid-item {
font-weight: bold;
}
.grid-opciones {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
}
.titulo {
display: flex;
align-items: center;
justify-content: center;
}
.titulo-texto {
font-weight: bold;
font-size: 18px;
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
margin-right: 10px;
}
.componente {
justify-content: center;
align-items: center;
}
.card {
background-color: rgb(252, 252, 251)
}
.colorEditar {
color: blue;
}
.colorEditar svg {
fill: blue;
}
.contenedorP {
width: 96%;
margin-left: 2%;
margin-right: 2%;
margin: 10px auto;
border-radius: 10px;
text-align: center;
margin-top: 10%;
background-color: white;
}
.contenedor:not(:last-child) {
margin-bottom: 2px;
}
.separador{
margin-top: 5%;
}
.contenedor {
width: 96%;
margin-left: 2%;
margin-right: 2%;
padding-bottom: 2%;
border-radius: 10px;
background-color: white;
position: relative;
z-index: 1;
}
.sobremontado {
position: relative;
align-items: center;
justify-content: center;
padding: 10px;
width: 96%;
top: -20px;
left: 2%;
background-color: rgb(71, 127, 75);
color: #fff;
text-align: center;
padding: 10px;
box-sizing: border-box;
margin-bottom: -50px;
z-index: 2;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
}
.sobremontado span {
display: flex;
align-items: center;
justify-content: center;
margin: 0;
}
.sobremontado mat-icon {
margin-right: 5px;
}
.icono-instituciones {
display: flex;
align-items: center;
justify-content: center;
margin-right: 5px;
font-size: 20px;
cursor: pointer;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
font-family: 'Roboto', sans-serif;
color: #333;
}
table th,
table td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #e0e0e0;
}
table th {
background-color: rgb(248, 249, 250);
font-weight: bold;
text-transform: uppercase;
}
table td {
position: relative;
}
table td::after {
content: "";
position: absolute;
bottom: -1px;
left: 0;
width: 100%;
height: 1px;
background-color: #e0e0e0;
}
input[type="text"] {
width: 200px;
padding: 8px;
border: 1px solid #ccc;
border-radius: 5px;
margin-left: 10px;
}
.area-busqueda {
padding: 20px;
margin-top: 30px;
text-align: right;
}
@media (max-width: 600px) {
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
font-family: 'Roboto', sans-serif;
color: #333;
font-size: 14px;
}
table th,
table td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #e0e0e0;
}
table th {
background-color: rgb(248, 249, 250);
font-weight: bold;
text-transform: uppercase;
}
table td {
position: relative;
}
table td::after {
content: "";
position: absolute;
bottom: -1px;
left: 0;
width: 100%;
height: 1px;
background-color: #e0e0e0;
}
input[type="text"] {
width: 200px;
padding: 8px;
border: 1px solid #ccc;
border-radius: 5px;
margin-left: 10px;
}
.area-busqueda {
padding: 20px;
margin-top: 30px;
text-align: right;
}
@media (max-width: 600px) {
table {
font-size: 14px;
}
table th,
table td {
padding: 8px;
}
}
.btn-observar {
border-radius: 50%;
width: 36px;
height: 36px;
}
.colorsito{
background-color: rgb(248, 249, 250);
}
.rounder{
border-radius: 50%;
background-color: rgb(71, 127, 75);
display: flex;
align-items: center;
justify-content: center;
padding: 0;
width: 15%;
height: 40px;
border: none;
outline: none;
cursor: pointer;
}
.rounder mat-icon {
font-size: 24px;
color: #fff;
}
@media (max-width: 768px) {
.rounder {
width: 30%;
}
}
@media (max-width: 480px) {
.rounder {
width: 40%;
}
}
.margen{
margin: 10px;
padding: 10px;
margin-bottom: 10px;
}
.bordes {
border-collapse: collapse;
width: 100%;
}
.bordes th,
.bordes td {
border: 1px solid black;
padding: 8px;
}
.bordes th {
background-color: #f5f5f5;
font-weight: bold;
}
.bordes td {
background-color: #ffffff;
}
.bordes tr:nth-child(even) {
background-color: #f9f9f9;
}
.bordes tr:hover {
background-color: #eaeaea;
}
.bordes th:last-child,
.bordes td:last-child {
border-bottom: none;
}
.rounder-nuevo {
border-radius: 50%;
background-color: rgb(71, 127, 75);
display: flex;
align-items: center;
justify-content: center;
padding: 0;
width: 36px;
height: 36px;
border: none;
outline: none;
cursor: pointer;
margin-left: 5px;
}
.white-icon {
color: white;
}
.btn{
padding: 0 2% 0 2%;
}
.azul {
color: blue;
}
.institution {
display: flex;
align-items: center;
}
.institution-name {
font-size: 20px;
/* Tamaño de fuente deseado */
font-weight: bold;
/* Opcional, para hacerlo más destacado */
margin-right: 30px;
/* Espacio entre el icono y el nombre */
}
.add-icon {
display: flex;
align-items: center;
justify-content: center;
width: 25px;
/* Ancho del círculo */
height: 25px;
/* Altura del círculo */
border-radius: 50%;
/* Para crear la forma de círculo */
background-color: white;
/* Color de fondo del círculo */
color: black;
/* Color del signo "+" en el círculo */
font-size: 25px;
/* Tamaño del signo "+" */
}
\ No newline at end of file
}
.btn-observar {
border-radius: 50%;
width: 36px;
height: 36px;
}
.colorsito{
background-color: rgb(248, 249, 250);
}
.rounder{
border-radius: 50%;
background-color: rgb(71, 127, 75);
display: flex;
align-items: center;
justify-content: center;
padding: 0;
width: 15%;
height: 40px;
border: none;
outline: none;
cursor: pointer;
}
.rounder mat-icon {
font-size: 24px;
color: #fff;
}
@media (max-width: 768px) {
.rounder {
width: 30%;
}
}
@media (max-width: 480px) {
.rounder {
width: 40%;
}
}
.margen{
margin: 10px;
padding: 10px;
margin-bottom: 10px;
}
.bordes {
border-collapse: collapse;
width: 100%;
}
.bordes th,
.bordes td {
border: 1px solid black;
padding: 8px;
}
.bordes th {
background-color: #f5f5f5;
font-weight: bold;
}
.bordes td {
background-color: #ffffff;
}
.bordes tr:nth-child(even) {
background-color: #f9f9f9;
}
.bordes tr:hover {
background-color: #eaeaea;
}
.bordes th:last-child,
.bordes td:last-child {
border-bottom: none;
}
.rounder-nuevo {
border-radius: 50%;
background-color: rgb(71, 127, 75);
display: flex;
align-items: center;
justify-content: center;
padding: 0;
width: 36px;
height: 36px;
border: none;
outline: none;
cursor: pointer;
margin-left: 5px;
}
.white-icon {
color: white;
}
.btn{
padding: 0 2% 0 2%;
}
.azul {
color: blue;
}
.institution {
display: flex;
align-items: center;
}
.institution-name {
font-size: 20px;
/* Tamaño de fuente deseado */
font-weight: bold;
/* Opcional, para hacerlo más destacado */
margin-right: 30px;
/* Espacio entre el icono y el nombre */
}
.add-icon {
display: flex;
align-items: center;
justify-content: center;
width: 25px;
/* Ancho del círculo */
height: 25px;
/* Altura del círculo */
border-radius: 50%;
/* Para crear la forma de círculo */
background-color: white;
/* Color de fondo del círculo */
color: black;
/* Color del signo "+" en el círculo */
font-size: 25px;
/* Tamaño del signo "+" */
}
......@@ -12,35 +12,43 @@
<!-- Dirección Column -->
<ng-container matColumnDef="Campus" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>Campus</th>
<ng-container matColumnDef="Nombres" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>Nombre</th>
<td class="Column" mat-cell *matCellDef="let dato">
{{dato.campus$ | async }} </td>
{{dato.usuario.uzytusuario_nombres }} </td>
</ng-container>
<ng-container matColumnDef="Departamento" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>Departamento</th>
<ng-container matColumnDef="Apellidos" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>Apellido</th>
<td class="Column" mat-cell *matCellDef="let dato">
{{ dato.departamento$ | async }}
{{ dato.usuario.uzytusuario_apellidos }}
</td>
</ng-container>
<ng-container matColumnDef="Docentes Participantes" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>Docentes Participantes</th>
<td class="Column" mat-cell *matCellDef="let dato"> {{dato.uzytavdocparti_numero}} </td>
<ng-container matColumnDef="Funcion" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>Funcion</th>
<td class="Column" mat-cell *matCellDef="let dato">
{{ dato.tiPres.uzytavtipres_descrip }}
</td>
</ng-container>
<ng-container matColumnDef="HorasP" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>Horas Planificadas</th>
<td class="Column" mat-cell *matCellDef="let dato">
{{ dato.uzytavresponsable_prog_g_horas_planif }}
</td>
</ng-container>
<ng-container matColumnDef="Acciones" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>Acciones</th>
<td class="Column" mat-cell *matCellDef="let dato">
<!--eliminar-->
<button>
<mat-icon color="warn" (click)="eliminarParametro(dato.uzytavdocparti_id)">delete</mat-icon>
<mat-icon color="warn" (click)="eliminarParametro(dato.uzytavresponsable_prog_id)">delete</mat-icon>
</button>
</td>
</ng-container>
......@@ -48,14 +56,5 @@
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
<table> <!-- Nueva tabla para la fila de total -->
<tr>
<td class="Column1 negrita " colspan="1">Total</td>
<td class="Column ">{{ totalDocentesParticipantes }}</td>
<td class="Column "></td>
<td class="Column "></td>
</tr>
</table>
</div>
</div>
\ No newline at end of file
</div>
import { Component, OnInit } from '@angular/core';
import { MatTableDataSource } from '@angular/material/table';
import { Observable, of } from 'rxjs';
import { Observable, forkJoin, of } from 'rxjs';
import { map } from 'rxjs/operators';
import { DocenteParticipante } from 'src/app/modules/main/Models/docente-participante';
import { Programa } from 'src/app/modules/main/Models/programa-v';
import { Proyectos } from 'src/app/modules/main/Models/proyectos';
import { ResponsableProg } from 'src/app/modules/main/Models/responsable-prog';
import { TiPres } from 'src/app/modules/main/Models/tiv-pres';
import { Usuario } from 'src/app/modules/main/Models/usuario';
import { DatosEspeService } from 'src/app/modules/main/services/APIs Externas/Datos espe/datos-espe.service';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { DocentesParticipantesService } from 'src/app/modules/main/services/docentes-participantes/docentes-participantes.service';
import { MostrarOcultarService } from 'src/app/modules/main/services/mostrar-ocultar.service';
import { ResponsableProgService } from 'src/app/modules/main/services/responsable-prog/responsable-prog.service';
import { TipresService } from 'src/app/modules/main/services/tipres/tipres.service';
import { UsuariosService } from 'src/app/modules/main/services/usuarios/usuarios.service';
import { ConfirmacionEliminacionComponent } from '../../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
import { MatDialog } from '@angular/material/dialog';
@Component({
selector: 'app-listar-docentes-asignados',
......@@ -16,63 +26,96 @@ import { DocentesParticipantesService } from 'src/app/modules/main/services/doce
})
export class ListarDocentesAsignadosComponent implements OnInit {
idRecuperado: number;
dataSource: MatTableDataSource<DocenteParticipante>;
dataSource: MatTableDataSource<ResponsableProg>;
docenteParticipante: DocenteParticipante[] = [];
programas: Programa[]; // Arreglo de programas obtenidos del servicio
selectedProgramaId: number;
displayedColumns: string[] = ['Nro','Campus','Departamento','Docentes Participantes', 'Acciones'];
displayedColumns: string[] = ['Nro',
'Nombres',
'Apellidos',
'Funcion',
'HorasP',
'Acciones'];
totalDocentesParticipantes: number = 0; //total de participantes
usuario!: Usuario[];
tiPres!: TiPres[];
proyecto: Proyectos
responsableProg!: ResponsableProg[]
constructor(
private idCompartido: Compartir_idService,
private datosCompar: Actualiza_datosService,
private docentesParticipantesService: DocentesParticipantesService,
private datosEspeService: DatosEspeService
private responsableProgService: ResponsableProgService,
private datosEspeService: DatosEspeService,
private mostrarOcultarService: MostrarOcultarService,
private datosUsuarioService: UsuariosService,
private tipresService: TipresService,
private datosCompartidos: Actualiza_datosService,
private dialog: MatDialog
) {
this.dataSource = new MatTableDataSource<DocenteParticipante>([]);
this.dataSource = new MatTableDataSource<ResponsableProg>([]);
}
ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10);
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'), 10);
this.proyecto = this.mostrarOcultarService.editProyecto;
this.datosCompar.datos$.subscribe(() => {
this.obtenerRegistros();
});
this.docentesParticipantesService.parametrosActualizados.subscribe(() => {
this.responsableProgService.parametrosActualizados.subscribe(() => {
this.obtenerRegistros();
});
}
obtenerRegistros() {
if (this.idRecuperado !== undefined) {
this.docentesParticipantesService.obtenerRegistrosRelacionadosProyecto(this.idRecuperado).
subscribe(data => {
this.docenteParticipante = data.map(docente => {
return {
...docente,
departamento$: this.obtenerDatosDepartamento(docente.uzytavsubj_code),
campus$: this.obtenerDatosCampus(docente.uzytavcamp_code)
};
this.responsableProgService.obtenerParametrosRelacionados(this.idRecuperado)
.subscribe(data => {
if (data !== undefined) {
const userObservables: Observable<Usuario>[] = [];
const tiPresObservables: Observable<TiPres>[] = [];
for (const responsable of data) {
console.log("id usuario ", responsable.uzytusuario_id_docente)
console.log("id obtenerTipres ", responsable.uzytusuario_id_docente)
userObservables.push(this.obtenerUsuarios(responsable.uzytusuario_id_docente));
tiPresObservables.push(this.obtenerTipres(responsable.uzytavtipres_id));
}
forkJoin([...userObservables, ...tiPresObservables]).subscribe(results => {
const users = results.slice(0, userObservables.length);
const tiPres = results.slice(userObservables.length);
this.responsableProg = data.map((responsable, index) => ({
...responsable,
usuario: users[index],
tiPres: tiPres[index]
}));
console.log("this.responsableProg;", this.responsableProg);
this.dataSource.data = this.responsableProg;
});
}
});
this.dataSource.data = this.docenteParticipante;
this.calcularTotalDocentesParticipantes(); // Total de docentes
});
}
}
calcularTotalDocentesParticipantes() {
this.totalDocentesParticipantes = 0; // Reinicia el total a 0
for (const docente of this.docenteParticipante) {
this.totalDocentesParticipantes += docente.uzytavdocparti_numero;
}
obtenerUsuarios(id: number){
return this.datosUsuarioService.obtenerUsuariosId(id);
}
obtenerTipres(id: number){
return this.tipresService.obtenerParametrosId(id);
}
obtenerDatosCampus(codigo: string): Observable<string> {
return this.datosEspeService.obtenerCampus().pipe(
......@@ -94,20 +137,32 @@ export class ListarDocentesAsignadosComponent implements OnInit {
eliminarParametro(id: number) {
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.docentesParticipantesService.eliminarParametros(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.obtenerRegistros();
},
(error) => {
// No mostrar el error en la consola
console.log(error)
}
);
}
this.openModalDelete('¿Desea eliminar el Docente?').subscribe(resutl=> {
if (resutl) {
this.responsableProgService.eliminarParametros(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.datosCompartidos.actualizarDatos(this.responsableProg);
this.obtenerRegistros();
},
(error) => {
// No mostrar el error en la consola
console.log(error)
}
);
}
});
}
formularioEnviado:boolean;
openModalDelete(mensaje: string): Observable<string>{
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
......@@ -8,6 +8,10 @@ import { ParametrosdetService } from 'src/app/modules/main/services/parametrosde
import { EnvioFormularioComponent } from '../../../../programa/opciones/envio-formulario/envio-formulario.component';
import { MatDialog } from '@angular/material/dialog';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { Parroquia } from 'src/app/modules/main/Models/Ubicaciones/parroquia';
import { Canton } from 'src/app/modules/main/Models/Ubicaciones/canton';
import { Provincia } from 'src/app/modules/main/Models/Ubicaciones/provincia';
import { UbicacionesService } from 'src/app/modules/main/services/Ubicaciones/ubicaciones.service';
@Component({
......@@ -26,13 +30,18 @@ export class AddCompromisoComponent implements OnInit {
entidad: parametrosdet[] = [];
orga: parametrosdet[] = [];
institu: Instituciones[] = [];
parroquias: Parroquia[] = [];
cantones: Canton[] = [];
provincias: Provincia[]=[];
constructor(
private formBuilder: FormBuilder,
private instP: ParametrosdetService,
private instituS: InstitucionesService,
private instproyM: instproy,
private dialog: MatDialog,
private datosCompartidos: Actualiza_datosService
private datosCompartidos: Actualiza_datosService,
private UbicacionesS: UbicacionesService
) { }
ngOnInit(): void {
......@@ -62,10 +71,10 @@ export class AddCompromisoComponent implements OnInit {
this.instproyM.uzytparametros_det_id_organizacion = this.myForm.get('organizacionI').value;
this.instproyM.uzytavinstproy_declaracion = this.myForm.get('declaracion').value;
this.instP.guardarParametros(this.instproyM).subscribe(response => {
this.openModal();
this.openModal('Los Datos han sido Enviados');
this.instP.parametrosActualizados.next();
this.datosCompartidos.actualizarDatos(this.instproyM);
this.formularioGuardado.emit();
});
} catch (error) {
console.error('Error al enviar los datos:', error);
......@@ -86,11 +95,24 @@ export class AddCompromisoComponent implements OnInit {
this.instituS.obtenerParametros().subscribe(data => {
this.institu = data;
});
this.UbicacionesS.obtenerProvincias().subscribe(data =>{
this.provincias = data;
});
this.UbicacionesS.obtenerCant().subscribe(data =>{
this.cantones = data;
})
this.UbicacionesS.obtenerParro().subscribe(data =>{
this.parroquias = data;
});
}
onInstitucionSelected(selectedInstitucionId: number) {
const selectedInstitucion = this.institu.find(item => item.uzytavinstituc_id === selectedInstitucionId);
if (selectedInstitucion) {
this.myForm.get('provinciaI')?.setValue(this.getParroquiaNombre(selectedInstitucion.uzytparroquia_id));
this.myForm.get('direccionI')?.setValue(selectedInstitucion.uzytavinstituc_calle);
this.myForm.get('nombreR')?.setValue(selectedInstitucion.uzytavinstituc_nombre);
this.myForm.get('apellidoR')?.setValue(selectedInstitucion.uzytavinstituc_apellirl);
......@@ -100,7 +122,7 @@ export class AddCompromisoComponent implements OnInit {
}
}
openModal() {
openModal(mensaje: string) {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
disableClose: true
});
......@@ -110,4 +132,15 @@ export class AddCompromisoComponent implements OnInit {
this.formularioEnviado = true;
});
}
getParroquiaNombre(parroquiaId: string): string {
const parroquia = this.parroquias.find(p => p.uzytparroquia_id === parroquiaId);
if (parroquia) {
const canton = this.cantones.find(c => c.uzytcanton_id === parroquia.uzytcanton_id)
const prov = this.provincias.find(pro => pro.uzytprovincia_id === canton.uzytprovincia_id)
const nombre = prov.uzytprovincia_nombre.toLowerCase();
return nombre.charAt(0).toUpperCase() + nombre.slice(1);
}
return '';
}
}
import { Component, OnInit } from '@angular/core';
import { MatTableDataSource } from '@angular/material/table';
import { Observable } from 'rxjs';
import { Canton } from 'src/app/modules/main/Models/Ubicaciones/canton';
import { Parroquia } from 'src/app/modules/main/Models/Ubicaciones/parroquia';
import { Provincia } from 'src/app/modules/main/Models/Ubicaciones/provincia';
......@@ -11,6 +12,8 @@ import { UbicacionesService } from 'src/app/modules/main/services/Ubicaciones/ub
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { ParametrosdetService } from 'src/app/modules/main/services/parametrosdet/parametrosdet.service';
import { ConfirmacionEliminacionComponent } from '../../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
import { MatDialog } from '@angular/material/dialog';
@Component({
selector: 'vex-list-compromiso',
......@@ -36,7 +39,8 @@ export class ListCompromisoComponent implements OnInit {
private instP: ParametrosdetService,
private ubicacionesS: UbicacionesService,
private InstitucionesS: InstitucionesService,
private paratS: ParametrosdetService
private paratS: ParametrosdetService,
private dialog: MatDialog
) {
this.dataSource = new MatTableDataSource<instproy>([]);
}
......@@ -169,20 +173,30 @@ export class ListCompromisoComponent implements OnInit {
eliminarParametro(id: number) {
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.instP.eliminarParametros(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.obtenerRegistros();
},
(error) => {
// No mostrar el error en la consola
console.log('Error durante el tratamiento al registro');
}
);
}
this.openModalDelete('¿Desea Eliminar la Institución?').subscribe(result =>{
if (result) {
this.instP.eliminarParametros(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.obtenerRegistros();
},
(error) => {
// No mostrar el error en la consola
console.log('Error durante el tratamiento al registro');
}
);
}
});
}
formularioEnviado:boolean;
openModalDelete(mensaje: string): Observable<string>{
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
import { Component, OnInit,Input } from '@angular/core';
import { Component, OnInit, Input } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { docompar } from 'src/app/modules/main/Models/docompar';
import { AddDocumentosComponent } from '../add-documentos/add-documentos.component';
......@@ -6,6 +6,8 @@ import { ParametrosdetService } from 'src/app/modules/main/services/parametrosde
import { ActualizarAnexosService } from 'src/app/modules/main/services/actualizar_anexos/actualizar-anexos.service';
import { saveAs } from 'file-saver';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { Observable } from 'rxjs';
import { ConfirmacionEliminacionComponent } from '../../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
@Component({
selector: 'vex-list-documentos',
templateUrl: './list-documentos.component.html',
......@@ -23,16 +25,16 @@ export class ListDocumentosComponent implements OnInit {
) { }
ngOnInit(): void {
this.datosCompartidos.datos$.subscribe(() =>{
this.datosCompartidos.datos$.subscribe(() => {
this.obtenerDocumentos();
});
this.pdfService.parametrosActualizados.subscribe(() =>{
this.pdfService.parametrosActualizados.subscribe(() => {
this.obtenerDocumentos();
});
}
GuardarParametro(){
GuardarParametro() {
const dialogRef = this.dialog.open(AddDocumentosComponent, {
data: { idConf: this.idConf }
});
......@@ -70,31 +72,42 @@ export class ListDocumentosComponent implements OnInit {
return 'document.pdf'; // Nombre predeterminado si no se puede obtener el nombre del archivo
}
obtenerDocumentos(){
obtenerDocumentos() {
this.pdfService.obtenerNombrePDF().subscribe(data => {
this.documentoInst = data.filter(item => item.uzytavinstproy_id === this.idConf);
});
}
descargar(){
descargar() {
}
eliminarParametro(id: number) {
const confirmacion = confirm('¿Estás seguro de que quieres eliminar este parámetro?');
if (confirmacion) {
this.pdfService.eliminarPDF(id).subscribe(
() => {
// Manejar la eliminación exitosa
console.log('Registro eliminado correctamente');
this.obtenerDocumentos();
},
(error) => {
this.obtenerDocumentos();
this.openModalDelete('¿Desea eliminar el PDF?').subscribe(result => {
if (result) {
this.pdfService.eliminarPDF(id).subscribe(
() => {
// Manejar la eliminación exitosa
console.log('Registro eliminado correctamente');
this.obtenerDocumentos();
},
(error) => {
this.obtenerDocumentos();
// Manejar el error en caso de que ocurra
console.error('Error al eliminar el registro', error);
}
);
}
// Manejar el error en caso de que ocurra
console.error('Error al eliminar el registro', error);
}
);
}
});
}
formularioEnviado: boolean;
openModalDelete(mensaje: string): Observable<string> {
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
import { Component, OnInit, ViewChild } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { MatTable, MatTableDataSource } from '@angular/material/table';
import { Observable } from 'rxjs';
import { CatalogoPP } from 'src/app/modules/main/Models/catalogo-partidas-presupuestarias';
import { PartidasPresupuestarias } from 'src/app/modules/main/Models/partidas-presupuestarias';
import { PresupuestoPartidas } from 'src/app/modules/main/Models/presupuesto-partidas';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { PresupuestoPartidasService } from 'src/app/modules/main/services/presupuesto-partidas/presupuesto-partidas.service';
import { ConfirmacionEliminacionComponent } from '../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
@Component({
selector: 'app-aporte-comunidad',
......@@ -97,6 +99,7 @@ export class AporteComunidadComponent implements OnInit {
eliminarParametros(id: number) {
this.openModalDelete('¿Dsea eliminar el Aporte de la Comunidad?').subscribe(result=>{
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.presupuestoPartidasService.eliminarParametros(id).subscribe(
......@@ -109,7 +112,18 @@ export class AporteComunidadComponent implements OnInit {
}
);
}
});
}
formularioEnviado:boolean;
openModalDelete(mensaje: string): Observable<string>{
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
import { Component, OnInit, ViewChild } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { MatTable, MatTableDataSource } from '@angular/material/table';
import { Observable } from 'rxjs';
import { CatalogoPP } from 'src/app/modules/main/Models/catalogo-partidas-presupuestarias';
import { PartidasPresupuestarias } from 'src/app/modules/main/Models/partidas-presupuestarias';
import { PresupuestoPartidas } from 'src/app/modules/main/Models/presupuesto-partidas';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { PresupuestoPartidasService } from 'src/app/modules/main/services/presupuesto-partidas/presupuesto-partidas.service';
import { ConfirmacionEliminacionComponent } from '../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
@Component({
......@@ -51,7 +53,7 @@ export class AporteEntidadComponent implements OnInit {
}
ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10);
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'), 10);
this.datosCompartidos.datos$.subscribe(() => {
this.obtenerRegistros();
});
......@@ -93,24 +95,36 @@ export class AporteEntidadComponent implements OnInit {
calcularTotales() {
this.totalSuma = this.presupuestoPartidas.reduce((total, dato) => {
return total + dato.uzytavpresup_valor * dato.uzytavpresup_cantidad;
return total + dato.uzytavpresup_valor * dato.uzytavpresup_cantidad;
}, 0);
this.totalSuma = parseFloat(this.totalSuma.toFixed(2));
}
eliminarParametros(id: number) {
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.presupuestoPartidasService.eliminarParametros(id).subscribe(
(response) => {
console.log('El registro se ha eliminado exitosamente.');
this.obtenerRegistros(); // Refresh the records after successful deletion
},
(error) => {
console.log('Error during the treatment of the record', error);
}
);
}
this.openModalDelete('¿Dsea eliminar el Aporte de la Universidad?').subscribe(result => {
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.presupuestoPartidasService.eliminarParametros(id).subscribe(
(response) => {
console.log('El registro se ha eliminado exitosamente.');
this.obtenerRegistros(); // Refresh the records after successful deletion
},
(error) => {
console.log('Error during the treatment of the record', error);
}
);
}
});
}
formularioEnviado: boolean;
openModalDelete(mensaje: string): Observable<string> {
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
......@@ -10,6 +10,7 @@ import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { PartidasPresupuestariasService } from 'src/app/modules/main/services/partidas-presupuestarias/partidas-presupuestarias.service';
import { PresupuestoPartidasService } from 'src/app/modules/main/services/presupuesto-partidas/presupuesto-partidas.service';
import { ConfirmacionEliminacionComponent } from '../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
@Component({
selector: 'app-aporte-universidad',
......@@ -166,18 +167,30 @@ export class AporteUniversidadComponent implements OnInit {
eliminarParametros(id: number) {
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.presupuestoPartidasService.eliminarParametros(id).subscribe(
(response) => {
console.log('El registro se ha eliminado exitosamente.');
this.obtenerRegistros(); // Refresh the records after successful deletion
},
(error) => {
console.log('Error during the treatment of the record', error);
}
);
}
this.openModalDelete('¿Dsea eliminar el Aporte de la Universidad?').subscribe(result=>{
if (result) {
this.presupuestoPartidasService.eliminarParametros(id).subscribe(
(response) => {
console.log('El registro se ha eliminado exitosamente.');
this.obtenerRegistros(); // Refresh the records after successful deletion
},
(error) => {
console.log('Error during the treatment of the record', error);
}
);
}
});
}
formularioEnviado:boolean;
openModalDelete(mensaje: string): Observable<string>{
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
......@@ -7,6 +7,8 @@ import { PresupuestoPartidas } from 'src/app/modules/main/Models/presupuesto-par
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { PresupuestoPartidasService } from 'src/app/modules/main/services/presupuesto-partidas/presupuesto-partidas.service';
import { ConfirmacionEliminacionComponent } from '../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
import { Observable } from 'rxjs';
@Component({
selector: 'app-list-comunidad',
......@@ -37,7 +39,7 @@ export class ListComunidadComponent implements OnInit {
}
ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10);
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'), 10);
this.datosCompartidos.datos$.subscribe(() => {
this.obtenerRegistros();
});
......@@ -78,26 +80,36 @@ export class ListComunidadComponent implements OnInit {
calcularTotales() {
this.totalSuma = this.presupuestoPartidas.reduce((total, dato) => {
return total + dato.uzytavpresup_valor * dato.uzytavpresup_cantidad;
return total + dato.uzytavpresup_valor * dato.uzytavpresup_cantidad;
}, 0);
this.totalSuma = parseFloat(this.totalSuma.toFixed(2));
}
eliminarParametros(id: number) {
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.presupuestoPartidasService.eliminarParametros(id).subscribe(
(response) => {
console.log('El registro se ha eliminado exitosamente.');
this.obtenerRegistros(); // Refresh the records after successful deletion
},
(error) => {
console.log('Error during the treatment of the record', error);
}
);
}
this.openModalDelete('¿Dsea eliminar el Aporte de la Comunidad?').subscribe(result => {
if (result) {
this.presupuestoPartidasService.eliminarParametros(id).subscribe(
(response) => {
console.log('El registro se ha eliminado exitosamente.');
this.obtenerRegistros(); // Refresh the records after successful deletion
},
(error) => {
console.log('Error during the treatment of the record', error);
}
);
}
});
}
formularioEnviado: boolean;
openModalDelete(mensaje: string): Observable<string> {
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
import { Component, OnInit, ViewChild } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { MatTable, MatTableDataSource } from '@angular/material/table';
import { Observable } from 'rxjs';
import { CatalogoPP } from 'src/app/modules/main/Models/catalogo-partidas-presupuestarias';
import { PartidasPresupuestarias } from 'src/app/modules/main/Models/partidas-presupuestarias';
import { PresupuestoPartidas } from 'src/app/modules/main/Models/presupuesto-partidas';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { PresupuestoPartidasService } from 'src/app/modules/main/services/presupuesto-partidas/presupuesto-partidas.service';
import { ConfirmacionEliminacionComponent } from '../../../programa/opciones/ConfirmacionEliminacion/ConfirmacionEliminacion.component';
@Component({
selector: 'app-list-entidad',
......@@ -24,7 +26,7 @@ export class ListEntidadComponent implements OnInit {
politicas: any[] = [];
objetivos: any[] = [];
presupuestoPartidas!: PresupuestoPartidas[];
@ViewChild(MatTable) table: MatTable<any>;
......@@ -88,8 +90,8 @@ export class ListEntidadComponent implements OnInit {
eliminarParametros(id: number) {
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.openModalDelete('¿Dsea eliminar el Aporte de la Entidad Auspiciante?').subscribe(result=>{
if (result) {
this.presupuestoPartidasService.eliminarParametros(id).subscribe(
(response) => {
console.log('El registro se ha eliminado exitosamente.');
......@@ -100,5 +102,16 @@ export class ListEntidadComponent implements OnInit {
}
);
}
});
}
formularioEnviado:boolean;
openModalDelete(mensaje: string): Observable<string>{
const dialogRef = this.dialog.open(ConfirmacionEliminacionComponent, {
disableClose: true,
data: { mensaje: mensaje }
});
return dialogRef.afterClosed();
}
}
......@@ -10,9 +10,11 @@ import { ResponsableProg } from '../../Models/responsable-prog';
})
export class ResponsableProgService {
private readonly URL = environment.appApiUrl + '/cabevalp';
private readonly URL = environment.appApiUrl + '/responsableprog';
private readonly URLRelacionadoProyec = environment.appApiUrl + '/responsableprog/obtenerRegistrosPorProyectID';
parametrosActualizados: Subject<void> = new Subject<void>();
private idCabEvalProy: number;
constructor(private httpClient: HttpClient) {}
......@@ -25,12 +27,14 @@ export class ResponsableProgService {
return this.httpClient.get<ResponsableProg>(`${this.URL}/exampleFindId/${id}`)
}
obtenerParametrosRelacionados(idProyecto: number): Observable<ResponsableProg[]> {
return this.httpClient.get<ResponsableProg[]>(`${this.URLRelacionadoProyec}/${idProyecto}`)
}
guardarParametros(parametros: ResponsableProg):Observable<Object>{
return this.httpClient.post(`${this.URL+"/guardar"}`, parametros).pipe(
tap((response: any) => {
this.idCabEvalProy = response.uzytavcabevalp_id;
console.log("id cabecera evaluacion", this.idCabEvalProy) // Captura el ID devuelto por el servidor
})
);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment