Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
F
Front-NG
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
José Alejandro Cáceres López
Front-NG
Commits
f62691bf
Commit
f62691bf
authored
Aug 28, 2023
by
José Alejandro Cáceres López
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'desarrollo' into 'master'
validaciones en perfil completo See merge request
!10
parents
b19641a1
873e03d6
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
290 additions
and
101 deletions
+290
-101
UserProfilesService.ts
src/app/core/auth/services/UserProfilesService.ts
+16
-0
auth.service.ts
src/app/core/auth/services/auth.service.ts
+41
-3
token.interceptor.ts
src/app/core/auth/services/token.interceptor.ts
+3
-2
main.module.ts
src/app/modules/main/main.module.ts
+3
-1
add-calificacion-vinculacion.component.css
...on-vinculacion/add-calificacion-vinculacion.component.css
+35
-17
add-calificacion-vinculacion.component.html
...n-vinculacion/add-calificacion-vinculacion.component.html
+9
-10
add-calificacion-vinculacion.component.ts
...ion-vinculacion/add-calificacion-vinculacion.component.ts
+4
-3
acta-director-proyecto.component.ts
...cta-director-proyecto/acta-director-proyecto.component.ts
+24
-13
acta-compromiso-carreras.component.ts
...compromiso-carreras/acta-compromiso-carreras.component.ts
+24
-14
acta-consejo-departamento.component.html
...ejo-departamento/acta-consejo-departamento.component.html
+23
-11
acta-consejo-departamento.component.ts
...nsejo-departamento/acta-consejo-departamento.component.ts
+50
-16
edit-viabilidad.component.html
...enibilidad/edit-viabilidad/edit-viabilidad.component.html
+14
-6
pdf.component.ts
src/app/modules/main/pages/Proyectos/pdf/pdf.component.ts
+0
-1
comision-eva.component.ts
...s/asignar comision/comision-eva/comision-eva.component.ts
+5
-4
confirmar-finalizar.component.css
...nes/confirmar-finalizar/confirmar-finalizar.component.css
+0
-0
confirmar-finalizar.component.html
...es/confirmar-finalizar/confirmar-finalizar.component.html
+1
-0
confirmar-finalizar.component.spec.ts
...confirmar-finalizar/confirmar-finalizar.component.spec.ts
+23
-0
confirmar-finalizar.component.ts
...ones/confirmar-finalizar/confirmar-finalizar.component.ts
+15
-0
No files found.
src/app/core/auth/services/UserProfilesService.ts
0 → 100644
View file @
f62691bf
import
{
Injectable
}
from
'@angular/core'
;
import
{
BehaviorSubject
,
Observable
}
from
'rxjs'
;
@
Injectable
({
providedIn
:
'root'
,
})
export
class
UserProfilesService
{
private
userProfilesSubject
:
BehaviorSubject
<
string
[]
>
=
new
BehaviorSubject
<
string
[]
>
([]);
userProfiles$
:
Observable
<
string
[]
>
=
this
.
userProfilesSubject
.
asObservable
();
constructor
()
{}
setUserProfiles
(
profiles
:
string
[])
{
this
.
userProfilesSubject
.
next
(
profiles
);
}
}
src/app/core/auth/services/auth.service.ts
View file @
f62691bf
...
...
@@ -13,6 +13,7 @@ import { throwError, timer } from 'rxjs';
import
{
catchError
,
switchMap
,
timeout
}
from
'rxjs/operators'
;
import
{
AuthorizationService
}
from
'./AuthorizationService'
;
import
{
AccesoNoAutorizadoComponent
}
from
'src/app/modules/main/pages/programa/opciones/AccesoNoAutorizado/AccesoNoAutorizado.component'
;
import
{
UserProfilesService
}
from
'./UserProfilesService'
;
@
Injectable
({
providedIn
:
'root'
,
})
...
...
@@ -28,6 +29,7 @@ export class AuthService {
private
userProfilesSubject
:
BehaviorSubject
<
string
[]
>
=
new
BehaviorSubject
<
string
[]
>
([]);
userProfiles$
:
Observable
<
string
[]
>
=
this
.
userProfilesSubject
.
asObservable
();
formularioEnviado
:
boolean
;
userProfiles
:
string
[];
constructor
(
private
oAuthService
:
OAuthService
,
...
...
@@ -35,13 +37,22 @@ export class AuthService {
private
globalUserService
:
GlobalUserService
,
private
httpClient
:
HttpClient
,
private
router
:
Router
,
private
dialog
:
MatDialog
private
dialog
:
MatDialog
,
private
userProfilesService
:
UserProfilesService
,
)
{
this
.
configureOauthService
();
// Establecer intervalo de renovación del token
const
refreshTokenInterval
=
setInterval
(()
=>
{
this
.
checkAndRefreshToken
();
},
300000
);
// 5 minutos en milisegundos
}
get
tokenClaims
():
TokenClaim
{
return
{
...
...
@@ -130,7 +141,11 @@ private getUserProfiles(email: string) {
this
.
httpClient
.
get
<
string
[]
>
(
`http://localhost:8080/api/v1.0/usuario/findPerfilesByUsuarioEmail/
${
email
}
`
).
subscribe
(
(
profiles
:
string
[])
=>
{
this
.
setGlobalUserProfiles
(
profiles
);
// Actualiza los perfiles del usuario
this
.
isUiEnabled
=
true
;
// Habilitar la interfaz una vez que se completó la verificación
this
.
isUiEnabled
=
true
;
this
.
userProfiles
=
profiles
;
// Habilitar la interfaz una vez que se completó la verificación
console
.
log
(
'Perfiles del usuario en AuthService:'
,
profiles
);
// Asigna los perfiles a la propiedad userProfiles
this
.
userProfilesService
.
setUserProfiles
(
profiles
);
// Actualiza los perfiles en el servicio compartido
},
(
error
)
=>
{
...
...
@@ -138,8 +153,11 @@ private getUserProfiles(email: string) {
}
);
}
setUserProfiles
(
profiles
:
string
[])
{
this
.
userProfilesSubject
.
next
(
profiles
);
}
private
setGlobalUserProfiles
(
profiles
:
string
[])
{
setGlobalUserProfiles
(
profiles
:
string
[])
{
this
.
userProfilesSubject
.
next
(
profiles
);
}
...
...
@@ -172,6 +190,7 @@ private setGlobalUserProfiles(profiles: string[]) {
}
public
isLoggedIn
():
boolean
{
if
(
this
.
oAuthService
.
getAccessToken
()
===
null
)
{
return
false
;
...
...
@@ -202,6 +221,25 @@ private setGlobalUserProfiles(profiles: string[]) {
return
typeof
idToken
[
'sub'
]
!==
'undefined'
?
idToken
[
'sub'
].
toString
()
:
''
;
}
}
private
async
checkAndRefreshToken
()
{
const
accessTokenExpiration
=
this
.
oAuthService
.
getAccessTokenExpiration
();
const
currentTime
=
new
Date
().
getTime
();
// Renueva el token si está a punto de expirar en los próximos X segundos (por ejemplo, 300 segundos)
const
refreshThreshold
=
300
*
1000
;
// 300 segundos en milisegundos
if
(
accessTokenExpiration
-
currentTime
<
refreshThreshold
)
{
try
{
await
this
.
oAuthService
.
refreshToken
();
console
.
log
(
'Token renovado exitosamente.'
);
}
catch
(
error
)
{
console
.
error
(
'Error al renovar el token:'
,
error
);
}
}
}
}
function
ngOnDestroy
()
{
throw
new
Error
(
'Function not implemented.'
);
}
src/app/core/auth/services/token.interceptor.ts
View file @
f62691bf
...
...
@@ -10,11 +10,13 @@ export class TokenInterceptor implements HttpInterceptor {
intercept
(
request
:
HttpRequest
<
any
>
,
next
:
HttpHandler
):
Observable
<
HttpEvent
<
any
>>
{
const
accessToken
=
this
.
oAuthService
.
getAccessToken
();
const
email
=
this
.
oAuthService
.
getIdentityClaims
()[
'email'
];
const
id_token
=
this
.
oAuthService
.
getIdToken
();
if
(
accessToken
)
{
const
headers
=
request
.
headers
.
set
(
'Authorization'
,
`Bearer
${
accessToken
}
`
)
.
set
(
'email'
,
email
);
// envío el email en el encabezado
.
set
(
'email'
,
email
)
// envío el email en el encabezado
.
set
(
'id_token'
,
id_token
);
const
modifiedRequest
=
request
.
clone
({
headers
});
return
next
.
handle
(
modifiedRequest
);
...
...
@@ -24,4 +26,3 @@ export class TokenInterceptor implements HttpInterceptor {
}
}
}
src/app/modules/main/main.module.ts
View file @
f62691bf
...
...
@@ -231,6 +231,7 @@ import { AccesoDenegadoComponent } from './pages/programa/opciones/AccesoDenegad
import
{
AccesoNoAutorizadoComponent
}
from
'./pages/programa/opciones/AccesoNoAutorizado/AccesoNoAutorizado.component'
;
import
{
ErroresComponent
}
from
'./pages/programa/opciones/errores/errores.component'
;
import
{
MatTooltipModule
}
from
'@angular/material/tooltip'
;
import
{
ConfirmarFinalizarComponent
}
from
'./pages/programa/opciones/confirmar-finalizar/confirmar-finalizar.component'
;
@
NgModule
({
schemas
:
[
CUSTOM_ELEMENTS_SCHEMA
],
declarations
:
[
...
...
@@ -409,7 +410,8 @@ import { MatTooltipModule } from '@angular/material/tooltip';
ListarDocentesAsignadosComponent
,
AccesoDenegadoComponent
,
AccesoNoAutorizadoComponent
,
ErroresComponent
ErroresComponent
,
ConfirmarFinalizarComponent
],
imports
:
[
MatTooltipModule
,
...
...
src/app/modules/main/pages/Calificacion Comision Vinculacion/add-calificacion-vinculacion/add-calificacion-vinculacion.component.css
View file @
f62691bf
...
...
@@ -8,7 +8,7 @@
background-color
:
white
;
border-radius
:
10px
;
}
.botones
{
width
:
100px
;
height
:
40px
;
...
...
@@ -22,14 +22,14 @@
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
{
...
...
@@ -42,20 +42,20 @@
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
;
...
...
@@ -69,11 +69,11 @@
cursor
:
pointer
;
transition
:
background-color
0.3s
ease
;
}
button
:hover
{
background-color
:
rgb
(
90
,
159
,
95
);
}
/* Estilos para el contenedor principal */
.contenedor
{
width
:
96%
;
...
...
@@ -86,12 +86,12 @@
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
;
...
...
@@ -108,7 +108,7 @@
border-radius
:
10px
;
box-shadow
:
0
2px
4px
rgba
(
0
,
0
,
0
,
0.4
);
}
/* Estilos para el icono de instituciones */
.icono-instituciones
{
display
:
flex
;
...
...
@@ -117,7 +117,7 @@
margin-right
:
5px
;
font-size
:
20px
;
}
.volver
{
position
:
absolute
;
top
:
25%
;
...
...
@@ -135,15 +135,15 @@
border
:
none
;
outline
:
none
;
cursor
:
pointer
;
}
.save-button
{
display
:
flex
;
justify-content
:
flex-end
;
margin-bottom
:
16px
;
}
.input-container
{
width
:
100%
;
...
...
@@ -151,4 +151,23 @@
flex-direction
:
column
;
margin-bottom
:
16px
;
}
\ No newline at end of file
.Column1
{
padding-left
:
0px
;
padding-right
:
0px
;
width
:
10px
;
white-space
:
normal
;
overflow
:
visible
;
}
.Column
{
padding-left
:
0px
;
padding-right
:
0px
;
max-width
:
100%
;
white-space
:
inherit
;
/* overflow: visible;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis; */
}
src/app/modules/main/pages/Calificacion Comision Vinculacion/add-calificacion-vinculacion/add-calificacion-vinculacion.component.html
View file @
f62691bf
...
...
@@ -5,7 +5,7 @@
<!-- 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"
<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>
...
...
@@ -57,28 +57,28 @@
<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-label>
Seleccione un Item
</mat-label>
<mat-select
[
formControlName
]="'
valoracion
'
+
dato
.
uzytavparaeva_id
"
>
<mat-option
*
ngFor=
"let opcion of dato.opcionesRespuesta"
<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>
<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) }}
{{ getSelectedPuntaje(dato.uzytavparaeva_id) }}
</td>
</ng-container>
<tr
mat-header-row
*
matHeaderRowDef=
"displayedColumns"
></tr>
<tr
mat-row
*
matRowDef=
"let row; columns: displayedColumns;"
></tr>
...
...
@@ -92,4 +92,4 @@
</div>
</form>
</div>
\ No newline at end of file
</div>
src/app/modules/main/pages/Calificacion Comision Vinculacion/add-calificacion-vinculacion/add-calificacion-vinculacion.component.ts
View file @
f62691bf
...
...
@@ -179,9 +179,10 @@ export class AddCalificacionVinculacionComponent implements OnInit {
);
}
openModal
()
{
openModal
(
mensaje
:
string
)
{
const
dialogRef
=
this
.
dialog
.
open
(
EnvioFormularioComponent
,
{
disableClose
:
true
disableClose
:
true
,
data
:
{
mensaje
:
mensaje
}
});
dialogRef
.
afterClosed
().
subscribe
(
result
=>
{
...
...
@@ -212,7 +213,7 @@ export class AddCalificacionVinculacionComponent implements OnInit {
this
.
cabEvalProyService
.
guardarParametros
(
this
.
cabeceraEvalProy
).
subscribe
(()
=>
{
this
.
enviarEvaluacion
(
this
.
cabEvalProyService
.
obtenerId
())
console
.
log
(
"cabecera enviada "
,
this
.
cabeceraEvalProy
)
this
.
openModal
()
this
.
openModal
(
'La Calificación ha sido asignada al Proyecto'
)
this
.
guardar
()
});
}
...
...
src/app/modules/main/pages/Proyectos/Acta Compromiso Director Proyecto/acta-director-proyecto/acta-director-proyecto.component.ts
View file @
f62691bf
...
...
@@ -117,20 +117,30 @@ export class ActaDirectorProyectoComponent implements OnInit {
async
onSubmit
()
{
if
(
this
.
myForm
.
valid
)
{
this
.
proyecto
.
uzytavproyec_id
=
this
.
idRecuperado
;
const
pdfData
=
await
this
.
enviarPDF
();
if
(
pdfData
.
idPDF
!==
null
&&
pdfData
.
idPDF
!==
undefined
)
{
this
.
proyecto
.
uzytavproyec_com_part1_url
=
pdfData
.
idPDF
;
this
.
proyecto
.
uzytavproyec_com_part1_nom
=
pdfData
.
filename
;
this
.
proyectosService
.
modificarParametros
(
this
.
proyecto
.
uzytavproyec_id
,
this
.
proyecto
).
subscribe
(
response
=>
{
this
.
openModal
(
'El PDF ha sido Enviado'
);
console
.
log
(
'Datos Actualizados'
,
this
.
proyecto
);
this
.
myForm
.
disable
();
this
.
cambio
=
false
;
},
error
=>
{
try
{
const
pdfData
=
await
this
.
enviarPDF
();
if
(
pdfData
.
idPDF
===
null
||
pdfData
.
idPDF
===
undefined
)
{
}
else
{
if
(
pdfData
.
idPDF
!==
null
&&
pdfData
.
idPDF
!==
undefined
)
{
this
.
proyecto
.
uzytavproyec_com_part1_url
=
pdfData
.
idPDF
;
this
.
proyecto
.
uzytavproyec_com_part1_nom
=
pdfData
.
filename
;
this
.
proyectosService
.
modificarParametros
(
this
.
proyecto
.
uzytavproyec_id
,
this
.
proyecto
).
subscribe
(
response
=>
{
this
.
openModal
(
'El PDF ha sido Enviado'
);
console
.
log
(
'Datos Actualizados'
,
this
.
proyecto
);
this
.
myForm
.
disable
();
this
.
cambio
=
false
;
},
error
=>
{
}
);
}
);
}
}
catch
(
error
)
{
}
}
}
...
...
@@ -149,6 +159,7 @@ export class ActaDirectorProyectoComponent implements OnInit {
};
}
catch
(
error
)
{
this
.
openModalError
(
'Ya existe un Documento con ese Nombre'
);
this
.
archivoEsPDFValido
=
false
;
return
{
idPDF
:
null
,
filename
:
''
...
...
src/app/modules/main/pages/Proyectos/Acta de Compromiso de Carreras/acta-compromiso-carreras/acta-compromiso-carreras.component.ts
View file @
f62691bf
...
...
@@ -48,7 +48,7 @@ export class ActaCompromisoCarrerasComponent implements OnInit {
}
ngOnInit
():
void
{
this
.
idRecuperado
=
parseInt
(
localStorage
.
getItem
(
'proyectoId'
),
10
);
this
.
idRecuperado
=
parseInt
(
localStorage
.
getItem
(
'proyectoId'
),
10
);
this
.
proyecto
=
this
.
mostrarOcultarService
.
editProyecto
;
this
.
cambio
=
false
;
...
...
@@ -97,19 +97,28 @@ export class ActaCompromisoCarrerasComponent implements OnInit {
if
(
this
.
myForm
.
valid
)
{
this
.
proyecto
.
uzytavproyec_id
=
this
.
idRecuperado
;
const
pdfData
=
await
this
.
enviarPDF
();
this
.
proyecto
.
uzytavproyec_com_part2_url
=
pdfData
.
idPDF
;
this
.
proyecto
.
uzytavproyec_com_part2_nom
=
pdfData
.
filename
;
this
.
proyectosService
.
modificarParametros
(
this
.
proyecto
.
uzytavproyec_id
,
this
.
proyecto
).
subscribe
(
response
=>
{
this
.
openModal
();
console
.
log
(
'Datos Actualizados'
,
this
.
proyecto
);
this
.
myForm
.
disable
();
this
.
cambio
=
false
;
},
error
=>
{
try
{
const
pdfData
=
await
this
.
enviarPDF
();
if
(
pdfData
.
idPDF
===
null
||
pdfData
.
idPDF
===
undefined
)
{
}
else
{
this
.
proyecto
.
uzytavproyec_com_part2_url
=
pdfData
.
idPDF
;
this
.
proyecto
.
uzytavproyec_com_part2_nom
=
pdfData
.
filename
;
this
.
proyectosService
.
modificarParametros
(
this
.
proyecto
.
uzytavproyec_id
,
this
.
proyecto
).
subscribe
(
response
=>
{
this
.
openModal
();
console
.
log
(
'Datos Actualizados'
,
this
.
proyecto
);
this
.
myForm
.
disable
();
this
.
cambio
=
false
;
},
error
=>
{
});
}
);
}
catch
(
error
)
{
}
}
}
...
...
@@ -125,7 +134,8 @@ export class ActaCompromisoCarrerasComponent implements OnInit {
filename
:
response
.
fileName
};
}
catch
(
error
)
{
this
.
openModalError
(
'¡Este PDF ya se ha subido!'
);
this
.
openModalError
(
'Este PDF ya se ha subido'
);
this
.
archivoEsPDFValido
=
false
;
return
{
idPDF
:
null
,
filename
:
''
...
...
src/app/modules/main/pages/Proyectos/Acta de Consejo de Departamento/acta-consejo-departamento/acta-consejo-departamento.component.html
View file @
f62691bf
...
...
@@ -2,31 +2,43 @@
<form
class=
"formulario"
[
formGroup
]="
myForm
"
(
ngSubmit
)="
onSubmit
()"
>
<!-- Información de la institución -->
<div
class=
"save-button"
>
<button
mat-raised-button
color=
"primary"
*
ngIf=
"!cambio"
(
click
)="
cambiar
()"
>
Editar
</button>
<button
mat-raised-button
color=
"primary"
[
disabled
]="!
archivoEsPDFValido
"
*
ngIf=
"cambio"
>
Guardar
</button>
<button
mat-raised-button
color=
"primary"
*
ngIf=
"!cambio"
(
click
)="
cambiar
()"
>
Editar
</button>
<button
mat-raised-button
color=
"primary"
[
disabled
]="!
archivoEsPDFValido
"
*
ngIf=
"cambio"
>
Guardar
</button>
<span
class=
"separator"
></span>
<button
mat-raised-button
color=
"warn"
*
ngIf=
"cambio"
(
click
)="
cancelado
()"
>
Cancelar
</button>
<button
mat-raised-button
color=
"warn"
*
ngIf=
"cambio"
(
click
)="
cancelado
()"
>
Cancelar
</button>
</div>
<div
class=
"input-container"
*
ngIf=
"proyecto.uzytavproyec_aprob_con_dep_url == null && !cambio"
>
<div
class=
"input-container"
*
ngIf=
"proyecto.uzytavproyec_aprob_con_dep_url == null && !cambio"
>
<label>
Subir Archivo
</label>
<input
type=
"file"
id=
"uzytavconvoca_digital"
accept=
".pdf"
(
change
)="
onFileChange
($
event
)"
formControlName=
"archivo"
>
<input
type=
"file"
id=
"uzytavconvoca_digital"
accept=
".pdf"
(
change
)="
onFileChange
($
event
)"
formControlName=
"archivo"
>
</div>
<div
class=
"input-container"
*
ngIf=
"proyecto.uzytavproyec_aprob_con_dep_url == null && cambio"
>
<div
class=
"input-container"
*
ngIf=
"proyecto.uzytavproyec_aprob_con_dep_url == null && cambio"
>
<label>
Subir Archivo
</label>
<input
type=
"file"
id=
"uzytavconvoca_digital"
accept=
".pdf"
(
change
)="
onFileChange
($
event
)"
formControlName=
"archivo"
>
<input
type=
"file"
id=
"uzytavconvoca_digital"
accept=
".pdf"
(
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;"
<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"
>
Descargar PDF
</button>
<div
class=
"input-container"
*
ngIf=
"proyecto.uzytavproyec_aprob_con_dep_url != null && cambio"
>
<div
class=
"input-container"
*
ngIf=
"proyecto.uzytavproyec_aprob_con_dep_url != null && cambio"
>
<label>
Subir Archivo
</label>
<input
type=
"file"
id=
"uzytavconvoca_digital"
accept=
".pdf"
(
change
)="
onFileChange
($
event
)"
formControlName=
"archivo"
>
<input
type=
"file"
id=
"uzytavconvoca_digital"
accept=
".pdf"
(
change
)="
onFileChange
($
event
)"
formControlName=
"archivo"
>
</div>
</form>
</div>
src/app/modules/main/pages/Proyectos/Acta de Consejo de Departamento/acta-consejo-departamento/acta-consejo-departamento.component.ts
View file @
f62691bf
...
...
@@ -50,7 +50,7 @@ export class ActaConsejoDepartamentoComponent implements OnInit {
}
ngOnInit
():
void
{
this
.
idRecuperado
=
parseInt
(
localStorage
.
getItem
(
'proyectoId'
),
10
);
this
.
idRecuperado
=
parseInt
(
localStorage
.
getItem
(
'proyectoId'
),
10
);
this
.
proyecto
=
this
.
mostrarOcultarService
.
editProyecto
;
this
.
cambio
=
false
;
...
...
@@ -72,6 +72,7 @@ export class ActaConsejoDepartamentoComponent implements OnInit {
this
.
file
=
fileList
[
0
];
if
(
!
this
.
validarArchivo
(
this
.
file
))
{
this
.
openModalError
(
'¡Por favor, selecciona un archivo PDF!'
);
this
.
archivoEsPDFValido
=
false
;
return
;
}
else
{
this
.
archivoEsPDFValido
=
true
;
...
...
@@ -85,10 +86,11 @@ export class ActaConsejoDepartamentoComponent implements OnInit {
}
openModal
()
{
openModal
(
mensaje
:
string
)
{
const
dialogRef
=
this
.
dialog
.
open
(
EnvioFormularioComponent
,
{
width
:
'400px'
,
disableClose
:
true
disableClose
:
true
,
data
:
{
mensaje
:
mensaje
}
});
dialogRef
.
afterClosed
().
subscribe
(
result
=>
{
...
...
@@ -99,22 +101,53 @@ export class ActaConsejoDepartamentoComponent implements OnInit {
async
onSubmit
()
{
if
(
this
.
myForm
.
valid
)
{
this
.
proyecto
.
uzytavproyec_id
=
this
.
idRecuperado
;
const
pdfData
=
await
this
.
enviarPDF
();
this
.
proyecto
.
uzytavproyec_aprob_con_dep_url
=
pdfData
.
idPDF
;
this
.
proyecto
.
uzytavproyec_aprob_con_dep_nom
=
pdfData
.
filename
;
this
.
proyectosService
.
modificarParametros
(
this
.
proyecto
.
uzytavproyec_id
,
this
.
proyecto
).
subscribe
(
response
=>
{
this
.
openModal
();
console
.
log
(
'Datos Actualizados'
,
this
.
proyecto
);
this
.
myForm
.
disable
();
this
.
cambio
=
false
;
},
error
=>
{
try
{
const
pdfData
=
await
this
.
enviarPDF
();
if
(
pdfData
.
idPDF
===
null
||
pdfData
.
idPDF
===
undefined
)
{
}
else
{
this
.
proyecto
.
uzytavproyec_aprob_con_dep_url
=
pdfData
.
idPDF
;
this
.
proyecto
.
uzytavproyec_aprob_con_dep_nom
=
pdfData
.
filename
;
this
.
proyectosService
.
modificarParametros
(
this
.
proyecto
.
uzytavproyec_id
,
this
.
proyecto
).
subscribe
(
response
=>
{
this
.
openModal
(
'Acta de Consejo de Departamento Enviada'
);
console
.
log
(
'Datos Actualizados'
,
this
.
proyecto
);
this
.
myForm
.
disable
();
this
.
cambio
=
false
;
},
error
=>
{
}
);
}
);
}
catch
(
error
)
{
// Manejo de error en el envío del PDF
}
}
}
/* async onSubmit() {
if (this.myForm.valid) {
this.proyecto.uzytavproyec_id = this.idRecuperado;
const pdfData = await this.enviarPDF();
if (pdfData.idPDF === null || pdfData.idPDF === undefined) {
} else {
this.proyecto.uzytavproyec_aprob_con_dep_url = pdfData.idPDF;
this.proyecto.uzytavproyec_aprob_con_dep_nom = pdfData.filename;
this.proyectosService.modificarParametros(this.proyecto.uzytavproyec_id, this.proyecto).subscribe(
response => {
this.openModal('Acta de Consejo de Departamento Enviada');
console.log('Datos Actualizados', this.proyecto);
this.myForm.disable();
this.cambio = false;
},
error => {
}
);
}
}
}*/
async
enviarPDF
()
{
const
formData
=
new
FormData
();
formData
.
append
(
'files'
,
this
.
file
);
...
...
@@ -127,7 +160,8 @@ export class ActaConsejoDepartamentoComponent implements OnInit {
filename
:
response
.
fileName
};
}
catch
(
error
)
{
this
.
openModalError
(
'¡Este PDF ya se ha subido!'
);
this
.
openModalError
(
'Este PDF ya se ha subido'
);
this
.
archivoEsPDFValido
=
false
;
return
{
idPDF
:
null
,
filename
:
''
...
...
src/app/modules/main/pages/Proyectos/Viabilidad y Plan de Sostenibilidad/edit-viabilidad/edit-viabilidad.component.html
View file @
f62691bf
...
...
@@ -5,8 +5,7 @@
<div
class=
"save-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"
[
disabled
]="
myForm
.
invalid
"
>
Guardar
</button>
<span
class=
"separator"
></span>
<button
mat-raised-button
color=
"warn"
*
ngIf=
"cambio"
(
click
)="
cancelado
()"
>
Cancelar
</button>
...
...
@@ -19,10 +18,13 @@
<ckeditor
formControlName=
"viabilidad"
class=
"custom-ckeditor"
[
disabled
]="!
isEditorEnabled
"
[
style
.
height
]="
editorHeight
"
[
editor
]="
Editor
"
></ckeditor>
<div
*
ngIf=
"myForm.get('viabilidad').hasError('maxlength')"
<div
*
ngIf=
"myForm.get('viabilidad').hasError('maxlength')"
class=
"error-message"
>
El contenido no puede exceder los 3000 caracteres.
</div>
<div
*
ngIf=
"myForm.get('viabilidad').hasError('required') && (myForm.get('viabilidad').touched || myForm.dirty)"
class=
"error-message"
>
Este campo es requerido.
</div>
</div>
<div
class=
"editor-separator"
></div>
<div>
...
...
@@ -31,22 +33,28 @@
<ckeditor
formControlName=
"perderia"
class=
"custom-ckeditor"
[
disabled
]="!
isEditorEnabled
"
[
style
.
height
]="
editorHeight
"
[
editor
]="
Editor
"
></ckeditor>
<div
*
ngIf=
"myForm.get('perderia').hasError('maxlength')"
<div
*
ngIf=
"myForm.get('perderia').hasError('maxlength')"
class=
"error-message"
>
El contenido no puede exceder los 3000 caracteres.
</div>
<div
*
ngIf=
"myForm.get('perderia').hasError('required') && (myForm.get('perderia').touched || myForm.dirty)"
class=
"error-message"
>
Este campo es requerido.
</div>
</div>
<div
class=
"editor-separator"
></div>
<div>
<label
class=
"label-negrita"
>
¿Cuáles son los resultados o impactos
esperados del proyecto?
</label>
<ckeditor
formControlName=
"resultadoO"
class=
"custom-ckeditor"
<ckeditor
formControlName=
"resultadoO"
class=
"custom-ckeditor"
[
disabled
]="!
isEditorEnabled
"
[
style
.
height
]="
editorHeight
"
[
editor
]="
Editor
"
></ckeditor>
<div
*
ngIf=
"myForm.get('resultadoO').hasError('maxlength')"
<div
*
ngIf=
"myForm.get('resultadoO').hasError('maxlength')"
class=
"error-message"
>
El contenido no puede exceder los 3000 caracteres.
</div>
<div
*
ngIf=
"myForm.get('resultadoO').hasError('required') && (myForm.get('resultadoO').touched || myForm.dirty)"
class=
"error-message"
>
Este campo es requerido.
</div>
</div>
</mat-card-content>
</mat-card>
...
...
src/app/modules/main/pages/Proyectos/pdf/pdf.component.ts
View file @
f62691bf
...
...
@@ -820,6 +820,5 @@ export class PdfComponent implements OnInit {
}
src/app/modules/main/pages/asignar comision/comision-eva/comision-eva.component.ts
View file @
f62691bf
...
...
@@ -68,7 +68,7 @@ export class ComisionEvaComponent implements OnInit {
localStorage
.
setItem
(
'comisionId'
,
idcab
.
toString
());
localStorage
.
setItem
(
'parametrosId'
,
idpara
.
toString
());
this
.
router
.
navigate
([
'main/Asignar-Comision'
]);
this
.
openModal
();
this
.
openModal
(
'La Comisión de Evaluación ha sido Asignada'
);
});
}
catch
(
error
)
{
console
.
log
(
error
);
...
...
@@ -83,7 +83,7 @@ export class ComisionEvaComponent implements OnInit {
});
this
.
paraS
.
obtenerParametrosInicial
().
subscribe
(
data
=>
{
this
.
parametroA
=
data
;
this
.
parametroA
=
data
.
filter
(
item
=>
item
.
uzytavconparaeva_estado
===
'A'
)
;
});
this
.
proyecS
.
obtenerParametros
().
subscribe
(
data
=>
{
...
...
@@ -115,10 +115,11 @@ export class ComisionEvaComponent implements OnInit {
this
.
mostrarDiv
[
i
]
=
!
this
.
mostrarDiv
[
i
];
}
openModal
()
{
openModal
(
mensaje
:
string
)
{
const
dialogRef
=
this
.
dialog
.
open
(
EnvioFormularioComponent
,
{
width
:
'400px'
,
disableClose
:
true
disableClose
:
true
,
data
:
{
mensaje
:
mensaje
}
});
dialogRef
.
afterClosed
().
subscribe
(
result
=>
{
...
...
src/app/modules/main/pages/programa/opciones/confirmar-finalizar/confirmar-finalizar.component.css
0 → 100644
View file @
f62691bf
src/app/modules/main/pages/programa/opciones/confirmar-finalizar/confirmar-finalizar.component.html
0 → 100644
View file @
f62691bf
<p>
confirmar-finalizar works!
</p>
src/app/modules/main/pages/programa/opciones/confirmar-finalizar/confirmar-finalizar.component.spec.ts
0 → 100644
View file @
f62691bf
import
{
ComponentFixture
,
TestBed
}
from
'@angular/core/testing'
;
import
{
ConfirmarFinalizarComponent
}
from
'./confirmar-finalizar.component'
;
describe
(
'ConfirmarFinalizarComponent'
,
()
=>
{
let
component
:
ConfirmarFinalizarComponent
;
let
fixture
:
ComponentFixture
<
ConfirmarFinalizarComponent
>
;
beforeEach
(
async
()
=>
{
await
TestBed
.
configureTestingModule
({
declarations
:
[
ConfirmarFinalizarComponent
]
})
.
compileComponents
();
fixture
=
TestBed
.
createComponent
(
ConfirmarFinalizarComponent
);
component
=
fixture
.
componentInstance
;
fixture
.
detectChanges
();
});
it
(
'should create'
,
()
=>
{
expect
(
component
).
toBeTruthy
();
});
});
src/app/modules/main/pages/programa/opciones/confirmar-finalizar/confirmar-finalizar.component.ts
0 → 100644
View file @
f62691bf
import
{
Component
,
OnInit
}
from
'@angular/core'
;
@
Component
({
selector
:
'vex-confirmar-finalizar'
,
templateUrl
:
'./confirmar-finalizar.component.html'
,
styleUrls
:
[
'./confirmar-finalizar.component.css'
]
})
export
class
ConfirmarFinalizarComponent
implements
OnInit
{
constructor
()
{
}
ngOnInit
():
void
{
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment