Compare commits

...

90 Commits

Author SHA1 Message Date
Eduardo Quiros 5d2ea85e11
Merge pull request #148 from Quantum-P3/qa
deploy
2021-08-18 05:34:03 +00:00
Eduardo Quiros d5277d1575
Merge branch 'dev' into qa 2021-08-17 23:23:12 -06:00
Eduardo Quiros fc03659f7e
Merge pull request #147 from Quantum-P3/fix/password
arreglar logica de contraseña
2021-08-18 05:21:59 +00:00
Eduardo Quiros 03eec6d7c1
Merge pull request #145 from Quantum-P3/feature/US-47
Feature/us 47
2021-08-18 05:09:49 +00:00
Eduardo Quiros f4ebb8ab48
arreglar logica de contraseña 2021-08-17 23:06:48 -06:00
Paola 28c984a7d0 Merge branch 'feature/US-47' of https://github.com/Quantum-P3/datasurvey into feature/US-47 2021-08-17 22:33:22 -06:00
Paola a0dc074828 fix html factura 2021-08-17 22:32:50 -06:00
Eduardo Quiros 9f23887793
apply stash 2021-08-17 22:25:18 -06:00
Eduardo Quiros 95f48f952c
Merge pull request #144 from Quantum-P3/qa
deploy
2021-08-18 03:30:00 +00:00
Eduardo Quiros 32271cc84f
Merge branch 'dev' into qa 2021-08-17 21:16:13 -06:00
Eduardo Quiros 4cb626aab7
Merge pull request #143 from Quantum-P3/fix/home-page-surveys
Fix home page surveys
2021-08-18 02:33:53 +00:00
Pablo Bonilla 357f99ed31
Merge branch 'dev' into fix/home-page-surveys 2021-08-17 19:34:43 -06:00
Pablo Bonilla 04cb3f943c
Fix home surveys 2021-08-17 19:33:37 -06:00
Eduardo Quiros 6582d604f5
Merge pull request #142 from Quantum-P3/feature/US-47
Feature/us 47
2021-08-18 01:01:15 +00:00
Eduardo Quiros 32af5473df
fix test 2021-08-17 18:37:02 -06:00
Eduardo Quiros 40776b11a7
Merge pull request #141 from Quantum-P3/fix/completar
Fix/completar
2021-08-17 23:46:22 +00:00
Paola 1656c143d9 fix test 2021-08-17 17:44:22 -06:00
Paola ddacedb899 Merge branch 'dev' into feature/US-47 2021-08-17 17:37:04 -06:00
Paola 6626ef24ea cambio de titulo 2 en completar 2021-08-17 17:29:22 -06:00
Paola f9205229f7 cambio de titulo en completar 2021-08-17 17:27:40 -06:00
Paola 5c972fc485 arreglo guardar respuestas abiertas 2021-08-17 17:23:16 -06:00
Paola 4aaa7fb176 arreglo completar preguntas cerradas 2021-08-17 17:01:59 -06:00
Paola 6f1fae7dde fix exportar preguntas 2021-08-17 00:13:48 -06:00
Eduardo Quiros 302a6e32f1
usar sistema interno para buscar la opcion correcta 2021-08-16 23:47:59 -06:00
Eduardo Quiros 0a271fce60
arreglo de redirecciones en registro de respuestas 2021-08-16 23:45:51 -06:00
Eduardo Quiros 314e2b21e3
Merge pull request #140 from Quantum-P3/fix/shop-title
Fix sidebar survey icon and survey shop title
2021-08-17 05:26:55 +00:00
Pablo Bonilla 5defd44974
Fix sidebar survey icon and survey shop title 2021-08-16 23:17:06 -06:00
Eduardo Quiros 1c2e8b0a9c
Merge pull request #139 from Quantum-P3/fix/home-logo
Fix home page DataSurvey logo
2021-08-17 03:46:25 +00:00
Pablo Bonilla 73d3db4694
Fix home page DataSurvey logo 2021-08-16 21:01:40 -06:00
Eduardo Quiros b8f9d347ad
Merge pull request #138 from Quantum-P3/qa
deploy
2021-08-17 01:14:15 +00:00
Paola 05b67b3ccb preguntas excel 2021-08-16 19:02:48 -06:00
Eduardo Quiros 1cdfb4d3f3
arreglar conversion a numero de calificacion de encuestas 2021-08-16 18:58:23 -06:00
Eduardo Quiros b005595b99
redondear calificación de la encuesta 2021-08-16 18:49:20 -06:00
Eduardo Quiros 3e96c118d1
Merge pull request #137 from Quantum-P3/dev
qa
2021-08-17 00:46:48 +00:00
Eduardo Quiros c1b8d1ed11
Merge pull request #135 from Quantum-P3/feature/US-47
fix respuesta abierta
2021-08-17 00:45:54 +00:00
Eduardo Quiros c240260ebb
remover checkeo de usuario para completar encuestas 2021-08-16 18:44:37 -06:00
Paola 1a8431e962 agregacion pdf 2021-08-16 18:37:05 -06:00
Paola c3b0c0921b arreglo pdf export 2021-08-16 17:06:33 -06:00
Paola 1054a2ec8e exportar pdf y excel reportes generales 2021-08-16 15:50:39 -06:00
Paola 8d718b1966 botones exportar excel y pdf 2021-08-16 13:49:19 -06:00
Paola df70e86311 Merge branch 'dev' into feature/US-47 2021-08-16 13:44:30 -06:00
Paola 3a7c9f63cc arreglo precios 2021-08-16 13:43:57 -06:00
Eduardo Quiros c5a28aa76c
Merge pull request #136 from Quantum-P3/fix/empty-survey-template
Fix empty survey template and category list message
2021-08-16 07:41:37 +00:00
Pablo Bonilla 858177cee4
Fix survey template and categories list empty list placeholder message 2021-08-16 01:29:52 -06:00
Eduardo Quiros cf7de82bcf
Merge pull request #134 from Quantum-P3/fix/heroku-slug-size
Fix Heroku slug size by removing unnecessary images
2021-08-16 07:09:08 +00:00
Paola 65e3b18ee9 fix respuesta abierta 2021-08-16 00:51:59 -06:00
Pablo Bonilla 4c3643a2fc
Remove unnecessary images 2021-08-16 00:37:20 -06:00
Pablo Bonilla 69b09b7789
Remove unnecessary images 2021-08-16 00:05:38 -06:00
Eduardo Quiros 236b37c47a
Merge pull request #133 from Quantum-P3/feature/ver-reportes-colaborador
add ver reportes de colaboracion
2021-08-15 22:25:35 +00:00
Mariela Bonilla 18c0e40fc8 cambio de nombre de variable 2021-08-15 16:17:39 -06:00
Mariela Bonilla d4d77e92dd cambio de pregunta id de colaborador 2021-08-15 16:15:22 -06:00
Mariela Bonilla d01f11ab99 add reportes de colaboraciones, cambios de estilos 2021-08-15 16:09:24 -06:00
Mariela Bonilla ac864a5739 Merge branch 'dev' into feature/ver-reportes-colaborador 2021-08-15 00:44:17 -06:00
Mariela Bonilla 4af9d23ed1 modificaciones en estilos de tienda, entre otros 2021-08-15 00:39:51 -06:00
Eduardo Quiros d5633430ef
Merge pull request #132 from Quantum-P3/qa
deploy
2021-08-15 06:12:21 +00:00
Eduardo Quiros 0041032f7c
Merge pull request #131 from Quantum-P3/dev
pasar a QA
2021-08-15 05:55:57 +00:00
Eduardo Quiros 8fa459a993
Merge pull request #130 from Quantum-P3/feature/US-47
Feature/us 47
2021-08-15 05:50:01 +00:00
Paola d31fccc9a1 fix test 2021-08-14 23:22:33 -06:00
Paola d69fe3f7ca fix test 2021-08-14 23:14:51 -06:00
Eduardo Quiros 61ae6cd7f4
Merge pull request #129 from Quantum-P3/feature/vista-previa-en-tienda
add vista previa de plantilla en tienda
2021-08-15 05:04:16 +00:00
Eduardo Quiros 1378c766e1
Merge pull request #128 from Quantum-P3/feature/US-51
Add exportar reportes generales en formato PDF y Excel (administrador)
2021-08-15 05:03:55 +00:00
Paola 824bd25c04 arreglo reporte respuesta abierta 2021-08-14 22:20:52 -06:00
Paola 33cb997bfb fix reportes por categoria 2021-08-14 18:36:11 -06:00
Mariela Bonilla 8abd27b15a add vista previa de plantilla en tienda 2021-08-14 01:04:21 -06:00
Paola fc63e1b98e arreglo cantidad de selecciones opcion 2021-08-14 00:02:40 -06:00
Paola 2aa5d251da agregacion de reportes por encuesta 2021-08-13 22:05:52 -06:00
Paola c00a01c350 agregacion de reportes por encuesta 2021-08-13 22:04:50 -06:00
Pablo Bonilla bf62b1accb Fix PDF table report font size 2021-08-13 18:43:00 -06:00
Pablo Bonilla 29ffab414c Merge branch 'dev' into feature/US-51 2021-08-13 18:01:12 -06:00
Pablo Bonilla e7efcd5f2e Export admin dashboard reports as PDF 2021-08-13 16:47:18 -06:00
Eduardo Quiros 119ed8f2d1
Merge pull request #123 from Quantum-P3/feature/US-46
agregar calificacion de encuesta
2021-08-13 08:20:08 +00:00
Eduardo Quiros 55045a3cb1
correct dependencies 2021-08-13 02:10:24 -06:00
Eduardo Quiros ae1995b482
agregar lógica para manejo de calificación 2021-08-13 02:10:24 -06:00
Eduardo Quiros 228207c16a
arreglar estilizado 2021-08-13 02:10:23 -06:00
Eduardo Quiros 513b2a8b7f
agregar UI de calificaciones en encuesta 2021-08-13 02:10:23 -06:00
Eduardo Quiros e840e3d8c5
add function to join rating values 2021-08-13 02:10:23 -06:00
Eduardo Quiros 97b654b4af
unset initial rating value 2021-08-13 02:10:23 -06:00
Eduardo Quiros 2e7192061c
add initial rating numbers 2021-08-13 02:10:23 -06:00
Eduardo Quiros 1766f657fe
remove debuggers 2021-08-13 02:10:23 -06:00
Eduardo Quiros 72719bcad9
update vulnerable dependencies 2021-08-13 02:10:16 -06:00
Eduardo Quiros 24a8047fba
Merge pull request #127 from Quantum-P3/fix/reportes-y-textos
fix cantidad de encuestas de usuario y mensaje correo 'colaborador expulsado'
2021-08-13 08:09:54 +00:00
Mariela Bonilla be54873f0a fix cantidad de encuestas de usuario y correo 'colaborador expulsado' 2021-08-13 00:12:01 -06:00
Pablo Bonilla 562fe935f4 Add survey and users data reports export as Excel 2021-08-12 23:07:02 -06:00
Pablo Bonilla 8829ae9d03 Merge branch 'dev' into feature/US-51 2021-08-12 22:16:47 -06:00
Paola cc6426cbd8 merge fix 2021-08-12 18:06:53 -06:00
Paola de01fbfdd5 reportes de usuario front end 2021-08-12 18:03:48 -06:00
Eduardo Quiros 7a66681fa7
Merge pull request #126 from Quantum-P3/feature/US-50
add visualizar reportes de usuarios (administrador)
2021-08-12 19:20:35 +00:00
Pablo Bonilla e91f516da1
Merge branch 'dev' into feature/US-51 2021-08-12 01:00:18 -06:00
Pablo Bonilla 422c9489e6
Add survey template preview in mis-plantillas 2021-08-12 00:58:33 -06:00
Eduardo Quiros c20df7fffd
Merge pull request #111 from Quantum-P3/dev
move to QA
2021-08-02 06:03:04 +00:00
277 changed files with 3095 additions and 1174 deletions

2184
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -86,6 +86,7 @@
"@types/gapi.auth2": "0.0.54", "@types/gapi.auth2": "0.0.54",
"angularx-social-login": "^4.0.1", "angularx-social-login": "^4.0.1",
"bootstrap": "4.6.0", "bootstrap": "4.6.0",
"chart.js": "^3.5.0",
"chartist": "^0.11.4", "chartist": "^0.11.4",
"dayjs": "1.10.5", "dayjs": "1.10.5",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
@ -93,6 +94,7 @@
"jspdf": "^2.3.1", "jspdf": "^2.3.1",
"jw-angular-social-buttons": "^1.0.0", "jw-angular-social-buttons": "^1.0.0",
"ng-chartist": "^5.0.0", "ng-chartist": "^5.0.0",
"ng2-charts": "^2.4.2",
"ngx-infinite-scroll": "10.0.1", "ngx-infinite-scroll": "10.0.1",
"ngx-paypal": "^8.0.0", "ngx-paypal": "^8.0.0",
"ngx-sharebuttons": "^8.0.5", "ngx-sharebuttons": "^8.0.5",

View File

@ -43,10 +43,7 @@ public class UsuarioEncuesta implements Serializable {
private UsuarioExtra usuarioExtra; private UsuarioExtra usuarioExtra;
@ManyToOne @ManyToOne
@JsonIgnoreProperties( @JsonIgnoreProperties(value = { "usuarioEncuestas", "usuarioExtra" }, allowSetters = true)
value = { "usuarioEncuestas", "ePreguntaAbiertas", "ePreguntaCerradas", "categoria", "usuarioExtra" },
allowSetters = true
)
private Encuesta encuesta; private Encuesta encuesta;
// jhipster-needle-entity-add-field - JHipster will add fields here // jhipster-needle-entity-add-field - JHipster will add fields here

View File

@ -80,11 +80,14 @@ public class EPreguntaCerradaOpcionResource {
.body(result); .body(result);
} }
@PostMapping("/e-pregunta-cerrada-opcions/count/{id}") @PutMapping("/e-pregunta-cerrada-opcions/count/{id}")
public ResponseEntity<EPreguntaCerradaOpcion> updateOpcionCount(@PathVariable(value = "id", required = true) final Long id) { public ResponseEntity<EPreguntaCerradaOpcion> updateOpcionCount(@PathVariable(value = "id", required = false) final Long id) {
EPreguntaCerradaOpcion updatedOpcion = getEPreguntaCerradaOpcion(id).getBody(); System.out.println(id);
int cantidad = updatedOpcion.getCantidad(); EPreguntaCerradaOpcion updatedOpcion = ePreguntaCerradaOpcionService.findOne(id).get();
updatedOpcion.setCantidad(cantidad += 1); System.out.println(updatedOpcion);
int cantidad = updatedOpcion.getCantidad() + 1;
updatedOpcion.setCantidad(cantidad);
this.ePreguntaCerradaOpcionService.partialUpdate(updatedOpcion);
return ResponseEntity.ok(updatedOpcion); return ResponseEntity.ok(updatedOpcion);
} }

View File

@ -432,7 +432,7 @@ public class EncuestaResource {
newEncuesta.setNombre(encuesta.get().getNombre()); newEncuesta.setNombre(encuesta.get().getNombre());
newEncuesta.setDescripcion(encuesta.get().getDescripcion()); newEncuesta.setDescripcion(encuesta.get().getDescripcion());
newEncuesta.setFechaCreacion(ZonedDateTime.now()); newEncuesta.setFechaCreacion(ZonedDateTime.now());
newEncuesta.setCalificacion(5d); newEncuesta.setCalificacion(5.1d);
newEncuesta.setAcceso(encuesta.get().getAcceso()); newEncuesta.setAcceso(encuesta.get().getAcceso());
newEncuesta.setEstado(encuesta.get().getEstado()); newEncuesta.setEstado(encuesta.get().getEstado());
newEncuesta.setCategoria(encuesta.get().getCategoria()); newEncuesta.setCategoria(encuesta.get().getCategoria());

View File

@ -60,15 +60,15 @@ email.invitation.text1=Fue invitado a la encuesta "{0}(#{1})". Para aceptar la s
email.invitation.text2=Saludos, email.invitation.text2=Saludos,
#Delete Colaborator #Delete Colaborator
email.deleteColaborator.title=Se le ha expulsado de una encuesta como colaborador email.deleteColaborator.title=Eliminado de colaboración
email.deleteColaborator.greeting=¡Se le ha expulsado, {0}! email.deleteColaborator.greeting=Hola, {0}
email.deleteColaborator.text1=Fue expulsado de la encuesta {0}(#{1})" email.deleteColaborator.text1=Le informamos que ya no cuenta con los permisos de colaborador para la encuesta {0}(#{1}), ya que su colaboración ha sido eliminada por el dueño de la encuesta"
email.deleteColaborator.text2=Saludos, email.deleteColaborator.text2=Saludos,
email.receipt.title=Comprobante de pago email.receipt.title=Comprobante de pago
email.receipt.user={0} email.receipt.user={0}
email.receipt.fecha={0} email.receipt.fecha=Fecha de pago: {0}
email.receipt.plantilla={0} email.receipt.plantilla={0}
email.receipt.precio=${0} email.receipt.precio=${0}

View File

@ -135,11 +135,9 @@
<div class="page-content container"> <div class="page-content container">
<div class="container px-0"> <div class="container px-0">
<div class="row mt-4"> <div class="row mt-4">
<div class="col-12 col-lg-10 offset-lg-1"> <div>
<!-- .row --> <!-- .row -->
<hr class="row brc-default-l1 mx-n1 mb-4" />
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm-6">
<div> <div>
@ -153,31 +151,56 @@
<!-- /.col --> <!-- /.col -->
<div class="text-95 col-sm-6 align-self-start d-sm-flex justify-content-end"> <div class="text-95 col-sm-6 align-self-start d-sm-flex justify-content-end">
<hr class="d-sm-none" />
<div class="text-grey-m2"> <div class="text-grey-m2">
<div class="my-2"> <div class="my-2">
<i class="fa fa-circle text-blue-m2 text-xs mr-1"></i> <i class="text-blue-m2 text-xs mr-1"></i>
<span class="text-600 text-90" th:text="#{email.receipt.fecha(${factura.getFecha()}, 'dd-MM-yyyy HH:mm' )}" <span class="text-600 text-90" th:text="#{email.receipt.fecha(${factura.getFecha()}, 'dd-MM-yyyy HH:mm' )}"
>Fecha:</span >Fecha:</span
> >
</div> </div>
</div> </div>
</div> </div>
<hr class="d-sm-none" />
<!-- /.col --> <!-- /.col -->
</div> </div>
<div class="mt-4"> <div class="container">
<div class="row text-600 text-white bgc-default-tp1 py-25"> <div class="row">
<div class="col-9 col-sm-5">Plantilla</div> <div class="col-lg-10 mt-5 mb-5">
<div class="d-none d-sm-block col-4 col-sm-2">Cantidad</div> <table class="table table-bordered" style="width: 100%">
<div class="d-none d-sm-block col-sm-2">Precio</div> <thead>
</div> <tr class="text-uppercase font-weight-bold text-blue">
<th>Plantilla</th>
<th>Cantidad</th>
<th>Precio</th>
</tr>
</thead>
<div class="text-95 text-secondary-d3"> <tbody style="text-align: center">
<div class="row mb-2 mb-sm-0 py-25"> <tr class="text-95 text-secondary-d3">
<div class="col-9 col-sm-5" th:text="#{email.receipt.plantilla(${factura.getNombrePlantilla()})}"></div> <td th:text="#{email.receipt.plantilla(${factura.getNombrePlantilla()})}"></td>
<div class="d-none d-sm-block col-2">1</div> <td>1</td>
<div class="d-none d-sm-block col-2 text-95" th:text="#{email.receipt.precio(${factura.getCosto()})}"></div> <td th:text="#{email.receipt.precio(${factura.getCosto()})}"></td>
</tr>
</tbody>
</table>
<hr />
<!-- <div class="row text-600 text-white bgc-default-tp1 d-flex flex-row" >
<div class="col-9 col-sm-5">Plantilla</div>
<div class="d-none d-sm-block col-4 col-sm-2">Cantidad</div>
<div class="d-none d-sm-block col-sm-2">Precio</div>
</div>
<div class="text-95 text-secondary-d3">
<div class="row mb-2 mb-sm-0 py-25">
<div class="col-9 col-sm-5" th:text="#{email.receipt.plantilla(${factura.getNombrePlantilla()})}"></div>
<div class="d-none d-sm-block col-2">1</div>
<div class="d-none d-sm-block col-2 text-95" th:text="#{email.receipt.precio(${factura.getCosto()})}"></div>
</div>
</div>-->
</div> </div>
</div> </div>
</div> </div>
@ -185,7 +208,7 @@
<div class="row mt-3"> <div class="row mt-3">
<div class="col-12 col-sm-5 text-grey text-90 order-first order-sm-last"> <div class="col-12 col-sm-5 text-grey text-90 order-first order-sm-last">
<div class="row my-2 align-items-center bgc-primary-l3 p-2"> <div class="row my-2 align-items-center bgc-primary-l3 p-2">
<div class="col-7 text-right">Monto total</div> <div class="col-7 text-600 text-110 text-blue text-right">Monto total:</div>
<div class="col-5"> <div class="col-5">
<span class="text-150 text-success-d3 opacity-2" th:text="#{email.receipt.precio(${factura.getCosto()})}"></span> <span class="text-150 text-success-d3 opacity-2" th:text="#{email.receipt.precio(${factura.getCosto()})}"></span>
</div> </div>

View File

@ -33,8 +33,13 @@
</button> </button>
</div> </div>
<div class="alert alert-warning" id="no-result" *ngIf="categorias?.length === 0"> <div class="ds-survey" id="entities" *ngIf="categorias?.length === 0">
<span jhiTranslate="dataSurveyApp.categoria.home.notFound">No categorias found</span> <div class="ds-survey--all-question-wrapper">
<ng-container class="">
<p class="ds-title text-center">No existen categorías</p>
<p class="ds-subtitle text-center">Inicie creando categorías para identificar las encuestas de los usuarios</p>
</ng-container>
</div>
</div> </div>
<div class="table-responsive" id="entities" *ngIf="categorias && categorias.length > 0"> <div class="table-responsive" id="entities" *ngIf="categorias && categorias.length > 0">

View File

@ -101,7 +101,7 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="table-responsive"> <div class="table-responsive">
<table class="table"> <table class="ds-table table">
<tbody> <tbody>
<tr *ngFor="let categoria of categorias; let i = index; trackBy: trackId"> <tr *ngFor="let categoria of categorias; let i = index; trackBy: trackId">
<td>{{ categoria.nombre }}</td> <td>{{ categoria.nombre }}</td>
@ -127,7 +127,7 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="table-responsive"> <div class="table-responsive">
<table class="table"> <table class="ds-table table">
<tbody> <tbody>
<tr *ngFor="let categoria of categorias; let i = index; trackBy: trackId"> <tr *ngFor="let categoria of categorias; let i = index; trackBy: trackId">
<td>{{ categoria.nombre }}</td> <td>{{ categoria.nombre }}</td>
@ -199,7 +199,7 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="table-responsive"> <div class="table-responsive">
<table class="table"> <table class="ds-table table">
<thead> <thead>
<tr> <tr>
<th>Usuario</th> <th>Usuario</th>

View File

@ -3,7 +3,7 @@ import * as XLSX from 'xlsx';
import * as FileSaver from 'file-saver'; import * as FileSaver from 'file-saver';
import { jsPDF } from 'jspdf'; import { jsPDF } from 'jspdf';
import { exportAsExcelFile, exportAsExcelTable } from '../export/export_excel'; import { exportAsExcelFile, exportAsExcelTable } from '../export/export_excel';
import { generatePDFTableData, createPDFTableHeaders, generatePDFTable } from '../export/export_pdf'; import { generatePDFTableData, createPDFTableHeaders, generatePDFTable, saveGeneratedPDF } from '../export/export_pdf';
import { FacturaService } from '../../factura/service/factura.service'; import { FacturaService } from '../../factura/service/factura.service';
import { UsuarioExtraService } from '../../usuario-extra/service/usuario-extra.service'; import { UsuarioExtraService } from '../../usuario-extra/service/usuario-extra.service';
@ -170,9 +170,7 @@ export class DashboardAdminComponent implements OnInit {
let cantPublicadas = 0; let cantPublicadas = 0;
let cantFinalizadas = 0; let cantFinalizadas = 0;
let cantBorradores = 0; let cantBorradores = 0;
cantEncuestas = tmpEncuestas.filter( cantEncuestas = tmpEncuestas.filter(e => e.estado !== 'DELETED' && e.usuarioExtra?.id === u.id).length;
e => e.estado !== 'DELETED' && e.usuarioExtra?.id === u.id && e.usuarioExtra?.user?.authorities
).length;
cantPublicadas = tmpEncuestas.filter(e => e.estado === 'ACTIVE' && e.usuarioExtra?.id === u.id).length; cantPublicadas = tmpEncuestas.filter(e => e.estado === 'ACTIVE' && e.usuarioExtra?.id === u.id).length;
cantFinalizadas = tmpEncuestas.filter(e => e.estado === 'FINISHED' && e.usuarioExtra?.id === u.id).length; cantFinalizadas = tmpEncuestas.filter(e => e.estado === 'FINISHED' && e.usuarioExtra?.id === u.id).length;
cantBorradores = tmpEncuestas.filter(e => e.estado === 'DRAFT' && e.usuarioExtra?.id === u.id).length; cantBorradores = tmpEncuestas.filter(e => e.estado === 'DRAFT' && e.usuarioExtra?.id === u.id).length;
@ -315,7 +313,14 @@ export class DashboardAdminComponent implements OnInit {
Cantidad de comentarios de retroalimentación Cantidad de comentarios de retroalimentación
*/ */
const _sheets = ['reportes generales', 'enc. publicadas', 'enc. publicadas categoría', 'enc. finalizadas categoría']; const _sheets = [
'usuarios generales',
'enc. publicadas',
'enc. publicadas categoría',
'enc. finalizadas categoría',
'encuestas generales',
'reporte de usuarios',
];
const _reporteUsuarios = [ const _reporteUsuarios = [
{ {
@ -355,13 +360,44 @@ export class DashboardAdminComponent implements OnInit {
_reporteCantidadEncuestasFinalizadasCategoria.push(_report); _reporteCantidadEncuestasFinalizadasCategoria.push(_report);
}); });
// exportAsExcelTable(); // this.encuestasPublicadas
// this.encuestasFinalizadas
// this.encuestasBorrador
// this.encuestasCompletadas
const _reporteEncuestasReportesGenerales = [
{
encuestas_borrador: this.encuestasBorrador,
encuestas_publicadas: this.encuestasPublicadas,
encuestas_finalizadas: this.encuestasFinalizadas,
encuestas_completadas: this.encuestasCompletadas,
},
];
// this.encuestasUsuario;
// this.encuestasUsuarioPublicadas;
// this.encuestasUsuarioFinalizadas;
// this.encuestasUsuarioBorrador;
// this.encuestasUsuarioCompletadas;
// this.usuarios;
const _reporteEncuestasUsuarios: any[] = [];
this.usuarios!.forEach((user, index) => {
let _report: any = {};
_report['usuario_nombre'] = user.nombre;
_report['usuario_encuestas'] = this.encuestasUsuario[index];
_report['encuestas_borrador'] = this.encuestasUsuarioBorrador[index];
_report['encuestas_publicadas'] = this.encuestasUsuarioPublicadas[index];
_report['encuestas_finalizadas'] = this.encuestasUsuarioFinalizadas[index];
_report['encuestas_completadas_usuarios'] = this.encuestasUsuarioCompletadas[index];
_reporteEncuestasUsuarios.push(_report);
});
const _excelFinalData = [ const _excelFinalData = [
_reporteUsuarios, _reporteUsuarios,
_reporteEncuestasPublicadas, _reporteEncuestasPublicadas,
_reporteCantidadEncuestasPublicadasCategoria, _reporteCantidadEncuestasPublicadasCategoria,
_reporteCantidadEncuestasFinalizadasCategoria, _reporteCantidadEncuestasFinalizadasCategoria,
_reporteEncuestasReportesGenerales,
_reporteEncuestasUsuarios,
]; ];
const _fileName = 'reportes_datasurvey'; const _fileName = 'reportes_datasurvey';
exportAsExcelFile(_sheets, _excelFinalData, _fileName); exportAsExcelFile(_sheets, _excelFinalData, _fileName);
@ -384,15 +420,115 @@ export class DashboardAdminComponent implements OnInit {
*/ */
const doc = new jsPDF(); const doc = new jsPDF();
const _fileName = 'reportes_datasurvey';
let _docData, _headers, _docHeaders, _docTitle;
const _reporteUsuarios = [{ usuarios_activos: '100', usuarios_bloqueados: '50' }]; // Usuarios Generales
const _docData = generatePDFTableData(_reporteUsuarios); const _reporteUsuarios = [
{
ganancias_plantillas: this.gananciasTotales!.toString(),
usuarios_activos: this.cantUsuarioActivos!.toString(),
usuarios_bloqueados: this.cantUsuarioBloqueados!.toString(),
},
];
_docData = generatePDFTableData(_reporteUsuarios);
_headers = ['ganancias_plantillas', 'usuarios_activos', 'usuarios_bloqueados'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte Usuarios Generales';
const _headers = ['usuarios_activos', 'usuarios_bloqueados']; generatePDFTable(doc, _docData, _docHeaders, _docTitle);
const _docHeaders = createPDFTableHeaders(_headers); doc.addPage('p');
const _fileName = 'reporte_general';
const _docTitle = 'Reportes Generales de la Aplicación';
generatePDFTable(doc, _docData, _docHeaders, _fileName, _docTitle); // Encuestas Publicadas
const _reporteEncuestasPublicadas: any[] = [];
this.listaMesesAnnos.forEach((date: any, index) => {
let _report: any = {};
_report['fecha'] = date;
_report['cantidad'] = this.encuestasPublicadasMesAnno[index].toString();
_reporteEncuestasPublicadas.push(_report);
});
_docData = generatePDFTableData(_reporteEncuestasPublicadas);
_headers = ['fecha', 'cantidad'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte Encuestas Publicadas';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('p');
// Encuestas Publicadas
const _reporteCantidadEncuestasPublicadasCategoria: any[] = [];
this.categorias!.forEach((categoria: any, index) => {
let _report: any = {};
_report['categoria'] = categoria.nombre;
_report['cantidad'] = this.encuestasPublicadasCategoria[index].toString();
_reporteCantidadEncuestasPublicadasCategoria.push(_report);
});
_docData = generatePDFTableData(_reporteCantidadEncuestasPublicadasCategoria);
_headers = ['categoria', 'cantidad'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte Encuestas Publicadas por Categoría';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('p');
// Encuestas Publicadas
const _reporteCantidadEncuestasFinalizadasCategoria: any[] = [];
this.categorias!.forEach((categoria: any, index) => {
let _report: any = {};
_report['categoria'] = categoria.nombre;
_report['cantidad'] = this.encuestasFinalzadasCategoria[index].toString();
_reporteCantidadEncuestasFinalizadasCategoria.push(_report);
});
_docData = generatePDFTableData(_reporteCantidadEncuestasFinalizadasCategoria);
_headers = ['categoria', 'cantidad'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte Encuestas Finalizadas por Categoría';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('', 'l');
// Encuestas Generales
const _reporteEncuestasReportesGenerales = [
{
encuestas_borrador: this.encuestasBorrador.toString(),
encuestas_publicadas: this.encuestasPublicadas.toString(),
encuestas_finalizadas: this.encuestasFinalizadas.toString(),
encuestas_completadas: this.encuestasCompletadas.toString(),
},
];
_docData = generatePDFTableData(_reporteEncuestasReportesGenerales);
_headers = ['encuestas_borrador', 'encuestas_publicadas', 'encuestas_finalizadas', 'encuestas_completadas'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte Encuestas Generales';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('', 'l');
// Usuarios
const _reporteEncuestasUsuarios: any[] = [];
this.usuarios!.forEach((user, index) => {
let _report: any = {};
_report['usuario_nombre'] = user.nombre;
_report['usuario_encuestas'] = this.encuestasUsuario[index].toString();
_report['encuestas_borrador'] = this.encuestasUsuarioBorrador[index].toString();
_report['encuestas_publicadas'] = this.encuestasUsuarioPublicadas[index].toString();
_report['encuestas_finalizadas'] = this.encuestasUsuarioFinalizadas[index].toString();
_report['encuestas_completadas_usuarios'] = this.encuestasUsuarioCompletadas[index].toString();
_reporteEncuestasUsuarios.push(_report);
});
_docData = generatePDFTableData(_reporteEncuestasUsuarios);
_headers = [
'usuario_nombre',
'usuario_encuestas',
'encuestas_borrador',
'encuestas_publicadas',
'encuestas_finalizadas',
'encuestas_completadas_usuarios',
];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte de Usuarios';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
saveGeneratedPDF(doc, _fileName);
} }
} }

View File

@ -1 +1,468 @@
<p>dashboard-user works!</p> <div class="content">
<div class="py-2">
<button type="button" class="ds-btn ds-btn--primary" (click)="exportReportesGeneralesUserExcel()">Exportar como Excel</button>
<button type="button" class="ds-btn ds-btn--primary" (click)="exportReportesGeneralesUserPDF()">Exportar como PDF</button>
<button
type="button"
[hidden]="!reportsGeneral || (reportForEncuestas && reportColaboraciones)"
class="ds-btn ds-btn--primary"
style="float: right"
(click)="cambiarVista()"
>
Ver reportes generales
</button>
<button
type="button"
[hidden]="!reportForEncuestas || (reportsGeneral && reportColaboraciones)"
class="ds-btn ds-btn--primary"
style="float: right"
(click)="cambiarVista()"
>
Ver reportes por encuestas
</button>
<button
type="button"
[hidden]="!reportColaboraciones || (reportsGeneral && reportForEncuestas)"
class="ds-btn ds-btn--primary"
style="float: right"
(click)="cambiarVistaColaboracion('colaboracion')"
>
Ver reportes de colaboraciones
</button>
<button type="button" [hidden]="reportPreguntas" class="ds-btn ds-btn--secondary" style="float: right" (click)="cambiarVista()">
<fa-icon icon="arrow-left"></fa-icon>&nbsp; Volver
</button>
<button
type="button"
[hidden]="reportColaboracionPreguntas"
class="ds-btn ds-btn--secondary"
style="float: right"
(click)="cambiarVista()"
>
<fa-icon icon="arrow-left"></fa-icon>&nbsp; Volver
</button>
</div>
<div class="container-fluid">
<div class="py-2" [hidden]="reportsGeneral">
<h1>Reportes generales</h1>
<h2>En esta sección encontrará los reportes generales de todas sus encuestas</h2>
</div>
<div class="py-2" [hidden]="reportForEncuestas">
<h1>Reportes por encuesta</h1>
<h2>En esta sección encontrará los reportes de cada una de sus encuestas</h2>
</div>
<div class="py-2" [hidden]="reportPreguntas">
<h1>Detalles de la encuesta</h1>
<h2>En esta sección encontrará los reportes con respecto al contenido de las preguntas de su encuesta</h2>
</div>
<div class="py-2" [hidden]="reportColaboraciones">
<h1>Reportes de colaboraciones</h1>
<h2>En esta sección encontrará los reportes generales de todas las colaboraciones en las que esté participando</h2>
</div>
<div class="py-2" [hidden]="reportColaboracionPreguntas">
<h1>Detalles de la encuesta en la que colabora</h1>
<h2>En esta sección encontrará los reportes con respecto al contenido de las preguntas de la encuesta a la que colabora</h2>
</div>
<hr />
<!--REPORTES GENERALES-->
<div class="container-fluid py-5" [hidden]="reportsGeneral">
<div class="">
<div class="row justify-content-around">
<div class="col-lg-3 col-sm-6">
<div class="card">
<div class="card-content">
<div class="row">
<div class="col-xs-5 w-25 px-1">
<div class="icon-big icon-success text-center">
<fa-icon [icon]="faListAlt"></fa-icon>
</div>
</div>
<div class="col-xs-7 w-50">
<div class="numbers">
<p class="ds-title--small">Cantidad de encuestas creadas</p>
{{ cantEncuestas }}
</div>
</div>
</div>
</div>
<div class="card-footer">
<hr />
<br />
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div class="card">
<div class="card-content">
<div class="row">
<div class="col-xs-5 w-25 px-1">
<div class="icon-big icon-users-active text-center">
<fa-icon [icon]="faUser"></fa-icon>
</div>
</div>
<div class="col-xs-7 w-50">
<div class="numbers">
<p class="ds-title--small">Cantidad de usuario que han completado las encuestas</p>
{{ cantPersonas }}
</div>
</div>
</div>
</div>
<div class="card-footer">
<hr />
<br />
</div>
</div>
</div>
</div>
<div class="row justify-content-around por-categoria">
<div class="col-md-5">
<div class="grafico-encuestas-fecha">
<div class="card" height="300" width="300">
<h1 class="ds-title">Cantidad de encuestas por estado</h1>
<div id="chartEstado" class="ct-chart ct-major-tenth"></div>
</div>
</div>
</div>
<div class="col-md-5">
<div class="grafico-encuestas-fecha">
<div class="card" height="300" width="300">
<h1 class="ds-title">Cantidad de encuestas por acceso</h1>
<div id="chartAcceso" class="ct-chart ct-major-tenth"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--REPORTE POR ENCUESTA-->
<div class="container-fluid" [hidden]="reportForEncuestas">
<div class="ds-survey" id="entitiesEncuestas" *ngIf="encuestas && encuestas?.length === 0">
<div class="ds-survey--all-question-wrapper">
<ng-container class="">
<p class="ds-title text-center">No posee encuestas</p>
</ng-container>
</div>
</div>
<div class="row gx-5" *ngIf="encuestas && encuestas.length > 0">
<div class="col-xl-4 col-lg-4 col-md-6 mb-5" *ngFor="let encuesta of encuestas">
<div class="card-encuesta lift h-100" [attr.data-id]="encuesta.id">
<div class="card-body p-3">
<div class="card-title mb-0">{{ encuesta.nombre }}</div>
<div class="entity-body--row m-2">
<span class="tag mt-2">{{ encuesta.categoria?.nombre | lowercase }}</span>
</div>
<div class="entity-body--row m-2">
<span class="subtitle mt-2">{{ encuesta.descripcion | titlecase }}</span>
</div>
<div class="text-xs text-gray-500">
<div class="entity-body">
<!--<div class="entity-body&#45;&#45;row m-2" *ngFor="let d of duracionArray">
<span class="mt-2" *ngIf="d! > 0"
><fa-icon class="entity-icon&#45;&#45;access" [icon]="faCalendarAlt"></fa-icon> Duración: &nbsp;&nbsp;&nbsp;&nbsp;{{
d
}}</span
>
<span class="mt-2" *ngIf="d! == 0"
><fa-icon class="entity-icon&#45;&#45;access" [icon]="faCalendarAlt"></fa-icon> Duración: &nbsp;&nbsp;&nbsp;&nbsp;Un día o
menos</span
>
<span class="mt-2" *ngIf="d! == -1"
><fa-icon class="entity-icon&#45;&#45;access" [icon]="faCalendarAlt"></fa-icon> Duración: &nbsp;&nbsp;&nbsp;&nbsp;No ha
finalizado</span
>
</div>-->
<div class="entity-body--row m-2">
<p>Calificación:</p>
<fa-icon *ngFor="let i of [].constructor(encuesta.calificacion)" class="entity-icon--star" [icon]="faStar"></fa-icon>
<fa-icon
*ngFor="let i of [].constructor(5 - encuesta.calificacion!)"
class="entity-icon--star--off"
[icon]="faStar"
></fa-icon>
</div>
<div class="entity-body--row m-2">
<button (click)="detallesPreguntas(encuesta)" class="ds-btn btn-card ds-btn--primary">
<fa-icon [icon]="faEye"></fa-icon>&nbsp;&nbsp;Detalle
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--REPORTES DE LAS PREGUNTAS-->
<div class="container-fluid" *ngIf="encuesta" [hidden]="reportPreguntas">
<div class="ds-survey" id="entitiesPreguntas" *ngIf="ePreguntas && ePreguntas?.length === 0">
<div class="ds-survey--all-question-wrapper">
<ng-container class="">
<p class="ds-title text-center">No se encontraron preguntas</p>
</ng-container>
</div>
</div>
<div>
<div class="ds-survey preview-survey" id="entities" *ngIf="ePreguntas && ePreguntas.length > 0">
<div class="ds-survey--all-question-wrapper col-8">
<div class="ds-survey--question-wrapper card-encuesta" *ngFor="let ePregunta of ePreguntas; let i = index">
<div
[attr.data-index]="ePregunta.id"
[attr.data-tipo]="ePregunta.tipo"
[attr.data-opcional]="ePregunta.opcional"
class="ds-survey--question"
>
<div class="ds-survey--titulo">
<span class="ds-survey--titulo--name">{{ i + 1 }}. {{ ePregunta.nombre }}</span>
</div>
<div>
<span *ngIf="ePregunta.tipo === 'SINGLE'" class="ds-subtitle"
>Pregunta de respuesta {{ 'dataSurveyApp.PreguntaCerradaTipo.SINGLE' | translate | lowercase }}
{{ ePregunta.opcional ? '(opcional)' : '' }}</span
>
<span *ngIf="ePregunta.tipo === 'MULTIPLE'" class="ds-subtitle"
>Pregunta de respuesta {{ 'dataSurveyApp.PreguntaCerradaTipo.MULTIPLE' | translate | lowercase }}
{{ ePregunta.opcional ? '(opcional)' : '' }}</span
>
<span *ngIf="!ePregunta.tipo" class="ds-subtitle"
>Pregunta de respuesta abierta {{ ePregunta.opcional ? '(opcional)' : '' }}</span
>
</div>
<ng-container *ngIf="ePregunta.tipo">
<ng-container *ngFor="let ePreguntaOpcion of ePreguntasOpciones; let j = index">
<ng-container *ngFor="let ePreguntaOpcionFinal of ePreguntaOpcion">
<ng-container *ngIf="ePregunta.id === ePreguntaOpcionFinal.epreguntaCerrada.id">
<div
class="ds-survey--option ds-survey--option--base ds-survey--closed-option can-delete"
[attr.data-id]="ePreguntaOpcionFinal.id"
>
<div class="radio" *ngIf="ePregunta.tipo === 'SINGLE'">
<!--<input
type="text"
readonly
style="border-radius: 3px"
name="{{ 'radio' + ePregunta.id }}"
id="'radio'"
/>-->
<label>{{
ePreguntaOpcionFinal.nombre + ' / Cantidad de veces seleccionada: ' + ePreguntaOpcionFinal.cantidad
}}</label>
</div>
<div class="checkbox" *ngIf="ePregunta.tipo === 'MULTIPLE'">
<!--<input
type="checkbox"
style="border-radius: 3px"
id="{{ 'checkbox' + ePreguntaOpcionFinal.id }}"
/>-->
<label>{{
ePreguntaOpcionFinal.nombre + ' / Cantidad de veces seleccionada: ' + ePreguntaOpcionFinal.cantidad
}}</label>
</div>
</div>
</ng-container>
</ng-container>
</ng-container>
</ng-container>
<div *ngIf="!ePregunta.tipo">
<div *ngFor="let res of respuestaAbierta">
<!-- <ul>
<li *ngIf="res.epreguntaAbierta?.id == preguntaId"> {{ res.respuesta }}</li>
</ul>-->
<!-- <textarea readonly class="ds-survey&#45;&#45;textarea" cols="33" rows="10" *ngIf="res.epreguntaAbierta?.id == preguntaId" > {{ res.respuesta }} </textarea>-->
<div *ngIf="res.epreguntaAbierta?.id == ePregunta.id">
<label> {{ '- ' + res.respuesta }}</label> <br />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--REPORTE POR COLABORACION-->
<div class="container-fluid" [hidden]="reportColaboraciones">
<div class="ds-survey" id="entitiesColaboraciones" *ngIf="usuarioEncuestas && usuarioEncuestas?.length === 0">
<div class="ds-survey--all-question-wrapper">
<ng-container class="">
<p class="ds-title text-center">No posee colaboraciones</p>
</ng-container>
</div>
</div>
<div class="row gx-5" *ngIf="usuarioEncuestas && usuarioEncuestas.length > 0">
<div class="col-xl-4 col-lg-4 col-md-6 mb-5" *ngFor="let colaboracion of usuarioEncuestas">
<div class="card-encuesta lift h-100" *ngIf="colaboracion.encuesta" [attr.data-id]="colaboracion.encuesta.id">
<div class="card-body p-3">
<div class="card-title mb-0">{{ colaboracion.encuesta.nombre }}</div>
<div class="entity-body--row m-2">
<span class="tag mt-2">{{ colaboracion.encuesta.categoria?.nombre | lowercase }}</span>
</div>
<div class="entity-body--row m-2">
<span class="subtitle mt-2">{{ colaboracion.encuesta.descripcion | titlecase }}</span>
</div>
<div class="text-xs text-gray-500">
<div class="entity-body">
<div class="entity-body--row m-2">
<span class="mt-2" *ngIf="duracionColaboracion! > 0"
><fa-icon class="entity-icon--access" [icon]="faCalendarAlt"></fa-icon> Duración: &nbsp;&nbsp;&nbsp;&nbsp;{{
duracionColaboracion
}}</span
>
<span class="mt-2" *ngIf="duracionColaboracion! == 0"
><fa-icon class="entity-icon--access" [icon]="faCalendarAlt"></fa-icon> Duración: &nbsp;&nbsp;&nbsp;&nbsp;Un día o
menos</span
>
<span class="mt-2" *ngIf="duracionColaboracion! == -1"
><fa-icon class="entity-icon--access" [icon]="faCalendarAlt"></fa-icon> Duración: &nbsp;&nbsp;&nbsp;&nbsp;No ha
finalizado</span
>
</div>
<div class="entity-body--row m-2">
<p>Calificación:</p>
<fa-icon
*ngFor="let i of [].constructor(colaboracion.encuesta.calificacion)"
class="entity-icon--star"
[icon]="faStar"
></fa-icon>
<fa-icon
*ngFor="let i of [].constructor(5 - colaboracion.encuesta.calificacion!)"
class="entity-icon--star--off"
[icon]="faStar"
></fa-icon>
</div>
<div class="entity-body--row m-2">
<button (click)="detallesPreguntasColaboracion(colaboracion.encuesta)" class="ds-btn btn-card ds-btn--primary">
<fa-icon [icon]="faEye"></fa-icon>&nbsp;&nbsp;Detalle
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--REPORTES DE LAS PREGUNTAS DE LA COLABORACION-->
<div class="container-fluid" *ngIf="colaboracion" [hidden]="reportColaboracionPreguntas">
<div>
<div
class="ds-survey"
id="entitiesPreguntasColaboracion"
*ngIf="ePreguntasOpcionesColaboracion && ePreguntasOpcionesColaboracion?.length === 0"
>
<div class="ds-survey--all-question-wrapper">
<ng-container class="">
<p class="ds-title text-center">No se encontraron preguntas</p>
</ng-container>
</div>
</div>
<div
class="ds-survey preview-survey"
id="entitiesColaboration"
*ngIf="ePreguntasOpcionesColaboracion && ePreguntasOpcionesColaboracion.length > 0"
>
<div class="ds-survey--all-question-wrapper col-8">
<div class="ds-survey--question-wrapper card-encuesta" *ngFor="let ePregunta of ePreguntasOpcionesColaboracion; let i = index">
<div
[attr.data-index]="ePregunta.id"
[attr.data-tipo]="ePregunta.tipo"
[attr.data-opcional]="ePregunta.opcional"
class="ds-survey--question"
>
<div class="ds-survey--titulo">
<span class="ds-survey--titulo--name">{{ i + 1 }}. {{ ePregunta.nombre }}</span>
</div>
<div>
<span *ngIf="ePregunta.tipo === 'SINGLE'" class="ds-subtitle"
>Pregunta de respuesta {{ 'dataSurveyApp.PreguntaCerradaTipo.SINGLE' | translate | lowercase }}
{{ ePregunta.opcional ? '(opcional)' : '' }}</span
>
<span *ngIf="ePregunta.tipo === 'MULTIPLE'" class="ds-subtitle"
>Pregunta de respuesta {{ 'dataSurveyApp.PreguntaCerradaTipo.MULTIPLE' | translate | lowercase }}
{{ ePregunta.opcional ? '(opcional)' : '' }}</span
>
<span *ngIf="!ePregunta.tipo" class="ds-subtitle"
>Pregunta de respuesta abierta {{ ePregunta.opcional ? '(opcional)' : '' }}</span
>
</div>
<ng-container *ngIf="ePregunta.tipo">
<ng-container *ngFor="let ePreguntaOpcion of ePreguntasOpcionesColaboracion; let j = index">
<ng-container *ngFor="let ePreguntaOpcionFinal of ePreguntaOpcion">
<ng-container *ngIf="ePregunta.id === ePreguntaOpcionFinal.epreguntaCerrada.id">
<div
class="ds-survey--option ds-survey--option--base ds-survey--closed-option can-delete"
[attr.data-id]="ePreguntaOpcionFinal.id"
>
<div class="radio" *ngIf="ePregunta.tipo === 'SINGLE'">
<!--<input
type="text"
readonly
style="border-radius: 3px"
name="{{ 'radio' + ePregunta.id }}"
id="'radio'"
/>-->
<label>{{
ePreguntaOpcionFinal.nombre + ' / Cantidad de veces seleccionada: ' + ePreguntaOpcionFinal.cantidad
}}</label>
</div>
<div class="checkbox" *ngIf="ePregunta.tipo === 'MULTIPLE'">
<!--<input
type="checkbox"
style="border-radius: 3px"
id="{{ 'checkbox' + ePreguntaOpcionFinal.id }}"
/>-->
<label>{{
ePreguntaOpcionFinal.nombre + ' / Cantidad de veces seleccionada: ' + ePreguntaOpcionFinal.cantidad
}}</label>
</div>
</div>
</ng-container>
</ng-container>
</ng-container>
</ng-container>
<div *ngIf="!ePregunta.tipo">
<div *ngFor="let res of respuestaAbiertaColaboracion">
<!-- <ul>
<li *ngIf="res.epreguntaAbierta?.id == preguntaId"> {{ res.respuesta }}</li>
</ul>-->
<!-- <textarea readonly class="ds-survey&#45;&#45;textarea" cols="33" rows="10" *ngIf="res.epreguntaAbierta?.id == preguntaId" > {{ res.respuesta }} </textarea>-->
<div *ngIf="res.epreguntaAbierta?.id == ePregunta.id">
<label> {{ '- ' + res.respuesta }}</label> <br />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,4 +1,23 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { UsuarioEncuestaService } from '../../usuario-encuesta/service/usuario-encuesta.service';
import { IUser } from '../../user/user.model';
import { HttpResponse } from '@angular/common/http';
import { IEncuesta } from '../../encuesta/encuesta.model';
import { EstadoEncuesta } from '../../enumerations/estado-encuesta.model';
import { EncuestaService } from '../../encuesta/service/encuesta.service';
import { UsuarioExtra } from '../../usuario-extra/usuario-extra.model';
import { Account } from '../../../core/auth/account.model';
import { AccountService } from '../../../core/auth/account.service';
import { UsuarioExtraService } from '../../usuario-extra/service/usuario-extra.service';
import { faListAlt, faUser, faEye, faStar, faCalendarAlt } from '@fortawesome/free-solid-svg-icons';
import * as Chartist from 'chartist';
import { finalize } from 'rxjs/operators';
import { EPreguntaAbiertaRespuestaService } from '../../e-pregunta-abierta-respuesta/service/e-pregunta-abierta-respuesta.service';
import { IEPreguntaAbiertaRespuesta } from '../../e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.model';
import { IUsuarioEncuesta } from '../../usuario-encuesta/usuario-encuesta.model';
import { exportAsExcelFile } from '../export/export_excel';
import { jsPDF } from 'jspdf';
import { createPDFTableHeaders, generatePDFTable, generatePDFTableData, saveGeneratedPDF } from '../export/export_pdf';
@Component({ @Component({
selector: 'jhi-dashboard-user', selector: 'jhi-dashboard-user',
@ -6,7 +25,569 @@ import { Component, OnInit } from '@angular/core';
styleUrls: ['./dashboard-user.component.scss'], styleUrls: ['./dashboard-user.component.scss'],
}) })
export class DashboardUserComponent implements OnInit { export class DashboardUserComponent implements OnInit {
constructor() {} user: IUser | null = null;
cantEncuestas: number = 0;
cantPersonas: number = 0;
cantActivas: number = 0;
cantFinalizadas: number = 0;
cantDraft: number = 0;
cantPublicas: number = 0;
cantPrivadas: number = 0;
faListAlt = faListAlt;
faUser = faUser;
faEye = faEye;
faStar = faStar;
faCalendarAlt = faCalendarAlt;
reportsGeneral = false;
reportForEncuestas = true;
reportPreguntas = true;
reportColaboraciones = true;
reportColaboracionPreguntas = true;
duracion?: number = 0;
ePreguntas?: any[];
ePreguntasOpciones?: any[];
respuestaAbierta?: IEPreguntaAbiertaRespuesta[];
isLoading = false;
encuestas?: IEncuesta[];
usuarioExtra: UsuarioExtra | null = null;
account: Account | null = null;
encuesta: IEncuesta | null = null;
colaboracion: IEncuesta | null = null;
preguntaId?: number = 0;
usuarioEncuestas?: IUsuarioEncuesta[];
colaboraciones?: IEncuesta[];
duracionColaboracion?: number = 0;
ePreguntasColaboracion?: any[];
ePreguntasOpcionesColaboracion?: any[];
respuestaAbiertaColaboracion?: IEPreguntaAbiertaRespuesta[];
preguntaIdColaboracion?: number = 0;
duracionArray?: number[] | null = null;
ngOnInit(): void {} constructor(
protected encuestaService: EncuestaService,
protected accountService: AccountService,
protected usuarioExtraService: UsuarioExtraService,
protected usuarioEncuestaService: UsuarioEncuestaService,
protected resAbierta: EPreguntaAbiertaRespuestaService
) {}
ngOnInit(): void {
this.loadUser();
}
cambiarVista() {
if (this.reportsGeneral) {
this.reportsGeneral = false;
this.reportForEncuestas = true;
this.reportPreguntas = true;
this.reportColaboraciones = true;
this.reportColaboracionPreguntas = true;
} else if (this.reportForEncuestas) {
this.reportsGeneral = true;
this.reportForEncuestas = false;
this.reportPreguntas = true;
this.reportColaboraciones = true;
this.reportColaboracionPreguntas = true;
} else if (this.reportPreguntas) {
this.reportForEncuestas = false;
this.reportPreguntas = true;
this.reportsGeneral = true;
this.reportColaboraciones = true;
this.reportColaboracionPreguntas = true;
}
}
cambiarVistaColaboracion(cambio: string) {
if (cambio === 'colaboracion') {
this.reportForEncuestas = true;
this.reportPreguntas = true;
this.reportsGeneral = true;
this.reportColaboraciones = false;
this.reportColaboracionPreguntas = true;
} else if (cambio === 'preguntasColaboracion') {
this.reportForEncuestas = true;
this.reportPreguntas = true;
this.reportsGeneral = true;
this.reportColaboraciones = true;
this.reportColaboracionPreguntas = false;
}
}
loadEncuestas() {
this.encuestaService.query().subscribe(
(res: HttpResponse<IEncuesta[]>) => {
this.isLoading = false;
const tmpEncuestas = res.body ?? [];
this.encuestas = tmpEncuestas.filter(e => e.usuarioExtra?.id === this.usuarioExtra?.id && e.estado !== 'DELETED');
this.cantEncuestas = this.encuestas.length;
this.cantActivas = tmpEncuestas.filter(e => e.estado === 'ACTIVE' && e.usuarioExtra?.id === this.usuarioExtra?.id).length;
this.cantDraft = tmpEncuestas.filter(e => e.estado === 'DRAFT' && e.usuarioExtra?.id === this.usuarioExtra?.id).length;
this.cantFinalizadas = tmpEncuestas.filter(e => e.estado === 'FINISHED' && e.usuarioExtra?.id === this.usuarioExtra?.id).length;
this.cantPublicas = tmpEncuestas.filter(
e => e.acceso === 'PUBLIC' && e.usuarioExtra?.id === this.usuarioExtra?.id && e.estado !== 'DELETED'
).length;
this.cantPrivadas = tmpEncuestas.filter(
e => e.acceso === 'PRIVATE' && e.usuarioExtra?.id === this.usuarioExtra?.id && e.estado !== 'DELETED'
).length;
let cantidadCompletadas: number = 0;
tmpEncuestas
.filter(e => e.estado === 'ACTIVE')
.forEach(e => {
const _contadorCompletadas = e.calificacion;
cantidadCompletadas = cantidadCompletadas + (Number(_contadorCompletadas?.toString().split('.')[1]) - 1);
});
this.cantPersonas = cantidadCompletadas;
tmpEncuestas.forEach(encuesta => {
const _calificacion = encuesta.calificacion;
encuesta.calificacion = Number(_calificacion?.toString().split('.')[0]);
/* if (encuesta.fechaFinalizada == null) {
this.duracion = -1;
this.duracionArray?.push(this.duracion);
} else {
this.duracion = encuesta.fechaPublicacion?.diff(encuesta.fechaFinalizada!, 'days');
this.duracionArray?.push(this.duracion!);
}*/
});
/*this.cantPersonas = tmpEncuestas.filter(
e => e.calificacion && e.usuarioExtra?.id === this.usuarioExtra?.id && e.estado !== 'DELETED'
).length;*/
//cantidad de personas que han completado la encuesta
this.loadFirstChart();
this.loadSecondChart();
},
() => {
this.isLoading = false;
}
);
}
loadUser(): void {
this.accountService.getAuthenticationState().subscribe(account => {
if (account !== null) {
this.usuarioExtraService.find(account.id).subscribe(usuarioExtra => {
this.usuarioExtra = usuarioExtra.body;
});
}
});
this.loadEncuestas();
this.loadAllColaboraciones();
}
loadFirstChart(): void {
var dataEstado = {
labels: ['ACTIVOS', 'BORRADOR', 'FINALIZADOS'],
series: [this.cantActivas, this.cantDraft, this.cantFinalizadas],
};
new Chartist.Pie('#chartEstado', dataEstado);
}
loadSecondChart(): void {
var dataAcceso = {
labels: ['PÚBLICA', 'PRIVADA'],
series: [this.cantPublicas, this.cantPrivadas],
};
new Chartist.Pie('#chartAcceso', dataAcceso);
}
detallesPreguntas(encuesta: IEncuesta): void {
if (!this.reportForEncuestas) {
this.reportPreguntas = false;
this.reportForEncuestas = true;
this.reportsGeneral = true;
}
this.encuesta = encuesta;
debugger;
this.isLoading = true;
this.encuestaService
.findQuestions(encuesta?.id!)
.pipe(
finalize(() =>
this.encuestaService.findQuestionsOptions(encuesta?.id!).subscribe(
(res: any) => {
this.isLoading = false;
this.ePreguntasOpciones = res.body ?? [];
debugger;
this.getOpenQuestionAnswers();
},
() => {
this.isLoading = false;
}
)
)
)
.subscribe(
(res: any) => {
this.isLoading = false;
this.ePreguntas = res.body ?? [];
},
() => {
this.isLoading = false;
}
);
if (this.ePreguntas!.length == 0) {
this.previousState();
}
}
previousState(): void {
window.history.back();
}
getOpenQuestionAnswers() {
this.ePreguntas!.forEach(pregunta => {
debugger;
if (!pregunta.tipo) {
this.resAbierta.query().subscribe(res => {
debugger;
this.preguntaId = pregunta.id;
this.respuestaAbierta = res.body ?? [];
/* const respuesta = res.body ?? [];
respuesta.forEach( e => {
debugger
if (e.epreguntaAbierta?.id == pregunta.id){
this.respuestaAbierta?.push(e);
}
/!*debugger
this.eRespuestaAbierta?.push(respuesta.filter(e.ePreguntaAbierta?.id == pregunta.id));*!/
})
*/
console.log(this.respuestaAbierta);
});
}
});
}
loadAllColaboraciones(): void {
this.usuarioEncuestaService.query().subscribe((res: HttpResponse<IUsuarioEncuesta[]>) => {
const tempUsuarioEncuestas = res.body ?? [];
this.usuarioEncuestas = tempUsuarioEncuestas
.filter(c => c.usuarioExtra?.id === this.usuarioExtra?.id)
.filter(c => c.encuesta?.estado !== 'DELETED');
// Fix calificacion
tempUsuarioEncuestas.forEach(colaboracion => {
if (colaboracion.encuesta) {
const _calificacion = colaboracion.encuesta.calificacion;
colaboracion.encuesta.calificacion = Number(_calificacion?.toString().split('.')[0]);
if (colaboracion.encuesta.fechaFinalizada == null) {
this.duracionColaboracion = -1;
} else {
this.duracionColaboracion = colaboracion.encuesta.fechaPublicacion?.diff(colaboracion.encuesta.fechaFinalizada!, 'days');
}
}
});
});
}
detallesPreguntasColaboracion(encuesta: IEncuesta): void {
if (!this.reportColaboraciones) {
this.reportPreguntas = true;
this.reportForEncuestas = true;
this.reportsGeneral = true;
this.reportColaboraciones = true;
this.reportColaboracionPreguntas = false;
}
this.colaboracion = encuesta;
debugger;
this.isLoading = true;
this.encuestaService
.findQuestions(encuesta?.id!)
.pipe(
finalize(() =>
this.encuestaService.findQuestionsOptions(encuesta?.id!).subscribe(
(res: any) => {
this.isLoading = false;
this.ePreguntasOpcionesColaboracion = res.body ?? [];
//debugger;
this.getOpenQuestionAnswersColaboracion();
},
() => {
this.isLoading = false;
}
)
)
)
.subscribe(
(res: any) => {
this.isLoading = false;
this.ePreguntasColaboracion = res.body ?? [];
},
() => {
this.isLoading = false;
}
);
}
getOpenQuestionAnswersColaboracion() {
this.ePreguntasColaboracion!.forEach(pregunta => {
debugger;
if (!pregunta.tipo) {
this.resAbierta.query().subscribe(res => {
debugger;
this.preguntaIdColaboracion = pregunta.id;
this.respuestaAbiertaColaboracion = res.body ?? [];
/* const respuesta = res.body ?? [];
respuesta.forEach( e => {
debugger
if (e.epreguntaAbierta?.id == pregunta.id){
this.respuestaAbierta?.push(e);
}
/!*debugger
this.eRespuestaAbierta?.push(respuesta.filter(e.ePreguntaAbierta?.id == pregunta.id));*!/
})
*/
console.log(this.respuestaAbiertaColaboracion);
});
}
});
}
exportReportesGeneralesUserExcel(): void {
/*REPORTES GENERALES:
*Cantidad de encuestas creadas
* cantidad de personas que han completado las encuestas
*Cantidad de encuestas por estado
* Cantidad de encuestas por acceso
* */
if (!this.reportsGeneral) {
const _sheets = [
'Cantidad encuestas creadas',
'Cantidad usuarios encuestas',
'Cantidad encuestas por estado',
'Cantidad encuestas por acceso',
];
const _reporteEncuestasCreadas = [{ total_encuestas: this.cantEncuestas }];
const _reporteUsuariosCompletadas = [{ total_usuarios: this.cantPersonas }];
const _reporteEncuestasEstado = [
{ total_borrador: this.cantPersonas, total_activas: this.cantActivas, total_finalizadas: this.cantFinalizadas },
];
const _reporteEncuestasAcceso = [{ total_publicas: this.cantPublicas, total_privadas: this.cantPrivadas }];
const _excelFinalData = [_reporteEncuestasCreadas, _reporteUsuariosCompletadas, _reporteEncuestasEstado, _reporteEncuestasAcceso];
const _fileName = 'reportes_generales_encuestas_DataSurvey';
exportAsExcelFile(_sheets, _excelFinalData, _fileName);
} else if (!this.reportPreguntas) {
/*REPORTES POR ENCUESTA:
* Nombre encuesta
* categoria encuesta
* calificacion encuesta
*
* preguntas:
* contenido/ cantidad*/
const _sheets = ['Datos de encuesta', 'Contenido de preguntas cerradas', 'Contenido de preguntas abiertas'];
const _reporteDatosEncuesta = [
{
nombre_encuesta: this.encuesta?.nombre,
categoria_encuesta: this.encuesta?.categoria?.nombre,
calificacion_encuesta: this.encuesta?.calificacion,
},
];
const _reporteContenidoPreguntasCerradas: any[] = [];
const _reporteContenidoPreguntasAbiertas: any[] = [];
this.ePreguntas!.forEach((pregunta: any, index) => {
debugger;
let _report: any = {};
let _reportAbierta: any = {};
if (!pregunta.tipo) {
this.respuestaAbierta!.forEach((respuesta: any) => {
if (respuesta.epreguntaAbierta?.id == pregunta.id) {
// _reportAbierta['pregunta_abierta'] = pregunta.nombre;
_reportAbierta['contenido'] = respuesta.respuesta;
_reporteContenidoPreguntasAbiertas.push(_reportAbierta);
}
});
} else {
debugger;
this.ePreguntasOpciones!.forEach((respuesta: any, index) => {
console.log(respuesta.epreguntaCerrada);
if (respuesta[index].epreguntaCerrada.id == pregunta.id) {
_report['opcion_pregunta'] = respuesta[index].nombre;
_report['cantidad'] = respuesta[index].cantidad;
_reporteContenidoPreguntasCerradas.push(_report);
}
});
}
});
const _excelFinalData = [_reporteDatosEncuesta, _reporteContenidoPreguntasCerradas, _reporteContenidoPreguntasAbiertas];
const _fileName = 'reportes_detalle_encuesta_datasurvey';
exportAsExcelFile(_sheets, _excelFinalData, _fileName);
}
}
exportReportesGeneralesUserPDF(): void {
/*REPORTES GENERALES:
*Cantidad de encuestas creadas
* cantidad de personas que han completado las encuestas
*Cantidad de encuestas por estado
* Cantidad de encuestas por acceso
* */
if (!this.reportsGeneral) {
const doc = new jsPDF();
const _fileName = 'reportes_generales_encuestas_datasurvey';
let _docData, _headers, _docHeaders, _docTitle;
debugger;
const _reporteEncuestasCreadas = [{ total_encuestas_creadas: this.cantEncuestas!.toString() }];
debugger;
_docData = generatePDFTableData(_reporteEncuestasCreadas);
_headers = ['total_encuestas_creadas'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte General Cantidad Encuestas Creadas';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('p');
const _reporteUsuariosCompletadas = [{ total_usuarios_completados: this.cantPersonas.toString() }];
_docData = generatePDFTableData(_reporteUsuariosCompletadas);
_headers = ['total_usuarios_completados'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte General Cantidad Usuarios';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('p');
const _reporteEncuestasEstado = [
{
total_borrador: this.cantPersonas.toString(),
total_activas: this.cantActivas.toString(),
total_finalizadas: this.cantFinalizadas.toString(),
},
];
_docData = generatePDFTableData(_reporteEncuestasEstado);
_headers = ['total_borrador', 'total_activas', 'total_finalizadas'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte General Cantidad Encuestas Por Estado';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('p');
const _reporteEncuestasAcceso = [{ total_publicas: this.cantPublicas.toString(), total_privadas: this.cantPrivadas.toString() }];
_docData = generatePDFTableData(_reporteEncuestasAcceso);
_headers = ['total_publicas', 'total_privadas'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte General Cantidad Encuestas Por Acceso';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('p');
saveGeneratedPDF(doc, _fileName);
} else {
/*REPORTES POR ENCUESTA:
* Nombre encuesta
* categoria encuesta
* calificacion encuesta
*
* preguntas:
* contenido/ cantidad*/
const doc = new jsPDF();
const _fileName = 'reportes_detalles_encuestas_datasurvey';
let _docData, _headers, _docHeaders, _docTitle;
const _reporteDatosEncuesta = [
{
nombre_encuesta: this.encuesta?.nombre,
categoria_encuesta: this.encuesta?.categoria?.nombre,
calificacion_encuesta: this.encuesta?.calificacion!.toString(),
},
];
_docData = generatePDFTableData(_reporteDatosEncuesta);
_headers = ['nombre_encuesta', 'categoria_encuesta', 'calificacion_encuesta'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte Detalle Encuesta';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('l');
const _reporteContenidoPreguntasCerradas: any[] = [];
const _reporteContenidoPreguntasAbiertas: any[] = [];
this.ePreguntas!.forEach((pregunta: any, index) => {
debugger;
let _report: any = {};
let _reportAbierta: any = {};
if (!pregunta.tipo) {
this.respuestaAbierta!.forEach((respuesta: any) => {
if (respuesta.epreguntaAbierta?.id == pregunta.id) {
_reportAbierta['pregunta_abierta'] = 'Contenido';
_reportAbierta['contenido'] = respuesta.respuesta;
_reporteContenidoPreguntasAbiertas.push(_reportAbierta);
}
});
} else {
debugger;
this.ePreguntasOpciones!.forEach((respuesta: any, index) => {
console.log(respuesta.epreguntaCerrada);
if (respuesta[index].epreguntaCerrada.id == pregunta.id) {
_report['opcion_pregunta'] = respuesta[index].nombre;
_report['cantidad'] = respuesta[index].cantidad.toString();
_reporteContenidoPreguntasCerradas.push(_report);
}
});
}
});
_docData = generatePDFTableData(_reporteContenidoPreguntasCerradas);
_headers = ['opcion_pregunta', 'cantidad'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte de Cantidad Seleccion Opciones Cerradas';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('l');
_docData = generatePDFTableData(_reporteContenidoPreguntasAbiertas);
_headers = ['pregunta_abierta', 'contenido'];
_docHeaders = createPDFTableHeaders(_headers);
_docTitle = 'Reporte Respuesta Pregunta Abierta';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('l');
saveGeneratedPDF(doc, _fileName);
}
}
} }

View File

@ -20,19 +20,23 @@ export const createPDFTableHeaders = (keys: any): any[] => {
id: keys[i], id: keys[i],
name: keys[i], name: keys[i],
prompt: keys[i], prompt: keys[i],
width: 65, align: 'left',
align: 'center',
padding: 0, padding: 0,
}); });
} }
return result; return result;
}; };
export const generatePDFTable = (doc: jsPDF, _docData: any, _docHeaders: string[], _fileName: string, _docTitle: string): void => { export const generatePDFTable = (doc: jsPDF, _docData: any, _docHeaders: string[], _docTitle: string): void => {
doc.setFontSize(20); doc.setFontSize(20);
doc.setFont('helvetica', 'bold'); doc.setFont('helvetica', 'bold');
doc.text(_docTitle, 20, 20); doc.text(_docTitle, 20, 20);
doc.table(20, 30, _docData, _docHeaders, { autoSize: true }); doc.setFont('helvetica');
doc.table(20, 30, _docData, _docHeaders, { fontSize: 10, autoSize: true });
};
export const saveGeneratedPDF = (doc: jsPDF, _fileName: string) => {
const generatedFileName = generateFileName(_fileName, PDF_EXTENSION); const generatedFileName = generateFileName(_fileName, PDF_EXTENSION);
doc.save(generatedFileName); doc.save(generatedFileName);
}; };

View File

@ -22,9 +22,9 @@
</dd> </dd>
<dt><span jhiTranslate="dataSurveyApp.ePreguntaAbiertaRespuesta.ePreguntaAbierta">E Pregunta Abierta</span></dt> <dt><span jhiTranslate="dataSurveyApp.ePreguntaAbiertaRespuesta.ePreguntaAbierta">E Pregunta Abierta</span></dt>
<dd> <dd>
<div *ngIf="ePreguntaAbiertaRespuesta.ePreguntaAbierta"> <div *ngIf="ePreguntaAbiertaRespuesta.epreguntaAbierta">
<a [routerLink]="['/e-pregunta-abierta', ePreguntaAbiertaRespuesta.ePreguntaAbierta?.id, 'view']">{{ <a [routerLink]="['/e-pregunta-abierta', ePreguntaAbiertaRespuesta.epreguntaAbierta?.id, 'view']">{{
ePreguntaAbiertaRespuesta.ePreguntaAbierta?.id ePreguntaAbiertaRespuesta.epreguntaAbierta?.id
}}</a> }}</a>
</div> </div>
</dd> </dd>

View File

@ -3,11 +3,11 @@ import { IEPreguntaAbierta } from 'app/entities/e-pregunta-abierta/e-pregunta-ab
export interface IEPreguntaAbiertaRespuesta { export interface IEPreguntaAbiertaRespuesta {
id?: number; id?: number;
respuesta?: string; respuesta?: string;
ePreguntaAbierta?: IEPreguntaAbierta | null; epreguntaAbierta?: IEPreguntaAbierta | null;
} }
export class EPreguntaAbiertaRespuesta implements IEPreguntaAbiertaRespuesta { export class EPreguntaAbiertaRespuesta implements IEPreguntaAbiertaRespuesta {
constructor(public id?: number, public respuesta?: string, public ePreguntaAbierta?: IEPreguntaAbierta | null) {} constructor(public respuesta?: string, public epreguntaAbierta?: IEPreguntaAbierta | null) {}
} }
export function getEPreguntaAbiertaRespuestaIdentifier(ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta): number | undefined { export function getEPreguntaAbiertaRespuestaIdentifier(ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta): number | undefined {

View File

@ -45,9 +45,9 @@
</td> </td>
<td>{{ ePreguntaAbiertaRespuesta.respuesta }}</td> <td>{{ ePreguntaAbiertaRespuesta.respuesta }}</td>
<td> <td>
<div *ngIf="ePreguntaAbiertaRespuesta.ePreguntaAbierta"> <div *ngIf="ePreguntaAbiertaRespuesta.epreguntaAbierta">
<a [routerLink]="['/e-pregunta-abierta', ePreguntaAbiertaRespuesta.ePreguntaAbierta?.id, 'view']">{{ <a [routerLink]="['/e-pregunta-abierta', ePreguntaAbiertaRespuesta.epreguntaAbierta?.id, 'view']">{{
ePreguntaAbiertaRespuesta.ePreguntaAbierta?.id ePreguntaAbiertaRespuesta.epreguntaAbierta?.id
}}</a> }}</a>
</div> </div>
</td> </td>

View File

@ -17,6 +17,7 @@ export class EPreguntaAbiertaRespuestaService {
constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {}
create(ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta): Observable<EntityResponseType> { create(ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta): Observable<EntityResponseType> {
debugger;
return this.http.post<IEPreguntaAbiertaRespuesta>(this.resourceUrl, ePreguntaAbiertaRespuesta, { observe: 'response' }); return this.http.post<IEPreguntaAbiertaRespuesta>(this.resourceUrl, ePreguntaAbiertaRespuesta, { observe: 'response' });
} }

View File

@ -43,7 +43,7 @@ describe('Component Tests', () => {
it('Should call EPreguntaAbierta query and add missing value', () => { it('Should call EPreguntaAbierta query and add missing value', () => {
const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 456 }; const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 456 };
const ePreguntaAbierta: IEPreguntaAbierta = { id: 35011 }; const ePreguntaAbierta: IEPreguntaAbierta = { id: 35011 };
ePreguntaAbiertaRespuesta.ePreguntaAbierta = ePreguntaAbierta; ePreguntaAbiertaRespuesta.epreguntaAbierta = ePreguntaAbierta;
const ePreguntaAbiertaCollection: IEPreguntaAbierta[] = [{ id: 58318 }]; const ePreguntaAbiertaCollection: IEPreguntaAbierta[] = [{ id: 58318 }];
jest.spyOn(ePreguntaAbiertaService, 'query').mockReturnValue(of(new HttpResponse({ body: ePreguntaAbiertaCollection }))); jest.spyOn(ePreguntaAbiertaService, 'query').mockReturnValue(of(new HttpResponse({ body: ePreguntaAbiertaCollection })));
@ -65,7 +65,7 @@ describe('Component Tests', () => {
it('Should update editForm', () => { it('Should update editForm', () => {
const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 456 }; const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 456 };
const ePreguntaAbierta: IEPreguntaAbierta = { id: 40814 }; const ePreguntaAbierta: IEPreguntaAbierta = { id: 40814 };
ePreguntaAbiertaRespuesta.ePreguntaAbierta = ePreguntaAbierta; ePreguntaAbiertaRespuesta.epreguntaAbierta = ePreguntaAbierta;
activatedRoute.data = of({ ePreguntaAbiertaRespuesta }); activatedRoute.data = of({ ePreguntaAbiertaRespuesta });
comp.ngOnInit(); comp.ngOnInit();

View File

@ -81,12 +81,12 @@ export class EPreguntaAbiertaRespuestaUpdateComponent implements OnInit {
this.editForm.patchValue({ this.editForm.patchValue({
id: ePreguntaAbiertaRespuesta.id, id: ePreguntaAbiertaRespuesta.id,
respuesta: ePreguntaAbiertaRespuesta.respuesta, respuesta: ePreguntaAbiertaRespuesta.respuesta,
ePreguntaAbierta: ePreguntaAbiertaRespuesta.ePreguntaAbierta, ePreguntaAbierta: ePreguntaAbiertaRespuesta.epreguntaAbierta,
}); });
this.ePreguntaAbiertasSharedCollection = this.ePreguntaAbiertaService.addEPreguntaAbiertaToCollectionIfMissing( this.ePreguntaAbiertasSharedCollection = this.ePreguntaAbiertaService.addEPreguntaAbiertaToCollectionIfMissing(
this.ePreguntaAbiertasSharedCollection, this.ePreguntaAbiertasSharedCollection,
ePreguntaAbiertaRespuesta.ePreguntaAbierta ePreguntaAbiertaRespuesta.epreguntaAbierta
); );
} }
@ -110,7 +110,7 @@ export class EPreguntaAbiertaRespuestaUpdateComponent implements OnInit {
...new EPreguntaAbiertaRespuesta(), ...new EPreguntaAbiertaRespuesta(),
id: this.editForm.get(['id'])!.value, id: this.editForm.get(['id'])!.value,
respuesta: this.editForm.get(['respuesta'])!.value, respuesta: this.editForm.get(['respuesta'])!.value,
ePreguntaAbierta: this.editForm.get(['ePreguntaAbierta'])!.value, epreguntaAbierta: this.editForm.get(['ePreguntaAbierta'])!.value,
}; };
} }
} }

View File

@ -30,9 +30,9 @@
</dd> </dd>
<dt><span jhiTranslate="dataSurveyApp.ePreguntaCerradaOpcion.ePreguntaCerrada">E Pregunta Cerrada</span></dt> <dt><span jhiTranslate="dataSurveyApp.ePreguntaCerradaOpcion.ePreguntaCerrada">E Pregunta Cerrada</span></dt>
<dd> <dd>
<div *ngIf="ePreguntaCerradaOpcion.ePreguntaCerrada"> <div *ngIf="ePreguntaCerradaOpcion.epreguntaCerrada">
<a [routerLink]="['/e-pregunta-cerrada', ePreguntaCerradaOpcion.ePreguntaCerrada?.id, 'view']">{{ <a [routerLink]="['/e-pregunta-cerrada', ePreguntaCerradaOpcion.epreguntaCerrada?.id, 'view']">{{
ePreguntaCerradaOpcion.ePreguntaCerrada?.id ePreguntaCerradaOpcion.epreguntaCerrada?.id
}}</a> }}</a>
</div> </div>
</dd> </dd>

View File

@ -5,7 +5,7 @@ export interface IEPreguntaCerradaOpcion {
nombre?: string; nombre?: string;
orden?: number; orden?: number;
cantidad?: number; cantidad?: number;
ePreguntaCerrada?: IEPreguntaCerrada | null; epreguntaCerrada?: IEPreguntaCerrada | null;
} }
export class EPreguntaCerradaOpcion implements IEPreguntaCerradaOpcion { export class EPreguntaCerradaOpcion implements IEPreguntaCerradaOpcion {
@ -14,7 +14,7 @@ export class EPreguntaCerradaOpcion implements IEPreguntaCerradaOpcion {
public nombre?: string, public nombre?: string,
public orden?: number, public orden?: number,
public cantidad?: number, public cantidad?: number,
public ePreguntaCerrada?: IEPreguntaCerrada | null public epreguntaCerrada?: IEPreguntaCerrada | null
) {} ) {}
} }

View File

@ -49,9 +49,9 @@
<td>{{ ePreguntaCerradaOpcion.orden }}</td> <td>{{ ePreguntaCerradaOpcion.orden }}</td>
<td>{{ ePreguntaCerradaOpcion.cantidad }}</td> <td>{{ ePreguntaCerradaOpcion.cantidad }}</td>
<td> <td>
<div *ngIf="ePreguntaCerradaOpcion.ePreguntaCerrada"> <div *ngIf="ePreguntaCerradaOpcion.epreguntaCerrada">
<a [routerLink]="['/e-pregunta-cerrada', ePreguntaCerradaOpcion.ePreguntaCerrada?.id, 'view']">{{ <a [routerLink]="['/e-pregunta-cerrada', ePreguntaCerradaOpcion.epreguntaCerrada?.id, 'view']">{{
ePreguntaCerradaOpcion.ePreguntaCerrada?.id ePreguntaCerradaOpcion.epreguntaCerrada?.id
}}</a> }}</a>
</div> </div>
</td> </td>

View File

@ -16,8 +16,9 @@ export class EPreguntaCerradaOpcionService {
constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {}
updateCount(id: any) { updateCount(id: number) {
return this.http.post(`${this.resourceUrl}/count/${id}`, id, { observe: 'response' }); debugger;
return this.http.put(`${this.resourceUrl}/count/${id}`, id, { observe: 'response' });
} }
create(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion, preguntaId?: number): Observable<EntityResponseType> { create(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion, preguntaId?: number): Observable<EntityResponseType> {

View File

@ -43,7 +43,7 @@ describe('Component Tests', () => {
it('Should call EPreguntaCerrada query and add missing value', () => { it('Should call EPreguntaCerrada query and add missing value', () => {
const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 456 }; const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 456 };
const ePreguntaCerrada: IEPreguntaCerrada = { id: 2192 }; const ePreguntaCerrada: IEPreguntaCerrada = { id: 2192 };
ePreguntaCerradaOpcion.ePreguntaCerrada = ePreguntaCerrada; ePreguntaCerradaOpcion.epreguntaCerrada = ePreguntaCerrada;
const ePreguntaCerradaCollection: IEPreguntaCerrada[] = [{ id: 89287 }]; const ePreguntaCerradaCollection: IEPreguntaCerrada[] = [{ id: 89287 }];
jest.spyOn(ePreguntaCerradaService, 'query').mockReturnValue(of(new HttpResponse({ body: ePreguntaCerradaCollection }))); jest.spyOn(ePreguntaCerradaService, 'query').mockReturnValue(of(new HttpResponse({ body: ePreguntaCerradaCollection })));
@ -65,7 +65,7 @@ describe('Component Tests', () => {
it('Should update editForm', () => { it('Should update editForm', () => {
const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 456 }; const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 456 };
const ePreguntaCerrada: IEPreguntaCerrada = { id: 64500 }; const ePreguntaCerrada: IEPreguntaCerrada = { id: 64500 };
ePreguntaCerradaOpcion.ePreguntaCerrada = ePreguntaCerrada; ePreguntaCerradaOpcion.epreguntaCerrada = ePreguntaCerrada;
activatedRoute.data = of({ ePreguntaCerradaOpcion }); activatedRoute.data = of({ ePreguntaCerradaOpcion });
comp.ngOnInit(); comp.ngOnInit();

View File

@ -85,12 +85,12 @@ export class EPreguntaCerradaOpcionUpdateComponent implements OnInit {
nombre: ePreguntaCerradaOpcion.nombre, nombre: ePreguntaCerradaOpcion.nombre,
orden: ePreguntaCerradaOpcion.orden, orden: ePreguntaCerradaOpcion.orden,
cantidad: ePreguntaCerradaOpcion.cantidad, cantidad: ePreguntaCerradaOpcion.cantidad,
ePreguntaCerrada: ePreguntaCerradaOpcion.ePreguntaCerrada, ePreguntaCerrada: ePreguntaCerradaOpcion.epreguntaCerrada,
}); });
this.ePreguntaCerradasSharedCollection = this.ePreguntaCerradaService.addEPreguntaCerradaToCollectionIfMissing( this.ePreguntaCerradasSharedCollection = this.ePreguntaCerradaService.addEPreguntaCerradaToCollectionIfMissing(
this.ePreguntaCerradasSharedCollection, this.ePreguntaCerradasSharedCollection,
ePreguntaCerradaOpcion.ePreguntaCerrada ePreguntaCerradaOpcion.epreguntaCerrada
); );
} }
@ -116,7 +116,7 @@ export class EPreguntaCerradaOpcionUpdateComponent implements OnInit {
nombre: this.editForm.get(['nombre'])!.value, nombre: this.editForm.get(['nombre'])!.value,
orden: this.editForm.get(['orden'])!.value, orden: this.editForm.get(['orden'])!.value,
cantidad: this.editForm.get(['cantidad'])!.value, cantidad: this.editForm.get(['cantidad'])!.value,
ePreguntaCerrada: this.editForm.get(['ePreguntaCerrada'])!.value, epreguntaCerrada: this.editForm.get(['ePreguntaCerrada'])!.value,
}; };
} }
} }

View File

@ -2,11 +2,11 @@
<div> <div>
<h2 id="page-heading" data-cy="EPreguntaCerradaHeading"> <h2 id="page-heading" data-cy="EPreguntaCerradaHeading">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<p class="ds-title">Vista previa de {{ encuesta!.nombre }}</p> <p class="ds-title">Encuesta: {{ encuesta!.nombre }}</p>
&nbsp;&nbsp;<fa-icon class="ds-info--icon" [icon]="faQuestion" data-toggle="modal" data-target="#verParametros"></fa-icon> <!-- &nbsp;&nbsp;<fa-icon class="ds-info&#45;&#45;icon" [icon]="faQuestion" data-toggle="modal" data-target="#verParametros"></fa-icon>-->
</div> </div>
<p class="ds-subtitle">Creada el día {{ encuesta!.fechaCreacion | formatShortDatetime | lowercase }}</p> <p class="ds-subtitle">Fecha de inicio: {{ encuesta!.fechaPublicacion | formatShortDatetime | lowercase }}</p>
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<button type="button" class="ds-btn ds-btn--secondary" (click)="previousState()"> <button type="button" class="ds-btn ds-btn--secondary" (click)="previousState()">
<fa-icon icon="arrow-left"></fa-icon>&nbsp;&nbsp;<span jhiTranslate="entity.action.back">Back</span> <fa-icon icon="arrow-left"></fa-icon>&nbsp;&nbsp;<span jhiTranslate="entity.action.back">Back</span>
@ -22,7 +22,7 @@
<div class="ds-survey preview-survey" id="entities" *ngIf="ePreguntas && ePreguntas.length > 0"> <div class="ds-survey preview-survey" id="entities" *ngIf="ePreguntas && ePreguntas.length > 0">
<div class="ds-survey--all-question-wrapper col-8"> <div class="ds-survey--all-question-wrapper col-8">
<div class="ds-survey--question-wrapper card-encuesta lift" *ngFor="let ePregunta of ePreguntas; let i = index; trackBy: trackId"> <div class="ds-survey--question-wrapper card-encuesta" *ngFor="let ePregunta of ePreguntas; let i = index; trackBy: trackId">
<div <div
[attr.data-index]="ePregunta.id" [attr.data-index]="ePregunta.id"
[attr.data-tipo]="ePregunta.tipo" [attr.data-tipo]="ePregunta.tipo"
@ -79,7 +79,25 @@
</ng-container> </ng-container>
</ng-container> </ng-container>
<div class="ds-survey--option ds-survey--option--base ds-survey--open-option" *ngIf="!ePregunta.tipo"> <div class="ds-survey--option ds-survey--option--base ds-survey--open-option" *ngIf="!ePregunta.tipo">
<textarea id="{{ ePregunta.id }}" cols="33" rows="10"></textarea> <textarea class="ds-survey--textarea" id="{{ ePregunta.id }}" cols="33" rows="10"></textarea>
</div>
</div>
</div>
<div class="ds-survey--question-wrapper card-encuesta">
<div class="ds-survey--question">
<div class="ds-survey--rating">
<div class="ds-survey--titulo">
<span class="ds-survey--titulo--name">Calificación</span>
</div>
<div class="ds-survey--option ds-survey--option--base">
<fa-icon
*ngFor="let starNumber of this.stars"
id="{{ 'star-' + starNumber }}"
class="entity-icon--star--off"
[icon]="faStar"
(click)="updateRating(starNumber)"
></fa-icon>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -139,21 +157,21 @@
<div class="mb-5"> <div class="mb-5">
<p class="ds-subtitle">Fecha de finalización</p> <p class="ds-subtitle">Fecha de finalización</p>
<P> <p>
{{ {{
encuesta.fechaFinalizada === undefined encuesta.fechaFinalizada === undefined
? 'Sin finalizar' ? 'Sin finalizar'
: (encuesta.fechaFinalizada | formatShortDatetime | lowercase) : (encuesta.fechaFinalizada | formatShortDatetime | lowercase)
}} }}
</P> </p>
</div> </div>
<div class="mb-5"> <div class="mb-5">
<p class="ds-subtitle">Calificación</p> <p class="ds-subtitle">Calificación</p>
<div> <div>
<fa-icon *ngFor="let i of [].constructor(encuesta.calificacion)" class="entity-icon--star" [icon]="faStar"></fa-icon <fa-icon *ngFor="let i of [].constructor(this.avgCalificacion)" class="entity-icon--star" [icon]="faStar"></fa-icon
><fa-icon ><fa-icon
*ngFor="let i of [].constructor(5 - encuesta.calificacion!)" *ngFor="let i of [].constructor(5 - this.avgCalificacion)"
class="entity-icon--star--off" class="entity-icon--star--off"
[icon]="faStar" [icon]="faStar"
></fa-icon> ></fa-icon>

View File

@ -20,6 +20,7 @@ import { PreguntaCerradaTipo } from 'app/entities/enumerations/pregunta-cerrada-
import { EPreguntaAbiertaRespuesta } from 'app/entities/e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.model'; import { EPreguntaAbiertaRespuesta } from 'app/entities/e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.model';
import { Observable } from 'rxjs/internal/Observable'; import { Observable } from 'rxjs/internal/Observable';
import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; import { HttpErrorResponse, HttpResponse } from '@angular/common/http';
import { EstadoEncuesta } from 'app/entities/enumerations/estado-encuesta.model';
@Component({ @Component({
selector: 'jhi-complete', selector: 'jhi-complete',
@ -39,6 +40,11 @@ export class EncuestaCompleteComponent implements OnInit {
selectedSingleOptions: any; selectedSingleOptions: any;
selectedMultiOptions: any; selectedMultiOptions: any;
error: boolean; error: boolean;
calificacion: number;
stars: number[] = [1, 2, 3, 4, 5];
cantidadCalificaciones: number = 0;
avgCalificacion: number = 0;
sumCalificacion: number = 0;
constructor( constructor(
protected activatedRoute: ActivatedRoute, protected activatedRoute: ActivatedRoute,
@ -55,19 +61,21 @@ export class EncuestaCompleteComponent implements OnInit {
this.selectedSingleOptions = {}; this.selectedSingleOptions = {};
this.selectedMultiOptions = []; this.selectedMultiOptions = [];
this.error = false; this.error = false;
this.calificacion = 0;
} }
ngOnInit(): void { ngOnInit(): void {
this.activatedRoute.data.subscribe(({ encuesta }) => { this.activatedRoute.data.subscribe(({ encuesta }) => {
if (encuesta) { if (encuesta) {
this.encuesta = encuesta; this.encuesta = encuesta;
if (this.encuesta!.estado !== EstadoEncuesta.ACTIVE) {
this.previousState();
}
this.avgCalificacion = parseInt(this.encuesta!.calificacion!.toString().split('.')[0]);
this.cantidadCalificaciones = parseInt(this.encuesta!.calificacion!.toString().split('.')[1]);
this.sumCalificacion = this.avgCalificacion * this.cantidadCalificaciones;
} }
this.isLocked = this.verifyPassword(); this.verifyPassword();
if (this.isLocked) {
this.previousState();
} else {
this.loadAll();
}
}); });
for (let pregunta of this.ePreguntas!) { for (let pregunta of this.ePreguntas!) {
if (pregunta.tipo && pregunta.tipo === PreguntaCerradaTipo.SINGLE) { if (pregunta.tipo && pregunta.tipo === PreguntaCerradaTipo.SINGLE) {
@ -76,17 +84,22 @@ export class EncuestaCompleteComponent implements OnInit {
} }
} }
verifyPassword(): boolean { verifyPassword(): void {
if (this.encuesta!.acceso === AccesoEncuesta.PUBLIC) { if (this.encuesta!.acceso === AccesoEncuesta.PUBLIC) {
return false; this.loadAll();
this.isLocked = false;
} else { } else {
const modalRef = this.modalService.open(EncuestaPasswordDialogComponent, { size: 'lg', backdrop: 'static' }); const modalRef = this.modalService.open(EncuestaPasswordDialogComponent, { size: 'lg', backdrop: 'static' });
modalRef.componentInstance.encuesta = this.encuesta; modalRef.componentInstance.encuesta = this.encuesta;
modalRef.closed.subscribe(reason => { modalRef.closed.subscribe(reason => {
return reason === 'success'; this.isLocked = reason != 'success';
if (this.isLocked) {
this.previousState();
} else {
this.loadAll();
}
}); });
} }
return true;
} }
ngAfterViewChecked(): void { ngAfterViewChecked(): void {
@ -177,27 +190,57 @@ export class EncuestaCompleteComponent implements OnInit {
} }
finish(): void { finish(): void {
this.updateClosedOptionsCount();
this.getOpenQuestionAnswers(); this.getOpenQuestionAnswers();
this.registerOpenQuestionAnswers(); this.registerOpenQuestionAnswers();
this.updateClosedOptionsCount(); this.updateEncuestaRating();
this.previousState();
}
updateEncuestaRating() {
if (this.calificacion !== 0) {
const newSumCalificacion = this.sumCalificacion + this.calificacion;
const newCantidadCalificacion = this.cantidadCalificaciones + 1;
const newAvgCalificacion = Math.round(newSumCalificacion / newCantidadCalificacion);
const newRating = Number(this.joinRatingValues(newAvgCalificacion, newCantidadCalificacion));
this.encuesta!.calificacion = newRating;
this.encuestaService.updateSurvey(this.encuesta!).subscribe(() => {
console.log('success');
});
}
} }
updateClosedOptionsCount() { updateClosedOptionsCount() {
debugger;
for (let key in this.selectedSingleOptions) { for (let key in this.selectedSingleOptions) {
this.subscribeToSaveResponse(this.ePreguntaCerradaOpcionService.updateCount(this.selectedSingleOptions[key])); this.ePreguntaCerradaOpcionService.updateCount(this.selectedSingleOptions[key]).subscribe(() => {
console.log('success');
});
} }
this.selectedMultiOptions.forEach((option: any) => { this.selectedMultiOptions.forEach((option: any) => {
this.subscribeToSaveResponse(this.ePreguntaCerradaOpcionService.updateCount(option)); this.ePreguntaCerradaOpcionService.updateCount(option).subscribe(() => {
console.log('success');
});
}); });
} }
registerOpenQuestionAnswers() { registerOpenQuestionAnswers() {
debugger;
for (let id in this.selectedOpenOptions) { for (let id in this.selectedOpenOptions) {
let pregunta = this.ePreguntas!.find(p => { let pregunta = this.ePreguntas!.find(p => {
return p.id == id; return p.id == id;
}); });
let newRespuesta = new EPreguntaAbiertaRespuesta(0, this.selectedOpenOptions[id], pregunta); debugger;
/*
let newRespuesta = new EPreguntaAbiertaRespuesta(this.selectedOpenOptions[id], pregunta);
this.subscribeToSaveResponse(this.ePreguntaAbiertaRespuestaService.create(newRespuesta)); this.subscribeToSaveResponse(this.ePreguntaAbiertaRespuestaService.create(newRespuesta));
*/
let newRespuesta = new EPreguntaAbiertaRespuesta(this.selectedOpenOptions[id], pregunta);
this.ePreguntaAbiertaRespuestaService.create(newRespuesta).subscribe(() => {
console.log('success');
});
} }
} }
@ -226,4 +269,23 @@ export class EncuestaCompleteComponent implements OnInit {
} }
}); });
} }
joinRatingValues(totalValue: number, ratingCount: number): Number {
const result = totalValue.toString() + '.' + ratingCount.toString();
return parseFloat(result);
}
updateRating(value: number) {
this.calificacion = value;
this.stars.forEach(starNumber => {
let starElement = document.getElementById(`star-${starNumber}`);
if (starNumber > this.calificacion!) {
starElement!.classList.add('entity-icon--star--off');
starElement!.classList.remove('entity-icon--star');
} else {
starElement!.classList.add('entity-icon--star');
starElement!.classList.remove('entity-icon--star--off');
}
});
}
} }

View File

@ -17,7 +17,7 @@ export class EncuestaCompartirDialogComponent implements OnInit {
constructor(protected activeModal: NgbActiveModal) {} constructor(protected activeModal: NgbActiveModal) {}
ngOnInit(): void { ngOnInit(): void {
this.baseURL = location.origin + '/' + this.encuesta?.id + '/complete'; this.baseURL = location.origin + '/encuesta/' + this.encuesta?.id + '/complete';
} }
compartir(): void {} compartir(): void {}

View File

@ -19,7 +19,6 @@ export class EncuestaFinalizarDialogComponent implements OnInit {
ngOnInit(): void {} ngOnInit(): void {}
confirmFinalizar(encuesta: IEncuesta): void { confirmFinalizar(encuesta: IEncuesta): void {
debugger;
const now = dayjs(); const now = dayjs();
encuesta.estado = EstadoEncuesta.FINISHED; encuesta.estado = EstadoEncuesta.FINISHED;

View File

@ -1,12 +1,12 @@
<form class="ds-form" [formGroup]="passwordForm" name="deleteForm" (ngSubmit)="submitPassword()"> <form class="ds-form" name="deleteForm">
<div *ngIf="this.isWrong">
<p>Contraseña incorrecta</p>
</div>
<div class="modal-body"> <div class="modal-body">
<p class="ds-title--small" jhiTranslate="dataSurveyApp.encuesta.password.title">Enter password</p> <p class="ds-title--small" jhiTranslate="dataSurveyApp.encuesta.password.title">Enter password</p>
<p class="ds-subtitle" id="jhi-delete-encuesta-heading" jhiTranslate="dataSurveyApp.encuesta.password.text"> <p class="ds-subtitle" id="jhi-delete-encuesta-heading" jhiTranslate="dataSurveyApp.encuesta.password.text">
This survey is marked as private, please enter the password This survey is marked as private, please enter the password
</p> </p>
<div class="alert alert-danger" *ngIf="this.isWrong">
<p>Contraseña incorrecta</p>
</div>
<input [(ngModel)]="passwordInput" type="password" name="passwordInput" id="passwordInput" placeholder="qwerty..." /> <input [(ngModel)]="passwordInput" type="password" name="passwordInput" id="passwordInput" placeholder="qwerty..." />
</div> </div>
@ -15,13 +15,7 @@
<fa-icon icon="arrow-left"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span> <fa-icon icon="arrow-left"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
</button> </button>
<button <button class="ds-btn ds-btn--primary" (click)="submitPassword()">
id="jhi-confirm-delete-option"
data-cy="submit"
type="submit"
class="ds-btn ds-btn--primary"
[disabled]="passwordForm.get('password')!.invalid"
>
<span jhiTranslate="entity.action.submit">Submit</span> <span jhiTranslate="entity.action.submit">Submit</span>
</button> </button>
</div> </div>

View File

@ -1,5 +1,4 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { IEncuesta } from '../encuesta.model'; import { IEncuesta } from '../encuesta.model';
@ -9,21 +8,16 @@ import { IEncuesta } from '../encuesta.model';
styleUrls: ['./encuesta-password-dialog.component.scss'], styleUrls: ['./encuesta-password-dialog.component.scss'],
}) })
export class EncuestaPasswordDialogComponent implements OnInit { export class EncuestaPasswordDialogComponent implements OnInit {
passwordForm = this.fb.group({
password: [null, [Validators.required]],
});
encuesta?: IEncuesta; encuesta?: IEncuesta;
isWrong?: boolean; isWrong?: boolean;
passwordInput?: string; passwordInput?: string;
constructor(protected activeModal: NgbActiveModal, protected fb: FormBuilder) {} constructor(protected activeModal: NgbActiveModal) {}
ngOnInit(): void {} ngOnInit(): void {}
submitPassword() { submitPassword() {
const password = this.passwordForm.get(['password'])!.value; if (this.passwordInput != undefined && this.passwordInput === this.encuesta!.contrasenna) {
if (this.passwordForm.valid && password === this.encuesta!.contrasenna) {
this.activeModal.close('success'); this.activeModal.close('success');
} else { } else {
this.isWrong = true; this.isWrong = true;

View File

@ -107,7 +107,6 @@ export class EncuestaPublishDialogComponent implements OnInit {
fechaFinalizacionIsInvalid(fechaFinalizar: dayjs.Dayjs, fechaPublicacion: dayjs.Dayjs): boolean { fechaFinalizacionIsInvalid(fechaFinalizar: dayjs.Dayjs, fechaPublicacion: dayjs.Dayjs): boolean {
let numberDays: number; let numberDays: number;
debugger;
numberDays = fechaFinalizar?.diff(fechaPublicacion, 'days'); numberDays = fechaFinalizar?.diff(fechaPublicacion, 'days');

View File

@ -79,11 +79,11 @@
</div> </div>
</form> </form>
<div class="ds-survey" id="entities" *ngIf="encuestas?.length === 0"> <div class="ds-survey" id="entitiesEncuestas" *ngIf="encuestas?.length === 0">
<div class="ds-survey--all-question-wrapper"> <div class="ds-survey--all-question-wrapper">
<ng-container class=""> <ng-container class="">
<p class="ds-title text-center">No posee encuestas</p> <p class="ds-title text-center">No posee encuestas</p>
<p class="ds-subtitle text-center">Incie a explorar, colaborar y adquirir datos al crear encuestas mundialmente</p> <p class="ds-subtitle text-center">Inicie a explorar, colaborar y adquirir datos al crear encuestas mundialmente</p>
</ng-container> </ng-container>
</div> </div>
</div> </div>

View File

@ -44,7 +44,6 @@ const encuestaRoute: Routes = [
resolve: { resolve: {
encuesta: EncuestaRoutingResolveService, encuesta: EncuestaRoutingResolveService,
}, },
canActivate: [UserRouteAccessService],
}, },
]; ];

View File

@ -58,7 +58,7 @@
[disabled]="isLoading" [disabled]="isLoading"
data-toggle="modal" data-toggle="modal"
data-target="#crearPregunta" data-target="#crearPregunta"
*ngIf="encuesta!.estado !== 'FINISHED' && (isAutor() || isEscritor())" *ngIf="encuesta!.estado !== 'ACTIVE' && encuesta!.estado !== 'FINISHED' && (isAutor() || isEscritor())"
> >
<fa-icon icon="sync" [icon]="faPlus"></fa-icon>&nbsp;&nbsp;<span>Crear pregunta</span> <fa-icon icon="sync" [icon]="faPlus"></fa-icon>&nbsp;&nbsp;<span>Crear pregunta</span>
</button> </button>

View File

@ -376,7 +376,7 @@ export class EncuestaUpdateComponent implements OnInit, AfterViewChecked {
nombre: this.editForm.get(['nombre'])!.value, nombre: this.editForm.get(['nombre'])!.value,
orden: 10, orden: 10,
cantidad: 0, cantidad: 0,
ePreguntaCerrada: this.selectedQuestionToCreateOption, epreguntaCerrada: this.selectedQuestionToCreateOption,
}; };
} }

View File

@ -19,7 +19,6 @@ export class FacturaService {
constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {}
create(factura: IFactura): Observable<EntityResponseType> { create(factura: IFactura): Observable<EntityResponseType> {
debugger;
const copy = this.convertDateFromClient(factura); const copy = this.convertDateFromClient(factura);
return this.http return this.http
.post<IFactura>(this.resourceUrl, copy, { observe: 'response' }) .post<IFactura>(this.resourceUrl, copy, { observe: 'response' })

View File

@ -76,7 +76,7 @@
</ng-container> </ng-container>
</ng-container> </ng-container>
<div class="ds-survey--option ds-survey--option--base ds-survey--open-option" *ngIf="!pPregunta.tipo"> <div class="ds-survey--option ds-survey--option--base ds-survey--open-option" *ngIf="!pPregunta.tipo">
<textarea cols="30" rows="10" disabled></textarea> <textarea class="ds-survey--textarea" cols="30" rows="10" disabled></textarea>
</div> </div>
</div> </div>
</div> </div>

View File

@ -59,8 +59,13 @@
<jhi-alert></jhi-alert> --> <jhi-alert></jhi-alert> -->
<div class="alert alert-warning" id="no-result" *ngIf="plantillas?.length === 0"> <div class="ds-survey" id="entities" *ngIf="plantillas?.length === 0">
<span jhiTranslate="dataSurveyApp.plantilla.home.notFound">No templates found</span> <div class="ds-survey--all-question-wrapper">
<ng-container class="">
<p class="ds-title text-center">No existen plantillas</p>
<p class="ds-subtitle text-center">Inicie creando plantillas de encuestas para publicarlas en la tienda</p>
</ng-container>
</div>
</div> </div>
<div class="table-responsive" id="entities" *ngIf="plantillas && plantillas.length > 0"> <div class="table-responsive" id="entities" *ngIf="plantillas && plantillas.length > 0">

View File

@ -1,21 +1,34 @@
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<div class="page-header-ui page-header-ui-dark bg-img-cover overlay"> <div
<div class="container px-0 text-black"> class="page-header-ui page-header-ui-dark bg-img-cover overlay overlay-60"
<h1 class="page-header-ui-title">¡Compre y utilice las plantillas!</h1> style="background-image: url('../../content/img_datasurvey/survey-shop.png')"
>
<div class="page-header-ui-content py-5 position-relative">
<div class="container px-5">
<div class="row gx-5 justify-content-start">
<div class="col-xl-8 col-lg-10 text-left" style="color: white">
<div data-aos="fade-up">
<h1 class="page-header-ui-title" style="color: white">¡Compre y utilice las plantillas!</h1>
<h2>Puede comprar sus plantillas mediante <b> PayPal </b> <fa-icon [icon]="faCreditCard"></fa-icon></h2> <h2>
Puede comprar sus plantillas mediante <b> PayPal </b>
<fa-icon [icon]="faCreditCard"></fa-icon>
</h2>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
<div class="bg-light py-10 container-encuestas"> <div class="bg-light py-10 container-encuestas">
<div class="container px-0"> <div class="container px-0">
<!--filtrado--> <!--filtrado-->
<div class="input-group"> <div class="input-group">
<div class="ds-filter"> <div class="ds-filter ds-form">
<div class="input-group-addon"><i class="glyphicon glyphicon-search"></i></div> <div class="input-group-addon"><i class="glyphicon glyphicon-search"></i></div>
<input class="form-control" type="text" name="searchString" placeholder="Buscar por nombre..." [(ngModel)]="searchString" /> <input class="ds-form-control" type="text" name="searchString" placeholder="Buscar por nombre..." [(ngModel)]="searchString" />
</div> </div>
<!--<div class="ds-filter"> <!--<div class="ds-filter">
<select name="searchCategoria" class="form-control" [(ngModel)]="searchCategoria" style="width: 200px"> <select name="searchCategoria" class="form-control" [(ngModel)]="searchCategoria" style="width: 200px">
@ -25,27 +38,26 @@
</select> </select>
</div>--> </div>-->
<!--<div class="ds-filter"> <!-- <div class="ds-filter">
<div class="form-check pl-0 mb-3"> <div class="form-check pl-0 mb-3">
<input type="radio" class="form-check-input" id="under25" name="materialExampleRadios" [value]="0"> <input type="radio" class="form-check-input" id="under25" name="materialExampleRadios" [value]="0" />
<label for="under25" [(ngModel)]="searchPrecio">GRATIS</label> <label for="under25" [(ngModel)]="searchPrecio">GRATIS</label>
</div> </div>
<div class="form-check pl-0 mb-3"> <div class="form-check pl-0 mb-3">
<input type="radio" class="form-check-input" id="2550" name="materialExampleRadios" [value]=""> <input type="radio" class="form-check-input" id="2550" name="materialExampleRadios" [value]="5" />
<label for="2550" [(ngModel)]="searchPrecio"> $5 - $10</label> <label for="2550" [(ngModel)]="searchPrecio"> $5 - $10</label>
</div> </div>
<div class="form-check pl-0 mb-3"> <div class="form-check pl-0 mb-3">
<input type="radio" class="form-check-input" id="50100" name="materialExampleRadios"> <input type="radio" class="form-check-input" id="50100" name="materialExampleRadios" />
<label for="50100" [(ngModel)]="searchPrecio">$10 - $20</label> <label for="50100" [(ngModel)]="searchPrecio">$10 - $20</label>
</div> </div>
<div class="form-check pl-0 mb-3"> <div class="form-check pl-0 mb-3">
<input type="radio" class="form-check-input" id="100200" name="materialExampleRadios"> <input type="radio" class="form-check-input" id="100200" name="materialExampleRadios" />
<label for="100200" [(ngModel)]="searchPrecio">$20 - $30</label> <label for="100200" [(ngModel)]="searchPrecio">$20 - $30</label>
</div> </div>
<div class="form-check pl-0 mb-3"> <div class="form-check pl-0 mb-3">
<input type="radio" class="form-check-input" id="200above" name="materialExampleRadios"> <input type="radio" class="form-check-input" id="200above" name="materialExampleRadios" />
<label [(ngModel)]="searchPrecio">Más de $30 </label> <label [(ngModel)]="searchPrecio">Más de $30 </label>
</div> </div>
</div>--> </div>-->
</div> </div>
@ -97,6 +109,15 @@
<div class="text-xs text-gray-500"> <div class="text-xs text-gray-500">
<div class="entity-body"> <div class="entity-body">
<div class="entity-body--row m-2"> <div class="entity-body--row m-2">
<button
type="submit"
[routerLink]="['/plantilla', plantilla.id, 'view']"
class="ds-btn ds-btn--secondary btn-sm"
data-cy="entityDetailsButton"
>
<fa-icon icon="eye"></fa-icon>
<span class="d-none d-md-inline">Vista previa</span>
</button>
<button class="ds-btn btn-outline-success btn-card" (click)="triggerPaypalDialog(plantilla)"> <button class="ds-btn btn-outline-success btn-card" (click)="triggerPaypalDialog(plantilla)">
<fa-icon [icon]="faCreditCard"></fa-icon>&nbsp;&nbsp;Comprar con PayPal <fa-icon [icon]="faCreditCard"></fa-icon>&nbsp;&nbsp;Comprar con PayPal
</button> </button>

View File

@ -5,6 +5,6 @@ export const TIENDA_PLANTILLA_ROUTE: Route = {
path: 'tienda-plantilla', path: 'tienda-plantilla',
component: ListarTiendaPlantillaComponent, component: ListarTiendaPlantillaComponent,
data: { data: {
pageTitle: 'tiendaPlantilla.title', pageTitle: 'dataSurveyApp.tiendaPlantilla.title',
}, },
}; };

View File

@ -10,10 +10,12 @@
<hr /> <hr />
<h2 class="entity-body--row m-2">La plantilla ha comprar no tiene costo alguno</h2> <div *ngIf="plantilla!.precio == 0">
<button type="button" class="ds-btn btn-outline-success fc-center" data-dismiss="modal" (click)="freePurchase()"> <h2 class="entity-body--row m-2">La plantilla ha comprar no tiene costo alguno</h2>
<fa-icon [icon]="faCheck"></fa-icon>&nbsp;<span>Finalizar compra</span> <button type="button" class="ds-btn btn-outline-success fc-center" data-dismiss="modal" (click)="freePurchase()">
</button> <fa-icon [icon]="faCheck"></fa-icon>&nbsp;<span>Finalizar compra</span>
</button>
</div>
<ngx-paypal [config]="payPalConfig" *ngIf="plantilla!.precio != 0"></ngx-paypal> <ngx-paypal [config]="payPalConfig" *ngIf="plantilla!.precio != 0"></ngx-paypal>
</div> </div>

View File

@ -106,7 +106,6 @@ export class PaypalDialogComponent implements OnInit {
}); });
}, },
onClientAuthorization: data => { onClientAuthorization: data => {
debugger;
console.log('onClientAuthorization - you should probably inform your server about completed transaction at this point', data); console.log('onClientAuthorization - you should probably inform your server about completed transaction at this point', data);
this.updateUser(); this.updateUser();
this.sendReceipt(); this.sendReceipt();
@ -119,7 +118,6 @@ export class PaypalDialogComponent implements OnInit {
} }
getUser(): void { getUser(): void {
debugger;
// Get jhi_user and usuario_extra information // Get jhi_user and usuario_extra information
if (this.account !== null) { if (this.account !== null) {
this.usuarioExtraService.find(this.account.id).subscribe(usuarioExtra => { this.usuarioExtraService.find(this.account.id).subscribe(usuarioExtra => {
@ -138,7 +136,6 @@ export class PaypalDialogComponent implements OnInit {
sendReceipt(): void { sendReceipt(): void {
const now = dayjs(); const now = dayjs();
debugger;
this.factura = { this.factura = {
nombreUsuario: String(this.usuarioExtra?.id!), nombreUsuario: String(this.usuarioExtra?.id!),
nombrePlantilla: this.plantilla?.nombre!, nombrePlantilla: this.plantilla?.nombre!,

View File

@ -43,7 +43,7 @@
</div> </div>
</div> </div>
<div class="table-responsive" id="entities" *ngIf="usuarioEncuestas && usuarioEncuestas.length > 0"> <div class="table-responsive" id="entities2" *ngIf="usuarioEncuestas && usuarioEncuestas.length > 0">
<table class="ds-table table table-striped" aria-describedby="page-heading"> <table class="ds-table table table-striped" aria-describedby="page-heading">
<thead> <thead>
<tr> <tr>

View File

@ -0,0 +1,86 @@
<div class="container-fluid" *ngIf="plantilla">
<div>
<h2 id="page-heading" data-cy="PPreguntaCerradaHeading">
<div class="d-flex align-items-center">
<p class="ds-title">Vista previa de {{ plantilla!.nombre }}</p>
</div>
<p class="ds-subtitle">Creada el día {{ plantilla!.fechaCreacion | formatShortDatetime | lowercase }}</p>
<div class="d-flex justify-content-end">
<button type="button" class="ds-btn ds-btn--secondary" (click)="previousState()">
<fa-icon icon="arrow-left"></fa-icon>&nbsp;&nbsp;<span jhiTranslate="entity.action.back">Back</span>
</button>
</div>
</h2>
<jhi-alert-error></jhi-alert-error>
<!-- <jhi-alert></jhi-alert> -->
<div class="ds-survey preview-survey" id="entities">
<div class="ds-survey--all-question-wrapper col-8">
<ng-container *ngIf="pPreguntas && pPreguntas.length === 0">
<p class="ds-title text-center">Plantilla vacía</p>
<p class="ds-subtitle text-center">Inicie creando preguntas y opciones para su plantilla.</p>
</ng-container>
<div class="ds-survey--question-wrapper card-plantilla" *ngFor="let pPregunta of pPreguntas; let i = index; trackBy: trackId">
<div
[attr.data-index]="pPregunta.id"
[attr.data-tipo]="pPregunta.tipo"
[attr.data-opcional]="pPregunta.opcional"
class="ds-survey--question"
>
<div class="ds-survey--titulo">
<span class="ds-survey--titulo--name">{{ i + 1 }}. {{ pPregunta.nombre }}</span>
</div>
<div>
<span *ngIf="pPregunta.tipo === 'SINGLE'" class="ds-subtitle"
>Pregunta de respuesta {{ 'dataSurveyApp.PreguntaCerradaTipo.SINGLE' | translate | lowercase }}
{{ pPregunta.opcional ? '(opcional)' : '' }}</span
>
<span *ngIf="pPregunta.tipo === 'MULTIPLE'" class="ds-subtitle"
>Pregunta de respuesta {{ 'dataSurveyApp.PreguntaCerradaTipo.MULTIPLE' | translate | lowercase }}
{{ pPregunta.opcional ? '(opcional)' : '' }}</span
>
<span *ngIf="!pPregunta.tipo" class="ds-subtitle"
>Pregunta de respuesta abierta {{ pPregunta.opcional ? '(opcional)' : '' }}</span
>
</div>
<ng-container *ngIf="pPregunta.tipo">
<ng-container *ngFor="let pPreguntaOpcion of pPreguntasOpciones; let j = index; trackBy: trackId">
<ng-container *ngFor="let pPreguntaOpcionFinal of pPreguntaOpcion">
<ng-container *ngIf="pPregunta.id === pPreguntaOpcionFinal.ppreguntaCerrada.id">
<div
class="ds-survey--option ds-survey--option--base ds-survey--closed-option can-delete"
[attr.data-id]="pPreguntaOpcionFinal.id"
>
<div class="radio" *ngIf="pPregunta.tipo === 'SINGLE'">
<input
type="radio"
style="border-radius: 3px"
name="{{ 'radio' + pPregunta.id }}"
id="{{ 'radio' + pPreguntaOpcionFinal.id }}"
/>
<!-- <input class="ds-survey--checkbox" id="{{ pPregunta.id }}-{{ pPreguntaOpcionFinal.id }}" type="checkbox" disabled /> -->
<label for="{{ 'radio' + pPreguntaOpcionFinal.id }}">{{ pPreguntaOpcionFinal.nombre }}</label>
</div>
<div class="checkbox" *ngIf="pPregunta.tipo === 'MULTIPLE'">
<input type="checkbox" style="border-radius: 3px" id="{{ 'checkbox' + pPreguntaOpcionFinal.id }}" />
<!-- <input class="ds-survey--checkbox" id="{{ pPregunta.id }}-{{ pPreguntaOpcionFinal.id }}" type="checkbox" disabled /> -->
<label for="{{ 'checkbox' + pPreguntaOpcionFinal.id }}">{{ pPreguntaOpcionFinal.nombre }}</label>
</div>
</div>
</ng-container>
</ng-container>
</ng-container>
</ng-container>
<div class="ds-survey--option ds-survey--option--base ds-survey--open-option" *ngIf="!pPregunta.tipo">
<textarea cols="30" rows="10" disabled></textarea>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,37 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ActivatedRoute } from '@angular/router';
import { of } from 'rxjs';
import { UsuarioPlantillasDetailComponent } from './usuario-plantillas-detail.component';
describe('Component Tests', () => {
describe('Plantilla Management Detail Component', () => {
let comp: UsuarioPlantillasDetailComponent;
let fixture: ComponentFixture<UsuarioPlantillasDetailComponent>;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [UsuarioPlantillasDetailComponent],
providers: [
{
provide: ActivatedRoute,
useValue: { data: of({ plantilla: { id: 123 } }) },
},
],
})
.overrideTemplate(UsuarioPlantillasDetailComponent, '')
.compileComponents();
fixture = TestBed.createComponent(UsuarioPlantillasDetailComponent);
comp = fixture.componentInstance;
});
describe('OnInit', () => {
it('Should load plantilla on init', () => {
// WHEN
comp.ngOnInit();
// THEN
expect(comp.plantilla).toEqual(expect.objectContaining({ id: 123 }));
});
});
});
});

View File

@ -0,0 +1,155 @@
import { Component, OnInit } from '@angular/core';
import { HttpResponse } from '@angular/common/http';
import { FormBuilder, Validators } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { EstadoPlantilla } from 'app/entities/enumerations/estado-plantilla.model';
import { Observable } from 'rxjs';
import { finalize, map } from 'rxjs/operators';
import * as dayjs from 'dayjs';
import { DATE_TIME_FORMAT } from 'app/config/input.constants';
import { ICategoria } from 'app/entities/categoria/categoria.model';
import { CategoriaService } from 'app/entities/categoria/service/categoria.service';
import { IUsuarioExtra, UsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model';
import { UsuarioExtraService } from 'app/entities/usuario-extra/service/usuario-extra.service';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { IPPreguntaCerrada } from 'app/entities/p-pregunta-cerrada/p-pregunta-cerrada.model';
import { PPreguntaCerradaService } from 'app/entities/p-pregunta-cerrada/service/p-pregunta-cerrada.service';
import { PPreguntaCerradaDeleteDialogComponent } from 'app/entities/p-pregunta-cerrada/delete/p-pregunta-cerrada-delete-dialog.component';
import { IPPreguntaAbierta } from '../../p-pregunta-abierta/p-pregunta-abierta.model';
import { PPreguntaCerrada } from '../../p-pregunta-cerrada/p-pregunta-cerrada.model';
import { PPreguntaCerradaOpcion, IPPreguntaCerradaOpcion } from '../../p-pregunta-cerrada-opcion/p-pregunta-cerrada-opcion.model';
import { PPreguntaAbiertaService } from '../../p-pregunta-abierta/service/p-pregunta-abierta.service';
import { PPreguntaCerradaOpcionService } from '../../p-pregunta-cerrada-opcion/service/p-pregunta-cerrada-opcion.service';
import { PreguntaCerradaTipo } from 'app/entities/enumerations/pregunta-cerrada-tipo.model';
import { faTimes, faPlus, faStar, faQuestion } from '@fortawesome/free-solid-svg-icons';
import { Account } from '../../../core/auth/account.model';
import { AccountService } from 'app/core/auth/account.service';
import { IPlantilla } from 'app/entities/plantilla/plantilla.model';
import { PlantillaService } from 'app/entities/plantilla/service/plantilla.service';
@Component({
selector: 'jhi-usuario-plantillas-detail',
templateUrl: './usuario-plantillas-detail.component.html',
})
export class UsuarioPlantillasDetailComponent implements OnInit {
categoriasSharedCollection: ICategoria[] = [];
usuarioExtrasSharedCollection: IUsuarioExtra[] = [];
faTimes = faTimes;
faPlus = faPlus;
faStar = faStar;
faQuestion = faQuestion;
plantilla: IPlantilla | null = null;
isLoading = false;
successPublished = false;
pPreguntas?: any[];
pPreguntasOpciones?: any[];
usuarioExtra: UsuarioExtra | null = null;
constructor(
protected activatedRoute: ActivatedRoute,
protected plantillaService: PlantillaService,
protected categoriaService: CategoriaService,
protected usuarioExtraService: UsuarioExtraService,
protected fb: FormBuilder,
protected modalService: NgbModal,
protected pPreguntaCerradaService: PPreguntaCerradaService,
protected pPreguntaCerradaOpcionService: PPreguntaCerradaOpcionService,
protected pPreguntaAbiertaService: PPreguntaAbiertaService,
protected accountService: AccountService
) {}
ngOnInit(): void {
this.activatedRoute.data.subscribe(({ plantilla }) => {
if (plantilla) {
this.plantilla = plantilla;
this.loadAll();
} else {
this.previousState();
}
});
// Get jhi_user and usuario_extra information
this.accountService.getAuthenticationState().subscribe(account => {
if (account !== null) {
this.usuarioExtraService.find(account.id).subscribe(usuarioExtra => {
this.usuarioExtra = usuarioExtra.body;
});
}
});
}
ngAfterViewChecked(): void {
this.initListeners();
}
initListeners(): void {
const checkboxes = document.getElementsByClassName('ds-survey--checkbox');
for (let i = 0; i < checkboxes.length; i++) {
checkboxes[i].addEventListener('click', e => {
if ((e.target as HTMLInputElement).checked) {
(e.target as HTMLElement).offsetParent!.classList.add('ds-survey--closed-option--active');
} else {
(e.target as HTMLElement).offsetParent!.classList.remove('ds-survey--closed-option--active');
}
});
}
}
trackId(index: number, item: IPPreguntaCerrada): number {
return item.id!;
}
trackPPreguntaCerradaById(index: number, item: IPPreguntaCerrada): number {
return item.id!;
}
trackCategoriaById(index: number, item: ICategoria): number {
return item.id!;
}
trackUsuarioExtraById(index: number, item: IUsuarioExtra): number {
return item.id!;
}
getPlantilla(id: number) {
return this.plantillaService.findPlantilla(id);
}
loadAll(): void {
this.isLoading = true;
this.plantillaService
.findQuestions(this.plantilla?.id!)
.pipe(
finalize(() =>
this.plantillaService.findQuestionsOptions(this.plantilla?.id!).subscribe(
(res: any) => {
this.isLoading = false;
this.pPreguntasOpciones = res.body ?? [];
},
() => {
this.isLoading = false;
}
)
)
)
.subscribe(
(res: any) => {
this.isLoading = false;
this.pPreguntas = res.body ?? [];
},
() => {
this.isLoading = false;
}
);
}
previousState(): void {
window.history.back();
}
}

View File

@ -48,7 +48,7 @@
<div class="btn-group"> <div class="btn-group">
<button <button
type="submit" type="submit"
[routerLink]="['/plantilla', miPlantilla.id, 'preview']" [routerLink]="['/mis-plantillas', miPlantilla.id, 'preview']"
class="ds-btn ds-btn--secondary btn-sm" class="ds-btn ds-btn--secondary btn-sm"
data-cy="entityDetailsButton" data-cy="entityDetailsButton"
> >

View File

@ -0,0 +1,29 @@
import { Injectable } from '@angular/core';
import { HttpResponse } from '@angular/common/http';
import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router';
import { Observable, of, EMPTY } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
import { IPlantilla, Plantilla } from 'app/entities/plantilla/plantilla.model';
import { PlantillaService } from 'app/entities/plantilla/service/plantilla.service';
@Injectable({ providedIn: 'root' })
export class UsuarioPlantillasRoutingResolveService implements Resolve<IPlantilla> {
constructor(protected service: PlantillaService, protected router: Router) {}
resolve(route: ActivatedRouteSnapshot): Observable<IPlantilla> | Observable<never> {
const id = route.params['id'];
if (id) {
return this.service.find(id).pipe(
mergeMap((plantilla: HttpResponse<Plantilla>) => {
if (plantilla.body) {
return of(plantilla.body);
} else {
this.router.navigate(['404']);
return EMPTY;
}
})
);
}
return of(new Plantilla());
}
}

View File

@ -1,11 +1,31 @@
import { Route, RouterModule } from '@angular/router'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { UserRouteAccessService } from 'app/core/auth/user-route-access.service';
import { UsuarioPlantillasDetailComponent } from '../detail/usuario-plantillas-detail.component';
import { UsuarioPlantillasComponent } from '../list/usuario-plantillas.component'; import { UsuarioPlantillasComponent } from '../list/usuario-plantillas.component';
import { UsuarioPlantillasRoutingResolveService } from './usuario-plantillas-routing-resolve.service';
export const USUARIO_PLANTILLAS_ROUTE: Route = { const USUARIO_PLANTILLAS_ROUTE: Routes = [
path: '', {
component: UsuarioPlantillasComponent, path: '',
data: { component: UsuarioPlantillasComponent,
pageTitle: 'dataSurveyApp.usuarioExtra.plantillas.title', data: {
pageTitle: 'dataSurveyApp.usuarioExtra.plantillas.title',
},
}, },
}; {
path: ':id/preview',
component: UsuarioPlantillasDetailComponent,
resolve: {
plantilla: UsuarioPlantillasRoutingResolveService,
},
canActivate: [UserRouteAccessService],
},
];
@NgModule({
imports: [RouterModule.forChild(USUARIO_PLANTILLAS_ROUTE)],
exports: [RouterModule],
})
export class UsuarioPlantillasRoutingModule {}

View File

@ -2,12 +2,13 @@ import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { UsuarioPlantillasComponent } from './list/usuario-plantillas.component'; import { UsuarioPlantillasComponent } from './list/usuario-plantillas.component';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { USUARIO_PLANTILLAS_ROUTE } from './route/usuario-plantillas.route';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { SharedModule } from '../../shared/shared.module'; import { SharedModule } from '../../shared/shared.module';
import { UsuarioPlantillasRoutingModule } from './route/usuario-plantillas.route';
import { UsuarioPlantillasDetailComponent } from './detail/usuario-plantillas-detail.component';
@NgModule({ @NgModule({
declarations: [UsuarioPlantillasComponent], imports: [CommonModule, UsuarioPlantillasRoutingModule, FontAwesomeModule, SharedModule],
imports: [CommonModule, RouterModule.forChild([USUARIO_PLANTILLAS_ROUTE]), FontAwesomeModule, SharedModule], declarations: [UsuarioPlantillasComponent, UsuarioPlantillasDetailComponent],
}) })
export class UsuarioPlantillasModule {} export class UsuarioPlantillasModule {}

View File

@ -3,7 +3,7 @@
<div class="container-fluid navbar navbar-marketing navbar-expand-lg bg-white navbar-light"> <div class="container-fluid navbar navbar-marketing navbar-expand-lg bg-white navbar-light">
<div class="container px-5 py-4"> <div class="container px-5 py-4">
<a class="text-dark" routerLink="login" <a class="text-dark" routerLink="login"
><img src="src/main/webapp/content/img_datasurvey/datasurvey-logo-text-black.svg" width="300" alt="" ><img src="./../../content/img_datasurvey/datasurvey-logo-text-black.svg" width="300" alt=""
/></a> /></a>
<div class="col-6" style="text-align: end"> <div class="col-6" style="text-align: end">
@ -135,20 +135,22 @@
></fa-icon> ></fa-icon>
</div> </div>
<div class="entity-body--row m-2"> <div class="entity-body--row m-2">
<button class="ds-btn btn-card"><fa-icon [icon]="faPollH"></fa-icon>&nbsp;&nbsp;Completar encuesta</button> <button class="ds-btn btn-card" routerLink="pagina-principal" routerLinkActive="router-link-active">
<fa-icon [icon]="faPollH"></fa-icon>&nbsp;&nbsp;Ver más encuestas
</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <!-- <div class="row">
<div class="col"> <div class="col">
<a routerLink="#"> <a routerLink="#">
<button class="ds-btn ds-btn--primary fw-500 ms-lg-4 mb-4">Ver todas las encuestas</button> <button class="ds-btn ds-btn--primary fw-500 ms-lg-4 mb-4">Ver todas las encuestas</button>
</a> </a>
</div> </div>
</div> </div> -->
</div> </div>
</div> </div>
</div> </div>

View File

@ -2,13 +2,13 @@
Main page styles Main page styles
========================================================================== */ ========================================================================== */
.hipster { // .hipster {
display: inline-block; // display: inline-block;
width: 347px; // width: 347px;
height: 497px; // height: 497px;
background: url('../../content/images/jhipster_family_member_0.svg') no-repeat center top; // background: url('../../content/images/jhipster_family_member_0.svg') no-repeat center top;
background-size: contain; // background-size: contain;
} // }
.bg-img-cover { .bg-img-cover {
background-position: center; background-position: center;
@ -206,16 +206,16 @@ Main page styles
} }
/* wait autoprefixer update to allow simple generation of high pixel density media query */ /* wait autoprefixer update to allow simple generation of high pixel density media query */
@media only screen and (-webkit-min-device-pixel-ratio: 2), // @media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (-moz-min-device-pixel-ratio: 2), // only screen and (-moz-min-device-pixel-ratio: 2),
only screen and (-o-min-device-pixel-ratio: 2/1), // only screen and (-o-min-device-pixel-ratio: 2/1),
only screen and (min-resolution: 192dpi), // only screen and (min-resolution: 192dpi),
only screen and (min-resolution: 2dppx) { // only screen and (min-resolution: 2dppx) {
.hipster { // .hipster {
background: url('../../content/images/jhipster_family_member_0.svg') no-repeat center top; // background: url('../../content/images/jhipster_family_member_0.svg') no-repeat center top;
background-size: contain; // background-size: contain;
} // }
} // }
.icon-stack { .icon-stack {
display: inline-flex; display: inline-flex;

View File

@ -94,6 +94,13 @@ export class HomeComponent implements OnInit, OnDestroy {
(res: HttpResponse<IEncuesta[]>) => { (res: HttpResponse<IEncuesta[]>) => {
this.isLoading = false; this.isLoading = false;
const tmpEncuestas = res.body ?? []; const tmpEncuestas = res.body ?? [];
// Fix calificacion
tmpEncuestas.forEach(encuesta => {
const _calificacion = encuesta.calificacion;
encuesta.calificacion = Number(_calificacion?.toString().split('.')[0]);
});
this.encuestas = tmpEncuestas.filter(e => e.estado === 'ACTIVE' && e.acceso === 'PUBLIC'); this.encuestas = tmpEncuestas.filter(e => e.estado === 'ACTIVE' && e.acceso === 'PUBLIC');
this.encuestasMostradas = this.encuestas.reverse().slice(0, 3); this.encuestasMostradas = this.encuestas.reverse().slice(0, 3);
}, },

View File

@ -26,7 +26,7 @@ export const ADMIN_ROUTES: RouteInfo[] = [
{ path: '/pagina-principal', title: 'Inicio', type: 'link', icontype: 'nc-icon nc-world-2' }, { path: '/pagina-principal', title: 'Inicio', type: 'link', icontype: 'nc-icon nc-world-2' },
{ {
path: '/dashboard/admin', path: '/dashboard/admin',
title: 'Dashboard', title: 'Reportes',
type: 'link', type: 'link',
icontype: 'nc-icon nc-chart-bar-32', icontype: 'nc-icon nc-chart-bar-32',
}, },
@ -66,7 +66,7 @@ export const USER_ROUTES: RouteInfo[] = [
{ path: '/pagina-principal', title: 'Inicio', type: 'link', icontype: 'nc-icon nc-world-2' }, { path: '/pagina-principal', title: 'Inicio', type: 'link', icontype: 'nc-icon nc-world-2' },
{ {
path: '/dashboard/user', path: '/dashboard/user',
title: 'Dashboard', title: 'Reportes',
type: 'link', type: 'link',
icontype: 'nc-icon nc-chart-bar-32', icontype: 'nc-icon nc-chart-bar-32',
}, },

View File

@ -1,6 +1,6 @@
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<div class="container-fluid navbar navbar-marketing navbar-expand-lg bg-white navbar-light"> <div class="container-fluid navbar navbar-marketing navbar-expand-lg bg-white navbar-light" style="background-color: #fbfafa">
<div class="container px-5 py-4"> <div class="container px-5 py-4">
<h1 class="ds-title" [hidden]="notAccount">Inicio</h1> <h1 class="ds-title" [hidden]="notAccount">Inicio</h1>
<a class="text-dark" href=" " [hidden]="!notAccount"> <a class="text-dark" href=" " [hidden]="!notAccount">
@ -25,15 +25,29 @@
</div> </div>
</div> </div>
</div> </div>
<div
class="page-header-ui page-header-ui-dark bg-img-cover overlay overlay-40"
style="background-image: url('../../content/img_datasurvey/banner1.webp'); background-position-y: -325px"
>
<div class="page-header-ui-content py-5 position-relative" style="height: 330px">
<div class="container px-5">
<div class="row gx-5 justify-content-center">
<div class="col-xl-8 col-lg-10 text-center">
<div data-aos="fade-up"></div>
</div>
</div>
</div>
</div>
</div>
<div class="bg-light py-10 container-encuestas"> <div class="bg-light py-10 container-encuestas">
<div class="container px-0"> <div class="container px-0">
<!--filtrado--> <!--filtrado-->
<div class="input-group"> <div class="input-group ds-form">
<div class="ds-filter"> <div class="ds-filter">
<div class="input-group-addon"><i class="glyphicon glyphicon-search"></i></div> <div class="input-group-addon"><i class="glyphicon glyphicon-search"></i></div>
<input class="form-control" type="text" name="searchString" placeholder="Buscar por nombre..." [(ngModel)]="searchString" /> <input class="ds-form-control" type="text" name="searchString" placeholder="Buscar por nombre..." [(ngModel)]="searchString" />
</div> </div>
<!--<div class="ds-filter"> <!--<div class="ds-filter">
<select name="searchCategoria" class="form-control" [(ngModel)]="searchCategoria" style="width: 200px"> <select name="searchCategoria" class="form-control" [(ngModel)]="searchCategoria" style="width: 200px">

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 319 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 379 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 KiB

Some files were not shown because too many files have changed in this diff Show More