diff --git a/src/main/java/org/datasurvey/repository/CategoriaRepository.java b/src/main/java/org/datasurvey/repository/CategoriaRepository.java index 66368c1..6a4897c 100644 --- a/src/main/java/org/datasurvey/repository/CategoriaRepository.java +++ b/src/main/java/org/datasurvey/repository/CategoriaRepository.java @@ -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; /** diff --git a/src/main/java/org/datasurvey/web/rest/AccountResource.java b/src/main/java/org/datasurvey/web/rest/AccountResource.java index 6b830e9..361be3a 100644 --- a/src/main/java/org/datasurvey/web/rest/AccountResource.java +++ b/src/main/java/org/datasurvey/web/rest/AccountResource.java @@ -168,7 +168,11 @@ public class AccountResource { public void requestPasswordReset(@RequestBody String mail) { Optional user = userService.requestPasswordReset(mail); if (user.isPresent()) { - mailService.sendPasswordResetMail(user.get()); + if (user.get().getFirstName() == null || (!user.get().getFirstName().equals("IsGoogle"))) { + mailService.sendPasswordResetMail(user.get()); + } else { + throw new UserIsGoogleException(); + } } else { // Pretend the request has been successful to prevent checking which emails really exist // but log that an invalid attempt has been made diff --git a/src/main/java/org/datasurvey/web/rest/errors/ErrorConstants.java b/src/main/java/org/datasurvey/web/rest/errors/ErrorConstants.java index 109466d..6ae058c 100644 --- a/src/main/java/org/datasurvey/web/rest/errors/ErrorConstants.java +++ b/src/main/java/org/datasurvey/web/rest/errors/ErrorConstants.java @@ -13,6 +13,7 @@ public final class ErrorConstants { 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"); + public static final URI USER_IS_GOOGLE_TYOE = URI.create(PROBLEM_BASE_URL + "/user-is-google"); private ErrorConstants() {} } diff --git a/src/main/java/org/datasurvey/web/rest/errors/UserIsGoogleException.java b/src/main/java/org/datasurvey/web/rest/errors/UserIsGoogleException.java new file mode 100644 index 0000000..3ab193b --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/errors/UserIsGoogleException.java @@ -0,0 +1,10 @@ +package org.datasurvey.web.rest.errors; + +public class UserIsGoogleException extends BadRequestAlertException { + + private static final long serialVersionUID = 1L; + + public UserIsGoogleException() { + super(ErrorConstants.USER_IS_GOOGLE_TYOE, "User Is Google", "userManagement", "userisgoogle"); + } +} diff --git a/src/main/resources/i18n/messages_es.properties b/src/main/resources/i18n/messages_es.properties index 32233bb..77121fd 100644 --- a/src/main/resources/i18n/messages_es.properties +++ b/src/main/resources/i18n/messages_es.properties @@ -5,25 +5,25 @@ error.status=Estado: error.message=Mensaje: # Activation email -email.activation.title=Activación de DataSurvey +email.activation.title=Confirmación de correo con DataSurvey email.activation.greeting=¡Hola, {0}! -email.activation.text1=Su cuenta en DataSurvey ha sido creada. Por favor, haga clic en el siguiente enlace para activarla: +email.activation.text1=¡Nos alegra que sea parte de DataSurvey! Como último paso debe confirmar su dirección de correo haciendo clic en el siguiente enlace: email.activation.text2=Saludos, -email.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.title=Restablecer contraseña de DataSurvey email.reset.greeting=¡Hola, {0}! -email.reset.text1=Se ha solicitado el reinicio de la contraseña para su cuenta en DataSurvey. Por favor, haga clic en el siguiente enlace para reiniciarla: +email.reset.text1=Se ha solicitado una modificación de contraseña para su cuenta en DataSurvey. Por favor haga clic en el siguiente enlace para restablecerla: email.reset.text2=Saludos, # Password Restored Mail -email.restored.title=Se restaleció su contraseña en DataSurvey +email.restored.title=Modificación de contraseña exitosa email.restored.greeting=¡Hola, {0}! -email.restored.text1=Se ha restablecido correctamente su contraseña en DataSurvey. +email.restored.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 diff --git a/src/main/resources/templates/mail/activationEmail.html b/src/main/resources/templates/mail/activationEmail.html index 4daaa73..673edc0 100644 --- a/src/main/resources/templates/mail/activationEmail.html +++ b/src/main/resources/templates/mail/activationEmail.html @@ -264,7 +264,7 @@ th:with="url=(@{|${baseUrl}/account/activate?key=${user.activationKey}|})" th:href="${url}" class="btn btn-primary" - >Activar cuentaConfirmar correo electrónico

@@ -293,7 +293,7 @@

Acerca de

-

DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted.

+

DataSurvey es su compañero más cercano para poder recolectar información valiosa para usted

@@ -304,7 +304,7 @@

Información de contacto

diff --git a/src/main/resources/templates/mail/creationEmail.html b/src/main/resources/templates/mail/creationEmail.html index 2bc90eb..68b86f5 100644 --- a/src/main/resources/templates/mail/creationEmail.html +++ b/src/main/resources/templates/mail/creationEmail.html @@ -304,7 +304,7 @@

Información de contacto

diff --git a/src/main/resources/templates/mail/passwordResetEmail.html b/src/main/resources/templates/mail/passwordResetEmail.html index b235f94..1742a3f 100644 --- a/src/main/resources/templates/mail/passwordResetEmail.html +++ b/src/main/resources/templates/mail/passwordResetEmail.html @@ -304,7 +304,7 @@

Información de contacto

diff --git a/src/main/resources/templates/mail/passwordRestoredEmail.html b/src/main/resources/templates/mail/passwordRestoredEmail.html index e1c4082..6dcebd1 100644 --- a/src/main/resources/templates/mail/passwordRestoredEmail.html +++ b/src/main/resources/templates/mail/passwordRestoredEmail.html @@ -267,7 +267,7 @@ >If you did not make this change, please notify the following email immediately - datasurvey@gmail.com + datasurveyapp@gmail.com

@@ -306,7 +306,7 @@

Información de contacto

diff --git a/src/main/webapp/app/account/activate/activate.component.html b/src/main/webapp/app/account/activate/activate.component.html index f518965..bc17317 100644 --- a/src/main/webapp/app/account/activate/activate.component.html +++ b/src/main/webapp/app/account/activate/activate.component.html @@ -15,13 +15,12 @@ style="color: #727070; font-weight: 700; font-size: 1.3rem" jhiTranslate="activate.title" > - Activación de Cuenta + Registro Completado
- Your user account has been activated. - sign in +
-
- Your user could not be activated. Please use the registration form to sign up. -
+
Your password has been reset. - sign in
- Email no exists! Please choose another one. + Email no exists! +
+
+ No cuenta con el permiso de restablecer su contraseña al haber activado su cuenta por medio de Google
- + Your email is invalid. - - - Your email is required to be at least 5 characters. - - - - Your email cannot be longer than 100 characters. - - - Se requiere un correo electrónico válido. -
@@ -115,7 +99,7 @@

- ¿Aún no se encuentra registrado/a? + ¿Aún no es parte de DataSurvey? Crea una cuenta

diff --git a/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts b/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts index 2d63177..09768a8 100644 --- a/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts +++ b/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts @@ -3,7 +3,7 @@ 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'; +import { EMAIL_NOT_EXISTS_TYPE, USER_IS_GOOGLE_TYPE } from '../../../config/error.constants'; @Component({ selector: 'jhi-password-reset-init', @@ -13,6 +13,7 @@ export class PasswordResetInitComponent implements AfterViewInit { @ViewChild('email', { static: false }) email?: ElementRef; errorEmailNotExists = false; + errorUserIsGoogle = false; error = false; success = false; resetRequestForm = this.fb.group({ @@ -29,6 +30,7 @@ export class PasswordResetInitComponent implements AfterViewInit { requestReset(): void { this.errorEmailNotExists = false; + this.errorUserIsGoogle = false; this.passwordResetInitService.save(this.resetRequestForm.get(['email'])!.value).subscribe( () => (this.success = true), response => this.processError(response) @@ -42,6 +44,8 @@ export class PasswordResetInitComponent implements AfterViewInit { processError(response: HttpErrorResponse): void { if (response.status === 400 && response.error.type === EMAIL_NOT_EXISTS_TYPE) { this.errorEmailNotExists = true; + } else if (response.status === 400 && response.error.type === USER_IS_GOOGLE_TYPE) { + this.errorUserIsGoogle = true; } else { this.error = true; } diff --git a/src/main/webapp/app/account/register/register.component.html b/src/main/webapp/app/account/register/register.component.html index b37f4c0..a3dd1af 100644 --- a/src/main/webapp/app/account/register/register.component.html +++ b/src/main/webapp/app/account/register/register.component.html @@ -8,13 +8,21 @@
-
+

REGISTRARSE

-

Ingrese sus datos para registrarse.

+

Ingrese sus datos para registrarse

+
+

+ ¡Gracias por registrarse en DataSurvey! +

+
+ +
+
Registration saved! Please check your email for confirmation.
diff --git a/src/main/webapp/app/account/register/register.component.spec.ts b/src/main/webapp/app/account/register/register.component.spec.ts index d040495..b9c8f9b 100644 --- a/src/main/webapp/app/account/register/register.component.spec.ts +++ b/src/main/webapp/app/account/register/register.component.spec.ts @@ -63,6 +63,7 @@ describe('Component Tests', () => { login: '', langKey: 'es', name: '', + firstName: 'normalUser', profileIcon: 1, isAdmin: 0, isGoogle: 0, diff --git a/src/main/webapp/app/account/register/register.component.ts b/src/main/webapp/app/account/register/register.component.ts index ddcc966..a1727ff 100644 --- a/src/main/webapp/app/account/register/register.component.ts +++ b/src/main/webapp/app/account/register/register.component.ts @@ -84,6 +84,7 @@ export class RegisterComponent implements AfterViewInit { const login = this.registerForm.get(['email'])!.value; const email = this.registerForm.get(['email'])!.value; const name = this.registerForm.get(['name'])!.value; + const firstName = 'normalUser'; this.registerService .save({ @@ -92,6 +93,7 @@ export class RegisterComponent implements AfterViewInit { password, langKey: this.translateService.currentLang, name, + firstName, profileIcon: this.profileIcon, isAdmin: 0, isGoogle: 0, diff --git a/src/main/webapp/app/account/register/register.model.ts b/src/main/webapp/app/account/register/register.model.ts index 18a4688..ff15f58 100644 --- a/src/main/webapp/app/account/register/register.model.ts +++ b/src/main/webapp/app/account/register/register.model.ts @@ -7,6 +7,7 @@ export class Registration { public name: string, public profileIcon: number, public isAdmin: number, - public isGoogle: number + public isGoogle: number, + public firstName: string ) {} } diff --git a/src/main/webapp/app/account/settings/settings.component.html b/src/main/webapp/app/account/settings/settings.component.html index 61968bb..738b1c0 100644 --- a/src/main/webapp/app/account/settings/settings.component.html +++ b/src/main/webapp/app/account/settings/settings.component.html @@ -175,7 +175,7 @@

Perfil

-

Información general de su usuario, el correo electrónico es su identificador en DataSurvey.

+

Información general de su usuario, el correo electrónico es su identificador en DataSurvey

@@ -246,7 +246,7 @@
- +
@@ -284,7 +284,7 @@

- 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

@@ -305,19 +305,35 @@
- diff --git a/src/main/webapp/app/entities/categoria/list/categoria.component.html b/src/main/webapp/app/entities/categoria/list/categoria.component.html index 7933f24..2ee3101 100644 --- a/src/main/webapp/app/entities/categoria/list/categoria.component.html +++ b/src/main/webapp/app/entities/categoria/list/categoria.component.html @@ -15,9 +15,15 @@
- + + +
+ +
+ +
No categorias found @@ -40,9 +46,9 @@ - {{ categoria.nombre }} - {{ categoria.estado }} - + {{ categoria.nombre }} + {{ categoria.estado }} +
-
diff --git a/src/main/webapp/app/entities/categoria/list/categoria.component.ts b/src/main/webapp/app/entities/categoria/list/categoria.component.ts index d0a9206..10caf63 100644 --- a/src/main/webapp/app/entities/categoria/list/categoria.component.ts +++ b/src/main/webapp/app/entities/categoria/list/categoria.component.ts @@ -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(); } }); diff --git a/src/main/webapp/app/entities/categoria/update/categoria-update.component.html b/src/main/webapp/app/entities/categoria/update/categoria-update.component.html index 289ccb3..827ff29 100644 --- a/src/main/webapp/app/entities/categoria/update/categoria-update.component.html +++ b/src/main/webapp/app/entities/categoria/update/categoria-update.component.html @@ -49,17 +49,18 @@ class="btn btn-secondary ds-btn ds-btn-secondary" (click)="previousState()" > -  Cancel +  Cancel
diff --git a/src/main/webapp/app/entities/categoria/update/categoria-update.component.ts b/src/main/webapp/app/entities/categoria/update/categoria-update.component.ts index 29f8252..a4a5782 100644 --- a/src/main/webapp/app/entities/categoria/update/categoria-update.component.ts +++ b/src/main/webapp/app/entities/categoria/update/categoria-update.component.ts @@ -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, diff --git a/src/main/webapp/app/entities/encuesta/encuesta.module.ts b/src/main/webapp/app/entities/encuesta/encuesta.module.ts index c78f7dc..6cd231e 100644 --- a/src/main/webapp/app/entities/encuesta/encuesta.module.ts +++ b/src/main/webapp/app/entities/encuesta/encuesta.module.ts @@ -5,9 +5,10 @@ import { EncuestaDetailComponent } from './detail/encuesta-detail.component'; import { EncuestaUpdateComponent } from './update/encuesta-update.component'; import { EncuestaDeleteDialogComponent } from './delete/encuesta-delete-dialog.component'; import { EncuestaRoutingModule } from './route/encuesta-routing.module'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; @NgModule({ - imports: [SharedModule, EncuestaRoutingModule], + imports: [SharedModule, EncuestaRoutingModule, FontAwesomeModule], declarations: [EncuestaComponent, EncuestaDetailComponent, EncuestaUpdateComponent, EncuestaDeleteDialogComponent], entryComponents: [EncuestaDeleteDialogComponent], }) diff --git a/src/main/webapp/app/entities/encuesta/list/encuesta.component.html b/src/main/webapp/app/entities/encuesta/list/encuesta.component.html index 388fc7d..f0545aa 100644 --- a/src/main/webapp/app/entities/encuesta/list/encuesta.component.html +++ b/src/main/webapp/app/entities/encuesta/list/encuesta.component.html @@ -1,22 +1,29 @@

- Encuestas +
+
+ Encuestas +

Cree encuestas y publiquelas mundialmente.

+
-
- +
+ - + +

@@ -28,7 +35,177 @@ No encuestas found
-
+ +
+ +
+
    +
    +
  • + +
  • +
    +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
    +
    +
  • + +
  • +
    +
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+   {{ encuesta.nombre | titlecase }} +
+
+   {{ encuesta.nombre | titlecase }} +
+
+   {{ + encuesta.fechaCreacion | formatShortDatetime | titlecase + }} +
+
+ {{ encuesta.descripcion | titlecase }} +
+
+ {{ encuesta.categoria?.nombre | lowercase }} +
+
+ +
+
+ + +
+
+
+ + - - -
@@ -105,20 +112,29 @@ > This field is required. - - This field should be a number. + This field is required. + --> + + + Este campo debe ser mayor o igual a 1 - - Este campo no puede ser mayor que 1 + + + Este campo debe ser menor o igual a 14 @@ -130,12 +146,10 @@
-

Preguntas para Encuestas

+

Cantidad de preguntas

-

- 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. -

+

Configurar la cantidad mínima y máxima de preguntas por encuesta

@@ -160,20 +174,21 @@ > This field is required. - - This field should be a number. + + + Este campo debe ser mayor o igual a 1 - - Este campo no puede ser mayor que 1 + + + Este campo debe ser menor o igual a 40 @@ -196,20 +211,21 @@ > This field is required. - - This field should be a integer number. + + + Este campo debe ser mayor o igual a 1 - - Este campo no puede ser mayor que 1 + + + Este campo debe ser menor o igual a 40 diff --git a/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.ts b/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.ts index 0e9c33d..be79f0d 100644 --- a/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.ts +++ b/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { HttpResponse } from '@angular/common/http'; import { FormBuilder, Validators } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; +import { Router, ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; import { finalize } from 'rxjs/operators'; @@ -24,16 +24,17 @@ export class ParametroAplicacionUpdateComponent implements OnInit { editForm = this.fb.group({ id: [], - 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)]], + maxDiasEncuesta: [null, [Validators.required, Validators.pattern(/^[0-9]\d*$/), Validators.min(1), Validators.max(14)]], + minDiasEncuesta: [null, [Validators.required, Validators.pattern(/^[0-9]\d*$/), Validators.min(1), Validators.max(14)]], + maxCantidadPreguntas: [null, [Validators.required, Validators.pattern(/^[0-9]\d*$/), Validators.min(1), Validators.max(40)]], + minCantidadPreguntas: [null, [Validators.required, Validators.pattern(/^[0-9]\d*$/), Validators.min(1), Validators.max(40)]], }); constructor( protected parametroAplicacionService: ParametroAplicacionService, protected activatedRoute: ActivatedRoute, - protected fb: FormBuilder + protected fb: FormBuilder, + private router: Router ) {} ngOnInit(): void { @@ -89,9 +90,14 @@ export class ParametroAplicacionUpdateComponent implements OnInit { } protected onSaveSuccess(): void { - this.previousState(); + (this.success = true), this.windowReload(); } + windowReload() { + this.router.navigate(['parametro-aplicacion/1/edit']).then(() => { + window.location.reload(); + }); + } protected onSaveError(): void { // Api for inheritance. } diff --git a/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.spec.ts b/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.spec.ts index 2382221..fc2543e 100644 --- a/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.spec.ts +++ b/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.spec.ts @@ -63,6 +63,7 @@ describe('Component Tests', () => { login: '', langKey: 'es', name: '', + firstName: 'userNormal', profileIcon: 1, isAdmin: 1, isGoogle: 0, diff --git a/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.ts b/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.ts index aba080d..4f61529 100644 --- a/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.ts +++ b/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.ts @@ -82,7 +82,7 @@ export class UsuarioExtraUpdateComponent { const login = this.registerForm.get(['email'])!.value; const email = this.registerForm.get(['email'])!.value; const name = this.registerForm.get(['name'])!.value; - + const firstName = 'userNormal'; this.registerService .save({ login, @@ -90,6 +90,7 @@ export class UsuarioExtraUpdateComponent { password, langKey: this.translateService.currentLang, name, + firstName, profileIcon: this.profileIcon, isAdmin: 1, isGoogle: 0, diff --git a/src/main/webapp/app/layouts/main/main.component.scss b/src/main/webapp/app/layouts/main/main.component.scss index 98938a5..ebfe953 100644 --- a/src/main/webapp/app/layouts/main/main.component.scss +++ b/src/main/webapp/app/layouts/main/main.component.scss @@ -2,3 +2,8 @@ .off-canvas-sidebar:after { background: #0f172a; } + +.main-panel { + height: 100vh !important; + overflow-y: auto; +} diff --git a/src/main/webapp/app/layouts/sidebar/sidebar.component.ts b/src/main/webapp/app/layouts/sidebar/sidebar.component.ts index 75fc8f2..93e4ddb 100644 --- a/src/main/webapp/app/layouts/sidebar/sidebar.component.ts +++ b/src/main/webapp/app/layouts/sidebar/sidebar.component.ts @@ -61,6 +61,8 @@ export class SidebarComponent { if (account !== null) { this.usuarioExtraService.find(account.id).subscribe(usuarioExtra => { this.usuarioExtra = usuarioExtra.body; + this.usuarioExtra!.nombre = + usuarioExtra.body!.nombre!.trim().split(' ')[0] + ' ' + usuarioExtra.body!.nombre!.trim().split(' ')[1]; }); } }); diff --git a/src/main/webapp/app/login/login.component.ts b/src/main/webapp/app/login/login.component.ts index 1ae75e2..b0a4685 100644 --- a/src/main/webapp/app/login/login.component.ts +++ b/src/main/webapp/app/login/login.component.ts @@ -142,6 +142,7 @@ export class LoginComponent implements OnInit, AfterViewInit { password: this.user.id, langKey: this.translateService.currentLang, name: this.user.name, + firstName: 'IsGoogle', profileIcon: this.randomProfilePic(), isAdmin: 0, isGoogle: 1, diff --git a/src/main/webapp/app/shared/date/format-short-datetime.pipe.ts b/src/main/webapp/app/shared/date/format-short-datetime.pipe.ts new file mode 100644 index 0000000..f68a8eb --- /dev/null +++ b/src/main/webapp/app/shared/date/format-short-datetime.pipe.ts @@ -0,0 +1,12 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +import * as dayjs from 'dayjs'; + +@Pipe({ + name: 'formatShortDatetime', +}) +export class FormatShortDatetimePipe implements PipeTransform { + transform(day: dayjs.Dayjs | null | undefined): string { + return day ? day.format('dddd, MMMM D, YYYY') : ''; + } +} diff --git a/src/main/webapp/app/shared/shared.module.ts b/src/main/webapp/app/shared/shared.module.ts index a433735..a306705 100644 --- a/src/main/webapp/app/shared/shared.module.ts +++ b/src/main/webapp/app/shared/shared.module.ts @@ -9,6 +9,7 @@ import { HasAnyAuthorityDirective } from './auth/has-any-authority.directive'; import { DurationPipe } from './date/duration.pipe'; import { FormatMediumDatetimePipe } from './date/format-medium-datetime.pipe'; import { FormatMediumDatePipe } from './date/format-medium-date.pipe'; +import { FormatShortDatetimePipe } from './date/format-short-datetime.pipe'; import { SortByDirective } from './sort/sort-by.directive'; import { SortDirective } from './sort/sort.directive'; import { ItemCountComponent } from './pagination/item-count.component'; @@ -25,6 +26,7 @@ import { FilterPipe } from './pipes/filter'; DurationPipe, FormatMediumDatetimePipe, FormatMediumDatePipe, + FormatShortDatetimePipe, SortByDirective, SortDirective, ItemCountComponent, @@ -40,6 +42,7 @@ import { FilterPipe } from './pipes/filter'; DurationPipe, FormatMediumDatetimePipe, FormatMediumDatePipe, + FormatShortDatetimePipe, SortByDirective, SortDirective, ItemCountComponent, diff --git a/src/main/webapp/content/scss/paper-dashboard.scss b/src/main/webapp/content/scss/paper-dashboard.scss index 406620a..3eab78d 100644 --- a/src/main/webapp/content/scss/paper-dashboard.scss +++ b/src/main/webapp/content/scss/paper-dashboard.scss @@ -95,3 +95,6 @@ @import 'paper-dashboard/datasurvey-form'; @import 'paper-dashboard/datasurvey-global'; @import 'paper-dashboard/datasurvey-modal'; +@import 'paper-dashboard/datasurvey-list'; +@import 'paper-dashboard/datasurvey-table'; +@import 'paper-dashboard/datasurvey-contextmenu'; diff --git a/src/main/webapp/content/scss/paper-dashboard/_datasurvey-buttons.scss b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-buttons.scss index efae4e5..ccb1547 100644 --- a/src/main/webapp/content/scss/paper-dashboard/_datasurvey-buttons.scss +++ b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-buttons.scss @@ -41,6 +41,15 @@ } } +.ds-btn--toggle { + background-color: #ffaa47; + color: #fff; + + &:hover { + background-color: #e09935; + } +} + .ds-btn--secondary { background-color: transparent; color: #2962ff; diff --git a/src/main/webapp/content/scss/paper-dashboard/_datasurvey-contextmenu.scss b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-contextmenu.scss new file mode 100644 index 0000000..241512c --- /dev/null +++ b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-contextmenu.scss @@ -0,0 +1,70 @@ +.ds-contextmenu { + position: absolute; + background-color: #fff; + border-radius: 3px; + z-index: 100; + box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px; + max-height: 0%; + overflow: hidden; + + /* Set our transitions up. */ + -webkit-transition: max-height 0.8s; + -moz-transition: max-height 0.8s; + transition: max-height 0.8s; + + ul { + padding: 0; + margin: 0; + + li { + list-style: none; + padding: 0.2rem 0; + text-align: left; + width: 100%; + + button { + border: none; + outline: 0; + background-color: transparent; + width: 100%; + text-align: left; + padding: 0.4rem 8rem 0.4rem 3rem; + color: #313747; + position: relative; + + &:hover { + background-color: #eeeeee; + } + + .contextmenu__icon { + font-size: 1rem; + color: #808080; + margin-right: 1rem; + position: absolute; + left: 0.8rem; + bottom: 0.25rem; + } + } + } + } + + .ds-contextmenu__divider { + padding: 0.25rem 0; + } + + .ds-contextmenu__divider--separator-top { + border-bottom: 1px solid #dadce0; + } + + .ds-contextmenu__divider--separator-bottom { + border-bottom: 1px solid #dadce0; + } + + &--open { + display: block; + } + + &--closed { + display: none; + } +} diff --git a/src/main/webapp/content/scss/paper-dashboard/_datasurvey-form.scss b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-form.scss index bbfb5d4..5ffb44f 100644 --- a/src/main/webapp/content/scss/paper-dashboard/_datasurvey-form.scss +++ b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-form.scss @@ -51,7 +51,7 @@ $form-background: #f1f5f9; outline: 0; background: url(./../../img_datasurvey/down-arrow.svg) no-repeat right; - background-size: 3.5%; + background-size: 1rem; -webkit-appearance: none; background-position-x: 94%; diff --git a/src/main/webapp/content/scss/paper-dashboard/_datasurvey-global.scss b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-global.scss index 4fdf48e..da1c023 100644 --- a/src/main/webapp/content/scss/paper-dashboard/_datasurvey-global.scss +++ b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-global.scss @@ -15,3 +15,7 @@ color: #757d94; font-size: 0.9rem; } + +p { + margin: 0 !important; +} diff --git a/src/main/webapp/content/scss/paper-dashboard/_datasurvey-list.scss b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-list.scss new file mode 100644 index 0000000..7bd5f80 --- /dev/null +++ b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-list.scss @@ -0,0 +1,133 @@ +@keyframes scaleIn { + from { + transform: scale(0.5, 0.5); + opacity: 0.5; + } + to { + transform: scale(2.5, 2.5); + opacity: 0; + } +} + +.ds-list { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-auto-rows: minmax(12.5rem, auto); + border: 2px dashed #f1f1f1; + border-radius: $border-radius-x-large; + padding: 2rem; + width: 100%; + user-select: none; + box-sizing: border-box; + position: relative; + + .ds-list--entity { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: flex-start; + border: 1px solid #dadce0; + border-radius: $border-radius-small; + padding: 0.5rem; + margin: 1rem; + word-wrap: break-word; + + *:not(div) { + pointer-events: none; + } + + .title { + color: rgba(0, 0, 0, 0.72); + font-size: 0.9rem; + display: flex; + align-items: center; + } + + .subtitle { + color: rgba(0, 0, 0, 0.54); + } + + .tag { + font-size: 0.8rem; + color: rgb(248, 248, 248); + margin-top: 0.5rem; + padding: 0.2rem 1.5rem; + background-color: #2962ff94; + border-radius: 15px; + } + + .entity-header { + display: flex; + justify-content: space-between; + width: 100%; + pointer-events: none; + } + + .entity-body--row { + margin: 0.4rem 0; + } + + .entity-share { + border-radius: 50%; + background-color: #f1f5f9; + cursor: pointer; + display: flex; + justify-content: center; + align-items: center; + transition: background-color 0.2s ease-in-out; + width: 25px; + height: 25px; + color: #313747; + } + + .entity-share:hover { + background-color: #e3e6e9; + } + + .entity-icon--access { + font-size: 0.8rem; + color: rgb(154, 156, 158); + } + + .entity-icon--star { + color: #ffcc47; + margin-right: 0.2rem; + } + + .entity-icon--star--off { + color: #d9dde0; + margin-right: 0.2rem; + } + + .entity-state { + border-radius: 50%; + width: 10px; + height: 10px; + position: absolute; + left: 0; + opacity: 0; + animation: scaleIn 4s infinite cubic-bezier(0.36, 0.11, 0.89, 0.32); + } + + .entity-state--container { + position: relative; + display: flex; + justify-content: center; + align-items: center; + } + + .entity-state--blue { + background-color: #2962ff; + } + .entity-state--green { + background-color: #3ead7f; + } + .entity-state--red { + background-color: #e73636; + } + } + + .active { + background-color: #e8f0fe !important; + } +} diff --git a/src/main/webapp/content/scss/paper-dashboard/_datasurvey-table.scss b/src/main/webapp/content/scss/paper-dashboard/_datasurvey-table.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/main/webapp/content/scss/paper-dashboard/_responsive.scss b/src/main/webapp/content/scss/paper-dashboard/_responsive.scss index fda7b54..5027151 100644 --- a/src/main/webapp/content/scss/paper-dashboard/_responsive.scss +++ b/src/main/webapp/content/scss/paper-dashboard/_responsive.scss @@ -1,3 +1,15 @@ +@media screen and (max-width: 1280px) { + .ds-list { + grid-template-columns: repeat(3, 1fr) !important; + } +} + +@media screen and (max-width: 880px) { + .ds-list { + grid-template-columns: repeat(2, 1fr) !important; + } +} + @media screen and (max-width: 991px) { .navbar { padding: 0; @@ -506,6 +518,10 @@ } @media screen and (max-width: 576px) { + .ds-list { + grid-template-columns: repeat(1, 1fr) !important; + } + .navbar[class*='navbar-toggleable-'] .container { margin-left: 0; margin-right: 0; diff --git a/src/main/webapp/i18n/es/activate.json b/src/main/webapp/i18n/es/activate.json index b2e394c..d18d3c7 100644 --- a/src/main/webapp/i18n/es/activate.json +++ b/src/main/webapp/i18n/es/activate.json @@ -1,9 +1,9 @@ { "activate": { - "title": "Activación de Cuenta", + "title": "Registro Completado", "messages": { - "success": "Su cuenta ha sido activada. Ya puede ", - "error": "Su cuenta no pudo ser activada. Por favor, regístrese en DataSurvey." + "success": "¡Felicidades! Su confirmación de correo fue exitosa ", + "error": "Ocurrió un error al confirmar su correo, por favor intente de nuevo" } } } diff --git a/src/main/webapp/i18n/es/categoria.json b/src/main/webapp/i18n/es/categoria.json index 1a7b898..1e6453f 100644 --- a/src/main/webapp/i18n/es/categoria.json +++ b/src/main/webapp/i18n/es/categoria.json @@ -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" } } } diff --git a/src/main/webapp/i18n/es/global.json b/src/main/webapp/i18n/es/global.json index 4b85e45..0da30ff 100644 --- a/src/main/webapp/i18n/es/global.json +++ b/src/main/webapp/i18n/es/global.json @@ -64,10 +64,11 @@ "info": { "authenticated": { "prefix": "Si desea ", - "link": "iniciar sesión", + "link": "Iniciar Sesión", "suffix": ", puede intentar con las cuentas predeterminadas:
- Administrador (usuario=\"admin\" y contraseña=\"admin\")
- 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": { @@ -76,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": { @@ -111,7 +113,7 @@ "dev": "Development" }, "item-count": "Mostrando {{first}} - {{second}} de {{total}} elementos.", - "registerLink": "Registrarse" + "registerLink": "Crear una cuenta" }, "entity": { "action": { @@ -124,7 +126,10 @@ "open": "Abrir", "save": "Guardar", "view": "Vista", - "create": "Crear" + "create": "Crear", + "enable": "Habilitar", + "disable": "Deshabilitar", + "toggleStatus": "Cambiar Estado" }, "detail": { "field": "Campo", diff --git a/src/main/webapp/i18n/es/parametroAplicacion.json b/src/main/webapp/i18n/es/parametroAplicacion.json index 0ddcef7..4918c56 100644 --- a/src/main/webapp/i18n/es/parametroAplicacion.json +++ b/src/main/webapp/i18n/es/parametroAplicacion.json @@ -21,7 +21,9 @@ "maxDiasEncuesta": "Max Dias Encuesta", "minDiasEncuesta": "Min Dias Encuesta", "maxCantidadPreguntas": "Max Cantidad Preguntas", - "minCantidadPreguntas": "Min Cantidad Preguntas" + "minCantidadPreguntas": "Min Cantidad Preguntas", + "datoInvalido": "Debe ingresar un valor valido", + "vacio": "Este dato es requerido" } } } diff --git a/src/main/webapp/i18n/es/password.json b/src/main/webapp/i18n/es/password.json index 52e6bf1..9a640b8 100644 --- a/src/main/webapp/i18n/es/password.json +++ b/src/main/webapp/i18n/es/password.json @@ -2,11 +2,11 @@ "password": { "title": "Contraseña de [{{username}}]", "form": { - "button": "Guardar" + "button": "Restablecer contraseña" }, "messages": { - "error": "¡Ha ocurrido un error! La contraseña no se ha podido cambiar.", - "success": "¡La contraseña ha sido cambiada!" + "error": "Ha ocurrido un error al restablecer su contraseña, por facor intentelo de nuevo", + "success": "La contraseña ha sido cambiada correctamente" } } } diff --git a/src/main/webapp/i18n/es/register.json b/src/main/webapp/i18n/es/register.json index b44c9af..8330eb5 100644 --- a/src/main/webapp/i18n/es/register.json +++ b/src/main/webapp/i18n/es/register.json @@ -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": "¡Registro guardado! Por favor, revise su correo electrónico para confirmar.", - "adminsuccess": "¡Registro guardado! 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": "¡El registro ha fallado! Por favor, inténtelo de nuevo más tarde.", - "userexists": "¡El correo electrónico ya está en uso! Por favor, escoja otro correo.", - "emailexists": "¡El correo electrónico ya está en uso! 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" } } } diff --git a/src/main/webapp/i18n/es/reset.json b/src/main/webapp/i18n/es/reset.json index 2614281..236b7f4 100644 --- a/src/main/webapp/i18n/es/reset.json +++ b/src/main/webapp/i18n/es/reset.json @@ -6,23 +6,24 @@ "button": "Restablecer la contraseña" }, "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.", + "info": "Introduzca su dirección de correo electrónico", + "success": "Revise su correo electrónico con las instrucciones para restablecer su contraseña", "error": { - "emailnotexists": "¡El correo electrónico no se encuentra registrado en el sistema! Por favor, ingrese otro email." + "emailnotexists": "No existe una cuenta creada con esa dirección de correo electrónico", + "userisgoogle": "No cuenta con el permiso de restablecer su contraseña al haber activado su cuenta por medio de Google" } } }, "finish": { "title": "Restablecer la contraseña", "form": { - "button": "Validar la nueva contraseña" + "button": "Restablecer contraseña" }, "messages": { "info": "Elija una contraseña nueva", - "success": "Su contraseña ha sido restablecida. Por favor, ", - "keymissing": "Falta la clave de reinicio.", - "error": "Su contraseña no puede ser restablecida. Recuerde que una solicitud de reinicio de contraseña sólo es válida durante 24 horas." + "success": "¡Su contraseña ha sido restablecida exitosamente!", + "keymissing": "Falta la clave de reinicio", + "error": "Su contraseña no puede ser restablecida. Recuerde que una solicitud de reinicio de contraseña sólo es válida durante 24 horas" } } }