Commit 28d57f2c authored by François-Xavier Lebastard's avatar François-Xavier Lebastard
Browse files

Merge branch 'feature/migration_screen_index' into 'feature/gestion_des_ecrans'

Developpements KRO

See merge request !58
parents d954818b 3b649f3d
...@@ -47,6 +47,13 @@ public class Screen implements Serializable { ...@@ -47,6 +47,13 @@ public class Screen implements Serializable {
@Column(name = "name", nullable = false, unique = true) @Column(name = "name", nullable = false, unique = true)
private String name; private String name;
/**
* Nom de l'écran : pour l'affichage uniquement
*/
@NotNull
@Column(name = "name_bo", nullable = false, unique = true)
private String nameBo;
/** /**
* reference du screen pour constituer l'URL * reference du screen pour constituer l'URL
*/ */
...@@ -79,15 +86,6 @@ public class Screen implements Serializable { ...@@ -79,15 +86,6 @@ public class Screen implements Serializable {
@Column(name = "items", nullable = false) @Column(name = "items", nullable = false)
private String items; private String items;
@JsonIgnoreProperties(value = { "previous", "next", "form" }, allowSetters = true)
@OneToOne
@JoinColumn(unique = true)
private Screen previous;
@JsonIgnoreProperties(value = { "previous", "next", "form" }, allowSetters = true)
@OneToOne(mappedBy = "previous")
private Screen next;
@ManyToOne @ManyToOne
@JsonIgnoreProperties(value = { "screens", "variables", "workspace" }, allowSetters = true) @JsonIgnoreProperties(value = { "screens", "variables", "workspace" }, allowSetters = true)
private Form form; private Form form;
...@@ -121,6 +119,15 @@ public class Screen implements Serializable { ...@@ -121,6 +119,15 @@ public class Screen implements Serializable {
return this; return this;
} }
public Screen nameBo(final String nameBo) {
this.nameBo = nameBo;
return this;
}
public Screen index(final Integer index) {
this.index = index;
return this;
}
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name;
} }
...@@ -209,38 +216,6 @@ public class Screen implements Serializable { ...@@ -209,38 +216,6 @@ public class Screen implements Serializable {
this.items = items; this.items = items;
} }
public Screen getPrevious() {
return this.previous;
}
public Screen previous(Screen screen) {
this.setPrevious(screen);
return this;
}
public void setPrevious(Screen screen) {
this.previous = screen;
}
public Screen getNext() {
return this.next;
}
public Screen next(Screen screen) {
this.setNext(screen);
return this;
}
public void setNext(Screen screen) {
if (this.next != null) {
this.next.setPrevious(null);
}
if (next != null) {
next.setPrevious(this);
}
this.next = screen;
}
public Form getForm() { public Form getForm() {
return this.form; return this.form;
} }
...@@ -262,6 +237,13 @@ public class Screen implements Serializable { ...@@ -262,6 +237,13 @@ public class Screen implements Serializable {
this.index = index; this.index = index;
} }
public String getNameBo() {
return nameBo;
}
public void setNameBo(String nameBo) {
this.nameBo = nameBo;
}
// jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here
@Override @Override
......
...@@ -3,35 +3,38 @@ package com.unantes.orientactive.filariane; ...@@ -3,35 +3,38 @@ package com.unantes.orientactive.filariane;
import com.unantes.orientactive.security.AuthoritiesConstants; import com.unantes.orientactive.security.AuthoritiesConstants;
import com.unantes.orientactive.security.permissions.PermissionService; import com.unantes.orientactive.security.permissions.PermissionService;
import com.unantes.orientactive.service.FormService; import com.unantes.orientactive.service.FormService;
import com.unantes.orientactive.service.ScreenService; import com.unantes.orientactive.service.WorkspaceService;
import com.unantes.orientactive.service.dto.FormDTO; import com.unantes.orientactive.service.dto.FormDTO;
import com.unantes.orientactive.service.dto.ScreenDTO; import com.unantes.orientactive.service.dto.WorkspaceDTO;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
/** /**
* Contrôleur permettant de récupérer le fils d'ariane pour un élément. * Contrôleur permettant de récupérer le fils d'ariane pour un élément.
*/ */
@RestController @RestController
@RequestMapping("/api/filariane")
public class FilArianeController { public class FilArianeController {
/** /**
* Service des formulaires. * Service des workspaces.
*/ */
private final FormService formService; private final WorkspaceService workspaceService;
/** /**
* Service des écrans. * Service des formulaires.
*/ */
private final ScreenService screenService; private final FormService formService;
/** /**
* Elément du fil d'ariane correspondant à l'accueil. * Elément du fil d'ariane correspondant à l'accueil.
...@@ -41,18 +44,17 @@ public class FilArianeController { ...@@ -41,18 +44,17 @@ public class FilArianeController {
/** /**
* Constructeur. * Constructeur.
* *
* @param formService Le service des formulaires. * @param formService Le service des formulaires.
* @param screenService Le service des écrans.
*/ */
public FilArianeController( public FilArianeController(
final WorkspaceService workspaceService,
final FormService formService, final FormService formService,
final ScreenService screenService,
final ApplicationContext applicationContext final ApplicationContext applicationContext
) { ) {
String homeTitle = applicationContext.getMessage("filariane.home.title", new Object[] {}, Locale.getDefault()); String homeTitle = applicationContext.getMessage("filariane.home.title", new Object[]{}, Locale.getDefault());
this.workspaceService = workspaceService;
this.filArianeHome = new FilArianeElement(homeTitle, Path.HOME); this.filArianeHome = new FilArianeElement(homeTitle, Path.HOME);
this.formService = formService; this.formService = formService;
this.screenService = screenService;
} }
/** /**
...@@ -60,7 +62,7 @@ public class FilArianeController { ...@@ -60,7 +62,7 @@ public class FilArianeController {
* *
* @return Le fil d'ariane. * @return Le fil d'ariane.
*/ */
@GetMapping("/home") @GetMapping("/user/home")
@ResponseBody @ResponseBody
public String getUserHome() { public String getUserHome() {
if (PermissionService.currentUserHasAuthority(AuthoritiesConstants.AUTHORITY_VIEW_WORKSPACE)) { if (PermissionService.currentUserHasAuthority(AuthoritiesConstants.AUTHORITY_VIEW_WORKSPACE)) {
...@@ -76,9 +78,9 @@ public class FilArianeController { ...@@ -76,9 +78,9 @@ public class FilArianeController {
* *
* @return Le fil d'ariane. * @return Le fil d'ariane.
*/ */
@GetMapping("/filariane/workspaces") @GetMapping("/home")
@ResponseBody @ResponseBody
public List<FilArianeElement> getFilArianeForWorkspaces() { public List<FilArianeElement> getFilArianeForHome() {
return Collections.singletonList(filArianeHome); return Collections.singletonList(filArianeHome);
} }
...@@ -88,10 +90,13 @@ public class FilArianeController { ...@@ -88,10 +90,13 @@ public class FilArianeController {
* @param idWorkspace L'identifiant du workspace. * @param idWorkspace L'identifiant du workspace.
* @return Le fil d'ariane. * @return Le fil d'ariane.
*/ */
@GetMapping("/filariane/workspace/{idWorkspace}") @GetMapping("/workspace/{idWorkspace}")
@ResponseBody @ResponseBody
public List<FilArianeElement> getFilArianeForWorkspace(@PathVariable("idWorkspace") final Long idWorkspace) { public List<FilArianeElement> getFilArianeForWorkspace(@PathVariable("idWorkspace") final Long idWorkspace) {
return Collections.singletonList(filArianeHome); LinkedList<FilArianeElement> filAriane = new LinkedList<>();
filAriane.add(filArianeHome);
addFilArianeWorkspace(filAriane, idWorkspace);
return filAriane;
} }
/** /**
...@@ -100,47 +105,31 @@ public class FilArianeController { ...@@ -100,47 +105,31 @@ public class FilArianeController {
* @param idForm L'identifiant du formulaire. * @param idForm L'identifiant du formulaire.
* @return Le fil d'ariane. * @return Le fil d'ariane.
*/ */
@GetMapping("/filariane/form/{idForm}") @GetMapping("/form/{idForm}")
@ResponseBody @ResponseBody
public List<FilArianeElement> getFilArianeForForm(@PathVariable("idForm") final Long idForm) { public List<FilArianeElement> getFilArianeForForm(@PathVariable("idForm") final Long idForm) {
final List<FilArianeElement> filAriane = new LinkedList<>(); LinkedList<FilArianeElement> filAriane = new LinkedList<>();
filAriane.add(filArianeHome); filAriane.add(filArianeHome);
addFilArianeWorkspace(filAriane, idForm);
return filAriane;
}
/**
* Récupération du fil d'ariane pour un écran.
*
* @param idScreen L'identifiant de l'écran.
* @return Le fil d'ariane.
*/
@GetMapping("/filariane/screen/{idScreen}")
@ResponseBody
public List<FilArianeElement> getFilArianeForScreen(@PathVariable("idScreen") final Long idScreen) {
final List<FilArianeElement> filAriane = new LinkedList<>();
if (PermissionService.currentUserHasAuthority(AuthoritiesConstants.AUTHORITY_VIEW_FORM)) { if (PermissionService.currentUserHasAuthority(AuthoritiesConstants.AUTHORITY_VIEW_FORM)) {
final Optional<ScreenDTO> screenOptional = screenService.findOne(idScreen); final Optional<FormDTO> formDTO = formService.findOne(idForm);
final ScreenDTO screen = screenOptional.orElseThrow(() -> new FilArianeException("L'écran n'existe pas.")); final FormDTO form = formDTO.orElseThrow(() -> new FilArianeException("Le formulaire n'existe pas."));
filAriane.add(new FilArianeElement(screen.getFormName(), Path.WORKSPACE + "/" + screen.getFormId())); addFilArianeWorkspace(filAriane, form.getWorkspaceId());
addFilArianeWorkspace(filAriane, screen.getFormId()); filAriane.add(new FilArianeElement(form.getName(), Path.FORMS + "/" + form.getId() + "/view"));
} }
filAriane.add(filArianeHome);
Collections.reverse(filAriane);
return filAriane; return filAriane;
} }
/** /**
* Ajout du fil d'ariane du workspace concerné par le formulaire. * Ajout du fil d'ariane du workspace concerné par le formulaire.
* *
* @param filAriane Le fil d'ariane. * @param filAriane Le fil d'ariane.
* @param formId L'identifiant du formulaire. * @param workspaceId L'identifiant du workspace.
*/ */
private void addFilArianeWorkspace(final List<FilArianeElement> filAriane, final Long formId) { private void addFilArianeWorkspace(final List<FilArianeElement> filAriane, final Long workspaceId) {
if (PermissionService.currentUserHasAuthority(AuthoritiesConstants.AUTHORITY_VIEW_WORKSPACE)) { if (PermissionService.currentUserHasAuthority(AuthoritiesConstants.AUTHORITY_VIEW_WORKSPACE)) {
final Optional<FormDTO> formOptional = formService.findOne(formId); final Optional<WorkspaceDTO> workspaceOptional = workspaceService.findOne(workspaceId);
final FormDTO form = formOptional.orElseThrow(() -> new FilArianeException("Le formulaire n'existe pas.")); final WorkspaceDTO workspace = workspaceOptional.orElseThrow(() -> new FilArianeException("Le workspace n'existe pas."));
filAriane.add(new FilArianeElement(form.getWorkspaceName(), Path.WORKSPACE + "/" + form.getWorkspaceId())); filAriane.add(new FilArianeElement(workspace.getName(), Path.WORKSPACE + "/" + workspace.getId() + "/view"));
} }
} }
} }
...@@ -5,8 +5,10 @@ package com.unantes.orientactive.filariane; ...@@ -5,8 +5,10 @@ package com.unantes.orientactive.filariane;
*/ */
public class Path { public class Path {
public static final String HOME = "/home"; public static final String HOME = "/admin/workspace";
public static final String LIST_WORKSPACES = "/workspaces"; public static final String WORKSPACE = "/admin/workspace";
public static final String WORKSPACE = "/workspace"; public static final String FORMS = "/admin/forms";
public static final String LIST_FORMS = "/forms";
public static final String LIST_WORKSPACES = "/admin/workspaces";
public static final String LIST_FORMS = "/admin/forms";
} }
...@@ -335,4 +335,22 @@ public class NavigationService { ...@@ -335,4 +335,22 @@ public class NavigationService {
throw new RequiredAnswersMissingException(requiredQuestionsWithoutAnswers); throw new RequiredAnswersMissingException(requiredQuestionsWithoutAnswers);
} }
} }
/**
* Permet de savoir si un écran est le dernier écran du formulaire.
*
* @return Vrai si l'écran est le dernier écran, sinon faux.
*/
public boolean checkIsLastScreen(final ScreenDTO screenDTO) {
return screenService.findScreenByIndexAndFormId(screenDTO.getNextIndex(), screenDTO.getFormId()).isEmpty();
}
/**
* Permet de savoir si un écran est le premier écran du formulaire.
*
* @return Vrai si l'écran est le premier écran, sinon faux.
*/
public boolean checkIsFirstScreen(final ScreenDTO screenDTO) {
return screenDTO.getIndex() == 1;
}
} }
...@@ -12,17 +12,18 @@ import com.unantes.orientactive.service.dto.NextScreenExpressionDTO; ...@@ -12,17 +12,18 @@ import com.unantes.orientactive.service.dto.NextScreenExpressionDTO;
import com.unantes.orientactive.service.dto.ScreenDTO; import com.unantes.orientactive.service.dto.ScreenDTO;
import com.unantes.orientactive.service.dto.VariableDTO; import com.unantes.orientactive.service.dto.VariableDTO;
import com.unantes.orientactive.web.rest.errors.UnableToFindNextScreenException; import com.unantes.orientactive.web.rest.errors.UnableToFindNextScreenException;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/** /**
* Ce service contient la logique de navigation d'un écran vers le suivant. Il contient également les méthodes permettants de déterminer si un item doit être affiché. * Ce service contient la logique de navigation d'un écran vers le suivant. Il contient également les méthodes permettants de déterminer si un item doit être affiché.
*/ */
...@@ -48,8 +49,9 @@ public class ScreenNavigationService { ...@@ -48,8 +49,9 @@ public class ScreenNavigationService {
/** /**
* Constructure. * Constructure.
* @param screenService {@link #screenService} *
* @param answerService {@link #answerService} * @param screenService {@link #screenService}
* @param answerService {@link #answerService}
* @param variableService {@link #variableService} * @param variableService {@link #variableService}
*/ */
public ScreenNavigationService(ScreenService screenService, AnswerService answerService, VariableService variableService) { public ScreenNavigationService(ScreenService screenService, AnswerService answerService, VariableService variableService) {
...@@ -64,15 +66,16 @@ public class ScreenNavigationService { ...@@ -64,15 +66,16 @@ public class ScreenNavigationService {
* Chaque expression de {@link Screen#getNextScreenExpressions()} est évaluée : la première qui est vérifiée donne l'écran suivant. * Chaque expression de {@link Screen#getNextScreenExpressions()} est évaluée : la première qui est vérifiée donne l'écran suivant.
* Si aucune n'est vérifiée, {@link Screen#getDefaultNextScreenReference()} est utilisé s'il est non vide * Si aucune n'est vérifiée, {@link Screen#getDefaultNextScreenReference()} est utilisé s'il est non vide
* {@link Screen#getNext()} est utilisé en dernier recours. * {@link Screen#getNext()} est utilisé en dernier recours.
*
* @param sessionId une session de réponses (l'identifiant commun à toutes les réponses d'un utilisateur) * @param sessionId une session de réponses (l'identifiant commun à toutes les réponses d'un utilisateur)
* @param screen l'écran courant de l'utilisateur * @param screen l'écran courant de l'utilisateur
* @return * @return
* @throws UnableToFindNextScreenException la méthode a été appelée avec un écran final ou l'expression du screen courant retourne un screen qui n'existe pas * @throws UnableToFindNextScreenException la méthode a été appelée avec un écran final ou l'expression du screen courant retourne un screen qui n'existe pas
*
*/ */
public ScreenDTO getNextScreen(final String sessionId, final ScreenDTO screen) throws UnableToFindNextScreenException { public ScreenDTO getNextScreen(final String sessionId, final ScreenDTO screen) throws UnableToFindNextScreenException {
// il ne faut pas appeler cette méthode lorsque l'écran courant est le dernier ! // il ne faut pas appeler cette méthode lorsque l'écran courant est le dernier !
if (screen.getNextId() == null) { Optional<ScreenDTO> screenDTO = screenService.findScreenByIndexAndFormId(screen.getNextIndex(), screen.getFormId());
if (screenDTO.isEmpty()) {
throw new UnableToFindNextScreenException(); throw new UnableToFindNextScreenException();
} }
// initialisation d'une expression. Elle est utilisée pour evaluer les expressions permettant de déterminer les écrans suivants et pour filter les items affichés dans l'écran suivant. // initialisation d'une expression. Elle est utilisée pour evaluer les expressions permettant de déterminer les écrans suivants et pour filter les items affichés dans l'écran suivant.
...@@ -91,8 +94,9 @@ public class ScreenNavigationService { ...@@ -91,8 +94,9 @@ public class ScreenNavigationService {
/** /**
* Détermine l'écran suivant en fonction des expressions {@link ScreenDTO#getNextScreenExpressions()}. * Détermine l'écran suivant en fonction des expressions {@link ScreenDTO#getNextScreenExpressions()}.
*
* @param expression le moteur d'expressions SpEL initialisé avec les données de l'utilisateur * @param expression le moteur d'expressions SpEL initialisé avec les données de l'utilisateur
* @param screen l'écran courant * @param screen l'écran courant
* @return * @return
*/ */
private ScreenDTO getNextScreenFromExpressions(final Expression expression, final ScreenDTO screen) { private ScreenDTO getNextScreenFromExpressions(final Expression expression, final ScreenDTO screen) {
...@@ -112,30 +116,33 @@ public class ScreenNavigationService { ...@@ -112,30 +116,33 @@ public class ScreenNavigationService {
/** /**
* Deux écrans par défaut possibles : * Deux écrans par défaut possibles :
* <ul> * <ul>
* <li>{@link Screen#getDefaultNextScreenReference()}; utilisé si renseigné</li> * <li>{@link Screen#getDefaultNextScreenReference()}; utilisé si renseigné</li>
* <li>{@link Screen#getNext()}; champ obligatoire; utilisé pour définir l'ordre en back office et en dernier recours pour l'ordre en front.</li> * <li>{@link Screen#getNext()}; champ obligatoire; utilisé pour définir l'ordre en back office et en dernier recours pour l'ordre en front.</li>
* </ul> * </ul>
*
* @param screen * @param screen
* @return * @return
*/ */
private ScreenDTO getDefaultNextScreen(final ScreenDTO screen) { private ScreenDTO getDefaultNextScreen(final ScreenDTO screen) {
if (StringUtils.isBlank(screen.getDefaultNextScreenReference())) { if (StringUtils.isBlank(screen.getDefaultNextScreenReference())) {
return getScreenById(screen.getNextId()); return getScreenByIndexAndFormId(screen.getNextIndex(), screen.getFormId());
} }
return getScreenByRef(screen.getDefaultNextScreenReference()); return getScreenByRef(screen.getDefaultNextScreenReference());
} }
/** /**
* Wrapper de la méthode {@link ScreenService#findOne(Long)}; Jette une exception si l'écran n'existe pas. * Wrapper de la méthode {@link ScreenService#findOne(Long)}; Jette une exception si l'écran n'existe pas.
*
* @param nextId * @param nextId
* @return * @return
*/ */
private ScreenDTO getScreenById(final Long nextId) { private ScreenDTO getScreenByIndexAndFormId(final Integer index, final Long formId) {
return screenService.findOne(nextId).orElseThrow(() -> new UnableToFindNextScreenException("l'écran n'existe pas en base")); return screenService.findScreenByIndexAndFormId(index, formId).orElseThrow(() -> new UnableToFindNextScreenException("l'écran n'existe pas en base"));
} }
/** /**
* Wrapper de la méthode {@link ScreenService#findOneByReference(String)}; Jette une exception si l'écran n'existe pas. * Wrapper de la méthode {@link ScreenService#findOneByReference(String)}; Jette une exception si l'écran n'existe pas.
*
* @param screenRef * @param screenRef
* @return * @return
*/ */
...@@ -147,8 +154,9 @@ public class ScreenNavigationService { ...@@ -147,8 +154,9 @@ public class ScreenNavigationService {
/** /**
* Filtre les items de l'écran courant en fonction des conditions d'affichage de chaque item. * Filtre les items de l'écran courant en fonction des conditions d'affichage de chaque item.
*
* @param sessionId pour retrouver les réponses de la session courante * @param sessionId pour retrouver les réponses de la session courante
* @param screen un écran qui contient les items à filtrer * @param screen un écran qui contient les items à filtrer
*/ */
public void filterScreenItems(final String sessionId, final ScreenDTO screen) { public void filterScreenItems(final String sessionId, final ScreenDTO screen) {
final Expression expression = initializeExpression(screen.getFormId(), sessionId); final Expression expression = initializeExpression(screen.getFormId(), sessionId);
...@@ -157,7 +165,8 @@ public class ScreenNavigationService { ...@@ -157,7 +165,8 @@ public class ScreenNavigationService {
/** /**
* Filtre les items de l'écran coura