actualizaciones pertinentes

parent e0ac78c4
export class docompar{ export class docompar{
UZYTAVDOCOMPAR_CODE?: number; uzytavdocompar_code?: number;
UZYTAVINSTPROY_ID?: number; uzytavinstproy_id?: number;
UZYTAVDOCOMPAR_NOMBRE_DOC?: string; uzytavdocompar_nombre_doc?: string;
UZYTAVDOCOMPAR_NOMBRE_URL?: string; uzytavdocompar_nombre_url?: string;
UZYTAVDOCOMPAR_FECHA_CREA?: Date; uzytavdocompar_fecha_crea?: Date;
} }
export class EvaluacionProy{
uzytavevalproy_id?:number;
uzytavcabevalp_id?:number;
uzytavaloruzytparametros_id?:number;
uzytavevalproy_puntaje?:number;
uzytavparaeva_id?:number;
uzytavevalproy_observ?:string;
}
...@@ -69,7 +69,6 @@ import { PartidasAgreComponent } from './pages/Seccion-configuraciones/Partidas/ ...@@ -69,7 +69,6 @@ import { PartidasAgreComponent } from './pages/Seccion-configuraciones/Partidas/
import { PartidasEdiComponent } from './pages/Seccion-configuraciones/Partidas/partidas-edi/partidas-edi.component'; import { PartidasEdiComponent } from './pages/Seccion-configuraciones/Partidas/partidas-edi/partidas-edi.component';
import { PartidasListComponent } from './pages/Seccion-configuraciones/Partidas/partidas-list/partidas-list.component'; import { PartidasListComponent } from './pages/Seccion-configuraciones/Partidas/partidas-list/partidas-list.component';
import { LineasComponent } from './pages/Lineas/Lineas.component'; import { LineasComponent } from './pages/Lineas/Lineas.component';
import { CalificacionComiComponent } from './pages/calificacion-comi/calificacion-comi.component';
import { MenusComponent } from './pages/Seccion-configuraciones/menus/menus.component'; import { MenusComponent } from './pages/Seccion-configuraciones/menus/menus.component';
import { ListarProgramaComponent } from './pages/programa/listar-programa/listar-programa.component'; import { ListarProgramaComponent } from './pages/programa/listar-programa/listar-programa.component';
import { AgregarProgramaComponent } from './pages/programa/agregar-programa/agregar-programa.component'; import { AgregarProgramaComponent } from './pages/programa/agregar-programa/agregar-programa.component';
...@@ -118,6 +117,7 @@ const routes: Routes = [ ...@@ -118,6 +117,7 @@ const routes: Routes = [
//Proyectos //Proyectos
{ path: 'editar-proyecto/:id', component: EditProyectoComponent}, { path: 'editar-proyecto/:id', component: EditProyectoComponent},
{ path: 'editar-proyecto', component: EditProyectoComponent},
{ path: 'ListaProyectos', component: ListaProyectosComponent }, { path: 'ListaProyectos', component: ListaProyectosComponent },
{ path: 'Proyecto', component: ProyectoComponent }, { path: 'Proyecto', component: ProyectoComponent },
...@@ -136,8 +136,6 @@ const routes: Routes = [ ...@@ -136,8 +136,6 @@ const routes: Routes = [
{ path: 'PerfilUsuario', component: PerfilUsuarioComponent }, { path: 'PerfilUsuario', component: PerfilUsuarioComponent },
//-----------------Calificación comision-------------
{ path: 'calificación', component: CalificacionComiComponent },
//-------------------Menus------------------------------// //-------------------Menus------------------------------//
{ path: 'Menu', component: MenusComponent }, { path: 'Menu', component: MenusComponent },
......
...@@ -92,7 +92,6 @@ import { LineasComponent } from './pages/Lineas/Lineas.component'; ...@@ -92,7 +92,6 @@ import { LineasComponent } from './pages/Lineas/Lineas.component';
import { PartidasPresupuestarias } from './Models/partidas-presupuestarias'; import { PartidasPresupuestarias } from './Models/partidas-presupuestarias';
import { lineaOpe } from './Models/lineas-operativas'; import { lineaOpe } from './Models/lineas-operativas';
import { CalificacionComiComponent } from './pages/calificacion-comi/calificacion-comi.component';
import { MenusComponent } from './pages/Seccion-configuraciones/menus/menus.component'; import { MenusComponent } from './pages/Seccion-configuraciones/menus/menus.component';
import { AgregarProgramaComponent } from './pages/programa/agregar-programa/agregar-programa.component'; import { AgregarProgramaComponent } from './pages/programa/agregar-programa/agregar-programa.component';
import { ListarProgramaComponent } from './pages/programa/listar-programa/listar-programa.component'; import { ListarProgramaComponent } from './pages/programa/listar-programa/listar-programa.component';
...@@ -199,14 +198,8 @@ import { ListCompromisoComponent } from './pages/Proyectos/Inicio Ejecución/com ...@@ -199,14 +198,8 @@ import { ListCompromisoComponent } from './pages/Proyectos/Inicio Ejecución/com
import { instproy } from './Models/instproy'; import { instproy } from './Models/instproy';
import { ListDocumentosComponent } from './pages/Proyectos/Inicio Ejecución/compromiso participacion/list-documentos/list-documentos.component'; import { ListDocumentosComponent } from './pages/Proyectos/Inicio Ejecución/compromiso participacion/list-documentos/list-documentos.component';
import { AddDocumentosComponent } from './pages/Proyectos/Inicio Ejecución/compromiso participacion/add-documentos/add-documentos.component'; import { AddDocumentosComponent } from './pages/Proyectos/Inicio Ejecución/compromiso participacion/add-documentos/add-documentos.component';
import { CartaCompromisoComuComponent } from './pages/Proyectos/Inicio Ejecución/carta compromiso comunidad/carta-compromiso-comu/carta-compromiso-comu.component';
import { ListInstiComponent } from './pages/Proyectos/Cierre/numerico de beneficiarios/list-insti/list-insti.component'; import { ListInstiComponent } from './pages/Proyectos/Cierre/numerico de beneficiarios/list-insti/list-insti.component';
import { EditInstiComponent } from './pages/Proyectos/Cierre/numerico de beneficiarios/edit-insti/edit-insti.component'; import { EditInstiComponent } from './pages/Proyectos/Cierre/numerico de beneficiarios/edit-insti/edit-insti.component';
import { ActaCompromisoCarrerasComponent } from './pages/Proyectos/Acta de Compromiso de Carreras/acta-compromiso-carreras/acta-compromiso-carreras.component';
import { ActaConsejoDepartamentoComponent } from './pages/Proyectos/Acta de Consejo de Departamento/acta-consejo-departamento/acta-consejo-departamento.component';
import { ActaDirectorProyectoComponent } from './pages/Proyectos/Acta Compromiso Director Proyecto/acta-director-proyecto/acta-director-proyecto.component';
import { ListarActaCompromisoCarrerasComponent } from './pages/Proyectos/Acta de Compromiso de Carreras/listar-acta-compromiso-carreras/listar-acta-compromiso-carreras.component';
import { ListarActaConsejoDepartamentoComponent } from './pages/Proyectos/Acta de Consejo de Departamento/listar-acta-consejo-departamento/listar-acta-consejo-departamento.component';
import { PdfComponent } from './pages/Proyectos/pdf/pdf.component'; import { PdfComponent } from './pages/Proyectos/pdf/pdf.component';
import { ListObjetivosEjecComponent } from './pages/Proyectos/Cierre/objetivos ejecutados/list-objetivos-ejec/list-objetivos-ejec.component'; import { ListObjetivosEjecComponent } from './pages/Proyectos/Cierre/objetivos ejecutados/list-objetivos-ejec/list-objetivos-ejec.component';
import { EditObjetivosEjecComponent } from './pages/Proyectos/Cierre/objetivos ejecutados/edit-objetivos-ejec/edit-objetivos-ejec.component'; import { EditObjetivosEjecComponent } from './pages/Proyectos/Cierre/objetivos ejecutados/edit-objetivos-ejec/edit-objetivos-ejec.component';
...@@ -224,6 +217,13 @@ import { actproy } from './Models/actproy'; ...@@ -224,6 +217,13 @@ import { actproy } from './Models/actproy';
import { detactproy } from './Models/detactproy'; import { detactproy } from './Models/detactproy';
import { EditInformeBodyComponent } from './pages/Proyectos/Ejecución/informes de avance/edit-informe-body/edit-informe-body.component'; 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 { 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';
@NgModule({ @NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
declarations: [ declarations: [
...@@ -231,8 +231,6 @@ import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de av ...@@ -231,8 +231,6 @@ import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de av
ActaConsejoDepartamentoComponent, ActaConsejoDepartamentoComponent,
ActaDirectorProyectoComponent, ActaDirectorProyectoComponent,
ListCompromisoComponent, ListCompromisoComponent,
ListarActaCompromisoCarrerasComponent,
ListarActaConsejoDepartamentoComponent,
AddCronogramaActiComponent, AddCronogramaActiComponent,
AddHitosComponent, AddHitosComponent,
InicialProyectoComponent, InicialProyectoComponent,
...@@ -315,7 +313,6 @@ import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de av ...@@ -315,7 +313,6 @@ import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de av
ConvocatoriasAgregarComponent, ConvocatoriasAgregarComponent,
ConvocatoriasEditarComponent, ConvocatoriasEditarComponent,
ConvocatoriasListarComponent, ConvocatoriasListarComponent,
CalificacionComiComponent,
MenusComponent, MenusComponent,
AgregarProgramaComponent, AgregarProgramaComponent,
CoberturaComponent, CoberturaComponent,
...@@ -381,7 +378,6 @@ import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de av ...@@ -381,7 +378,6 @@ import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de av
ListCompromisoComponent, ListCompromisoComponent,
ListDocumentosComponent, ListDocumentosComponent,
AddDocumentosComponent, AddDocumentosComponent,
CartaCompromisoComuComponent,
ListInstiComponent, ListInstiComponent,
EditInstiComponent, EditInstiComponent,
PdfComponent, PdfComponent,
...@@ -397,7 +393,10 @@ import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de av ...@@ -397,7 +393,10 @@ import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de av
ErrorTextoComponent, ErrorTextoComponent,
ComisionAsigComponent, ComisionAsigComponent,
EditInformeBodyComponent, EditInformeBodyComponent,
AddInformeComponent AddInformeComponent,
AddCalificacionVinculacionComponent,
AddImagenesComponent,
ListImagenesComponent,
], ],
imports: [ imports: [
MatTreeModule, MatTreeModule,
...@@ -454,7 +453,9 @@ import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de av ...@@ -454,7 +453,9 @@ import { AddInformeComponent } from './pages/Proyectos/Ejecución/informes de av
planvprograma, planvprograma,
programaeplanv, programaeplanv,
actproy, actproy,
detactproy detactproy,
CabEvalProyService,
] ]
}) })
export class MainModule { export class MainModule {
......
/* 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 {
margin-top: 30px;
}
/* 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;
margin-bottom: 16px;
}
\ No newline at end of file
<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()">Editar</button>
<button mat-raised-button class="botones"
[disabled]="myForm.invalid" color="primary" *ngIf="cambio">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>
<mat-label>Fecha:</mat-label>
<input matInput [matDatepicker]="pickerInicio" placeholder="Seleccione una fecha"
formControlName="fechaInicio" required>
<mat-datepicker-toggle matSuffix [for]="pickerInicio"></mat-datepicker-toggle>
<mat-datepicker #pickerInicio></mat-datepicker>
<mat-error
*ngIf="myForm.get('fechaInicio').invalid && (myForm.get('fechaInicio').dirty || myForm.get('fechaInicio').touched)">
Por favor, ingrese la fecha de Inicio.
</mat-error>
</mat-form-field>
</div>
<div class="input-container">
<mat-form-field>
<mat-label>Descripción:</mat-label>
<input matInput formControlName="descripcion" required>
<mat-error
*ngIf="myForm.get('descripcion').invalid && (myForm.get('descripcion').dirty || myForm.get('descripcion').touched)">
Por favor, ingrese la descripción.
</mat-error>
</mat-form-field>
</div>
<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>
<ng-container matColumnDef="Parametro" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header>
Parámetro</th>
<td class="Column" mat-cell *matCellDef="let dato">
{{dato.uzytavparaeva_descrip}}
</td>
</ng-container>
<ng-container [formGroup]="dynamicForm" (ngSubmit)="onSubmit()" matColumnDef="Valoracion"
class="Column" >
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header> Valoración</th>
<td class="Column" mat-cell *matCellDef="let dato" let i=index>
<mat-form-field class="form-field">
<mat-label>Seleccione un Item</mat-label>
<mat-select [formControlName]="'valoracion' + dato.uzytavparaeva_id">
<mat-option *ngFor="let opcion of dato.opcionesRespuesta"
[value]="opcion.uzytavaloruzytparametros_id">
{{ opcion.uzytavalorpar_descrip }}
</mat-option>
</mat-select>
</mat-form-field>
</td>
</ng-container>
<ng-container matColumnDef="Puntaje" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header> Puntaje </th>
<td class="Column" mat-cell *matCellDef="let dato">
{{ getSelectedPuntaje(dato.uzytavparaeva_id) }}
</td>
</ng-container>
<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>
</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 { AddCalificacionVinculacionComponent } from './add-calificacion-vinculacion.component';
describe('AddCalificacionVinculacionComponent', () => {
let component: AddCalificacionVinculacionComponent;
let fixture: ComponentFixture<AddCalificacionVinculacionComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AddCalificacionVinculacionComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AddCalificacionVinculacionComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
...@@ -30,6 +30,12 @@ ...@@ -30,6 +30,12 @@
font-weight: bold; font-weight: bold;
} }
.separator {
margin: 0 5px;
opacity: 0;
pointer-events: none;
}
/* Estilos para los inputs y selects */ /* Estilos para los inputs y selects */
input[type="text"], input[type="text"],
select { select {
...@@ -56,23 +62,6 @@ ...@@ -56,23 +62,6 @@
margin-top: 4px; 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 */ /* Estilos para el contenedor principal */
.contenedor { .contenedor {
...@@ -152,5 +141,6 @@ ...@@ -152,5 +141,6 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin-bottom: 16px; margin-bottom: 16px;
align-items: center;
} }
\ No newline at end of file
<div class="contenedor-dos"> <div class="contenedor-dos">
<form class="formulario" [formGroup]="myForm" (ngSubmit)="onSubmit()"> <form class="formulario" [formGroup]="myForm" (ngSubmit)="onSubmit()">
<!-- Información de la institución --> <!-- Información de la institución -->
<div class="columna-unico"> <div class="save-button">
<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>
<button mat-raised-button color="primary" *ngIf="cambio">Guardar</button> <span class="separator"></span>
<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>
</div>
<!-- Control de PDF --> <div class="input-container" *ngIf="proyecto.uzytavproyec_com_part1_url == null && !cambio">
<div class="input-container"> <label>Subir Archivo</label>
<label>Subir Archivo</label> <input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" formControlName="archivo">
<input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" </div>
formControlName="archivo">
</div> <div class="input-container" *ngIf="proyecto.uzytavproyec_com_part1_url == null && cambio">
<label>Subir Archivo</label>
<input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" formControlName="archivo">
</div>
<button class="input-container" *ngIf="proyecto.uzytavproyec_com_part1_url != null && !cambio">
<img src="../../../../../../../assets/img/icons/pdf.png" style="width: 50px; height: 50px;"
(click)="verPDF(proyecto.uzytavproyec_com_part1_url,proyecto.uzytavproyec_com_part1_nom)"
aria-placeholder="Ver PDF">
</button>
<div class="input-container" *ngIf="proyecto.uzytavproyec_com_part1_url != null && cambio">
<label>Subir Archivo</label>
<input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" formControlName="archivo">
</div> </div>
</form> </form>
</div> </div>
\ No newline at end of file
...@@ -13,6 +13,8 @@ import { ProyectosService } from 'src/app/modules/main/services/proyectos/proyec ...@@ -13,6 +13,8 @@ import { ProyectosService } from 'src/app/modules/main/services/proyectos/proyec
import { ProyectoComponent } from '../../Proyectos/Proyecto/Proyecto.component'; import { ProyectoComponent } from '../../Proyectos/Proyecto/Proyecto.component';
import { Proyectos } from 'src/app/modules/main/Models/proyectos'; import { Proyectos } from 'src/app/modules/main/Models/proyectos';
import { DatosEspeService } from 'src/app/modules/main/services/APIs Externas/Datos espe/datos-espe.service'; import { DatosEspeService } from 'src/app/modules/main/services/APIs Externas/Datos espe/datos-espe.service';
import { MostrarOcultarService } from 'src/app/modules/main/services/mostrar-ocultar.service';
import { saveAs } from 'file-saver';
@Component({ @Component({
selector: 'app-acta-director-proyecto', selector: 'app-acta-director-proyecto',
...@@ -29,7 +31,8 @@ export class ActaDirectorProyectoComponent implements OnInit { ...@@ -29,7 +31,8 @@ export class ActaDirectorProyectoComponent implements OnInit {
formularioEnviado: boolean formularioEnviado: boolean
cambio: boolean; cambio: boolean;
proyecto: Proyectos proyecto: Proyectos
showPdfButton: number = 0; // 0 para ocultar, 1 para mostrar
public idRecuperado
constructor( constructor(
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private proyectosService: ProyectosService, private proyectosService: ProyectosService,
...@@ -38,12 +41,16 @@ export class ActaDirectorProyectoComponent implements OnInit { ...@@ -38,12 +41,16 @@ export class ActaDirectorProyectoComponent implements OnInit {
private datosCompartidos: Actualiza_datosService, private datosCompartidos: Actualiza_datosService,
private idCompartido: Compartir_idService, private idCompartido: Compartir_idService,
private datosEspeService: DatosEspeService, private datosEspeService: DatosEspeService,
private mostrarOcultarService: MostrarOcultarService,
) { ) {
this.proyecto = new Proyectos(); this.proyecto = new Proyectos();
} }
ngOnInit(): void { ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10);
this.proyecto = this.mostrarOcultarService.editProyecto;
this.cambio = false; this.cambio = false;
this.myForm = this.formBuilder.group({ this.myForm = this.formBuilder.group({
archivo: [{ value: '', disabled: true }, Validators.required], archivo: [{ value: '', disabled: true }, Validators.required],
...@@ -78,8 +85,7 @@ export class ActaDirectorProyectoComponent implements OnInit { ...@@ -78,8 +85,7 @@ export class ActaDirectorProyectoComponent implements OnInit {
async onSubmit() { async onSubmit() {
if (this.myForm.valid) { if (this.myForm.valid) {
this.proyecto.uzytavproyec_id = this.idRecuperado;
this.proyecto.uzytavproyec_id = this.idCompartido.getIdGuardado();
const pdfData = await this.enviarPDF(); const pdfData = await this.enviarPDF();
this.proyecto.uzytavproyec_com_part1_url = pdfData.idPDF; this.proyecto.uzytavproyec_com_part1_url = pdfData.idPDF;
this.proyecto.uzytavproyec_com_part1_nom = pdfData.filename; this.proyecto.uzytavproyec_com_part1_nom = pdfData.filename;
...@@ -114,6 +120,38 @@ export class ActaDirectorProyectoComponent implements OnInit { ...@@ -114,6 +120,38 @@ export class ActaDirectorProyectoComponent implements OnInit {
} }
} }
verPDF(id: string, nombre: string) {
console.log("uid pasado ", id)
console.log("nombre pasado ", nombre)
this.datosEspeService.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
}
cambiar() { cambiar() {
this.cambio = true; this.cambio = true;
this.myForm.get('archivo').enable(); this.myForm.get('archivo').enable();
......
/* Estilos para el formulario */ /* Estilos para el formulario */
.formulario { .formulario {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-between; justify-content: space-between;
max-width: 96%; max-width: 96%;
margin: 0 auto; margin: 0 auto;
background-color: white; background-color: white;
border-radius: 10px; border-radius: 10px;
} }
.botones{ .botones{
width: 100px; width: 100px;
height: 40px; height: 40px;
text-align: center; text-align: center;
padding: 0; padding: 0;
} }
/* Estilos para la columna única */ /* Estilos para la columna única */
.columna-unico { .columna-unico {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
padding-right: 0; padding-right: 0;
padding-left: 0; padding-left: 0;
} }
/* Estilos para los labels */ /* Estilos para los labels */
label { label {
display: block; display: block;
margin-bottom: 8px; margin-bottom: 8px;
font-weight: bold; font-weight: bold;
} }
/* Estilos para los inputs y selects */
input[type="text"], .separator {
select { margin: 0 5px;
width: 100%; opacity: 0;
padding: 10px; pointer-events: none;
border: none; }
border-bottom: 1px solid #ccc; /* Estilos para los inputs y selects */
background-color: transparent; input[type="text"],
font-size: 16px; select {
margin-bottom: 16px; width: 100%;
transition: border-color 0.3s ease; padding: 10px;
} border: none;
border-bottom: 1px solid #ccc;
input[type="text"]:focus, background-color: transparent;
select:focus { font-size: 16px;
outline: none; margin-bottom: 16px;
border-color: #4caf50; transition: border-color 0.3s ease;
} }
/* Estilos para los mensajes de error */ input[type="text"]:focus,
.error-message { select:focus {
color: red; outline: none;
font-size: 14px; border-color: #4caf50;
margin-top: 4px; }
}
/* Estilos para los mensajes de error */
/* Estilos para el botón */ .error-message {
button { color: red;
display: block; font-size: 14px;
margin: 20px auto; margin-top: 4px;
padding: 10px 20px; }
background-color: rgb(71, 127, 75);
color: #fff;
border: none; /* Estilos para el contenedor principal */
border-radius: 5px; .contenedor {
font-size: 16px; width: 96%;
cursor: pointer; margin-left: 2%;
transition: background-color 0.3s ease; margin-right: 2%;
} margin-top: 10%;
border-radius: 10px;
button:hover { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
background-color: rgb(90, 159, 95); background-color: #ffffff;
} position: relative;
z-index: 1;
/* Estilos para el contenedor principal */ }
.contenedor {
width: 96%; /* Estilos para el contenedor del formulario */
margin-left: 2%; .contenedor-dos {
margin-right: 2%; margin-top: 30px;
margin-top: 10%; padding: 0.9375rem 20px;
border-radius: 10px; position: relative;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); }
background-color: #ffffff;
position: relative; /* Estilos para el título sobremontado */
z-index: 1; .sobremontado {
} position: relative;
width: 96%;
/* Estilos para el contenedor del formulario */ top: -20px;
.contenedor-dos { left: 2%;
margin-top: 30px; background-color: #477f4b;
padding: 0.9375rem 20px; color: #fff;
position: relative; text-align: center;
} padding: 10px;
box-sizing: border-box;
/* Estilos para el título sobremontado */ margin-bottom: -50px;
.sobremontado { z-index: 2;
position: relative; border-radius: 10px;
width: 96%; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
top: -20px; }
left: 2%;
background-color: #477f4b; /* Estilos para el icono de instituciones */
color: #fff; .icono-instituciones {
text-align: center; display: flex;
padding: 10px; align-items: center;
box-sizing: border-box; justify-content: center;
margin-bottom: -50px; margin-right: 5px;
z-index: 2; font-size: 20px;
border-radius: 10px; }
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
} .volver{
position: absolute;
/* Estilos para el icono de instituciones */ top: 25%;
.icono-instituciones { right: 10px;
display: flex; transform: translateY(-50%);
align-items: center; border-radius: 50%;
justify-content: center; background-color: white;
margin-right: 5px; display: flex;
font-size: 20px; color: rgb(71, 127, 75);
} align-items: center;
justify-content: center;
.volver{ padding: 0;
position: absolute; width: 32px;
top: 25%; height: 32px;
right: 10px; border: none;
transform: translateY(-50%); outline: none;
border-radius: 50%; cursor: pointer;
background-color: white;
display: flex; }
color: rgb(71, 127, 75);
align-items: center; .save-button {
justify-content: center; display: flex;
padding: 0; justify-content: flex-end;
width: 32px; margin-bottom: 16px;
height: 32px; }
border: none;
outline: none;
cursor: pointer; .input-container {
width: 100%;
} display: flex;
flex-direction: column;
.save-button { margin-bottom: 16px;
display: flex; align-items: center;
justify-content: flex-end; }
margin-bottom: 16px;
}
.input-container {
width: 100%;
display: flex;
flex-direction: column;
margin-bottom: 16px;
}
\ No newline at end of file
<div class="contenedor-dos"> <div class="contenedor-dos">
<form class="formulario" [formGroup]="myForm" (ngSubmit)="onSubmit()"> <form class="formulario" [formGroup]="myForm" (ngSubmit)="onSubmit()">
<!-- Información de la institución --> <!-- Información de la institución -->
<div class="columna-unico"> <div class="save-button">
<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>
<button mat-raised-button color="primary" *ngIf="cambio">Guardar</button> <span class="separator"></span>
<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>
</div>
<!-- Control de PDF --> <div class="input-container" *ngIf="proyecto.uzytavproyec_com_part2_url == null && !cambio">
<div class="input-container"> <label>Subir Archivo</label>
<label>Subir Archivo</label> <input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" formControlName="archivo">
<input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" </div>
formControlName="archivo">
</div> <div class="input-container" *ngIf="proyecto.uzytavproyec_com_part2_url == null && cambio">
<label>Subir Archivo</label>
<input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" formControlName="archivo">
</div>
<button class="input-container" *ngIf="proyecto.uzytavproyec_com_part2_url != null && !cambio">
<img src="../../../../../../../assets/img/icons/pdf.png" style="width: 50px; height: 50px;"
(click)="verPDF(proyecto.uzytavproyec_com_part2_url,proyecto.uzytavproyec_com_part2_nom)"
aria-placeholder="Ver PDF">
</button>
<div class="input-container" *ngIf="proyecto.uzytavproyec_com_part2_url != null && cambio">
<label>Subir Archivo</label>
<input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" formControlName="archivo">
</div> </div>
</form> </form>
</div> </div>
\ No newline at end of file
...@@ -13,6 +13,8 @@ import { ProyectosService } from 'src/app/modules/main/services/proyectos/proyec ...@@ -13,6 +13,8 @@ import { ProyectosService } from 'src/app/modules/main/services/proyectos/proyec
import { ProyectoComponent } from '../../Proyectos/Proyecto/Proyecto.component'; import { ProyectoComponent } from '../../Proyectos/Proyecto/Proyecto.component';
import { Proyectos } from 'src/app/modules/main/Models/proyectos'; import { Proyectos } from 'src/app/modules/main/Models/proyectos';
import { DatosEspeService } from 'src/app/modules/main/services/APIs Externas/Datos espe/datos-espe.service'; import { DatosEspeService } from 'src/app/modules/main/services/APIs Externas/Datos espe/datos-espe.service';
import { saveAs } from 'file-saver';
import { MostrarOcultarService } from 'src/app/modules/main/services/mostrar-ocultar.service';
@Component({ @Component({
selector: 'app-acta-compromiso-carreras', selector: 'app-acta-compromiso-carreras',
...@@ -29,7 +31,7 @@ export class ActaCompromisoCarrerasComponent implements OnInit { ...@@ -29,7 +31,7 @@ export class ActaCompromisoCarrerasComponent implements OnInit {
formularioEnviado: boolean formularioEnviado: boolean
cambio: boolean; cambio: boolean;
proyecto: Proyectos proyecto: Proyectos
public idRecuperado
constructor( constructor(
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private proyectosService: ProyectosService, private proyectosService: ProyectosService,
...@@ -38,12 +40,16 @@ export class ActaCompromisoCarrerasComponent implements OnInit { ...@@ -38,12 +40,16 @@ export class ActaCompromisoCarrerasComponent implements OnInit {
private datosCompartidos: Actualiza_datosService, private datosCompartidos: Actualiza_datosService,
private idCompartido: Compartir_idService, private idCompartido: Compartir_idService,
private datosEspeService: DatosEspeService, private datosEspeService: DatosEspeService,
private mostrarOcultarService: MostrarOcultarService,
) { ) {
this.proyecto = new Proyectos(); this.proyecto = new Proyectos();
} }
ngOnInit(): void { ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10);
this.proyecto = this.mostrarOcultarService.editProyecto;
this.cambio = false; this.cambio = false;
this.myForm = this.formBuilder.group({ this.myForm = this.formBuilder.group({
archivo: [{ value: '', disabled: true }, Validators.required], archivo: [{ value: '', disabled: true }, Validators.required],
...@@ -79,7 +85,7 @@ export class ActaCompromisoCarrerasComponent implements OnInit { ...@@ -79,7 +85,7 @@ export class ActaCompromisoCarrerasComponent implements OnInit {
async onSubmit() { async onSubmit() {
if (this.myForm.valid) { if (this.myForm.valid) {
this.proyecto.uzytavproyec_id = this.idCompartido.getIdGuardado(); this.proyecto.uzytavproyec_id = this.idRecuperado;
const pdfData = await this.enviarPDF(); const pdfData = await this.enviarPDF();
this.proyecto.uzytavproyec_com_part2_url = pdfData.idPDF; this.proyecto.uzytavproyec_com_part2_url = pdfData.idPDF;
this.proyecto.uzytavproyec_com_part2_nom = pdfData.filename; this.proyecto.uzytavproyec_com_part2_nom = pdfData.filename;
...@@ -114,6 +120,35 @@ export class ActaCompromisoCarrerasComponent implements OnInit { ...@@ -114,6 +120,35 @@ export class ActaCompromisoCarrerasComponent implements OnInit {
} }
} }
verPDF(id: string, nombre: string) {
console.log("uid pasado ", id)
console.log("nombre pasado ", nombre)
this.datosEspeService.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
}
cambiar() { cambiar() {
this.cambio = true; this.cambio = true;
this.myForm.get('archivo').enable(); this.myForm.get('archivo').enable();
......
/* Estilos para el formulario */ /* Estilos para el formulario */
.formulario { .formulario {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-between; justify-content: space-between;
max-width: 96%; max-width: 96%;
margin: 0 auto; margin: 0 auto;
background-color: white; background-color: white;
border-radius: 10px; border-radius: 10px;
} }
.botones{ .botones{
width: 100px; width: 100px;
height: 40px; height: 40px;
text-align: center; text-align: center;
padding: 0; padding: 0;
} }
/* Estilos para la columna única */ /* Estilos para la columna única */
.columna-unico { .columna-unico {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
padding-right: 0; padding-right: 0;
padding-left: 0; padding-left: 0;
} }
/* Estilos para los labels */ /* Estilos para los labels */
label { label {
display: block; display: block;
margin-bottom: 8px; margin-bottom: 8px;
font-weight: bold; font-weight: bold;
} }
/* Estilos para los inputs y selects */
input[type="text"], .separator {
select { margin: 0 5px;
width: 100%; opacity: 0;
padding: 10px; pointer-events: none;
border: none; }
border-bottom: 1px solid #ccc; /* Estilos para los inputs y selects */
background-color: transparent; input[type="text"],
font-size: 16px; select {
margin-bottom: 16px; width: 100%;
transition: border-color 0.3s ease; padding: 10px;
} border: none;
border-bottom: 1px solid #ccc;
input[type="text"]:focus, background-color: transparent;
select:focus { font-size: 16px;
outline: none; margin-bottom: 16px;
border-color: #4caf50; transition: border-color 0.3s ease;
} }
/* Estilos para los mensajes de error */ input[type="text"]:focus,
.error-message { select:focus {
color: red; outline: none;
font-size: 14px; border-color: #4caf50;
margin-top: 4px; }
}
/* Estilos para los mensajes de error */
/* Estilos para el botón */ .error-message {
button { color: red;
display: block; font-size: 14px;
margin: 20px auto; margin-top: 4px;
padding: 10px 20px; }
background-color: rgb(71, 127, 75);
color: #fff;
border: none; /* Estilos para el contenedor principal */
border-radius: 5px; .contenedor {
font-size: 16px; width: 96%;
cursor: pointer; margin-left: 2%;
transition: background-color 0.3s ease; margin-right: 2%;
} margin-top: 10%;
border-radius: 10px;
button:hover { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
background-color: rgb(90, 159, 95); background-color: #ffffff;
} position: relative;
z-index: 1;
/* Estilos para el contenedor principal */ }
.contenedor {
width: 96%; /* Estilos para el contenedor del formulario */
margin-left: 2%; .contenedor-dos {
margin-right: 2%; margin-top: 30px;
margin-top: 10%; padding: 0.9375rem 20px;
border-radius: 10px; position: relative;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); }
background-color: #ffffff;
position: relative; /* Estilos para el título sobremontado */
z-index: 1; .sobremontado {
} position: relative;
width: 96%;
/* Estilos para el contenedor del formulario */ top: -20px;
.contenedor-dos { left: 2%;
margin-top: 30px; background-color: #477f4b;
padding: 0.9375rem 20px; color: #fff;
position: relative; text-align: center;
} padding: 10px;
box-sizing: border-box;
/* Estilos para el título sobremontado */ margin-bottom: -50px;
.sobremontado { z-index: 2;
position: relative; border-radius: 10px;
width: 96%; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
top: -20px; }
left: 2%;
background-color: #477f4b; /* Estilos para el icono de instituciones */
color: #fff; .icono-instituciones {
text-align: center; display: flex;
padding: 10px; align-items: center;
box-sizing: border-box; justify-content: center;
margin-bottom: -50px; margin-right: 5px;
z-index: 2; font-size: 20px;
border-radius: 10px; }
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
} .volver{
position: absolute;
/* Estilos para el icono de instituciones */ top: 25%;
.icono-instituciones { right: 10px;
display: flex; transform: translateY(-50%);
align-items: center; border-radius: 50%;
justify-content: center; background-color: white;
margin-right: 5px; display: flex;
font-size: 20px; color: rgb(71, 127, 75);
} align-items: center;
justify-content: center;
.volver{ padding: 0;
position: absolute; width: 32px;
top: 25%; height: 32px;
right: 10px; border: none;
transform: translateY(-50%); outline: none;
border-radius: 50%; cursor: pointer;
background-color: white;
display: flex; }
color: rgb(71, 127, 75);
align-items: center; .save-button {
justify-content: center; display: flex;
padding: 0; justify-content: flex-end;
width: 32px; margin-bottom: 16px;
height: 32px; }
border: none;
outline: none;
cursor: pointer; .input-container {
width: 100%;
} display: flex;
flex-direction: column;
.save-button { margin-bottom: 16px;
display: flex; align-items: center;
justify-content: flex-end; }
margin-bottom: 16px;
}
.input-container {
width: 100%;
display: flex;
flex-direction: column;
margin-bottom: 16px;
}
\ No newline at end of file
<div class="contenedor-dos"> <div class="contenedor-dos">
<form class="formulario" [formGroup]="myForm" (ngSubmit)="onSubmit()"> <form class="formulario" [formGroup]="myForm" (ngSubmit)="onSubmit()">
<!-- Información de la institución --> <!-- Información de la institución -->
<div class="columna-unico"> <div class="save-button">
<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>
<button mat-raised-button color="primary" *ngIf="cambio">Guardar</button> <span class="separator"></span>
<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>
</div>
<!-- Control de PDF --> <div class="input-container" *ngIf="proyecto.uzytavproyec_aprob_con_dep_url == null && !cambio">
<div class="input-container"> <label>Subir Archivo</label>
<label>Subir Archivo</label> <input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" formControlName="archivo">
<input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" </div>
formControlName="archivo">
</div> <div class="input-container" *ngIf="proyecto.uzytavproyec_aprob_con_dep_url == null && cambio">
<label>Subir Archivo</label>
<input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" formControlName="archivo">
</div>
<button class="input-container" *ngIf="proyecto.uzytavproyec_aprob_con_dep_url != null && !cambio">
<img src="../../../../../../../assets/img/icons/pdf.png" style="width: 50px; height: 50px;"
(click)="verPDF(proyecto.uzytavproyec_aprob_con_dep_url,proyecto.uzytavproyec_aprob_con_dep_nom)"
aria-placeholder="Ver PDF">
</button>
<div class="input-container" *ngIf="proyecto.uzytavproyec_aprob_con_dep_url != null && cambio">
<label>Subir Archivo</label>
<input type="file" id="uzytavconvoca_digital" (change)="onFileChange($event)" formControlName="archivo">
</div> </div>
</form> </form>
</div> </div>
\ No newline at end of file
...@@ -13,6 +13,8 @@ import { ProyectosService } from 'src/app/modules/main/services/proyectos/proyec ...@@ -13,6 +13,8 @@ import { ProyectosService } from 'src/app/modules/main/services/proyectos/proyec
import { ProyectoComponent } from '../../Proyectos/Proyecto/Proyecto.component'; import { ProyectoComponent } from '../../Proyectos/Proyecto/Proyecto.component';
import { Proyectos } from 'src/app/modules/main/Models/proyectos'; import { Proyectos } from 'src/app/modules/main/Models/proyectos';
import { DatosEspeService } from 'src/app/modules/main/services/APIs Externas/Datos espe/datos-espe.service'; import { DatosEspeService } from 'src/app/modules/main/services/APIs Externas/Datos espe/datos-espe.service';
import { MostrarOcultarService } from 'src/app/modules/main/services/mostrar-ocultar.service';
import { saveAs } from 'file-saver';
@Component({ @Component({
selector: 'app-acta-consejo-departamento', selector: 'app-acta-consejo-departamento',
...@@ -29,6 +31,8 @@ export class ActaConsejoDepartamentoComponent implements OnInit { ...@@ -29,6 +31,8 @@ export class ActaConsejoDepartamentoComponent implements OnInit {
formularioEnviado: boolean formularioEnviado: boolean
cambio: boolean; cambio: boolean;
proyecto: Proyectos proyecto: Proyectos
public idRecuperado;
showPdfButton: number = 0; // 0 para ocultar, 1 para mostrar
constructor( constructor(
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
...@@ -38,15 +42,19 @@ export class ActaConsejoDepartamentoComponent implements OnInit { ...@@ -38,15 +42,19 @@ export class ActaConsejoDepartamentoComponent implements OnInit {
private datosCompartidos: Actualiza_datosService, private datosCompartidos: Actualiza_datosService,
private idCompartido: Compartir_idService, private idCompartido: Compartir_idService,
private datosEspeService: DatosEspeService, private datosEspeService: DatosEspeService,
private mostrarOcultarService: MostrarOcultarService,
) { ) {
this.proyecto = new Proyectos(); this.proyecto = new Proyectos();
} }
ngOnInit(): void { ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10);
this.proyecto = this.mostrarOcultarService.editProyecto;
this.cambio = false; this.cambio = false;
this.myForm = this.formBuilder.group({ this.myForm = this.formBuilder.group({
archivo: [{ value: '', disabled: true }, Validators.required], archivo: [{ value: "", disabled: true }, Validators.required],
}); });
} }
...@@ -78,8 +86,7 @@ export class ActaConsejoDepartamentoComponent implements OnInit { ...@@ -78,8 +86,7 @@ export class ActaConsejoDepartamentoComponent implements OnInit {
async onSubmit() { async onSubmit() {
if (this.myForm.valid) { if (this.myForm.valid) {
this.proyecto.uzytavproyec_id = this.idRecuperado;
this.proyecto.uzytavproyec_id = this.idCompartido.getIdGuardado();
const pdfData = await this.enviarPDF(); const pdfData = await this.enviarPDF();
this.proyecto.uzytavproyec_aprob_con_dep_url = pdfData.idPDF; this.proyecto.uzytavproyec_aprob_con_dep_url = pdfData.idPDF;
this.proyecto.uzytavproyec_aprob_con_dep_nom = pdfData.filename; this.proyecto.uzytavproyec_aprob_con_dep_nom = pdfData.filename;
...@@ -114,6 +121,39 @@ export class ActaConsejoDepartamentoComponent implements OnInit { ...@@ -114,6 +121,39 @@ export class ActaConsejoDepartamentoComponent implements OnInit {
} }
} }
verPDF(id: string, nombre: string) {
console.log("uid pasado ", id)
console.log("nombre pasado ", nombre)
this.datosEspeService.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
}
cambiar() { cambiar() {
this.cambio = true; this.cambio = true;
this.myForm.get('archivo').enable(); this.myForm.get('archivo').enable();
...@@ -124,3 +164,4 @@ export class ActaConsejoDepartamentoComponent implements OnInit { ...@@ -124,3 +164,4 @@ export class ActaConsejoDepartamentoComponent implements OnInit {
} }
} }
...@@ -186,7 +186,7 @@ export class AddDatosGeneralesComponent implements OnInit { ...@@ -186,7 +186,7 @@ export class AddDatosGeneralesComponent implements OnInit {
this.proyectosService.modificarParametros(this.idGuardado, this.proyectos).subscribe(response => { this.proyectosService.modificarParametros(this.idGuardado, this.proyectos).subscribe(response => {
console.log("codigo proyecto actualizado", this.proyectos.uzytavproyec_codigo) console.log("codigo proyecto actualizado", this.proyectos.uzytavproyec_codigo)
}); });
this.router.navigate(['main/Proyecto']); this.router.navigate(['main/editar-proyecto']);
}); });
} catch (error) { } catch (error) {
......
...@@ -19,3 +19,9 @@ ...@@ -19,3 +19,9 @@
.editor-separator { .editor-separator {
margin-top: 15px; margin-top: 15px;
} }
.error-message {
color: red;
font-size: 14px;
margin-top: 5px;
}
...@@ -23,3 +23,9 @@ ...@@ -23,3 +23,9 @@
.custom-ckeditor { .custom-ckeditor {
height: 400px; height: 400px;
} }
.error-message {
color: red;
font-size: 14px;
margin-top: 5px;
}
...@@ -17,12 +17,19 @@ ...@@ -17,12 +17,19 @@
<div> <div>
<label class="label-negrita"> Bienes:</label> <label class="label-negrita"> Bienes:</label>
<ckeditor formControlName="bienes" class="custom-ckeditor" [disabled]="!isEditorEnabled" [style.height]="editorHeight" [editor]="Editor"></ckeditor> <ckeditor formControlName="bienes" class="custom-ckeditor" [disabled]="!isEditorEnabled" [style.height]="editorHeight" [editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('bienes').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
<div class="editor-separator"></div> <div class="editor-separator"></div>
<div> <div>
<label class="label-negrita"> Servicos:</label> <label class="label-negrita"> Servicos:</label>
<ckeditor formControlName="servicios" class="custom-ckeditor" [disabled]="!isEditorEnabled" [style.height]="editorHeight" [editor]="Editor"></ckeditor> <ckeditor formControlName="servicios" class="custom-ckeditor" [disabled]="!isEditorEnabled" [style.height]="editorHeight" [editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('servicios').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
</mat-card-content> </mat-card-content>
......
...@@ -46,8 +46,8 @@ export class EditEntregablesComponent implements OnInit { ...@@ -46,8 +46,8 @@ export class EditEntregablesComponent implements OnInit {
this.obtenerRegistros(); this.obtenerRegistros();
this.myForm = this.formBuilder.group({ this.myForm = this.formBuilder.group({
bienes: [this.proyectos.uzytavproyec_bienes], bienes: [this.proyectos.uzytavproyec_bienes, [Validators.required, Validators.maxLength(3000)]],
servicios: [this.proyectos.uzytavproyec_servicios] servicios: [this.proyectos.uzytavproyec_servicios, [Validators.required, Validators.maxLength(3000)]]
}); });
} }
......
<div class="container"> <div class="container">
<form class="example-form" [formGroup]="myForm" (ngSubmit)="onSubmit()" > <form class="example-form" [formGroup]="myForm" (ngSubmit)="onSubmit()">
<mat-card> <mat-card>
<mat-card-header> <mat-card-header>
<div class="save-button"> <div class="save-button">
...@@ -17,14 +17,24 @@ ...@@ -17,14 +17,24 @@
<div> <div>
<label class="label-negrita"> Descripción de la situación actual del <label class="label-negrita"> Descripción de la situación actual del
área de intervención del proyecto:</label> área de intervención del proyecto:</label>
<ckeditor formControlName="diagnostico" [style.height]="editorHeight" [disabled]="!isEditorEnabled" [editor]="Editor"></ckeditor> <ckeditor formControlName="diagnostico" [style.height]="editorHeight"
[disabled]="!isEditorEnabled" [editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('diagnostico').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
<div class="editor-separator"></div> <div class="editor-separator"></div>
<div> <div>
<label class="label-negrita"> Identificación, descripción y <label class="label-negrita"> Identificación, descripción y
diagnóstico del problema:</label> diagnóstico del problema:</label>
<ckeditor formControlName="identificacion" [style.height]="editorHeight" [disabled]="!isEditorEnabled" [editor]="Editor"></ckeditor> <ckeditor formControlName="identificacion"
[style.height]="editorHeight" [disabled]="!isEditorEnabled"
[editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('identificacion').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
</mat-card-content> </mat-card-content>
......
...@@ -19,3 +19,15 @@ ...@@ -19,3 +19,15 @@
.editor-separator { .editor-separator {
margin-top: 15px; margin-top: 15px;
} }
.editor-separator{
margin-top: 4%;
}
.error-message {
color: red;
font-size: 14px;
margin-top: 5px;
}
...@@ -48,8 +48,8 @@ export class EditDiagnosticoComponent implements OnInit { ...@@ -48,8 +48,8 @@ export class EditDiagnosticoComponent implements OnInit {
this.obtenerRegistros(); this.obtenerRegistros();
this.myForm = this.formBuilder.group({ this.myForm = this.formBuilder.group({
diagnostico: [this.proyectos.uzytavproyec_diagnostico], diagnostico: [this.proyectos.uzytavproyec_diagnostico, [Validators.required, Validators.maxLength(3000)]],
identificacion: [this.proyectos.uzytavproyec_situactual] identificacion: [this.proyectos.uzytavproyec_situactual, [Validators.required, Validators.maxLength(3000)]]
}); });
} }
......
...@@ -4,13 +4,94 @@ ...@@ -4,13 +4,94 @@
<mat-label *ngIf="ocultar"><strong>Seleccione una Actividad</strong></mat-label> <mat-label *ngIf="ocultar"><strong>Seleccione una Actividad</strong></mat-label>
<mat-form-field class="form-field" *ngIf="ocultar"> <mat-form-field class="form-field" *ngIf="ocultar">
<mat-label>Seleccione un Item</mat-label> <mat-label>Seleccione un Item</mat-label>
<mat-select formControlName="Actividades"> <mat-select formControlName="Actividades"
(selectionChange)="obtenerActi($event.value)">
<mat-option *ngFor="let item of objetivosE" <mat-option *ngFor="let item of objetivosE"
[value]="item.uzytavobjetivo_programa_id"> [value]="item.uzytavobjetivo_programa_id">
{{ item.uzytavobjetivo_programaobjetivo_proy}} {{ item.uzytavobjetivo_programaobjetivo_proy}}
</mat-option> </mat-option>
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<div class="save-button">
<button mat-raised-button color="primary" *ngIf="ocultar"
(click)="AgregarF()" [disabled]="myForm.get('Actividades').invalid">Agregar</button>
<button mat-raised-button color="primary" *ngIf="showDataAdd"
[disabled]="myForm.invalid">Guardar</button>
<span class="separator"></span>
<button mat-raised-button color="warn" *ngIf="showDataAdd"
(click)="cancelarF()">Cancelar</button>
</div>
<div *ngIf="showDataAdd">
<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>
<mat-form-field class="form-field">
<mat-label>Observación</mat-label>
<input matInput formControlName="observa">
</mat-form-field>
<!--seccion de la tabla-->
<mat-card class="card">
<table mat-table [dataSource]="objetivosA" class="mat-elevation-z8">
<ng-container matColumnDef="Nro">
<th mat-header-cell *matHeaderCellDef> Nro </th>
<td mat-cell *matCellDef="let i = index"> {{ i+1 }} </td>
</ng-container>
<ng-container matColumnDef="actividad">
<th mat-header-cell *matHeaderCellDef> Actividad </th>
<td mat-cell *matCellDef="let actividad"> {{
actividad.uzytavobjetivo_programaobjetivo_proy }} </td>
</ng-container>
<ng-container matColumnDef="fechaIni">
<th mat-header-cell *matHeaderCellDef> Fecha Inicio </th>
<td mat-cell *matCellDef="let actividad"> {{
formatFecha(actividad.uzytavobjetivo_programafec_ini) }} </td>
</ng-container>
<ng-container matColumnDef="fechaFin">
<th mat-header-cell *matHeaderCellDef> Fecha Fin </th>
<td mat-cell *matCellDef="let actividad"> {{
formatFecha(actividad.uzytavobjetivo_programafec_fin) }} </td>
</ng-container>
<div [formGroup]="dynamicForm" (ngSubmit)="onUpdate()">
<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"
placeholder="Resultado">
</td>
</ng-container>
<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">
</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"
placeholder="Observación">
</td>
</ng-container>
</div>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
</mat-card>
</div>
</form> </form>
</div> </div>
</div> </div>
import { Component, OnInit } from '@angular/core'; import { Component, OnInit, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { objetivoprograma } from 'src/app/modules/main/Models/objetivoPrograma'; import { objetivoprograma } from 'src/app/modules/main/Models/objetivoPrograma';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service'; import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { Objetivo_programaService } from 'src/app/modules/main/services/objetivo_programa/objetivo_programa.service'; import { Objetivo_programaService } from 'src/app/modules/main/services/objetivo_programa/objetivo_programa.service';
import { format } from 'date-fns';
import { EnvioFormularioComponent } from '../../../../programa/opciones/envio-formulario/envio-formulario.component';
import { MatDialog } from '@angular/material/dialog';
import { Informes_avanceService } from 'src/app/modules/main/services/informes_avance/informes_avance.service';
import { actproy } from 'src/app/modules/main/Models/actproy';
import * as moment from 'moment';
import { MatTable, MatTableDataSource } from '@angular/material/table';
import { detactproy } from 'src/app/modules/main/Models/detactproy';
@Component({ @Component({
selector: 'vex-add-informe', selector: 'vex-add-informe',
templateUrl: './add-informe.component.html', templateUrl: './add-informe.component.html',
...@@ -12,25 +19,46 @@ import { Objetivo_programaService } from 'src/app/modules/main/services/objetivo ...@@ -12,25 +19,46 @@ import { Objetivo_programaService } from 'src/app/modules/main/services/objetivo
export class AddInformeComponent implements OnInit { export class AddInformeComponent implements OnInit {
myForm: FormGroup; myForm: FormGroup;
dynamicForm: FormGroup;
showData: boolean = false; showData: boolean = false;
ShowDataAdd: boolean = false; showDataAdd: boolean = false;
ocultar: boolean = true; ocultar: boolean = true;
idRecuperado: number; idRecuperado: number;
//arreglo para la tabla
actividadesFormArray: FormArray;
//arreglos //arreglos
objetivosE: objetivoprograma[]=[]; detactproy!: detactproy ;
objetivosE: objetivoprograma[] = [];
objetivosA: objetivoprograma[] = [];
cabecera: actproy[] = [];
formularioEnviado: boolean;
formControlsMap: { [key: number]: FormGroup };
displayedColumns: string[] = [
'Nro',
'actividad',
'fechaIni',
'fechaFin',
'resultado',
'avance',
'observacion'
];
constructor( constructor(
private objetS: Objetivo_programaService, private objetS: Objetivo_programaService,
private datosCompartidos: Actualiza_datosService, private datosCompartidos: Actualiza_datosService,
private formBuilder: FormBuilder private formBuilder: FormBuilder,
private dialog: MatDialog,
private informeS: Informes_avanceService,
private cabeM: actproy,
private bodyM: detactproy
) { ) {
this.myForm = this.formBuilder.group({
Actividades: ['', Validators.required]
});
} }
ngOnInit(): void { ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10); this.initializeForm();
this.formControlsMap = {};
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'), 10);
this.datosCompartidos.datos$.subscribe(() => { this.datosCompartidos.datos$.subscribe(() => {
this.obtenerRegistros(); this.obtenerRegistros();
}); });
...@@ -40,24 +68,167 @@ export class AddInformeComponent implements OnInit { ...@@ -40,24 +68,167 @@ export class AddInformeComponent implements OnInit {
}); });
} }
obtenerRegistros(){ initializeForm() {
this.objetS.registrosRelacionadosConProyecto(this.idRecuperado).subscribe(data =>{ //this.actividadesFormArray = this.formBuilder.array([]);
this.objetivosE = data.filter( item => item.uzytavobjetivo_programatipo === 3); this.myForm = this.formBuilder.group({
console.log('impresión del arreglo', this.objetivosE) Actividades: ['', Validators.required],
observa: ['', Validators.required],
fecha: [{ value: new Date(), disabled: true }],
});
this.dynamicForm = this.formBuilder.group({});
}
obtenerRegistros() {
// Obtener los registros de objetivoprograma relacionados con el proyecto
this.objetS.registrosRelacionadosConProyecto(this.idRecuperado).subscribe(objetivosData => {
// Filtrar los registros de objetivoprograma según el primer filtro
this.objetivosE = objetivosData.filter(item => item.uzytavobjetivo_programatipo === 3);
//controles para los inputs en el form
// Obtener los registros de cabecera relacionados con el proyecto
this.informeS.obtenerCabecera().subscribe(cabeceraData => {
this.cabecera = cabeceraData.filter(item => item.uzytavproyec_id === this.idRecuperado);
// Filtrar nuevamente los registros de objetivoprograma excluyendo aquellos que ya tienen cabecera
this.objetivosE = this.objetivosE.filter(objetivo =>
!this.cabecera.some(cab => cab.uzytavobjetivo_programa_id === objetivo.uzytavobjetivo_programa_id)
);
});
// 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)
);
});
}
obtenerActi(id: number) {
this.objetS.obtenerParametros().subscribe(data => {
this.objetivosA = data.map(obje => {
// Create dynamic form control
this.createDynamicFormControls(obje.uzytavobjetivo_programa_id);
return obje
});
this.objetivosA = data.filter(item => item.uzytavproyec_id === this.idRecuperado && item.uzytavobjetivo_programatipo === 4 && item.uzytavobjetivo_programa_id_padre === id);
});
}
createDynamicFormControls(opciones: number) {
this.dynamicForm.addControl('resultado' + opciones,
this.formBuilder.control({ value: "", disabled: false },
[Validators.required]));
this.dynamicForm.addControl('porcentaje' + opciones,
this.formBuilder.control({ value: "", disabled: false },
[Validators.required]));
this.dynamicForm.addControl('observacion' + opciones,
this.formBuilder.control({ value: "", disabled: false },
[Validators.required]));
}
/*
actividadForm(actividad: any): FormGroup {
return this.formBuilder.group({
resultado: [' ', Validators.required],
avance: [' ', Validators.required],
observacion: [' ', Validators.required]
}); });
} }
*/
AgregarF() {
this.showDataAdd = true;
this.ocultar = false;
}
cancelarF() {
this.showDataAdd = false;
this.ocultar = true;
this.myForm.get('Actividades').reset();
this.myForm.reset();
}
onUpdate() {
if (this.myForm.valid) {
this.cabeM.uzytavproyec_id = this.idRecuperado;
const fechaIni = moment(this.myForm.get('fecha').value).utc().toDate();
const fechaHoraIni = new Date(fechaIni);
fechaHoraIni.setUTCHours(fechaHoraIni.getUTCHours() - 5);
AgregarF(){
this.cabeM.uzytavactproy_fech_regis = fechaHoraIni;
this.cabeM.uzytavobjetivo_programa_id = this.myForm.get('Actividades').value;
this.cabeM.uzytavactproy_observa = this.myForm.get('observa').value;
this.informeS.guardarCabecera(this.cabeM).subscribe(response => {
this.guardarBody(this.informeS.obtenerIdCabe());
this.cancelarF();
this.datosCompartidos.actualizarDatos(this.cabeM);
this.openModal();
});
}
} }
cancelarF(){ guardarBody(id: number){
if (this.myForm.valid) {
this.bodyM.uzytavactproy_id = id;
console.log('arreglo', this.objetivosA)
this.objetivosA.forEach(
opcion => {
const controlNameResultado = 'resultado' + opcion.uzytavobjetivo_programa_id;
const controlNamePorcentaje = 'porcentaje' + opcion.uzytavobjetivo_programa_id;
const controlNameObservacion = 'observacion' + opcion.uzytavobjetivo_programa_id;
const selectedValueId = this.dynamicForm.get(controlNameResultado)?.value;
const selectedValueIdPorcentaje = this.dynamicForm.get(controlNamePorcentaje)?.value;
const selectedValueIdObservacion = this.dynamicForm.get(controlNameObservacion)?.value;
if (selectedValueId !== null && selectedValueId !== undefined && selectedValueIdPorcentaje !== null && selectedValueIdPorcentaje !== undefined && selectedValueIdObservacion !== null && selectedValueIdObservacion !== undefined) {
// Crear el objeto EvaluacionProy con los valores necesarios
const detactproy: detactproy = {
uzytavactproy_id: id,
uzytavobjetivo_programa_id: opcion.uzytavobjetivo_programa_id,
uzytavdetactproyporcent: selectedValueIdPorcentaje,
uzytavdetactproyobserva: selectedValueIdObservacion,
uzytavdetactproyresultado: selectedValueId
// Agregar otros campos si es necesario
};
this.informeS.guardarParametros(detactproy).subscribe(() => {
});
}
});
}
} }
onUpdate(){
formatFecha(fecha: Date): string {
if (fecha === null) {
console.log('Agregar fecha:')
} else {
const dateObj = new Date(fecha);
return format(dateObj, 'dd-MM-yyyy');
}
} }
openModal() {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
disableClose: true
});
dialogRef.afterClosed().subscribe(result => {
this.formularioEnviado = true;
});
}
} }
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<td> <td>
{{i+1}} {{i+1}}
</td> </td>
<td>{{item.uzytavactproy_fech_regis}}</td> <td>{{formatFecha(item.uzytavactproy_fech_regis)}}</td>
<td>{{item.uzytavactproy_observa}}</td> <td>{{item.uzytavactproy_observa}}</td>
<td> <td>
<button> <button>
......
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { format } from 'date-fns';
import { actproy } from 'src/app/modules/main/Models/actproy'; import { actproy } from 'src/app/modules/main/Models/actproy';
import { detactproy } from 'src/app/modules/main/Models/detactproy'; import { detactproy } from 'src/app/modules/main/Models/detactproy';
import { objetivoprograma } from 'src/app/modules/main/Models/objetivoPrograma'; import { objetivoprograma } from 'src/app/modules/main/Models/objetivoPrograma';
...@@ -110,4 +111,10 @@ export class ListInformeComponent implements OnInit { ...@@ -110,4 +111,10 @@ export class ListInformeComponent implements OnInit {
this.activitySection.nativeElement.scrollIntoView({ behavior: 'smooth' }); this.activitySection.nativeElement.scrollIntoView({ behavior: 'smooth' });
} }
} }
formatFecha(fecha: Date): string {
const dateObj = new Date(fecha);
return format(dateObj, 'dd-MM-yyyy');
}
} }
<div class="modal-container"> <div class="modal-container">
<div class="modal-content"> <div class="modal-content">
<h2>Documento (Convenio o Carta de Participación) (.pdf)</h2> <h2>Documento (Convenio o Carta de Participación) (.pdf)</h2>
<form (ngSubmit)="submitForm()" #documentForm="ngForm"> <form (ngSubmit)="onSubmit()" [formGroup]="myForm">
<div class="form-group"> <div class="form-group">
<label for="pdfFile">Seleccionar archivo PDF:</label> <label for="pdfFile">Seleccionar archivo PDF:</label>
<input type="file" id="pdfFile" name="pdfFile" accept=".pdf" required #pdfInput> <input type="file" accept=".pdf" (change)="onFileChange($event)" formControlName="archivo">
</div> </div>
<div class="form-actions"> <div class="form-actions">
<button type="submit" [disabled]="!documentForm.form.valid">Guardar</button> <button type="submit" [disabled]="myForm.invalid">Guardar</button>
<button type="button" (click)="cerrarModal()">Cerrar</button> <button type="button" (click)="cerrarModal()">Cerrar</button>
</div> </div>
</form> </form>
......
import { Component, OnInit, Inject } from '@angular/core'; import { Component, OnInit, Inject } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { docompar } from 'src/app/modules/main/Models/docompar';
import { DatosEspeService } from 'src/app/modules/main/services/APIs Externas/Datos espe/datos-espe.service';
import { saveAs } from 'file-saver';
import { parametrosdet } from 'src/app/modules/main/Models/parametrosdet';
import { ParametrosdetService } from 'src/app/modules/main/services/parametrosdet/parametrosdet.service';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
@Component({ @Component({
selector: 'vex-add-documentos', selector: 'vex-add-documentos',
templateUrl: './add-documentos.component.html', templateUrl: './add-documentos.component.html',
styleUrls: ['./add-documentos.component.css'] styleUrls: ['./add-documentos.component.css']
}) })
export class AddDocumentosComponent implements OnInit { export class AddDocumentosComponent implements OnInit {
myForm: FormGroup;
selectedFile: File | null = null;
file: File;
enviarSolicitud = false;
formularioEnviado: boolean;
docompar: docompar;
constructor( constructor(
private dialogRef: MatDialogRef<AddDocumentosComponent>, private dialogRef: MatDialogRef<AddDocumentosComponent>,
@Inject(MAT_DIALOG_DATA) public data: { idConf: number } @Inject(MAT_DIALOG_DATA) public data: { idConf: number },
) { } private formBuilder: FormBuilder,
private datosEspeService: DatosEspeService,
private pdfService: ParametrosdetService,
private datosCompartidos: Actualiza_datosService
) {
this.docompar = new docompar();
}
ngOnInit(): void { ngOnInit(): void {
this.myForm = this.formBuilder.group({
archivo: [ '', Validators.required]
});
console.log('ID recibido:', this.data.idConf); console.log('ID recibido:', this.data.idConf);
} }
onFileSelected(event: any) {
this.selectedFile = event.target.files[0];
}
onFileChange(event: any) {
// Obtener el archivo seleccionado
const fileList: FileList = event.target.files;
if (fileList.length > 0) {
this.file = fileList[0];
}
}
async onSubmit() {
if (this.myForm.valid) {
const pdfData = await this.enviarPDF();
this.docompar.uzytavinstproy_id = this.data.idConf;
this.docompar.uzytavdocompar_nombre_url = pdfData.idPDF;
this.docompar.uzytavdocompar_nombre_doc = pdfData.filename;
this.pdfService.guardarPDF(this.docompar).subscribe(
response => {
this.datosCompartidos.actualizarDatos(this.docompar);
this.submitForm();
console.log('pdf enviado')
},
error => {
console.log(error)
}
);
}
}
async enviarPDF() {
const formData = new FormData();
formData.append('files', this.file);
formData.append('sistema', 'vinculacion');
try {
const response = await this.datosEspeService.saveDocument(formData);
return {
idPDF: response.uuid,
filename: response.fileName
};
} catch (error) {
console.error('Error al guardar el PDF en el servidor:', error);
throw error;
}
}
submitForm(){ submitForm(){
this.dialogRef.close(); this.dialogRef.close();
} }
...@@ -25,5 +97,4 @@ export class AddDocumentosComponent implements OnInit { ...@@ -25,5 +97,4 @@ export class AddDocumentosComponent implements OnInit {
this.dialogRef.close(); this.dialogRef.close();
} }
} }
...@@ -20,6 +20,10 @@ ...@@ -20,6 +20,10 @@
background-color: rgb(248, 249, 250); background-color: rgb(248, 249, 250);
} }
.btn{
padding: 0 2% 0 2%;
}
.rounder-nuevo { .rounder-nuevo {
border-radius: 50%; border-radius: 50%;
background-color: rgb(71, 127, 75); background-color: rgb(71, 127, 75);
......
...@@ -18,14 +18,13 @@ ...@@ -18,14 +18,13 @@
<ng-container *ngIf="documentoInst.length > 0; else noRegistros"> <ng-container *ngIf="documentoInst.length > 0; else noRegistros">
<tr *ngFor="let dato of documentoInst; let i = index" > <tr *ngFor="let dato of documentoInst; let i = index" >
<td>{{ i+1 }}</td> <td>{{ i+1 }}</td>
<td>{{ dato.UZYTAVDOCOMPAR_NOMBRE_DOC }}</td> <td>{{ dato.uzytavdocompar_nombre_doc }}</td>
<td> <td>
<button> <button class="btn" (click)="verPDF(dato.uzytavdocompar_nombre_url,dato.uzytavdocompar_nombre_doc)">
<mat-icon class="warn" (click)="eliminarPDF()">delete</mat-icon> <mat-icon aria-placeholder="Ver PDF">visibility</mat-icon>
</button> </button>
<button> <button >
<mat-icon color="azul" (click)="descargar()">download</mat-icon> <mat-icon color="warn" (click)="eliminarParametro(dato.uzytavdocompar_code)">delete</mat-icon>
</button> </button>
</td> </td>
</tr> </tr>
......
...@@ -2,7 +2,10 @@ import { Component, OnInit,Input } from '@angular/core'; ...@@ -2,7 +2,10 @@ import { Component, OnInit,Input } from '@angular/core';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { docompar } from 'src/app/modules/main/Models/docompar'; import { docompar } from 'src/app/modules/main/Models/docompar';
import { AddDocumentosComponent } from '../add-documentos/add-documentos.component'; import { AddDocumentosComponent } from '../add-documentos/add-documentos.component';
import { ParametrosdetService } from 'src/app/modules/main/services/parametrosdet/parametrosdet.service';
import { ActualizarAnexosService } from 'src/app/modules/main/services/actualizar_anexos/actualizar-anexos.service';
import { saveAs } from 'file-saver';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
@Component({ @Component({
selector: 'vex-list-documentos', selector: 'vex-list-documentos',
templateUrl: './list-documentos.component.html', templateUrl: './list-documentos.component.html',
...@@ -11,31 +14,87 @@ import { AddDocumentosComponent } from '../add-documentos/add-documentos.compone ...@@ -11,31 +14,87 @@ import { AddDocumentosComponent } from '../add-documentos/add-documentos.compone
export class ListDocumentosComponent implements OnInit { export class ListDocumentosComponent implements OnInit {
@Input() idConf: number; @Input() idConf: number;
documentoInst: docompar[] = []; documentoInst!: docompar[];
showModal = false; showModal = false;
constructor( constructor(
private dialog: MatDialog private dialog: MatDialog,
private pdfService: ParametrosdetService,
private datosCompartidos: Actualiza_datosService
) { } ) { }
ngOnInit(): void { ngOnInit(): void {
this.datosCompartidos.datos$.subscribe(() =>{
this.obtenerDocumentos();
});
this.pdfService.parametrosActualizados.subscribe(() =>{
this.obtenerDocumentos();
});
} }
GuardarParametro(){ GuardarParametro(){
const dialogRef = this.dialog.open(AddDocumentosComponent, { const dialogRef = this.dialog.open(AddDocumentosComponent, {
data: { idConf: this.idConf } // Puedes pasar datos al componente modal si es necesario data: { idConf: this.idConf }
}); });
dialogRef.afterClosed().subscribe(result => { dialogRef.afterClosed().subscribe(result => {
// Puedes realizar acciones después de que la ventana modal se cierra si lo deseas
}); });
} }
verPDF(id: string, nombre: string) {
this.pdfService.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
}
obtenerDocumentos(){
this.pdfService.obtenerNombrePDF().subscribe(data => {
this.documentoInst = data.filter(item => item.uzytavinstproy_id === this.idConf);
});
}
descargar(){ descargar(){
} }
eliminarPDF(){ eliminarParametro(id: number) {
const confirmacion = confirm('¿Estás seguro de que quieres eliminar este parámetro?');
if (confirmacion) {
this.pdfService.eliminarPDF(id).subscribe(
() => {
// Manejar la eliminación exitosa
console.log('Registro eliminado correctamente');
this.obtenerDocumentos();
},
(error) => {
this.obtenerDocumentos();
// Manejar el error en caso de que ocurra
console.error('Error al eliminar el registro', error);
}
);
}
} }
} }
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
} }
.contenedorP { .contenedorP {
width: 96%; width: 96%;
margin-left: 2%; margin-left: 2%;
...@@ -16,20 +16,20 @@ ...@@ -16,20 +16,20 @@
margin-top: 10%; margin-top: 10%;
background-color: white; background-color: white;
} }
.mat-mdc-radio-button ~ .mat-mdc-radio-button { .mat-mdc-radio-button ~ .mat-mdc-radio-button {
margin-left: 16px; margin-left: 16px;
} }
.mat-radio-button{ .mat-radio-button{
margin-right: 10px; margin-right: 10px;
} }
.form-container { .form-container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} }
.formulario { .formulario {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
...@@ -39,53 +39,53 @@ ...@@ -39,53 +39,53 @@
background-color: white; background-color: white;
border-radius: 10px; border-radius: 10px;
} }
.contenedor-dos { .contenedor-dos {
margin-top: 30px; margin-top: 30px;
padding: 0.9375rem 20px; padding: 0.9375rem 20px;
position: relative; position: relative;
} }
.form-field { .form-field {
width: 100%; width: 100%;
margin-bottom: 20px; margin-bottom: 20px;
} }
.save-button { .save-button {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
margin-bottom: 16px; margin-bottom: 16px;
} }
.dos-secciones { .dos-secciones {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-between; justify-content: space-between;
} }
.form-field-dos{ .form-field-dos{
flex-basis: 48%; flex-basis: 48%;
} }
.separator { .separator {
margin: 0 5px; margin: 0 5px;
opacity: 0; opacity: 0;
pointer-events: none; pointer-events: none;
} }
/*Estilos para utilizar con la tabla*/ /*Estilos para utilizar con la tabla*/
.principal { .principal {
text-align: center; text-align: center;
margin-bottom: 2%; margin-bottom: 2%;
} }
.grid-container { .grid-container {
display: grid; display: grid;
grid-template-columns: 5% 10% 45% 10% 5% 10% 15%; grid-template-columns: 5% 10% 45% 10% 5% 10% 15%;
border: 1px solid #ccc; border: 1px solid #ccc;
} }
#cabecera { #cabecera {
background: linear-gradient(135deg, background: linear-gradient(135deg,
var(--background-base) 22px, var(--background-base) 22px,
...@@ -108,8 +108,8 @@ ...@@ -108,8 +108,8 @@
background-color: var(--background-base); background-color: var(--background-base);
background-size: 64px 128px; background-size: 64px 128px;
} }
.Column { .Column {
padding-left: 0px; padding-left: 0px;
padding-right: 0px; padding-right: 0px;
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; */ text-overflow: ellipsis; */
} }
.Column1 { .Column1 {
padding-left: 0px; padding-left: 0px;
padding-right: 0px; padding-right: 0px;
...@@ -128,13 +128,13 @@ ...@@ -128,13 +128,13 @@
white-space: normal; white-space: normal;
overflow: visible; overflow: visible;
} }
.Column2 { .Column2 {
width: 25px; width: 25px;
padding-left: 0px; padding-left: 0px;
padding-right: 0px; padding-right: 0px;
} }
.volver{ .volver{
position: absolute; position: absolute;
top: 50%; top: 50%;
...@@ -152,52 +152,52 @@ ...@@ -152,52 +152,52 @@
border: none; border: none;
outline: none; outline: none;
cursor: pointer; cursor: pointer;
} }
.grid-item { .grid-item {
font-weight: bold; font-weight: bold;
} }
.grid-opciones { .grid-opciones {
display: grid; display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr; grid-template-columns: 1fr 1fr 1fr 1fr;
} }
.titulo { .titulo {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.titulo-texto { .titulo-texto {
font-weight: bold; font-weight: bold;
font-size: 18px; font-size: 18px;
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif; font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
margin-right: 10px; margin-right: 10px;
} }
.componente { .componente {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.card { .card {
background-color: rgb(252, 252, 251) background-color: rgb(252, 252, 251)
} }
.colorEditar { .colorEditar {
color: blue; color: blue;
} }
.colorEditar svg { .colorEditar svg {
fill: blue; fill: blue;
} }
.contenedorP { .contenedorP {
width: 96%; width: 96%;
margin-left: 2%; margin-left: 2%;
...@@ -211,7 +211,7 @@ ...@@ -211,7 +211,7 @@
.contenedor:not(:last-child) { .contenedor:not(:last-child) {
margin-bottom: 2px; margin-bottom: 2px;
} }
.separador{ .separador{
margin-top: 5%; margin-top: 5%;
} }
...@@ -225,7 +225,7 @@ ...@@ -225,7 +225,7 @@
position: relative; position: relative;
z-index: 1; z-index: 1;
} }
.sobremontado { .sobremontado {
position: relative; position: relative;
align-items: center; align-items: center;
...@@ -244,19 +244,19 @@ ...@@ -244,19 +244,19 @@
border-radius: 10px; border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
} }
.sobremontado span { .sobremontado span {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
margin: 0; margin: 0;
} }
.sobremontado mat-icon { .sobremontado mat-icon {
margin-right: 5px; margin-right: 5px;
} }
.icono-instituciones { .icono-instituciones {
display: flex; display: flex;
align-items: center; align-items: center;
...@@ -265,7 +265,7 @@ ...@@ -265,7 +265,7 @@
font-size: 20px; font-size: 20px;
cursor: pointer; cursor: pointer;
} }
table { table {
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
...@@ -273,24 +273,24 @@ ...@@ -273,24 +273,24 @@
font-family: 'Roboto', sans-serif; font-family: 'Roboto', sans-serif;
color: #333; color: #333;
} }
table th, table th,
table td { table td {
padding: 12px; padding: 12px;
text-align: left; text-align: left;
border-bottom: 1px solid #e0e0e0; border-bottom: 1px solid #e0e0e0;
} }
table th { table th {
background-color: rgb(248, 249, 250); background-color: rgb(248, 249, 250);
font-weight: bold; font-weight: bold;
text-transform: uppercase; text-transform: uppercase;
} }
table td { table td {
position: relative; position: relative;
} }
table td::after { table td::after {
content: ""; content: "";
position: absolute; position: absolute;
...@@ -300,8 +300,8 @@ ...@@ -300,8 +300,8 @@
height: 1px; height: 1px;
background-color: #e0e0e0; background-color: #e0e0e0;
} }
input[type="text"] { input[type="text"] {
width: 200px; width: 200px;
padding: 8px; padding: 8px;
...@@ -309,36 +309,36 @@ ...@@ -309,36 +309,36 @@
border-radius: 5px; border-radius: 5px;
margin-left: 10px; margin-left: 10px;
} }
.area-busqueda { .area-busqueda {
padding: 20px; padding: 20px;
margin-top: 30px; margin-top: 30px;
text-align: right; text-align: right;
} }
@media (max-width: 600px) { @media (max-width: 600px) {
table { table {
font-size: 14px; font-size: 14px;
} }
table th, table th,
table td { table td {
padding: 8px; padding: 8px;
} }
} }
.btn-observar { .btn-observar {
border-radius: 50%; border-radius: 50%;
width: 36px; width: 36px;
height: 36px; height: 36px;
} }
.colorsito{ .colorsito{
background-color: rgb(248, 249, 250); background-color: rgb(248, 249, 250);
} }
.rounder{ .rounder{
border-radius: 50%; border-radius: 50%;
background-color: rgb(71, 127, 75); background-color: rgb(71, 127, 75);
...@@ -352,63 +352,63 @@ ...@@ -352,63 +352,63 @@
outline: none; outline: none;
cursor: pointer; cursor: pointer;
} }
.rounder mat-icon { .rounder mat-icon {
font-size: 24px; font-size: 24px;
color: #fff; color: #fff;
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.rounder { .rounder {
width: 30%; width: 30%;
} }
} }
@media (max-width: 480px) { @media (max-width: 480px) {
.rounder { .rounder {
width: 40%; width: 40%;
} }
} }
.margen{ .margen{
margin: 10px; margin: 10px;
padding: 10px; padding: 10px;
margin-bottom: 10px; margin-bottom: 10px;
} }
.bordes { .bordes {
border-collapse: collapse; border-collapse: collapse;
width: 100%; width: 100%;
} }
.bordes th, .bordes th,
.bordes td { .bordes td {
border: 1px solid black; border: 1px solid black;
padding: 8px; padding: 8px;
} }
.bordes th { .bordes th {
background-color: #f5f5f5; background-color: #f5f5f5;
font-weight: bold; font-weight: bold;
} }
.bordes td { .bordes td {
background-color: #ffffff; background-color: #ffffff;
} }
.bordes tr:nth-child(even) { .bordes tr:nth-child(even) {
background-color: #f9f9f9; background-color: #f9f9f9;
} }
.bordes tr:hover { .bordes tr:hover {
background-color: #eaeaea; background-color: #eaeaea;
} }
.bordes th:last-child, .bordes th:last-child,
.bordes td:last-child { .bordes td:last-child {
border-bottom: none; border-bottom: none;
} }
.rounder-nuevo { .rounder-nuevo {
border-radius: 50%; border-radius: 50%;
background-color: rgb(71, 127, 75); background-color: rgb(71, 127, 75);
...@@ -423,26 +423,26 @@ ...@@ -423,26 +423,26 @@
cursor: pointer; cursor: pointer;
margin-left: 5px; margin-left: 5px;
} }
.white-icon { .white-icon {
color: white; color: white;
} }
.btn{ .btn{
padding: 0 2% 0 2%; padding: 0 2% 0 2%;
} }
.azul { .azul {
color: blue; color: blue;
} }
.institution { .institution {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.institution-name { .institution-name {
font-size: 20px; font-size: 20px;
/* Tamaño de fuente deseado */ /* Tamaño de fuente deseado */
...@@ -451,7 +451,7 @@ ...@@ -451,7 +451,7 @@
margin-right: 30px; margin-right: 30px;
/* Espacio entre el icono y el nombre */ /* Espacio entre el icono y el nombre */
} }
.add-icon { .add-icon {
display: flex; display: flex;
align-items: center; align-items: center;
...@@ -468,22 +468,18 @@ ...@@ -468,22 +468,18 @@
/* Color del signo "+" en el círculo */ /* Color del signo "+" en el círculo */
font-size: 25px; font-size: 25px;
/* Tamaño del signo "+" */ /* Tamaño del signo "+" */
} }
.label-negrita{ .label-negrita{
font-weight: bold; font-weight: bold;
margin-right: 10px; margin-right: 10px;
} }
.separa{ .separa{
margin-top: 3%; margin-top: 3%;
} }
.div-container {
display: flex;
align-items: center;
}
\ No newline at end of file
import { Component, OnInit, ElementRef, ViewChild } from '@angular/core'; import { Component, OnInit, ElementRef, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { objetivoprograma } from 'src/app/modules/main/Models/objetivoPrograma'; import { objetivoprograma } from 'src/app/modules/main/Models/objetivoPrograma';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.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 { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
...@@ -62,39 +62,39 @@ export class AddMatrizLogicoComponent implements OnInit { ...@@ -62,39 +62,39 @@ export class AddMatrizLogicoComponent implements OnInit {
ngOnInit(): void { ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'), 10); this.idRecuperado = parseInt(localStorage.getItem('proyectoId'), 10);
this.myForm = this.formBuilder.group({ this.myForm = this.formBuilder.group({
fin: [], fin: ['', Validators.required],
tipoindiFin: [], tipoindiFin: ['', Validators.required],
valorindicadorFin: [], valorindicadorFin: ['', Validators.required],
indicadorFin: [], indicadorFin: ['', Validators.required],
medioVeriFin: [], medioVeriFin: ['', Validators.required],
supuestoFin: [] supuestoFin: ['', Validators.required]
}); });
this.myForm2 = this.formBuilder.group({ this.myForm2 = this.formBuilder.group({
objetivoG: [], objetivoG: ['', Validators.required],
tipoindiObjG: [], tipoindiObjG: ['', Validators.required],
valorindicadorObjG: [], valorindicadorObjG: ['', Validators.required],
indicadorObjG: [], indicadorObjG: ['', Validators.required],
medioVeriObjG: [], medioVeriObjG: ['', Validators.required],
supuestoObjG: [] supuestoObjG: ['', Validators.required]
}); });
this.myForm3 = this.formBuilder.group({ this.myForm3 = this.formBuilder.group({
objetivoEspe: [], objetivoEspe: ['', Validators.required],
tipoindiObjEspe: [], tipoindiObjEspe: ['', Validators.required],
valorindicadorObjEspe: [], valorindicadorObjEspe: ['', Validators.required],
indicadorObjEspe: [], indicadorObjEspe: ['', Validators.required],
medioVeriObjEspe: [], medioVeriObjEspe: ['', Validators.required],
supuestoObjEspe: [] supuestoObjEspe: ['', Validators.required]
}); });
this.myForm4 = this.formBuilder.group({ this.myForm4 = this.formBuilder.group({
actividadEspe: [], actividadEspe: ['', Validators.required],
tipoindiActi: [], tipoindiActi: ['', Validators.required],
valorindicadorActi: [], valorindicadorActi: ['', Validators.required],
indicadorObjActi: [], indicadorObjActi: ['', Validators.required],
medioVeriActi: [], medioVeriActi: ['', Validators.required],
supuestoActi: [] supuestoActi: ['', Validators.required]
}); });
this.datosCompartidos.datos$.subscribe(() => { this.datosCompartidos.datos$.subscribe(() => {
......
...@@ -454,6 +454,31 @@ ...@@ -454,6 +454,31 @@
<!--Stepper version dos--> <!--Stepper version dos-->
</mat-expansion-panel> </mat-expansion-panel>
<!--Calificación-->
<mat-expansion-panel hideToggle>
<mat-expansion-panel-header>
<mat-panel-title>
<strong>Calificación Comisión de 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.- Calificación Comisión
</mat-panel-title>
</mat-expansion-panel-header>
<app-add-calificacion-vinculacion></app-add-calificacion-vinculacion>
<!--fin-->
</mat-expansion-panel>
</mat-expansion-panel>
<!--Seguimiento--> <!--Seguimiento-->
<mat-expansion-panel hideToggle> <mat-expansion-panel hideToggle>
<mat-expansion-panel-header> <mat-expansion-panel-header>
...@@ -511,19 +536,6 @@ ...@@ -511,19 +536,6 @@
<!--fin--> <!--fin-->
</mat-expansion-panel> </mat-expansion-panel>
<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>
4.- Carta Compromiso Comunidad
</mat-panel-title>
</mat-expansion-panel-header>
<vex-carta-compromiso-comu></vex-carta-compromiso-comu>
<!--fin-->
</mat-expansion-panel>
</mat-expansion-panel> </mat-expansion-panel>
<!--Ejecución--> <!--Ejecución-->
......
...@@ -18,3 +18,9 @@ ...@@ -18,3 +18,9 @@
.editor-separator { .editor-separator {
margin-top: 15px; margin-top: 15px;
} }
.error-message {
color: red;
font-size: 14px;
margin-top: 5px;
}
...@@ -18,3 +18,9 @@ ...@@ -18,3 +18,9 @@
.editor-separator { .editor-separator {
margin-top: 15px; margin-top: 15px;
} }
.error-message {
color: red;
font-size: 14px;
margin-top: 5px;
}
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<button mat-raised-button color="primary" *ngIf="!cambio" <button mat-raised-button color="primary" *ngIf="!cambio"
(click)="cambiar()">Editar</button> (click)="cambiar()">Editar</button>
<button mat-raised-button color="primary" *ngIf="cambio" <button mat-raised-button color="primary" *ngIf="cambio"
(click)="onSubmit()">Guardar</button> >Guardar</button>
<span class="separator"></span> <span class="separator"></span>
<button mat-raised-button color="warn" *ngIf="cambio" <button mat-raised-button color="warn" *ngIf="cambio"
(click)="cancelado()">Cancelar</button> (click)="cancelado()">Cancelar</button>
...@@ -19,6 +19,10 @@ ...@@ -19,6 +19,10 @@
<ckeditor formControlName="viabilidad" class="custom-ckeditor" <ckeditor formControlName="viabilidad" class="custom-ckeditor"
[disabled]="!isEditorEnabled" [style.height]="editorHeight" [disabled]="!isEditorEnabled" [style.height]="editorHeight"
[editor]="Editor"></ckeditor> [editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('viabilidad').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
<div class="editor-separator"></div> <div class="editor-separator"></div>
<div> <div>
...@@ -27,6 +31,10 @@ ...@@ -27,6 +31,10 @@
<ckeditor formControlName="perderia" class="custom-ckeditor" <ckeditor formControlName="perderia" class="custom-ckeditor"
[disabled]="!isEditorEnabled" [style.height]="editorHeight" [disabled]="!isEditorEnabled" [style.height]="editorHeight"
[editor]="Editor"></ckeditor> [editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('perderia').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
<div class="editor-separator"></div> <div class="editor-separator"></div>
<div> <div>
...@@ -35,6 +43,10 @@ ...@@ -35,6 +43,10 @@
<ckeditor formControlName="resultadoO" class="custom-ckeditor" <ckeditor formControlName="resultadoO" class="custom-ckeditor"
[disabled]="!isEditorEnabled" [style.height]="editorHeight" [disabled]="!isEditorEnabled" [style.height]="editorHeight"
[editor]="Editor"></ckeditor> [editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('resultadoO').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>
......
...@@ -47,9 +47,9 @@ export class EditViabilidadComponent implements OnInit { ...@@ -47,9 +47,9 @@ export class EditViabilidadComponent implements OnInit {
this.obtenerRegistros(); this.obtenerRegistros();
this.myForm = this.formBuilder.group({ this.myForm = this.formBuilder.group({
viabilidad: [this.proyectos.uzytavproyec_viabilidad], viabilidad: [this.proyectos.uzytavproyec_viabilidad,[Validators.required, Validators.maxLength(3000)]],
perderia: [this.proyectos.uzytavproyec_perderia], perderia: [this.proyectos.uzytavproyec_perderia,[Validators.required, Validators.maxLength(3000)]],
resultadoO: [this.proyectos.uzytavproyec_resultados] resultadoO: [this.proyectos.uzytavproyec_resultados,[Validators.required, Validators.maxLength(3000)]]
}); });
} }
......
...@@ -26,8 +26,7 @@ ...@@ -26,8 +26,7 @@
<!--boton para agregar las fechas--> <!--boton para agregar las fechas-->
<div class="save-button"> <div class="save-button">
<button mat-raised-button color="primary" <button mat-raised-button color="primary"
[disabled]="!myForm.valid">Agregar [disabled]="!myForm.valid">Asignar Comisión</button>
Fecha</button>
<span class="separator"></span> <span class="separator"></span>
</div> </div>
<div class="separator2"></div> <div class="separator2"></div>
......
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AddImagenesComponent } from './add-imagenes.component';
describe('AddImagenesComponent', () => {
let component: AddImagenesComponent;
let fixture: ComponentFixture<AddImagenesComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ AddImagenesComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(AddImagenesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { MatDialog } from '@angular/material/dialog';
import { AnexosImagenes } from 'src/app/modules/main/Models/anexos-imagenes';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { ActualizarAnexosService } from 'src/app/modules/main/services/actualizar_anexos/actualizar-anexos.service';
import { AnexosImagenesService } from 'src/app/modules/main/services/anexos-imagenes/anexos-imagenes.service';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { EnvioFormularioComponent } from '../../../envio-formulario/envio-formulario.component';
@Component({
selector: 'vex-add-imagenes',
templateUrl: './add-imagenes.component.html',
styleUrls: ['./add-imagenes.component.css']
})
export class AddImagenesComponent implements OnInit {
idRecuperado: number;
myForm: FormGroup;
selectedFile: File | null = null;
file: File;
anexosImagenes: AnexosImagenes = {};
enviarSolicitud = false;
formularioEnviado: boolean
cambio: boolean;
constructor(
private formBuilder: FormBuilder,
private anexosImagenesService: AnexosImagenesService,
private dialog: MatDialog,
private actualizarAnexosService: ActualizarAnexosService,
private datosCompartidos: Actualiza_datosService,
private idCompartido: Compartir_idService,
) { }
ngOnInit(): void {
this.idRecuperado = this.idCompartido.getIdGuardado();
this.cambio = false;
this.myForm = this.formBuilder.group({
archivo: [{ value: '', disabled: true }, Validators.required]
});
}
onFileSelected(event: any) {
this.selectedFile = event.target.files[0];
}
onFileChange(event: any) {
// Obtener el archivo seleccionado
const fileList: FileList = event.target.files;
if (fileList.length > 0) {
this.file = fileList[0];
}
}
openModal() {
const dialogRef = this.dialog.open(EnvioFormularioComponent, {
disableClose: true
});
dialogRef.afterClosed().subscribe(result => {
this.formularioEnviado = true;
});
}
onSubmit() {
if (this.myForm.valid) {
this.anexosImagenes.uzytavproyec_id = this.idRecuperado;
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;
//this.myForm.get('fechaInicio').enable();
this.myForm.get('archivo').enable();
}
cancelado() {
this.cambio = false;
this.myForm.disable();
}
guardar() {
this.cambio = false;
this.myForm.disable();
this.myForm.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 "+" */
}
<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="Fecha Inicio" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header> Fecha de Subida </th>
<td class="Column" mat-cell *matCellDef="let dato"> {{formatFecha(dato.uzytavanexospr_fech_subida)}} </td>
</ng-container>
<ng-container matColumnDef="Nombre" class="Column">
<th class="Column" mat-header-cell *matHeaderCellDef mat-sort-header> Nombre </th>
<td class="Column" mat-cell *matCellDef="let dato"> {{dato.uzytavanexospr_nombre}} </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">
<button class="btn" (click)="verImagen(dato.uzytavanexospr_id)">
<mat-icon aria-placeholder="Ver PDF">visibility</mat-icon>
</button>
<!--eliminar-->
<button>
<mat-icon color="warn"
(click)="eliminarParametro(dato.uzytavanexospr_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>
</div>
</div>
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ListImagenesComponent } from './list-imagenes.component';
describe('ListImagenesComponent', () => {
let component: ListImagenesComponent;
let fixture: ComponentFixture<ListImagenesComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ ListImagenesComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(ListImagenesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MatTableDataSource } from '@angular/material/table';
import { AnexosImagenes } from 'src/app/modules/main/Models/anexos-imagenes';
import { Actualiza_datosService } from 'src/app/modules/main/services/actualiza_datos/actualiza_datos.service';
import { AnexosImagenesService } from 'src/app/modules/main/services/anexos-imagenes/anexos-imagenes.service';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { format } from 'date-fns';
@Component({
selector: 'vex-list-imagenes',
templateUrl: './list-imagenes.component.html',
styleUrls: ['./list-imagenes.component.css']
})
export class ListImagenesComponent implements OnInit {
idRecuperado: number;
dataSource: MatTableDataSource<AnexosImagenes>;
anexosImagenes: AnexosImagenes[] = [];
displayedColumns: string[] = ['Nro', 'Fecha Inicio', 'Nombre', 'Acciones'];
constructor(
private idCompartido: Compartir_idService,
private datosCompar: Actualiza_datosService,
private anexosImagenesService: AnexosImagenesService
) {
this.dataSource = new MatTableDataSource<AnexosImagenes>([]);
}
ngOnInit(): void {
this.idRecuperado = this.idCompartido.getIdGuardado();
this.datosCompar.datos$.subscribe(() => {
this.obtenerRegistros();
});
this.anexosImagenesService.parametrosActualizados.subscribe(() => {
this.obtenerRegistros();
});
}
obtenerRegistros() {
if (this.idRecuperado !== undefined) {
this.anexosImagenesService.obtenerParametros(this.idRecuperado).subscribe(data => {
this.anexosImagenes = data;
this.dataSource.data = this.anexosImagenes;
});
}
}
verImagen(id: number): void {
this.anexosImagenesService.verImagen(id).subscribe(response => {
const filename = this.getFilenameFromResponse(response); // Obtener el nombre del archivo desde la respuesta
const blob = new Blob([response.body], { type: 'image/jpeg' }); // Ajustar el tipo de contenido a 'image/jpeg' o el tipo adecuado para tu caso
const url = window.URL.createObjectURL(blob);
const newTab = window.open();
if (newTab) {
newTab.location.href = url;
} else {
window.open(url, '_blank');
}
});
}
getFilenameFromResponse(response: any): string {
const contentDispositionHeader = response.headers.get('content-disposition');
if (contentDispositionHeader) {
const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDispositionHeader);
if (matches != null && matches[1]) {
return matches[1].replace(/['"]/g, '');
}
}
return 'image.jpg'; // Nombre predeterminado si no se puede obtener el nombre del archivo
}
eliminarParametro(id: number) {
const confirmacion = confirm('¿Desea eliminar el registro?');
if (confirmacion) {
this.anexosImagenesService.eliminarParametros(id).subscribe(
() => {
console.log('El registro se ha eliminado');
this.obtenerRegistros();
},
(error) => {
// No mostrar el error en la consola
this.obtenerRegistros();
}
);
}
}
formatFecha(fecha: Date): string {
const dateObj = new Date(fecha);
return format(dateObj, 'dd-MM-yyyy');
}
}
.editor-separator{
margin-top: 4%;
}
.error-message {
color: red;
font-size: 14px;
margin-top: 5px;
}
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<button mat-raised-button color="primary" *ngIf="!cambio" <button mat-raised-button color="primary" *ngIf="!cambio"
(click)="cambiar()">Editar</button> (click)="cambiar()">Editar</button>
<button mat-raised-button color="primary" *ngIf="cambio" <button mat-raised-button color="primary" *ngIf="cambio"
(click)="onSubmit()">Guardar</button> >Guardar</button>
<span class="separator"></span> <span class="separator"></span>
<button mat-raised-button color="warn" *ngIf="cambio" <button mat-raised-button color="warn" *ngIf="cambio"
(click)="cancelado()">Cancelar</button> (click)="cancelado()">Cancelar</button>
...@@ -16,20 +16,29 @@ ...@@ -16,20 +16,29 @@
<div> <div>
<label class="label-negrita"> Ubicación geográfica o área de intervención del programa:</label> <label class="label-negrita"> Ubicación geográfica o área de intervención del programa:</label>
<angular-editor formControlName="ubicacion" [config]="editorConfig"></angular-editor> <ckeditor formControlName="ubicacion" [style.height]="editorHeight" [disabled]="!isEditorEnabled" [editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('ubicacion').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div> </div>
</div>
<div class="editor-separator"></div>
<div> <div>
<label class="label-negrita"> Identificación, descripción y diagnóstico del problema que requiere solución:</label> <label class="label-negrita"> Identificación, descripción y diagnóstico del problema que requiere solución:</label>
<angular-editor formControlName="problema" [config]="editorConfig"></angular-editor> <ckeditor formControlName="problema" [style.height]="editorHeight" [disabled]="!isEditorEnabled" [editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('problema').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div> </div>
</div>
<div class="editor-separator"></div>
<div> <div>
<label class="label-negrita"> Línea base del programa:</label> <label class="label-negrita"> Línea base del programa:</label>
<angular-editor formControlName="base" [config]="editorConfig"></angular-editor> <ckeditor formControlName="base" [style.height]="editorHeight" [disabled]="!isEditorEnabled" [editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('base').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
</mat-card-content> </mat-card-content>
......
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AngularEditorConfig } from '@kolkov/angular-editor'; import { AngularEditorConfig } from '@kolkov/angular-editor';
import { Programa } from 'src/app/modules/main/Models/programa-v'; import { Programa } from 'src/app/modules/main/Models/programa-v';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service'; import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { ProgramaService } from 'src/app/modules/main/services/programa/programa.service'; import { ProgramaService } from 'src/app/modules/main/services/programa/programa.service';
import { EnvioFormularioComponent } from '../../envio-formulario/envio-formulario.component'; import { EnvioFormularioComponent } from '../../envio-formulario/envio-formulario.component';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import ClassicEditor from '../../../../Proyectos/ckeditor-custom/build/ckeditor';
@Component({ @Component({
selector: 'vex-diagnostico', selector: 'vex-diagnostico',
...@@ -13,70 +14,46 @@ import { MatDialog } from '@angular/material/dialog'; ...@@ -13,70 +14,46 @@ import { MatDialog } from '@angular/material/dialog';
styleUrls: ['./diagnostico.component.css'] styleUrls: ['./diagnostico.component.css']
}) })
export class DiagnosticoComponent implements OnInit { export class DiagnosticoComponent implements OnInit {
public Editor = ClassicEditor;
editorHeight = '400px';
htmlContent: string = ''; htmlContent: string = '';
idRecuperado: number;
myForm: FormGroup; myForm: FormGroup;
cambio: boolean; cambio: boolean;
isEditorEnabled = false;
formularioEnviado: boolean; formularioEnviado: boolean;
private programa: Programa = new Programa(); private programa: Programa = new Programa();
editorConfig: AngularEditorConfig = {
editable: false,
spellcheck: true,
height: '10rem',
minHeight: '5rem',
translate: 'yes',
enableToolbar: true,
showToolbar: true,
placeholder: 'Enter text here...',
defaultParagraphSeparator: '',
defaultFontName: '',
defaultFontSize: '',
fonts: [
{ class: 'arial', name: 'Arial' },
{ class: 'times-new-roman', name: 'Times New Roman' },
{ class: 'calibri', name: 'Calibri' },
{ class: 'comic-sans-ms', name: 'Comic Sans MS' }
],
customClasses: [
{
name: 'quote',
class: 'quote',
},
{
name: 'redText',
class: 'redText'
},
{
name: 'titleText',
class: 'titleText',
tag: 'h1',
},
]
};
constructor(private formBuilder: FormBuilder,
constructor(
private formBuilder: FormBuilder,
private programaService: ProgramaService, private programaService: ProgramaService,
private compartiId: Compartir_idService, private compartiId: Compartir_idService,
private dialog: MatDialog) { } private dialog: MatDialog) { }
cambiar() { cambiar() {
this.cambio = true; this.cambio = true;
this.editorConfig.editable = true; this.isEditorEnabled = true;
} }
cancelado() {
this.cambio = false; cancelado() {
this.editorConfig.editable = false; this.cambio = false;
} this.isEditorEnabled = false;
}
ngOnInit(): void { ngOnInit(): void {
this.idRecuperado = parseInt(localStorage.getItem('proyectoId'),10);
this.programa = new Programa(); this.programa = new Programa();
this.obtenerRegistros(); this.obtenerRegistros();
this.myForm = this.formBuilder.group({ this.myForm = this.formBuilder.group({
ubicacion: [this.programa.uzytavprograma_vubicacion], ubicacion: [this.programa.uzytavprograma_vubicacion, [Validators.required, Validators.maxLength(3000)]],
problema: [this.programa.uzytavprograma_vdiagnostico], problema: [this.programa.uzytavprograma_vdiagnostico, [Validators.required, Validators.maxLength(3000)]],
base: [this.programa.uzytavprograma_vlinea_base] base: [this.programa.uzytavprograma_vlinea_base, [Validators.required, Validators.maxLength(3000)]]
}); });
} }
onSubmit() { onSubmit() {
if (this.myForm.valid) { if (this.myForm.valid) {
try { try {
...@@ -85,7 +62,7 @@ export class DiagnosticoComponent implements OnInit { ...@@ -85,7 +62,7 @@ export class DiagnosticoComponent implements OnInit {
this.programa.uzytavprograma_vdiagnostico = this.myForm.get('problema').value; this.programa.uzytavprograma_vdiagnostico = this.myForm.get('problema').value;
this.programa.uzytavprograma_vlinea_base = this.myForm.get('base').value; this.programa.uzytavprograma_vlinea_base = this.myForm.get('base').value;
this.programaService.modificarParametros(id_recuperado, this.programa).subscribe(response => { this.programaService.modificarParametros(id_recuperado, this.programa).subscribe(response => {
this.editorConfig.editable = false; this.isEditorEnabled = false;
this.cambio = false; this.cambio = false;
this.openModal(); this.openModal();
}); });
...@@ -101,7 +78,7 @@ export class DiagnosticoComponent implements OnInit { ...@@ -101,7 +78,7 @@ export class DiagnosticoComponent implements OnInit {
this.programaService.obtenerParametrosId(id_recuperado).subscribe(data => { this.programaService.obtenerParametrosId(id_recuperado).subscribe(data => {
this.programa = data; this.programa = data;
this.myForm.patchValue({ this.myForm.patchValue({
resumen: this.programa.uzytavprograma_vresumen, ubicacion: this.programa.uzytavprograma_vubicacion,
problema: this.programa.uzytavprograma_vdiagnostico, problema: this.programa.uzytavprograma_vdiagnostico,
base: this.programa.uzytavprograma_vlinea_base base: this.programa.uzytavprograma_vlinea_base
}); });
......
.error-message {
color: red;
font-size: 14px;
margin-top: 5px;
}
...@@ -16,14 +16,24 @@ ...@@ -16,14 +16,24 @@
<div> <div>
<label class="label-negrita"> Metas del Programa:</label> <label class="label-negrita"> Metas del Programa:</label>
<angular-editor formControlName="metas" [config]="editorConfig"></angular-editor> <ckeditor formControlName="metas" class="custom-ckeditor"
[disabled]="!isEditorEnabled" [style.height]="editorHeight"
[editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('metas').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
<div> <div>
<label class="label-negrita"> Políticas del Programa para la ejecución de Proyectos:</label> <label class="label-negrita"> Políticas del Programa para la ejecución de Proyectos:</label>
<angular-editor formControlName="politica" [config]="editorConfig"></angular-editor> <ckeditor formControlName="politica" class="custom-ckeditor"
[disabled]="!isEditorEnabled" [style.height]="editorHeight"
[editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('politica').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
</mat-card-content> </mat-card-content>
......
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AngularEditorConfig } from '@kolkov/angular-editor'; import { AngularEditorConfig } from '@kolkov/angular-editor';
import { Programa } from 'src/app/modules/main/Models/programa-v'; import { Programa } from 'src/app/modules/main/Models/programa-v';
import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service'; import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/compartir_id.service';
import { ProgramaService } from 'src/app/modules/main/services/programa/programa.service'; import { ProgramaService } from 'src/app/modules/main/services/programa/programa.service';
import ClassicEditor from '../../../Proyectos/ckeditor-custom/build/ckeditor';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { EnvioFormularioComponent } from '../envio-formulario/envio-formulario.component'; import { EnvioFormularioComponent } from '../envio-formulario/envio-formulario.component';
...@@ -14,45 +15,14 @@ import { EnvioFormularioComponent } from '../envio-formulario/envio-formulario.c ...@@ -14,45 +15,14 @@ import { EnvioFormularioComponent } from '../envio-formulario/envio-formulario.c
styleUrls: ['./estra-e.component.css'] styleUrls: ['./estra-e.component.css']
}) })
export class EstraEComponent implements OnInit { export class EstraEComponent implements OnInit {
htmlContent: string = ''; public Editor = ClassicEditor;
myForm: FormGroup; myForm: FormGroup;
cambio: boolean; cambio: boolean;
idRecuperado: number;
formularioEnviado: boolean; formularioEnviado: boolean;
private programa: Programa = new Programa(); private programa: Programa = new Programa();
editorConfig: AngularEditorConfig = { editorHeight = '400px';
editable: false, isEditorEnabled = false;
spellcheck: true,
height: '10rem',
minHeight: '5rem',
translate: 'yes',
enableToolbar: true,
showToolbar: true,
placeholder: 'Enter text here...',
defaultParagraphSeparator: '',
defaultFontName: '',
defaultFontSize: '',
fonts: [
{ class: 'arial', name: 'Arial' },
{ class: 'times-new-roman', name: 'Times New Roman' },
{ class: 'calibri', name: 'Calibri' },
{ class: 'comic-sans-ms', name: 'Comic Sans MS' }
],
customClasses: [
{
name: 'quote',
class: 'quote',
},
{
name: 'redText',
class: 'redText'
},
{
name: 'titleText',
class: 'titleText',
tag: 'h1',
},
]
};
constructor(private formBuilder: FormBuilder, constructor(private formBuilder: FormBuilder,
private programaService: ProgramaService, private programaService: ProgramaService,
...@@ -61,31 +31,33 @@ export class EstraEComponent implements OnInit { ...@@ -61,31 +31,33 @@ export class EstraEComponent implements OnInit {
cambiar() { cambiar() {
this.cambio = true; this.cambio = true;
this.editorConfig.editable = true; this.isEditorEnabled = true;
} }
cancelado() { cancelado() {
this.cambio = false; this.cambio = false;
this.editorConfig.editable = false; this.isEditorEnabled = false;
} }
ngOnInit(): void { ngOnInit(): void {
this.idRecuperado = this.compartiId.getIdGuardado();
this.programa = new Programa(); this.programa = new Programa();
this.obtenerRegistros(); this.obtenerRegistros();
this.myForm = this.formBuilder.group({ this.myForm = this.formBuilder.group({
metas: [this.programa.uzytavprograma_vmetas], metas: [this.programa.uzytavprograma_vmetas,[Validators.required, Validators.maxLength(3000)]],
politica: [this.programa.uzytavprograma_vpoliticas], politica: [this.programa.uzytavprograma_vpoliticas,[Validators.required, Validators.maxLength(3000)]],
}); });
} }
onSubmit() { onSubmit() {
if (this.myForm.valid) { if (this.myForm.valid) {
try { try {
const id_recuperado = this.compartiId.getIdGuardado();
this.programa.uzytavprograma_vmetas = this.myForm.get('metas').value; this.programa.uzytavprograma_vmetas = this.myForm.get('metas').value;
this.programa.uzytavprograma_vpoliticas = this.myForm.get('politica').value; this.programa.uzytavprograma_vpoliticas = this.myForm.get('politica').value;
this.programaService.modificarParametros(id_recuperado, this.programa).subscribe(response => { this.programaService.modificarParametros(this.idRecuperado, this.programa).subscribe(response => {
this.editorConfig.editable = false;
this.cambio = false; this.cambio = false;
this.isEditorEnabled = false;
this.openModal(); this.openModal();
}); });
} catch (error) { } catch (error) {
...@@ -95,9 +67,9 @@ export class EstraEComponent implements OnInit { ...@@ -95,9 +67,9 @@ export class EstraEComponent implements OnInit {
} }
obtenerRegistros() { obtenerRegistros() {
const id_recuperado = this.compartiId.getIdGuardado();
if (typeof id_recuperado !== 'undefined') { if (typeof this.idRecuperado !== 'undefined') {
this.programaService.obtenerParametrosId(id_recuperado).subscribe(data => { this.programaService.obtenerParametrosId(this.idRecuperado).subscribe(data => {
this.programa = data; this.programa = data;
this.myForm.patchValue({ this.myForm.patchValue({
metas: this.programa.uzytavprograma_vmetas, metas: this.programa.uzytavprograma_vmetas,
......
...@@ -7,9 +7,6 @@ ...@@ -7,9 +7,6 @@
<mat-card-content> <mat-card-content>
<mat-card-actions class="button-container"> <mat-card-actions class="button-container">
<button mat-raised-button color="primary" (click)="confirmarFinalizar()">Finalizar</button> <button mat-raised-button color="primary" (click)="confirmarFinalizar()">Finalizar</button>
<button mat-icon-button color="warn" *ngIf="finalizado" (click)="generarPDF()">
<mat-icon>picture_as_pdf</mat-icon>
</button>
</mat-card-actions> </mat-card-actions>
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>
......
...@@ -13,11 +13,8 @@ export class FinalizarPComponent implements OnInit { ...@@ -13,11 +13,8 @@ export class FinalizarPComponent implements OnInit {
} }
confirmarFinalizar() { confirmarFinalizar() {
if (confirm('¿Estás seguro de que deseas finalizar?')) { if (confirm('¿Estás seguro de que deseas finalizar?')) {
this.finalizado = true;
} }
} }
generarPDF() {
// Generrar el pedf con los datos ingresad
}
} }
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<button mat-raised-button color="primary" *ngIf="!cambio" <button mat-raised-button color="primary" *ngIf="!cambio"
(click)="cambiar()">Editar</button> (click)="cambiar()">Editar</button>
<button mat-raised-button color="primary" *ngIf="cambio" <button mat-raised-button color="primary" *ngIf="cambio"
(click)="onSubmit()">Guardar</button> >Guardar</button>
<span class="separator"></span> <span class="separator"></span>
<button mat-raised-button color="warn" *ngIf="cambio" <button mat-raised-button color="warn" *ngIf="cambio"
(click)="cancelado()">Cancelar</button> (click)="cancelado()">Cancelar</button>
...@@ -16,8 +16,13 @@ ...@@ -16,8 +16,13 @@
<div> <div>
<label class="label-negrita"> Resumen del Programa:</label> <label class="label-negrita"> Resumen del Programa:</label>
<angular-editor formControlName="resumen" [config]="editorConfig"></angular-editor> <ckeditor formControlName="resumen" class="custom-ckeditor"
[disabled]="!isEditorEnabled" [style.height]="editorHeight"
[editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('resumen').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
</mat-card-content> </mat-card-content>
......
import { Component, OnInit } from '@angular/core'; 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 { MatDialog } from '@angular/material/dialog';
import { AngularEditorConfig } from '@kolkov/angular-editor'; import { AngularEditorConfig } from '@kolkov/angular-editor';
import { Programa } from 'src/app/modules/main/Models/programa-v'; import { Programa } from 'src/app/modules/main/Models/programa-v';
...@@ -7,53 +7,21 @@ import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/ ...@@ -7,53 +7,21 @@ import { Compartir_idService } from 'src/app/modules/main/services/compartir_id/
import { MostrarOcultarService } from 'src/app/modules/main/services/mostrar-ocultar.service'; import { MostrarOcultarService } from 'src/app/modules/main/services/mostrar-ocultar.service';
import { ProgramaService } from 'src/app/modules/main/services/programa/programa.service'; import { ProgramaService } from 'src/app/modules/main/services/programa/programa.service';
import { EnvioFormularioComponent } from '../../../envio-formulario/envio-formulario.component'; import { EnvioFormularioComponent } from '../../../envio-formulario/envio-formulario.component';
import ClassicEditor from '../../../../../Proyectos/ckeditor-custom/build/ckeditor';
@Component({ @Component({
selector: 'vex-resumen-progra', selector: 'vex-resumen-progra',
templateUrl: './resumen-progra.component.html', templateUrl: './resumen-progra.component.html',
styleUrls: ['./resumen-progra.component.css'] styleUrls: ['./resumen-progra.component.css']
}) })
export class ResumenPrograComponent implements OnInit { export class ResumenPrograComponent implements OnInit {
htmlContent: string = ''; public Editor = ClassicEditor;
myForm: FormGroup; myForm: FormGroup;
cambio: boolean; cambio: boolean;
idRecuperado: number;
formularioEnviado: boolean; formularioEnviado: boolean;
private programa: Programa = new Programa(); private programa: Programa = new Programa();
editorConfig: AngularEditorConfig = { editorHeight = '400px';
editable: false, isEditorEnabled = false;
spellcheck: true,
height: '10rem',
minHeight: '5rem',
translate: 'yes',
enableToolbar: true,
showToolbar: true,
placeholder: 'Enter text here...',
defaultParagraphSeparator: '',
defaultFontName: '',
defaultFontSize: '',
fonts: [
{ class: 'arial', name: 'Arial' },
{ class: 'times-new-roman', name: 'Times New Roman' },
{ class: 'calibri', name: 'Calibri' },
{ class: 'comic-sans-ms', name: 'Comic Sans MS' }
],
customClasses: [
{
name: 'quote',
class: 'quote',
},
{
name: 'redText',
class: 'redText'
},
{
name: 'titleText',
class: 'titleText',
tag: 'h1',
},
]
};
constructor( constructor(
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private programaService: ProgramaService, private programaService: ProgramaService,
...@@ -63,19 +31,21 @@ export class ResumenPrograComponent implements OnInit { ...@@ -63,19 +31,21 @@ export class ResumenPrograComponent implements OnInit {
cambiar() { cambiar() {
this.cambio = true; this.cambio = true;
this.editorConfig.editable = true; this.isEditorEnabled = true;
} }
cancelado() { cancelado() {
this.cambio = false; this.cambio = false;
this.editorConfig.editable = false; this.isEditorEnabled = false;
} }
ngOnInit(): void { ngOnInit(): void {
this.idRecuperado = this.compartiId.getIdGuardado();
this.programa = new Programa(); this.programa = new Programa();
this.obtenerRegistros(); this.obtenerRegistros();
this.myForm = this.formBuilder.group({ this.myForm = this.formBuilder.group({
resumen: [this.programa.uzytavprograma_vresumen] resumen: [this.programa.uzytavprograma_vresumen, [Validators.required, Validators.maxLength(3000)]]
}); });
} }
...@@ -84,11 +54,11 @@ export class ResumenPrograComponent implements OnInit { ...@@ -84,11 +54,11 @@ export class ResumenPrograComponent implements OnInit {
onSubmit() { onSubmit() {
if (this.myForm.valid) { if (this.myForm.valid) {
try { try {
const id_recuperado = this.compartiId.getIdGuardado();
this.programa.uzytavprograma_vresumen = this.myForm.get('resumen').value; this.programa.uzytavprograma_vresumen = this.myForm.get('resumen').value;
this.programaService.modificarParametros(id_recuperado, this.programa).subscribe(response => { this.programaService.modificarParametros(this.idRecuperado, this.programa).subscribe(response => {
this.editorConfig.editable = false;
this.cambio = false; this.cambio = false;
this.isEditorEnabled = false;
this.openModal(); this.openModal();
}); });
} catch (error) { } catch (error) {
...@@ -98,9 +68,8 @@ export class ResumenPrograComponent implements OnInit { ...@@ -98,9 +68,8 @@ export class ResumenPrograComponent implements OnInit {
} }
obtenerRegistros() { obtenerRegistros() {
const id_recuperado = this.compartiId.getIdGuardado(); if (typeof this.idRecuperado !== 'undefined') {
if (typeof id_recuperado !== 'undefined') { this.programaService.obtenerParametrosId(this.idRecuperado).subscribe(data => {
this.programaService.obtenerParametrosId(id_recuperado).subscribe(data => {
this.programa = data; this.programa = data;
this.myForm.patchValue({ this.myForm.patchValue({
resumen: this.programa.uzytavprograma_vresumen resumen: this.programa.uzytavprograma_vresumen
......
...@@ -16,20 +16,35 @@ ...@@ -16,20 +16,35 @@
<div> <div>
<label class="label-negrita"> Viabilidad Técnica:</label> <label class="label-negrita"> Viabilidad Técnica:</label>
<angular-editor formControlName="viabilidad" [config]="editorConfig"></angular-editor> <ckeditor formControlName="viabilidad" class="custom-ckeditor"
[disabled]="!isEditorEnabled" [style.height]="editorHeight"
[editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('viabilidad').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
<div> <div>
<label class="label-negrita"> ¿Qué perderia el país si el programa no se ejecuta?:</label> <label class="label-negrita"> ¿Qué perderia el país si el programa no se ejecuta?:</label>
<angular-editor formControlName="perderia" [config]="editorConfig"></angular-editor> <ckeditor formControlName="perderia" class="custom-ckeditor"
[disabled]="!isEditorEnabled" [style.height]="editorHeight"
[editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('perderia').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
<div> <div>
<label class="label-negrita"> ¿Cuáles son los resultados o impactos esperados del programa?:</label> <label class="label-negrita"> ¿Cuáles son los resultados o impactos esperados del programa?:</label>
<angular-editor formControlName="resultados" [config]="editorConfig"></angular-editor> <ckeditor formControlName="resultados" class="custom-ckeditor"
[disabled]="!isEditorEnabled" [style.height]="editorHeight"
[editor]="Editor"></ckeditor>
<div *ngIf="myForm.get('resultados').hasError('maxlength')"
class="error-message">
El contenido no puede exceder los 3000 caracteres.
</div>
</div> </div>
</mat-card-content> </mat-card-content>
......
...@@ -12,12 +12,12 @@ export class DatosEspeService { ...@@ -12,12 +12,12 @@ export class DatosEspeService {
parametrosActualizados: Subject<void> = new Subject<void>(); parametrosActualizados: Subject<void> = new Subject<void>();
private idPDF: string; // Agregar una variable para almacenar el último ID guardado private idPDF: string; // Agregar una variable para almacenar el último ID guardado
private fileName: string; // Agregar una variable para almacenar el último ID guardado private fileName: string; // Agregar una variable para almacenar el último ID guardado
private carrera = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/academico/carreras' private carrera = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/academico/carreras'
private getPDF = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/files/getFile' private getPDF = 'https://api-ufa.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 savePDF = 'https://api-ufa.espe.edu.ec/api/v1.0/private/files/saveFile'
private getDepartamentos = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/departamental/departamentos' private getDepartamentos = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/departamental/departamentos'
private getCampus = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/academico/campus' private getCampus = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/academico/campus'
private apiUrl = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/Docente/informacionServidorP'; private apiUrl = 'https://api-ufa-test.espe.edu.ec/api/v1.0/private/Docente/informacionServidorP';
...@@ -69,10 +69,10 @@ export class DatosEspeService { ...@@ -69,10 +69,10 @@ export class DatosEspeService {
// Construir la URL con los parámetros // Construir la URL con los parámetros
return `${this.getPDF}?uiidFile=${id}&filename=${nombre}`; return `${this.getPDF}?uiidFile=${id}&filename=${nombre}`;
} }
async saveDocument(formData: FormData): Promise<any> { async saveDocument(formData: FormData): Promise<any> {
console.log("pdf", formData); console.log("pdf", formData);
try { try {
const response: any = await this.http.post(this.savePDF, formData).toPromise(); const response: any = await this.http.post(this.savePDF, formData).toPromise();
this.idPDF = response.uuid; this.idPDF = response.uuid;
......
/* tslint:disable:no-unused-variable */
import { TestBed, async, inject } from '@angular/core/testing';
import { CabEvalProyService } from './cab-eval-proy.service';
describe('Service: CabEvalProy', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [CabEvalProyService]
});
});
it('should ...', inject([CabEvalProyService], (service: CabEvalProyService) => {
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 { CabeEvalProy } from '../../Models/cabevalp';
import { tap } from 'rxjs/operators';
@Injectable()
export class CabEvalProyService {
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<CabeEvalProy[]> {
return this.httpClient.get<CabeEvalProy[]>(`${this.URL+"/getAll"}`);
}
guardarParametros(parametros: CabeEvalProy):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
})
);
}
/*
guardarParametros(parametros: Proyectos): Observable<any> {
return this.httpClient.post(`${this.URL}/guardar`, parametros).pipe(
tap((response: any) => {
this.idGuardado = response.uzytavproyec_id;
console.log("id servicio proyecto", this.idGuardado) // Captura el ID devuelto por el servidor
})
);
}
*/
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' });
}
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 { EvaluacionProyectoService } from './evaluacion-proyecto.service';
describe('Service: EvaluacionProyecto', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [EvaluacionProyectoService]
});
});
it('should ...', inject([EvaluacionProyectoService], (service: EvaluacionProyectoService) => {
expect(service).toBeTruthy();
}));
});
This diff is collapsed.
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