Merge pull request #116 from Quantum-P3/feature/US-40

Add crear encuesta a partir de una plantilla
This commit is contained in:
Eduardo Quiros 2021-08-09 03:24:03 +00:00 committed by GitHub
commit 842fd46ff8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 210 additions and 23 deletions

View File

@ -11,10 +11,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import org.datasurvey.domain.EPreguntaAbierta;
import org.datasurvey.domain.EPreguntaCerrada;
import org.datasurvey.domain.EPreguntaCerradaOpcion;
import org.datasurvey.domain.Encuesta;
import org.datasurvey.domain.*;
import org.datasurvey.domain.enumeration.AccesoEncuesta;
import org.datasurvey.repository.EncuestaRepository;
import org.datasurvey.service.*;
@ -59,6 +56,14 @@ public class EncuestaResource {
private final EPreguntaCerradaOpcionService ePreguntaCerradaOpcionService;
private final PlantillaService plantillaService;
private final PPreguntaCerradaService pPreguntaCerradaService;
private final PPreguntaAbiertaService pPreguntaAbiertaService;
private final PPreguntaCerradaOpcionService pPreguntaCerradaOpcionService;
public EncuestaResource(
EncuestaService encuestaService,
EncuestaRepository encuestaRepository,
@ -66,7 +71,11 @@ public class EncuestaResource {
MailService mailService,
EPreguntaCerradaService ePreguntaCerradaService,
EPreguntaAbiertaService ePreguntaAbiertaService,
EPreguntaCerradaOpcionService ePreguntaCerradaOpcionService
EPreguntaCerradaOpcionService ePreguntaCerradaOpcionService,
PlantillaService plantillaService,
PPreguntaCerradaService pPreguntaCerradaService,
PPreguntaAbiertaService pPreguntaAbiertaService,
PPreguntaCerradaOpcionService pPreguntaCerradaOpcionService
) {
this.encuestaService = encuestaService;
this.encuestaRepository = encuestaRepository;
@ -75,6 +84,10 @@ public class EncuestaResource {
this.ePreguntaCerradaService = ePreguntaCerradaService;
this.ePreguntaAbiertaService = ePreguntaAbiertaService;
this.ePreguntaCerradaOpcionService = ePreguntaCerradaOpcionService;
this.plantillaService = plantillaService;
this.pPreguntaCerradaService = pPreguntaCerradaService;
this.pPreguntaAbiertaService = pPreguntaAbiertaService;
this.pPreguntaCerradaOpcionService = pPreguntaCerradaOpcionService;
}
/**
@ -97,6 +110,78 @@ public class EncuestaResource {
.body(result);
}
@PostMapping("/encuestas/{plantillaId}")
public ResponseEntity<Encuesta> createEncuestaFromTemplate(
@Valid @RequestBody Encuesta encuesta,
@PathVariable(value = "plantillaId", required = false) final Long plantillaId
) throws URISyntaxException {
log.debug("REST request to save Encuesta : {}", encuesta);
if (encuesta.getId() != null) {
throw new BadRequestAlertException("A new encuesta cannot already have an ID", ENTITY_NAME, "idexists");
}
// Copy from survey template to survey
Optional<Plantilla> plantilla = plantillaService.findOne(plantillaId);
if (plantilla.isPresent()) {
encuesta.setNombre(plantilla.get().getNombre());
encuesta.setDescripcion(plantilla.get().getDescripcion());
encuesta.setCategoria(plantilla.get().getCategoria());
Encuesta encuestaCreated = encuestaService.save(encuesta);
// Preguntas cerradas
List<PPreguntaCerrada> preguntasCerradas = pPreguntaCerradaService.findAll();
for (PPreguntaCerrada pPreguntaCerrada : preguntasCerradas) {
if (pPreguntaCerrada.getPlantilla().getId().equals(plantillaId)) {
EPreguntaCerrada newEPreguntaCerrada = new EPreguntaCerrada();
newEPreguntaCerrada.setNombre(pPreguntaCerrada.getNombre());
newEPreguntaCerrada.setTipo(pPreguntaCerrada.getTipo());
newEPreguntaCerrada.setOpcional(pPreguntaCerrada.getOpcional());
newEPreguntaCerrada.setOrden(pPreguntaCerrada.getOrden());
newEPreguntaCerrada.setEncuesta(encuestaCreated);
ePreguntaCerradaService.save(newEPreguntaCerrada);
// Opciones de preguntas cerradas
List<PPreguntaCerradaOpcion> opciones = pPreguntaCerradaOpcionService.findAll();
for (PPreguntaCerradaOpcion pPreguntaCerradaOpcion : opciones) {
if (pPreguntaCerradaOpcion.getPPreguntaCerrada().getId().equals(pPreguntaCerrada.getId())) {
EPreguntaCerradaOpcion newEPreguntaCerradaOpcion = new EPreguntaCerradaOpcion();
newEPreguntaCerradaOpcion.setNombre(pPreguntaCerradaOpcion.getNombre());
newEPreguntaCerradaOpcion.setOrden(pPreguntaCerradaOpcion.getOrden());
newEPreguntaCerradaOpcion.setCantidad(0);
newEPreguntaCerradaOpcion.setEPreguntaCerrada(newEPreguntaCerrada);
ePreguntaCerradaOpcionService.save(newEPreguntaCerradaOpcion);
}
}
}
}
// Preguntas abiertas
List<PPreguntaAbierta> preguntasAbiertas = pPreguntaAbiertaService.findAll();
for (PPreguntaAbierta pPreguntaAbierta : preguntasAbiertas) {
if (pPreguntaAbierta.getPlantilla().getId().equals(plantillaId)) {
EPreguntaAbierta newEPreguntaAbierta = new EPreguntaAbierta();
newEPreguntaAbierta.setNombre(pPreguntaAbierta.getNombre());
newEPreguntaAbierta.setOpcional(pPreguntaAbierta.getOpcional());
newEPreguntaAbierta.setOrden(pPreguntaAbierta.getOrden());
newEPreguntaAbierta.setEncuesta(encuestaCreated);
ePreguntaAbiertaService.save(newEPreguntaAbierta);
}
}
return ResponseEntity
.created(new URI("/api/encuestas/" + encuestaCreated.getId()))
.headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, encuestaCreated.getId().toString()))
.body(encuestaCreated);
}
return ResponseEntity.ok().body(null);
}
/**
* {@code PUT /encuestas/:id} : Updates an existing encuesta.
*

View File

@ -34,7 +34,7 @@
<p class="ds-subtitle text-center">Inicie creando preguntas y opciones para su encuesta.</p>
</ng-container>
<div class="ds-survey--question-wrapper card-encuesta lift" *ngFor="let ePregunta of ePreguntas; let i = index; trackBy: trackId">
<div class="ds-survey--question-wrapper card-encuesta" *ngFor="let ePregunta of ePreguntas; let i = index; trackBy: trackId">
<div
[attr.data-index]="ePregunta.id"
[attr.data-tipo]="ePregunta.tipo"

View File

@ -1,9 +1,8 @@
<form *ngIf="encuesta" name="deleteForm" (ngSubmit)="confirmFinalizar(encuesta!)">
<div class="modal-header">
<h4 class="ds-title--small" data-cy="encuestaDeleteDialogHeading">Finalizar encuesta</h4>
</div>
<div class="modal-header"></div>
<div class="modal-body">
<p class="ds-title--small" data-cy="encuestaDeleteDialogHeading">Finalizar encuesta</p>
<p class="ds-subtitle" id="jhi-delete-encuesta-heading">¿Está seguro de querer finalizar la encuesta?</p>
</div>

View File

@ -40,10 +40,6 @@
</button>
</div>
<div class="alert alert-warning" id="no-result" *ngIf="encuestas?.length === 0">
<span jhiTranslate="dataSurveyApp.encuesta.home.notFound">No surveys found</span>
</div>
<form class="ds-form">
<div class="input-group">
<div class="ds-filter">
@ -83,8 +79,17 @@
</div>
</form>
<div class="ds-survey" id="entities" *ngIf="encuestas?.length === 0">
<div class="ds-survey--all-question-wrapper">
<ng-container class="">
<p class="ds-title text-center">No posee encuestas</p>
<p class="ds-subtitle text-center">Incie a explorar, colaborar y adquirir datos al crear encuestas mundialmente</p>
</ng-container>
</div>
</div>
<!-- Lista de Encuestas del Usuario -->
<div class="ds-list" (contextmenu)="openContextMenu($event)" *ngIf="!isAdmin()">
<div class="ds-list" (contextmenu)="openContextMenu($event)" *ngIf="!isAdmin() && encuestas?.length !== 0">
<!-- Context Menu -->
<div class="ds-contextmenu ds-contextmenu--closed" id="contextmenu">
<ul id="ds-context-menu__list">

View File

@ -26,6 +26,13 @@ export class EncuestaService {
.pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
}
createFromTemplate(encuesta: IEncuesta, plantillaId: Number): Observable<EntityResponseType> {
const copy = this.convertDateFromClient(encuesta);
return this.http
.post<IEncuesta>(`${this.resourceUrl}/${plantillaId}`, copy, { observe: 'response' })
.pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
}
//update para publicar
update(encuesta: IEncuesta): Observable<EntityResponseType> {
const copy = this.convertDateFromClient(encuesta);

View File

@ -42,9 +42,6 @@
</div>
<p class="ds-subtitle">Creada el día {{ encuesta!.fechaCreacion | formatShortDatetime | lowercase }}</p>
<button type="button" class="ds-btn ds-btn--danger" (click)="finalizar()" *ngIf="encuesta!.estado === 'ACTIVE'">
<fa-icon icon="sync" [icon]="faTimes"></fa-icon>&nbsp;&nbsp;<span>Finalizar</span>
</button>
<div class="d-flex justify-content-end">
<button type="button" class="ds-btn ds-btn--secondary" (click)="previousState()">
@ -65,6 +62,10 @@
>
<fa-icon icon="sync" [icon]="faPlus"></fa-icon>&nbsp;&nbsp;<span>Crear pregunta</span>
</button>
<button type="button" class="ds-btn ds-btn--danger" (click)="finalizar()" *ngIf="encuesta!.estado === 'ACTIVE'">
<fa-icon icon="sync" [icon]="faTimes"></fa-icon>&nbsp;&nbsp;<span>Finalizar</span>
</button>
</div>
</h2>

View File

@ -24,7 +24,7 @@
<p class="ds-subtitle text-center">Inicie creando preguntas y opciones para su plantilla.</p>
</ng-container>
<div class="ds-survey--question-wrapper card-plantilla lift" *ngFor="let pPregunta of pPreguntas; let i = index; trackBy: trackId">
<div class="ds-survey--question-wrapper card-plantilla" *ngFor="let pPregunta of pPreguntas; let i = index; trackBy: trackId">
<div
[attr.data-index]="pPregunta.id"
[attr.data-tipo]="pPregunta.tipo"

View File

@ -91,6 +91,15 @@
<td>{{ plantilla.categoria?.nombre }}</td>
<td class="text-right">
<div class="btn-group">
<button
type="submit"
[routerLink]="['/plantilla', plantilla.id, 'view']"
class="ds-btn ds-btn--secondary btn-sm"
data-cy="entityDetailsButton"
>
<fa-icon icon="eye"></fa-icon>
<span class="d-none d-md-inline">Vista previa</span>
</button>
<button
type="submit"
[routerLink]="['/plantilla', plantilla.id, 'edit']"

View File

@ -33,8 +33,14 @@
</div>
</div>
</form>
<div class="alert alert-warning" id="no-result" *ngIf="usuarioEncuestas?.length === 0">
<span jhiTranslate="dataSurveyApp.usuarioEncuesta.home.notFound">No usuarioEncuestas found</span>
<div class="ds-survey" id="entities" *ngIf="usuarioEncuestas?.length === 0">
<div class="ds-survey--all-question-wrapper">
<ng-container class="">
<p class="ds-title text-center">No posee colaboraciones</p>
<p class="ds-subtitle text-center">Inicie colaborando con otros usuarios mundialmente al recibir una invitación</p>
</ng-container>
</div>
</div>
<div class="table-responsive" id="entities" *ngIf="usuarioEncuestas && usuarioEncuestas.length > 0">

View File

@ -1,7 +1,7 @@
<div *ngIf="usuarioExtra">
<h2 id="page-heading" data-cy="UsuarioEncuestaHeading">
<span class="ds-title" jhiTranslate="dataSurveyApp.usuarioExtra.plantillas.title">Mis Plantillas </span>
<p class="ds-subtitle">Hola</p>
<p class="ds-subtitle">Cree encuestas a partir de las plantillas previamente compradas</p>
<div class="d-flex justify-content-end">
<button class="ds-btn ds-btn--secondary mr-2" (click)="loadAll()" [disabled]="isLoading">
@ -14,8 +14,16 @@
<jhi-alert></jhi-alert>
<div class="alert alert-warning" id="no-result" *ngIf="misPlantillas?.length === 0">
<!-- <div class="alert alert-warning" id="no-result" *ngIf="misPlantillas?.length === 0">
<span jhiTranslate="dataSurveyApp.usuarioExtra.plantillas.notFound">No usuarioEncuestas found</span>
</div> -->
<div class="ds-survey" id="entities" *ngIf="misPlantillas?.length === 0">
<div class="ds-survey--all-question-wrapper">
<ng-container class="">
<p class="ds-title text-center">No posee plantillas</p>
<p class="ds-subtitle text-center">Adquiera y compre diferentes plantillas disponibles en nuestra tienda</p>
</ng-container>
</div>
</div>
<div class="table-responsive" id="entities" *ngIf="misPlantillas && misPlantillas.length > 0">
@ -45,7 +53,12 @@
<span class="d-none d-md-inline">Vista previa</span>
</button>
<button type="submit" class="ds-btn ds-btn--primary btn-sm" data-cy="entityCreateButton">
<button
type="submit"
class="ds-btn ds-btn--primary btn-sm"
data-cy="entityCreateButton"
(click)="crearEncuesta(miPlantilla.id)"
>
<span class="d-none d-md-inline" jhiTranslate="dataSurveyApp.usuarioExtra.plantillas.crearEncuesta">Crear Encuesta</span>
</button>
</div>

View File

@ -11,7 +11,12 @@ import { ActivatedRoute, Router } from '@angular/router';
import { FormBuilder } from '@angular/forms';
import { AccountService } from '../../../core/auth/account.service';
import * as dayjs from 'dayjs';
import { DATE_TIME_FORMAT } from 'app/config/input.constants';
import { Account } from '../../../core/auth/account.model';
import { IEncuesta, Encuesta } from './../../encuesta/encuesta.model';
import { EncuestaService } from 'app/entities/encuesta/service/encuesta.service';
import { AccesoEncuesta } from 'app/entities/enumerations/acceso-encuesta.model';
import { EstadoEncuesta } from 'app/entities/enumerations/estado-encuesta.model';
@Component({
selector: 'jhi-usuario-plantillas',
@ -32,6 +37,7 @@ export class UsuarioPlantillasComponent implements OnInit {
protected activatedRoute: ActivatedRoute,
protected fb: FormBuilder,
protected accountService: AccountService,
protected encuestaService: EncuestaService,
protected router: Router
) {}
@ -65,4 +71,28 @@ export class UsuarioPlantillasComponent implements OnInit {
trackId(index: number, item: IPlantilla): number {
return item.id!;
}
crearEncuesta(plantillaId: any): void {
const now = dayjs();
const newSurvey = {
...new Encuesta(),
id: undefined,
nombre: 'This is a survey',
descripcion: 'This is a survey',
fechaCreacion: dayjs(now, DATE_TIME_FORMAT),
calificacion: 5,
acceso: AccesoEncuesta.PUBLIC,
contrasenna: undefined,
estado: EstadoEncuesta.DRAFT,
categoria: undefined,
usuarioExtra: this.usuarioExtra,
};
console.log(plantillaId, newSurvey);
this.encuestaService.createFromTemplate(newSurvey, plantillaId).subscribe(res => {
this.router.navigate(['/encuesta']);
});
}
}

View File

@ -102,3 +102,4 @@
@import 'paper-dashboard/datasurvey-home';
@import 'paper-dashboard/datasurvey-filter';
@import 'paper-dashboard/datasurvey-survey';
@import 'paper-dashboard/datasurvey-switch';

View File

@ -0,0 +1,30 @@
.ds-switch {
display: flex;
align-items: center;
justify-content: space-between;
& input {
display: flex;
align-items: center;
}
& label {
display: flex;
align-items: center;
font-size: 0.8rem;
color: #757d94;
margin: 0;
&::before {
top: 2px !important;
display: flex;
align-items: center;
}
&::after {
top: 3.5px !important;
display: flex;
align-items: center;
}
}
}

View File

@ -35,6 +35,7 @@
"ePreguntaCerrada": "Pregunta Cerrada",
"categoria": "Categoría",
"usuarioExtra": "Correo Usuario",
"plantilla": "Plantilla",
"password": {
"title": "Contraseña Requerida",
"text": "Esta encuesta es privada, por lo que debe ingresar la contraseña"