Compare commits

...

606 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
Mariela Bonilla 185424d18b Merge branch 'dev' into feature/US-50 2021-08-12 03:06:02 -06:00
Mariela Bonilla fab8fa06b7 add visualizar reportes de usuarios (administrador) 2021-08-12 03:05:50 -06: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 8135ee564e
Merge pull request #125 from Quantum-P3/feature/US-49
update reportes generales del administrador
2021-08-12 06:18:50 +00:00
Mariela Bonilla 6575afe8d5 Merge branch 'feature/US-49' into feature/US-50 2021-08-11 23:45:56 -06:00
Mariela Bonilla d27b8a5c4b add lista usuarios en ts 2021-08-11 23:45:33 -06:00
Mariela Bonilla 6f786e832a Merge branch 'dev' into feature/US-49 2021-08-11 21:11:19 -06:00
Eduardo Quiros 9ba02837b8
Merge pull request #124 from Quantum-P3/feature/US-51
Add export general admin reports as PDF and fix rating
2021-08-12 03:08:05 +00:00
Mariela Bonilla ca4f23669e Merge branch 'dev' into feature/US-49 2021-08-11 20:55:40 -06:00
Mariela Bonilla b1238d057a Merge remote-tracking branch 'origin/feature/US-49' into feature/US-49 2021-08-11 20:54:42 -06:00
Mariela Bonilla 33a3376d8d add nuevos charts de conteos de encuestas 2021-08-11 20:54:16 -06:00
Pablo Bonilla 911f45ea01
Update rating initialization on create survey based on a template 2021-08-11 20:49:34 -06:00
Pablo Bonilla 987160727c
Add new rating display 2021-08-11 20:45:11 -06:00
Pablo Bonilla 25e38f1945
Add survey template preview in edit survey template 2021-08-11 20:16:23 -06:00
Pablo Bonilla a39ad439a5
Add export admin. reports as an Excel file 2021-08-11 19:18:18 -06:00
Pablo Bonilla 326dffa555
Merge branch 'dev' into feature/US-51 2021-08-11 15:55:05 -06:00
Eduardo Quiros d3c80b3de5
Merge pull request #121 from Quantum-P3/feature/US-49
add reportes del administrador
2021-08-11 19:23:05 +00:00
Eduardo Quiros e8e0e30327
Merge branch 'dev' of github.com:Quantum-P3/datasurvey into feature/US-49 2021-08-11 12:26:19 -06:00
Eduardo Quiros a9bee3af53
Merge pull request #110 from Quantum-P3/feature/US-28
Feature/us 28
2021-08-11 18:12:43 +00:00
Eduardo Quiros 84fb6cd353
Merge pull request #122 from Quantum-P3/feature/US-32
Feature/us 32
2021-08-11 18:10:45 +00:00
Paola bf83738055 conflict fix 2021-08-11 12:03:27 -06:00
Paola c7500a35f8 Merge branch 'dev' into feature/US-32 2021-08-11 11:38:55 -06:00
Paola 5f958cf333 arreglo archivos test 2021-08-11 11:36:28 -06:00
Mariela Bonilla fec15cee41 fix tests 2021-08-11 11:29:59 -06:00
Mariela Bonilla ed3925bc3a Merge branch 'dev' into feature/US-49 2021-08-11 11:28:02 -06:00
Eduardo Quiros e3601e7bc8
Merge pull request #120 from Quantum-P3/fix/toggle-category-status
Fix bug when toggling a category
2021-08-11 15:04:31 +00:00
Mariela Bonilla 0c00fa0396 add visualizar reportes administrador 2021-08-11 05:15:08 -06:00
Paola 580eded1ce Merge branch 'dev' into feature/US-32 2021-08-11 01:32:17 -06:00
Paola cd2ee8803b modificacion PayPal y agregacion de correo 2021-08-11 01:30:33 -06:00
Pablo Bonilla f2aeb4ceff
Merge branch 'dev' into fix/toggle-category-status 2021-08-10 22:29:42 -06:00
Pablo Bonilla 7cefd91cf6
Fix bug where changing category state triggers publish survey email 2021-08-10 22:24:31 -06:00
Eduardo Quiros 3705d130e9
Merge pull request #119 from Quantum-P3/fix/table-design
Add datasurvey table design
2021-08-11 04:08:22 +00:00
Pablo Bonilla b30d29c913
Update table designs for user 2021-08-10 21:55:41 -06:00
Pablo Bonilla 94221cb193
Add datasurvey table design 2021-08-10 21:53:09 -06:00
Pablo Bonilla e5c679570a
Add PDF title 2021-08-10 18:22:01 -06:00
Pablo Bonilla 6267ff5071
Add jsPDF export as PDF 2021-08-10 18:07:25 -06:00
Pablo Bonilla edda17d1a5
Add XLSX export as Excel 2021-08-10 16:18:54 -06:00
Eduardo Quiros 3c58e9f4c9
Merge pull request #118 from Quantum-P3/feature/dashboard
add page dashboard
2021-08-10 03:01:37 +00:00
Mariela Bonilla 8812eea915 fix links dashboards 2021-08-09 19:26:35 -06:00
Mariela Bonilla 5542c12c82 add page dashboard 2021-08-09 19:07:19 -06:00
Paola 3ef698c0d3 modificaciones de PayPal 2021-08-09 18:58:06 -06:00
Eduardo Quiros 4407fa0de8
Merge pull request #117 from Quantum-P3/feature/US-37
filtrado de plantillas como usuario
2021-08-09 06:05:53 +00:00
Eduardo Quiros d784906395
agregar filtrado por nombre de plantilla 2021-08-08 23:54:23 -06:00
Eduardo Quiros 5cc8548e51
prefix unused declarations with '_' 2021-08-08 23:39:07 -06:00
Eduardo Quiros d82a53548b
add searchString 2021-08-08 23:38:33 -06:00
Eduardo Quiros 999335af87
remove unused imports 2021-08-08 23:37:08 -06:00
Eduardo Quiros 842fd46ff8
Merge pull request #116 from Quantum-P3/feature/US-40
Add crear encuesta a partir de una plantilla
2021-08-09 03:24:03 +00:00
Eduardo Quiros 3ee63630d4
Merge pull request #115 from Quantum-P3/feature/US-66
add filtrar plantillas para administrador
2021-08-09 03:23:08 +00:00
Pablo Bonilla 170742324b
Add survey template view button and remove lift effect on preview card 2021-08-08 14:55:48 -06:00
Pablo Bonilla be7d6041dc
Fix end survey dialog and button position 2021-08-08 14:44:03 -06:00
Pablo Bonilla 80b55773d9
Add create survey from template 2021-08-08 14:29:02 -06:00
Pablo Bonilla ee2853820a
Add surveys, collaborations, and user templates list placeholder 2021-08-08 13:51:45 -06:00
Pablo Bonilla 6015f41683
Merge branch 'dev' into feature/US-40 2021-08-08 13:01:54 -06:00
Mariela Bonilla eee67f3a92 Merge branch 'dev' into feature/US-66 2021-08-08 01:53:57 -06:00
Eduardo Quiros 3dbe2c5329
Merge pull request #114 from Quantum-P3/feature/US-35
add desactivar/activar plantilla
2021-08-08 07:52:17 +00:00
Mariela Bonilla 9db2bce4f8 Merge branch 'dev' into feature/US-66 2021-08-08 01:36:49 -06:00
Mariela Bonilla d9db75ec87 fix tests 2021-08-08 01:35:57 -06:00
Paola e2fbc4a607 tienda de plantillas y boton paypal 2021-08-08 00:51:16 -06:00
Mariela Bonilla 09d86ebaef Merge branch 'dev' into feature/US-35 2021-08-08 00:44:38 -06:00
Eduardo Quiros 3e0be442c8
Merge pull request #103 from Quantum-P3/feature/US-45
Feature/us 45
2021-08-08 06:43:11 +00:00
Eduardo Quiros 956f7e58fc
Merge pull request #113 from Quantum-P3/feature/US-34
add eliminar plantilla
2021-08-08 06:42:22 +00:00
Mariela Bonilla 6ca5860779 fix test 2021-08-08 00:05:39 -06:00
Mariela Bonilla e0076dfd25 Merge branch 'dev' into feature/US-34 2021-08-07 23:28:35 -06:00
Eduardo Quiros f1f2542963
Merge pull request #112 from Quantum-P3/feature/US-39
add visualizar plantillas compradas
2021-08-08 03:35:57 +00:00
Mariela Bonilla 75b7b2c180 add visualizar plantillas compradas 2021-08-07 03:30:50 -06:00
Eduardo Quiros 1c9f45db89
registrar respuestas 2021-08-07 00:13:48 -06:00
Eduardo Quiros aa5fddb08e
ampliar tamaño de textarea y agregar id 2021-08-06 23:03:59 -06:00
Eduardo Quiros bf6df60f00
eliminar console logs 2021-08-06 22:44:45 -06:00
Eduardo Quiros 622233ce3f
guardar en memoria info sobre opciones seleccionadas 2021-08-06 03:08:36 -06:00
Eduardo Quiros 48d7ad03b8
re-enable textarea para pregunta abierta 2021-08-06 00:10:36 -06:00
Eduardo Quiros 3ef564420b
no cargar encuesta si esta no tiene preguntas 2021-08-06 00:10:07 -06:00
Mariela Bonilla 2ed331130f add filtrar plantilla para administrador 2021-08-05 23:56:00 -06:00
Mariela Bonilla a336d41277 Merge branch 'feature/US-35' into feature/US-66 2021-08-05 23:05:02 -06:00
Mariela Bonilla 53899e2e31 add Cambiar estado de plantilla (activar y desactivar) 2021-08-05 02:27:58 -06:00
Mariela Bonilla 8e03a30733 Merge branch 'feature/US-34' into feature/US-35 2021-08-05 01:07:38 -06:00
Mariela Bonilla c218966a07 add eliminar plantilla 2021-08-05 00:48:49 -06:00
Paola 83c976356c fix imports 2021-08-04 11:30:00 -06:00
Eduardo Quiros aa046622c5
agregar llamado a confirmación de contraseña antes de cargar encuesta 2021-08-03 23:15:08 -06:00
Eduardo Quiros 44a83ba01a
agregar logica de evaluación de contraseña 2021-08-03 23:07:27 -06:00
Eduardo Quiros 2ae9407d7a
eliminar import innecesario 2021-08-03 23:00:43 -06:00
Eduardo Quiros fb77d2872e
eliminar codigo innecesario 2021-08-03 21:38:20 -06:00
Eduardo Quiros 9fdfcb0e1e
hacer que el botón en página principal solamente redirija a la encuesta 2021-08-03 21:00:25 -06:00
Eduardo Quiros 1edefeb357
agregar inicio de validación de contraseña 2021-08-03 20:36:37 -06:00
Paola 80e952bea5 fixes typos 2021-08-03 15:56:05 -06:00
Pablo Bonilla 55482cab09
Revert temporary change on surveys 2021-08-02 14:23:37 -06:00
Pablo Bonilla 1d06b6d84a
Add create survey from template 2021-08-02 14:20:16 -06:00
Eduardo Quiros c20df7fffd
Merge pull request #111 from Quantum-P3/dev
move to QA
2021-08-02 06:03:04 +00:00
Eduardo Quiros 82e7513a13
fix password test 2021-08-01 23:09:52 -06:00
Paola 208c85d73a arreglo de fix 2021-08-01 22:14:30 -06:00
Eduardo Quiros a0c729313b
mover validación de contraseña a solamente encuestas privadas 2021-08-01 22:13:05 -06:00
Eduardo Quiros 417c5ef33e
Merge branch 'dev' of github.com:Quantum-P3/datasurvey into feature/US-45 2021-08-01 21:59:16 -06:00
Eduardo Quiros e3852a7c72
Merge pull request #109 from Quantum-P3/feature/US-36
Add ver vista previa de una plantilla
2021-08-02 03:52:34 +00:00
Pablo Bonilla 1a15f686f0
Merge branch 'dev' into feature/US-36 2021-08-01 21:42:20 -06:00
Eduardo Quiros 6c668c8c3a
Merge pull request #108 from Quantum-P3/fix/templates-register
Fix survey template registration validations
2021-08-02 03:41:37 +00:00
Pablo Bonilla 994daddd7c
Remove test 2021-08-01 21:33:26 -06:00
Pablo Bonilla a503db206a
Add preview of survey templates 2021-08-01 21:21:49 -06:00
Pablo Bonilla 55c58358ff
Merge branch 'dev' into fix/templates-register 2021-08-01 20:36:01 -06:00
Pablo Bonilla 7cf2ac0e3e
Fix survey template register validations 2021-08-01 20:17:50 -06:00
Eduardo Quiros dced20025b
Merge pull request #107 from Quantum-P3/feature/US-43
add agregar colaboradores a encuestas
2021-08-02 01:15:30 +00:00
Mariela Bonilla 24cb50d483 eliminar opcion vacia de seleccionar rol 2021-08-01 19:09:47 -06:00
Mariela Bonilla af8394b222 validaciones y fix mensajes de correos 2021-08-01 19:05:42 -06:00
Mariela Bonilla 7545affd77 Merge branch 'dev' into feature/US-43 2021-08-01 18:14:09 -06:00
Mariela Bonilla 391c4fcb29 add agregar colaborador completo 2021-08-01 18:13:17 -06:00
Eduardo Quiros 91e5bcb96f
Merge pull request #106 from Quantum-P3/feature/US-30
Add publicar plantilla en tienda
2021-08-01 22:32:04 +00:00
Pablo Bonilla f8c15583ea
Merge branch 'dev' into feature/US-30 2021-08-01 16:23:18 -06:00
Eduardo Quiros 3e2b7fe2d6
Merge pull request #105 from Quantum-P3/feature/US-65
add filtrar por rol y estado
2021-08-01 22:20:37 +00:00
Pablo Bonilla f7eaccfca9
Merge branch 'dev' into feature/US-30 2021-08-01 16:20:28 -06:00
Pablo Bonilla 085d5a16a6
Add publish and delete survey template to/from the store 2021-08-01 16:18:53 -06:00
Mariela Bonilla b649ac4d4e Merge branch 'feature/US-65' into feature/US-43 2021-08-01 16:17:12 -06:00
Mariela Bonilla b72b286939 Merge branch 'feature/US-63' into feature/US-65 2021-08-01 16:05:45 -06:00
Mariela Bonilla e1d11a5bea add filtro por estado 2021-08-01 16:04:33 -06:00
Mariela Bonilla daa7f28d1a Merge branch 'dev' into feature/US-63 2021-08-01 15:32:22 -06:00
Eduardo Quiros 723bb6d2dc
Merge pull request #101 from Quantum-P3/feature/US-58
Feature/us 58
2021-08-01 21:29:44 +00:00
Mariela Bonilla 4e661cb10f Merge branch 'dev' into feature/US-63 2021-08-01 15:27:51 -06:00
Mariela Bonilla d038ebb819 add agregar colaborador 2021-08-01 15:25:27 -06:00
Paola 0a27c8d2db arreglar tamanno botones 2021-08-01 14:16:31 -06:00
Eduardo Quiros 4eefa86ffb
arreglar test de completar 2021-08-01 14:00:24 -06:00
Eduardo Quiros b45524111e
Merge pull request #102 from Quantum-P3/feature/US-33
Add crear plantilla
2021-08-01 19:55:15 +00:00
Eduardo Quiros 4f43f4f4cc
arreglar test 2021-08-01 13:53:59 -06:00
Pablo Bonilla 0943a984ca
Merge branch 'dev' into feature/US-33 2021-08-01 13:14:40 -06:00
Paola c5507dc2a7 arreglo merge conflict 2021-08-01 12:23:37 -06:00
Mariela Bonilla b068359da6 add modal add colaborador 2021-08-01 12:18:00 -06:00
Paola 9d310922e2 agregar boton y dialog de finalizar encuesta 2021-08-01 12:15:26 -06:00
Eduardo Quiros bcfd54d72a
corregir nombramiento de componente de completar encuestas 2021-08-01 12:14:21 -06:00
Eduardo Quiros e2e83e4cb5
agregar dialogo para confirmación de contraseña 2021-08-01 03:16:18 -06:00
Mariela Bonilla 184dc96556 Merge branch 'dev' into feature/US-43 2021-08-01 03:05:56 -06:00
Eduardo Quiros 1c2d8a3451
Merge pull request #100 from Quantum-P3/feature/US-44
add eliminar colaborador de encuesta
2021-08-01 08:05:17 +00:00
Mariela Bonilla 884a06f6dd change test 2021-08-01 01:29:53 -06:00
Eduardo Quiros 778aa72837
generar dialogo para contraseña de encuesta 2021-08-01 01:12:04 -06:00
Pablo Bonilla f8ab8ac0dd
Merge branch 'dev' into feature/US-33 2021-08-01 01:04:39 -06:00
Pablo Bonilla 089174935d
Remove tests 2021-08-01 01:04:15 -06:00
Pablo Bonilla 47f940dcaa
Add survey template question and options registration 2021-08-01 00:54:44 -06:00
Paola cbdaa03224 modificacion de botones compartir 2021-08-01 00:43:30 -06:00
Mariela Bonilla 9d59fc2346 add validaciones de permisos en las encuestas por rol de colaborador 2021-08-01 00:36:35 -06:00
Paola 45dffde982 arreglo share button 2021-08-01 00:16:06 -06:00
Paola b19757ff71 agreacion de botones compartir encuesta 2021-08-01 00:06:59 -06:00
Pablo Bonilla eb74718af3
Update survey template list 2021-07-31 22:52:17 -06:00
Mariela Bonilla a9f2e0b2a3 cambiar nombre id en html de eliminar colaborador dialog 2021-07-31 21:57:36 -06:00
Pablo Bonilla bc8ef1941b
Add register survey template 2021-07-31 21:53:35 -06:00
Mariela Bonilla a4df983b4f cerrar el modal del editar justo despues de eliminar al colaboradora 2021-07-31 21:36:57 -06:00
Mariela Bonilla c89e3bf1f9 Merge branch 'dev' into feature/US-44 2021-07-31 21:20:03 -06:00
Mariela Bonilla 2b51cacb7a Merge branch 'dev' into feature/US-63 2021-07-31 21:14:50 -06:00
Eduardo Quiros ba7b12fbdc
Merge pull request #99 from Quantum-P3/feature/US-62
add Modificar permisos de un colaborador
2021-08-01 02:56:07 +00:00
Eduardo Quiros b708f7e0c8
agregar pagina inicial para completar encuesta 2021-07-31 19:08:34 -06:00
Mariela Bonilla e5da2970f2 add eliminar colaborador de encuesta completo 2021-07-31 19:00:08 -06:00
Eduardo Quiros 988a1ca3ff
agregar componente de completar 2021-07-31 18:27:00 -06:00
Mariela Bonilla 0099b842c4 Merge branch 'feature/US-62' into feature/US-44 2021-07-31 01:29:39 -06:00
Mariela Bonilla 7cba3ac321 Merge branch 'dev' into feature/US-62 2021-07-31 01:26:37 -06:00
Mariela Bonilla 0d04c8d80c fix texto de boton de cancelar 2021-07-31 01:26:17 -06:00
Mariela Bonilla c3b03ee372 fix update rol de colaboradores 2021-07-31 01:25:31 -06:00
Eduardo Quiros 4a20bebc66
Merge pull request #98 from Quantum-P3/feature/US-25
Feature/us 25
2021-07-31 05:09:35 +00:00
Paola cf847e55f0 agregar carpeta compartir 2021-07-30 23:02:54 -06:00
Paola 6d096ebfa4 arreglo filter 2021-07-30 23:00:12 -06:00
Paola 81757a0f11 Merge branch 'dev' into feature/US-25 2021-07-30 22:08:35 -06:00
Paola 8b8c5af512 arreglo filter 2021-07-30 22:07:23 -06:00
Eduardo Quiros 7fab6ed892
Merge pull request #97 from Quantum-P3/feature/US-42
Add modificar pregunta
2021-07-30 16:54:03 +00:00
Pablo Bonilla fb1a399694
Add edit question name 2021-07-30 01:34:25 -06:00
Mariela Bonilla 089f508fa7 Merge branch 'dev' into feature/US-62 2021-07-30 00:29:58 -06:00
Mariela Bonilla 8efb844612 add modificar rol de colaborador 2021-07-30 00:21:31 -06:00
Eduardo Quiros 2a77c017fa
Merge pull request #95 from Quantum-P3/feature/US-31
Feature/us-31: listar plantillas para administrador
2021-07-30 06:08:09 +00:00
Eduardo Quiros fc06774ae6
Merge pull request #96 from Quantum-P3/feature/US-60
Add modificar encuestas
2021-07-30 06:05:25 +00:00
Eduardo Quiros c858e73a29
Arreglar traducción de listado de plantillas 2021-07-29 22:55:16 -06:00
Eduardo Quiros 0a774fc110
remover columnas innecesarias 2021-07-29 22:50:38 -06:00
Eduardo Quiros 14ec57ab12
corregir uso de inglés en html 2021-07-29 22:50:21 -06:00
Eduardo Quiros e1cf432fc3
agregar estilos de botones 2021-07-29 22:49:50 -06:00
Eduardo Quiros 4b3f1368a7
rehabilitar el link de plantillas en el sidebar 2021-07-29 22:35:19 -06:00
Eduardo Quiros d93378c56f
declarar no uso de index en trackid 2021-07-29 22:33:00 -06:00
Pablo Bonilla e615cb9d7c
Merge branch 'dev' into feature/US-60 2021-07-29 22:31:22 -06:00
Eduardo Quiros 21caf4c5a8
Merge pull request #94 from Quantum-P3/feature/US-61
add mostrar colaboradores de una encuesta
2021-07-30 04:18:22 +00:00
Pablo Bonilla 6f0ea69a27
Add edit survey from survey list 2021-07-29 22:15:36 -06:00
Mariela Bonilla f0f0fb4aa7 Merge branch 'feature/US-61' into feature/US-62 2021-07-29 21:37:56 -06:00
Pablo Bonilla 2e9564577f
Fix typo in password reset (finish state) 2021-07-29 21:26:19 -06:00
Mariela Bonilla 119290ecfa Merge branch 'dev' into feature/US-61 2021-07-29 21:21:27 -06:00
Eduardo Quiros b3b0f01db6
Merge pull request #93 from Quantum-P3/fix/lista-encuestas
fix del forbidden del listar encuesta y la muestra de fecha de vista previa
2021-07-30 03:12:17 +00:00
Mariela Bonilla 34c1076813 fix de del forbidden de la lista de encuesta y la fecha de vista previa 2021-07-29 20:17:16 -06:00
Pablo Bonilla 300f20affd
Add update survey 2021-07-29 02:10:39 -06:00
Eduardo Quiros bf04adc0ee
Merge pull request #92 from Quantum-P3/dev
Merge pull request #91 from Quantum-P3/main
2021-07-29 07:36:41 +00:00
Eduardo Quiros e5978890a8
Merge pull request #91 from Quantum-P3/main
Main
2021-07-29 07:26:51 +00:00
Mariela Bonilla 67a536989e add icono para agregar colaborador 2021-07-29 01:01:43 -06:00
Eduardo Quiros aabbecd43e
Merge pull request #90 from Quantum-P3/qa
dep
2021-07-29 06:30:51 +00:00
Eduardo Quiros e822e671c7
Merge pull request #89 from Quantum-P3/dev
QA
2021-07-29 06:23:02 +00:00
Eduardo Quiros 4cc71ac5dc
Merge pull request #88 from Quantum-P3/feature/US-25
agregacion pagina principal y arreglo footer
2021-07-29 06:18:05 +00:00
Paola ceb589ac20 eliminar punto en archivo activate 2021-07-28 23:38:49 -06:00
Paola 4b0a566537 agregacion pagina principal y arreglo footer 2021-07-28 23:26:29 -06:00
Mariela Bonilla 4a1393f804 Merge branch 'dev' into feature/US-61 2021-07-28 21:00:29 -06:00
Mariela Bonilla d4cda420de add mostrar colaboradores de una encuesta 2021-07-28 01:08:11 -06:00
Eduardo Quiros 340bfbb67f
Merge pull request #87 from Quantum-P3/qa
Qa
2021-07-28 05:44:54 +00:00
Eduardo Quiros 6f154c97e6
Merge pull request #86 from Quantum-P3/main
Main
2021-07-28 05:44:41 +00:00
Eduardo Quiros 64f2dfd8ee
Merge pull request #85 from Quantum-P3/dev
fix deploy
2021-07-28 05:44:23 +00:00
Eduardo Quiros ce78cc4b65
Merge pull request #84 from Quantum-P3/fix/user-list-edit-button
Remove view button from user list
2021-07-28 05:42:58 +00:00
Pablo Bonilla 26af353c3b
Remove view button from user list 2021-07-27 23:39:28 -06:00
Eduardo Quiros f838fc11a2
Merge pull request #83 from Quantum-P3/fix/delete-survey-user
Fix delete user survey
2021-07-28 05:07:59 +00:00
Pablo Bonilla b0c994bc42
Fix delete user survey 2021-07-27 23:01:53 -06:00
Eduardo Quiros 1e389341db
Merge pull request #81 from Quantum-P3/main
Main to dev
2021-07-27 07:46:14 +00:00
Eduardo Quiros 654b10ba62
Merge pull request #82 from Quantum-P3/main
Main to QA
2021-07-27 07:45:53 +00:00
Eduardo Quiros a2ab5d2dce
Merge pull request #80 from Quantum-P3/qa
dep
2021-07-27 07:22:29 +00:00
Eduardo Quiros 01fe76671b
Merge pull request #79 from Quantum-P3/dev
QA
2021-07-27 07:16:26 +00:00
Eduardo Quiros ba02aac8e3
Merge pull request #78 from Quantum-P3/feature/US-12
arreglo de estilos en landing y encuestas
2021-07-27 07:15:05 +00:00
Paola 07920751ff arreglo de estilos en landing y encuestas 2021-07-27 01:08:10 -06:00
Mariela Bonilla eb31ed41dd add filtrar colaboracion por estado 2021-07-27 00:59:15 -06:00
Mariela Bonilla 3a8a06abec Merge branch 'feature/US-63' into feature/US-65 2021-07-27 00:34:18 -06:00
Mariela Bonilla 3ce87a9c4c add listar colaboraciones de un usuario 2021-07-27 00:09:01 -06:00
Mariela Bonilla ca63cdfe88 Merge branch 'dev' into feature/US-63 2021-07-26 23:27:10 -06:00
Eduardo Quiros 1ade085444
Merge pull request #77 from Quantum-P3/fix/edit-duplicate-survey
Add duplicate functionality in context menu
2021-07-26 22:59:53 +00:00
Pablo Bonilla 7f534ee129
Merge branch 'dev' into fix/edit-duplicate-survey 2021-07-26 15:01:36 -06:00
Pablo Bonilla 6e7264b813
Add duplicate survey 2021-07-26 14:40:21 -06:00
Pablo Bonilla 3695c037b2
Add title and subtitle for categories and users 2021-07-26 13:21:18 -06:00
Pablo Bonilla 72c07e2bbf
Add duplicate button and fix delete button in survey list 2021-07-26 02:37:14 -06:00
Pablo Bonilla 306a2a0aaf
Update preview survey button position 2021-07-26 02:24:42 -06:00
Eduardo Quiros 1d6abd148c
Merge pull request #76 from Quantum-P3/feature/US-12
Feature/us 12
2021-07-26 07:35:11 +00:00
Paola dbf3551101 merge 2021-07-26 01:07:03 -06:00
Paola 39b355425d arreglo presentacion tabla 2021-07-26 01:01:02 -06:00
Pablo Bonilla 2b1c62a013
Add edit survey functionality in context menu 2021-07-26 00:55:41 -06:00
Eduardo Quiros 6262989496
Merge pull request #75 from Quantum-P3/fix/sprint-3/US-23
arreglar servicio de encuestas
2021-07-26 06:30:28 +00:00
Eduardo Quiros d02a2fd267
Merge pull request #74 from Quantum-P3/fix/design-dialog-table 2021-07-26 06:21:28 +00:00
Eduardo Quiros 9bc100f8af
Merge pull request #70 from Quantum-P3/feature/US-29 2021-07-26 06:20:50 +00:00
Eduardo Quiros 3439dcd202
arreglar servicio 2021-07-26 00:19:50 -06:00
Paola 8e51f11198 areglo landing page 2021-07-26 00:16:05 -06:00
Paola e5b23ac988 arreglo de alerta en publish 2021-07-26 00:12:50 -06:00
Mariela Bonilla ad96c0ee3b fix event dataset 2021-07-26 00:12:07 -06:00
Mariela Bonilla d6e1d32287 fix conflicts 2021-07-26 00:00:03 -06:00
Mariela Bonilla 54f4e2877c fix update encuesta 2021-07-25 23:42:12 -06:00
Mariela Bonilla b42ea0ad5a Merge branch 'dev' into feature/US-29 2021-07-25 22:59:04 -06:00
Paola e06e8a61dc arreglo validacion fechas min y max 2021-07-25 22:51:53 -06:00
Pablo Bonilla 0e3f49d1d2
Merge branch 'dev' into fix/design-dialog-table 2021-07-25 22:50:43 -06:00
Pablo Bonilla 188fd4bbc9
Fix dialog and tables design, email image size, and filter positions 2021-07-25 22:48:33 -06:00
Eduardo Quiros b248dac2e0
Merge pull request #73 from Quantum-P3/fix/sprint-3/US-23
notificar al usuario cuando un admin elimina su encuesta
2021-07-26 04:46:31 +00:00
Eduardo Quiros 74ed38d8a4
Merge pull request #72 from Quantum-P3/fix/sprint-3/US-21
corregir tildado de 'fecha creación'
2021-07-26 04:29:13 +00:00
Eduardo Quiros fd2391f68d
notificar al usuario cuando un admin elimina su encuesta 2021-07-25 22:19:27 -06:00
Eduardo Quiros 7e52f105f8
agregar default.nix 2021-07-25 21:09:03 -06:00
Eduardo Quiros a4badf7b7e
corregir tildado de 'fecha creación' 2021-07-25 21:09:03 -06:00
Eduardo Quiros 63c4a69ffe
traer configuracion de la plataforma
para parametrizar los dias minimos de diferencia
2021-07-25 20:20:37 -06:00
Eduardo Quiros 5b233a92d1
Merge pull request #71 from Quantum-P3/fix/publish-and-edit-validations 2021-07-26 01:46:36 +00:00
Eduardo Quiros 79dc958873
agregar comparacion inicial de fecha final
para evitar que se publique una encuesta con una fecha de finalización
que sea anterior a la fecha actual
2021-07-25 19:20:07 -06:00
Pablo Bonilla d65bd8b8ba
Add information modal for survey parameters 2021-07-25 17:58:59 -06:00
Mariela Bonilla adcb33193a fix estilo radio button 2021-07-25 17:07:09 -06:00
Mariela Bonilla 0eed427dc7 modify estilo radio button 2021-07-25 16:58:46 -06:00
Mariela Bonilla 8bb22a2602 modificaciones de visualizacion en vista previa 2021-07-25 16:48:21 -06:00
Pablo Bonilla 0201e121df
Fix context menu and delete survey bug (email) 2021-07-25 16:41:40 -06:00
Pablo Bonilla 577ae0e7ee
Remove edit survey publish survey button 2021-07-25 14:58:57 -06:00
Pablo Bonilla 0509b735ce
Fix list validation bug 2021-07-25 14:37:51 -06:00
Pablo Bonilla 07cd3484f5
Add survey list validations for empty and stateful surveys 2021-07-25 14:25:45 -06:00
Mariela Bonilla 5e441a343f add vista previa 2021-07-25 04:56:18 -06:00
Mariela Bonilla b85442e796 Merge branch 'dev' into feature/US-29 2021-07-25 02:42:16 -06:00
Eduardo Quiros d920ab39dc
Merge pull request #68 from Quantum-P3/fix/survey-contextmenu 2021-07-25 08:34:49 +00:00
Eduardo Quiros fefd4ad879
Merge pull request #69 from Quantum-P3/feature/US-12
Feature/us 12
2021-07-25 08:30:43 +00:00
Paola fcd87cb635 Arreglo mensajes alerta 2021-07-25 00:34:52 -06:00
Paola 4eec11079f Arreglo encuestas filter 2021-07-24 23:17:30 -06:00
Paola b5de3a3ee6 arreglo alerta categorias 2021-07-24 23:11:16 -06:00
Paola ea7db8269e merge conflict fix 2021-07-24 23:08:44 -06:00
Paola 6663fb729d agreacion contrasenna encuesta y arreglo cache 2021-07-24 22:53:38 -06:00
Pablo Bonilla 9fc9c133b1
Remove survey list error notification 2021-07-24 22:31:12 -06:00
Pablo Bonilla 68e4a27094
Add datasurvey custom filter styles 2021-07-24 22:25:03 -06:00
Pablo Bonilla e90c590f93
Fix survey list context menu 2021-07-24 22:12:50 -06:00
Eduardo Quiros 4fddf0b130
Merge pull request #67 from Quantum-P3/feature/US-57 2021-07-25 03:41:12 +00:00
Eduardo Quiros 8c56917d03
Merge branch 'dev' into feature/US-57 2021-07-25 03:30:49 +00:00
Eduardo Quiros 1a42dcbab0
Merge pull request #66 from Quantum-P3/feature/US-27
add eliminar encuestas del usuario
2021-07-25 03:28:49 +00:00
Eduardo Quiros bea3cf9115
Merge branch 'dev' into feature/US-27 2021-07-25 03:23:22 +00:00
Pablo Bonilla 6f36c86cee
Merge branch 'dev' into feature/US-57 2021-07-24 21:20:27 -06:00
Pablo Bonilla 6ca152cc85
Change create survey questions tests 2021-07-24 21:18:32 -06:00
Mariela Bonilla 1d7499266a fix conflictos 2021-07-24 21:03:23 -06:00
Eduardo Quiros a44419f097
Merge pull request #65 from Quantum-P3/feature/US-64 2021-07-25 02:45:52 +00:00
Mariela Bonilla fdb36ce2d7 Merge branch 'dev' into feature/US-27 2021-07-24 20:42:45 -06:00
Pablo Bonilla 2473ffbc5a
Add create either closed or open question modal form 2021-07-24 20:38:37 -06:00
Mariela Bonilla feb91b1871 fix correo de usuarios 2021-07-24 20:34:40 -06:00
Mariela Bonilla 569b4703d8 Merge branch 'dev' into feature/US-64 2021-07-24 18:52:18 -06:00
Eduardo Quiros cd2e7ed1e5
Merge pull request #63 from Quantum-P3/feature/US-24 2021-07-25 00:51:10 +00:00
Pablo Bonilla 28b291d031
Add delete option confirmation dialog 2021-07-24 18:44:26 -06:00
Mariela Bonilla c94ccc4332 add estilo de card a listar encuesta a usuario 2021-07-24 18:40:48 -06:00
Mariela Bonilla d400cbc2cb Merge branch 'dev' into feature/US-24 2021-07-24 18:29:18 -06:00
Mariela Bonilla faee58fcec Merge branch 'feature/US-57' into feature/US-29 2021-07-24 18:27:48 -06:00
Eduardo Quiros 8f10c73352
Merge pull request #62 from Quantum-P3/feature/landing-page 2021-07-25 00:26:13 +00:00
Pablo Bonilla 0932e0c7b6
Add delete question confirmation dialog 2021-07-24 18:22:37 -06:00
Mariela Bonilla c9d0e9e69a update loading por defecto de jhipster 2021-07-24 18:13:09 -06:00
Mariela Bonilla abdf174b0f Merge branch 'dev' into feature/landing-page 2021-07-24 18:04:12 -06:00
Mariela Bonilla 485cea8ec1 pass spec home 2021-07-24 17:53:56 -06:00
Mariela Bonilla 93de9c8540 Merge branch 'dev' into feature/US-24 2021-07-24 17:30:42 -06:00
Mariela Bonilla 6a79ff975e fix de filtrar encuestas 2021-07-24 17:29:33 -06:00
Eduardo Quiros e4027a9b9b
Merge pull request #61 from Quantum-P3/feature/landing-page 2021-07-24 22:54:36 +00:00
Mariela Bonilla 7d61742e40 cambios de html despues de merge 2021-07-24 16:52:36 -06:00
Mariela Bonilla 3ae0019c99 Merge branch 'dev' into feature/US-24 2021-07-24 16:30:54 -06:00
Mariela Bonilla dd13d33f8c Merge branch 'dev' into feature/US-64 2021-07-24 16:02:13 -06:00
Mariela Bonilla 1acd33b5b5 Merge branch 'dev' into feature/US-27 2021-07-24 16:01:43 -06:00
Mariela Bonilla 017fdd9c0b Merge branch 'dev' into feature/US-29 2021-07-24 15:57:10 -06:00
Mariela Bonilla 41e6600b2d pass home spec 2021-07-24 15:42:25 -06:00
Mariela Bonilla 9b5eefe38a Merge branch 'dev' into feature/landing-page 2021-07-24 15:11:50 -06:00
Mariela Bonilla e322714caa Merge remote-tracking branch 'origin/dev' into dev 2021-07-24 15:10:09 -06:00
Mariela Bonilla a5b49c3959 Revert "Merge branch 'feature/landing-page' into dev"
This reverts commit 4a79244727.
2021-07-24 15:06:39 -06:00
Mariela Bonilla 4a79244727 Merge branch 'feature/landing-page' into dev 2021-07-24 15:06:15 -06:00
Mariela Bonilla c4bc0d2d9a add estilos para cards 2021-07-24 15:05:28 -06:00
Mariela Bonilla 973aea76fe dejar solo 3 encuestas, agregar footer, agregar boton encuestas 2021-07-24 14:36:13 -06:00
Pablo Bonilla 4ccf240bd1
Merge branch 'dev' into feature/US-57 2021-07-24 12:52:20 -06:00
Mariela Bonilla c305c1d369 add filtro por nombre en la pagina principal 2021-07-24 03:40:14 -06:00
Mariela Bonilla 4710ed3d8c actualizacion del loading de la plataforma 2021-07-24 02:58:08 -06:00
Mariela Bonilla 808847f541 add lista de encuestas a landing page, modificaciones para prototipo 2021-07-24 02:49:55 -06:00
Pablo Bonilla 78e58ab69a
Add create question to survey list of questions 2021-07-24 02:10:24 -06:00
Eduardo Quiros f4cbb86dfb
Merge pull request #60 from Quantum-P3/feature/US-22
filtrar encuestas por nombre con pipe
2021-07-24 06:07:49 +00:00
Pablo Bonilla 0af94cd9f2
Fix bug in list of survey questions and options 2021-07-23 23:58:25 -06:00
Eduardo Quiros af582345de
filtrar encuestas por nombre con pipe 2021-07-23 23:57:19 -06:00
Eduardo Quiros 2729910ce6
Merge pull request #54 from Quantum-P3/feature/US-12 2021-07-24 05:42:47 +00:00
Paola 3e459cd133 Merge branch 'dev' into feature/US-12 2021-07-23 23:33:40 -06:00
Paola a126a4ae81 fix test 2021-07-23 23:33:32 -06:00
Eduardo Quiros 49d721e32f
Merge pull request #59 from Quantum-P3/feature/US-41
Feature/us 41
2021-07-24 05:22:46 +00:00
Paola 4d7dd16756 Merge branch 'dev' into feature/US-12 2021-07-23 23:07:40 -06:00
Paola 5e4210bf8e fix test 2.0 2021-07-23 23:03:39 -06:00
Paola 9f2809f61b Merge branch 'dev' into feature/US-41 2021-07-23 23:00:47 -06:00
Paola e5f1770031 fix test 2021-07-23 22:59:31 -06:00
Paola dcd6dfd5ef validaciones publicar encuesta 2021-07-23 22:50:40 -06:00
Pablo Bonilla 2302a615b9
Fix loading empty survey questions 2021-07-23 22:13:57 -06:00
Eduardo Quiros b48360f9aa
Merge pull request #58 from Quantum-P3/feature/US-23
Eliminar encuestas
2021-07-24 03:30:25 +00:00
Eduardo Quiros d928c260bb
eliminar test dado que prueba una funcionalidad que ya no está 2021-07-23 21:24:36 -06:00
Eduardo Quiros 23265b5519
filtrar encuestas DELETED en TS en lugar de HTML 2021-07-23 21:11:06 -06:00
Eduardo Quiros fe26d6fca2
prefijar index sin usar con '_' 2021-07-23 21:03:21 -06:00
Eduardo Quiros 0389cade62
arreglar lenguaje de template 2021-07-23 20:59:03 -06:00
Eduardo Quiros 5f2ea19515
marcar encuesta como DELETED en lugar de eliminarla 2021-07-23 20:58:11 -06:00
Eduardo Quiros 915441b07f
arreglar checkeo de isAdmin 2021-07-23 20:58:11 -06:00
Pablo Bonilla 1f24b5de73
Fix sidebar full name, logout spelling and SVG font, and size 2021-07-23 20:56:13 -06:00
Eduardo Quiros 0d07c7adc3
Merge pull request #57 from Quantum-P3/feature/US-21
mostrar encuestas en tabla para admin
2021-07-24 02:24:51 +00:00
Eduardo Quiros 1316a51a86
mostrar información pertinente para el administrador en lugar de llenar la tabla 2021-07-23 20:07:16 -06:00
Eduardo Quiros 3cd2a41aa2
arreglar traducciones en listado de encuestas 2021-07-23 20:07:15 -06:00
Eduardo Quiros c5bead0483
mostrar encuestas en tabla para admin 2021-07-23 19:25:38 -06:00
Eduardo Quiros 6f3378cb05
Merge pull request #56 from Quantum-P3/qa 2021-07-24 00:46:36 +00:00
Eduardo Quiros 3dcc2af577
Merge pull request #55 from Quantum-P3/dev 2021-07-24 00:34:37 +00:00
Paola a03c351578 arreglo error de suspended en log in 2021-07-23 15:59:49 -06:00
Paola 0bd50e331c arreglo validacion log in suspended 2021-07-23 13:50:18 -06:00
Mariela Bonilla 3bd65155e7 Merge branch 'dev' into feature/landing-page 2021-07-23 02:13:39 -06:00
Mariela Bonilla 1f92b07d5b modiicacion de estilo en la tabla de lista de usuarios 2021-07-23 02:08:39 -06:00
Mariela Bonilla 00b4046ba1 Add filtrar usuario 2021-07-23 02:05:55 -06:00
Pablo Bonilla 6595d3257b
Fix add new question option text typo 2021-07-23 01:27:49 -06:00
Pablo Bonilla 6b8cbe8b96
Add ability to delete options from closed questions 2021-07-23 01:20:43 -06:00
Pablo Bonilla aeb5538a4a
Add modal for question option creation 2021-07-23 01:00:40 -06:00
Paola 24eaed7fbc areglo de mensajes en correos 2021-07-23 01:00:32 -06:00
Mariela Bonilla 69fdc4c2f5 add ver vista previa en listado 2021-07-23 00:58:40 -06:00
Paola b57f2d485f Verificacion de estado log in 2021-07-23 00:41:12 -06:00
Mariela Bonilla 3d7ec93084 Add opcion de ver vista previa en la lista de encuestas 2021-07-22 23:24:12 -06:00
Pablo Bonilla 679a238c13
Add draft and active validation for the delete question button 2021-07-22 21:49:13 -06:00
Pablo Bonilla d2fd23675a
Add delete open question from edit survey 2021-07-22 21:47:11 -06:00
Pablo Bonilla 03d285868c
Add edit survey list and delete closed question 2021-07-22 21:34:05 -06:00
Paola 262897d07c modificacion de estado en el user 2021-07-22 19:32:39 -06:00
Mariela Bonilla 813f40cf6a add en flltro la opción de filtrar por encuestas FINISHED 2021-07-22 02:52:06 -06:00
Mariela Bonilla 9f4f87ef41 add Eliminar encuesta 2021-07-22 02:49:12 -06:00
Paola b04c75edd2 envio de correos en cambio de estado usuario 2021-07-22 01:51:08 -06:00
Pablo Bonilla 28aec2e60d
Fix survey list share button pointer event 2021-07-22 00:28:08 -06:00
Mariela Bonilla 8eeb1b24ae Merge branch 'dev' into feature/US-24 2021-07-21 22:39:43 -06:00
Mariela Bonilla 9fd9e22739 add filter by acceso y estado 2021-07-21 22:30:54 -06:00
Pablo Bonilla 954d609ed5
Merge branch 'dev' into feature/US-57 2021-07-21 20:29:39 -06:00
Eduardo Quiros 593905bf01
Merge pull request #53 from Quantum-P3/fix/mensajes-alerta
arreglo de mensajes en alertas y correo
2021-07-21 15:11:49 +00:00
Mariela Bonilla 8e22d769f6 add filtro de encuesta por nombre 2021-07-20 21:52:42 -06:00
Paola 15b3650697 arreglo de mensajes en alertas y correo 2021-07-19 15:46:24 -06:00
Eduardo Quiros c905854300
Merge pull request #52 from Quantum-P3/feature/US-20
Add listar encuestas del usuario
2021-07-19 18:17:55 +00:00
Pablo Bonilla 94d2bd402a
Merge branch 'dev' into feature/US-20 2021-07-19 12:05:40 -06:00
Eduardo Quiros 5bdcaa3db7
Merge pull request #51 from Quantum-P3/feature/US-04
Modificacion requeridas por QA para restablecer contraseña
2021-07-19 17:11:30 +00:00
Mariela Bonilla d7c68cfe53 Merge branch 'dev' into feature/US-04 2021-07-19 01:33:10 -06:00
Mariela Bonilla d9b78e1332 fix test register 2021-07-19 01:27:51 -06:00
Eduardo Quiros 90274a529d
Merge pull request #50 from Quantum-P3/qa
deploy final, sprint 2
2021-07-19 07:08:23 +00:00
Eduardo Quiros 376e99f0d7
Merge pull request #49 from Quantum-P3/dev
QA # 2 Sprint 2
2021-07-19 07:00:22 +00:00
Eduardo Quiros 2444c3da8a
Merge pull request #44 from Quantum-P3/feature/US-55
Arreglo de mensajes en alertas
2021-07-19 06:58:49 +00:00
Paola 9ccfce7eac Merge branch 'dev' into feature/US-55 2021-07-19 00:53:03 -06:00
Paola 9cb69a29b7 arreglo alertas de errores 2021-07-19 00:51:15 -06:00
Mariela Bonilla e814ba1950 cambios en tests de usuarios 2021-07-19 00:46:38 -06:00
Mariela Bonilla feacf4ac97 Merge branch 'dev' into feature/US-04 2021-07-19 00:44:32 -06:00
Eduardo Quiros 71a82122de
Merge pull request #47 from Quantum-P3/qa
deploy #1 sprint 2
2021-07-19 06:15:30 +00:00
Eduardo Quiros ddd715d6e3
Merge pull request #48 from Quantum-P3/dev
fix test fallido
2021-07-19 06:09:49 +00:00
Eduardo Quiros 55134f0524
Merge branch 'fix/sprint-2/eduardo' into dev 2021-07-19 00:08:50 -06:00
Eduardo Quiros a7f6f67874
arreglar test 2021-07-19 00:08:18 -06:00
Eduardo Quiros 099ac341b3
Merge pull request #46 from Quantum-P3/dev
qa sprint 2
2021-07-19 05:56:53 +00:00
Mariela Bonilla ef49fd235a Merge branch 'dev' into feature/US-04 2021-07-18 23:56:34 -06:00
Eduardo Quiros 5eafb8a5d0
Merge pull request #45 from Quantum-P3/fix/mensajes-alerta
Fix/mensajes alerta
2021-07-19 05:53:03 +00:00
Paola 35d3f87069 arreglos mensajes de alerta en crear categorias 2021-07-18 23:46:51 -06:00
Mariela Bonilla f1879a396a Merge branch 'dev' into feature/US-04 2021-07-18 23:33:54 -06:00
Mariela Bonilla 74438860d0 cambio de palabra en html de configuracion de parametros 2021-07-18 23:29:12 -06:00
Paola 17445e28b4 arreglos mensajes de alerta en categorias 2021-07-18 23:01:27 -06:00
Mariela Bonilla 6a50453a75 Merge branch 'dev' into feature/US-55 2021-07-18 22:41:40 -06:00
Mariela Bonilla 16cf1989aa cambios de textos y validaciones requeridos por QA 2021-07-18 22:40:47 -06:00
Mariela Bonilla 94b1e7ed8d modificacion de correo datasurvey en emails 2021-07-18 22:16:50 -06:00
Mariela Bonilla daf3b4ca87 Merge branch 'dev' into feature/US-55 2021-07-18 22:00:07 -06:00
Eduardo Quiros cfe03c45de
Merge pull request #43 from Quantum-P3/fix/sprint-2/eduardo
Fix/sprint 2/eduardo
2021-07-19 04:00:02 +00:00
Mariela Bonilla 0dfd0b58bf Merge branch 'dev' into feature/US-55 2021-07-18 21:59:33 -06:00
Eduardo Quiros 3ff738ef36
Merge branch 'dev' into fix/sprint-2/eduardo 2021-07-18 21:59:15 -06:00
Eduardo Quiros 017d6bd69b
eliminar debugger faltante 2021-07-18 21:57:44 -06:00
Mariela Bonilla 53aa021001 Modificacion si un firstName esta nulo 2021-07-18 21:57:02 -06:00
Eduardo Quiros 6ea08bacd4
arreglar actualización de encuestas 2021-07-18 21:56:20 -06:00
Eduardo Quiros 2e25dd8c2b
eliminar debugger 2021-07-18 21:51:06 -06:00
Eduardo Quiros 5dfce2c2a9
modificar solamente encuestas que coincidan 2021-07-18 21:41:51 -06:00
Eduardo Quiros e0728e27cd
solamente cargar encuestas 2021-07-18 21:41:26 -06:00
Eduardo Quiros aa2f31208e
cargar encuestas desde el inicio 2021-07-18 21:40:55 -06:00
Eduardo Quiros 6148fe09d4
cambiar verbos usados por modal 2021-07-18 21:38:13 -06:00
Eduardo Quiros 6986e3b16e
agregar toggle en lugar de eliminar 2021-07-18 20:57:20 -06:00
Eduardo Quiros 1d75fb6960
deshabilitar funciones de modificación para la categoría nula 2021-07-18 20:56:53 -06:00
Eduardo Quiros 42f1b2eeff
dejar de forzar la adición de "Otra" 2021-07-18 20:54:27 -06:00
Eduardo Quiros 389f24b578
Revert "Eliminar modulo de vista de categorias"
This reverts commit e3e9bb1fc5.
2021-07-18 18:09:29 -06:00
Mariela Bonilla 5d0c87d8d6 arreglo de mensajes, validaciones y textos del restablecer contraseñaa
arreglos requeridos por calidad de las validaciones: textos de las alertas, textos de subtitulos y verificar que un usuario que se logueó por Google no pueda restablecer la contraseña
2021-07-18 18:02:06 -06:00
Eduardo Quiros a700cd8c46
eliminar punto sobrante 2021-07-18 17:49:24 -06:00
Eduardo Quiros 50dba9d79b
mostrar nombre de categorías en mensajes de confirmación en lugar de ID 2021-07-18 17:48:49 -06:00
Eduardo Quiros e2f59ac3bc
centrar texto de diálogo de confirmación 2021-07-18 17:42:31 -06:00
Eduardo Quiros 08971ad9d8
Merge pull request #42 from Quantum-P3/fix/mensajes-alerta
arreglo de mensajes en alertas
2021-07-18 23:41:39 +00:00
Paola d9904613a9 areglo de mensajes en alertas 2021-07-18 17:13:28 -06:00
Pablo Bonilla 5fa5cda7f2
Add survey questions with their options respectively 2021-07-18 14:21:45 -06:00
Eduardo Quiros 08a88c750a
mostrar nombre de categoria en dialogo de confirmacion para eliminar 2021-07-18 12:46:07 -06:00
Eduardo Quiros da8c8e5039
quitar iconos de modificacion 2021-07-18 12:45:02 -06:00
Eduardo Quiros 0eec5f765d
corregir typo en password reset 2021-07-18 12:44:37 -06:00
Mariela Bonilla b730079e08 Merge branch 'dev' into feature/US-04 2021-07-18 03:40:45 -06:00
Mariela Bonilla 54e8824ca7 add landing page 2021-07-18 03:39:39 -06:00
Eduardo Quiros 8e9a148b16
Merge pull request #41 from Quantum-P3/feature/US-08
arreglo seleccion icono perfil y validacion password
2021-07-18 05:55:56 +00:00
Paola d25dc55d7b arreglo seleccion icono perfil y validacion password 2021-07-17 23:47:01 -06:00
Pablo Bonilla 3bee4e703c
Merge branch 'dev' into feature/US-20 2021-07-17 22:06:26 -06:00
Pablo Bonilla 5d2f9ef41d
Add star rating for each survey and restyled the card 2021-07-17 21:58:54 -06:00
Eduardo Quiros 01066239c2
Merge pull request #39 from Quantum-P3/feature/US-16
agregar borrado logico de categorias
2021-07-17 05:40:55 +00:00
Eduardo Quiros c4ecc4ac0a
eliminar test dado que no se ejecuta de esa manera ahora 2021-07-16 22:56:51 -06:00
Pablo Bonilla 982332d154
Update context menu on survey list, from english to spanish 2021-07-16 22:31:25 -06:00
Pablo Bonilla 5615833f24
Add custom context menu on survey list (implemented Create) 2021-07-16 22:27:34 -06:00
Eduardo Quiros 9f731e1003
Merge pull request #38 from Quantum-P3/feature/US-08
fix validaciones password
2021-07-17 02:50:36 +00:00
Paola d43af2f876 fix campo input password 2021-07-16 20:43:28 -06:00
Eduardo Quiros 8e7430d3f9
actualizar encuestas que tengan categoria borrada 2021-07-16 20:38:11 -06:00
Paola ff4a6d2194 fix validaciones password 2021-07-16 20:38:06 -06:00
Eduardo Quiros cfb979899f
asegurar existencia de categoria nula 2021-07-16 20:20:15 -06:00
Eduardo Quiros 4dfc8c7217
obtener encuestas para filtrado 2021-07-16 20:19:47 -06:00
Eduardo Quiros 81966f4310
organize imports 2021-07-16 20:14:08 -06:00
Eduardo Quiros 530340ada6
agregar servicios de encuesta
para eventualmente 'eliminar' la categoria de las encuestas que la
contengan
2021-07-16 18:23:03 -06:00
Eduardo Quiros 18ca4042ce
Merge pull request #37 from Quantum-P3/feature/US-04
Add Reestablecer contraseña
2021-07-16 23:20:39 +00:00
Mariela Bonilla c4d48183ec Merge branch 'dev' into feature/US-04 2021-07-16 16:05:19 -06:00
Eduardo Quiros 6e8aa263fd
Merge pull request #36 from Quantum-P3/feature/US-08
fix archivos
2021-07-16 21:13:34 +00:00
Paola 2009536345 fix archivos 2021-07-16 14:45:09 -06:00
Eduardo Quiros 413cace301
hotfix: arreglar package-lock.json 2021-07-16 13:50:34 -06:00
Eduardo Quiros 636ce6e90e
Merge pull request #34 from Quantum-P3/fix/estilos-paginas-redireccion
Modificación frontend de páginas y actualización redirecciones
2021-07-16 15:50:56 +00:00
Eduardo Quiros 8918cf8d65
Merge pull request #35 from Quantum-P3/feature/US-08
Feature/us 08
2021-07-16 15:50:22 +00:00
Paola 24babe41be Merge branch 'dev' into feature/US-08 2021-07-16 09:40:23 -06:00
Paola 3f61d3ab4b areglos archivos test 2021-07-16 09:37:52 -06:00
Mariela Bonilla 9f218ab546 Modificacion de la página de Activacion
Se arregló una validación y una traducción de activate.json
2021-07-16 05:02:26 -06:00
Mariela Bonilla ce170b230a Add Exception para cuando un correo no exista
Se agregó una excepción para cuando un usuario desee restablecer una contraseña e ingrese un correo inexistente
2021-07-16 04:56:44 -06:00
Mariela Bonilla 0ba88a4c49 Add Email para despues de restablecer contraseña 2021-07-16 04:56:44 -06:00
Mariela Bonilla ed51fa3694 Add reestablecer contraseña
se  implementó de mejor manera el reestablecer la contraseña
modificando y agregaron los estilos respectivos a ambas páginas del reestablcer contraseña y revisando que estuvieran los elementos adecuados y la funcionalidad adecuada
2021-07-16 04:56:44 -06:00
Pablo Bonilla ddd8ebcb97
Update date display for each survey in user survey list 2021-07-16 01:36:36 -06:00
Mariela Bonilla 0092d87aae Merge branch 'dev' into feature/US-04 2021-07-15 23:12:15 -06:00
Mariela Bonilla 5bdf1deec1 Merge branch 'dev' into fix/estilos-paginas-redireccion 2021-07-15 22:55:59 -06:00
Pablo Bonilla f76af324a0
Add icon for survey access 2021-07-15 22:26:34 -06:00
Paola f349ee6020 modificacion perfil passwords fix 2021-07-15 22:07:23 -06:00
Eduardo Quiros b021a46162
Merge pull request #33 from Quantum-P3/feature/US-55
arreglo de estilos y redireccion de los parametros de configuracion
2021-07-16 01:51:04 +00:00
Paola 167ff39036 arreglo input password perfil 2021-07-15 15:08:53 -06:00
Mariela Bonilla 3a9f643f6b add url datasurvey.org a correos 2021-07-15 02:34:14 -06:00
Mariela Bonilla ade37077cc Arreglo de estilos en las paginas
Se modificó la página de activación de cuenta, ya estaba desactualizada
se agregó un height:100% al registro para que el fondo quedará completamente coloreado y no se vieran dos colores
2021-07-15 02:29:31 -06:00
Mariela Bonilla d8268b9ec2 Modificacion de correos
Se modifica el correo de reestablecer contraseña y el de activación de cuenta
2021-07-15 02:25:51 -06:00
Pablo Bonilla 1b0052f4d6
Update survey list styles and add survey state circular pulse animation 2021-07-15 01:18:19 -06:00
Eduardo Quiros 6a25173ad8
agregar underscore al variable index
esto se debe a que no se utiliza en la funcion, por lo que puede ser no
utilizable en la llamada de la funcion
2021-07-14 21:11:34 -06:00
Eduardo Quiros a7383be03a
actualizar categoria como INACTIVE
esto es en lugar de eliminarlos de la base de datos, para mantener en
existencia las entradas
2021-07-14 20:49:19 -06:00
Eduardo Quiros 3fd224f4d4
hacer que el metodo de eliminacion use la categoria entera
esto es para eventualmente reemplazarla por un update
2021-07-14 20:39:01 -06:00
Eduardo Quiros fa906eb8dc
corregir nombrado en texto por defecto 2021-07-14 20:38:41 -06:00
Paola b183dce88a arreglo validaciones en password perfil 2021-07-14 20:04:35 -06:00
Mariela Bonilla d4cdf2ba50 Merge branch 'dev' into feature/US-55 2021-07-14 20:00:33 -06:00
Mariela Bonilla 68f55cab3e update redireccion de sidebar para los parametros de configuracion
se cambia de /parametro-aplicacion/1/view a /parametro-aplicacion/1/edit
2021-07-14 19:58:25 -06:00
Mariela Bonilla 3bfd4cf2b3 update estilo de los parametros de configuracion
se modifica correctamente los div de los form-groups
2021-07-14 19:55:53 -06:00
Eduardo Quiros e3e9bb1fc5
Eliminar modulo de vista de categorias
Este modulo no esta en uso. Por lo que es mejor eliminarlo para evitar
que se acumule mucho codigo muerto.
2021-07-14 19:40:25 -06:00
Paola 02ba91e2b3 Merge branch 'dev' into feature/US-08 2021-07-14 18:52:15 -06:00
Paola a063346fe1 arreglo modificacion contrasenna perfil 2021-07-14 18:50:58 -06:00
Eduardo Quiros e983ad3ea9
Merge pull request #32 from Quantum-P3/feature/US-55
add configuración de parámetros de la aplicación
2021-07-15 00:15:33 +00:00
Mariela Bonilla c68ff31aab Cambios adicionales
add url de estilos de la lista de usuarios
2021-07-14 18:07:27 -06:00
Mariela Bonilla 664122f833 Merge branch 'dev' into feature/US-55 2021-07-14 02:11:58 -06:00
Mariela Bonilla 56d74c5e11 Add Configuración de Parámetros
se realizó la historia de usuario 55
2021-07-14 02:09:48 -06:00
Pablo Bonilla 559210768c
Update survey entity interaction inside list 2021-07-14 01:36:26 -06:00
Pablo Bonilla be97c9f4bc
Update visualization of user surveys 2021-07-14 00:23:05 -06:00
Paola 0f673a8407 Merge branch 'dev' into feature/US-08 2021-07-13 21:51:22 -06:00
Paola ab65108475 Validacion fecha para modifcacion perfil 2021-07-13 21:49:46 -06:00
Paola 48a894c455 Alertas modificacion usuario 2021-07-13 20:27:28 -06:00
Eduardo Quiros 2ec4f95ee3
Merge pull request #31 from Quantum-P3/feature/US-19
Add crear encuestas
2021-07-14 01:17:35 +00:00
Paola 07e9d80c57 Validacion Google para modificar perfil 2021-07-13 15:02:00 -06:00
Pablo Bonilla efb6797f83
Add create another survey in modal 2021-07-13 01:28:52 -06:00
Pablo Bonilla 0890e4c2d4
Merge branch 'dev' into feature/US-19 2021-07-13 00:06:47 -06:00
Pablo Bonilla 941dc132c0
Update manifest.webapp CSP 2021-07-12 22:39:17 -06:00
Pablo Bonilla 7208510d22
Update index script-src-elem CSP 2021-07-12 22:17:04 -06:00
Pablo Bonilla bfbe0f9c5a
Update index allow-all CSP 2021-07-12 20:35:55 -06:00
Pablo Bonilla f8f03aa4c7
Update index CSP 2021-07-12 20:09:33 -06:00
Pablo Bonilla fc84f726ae
Update index with CSP 2021-07-12 19:40:09 -06:00
Mariela Bonilla d678a7bbab Merge branch 'dev' into feature/US-55 2021-07-12 19:13:24 -06:00
Eduardo Quiros 77636c270a
Merge pull request #30 from Quantum-P3/qa
emergency google auth fix into main
2021-07-12 06:59:38 +00:00
Eduardo Quiros cd82ee53f3
Merge pull request #29 from Quantum-P3/dev
emergency fix for google auth
2021-07-12 06:48:42 +00:00
Eduardo Quiros df560f0b88
Merge pull request #28 from Quantum-P3/feature/US-01-prod-fix
Fix Google login in production (Content Security Policy)
2021-07-12 06:44:19 +00:00
Pablo Bonilla a11623d745
Fix Google login in production (Content Security Policy) 2021-07-12 00:38:52 -06:00
Eduardo Quiros d9a3a34d5a
Merge pull request #27 from Quantum-P3/qa
Sprint 1 Done
2021-07-12 06:00:21 +00:00
Eduardo Quiros a1d63f1b71
Merge pull request #26 from Quantum-P3/dev
arreglos finales de sprint 1
2021-07-12 05:48:37 +00:00
Eduardo Quiros e86e81ad81
Merge pull request #25 from Quantum-P3/fix/sprint-1
Fix/sprint 1
2021-07-12 05:39:32 +00:00
Eduardo Quiros 03f8faa23a
usar verbaje acordado para registros 2021-07-11 23:33:20 -06:00
Eduardo Quiros fa326f666b
corregir tilde faltante en cierre de sesion 2021-07-11 23:33:05 -06:00
Eduardo Quiros d2b529d371
validacion de categorias ahora es case insensitive 2021-07-11 23:32:45 -06:00
Eduardo Quiros fe714b9eaa
validar email correctamente 2021-07-11 23:32:23 -06:00
Eduardo Quiros 2e4c47dff5
arreglar estilos 2021-07-11 23:32:06 -06:00
Eduardo Quiros 9e16b3d39a
Merge pull request #24 from Quantum-P3/node-testing-dev
agregar pruebas de node.js a dev y PRs
2021-07-12 05:30:11 +00:00
Eduardo Quiros 8350672ebd
agregar pruebas de node.js a dev y PRs 2021-07-11 23:30:01 -06:00
Eduardo Quiros 248df5af66
Merge pull request #23 from Quantum-P3/fix/log-in
Fix/log in
2021-07-12 04:44:54 +00:00
Paola 0235a95716 cambio de texto en validacion 3.0 2021-07-11 22:37:44 -06:00
Paola dddb15f125 Merge branch 'dev' into fix/log-in 2021-07-11 22:36:48 -06:00
Paola 83d8add038 cambio de texto en validacion 2.0 2021-07-11 22:32:30 -06:00
Paola 7d241302f9 cambio de texto en validacion 2021-07-11 22:28:52 -06:00
Eduardo Quiros 29c5ae52ad
Merge pull request #22 from Quantum-P3/feature/US-07
Cambios solicitados por QA paraUS-07
2021-07-12 04:01:43 +00:00
Mariela Bonilla 5c892b296a Cambio estilo de botones 2021-07-11 21:40:38 -06:00
Mariela Bonilla 766e41010f Merge branch 'dev' into feature/US-07 2021-07-11 20:54:06 -06:00
Eduardo Quiros 0857cb459c
Merge pull request #21 from Quantum-P3/feature/US-06-fix
Fix US-06 user and admin registration form validations and styles
2021-07-12 02:44:36 +00:00
Mariela Bonilla 6db4b9574a Nuevos cambios de QA respecto a estilos
Se arreglaron estilos de botones
2021-07-11 20:39:20 -06:00
Mariela Bonilla 86dfd8c8fd Merge branch 'dev' into feature/US-07 2021-07-11 20:13:28 -06:00
Mariela Bonilla a0b1ab6975 Merge remote-tracking branch 'origin/feature/US-07' into feature/US-07 2021-07-11 20:12:43 -06:00
Mariela Bonilla dffa859e7d Cambios solicitados por QA
Se realizaron los cambios que QA solicitó realizar, además de algunas de arreglar algunas traducciones del inglés al español
2021-07-11 20:12:22 -06:00
Mariela Bonilla 73a6397133 Cambios solicitador por QA
Se realizaron los cambios que QA solicitó realizar, además de algunas de arreglar algunas traducciones del inglés al español
2021-07-11 20:09:56 -06:00
Mariela Bonilla ec4f092b72 Merge branch 'dev' into feature/US-07 2021-07-11 18:51:18 -06:00
Pablo Bonilla 046d97af33
Add jQuery and fix modal close on register survey 2021-07-11 01:17:12 -06:00
Pablo Bonilla 762129cdb8
Add register survey 2021-07-10 23:13:52 -06:00
Eduardo Quiros 910c6cd669
Merge pull request #17 from Quantum-P3/dev
Iniciar testing Sprint 1
2021-07-11 05:02:41 +00:00
Pablo Bonilla c4dd44716c
Add data survey custom select styles 2021-07-10 22:16:42 -06:00
Pablo Bonilla 792e80081b
Transfer survey registration logic to survey list component 2021-07-10 21:29:19 -06:00
Pablo Bonilla 1775367239
Add register survey modal initialization 2021-07-10 20:32:53 -06:00
Pablo Bonilla e36b885f61
Add data survey custom modal styles 2021-07-10 20:31:33 -06:00
Pablo Bonilla 5bcfd43445
Update user profile save buttons 2021-07-10 16:41:57 -06:00
Pablo Bonilla 3c9a1a1617
Update input read-only and text selection styles 2021-07-10 16:20:53 -06:00
Mariela Bonilla 8ed59685d2 Merge branch 'dev' into feature/US-55 2021-07-09 22:05:27 -06:00
Mariela Bonilla 84a347a0f0 nuevos cambios US-55 2021-07-09 22:04:32 -06:00
Mariela Bonilla 8b5557c2a6 configuracion de parametros
agregar de la lista de parametros, el perfil de parametros
2021-07-09 22:03:40 -06:00
Pablo Bonilla 8aa20ce02b
Merge pull request #6 from Quantum-P3/qa
Fix account activation mail base-url
2021-07-04 19:22:17 -06:00
Pablo Bonilla dc6dc0944f
Merge pull request #5 from Quantum-P3/dev
Fix account activation URL
2021-07-04 19:13:59 -06:00
Pablo Bonilla 7ae058389e
Merge pull request #3 from Quantum-P3/qa
Deploy registrar usuario final por medio de la plataforma
2021-07-04 02:10:29 -06:00
Pablo Bonilla 1c35b4799b
Merge pull request #2 from Quantum-P3/dev
Test registro de usuario en plataforma
2021-07-04 02:00:59 -06:00
522 changed files with 34724 additions and 4419 deletions

31
.github/workflows/node.js.yml vendored Normal file
View File

@ -0,0 +1,31 @@
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: Node.js CI
on:
push:
branches: [ dev ]
pull_request:
branches: [ dev ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.x, 14.x, 16.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: npm run build --if-present
- run: npm test

View File

@ -43,9 +43,21 @@
{ "glob": "axios.min.js", "input": "./node_modules/axios/dist", "output": "swagger-ui" }, { "glob": "axios.min.js", "input": "./node_modules/axios/dist", "output": "swagger-ui" },
{ "glob": "**/*", "input": "src/main/webapp/swagger-ui/", "output": "swagger-ui" } { "glob": "**/*", "input": "src/main/webapp/swagger-ui/", "output": "swagger-ui" }
], ],
"styles": ["src/main/webapp/content/scss/paper-dashboard.scss", "./node_modules/swiper/swiper-bundle.min.css"], "styles": [
"src/main/webapp/content/scss/paper-dashboard.scss",
"./node_modules/swiper/swiper-bundle.min.css",
"node_modules/chartist/dist/chartist.css"
],
"scripts": [ "scripts": [
"src/main/webapp/content/js/bootstrap.min.js", "./node_modules/jquery/dist/jquery.min.js",
"src/main/webapp/content/js/jquery.bootstrap.wizard.min.js",
"src/main/webapp/content/js/jquery.datatables.js",
"src/main/webapp/content/js/jquery.easypiechart.min.js",
"src/main/webapp/content/js/jquery.validate.min.js",
"src/main/webapp/content/js/jquery-jvectormap.js",
"src/main/webapp/content/js/jquery-ui.min.js",
"src/main/webapp/content/js/bootstrap.bundle.min.js",
"src/main/webapp/content/js/moment.min.js",
"src/main/webapp/content/js/bootstrap-datetimepicker.js", "src/main/webapp/content/js/bootstrap-datetimepicker.js",
"src/main/webapp/content/js/bootstrap-notify.js", "src/main/webapp/content/js/bootstrap-notify.js",
"src/main/webapp/content/js/bootstrap-selectpicker.js", "src/main/webapp/content/js/bootstrap-selectpicker.js",
@ -54,19 +66,12 @@
"src/main/webapp/content/js/chartist.min.js", "src/main/webapp/content/js/chartist.min.js",
"src/main/webapp/content/js/es6-promise-auto.min.js", "src/main/webapp/content/js/es6-promise-auto.min.js",
"src/main/webapp/content/js/fullcalendar.min.js", "src/main/webapp/content/js/fullcalendar.min.js",
"src/main/webapp/content/js/jquery.bootstrap.wizard.min.js",
"src/main/webapp/content/js/jquery.datatables.js",
"src/main/webapp/content/js/jquery.easypiechart.min.js",
"src/main/webapp/content/js/jquery.validate.min.js",
"src/main/webapp/content/js/jquery-3.1.1.min.js",
"src/main/webapp/content/js/jquery-jvectormap.js",
"src/main/webapp/content/js/jquery-ui.min.js",
"src/main/webapp/content/js/moment.min.js",
"src/main/webapp/content/js/nouislider.min.js", "src/main/webapp/content/js/nouislider.min.js",
"src/main/webapp/content/js/paper-dashboard.js",
"src/main/webapp/content/js/perfect-scrollbar.min.js", "src/main/webapp/content/js/perfect-scrollbar.min.js",
"src/main/webapp/content/js/sweetalert2.js", "src/main/webapp/content/js/sweetalert2.js",
"./node_modules/swiper/swiper-bundle.min.js" "./node_modules/swiper/swiper-bundle.min.js",
"src/main/webapp/content/js/paper-dashboard.js",
"src/main/webapp/content/js/api-google-platform.js"
] ]
}, },
"configurations": { "configurations": {

3020
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -58,7 +58,8 @@
"preci:e2e:server:start": "npm run docker:db:await --if-present && npm run docker:others:await --if-present", "preci:e2e:server:start": "npm run docker:db:await --if-present && npm run docker:others:await --if-present",
"ci:e2e:server:start": "java -jar target/e2e.$npm_package_config_packaging --spring.profiles.active=$npm_package_config_default_environment -Dlogging.level.ROOT=OFF -Dlogging.level.org.zalando=OFF -Dlogging.level.tech.jhipster=OFF -Dlogging.level.org.datasurvey=OFF -Dlogging.level.org.springframework=OFF -Dlogging.level.org.springframework.web=OFF -Dlogging.level.org.springframework.security=OFF --logging.level.org.springframework.web=ERROR", "ci:e2e:server:start": "java -jar target/e2e.$npm_package_config_packaging --spring.profiles.active=$npm_package_config_default_environment -Dlogging.level.ROOT=OFF -Dlogging.level.org.zalando=OFF -Dlogging.level.tech.jhipster=OFF -Dlogging.level.org.datasurvey=OFF -Dlogging.level.org.springframework=OFF -Dlogging.level.org.springframework.web=OFF -Dlogging.level.org.springframework.security=OFF --logging.level.org.springframework.web=ERROR",
"ci:frontend:build": "npm run webapp:build:$npm_package_config_default_environment", "ci:frontend:build": "npm run webapp:build:$npm_package_config_default_environment",
"ci:frontend:test": "npm run ci:frontend:build && npm test" "ci:frontend:test": "npm run ci:frontend:build && npm test",
"postinstall": "ngcc"
}, },
"config": { "config": {
"backend_port": 8080, "backend_port": 8080,
@ -66,6 +67,7 @@
"packaging": "jar" "packaging": "jar"
}, },
"dependencies": { "dependencies": {
"@angular/cdk": "^12.1.4",
"@angular/common": "12.0.5", "@angular/common": "12.0.5",
"@angular/compiler": "12.0.5", "@angular/compiler": "12.0.5",
"@angular/core": "12.0.5", "@angular/core": "12.0.5",
@ -74,17 +76,28 @@
"@angular/platform-browser": "12.0.5", "@angular/platform-browser": "12.0.5",
"@angular/platform-browser-dynamic": "12.0.5", "@angular/platform-browser-dynamic": "12.0.5",
"@angular/router": "12.0.5", "@angular/router": "12.0.5",
"@fortawesome/angular-fontawesome": "0.9.0", "@fortawesome/angular-fontawesome": "^0.9.0",
"@fortawesome/fontawesome-svg-core": "1.2.35", "@fortawesome/fontawesome-svg-core": "^1.2.35",
"@fortawesome/free-solid-svg-icons": "5.15.3", "@fortawesome/free-brands-svg-icons": "^5.15.3",
"@fortawesome/free-solid-svg-icons": "^5.15.3",
"@ng-bootstrap/ng-bootstrap": "9.1.3", "@ng-bootstrap/ng-bootstrap": "9.1.3",
"@ngx-translate/core": "13.0.0", "@ngx-translate/core": "13.0.0",
"@ngx-translate/http-loader": "6.0.0", "@ngx-translate/http-loader": "6.0.0",
"@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",
"dayjs": "1.10.5", "dayjs": "1.10.5",
"file-saver": "^2.0.5",
"jquery": "^3.6.0",
"jspdf": "^2.3.1",
"jw-angular-social-buttons": "^1.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-sharebuttons": "^8.0.5",
"ngx-webstorage": "8.0.0", "ngx-webstorage": "8.0.0",
"rxjs": "6.6.7", "rxjs": "6.6.7",
"sockjs-client": "1.5.0", "sockjs-client": "1.5.0",
@ -92,6 +105,7 @@
"swiper": "^6.7.5", "swiper": "^6.7.5",
"tslib": "2.3.0", "tslib": "2.3.0",
"webstomp-client": "1.2.6", "webstomp-client": "1.2.6",
"xlsx": "^0.17.0",
"zone.js": "0.11.4" "zone.js": "0.11.4"
}, },
"devDependencies": { "devDependencies": {
@ -101,7 +115,11 @@
"@angular/cli": "12.0.4", "@angular/cli": "12.0.4",
"@angular/compiler-cli": "12.0.5", "@angular/compiler-cli": "12.0.5",
"@angular/service-worker": "12.0.5", "@angular/service-worker": "12.0.5",
"@types/bootstrap": "^5.0.17",
"@types/chartist": "^0.11.1",
"@types/file-saver": "^2.0.3",
"@types/jest": "26.0.23", "@types/jest": "26.0.23",
"@types/jquery": "^3.5.6",
"@types/node": "15.12.2", "@types/node": "15.12.2",
"@types/sockjs-client": "1.5.0", "@types/sockjs-client": "1.5.0",
"@typescript-eslint/eslint-plugin": "4.27.0", "@typescript-eslint/eslint-plugin": "4.27.0",

View File

@ -318,6 +318,12 @@
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>
<artifactId>spring-security-messaging</artifactId> <artifactId>spring-security-messaging</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>4.0.0-2</version>
</dependency>
<!-- jhipster-needle-maven-add-dependency --> <!-- jhipster-needle-maven-add-dependency -->
</dependencies> </dependencies>

View File

@ -24,13 +24,13 @@ public class CacheConfiguration {
private final javax.cache.configuration.Configuration<Object, Object> jcacheConfiguration; private final javax.cache.configuration.Configuration<Object, Object> jcacheConfiguration;
public CacheConfiguration(JHipsterProperties jHipsterProperties) { public CacheConfiguration(JHipsterProperties jHipsterProperties) {
JHipsterProperties.Cache.Ehcache ehcache = jHipsterProperties.getCache().getEhcache(); //JHipsterProperties.Cache.Ehcache ehcache = jHipsterProperties.getCache().getEhcache();
jcacheConfiguration = jcacheConfiguration =
Eh107Configuration.fromEhcacheCacheConfiguration( Eh107Configuration.fromEhcacheCacheConfiguration(
CacheConfigurationBuilder CacheConfigurationBuilder
.newCacheConfigurationBuilder(Object.class, Object.class, ResourcePoolsBuilder.heap(ehcache.getMaxEntries())) .newCacheConfigurationBuilder(Object.class, Object.class, ResourcePoolsBuilder.heap(100L))
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(ehcache.getTimeToLiveSeconds()))) .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(1)))
.build() .build()
); );
} }
@ -82,6 +82,7 @@ public class CacheConfiguration {
private void createCache(javax.cache.CacheManager cm, String cacheName) { private void createCache(javax.cache.CacheManager cm, String cacheName) {
javax.cache.Cache<Object, Object> cache = cm.getCache(cacheName); javax.cache.Cache<Object, Object> cache = cm.getCache(cacheName);
if (cache != null) { if (cache != null) {
cache.clear(); cache.clear();
} else { } else {

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

@ -64,7 +64,7 @@ public class UsuarioExtra implements Serializable {
joinColumns = @JoinColumn(name = "usuario_extra_id"), joinColumns = @JoinColumn(name = "usuario_extra_id"),
inverseJoinColumns = @JoinColumn(name = "plantilla_id") inverseJoinColumns = @JoinColumn(name = "plantilla_id")
) )
@JsonIgnoreProperties(value = { "pPreguntaCerradas", "pPreguntaAbiertas", "categoria", "usuarioExtras" }, allowSetters = true) @JsonIgnoreProperties(value = { "pPreguntaCerradas", "pPreguntaAbiertas", "usuarioExtras" }, allowSetters = true)
private Set<Plantilla> plantillas = new HashSet<>(); private Set<Plantilla> plantillas = new HashSet<>();
// jhipster-needle-entity-add-field - JHipster will add fields here // jhipster-needle-entity-add-field - JHipster will add fields here

View File

@ -1,7 +1,8 @@
package org.datasurvey.repository; package org.datasurvey.repository;
import org.datasurvey.domain.Categoria; import org.datasurvey.domain.Categoria;
import org.springframework.data.jpa.repository.*; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
/** /**

View File

@ -4,7 +4,10 @@ import java.nio.charset.StandardCharsets;
import java.util.Locale; import java.util.Locale;
import javax.mail.MessagingException; import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage;
import org.datasurvey.domain.Factura;
import org.datasurvey.domain.User; import org.datasurvey.domain.User;
import org.datasurvey.domain.UsuarioEncuesta;
import org.datasurvey.domain.UsuarioExtra;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
@ -29,6 +32,10 @@ public class MailService {
private static final String USER = "user"; private static final String USER = "user";
private static final String CONTRASENNA = "contrasenna";
private static final String FACTURA = "factura";
private static final String BASE_URL = "baseUrl"; private static final String BASE_URL = "baseUrl";
private final JHipsterProperties jHipsterProperties; private final JHipsterProperties jHipsterProperties;
@ -92,6 +99,54 @@ public class MailService {
sendEmail(user.getEmail(), subject, content, false, true); sendEmail(user.getEmail(), subject, content, false, true);
} }
@Async
public void sendEmailFromTemplateEncuesta(User user, String templateName, String titleKey, String contrasenna) {
if (user.getEmail() == null) {
log.debug("Email doesn't exist for user '{}'", user.getLogin());
return;
}
Locale locale = Locale.forLanguageTag(user.getLangKey());
Context context = new Context(locale);
context.setVariable(CONTRASENNA, contrasenna);
context.setVariable(USER, user);
context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl());
String content = templateEngine.process(templateName, context);
String subject = messageSource.getMessage(titleKey, null, locale);
sendEmail(user.getEmail(), subject, content, false, true);
}
@Async
public void sendEmailFromTemplateUsuarioEncuesta(User user, UsuarioEncuesta usuarioEncuesta, String templateName, String titleKey) {
if (user.getEmail() == null) {
log.debug("Email doesn't exist for user '{}'", user.getLogin());
return;
}
Locale locale = Locale.forLanguageTag(user.getLangKey());
Context context = new Context(locale);
context.setVariable(USER, user);
context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl());
context.setVariable("colaborador", usuarioEncuesta);
String content = templateEngine.process(templateName, context);
String subject = messageSource.getMessage(titleKey, null, locale);
sendEmail(user.getEmail(), subject, content, false, true);
}
@Async
public void sendEmailFromTemplateFactura(User user, Factura factura, String templateName, String titleKey) {
if (user.getEmail() == null) {
log.debug("Email doesn't exist for user '{}'", user.getLogin());
return;
}
Locale locale = Locale.forLanguageTag(user.getLangKey());
Context context = new Context(locale);
context.setVariable(USER, user);
context.setVariable(FACTURA, factura);
context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl());
String content = templateEngine.process(templateName, context);
String subject = messageSource.getMessage(titleKey, null, locale);
sendEmail(user.getEmail(), subject, content, false, true);
}
@Async @Async
public void sendActivationEmail(User user) { public void sendActivationEmail(User user) {
log.debug("Sending activation email to '{}'", user.getEmail()); log.debug("Sending activation email to '{}'", user.getEmail());
@ -109,4 +164,68 @@ public class MailService {
log.debug("Sending password reset email to '{}'", user.getEmail()); log.debug("Sending password reset email to '{}'", user.getEmail());
sendEmailFromTemplate(user, "mail/passwordResetEmail", "email.reset.title"); sendEmailFromTemplate(user, "mail/passwordResetEmail", "email.reset.title");
} }
@Async
public void sendPasswordRestoredMail(User user) {
log.debug("Sending password restored email to '{}'", user.getEmail());
sendEmailFromTemplate(user, "mail/passwordRestoredEmail", "email.restored.title");
}
@Async
public void sendSuspendedAccountMail(UsuarioExtra user) {
log.debug("Sending suspended account mail to '{}'", user.getUser().getEmail());
sendEmailFromTemplate(user.getUser(), "mail/suspendedAccountEmail", "email.suspended.title");
}
@Async
public void sendActivatedAccountMail(UsuarioExtra user) {
log.debug("Sending reactivated account mail to '{}'", user.getUser().getEmail());
sendEmailFromTemplate(user.getUser(), "mail/reactivatedAccountEmail", "email.reactivation.title");
}
@Async
public void sendPublishedPrivateMail(UsuarioExtra user, String contrasenna) {
log.debug("Sending reactivated account mail to '{}'", user.getUser().getEmail());
sendEmailFromTemplateEncuesta(user.getUser(), "mail/encuestaPrivadaEmail", "email.private.title", contrasenna);
}
@Async
public void sendPublishedPublicMail(UsuarioExtra user) {
log.debug("Sending reactivated account mail to '{}'", user.getUser().getEmail());
sendEmailFromTemplate(user.getUser(), "mail/encuestaPublicaEmail", "email.public.title");
}
@Async
public void sendEncuestaDeleted(UsuarioExtra user) {
log.debug("Sending encuesta deletion notification mail to '{}'", user.getUser().getEmail());
sendEmailFromTemplate(user.getUser(), "mail/encuestaDeletedEmail", "email.encuestaDeleted.title");
}
@Async
public void sendInvitationColaborator(UsuarioEncuesta user) {
log.debug("Sending encuesta invitation collaboration notification mail to '{}'", user.getUsuarioExtra().getUser().getEmail());
sendEmailFromTemplateUsuarioEncuesta(
user.getUsuarioExtra().getUser(),
user,
"mail/invitationColaboratorEmail",
"email.invitation.title"
);
}
@Async
public void sendNotifyDeleteColaborator(UsuarioEncuesta user) {
log.debug("Sending delete collaboration notification mail to '{}'", user.getUsuarioExtra().getUser().getEmail());
sendEmailFromTemplateUsuarioEncuesta(
user.getUsuarioExtra().getUser(),
user,
"mail/deleteColaboratorEmail",
"email.deleteColaborator.title"
);
}
@Async
public void sendReceiptUser(UsuarioExtra user, Factura factura) {
log.debug("Sending paypal receipt mail to '{}'", user.getUser().getEmail());
sendEmailFromTemplateFactura(user.getUser(), factura, "mail/facturaPayPalEmail", "email.receipt.title");
}
} }

View File

@ -76,6 +76,19 @@ public class UserService {
); );
} }
public Optional<User> modifyStatus(String login, Boolean estado) {
return userRepository
.findOneByLogin(login)
.map(
user -> {
// activate given user for the registration key.
user.setActivated(estado);
log.debug("Activated user: {}", user);
return user;
}
);
}
public Optional<User> completePasswordReset(String newPassword, String key) { public Optional<User> completePasswordReset(String newPassword, String key) {
log.debug("Reset user password for reset key {}", key); log.debug("Reset user password for reset key {}", key);
return userRepository return userRepository
@ -381,11 +394,16 @@ public class UserService {
@Transactional(readOnly = true) @Transactional(readOnly = true)
public Optional<User> getUserWithAuthoritiesByLogin(String login) { public Optional<User> getUserWithAuthoritiesByLogin(String login) {
return userRepository.findOneWithAuthoritiesByLogin(login); return userRepository.findOneWithAuthoritiesByLogin(login);
//cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE).clear();
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public Optional<User> getUserWithAuthorities() { public Optional<User> getUserWithAuthorities() {
return SecurityUtils.getCurrentUserLogin().flatMap(userRepository::findOneWithAuthoritiesByLogin); return SecurityUtils.getCurrentUserLogin().flatMap(userRepository::findOneWithAuthoritiesByLogin);
//findOneWithAuthoritiesByLogin
//cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE).clear();
//return user;
} }
/** /**

View File

@ -168,11 +168,16 @@ public class AccountResource {
public void requestPasswordReset(@RequestBody String mail) { public void requestPasswordReset(@RequestBody String mail) {
Optional<User> user = userService.requestPasswordReset(mail); Optional<User> user = userService.requestPasswordReset(mail);
if (user.isPresent()) { if (user.isPresent()) {
mailService.sendPasswordResetMail(user.get()); if (user.get().getFirstName() == null || (!user.get().getFirstName().equals("IsGoogle"))) {
mailService.sendPasswordResetMail(user.get());
} else {
throw new UserIsGoogleException();
}
} else { } else {
// Pretend the request has been successful to prevent checking which emails really exist // Pretend the request has been successful to prevent checking which emails really exist
// but log that an invalid attempt has been made // but log that an invalid attempt has been made
log.warn("Password reset requested for non existing mail"); log.warn("Password reset requested for non existing mail");
throw new EmailNotExistException();
} }
} }
@ -192,6 +197,8 @@ public class AccountResource {
if (!user.isPresent()) { if (!user.isPresent()) {
throw new AccountResourceException("No user was found for this reset key"); throw new AccountResourceException("No user was found for this reset key");
} else {
mailService.sendPasswordRestoredMail(user.get());
} }
} }

View File

@ -2,11 +2,13 @@ package org.datasurvey.web.rest;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import org.datasurvey.domain.EPreguntaCerrada;
import org.datasurvey.domain.EPreguntaCerradaOpcion; import org.datasurvey.domain.EPreguntaCerradaOpcion;
import org.datasurvey.repository.EPreguntaCerradaOpcionRepository; import org.datasurvey.repository.EPreguntaCerradaOpcionRepository;
import org.datasurvey.service.EPreguntaCerradaOpcionQueryService; import org.datasurvey.service.EPreguntaCerradaOpcionQueryService;
@ -58,10 +60,15 @@ public class EPreguntaCerradaOpcionResource {
* @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new ePreguntaCerradaOpcion, or with status {@code 400 (Bad Request)} if the ePreguntaCerradaOpcion has already an ID. * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new ePreguntaCerradaOpcion, or with status {@code 400 (Bad Request)} if the ePreguntaCerradaOpcion has already an ID.
* @throws URISyntaxException if the Location URI syntax is incorrect. * @throws URISyntaxException if the Location URI syntax is incorrect.
*/ */
@PostMapping("/e-pregunta-cerrada-opcions") @PostMapping("/e-pregunta-cerrada-opcions/{id}")
public ResponseEntity<EPreguntaCerradaOpcion> createEPreguntaCerradaOpcion( public ResponseEntity<EPreguntaCerradaOpcion> createEPreguntaCerradaOpcion(
@Valid @RequestBody EPreguntaCerradaOpcion ePreguntaCerradaOpcion @Valid @RequestBody EPreguntaCerradaOpcion ePreguntaCerradaOpcion,
@PathVariable(value = "id", required = false) final Long id
) throws URISyntaxException { ) throws URISyntaxException {
EPreguntaCerrada ePreguntaCerrada = new EPreguntaCerrada();
ePreguntaCerrada.setId(id);
ePreguntaCerradaOpcion.setEPreguntaCerrada(ePreguntaCerrada);
log.debug("REST request to save EPreguntaCerradaOpcion : {}", ePreguntaCerradaOpcion); log.debug("REST request to save EPreguntaCerradaOpcion : {}", ePreguntaCerradaOpcion);
if (ePreguntaCerradaOpcion.getId() != null) { if (ePreguntaCerradaOpcion.getId() != null) {
throw new BadRequestAlertException("A new ePreguntaCerradaOpcion cannot already have an ID", ENTITY_NAME, "idexists"); throw new BadRequestAlertException("A new ePreguntaCerradaOpcion cannot already have an ID", ENTITY_NAME, "idexists");
@ -73,10 +80,21 @@ public class EPreguntaCerradaOpcionResource {
.body(result); .body(result);
} }
@PutMapping("/e-pregunta-cerrada-opcions/count/{id}")
public ResponseEntity<EPreguntaCerradaOpcion> updateOpcionCount(@PathVariable(value = "id", required = false) final Long id) {
System.out.println(id);
EPreguntaCerradaOpcion updatedOpcion = ePreguntaCerradaOpcionService.findOne(id).get();
System.out.println(updatedOpcion);
int cantidad = updatedOpcion.getCantidad() + 1;
updatedOpcion.setCantidad(cantidad);
this.ePreguntaCerradaOpcionService.partialUpdate(updatedOpcion);
return ResponseEntity.ok(updatedOpcion);
}
/** /**
* {@code PUT /e-pregunta-cerrada-opcions/:id} : Updates an existing ePreguntaCerradaOpcion. * {@code PUT /e-pregunta-cerrada-opcions/:id} : Updates an existing ePreguntaCerradaOpcion.
* *
* @param id the id of the ePreguntaCerradaOpcion to save. * @param id the id of the ePreguntaCerradaOpcion to save.
* @param ePreguntaCerradaOpcion the ePreguntaCerradaOpcion to update. * @param ePreguntaCerradaOpcion the ePreguntaCerradaOpcion to update.
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaCerradaOpcion, * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaCerradaOpcion,
* or with status {@code 400 (Bad Request)} if the ePreguntaCerradaOpcion is not valid, * or with status {@code 400 (Bad Request)} if the ePreguntaCerradaOpcion is not valid,
@ -110,7 +128,7 @@ public class EPreguntaCerradaOpcionResource {
/** /**
* {@code PATCH /e-pregunta-cerrada-opcions/:id} : Partial updates given fields of an existing ePreguntaCerradaOpcion, field will ignore if it is null * {@code PATCH /e-pregunta-cerrada-opcions/:id} : Partial updates given fields of an existing ePreguntaCerradaOpcion, field will ignore if it is null
* *
* @param id the id of the ePreguntaCerradaOpcion to save. * @param id the id of the ePreguntaCerradaOpcion to save.
* @param ePreguntaCerradaOpcion the ePreguntaCerradaOpcion to update. * @param ePreguntaCerradaOpcion the ePreguntaCerradaOpcion to update.
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaCerradaOpcion, * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaCerradaOpcion,
* or with status {@code 400 (Bad Request)} if the ePreguntaCerradaOpcion is not valid, * or with status {@code 400 (Bad Request)} if the ePreguntaCerradaOpcion is not valid,
@ -196,4 +214,15 @@ public class EPreguntaCerradaOpcionResource {
.headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString()))
.build(); .build();
} }
@PostMapping("/e-pregunta-cerrada-opcions/deleteMany")
public ResponseEntity<Void> deleteManyEPreguntaCerradaOpcion(@Valid @RequestBody int[] ids) {
for (int id : ids) {
ePreguntaCerradaOpcionService.delete((long) id);
}
return ResponseEntity
.noContent()
.headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, Arrays.toString(ids)))
.build();
}
} }

View File

@ -2,15 +2,22 @@ package org.datasurvey.web.rest;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import org.datasurvey.domain.Encuesta; import org.datasurvey.domain.*;
import org.datasurvey.domain.enumeration.AccesoEncuesta;
import org.datasurvey.repository.EncuestaRepository; import org.datasurvey.repository.EncuestaRepository;
import org.datasurvey.service.*;
import org.datasurvey.service.EncuestaQueryService; import org.datasurvey.service.EncuestaQueryService;
import org.datasurvey.service.EncuestaService; import org.datasurvey.service.EncuestaService;
import org.datasurvey.service.MailService;
import org.datasurvey.service.criteria.EncuestaCriteria; import org.datasurvey.service.criteria.EncuestaCriteria;
import org.datasurvey.web.rest.errors.BadRequestAlertException; import org.datasurvey.web.rest.errors.BadRequestAlertException;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -41,14 +48,46 @@ public class EncuestaResource {
private final EncuestaQueryService encuestaQueryService; private final EncuestaQueryService encuestaQueryService;
private final MailService mailService;
private final EPreguntaCerradaService ePreguntaCerradaService;
private final EPreguntaAbiertaService ePreguntaAbiertaService;
private final EPreguntaCerradaOpcionService ePreguntaCerradaOpcionService;
private final PlantillaService plantillaService;
private final PPreguntaCerradaService pPreguntaCerradaService;
private final PPreguntaAbiertaService pPreguntaAbiertaService;
private final PPreguntaCerradaOpcionService pPreguntaCerradaOpcionService;
public EncuestaResource( public EncuestaResource(
EncuestaService encuestaService, EncuestaService encuestaService,
EncuestaRepository encuestaRepository, EncuestaRepository encuestaRepository,
EncuestaQueryService encuestaQueryService EncuestaQueryService encuestaQueryService,
MailService mailService,
EPreguntaCerradaService ePreguntaCerradaService,
EPreguntaAbiertaService ePreguntaAbiertaService,
EPreguntaCerradaOpcionService ePreguntaCerradaOpcionService,
PlantillaService plantillaService,
PPreguntaCerradaService pPreguntaCerradaService,
PPreguntaAbiertaService pPreguntaAbiertaService,
PPreguntaCerradaOpcionService pPreguntaCerradaOpcionService
) { ) {
this.encuestaService = encuestaService; this.encuestaService = encuestaService;
this.encuestaRepository = encuestaRepository; this.encuestaRepository = encuestaRepository;
this.encuestaQueryService = encuestaQueryService; this.encuestaQueryService = encuestaQueryService;
this.mailService = mailService;
this.ePreguntaCerradaService = ePreguntaCerradaService;
this.ePreguntaAbiertaService = ePreguntaAbiertaService;
this.ePreguntaCerradaOpcionService = ePreguntaCerradaOpcionService;
this.plantillaService = plantillaService;
this.pPreguntaCerradaService = pPreguntaCerradaService;
this.pPreguntaAbiertaService = pPreguntaAbiertaService;
this.pPreguntaCerradaOpcionService = pPreguntaCerradaOpcionService;
} }
/** /**
@ -71,10 +110,82 @@ public class EncuestaResource {
.body(result); .body(result);
} }
@PostMapping("/encuestas/{plantillaId}")
public ResponseEntity<Encuesta> createEncuestaFromTemplate(
@Valid @RequestBody Encuesta encuesta,
@PathVariable(value = "plantillaId", required = false) final Long plantillaId
) throws URISyntaxException {
log.debug("REST request to save Encuesta : {}", encuesta);
if (encuesta.getId() != null) {
throw new BadRequestAlertException("A new encuesta cannot already have an ID", ENTITY_NAME, "idexists");
}
// Copy from survey template to survey
Optional<Plantilla> plantilla = plantillaService.findOne(plantillaId);
if (plantilla.isPresent()) {
encuesta.setNombre(plantilla.get().getNombre());
encuesta.setDescripcion(plantilla.get().getDescripcion());
encuesta.setCategoria(plantilla.get().getCategoria());
Encuesta encuestaCreated = encuestaService.save(encuesta);
// Preguntas cerradas
List<PPreguntaCerrada> preguntasCerradas = pPreguntaCerradaService.findAll();
for (PPreguntaCerrada pPreguntaCerrada : preguntasCerradas) {
if (pPreguntaCerrada.getPlantilla().getId().equals(plantillaId)) {
EPreguntaCerrada newEPreguntaCerrada = new EPreguntaCerrada();
newEPreguntaCerrada.setNombre(pPreguntaCerrada.getNombre());
newEPreguntaCerrada.setTipo(pPreguntaCerrada.getTipo());
newEPreguntaCerrada.setOpcional(pPreguntaCerrada.getOpcional());
newEPreguntaCerrada.setOrden(pPreguntaCerrada.getOrden());
newEPreguntaCerrada.setEncuesta(encuestaCreated);
ePreguntaCerradaService.save(newEPreguntaCerrada);
// Opciones de preguntas cerradas
List<PPreguntaCerradaOpcion> opciones = pPreguntaCerradaOpcionService.findAll();
for (PPreguntaCerradaOpcion pPreguntaCerradaOpcion : opciones) {
if (pPreguntaCerradaOpcion.getPPreguntaCerrada().getId().equals(pPreguntaCerrada.getId())) {
EPreguntaCerradaOpcion newEPreguntaCerradaOpcion = new EPreguntaCerradaOpcion();
newEPreguntaCerradaOpcion.setNombre(pPreguntaCerradaOpcion.getNombre());
newEPreguntaCerradaOpcion.setOrden(pPreguntaCerradaOpcion.getOrden());
newEPreguntaCerradaOpcion.setCantidad(0);
newEPreguntaCerradaOpcion.setEPreguntaCerrada(newEPreguntaCerrada);
ePreguntaCerradaOpcionService.save(newEPreguntaCerradaOpcion);
}
}
}
}
// Preguntas abiertas
List<PPreguntaAbierta> preguntasAbiertas = pPreguntaAbiertaService.findAll();
for (PPreguntaAbierta pPreguntaAbierta : preguntasAbiertas) {
if (pPreguntaAbierta.getPlantilla().getId().equals(plantillaId)) {
EPreguntaAbierta newEPreguntaAbierta = new EPreguntaAbierta();
newEPreguntaAbierta.setNombre(pPreguntaAbierta.getNombre());
newEPreguntaAbierta.setOpcional(pPreguntaAbierta.getOpcional());
newEPreguntaAbierta.setOrden(pPreguntaAbierta.getOrden());
newEPreguntaAbierta.setEncuesta(encuestaCreated);
ePreguntaAbiertaService.save(newEPreguntaAbierta);
}
}
return ResponseEntity
.created(new URI("/api/encuestas/" + encuestaCreated.getId()))
.headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, encuestaCreated.getId().toString()))
.body(encuestaCreated);
}
return ResponseEntity.ok().body(null);
}
/** /**
* {@code PUT /encuestas/:id} : Updates an existing encuesta. * {@code PUT /encuestas/:id} : Updates an existing encuesta.
* *
* @param id the id of the encuesta to save. * @param id the id of the encuesta to save.
* @param encuesta the encuesta to update. * @param encuesta the encuesta to update.
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated encuesta, * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated encuesta,
* or with status {@code 400 (Bad Request)} if the encuesta is not valid, * or with status {@code 400 (Bad Request)} if the encuesta is not valid,
@ -99,6 +210,66 @@ public class EncuestaResource {
} }
Encuesta result = encuestaService.save(encuesta); Encuesta result = encuestaService.save(encuesta);
if (encuesta.getUsuarioExtra().getUser() != null) {
mailService.sendEncuestaDeleted(encuesta.getUsuarioExtra());
}
return ResponseEntity
.ok()
.headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, encuesta.getId().toString()))
.body(result);
}
@PutMapping("/encuestas/update/{id}")
public ResponseEntity<Encuesta> updateEncuestaReal(
@PathVariable(value = "id", required = false) final Long id,
@Valid @RequestBody Encuesta encuesta
) throws URISyntaxException {
log.debug("REST request to update Encuesta : {}, {}", id, encuesta);
if (encuesta.getId() == null) {
throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
}
if (!Objects.equals(id, encuesta.getId())) {
throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid");
}
if (!encuestaRepository.existsById(id)) {
throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound");
}
Encuesta result = encuestaService.save(encuesta);
return ResponseEntity
.ok()
.headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, encuesta.getId().toString()))
.body(result);
}
@PutMapping("/encuestas/publish/{id}")
public ResponseEntity<Encuesta> publishEncuesta(
@PathVariable(value = "id", required = false) final Long id,
@Valid @RequestBody Encuesta encuesta
) throws URISyntaxException {
log.debug("REST request to update Encuesta : {}, {}", id, encuesta);
if (encuesta.getId() == null) {
throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
}
if (!Objects.equals(id, encuesta.getId())) {
throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid");
}
if (!encuestaRepository.existsById(id)) {
throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound");
}
Encuesta result = encuestaService.save(encuesta);
if (result.getAcceso().equals(AccesoEncuesta.PRIVATE)) {
mailService.sendPublishedPrivateMail(result.getUsuarioExtra(), result.getContrasenna());
} else {
mailService.sendPublishedPublicMail(result.getUsuarioExtra());
}
return ResponseEntity return ResponseEntity
.ok() .ok()
.headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, encuesta.getId().toString())) .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, encuesta.getId().toString()))
@ -108,7 +279,7 @@ public class EncuestaResource {
/** /**
* {@code PATCH /encuestas/:id} : Partial updates given fields of an existing encuesta, field will ignore if it is null * {@code PATCH /encuestas/:id} : Partial updates given fields of an existing encuesta, field will ignore if it is null
* *
* @param id the id of the encuesta to save. * @param id the id of the encuesta to save.
* @param encuesta the encuesta to update. * @param encuesta the encuesta to update.
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated encuesta, * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated encuesta,
* or with status {@code 400 (Bad Request)} if the encuesta is not valid, * or with status {@code 400 (Bad Request)} if the encuesta is not valid,
@ -154,6 +325,55 @@ public class EncuestaResource {
return ResponseEntity.ok().body(entityList); return ResponseEntity.ok().body(entityList);
} }
@GetMapping("/encuestas/preguntas/{id}")
public ResponseEntity<List<Object>> getPreguntasByIdEncuesta(@PathVariable Long id) {
List<EPreguntaCerrada> preguntasCerradas = ePreguntaCerradaService.findAll();
List<EPreguntaAbierta> preguntasAbiertas = ePreguntaAbiertaService.findAll();
List<Object> preguntas = Stream.concat(preguntasCerradas.stream(), preguntasAbiertas.stream()).collect(Collectors.toList());
List<Object> preguntasFiltered = new ArrayList<>();
for (Object obj : preguntas) {
if (obj.getClass() == EPreguntaCerrada.class) {
if (((EPreguntaCerrada) obj).getEncuesta() != null) {
if (((EPreguntaCerrada) obj).getEncuesta().getId().equals(id)) {
preguntasFiltered.add(obj);
}
}
} else if (obj.getClass() == EPreguntaAbierta.class) {
if (((EPreguntaAbierta) obj).getEncuesta() != null) {
if (((EPreguntaAbierta) obj).getEncuesta().getId().equals(id)) {
preguntasFiltered.add(obj);
}
}
}
}
return ResponseEntity.ok().body(preguntasFiltered);
}
@GetMapping("/encuestas/preguntas-opciones/{id}")
public ResponseEntity<List<List<EPreguntaCerradaOpcion>>> getPreguntaCerradaOpcionByIdEncuesta(@PathVariable Long id) {
List<List<EPreguntaCerradaOpcion>> res = new ArrayList<>();
List<EPreguntaCerrada> preguntasCerradas = ePreguntaCerradaService.findAll();
List<EPreguntaCerrada> preguntasCerradasFiltered = preguntasCerradas
.stream()
.filter(p -> Objects.nonNull(p.getEncuesta()))
.filter(p -> p.getEncuesta().getId().equals(id))
.collect(Collectors.toList());
List<EPreguntaCerradaOpcion> opciones = ePreguntaCerradaOpcionService.findAll();
for (EPreguntaCerrada ePreguntaCerrada : preguntasCerradasFiltered) {
long preguntaCerradaId = ePreguntaCerrada.getId();
List<EPreguntaCerradaOpcion> opcionesFiltered = opciones
.stream()
.filter(o -> Objects.nonNull(o.getEPreguntaCerrada()))
.filter(o -> o.getEPreguntaCerrada().getId().equals(preguntaCerradaId))
.collect(Collectors.toList());
res.add(opcionesFiltered);
}
return ResponseEntity.ok().body(res);
}
/** /**
* {@code GET /encuestas/count} : count all the encuestas. * {@code GET /encuestas/count} : count all the encuestas.
* *
@ -194,4 +414,78 @@ public class EncuestaResource {
.headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString()))
.build(); .build();
} }
@DeleteMapping("encuestas/notify/{id}")
public ResponseEntity<Void> notifyEncuestaDeleted(@PathVariable Long id, @Valid @RequestBody Encuesta encuesta) {
log.debug("REST request to notify {} of deleted Encuesta", encuesta.getUsuarioExtra().getUser().getEmail());
mailService.sendEncuestaDeleted(encuesta.getUsuarioExtra());
return ResponseEntity.noContent().build();
}
@GetMapping("/encuestas/duplicate/{id}")
public ResponseEntity<Encuesta> getAllEncuestas(@PathVariable Long id) {
Optional<Encuesta> encuesta = encuestaService.findOne(id);
Encuesta newEncuesta = new Encuesta();
if (encuesta.isPresent()) {
// Encuesta
newEncuesta.setNombre(encuesta.get().getNombre());
newEncuesta.setDescripcion(encuesta.get().getDescripcion());
newEncuesta.setFechaCreacion(ZonedDateTime.now());
newEncuesta.setCalificacion(5.1d);
newEncuesta.setAcceso(encuesta.get().getAcceso());
newEncuesta.setEstado(encuesta.get().getEstado());
newEncuesta.setCategoria(encuesta.get().getCategoria());
newEncuesta.setUsuarioExtra(encuesta.get().getUsuarioExtra());
Encuesta encuestaCreated = encuestaService.save(newEncuesta);
// Preguntas cerradas
List<EPreguntaCerrada> preguntasCerradas = ePreguntaCerradaService.findAll();
for (EPreguntaCerrada ePreguntaCerrada : preguntasCerradas) {
if (ePreguntaCerrada.getEncuesta().getId().equals(id)) {
EPreguntaCerrada newEPreguntaCerrada = new EPreguntaCerrada();
newEPreguntaCerrada.setNombre(ePreguntaCerrada.getNombre());
newEPreguntaCerrada.setTipo(ePreguntaCerrada.getTipo());
newEPreguntaCerrada.setOpcional(ePreguntaCerrada.getOpcional());
newEPreguntaCerrada.setOrden(ePreguntaCerrada.getOrden());
newEPreguntaCerrada.setEncuesta(encuestaCreated);
ePreguntaCerradaService.save(newEPreguntaCerrada);
// Opciones de preguntas cerradas
List<EPreguntaCerradaOpcion> opciones = ePreguntaCerradaOpcionService.findAll();
for (EPreguntaCerradaOpcion ePreguntaCerradaOpcion : opciones) {
if (ePreguntaCerradaOpcion.getEPreguntaCerrada().getId().equals(ePreguntaCerrada.getId())) {
EPreguntaCerradaOpcion newEPreguntaCerradaOpcion = new EPreguntaCerradaOpcion();
newEPreguntaCerradaOpcion.setNombre(ePreguntaCerradaOpcion.getNombre());
newEPreguntaCerradaOpcion.setOrden(ePreguntaCerradaOpcion.getOrden());
newEPreguntaCerradaOpcion.setCantidad(0);
newEPreguntaCerradaOpcion.setEPreguntaCerrada(newEPreguntaCerrada);
ePreguntaCerradaOpcionService.save(newEPreguntaCerradaOpcion);
}
}
}
}
// Preguntas abiertas
List<EPreguntaAbierta> preguntasAbiertas = ePreguntaAbiertaService.findAll();
for (EPreguntaAbierta ePreguntaAbierta : preguntasAbiertas) {
if (ePreguntaAbierta.getEncuesta().getId().equals(id)) {
EPreguntaAbierta newEPreguntaAbierta = new EPreguntaAbierta();
newEPreguntaAbierta.setNombre(ePreguntaAbierta.getNombre());
newEPreguntaAbierta.setOpcional(ePreguntaAbierta.getOpcional());
newEPreguntaAbierta.setOrden(ePreguntaAbierta.getOrden());
newEPreguntaAbierta.setEncuesta(encuestaCreated);
ePreguntaAbiertaService.save(newEPreguntaAbierta);
}
}
return ResponseEntity.ok().body(encuestaCreated);
}
return ResponseEntity.ok().body(null);
}
} }

View File

@ -8,9 +8,12 @@ import java.util.Optional;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import org.datasurvey.domain.Factura; import org.datasurvey.domain.Factura;
import org.datasurvey.domain.UsuarioExtra;
import org.datasurvey.repository.FacturaRepository; import org.datasurvey.repository.FacturaRepository;
import org.datasurvey.service.FacturaQueryService; import org.datasurvey.service.FacturaQueryService;
import org.datasurvey.service.FacturaService; import org.datasurvey.service.FacturaService;
import org.datasurvey.service.MailService;
import org.datasurvey.service.UsuarioExtraService;
import org.datasurvey.service.criteria.FacturaCriteria; import org.datasurvey.service.criteria.FacturaCriteria;
import org.datasurvey.web.rest.errors.BadRequestAlertException; import org.datasurvey.web.rest.errors.BadRequestAlertException;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -41,10 +44,22 @@ public class FacturaResource {
private final FacturaQueryService facturaQueryService; private final FacturaQueryService facturaQueryService;
public FacturaResource(FacturaService facturaService, FacturaRepository facturaRepository, FacturaQueryService facturaQueryService) { private final UsuarioExtraService userExtraService;
private final MailService mailService;
public FacturaResource(
FacturaService facturaService,
FacturaRepository facturaRepository,
FacturaQueryService facturaQueryService,
UsuarioExtraService userExtraService,
MailService mailService
) {
this.facturaService = facturaService; this.facturaService = facturaService;
this.facturaRepository = facturaRepository; this.facturaRepository = facturaRepository;
this.facturaQueryService = facturaQueryService; this.facturaQueryService = facturaQueryService;
this.userExtraService = userExtraService;
this.mailService = mailService;
} }
/** /**
@ -60,11 +75,22 @@ public class FacturaResource {
if (factura.getId() != null) { if (factura.getId() != null) {
throw new BadRequestAlertException("A new factura cannot already have an ID", ENTITY_NAME, "idexists"); throw new BadRequestAlertException("A new factura cannot already have an ID", ENTITY_NAME, "idexists");
} }
Optional<UsuarioExtra> usuarioExtra = userExtraService.findOne(Long.parseLong(factura.getNombreUsuario()));
factura.setNombreUsuario(usuarioExtra.get().getNombre());
Factura result = facturaService.save(factura); Factura result = facturaService.save(factura);
mailService.sendReceiptUser(usuarioExtra.get(), factura);
return ResponseEntity return ResponseEntity
.created(new URI("/api/facturas/" + result.getId())) .created(new URI("/api/facturas/" + result.getId()))
.headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
.body(result); .body(result);
//retrieve yser
//Enviar el correo
} }
/** /**

View File

@ -2,11 +2,14 @@ package org.datasurvey.web.rest;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import org.datasurvey.domain.EPreguntaCerrada;
import org.datasurvey.domain.PPreguntaCerrada;
import org.datasurvey.domain.PPreguntaCerradaOpcion; import org.datasurvey.domain.PPreguntaCerradaOpcion;
import org.datasurvey.repository.PPreguntaCerradaOpcionRepository; import org.datasurvey.repository.PPreguntaCerradaOpcionRepository;
import org.datasurvey.service.PPreguntaCerradaOpcionQueryService; import org.datasurvey.service.PPreguntaCerradaOpcionQueryService;
@ -58,10 +61,15 @@ public class PPreguntaCerradaOpcionResource {
* @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new pPreguntaCerradaOpcion, or with status {@code 400 (Bad Request)} if the pPreguntaCerradaOpcion has already an ID. * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new pPreguntaCerradaOpcion, or with status {@code 400 (Bad Request)} if the pPreguntaCerradaOpcion has already an ID.
* @throws URISyntaxException if the Location URI syntax is incorrect. * @throws URISyntaxException if the Location URI syntax is incorrect.
*/ */
@PostMapping("/p-pregunta-cerrada-opcions") @PostMapping("/p-pregunta-cerrada-opcions/{id}")
public ResponseEntity<PPreguntaCerradaOpcion> createPPreguntaCerradaOpcion( public ResponseEntity<PPreguntaCerradaOpcion> createPPreguntaCerradaOpcion(
@Valid @RequestBody PPreguntaCerradaOpcion pPreguntaCerradaOpcion @Valid @RequestBody PPreguntaCerradaOpcion pPreguntaCerradaOpcion,
@PathVariable(value = "id", required = false) final Long id
) throws URISyntaxException { ) throws URISyntaxException {
PPreguntaCerrada pPreguntaCerrada = new PPreguntaCerrada();
pPreguntaCerrada.setId(id);
pPreguntaCerradaOpcion.setPPreguntaCerrada(pPreguntaCerrada);
log.debug("REST request to save PPreguntaCerradaOpcion : {}", pPreguntaCerradaOpcion); log.debug("REST request to save PPreguntaCerradaOpcion : {}", pPreguntaCerradaOpcion);
if (pPreguntaCerradaOpcion.getId() != null) { if (pPreguntaCerradaOpcion.getId() != null) {
throw new BadRequestAlertException("A new pPreguntaCerradaOpcion cannot already have an ID", ENTITY_NAME, "idexists"); throw new BadRequestAlertException("A new pPreguntaCerradaOpcion cannot already have an ID", ENTITY_NAME, "idexists");
@ -196,4 +204,15 @@ public class PPreguntaCerradaOpcionResource {
.headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString()))
.build(); .build();
} }
@PostMapping("/p-pregunta-cerrada-opcions/deleteMany")
public ResponseEntity<Void> deleteManyPPreguntaCerradaOpcion(@Valid @RequestBody int[] ids) {
for (int id : ids) {
pPreguntaCerradaOpcionService.delete((long) id);
}
return ResponseEntity
.noContent()
.headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, Arrays.toString(ids)))
.build();
}
} }

View File

@ -2,15 +2,17 @@ package org.datasurvey.web.rest;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import org.datasurvey.domain.Plantilla; import org.datasurvey.domain.*;
import org.datasurvey.repository.PlantillaRepository; import org.datasurvey.repository.PlantillaRepository;
import org.datasurvey.service.PlantillaQueryService; import org.datasurvey.service.*;
import org.datasurvey.service.PlantillaService;
import org.datasurvey.service.criteria.PlantillaCriteria; import org.datasurvey.service.criteria.PlantillaCriteria;
import org.datasurvey.web.rest.errors.BadRequestAlertException; import org.datasurvey.web.rest.errors.BadRequestAlertException;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -41,14 +43,26 @@ public class PlantillaResource {
private final PlantillaQueryService plantillaQueryService; private final PlantillaQueryService plantillaQueryService;
private final PPreguntaCerradaService pPreguntaCerradaService;
private final PPreguntaAbiertaService pPreguntaAbiertaService;
private final PPreguntaCerradaOpcionService pPreguntaCerradaOpcionService;
public PlantillaResource( public PlantillaResource(
PlantillaService plantillaService, PlantillaService plantillaService,
PlantillaRepository plantillaRepository, PlantillaRepository plantillaRepository,
PlantillaQueryService plantillaQueryService PlantillaQueryService plantillaQueryService,
PPreguntaCerradaService pPreguntaCerradaService,
PPreguntaAbiertaService pPreguntaAbiertaService,
PPreguntaCerradaOpcionService ePreguntaCerradaOpcionService
) { ) {
this.plantillaService = plantillaService; this.plantillaService = plantillaService;
this.plantillaRepository = plantillaRepository; this.plantillaRepository = plantillaRepository;
this.plantillaQueryService = plantillaQueryService; this.plantillaQueryService = plantillaQueryService;
this.pPreguntaCerradaService = pPreguntaCerradaService;
this.pPreguntaAbiertaService = pPreguntaAbiertaService;
this.pPreguntaCerradaOpcionService = ePreguntaCerradaOpcionService;
} }
/** /**
@ -154,6 +168,55 @@ public class PlantillaResource {
return ResponseEntity.ok().body(entityList); return ResponseEntity.ok().body(entityList);
} }
@GetMapping("/plantillas/preguntas/{id}")
public ResponseEntity<List<Object>> getPreguntasByIdPlantilla(@PathVariable Long id) {
List<PPreguntaCerrada> preguntasCerradas = pPreguntaCerradaService.findAll();
List<PPreguntaAbierta> preguntasAbiertas = pPreguntaAbiertaService.findAll();
List<Object> preguntas = Stream.concat(preguntasCerradas.stream(), preguntasAbiertas.stream()).collect(Collectors.toList());
List<Object> preguntasFiltered = new ArrayList<>();
for (Object obj : preguntas) {
if (obj.getClass() == PPreguntaCerrada.class) {
if (((PPreguntaCerrada) obj).getPlantilla() != null) {
if (((PPreguntaCerrada) obj).getPlantilla().getId().equals(id)) {
preguntasFiltered.add(obj);
}
}
} else if (obj.getClass() == PPreguntaAbierta.class) {
if (((PPreguntaAbierta) obj).getPlantilla() != null) {
if (((PPreguntaAbierta) obj).getPlantilla().getId().equals(id)) {
preguntasFiltered.add(obj);
}
}
}
}
return ResponseEntity.ok().body(preguntasFiltered);
}
@GetMapping("/plantillas/preguntas-opciones/{id}")
public ResponseEntity<List<List<PPreguntaCerradaOpcion>>> getPreguntaCerradaOpcionByIdPlantilla(@PathVariable Long id) {
List<List<PPreguntaCerradaOpcion>> res = new ArrayList<>();
List<PPreguntaCerrada> preguntasCerradas = pPreguntaCerradaService.findAll();
List<PPreguntaCerrada> preguntasCerradasFiltered = preguntasCerradas
.stream()
.filter(p -> Objects.nonNull(p.getPlantilla()))
.filter(p -> p.getPlantilla().getId().equals(id))
.collect(Collectors.toList());
List<PPreguntaCerradaOpcion> opciones = pPreguntaCerradaOpcionService.findAll();
for (PPreguntaCerrada pPreguntaCerrada : preguntasCerradasFiltered) {
long preguntaCerradaId = pPreguntaCerrada.getId();
List<PPreguntaCerradaOpcion> opcionesFiltered = opciones
.stream()
.filter(o -> Objects.nonNull(o.getPPreguntaCerrada()))
.filter(o -> o.getPPreguntaCerrada().getId().equals(preguntaCerradaId))
.collect(Collectors.toList());
res.add(opcionesFiltered);
}
return ResponseEntity.ok().body(res);
}
/** /**
* {@code GET /plantillas/count} : count all the plantillas. * {@code GET /plantillas/count} : count all the plantillas.
* *

View File

@ -40,6 +40,7 @@ public class UserJWTController {
Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication); SecurityContextHolder.getContext().setAuthentication(authentication);
String jwt = tokenProvider.createToken(authentication, loginVM.isRememberMe()); String jwt = tokenProvider.createToken(authentication, loginVM.isRememberMe());
HttpHeaders httpHeaders = new HttpHeaders(); HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);
return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK); return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK);

View File

@ -2,15 +2,18 @@ package org.datasurvey.web.rest;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import org.datasurvey.domain.Encuesta;
import org.datasurvey.domain.UsuarioEncuesta; import org.datasurvey.domain.UsuarioEncuesta;
import org.datasurvey.domain.UsuarioExtra;
import org.datasurvey.repository.UsuarioEncuestaRepository; import org.datasurvey.repository.UsuarioEncuestaRepository;
import org.datasurvey.service.UsuarioEncuestaQueryService; import org.datasurvey.service.*;
import org.datasurvey.service.UsuarioEncuestaService;
import org.datasurvey.service.criteria.UsuarioEncuestaCriteria; import org.datasurvey.service.criteria.UsuarioEncuestaCriteria;
import org.datasurvey.web.rest.errors.BadRequestAlertException; import org.datasurvey.web.rest.errors.BadRequestAlertException;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -36,19 +39,29 @@ public class UsuarioEncuestaResource {
private String applicationName; private String applicationName;
private final UsuarioEncuestaService usuarioEncuestaService; private final UsuarioEncuestaService usuarioEncuestaService;
private final UsuarioExtraService usuarioExtraService;
private final EncuestaService encuestaService;
private final UsuarioEncuestaRepository usuarioEncuestaRepository; private final UsuarioEncuestaRepository usuarioEncuestaRepository;
private final UsuarioEncuestaQueryService usuarioEncuestaQueryService; private final UsuarioEncuestaQueryService usuarioEncuestaQueryService;
private final MailService mailService;
public UsuarioEncuestaResource( public UsuarioEncuestaResource(
UsuarioEncuestaService usuarioEncuestaService, UsuarioEncuestaService usuarioEncuestaService,
UsuarioEncuestaRepository usuarioEncuestaRepository, UsuarioEncuestaRepository usuarioEncuestaRepository,
UsuarioEncuestaQueryService usuarioEncuestaQueryService UsuarioEncuestaQueryService usuarioEncuestaQueryService,
UsuarioExtraService usuarioExtraService,
EncuestaService encuestaService,
MailService mailService
) { ) {
this.usuarioEncuestaService = usuarioEncuestaService; this.usuarioEncuestaService = usuarioEncuestaService;
this.usuarioEncuestaRepository = usuarioEncuestaRepository; this.usuarioEncuestaRepository = usuarioEncuestaRepository;
this.usuarioEncuestaQueryService = usuarioEncuestaQueryService; this.usuarioEncuestaQueryService = usuarioEncuestaQueryService;
this.usuarioExtraService = usuarioExtraService;
this.encuestaService = encuestaService;
this.mailService = mailService;
} }
/** /**
@ -66,6 +79,9 @@ public class UsuarioEncuestaResource {
throw new BadRequestAlertException("A new usuarioEncuesta cannot already have an ID", ENTITY_NAME, "idexists"); throw new BadRequestAlertException("A new usuarioEncuesta cannot already have an ID", ENTITY_NAME, "idexists");
} }
UsuarioEncuesta result = usuarioEncuestaService.save(usuarioEncuesta); UsuarioEncuesta result = usuarioEncuestaService.save(usuarioEncuesta);
if (result.getId() != null) {
mailService.sendInvitationColaborator(usuarioEncuesta);
}
return ResponseEntity return ResponseEntity
.created(new URI("/api/usuario-encuestas/" + result.getId())) .created(new URI("/api/usuario-encuestas/" + result.getId()))
.headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
@ -189,10 +205,40 @@ public class UsuarioEncuestaResource {
@DeleteMapping("/usuario-encuestas/{id}") @DeleteMapping("/usuario-encuestas/{id}")
public ResponseEntity<Void> deleteUsuarioEncuesta(@PathVariable Long id) { public ResponseEntity<Void> deleteUsuarioEncuesta(@PathVariable Long id) {
log.debug("REST request to delete UsuarioEncuesta : {}", id); log.debug("REST request to delete UsuarioEncuesta : {}", id);
Optional<UsuarioEncuesta> usuarioEncuesta = usuarioEncuestaService.findOne(id);
usuarioEncuestaService.delete(id); usuarioEncuestaService.delete(id);
if (usuarioEncuesta != null) {
mailService.sendNotifyDeleteColaborator(usuarioEncuesta.get());
}
return ResponseEntity return ResponseEntity
.noContent() .noContent()
.headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString()))
.build(); .build();
} }
@GetMapping("/usuario-encuestas/encuesta/{id}")
public ResponseEntity<List<UsuarioEncuesta>> getColaboradores(@PathVariable Long id) {
List<UsuarioExtra> usuariosExtras = usuarioExtraService.findAll();
List<UsuarioEncuesta> usuariosEncuestas = usuarioEncuestaService
.findAll()
.stream()
.filter(uE -> Objects.nonNull(uE.getEncuesta()))
.filter(uE -> uE.getEncuesta().getId().equals(id))
.collect(Collectors.toList());
for (UsuarioEncuesta usuarioEncuesta : usuariosEncuestas) {
long usuarioExtraId = usuarioEncuesta.getUsuarioExtra().getId();
UsuarioExtra usuarioExtra = usuariosExtras.stream().filter(u -> u.getId() == usuarioExtraId).findFirst().get();
usuarioEncuesta.getUsuarioExtra().setNombre(usuarioExtra.getNombre());
usuarioEncuesta.getUsuarioExtra().setIconoPerfil(usuarioExtra.getIconoPerfil());
}
return ResponseEntity.ok().body(usuariosEncuestas);
}
@PostMapping("/usuario-encuestas/notify/{id}")
public ResponseEntity<Void> notifyInvitationColaborator(@PathVariable Long id, @Valid @RequestBody UsuarioEncuesta usuarioEncuesta) {
log.debug("REST request to notify {} of invitation to Encuesta", usuarioEncuesta.getUsuarioExtra().getUser().getEmail());
mailService.sendInvitationColaborator(usuarioEncuesta);
return ResponseEntity.noContent().build();
}
} }

View File

@ -9,6 +9,8 @@ import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import org.datasurvey.domain.UsuarioExtra; import org.datasurvey.domain.UsuarioExtra;
import org.datasurvey.repository.UsuarioExtraRepository; import org.datasurvey.repository.UsuarioExtraRepository;
import org.datasurvey.service.MailService;
import org.datasurvey.service.UserService;
import org.datasurvey.service.UsuarioExtraQueryService; import org.datasurvey.service.UsuarioExtraQueryService;
import org.datasurvey.service.UsuarioExtraService; import org.datasurvey.service.UsuarioExtraService;
import org.datasurvey.service.criteria.UsuarioExtraCriteria; import org.datasurvey.service.criteria.UsuarioExtraCriteria;
@ -41,14 +43,22 @@ public class UsuarioExtraResource {
private final UsuarioExtraQueryService usuarioExtraQueryService; private final UsuarioExtraQueryService usuarioExtraQueryService;
private final MailService mailService;
private final UserService userService;
public UsuarioExtraResource( public UsuarioExtraResource(
UsuarioExtraService usuarioExtraService, UsuarioExtraService usuarioExtraService,
UsuarioExtraRepository usuarioExtraRepository, UsuarioExtraRepository usuarioExtraRepository,
UsuarioExtraQueryService usuarioExtraQueryService UsuarioExtraQueryService usuarioExtraQueryService,
MailService mailService,
UserService userService
) { ) {
this.usuarioExtraService = usuarioExtraService; this.usuarioExtraService = usuarioExtraService;
this.usuarioExtraRepository = usuarioExtraRepository; this.usuarioExtraRepository = usuarioExtraRepository;
this.usuarioExtraQueryService = usuarioExtraQueryService; this.usuarioExtraQueryService = usuarioExtraQueryService;
this.mailService = mailService;
this.userService = userService;
} }
/** /**
@ -99,6 +109,40 @@ public class UsuarioExtraResource {
} }
UsuarioExtra result = usuarioExtraService.save(usuarioExtra); UsuarioExtra result = usuarioExtraService.save(usuarioExtra);
return ResponseEntity
.ok()
.headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, usuarioExtra.getId().toString()))
.body(result);
}
@PutMapping("/usuario-extras-estado/{id}")
public ResponseEntity<UsuarioExtra> updateUsuarioExtraEstado(
@PathVariable(value = "id", required = false) final Long id,
@Valid @RequestBody UsuarioExtra usuarioExtra
) throws URISyntaxException {
log.debug("REST request to update UsuarioExtra : {}, {}", id, usuarioExtra);
if (usuarioExtra.getId() == null) {
throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
}
if (!Objects.equals(id, usuarioExtra.getId())) {
throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid");
}
if (!usuarioExtraRepository.existsById(id)) {
throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound");
}
UsuarioExtra result = usuarioExtraService.save(usuarioExtra);
if (usuarioExtra.getEstado().name().equals("SUSPENDED")) {
this.userService.modifyStatus(usuarioExtra.getUser().getLogin(), false);
mailService.sendSuspendedAccountMail(usuarioExtra); //se manda el correo de la suspecion
} else {
this.userService.modifyStatus(usuarioExtra.getUser().getLogin(), true);
mailService.sendActivatedAccountMail(usuarioExtra); //se manda el correo de reactivacion
}
return ResponseEntity return ResponseEntity
.ok() .ok()
.headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, usuarioExtra.getId().toString())) .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, usuarioExtra.getId().toString()))

View File

@ -0,0 +1,10 @@
package org.datasurvey.web.rest.errors;
public class EmailNotExistException extends BadRequestAlertException {
private static final long serialVersionUID = 1L;
public EmailNotExistException() {
super(ErrorConstants.EMAIL_NOT_EXISTS_TYPE, "Email not exists!", "userManagement", "emailnotexists");
}
}

View File

@ -12,6 +12,8 @@ public final class ErrorConstants {
public static final URI INVALID_PASSWORD_TYPE = URI.create(PROBLEM_BASE_URL + "/invalid-password"); public static final URI INVALID_PASSWORD_TYPE = URI.create(PROBLEM_BASE_URL + "/invalid-password");
public static final URI EMAIL_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/email-already-used"); public static final URI EMAIL_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/email-already-used");
public static final URI LOGIN_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/login-already-used"); public static final URI LOGIN_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/login-already-used");
public static final URI EMAIL_NOT_EXISTS_TYPE = URI.create(PROBLEM_BASE_URL + "/email-not-exists");
public static final URI USER_IS_GOOGLE_TYOE = URI.create(PROBLEM_BASE_URL + "/user-is-google");
private ErrorConstants() {} private ErrorConstants() {}
} }

View File

@ -0,0 +1,10 @@
package org.datasurvey.web.rest.errors;
public class UserIsGoogleException extends BadRequestAlertException {
private static final long serialVersionUID = 1L;
public UserIsGoogleException() {
super(ErrorConstants.USER_IS_GOOGLE_TYOE, "User Is Google", "userManagement", "userisgoogle");
}
}

View File

@ -19,3 +19,56 @@ email.reset.title=DataSurvey password reset
email.reset.greeting=Dear {0} email.reset.greeting=Dear {0}
email.reset.text1=For your DataSurvey account a password reset was requested, please click on the URL below to reset it: email.reset.text1=For your DataSurvey account a password reset was requested, please click on the URL below to reset it:
email.reset.text2=Regards, email.reset.text2=Regards,
# Password Restored Mail
email.restored.title=Your password was reset in DataSurvey
email.restored.greeting=Hello, {0}!
email.restored.text1=Your DataSurvey password has been successfully reset..
email.restored.text2=Regards,
email.restored.text3=If you did not make this change, please notify the following email immediately:
email.restored.email=datasurvey@gmail.com
#reactivar la cuenta
email.reactivation.title=Your account has been reactivated
email.reactivation.greeting=Hello, {0}!
email.reactivation.text1=Your account has been reactivated. Please click on the link so you can keep enjoying DataSurvey:
email.reactivation.text2=Regards,
#suspended accounr
email.suspended.title=Your account has been suspended
email.suspended.greeting=Dear {0}
email.suspended.text1=Su cuenta en DataSurvey se encuentra temporalmente suspendida. Si cree que es un error por favor haga clic en el siguiente enlace para enviar una solicitud para reactivar su cuenta:
email.suspended.text2=Saludos,
#PublicEncuesta
email.public.title=Su encuesta ha sido publicada
email.public.greeting=¡Felicidades {0}!
email.public.text1=Su encuesta ha sido publicada de manera publica
email.public.text2=Saludos,
#PrivateEncuesta
email.private.title=Su encuesta ha sido publicada de manera privada
email.private.greeting=¡Felicidades {0}!
email.private.text1=Su encuesta ha sdo publicada de manera privada. Su contraseña de acceso es: {0}
email.private.text2=Saludos,
#Invitation Colaborator
email.invitation.title=Se le ha invitado a colaborar en una encuesta
email.invitation.greeting=¡Nueva invitación, {0}!
email.invitation.text1=Fue invitado a la encuesta "{0}(#{1})". Para aceptar la solicitud de colaborador, ingrese al área de colaboraciones
email.invitation.text2=Saludos,
#Delete Colaborator
email.deleteColaborator.title=Eliminado de colaboración
email.deleteColaborator.greeting=Hola, {0}
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.receipt.title=Comprobante de pago
email.receipt.user={0}
email.receipt.fecha=Fecha de pago: {0}
email.receipt.plantilla={0}
email.receipt.precio=${0}

View File

@ -5,17 +5,56 @@ error.status=Estado:
error.message=Mensaje: error.message=Mensaje:
# Activation email # Activation email
email.activation.title=Activación de DataSurvey email.activation.title=Confirmación de correo con DataSurvey
email.activation.greeting=Estimado/a {0} email.activation.greeting=¡Hola, {0}!
email.activation.text1=Su cuenta en DataSurvey ha sido creada. Por favor, haga clic en el siguiente enlace para activarla: email.activation.text1=¡Nos alegra que sea parte de DataSurvey! Como último paso debe confirmar su dirección de correo haciendo clic en el siguiente enlace:
email.activation.text2=Saludos, email.activation.text2=Saludos,
email.signature=Equipo de DataSurvey. email.signature=Equipo de DataSurvey
# Creation email # Creation email
email.creation.text1=Su cuenta en DataSurvey ha sido creada. Por favor, haga clic en el siguiente enlace para utilizarla: email.creation.text1=Su cuenta en DataSurvey ha sido creada. Por favor, haga clic en el siguiente enlace para utilizarla:
# Reset email # Reset email
email.reset.title=Reinicio de contraseña de DataSurvey email.reset.title=Restablecer contraseña de DataSurvey
email.reset.greeting=Estimado/a {0} email.reset.greeting=¡Hola, {0}!
email.reset.text1=Se ha solicitado el reinicio de la contraseña para su cuenta en DataSurvey. Por favor, haga clic en el siguiente enlace para reiniciarla: email.reset.text1=Se ha solicitado una modificación de contraseña para su cuenta en DataSurvey. Por favor haga clic en el siguiente enlace para restablecerla:
email.reset.text2=Saludos, email.reset.text2=Saludos,
# Password Restored Mail
email.restored.title=Modificación de contraseña exitosa
email.restored.greeting=¡Hola, {0}!
email.restored.text1=¡Se ha restablecido correctamente su contraseña en DataSurvey!
email.restored.text2=Saludos,
email.restored.text3=Si usted no realizó este cambio, favor notifique inmediatamente al siguiente correo:
email.restored.email=datasurvey@gmail.com
#reactivate account
email.reactivation.title=Su cuenta ha sido reactivada
email.reactivation.greeting=¡Hola, {0}!
email.reactivation.text1=Su cuenta en DataSurvey ha sido reactivada. Por favor haga clic en el siguiente enlace para iniciar sesión y disfrutar de DataSurvey:
email.reactivation.text2=Saludos,
#suspended accounr
email.suspended.title=Su cuenta ha sido suspendida
email.suspended.greeting=Estimado {0}
email.suspended.text1=Lamentamos informarle que su cuenta en DataSurvey se encuentra temporalmente suspendida. Si cree que es un error por favor responda a este correo
email.suspended.text2=Saludos,
#PublicEncuesta
email.public.title=Su encuesta ha sido publicada
email.public.greeting=¡Felicidades {0}!
email.public.text1=Su encuesta ha sido publicada de manera publica
email.public.text2=Saludos,
#PrivateEncuesta
email.private.title=Su encuesta ha sido publicada de manera privada
email.private.greeting=¡Felicidades {0}!
email.private.text1=Su encuesta ha sdo publicada de manera privada. Su contraseña de acceso es: {0}
email.private.text2=Saludos,
#DeletedEncuesta
email.encuestaDeleted.title=Su encuesta ha sido eliminada
email.encuestaDeleted.greeting=Estimado {0}
email.encuestaDeleted.text1=Lamentamos informarle que su encuesta ha sido eliminada por un administrador
email.encuestaDeleted.text2=Saludos,

View File

@ -1,20 +1,327 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> <html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head> <head>
<title th:text="#{email.activation.title}">JHipster activation</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.activation.title}">JHipster activation</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" /> <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head> </head>
<body>
<p th:text="#{email.activation.greeting(${user.login})}">Dear</p> <body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<p th:text="#{email.activation.text1}">Your JHipster account has been created, please click on the URL below to activate it:</p> <center style="width: 100%; background-color: #f1f1f1">
<p> <div
<a th:with="url=(@{|${baseUrl}/account/activate?key=${user.activationKey}|})" th:href="${url}" th:text="${url}">Activation link</a> style="
</p> display: none;
<p> font-size: 1px;
<span th:text="#{email.activation.text2}">Regards, </span> max-height: 0px;
<br /> max-width: 0px;
<em th:text="#{email.signature}">JHipster.</em> opacity: 0;
</p> overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 250px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.activation.greeting(${user.login})}">¡Hola!</h2>
<h3 th:text="#{email.activation.text1}">
Your JHipster account has been created, please click on the URL below to activate it:
</h3>
<p>
<a
th:with="url=(@{|${baseUrl}/account/activate?key=${user.activationKey}|})"
th:href="${url}"
class="btn btn-primary"
>Confirmar correo electrónico</a
>
</p>
</div>
<div class="text" style="padding: 1em 2.5em; text-align: center">
<p>
<span th:text="#{email.activation.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body> </body>
</html> </html>

View File

@ -1,20 +1,327 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> <html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head> <head>
<title th:text="#{email.activation.title}">JHipster creation</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.activation.title}">JHipster creation</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" /> <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head> </head>
<body>
<p th:text="#{email.activation.greeting(${user.login})}">Dear</p> <body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<p th:text="#{email.creation.text1}">Your JHipster account has been created, please click on the URL below to access it:</p> <center style="width: 100%; background-color: #f1f1f1">
<p> <div
<a th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}" th:text="${url}">Login link</a> style="
</p> display: none;
<p> font-size: 1px;
<span th:text="#{email.activation.text2}">Regards, </span> max-height: 0px;
<br /> max-width: 0px;
<em th:text="#{email.signature}">JHipster.</em> opacity: 0;
</p> overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 250px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.activation.greeting(${user.login})}">¡Hola!</h2>
<h3 th:text="#{email.creation.text1}">
Your JHipster account has been created, please click on the URL below to access it:
</h3>
<p>
<a
th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})"
th:href="${url}"
class="btn btn-primary"
>Iniciar Sesión</a
>
</p>
</div>
<div class="text" style="padding: 1em 2.5em; text-align: center">
<p>
<span th:text="#{email.activation.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted.</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body> </body>
</html> </html>

View File

@ -0,0 +1,322 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.deleteColaborator.title}">JHipster activation</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head>
<body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<center style="width: 100%; background-color: #f1f1f1">
<div
style="
display: none;
font-size: 1px;
max-height: 0px;
max-width: 0px;
opacity: 0;
overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 250px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.deleteColaborator.greeting(${user.login})}">¡Hola!</h2>
<h3 th:text="#{email.deleteColaborator.text1(${colaborador.encuesta.nombre}, ${colaborador.encuesta.id})}">
Your JHipster account has been created, please click on the URL below to activate it:
</h3>
<p>
<a th:with="url=(@{|${baseUrl}/colaboraciones|})" th:href="${url}" class="btn btn-primary">Ir a Colaboraciones</a>
</p>
</div>
<div class="text" style="padding: 1em 2.5em; text-align: center">
<p>
<span th:text="#{email.deleteColaborator.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body>
</html>

View File

@ -0,0 +1,310 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.encuestaDeleted.title}">Encuesta Eliminada</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head>
<body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<center style="width: 100%; background-color: #f1f1f1">
<div
style="
display: none;
font-size: 1px;
max-height: 0px;
max-width: 0px;
opacity: 0;
overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 300px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.encuestaDeleted.greeting(${user.login})}">¡Encuesta eliminada!</h2>
<h3 th:text="#{email.encuestaDeleted.text1}">¡Su encuesta ha sido eliminada exitosamente!</h3>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted.</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body>
</html>

View File

@ -0,0 +1,319 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.private.title}">JHipster activation</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head>
<body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<center style="width: 100%; background-color: #f1f1f1">
<div
style="
display: none;
font-size: 1px;
max-height: 0px;
max-width: 0px;
opacity: 0;
overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 250px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.private.greeting(${user.login})}">¡Hola!</h2>
<h3 th:text="#{email.private.text1(${contrasenna})}">
Your JHipster account has been created, please click on the URL below to activate it:
</h3>
</div>
<div class="text" style="padding: 1em 2.5em; text-align: center">
<p>
<span th:text="#{email.private.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body>
</html>

View File

@ -0,0 +1,319 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.public.title}">JHipster activation</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head>
<body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<center style="width: 100%; background-color: #f1f1f1">
<div
style="
display: none;
font-size: 1px;
max-height: 0px;
max-width: 0px;
opacity: 0;
overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 250px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.public.greeting(${user.login})}">¡Hola!</h2>
<h3 th:text="#{email.public.text1}">
Your JHipster account has been created, please click on the URL below to activate it:
</h3>
</div>
<div class="text" style="padding: 1em 2.5em; text-align: center">
<p>
<span th:text="#{email.public.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body>
</html>

View File

@ -0,0 +1,285 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.receipt.title}">JHipster activation</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<link
href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk"
crossorigin="anonymous"
/>
<style>
body {
margin-top: 20px;
color: #484b51;
}
.brc-default-l1 {
border-color: #dce9f0 !important;
}
.ml-n1,
.mx-n1 {
margin-left: -0.25rem !important;
}
.mr-n1,
.mx-n1 {
margin-right: -0.25rem !important;
}
.mb-4,
.my-4 {
margin-bottom: 1.5rem !important;
}
hr {
margin-top: 1rem;
margin-bottom: 1rem;
border: 0;
border-top: 1px solid rgba(0, 0, 0, 0.1);
}
.text-grey-m2 {
color: #888a8d !important;
}
.font-bolder,
.text-600 {
font-weight: 600 !important;
}
.text-110 {
font-size: 110% !important;
}
.text-blue {
color: #478fcc !important;
}
.pb-25,
.py-25 {
padding-bottom: 0.75rem !important;
}
.pt-25,
.py-25 {
padding-top: 0.75rem !important;
}
.bgc-default-tp1 {
background-color: rgba(121, 169, 197, 0.92) !important;
}
.page-header .page-tools {
-ms-flex-item-align: end;
align-self: flex-end;
}
.text-blue-m2 {
color: #68a3d5 !important;
}
.text-150 {
font-size: 150% !important;
}
</style>
</head>
<body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<center style="width: 100%; background-color: #f1f1f1">
<div
style="
display: none;
font-size: 1px;
max-height: 0px;
max-width: 0px;
opacity: 0;
overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- end tr -->
<div class="page-content container">
<div class="container px-0">
<div class="row mt-4">
<div>
<!-- .row -->
<div class="row">
<div class="col-sm-6">
<div>
<span class="text-sm text-grey-m2 align-middle">Usuario:</span>
<span
class="text-600 text-110 text-blue align-middle"
th:text="#{email.receipt.user(${factura.getNombreUsuario()})}"
></span>
</div>
</div>
<!-- /.col -->
<div class="text-95 col-sm-6 align-self-start d-sm-flex justify-content-end">
<div class="text-grey-m2">
<div class="my-2">
<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' )}"
>Fecha:</span
>
</div>
</div>
</div>
<hr class="d-sm-none" />
<!-- /.col -->
</div>
<div class="container">
<div class="row">
<div class="col-lg-10 mt-5 mb-5">
<table class="table table-bordered" style="width: 100%">
<thead>
<tr class="text-uppercase font-weight-bold text-blue">
<th>Plantilla</th>
<th>Cantidad</th>
<th>Precio</th>
</tr>
</thead>
<tbody style="text-align: center">
<tr class="text-95 text-secondary-d3">
<td th:text="#{email.receipt.plantilla(${factura.getNombrePlantilla()})}"></td>
<td>1</td>
<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 class="row mt-3">
<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="col-7 text-600 text-110 text-blue text-right">Monto total:</div>
<div class="col-5">
<span class="text-150 text-success-d3 opacity-2" th:text="#{email.receipt.precio(${factura.getCosto()})}"></span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
<script
src="https://code.jquery.com/jquery-3.5.1.min.js"
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/2.4.1/cjs/popper.min.js"
integrity="sha256-T3bYsIPyOLpEfeZOX4M7J59ZoDMzuYFUsPiSN3Xcc2M="
crossorigin="anonymous"
></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"
integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI"
crossorigin="anonymous"
></script>
</body>
</html>

View File

@ -0,0 +1,322 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.invitation.title}">JHipster activation</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head>
<body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<center style="width: 100%; background-color: #f1f1f1">
<div
style="
display: none;
font-size: 1px;
max-height: 0px;
max-width: 0px;
opacity: 0;
overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 250px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.invitation.greeting(${user.login})}">¡Hola!</h2>
<h3 th:text="#{email.invitation.text1(${colaborador.encuesta.nombre}, ${colaborador.encuesta.id})}">
Your JHipster account has been created, please click on the URL below to activate it:
</h3>
<p>
<a th:with="url=(@{|${baseUrl}/colaboraciones|})" th:href="${url}" class="btn btn-primary">Ir a Colaboraciones</a>
</p>
</div>
<div class="text" style="padding: 1em 2.5em; text-align: center">
<p>
<span th:text="#{email.reactivation.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body>
</html>

View File

@ -1,22 +1,327 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> <html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head> <head>
<title th:text="#{email.reset.title}">JHipster password reset</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.reset.title}">JHipster password reset</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" /> <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head> </head>
<body>
<p th:text="#{email.reset.greeting(${user.login})}">Dear</p> <body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<p th:text="#{email.reset.text1}"> <center style="width: 100%; background-color: #f1f1f1">
For your JHipster account a password reset was requested, please click on the URL below to reset it: <div
</p> style="
<p> display: none;
<a th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}" th:text="${url}">Login link</a> font-size: 1px;
</p> max-height: 0px;
<p> max-width: 0px;
<span th:text="#{email.reset.text2}">Regards, </span> opacity: 0;
<br /> overflow: hidden;
<em th:text="#{email.signature}">JHipster.</em> mso-hide: all;
</p> font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 250px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.reset.greeting(${user.login})}">¡Hola!</h2>
<h3 th:text="#{email.reset.text1}">
For your JHipster account a password reset was requested, please click on the URL below to reset it:
</h3>
<p>
<a
th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})"
th:href="${url}"
class="btn btn-primary"
>Restablecer contraseña</a
>
</p>
</div>
<div class="text" style="padding: 1em 2.5em; text-align: center">
<p>
<span th:text="#{email.reset.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted.</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body> </body>
</html> </html>

View File

@ -0,0 +1,329 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.restored.title}">JHipster password restored</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head>
<body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<center style="width: 100%; background-color: #f1f1f1">
<div
style="
display: none;
font-size: 1px;
max-height: 0px;
max-width: 0px;
opacity: 0;
overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 250px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.restored.greeting(${user.login})}">Hello!</h2>
<h3 th:text="#{email.restored.text1}">For your JHipster account a password has been successfully reset</h3>
<p style="cursor: pointer">
<a th:with="url=(@{|${baseUrl}/login|})" th:href="${url}" class="btn btn-primary">Iniciar Sesión</a>
</p>
</div>
<div class="text" style="padding: 1em 2.5em; text-align: center">
<p>
<span th:text="#{email.restored.text3}"
>If you did not make this change, please notify the following email immediately</span
>
<a href="mailto:datasurveyapp@gmail.com" th:text="#{email.restored.email}">datasurveyapp@gmail.com</a>
</p>
</div>
<div class="text" style="padding: 0.2em 2.5em 0.5em; text-align: center">
<p>
<span th:text="#{email.restored.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted.</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body>
</html>

View File

@ -0,0 +1,322 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.reactivation.title}">JHipster activation</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head>
<body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<center style="width: 100%; background-color: #f1f1f1">
<div
style="
display: none;
font-size: 1px;
max-height: 0px;
max-width: 0px;
opacity: 0;
overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 250px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.reactivation.greeting(${user.login})}">¡Hola!</h2>
<h3 th:text="#{email.reactivation.text1}">
Your JHipster account has been created, please click on the URL below to activate it:
</h3>
<p>
<a th:with="url=(@{|${baseUrl}/login|})" th:href="${url}" class="btn btn-primary">Iniciar Sesión</a>
</p>
</div>
<div class="text" style="padding: 1em 2.5em; text-align: center">
<p>
<span th:text="#{email.reactivation.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body>
</html>

View File

@ -0,0 +1,319 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Use the latest (edge) version of IE rendering engine -->
<meta name="x-apple-disable-message-reformatting" />
<!-- Disable auto-scale in iOS 10 Mail entirely -->
<title th:text="#{email.suspended.title}">JHipster activation</title>
<link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
<link href="https://fonts.googleapis.com/css?family=NotoSansSP:300,400,700" rel="stylesheet" />
<link rel="manifest" href="manifest.webapp" />
<style>
.bg_white {
background: #ffffff;
}
.bg_light {
background: #fafafa;
}
.bg_black {
background: #000000;
}
.bg_dark {
background: rgba(0, 0, 0, 0.8);
}
.email-section {
padding: 2.5em;
}
/*BUTTON*/
.btn {
padding: 10px 15px;
display: inline-block;
}
.btn.btn-primary {
border-radius: 5px;
background: #007bff;
color: #ffffff;
}
.btn.btn-white {
border-radius: 5px;
background: #ffffff;
color: #000000;
}
.btn.btn-white-outline {
border-radius: 5px;
background: transparent;
border: 1px solid #fff;
color: #fff;
}
.btn.btn-black-outline {
border-radius: 0px;
background: transparent;
border: 2px solid #000;
color: #000;
font-weight: 700;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Lato', sans-serif;
color: #000000;
margin-top: 0;
font-weight: 400;
}
body {
font-family: 'Noto Sans JP', sans-serif;
font-weight: 400;
font-size: 15px;
line-height: 1.8;
color: rgba(0, 0, 0, 0.4);
}
a {
color: #30e3ca;
}
table {
}
/*LOGO*/
.logo h1 {
margin: 0;
}
.logo h1 a {
color: #30e3ca;
font-size: 24px;
font-weight: 700;
font-family: 'Lato', sans-serif;
}
/*HERO*/
.hero {
position: relative;
z-index: 0;
}
.hero .text {
color: rgba(0, 0, 0, 0.3);
}
.hero .text h2 {
color: #000;
font-size: 40px;
margin-bottom: 0;
font-weight: 400;
line-height: 1.4;
}
.hero .text h3 {
font-size: 24px;
font-weight: 300;
}
.hero .text h2 span {
font-weight: 600;
color: #30e3ca;
}
/*HEADING SECTION*/
.heading-section {
}
.heading-section h2 {
color: #000000;
font-size: 28px;
margin-top: 0;
line-height: 1.4;
font-weight: 400;
}
.heading-section .subheading {
margin-bottom: 20px !important;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(0, 0, 0, 0.4);
position: relative;
}
.heading-section .subheading::after {
position: absolute;
left: 0;
right: 0;
bottom: -10px;
content: '';
width: 100%;
height: 2px;
background: #30e3ca;
margin: 0 auto;
}
.heading-section-white {
color: rgba(255, 255, 255, 0.8);
}
.heading-section-white h2 {
/*font-family: ;*/
line-height: 1;
padding-bottom: 0;
}
.heading-section-white h2 {
color: #ffffff;
}
.heading-section-white .subheading {
margin-bottom: 0;
display: inline-block;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 2px;
color: rgba(255, 255, 255, 0.4);
}
ul.social {
padding: 0;
}
ul.social li {
display: inline-block;
margin-right: 10px;
}
.footer {
border-top: 1px solid rgba(0, 0, 0, 0.05);
color: rgba(0, 0, 0, 0.5);
}
.footer .heading {
color: #000;
font-size: 20px;
}
.footer ul {
margin: 0;
padding: 0;
}
.footer ul li {
list-style: none;
margin-bottom: 10px;
}
.footer ul li a {
color: rgba(0, 0, 0, 1);
}
</style>
</head>
<body width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #f1f1f1">
<center style="width: 100%; background-color: #f1f1f1">
<div
style="
display: none;
font-size: 1px;
max-height: 0px;
max-width: 0px;
opacity: 0;
overflow: hidden;
mso-hide: all;
font-family: sans-serif;
"
>
&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;
</div>
<div style="max-width: 600px; margin: 0 auto" class="email-container">
<!-- BEGIN BODY -->
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="top" class="bg_white" style="padding: 1em 2.5em 0 2.5em">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="logo" style="text-align: center">
<h1>
<a href="#"
><img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333881/DataSurveyLogo2_smr2ok.png"
alt=""
width="300"
/></a>
</h1>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 3em 0 2em 0">
<img
src="https://res.cloudinary.com/marielascloud/image/upload/v1626333882/email_v7pjtv.png"
alt=""
style="width: 250px; max-width: 600px; height: auto; margin: auto; display: block"
/>
</td>
</tr>
<!-- end tr -->
<tr>
<td valign="middle" class="hero bg_white" style="padding: 2em 0 4em 0">
<table>
<tr>
<td>
<div class="text" style="padding: 0 2.5em; text-align: center">
<h2 th:text="#{email.suspended.greeting(${user.login})}">¡Hola!</h2>
<h3 th:text="#{email.suspended.text1}">
Your JHipster account has been created, please click on the URL below to activate it:
</h3>
</div>
<div class="text" style="padding: 1em 2.5em; text-align: center">
<p>
<span th:text="#{email.suspended.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
<!-- end tr -->
<!-- 1 Column Text + Button : END -->
</table>
<table align="center" role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin: auto">
<tr>
<td valign="middle" class="bg_light footer email-section">
<table>
<tr>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-right: 10px">
<h3 class="heading">Acerca de</h3>
<p>DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted</p>
</td>
</tr>
</table>
</td>
<td valign="top" width="33.333%" style="padding-top: 20px">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="text-align: left; padding-left: 5px; padding-right: 5px">
<h3 class="heading">Información de contacto</h3>
<ul>
<li><span href="mailto:datasurveyapp@gmail.com" class="text">datasurveyapp@gmail.com</span></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- end: tr -->
<tr>
<td class="bg_light" style="text-align: center">
<p><a href="https://datasurvey.org" style="color: rgba(0, 0, 0, 0.8)">DataSurvey.org</a></p>
</td>
</tr>
</table>
</div>
</center>
</body>
</html>

View File

@ -1,16 +1,52 @@
<div> <div class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5" style="height: 100vh; background-color: #f1f5f9">
<div class="row justify-content-center"> <div class="container">
<div class="col-md-8"> <div class="row justify-content-center">
<h1 jhiTranslate="activate.title">Activation</h1> <div class="col-xxl-4 col-lg-5">
<div class="card mt-5">
<!-- Logo -->
<div class="pl-4 pt-4 pr-4 pb-1 text-center">
<img src="../../content/img_datasurvey/datasurvey-logo-text-black.svg" alt="" />
</div>
<div class="alert alert-success" *ngIf="success"> <div class="card-body p-4">
<span jhiTranslate="activate.messages.success"><strong>Your user account has been activated.</strong> Please </span> <div class="text-center w-75 m-auto">
<a class="alert-link" routerLink="/login" jhiTranslate="global.messages.info.authenticated.link">sign in</a>. <h4
</div> class="text-dark-50 text-center pb-0 fw-bold p-0 m-0"
style="color: #727070; font-weight: 700; font-size: 1.3rem"
jhiTranslate="activate.title"
>
Registro Completado
</h4>
</div>
<div *ngIf="success">
<div class="alert alert-success text-center my-2">
<span jhiTranslate="activate.messages.success"></span>
</div>
<div class="d-flex justify-content-center">
<button class="ds-btn ds-btn--primary" routerLink="/login" jhiTranslate="global.messages.info.authenticated.link">
sign in
</button>
</div>
</div>
<div *ngIf="error">
<div class="alert alert-danger text-center my-2" jhiTranslate="activate.messages.error"></div>
<div class="d-flex justify-content-center">
<button class="ds-btn ds-btn--primary" routerLink="/account/register" jhiTranslate="global.registerLink">
create account
</button>
</div>
</div>
</div>
<!-- end card-body -->
</div>
<!-- end card -->
<div class="alert alert-danger" *ngIf="error" jhiTranslate="activate.messages.error"> <!-- end row -->
<strong>Your user could not be activated.</strong> Please use the registration form to sign up.
</div> </div>
<!-- end col -->
</div> </div>
<!-- end row -->
</div> </div>
<!-- end container -->
</div> </div>
<!-- end page -->

View File

@ -1,137 +1,171 @@
<div> <div class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5" style="height: 100vh; background-color: #f1f5f9">
<div class="row justify-content-center"> <div class="container">
<div class="col-md-4"> <div class="row justify-content-center">
<h1 jhiTranslate="reset.finish.title">Reset password</h1> <div class="col-xxl-4 col-lg-5">
<div class="card mt-5">
<div class="alert alert-danger" jhiTranslate="reset.finish.messages.keymissing" *ngIf="initialized && !key"> <!-- Logo -->
<strong>The password reset key is missing.</strong> <div class="pl-4 pt-4 pr-4 pb-1 text-center">
</div> <img src="../../content/img_datasurvey/datasurvey-logo-text-black.svg" alt="" />
<div class="alert alert-warning" *ngIf="key && !success">
<span jhiTranslate="reset.finish.messages.info">Choose a new password</span>
</div>
<div class="alert alert-danger" *ngIf="error">
<span jhiTranslate="reset.finish.messages.error"
>Your password couldn't be reset. Remember a password request is only valid for 24 hours.</span
>
</div>
<div class="alert alert-success" *ngIf="success">
<span jhiTranslate="reset.finish.messages.success"><strong>Your password has been reset.</strong> Please </span>
<a class="alert-link" routerLink="/login" jhiTranslate="global.messages.info.authenticated.link">sign in</a>.
</div>
<div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch">
The password and its confirmation do not match!
</div>
<div *ngIf="key && !success">
<form name="form" role="form" (ngSubmit)="finishReset()" [formGroup]="passwordForm">
<div class="form-group">
<label class="form-control-label" for="newPassword" jhiTranslate="global.form.newpassword.label">New password</label>
<input
type="password"
class="form-control"
id="newPassword"
name="newPassword"
placeholder="{{ 'global.form.newpassword.placeholder' | translate }}"
formControlName="newPassword"
data-cy="resetPassword"
#newPassword
/>
<div
*ngIf="
passwordForm.get('newPassword')!.invalid &&
(passwordForm.get('newPassword')!.dirty || passwordForm.get('newPassword')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('newPassword')?.errors?.required"
jhiTranslate="global.messages.validate.newpassword.required"
>
Your password is required.
</small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('newPassword')?.errors?.minlength"
jhiTranslate="global.messages.validate.newpassword.minlength"
>
Your password is required to be at least 4 characters.
</small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('newPassword')?.errors?.maxlength"
jhiTranslate="global.messages.validate.newpassword.maxlength"
>
Your password cannot be longer than 50 characters.
</small>
</div>
<jhi-password-strength-bar [passwordToCheck]="passwordForm.get('newPassword')!.value"></jhi-password-strength-bar>
</div> </div>
<div class="form-group"> <div class="card-body p-4">
<label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label" <div class="text-center w-75 m-auto">
>New password confirmation</label <h4
> class="text-dark-50 text-center pb-0 fw-bold p-0 m-0"
<input style="color: #727070; font-weight: 700; font-size: 1.3rem"
type="password" jhiTranslate="reset.finish.title"
class="form-control"
id="confirmPassword"
name="confirmPassword"
placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}"
formControlName="confirmPassword"
data-cy="confirmResetPassword"
/>
<div
*ngIf="
passwordForm.get('confirmPassword')!.invalid &&
(passwordForm.get('confirmPassword')!.dirty || passwordForm.get('confirmPassword')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('confirmPassword')?.errors?.required"
jhiTranslate="global.messages.validate.confirmpassword.required"
> >
Your password confirmation is required. Reset password
</small> </h4>
<small <p class="mb-4" style="color: rgba(146, 146, 146, 0.664)" *ngIf="key && !success" jhiTranslate="reset.finish.messages.info">
class="form-text text-danger" Choose a new password
*ngIf="passwordForm.get('confirmPassword')?.errors?.minlength" </p>
jhiTranslate="global.messages.validate.confirmpassword.minlength" </div>
> <div>
Your password confirmation is required to be at least 4 characters. <div class="alert alert-danger" jhiTranslate="reset.finish.messages.keymissing" *ngIf="initialized && !key">
</small> <strong>The password reset key is missing.</strong>
</div>
<small <div class="alert alert-danger" *ngIf="error">
class="form-text text-danger" <span jhiTranslate="reset.finish.messages.error"
*ngIf="passwordForm.get('confirmPassword')?.errors?.maxlength" >Your password couldn't be reset. Remember a password request is only valid for 24 hours.</span
jhiTranslate="global.messages.validate.confirmpassword.maxlength" >
> </div>
Your password confirmation cannot be longer than 50 characters. <div *ngIf="success">
</small> <div class="alert alert-success text-center my-2">
<span jhiTranslate="reset.finish.messages.success"><strong>Your password has been reset.</strong></span>
</div>
<div class="d-flex justify-content-center">
<button class="ds-btn ds-btn--primary" routerLink="/login" jhiTranslate="global.messages.info.authenticated.botonInicio">
sign in
</button>
</div>
</div>
<div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch">
The password and its confirmation do not match!
</div>
</div>
<div *ngIf="key && !success">
<form name="form" class="ds-form" role="form" (ngSubmit)="finishReset()" [formGroup]="passwordForm">
<div class="form-group">
<label class="form-control-label" for="newPassword" jhiTranslate="global.form.newpassword.label">New password</label>
<input
type="password"
class="form-control"
id="newPassword"
name="newPassword"
placeholder="{{ 'global.form.newpassword.placeholder' | translate }}"
formControlName="newPassword"
data-cy="resetPassword"
#newPassword
/>
<div
*ngIf="
passwordForm.get('newPassword')!.invalid &&
(passwordForm.get('newPassword')!.dirty || passwordForm.get('newPassword')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('newPassword')?.errors?.required"
jhiTranslate="global.messages.validate.newpassword.required"
>
Your password is required.
</small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('newPassword')?.errors?.minlength"
jhiTranslate="global.messages.validate.newpassword.minlength"
>
Your password is required to be at least 8 characters.
</small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('newPassword')?.errors?.maxlength"
jhiTranslate="global.messages.validate.newpassword.maxlength"
>
Your password cannot be longer than 50 characters.
</small>
</div>
<!--<jhi-password-strength-bar [passwordToCheck]="passwordForm.get('newPassword')!.value"></jhi-password-strength-bar>-->
</div>
<div class="form-group">
<label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label"
>New password confirmation</label
>
<input
type="password"
class="form-control"
id="confirmPassword"
name="confirmPassword"
placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}"
formControlName="confirmPassword"
data-cy="confirmResetPassword"
/>
<div
*ngIf="
passwordForm.get('confirmPassword')!.invalid &&
(passwordForm.get('confirmPassword')!.dirty || passwordForm.get('confirmPassword')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('confirmPassword')?.errors?.required"
jhiTranslate="global.messages.validate.confirmpassword.required"
>
Your password confirmation is required.
</small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('confirmPassword')?.errors?.minlength"
jhiTranslate="global.messages.validate.confirmpassword.minlength"
>
Your password confirmation is required to be at least 8 characters.
</small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('confirmPassword')?.errors?.maxlength"
jhiTranslate="global.messages.validate.confirmpassword.maxlength"
>
Your password confirmation cannot be longer than 50 characters.
</small>
</div>
</div>
<div class="row justify-content-center">
<button
type="submit"
[disabled]="passwordForm.invalid"
class="ds-btn ds-btn--primary"
jhiTranslate="reset.finish.form.button"
data-cy="submit"
>
Reset Password
</button>
</div>
</form>
</div> </div>
</div> </div>
<!-- end card-body -->
</div>
<!-- end card -->
<button <!-- end row -->
type="submit"
[disabled]="passwordForm.invalid"
class="btn btn-primary"
jhiTranslate="reset.finish.form.button"
data-cy="submit"
>
Reset Password
</button>
</form>
</div> </div>
<!-- end col -->
</div> </div>
<!-- end row -->
</div> </div>
<!-- end container -->
</div> </div>
<!-- end page -->

View File

@ -19,8 +19,8 @@ export class PasswordResetFinishComponent implements OnInit, AfterViewInit {
key = ''; key = '';
passwordForm = this.fb.group({ passwordForm = this.fb.group({
newPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], newPassword: ['', [Validators.required, Validators.minLength(8), Validators.maxLength(50)]],
confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], confirmPassword: ['', [Validators.required, Validators.minLength(8), Validators.maxLength(50)]],
}); });
constructor(private passwordResetFinishService: PasswordResetFinishService, private route: ActivatedRoute, private fb: FormBuilder) {} constructor(private passwordResetFinishService: PasswordResetFinishService, private route: ActivatedRoute, private fb: FormBuilder) {}

View File

@ -1,81 +1,116 @@
<div> <div class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5" style="height: 100vh; background-color: #f1f5f9">
<div class="row justify-content-center"> <div class="container">
<div class="col-md-8"> <div class="row justify-content-center">
<h1 jhiTranslate="reset.request.title">Reset your password</h1> <div class="col-xxl-4 col-lg-5">
<div class="card mt-5">
<jhi-alert-error></jhi-alert-error> <!-- Logo -->
<div class="pl-4 pt-4 pr-4 pb-1 text-center">
<div class="alert alert-warning" *ngIf="!success"> <img src="../../content/img_datasurvey/datasurvey-logo-text-black.svg" alt="" />
<span jhiTranslate="reset.request.messages.info">Enter the email address you used to register.</span>
</div>
<div class="alert alert-success" *ngIf="success">
<span jhiTranslate="reset.request.messages.success">Check your emails for details on how to reset your password.</span>
</div>
<form *ngIf="!success" name="form" role="form" (ngSubmit)="requestReset()" [formGroup]="resetRequestForm">
<div class="form-group">
<label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label>
<input
type="email"
class="form-control"
id="email"
name="email"
placeholder="{{ 'global.form.email.placeholder' | translate }}"
formControlName="email"
data-cy="emailResetPassword"
#email
/>
<div
*ngIf="
resetRequestForm.get('email')!.invalid && (resetRequestForm.get('email')!.dirty || resetRequestForm.get('email')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="resetRequestForm.get('email')?.errors?.required"
jhiTranslate="global.messages.validate.email.required"
>
Your email is required.
</small>
<small
class="form-text text-danger"
*ngIf="resetRequestForm.get('email')?.errors?.email"
jhiTranslate="global.messages.validate.email.invalid"
>
Your email is invalid.
</small>
<small
class="form-text text-danger"
*ngIf="resetRequestForm.get('email')?.errors?.minlength"
jhiTranslate="global.messages.validate.email.minlength"
>
Your email is required to be at least 5 characters.
</small>
<small
class="form-text text-danger"
*ngIf="resetRequestForm.get('email')?.errors?.maxlength"
jhiTranslate="global.messages.validate.email.maxlength"
>
Your email cannot be longer than 100 characters.
</small>
</div> </div>
</div>
<button <div class="card-body p-4">
type="submit" <div class="text-center w-75 m-auto">
[disabled]="resetRequestForm.invalid" <h4
class="btn btn-primary" class="text-dark-50 text-center pb-0 fw-bold p-0 m-0"
jhiTranslate="reset.request.form.button" style="color: #727070; font-weight: 700; font-size: 1.3rem"
data-cy="submit" jhiTranslate="reset.request.title"
> >
Reset RESET YOUR PASSWORD
</button> </h4>
</form> <p class="mb-4" style="color: rgba(146, 146, 146, 0.664)" jhiTranslate="reset.request.messages.info">
Enter the email address you used to register.
</p>
</div>
<div>
<div class="alert alert-success" *ngIf="success">
<span jhiTranslate="reset.request.messages.success">Check your emails for details on how to reset your password.</span>
</div>
<div class="alert alert-danger" *ngIf="errorEmailNotExists" jhiTranslate="reset.request.messages.error.emailnotexists">
<strong>Email no exists!</strong>
</div>
<div class="alert alert-danger" *ngIf="errorUserIsGoogle" jhiTranslate="reset.request.messages.error.userisgoogle">
<strong>No cuenta con el permiso de restablecer su contraseña al haber activado su cuenta por medio de Google</strong>
</div>
</div>
<form *ngIf="!success" name="form" class="ds-form" role="form" (ngSubmit)="requestReset()" [formGroup]="resetRequestForm">
<div class="form-group">
<label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label>
<input
type="email"
class="form-control"
id="email"
name="email"
placeholder="{{ 'global.form.email.placeholder' | translate }}"
formControlName="email"
data-cy="emailResetPassword"
#email
/>
<div
*ngIf="
resetRequestForm.get('email')!.invalid &&
(resetRequestForm.get('email')!.dirty || resetRequestForm.get('email')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="resetRequestForm.get('email')?.errors?.required"
jhiTranslate="global.messages.validate.email.required"
>
Your email is required.
</small>
<small
class="form-text text-danger"
*ngIf="resetRequestForm.get('email')?.errors?.email"
jhiTranslate="global.messages.validate.email.invalid"
>
Your email is invalid.
</small>
</div>
</div>
<div class="row justify-content-center">
<button
type="button"
id="cancel-save"
data-cy="entityCreateCancelButton"
class="ds-btn ds-btn--secondary"
(click)="previousState()"
>
<fa-icon icon="arrow-left"></fa-icon>&nbsp;&nbsp;<span jhiTranslate="entity.action.back">Volver</span>
</button>
<button
type="submit"
[disabled]="resetRequestForm.invalid"
class="ds-btn ds-btn--primary"
jhiTranslate="reset.request.form.button"
data-cy="submit"
>
Reset
</button>
</div>
</form>
</div>
<!-- end card-body -->
</div>
<!-- end card -->
<div class="row mt-3">
<div class="col-12 text-center">
<p class="text-muted">
¿Aún no es parte de DataSurvey?
<a routerLink="/account/register" class="text-muted ms-1"><b>Crea una cuenta</b></a>
</p>
</div>
<!-- end col -->
</div>
<!-- end row -->
</div>
<!-- end col -->
</div> </div>
<!-- end row -->
</div> </div>
<!-- end container -->
</div> </div>
<!-- end page -->

View File

@ -2,6 +2,8 @@ import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms'; import { FormBuilder, Validators } from '@angular/forms';
import { PasswordResetInitService } from './password-reset-init.service'; import { PasswordResetInitService } from './password-reset-init.service';
import { HttpErrorResponse } from '@angular/common/http';
import { EMAIL_NOT_EXISTS_TYPE, USER_IS_GOOGLE_TYPE } from '../../../config/error.constants';
@Component({ @Component({
selector: 'jhi-password-reset-init', selector: 'jhi-password-reset-init',
@ -10,7 +12,9 @@ import { PasswordResetInitService } from './password-reset-init.service';
export class PasswordResetInitComponent implements AfterViewInit { export class PasswordResetInitComponent implements AfterViewInit {
@ViewChild('email', { static: false }) @ViewChild('email', { static: false })
email?: ElementRef; email?: ElementRef;
errorEmailNotExists = false;
errorUserIsGoogle = false;
error = false;
success = false; success = false;
resetRequestForm = this.fb.group({ resetRequestForm = this.fb.group({
email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]], email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]],
@ -25,6 +29,25 @@ export class PasswordResetInitComponent implements AfterViewInit {
} }
requestReset(): void { requestReset(): void {
this.passwordResetInitService.save(this.resetRequestForm.get(['email'])!.value).subscribe(() => (this.success = true)); this.errorEmailNotExists = false;
this.errorUserIsGoogle = false;
this.passwordResetInitService.save(this.resetRequestForm.get(['email'])!.value).subscribe(
() => (this.success = true),
response => this.processError(response)
);
}
previousState(): void {
window.history.back();
}
processError(response: HttpErrorResponse): void {
if (response.status === 400 && response.error.type === EMAIL_NOT_EXISTS_TYPE) {
this.errorEmailNotExists = true;
} else if (response.status === 400 && response.error.type === USER_IS_GOOGLE_TYPE) {
this.errorUserIsGoogle = true;
} else {
this.error = true;
}
} }
} }

View File

@ -1,4 +1,4 @@
<div class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5" style="height: 100vh; background-color: #f1f5f9"> <div class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5" style="/*height: 100vh;*/ height: 100%; background-color: #f1f5f9">
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-xxl-4 col-lg-5"> <div class="col-xxl-4 col-lg-5">
@ -8,13 +8,21 @@
</div> </div>
<div class="card-body p-4"> <div class="card-body p-4">
<div class="text-center w-75 m-auto"> <div class="text-center w-75 m-auto" *ngIf="!success">
<h4 class="text-dark-50 text-center pb-0 fw-bold p-0 m-0" style="color: #727070; font-weight: 700; font-size: 1.3rem"> <h4 class="text-dark-50 text-center pb-0 fw-bold p-0 m-0" style="color: #727070; font-weight: 700; font-size: 1.3rem">
REGISTRARSE REGISTRARSE
</h4> </h4>
<p class="mb-4" style="color: rgba(146, 146, 146, 0.664)">Ingrese sus datos para registrarse.</p> <p class="mb-4" style="color: rgba(146, 146, 146, 0.664)">Ingrese sus datos para registrarse</p>
</div> </div>
<div class="text-center w-75 m-auto" *ngIf="success">
<h4 class="text-dark-50 text-center pb-0 fw-bold p-0 m-0" style="color: #727070; font-weight: 700; font-size: 1.3rem">
¡Gracias por registrarse en DataSurvey!
</h4>
</div>
<hr />
<div class="alert alert-success" *ngIf="success" jhiTranslate="register.messages.success"> <div class="alert alert-success" *ngIf="success" jhiTranslate="register.messages.success">
<strong>Registration saved!</strong> Please check your email for confirmation. <strong>Registration saved!</strong> Please check your email for confirmation.
</div> </div>

View File

@ -63,6 +63,7 @@ describe('Component Tests', () => {
login: '', login: '',
langKey: 'es', langKey: 'es',
name: '', name: '',
firstName: 'normalUser',
profileIcon: 1, profileIcon: 1,
isAdmin: 0, isAdmin: 0,
isGoogle: 0, isGoogle: 0,

View File

@ -84,14 +84,16 @@ export class RegisterComponent implements AfterViewInit {
const login = this.registerForm.get(['email'])!.value; const login = this.registerForm.get(['email'])!.value;
const email = this.registerForm.get(['email'])!.value; const email = this.registerForm.get(['email'])!.value;
const name = this.registerForm.get(['name'])!.value; const name = this.registerForm.get(['name'])!.value;
const firstName = 'normalUser';
this.registerService this.registerService
.save({ .save({
login, login,
email, email,
password, password,
langKey: this.translateService.currentLang, langKey: this.translateService.currentLang!,
name, name,
firstName,
profileIcon: this.profileIcon, profileIcon: this.profileIcon,
isAdmin: 0, isAdmin: 0,
isGoogle: 0, isGoogle: 0,

View File

@ -7,6 +7,7 @@ export class Registration {
public name: string, public name: string,
public profileIcon: number, public profileIcon: number,
public isAdmin: number, public isAdmin: number,
public isGoogle: number public isGoogle: number,
public firstName: string
) {} ) {}
} }

View File

@ -1,172 +1,3 @@
<!-- <div>
<div class="row justify-content-center">
<div class="col-md-8">
<h2 jhiTranslate="settings.title" [translateValues]="{ username: account.login }" *ngIf="account">
User settings for [<strong>{{ account.login }}</strong
>]
</h2>
<div class="alert alert-success" *ngIf="success" jhiTranslate="settings.messages.success">
<strong>Settings saved!</strong>
</div>
<jhi-alert-error></jhi-alert-error>
<form name="form" role="form" (ngSubmit)="save()" [formGroup]="settingsForm" *ngIf="account" novalidate>
<div class="form-group">
<label class="form-control-label" for="firstName" jhiTranslate="settings.form.firstname">First Name</label>
<input
type="text"
class="form-control"
id="firstName"
name="firstName"
placeholder="{{ 'settings.form.firstname.placeholder' | translate }}"
formControlName="firstName"
data-cy="firstname"
/>
<div
*ngIf="
settingsForm.get('firstName')!.invalid && (settingsForm.get('firstName')!.dirty || settingsForm.get('firstName')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="settingsForm.get('firstName')?.errors?.required"
jhiTranslate="settings.messages.validate.firstname.required"
>
Your first name is required.
</small>
<small
class="form-text text-danger"
*ngIf="settingsForm.get('firstName')?.errors?.minlength"
jhiTranslate="settings.messages.validate.firstname.minlength"
>
Your first name is required to be at least 1 character.
</small>
<small
class="form-text text-danger"
*ngIf="settingsForm.get('firstName')?.errors?.maxlength"
jhiTranslate="settings.messages.validate.firstname.maxlength"
>
Your first name cannot be longer than 50 characters.
</small>
</div>
</div>
<div class="form-group">
<label class="form-control-label" for="lastName" jhiTranslate="settings.form.lastname">Last Name</label>
<input
type="text"
class="form-control"
id="lastName"
name="lastName"
placeholder="{{ 'settings.form.lastname.placeholder' | translate }}"
formControlName="lastName"
data-cy="lastname"
/>
<div
*ngIf="settingsForm.get('lastName')!.invalid && (settingsForm.get('lastName')!.dirty || settingsForm.get('lastName')!.touched)"
>
<small
class="form-text text-danger"
*ngIf="settingsForm.get('lastName')?.errors?.required"
jhiTranslate="settings.messages.validate.lastname.required"
>
Your last name is required.
</small>
<small
class="form-text text-danger"
*ngIf="settingsForm.get('lastName')?.errors?.minlength"
jhiTranslate="settings.messages.validate.lastname.minlength"
>
Your last name is required to be at least 1 character.
</small>
<small
class="form-text text-danger"
*ngIf="settingsForm.get('lastName')?.errors?.maxlength"
jhiTranslate="settings.messages.validate.lastname.maxlength"
>
Your last name cannot be longer than 50 characters.
</small>
</div>
</div>
<div class="form-group">
<label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label>
<input
type="email"
class="form-control"
id="email"
name="email"
placeholder="{{ 'global.form.email.placeholder' | translate }}"
formControlName="email"
data-cy="email"
/>
<div *ngIf="settingsForm.get('email')!.invalid && (settingsForm.get('email')!.dirty || settingsForm.get('email')!.touched)">
<small
class="form-text text-danger"
*ngIf="settingsForm.get('email')?.errors?.required"
jhiTranslate="global.messages.validate.email.required"
>
Your email is required.
</small>
<small
class="form-text text-danger"
*ngIf="settingsForm.get('email')?.errors?.email"
jhiTranslate="global.messages.validate.email.invalid"
>
Your email is invalid.
</small>
<small
class="form-text text-danger"
*ngIf="settingsForm.get('email')?.errors?.minlength"
jhiTranslate="global.messages.validate.email.minlength"
>
Your email is required to be at least 5 characters.
</small>
<small
class="form-text text-danger"
*ngIf="settingsForm.get('email')?.errors?.maxlength"
jhiTranslate="global.messages.validate.email.maxlength"
>
Your email cannot be longer than 100 characters.
</small>
</div>
</div>
<div class="form-group" *ngIf="languages && languages.length > 0">
<label for="langKey" jhiTranslate="settings.form.language">Language</label>
<select class="form-control" id="langKey" name="langKey" formControlName="langKey" data-cy="langKey">
<option *ngFor="let language of languages" [value]="language">{{ language | findLanguageFromKey }}</option>
</select>
</div>
<button
type="submit"
[disabled]="settingsForm.invalid"
class="btn btn-primary"
jhiTranslate="settings.form.button"
data-cy="submit"
>
Save
</button>
</form>
</div>
</div>
</div>
-------------------------------------------------------------------------------
-->
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="row w-75 pb-lg-5 pr-lg-5 mb-5" style="border-bottom: 1px solid #e7ebf3"> <div class="row w-75 pb-lg-5 pr-lg-5 mb-5" style="border-bottom: 1px solid #e7ebf3">
<div class="col-lg-4 mr-lg-5"> <div class="col-lg-4 mr-lg-5">
@ -175,12 +6,12 @@
<p class="ds-title">Perfil</p> <p class="ds-title">Perfil</p>
</div> </div>
<div> <div>
<p class="ds-subtitle">Información general de su usuario, el correo electrónico es su identificador en DataSurvey.</p> <p class="ds-subtitle">Información general de su usuario, el correo electrónico es su identificador en DataSurvey</p>
</div> </div>
</div> </div>
</div> </div>
<!-- Form --> <!-- Form de info usuario -->
<form <form
autocomplete="off" autocomplete="off"
class="ds-form col-lg ml-lg-5 mr-lg-5 pr-lg-5" class="ds-form col-lg ml-lg-5 mr-lg-5 pr-lg-5"
@ -191,6 +22,20 @@
[formGroup]="editForm" [formGroup]="editForm"
> >
<div class="row mb-2"> <div class="row mb-2">
<div
class="alert alert-danger"
*ngIf="error"
jhiTranslate="global.messages.info.authenticated.updateForm"
data-cy="loginError"
></div>
<div *ngIf="success" class="alert alert-success alert-dismissible fade show" role="alert">
Sus datos fueron actualizados de manera exitosa
<!--<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>-->
</div>
<div class="form-group w-100"> <div class="form-group w-100">
<label class="form-control-label" for="field_email">Correo electrónico</label> <label class="form-control-label" for="field_email">Correo electrónico</label>
<input type="text" class="form-control" name="email" id="field_email" data-cy="email" formControlName="email" [readonly]="true" /> <input type="text" class="form-control" name="email" id="field_email" data-cy="email" formControlName="email" [readonly]="true" />
@ -221,7 +66,7 @@
<input <input
id="field_fechaNacimiento" id="field_fechaNacimiento"
data-cy="fechaNacimiento" data-cy="fechaNacimiento"
type="datetime-local" type="date"
class="form-control" class="form-control"
name="fechaNacimiento" name="fechaNacimiento"
formControlName="fechaNacimiento" formControlName="fechaNacimiento"
@ -232,7 +77,7 @@
</div> </div>
<div class="row mb-4"> <div class="row mb-4">
<div class="form-group w-100"> <div class="form-group w-100">
<label for="iconoPerfil">Ícono de perfil</label> <label>Ícono de perfil</label>
<div class="d-flex"> <div class="d-flex">
<jhi-swiper style="width: 22.5rem !important" [data]="profileIcons" (onSelectEvent)="selectIcon($event)"></jhi-swiper> <jhi-swiper style="width: 22.5rem !important" [data]="profileIcons" (onSelectEvent)="selectIcon($event)"></jhi-swiper>
</div> </div>
@ -256,7 +101,7 @@
[disabled]="editForm.invalid || isSaving" [disabled]="editForm.invalid || isSaving"
class="ds-btn ds-btn--primary" class="ds-btn ds-btn--primary"
> >
&nbsp;<span jhiTranslate="entity.action.save">Save</span> <span jhiTranslate="entity.action.save">Save</span>
</button> </button>
</div> </div>
</form> </form>
@ -270,36 +115,78 @@
</div> </div>
<div> <div>
<p class="ds-subtitle"> <p class="ds-subtitle">
Utilice una contraseña segura al realizar el cambio, este dato debe ser secreto ya que provee acceso a su cuenta. Utilice una contraseña segura al realizar el cambio, este dato debe ser secreto ya que provee acceso a su cuenta
</p> </p>
</div> </div>
<div class="alert alert-danger" *ngIf="isGoogle" jhiTranslate="login.messages.error.isGoogle" data-cy="loginError"></div>
</div> </div>
</div> </div>
<!-- Form --> <!-- Form de password-->
<form <form
autocomplete="off" autocomplete="off"
class="ds-form col-lg ml-lg-5 mr-lg-5 pr-lg-5" class="ds-form col-lg ml-lg-5 mr-lg-5 pr-lg-5"
name="passwordForm" name="passwordForm"
role="form" role="form"
novalidate novalidate
(ngSubmit)="save()" (ngSubmit)="savePassword()"
[formGroup]="passwordForm" [formGroup]="passwordForm"
> >
<div class="row mb-3 pb-3" style="border-bottom: 1px solid #e7ebf3"> <div class="row mb-3 pb-3" style="border-bottom: 1px solid #e7ebf3">
<div
class="alert alert-danger"
*ngIf="errorPassword && !doNotMatch && !successPassword && !samePassword"
jhiTranslate="global.messages.info.authenticated.passwordForm"
data-cy="loginError"
></div>
<div
*ngIf="successPassword && !errorPassword && !samePassword && !doNotMatch"
class="alert alert-success alert-dismissible fade show"
role="alert"
>
Sus contraseña fue actualizada de manera exitosa
<!-- <button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>-->
</div>
<div
class="alert alert-danger"
*ngIf="doNotMatch && !successPassword && !errorPassword"
jhiTranslate="global.messages.error.dontmatch"
>
The password and its confirmation do not match!
</div>
<div
class="alert alert-danger"
*ngIf="samePassword && !successPassword && !errorPassword && !doNotMatch"
jhiTranslate="global.messages.error.samePassword"
>
The password and its confirmation do not match!
</div>
<div class="form-group w-100"> <div class="form-group w-100">
<label class="form-control-label" for="field_password">Contraseña actual</label> <label class="form-control-label" for="field_password">Contraseña actual</label>
<input <input
type="text" type="password"
class="form-control" class="form-control"
name="password" name="password"
id="field_password" id="field_password"
data-cy="password" data-cy="password"
formControlName="password" formControlName="password"
placeholder="Su contraseña actual" placeholder="Su contraseña actual"
[readOnly]="isGoogle"
/> />
<div <div
*ngIf="passwordForm.get('password')!.invalid && (passwordForm.get('password')!.dirty || passwordForm.get('password')!.touched)" *ngIf="
passwordForm.get('password')!.invalid &&
(passwordForm.get('password')!.dirty || passwordForm.get('password')!.touched) &&
!isGoogle
"
> >
<small <small
class="form-text text-danger" class="form-text text-danger"
@ -308,6 +195,22 @@
> >
This field is required. This field is required.
</small> </small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('password')?.errors?.minlength"
jhiTranslate="global.messages.validate.newpassword.minlength"
>
Your password is required to be at least 4 characters.
</small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('password')?.errors?.maxlength"
jhiTranslate="global.messages.validate.newpassword.maxlength"
>
Your password cannot be longer than 50 characters.
</small>
</div> </div>
</div> </div>
</div> </div>
@ -315,18 +218,20 @@
<div class="form-group w-100"> <div class="form-group w-100">
<label class="form-control-label" for="field_passwordNew">Contraseña nueva</label> <label class="form-control-label" for="field_passwordNew">Contraseña nueva</label>
<input <input
type="text" type="password"
class="form-control" class="form-control"
name="passwordNew" name="passwordNew"
id="field_passwordNew" id="field_passwordNew"
data-cy="passwordNew" data-cy="passwordNew"
formControlName="passwordNew" formControlName="passwordNew"
placeholder="Contraseña nueva" placeholder="Contraseña nueva"
[readOnly]="isGoogle"
/> />
<div <div
*ngIf=" *ngIf="
passwordForm.get('passwordNew')!.invalid && passwordForm.get('passwordNew')!.invalid &&
(passwordForm.get('passwordNew')!.dirty || passwordForm.get('passwordNew')!.touched) (passwordForm.get('passwordNew')!.dirty || passwordForm.get('passwordNew')!.touched) &&
!isGoogle
" "
> >
<small <small
@ -336,6 +241,22 @@
> >
This field is required. This field is required.
</small> </small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('passwordNew')?.errors?.minlength"
jhiTranslate="global.messages.validate.newpassword.minlength"
>
Your password is required to be at least 4 characters.
</small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('passwordNew')?.errors?.maxlength"
jhiTranslate="global.messages.validate.newpassword.maxlength"
>
Your password cannot be longer than 50 characters.
</small>
</div> </div>
</div> </div>
</div> </div>
@ -344,18 +265,20 @@
<div class="form-group w-100"> <div class="form-group w-100">
<label class="form-control-label" for="field_passwordNewConfirm">Confirmar contraseña nueva</label> <label class="form-control-label" for="field_passwordNewConfirm">Confirmar contraseña nueva</label>
<input <input
type="text" type="password"
class="form-control" class="form-control"
name="passwordNewConfirm" name="passwordNewConfirm"
id="field_passwordNewConfirm" id="field_passwordNewConfirm"
data-cy="passwordNewConfirm" data-cy="passwordNewConfirm"
formControlName="passwordNewConfirm" formControlName="passwordNewConfirm"
placeholder="Contraseña nueva" placeholder="Contraseña nueva"
[readOnly]="isGoogle"
/> />
<div <div
*ngIf=" *ngIf="
passwordForm.get('passwordNewConfirm')!.invalid && passwordForm.get('passwordNewConfirm')!.invalid &&
(passwordForm.get('passwordNewConfirm')!.dirty || passwordForm.get('passwordNewConfirm')!.touched) (passwordForm.get('passwordNewConfirm')!.dirty || passwordForm.get('passwordNewConfirm')!.touched) &&
!isGoogle
" "
> >
<small <small
@ -365,12 +288,28 @@
> >
This field is required. This field is required.
</small> </small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('passwordNewConfirm')?.errors?.minlength"
jhiTranslate="global.messages.validate.newpassword.minlength"
>
Your password is required to be at least 4 characters.
</small>
<small
class="form-text text-danger"
*ngIf="passwordForm.get('passwordNewConfirm')?.errors?.maxlength"
jhiTranslate="global.messages.validate.newpassword.maxlength"
>
Your password cannot be longer than 50 characters.
</small>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<button <button
*ngIf="!isGoogle"
type="button" type="button"
id="cancel-save" id="cancel-save"
data-cy="entityCreateCancelButton" data-cy="entityCreateCancelButton"
@ -381,13 +320,14 @@
</button> </button>
<button <button
*ngIf="!isGoogle"
type="submit" type="submit"
id="save-entity" id="save-entity"
data-cy="entityCreateSaveButton" data-cy="entityCreateSaveButton"
[disabled]="passwordForm.invalid || isSaving" [disabled]="passwordForm.invalid || isSaving"
class="ds-btn ds-btn--primary" class="ds-btn ds-btn--primary"
> >
<fa-icon icon="save"></fa-icon>&nbsp;<span jhiTranslate="entity.action.save">Save</span> <span jhiTranslate="entity.action.save">Save</span>
</button> </button>
</div> </div>
</form> </form>

View File

@ -1,3 +1,5 @@
import { LocalStorageService } from 'ngx-webstorage';
jest.mock('@ngx-translate/core'); jest.mock('@ngx-translate/core');
jest.mock('app/core/auth/account.service'); jest.mock('app/core/auth/account.service');
@ -19,6 +21,7 @@ describe('Component Tests', () => {
let comp: SettingsComponent; let comp: SettingsComponent;
let fixture: ComponentFixture<SettingsComponent>; let fixture: ComponentFixture<SettingsComponent>;
let mockAccountService: AccountService; let mockAccountService: AccountService;
let localStorage: LocalStorageService;
const account: Account = { const account: Account = {
id: 0, id: 0,
firstName: 'John', firstName: 'John',
@ -36,17 +39,23 @@ describe('Component Tests', () => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [RouterTestingModule, HttpClientTestingModule], imports: [RouterTestingModule, HttpClientTestingModule],
declarations: [SettingsComponent], declarations: [SettingsComponent],
providers: [FormBuilder, TranslateService, AccountService], providers: [FormBuilder, TranslateService, AccountService, LocalStorageService],
}) })
.overrideTemplate(SettingsComponent, '') .overrideTemplate(SettingsComponent, '')
.compileComponents(); .compileComponents();
localStorage = TestBed.inject(LocalStorageService);
}) })
); );
it('should be created', () => {
expect(localStorage).toBeTruthy();
});
beforeEach(() => { beforeEach(() => {
fixture = TestBed.createComponent(SettingsComponent); fixture = TestBed.createComponent(SettingsComponent);
comp = fixture.componentInstance; comp = fixture.componentInstance;
mockAccountService = TestBed.inject(AccountService); mockAccountService = TestBed.inject(AccountService);
localStorage = TestBed.inject(LocalStorageService);
mockAccountService.identity = jest.fn(() => of(account)); mockAccountService.identity = jest.fn(() => of(account));
mockAccountService.getAuthenticationState = jest.fn(() => of(account)); mockAccountService.getAuthenticationState = jest.fn(() => of(account));
}); });
@ -63,6 +72,10 @@ describe('Component Tests', () => {
// expect(comp.success).toBe(true); // expect(comp.success).toBe(true);
}); });
it('should be created', () => {
expect(localStorage).toBeTruthy();
});
it('should notify of error upon failed save', () => { it('should notify of error upon failed save', () => {
// GIVEN // GIVEN
mockAccountService.save = jest.fn(() => throwError('ERROR')); mockAccountService.save = jest.fn(() => throwError('ERROR'));

View File

@ -1,12 +1,11 @@
import { Component, OnInit } from '@angular/core'; import { Component, ContentChild, OnInit } from '@angular/core';
import { HttpResponse } from '@angular/common/http'; import { HttpErrorResponse, HttpResponse } from '@angular/common/http';
import { FormBuilder, Validators } from '@angular/forms'; import { FormBuilder, Validators } from '@angular/forms';
import { ActivatedRoute } from '@angular/router'; import { Router, NavigationEnd, ActivatedRoute } from '@angular/router';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { finalize, map } from 'rxjs/operators'; import { finalize, map } from 'rxjs/operators';
import * as dayjs from 'dayjs'; import * as dayjs from 'dayjs';
import { DATE_TIME_FORMAT } from 'app/config/input.constants'; import { DATE_FORMAT, DATE_TIME_FORMAT } from 'app/config/input.constants';
import { IUser } from 'app/entities/user/user.model'; import { IUser } from 'app/entities/user/user.model';
import { UserService } from 'app/entities/user/user.service'; import { UserService } from 'app/entities/user/user.service';
import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; import { IPlantilla } from 'app/entities/plantilla/plantilla.model';
@ -14,17 +13,30 @@ import { PlantillaService } from 'app/entities/plantilla/service/plantilla.servi
import { IUsuarioExtra, UsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model'; import { IUsuarioExtra, UsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model';
import { UsuarioExtraService } from 'app/entities/usuario-extra/service/usuario-extra.service'; import { UsuarioExtraService } from 'app/entities/usuario-extra/service/usuario-extra.service';
import { AccountService } from 'app/core/auth/account.service'; import { AccountService } from 'app/core/auth/account.service';
import { LocalStorageService } from 'ngx-webstorage';
import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from '../../config/error.constants';
import { PasswordService } from '../password/password.service';
@Component({ @Component({
selector: 'jhi-settings', selector: 'jhi-settings',
templateUrl: './settings.component.html', templateUrl: './settings.component.html',
}) })
export class SettingsComponent implements OnInit { export class SettingsComponent implements OnInit {
currentUrl = this.router.url;
isSaving = false; isSaving = false;
success = false;
successPassword = false;
samePassword = false;
error = false;
errorPassword = false;
doNotMatch = false;
usersSharedCollection: IUser[] = []; usersSharedCollection: IUser[] = [];
plantillasSharedCollection: IPlantilla[] = []; plantillasSharedCollection: IPlantilla[] = [];
showPassword = false;
isGoogle = this.localStorageService.retrieve('IsGoogle');
//Form info del usuario
editForm = this.fb.group({ editForm = this.fb.group({
email: [null, [Validators.required]], email: [null, [Validators.required]],
id: [], id: [],
@ -36,10 +48,11 @@ export class SettingsComponent implements OnInit {
plantillas: [], plantillas: [],
}); });
//form de la contraseña
passwordForm = this.fb.group({ passwordForm = this.fb.group({
password: [null, [Validators.required]], password: [null, [Validators.required, Validators.minLength(8), Validators.maxLength(50)]],
passwordNew: [null, [Validators.required]], passwordNew: [null, [Validators.required, Validators.minLength(8), Validators.maxLength(50)]],
passwordNewConfirm: [null, [Validators.required]], passwordNewConfirm: [null, [Validators.required, Validators.minLength(8), Validators.maxLength(50)]],
}); });
usuarioExtra: UsuarioExtra | null = null; usuarioExtra: UsuarioExtra | null = null;
@ -75,13 +88,18 @@ export class SettingsComponent implements OnInit {
{ name: 'C28' }, { name: 'C28' },
]; ];
/* @ContentChild(IonInput) input: IonInput;*/
constructor( constructor(
protected usuarioExtraService: UsuarioExtraService, protected usuarioExtraService: UsuarioExtraService,
protected userService: UserService, protected userService: UserService,
protected plantillaService: PlantillaService, protected plantillaService: PlantillaService,
protected activatedRoute: ActivatedRoute, protected activatedRoute: ActivatedRoute,
protected fb: FormBuilder, protected fb: FormBuilder,
protected accountService: AccountService protected accountService: AccountService,
private localStorageService: LocalStorageService,
protected passwordService: PasswordService,
private router: Router
) {} ) {}
ngOnInit(): void { ngOnInit(): void {
@ -103,6 +121,8 @@ export class SettingsComponent implements OnInit {
} }
}); });
//console.log(this.isGoogle);
// this.activatedRoute.data.subscribe(({ usuarioExtra }) => { // this.activatedRoute.data.subscribe(({ usuarioExtra }) => {
// }); // });
@ -112,13 +132,33 @@ export class SettingsComponent implements OnInit {
window.history.back(); window.history.back();
} }
//Se manda la info a guardar
save(): void { save(): void {
this.isSaving = true; this.isSaving = true;
const usuarioExtra = this.createFromForm(); const usuarioExtra = this.createFromForm();
if (usuarioExtra.id !== undefined) { this.subscribeToSaveResponse(this.usuarioExtraService.update(usuarioExtra));
this.subscribeToSaveResponse(this.usuarioExtraService.update(usuarioExtra)); }
savePassword(): void {
this.successPassword = false;
this.doNotMatch = false;
this.samePassword = false;
this.errorPassword = false;
const passwordNew = this.passwordForm.get(['passwordNew'])!.value;
const passwordOld = this.passwordForm.get(['password'])!.value;
if (passwordOld == passwordNew) {
this.samePassword = true;
} else { } else {
this.subscribeToSaveResponse(this.usuarioExtraService.create(usuarioExtra)); if (passwordNew !== this.passwordForm.get(['passwordNewConfirm'])!.value) {
(this.doNotMatch = true), (this.samePassword = false);
} else {
this.passwordService.save(passwordNew, passwordOld).subscribe(
() => (this.successPassword = true),
() => (this.errorPassword = true)
);
}
} }
} }
@ -143,10 +183,21 @@ export class SettingsComponent implements OnInit {
protected subscribeToSaveResponse(result: Observable<HttpResponse<IUsuarioExtra>>): void { protected subscribeToSaveResponse(result: Observable<HttpResponse<IUsuarioExtra>>): void {
result.pipe(finalize(() => this.onSaveFinalize())).subscribe( result.pipe(finalize(() => this.onSaveFinalize())).subscribe(
() => this.onSaveSuccess(), () => ((this.success = true), this.windowReload()),
() => this.onSaveError() response => this.processError(response)
); );
} }
windowReload() {
this.router.navigate(['account/settings']).then(() => {
window.location.reload();
});
}
processError(response: HttpErrorResponse): void {
if (response.status === 400) {
this.error = true;
}
}
protected onSaveSuccess(): void { protected onSaveSuccess(): void {
this.previousState(); this.previousState();
@ -160,22 +211,25 @@ export class SettingsComponent implements OnInit {
this.isSaving = false; this.isSaving = false;
} }
//Llena el formulario para que se vea en pantalla
protected updateForm(usuarioExtra: IUsuarioExtra): void { protected updateForm(usuarioExtra: IUsuarioExtra): void {
this.editForm.patchValue({ this.editForm.patchValue({
email: usuarioExtra.user?.login, email: usuarioExtra.user?.login,
id: usuarioExtra.id, id: usuarioExtra.id,
nombre: usuarioExtra.nombre, nombre: usuarioExtra.nombre,
iconoPerfil: usuarioExtra.iconoPerfil, iconoPerfil: usuarioExtra.iconoPerfil,
fechaNacimiento: usuarioExtra.fechaNacimiento ? usuarioExtra.fechaNacimiento.format(DATE_TIME_FORMAT) : null, fechaNacimiento: usuarioExtra.fechaNacimiento ? usuarioExtra.fechaNacimiento.format(DATE_FORMAT) : null,
estado: usuarioExtra.estado, estado: usuarioExtra.estado,
user: usuarioExtra.user, user: usuarioExtra.user,
plantillas: usuarioExtra.plantillas, plantillas: usuarioExtra.plantillas,
}); });
// Update swiper // Update swiper
this.profileIcon = parseInt(usuarioExtra.iconoPerfil!); this.profileIcon = usuarioExtra.iconoPerfil!;
console.log(this.profileIcon);
this.profileIcons.forEach(icon => { this.profileIcons.forEach(icon => {
if (parseInt(icon.name.split('C')[1]) === this.profileIcon) { if (icon.name.split('C')[1] === this.profileIcon) {
icon.class = 'active'; icon.class = 'active';
} }
}); });
@ -210,9 +264,9 @@ export class SettingsComponent implements OnInit {
...new UsuarioExtra(), ...new UsuarioExtra(),
id: this.editForm.get(['id'])!.value, id: this.editForm.get(['id'])!.value,
nombre: this.editForm.get(['nombre'])!.value, nombre: this.editForm.get(['nombre'])!.value,
iconoPerfil: this.editForm.get(['iconoPerfil'])!.value, iconoPerfil: this.profileIcon,
fechaNacimiento: this.editForm.get(['fechaNacimiento'])!.value fechaNacimiento: this.editForm.get(['fechaNacimiento'])!.value
? dayjs(this.editForm.get(['fechaNacimiento'])!.value, DATE_TIME_FORMAT) ? dayjs(this.editForm.get(['fechaNacimiento'])!.value, DATE_FORMAT)
: undefined, : undefined,
estado: this.editForm.get(['estado'])!.value, estado: this.editForm.get(['estado'])!.value,
user: this.editForm.get(['user'])!.value, user: this.editForm.get(['user'])!.value,
@ -225,6 +279,8 @@ export class SettingsComponent implements OnInit {
document.querySelectorAll('.active').forEach(e => e.classList.remove('active')); document.querySelectorAll('.active').forEach(e => e.classList.remove('active'));
event.target.classList.add('active'); event.target.classList.add('active');
this.profileIcon = +event.target.getAttribute('id')! + 1; this.profileIcon = +event.target.getAttribute('id')! + 1;
//console.log(this.profileIcon);
} }
} }
} }

View File

@ -9,7 +9,7 @@ import { TranslateModule, TranslateService, TranslateLoader, MissingTranslationH
import { NgxWebstorageModule, SessionStorageService } from 'ngx-webstorage'; import { NgxWebstorageModule, SessionStorageService } from 'ngx-webstorage';
import * as dayjs from 'dayjs'; import * as dayjs from 'dayjs';
import { NgbDateAdapter, NgbDatepickerConfig } from '@ng-bootstrap/ng-bootstrap'; import { NgbDateAdapter, NgbDatepickerConfig } from '@ng-bootstrap/ng-bootstrap';
import { LocalStorageService } from 'ngx-webstorage';
import { SERVER_API_URL } from './app.constants'; import { SERVER_API_URL } from './app.constants';
import { ApplicationConfigService } from 'app/core/config/application-config.service'; import { ApplicationConfigService } from 'app/core/config/application-config.service';
import './config/dayjs'; import './config/dayjs';
@ -18,7 +18,7 @@ import { AppRoutingModule } from './app-routing.module';
import { HomeModule } from './home/home.module'; import { HomeModule } from './home/home.module';
import { EntityRoutingModule } from './entities/entity-routing.module'; import { EntityRoutingModule } from './entities/entity-routing.module';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { PaginaPrincipalModule } from './pagina-principal/pagina-principal.module';
import { SocialLoginModule, SocialAuthServiceConfig } from 'angularx-social-login'; import { SocialLoginModule, SocialAuthServiceConfig } from 'angularx-social-login';
import { GoogleLoginProvider } from 'angularx-social-login'; import { GoogleLoginProvider } from 'angularx-social-login';
// jhipster-needle-angular-add-module-import JHipster will add new module here // jhipster-needle-angular-add-module-import JHipster will add new module here
@ -32,12 +32,22 @@ import { FooterComponent } from './layouts/footer/footer.component';
import { PageRibbonComponent } from './layouts/profiles/page-ribbon.component'; import { PageRibbonComponent } from './layouts/profiles/page-ribbon.component';
import { ErrorComponent } from './layouts/error/error.component'; import { ErrorComponent } from './layouts/error/error.component';
import { SidebarComponent } from './layouts/sidebar/sidebar.component'; import { SidebarComponent } from './layouts/sidebar/sidebar.component';
import { PaginaPrincipalComponent } from './pagina-principal/pagina-principal.component';
import { ChartistModule } from 'ng-chartist';
import { ListarPlantillaTiendaModule } from './entities/tienda/listar-tienda-plantilla/listar-plantilla-tienda.module';
import { PaypalDialogComponent } from './entities/tienda/paypal-dialog/paypal-dialog.component';
import { NgxPayPalModule } from 'ngx-paypal';
import { ShareButtonsModule } from 'ngx-sharebuttons/buttons';
import { ShareIconsModule } from 'ngx-sharebuttons/icons';
@NgModule({ @NgModule({
imports: [ imports: [
NgxWebstorageModule.forRoot(),
BrowserModule, BrowserModule,
SharedModule, SharedModule,
HomeModule, HomeModule,
PaginaPrincipalModule,
ListarPlantillaTiendaModule,
// jhipster-needle-angular-add-module JHipster will add new module here // jhipster-needle-angular-add-module JHipster will add new module here
EntityRoutingModule, EntityRoutingModule,
AppRoutingModule, AppRoutingModule,
@ -57,6 +67,10 @@ import { SidebarComponent } from './layouts/sidebar/sidebar.component';
useFactory: missingTranslationHandler, useFactory: missingTranslationHandler,
}, },
}), }),
ChartistModule, // add ChartistModule to your imports
ShareButtonsModule,
ShareIconsModule,
NgxPayPalModule,
], ],
providers: [ providers: [
Title, Title,
@ -76,7 +90,15 @@ import { SidebarComponent } from './layouts/sidebar/sidebar.component';
} as SocialAuthServiceConfig, } as SocialAuthServiceConfig,
}, },
], ],
declarations: [MainComponent, NavbarComponent, ErrorComponent, PageRibbonComponent, FooterComponent, SidebarComponent], declarations: [
MainComponent,
NavbarComponent,
ErrorComponent,
PageRibbonComponent,
FooterComponent,
SidebarComponent,
PaypalDialogComponent,
],
bootstrap: [MainComponent], bootstrap: [MainComponent],
}) })
export class AppModule { export class AppModule {

View File

@ -1,3 +1,6 @@
export const PROBLEM_BASE_URL = 'https://www.jhipster.tech/problem'; export const PROBLEM_BASE_URL = 'https://www.jhipster.tech/problem';
export const EMAIL_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/email-already-used'; export const EMAIL_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/email-already-used';
export const LOGIN_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/login-already-used'; export const LOGIN_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/login-already-used';
export const EMAIL_NOT_EXISTS_TYPE = PROBLEM_BASE_URL + '/email-not-exists';
export const USER_IS_GOOGLE_TYPE = PROBLEM_BASE_URL + '/user-is-google';
export const USER_IS_SUSPENDED = PROBLEM_BASE_URL + '/user-is-suspended';

View File

@ -72,6 +72,7 @@ export class AccountService {
shareReplay() shareReplay()
); );
} }
return this.accountCache$; return this.accountCache$;
} }

View File

@ -22,7 +22,7 @@ export interface Alert {
providedIn: 'root', providedIn: 'root',
}) })
export class AlertService { export class AlertService {
timeout = 5000; timeout = 3000;
toast = false; toast = false;
position = 'top right'; position = 'top right';
@ -65,7 +65,7 @@ export class AlertService {
alert.timeout = alert.timeout ?? this.timeout; alert.timeout = alert.timeout ?? this.timeout;
alert.toast = alert.toast ?? this.toast; alert.toast = alert.toast ?? this.toast;
alert.position = alert.position ?? this.position; alert.position = alert.position ?? this.position;
alert.close = (alertsArray: Alert[]) => this.closeAlert(alert.id!, alertsArray); //alert.close = (alertsArray: Alert[]) => this.closeAlert(alert.id!, alertsArray);
(extAlerts ?? this.alerts).push(alert); (extAlerts ?? this.alerts).push(alert);

View File

@ -1,25 +1,27 @@
<form class="ds-form" *ngIf="categoria" name="deleteForm" (ngSubmit)="confirmDelete(categoria.id!)"> <form class="ds-form" *ngIf="categoria" name="deleteForm" (ngSubmit)="confirmDelete(categoria!)">
<div class="modal-header"> <div class="modal-header"></div>
<h4 class="modal-title" data-cy="categoriaDeleteDialogHeading" jhiTranslate="entity.delete.title">Confirm delete operation</h4>
<button type="button" class="ds-btn close" data-dismiss="modal" aria-hidden="true" (click)="cancel()">&times;</button>
</div>
<div class="modal-body"> <div class="modal-body">
<jhi-alert-error></jhi-alert-error> <!-- <jhi-alert-error></jhi-alert-error> -->
<p class="ds-title--small">Cambiar estado</p>
<p id="jhi-delete-categoria-heading" jhiTranslate="dataSurveyApp.categoria.delete.question" [translateValues]="{ id: categoria.id }"> <p
Are you sure you want to delete this Categoria? class="ds-subtitle"
id="jhi-delete-categoria-heading"
jhiTranslate="dataSurveyApp.categoria.delete.question"
[translateValues]="{ nombre: categoria.nombre }"
>
Are you sure you want to toggle this category's status?
</p> </p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary ds-btn ds-btn-secondary" data-dismiss="modal" (click)="cancel()"> <button type="button" class="ds-btn ds-btn--secondary" data-dismiss="modal" (click)="cancel()">
<fa-icon icon="ban"></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 id="jhi-confirm-delete-categoria" data-cy="entityConfirmDeleteButton" type="submit" class="btn btn-danger ds-btn ds-btn-danger"> <button id="jhi-confirm-delete-categoria" data-cy="entityConfirmDeleteButton" type="submit" class="ds-btn ds-btn--toggle">
<fa-icon icon="times"></fa-icon>&nbsp;<span jhiTranslate="entity.action.delete">Delete</span> <fa-icon [icon]="faExchangeAlt"></fa-icon>
<span jhiTranslate="entity.action.toggleStatus">Toggle Status</span>
</button> </button>
</div> </div>
</form> </form>

View File

@ -1,65 +0,0 @@
jest.mock('@ng-bootstrap/ng-bootstrap');
import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing';
import { HttpResponse } from '@angular/common/http';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { of } from 'rxjs';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { CategoriaService } from '../service/categoria.service';
import { CategoriaDeleteDialogComponent } from './categoria-delete-dialog.component';
describe('Component Tests', () => {
describe('Categoria Management Delete Component', () => {
let comp: CategoriaDeleteDialogComponent;
let fixture: ComponentFixture<CategoriaDeleteDialogComponent>;
let service: CategoriaService;
let mockActiveModal: NgbActiveModal;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
declarations: [CategoriaDeleteDialogComponent],
providers: [NgbActiveModal],
})
.overrideTemplate(CategoriaDeleteDialogComponent, '')
.compileComponents();
fixture = TestBed.createComponent(CategoriaDeleteDialogComponent);
comp = fixture.componentInstance;
service = TestBed.inject(CategoriaService);
mockActiveModal = TestBed.inject(NgbActiveModal);
});
describe('confirmDelete', () => {
it('Should call delete service on confirmDelete', inject(
[],
fakeAsync(() => {
// GIVEN
jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({})));
// WHEN
comp.confirmDelete(123);
tick();
// THEN
expect(service.delete).toHaveBeenCalledWith(123);
expect(mockActiveModal.close).toHaveBeenCalledWith('deleted');
})
));
it('Should not call delete service on clear', () => {
// GIVEN
jest.spyOn(service, 'delete');
// WHEN
comp.cancel();
// THEN
expect(service.delete).not.toHaveBeenCalled();
expect(mockActiveModal.close).not.toHaveBeenCalled();
expect(mockActiveModal.dismiss).toHaveBeenCalled();
});
});
});
});

View File

@ -1,24 +1,79 @@
import { HttpResponse } from '@angular/common/http';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { IEncuesta } from 'app/entities/encuesta/encuesta.model';
import { EncuestaService } from 'app/entities/encuesta/service/encuesta.service';
import { EstadoCategoria } from 'app/entities/enumerations/estado-categoria.model';
import { Observable } from 'rxjs';
import { finalize } from 'rxjs/operators';
import { ICategoria } from '../categoria.model'; import { Categoria, ICategoria } from '../categoria.model';
import { CategoriaService } from '../service/categoria.service'; import { CategoriaService } from '../service/categoria.service';
import { faExchangeAlt } from '@fortawesome/free-solid-svg-icons';
@Component({ @Component({
templateUrl: './categoria-delete-dialog.component.html', templateUrl: './categoria-delete-dialog.component.html',
}) })
export class CategoriaDeleteDialogComponent { export class CategoriaDeleteDialogComponent {
categoria?: ICategoria; faExchangeAlt = faExchangeAlt;
constructor(protected categoriaService: CategoriaService, protected activeModal: NgbActiveModal) {} categoria?: ICategoria;
encuestas?: IEncuesta[];
encuestasFiltradas?: IEncuesta[];
constructor(
protected categoriaService: CategoriaService,
protected activeModal: NgbActiveModal,
protected encuestaService: EncuestaService
) {
this.getEncuestas();
}
cancel(): void { cancel(): void {
this.activeModal.dismiss(); this.activeModal.dismiss();
} }
confirmDelete(id: number): void { confirmDelete(categoria: ICategoria): void {
this.categoriaService.delete(id).subscribe(() => { const categoriaNula = new Categoria(0, 'Otra', EstadoCategoria.ACTIVE);
this.getEncuestas();
if (categoria.estado == EstadoCategoria.INACTIVE) {
categoria.estado = EstadoCategoria.ACTIVE;
} else {
this.encuestas!.forEach(encuesta => {
if (encuesta.categoria != null && encuesta.categoria!.id === categoria.id) {
encuesta.categoria = categoriaNula;
this.subscribeToSaveResponse(this.encuestaService.updateSurvey(encuesta));
}
});
categoria.estado = EstadoCategoria.INACTIVE;
}
this.categoriaService.update(categoria).subscribe(() => {
this.activeModal.close('deleted'); this.activeModal.close('deleted');
}); });
} }
getEncuestas(): void {
this.encuestaService.query().subscribe(res => {
this.encuestas = res.body ?? [];
});
}
protected subscribeToSaveResponse(result: Observable<HttpResponse<IEncuesta>>): void {
result.pipe(finalize(() => this.onSaveFinalize())).subscribe(
() => this.onSaveSuccess(),
() => this.onSaveError()
);
}
protected onSaveFinalize(): void {
// this.isSaving = false;
}
protected onSaveSuccess(): void {
// this.previousState();
}
protected onSaveError(): void {
// Api for inheritance.
}
} }

View File

@ -25,11 +25,16 @@
</dl> </dl>
<button type="submit" (click)="previousState()" class="btn btn-ds btn-info" data-cy="entityDetailsBackButton"> <button type="submit" (click)="previousState()" class="btn btn-ds btn-info" data-cy="entityDetailsBackButton">
<fa-icon icon="arrow-left"></fa-icon>&nbsp;<span jhiTranslate="entity.action.back">Back</span> &nbsp;<span jhiTranslate="entity.action.back">Back</span>
</button> </button>
<button type="button" [routerLink]="['/categoria', categoria.id, 'edit']" class="btn btn-ds btn-ds-primary btn-primary"> <button
<fa-icon icon="pencil-alt"></fa-icon>&nbsp;<span jhiTranslate="entity.action.edit">Edit</span> *ngIf="categoria.id != 0"
type="button"
[routerLink]="['/categoria', categoria.id, 'edit']"
class="btn btn-ds btn-ds-primary btn-primary"
>
&nbsp;<span jhiTranslate="entity.action.edit">Edit</span>
</button> </button>
</div> </div>
</div> </div>

View File

@ -1,12 +1,15 @@
<div> <div>
<h2 id="page-heading" data-cy="CategoriaHeading"> <h2 id="page-heading" data-cy="CategoriaHeading">
<span jhiTranslate="dataSurveyApp.categoria.home.title">Categorias</span> <div>
<span class="ds-title" jhiTranslate="dataSurveyApp.categoria.home.title">Categorias</span>
<p class="ds-subtitle">Categorice las encuestas de la aplicación</p>
</div>
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<button <button
id="jh-create-entity" id="jh-create-entity"
data-cy="entityCreateButton" data-cy="entityCreateButton"
class="btn btn-primary jh-create-entity create-categoria ds-btn ds-btn-primary" class="jh-create-entity create-categoria ds-btn ds-btn--primary"
[routerLink]="['/categoria/new']" [routerLink]="['/categoria/new']"
> >
<fa-icon icon="plus"></fa-icon> <fa-icon icon="plus"></fa-icon>
@ -15,12 +18,28 @@
</div> </div>
</h2> </h2>
<jhi-alert-error></jhi-alert-error> <!-- <div class="alert alert-success" *ngIf="success" jhiTranslate="dataSurveyApp.categoria.delete.error">
<jhi-alert></jhi-alert> </div>-->
<div class="alert alert-warning" id="no-result" *ngIf="categorias?.length === 0"> <div
<span jhiTranslate="dataSurveyApp.categoria.home.notFound">No categorias found</span> *ngIf="success"
class="alert alert-success alert-dismissible fade show"
role="alert"
jhiTranslate="dataSurveyApp.categoria.delete.success"
>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="ds-survey" id="entities" *ngIf="categorias?.length === 0">
<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">
@ -30,10 +49,9 @@
<input type="text" name="searchString" placeholder="Buscar..." [(ngModel)]="searchString" /> <input type="text" name="searchString" placeholder="Buscar..." [(ngModel)]="searchString" />
</div> </div>
</form> </form>
<table class="table table-striped" aria-describedby="page-heading"> <table class="ds-table table table-striped" aria-describedby="page-heading">
<thead> <thead>
<tr> <tr>
<th scope="col"><span jhiTranslate="global.field.id">ID</span></th>
<th scope="col"><span jhiTranslate="dataSurveyApp.categoria.nombre">Nombre</span></th> <th scope="col"><span jhiTranslate="dataSurveyApp.categoria.nombre">Nombre</span></th>
<th scope="col"><span jhiTranslate="dataSurveyApp.categoria.estado">Estado</span></th> <th scope="col"><span jhiTranslate="dataSurveyApp.categoria.estado">Estado</span></th>
<th scope="col"></th> <th scope="col"></th>
@ -41,31 +59,22 @@
</thead> </thead>
<tbody> <tbody>
<tr *ngFor="let categoria of categorias | filter: 'nombre':searchString; trackBy: trackId" data-cy="entityTable"> <tr *ngFor="let categoria of categorias | filter: 'nombre':searchString; trackBy: trackId" data-cy="entityTable">
<td> <td *ngIf="categoria.id != 0">{{ categoria.nombre }}</td>
<a [routerLink]="['/categoria', categoria.id, 'view']">{{ categoria.id }}</a> <td *ngIf="categoria.id != 0" jhiTranslate="{{ 'dataSurveyApp.EstadoCategoria.' + categoria.estado }}">{{ categoria.estado }}</td>
</td> <td *ngIf="categoria.id != 0" class="text-right">
<td>{{ categoria.nombre }}</td>
<td jhiTranslate="{{ 'dataSurveyApp.EstadoCategoria.' + categoria.estado }}">{{ categoria.estado }}</td>
<td class="text-right">
<div class="btn-group"> <div class="btn-group">
<button <button
type="submit" type="submit"
[routerLink]="['/categoria', categoria.id, 'edit']" [routerLink]="['/categoria', categoria.id, 'edit']"
class="btn btn-primary btn-sm ds-btn ds-btn-primary" class="btn-sm ds-btn ds-btn--primary"
data-cy="entityEditButton" data-cy="entityEditButton"
> >
<fa-icon icon="pencil-alt"></fa-icon>
<span class="d-none d-md-inline" jhiTranslate="entity.action.edit">Edit</span> <span class="d-none d-md-inline" jhiTranslate="entity.action.edit">Edit</span>
</button> </button>
<button <button type="submit" (click)="toggleStatus(categoria)" class="ds-btn ds-btn--toggle" data-cy="entityDeleteButton">
type="submit" <fa-icon [icon]="faExchangeAlt"></fa-icon>
(click)="delete(categoria)" <span class="d-none d-md-inline" jhiTranslate="entity.action.toggleStatus">Toggle Status</span>
class="btn btn-danger btn-sm ds-btn ds-btn-danger"
data-cy="entityDeleteButton"
>
<fa-icon icon="times"></fa-icon>
<span class="d-none d-md-inline" jhiTranslate="entity.action.delete">Delete</span>
</button> </button>
</div> </div>
</td> </td>

View File

@ -6,14 +6,19 @@ import { ICategoria } from '../categoria.model';
import { CategoriaService } from '../service/categoria.service'; import { CategoriaService } from '../service/categoria.service';
import { CategoriaDeleteDialogComponent } from '../delete/categoria-delete-dialog.component'; import { CategoriaDeleteDialogComponent } from '../delete/categoria-delete-dialog.component';
import { faExchangeAlt } from '@fortawesome/free-solid-svg-icons';
@Component({ @Component({
selector: 'jhi-categoria', selector: 'jhi-categoria',
templateUrl: './categoria.component.html', templateUrl: './categoria.component.html',
}) })
export class CategoriaComponent implements OnInit { export class CategoriaComponent implements OnInit {
faExchangeAlt = faExchangeAlt;
categorias?: ICategoria[]; categorias?: ICategoria[];
isLoading = false; isLoading = false;
public searchString: string; public searchString: string;
success = false;
constructor(protected categoriaService: CategoriaService, protected modalService: NgbModal) { constructor(protected categoriaService: CategoriaService, protected modalService: NgbModal) {
this.searchString = ''; this.searchString = '';
@ -38,16 +43,17 @@ export class CategoriaComponent implements OnInit {
this.loadAll(); this.loadAll();
} }
trackId(index: number, item: ICategoria): number { trackId(_index: number, item: ICategoria): number {
return item.id!; return item.id!;
} }
delete(categoria: ICategoria): void { toggleStatus(categoria: ICategoria): void {
const modalRef = this.modalService.open(CategoriaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); const modalRef = this.modalService.open(CategoriaDeleteDialogComponent, { size: 'lg', backdrop: 'static' });
modalRef.componentInstance.categoria = categoria; modalRef.componentInstance.categoria = categoria;
// unsubscribe not needed because closed completes on modal close // unsubscribe not needed because closed completes on modal close
modalRef.closed.subscribe(reason => { modalRef.closed.subscribe(reason => {
if (reason === 'deleted') { if (reason === 'deleted') {
this.success = true;
this.loadAll(); this.loadAll();
} }
}); });

View File

@ -46,20 +46,21 @@
type="button" type="button"
id="cancel-save" id="cancel-save"
data-cy="entityCreateCancelButton" data-cy="entityCreateCancelButton"
class="btn btn-secondary ds-btn ds-btn-secondary" class="ds-btn ds-btn--secondary"
(click)="previousState()" (click)="previousState()"
> >
<fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span> <fa-icon icon="arrow-left"></fa-icon>&nbsp;&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
</button> </button>
<button <button
*ngIf="this.id != 0"
type="submit" type="submit"
id="save-entity" id="save-entity"
data-cy="entityCreateSaveButton" data-cy="entityCreateSaveButton"
[disabled]="editForm.invalid || isSaving" [disabled]="editForm.invalid || isSaving"
class="btn btn-primary ds-btn ds-btn-primary" class="ds-btn ds-btn--primary"
> >
<fa-icon icon="save"></fa-icon>&nbsp;<span jhiTranslate="entity.action.save">Save</span> &nbsp;<span jhiTranslate="entity.action.save">Save</span>
</button> </button>
</div> </div>
</form> </form>

View File

@ -22,6 +22,7 @@ export class CategoriaUpdateComponent implements OnInit {
estado: [null, [Validators.required]], estado: [null, [Validators.required]],
}); });
public duplicateName: boolean; public duplicateName: boolean;
id: number | undefined;
constructor(protected categoriaService: CategoriaService, protected activatedRoute: ActivatedRoute, protected fb: FormBuilder) { constructor(protected categoriaService: CategoriaService, protected activatedRoute: ActivatedRoute, protected fb: FormBuilder) {
this.duplicateName = false; this.duplicateName = false;
@ -64,7 +65,7 @@ export class CategoriaUpdateComponent implements OnInit {
protected categoryExists(categoria: ICategoria): boolean { protected categoryExists(categoria: ICategoria): boolean {
this.loadAll(); this.loadAll();
var condicion = this.categorias!.some(cat => cat.nombre === categoria.nombre); var condicion = this.categorias!.some(cat => cat.nombre!.toLowerCase() === categoria.nombre!.toLowerCase() && cat.id !== categoria.id);
return condicion; return condicion;
} }
@ -88,6 +89,7 @@ export class CategoriaUpdateComponent implements OnInit {
} }
protected updateForm(categoria: ICategoria): void { protected updateForm(categoria: ICategoria): void {
this.id = categoria.id;
this.editForm.patchValue({ this.editForm.patchValue({
id: categoria.id, id: categoria.id,
nombre: categoria.nombre, nombre: categoria.nombre,

View File

@ -0,0 +1,246 @@
<div class="content">
<div class="py-2">
<button type="button" class="ds-btn ds-btn--primary" (click)="exportReportesGeneralesAdministradorExcel()">Export as Excel</button>
<button type="button" class="ds-btn ds-btn--primary" (click)="exportReportesGeneralesAdministradorPDF()">Export as PDF</button>
<button type="button" [hidden]="reportsGeneral" class="ds-btn ds-btn--primary" style="float: right" (click)="cambiarVista()">
Ver Reporte de Usuarios
</button>
<button type="button" [hidden]="reportForUsers" class="ds-btn ds-btn--primary" style="float: right" (click)="cambiarVista()">
Ver Reporte Generales
</button>
</div>
<div class="container-fluid py-5" [hidden]="reportsGeneral">
<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]="faWallet"></fa-icon>
</div>
</div>
<div class="col-xs-7 w-50">
<div class="numbers">
<p class="ds-title">Ganancias por plantillas</p>
${{ gananciasTotales | number: '1.2' }}
</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 justify-content-center">
<div class="col-xs-5 w-25 px-1">
<div class="icon-big icon-users-active text-center">
<fa-icon [icon]="faUsers"></fa-icon>
</div>
</div>
<div class="col-xs-7 w-75">
<div class="numbers">
<p class="ds-title">Cantidad usuarios activos</p>
{{ cantUsuarioActivos }}
</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 justify-content-center">
<div class="col-xs-4 w-25 px-1">
<div class="icon-big icon-users-block text-center">
<fa-icon [icon]="faUsersSlash"></fa-icon>
</div>
</div>
<div class="col-xs-5 w-75">
<div class="numbers">
<p class="ds-title">Cantidad usuarios bloqueados</p>
{{ cantUsuarioBloqueados }}
</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">
<h1 class="ds-title">Cantidad de encuestas publicadas por mes</h1>
<div class="ct-chart ct-chart-line"></div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card encuestas-por-categoria">
<div class="card-header w-100">
<h4 class="ds-title">Cantidad de Encuestas Publicadas por Categoria</h4>
</div>
<div class="card-content">
<div class="row">
<div class="col-md-12">
<div class="table-responsive">
<table class="ds-table table">
<tbody>
<tr *ngFor="let categoria of categorias; let i = index; trackBy: trackId">
<td>{{ categoria.nombre }}</td>
<td class="text-right">
{{ encuestasPublicadasCategoria[i] }}
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card encuestas-por-categoria">
<div class="card-header w-100">
<h4 class="ds-title">Cantidad de Encuestas Finalizadas por Categoria</h4>
</div>
<div class="card-content">
<div class="row">
<div class="col-md-12">
<div class="table-responsive">
<table class="ds-table table">
<tbody>
<tr *ngFor="let categoria of categorias; let i = index; trackBy: trackId">
<td>{{ categoria.nombre }}</td>
<td class="text-right">
{{ encuestasFinalzadasCategoria[i] }}
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-3 col-sm-6">
<div class="card card-circle-chart" data-background-color="blue" style="background-color: #88c5d6eb">
<div class="card-header text-center">
<h5 class="card-title ds-subtitle" style="color: #082463">Encuestas En Borrador</h5>
</div>
<div class="card-content">
<div id="surveyDraft" class="chart-circle">{{ encuestasBorrador }}<canvas height="160" width="160"></canvas></div>
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div class="card card-circle-chart" data-background-color="green" style="background-color: #67ceb6">
<div class="card-header text-center">
<h5 class="card-title ds-subtitle" style="color: #0a2922">Encuestas Publicadas</h5>
</div>
<div class="card-content">
<div id="surveyActive" class="chart-circle">{{ encuestasPublicadas }}<canvas height="160" width="160"></canvas></div>
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div class="card card-circle-chart" style="background-color: #de8e78">
<div class="card-header text-center">
<h5 class="card-title ds-subtitle" style="color: #671a04">Encuestas Finalizadas</h5>
</div>
<div class="card-content">
<div id="surveyFinished" class="chart-circle">{{ encuestasFinalizadas }}<canvas height="160" width="160"></canvas></div>
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div class="card card-circle-chart" data-background-color="brown" style="background-color: #d6c1ab">
<div class="card-header text-center">
<h5 class="card-title ds-subtitle" style="color: #252422">Encuestas Completadas por Usuarios</h5>
</div>
<div class="card-content">
<div id="surveyCountCompletede" class="chart-circle">{{ encuestasCompletadas }}<canvas height="160" width="160"></canvas></div>
</div>
</div>
</div>
</div>
</div>
<div class="container-fluid" [hidden]="reportForUsers">
<div class="row justify-content-around">
<div class="col-md-10">
<div class="card encuestas-por-usuario">
<div class="card-header w-100">
<h4 class="ds-title">Reporte de Encuestas Usuarios</h4>
</div>
<div class="card-content">
<div class="row">
<div class="col-md-12">
<div class="table-responsive">
<table class="ds-table table">
<thead>
<tr>
<th>Usuario</th>
<th></th>
<th>Total de encuestas</th>
<th>Encuestas en borrador</th>
<th>Encuestas publicadas</th>
<th>Encuestas finalizadas</th>
<th>Encuestas completadas por usuario</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let usuario of usuarios; let j = index; trackBy: trackIdUsuario">
<td>
<div class="photo mb-2"><img src="../../../../content/profile_icons/C{{ usuario.iconoPerfil }}.png" /></div>
</td>
<td>{{ usuario.nombre }}</td>
<td class="text-center">
{{ encuestasUsuario[j] }}
</td>
<td class="text-center">
{{ encuestasUsuarioBorrador[j] }}
</td>
<td class="text-center">
{{ encuestasUsuarioPublicadas[j] }}
</td>
<td class="text-center">
{{ encuestasUsuarioFinalizadas[j] }}
</td>
<td class="text-center">
{{ encuestasUsuarioCompletadas[j] }}
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,46 @@
.ct-chart {
width: 100%;
height: 400px;
overflow-x: scroll;
}
.grafico-encuestas-fecha .card {
width: 100%;
}
.card .icon-big {
font-size: 3em;
}
.icon-success {
color: #00b88d;
}
.icon-users-active {
color: #018adf;
}
.icon-users-block {
color: #da1b2b;
}
.encuestas-por-categoria .table-responsive {
height: 300px;
max-height: 300px;
}
.por-categoria {
padding: 5% 0;
}
.encuestas-por-usuario .table-responsive {
height: 500px;
max-height: 500px;
}
.encuestas-por-usuario .photo {
width: 40px;
height: 40px;
}
.encuestas-por-usuario .photo img {
border-radius: 100%;
}

View File

@ -0,0 +1,24 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DashboardAdminComponent } from './dashboard-admin.component';
describe('DashboardAdminComponent', () => {
let component: DashboardAdminComponent;
let fixture: ComponentFixture<DashboardAdminComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [DashboardAdminComponent],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(DashboardAdminComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,534 @@
import { Component, OnInit } from '@angular/core';
import * as XLSX from 'xlsx';
import * as FileSaver from 'file-saver';
import { jsPDF } from 'jspdf';
import { exportAsExcelFile, exportAsExcelTable } from '../export/export_excel';
import { generatePDFTableData, createPDFTableHeaders, generatePDFTable, saveGeneratedPDF } from '../export/export_pdf';
import { FacturaService } from '../../factura/service/factura.service';
import { UsuarioExtraService } from '../../usuario-extra/service/usuario-extra.service';
import { CategoriaService } from '../../categoria/service/categoria.service';
import { EncuestaService } from '../../encuesta/service/encuesta.service';
import { ICategoria } from '../../categoria/categoria.model';
import { IEncuesta } from '../../encuesta/encuesta.model';
import { finalize } from 'rxjs/operators';
import * as Chartist from 'chartist';
import { faWallet, faUsers, faUsersSlash } from '@fortawesome/free-solid-svg-icons';
import { IUsuarioExtra } from '../../usuario-extra/usuario-extra.model';
import { IUser } from '../../user/user.model';
@Component({
selector: 'jhi-dashboard-admin',
templateUrl: './dashboard-admin.component.html',
styleUrls: ['./dashboard-admin.component.scss'],
})
export class DashboardAdminComponent implements OnInit {
cantUsuarioActivos: number | undefined = 0;
cantUsuarioBloqueados: number | undefined = 0;
encuestasPublicadasCategoria: number[] = [];
encuestasFinalzadasCategoria: number[] = [];
encuestasPublicadasMesAnno: number[] = [];
listaMesesAnnos: string[] = [];
gananciasTotales: number = 0;
categorias: ICategoria[] | undefined = [];
encuestas: IEncuesta[] | undefined = [];
usuarios: IUsuarioExtra[] | undefined = [];
faWallet = faWallet;
faUsers = faUsers;
faUsersSlash = faUsersSlash;
encuestasPublicadas: number = 0;
encuestasFinalizadas: number = 0;
encuestasBorrador: number = 0;
encuestasCompletadas: number = 0;
encuestasUsuario: number[] = [];
encuestasUsuarioPublicadas: number[] = [];
encuestasUsuarioFinalizadas: number[] = [];
encuestasUsuarioBorrador: number[] = [];
encuestasUsuarioCompletadas: number[] = [];
usuariosGenerales: IUser[] | null = [];
reportsGeneral = false;
reportForUsers = true;
chartFechas = [];
constructor(
protected facturaService: FacturaService,
protected usuarioExtraService: UsuarioExtraService,
protected encuestaService: EncuestaService,
protected categoriaService: CategoriaService
) {}
ngOnInit(): void {
this.loadAll();
}
trackId(_index: number, item: ICategoria): number {
return item.id!;
}
trackIdUsuario(_index: number, item: IUsuarioExtra): number {
return item.id!;
}
cambiarVista() {
if (this.reportsGeneral) {
this.reportsGeneral = false;
this.reportForUsers = true;
} else if (this.reportForUsers) {
this.reportsGeneral = true;
this.reportForUsers = false;
}
}
loadAll() {
this.cargarGananciasTotales();
this.cargarUsers();
}
cargarGananciasTotales() {
this.facturaService.query().subscribe(res => {
const tempFacturas = res.body;
tempFacturas?.forEach(f => {
if (f.costo != undefined) {
this.gananciasTotales += f.costo;
}
});
});
}
cargarUsers() {
this.usuarioExtraService
.retrieveAllPublicUsers()
.pipe(finalize(() => this.cargarCantidadUsuarios()))
.subscribe(res => {
res.forEach(user => {
let rolList: string[] | undefined;
rolList = user.authorities;
let a = rolList?.pop();
if (a == 'ROLE_ADMIN') {
user.authorities = ['Admin'];
} else if (a == 'ROLE_USER') {
user.authorities = ['Usuario'];
}
});
this.usuariosGenerales = res;
});
}
cargarCantidadUsuarios() {
this.usuarioExtraService
.query()
.pipe(finalize(() => this.cargarEncuestas()))
.subscribe(res => {
const tmpUsuarios = res.body;
if (tmpUsuarios) {
tmpUsuarios.forEach(u => {
u.user = this.usuariosGenerales?.find(g => g.id == u.user?.id);
});
}
this.usuarios = tmpUsuarios?.filter(u => u.user?.authorities && u.user?.authorities[0] === 'Usuario');
this.cantUsuarioActivos = tmpUsuarios?.filter(u => u.estado === 'ACTIVE').length;
this.cantUsuarioBloqueados = tmpUsuarios?.filter(u => u.estado === 'SUSPENDED').length;
});
}
cargarEncuestas() {
this.encuestaService
.query()
.pipe(finalize(() => this.cargarCategorias()))
.subscribe(res => {
const tmpEncuestas = res.body;
this.encuestas = tmpEncuestas?.filter(e => e.estado === 'ACTIVE' || e.estado === 'FINISHED' || e.estado === 'DRAFT');
if (tmpEncuestas) {
this.encuestasPublicadas = tmpEncuestas.filter(e => e.estado === 'ACTIVE').length;
this.encuestasFinalizadas = tmpEncuestas.filter(e => e.estado === 'FINISHED').length;
this.encuestasBorrador = tmpEncuestas.filter(e => e.estado === 'DRAFT').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.encuestasCompletadas = cantidadCompletadas;
//reportes generales de todos los usuarios
const publicadasUser: number[] | null = [];
const finalizadasUser: number[] | null = [];
const borradoresUser: number[] | null = [];
const encuestasUser: number[] | null = [];
const encuestasCompletadasUser: number[] | null = [];
if (this.usuarios) {
this.usuarios.forEach(u => {
let cantEncuestas = 0;
let cantPublicadas = 0;
let cantFinalizadas = 0;
let cantBorradores = 0;
cantEncuestas = tmpEncuestas.filter(e => e.estado !== 'DELETED' && 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;
cantBorradores = tmpEncuestas.filter(e => e.estado === 'DRAFT' && e.usuarioExtra?.id === u.id).length;
encuestasUser.push(cantEncuestas);
borradoresUser.push(cantBorradores);
publicadasUser.push(cantPublicadas);
finalizadasUser.push(cantFinalizadas);
let cantidadCompletadasUser: number = 0;
tmpEncuestas
.filter(e => e.estado === 'ACTIVE' && e.usuarioExtra?.id === u.id)
.forEach(e => {
const _contadorCompletadas = e.calificacion;
cantidadCompletadasUser = cantidadCompletadasUser + (Number(_contadorCompletadas?.toString().split('.')[1]) - 1);
});
encuestasCompletadasUser.push(cantidadCompletadasUser);
});
this.encuestasUsuarioCompletadas = encuestasCompletadasUser;
this.encuestasUsuario = encuestasUser;
this.encuestasUsuarioBorrador = borradoresUser;
this.encuestasUsuarioPublicadas = publicadasUser;
this.encuestasUsuarioFinalizadas = finalizadasUser;
}
}
});
}
cargarCategorias() {
this.categoriaService
.query()
.pipe(finalize(() => this.acomodarMesesYAnnos()))
.subscribe(res => {
const tmpCategorias = res.body;
this.categorias = tmpCategorias?.filter(c => c.estado === 'ACTIVE');
const publicadas: number[] | null = [];
const finalizadas: number[] | null = [];
this.categorias?.forEach(c => {
let cantPublicadas = 0;
let cantFinalizadas = 0;
this.encuestas?.forEach(e => {
if (e.categoria?.id === c.id && e.estado === 'ACTIVE') {
cantPublicadas = cantPublicadas + 1;
}
if (e.categoria?.id === c.id && e.estado === 'FINISHED') {
cantFinalizadas = cantFinalizadas + 1;
}
});
publicadas.push(cantPublicadas);
finalizadas.push(cantFinalizadas);
});
this.encuestasPublicadasCategoria = publicadas;
this.encuestasFinalzadasCategoria = finalizadas;
});
}
acomodarMesesYAnnos() {
const fechas: string[] | null = [];
const cantEncuestasFechas: number[] | null = [];
var encuestasPublicadas = this.encuestas?.filter(e => e.estado === 'ACTIVE');
if (encuestasPublicadas) {
encuestasPublicadas = this.ordenarFechas(encuestasPublicadas);
encuestasPublicadas.forEach(e => {
if (e.fechaPublicacion) {
let fecha = this.formatoFecha(e.fechaPublicacion);
if (!fechas.includes(fecha)) {
fechas.push(fecha);
}
}
});
this.listaMesesAnnos = fechas;
this.listaMesesAnnos.forEach(f => {
let contEncuestaDeFecha = 0;
if (encuestasPublicadas) {
encuestasPublicadas.forEach(e => {
if (e.fechaPublicacion) {
let fecha = this.formatoFecha(e.fechaPublicacion);
if (f === fecha) {
contEncuestaDeFecha++;
}
}
});
}
cantEncuestasFechas.push(contEncuestaDeFecha);
});
this.encuestasPublicadasMesAnno = cantEncuestasFechas;
}
this.llenarGraficoEncuestasXFechas();
}
llenarGraficoEncuestasXFechas() {
if (this.listaMesesAnnos && this.encuestasPublicadasMesAnno) {
var data = {
// A labels array that can contain any sort of values
labels: this.listaMesesAnnos,
// Our series array that contains series objects or in this case series data arrays
series: [this.encuestasPublicadasMesAnno],
};
var options = {
low: 0,
showArea: true,
showLabel: true,
axisY: {
onlyInteger: true,
},
};
new Chartist.Line('.ct-chart', data, options);
}
}
formatoFecha(fecha: any): string {
return fecha.month() + 1 + '/' + fecha.year();
}
ordenarFechas(encuestasPublicadas: IEncuesta[]): IEncuesta[] {
if (encuestasPublicadas) {
encuestasPublicadas.sort((e1, e2) => {
if (e1.fechaPublicacion && e2.fechaPublicacion) {
return e1.fechaPublicacion < e2.fechaPublicacion ? -1 : e1.fechaPublicacion > e2.fechaPublicacion ? 1 : 0;
}
return 0;
});
}
return encuestasPublicadas;
}
exportReportesGeneralesAdministradorExcel(): void {
/*
Cantidad de usuarios activos
Cantidad de usuarios bloqueados
Cantidad de encuestas publicadas por categoría
Cantidad de encuestas finalizadas por categoría
Cantidad de encuestas publicadas por mes y año
Cantidad de encuestas
Cantidad de personas que han completado sus encuestas
Cantidad de encuestas activas
Cantidad de encuestas finalizadas
Cantidad de comentarios de retroalimentación
*/
const _sheets = [
'usuarios generales',
'enc. publicadas',
'enc. publicadas categoría',
'enc. finalizadas categoría',
'encuestas generales',
'reporte de usuarios',
];
const _reporteUsuarios = [
{
ganancias_plantillas: this.gananciasTotales,
usuarios_activos: this.cantUsuarioActivos,
usuarios_bloqueados: this.cantUsuarioBloqueados,
},
];
// listaMesesAnnos
// encuestasPublicadasMesAnno
const _reporteEncuestasPublicadas: any[] = [];
this.listaMesesAnnos.forEach((date: any, index) => {
let _report: any = {};
_report['fecha'] = date;
_report['cantidad'] = this.encuestasPublicadasMesAnno[index];
_reporteEncuestasPublicadas.push(_report);
});
// this.categorias
// this.encuestasPublicadasCategoria
const _reporteCantidadEncuestasPublicadasCategoria: any[] = [];
this.categorias!.forEach((categoria: any, index) => {
let _report: any = {};
_report['categoria'] = categoria.nombre;
_report['cantidad'] = this.encuestasPublicadasCategoria[index];
_reporteCantidadEncuestasPublicadasCategoria.push(_report);
});
// this.categorias
// this.encuestasFinalzadasCategoria
const _reporteCantidadEncuestasFinalizadasCategoria: any[] = [];
this.categorias!.forEach((categoria: any, index) => {
let _report: any = {};
_report['categoria'] = categoria.nombre;
_report['cantidad'] = this.encuestasFinalzadasCategoria[index];
_reporteCantidadEncuestasFinalizadasCategoria.push(_report);
});
// 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 = [
_reporteUsuarios,
_reporteEncuestasPublicadas,
_reporteCantidadEncuestasPublicadasCategoria,
_reporteCantidadEncuestasFinalizadasCategoria,
_reporteEncuestasReportesGenerales,
_reporteEncuestasUsuarios,
];
const _fileName = 'reportes_datasurvey';
exportAsExcelFile(_sheets, _excelFinalData, _fileName);
}
exportReportesGeneralesAdministradorPDF(): void {
/*
Cantidad de usuarios activos
Cantidad de usuarios bloqueados
Cantidad de encuestas publicadas por categoría
Cantidad de encuestas finalizadas por categoría
Cantidad de encuestas publicadas por mes y año
Cantidad de encuestas
Cantidad de personas que han completado sus encuestas
Cantidad de encuestas activas
Cantidad de encuestas finalizadas
Cantidad de comentarios de retroalimentación
*/
const doc = new jsPDF();
const _fileName = 'reportes_datasurvey';
let _docData, _headers, _docHeaders, _docTitle;
// Usuarios Generales
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';
generatePDFTable(doc, _docData, _docHeaders, _docTitle);
doc.addPage('p');
// 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

@ -0,0 +1,468 @@
<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

@ -0,0 +1,24 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DashboardUserComponent } from './dashboard-user.component';
describe('DashboardUserComponent', () => {
let component: DashboardUserComponent;
let fixture: ComponentFixture<DashboardUserComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [DashboardUserComponent],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(DashboardUserComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,593 @@
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({
selector: 'jhi-dashboard-user',
templateUrl: './dashboard-user.component.html',
styleUrls: ['./dashboard-user.component.scss'],
})
export class DashboardUserComponent implements OnInit {
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;
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

@ -0,0 +1,14 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DashboardUserComponent } from './dashboard-user/dashboard-user.component';
import { DashboardAdminComponent } from './dashboard-admin/dashboard-admin.component';
import { SharedModule } from '../../shared/shared.module';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { DashboardRoutingModule } from './route/dashboard-routing.module';
@NgModule({
declarations: [DashboardUserComponent, DashboardAdminComponent],
imports: [CommonModule, SharedModule, DashboardRoutingModule, FontAwesomeModule],
})
export class DashboardModule {}

View File

@ -0,0 +1,10 @@
export const generateFileName = (fileName: string, extension: string): string => {
return (
fileName +
'_' +
new Date().toLocaleDateString().substr(0, 10).split('/').join('-') +
'_' +
Math.random().toString().substring(2) +
extension
);
};

View File

@ -0,0 +1,37 @@
import * as XLSX from 'xlsx';
import * as FileSaver from 'file-saver';
import { generateFileName } from './export_common';
const EXCEL_TYPE: string = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
const EXCEL_EXTENSION: string = '.xlsx';
export const exportAsExcelFile = (sheetNames: string[], arrayOfData: any[], excelFileName: any) => {
const workbook = XLSX.utils.book_new();
arrayOfData.forEach((data, index) => {
let sheetName = sheetNames[index];
let worksheet = XLSX.utils.json_to_sheet(data);
XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);
});
const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
saveAsExcelFile(excelBuffer, excelFileName);
};
const saveAsExcelFile = (buffer: any, fileName: any) => {
const data = new Blob([buffer], { type: EXCEL_EXTENSION });
const generatedFileName = generateFileName(fileName, EXCEL_EXTENSION);
FileSaver.saveAs(data, generatedFileName);
};
export const exportAsExcelTable = () => {
const workbook = XLSX.utils.book_new();
let worksheet = XLSX.utils.json_to_sheet([{ test: 1 }, { test: 2 }]);
XLSX.utils.book_append_sheet(workbook, worksheet, 'test');
const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
saveAsExcelFile(excelBuffer, 'test');
};

View File

@ -0,0 +1,42 @@
import { jsPDF } from 'jspdf';
import { generateFileName } from './export_common';
const PDF_EXTENSION: string = '.pdf';
export const generatePDFTableData = (data: any): any => {
const result: any = [];
data.forEach((item: any) => {
result.push(Object.assign({}, item));
});
return result;
};
export const createPDFTableHeaders = (keys: any): any[] => {
let result = [];
for (let i = 0; i < keys.length; i += 1) {
result.push({
id: keys[i],
name: keys[i],
prompt: keys[i],
align: 'left',
padding: 0,
});
}
return result;
};
export const generatePDFTable = (doc: jsPDF, _docData: any, _docHeaders: string[], _docTitle: string): void => {
doc.setFontSize(20);
doc.setFont('helvetica', 'bold');
doc.text(_docTitle, 20, 20);
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);
doc.save(generatedFileName);
};

View File

@ -0,0 +1,25 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { DashboardUserComponent } from '../dashboard-user/dashboard-user.component';
import { DashboardAdminComponent } from '../dashboard-admin/dashboard-admin.component';
import { UserRouteAccessService } from '../../../core/auth/user-route-access.service';
const dashboardRoute: Routes = [
{
path: 'admin',
component: DashboardAdminComponent,
canActivate: [UserRouteAccessService],
},
{
path: 'user',
component: DashboardUserComponent,
canActivate: [UserRouteAccessService],
},
];
@NgModule({
imports: [RouterModule.forChild(dashboardRoute)],
exports: [RouterModule],
})
export class DashboardRoutingModule {}

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,13 @@ export class EPreguntaCerradaOpcionService {
constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {}
create(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion): Observable<EntityResponseType> { updateCount(id: number) {
return this.http.post<IEPreguntaCerradaOpcion>(this.resourceUrl, ePreguntaCerradaOpcion, { observe: 'response' }); debugger;
return this.http.put(`${this.resourceUrl}/count/${id}`, id, { observe: 'response' });
}
create(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion, preguntaId?: number): Observable<EntityResponseType> {
return this.http.post<IEPreguntaCerradaOpcion>(`${this.resourceUrl}/${preguntaId}`, ePreguntaCerradaOpcion, { observe: 'response' });
} }
update(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion): Observable<EntityResponseType> { update(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion): Observable<EntityResponseType> {
@ -49,6 +54,10 @@ export class EPreguntaCerradaOpcionService {
return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' });
} }
deleteMany(ids: number[]): Observable<EntityResponseType> {
return this.http.post<IEPreguntaCerradaOpcion>(`${this.resourceUrl}/deleteMany`, ids, { observe: 'response' });
}
addEPreguntaCerradaOpcionToCollectionIfMissing( addEPreguntaCerradaOpcionToCollectionIfMissing(
ePreguntaCerradaOpcionCollection: IEPreguntaCerradaOpcion[], ePreguntaCerradaOpcionCollection: IEPreguntaCerradaOpcion[],
...ePreguntaCerradaOpcionsToCheck: (IEPreguntaCerradaOpcion | null | undefined)[] ...ePreguntaCerradaOpcionsToCheck: (IEPreguntaCerradaOpcion | null | undefined)[]

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

@ -0,0 +1,193 @@
<div class="container-fluid" *ngIf="encuesta">
<div>
<h2 id="page-heading" data-cy="EPreguntaCerradaHeading">
<div class="d-flex align-items-center">
<p class="ds-title">Encuesta: {{ encuesta!.nombre }}</p>
<!-- &nbsp;&nbsp;<fa-icon class="ds-info&#45;&#45;icon" [icon]="faQuestion" data-toggle="modal" data-target="#verParametros"></fa-icon>-->
</div>
<p class="ds-subtitle">Fecha de inicio: {{ encuesta!.fechaPublicacion | 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>
<div class="alert alert-warning" id="no-result" *ngIf="ePreguntas?.length === 0">
<span>No se encontraron preguntas</span>
</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; trackBy: trackId">
<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; trackBy: trackId">
<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="radio"
(change)="onCheck(ePreguntaOpcionFinal)"
[value]="ePreguntaOpcionFinal.id"
style="border-radius: 3px"
name="{{ 'radio' + ePregunta.id }}"
id="{{ 'radio' + ePreguntaOpcionFinal.id }}"
/>
<label for="{{ 'radio' + ePreguntaOpcionFinal.id }}">{{ ePreguntaOpcionFinal.nombre }}</label>
</div>
<div class="checkbox" *ngIf="ePregunta.tipo === 'MULTIPLE'">
<input
(change)="toggleOption(ePreguntaOpcionFinal)"
type="checkbox"
style="border-radius: 3px"
id="{{ 'checkbox' + ePreguntaOpcionFinal.id }}"
/>
<label for="{{ 'checkbox' + ePreguntaOpcionFinal.id }}">{{ ePreguntaOpcionFinal.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="!ePregunta.tipo">
<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>
<button class="ds-btn ds-btn--primary" (click)="finish()">Finalizar</button>
</div>
<div
class="modal fade ds-modal"
id="verParametros"
tabindex="-1"
role="dialog"
aria-labelledby="exampleModalCenterTitle"
aria-hidden="true"
>
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title" id="exampleModalLongTitle">Información de encuesta</h1>
</div>
<div class="modal-body">
<div>
<div class="mb-5">
<p style="font-size: 1.2em" class="ds-subtitle">Cantidad de preguntas</p>
<p>{{ ePreguntas?.length }}</p>
</div>
<div class="mb-5">
<p class="ds-subtitle" jhiTranslate="dataSurveyApp.encuesta.acceso">Acceso</p>
<p jhiTranslate="{{ 'dataSurveyApp.AccesoEncuesta.' + encuesta.acceso }}">{{ encuesta.acceso }}</p>
</div>
<div *ngIf="encuesta.acceso === 'PRIVATE'" class="mb-5">
<p class="ds-subtitle">Contraseña</p>
<p>{{ encuesta.contrasenna }}</p>
</div>
<div class="mb-5">
<p class="ds-subtitle">Estado:</p>
<p jhiTranslate="{{ 'dataSurveyApp.EstadoEncuesta.' + encuesta.estado }}">{{ encuesta.estado }}</p>
</div>
<div *ngIf="encuesta.categoria" class="mb-5">
<p class="ds-subtitle">Categoría</p>
<P> </P> {{ encuesta.categoria?.nombre }}
</div>
<div class="mb-5">
<p class="ds-subtitle">Fecha de publicación</p>
<P
>{{
encuesta.fechaPublicacion === undefined
? 'Sin publicar'
: (encuesta.fechaPublicacion | formatShortDatetime | lowercase)
}}
</P>
</div>
<div class="mb-5">
<p class="ds-subtitle">Fecha de finalización</p>
<p>
{{
encuesta.fechaFinalizada === undefined
? 'Sin finalizar'
: (encuesta.fechaFinalizada | formatShortDatetime | lowercase)
}}
</p>
</div>
<div class="mb-5">
<p class="ds-subtitle">Calificación</p>
<div>
<fa-icon *ngFor="let i of [].constructor(this.avgCalificacion)" class="entity-icon--star" [icon]="faStar"></fa-icon
><fa-icon
*ngFor="let i of [].constructor(5 - this.avgCalificacion)"
class="entity-icon--star--off"
[icon]="faStar"
></fa-icon>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button id="cancelBtnVerParametros" type="button" class="ds-btn ds-btn--secondary" data-dismiss="modal">
<fa-icon icon="arrow-left"></fa-icon>&nbsp;&nbsp;<span>Volver</span>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,24 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { EncuestaCompleteComponent } from './complete.component';
describe('EncuestaCompleteComponent', () => {
let component: EncuestaCompleteComponent;
let fixture: ComponentFixture<EncuestaCompleteComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [EncuestaCompleteComponent],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(EncuestaCompleteComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,291 @@
import { Component, OnInit } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { finalize } from 'rxjs/operators';
import { IEncuesta } from '../encuesta.model';
import { EncuestaService } from '../service/encuesta.service';
import { ICategoria } from 'app/entities/categoria/categoria.model';
import { IUsuarioExtra } 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 { IEPreguntaCerrada } from 'app/entities/e-pregunta-cerrada/e-pregunta-cerrada.model';
import { EPreguntaCerradaService } from 'app/entities/e-pregunta-cerrada/service/e-pregunta-cerrada.service';
import { EPreguntaAbiertaService } from '../../e-pregunta-abierta/service/e-pregunta-abierta.service';
import { EPreguntaAbiertaRespuestaService } from '../../e-pregunta-abierta-respuesta/service/e-pregunta-abierta-respuesta.service';
import { EPreguntaCerradaOpcionService } from '../../e-pregunta-cerrada-opcion/service/e-pregunta-cerrada-opcion.service';
import { faStar, faQuestion } from '@fortawesome/free-solid-svg-icons';
import { AccesoEncuesta } from 'app/entities/enumerations/acceso-encuesta.model';
import { EncuestaPasswordDialogComponent } from '../encuesta-password-dialog/encuesta-password-dialog.component';
import { PreguntaCerradaTipo } from 'app/entities/enumerations/pregunta-cerrada-tipo.model';
import { EPreguntaAbiertaRespuesta } from 'app/entities/e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.model';
import { Observable } from 'rxjs/internal/Observable';
import { HttpErrorResponse, HttpResponse } from '@angular/common/http';
import { EstadoEncuesta } from 'app/entities/enumerations/estado-encuesta.model';
@Component({
selector: 'jhi-complete',
templateUrl: './complete.component.html',
})
export class EncuestaCompleteComponent implements OnInit {
categoriasSharedCollection: ICategoria[] = [];
usuarioExtrasSharedCollection: IUsuarioExtra[] = [];
faStar = faStar;
faQuestion = faQuestion;
encuesta?: IEncuesta;
isLoading = false;
ePreguntas?: any[];
ePreguntasOpciones?: any[];
isLocked?: boolean;
selectedOpenOptions: any;
selectedSingleOptions: any;
selectedMultiOptions: any;
error: boolean;
calificacion: number;
stars: number[] = [1, 2, 3, 4, 5];
cantidadCalificaciones: number = 0;
avgCalificacion: number = 0;
sumCalificacion: number = 0;
constructor(
protected activatedRoute: ActivatedRoute,
protected encuestaService: EncuestaService,
protected usuarioExtraService: UsuarioExtraService,
protected fb: FormBuilder,
protected modalService: NgbModal,
protected ePreguntaCerradaService: EPreguntaCerradaService,
protected ePreguntaCerradaOpcionService: EPreguntaCerradaOpcionService,
protected ePreguntaAbiertaService: EPreguntaAbiertaService,
protected ePreguntaAbiertaRespuestaService: EPreguntaAbiertaRespuestaService
) {
this.selectedOpenOptions = {};
this.selectedSingleOptions = {};
this.selectedMultiOptions = [];
this.error = false;
this.calificacion = 0;
}
ngOnInit(): void {
this.activatedRoute.data.subscribe(({ encuesta }) => {
if (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.verifyPassword();
});
for (let pregunta of this.ePreguntas!) {
if (pregunta.tipo && pregunta.tipo === PreguntaCerradaTipo.SINGLE) {
this.selectedSingleOptions[pregunta.id] = null;
}
}
}
verifyPassword(): void {
if (this.encuesta!.acceso === AccesoEncuesta.PUBLIC) {
this.loadAll();
this.isLocked = false;
} else {
const modalRef = this.modalService.open(EncuestaPasswordDialogComponent, { size: 'lg', backdrop: 'static' });
modalRef.componentInstance.encuesta = this.encuesta;
modalRef.closed.subscribe(reason => {
this.isLocked = reason != 'success';
if (this.isLocked) {
this.previousState();
} else {
this.loadAll();
}
});
}
}
ngAfterViewChecked(): void {
this.initListeners();
}
initListeners(): void {
const questions = document.getElementsByClassName('ds-survey--question-wrapper');
for (let i = 0; i < questions.length; i++) {
if (questions[i].classList.contains('ds-survey--closed-option')) {
questions[i].addEventListener('click', e => {
if ((e.target as HTMLInputElement).checked) {
(e.target as HTMLElement).offsetParent!.classList.add('ds-survey--closed-option--active');
(e.target as HTMLElement).id;
} else {
(e.target as HTMLElement).offsetParent!.classList.remove('ds-survey--closed-option--active');
}
});
}
}
}
trackId(_index: number, item: IEPreguntaCerrada): number {
return item.id!;
}
trackEPreguntaCerradaById(_index: number, item: IEPreguntaCerrada): number {
return item.id!;
}
trackCategoriaById(_index: number, item: ICategoria): number {
return item.id!;
}
trackUsuarioExtraById(_index: number, item: IUsuarioExtra): number {
return item.id!;
}
loadAll(): void {
this.isLoading = true;
this.encuestaService
.findQuestions(this.encuesta?.id!)
.pipe(
finalize(() =>
this.encuestaService.findQuestionsOptions(this.encuesta?.id!).subscribe(
(res: any) => {
this.isLoading = false;
this.ePreguntasOpciones = res.body ?? [];
},
() => {
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();
}
onCheck(preguntaOpcion: { epreguntaCerrada: any; id: any }): void {
this.selectedSingleOptions[preguntaOpcion.epreguntaCerrada!.id!] = preguntaOpcion.id;
}
toggleOption(ePreguntaOpcionFinal: { id: any }): void {
if (this.selectedMultiOptions.includes(ePreguntaOpcionFinal.id)) {
for (let i = 0; i < this.selectedMultiOptions.length; i++) {
if (this.selectedMultiOptions[i] === ePreguntaOpcionFinal.id) {
this.selectedMultiOptions.splice(i, 1);
}
}
} else {
this.selectedMultiOptions.push(ePreguntaOpcionFinal.id);
}
}
finish(): void {
this.updateClosedOptionsCount();
this.getOpenQuestionAnswers();
this.registerOpenQuestionAnswers();
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() {
debugger;
for (let key in this.selectedSingleOptions) {
this.ePreguntaCerradaOpcionService.updateCount(this.selectedSingleOptions[key]).subscribe(() => {
console.log('success');
});
}
this.selectedMultiOptions.forEach((option: any) => {
this.ePreguntaCerradaOpcionService.updateCount(option).subscribe(() => {
console.log('success');
});
});
}
registerOpenQuestionAnswers() {
debugger;
for (let id in this.selectedOpenOptions) {
let pregunta = this.ePreguntas!.find(p => {
return p.id == id;
});
debugger;
/*
let newRespuesta = new EPreguntaAbiertaRespuesta(this.selectedOpenOptions[id], pregunta);
this.subscribeToSaveResponse(this.ePreguntaAbiertaRespuestaService.create(newRespuesta));
*/
let newRespuesta = new EPreguntaAbiertaRespuesta(this.selectedOpenOptions[id], pregunta);
this.ePreguntaAbiertaRespuestaService.create(newRespuesta).subscribe(() => {
console.log('success');
});
}
}
protected onSaveFinalize(): void {
// this.isSaving = false;
}
processError(response: HttpErrorResponse): void {
if (response.status === 400) {
this.error = true;
}
}
protected subscribeToSaveResponse(result: Observable<HttpResponse<any>>): void {
result.pipe(finalize(() => this.onSaveFinalize())).subscribe(
() => this.previousState(),
response => this.processError(response)
);
}
getOpenQuestionAnswers() {
this.ePreguntas!.forEach(pregunta => {
if (!pregunta.tipo) {
let textValue = (document.getElementById(pregunta.id) as HTMLInputElement).value;
this.selectedOpenOptions[pregunta.id] = textValue;
}
});
}
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

@ -1,24 +1,28 @@
<form *ngIf="encuesta" name="deleteForm" (ngSubmit)="confirmDelete(encuesta.id!)"> <form class="ds-form" *ngIf="encuesta" name="deleteForm" (ngSubmit)="confirmDelete(encuesta!)">
<div class="modal-header"> <div class="modal-header">
<h4 class="modal-title" data-cy="encuestaDeleteDialogHeading" jhiTranslate="entity.delete.title">Confirm delete operation</h4> <!-- <h2 class="ds-title" data-cy="encuestaDeleteDialogHeading" jhiTranslate="entity.delete.title">Confirm delete operation</h2>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" (click)="cancel()">&times;</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true" (click)="cancel()">&times;</button>-->
</div> </div>
<div class="modal-body"> <div class="modal-body">
<jhi-alert-error></jhi-alert-error> <p class="ds-title--small">Eliminar encuesta</p>
<p
<p id="jhi-delete-encuesta-heading" jhiTranslate="dataSurveyApp.encuesta.delete.question" [translateValues]="{ id: encuesta.id }"> class="ds-subtitle"
Are you sure you want to delete this Encuesta? id="jhi-delete-encuesta-heading"
jhiTranslate="dataSurveyApp.encuesta.delete.question"
[translateValues]="{ id: encuesta.id }"
>
Are you sure you want to delete this survey?
</p> </p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" (click)="cancel()"> <button type="button" class="ds-btn ds-btn--secondary" data-dismiss="modal" (click)="cancel()">
<fa-icon icon="ban"></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 id="jhi-confirm-delete-encuesta" data-cy="entityConfirmDeleteButton" type="submit" class="btn btn-danger"> <button id="jhi-confirm-delete-encuesta" data-cy="entityConfirmDeleteButton" type="submit" class="ds-btn ds-btn--danger">
<fa-icon icon="times"></fa-icon>&nbsp;<span jhiTranslate="entity.action.delete">Delete</span> <fa-icon icon="times"></fa-icon>&nbsp;<span jhiTranslate="entity.action.delete">Delete</span>
</button> </button>
</div> </div>

View File

@ -1,65 +0,0 @@
jest.mock('@ng-bootstrap/ng-bootstrap');
import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing';
import { HttpResponse } from '@angular/common/http';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { of } from 'rxjs';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { EncuestaService } from '../service/encuesta.service';
import { EncuestaDeleteDialogComponent } from './encuesta-delete-dialog.component';
describe('Component Tests', () => {
describe('Encuesta Management Delete Component', () => {
let comp: EncuestaDeleteDialogComponent;
let fixture: ComponentFixture<EncuestaDeleteDialogComponent>;
let service: EncuestaService;
let mockActiveModal: NgbActiveModal;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
declarations: [EncuestaDeleteDialogComponent],
providers: [NgbActiveModal],
})
.overrideTemplate(EncuestaDeleteDialogComponent, '')
.compileComponents();
fixture = TestBed.createComponent(EncuestaDeleteDialogComponent);
comp = fixture.componentInstance;
service = TestBed.inject(EncuestaService);
mockActiveModal = TestBed.inject(NgbActiveModal);
});
describe('confirmDelete', () => {
it('Should call delete service on confirmDelete', inject(
[],
fakeAsync(() => {
// GIVEN
jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({})));
// WHEN
comp.confirmDelete(123);
tick();
// THEN
expect(service.delete).toHaveBeenCalledWith(123);
expect(mockActiveModal.close).toHaveBeenCalledWith('deleted');
})
));
it('Should not call delete service on clear', () => {
// GIVEN
jest.spyOn(service, 'delete');
// WHEN
comp.cancel();
// THEN
expect(service.delete).not.toHaveBeenCalled();
expect(mockActiveModal.close).not.toHaveBeenCalled();
expect(mockActiveModal.dismiss).toHaveBeenCalled();
});
});
});
});

View File

@ -1,14 +1,16 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { IEncuesta } from '../encuesta.model'; import { IEncuesta } from '../encuesta.model';
import { EncuestaService } from '../service/encuesta.service'; import { EncuestaService } from '../service/encuesta.service';
import { EstadoEncuesta } from 'app/entities/enumerations/estado-encuesta.model';
import { IUsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model';
@Component({ @Component({
templateUrl: './encuesta-delete-dialog.component.html', templateUrl: './encuesta-delete-dialog.component.html',
}) })
export class EncuestaDeleteDialogComponent { export class EncuestaDeleteDialogComponent {
encuesta?: IEncuesta; encuesta?: IEncuesta;
usuarioExtra?: IUsuarioExtra;
constructor(protected encuestaService: EncuestaService, protected activeModal: NgbActiveModal) {} constructor(protected encuestaService: EncuestaService, protected activeModal: NgbActiveModal) {}
@ -16,9 +18,11 @@ export class EncuestaDeleteDialogComponent {
this.activeModal.dismiss(); this.activeModal.dismiss();
} }
confirmDelete(id: number): void { confirmDelete(encuesta: IEncuesta): void {
this.encuestaService.delete(id).subscribe(() => { encuesta.estado = EstadoEncuesta.DELETED;
this.encuestaService.deleteEncuesta(encuesta).subscribe(() => {
this.activeModal.close('deleted'); this.activeModal.close('deleted');
}); });
//this.encuestaService.deletedNotification(encuesta);
} }
} }

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