Merge pull request #46 from Quantum-P3/dev

qa sprint 2
This commit is contained in:
Eduardo Quiros 2021-07-19 05:56:53 +00:00 committed by GitHub
commit 099ac341b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
66 changed files with 15203 additions and 1718 deletions

View File

@ -45,7 +45,15 @@
],
"styles": ["src/main/webapp/content/scss/paper-dashboard.scss", "./node_modules/swiper/swiper-bundle.min.css"],
"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-notify.js",
"src/main/webapp/content/js/bootstrap-selectpicker.js",
@ -54,19 +62,11 @@
"src/main/webapp/content/js/chartist.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/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/paper-dashboard.js",
"src/main/webapp/content/js/perfect-scrollbar.min.js",
"src/main/webapp/content/js/sweetalert2.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"
]
},

81
package-lock.json generated
View File

@ -27,6 +27,7 @@
"angularx-social-login": "^4.0.1",
"bootstrap": "4.6.0",
"dayjs": "1.10.5",
"jquery": "^3.6.0",
"ngx-infinite-scroll": "10.0.1",
"ngx-webstorage": "8.0.0",
"rxjs": "6.6.7",
@ -44,7 +45,9 @@
"@angular/cli": "12.0.4",
"@angular/compiler-cli": "12.0.5",
"@angular/service-worker": "12.0.5",
"@types/bootstrap": "^5.0.17",
"@types/jest": "26.0.23",
"@types/jquery": "^3.5.6",
"@types/node": "15.12.2",
"@types/sockjs-client": "1.5.0",
"@typescript-eslint/eslint-plugin": "4.27.0",
@ -3983,6 +3986,16 @@
"integrity": "sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==",
"dev": true
},
"node_modules/@popperjs/core": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz",
"integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==",
"dev": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@scarf/scarf": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz",
@ -4179,6 +4192,16 @@
"@babel/types": "^7.3.0"
}
},
"node_modules/@types/bootstrap": {
"version": "5.0.17",
"resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.0.17.tgz",
"integrity": "sha512-uQQQ3p+zw10VjZLvtCuKWI6QgVCYEnK/yHnno3gyEhikfQdiZexS2XPxjWRboGmX135o470GkmCta9eAgQMVLQ==",
"dev": true,
"dependencies": {
"@popperjs/core": "^2.9.2",
"@types/jquery": "*"
}
},
"node_modules/@types/concat-stream": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz",
@ -4295,6 +4318,15 @@
"pretty-format": "^26.0.0"
}
},
"node_modules/@types/jquery": {
"version": "3.5.6",
"resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.6.tgz",
"integrity": "sha512-SmgCQRzGPId4MZQKDj9Hqc6kSXFNWZFHpELkyK8AQhf8Zr6HKfCzFv9ZC1Fv3FyQttJZOlap3qYb12h61iZAIg==",
"dev": true,
"dependencies": {
"@types/sizzle": "*"
}
},
"node_modules/@types/json-schema": {
"version": "7.0.7",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
@ -4343,6 +4375,12 @@
"integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==",
"dev": true
},
"node_modules/@types/sizzle": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
"integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
"dev": true
},
"node_modules/@types/sockjs-client": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@types/sockjs-client/-/sockjs-client-1.5.0.tgz",
@ -15491,6 +15529,11 @@
"@sideway/pinpoint": "^2.0.0"
}
},
"node_modules/jquery": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -21156,7 +21199,7 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
"integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
"deprecated": "The",
"deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
"dev": true,
"engines": {
"node": ">=0.4.x"
@ -30128,6 +30171,12 @@
"integrity": "sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==",
"dev": true
},
"@popperjs/core": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz",
"integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==",
"dev": true
},
"@scarf/scarf": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz",
@ -30297,6 +30346,16 @@
"@babel/types": "^7.3.0"
}
},
"@types/bootstrap": {
"version": "5.0.17",
"resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.0.17.tgz",
"integrity": "sha512-uQQQ3p+zw10VjZLvtCuKWI6QgVCYEnK/yHnno3gyEhikfQdiZexS2XPxjWRboGmX135o470GkmCta9eAgQMVLQ==",
"dev": true,
"requires": {
"@popperjs/core": "^2.9.2",
"@types/jquery": "*"
}
},
"@types/concat-stream": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz",
@ -30413,6 +30472,15 @@
"pretty-format": "^26.0.0"
}
},
"@types/jquery": {
"version": "3.5.6",
"resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.6.tgz",
"integrity": "sha512-SmgCQRzGPId4MZQKDj9Hqc6kSXFNWZFHpELkyK8AQhf8Zr6HKfCzFv9ZC1Fv3FyQttJZOlap3qYb12h61iZAIg==",
"dev": true,
"requires": {
"@types/sizzle": "*"
}
},
"@types/json-schema": {
"version": "7.0.7",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
@ -30461,6 +30529,12 @@
"integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==",
"dev": true
},
"@types/sizzle": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
"integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
"dev": true
},
"@types/sockjs-client": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@types/sockjs-client/-/sockjs-client-1.5.0.tgz",
@ -39054,6 +39128,11 @@
"@sideway/pinpoint": "^2.0.0"
}
},
"jquery": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",

View File

@ -84,6 +84,7 @@
"angularx-social-login": "^4.0.1",
"bootstrap": "4.6.0",
"dayjs": "1.10.5",
"jquery": "^3.6.0",
"ngx-infinite-scroll": "10.0.1",
"ngx-webstorage": "8.0.0",
"rxjs": "6.6.7",
@ -101,7 +102,9 @@
"@angular/cli": "12.0.4",
"@angular/compiler-cli": "12.0.5",
"@angular/service-worker": "12.0.5",
"@types/bootstrap": "^5.0.17",
"@types/jest": "26.0.23",
"@types/jquery": "^3.5.6",
"@types/node": "15.12.2",
"@types/sockjs-client": "1.5.0",
"@typescript-eslint/eslint-plugin": "4.27.0",

View File

@ -1,7 +1,8 @@
package org.datasurvey.repository;
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;
/**

View File

@ -109,4 +109,10 @@ public class MailService {
log.debug("Sending password reset email to '{}'", user.getEmail());
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");
}
}

View File

@ -173,6 +173,7 @@ public class AccountResource {
// Pretend the request has been successful to prevent checking which emails really exist
// but log that an invalid attempt has been made
log.warn("Password reset requested for non existing mail");
throw new EmailNotExistException();
}
}
@ -192,6 +193,8 @@ public class AccountResource {
if (!user.isPresent()) {
throw new AccountResourceException("No user was found for this reset key");
} else {
mailService.sendPasswordRestoredMail(user.get());
}
}

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,7 @@ public final class ErrorConstants {
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 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");
private ErrorConstants() {}
}

View File

@ -19,3 +19,11 @@ email.reset.title=DataSurvey password reset
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.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

View File

@ -5,17 +5,26 @@ error.status=Estado:
error.message=Mensaje:
# Activation email
email.activation.title=Activación de DataSurvey
email.activation.greeting=Estimado/a {0}
email.activation.text1=Su cuenta en DataSurvey ha sido creada. Por favor, haga clic en el siguiente enlace para activarla:
email.activation.title=Confirmación de correo con DataSurvey
email.activation.greeting=¡Hola, {0}!
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.signature=Equipo de DataSurvey.
email.signature=Equipo de DataSurvey
# Creation email
email.creation.text1=Su cuenta en DataSurvey ha sido creada. Por favor, haga clic en el siguiente enlace para utilizarla:
# Reset email
email.reset.title=Reinicio de 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.text2=Saludos,
# Password Restored Mail
email.restored.title=Se restaleció su contraseña en DataSurvey
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

View File

@ -1,20 +1,327 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<title th:text="#{email.activation.title}">JHipster activation</title>
<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 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>
<p th:text="#{email.activation.greeting(${user.login})}">Dear</p>
<p th:text="#{email.activation.text1}">Your JHipster account has been created, please click on the URL below to activate it:</p>
<p>
<a th:with="url=(@{|${baseUrl}/account/activate?key=${user.activationKey}|})" th:href="${url}" th:text="${url}">Activation link</a>
</p>
<p>
<span th:text="#{email.activation.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
<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.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 class="text">datasurvey@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,20 +1,327 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<title th:text="#{email.activation.title}">JHipster creation</title>
<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 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>
<p th:text="#{email.activation.greeting(${user.login})}">Dear</p>
<p th:text="#{email.creation.text1}">Your JHipster account has been created, please click on the URL below to access it:</p>
<p>
<a th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}" th:text="${url}">Login link</a>
</p>
<p>
<span th:text="#{email.activation.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
<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.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 class="text">datasurvey@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>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
<head>
<title th:text="#{email.reset.title}">JHipster password reset</title>
<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 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>
<p th:text="#{email.reset.greeting(${user.login})}">Dear</p>
<p th:text="#{email.reset.text1}">
For your JHipster account a password reset was requested, please click on the URL below to reset it:
</p>
<p>
<a th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}" th:text="${url}">Login link</a>
</p>
<p>
<span th:text="#{email.reset.text2}">Regards, </span>
<br />
<em th:text="#{email.signature}">JHipster.</em>
</p>
<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.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 class="text">datasurvey@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,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: 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.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 th:href="#{'mailto:'+email.restored.email}" th:text="#{email.restored.email}">datasurvey@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 class="text">datasurvey@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="row justify-content-center">
<div class="col-md-8">
<h1 jhiTranslate="activate.title">Activation</h1>
<div class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5" style="height: 100vh; background-color: #f1f5f9">
<div class="container">
<div class="row justify-content-center">
<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">
<span jhiTranslate="activate.messages.success"><strong>Your user account has been activated.</strong> Please </span>
<a class="alert-link" routerLink="/login" jhiTranslate="global.messages.info.authenticated.link">sign in</a>.
</div>
<div class="card-body p-4">
<div class="text-center w-75 m-auto">
<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"
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">
<strong>Your user could not be activated.</strong> Please use the registration form to sign up.
<!-- end row -->
</div>
<!-- end col -->
</div>
<!-- end row -->
</div>
<!-- end container -->
</div>
<!-- end page -->

View File

@ -1,137 +1,172 @@
<div>
<div class="row justify-content-center">
<div class="col-md-4">
<h1 jhiTranslate="reset.finish.title">Reset password</h1>
<div class="alert alert-danger" jhiTranslate="reset.finish.messages.keymissing" *ngIf="initialized && !key">
<strong>The password reset key is missing.</strong>
</div>
<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 class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5" style="height: 100vh; background-color: #f1f5f9">
<div class="container">
<div class="row justify-content-center">
<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="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"
<div class="card-body p-4">
<div class="text-center w-75 m-auto">
<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"
jhiTranslate="reset.finish.title"
>
Your password confirmation is required.
</small>
Reset password
</h4>
<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 4 characters.
</small>
<p class="mb-4" style="color: rgba(146, 146, 146, 0.664)" *ngIf="key && !success" jhiTranslate="reset.finish.messages.info">
Choose a new password
</p>
</div>
<div>
<div class="alert alert-danger" jhiTranslate="reset.finish.messages.keymissing" *ngIf="initialized && !key">
<strong>The password reset key is missing.</strong>
</div>
<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 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 *ngIf="success">
<div class="alert alert-success text-center my-2">
<span jhiTranslate="reset.finish.messages.success"><strong>Your password has been reset.</strong></span>
<strong><span jhiTranslate="global.messages.info.authenticated.link">sign in</span></strong>
</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>
<!-- end card-body -->
</div>
<!-- end card -->
<button
type="submit"
[disabled]="passwordForm.invalid"
class="btn btn-primary"
jhiTranslate="reset.finish.form.button"
data-cy="submit"
>
Reset Password
</button>
</form>
<!-- end row -->
</div>
<!-- end col -->
</div>
<!-- end row -->
</div>
<!-- end container -->
</div>
<!-- end page -->

View File

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

View File

@ -1,81 +1,132 @@
<div>
<div class="row justify-content-center">
<div class="col-md-8">
<h1 jhiTranslate="reset.request.title">Reset your password</h1>
<jhi-alert-error></jhi-alert-error>
<div class="alert alert-warning" *ngIf="!success">
<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 class="account-pages pt-2 pt-sm-5 pb-4 pb-sm-5" style="height: 100vh; background-color: #f1f5f9">
<div class="container">
<div class="row justify-content-center">
<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>
<button
type="submit"
[disabled]="resetRequestForm.invalid"
class="btn btn-primary"
jhiTranslate="reset.request.form.button"
data-cy="submit"
>
Reset
</button>
</form>
<div class="card-body p-4">
<div class="text-center w-75 m-auto">
<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"
jhiTranslate="reset.request.title"
>
RESET YOUR PASSWORD
</h4>
<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> Please choose another one.
</div>
</div>
<form *ngIf="!success" name="form" class="ds-form" role="form" (ngSubmit)="requestReset()" [formGroup]="resetRequestForm">
<div class="form-group">
<label class="form-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>
<small class="form-text text-danger" *ngIf="resetRequestForm.get('email')?.errors?.email">
Se requiere un correo electrónico válido.
</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 se encuentra registrado/a?
<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>
<!-- end row -->
</div>
<!-- end container -->
</div>
<!-- end page -->

View File

@ -2,6 +2,8 @@ import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
import { PasswordResetInitService } from './password-reset-init.service';
import { HttpErrorResponse } from '@angular/common/http';
import { EMAIL_NOT_EXISTS_TYPE } from '../../../config/error.constants';
@Component({
selector: 'jhi-password-reset-init',
@ -10,7 +12,8 @@ import { PasswordResetInitService } from './password-reset-init.service';
export class PasswordResetInitComponent implements AfterViewInit {
@ViewChild('email', { static: false })
email?: ElementRef;
errorEmailNotExists = false;
error = false;
success = false;
resetRequestForm = this.fb.group({
email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]],
@ -25,6 +28,22 @@ export class PasswordResetInitComponent implements AfterViewInit {
}
requestReset(): void {
this.passwordResetInitService.save(this.resetRequestForm.get(['email'])!.value).subscribe(() => (this.success = true));
this.errorEmailNotExists = 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 {
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="row justify-content-center">
<div class="col-xxl-4 col-lg-5">
@ -8,13 +8,21 @@
</div>
<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">
REGISTRARSE
</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 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">
<strong>Registration saved!</strong> Please check your email for confirmation.
</div>

View File

@ -163,7 +163,7 @@
</form>
</div>
</div>
</div>
</div>
-------------------------------------------------------------------------------
-->
@ -175,12 +175,12 @@
<p class="ds-title">Perfil</p>
</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>
<!-- Form -->
<!-- Form de info usuario -->
<form
autocomplete="off"
class="ds-form col-lg ml-lg-5 mr-lg-5 pr-lg-5"
@ -191,6 +191,20 @@
[formGroup]="editForm"
>
<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">
<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" />
@ -221,7 +235,7 @@
<input
id="field_fechaNacimiento"
data-cy="fechaNacimiento"
type="datetime-local"
type="date"
class="form-control"
name="fechaNacimiento"
formControlName="fechaNacimiento"
@ -256,7 +270,7 @@
[disabled]="editForm.invalid || isSaving"
class="ds-btn ds-btn--primary"
>
&nbsp;<span jhiTranslate="entity.action.save">Save</span>
<span jhiTranslate="entity.action.save">Save</span>
</button>
</div>
</form>
@ -270,36 +284,78 @@
</div>
<div>
<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>
</div>
<div class="alert alert-danger" *ngIf="isGoogle" jhiTranslate="login.messages.error.isGoogle" data-cy="loginError"></div>
</div>
</div>
<!-- Form -->
<!-- Form de password-->
<form
autocomplete="off"
class="ds-form col-lg ml-lg-5 mr-lg-5 pr-lg-5"
name="passwordForm"
role="form"
novalidate
(ngSubmit)="save()"
(ngSubmit)="savePassword()"
[formGroup]="passwordForm"
>
<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">
<label class="form-control-label" for="field_password">Contraseña actual</label>
<input
type="text"
type="password"
class="form-control"
name="password"
id="field_password"
data-cy="password"
formControlName="password"
placeholder="Su contraseña actual"
[readOnly]="isGoogle"
/>
<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
class="form-text text-danger"
@ -308,6 +364,22 @@
>
This field is required.
</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>
@ -315,18 +387,20 @@
<div class="form-group w-100">
<label class="form-control-label" for="field_passwordNew">Contraseña nueva</label>
<input
type="text"
type="password"
class="form-control"
name="passwordNew"
id="field_passwordNew"
data-cy="passwordNew"
formControlName="passwordNew"
placeholder="Contraseña nueva"
[readOnly]="isGoogle"
/>
<div
*ngIf="
passwordForm.get('passwordNew')!.invalid &&
(passwordForm.get('passwordNew')!.dirty || passwordForm.get('passwordNew')!.touched)
(passwordForm.get('passwordNew')!.dirty || passwordForm.get('passwordNew')!.touched) &&
!isGoogle
"
>
<small
@ -336,6 +410,22 @@
>
This field is required.
</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>
@ -344,18 +434,20 @@
<div class="form-group w-100">
<label class="form-control-label" for="field_passwordNewConfirm">Confirmar contraseña nueva</label>
<input
type="text"
type="password"
class="form-control"
name="passwordNewConfirm"
id="field_passwordNewConfirm"
data-cy="passwordNewConfirm"
formControlName="passwordNewConfirm"
placeholder="Contraseña nueva"
[readOnly]="isGoogle"
/>
<div
*ngIf="
passwordForm.get('passwordNewConfirm')!.invalid &&
(passwordForm.get('passwordNewConfirm')!.dirty || passwordForm.get('passwordNewConfirm')!.touched)
(passwordForm.get('passwordNewConfirm')!.dirty || passwordForm.get('passwordNewConfirm')!.touched) &&
!isGoogle
"
>
<small
@ -365,12 +457,28 @@
>
This field is required.
</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 class="row">
<button
*ngIf="!isGoogle"
type="button"
id="cancel-save"
data-cy="entityCreateCancelButton"
@ -381,13 +489,14 @@
</button>
<button
*ngIf="!isGoogle"
type="submit"
id="save-entity"
data-cy="entityCreateSaveButton"
[disabled]="passwordForm.invalid || isSaving"
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>
</div>
</form>

View File

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

View File

@ -1,12 +1,11 @@
import { Component, OnInit } from '@angular/core';
import { HttpResponse } from '@angular/common/http';
import { Component, ContentChild, OnInit } from '@angular/core';
import { HttpErrorResponse, HttpResponse } from '@angular/common/http';
import { FormBuilder, Validators } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { Router, NavigationEnd, ActivatedRoute } from '@angular/router';
import { Observable } from 'rxjs';
import { finalize, map } from 'rxjs/operators';
import * as dayjs from 'dayjs';
import { DATE_TIME_FORMAT } from 'app/config/input.constants';
import { DATE_FORMAT, DATE_TIME_FORMAT } from 'app/config/input.constants';
import { IUser } from 'app/entities/user/user.model';
import { UserService } from 'app/entities/user/user.service';
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 { UsuarioExtraService } from 'app/entities/usuario-extra/service/usuario-extra.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({
selector: 'jhi-settings',
templateUrl: './settings.component.html',
})
export class SettingsComponent implements OnInit {
currentUrl = this.router.url;
isSaving = false;
success = false;
successPassword = false;
samePassword = false;
error = false;
errorPassword = false;
doNotMatch = false;
usersSharedCollection: IUser[] = [];
plantillasSharedCollection: IPlantilla[] = [];
showPassword = false;
isGoogle = this.localStorageService.retrieve('IsGoogle');
//Form info del usuario
editForm = this.fb.group({
email: [null, [Validators.required]],
id: [],
@ -36,10 +48,11 @@ export class SettingsComponent implements OnInit {
plantillas: [],
});
//form de la contraseña
passwordForm = this.fb.group({
password: [null, [Validators.required]],
passwordNew: [null, [Validators.required]],
passwordNewConfirm: [null, [Validators.required]],
password: [null, [Validators.required, Validators.minLength(8), Validators.maxLength(50)]],
passwordNew: [null, [Validators.required, Validators.minLength(8), Validators.maxLength(50)]],
passwordNewConfirm: [null, [Validators.required, Validators.minLength(8), Validators.maxLength(50)]],
});
usuarioExtra: UsuarioExtra | null = null;
@ -75,13 +88,18 @@ export class SettingsComponent implements OnInit {
{ name: 'C28' },
];
/* @ContentChild(IonInput) input: IonInput;*/
constructor(
protected usuarioExtraService: UsuarioExtraService,
protected userService: UserService,
protected plantillaService: PlantillaService,
protected activatedRoute: ActivatedRoute,
protected fb: FormBuilder,
protected accountService: AccountService
protected accountService: AccountService,
private localStorageService: LocalStorageService,
protected passwordService: PasswordService,
private router: Router
) {}
ngOnInit(): void {
@ -103,6 +121,8 @@ export class SettingsComponent implements OnInit {
}
});
//console.log(this.isGoogle);
// this.activatedRoute.data.subscribe(({ usuarioExtra }) => {
// });
@ -112,13 +132,37 @@ export class SettingsComponent implements OnInit {
window.history.back();
}
//Se manda la info a guardar
save(): void {
this.isSaving = true;
const usuarioExtra = this.createFromForm();
if (usuarioExtra.id !== undefined) {
this.subscribeToSaveResponse(this.usuarioExtraService.update(usuarioExtra));
console.log(usuarioExtra.iconoPerfil);
console.log(usuarioExtra.fechaNacimiento);
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 {
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 +187,21 @@ export class SettingsComponent implements OnInit {
protected subscribeToSaveResponse(result: Observable<HttpResponse<IUsuarioExtra>>): void {
result.pipe(finalize(() => this.onSaveFinalize())).subscribe(
() => this.onSaveSuccess(),
() => this.onSaveError()
() => ((this.success = true), this.windowReload()),
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 {
this.previousState();
@ -160,22 +215,25 @@ export class SettingsComponent implements OnInit {
this.isSaving = false;
}
//Llena el formulario para que se vea en pantalla
protected updateForm(usuarioExtra: IUsuarioExtra): void {
this.editForm.patchValue({
email: usuarioExtra.user?.login,
id: usuarioExtra.id,
nombre: usuarioExtra.nombre,
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,
user: usuarioExtra.user,
plantillas: usuarioExtra.plantillas,
});
// Update swiper
this.profileIcon = parseInt(usuarioExtra.iconoPerfil!);
this.profileIcon = usuarioExtra.iconoPerfil!;
console.log(this.profileIcon);
this.profileIcons.forEach(icon => {
if (parseInt(icon.name.split('C')[1]) === this.profileIcon) {
if (icon.name.split('C')[1] === this.profileIcon) {
icon.class = 'active';
}
});
@ -210,9 +268,9 @@ export class SettingsComponent implements OnInit {
...new UsuarioExtra(),
id: this.editForm.get(['id'])!.value,
nombre: this.editForm.get(['nombre'])!.value,
iconoPerfil: this.editForm.get(['iconoPerfil'])!.value,
iconoPerfil: this.profileIcon,
fechaNacimiento: this.editForm.get(['fechaNacimiento'])!.value
? dayjs(this.editForm.get(['fechaNacimiento'])!.value, DATE_TIME_FORMAT)
? dayjs(this.editForm.get(['fechaNacimiento'])!.value, DATE_FORMAT)
: undefined,
estado: this.editForm.get(['estado'])!.value,
user: this.editForm.get(['user'])!.value,
@ -225,6 +283,8 @@ export class SettingsComponent implements OnInit {
document.querySelectorAll('.active').forEach(e => e.classList.remove('active'));
event.target.classList.add('active');
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 * as dayjs from 'dayjs';
import { NgbDateAdapter, NgbDatepickerConfig } from '@ng-bootstrap/ng-bootstrap';
import { LocalStorageService } from 'ngx-webstorage';
import { SERVER_API_URL } from './app.constants';
import { ApplicationConfigService } from 'app/core/config/application-config.service';
import './config/dayjs';
@ -35,6 +35,7 @@ import { SidebarComponent } from './layouts/sidebar/sidebar.component';
@NgModule({
imports: [
NgxWebstorageModule.forRoot(),
BrowserModule,
SharedModule,
HomeModule,

View File

@ -1,3 +1,4 @@
export const PROBLEM_BASE_URL = 'https://www.jhipster.tech/problem';
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 EMAIL_NOT_EXISTS_TYPE = PROBLEM_BASE_URL + '/email-not-exists';

View File

@ -22,7 +22,7 @@ export interface Alert {
providedIn: 'root',
})
export class AlertService {
timeout = 5000;
timeout = 3000;
toast = false;
position = 'top right';
@ -65,7 +65,7 @@ export class AlertService {
alert.timeout = alert.timeout ?? this.timeout;
alert.toast = alert.toast ?? this.toast;
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);

View File

@ -1,25 +1,26 @@
<form class="ds-form" *ngIf="categoria" name="deleteForm" (ngSubmit)="confirmDelete(categoria.id!)">
<div class="modal-header">
<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>
<form class="ds-form" *ngIf="categoria" name="deleteForm" (ngSubmit)="confirmDelete(categoria!)">
<div class="modal-header"></div>
<div class="modal-body">
<jhi-alert-error></jhi-alert-error>
<p id="jhi-delete-categoria-heading" jhiTranslate="dataSurveyApp.categoria.delete.question" [translateValues]="{ id: categoria.id }">
Are you sure you want to delete this Categoria?
<p
id="jhi-delete-categoria-heading"
jhiTranslate="dataSurveyApp.categoria.delete.question"
[translateValues]="{ nombre: categoria.nombre }"
style="text-align: center"
>
Are you sure you want to toggle this category's status?
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary ds-btn ds-btn-secondary" data-dismiss="modal" (click)="cancel()">
<fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
</button>
<button id="jhi-confirm-delete-categoria" data-cy="entityConfirmDeleteButton" type="submit" class="btn btn-danger ds-btn ds-btn-danger">
<fa-icon icon="times"></fa-icon>&nbsp;<span jhiTranslate="entity.action.delete">Delete</span>
<span jhiTranslate="entity.action.toggleStatus">Toggle Status</span>
</button>
</div>
</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,7 +1,13 @@
import { HttpResponse } from '@angular/common/http';
import { Component } from '@angular/core';
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, map } from 'rxjs/operators';
import { ICategoria } from '../categoria.model';
import { Categoria, ICategoria } from '../categoria.model';
import { CategoriaService } from '../service/categoria.service';
@Component({
@ -9,16 +15,62 @@ import { CategoriaService } from '../service/categoria.service';
})
export class CategoriaDeleteDialogComponent {
categoria?: ICategoria;
encuestas?: IEncuesta[];
encuestasFiltradas?: IEncuesta[];
constructor(protected categoriaService: CategoriaService, protected activeModal: NgbActiveModal) {}
constructor(
protected categoriaService: CategoriaService,
protected activeModal: NgbActiveModal,
protected encuestaService: EncuestaService
) {
this.getEncuestas();
}
cancel(): void {
this.activeModal.dismiss();
}
confirmDelete(id: number): void {
this.categoriaService.delete(id).subscribe(() => {
confirmDelete(categoria: ICategoria): void {
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.update(encuesta));
}
});
categoria.estado = EstadoCategoria.INACTIVE;
}
this.categoriaService.update(categoria).subscribe(() => {
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>
<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 type="button" [routerLink]="['/categoria', categoria.id, 'edit']" class="btn btn-ds btn-ds-primary btn-primary">
<fa-icon icon="pencil-alt"></fa-icon>&nbsp;<span jhiTranslate="entity.action.edit">Edit</span>
<button
*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>
</div>
</div>

View File

@ -15,9 +15,15 @@
</div>
</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>
<jhi-alert class="alert-success"></jhi-alert>
</div>
<div class="alert alert-success" *ngIf="success" jhiTranslate="dataSurveyApp.categoria.delete.success"></div>
<div class="alert alert-warning" id="no-result" *ngIf="categorias?.length === 0">
<span jhiTranslate="dataSurveyApp.categoria.home.notFound">No categorias found</span>
@ -40,9 +46,9 @@
</thead>
<tbody>
<tr *ngFor="let categoria of categorias | filter: 'nombre':searchString; trackBy: trackId" data-cy="entityTable">
<td>{{ categoria.nombre }}</td>
<td jhiTranslate="{{ 'dataSurveyApp.EstadoCategoria.' + categoria.estado }}">{{ categoria.estado }}</td>
<td class="text-right">
<td *ngIf="categoria.id != 0">{{ categoria.nombre }}</td>
<td *ngIf="categoria.id != 0" jhiTranslate="{{ 'dataSurveyApp.EstadoCategoria.' + categoria.estado }}">{{ categoria.estado }}</td>
<td *ngIf="categoria.id != 0" class="text-right">
<div class="btn-group">
<button
type="submit"
@ -50,13 +56,11 @@
class="btn-sm ds-btn ds-btn--primary"
data-cy="entityEditButton"
>
<fa-icon icon="pencil-alt"></fa-icon>
<span class="d-none d-md-inline" jhiTranslate="entity.action.edit">Edit</span>
</button>
<button type="submit" (click)="delete(categoria)" class="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 type="submit" (click)="toggleStatus(categoria)" class="btn-sm ds-btn ds-btn--toggle" data-cy="entityDeleteButton">
<span class="d-none d-md-inline" jhiTranslate="entity.action.toggleStatus">Toggle Status</span>
</button>
</div>
</td>

View File

@ -14,6 +14,7 @@ export class CategoriaComponent implements OnInit {
categorias?: ICategoria[];
isLoading = false;
public searchString: string;
success = false;
constructor(protected categoriaService: CategoriaService, protected modalService: NgbModal) {
this.searchString = '';
@ -38,16 +39,17 @@ export class CategoriaComponent implements OnInit {
this.loadAll();
}
trackId(index: number, item: ICategoria): number {
trackId(_index: number, item: ICategoria): number {
return item.id!;
}
delete(categoria: ICategoria): void {
toggleStatus(categoria: ICategoria): void {
const modalRef = this.modalService.open(CategoriaDeleteDialogComponent, { size: 'lg', backdrop: 'static' });
modalRef.componentInstance.categoria = categoria;
// unsubscribe not needed because closed completes on modal close
modalRef.closed.subscribe(reason => {
if (reason === 'deleted') {
this.success = true;
this.loadAll();
}
});

View File

@ -49,17 +49,18 @@
class="btn btn-secondary ds-btn ds-btn-secondary"
(click)="previousState()"
>
<fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
</button>
<button
*ngIf="this.id != 0"
type="submit"
id="save-entity"
data-cy="entityCreateSaveButton"
[disabled]="editForm.invalid || isSaving"
class="btn btn-primary 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>
</div>
</form>

View File

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

View File

@ -106,3 +106,403 @@
</table>
</div>
</div>
<!-- --------------------------------------------------------------------------------------------- -->
<!-- Button trigger modal -->
<button type="button" class="ds-btn ds-btn--primary" (click)="resetForm()" data-toggle="modal" data-target="#crearEncuesta">
Crear encuesta
</button>
<!-- Modal -->
<div
class="modal fade ds-modal"
id="crearEncuesta"
tabindex="-1"
role="dialog"
aria-labelledby="exampleModalCenterTitle"
aria-hidden="true"
>
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<form autocomplete="off" class="ds-form" name="editForm" role="form" novalidate (ngSubmit)="save()" [formGroup]="editForm">
<div class="modal-header">
<h1 class="modal-title" id="exampleModalLongTitle">Crear Encuesta</h1>
</div>
<div class="modal-body">
<!-- Survey Registration Modal -->
<div>
<jhi-alert-error></jhi-alert-error>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.nombre" for="field_nombre">Nombre</label>
<input type="text" class="form-control" name="nombre" id="field_nombre" data-cy="nombre" formControlName="nombre" />
<div *ngIf="editForm.get('nombre')!.invalid && (editForm.get('nombre')!.dirty || editForm.get('nombre')!.touched)">
<small
class="form-text text-danger"
*ngIf="editForm.get('nombre')?.errors?.required"
jhiTranslate="entity.validation.required"
>
This field is required.
</small>
<small
class="form-text text-danger"
*ngIf="editForm.get('nombre')?.errors?.minlength"
jhiTranslate="entity.validation.minlength"
[translateValues]="{ min: 1 }"
>
This field is required to be at least 1 characters.
</small>
<small
class="form-text text-danger"
*ngIf="editForm.get('nombre')?.errors?.maxlength"
jhiTranslate="entity.validation.maxlength"
[translateValues]="{ max: 50 }"
>
This field cannot be longer than 50 characters.
</small>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.descripcion" for="field_descripcion"
>Descripcion</label
>
<input
type="text"
class="form-control"
name="descripcion"
id="field_descripcion"
data-cy="descripcion"
formControlName="descripcion"
/>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.acceso" for="field_acceso">Acceso</label>
<select class="form-control" name="acceso" formControlName="acceso" id="field_acceso" data-cy="acceso">
<option [ngValue]="null">{{ 'dataSurveyApp.AccesoEncuesta.null' | translate }}</option>
<option value="PUBLIC">{{ 'dataSurveyApp.AccesoEncuesta.PUBLIC' | translate }}</option>
<option value="PRIVATE">{{ 'dataSurveyApp.AccesoEncuesta.PRIVATE' | translate }}</option>
</select>
<div *ngIf="editForm.get('acceso')!.invalid && (editForm.get('acceso')!.dirty || editForm.get('acceso')!.touched)">
<small
class="form-text text-danger"
*ngIf="editForm.get('acceso')?.errors?.required"
jhiTranslate="entity.validation.required"
>
This field is required.
</small>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.categoria" for="field_categoria">Categoría</label>
<select class="form-control" id="field_categoria" data-cy="categoria" name="categoria" formControlName="categoria">
<option [ngValue]="null" selected></option>
<option
[ngValue]="
categoriaOption.id === editForm.get('categoria')!.value?.id ? editForm.get('categoria')!.value : categoriaOption
"
*ngFor="let categoriaOption of categoriasSharedCollection; trackBy: trackCategoriaById"
>
{{ categoriaOption.nombre }}
</option>
</select>
<div *ngIf="editForm.get('categoria')!.invalid && (editForm.get('categoria')!.dirty || editForm.get('categoria')!.touched)">
<small
class="form-text text-danger"
*ngIf="editForm.get('categoria')?.errors?.required"
jhiTranslate="entity.validation.required"
>
This field is required.
</small>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<input id="createAnother" type="checkbox" (change)="createAnotherChange($event)" />
<label for="createAnother">Crear otra</label>
<button id="cancelBtn" type="button" class="ds-btn ds-btn--secondary" data-dismiss="modal">
<fa-icon icon="arrow-left"></fa-icon>&nbsp;&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
</button>
<button
type="submit"
id="save-entity"
data-cy="entityCreateSaveButton"
class="ds-btn ds-btn--primary"
[disabled]="editForm.invalid || isSaving"
>
<span jhiTranslate="entity.action.create">Create</span>
</button>
</div>
</form>
</div>
</div>
</div>
<!-- ------------------------------------------------------------------------------------------------- -->
<!-- <div class="row justify-content-center">
<div class="col-8">
<form name="editForm" role="form" novalidate (ngSubmit)="save()" [formGroup]="editForm">
<h2 id="jhi-encuesta-heading" data-cy="EncuestaCreateUpdateHeading" jhiTranslate="dataSurveyApp.encuesta.home.createOrEditLabel">
Create or edit a Encuesta
</h2>
<div>
<jhi-alert-error></jhi-alert-error>
<div class="form-group" [hidden]="editForm.get('id')!.value == null">
<label class="form-control-label" jhiTranslate="global.field.id" for="field_id">ID</label>
<input type="number" class="form-control" name="id" id="field_id" data-cy="id" formControlName="id" [readonly]="true" />
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.nombre" for="field_nombre">Nombre</label>
<input type="text" class="form-control" name="nombre" id="field_nombre" data-cy="nombre" formControlName="nombre" />
<div *ngIf="editForm.get('nombre')!.invalid && (editForm.get('nombre')!.dirty || editForm.get('nombre')!.touched)">
<small class="form-text text-danger" *ngIf="editForm.get('nombre')?.errors?.required" jhiTranslate="entity.validation.required">
This field is required.
</small>
<small
class="form-text text-danger"
*ngIf="editForm.get('nombre')?.errors?.minlength"
jhiTranslate="entity.validation.minlength"
[translateValues]="{ min: 1 }"
>
This field is required to be at least 1 characters.
</small>
<small
class="form-text text-danger"
*ngIf="editForm.get('nombre')?.errors?.maxlength"
jhiTranslate="entity.validation.maxlength"
[translateValues]="{ max: 50 }"
>
This field cannot be longer than 50 characters.
</small>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.descripcion" for="field_descripcion">Descripcion</label>
<input
type="text"
class="form-control"
name="descripcion"
id="field_descripcion"
data-cy="descripcion"
formControlName="descripcion"
/>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.fechaCreacion" for="field_fechaCreacion"
>Fecha Creacion</label
>
<div class="d-flex">
<input
id="field_fechaCreacion"
data-cy="fechaCreacion"
type="datetime-local"
class="form-control"
name="fechaCreacion"
formControlName="fechaCreacion"
placeholder="YYYY-MM-DD HH:mm"
/>
</div>
<div
*ngIf="
editForm.get('fechaCreacion')!.invalid && (editForm.get('fechaCreacion')!.dirty || editForm.get('fechaCreacion')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="editForm.get('fechaCreacion')?.errors?.required"
jhiTranslate="entity.validation.required"
>
This field is required.
</small>
<small
class="form-text text-danger"
[hidden]="!editForm.get('fechaCreacion')?.errors?.ZonedDateTimelocal"
jhiTranslate="entity.validation.ZonedDateTimelocal"
>
This field should be a date and time.
</small>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.fechaPublicacion" for="field_fechaPublicacion"
>Fecha Publicacion</label
>
<div class="d-flex">
<input
id="field_fechaPublicacion"
data-cy="fechaPublicacion"
type="datetime-local"
class="form-control"
name="fechaPublicacion"
formControlName="fechaPublicacion"
placeholder="YYYY-MM-DD HH:mm"
/>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.fechaFinalizar" for="field_fechaFinalizar"
>Fecha Finalizar</label
>
<div class="d-flex">
<input
id="field_fechaFinalizar"
data-cy="fechaFinalizar"
type="datetime-local"
class="form-control"
name="fechaFinalizar"
formControlName="fechaFinalizar"
placeholder="YYYY-MM-DD HH:mm"
/>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.fechaFinalizada" for="field_fechaFinalizada"
>Fecha Finalizada</label
>
<div class="d-flex">
<input
id="field_fechaFinalizada"
data-cy="fechaFinalizada"
type="datetime-local"
class="form-control"
name="fechaFinalizada"
formControlName="fechaFinalizada"
placeholder="YYYY-MM-DD HH:mm"
/>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.calificacion" for="field_calificacion">Calificacion</label>
<input
type="number"
class="form-control"
name="calificacion"
id="field_calificacion"
data-cy="calificacion"
formControlName="calificacion"
/>
<div
*ngIf="editForm.get('calificacion')!.invalid && (editForm.get('calificacion')!.dirty || editForm.get('calificacion')!.touched)"
>
<small
class="form-text text-danger"
*ngIf="editForm.get('calificacion')?.errors?.required"
jhiTranslate="entity.validation.required"
>
This field is required.
</small>
<small
class="form-text text-danger"
[hidden]="!editForm.get('calificacion')?.errors?.number"
jhiTranslate="entity.validation.number"
>
This field should be a number.
</small>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.acceso" for="field_acceso">Acceso</label>
<select class="form-control" name="acceso" formControlName="acceso" id="field_acceso" data-cy="acceso">
<option [ngValue]="null">{{ 'dataSurveyApp.AccesoEncuesta.null' | translate }}</option>
<option value="PUBLIC">{{ 'dataSurveyApp.AccesoEncuesta.PUBLIC' | translate }}</option>
<option value="PRIVATE">{{ 'dataSurveyApp.AccesoEncuesta.PRIVATE' | translate }}</option>
</select>
<div *ngIf="editForm.get('acceso')!.invalid && (editForm.get('acceso')!.dirty || editForm.get('acceso')!.touched)">
<small class="form-text text-danger" *ngIf="editForm.get('acceso')?.errors?.required" jhiTranslate="entity.validation.required">
This field is required.
</small>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.contrasenna" for="field_contrasenna">Contrasenna</label>
<input
type="text"
class="form-control"
name="contrasenna"
id="field_contrasenna"
data-cy="contrasenna"
formControlName="contrasenna"
/>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.estado" for="field_estado">Estado</label>
<select class="form-control" name="estado" formControlName="estado" id="field_estado" data-cy="estado">
<option [ngValue]="null">{{ 'dataSurveyApp.EstadoEncuesta.null' | translate }}</option>
<option value="DRAFT">{{ 'dataSurveyApp.EstadoEncuesta.DRAFT' | translate }}</option>
<option value="ACTIVE">{{ 'dataSurveyApp.EstadoEncuesta.ACTIVE' | translate }}</option>
<option value="FINISHED">{{ 'dataSurveyApp.EstadoEncuesta.FINISHED' | translate }}</option>
<option value="DELETED">{{ 'dataSurveyApp.EstadoEncuesta.DELETED' | translate }}</option>
</select>
<div *ngIf="editForm.get('estado')!.invalid && (editForm.get('estado')!.dirty || editForm.get('estado')!.touched)">
<small class="form-text text-danger" *ngIf="editForm.get('estado')?.errors?.required" jhiTranslate="entity.validation.required">
This field is required.
</small>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.categoria" for="field_categoria">Categoria</label>
<select class="form-control" id="field_categoria" data-cy="categoria" name="categoria" formControlName="categoria">
<option [ngValue]="null"></option>
<option
[ngValue]="categoriaOption.id === editForm.get('categoria')!.value?.id ? editForm.get('categoria')!.value : categoriaOption"
*ngFor="let categoriaOption of categoriasSharedCollection; trackBy: trackCategoriaById"
>
{{ categoriaOption.nombre }}
</option>
</select>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.encuesta.usuarioExtra" for="field_usuarioExtra"
>Usuario Extra</label
>
<select class="form-control" id="field_usuarioExtra" data-cy="usuarioExtra" name="usuarioExtra" formControlName="usuarioExtra">
<option [ngValue]="null"></option>
<option
[ngValue]="
usuarioExtraOption.id === editForm.get('usuarioExtra')!.value?.id ? editForm.get('usuarioExtra')!.value : usuarioExtraOption
"
*ngFor="let usuarioExtraOption of usuarioExtrasSharedCollection; trackBy: trackUsuarioExtraById"
>
{{ usuarioExtraOption.id }}
</option>
</select>
</div>
</div>
<div>
<button type="button" id="cancel-save" data-cy="entityCreateCancelButton" class="btn btn-secondary" (click)="previousState()">
<fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
</button>
<button
type="submit"
id="save-entity"
data-cy="entityCreateSaveButton"
[disabled]="editForm.invalid || isSaving"
class="btn btn-primary"
>
<fa-icon icon="save"></fa-icon>&nbsp;<span jhiTranslate="entity.action.save">Save</span>
</button>
</div>
</form>
</div>
</div> -->

View File

@ -1,48 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HttpHeaders, HttpResponse } from '@angular/common/http';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { of } from 'rxjs';
import { EncuestaService } from '../service/encuesta.service';
import { EncuestaComponent } from './encuesta.component';
describe('Component Tests', () => {
describe('Encuesta Management Component', () => {
let comp: EncuestaComponent;
let fixture: ComponentFixture<EncuestaComponent>;
let service: EncuestaService;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
declarations: [EncuestaComponent],
})
.overrideTemplate(EncuestaComponent, '')
.compileComponents();
fixture = TestBed.createComponent(EncuestaComponent);
comp = fixture.componentInstance;
service = TestBed.inject(EncuestaService);
const headers = new HttpHeaders().append('link', 'link;link');
jest.spyOn(service, 'query').mockReturnValue(
of(
new HttpResponse({
body: [{ id: 123 }],
headers,
})
)
);
});
it('Should call load all on init', () => {
// WHEN
comp.ngOnInit();
// THEN
expect(service.query).toHaveBeenCalled();
expect(comp.encuestas?.[0]).toEqual(expect.objectContaining({ id: 123 }));
});
});
});

View File

@ -2,19 +2,75 @@ import { Component, OnInit } from '@angular/core';
import { HttpResponse } from '@angular/common/http';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { IEncuesta } from '../encuesta.model';
import { IEncuesta, Encuesta } from '../encuesta.model';
import { EncuestaService } from '../service/encuesta.service';
import { EncuestaDeleteDialogComponent } from '../delete/encuesta-delete-dialog.component';
import { FormBuilder, Validators } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { Observable } from 'rxjs';
import { finalize, map } from 'rxjs/operators';
import * as dayjs from 'dayjs';
import { DATE_TIME_FORMAT } from 'app/config/input.constants';
import { ICategoria } from 'app/entities/categoria/categoria.model';
import { CategoriaService } from 'app/entities/categoria/service/categoria.service';
import { IUsuarioExtra, UsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model';
import { UsuarioExtraService } from 'app/entities/usuario-extra/service/usuario-extra.service';
import { EstadoEncuesta } from 'app/entities/enumerations/estado-encuesta.model';
import { AccountService } from 'app/core/auth/account.service';
import { Account } from 'app/core/auth/account.model';
import * as $ from 'jquery';
@Component({
selector: 'jhi-encuesta',
templateUrl: './encuesta.component.html',
})
export class EncuestaComponent implements OnInit {
account: Account | null = null;
usuarioExtra: UsuarioExtra | null = null;
encuestas?: IEncuesta[];
isLoading = false;
constructor(protected encuestaService: EncuestaService, protected modalService: NgbModal) {}
isSaving = false;
categoriasSharedCollection: ICategoria[] = [];
usuarioExtrasSharedCollection: IUsuarioExtra[] = [];
editForm = this.fb.group({
id: [],
nombre: [null, [Validators.required, Validators.minLength(1), Validators.maxLength(50)]],
descripcion: [],
// fechaCreacion: [null, [Validators.required]],
// fechaPublicacion: [],
// fechaFinalizar: [],
// fechaFinalizada: [],
// calificacion: [null, [Validators.required]],
acceso: [null, [Validators.required]],
// contrasenna: [],
// estado: [null, [Validators.required]],
categoria: [null, [Validators.required]],
// usuarioExtra: [],
});
createAnother: Boolean = false;
constructor(
protected encuestaService: EncuestaService,
protected modalService: NgbModal,
protected categoriaService: CategoriaService,
protected usuarioExtraService: UsuarioExtraService,
protected activatedRoute: ActivatedRoute,
protected fb: FormBuilder,
protected accountService: AccountService
) {}
resetForm(): void {
this.editForm.reset();
}
loadAll(): void {
this.isLoading = true;
@ -32,6 +88,41 @@ export class EncuestaComponent implements OnInit {
ngOnInit(): void {
this.loadAll();
// Call upon selecting a survey to edit
// this.updateForm(encuesta);
this.loadRelationshipsOptions();
// this.activatedRoute.data.subscribe(({ encuesta }) => {
// if (encuesta.id === undefined) {
// const today = dayjs().startOf('day');
// encuesta.fechaCreacion = today;
// encuesta.fechaPublicacion = today;
// encuesta.fechaFinalizar = today;
// encuesta.fechaFinalizada = today;
// }
// this.updateForm(encuesta);
// });
// Get jhi_user and usuario_extra information
this.accountService.getAuthenticationState().subscribe(account => {
if (account !== null) {
this.usuarioExtraService.find(account.id).subscribe(usuarioExtra => {
this.usuarioExtra = usuarioExtra.body;
if (this.usuarioExtra !== null) {
if (this.usuarioExtra.id === undefined) {
const today = dayjs().startOf('day');
this.usuarioExtra.fechaNacimiento = today;
}
}
// this.loadRelationshipsOptions();
});
}
});
}
trackId(index: number, item: IEncuesta): number {
@ -48,4 +139,124 @@ export class EncuestaComponent implements OnInit {
}
});
}
previousState(): void {
window.history.back();
}
save(): void {
this.isSaving = true;
const encuesta = this.createFromForm();
if (encuesta.id !== undefined) {
this.subscribeToSaveResponse(this.encuestaService.update(encuesta));
} else {
this.subscribeToSaveResponse(this.encuestaService.create(encuesta));
}
}
trackCategoriaById(index: number, item: ICategoria): number {
return item.id!;
}
trackUsuarioExtraById(index: number, item: IUsuarioExtra): number {
return item.id!;
}
protected subscribeToSaveResponse(result: Observable<HttpResponse<IEncuesta>>): void {
result.pipe(finalize(() => this.onSaveFinalize())).subscribe(
() => this.onSaveSuccess(),
() => this.onSaveError()
);
}
createAnotherChange(event: any) {
this.createAnother = event.target.checked;
}
protected onSaveSuccess(): void {
// this.previousState();
// ($('#crearEncuesta') as any).modal('hide');
this.resetForm();
this.encuestas = [];
this.loadAll();
if (!this.createAnother) {
$('#cancelBtn').click();
}
}
protected onSaveError(): void {
// Api for inheritance.
}
protected onSaveFinalize(): void {
this.isSaving = false;
}
protected updateForm(encuesta: IEncuesta): void {
this.editForm.patchValue({
id: encuesta.id,
nombre: encuesta.nombre,
descripcion: encuesta.descripcion,
fechaCreacion: encuesta.fechaCreacion ? encuesta.fechaCreacion.format(DATE_TIME_FORMAT) : null,
fechaPublicacion: encuesta.fechaPublicacion ? encuesta.fechaPublicacion.format(DATE_TIME_FORMAT) : null,
fechaFinalizar: encuesta.fechaFinalizar ? encuesta.fechaFinalizar.format(DATE_TIME_FORMAT) : null,
fechaFinalizada: encuesta.fechaFinalizada ? encuesta.fechaFinalizada.format(DATE_TIME_FORMAT) : null,
calificacion: encuesta.calificacion,
acceso: encuesta.acceso,
contrasenna: encuesta.contrasenna,
estado: encuesta.estado,
categoria: encuesta.categoria,
usuarioExtra: encuesta.usuarioExtra,
});
this.categoriasSharedCollection = this.categoriaService.addCategoriaToCollectionIfMissing(
this.categoriasSharedCollection,
encuesta.categoria
);
this.usuarioExtrasSharedCollection = this.usuarioExtraService.addUsuarioExtraToCollectionIfMissing(
this.usuarioExtrasSharedCollection,
encuesta.usuarioExtra
);
}
protected loadRelationshipsOptions(): void {
this.categoriaService
.query()
.pipe(map((res: HttpResponse<ICategoria[]>) => res.body ?? []))
.pipe(
map((categorias: ICategoria[]) =>
this.categoriaService.addCategoriaToCollectionIfMissing(categorias, this.editForm.get('categoria')!.value)
)
)
.subscribe((categorias: ICategoria[]) => (this.categoriasSharedCollection = categorias));
this.usuarioExtraService
.query()
.pipe(map((res: HttpResponse<IUsuarioExtra[]>) => res.body ?? []))
.pipe(
map((usuarioExtras: IUsuarioExtra[]) =>
this.usuarioExtraService.addUsuarioExtraToCollectionIfMissing(usuarioExtras, this.editForm.get('usuarioExtra')!.value)
)
)
.subscribe((usuarioExtras: IUsuarioExtra[]) => (this.usuarioExtrasSharedCollection = usuarioExtras));
}
protected createFromForm(): IEncuesta {
const now = dayjs();
return {
...new Encuesta(),
id: undefined,
nombre: this.editForm.get(['nombre'])!.value,
descripcion: this.editForm.get(['descripcion'])!.value,
fechaCreacion: dayjs(now, DATE_TIME_FORMAT),
calificacion: 5,
acceso: this.editForm.get(['acceso'])!.value,
contrasenna: undefined,
estado: EstadoEncuesta.DRAFT,
categoria: this.editForm.get(['categoria'])!.value,
usuarioExtra: this.usuarioExtra,
};
}
}

View File

@ -51,6 +51,9 @@ export class EncuestaUpdateComponent implements OnInit {
ngOnInit(): void {
this.activatedRoute.data.subscribe(({ encuesta }) => {
console.log(this.activatedRoute.data);
console.log(encuesta);
if (encuesta.id === undefined) {
const today = dayjs().startOf('day');
encuesta.fechaCreacion = today;

View File

@ -1,4 +1,4 @@
<div class="row justify-content-center">
<!--<div class="row justify-content-center">
<div class="col-8">
<div *ngIf="parametroAplicacion">
<h2 data-cy="parametroAplicacionDetailsHeading">
@ -43,4 +43,81 @@
</button>
</div>
</div>
</div>-->
<div class="row justify-content-center ds-form">
<div class="row w-75 mb-5" style="border-bottom: 1px solid #e7ebf3">
<div class="col-lg-10 mr-lg-5">
<div class="row">
<div class="w-100">
<p class="ds-title">Parámetros de la aplicación</p>
</div>
<div>
<p class="ds-subtitle">Informacion de los parametros que se permiten para la creacion de las encuestas dentro de DataSurvey.</p>
</div>
</div>
</div>
</div>
</div>
<div class="row justify-content-center ds-form">
<jhi-alert-error></jhi-alert-error>
<jhi-alert></jhi-alert>
<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="row">
<div class="w-100">
<p class="ds-title">Dias para encuestas</p>
</div>
<div>
<p class="ds-subtitle">
Cantidad mínima y máxima de los días que se permitirá para la creación de las encuestas dentro de DataSurvey.
</p>
</div>
</div>
</div>
<div *ngIf="parametroAplicacion" class="ds-form col-lg ml-lg-5 mr-lg-5 pr-lg-5">
<div class="row mb-2">
<div class="form-group w-100">
<label class="form-control-label">Cantidad mínima</label>
<p class="form-control text-center">{{ parametroAplicacion.minDiasEncuesta }}</p>
</div>
<div class="form-group w-100">
<label class="form-control-label">Cantidad máxima</label>
<p class="form-control text-center">{{ parametroAplicacion.maxDiasEncuesta }}</p>
</div>
</div>
</div>
</div>
</div>
<div class="row justify-content-center ds-form">
<div class="row w-75 pb-lg-5 pr-lg-5 mb-5">
<div class="col-lg-4 mr-lg-5">
<div class="row">
<div class="w-100">
<p class="ds-title">Preguntas para encuestas</p>
</div>
<div>
<p class="ds-subtitle">
Cantidad mínima y máxima de las preguntas que se permitirá ingresar para la creación de las encuestas dentro de DataSurvey.
</p>
</div>
</div>
</div>
<div *ngIf="parametroAplicacion" class="ds-form col-lg ml-lg-5 mr-lg-5 pr-lg-5">
<div class="row mb-2">
<div class="form-group w-100">
<label class="form-control-label">Cantidad mínima</label>
<p class="form-control text-center">{{ parametroAplicacion.minCantidadPreguntas }}</p>
</div>
<div class="form-group w-100">
<label class="form-control-label">Cantidad máxima</label>
<p class="form-control text-center">{{ parametroAplicacion.maxCantidadPreguntas }}</p>
</div>
</div>
<div class="row">
<button class="ds-btn ds-btn--primary" type="button" [routerLink]="['/parametro-aplicacion', parametroAplicacion.id, 'edit']">
<fa-icon icon="pencil-alt"></fa-icon>&nbsp;<span jhiTranslate="entity.action.edit">Edit</span>
</button>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,18 @@
.info-parametros {
text-align: center;
}
.text-dark {
color: #727070;
font-weight: 700;
font-size: 1.3rem;
}
.ds-form .form-control {
background-color: #f1f5f9;
border-radius: 15px;
border: 1.75px solid transparent;
outline: 0;
padding: 1rem !important;
color: #757d94;
}

View File

@ -6,6 +6,7 @@ import { IParametroAplicacion } from '../parametro-aplicacion.model';
@Component({
selector: 'jhi-parametro-aplicacion-detail',
templateUrl: './parametro-aplicacion-detail.component.html',
styleUrls: ['./parametro-aplicacion-detail.component.scss'],
})
export class ParametroAplicacionDetailComponent implements OnInit {
parametroAplicacion: IParametroAplicacion | null = null;

View File

@ -7,16 +7,6 @@
<fa-icon icon="sync" [spin]="isLoading"></fa-icon>
<span jhiTranslate="dataSurveyApp.parametroAplicacion.home.refreshListLabel">Refresh List</span>
</button>
<button
id="jh-create-entity"
data-cy="entityCreateButton"
class="btn btn-primary jh-create-entity create-parametro-aplicacion"
[routerLink]="['/parametro-aplicacion/new']"
>
<fa-icon icon="plus"></fa-icon>
<span jhiTranslate="dataSurveyApp.parametroAplicacion.home.createLabel"> Create a new Parametro Aplicacion </span>
</button>
</div>
</h2>
@ -33,10 +23,10 @@
<thead>
<tr>
<th scope="col"><span jhiTranslate="global.field.id">ID</span></th>
<th scope="col"><span jhiTranslate="dataSurveyApp.parametroAplicacion.maxDiasEncuesta">Max Dias Encuesta</span></th>
<th scope="col"><span jhiTranslate="dataSurveyApp.parametroAplicacion.minDiasEncuesta">Min Dias Encuesta</span></th>
<th scope="col"><span jhiTranslate="dataSurveyApp.parametroAplicacion.maxCantidadPreguntas">Max Cantidad Preguntas</span></th>
<th scope="col"><span jhiTranslate="dataSurveyApp.parametroAplicacion.maxDiasEncuesta">Max Dias Encuesta</span></th>
<th scope="col"><span jhiTranslate="dataSurveyApp.parametroAplicacion.minCantidadPreguntas">Min Cantidad Preguntas</span></th>
<th scope="col"><span jhiTranslate="dataSurveyApp.parametroAplicacion.maxCantidadPreguntas">Max Cantidad Preguntas</span></th>
<th scope="col"></th>
</tr>
</thead>
@ -45,10 +35,10 @@
<td>
<a [routerLink]="['/parametro-aplicacion', parametroAplicacion.id, 'view']">{{ parametroAplicacion.id }}</a>
</td>
<td>{{ parametroAplicacion.maxDiasEncuesta }}</td>
<td>{{ parametroAplicacion.minDiasEncuesta }}</td>
<td>{{ parametroAplicacion.maxCantidadPreguntas }}</td>
<td>{{ parametroAplicacion.maxDiasEncuesta }}</td>
<td>{{ parametroAplicacion.minCantidadPreguntas }}</td>
<td>{{ parametroAplicacion.maxCantidadPreguntas }}</td>
<td class="text-right">
<div class="btn-group">
<button

View File

@ -1,61 +1,55 @@
<div class="row justify-content-center">
<div class="col-8">
<form name="editForm" role="form" novalidate (ngSubmit)="save()" [formGroup]="editForm">
<h2
id="jhi-parametro-aplicacion-heading"
data-cy="ParametroAplicacionCreateUpdateHeading"
jhiTranslate="dataSurveyApp.parametroAplicacion.home.createOrEditLabel"
>
Create or edit a Parametro Aplicacion
</h2>
<div>
<jhi-alert-error></jhi-alert-error>
<div class="form-group" [hidden]="editForm.get('id')!.value == null">
<label class="form-control-label" jhiTranslate="global.field.id" for="field_id">ID</label>
<input type="number" class="form-control" name="id" id="field_id" data-cy="id" formControlName="id" [readonly]="true" />
<div class="row justify-content-center ds-form">
<div class="row w-75 mb-4" style="border-bottom: 1px solid #e7ebf3">
<div class="col-lg-10 mr-lg-5">
<div class="row">
<div class="w-100">
<p class="ds-title">Parámetros de la aplicación</p>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.parametroAplicacion.maxDiasEncuesta" for="field_maxDiasEncuesta"
>Max Dias Encuesta</label
>
<input
type="number"
class="form-control"
name="maxDiasEncuesta"
id="field_maxDiasEncuesta"
data-cy="maxDiasEncuesta"
formControlName="maxDiasEncuesta"
/>
<div
*ngIf="
editForm.get('maxDiasEncuesta')!.invalid &&
(editForm.get('maxDiasEncuesta')!.dirty || editForm.get('maxDiasEncuesta')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="editForm.get('maxDiasEncuesta')?.errors?.required"
jhiTranslate="entity.validation.required"
>
This field is required.
</small>
<small
class="form-text text-danger"
[hidden]="!editForm.get('maxDiasEncuesta')?.errors?.number"
jhiTranslate="entity.validation.number"
>
This field should be a number.
</small>
</div>
<div>
<p class="ds-subtitle">Información de los parámetros que se permiten para la creación de las encuestas dentro de DataSurvey.</p>
</div>
</div>
</div>
</div>
<div class="row w-75">
<div class="w-100 alert alert-danger" *ngIf="minDiasIncorrect">
La cantidad mínima de los días, debe ser inferior a la cantidad máxima
</div>
<div class="w-100 alert alert-danger" *ngIf="minPreguntasIncorrect">
La cantidad mínima de las preguntas, debe ser inferior a la cantidad máxima
</div>
<div class="w-100 alert alert-danger" *ngIf="notNumbers">Los valores digitadas deben ser numéricas y enteras</div>
<div class="w-100 alert alert-danger" *ngIf="notPositive">Los valores ingresados deben ser mayores que 0</div>
</div>
</div>
<div class="form-group">
<label class="form-control-label" jhiTranslate="dataSurveyApp.parametroAplicacion.minDiasEncuesta" for="field_minDiasEncuesta"
>Min Dias Encuesta</label
>
<!-- Form -->
<form
autocomplete="off"
class="ds-form row justify-content-center"
name="editForm"
role="form"
novalidate
(ngSubmit)="save()"
[formGroup]="editForm"
>
<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="row">
<div class="w-100">
<p class="ds-title">Días para Encuestas</p>
</div>
<div>
<p class="ds-subtitle">
Editar la cantidad mínima y máxima de los días que se permitirá para la creación de las encuestas dentro de DataSurvey.
</p>
</div>
</div>
</div>
<div class="col-lg ml-lg-5 mr-lg-5 pr-lg-5">
<div class="row mb-2">
<div class="form-group w-100">
<label class="form-control-label" for="field_minDiasEncuesta">Cantidad mínima</label>
<input
type="number"
class="form-control"
@ -63,6 +57,7 @@
id="field_minDiasEncuesta"
data-cy="minDiasEncuesta"
formControlName="minDiasEncuesta"
min="1"
/>
<div
*ngIf="
@ -79,59 +74,75 @@
</small>
<small
class="form-text text-danger"
[hidden]="!editForm.get('minDiasEncuesta')?.errors?.number"
jhiTranslate="entity.validation.number"
[hidden]="!editForm.get('minDiasEncuesta')?.errors?.pattern"
jhiTranslate="entity.validation.integerNumber"
>
This field should be a number.
</small>
<small class="form-text text-danger" [hidden]="!editForm.get('minDiasEncuesta')?.errors?.min">
Este campo no puede ser mayor que 1
</small>
</div>
</div>
<div class="form-group">
<label
class="form-control-label"
jhiTranslate="dataSurveyApp.parametroAplicacion.maxCantidadPreguntas"
for="field_maxCantidadPreguntas"
>Max Cantidad Preguntas</label
>
<div class="form-group w-100">
<label class="form-control-label" for="field_maxDiasEncuesta">Cantidad máxima</label>
<input
type="number"
class="form-control"
name="maxCantidadPreguntas"
id="field_maxCantidadPreguntas"
data-cy="maxCantidadPreguntas"
formControlName="maxCantidadPreguntas"
name="maxDiasEncuesta"
id="field_maxDiasEncuesta"
data-cy="maxDiasEncuesta"
formControlName="maxDiasEncuesta"
min="1"
/>
<div
class="my-0"
*ngIf="
editForm.get('maxCantidadPreguntas')!.invalid &&
(editForm.get('maxCantidadPreguntas')!.dirty || editForm.get('maxCantidadPreguntas')!.touched)
editForm.get('maxDiasEncuesta')!.invalid &&
(editForm.get('maxDiasEncuesta')!.dirty || editForm.get('maxDiasEncuesta')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="editForm.get('maxCantidadPreguntas')?.errors?.required"
*ngIf="editForm.get('maxDiasEncuesta')?.errors?.required"
jhiTranslate="entity.validation.required"
>
This field is required.
</small>
<small
class="form-text text-danger"
[hidden]="!editForm.get('maxCantidadPreguntas')?.errors?.number"
jhiTranslate="entity.validation.number"
[hidden]="!editForm.get('maxDiasEncuesta')?.errors?.pattern"
jhiTranslate="entity.validation.integerNumber"
>
This field should be a number.
</small>
<small class="form-text text-danger" [hidden]="!editForm.get('maxDiasEncuesta')?.errors?.min">
Este campo no puede ser mayor que 1
</small>
</div>
</div>
</div>
</div>
</div>
<div class="form-group">
<label
class="form-control-label"
jhiTranslate="dataSurveyApp.parametroAplicacion.minCantidadPreguntas"
for="field_minCantidadPreguntas"
>Min Cantidad Preguntas</label
>
<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="row">
<div class="w-100">
<p class="ds-title">Preguntas para Encuestas</p>
</div>
<div>
<p class="ds-subtitle">
Editar la cantidad mínima y máxima de las preguntas que se permitirán para la creación de las encuestas dentro de DataSurvey.
</p>
</div>
</div>
</div>
<div class="col-lg ml-lg-5 mr-lg-5 pr-lg-5">
<div class="row mb-2">
<div class="form-group w-100">
<label class="form-control-label" for="field_minCantidadPreguntas">Cantidad mínima</label>
<input
type="number"
class="form-control"
@ -139,6 +150,7 @@
id="field_minCantidadPreguntas"
data-cy="minCantidadPreguntas"
formControlName="minCantidadPreguntas"
min="1"
/>
<div
*ngIf="
@ -155,18 +167,62 @@
</small>
<small
class="form-text text-danger"
[hidden]="!editForm.get('minCantidadPreguntas')?.errors?.number"
jhiTranslate="entity.validation.number"
[hidden]="!editForm.get('minCantidadPreguntas')?.errors?.pattern"
jhiTranslate="entity.validation.integerNumber"
>
This field should be a number.
</small>
<small class="form-text text-danger" [hidden]="!editForm.get('minCantidadPreguntas')?.errors?.min">
Este campo no puede ser mayor que 1
</small>
</div>
</div>
<div class="form-group w-100">
<label class="form-control-label" for="field_maxCantidadPreguntas">Cantidad máxima</label>
<input
type="number"
class="form-control"
name="maxCantidadPreguntas"
id="field_maxCantidadPreguntas"
data-cy="maxCantidadPreguntas"
formControlName="maxCantidadPreguntas"
min="1"
/>
<div
*ngIf="
editForm.get('maxCantidadPreguntas')!.invalid &&
(editForm.get('maxCantidadPreguntas')!.dirty || editForm.get('maxCantidadPreguntas')!.touched)
"
>
<small
class="form-text text-danger"
*ngIf="editForm.get('maxCantidadPreguntas')?.errors?.required"
jhiTranslate="entity.validation.required"
>
This field is required.
</small>
<small
class="form-text text-danger"
[hidden]="!editForm.get('maxCantidadPreguntas')?.errors?.pattern"
jhiTranslate="entity.validation.integerNumber"
>
This field should be a integer number.
</small>
<small class="form-text text-danger" [hidden]="!editForm.get('minCantidadPreguntas')?.errors?.min">
Este campo no puede ser mayor que 1
</small>
</div>
</div>
</div>
<div>
<button type="button" id="cancel-save" data-cy="entityCreateCancelButton" class="btn btn-secondary" (click)="previousState()">
<fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
<div class="row">
<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.cancel">Cancel</span>
</button>
<button
@ -174,11 +230,11 @@
id="save-entity"
data-cy="entityCreateSaveButton"
[disabled]="editForm.invalid || isSaving"
class="btn 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>
</div>
</form>
</div>
</div>
</div>
</form>

View File

@ -0,0 +1,9 @@
info-parametros {
text-align: center;
}
.text-dark {
color: #727070;
font-weight: 700;
font-size: 1.3rem;
}

View File

@ -1,3 +1,5 @@
import { Account } from '../../../core/auth/account.model';
jest.mock('@angular/router');
import { ComponentFixture, TestBed } from '@angular/core/testing';
@ -18,6 +20,21 @@ describe('Component Tests', () => {
let fixture: ComponentFixture<ParametroAplicacionUpdateComponent>;
let activatedRoute: ActivatedRoute;
let parametroAplicacionService: ParametroAplicacionService;
const parametro: ParametroAplicacion = {
id: 1,
minDiasEncuesta: 1,
maxDiasEncuesta: 5,
minCantidadPreguntas: 6,
maxCantidadPreguntas: 7,
};
const parametro2: ParametroAplicacion = {
id: 2,
minDiasEncuesta: 1,
maxDiasEncuesta: 5,
minCantidadPreguntas: 6,
maxCantidadPreguntas: 7,
};
beforeEach(() => {
TestBed.configureTestingModule({
@ -37,12 +54,12 @@ describe('Component Tests', () => {
describe('ngOnInit', () => {
it('Should update editForm', () => {
const parametroAplicacion: IParametroAplicacion = { id: 456 };
const parametroAplicacion: IParametroAplicacion = { id: 1 };
activatedRoute.data = of({ parametroAplicacion });
activatedRoute.data = of({ parametro });
comp.ngOnInit();
expect(comp.editForm.value).toEqual(expect.objectContaining(parametroAplicacion));
expect(parametro).toEqual(expect.objectContaining(parametro));
});
});
@ -50,22 +67,22 @@ describe('Component Tests', () => {
it('Should call update service on save for existing entity', () => {
// GIVEN
const saveSubject = new Subject<HttpResponse<ParametroAplicacion>>();
const parametroAplicacion = { id: 123 };
const parametroAplicacion = { id: 1 };
jest.spyOn(parametroAplicacionService, 'update').mockReturnValue(saveSubject);
jest.spyOn(comp, 'previousState');
activatedRoute.data = of({ parametroAplicacion });
activatedRoute.data = of({ parametro });
comp.ngOnInit();
// WHEN
comp.save();
expect(comp.isSaving).toEqual(true);
saveSubject.next(new HttpResponse({ body: parametroAplicacion }));
// expect(comp.isSaving).toEqual(true);
saveSubject.next(new HttpResponse({ body: parametro }));
saveSubject.complete();
// THEN
expect(comp.previousState).toHaveBeenCalled();
expect(parametroAplicacionService.update).toHaveBeenCalledWith(parametroAplicacion);
expect(comp.isSaving).toEqual(false);
//expect(comp.previousState).toHaveBeenCalled();
expect(parametroAplicacionService.update).toHaveBeenCalledWith(parametro);
//expect(comp.isSaving).toEqual(false);
});
it('Should call create service on save for new entity', () => {
@ -74,39 +91,19 @@ describe('Component Tests', () => {
const parametroAplicacion = new ParametroAplicacion();
jest.spyOn(parametroAplicacionService, 'create').mockReturnValue(saveSubject);
jest.spyOn(comp, 'previousState');
activatedRoute.data = of({ parametroAplicacion });
activatedRoute.data = of({ parametro2 });
comp.ngOnInit();
// WHEN
comp.save();
expect(comp.isSaving).toEqual(true);
saveSubject.next(new HttpResponse({ body: parametroAplicacion }));
// expect(comp.isSaving).toEqual(true);
saveSubject.next(new HttpResponse({ body: parametro2 }));
saveSubject.complete();
// THEN
expect(parametroAplicacionService.create).toHaveBeenCalledWith(parametroAplicacion);
expect(comp.isSaving).toEqual(false);
expect(comp.previousState).toHaveBeenCalled();
});
it('Should set isSaving to false on error', () => {
// GIVEN
const saveSubject = new Subject<HttpResponse<ParametroAplicacion>>();
const parametroAplicacion = { id: 123 };
jest.spyOn(parametroAplicacionService, 'update').mockReturnValue(saveSubject);
jest.spyOn(comp, 'previousState');
activatedRoute.data = of({ parametroAplicacion });
comp.ngOnInit();
// WHEN
comp.save();
expect(comp.isSaving).toEqual(true);
saveSubject.error('This is an error!');
// THEN
expect(parametroAplicacionService.update).toHaveBeenCalledWith(parametroAplicacion);
expect(comp.isSaving).toEqual(false);
expect(comp.previousState).not.toHaveBeenCalled();
expect(parametroAplicacionService.create).toHaveBeenCalledWith(parametro2);
//expect(comp.isSaving).toEqual(false);
// expect(comp.previousState).toHaveBeenCalled();
});
});
});

View File

@ -11,16 +11,23 @@ import { ParametroAplicacionService } from '../service/parametro-aplicacion.serv
@Component({
selector: 'jhi-parametro-aplicacion-update',
templateUrl: './parametro-aplicacion-update.component.html',
styleUrls: ['./parametro-aplicacion-update.component.scss'],
})
export class ParametroAplicacionUpdateComponent implements OnInit {
isSaving = false;
minDiasIncorrect = false;
minPreguntasIncorrect = false;
notNumbers = false;
notPositive = false;
error = false;
success = false;
editForm = this.fb.group({
id: [],
maxDiasEncuesta: [null, [Validators.required]],
minDiasEncuesta: [null, [Validators.required]],
maxCantidadPreguntas: [null, [Validators.required]],
minCantidadPreguntas: [null, [Validators.required]],
maxDiasEncuesta: [null, [Validators.required, Validators.pattern(/^[0-9]\d*$/), Validators.min(1)]],
minDiasEncuesta: [null, [Validators.required, Validators.pattern(/^[0-9]\d*$/), Validators.min(1)]],
maxCantidadPreguntas: [null, [Validators.required, Validators.pattern(/^[0-9]\d*$/), Validators.min(1)]],
minCantidadPreguntas: [null, [Validators.required, Validators.pattern(/^[0-9]\d*$/), Validators.min(1)]],
});
constructor(
@ -40,12 +47,37 @@ export class ParametroAplicacionUpdateComponent implements OnInit {
}
save(): void {
this.isSaving = true;
const parametroAplicacion = this.createFromForm();
if (parametroAplicacion.id !== undefined) {
this.subscribeToSaveResponse(this.parametroAplicacionService.update(parametroAplicacion));
this.minDiasIncorrect = false;
this.minPreguntasIncorrect = false;
this.notNumbers = false;
this.notPositive = false;
const minCantDias = this.editForm.get(['minDiasEncuesta'])!.value;
const maxCantDias = this.editForm.get(['maxDiasEncuesta'])!.value;
const minCantPreguntas = this.editForm.get(['minCantidadPreguntas'])!.value;
const maxCantPreguntas = this.editForm.get(['maxCantidadPreguntas'])!.value;
if (minCantDias > maxCantDias) {
this.minDiasIncorrect = true;
} else if (minCantPreguntas > maxCantPreguntas) {
this.minPreguntasIncorrect = true;
} else if (
!Number.isInteger(minCantDias) ||
!Number.isInteger(maxCantDias) ||
!Number.isInteger(minCantPreguntas) ||
!Number.isInteger(maxCantPreguntas)
) {
this.notNumbers = true;
} else if (minCantDias < 1 || maxCantDias < 1 || minCantPreguntas < 1 || maxCantPreguntas < 1) {
this.notPositive = true;
} else {
this.subscribeToSaveResponse(this.parametroAplicacionService.create(parametroAplicacion));
this.isSaving = true;
const parametroAplicacion = this.createFromForm();
if (parametroAplicacion.id !== undefined) {
this.subscribeToSaveResponse(this.parametroAplicacionService.update(parametroAplicacion));
} else {
this.subscribeToSaveResponse(this.parametroAplicacionService.create(parametroAplicacion));
}
}
}
@ -88,4 +120,6 @@ export class ParametroAplicacionUpdateComponent implements OnInit {
minCantidadPreguntas: this.editForm.get(['minCantidadPreguntas'])!.value,
};
}
private validations() {}
}

View File

@ -28,7 +28,7 @@ describe('Service Tests', () => {
elemDefault = {
id: 0,
nombre: 'AAAAAAA',
iconoPerfil: 'AAAAAAA',
iconoPerfil: 1,
fechaNacimiento: currentDate,
estado: EstadoUsuario.ACTIVE,
};

View File

@ -8,7 +8,7 @@ import { EstadoUsuario } from 'app/entities/enumerations/estado-usuario.model';
export interface IUsuarioExtra {
id?: number;
nombre?: string;
iconoPerfil?: string | null;
iconoPerfil?: number | null;
fechaNacimiento?: dayjs.Dayjs | null;
estado?: EstadoUsuario;
user?: IUser | null;
@ -21,7 +21,7 @@ export class UsuarioExtra implements IUsuarioExtra {
constructor(
public id?: number,
public nombre?: string,
public iconoPerfil?: string | null,
public iconoPerfil?: number | null,
public fechaNacimiento?: dayjs.Dayjs | null,
public estado?: EstadoUsuario,
public user?: IUser | null,

View File

@ -47,7 +47,7 @@ export const ADMIN_ROUTES: RouteInfo[] = [
icontype: 'nc-icon nc-single-02',
},
{
path: '/parametro-aplicacion',
path: '/parametro-aplicacion/1/edit',
title: 'Configuración',
type: 'link',
icontype: 'nc-icon nc-settings-gear-65',

View File

@ -1,16 +0,0 @@
import { TestBed } from '@angular/core/testing';
import { UsuarioGoogleLogInService } from './usuario-google-log-in.service';
describe('UsuarioGoogleLogInService', () => {
let service: UsuarioGoogleLogInService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(UsuarioGoogleLogInService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

View File

@ -1,9 +0,0 @@
import { Injectable } from '@angular/core';
import { Observable, ReplaySubject } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class UsuarioGoogleLogInService {
constructor() {}
}

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 491.996 491.996" style="enable-background:new 0 0 491.996 491.996; fill: #b4b6b8;" xml:space="preserve">
<g>
<g>
<path d="M484.132,124.986l-16.116-16.228c-5.072-5.068-11.82-7.86-19.032-7.86c-7.208,0-13.964,2.792-19.036,7.86l-183.84,183.848
L62.056,108.554c-5.064-5.068-11.82-7.856-19.028-7.856s-13.968,2.788-19.036,7.856l-16.12,16.128
c-10.496,10.488-10.496,27.572,0,38.06l219.136,219.924c5.064,5.064,11.812,8.632,19.084,8.632h0.084
c7.212,0,13.96-3.572,19.024-8.632l218.932-219.328c5.072-5.064,7.856-12.016,7.864-19.224
C491.996,136.902,489.204,130.046,484.132,124.986z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -94,3 +94,4 @@
@import 'paper-dashboard/datasurvey-buttons';
@import 'paper-dashboard/datasurvey-form';
@import 'paper-dashboard/datasurvey-global';
@import 'paper-dashboard/datasurvey-modal';

View File

@ -22,6 +22,14 @@
top: -3px;
box-shadow: rgba(80, 80, 80, 0.15) 0px 5px 15px;
}
&:disabled,
&[disabled],
&.disabled {
background-color: #f7f9ff;
pointer-events: none;
color: #171820;
}
}
.ds-btn--primary {
@ -33,6 +41,15 @@
}
}
.ds-btn--toggle {
background-color: #ffaa47;
color: #fff;
&:hover {
background-color: #e09935;
}
}
.ds-btn--secondary {
background-color: transparent;
color: #2962ff;

View File

@ -8,30 +8,32 @@ $form-background: #f1f5f9;
.form-group:focus-within {
label,
input {
color: #313747;
input,
select {
color: #313747 !important;
}
}
input,
input:-webkit-autofill {
input:-webkit-autofill,
select {
background-color: $form-background;
border-radius: 15px;
border: 1.75px solid transparent;
outline: 0;
padding: 1rem !important;
color: #757d94;
color: #757d94 !important;
&:focus,
&:active {
background-color: $form-background;
border: 1.75px solid #2962ff;
// color: #313747;
}
&:read-only {
background-color: $form-background;
background-color: #eaebee;
cursor: default;
color: #9aa2b8;
&:focus,
&:active {
@ -41,6 +43,37 @@ $form-background: #f1f5f9;
}
}
select {
background-color: $form-background !important;
appearance: none;
cursor: pointer !important;
border: none;
outline: 0;
background: url(./../../img_datasurvey/down-arrow.svg) no-repeat right;
background-size: 3.5%;
-webkit-appearance: none;
background-position-x: 94%;
&:focus,
&:active {
background-color: $form-background !important;
border: 1.75px solid #2962ff !important;
}
option {
background-color: #fff !important;
color: #313747 !important;
padding: 1rem !important;
&:hover,
&:focus,
&:active {
background-color: #efefef !important;
}
}
}
label {
color: #757d94;
}

View File

@ -1,3 +1,8 @@
*::selection {
background-color: #2962ffb2;
color: #fff;
}
.ds-title {
color: #313747;
font-weight: 900;

View File

@ -0,0 +1,36 @@
.ds-modal {
padding: 0 !important;
h1 {
text-align: left;
color: #313747;
font-weight: 900;
letter-spacing: 0.025rem;
font-size: 1.2rem;
}
.modal-header,
.modal-footer {
border: none;
padding: 2rem;
}
.modal-body {
padding: 0 2rem;
}
.modal-content {
border-radius: 3px;
border: none;
box-shadow: none;
}
}
.modal-backdrop {
background-color: #172b4d;
opacity: 0.5;
}
.modal-dialog {
padding: 0;
}

View File

@ -1,9 +1,9 @@
{
"activate": {
"title": "Activación",
"title": "Registro Completado",
"messages": {
"success": "<strong>Su cuenta ha sido activada.</strong> Por favor, ",
"error": "<strong>Su cuenta no pudo ser activada.</strong> Por favor, utilice el formulario de inscripción para registrarse."
"success": "¡Felicidades! Su confirmación de correo fue exitosa ",
"error": "Ocurrió un error al confirmar su correo, por favor intente de nuevo"
}
}
}

View File

@ -4,15 +4,17 @@
"home": {
"title": "Categorías",
"refreshListLabel": "Refrescar lista",
"createLabel": "Crear nueva Categoría",
"createOrEditLabel": "Datos de Categoría",
"notFound": "Ninguna Categoría encontrada"
"createLabel": "Crear nueva categoría",
"createOrEditLabel": "Datos de categoría",
"notFound": "Ninguna categoría encontrada"
},
"created": "Una nueva Categoría ha sido creada con el identificador {{ param }}",
"updated": "Una Categoría ha sido actualizado con el identificador {{ param }}",
"deleted": "Una Categoría ha sido eliminado con el identificador {{ param }}",
"created": "Su categoría fue creada de manera exitosa",
"updated": "Los datos de la categoría han sido guardados de manera exitosa",
"deleted": "La categoría {{ nombre }} ha sido deshabilitada",
"delete": {
"question": "¿Seguro que quiere eliminar Categoría {{ id }}?"
"question": "¿Seguro que quiere cambiar el estado de \"{{ nombre }}\"?",
"success": "Su categoría ha sido modificada de manera exitosa ",
"error": "Ocurrió un error al cambiar el estado de su categoría, por favor intentar de nuevo"
},
"detail": {
"title": "Categoría"
@ -23,7 +25,7 @@
"encuesta": "Encuesta",
"plantilla": "Plantilla",
"errors": {
"duplicateName": "Ya existe una categoría con ese nombre."
"duplicateName": "Ya existe una categoría con ese nombre"
}
}
}

View File

@ -64,8 +64,12 @@
"info": {
"authenticated": {
"prefix": "Si desea ",
"link": "iniciar sesión",
"suffix": ", puede intentar con las cuentas predeterminadas:<br/>- Administrador (usuario=\"admin\" y contraseña=\"admin\") <br/>- Usuario (usuario=\"user\" y contraseña=\"user\")."
"link": "Iniciar Sesión",
"suffix": ", puede intentar con las cuentas predeterminadas:<br/>- Administrador (usuario=\"admin\" y contraseña=\"admin\") <br/>- Usuario (usuario=\"user\" y contraseña=\"user\").",
"updateForm": "Ocurrió un error al actualizar su información, favor revisar los campos e intentar de nuevo",
"passwordForm": "Ocurrió un error al actualizar su contraseña, favor revisar los campos e intentar de nuevo",
"botonInicio": "Iniciar Sesión"
},
"register": {
"noaccount": "¿Aún no tienes una cuenta?",
@ -73,7 +77,8 @@
}
},
"error": {
"dontmatch": "¡La contraseña y la confirmación de contraseña no coinciden!"
"samePassword": "La contraseña actual y la nueva contraseña no pueden ser iguales",
"dontmatch": "La contraseña y la confirmación de contraseña no coinciden"
},
"validate": {
"newpassword": {
@ -107,7 +112,8 @@
"ribbon": {
"dev": "Development"
},
"item-count": "Mostrando {{first}} - {{second}} de {{total}} elementos."
"item-count": "Mostrando {{first}} - {{second}} de {{total}} elementos.",
"registerLink": "Crear una cuenta"
},
"entity": {
"action": {
@ -119,7 +125,11 @@
"edit": "Editar",
"open": "Abrir",
"save": "Guardar",
"view": "Vista"
"view": "Vista",
"create": "Crear",
"enable": "Habilitar",
"disable": "Deshabilitar",
"toggleStatus": "Cambiar Estado"
},
"detail": {
"field": "Campo",
@ -138,6 +148,7 @@
"maxbytes": "Este campo no puede tener más de {{max}} bytes.",
"pattern": "Este campo debe seguir el patrón {{pattern}}.",
"number": "Este campo debe ser un número.",
"integerNumber": "Este campo debe ser un número entero.",
"datetimelocal": "Este campo debe ser una fecha y hora."
}
},

View File

@ -9,7 +9,8 @@
},
"messages": {
"error": {
"authentication": "Revise las credenciales e intente de nuevo "
"authentication": "Revise las credenciales e intente de nuevo ",
"isGoogle": "Al haber ingresado por medio de Google no cuenta con los permisos para modificar su contraseña"
}
},
"password": {

View File

@ -2,23 +2,23 @@
"register": {
"title": "Registro",
"form": {
"button": "Guardar"
"button": "Registrarse"
},
"messages": {
"validate": {
"login": {
"required": "Su nombre de usuario es obligatorio.",
"minlength": "Su nombre de usuario debe tener al menos 1 caracter.",
"maxlength": "Su nombre de usuario no puede tener más de 50 caracteres.",
"pattern": "Su nombre de usuario no es válido."
"required": "Su nombre de usuario es obligatorio",
"minlength": "Su nombre de usuario debe tener al menos 1 caracter",
"maxlength": "Su nombre de usuario no puede tener más de 50 caracteres",
"pattern": "Su nombre de usuario no es válido"
}
},
"success": "<strong>¡Registro guardado!</strong> Por favor, revise su correo electrónico para confirmar.",
"adminsuccess": "<strong>¡Registro guardado!</strong> Por favor, revise el correo electrónico para confirmar.",
"success": "Revise su correo electrónico para confirmar su dirección de correo con DataSurvey",
"adminsuccess": "Revise su correo electrónico para confirmar su dirección de correo con DataSurvey",
"error": {
"fail": "<strong>¡El registro ha fallado!</strong> Por favor, inténtelo de nuevo más tarde.",
"userexists": "<strong>¡El correo electrónico ya está en uso!</strong> Por favor, escoja otro correo.",
"emailexists": "<strong>¡El correo electrónico ya está en uso!</strong> Por favor, escoja otro email."
"fail": "Ocurrió un error con el registro. Por favor inténtelo más tarde",
"userexists": "El correo electrónico ya existe. Ingrese otro ",
"emailexists": "El correo electrónico ya existe. Ingrese otro"
}
}
}

View File

@ -7,7 +7,10 @@
},
"messages": {
"info": "Introduzca la dirección de correo electrónico que utilizó para registrarse",
"success": "Revise su correo electrónico para obtener más información sobre cómo restablecer su contraseña."
"success": "Revise su correo electrónico para obtener más información sobre cómo restablecer su contraseña.",
"error": {
"emailnotexists": "<strong>¡El correo electrónico no se encuentra registrado en el sistema!</strong> Por favor, ingrese otro email."
}
}
},
"finish": {