arreglos de configuraciones

parent 2daf4da8
......@@ -24,6 +24,7 @@ import { GlobalUserService } from 'src/app/core/http/user/global-user.service'
import { LoginUsuario } from './modules/main/Models/Login/loginUsuario';
import { OAuthService } from 'angular-oauth2-oidc';
import { HttpClient } from '@angular/common/http';
import { GlobalUser } from './types/user.types';
@Component({
......@@ -33,6 +34,8 @@ import { HttpClient } from '@angular/common/http';
})
export class AppComponent implements OnInit {
public isLoggedIn = false;
constructor(
private configService: ConfigService,
private renderer: Renderer2,
......@@ -42,7 +45,7 @@ export class AppComponent implements OnInit {
@Inject(LOCALE_ID) private localeId: string,
private layoutService: LayoutService,
private route: ActivatedRoute,
private navigationService: NavigationService,
public navigationService: NavigationService,
private splashScreenService: SplashScreenService,
private readonly matIconRegistry: MatIconRegistry,
private readonly domSanitizer: DomSanitizer,
......@@ -150,76 +153,107 @@ export class AppComponent implements OnInit {
});
// this.setInterval();
this.authService.globalUser$.subscribe(user => {
if (user) {
this.generateMenu(user); // Llamada al método que genera el menú dinámicamente
}
});
}
private generateMenu(user: GlobalUser): void {
const userEmail = user.correoInstitucional;
let menuOptions = [];
// Se agrega opciones específicas basadas en el correo electrónico
if (userEmail === 'jamolina13@espe.edu.ec' || userEmail === 'jacaceres1@espe.edu.ec' || userEmail === 'aczambrano3@espe.edu.ec') {
menuOptions.push(
{
type: 'link',
label: 'Lineas Operativas',
route: 'main/lineas',
icon: 'mat:format_list_numbered'
},
{
type: 'link',
label: 'Asignación Comisión',
route: 'main/Asignar-Comision',
icon: 'mat:fact_check'
},
{
type: 'link',
label: 'Configuraciones',
route: 'main/configuraciones',
icon: 'mat:settings'
}, {
type: 'link',
label: 'Usuarios',
route: 'main/PrincipalUsuarios',
icon: 'mat:settings'
},
{
type: 'link',
label: 'Convocatorias',
route: 'main/Convocatorias',
icon: 'mat:home'
},
{
type: 'link',
label: 'Programas',
route: 'main/Programas',
icon: 'mat:content_paste'
}
,
{
type: 'link',
label: 'Proyectos',
route: 'main/ListaProyectos',
icon: 'mat:home'
},
{
type: 'link',
label: 'Reporte Proyectos',
route: 'main/presupuesto',
icon: 'mat:settings'
},
{
type: 'link',
label: 'Aprobación Vicerrectorado',
route: 'main/ejemplo',
icon: 'mat:settings'
}
);
} else if (userEmail === 'jvzambrano4@espe.edu.ec') {
menuOptions.push(
{
type: 'link',
label: 'Proyectos',
route: 'main/ListaProyectos',
icon: 'mat:home'
}
);
}
this.navigationService.items = [
{
type: 'subheading',
label: 'Opciones',
children: [
{
type: 'link',
label: 'Lineas Operativas',
route: 'main/lineas',
icon: 'mat:format_list_numbered'
},
{
type: 'link',
label: 'Asignación Comisión',
route: 'main/Asignar-Comision',
icon: 'mat:fact_check'
},
{
type: 'link',
label: 'Configuraciones',
route: 'main/configuraciones',
icon: 'mat:settings'
}, {
type: 'link',
label: 'Usuarios',
route: 'main/PrincipalUsuarios',
icon: 'mat:settings'
},
{
type: 'link',
label: 'Convocatorias',
route: 'main/Convocatorias',
icon: 'mat:home'
},
{
type: 'link',
label: 'Programas',
route: 'main/Programas',
icon: 'mat:content_paste'
}
,
{
type: 'link',
label: 'Proyectos',
route: 'main/ListaProyectos',
icon: 'mat:home'
},
{
type: 'link',
label: 'Reporte Proyectos',
route: 'main/presupuesto',
icon: 'mat:settings'
},
{
type: 'link',
label: 'Aprobación Vicerrectorado',
route: 'main/ejemplo',
icon: 'mat:settings'
}
]
children: menuOptions
},
];
// this.setInterval();
}
public getNavigationService(): NavigationService {
return this.navigationService;
}
ngOnInit(): void {
this.authService.login();
}
login(): void {
......
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router';
import { AuthorizationService } from './AuthorizationService';
import { AuthService } from './auth.service';
import { MatDialog } from '@angular/material/dialog';
import { AccesoDenegadoComponent } from 'src/app/modules/main/pages/programa/opciones/AccesoDenegado/AccesoDenegado.component';
@Injectable({
providedIn: 'root',
})
export class AuthGuard implements CanActivate {
formularioEnviado: boolean;
constructor(private authorizationService: AuthorizationService,
private router: Router,
private authService: AuthService,
private dialog: MatDialog
) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree {
const requiredEmails = route.data['requiredEmails'] as string[];
const userCurrentEmail = this.authService.email;
if (this.authorizationService.hasAccess(requiredEmails)) {
return true;
} else {
console.log("Access denied for:", userCurrentEmail);
this.openModal();
return false;
}
}
openModal() {
const dialogRef = this.dialog.open(AccesoDenegadoComponent, {
width: '400px',
disableClose: true
});
dialogRef.afterClosed().subscribe(result => {
console.log('La ventana modal se ha cerrado');
this.formularioEnviado = true;
});
}
}
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class AuthorizationService {
private userEmail: string[] = [];
private perfiles: string[] = [];
setUserEmail(email: string[]) {
this.userEmail = email;
console.log('User email set:', this.userEmail);
}
setperfiles(perfiles: string[]) {
this.perfiles = perfiles;
console.log('User email set:', this.perfiles);
}
hasAccess(requiredEmail: string[]): boolean {
console.log('Required email:', requiredEmail);
console.log('User email:', this.userEmail);
return requiredEmail.some(email => this.userEmail.includes(email));
}
hasAccessPerfiles(requiredPerfil: string[]): boolean {
console.log('Required email:', requiredPerfil);
console.log('User email:', this.perfiles);
return requiredPerfil.some(perfiles => this.perfiles.includes(perfiles));
}
}
......@@ -8,24 +8,35 @@ import { GlobalUser } from 'src/app/types/user.types';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Router } from '@angular/router';
import { MatDialog } from '@angular/material/dialog';
import { throwError, timer } from 'rxjs';
import { catchError, switchMap, timeout } from 'rxjs/operators';
import { AuthorizationService } from './AuthorizationService';
import { AccesoNoAutorizadoComponent } from 'src/app/modules/main/pages/programa/opciones/AccesoNoAutorizado/AccesoNoAutorizado.component';
@Injectable({
providedIn: 'root',
})
export class AuthService {
public isUiEnabled: boolean = false;
public isUiEnabled: boolean = false;
private isVerifying: boolean = false;
private globalUserSubject: BehaviorSubject<GlobalUser> =
new BehaviorSubject<GlobalUser>(null);
globalUser$: Observable<GlobalUser> = this.globalUserSubject.asObservable();
private userProfilesSubject: BehaviorSubject<string[]> = new BehaviorSubject<string[]>([]);
userProfiles$: Observable<string[]> = this.userProfilesSubject.asObservable();
formularioEnviado: boolean;
constructor(
private oAuthService: OAuthService,
private authorizationService: AuthorizationService,
private globalUserService: GlobalUserService,
private httpClient: HttpClient,
private router: Router
private router: Router,
private dialog: MatDialog
) {
this.configureOauthService();
}
......@@ -45,11 +56,17 @@ export class AuthService {
}
get username(): string {
return this.oAuthService.getIdentityClaims()['sub'];
}
get email(): string {
return this.oAuthService.getIdentityClaims()['sub'];
console.log("this.oAuthService.getIdentityClaims()['email']", this.oAuthService.getIdentityClaims()['email'])
return this.oAuthService.getIdentityClaims()['email'];
}
login() {
if (!this.oAuthService.hasValidAccessToken()) {
this.oAuthService.initImplicitFlow();
......@@ -59,6 +76,8 @@ export class AuthService {
if (this.oAuthService.getIdentityClaims()) {
this.getGlobalUser();
//this.sendTokenToBackend();
const emails = [this.email];
this.authorizationService.setUserEmail(emails);
}
}
......@@ -76,25 +95,56 @@ export class AuthService {
}
private getGlobalUser() {
const email = this.oAuthService.getIdentityClaims()['email'];
this.isUiEnabled = false; // Deshabilitar la interfaz
const email = this.oAuthService.getIdentityClaims()['email'];
this.httpClient.get<boolean>(`http://localhost:8080/api/v1.0/users/by-email/${email}`).subscribe(
(exists: boolean) => {
(exists: boolean) => {
this.isVerifying = false; // Restaurar la bandera de verificación
if (exists) {
// Existe el email en la bdd
this.globalUserService.getUserByUsername(this.tokenClaims.username).subscribe(user => {
this.setGlobalUser(user);
this.isUiEnabled = true; // Habilitar la interfaz una vez que se completa la verificación
this.setGlobalUser(user);
this.getUserProfiles(email);
});
}
},
(error) => {
this.isUiEnabled = false;
this.logout();
this.openModal();
console.error('Error al verificar el email del usuario', error);
}
);
}
openModal() {
const dialogRef = this.dialog.open(AccesoNoAutorizadoComponent, {
width: '400px',
disableClose: true
});
dialogRef.afterClosed().subscribe(result => {
this.logout();
console.log('La ventana modal se ha cerrado');
});
}
private getUserProfiles(email: string) {
this.httpClient.get<string[]>(`http://localhost:8080/api/v1.0/usuario/findPerfilesByUsuarioEmail/${email}`).subscribe(
(profiles: string[]) => {
this.setGlobalUserProfiles(profiles); // Actualiza los perfiles del usuario
this.isUiEnabled = true; // Habilitar la interfaz una vez que se completó la verificación
console.log('Perfiles del usuario:', profiles);
},
(error) => {
console.error('Error al obtener los perfiles del usuario', error);
}
);
}
private setGlobalUserProfiles(profiles: string[]) {
this.userProfilesSubject.next(profiles);
}
private setGlobalUser(user: GlobalUser) {
......@@ -155,29 +205,6 @@ export class AuthService {
return typeof idToken['sub'] !== 'undefined' ? idToken['sub'].toString() : '';
}
}
/**
//Enviar token
sendTokenToBackend() {
const token = this.oAuthService.getAccessToken();
console.log("Token:"+ token)
if (token) {
// Configura las cabeceras de la solicitud con el token
const headers = new HttpHeaders().set('Authorization', `Bearer ${token}`);
// Realiza la solicitud HTTP al backend
this.httpClient.post('http://localhost:8080/api/v1.0/api/token', {}, { headers })
.subscribe(
(response) => {
// Maneja la respuesta del backend
console.log('Token enviado al backend:', response);
},
(error) => {
// Maneja el error en caso de que la solicitud falle
console.error('Error al enviar el token al backend:', error);
}
);
}
}
*/
}
export class ResponsableProg{
uzytavresponsable_prog_id?: number;
uzytusuario_id_docente:number;
uzytavtipres_id:number;
stvsubj_code_dpto?:string;
uzytavprograma_v_id:number;
uzytavresponsable_prog_g_orden:number;
uzytavproyec_id?:number;
uzytavresponsable_prog_g_horas_planif:number;
stvmajr_code:string;
uzytavresponsable_prog_g_nro_certificados:number;
uzytavresponsable_prog_g_fecha_creacion:Date;
uzytavresponsable_prog_g_estado:string;
uzytavactaresponsa_code:number;
uzytavresponsable_prog_g_verificar:string;
uzytavresponsable_prog_g_verfecha:Date;
uzytavresponsable_prog_g_responsable:string;
uzytavresponsable_prog_g_calificacion:number;
}
\ No newline at end of file
export class TiPres{
uzytavtipres_id:number;
uzytavtipres_descrip:number;
uzytavtipres_orden:number;
}
\ No newline at end of file
This diff is collapsed.
......@@ -68,9 +68,6 @@ import { EditComisionEvaluacionComponent } from './pages/Seccion-configuraciones
import { AddIntegrantesComisionComponent } from './pages/Seccion-configuraciones/Comision de Evaluacion/Integrantes de la Comision/add-integrantes-comision/add-integrantes-comision.component';
import { EditIntegrantesComisionComponent } from './pages/Seccion-configuraciones/Comision de Evaluacion/Integrantes de la Comision/edit-integrantes-comision/edit-integrantes-comision.component';
import { IntegrantesComisionComponent } from './pages/Seccion-configuraciones/Comision de Evaluacion/Integrantes de la Comision/integrantes-comision/integrantes-comision.component';
import { ConvocatoriasAgregarComponent } from './pages/convocatorias/convocatorias-agregar/convocatorias-agregar.component';
import { ConvocatoriasEditarComponent } from './pages/convocatorias/convocatorias-editar/convocatorias-editar.component';
import { ConvocatoriasListarComponent } from './pages/convocatorias/convocatorias-listar/convocatorias-listar.component';
import { CatalogoPartidasComponent } from './pages/Seccion-configuraciones/Catalogo Partidas Presupuestarias/catalogo/catalogo-partidas/catalogo-partidas.component';
import { EditCatalogoPartidasComponent } from './pages/Seccion-configuraciones/Catalogo Partidas Presupuestarias/catalogo/edit-catalogo-partidas/edit-catalogo-partidas.component';
import { AddCatalogoPartidasComponent } from './pages/Seccion-configuraciones/Catalogo Partidas Presupuestarias/catalogo/add-catalogo-partidas/add-catalogo-partidas.component';
......@@ -218,15 +215,25 @@ import { detactproy } from './Models/detactproy';
import { EditInformeBodyComponent } from './pages/Proyectos/Ejecución/informes de avance/edit-informe-body/edit-informe-body.component';
import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de avance/add-informe/add-informe.component';
import { CabEvalProyService } from './services/cabecera-eval-proye/cab-eval-proy.service';
import { AddCalificacionVinculacionComponent } from './pages/Calificacion Comision Vinculacion/add-calificacion-vinculacion/add-calificacion-vinculacion.component';
import { ActaDirectorProyectoComponent } from './pages/Proyectos/Acta Compromiso Director Proyecto/acta-director-proyecto/acta-director-proyecto.component';
import { ActaConsejoDepartamentoComponent } from './pages/Proyectos/Acta de Consejo de Departamento/acta-consejo-departamento/acta-consejo-departamento.component';
import { ActaCompromisoCarrerasComponent } from './pages/Proyectos/Acta de Compromiso de Carreras/acta-compromiso-carreras/acta-compromiso-carreras.component';
import { AddImagenesComponent } from './pages/programa/opciones/diagnostico y problema/anexos e imagenes/add-imagenes/add-imagenes.component';
import { ListImagenesComponent } from './pages/programa/opciones/diagnostico y problema/anexos e imagenes/list-imagenes/list-imagenes.component';
import { DesignarEvaluadorComponent } from './pages/Proyectos/Evaluación/designar-evaluador/designar-evaluador.component';
import { ConvocatoriasAgregarComponent } from './pages/convocatorias/convocatorias-agregar/convocatorias-agregar.component';
import { ConvocatoriasEditarComponent } from './pages/convocatorias/convocatorias-editar/convocatorias-editar.component';
import { ConvocatoriasListarComponent } from './pages/convocatorias/convocatorias-listar/convocatorias-listar.component';
import { AsignacionEstudiantesComponent } from './pages/Proyectos/Inicio Ejecución/Asignacion Estudiantes/asignacion-estudiantes/asignacion-estudiantes.component';
import { ListarDocentesAsignadosComponent } from './pages/Proyectos/Inicio Ejecución/Asignacion Docentes/listar-docentes-asignados/listar-docentes-asignados.component';
import { AsignacionDocentesComponent } from './pages/Proyectos/Inicio Ejecución/Asignacion Docentes/asignacion-docentes/asignacion-docentes.component';
import { AddCalificacionVinculacionComponent } from './pages/Calificacion Comision Vinculacion/add-calificacion-vinculacion/add-calificacion-vinculacion.component';
import { AccesoDenegadoComponent } from './pages/programa/opciones/AccesoDenegado/AccesoDenegado.component';
import { AccesoNoAutorizadoComponent } from './pages/programa/opciones/AccesoNoAutorizado/AccesoNoAutorizado.component';
@NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA],
declarations: [
AsignacionDocentesComponent,
ActaCompromisoCarrerasComponent,
ActaConsejoDepartamentoComponent,
ActaDirectorProyectoComponent,
......@@ -397,6 +404,10 @@ import { ListImagenesComponent } from './pages/programa/opciones/diagnostico y p
AddCalificacionVinculacionComponent,
AddImagenesComponent,
ListImagenesComponent,
DesignarEvaluadorComponent,
ListarDocentesAsignadosComponent,
AccesoDenegadoComponent,
AccesoNoAutorizadoComponent
],
imports: [
MatTreeModule,
......@@ -428,7 +439,8 @@ import { ListImagenesComponent } from './pages/programa/opciones/diagnostico y p
MatFormFieldModule,
MatCardModule,
MatButtonModule,
MatRadioModule
MatRadioModule,
MatAutocompleteModule
],
providers: [
seguim,
......
......@@ -83,42 +83,6 @@
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
<!--
<table class="principal">
<thead class="colorsito">
<tr>
<th class="colorsito">Nro</th>
<th class="colorsito">Parametro</th>
<th class="colorsito">Valoracion</th>
<th class="colorsito">Puntaje</th>
</tr>
</thead>
<tbody>
<ng-container *ngFor="let parametro of parametrosEvaluacion; let i = index">
<tr>
<td>{{ i+1 }}</td>
<td>{{ parametro.uzytavparaeva_descrip }}</td>
<td>
<mat-form-field class="form-field">
<mat-label>Seleccione un Item</mat-label>
<mat-select [formControl]="valoracionControls[i]">
<mat-option *ngFor="let subopcion of parametro.opcion" [value]="subopcion.uzytavaloruzytparametros_id">
{{ subopcion.uzytavalorpar_descrip }}
</mat-option>
</mat-select>
</mat-form-field>
</td>
<td>
{{ obtenerPuntajeSeleccionado(parametro.selectedOption) }}
</td>
</tr>
</ng-container>
</tbody>
</table>
-->
</div>
......
......@@ -37,6 +37,8 @@ export class AddCalificacionVinculacionComponent implements OnInit {
proyecto: Proyectos;
usuario: Usuario;
cabeceraEvalProy: CabeEvalProy
cabeceraEvalProyEdit: CabeEvalProy
evaluacionProy: EvaluacionProy
opcionesRespuesta!: OpcionesRespuesta[];
......@@ -71,6 +73,8 @@ export class AddCalificacionVinculacionComponent implements OnInit {
this.proyecto = new Proyectos();
this.dataSource = new MatTableDataSource<ParametrosEvaluacion>([]);
this.cabeceraEvalProy = new CabeEvalProy();
this.cabeceraEvalProyEdit = new CabeEvalProy();
this.usuario = new Usuario();
this.evaluacionProy = new EvaluacionProy()
}
......@@ -78,6 +82,7 @@ export class AddCalificacionVinculacionComponent implements OnInit {
ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'), 10);
this.proyecto = this.mostrarOcultarService.editProyecto;
this.obtenerParametrosIniciales(this.proyecto.uzytavconparaeva_id);
this.initializeForm()
this.obtenerDatosUsuario()
this.myForm = this.formBuilder.group({
......@@ -85,7 +90,6 @@ export class AddCalificacionVinculacionComponent implements OnInit {
descripcion: [{ value: '', disabled: true }, Validators.required],
});
// Obtener los parámetros iniciales y asignar los valores al formulario
this.obtenerParametrosIniciales(this.proyecto.uzytavconparaeva_id);
}
initializeForm() {
......@@ -93,10 +97,23 @@ export class AddCalificacionVinculacionComponent implements OnInit {
this.dynamicForm.disable(); // Disable all form controls
}
obtenerDatosCabecera() {
this.cabEvalProyService.obtenerParametrosId(this.proyecto.uzytusuario_id).subscribe(
usuario => {
this.cabeceraEvalProyEdit = usuario;
this.myForm.patchValue({
fechaInicio: this.cabeceraEvalProyEdit.uzytavcabevalp_fec_crea,
descripcion: this.cabeceraEvalProyEdit.uzytavcabevalp_observa,
});
},
error => {
console.log('Error al obtener los parámetros:', error);
}
);
}
obtenerParametrosIniciales(id: number) {
if (id != undefined) {
if (id != undefined && id != null)
this.parametrosEvaService.obtenerParametrosIniciales(id).subscribe(data => {
if (data !== undefined) {
const parametrosWithOpciones$: Observable<ParametrosEvaluacion>[] = data.map(parametro => {
......@@ -111,25 +128,21 @@ export class AddCalificacionVinculacionComponent implements OnInit {
})
);
});
forkJoin(parametrosWithOpciones$).subscribe(parametros => {
this.parametrosEvaluacion = parametros;
this.dataSource.data = parametros;
});
}else{
console.log('Nose ha encontrado registros');
}
});
}else{
else {
console.log("envíe un id valido")
}
}
createDynamicFormControls(opciones: OpcionesRespuesta[]) {
opciones.forEach(opcion => {
this.dynamicForm.addControl('valoracion' + opcion.uzytavparaeva_id,
this.formBuilder.control({ value: ' ', disabled: true },
this.formBuilder.control({ value: opcion.uzytavaloruzytparametros_id, disabled: true },
[Validators.required]));
});
this.dynamicForm.disable();
......@@ -188,10 +201,8 @@ export class AddCalificacionVinculacionComponent implements OnInit {
);
}
onSubmit() {
if (this.myForm.valid) {
if (this.myForm.valid && this.dynamicForm.valid) {
this.cabeceraEvalProy.uzytavproyec_id = this.idRecuperado;
this.cabeceraEvalProy.uzytavcabevalp_fec_crea = this.myForm.value.apellido;
this.cabeceraEvalProy.uzytavcabevalp_observa = this.myForm.value.apellido;
......@@ -202,32 +213,19 @@ export class AddCalificacionVinculacionComponent implements OnInit {
this.enviarEvaluacion(this.cabEvalProyService.obtenerId())
console.log("cabecera enviada ", this.cabeceraEvalProy)
this.openModal()
this.guardar()
});
}
}
enviarEvaluacion2(idCabecera: number) {
this.enviarSolicitud = false;
if (!this.enviarSolicitud) {
this.enviarSolicitud = true;
this.evaluacionProy.uzytavcabevalp_id = idCabecera;
this.evaluacionProy.uzytavaloruzytparametros_id
this.evaluacionProyectoService.guardarParametros(this.evaluacionProy).subscribe(() => {
console.log("enviado ", this.evaluacionProy)
});
}
}
enviarEvaluacion(idCabecera: number) {
if (!this.enviarSolicitud) {
this.enviarSolicitud = true;
// Iterar a través de las opciones de respuesta
this.opcionesRespuesta.forEach(opcion => {
const controlName = 'valoracion' + opcion.uzytavparaeva_id;
console.log("formcontrol enviad", controlName)
const selectedValueId = this.dynamicForm.get(controlName)?.value;
if (selectedValueId !== null && selectedValueId !== undefined) {
// Crear el objeto EvaluacionProy con los valores necesarios
const evaluacionProy: EvaluacionProy = {
......@@ -244,32 +242,6 @@ export class AddCalificacionVinculacionComponent implements OnInit {
}
}
/*
onSubmit() {
if (this.myForm.valid) {
this.anexosImagenes.uzytavproyec_id = this.idRecuperado;
this.anexosImagenes.uzytavanexospr_fech_subida = this.myForm.value.fechaInicio
this.anexosImagenesService.guardarParametrosSeparados(this.file, this.anexosImagenes).subscribe(
response => {
this.openModal();
this.guardar()
this.datosCompartidos.actualizarDatos(this.anexosImagenes);
this.actualizarAnexosService.actualizarDatos(this.file);
},
error => {
console.log(error)
//this.router.navigate(['main/Convocatorias']);
}
);
}
}
*/
cambiar() {
this.cambio = true;
......@@ -289,7 +261,5 @@ export class AddCalificacionVinculacionComponent implements OnInit {
this.cambio = false;
this.myForm.disable();
this.dynamicForm.disable();
this.myForm.reset()
this.dynamicForm.reset()
}
}
......@@ -35,6 +35,7 @@ export class ObjetivosProvincialesComponent implements OnInit {
private ubicacionesS: UbicacionesService,
private mostrarOcultarService: MostrarOcultarService
) {
this.dataSource = new MatTableDataSource<ZonaDetalle>([]);
}
......@@ -92,13 +93,13 @@ export class ObjetivosProvincialesComponent implements OnInit {
obtenerParroquias() {
obtenerCantones() {
this.ubicacionesS.obtenerCant().subscribe(cant => {
this.cantones = cant;
});
}
obtenerCantones() {
obtenerParroquias() {
this.ubicacionesS.obtenerParro().subscribe(parro => {
this.parroquias = parro;
});
......@@ -129,12 +130,15 @@ export class ObjetivosProvincialesComponent implements OnInit {
}
getParroquiaNombre(parroquiaId: string): string {
const parroquia = this.parroquias.find(p => p.uzytparroquia_id === parroquiaId);
if (parroquia) {
const nombre = parroquia.uzytparroquia_nombre.toLowerCase();
return nombre.charAt(0).toUpperCase() + nombre.slice(1);
if(parroquiaId != null){
const parroquia = this.parroquias.find(p => p.uzytparroquia_id === parroquiaId);
if (parroquia) {
const nombre = parroquia.uzytparroquia_nombre.toLowerCase();
return nombre.charAt(0).toUpperCase() + nombre.slice(1);
}
return 'n/a';
}
return '';
return 'N/A';
}
eliminarParametro(id: number) {
......
......@@ -65,7 +65,8 @@ export class ObjetivosZonaComponent implements OnInit {
this.mostrarObjetivosZona = true
console.log("en el componente agregar se inicializa como : ", this.mostrarObjetivosZona)
this.obtenerProvincia(this.zonaDM.uzytprovincia_id);
this.obtenerCanton(this.zonaDM.uzytcanton_id)
this.obtenerCanton(this.zonaDM.uzytcanton_id);
this.obtenerParroquia(this.zonaDM.uzytparroquia_id);
this.initializeForm();
}
......
......@@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core';
import { FormBuilder, Validators, FormGroup } from '@angular/forms';
import { AnexosImagenes } from 'src/app/modules/main/Models/anexos-imagenes';
import { AnexosImagenesService } from 'src/app/modules/main/services/anexos-imagenes/anexos-imagenes.service';
import { ConvocatoriaService } from 'src/app/modules/main/services/convocatoria/convocatoria.service';
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';
......
......@@ -3,7 +3,7 @@
.form-row {
display: flex;
}
.form-column {
flex: 1;
margin: 0 10px;
......@@ -41,16 +41,62 @@
.example-radio-button {
margin: 5px;
}
.save-button {
display: flex;
justify-content: flex-end;
margin-bottom: 16px;
}
.form-column mat-form-field {
display: block;
margin-bottom: 16px;
width: 100%;
}
\ No newline at end of file
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
.modal-content {
background-color: white;
padding: 20px;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
max-width: 400px;
width: 100%;
text-align: center;
position: relative;
}
.success-icon {
font-size: 80px;
color: #006400;
margin-right: 1em;
}
.modal-content p {
margin-bottom: 20px;
}
.modal-content button {
background-color: #2196f3;
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
}
.modal-content button:hover {
background-color: #0c7cd5;
}
<div class="container">
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<mat-card>
<mat-card-header>
<div class="save-button">
<button mat-raised-button color="primary" *ngIf="!cambio" (click)="cambiar()">Editar</button>
<button mat-raised-button color="primary" *ngIf="!cambio"
(click)="cambiar()">Editar</button>
<button mat-raised-button color="primary" *ngIf="cambio">Guardar</button>
<span class="separator"></span>
<button mat-raised-button color="warn" *ngIf="cambio" (click)="cancelado()">Cancelar</button>
<button mat-raised-button color="warn" *ngIf="cambio"
(click)="cancelado()">Cancelar</button>
</div>
</mat-card-header>
......@@ -16,9 +20,12 @@
<h3>Tipo Directos</h3>
<mat-form-field>
<mat-label>Hombres</mat-label>
<input matInput type="number" placeholder="Hombres" formControlName="HombresD" required
(change)="calcularTotal()" min="0" (change)="calcularTotal()" min="0" pattern="[0-9]+">
<mat-error *ngIf="myForm.get('HombresD').invalid && (myForm.get('HombresD').dirty
<input matInput type="number" placeholder="Hombres"
formControlName="HombresD" required
(change)="calcularTotal()" min="0" (change)="calcularTotal()"
min="0" pattern="[0-9]+">
<mat-error
*ngIf="myForm.get('HombresD').invalid && (myForm.get('HombresD').dirty
|| myForm.get('HombresD').touched)">
Por favor, ingrese la cantidad de hombres directos.
</mat-error>
......@@ -26,20 +33,24 @@
<mat-form-field>
<mat-label>Mujeres</mat-label>
<input matInput type="number" placeholder="Mujeres" formControlName="MujeresD" required
(change)="calcularTotal()" min="0" (change)="calcularTotal()" min="0" pattern="[0-9]+">
<mat-error *ngIf="myForm.get('MujeresD').invalid && (myForm.get('MujeresD').dirty
<input matInput type="number" placeholder="Mujeres"
formControlName="MujeresD" required
(change)="calcularTotal()" min="0" (change)="calcularTotal()"
min="0" pattern="[0-9]+">
<mat-error
*ngIf="myForm.get('MujeresD').invalid && (myForm.get('MujeresD').dirty
|| myForm.get('MujeresD').touched)">
Por favor, ingrese la cantidad de Mujeres directas.
</mat-error>
</mat-form-field>
<mat-form-field>
<mat-label>Niños</mat-label>
<input matInput type="number" formControlName="Niños" formControlName="ninosD" required
<input matInput type="number" formControlName="Niños"
formControlName="ninosD" required
(change)="calcularTotal()" min="0" pattern="[0-9]+">
<mat-error *ngIf="myForm.get('ninosD').invalid && (myForm.get('ninosD').dirty
<mat-error
*ngIf="myForm.get('ninosD').invalid && (myForm.get('ninosD').dirty
|| myForm.get('ninosD').touched)">
Por favor, ingrese la cantidad de Niños directos.
</mat-error>
......@@ -47,32 +58,38 @@
<mat-form-field>
<mat-label>Personas con Capacidades Especiales</mat-label>
<input matInput type="number" formControlName="Personas con Capacidades Especiales"
formControlName="PersonasD" required (change)="calcularTotal()" min="0" pattern="[0-9]+">
<mat-error *ngIf="myForm.get('PersonasD').invalid && (myForm.get('PersonasD').dirty
<input matInput type="number"
formControlName="Personas con Capacidades Especiales"
formControlName="PersonasD" required (change)="calcularTotal()"
min="0" pattern="[0-9]+">
<mat-error
*ngIf="myForm.get('PersonasD').invalid && (myForm.get('PersonasD').dirty
|| myForm.get('PersonasD').touched)">
Por favor, ingrese la cantidad de Personas con Capacidades Especiales directas.
Por favor, ingrese la cantidad de Personas con Capacidades
Especiales directas.
</mat-error>
</mat-form-field>
<mat-form-field>
<mat-label>Total Directos</mat-label>
<input matInput type="number" class="deshabilitado" formControlName="Total Directos"
formControlName="TotalD" required
(change)="calcularTotal()" min="0" pattern="[0-9]+" [value]="totalDirectos">
<input matInput type="number" class="deshabilitado"
formControlName="Total Directos"
formControlName="TotalD" required
(change)="calcularTotal()" min="0" pattern="[0-9]+"
[value]="totalDirectos">
</mat-form-field>
</div>
<div>
<h3>Tipo Indirectos</h3>
<mat-form-field>
<mat-label>Hombres</mat-label>
<input matInput type="number" placeholder="Hombres" formControlName="HombresI" required
<input matInput type="number" placeholder="Hombres"
formControlName="HombresI" required
(change)="calcularTotal()" min="0" pattern="[0-9]+">
<mat-error *ngIf="myForm.get('HombresI').invalid && (myForm.get('HombresI').dirty
<mat-error
*ngIf="myForm.get('HombresI').invalid && (myForm.get('HombresI').dirty
|| myForm.get('HombresI').touched)">
Por favor, ingrese la cantidad de hombres indirectos.
</mat-error>
......@@ -80,20 +97,23 @@
<mat-form-field>
<mat-label>Mujeres</mat-label>
<input matInput type="number" placeholder="Mujeres" formControlName="MujeresI" required
<input matInput type="number" placeholder="Mujeres"
formControlName="MujeresI" required
(change)="calcularTotal()" min="0" pattern="[0-9]+">
<mat-error *ngIf="myForm.get('MujeresI').invalid && (myForm.get('MujeresI').dirty
<mat-error
*ngIf="myForm.get('MujeresI').invalid && (myForm.get('MujeresI').dirty
|| myForm.get('MujeresI').touched)">
Por favor, ingrese la cantidad de Mujeres indirectas.
</mat-error>
</mat-form-field>
<mat-form-field>
<mat-label>Niños</mat-label>
<input matInput type="number" formControlName="Niños" formControlName="ninosI" required
<input matInput type="number" formControlName="Niños"
formControlName="ninosI" required
(change)="calcularTotal()" min="0" pattern="[0-9]+">
<mat-error *ngIf="myForm.get('ninosI').invalid && (myForm.get('ninosI').dirty
<mat-error
*ngIf="myForm.get('ninosI').invalid && (myForm.get('ninosI').dirty
|| myForm.get('ninosI').touched)">
Por favor, ingrese la cantidad de Niños directos.
</mat-error>
......@@ -101,22 +121,29 @@
<mat-form-field>
<mat-label>Personas con Capacidades Especiales</mat-label>
<input matInput type="number" formControlName="Personas con Capacidades Especiales"
formControlName="PersonasI" required (change)="calcularTotal()" min="0" pattern="[0-9]+">
<mat-error *ngIf="myForm.get('PersonasI').invalid && (myForm.get('PersonasI').dirty
<input matInput type="number"
formControlName="Personas con Capacidades Especiales"
formControlName="PersonasI" required (change)="calcularTotal()"
min="0" pattern="[0-9]+">
<mat-error
*ngIf="myForm.get('PersonasI').invalid && (myForm.get('PersonasI').dirty
|| myForm.get('PersonasI').touched)">
Por favor, ingrese la cantidad de Personas con Capacidades Especiales Indirectas.
Por favor, ingrese la cantidad de Personas con Capacidades
Especiales Indirectas.
</mat-error>
</mat-form-field>
<mat-form-field>
<mat-label>Total Indirectos</mat-label>
<input matInput class="deshabilitado" type="number" formControlName="Total Indirectos" formControlName="TotalI" required
(change)="calcularTotal()" min="0" pattern="[0-9]+" [value]="totalIndirectos">
<input matInput class="deshabilitado" type="number"
formControlName="Total Indirectos" formControlName="TotalI"
required
(change)="calcularTotal()" min="0" pattern="[0-9]+"
[value]="totalIndirectos">
</mat-form-field>
</div>
</mat-card-content>
</mat-card>
</form>
</div>
\ No newline at end of file
</div>
import { Component, OnInit } from '@angular/core';
import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute } from '@angular/router';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
......@@ -16,6 +17,7 @@ import { PoblacionProyectoService } from 'src/app/modules/main/services/poblacio
import { ProgramaService } from 'src/app/modules/main/services/programa/programa.service';
import { ProyectosService } from 'src/app/modules/main/services/proyectos/proyectos.service';
import { UsuariosService } from 'src/app/modules/main/services/usuarios/usuarios.service';
import { EnvioFormularioComponent } from '../../../../programa/opciones/envio-formulario/envio-formulario.component';
@Component({
selector: 'app-add-identificacion-poblacion',
......@@ -26,18 +28,21 @@ export class AddIdentificacionPoblacionComponent implements OnInit {
myForm: FormGroup;
proyecto: Proyectos;
formularioEnviado:boolean;
cambio: boolean;
public idRecuperado;
usuario: Usuario;
totalDirectos: number;
totalIndirectos: number;
mensajeNoDatos: string = '';
@ViewChild('modalNoDatos') modalNoDatosTemplate!: TemplateRef<any>;
constructor(
private formBuilder: FormBuilder,
private ID_compartido: Compartir_idService,
private proyectosService: ProyectosService,
private mostrarOcultarService: MostrarOcultarService,
private dialog: MatDialog
) {
this.proyecto = new Proyectos();
}
......@@ -126,6 +131,7 @@ export class AddIdentificacionPoblacionComponent implements OnInit {
this.proyectosService.modificarParametros(this.proyecto.uzytavproyec_id, this.proyecto).subscribe(response => {
console.log('Datos Actualizados', this.proyecto);
this.myForm.disable();
this.openModal();
this.cambio = false;
//his.openModal();
//this.guardarFormulario = true;
......@@ -136,5 +142,15 @@ export class AddIdentificacionPoblacionComponent implements OnInit {
}
}
openModal() {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
width: '400px',
disableClose: true
});
dialogRef.afterClosed().subscribe(result => {
console.log('La ventana modal se ha cerrado');
this.formularioEnviado = true;
});
}
}
......@@ -34,6 +34,7 @@
<mat-form-field class="form-field">
<mat-label>Observación</mat-label>
<input matInput formControlName="observa">
<mat-error *ngIf="myForm.get('observa').hasError('required') && myForm.get('observa').touched">Esta Campo es requerido</mat-error>
</mat-form-field>
<!--seccion de la tabla-->
......@@ -66,7 +67,7 @@
<ng-container matColumnDef="resultado">
<th mat-header-cell *matHeaderCellDef> Resultado </th>
<td mat-cell *matCellDef="let actividad">
<input matInput [formControlName]="'resultado' + actividad.uzytavobjetivo_programa_id"
<input matInput type="number" [formControlName]="'resultado' + actividad.uzytavobjetivo_programa_id"
placeholder="Resultado">
</td>
</ng-container>
......@@ -74,14 +75,14 @@
<ng-container matColumnDef="avance">
<th mat-header-cell *matHeaderCellDef> Avance </th>
<td mat-cell *matCellDef="let actividad">
<input matInput [formControlName]="'porcentaje' + actividad.uzytavobjetivo_programa_id" placeholder="Avance">
<input matInput type="number" [formControlName]="'porcentaje' + actividad.uzytavobjetivo_programa_id" placeholder="Avance">
</td>
</ng-container>
<ng-container matColumnDef="observacion">
<th mat-header-cell *matHeaderCellDef> Observación </th>
<td mat-cell *matCellDef="let actividad">
<input matInput [formControlName]="'observacion' + actividad.uzytavobjetivo_programa_id"
<input matInput type="number" [formControlName]="'observacion' + actividad.uzytavobjetivo_programa_id"
placeholder="Observación">
</td>
</ng-container>
......
......@@ -97,10 +97,10 @@ export class AddInformeComponent implements OnInit {
);
});
// Filtrar los registros de objetivoprograma excluyendo aquellos que ya están en actproy
/*// Filtrar los registros de objetivoprograma excluyendo aquellos que ya están en actproy
this.objetivosE = this.objetivosE.filter(objetivo =>
!this.cabecera.some(act => act.uzytavobjetivo_programa_id === objetivo.uzytavobjetivo_programa_id)
);
);*/
});
......
<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" [disabled]="myForm.invalid">Guardar</button>
<span class="separator"></span>
<button mat-raised-button class="botones" color="warn" (click)="cancelado()">Cancelar</button>
</div>
<mat-form-field class="form-field">
<mat-label>Fecha (dd/mm/aa)</mat-label>
<input matInput [matDatepicker]="picker" formControlName="fecha">
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker></mat-datepicker>
</mat-form-field>
<div class="input-container">
<mat-form-field class="example-full-width">
<mat-label>Observaciones</mat-label>
<input matInput placeholder="Ingresar el valor ejecutado durante el desarrollo del Proyecto" formControlName="observacion">
<mat-error *ngIf="myForm.get('observacion').hasError('required') && myForm.get('observacion').touched">Esta Campo es requerido</mat-error>
</mat-form-field>
</div>
</div>
</form>
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { MatDialog } from '@angular/material/dialog';
import { actproy } from 'src/app/modules/main/Models/actproy';
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 { 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 { EnvioFormularioComponent } from '../../../../programa/opciones/envio-formulario/envio-formulario.component';
@Component({
selector: 'vex-edit-informe',
......@@ -7,21 +14,62 @@ import { FormBuilder, FormGroup } from '@angular/forms';
styleUrls: ['./edit-informe.component.css']
})
export class EditInformeComponent implements OnInit {
idRecuperado: number;
myForm: FormGroup;
formularioEnviado: boolean;
cabe: actproy;
idRecuperado: number;
mostrarObje: boolean = false;
constructor(
private formBuilder: FormBuilder
private formBuilder: FormBuilder,
private dialog: MatDialog,
private idCompartido: Compartir_idService,
private informeS: Informes_avanceService,
private mostrarOcultarSerivce: MostrarOcultarService,
private datosCompartidos: Actualiza_datosService,
private cabeM: actproy
) {
this.myForm = this.formBuilder.group({
fecha: [''],
observacion: [''],
});
}
ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10);
this.cabe = this.mostrarOcultarSerivce.editCabecera;
this.idRecuperado = this.idCompartido.getCabe();
this.initializeForm();
this.mostrarObje = true;
}
initializeForm(){
this.myForm = this.formBuilder.group({
fecha: [{ value: this.cabe.uzytavactproy_fech_regis, disabled: true}, Validators.required],
observacion: [{ value: this.cabe.uzytavactproy_observa, disabled: false}, Validators.required],
});
}
onSubmit(){
if(this.myForm.valid){
this.cabeM.uzytavactproy_observa = this.myForm.get('observacion').value;
this.informeS.modificarParametrosCabecera(this.cabeM.uzytavactproy_id, this.cabeM).subscribe(response => {
this.openModal();
this.idCompartido.ocultarFormulario3();
this.datosCompartidos.actualizarDatos(this.cabeM);
});
}
}
cancelado(){
this.idCompartido.ocultarFormulario3();
this.mostrarObje = false;
this.myForm.enable();
this.myForm.reset();
}
openModal() {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
disableClose: true
});
dialogRef.afterClosed().subscribe(result => {
this.formularioEnviado = true;
});
}
}
......@@ -35,12 +35,12 @@
<td>{{item.uzytavactproy_observa}}</td>
<td>
<button>
<mat-icon color="primary"
(click)="editarCabecera(item.uzytavactproy_id)">edit</mat-icon>
<mat-icon color="warn"
(click)="eliminarHeader(item.uzytavactproy_id)">delete</mat-icon>
</button>
<button>
<mat-icon color="warn"
(click)="eliminar(item.uzytavactproy_id)">delete</mat-icon>
<mat-icon color="azul"
(click)="editarCabecera(item.uzytavactproy_id)">edit</mat-icon>
</button>
</td>
</tr>
......@@ -58,7 +58,6 @@
<th class="Column1 negrita">Porcentaje</th>
<th class="Column1 negrita">Observación</th>
<th class="Column1 negrita">Resultados</th>
<th class="Column1 negrita">Editar</th>
</tr>
</thead>
<tbody>
......@@ -70,12 +69,6 @@
<td>{{acti.uzytavdetactproyporcent}}</td>
<td>{{acti.uzytavdetactproyobserva}}</td>
<td>{{acti.uzytavdetactproyresultado}}</td>
<td>
<button>
<mat-icon color="primary"
(click)="editarBody(acti.uzytavdetactproy_id)">edit</mat-icon>
</button>
</td>
</ng-container>
</tr>
</tbody>
......
......@@ -98,11 +98,11 @@ export class ListInformeComponent implements OnInit {
}
editarBody(id: number){
this.idCompartido.mostrarFormulario5();
this.idCompartido.mostrarFormulario4();
const registroSeleccionado = this.body.find(
item => item.uzytavdetactproy_id === id
);
this.idCompartido.setCabe(id);
this.idCompartido.setBody(id);
this.mostrarOcultarService.editBody = registroSeleccionado;
}
......@@ -112,6 +112,21 @@ 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');
}
);
}
}
formatFecha(fecha: Date): string {
const dateObj = new Date(fecha);
......
/* Estilos para el formulario */
.formulario {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
max-width: 96%;
margin: 0 auto;
background-color: white;
padding: 20px;
border-radius: 10px;
}
/* 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: 1%;
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 {
margin-top: 30px;
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;
}
.buscar {
cursor: pointer;
}
.input-container {
width: 100%;
display: flex;
flex-direction: column;
margin-bottom: 16px;
}
<link
href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap"
rel="stylesheet" />
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet" />
<div class="contenedor">
<div class="contedor-dos">
<ng-template #modalNoDatos let-modal>
<div class="modal-container">
<h2>Información</h2>
<p>{{ mensajeNoDatos }}</p>
<button mat-button (click)="cerrarModalNoDatos()">Cerrar</button>
</div>
</ng-template>
<form class="formulario" [formGroup]="myForm" (ngSubmit)="onSubmit()">
<div class="input-container">
<mat-form-field>
<mat-label>Nombre:</mat-label>
<mat-select formControlName="nombreI"
placeholder="Nombre del Proyecto"
(selectionChange)="onUsuario($event.value)">
<mat-option *ngFor="let item2 of usuario" [value]="item2.uzytusuario_id">{{
item2.uzytusuario_apellidos+ ', '+item2.uzytusuario_nombres}}</mat-option>
</mat-select>
</mat-form-field>
</div>
<div class="input-container">
<mat-form-field class="example-full-width">
<mat-label>Nombre:</mat-label>
<input matInput formControlName="nombre" required>
</mat-form-field>
</div>
<div class="input-container">
<mat-form-field class="example-full-width">
<mat-label>Apellido:</mat-label>
<input matInput formControlName="apellido" required>
</mat-form-field>
</div>
<button mat-raised-button color="primary" [disabled]="myForm.invalid">Guardar</button>
</form>
</div>
</div>
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DesignarEvaluadorComponent } from './designar-evaluador.component';
describe('DesignarEvaluadorComponent', () => {
let component: DesignarEvaluadorComponent;
let fixture: ComponentFixture<DesignarEvaluadorComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ DesignarEvaluadorComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(DesignarEvaluadorComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { MatDialog } from '@angular/material/dialog';
import { Perfil } from 'src/app/modules/main/Models/perfil';
import { PerfilUsuario } from 'src/app/modules/main/Models/perfil_usuario';
import { Usuario } from 'src/app/modules/main/Models/usuario';
import { PerfilUsuarioService } from 'src/app/modules/main/services/PerfilUsuario/perfil-usuario.service';
import { PerfilService } from 'src/app/modules/main/services/perfiles/perfil.service';
import { UsuariosService } from 'src/app/modules/main/services/usuarios/usuarios.service';
@Component({
selector: 'vex-designar-evaluador',
templateUrl: './designar-evaluador.component.html',
styleUrls: ['./designar-evaluador.component.css']
})
export class DesignarEvaluadorComponent implements OnInit {
usuario: Usuario[] = [];
myForm: FormGroup;
mensajeNoDatos: string = '';
searchTerm: string;
userData: any;
mostrarModalNoDatos: boolean = false;
@ViewChild('modalNoDatos') modalNoDatosTemplate!: TemplateRef<any>;
constructor(
private formBuilder: FormBuilder,
private dialog: MatDialog,
private usuarioS: UsuariosService,
private perfilS: PerfilService,
private perfilUserS: PerfilUsuarioService
) {
}
ngOnInit(): void {
this.obtenerDatos();
this.myForm = this.formBuilder.group({
nombreI: ['', Validators.required],
nombre: [{ value: '', disabled: true }, Validators.required],
apellido: [{ value: '', disabled: true }, Validators.required],
});
}
onSubmit() {
}
obtenerDatos() {
this.usuarioS.obtenerParametros().subscribe(data => {
this.usuario = data;
});
}
onUsuario(selectedUserID: number) {
const selectedUser = this.usuario.find(item => item.uzytusuario_id === selectedUserID);
if(selectedUser){
this.myForm.get('nombre')?.setValue(selectedUser.uzytusuario_nombres);
this.myForm.get('apellido')?.setValue(selectedUser.uzytusuario_apellidos);
}
}
abrirModalNoDatos(mensaje: string) {
this.mensajeNoDatos = mensaje;
this.dialog.open(this.modalNoDatosTemplate);
}
cerrarModalNoDatos() {
this.dialog.closeAll();
}
}
/* 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;
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>
<span class="separator"></span>
<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" [matAutocomplete]="autocomplete" formControlName="nombres"
placeholder="Realizar búsqueda" />
</mat-form-field>
<mat-autocomplete *ngIf="usuarios" autoActiveFirstOption #auto="matAutocomplete">
<mat-option *ngFor="let usuario of filteredOptions | async" [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>
<mat-select formControlName="funcion">
<mat-option *ngFor="let option of tipres" [value]="option.uzytavtipres_id">
{{ option.uzytavtipres_descrip }}
</mat-option>
</mat-select>
</mat-form-field>
</div>
<div class="input-container">
<mat-form-field class="contenedor-dos">
<mat-label>Número de horas planificadas:</mat-label>
<input matInput formControlName="numero" required pattern="[0-9]+">
<mat-error *ngIf="myForm.get('numero').invalid && (myForm.get('numero').dirty ||
myForm.get('numero').touched)">
Por favor, ingrese un Número de horas planificadas.
</mat-error>
</mat-form-field>
</div>
</div>
</form>
</div>
\ No newline at end of file
/* tslint:disable:no-unused-variable */
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { AsignacionDocentesComponent } from './asignacion-docentes.component';
describe('AsignacionDocentesComponent', () => {
let component: AsignacionDocentesComponent;
let fixture: ComponentFixture<AsignacionDocentesComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AsignacionDocentesComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AsignacionDocentesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, 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';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
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 { 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;
idRecuperado: number;
myForm: FormGroup;
docenteParticipante: DocenteParticipante;
responsableProg: ResponsableProg;
selectedDepartamentoId: number;
selectedCampusId: number;
searchTerm: string;
debounceTimeout: any;
tipres!: TiPres []
selectedUsuario: Usuario;
idUsuario: number
filteredOptions: Observable<Usuario[]>;
myControl = new FormControl('');
usuarios: Usuario[];
enviarSolicitud = false;
formularioEnviado: boolean
cambio: boolean;
campus: any;
departamento: any;
constructor(
private formBuilder: FormBuilder,
private docentesParticipantesService: DocentesParticipantesService,
private responsableProgService: ResponsableProgService,
private dialog: MatDialog,
private datosCompartidos: Actualiza_datosService,
private idCompartido: Compartir_idService,
private datosEspeService: DatosEspeService,
private tipresService: TipresService,
private usuariosService: UsuariosService
) {
this.docenteParticipante = new DocenteParticipante()
this.responsableProg = new ResponsableProg()
}
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.myForm = this.formBuilder.group({
numero: [{ value: '', disabled: true }, Validators.required],
funcion: [{ value: '', disabled: true }, Validators.required],
//nombres: [{ 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() {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
disableClose: true
});
dialogRef.afterClosed().subscribe(result => {
this.formularioEnviado = true;
});
}
realizarBusqueda() {
clearTimeout(this.debounceTimeout);
this.debounceTimeout = setTimeout(() => {
this.usuariosService.obtenerParametros().subscribe(data => {
this.usuarios = data;
console.log(this.usuarios)
});
}, 300);
}
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
// Cierra el componente de autocompletar manualmente usando el trigger
if (this.autocompleteTrigger) {
this.autocompleteTrigger.closePanel();
}
} else {
console.log("no existe el usuario");
}
}
onSubmit() {
if (this.myForm.valid && this.myControl.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();
this.guardar()
this.datosCompartidos.actualizarDatos(this.responsableProg);
},
error => {
console.log(error)
//this.router.navigate(['main/Convocatorias']);
}
);
}
}
obtenerCampus() {
this.datosEspeService.obtenerCampus().subscribe(
campus => {
this.campus = campus;
},
error => {
console.log('Error al obtener los campus:', error);
}
);
}
obtenerFuncion() {
console.log("obtenido llega")
this.tipresService.obtenerParametros().subscribe(
tipres => {
this.tipres = tipres.filter(item => item.uzytavtipres_id === 1 || item.uzytavtipres_id === 2);
console.log("obtenido ",tipres)
},
error => {
console.log('Error al obtener los tipresService:', error);
}
);
}
obtenerDepartamento() {
this.datosEspeService.obtenerDepartamentos().subscribe(
departamento => {
this.departamento = departamento;
},
error => {
console.log('Error al obtener los departamento:', error);
}
);
}
cambiar() {
this.cambio = true;
this.myForm.enable();
}
cancelado() {
this.cambio = false;
this.myForm.disable();
this.myForm.reset()
this.myControl.reset()
}
guardar() {
this.cambio = false;
this.myForm.disable();
this.myForm.reset()
this.myControl.disable();
this.myControl.reset()
}
}
.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;
}
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 {
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
<div class="container">
<div class="mat-elevation-z8">
<table mat-table [dataSource]="dataSource" matSort>
<!-- Nro Column -->
<ng-container matColumnDef="Nro" class="Column1">
<th class="Column1 negrita" mat-header-cell *matHeaderCellDef mat-sort-header> Nro </th>
<td class="Column1" mat-cell *matCellDef="let i = index"> {{ i+1 }}
</td>
</ng-container>
<!-- Dirección Column -->
<ng-container matColumnDef="Campus" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>Campus</th>
<td class="Column" mat-cell *matCellDef="let dato">
{{dato.campus$ | async }} </td>
</ng-container>
<ng-container matColumnDef="Departamento" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>Departamento</th>
<td class="Column" mat-cell *matCellDef="let dato">
{{ dato.departamento$ | async }}
</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>
<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>
</button>
</td>
</ng-container>
<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
/* tslint:disable:no-unused-variable */
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { ListarDocentesAsignadosComponent } from './listar-docentes-asignados.component';
describe('ListarDocentesAsignadosComponent', () => {
let component: ListarDocentesAsignadosComponent;
let fixture: ComponentFixture<ListarDocentesAsignadosComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ListarDocentesAsignadosComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ListarDocentesAsignadosComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MatTableDataSource } from '@angular/material/table';
import { Observable, 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 { 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';
@Component({
selector: 'app-listar-docentes-asignados',
templateUrl: './listar-docentes-asignados.component.html',
styleUrls: ['./listar-docentes-asignados.component.css']
})
export class ListarDocentesAsignadosComponent implements OnInit {
idRecuperado: number;
dataSource: MatTableDataSource<DocenteParticipante>;
docenteParticipante: DocenteParticipante[] = [];
programas: Programa[]; // Arreglo de programas obtenidos del servicio
selectedProgramaId: number;
displayedColumns: string[] = ['Nro','Campus','Departamento','Docentes Participantes', 'Acciones'];
totalDocentesParticipantes: number = 0; //total de participantes
constructor(
private idCompartido: Compartir_idService,
private datosCompar: Actualiza_datosService,
private docentesParticipantesService: DocentesParticipantesService,
private datosEspeService: DatosEspeService
) {
this.dataSource = new MatTableDataSource<DocenteParticipante>([]);
}
ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10);
this.datosCompar.datos$.subscribe(() => {
this.obtenerRegistros();
});
this.docentesParticipantesService.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.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;
}
}
obtenerDatosCampus(codigo: string): Observable<string> {
return this.datosEspeService.obtenerCampus().pipe(
map(campus => {
const campusEncontrado = campus.find(c => c.codigo === codigo);
return campusEncontrado ? campusEncontrado.descripcion : 'No encontrado';
})
);
}
obtenerDatosDepartamento(codigo: string): Observable<string> {
return this.datosEspeService.obtenerDepartamentos().pipe(
map(departamentos => {
const departamentoEncontrado = departamentos.find(c => c.subj === codigo);
return departamentoEncontrado ? departamentoEncontrado.descripcion : 'No encontrado';
})
);
}
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)
}
);
}
}
}
/* tslint:disable:no-unused-variable */
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { AsignacionEstudiantesComponent } from './asignacion-estudiantes.component';
describe('AsignacionEstudiantesComponent', () => {
let component: AsignacionEstudiantesComponent;
let fixture: ComponentFixture<AsignacionEstudiantesComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AsignacionEstudiantesComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AsignacionEstudiantesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-asignacion-estudiantes',
templateUrl: './asignacion-estudiantes.component.html',
styleUrls: ['./asignacion-estudiantes.component.css']
})
export class AsignacionEstudiantesComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
/* tslint:disable:no-unused-variable */
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { ListarEstudiantesAsignadosComponent } from './listar-estudiantes-asignados.component';
describe('ListarEstudiantesAsignadosComponent', () => {
let component: ListarEstudiantesAsignadosComponent;
let fixture: ComponentFixture<ListarEstudiantesAsignadosComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ListarEstudiantesAsignadosComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ListarEstudiantesAsignadosComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-listar-estudiantes-asignados',
templateUrl: './listar-estudiantes-asignados.component.html',
styleUrls: ['./listar-estudiantes-asignados.component.css']
})
export class ListarEstudiantesAsignadosComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
......@@ -497,7 +497,8 @@
1.- Asignación de Docentes
</mat-panel-title>
</mat-expansion-panel-header>
<app-asignacion-docentes></app-asignacion-docentes>
<app-listar-docentes-asignados></app-listar-docentes-asignados>
<!--fin-->
</mat-expansion-panel>
......@@ -685,6 +686,59 @@
</mat-expansion-panel>
<!--evaluación-->
<mat-expansion-panel hideToggle>
<mat-expansion-panel-header>
<mat-panel-title>
<strong>Evaluación</strong>
</mat-panel-title>
</mat-expansion-panel-header>
<!--Resultados del proyecto-->
<mat-expansion-panel (opened)="contraccion = true"
(closed)="contraccion = false">
<mat-expansion-panel-header>
<mat-panel-title>
<mat-icon
[ngClass]="{'expanded': contraccion, 'collapsed': !contraccion}">keyboard_arrow_right</mat-icon>
1.- Designar Evaluador Final
</mat-panel-title>
</mat-expansion-panel-header>
<vex-designar-evaluador></vex-designar-evaluador>
<!--fin-->
</mat-expansion-panel>
<!--Resultados del proyecto-->
<mat-expansion-panel (opened)="contraccion = true"
(closed)="contraccion = false">
<mat-expansion-panel-header>
<mat-panel-title>
<mat-icon
[ngClass]="{'expanded': contraccion, 'collapsed': !contraccion}">keyboard_arrow_right</mat-icon>
2.- Evaluación Final
</mat-panel-title>
</mat-expansion-panel-header>
<vex-list-objetivos-ejec></vex-list-objetivos-ejec>
<!--fin-->
</mat-expansion-panel>
<!--Resultados del proyecto-->
<mat-expansion-panel (opened)="contraccion = true"
(closed)="contraccion = false">
<mat-expansion-panel-header>
<mat-panel-title>
<mat-icon
[ngClass]="{'expanded': contraccion, 'collapsed': !contraccion}">keyboard_arrow_right</mat-icon>
3.- Finalizar Proceso de Evaluación
</mat-panel-title>
</mat-expansion-panel-header>
<!--fin-->
</mat-expansion-panel>
</mat-expansion-panel>
</mat-accordion>
</div>
......
......@@ -70,13 +70,6 @@
</div>
<div class="input-container">
<label>Archivo PDF:</label>
<a *ngIf="convocatoria.uzytavconvoca_digital_nombre"
[href]="pdfUrl" target="_blank">{{ convocatoria.uzytavconvoca_digital_nombre }}</a>
</div>
<!-- Control de PDF -->
<div class="input-container">
<label>Archivo PDF</label>
......
......@@ -7,6 +7,8 @@ import { Router, ActivatedRoute } from '@angular/router';
import { Convocatoria } from '../../../Models/convocatoria';
import { MostrarOcultarService } from '../../../services/mostrar-ocultar.service';
import { validateBasis } from '@angular/flex-layout';
import { saveAs } from 'file-saver';
@Component({
selector: 'vex-convocatorias-editar',
templateUrl: './convocatorias-editar.component.html',
......@@ -66,8 +68,8 @@ export class ConvocatoriasEditarComponent implements OnInit {
initializeForm() {
this.pdfUrl = this.ConvocatoriaService.getPdfUrl(this.convocatoria.uzytavconvoca_id_file,
this.convocatoria.uzytavconvoca_digital_nombre);
this.convocatoria.uzytavconvoca_digital_nombre);
this.myForm = this.formBuilder.group({
nombre: [this.convocatoria.uzytavconvoca_nombre || '', Validators.required],
descripcion: [
......@@ -86,59 +88,42 @@ export class ConvocatoriasEditarComponent implements OnInit {
archivo: ['']
});
}
verPDF(id: string, nombre: string) {
this.ConvocatoriaService.verPDF(id, nombre).subscribe(
(response: any) => {
if (response) {
const contentDispositionHeader = response.headers.get('content-disposition');
const filename = this.getFilenameFromResponse(contentDispositionHeader);
const blob = new Blob([response.body], { type: 'application/pdf' });
saveAs(blob, nombre);
} else {
console.error('No se pudieron obtener las cabeceras de la respuesta.');
}
},
error => {
console.error('Error al obtener el PDF:', error);
}
);
}
getFilenameFromResponse(contentDispositionHeader: string | null): string {
if (contentDispositionHeader) {
const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDispositionHeader);
if (matches != null && matches[1]) {
return matches[1].replace(/['"]/g, '');
}
}
return 'document.pdf'; // Nombre predeterminado si no se puede obtener el nombre del archivo
}
onSubmit() {
async onSubmit() {
this.verificarCheckbox();
if (this.myForm.valid && !this.enviarSolicitud) {
this.enviarSolicitud = true;
const formData = new FormData();
if (this.file) {
formData.append('uzytavconvoca_digital', this.file);
}
formData.append('uzytavconvoca_estado', this.checkboxValue);
formData.append('uzytavconvoca_nombre', this.myForm.value.nombre);
formData.append('uzytavconvoca_observacion', this.myForm.value.descripcion);
formData.append('uzytavconvoca_fecha_inicio', this.myForm.value.fechaInicio);
formData.append('uzytavconvoca_fecha_fin', this.myForm.value.fechaFin);
this.convocatoriaService.modificarConvocatoria(this.convocatoria.uzytavconvoca_id, formData).subscribe(
response => {
this.convocatoria.uzytavconvoca_estado = this.checkboxValue;
this.convocatoria.uzytavconvoca_nombre = this.myForm.value.nombre;
this.convocatoria.uzytavconvoca_observacion = this.myForm.value.descripcion;
this.convocatoria.uzytavconvoca_fecha_inicio = this.myForm.value.fechaInicio;
this.convocatoria.uzytavconvoca_fecha_fin = this.myForm.value.fechaFin;
this.convocatoriaService.modificarConvocatoria(this.convocatoria.uzytavconvoca_id, this.convocatoria).subscribe(
async response => {
if (this.myForm.get('archivo').value) {
const pdfData = await this.enviarPDF();
this.convocatoria.uzytavconvoca_id_file = pdfData.idPDF;
this.convocatoria.uzytavconvoca_digital_nombre = pdfData.filename;
this.convocatoriaService.modificarConvocatoria(this.convocatoria.uzytavconvoca_id, this.convocatoria).subscribe(
response => {
}, error => {
alert("el archivo con este nombre ya se ha subido anteriormente")
}
);
}
this.router.navigate(['main/Convocatorias']);
},
error => {
this.router.navigate(['main/Convocatorias']);
console.log("error al agregar convocatoria")
}
);
}
......@@ -146,13 +131,29 @@ export class ConvocatoriasEditarComponent implements OnInit {
onFileChange(event: any) {
// Obtener el archivo seleccionado
const fileList: FileList = event.target.files;
if (fileList.length > 0) {
this.file = fileList[0];
}
}
async enviarPDF() {
const formData = new FormData();
formData.append('files', this.file);
formData.append('sistema', 'vinculacion');
try {
const response = await this.convocatoriaService.saveDocument(formData);
return {
idPDF: response.uuid,
filename: response.fileName
};
} catch (error) {
console.error('Error al guardar el PDF en el servidor:', error);
throw error;
}
}
volver() {
this.router.navigate(['main/Convocatorias']);
}
......@@ -168,7 +169,4 @@ export class ConvocatoriasEditarComponent implements OnInit {
return null;
}
}
function saveAs(blob: Blob, nombre: string) {
throw new Error('Function not implemented.');
}
......@@ -47,9 +47,7 @@ export class ConvocatoriasListarComponent implements OnInit {
private httpClient: HttpClient,
public mostrarOcultarService: MostrarOcultarService
) {
this.dataSource = new MatTableDataSource<Convocatoria>([]);
}
ngOnInit(): void {
......
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
.modal-content {
background-color: white;
padding: 20px;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
max-width: 400px;
width: 100%;
text-align: center;
position: relative;
}
.success-icon {
font-size: 80px;
color: #006400;
margin-right: 1em;
}
.modal-content p {
margin-bottom: 20px;
}
.modal-content button {
background-color: #2196f3;
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
}
.modal-content button:hover {
background-color: #0c7cd5;
}
\ No newline at end of file
<div class="modal">
<div class="modal-content">
<p>
Usted no tiene acceso a esa ruta</p>
<button mat-button (click)="closeModal()">Cerrar</button>
</div>
</div>
/* tslint:disable:no-unused-variable */
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { AccesoDenegadoComponent } from './AccesoDenegado.component';
describe('AccesoDenegadoComponent', () => {
let component: AccesoDenegadoComponent;
let fixture: ComponentFixture<AccesoDenegadoComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AccesoDenegadoComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AccesoDenegadoComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MatDialogRef } from '@angular/material/dialog';
@Component({
selector: 'app-AccesoDenegado',
templateUrl: './AccesoDenegado.component.html',
styleUrls: ['./AccesoDenegado.component.css']
})
export class AccesoDenegadoComponent implements OnInit {
constructor(private dialogRef: MatDialogRef<AccesoDenegadoComponent>) { }
ngOnInit(): void {
}
closeModal() {
this.dialogRef.close();
}
}
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
.modal-content {
background-color: white;
padding: 20px;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
max-width: 400px;
width: 100%;
text-align: center;
position: relative;
}
.success-icon {
font-size: 80px;
color: #006400;
margin-right: 1em;
}
.modal-content p {
margin-bottom: 20px;
}
.modal-content button {
background-color: #2196f3;
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
}
.modal-content button:hover {
background-color: #0c7cd5;
}
\ No newline at end of file
<div class="modal">
<div class="modal-content">
<p>
Usted no forma parte del sistema de vinculación con la sociedad</p>
<button mat-button (click)="closeModal()">Cerrar</button>
</div>
</div>
/* tslint:disable:no-unused-variable */
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { AccesoNoAutorizadoComponent } from './AccesoNoAutorizado.component';
describe('AccesoNoAutorizadoComponent', () => {
let component: AccesoNoAutorizadoComponent;
let fixture: ComponentFixture<AccesoNoAutorizadoComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AccesoNoAutorizadoComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AccesoNoAutorizadoComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MatDialogRef } from '@angular/material/dialog';
@Component({
selector: 'app-AccesoNoAutorizado',
templateUrl: './AccesoNoAutorizado.component.html',
styleUrls: ['./AccesoNoAutorizado.component.css']
})
export class AccesoNoAutorizadoComponent implements OnInit {
constructor(private dialogRef: MatDialogRef<AccesoNoAutorizadoComponent>) { }
ngOnInit(): void {
}
closeModal() {
this.dialogRef.close();
}
}
\ No newline at end of file
......@@ -9,7 +9,7 @@ export class CabEvalProyService {
private readonly URL = environment.appApiUrl + '/cabevalp';
parametrosActualizados: Subject<void> = new Subject<void>();
private idCabEvalProy: number;
constructor(private httpClient: HttpClient) {}
......@@ -17,7 +17,11 @@ export class CabEvalProyService {
obtenerParametros(): Observable<CabeEvalProy[]> {
return this.httpClient.get<CabeEvalProy[]>(`${this.URL+"/getAll"}`);
}
obtenerParametrosId(id: number): Observable<CabeEvalProy> {
return this.httpClient.get<CabeEvalProy>(`${this.URL}/exampleFindId/${id}`)
}
guardarParametros(parametros: CabeEvalProy):Observable<Object>{
return this.httpClient.post(`${this.URL+"/guardar"}`, parametros).pipe(
tap((response: any) => {
......@@ -40,7 +44,7 @@ export class CabEvalProyService {
modificarParametros(id: number, parametros: CabeEvalProy): Observable<any> {
return this.httpClient.put<any>(`${this.URL}/editar/${id}`, parametros)
}
eliminarParametros(id: number): Observable<any> {
return this.httpClient.delete(`${this.URL}/eliminar/${id}`, { responseType: 'text' });
}
......
......@@ -9,8 +9,8 @@ import { Convocatoria } from '../../Models/convocatoria';
})
export class ConvocatoriaService {
private readonly URL = environment.appApiUrl + '/convoca';
private getPDF = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/files/getFile'
private savePDF = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/files/saveFile'
private getPDF = 'https://api-ufa.espe.edu.ec/api/v1.0/private/files/getFile'
private savePDF = 'https://api-ufa.espe.edu.ec/api/v1.0/private/files/saveFile'
private idPDF: string; // Agregar una variable para almacenar el último ID guardado
private fileName: string; // Agregar una variable para almacenar el último ID guardado
......@@ -56,13 +56,12 @@ export class ConvocatoriaService {
}
guardarConvocatoria(dtoUzyTavAnexoSPR: Convocatoria): Observable<Convocatoria> {
return this.httpClient.post<Convocatoria>(`${this.URL}/guardar`, dtoUzyTavAnexoSPR);
}
modificarConvocatoria(uzytavconvoca_id: number, formData: FormData): Observable<any> {
return this.httpClient.put<Convocatoria>(`${this.URL}/editar/${uzytavconvoca_id}`, formData);
modificarConvocatoria(uzytavconvoca_id: number, dtoUzyTavAnexoSPR: Convocatoria): Observable<any> {
return this.httpClient.put<Convocatoria>(`${this.URL}/editar/${uzytavconvoca_id}`, dtoUzyTavAnexoSPR);
}
eliminarConvocatoria(id: number): Observable<any> {
return this.httpClient.delete(`${this.URL}/eliminarConPDF/${id}`, { responseType: 'text' });
......
/* tslint:disable:no-unused-variable */
import { TestBed, async, inject } from '@angular/core/testing';
import { ResponsableProgService } from './responsable-prog.service';
describe('Service: ResponsableProg', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [ResponsableProgService]
});
});
it('should ...', inject([ResponsableProgService], (service: ResponsableProgService) => {
expect(service).toBeTruthy();
}));
});
import { Injectable } from '@angular/core';
import { environment } from 'src/environments/environment';
import { HttpClient } from '@angular/common/http';
import { Observable, Subject } from 'rxjs';
import { tap } from 'rxjs/operators';
import { ResponsableProg } from '../../Models/responsable-prog';
@Injectable({
providedIn: 'root'
})
export class ResponsableProgService {
private readonly URL = environment.appApiUrl + '/cabevalp';
parametrosActualizados: Subject<void> = new Subject<void>();
private idCabEvalProy: number;
constructor(private httpClient: HttpClient) {}
//método para obtener los Parametross desde el backed, por lo que retorna un arreglo de tipo Parametros
obtenerParametros(): Observable<ResponsableProg[]> {
return this.httpClient.get<ResponsableProg[]>(`${this.URL+"/getAll"}`);
}
obtenerParametrosId(id: number): Observable<ResponsableProg> {
return this.httpClient.get<ResponsableProg>(`${this.URL}/exampleFindId/${id}`)
}
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
})
);
}
modificarParametros(id: number, parametros: ResponsableProg): Observable<any> {
return this.httpClient.put<any>(`${this.URL}/editar/${id}`, parametros)
}
eliminarParametros(id: number): Observable<any> {
return this.httpClient.delete(`${this.URL}/eliminar/${id}`, { responseType: 'text' });
}
obtenerId(): number {
console.log("id cabecera2 ",this.idCabEvalProy)
return this.idCabEvalProy;
}
}
/* tslint:disable:no-unused-variable */
import { TestBed, async, inject } from '@angular/core/testing';
import { TipresService } from './tipres.service';
describe('Service: Tipres', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [TipresService]
});
});
it('should ...', inject([TipresService], (service: TipresService) => {
expect(service).toBeTruthy();
}));
});
import { Injectable } from '@angular/core';
import { environment } from 'src/environments/environment';
import { HttpClient } from '@angular/common/http';
import { Observable, Subject } from 'rxjs';
import { tap } from 'rxjs/operators';
import { TiPres } from '../../Models/tiv-pres';
@Injectable({
providedIn: 'root'
})
export class TipresService {
private readonly URL = environment.appApiUrl + '/tavtipres';
parametrosActualizados: Subject<void> = new Subject<void>();
private idCabEvalProy: number;
constructor(private httpClient: HttpClient) {}
//método para obtener los Parametross desde el backed, por lo que retorna un arreglo de tipo Parametros
obtenerParametros(): Observable<TiPres[]> {
return this.httpClient.get<TiPres[]>(`${this.URL+"/getAll"}`);
}
obtenerParametrosId(id: number): Observable<TiPres> {
return this.httpClient.get<TiPres>(`${this.URL}/exampleFindId/${id}`)
}
guardarParametros(parametros: TiPres):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
})
);
}
modificarParametros(id: number, parametros: TiPres): Observable<any> {
return this.httpClient.put<any>(`${this.URL}/editar/${id}`, parametros)
}
eliminarParametros(id: number): Observable<any> {
return this.httpClient.delete(`${this.URL}/eliminar/${id}`, { responseType: 'text' });
}
obtenerId(): number {
console.log("id cabecera2 ",this.idCabEvalProy)
return this.idCabEvalProy;
}
}
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