package nc.noumea.mairie.organigramme.viewmodel;
/*
* #%L
* Logiciel de Gestion des Organigrammes de la Ville de Nouméa
* $Id:$
* $HeadURL:$
* %%
* Copyright (C) 2015 Mairie de Nouméa
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import nc.noumea.mairie.organigramme.core.services.AuthentificationService;
import nc.noumea.mairie.organigramme.core.viewmodel.AbstractPopupViewModel;
import nc.noumea.mairie.organigramme.core.ws.AdsWSConsumer;
import nc.noumea.mairie.organigramme.dto.EntiteDto;
import nc.noumea.mairie.organigramme.dto.ProfilAgentDto;
import nc.noumea.mairie.organigramme.dto.ReturnMessageDto;
import nc.noumea.mairie.organigramme.dto.TypeEntiteDto;
import nc.noumea.mairie.organigramme.services.CouleurTypeEntiteService;
import nc.noumea.mairie.organigramme.services.ReturnMessageService;
import nc.noumea.mairie.organigramme.services.TypeEntiteService;
import org.apache.commons.lang.StringUtils;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.AfterCompose;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zhtml.Li;
import org.zkoss.zhtml.Ul;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.select.Selectors;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zkplus.spring.DelegatingVariableResolver;
import org.zkoss.zul.Window;
@Init(superclass = true)
@VariableResolver(DelegatingVariableResolver.class)
public class CreateEntiteViewModel extends AbstractPopupViewModel<EntiteDto> implements Serializable {
private static final long serialVersionUID = 1L;
// @formatter:off
@WireVariable
AdsWSConsumer adsWSConsumer;
@WireVariable
CouleurTypeEntiteService couleurTypeEntiteService;
@WireVariable
ReturnMessageService returnMessageService;
@WireVariable
AuthentificationService authentificationService;
@WireVariable
TypeEntiteService typeEntiteService;
// @formatter:on
@AfterCompose
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
setPopup((Window) Selectors.iterable(view, "#createEntite").iterator().next());
}
@GlobalCommand
@NotifyChange("entity")
public void ouvrePopupEditionEntiteDto(@BindingParam("entity") EntiteDto entiteDto) {
setEntity(entiteDto);
getPopup().doModal();
}
/**
* Crée une entité en fonction de ce qui a été indiqué dans la popup de
* création. L'ajoute à l'arbre DTO représenté par l'{@link EntiteDto}
* "entiteDtoRoot" et l'ajoute aussi à l'arborescence {@link Ul}/{@link Li}
* qui est utilisée pour rafraîchir l'arbre en retour de cette méthode
*/
@Command
@NotifyChange("entity")
public void save() {
ProfilAgentDto profilAgentDto = authentificationService.getCurrentUser();
// #16902 : Ajouter le champ labelCourt limité à 60 caractères dans les
// propriétés d'une entité
if (StringUtils.isNotBlank(this.entity.getLabel())) {
this.entity.setLabelCourt(StringUtils.substring(this.entity.getLabel(), 0, 60));
}
if (!profilAgentDto.isEdition() || showErrorPopup(this.entity)) {
return;
}
EntiteDto entiteDtoParent = this.entity.getEntiteParent();
EntiteDto newEntiteDto = createAndInitNewEntiteDto(entiteDtoParent, profilAgentDto.getIdAgent());
// On fait appel au WS ADS de création d'une entité
ReturnMessageDto returnMessageDto = adsWSConsumer.saveOrUpdateEntite(newEntiteDto);
if (!returnMessageService.gererReturnMessage(returnMessageDto, false)) {
return;
}
// On recharge le dto directement depuis ADS pour être sur d'avoir la
// version bien à jour
newEntiteDto = adsWSConsumer.getEntite(returnMessageDto.getId());
// On ajoute l'entité à l'arbre déjà existant pour que le côté client
// puisse reconstruire l'arbre complet
final Map<String, Object> mapEntite = new HashMap<String, Object>();
mapEntite.put("entiteDtoParent", entiteDtoParent);
mapEntite.put("newEntiteDto", newEntiteDto);
mapEntite.put("ouvreOnglet", true);
BindUtils.postGlobalCommand(null, null, "refreshToutOngletEntite", new HashMap<String, Object>());
BindUtils.postGlobalCommand(null, null, "refreshArbreSuiteAjout", mapEntite);
getPopup().detach();
}
/**
* Renvoi une nouvelle instance d'{@link EntiteDto} initialisée avec les
* valeurs de la popup de création
*
* @param entiteDtoParent
* : l'{@link EntiteDto} parente
* @param idAgent
* : l'idAgent qui fait la création
* @return une nouvelle instance d'{@link EntiteDto}
*/
private EntiteDto createAndInitNewEntiteDto(EntiteDto entiteDtoParent, Integer idAgent) {
EntiteDto newEntiteDto = new EntiteDto();
newEntiteDto.setIdStatut(0);
newEntiteDto.setSigle(this.entity.getSigle());
newEntiteDto.setLabel(this.entity.getLabel());
newEntiteDto.setLabelCourt(this.entity.getLabelCourt());
newEntiteDto.setTypeEntite(this.entity.getTypeEntite());
newEntiteDto.setEntiteParent(entiteDtoParent);
newEntiteDto.setIdAgentCreation(idAgent);
return newEntiteDto;
}
/**
* Renvoie la liste des types d'entités triés par nom
*
* @return la liste des types d'entités triés par nom
*/
public List<TypeEntiteDto> getListeTypeEntite() {
return adsWSConsumer.getListeTypeEntite();
}
}