Author: echatellier Date: 2013-01-18 16:37:14 +0100 (Fri, 18 Jan 2013) New Revision: 52 Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/52 Log: refs #1646: visualisation des mol?\195?\169cules et ajout/visu des provenances Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MoleculeProvenance.java trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/ResultatTestBio.java trunk/cantharella.data/src/main/resources/commons/data_en.properties trunk/cantharella.data/src/main/resources/commons/data_fr.properties trunk/cantharella.data/src/main/resources/commons/sql/dev_update.sql trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/MoleculeServiceImpl.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.html trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ReadMoleculePage.html trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ReadMoleculePage.java trunk/cantharella.web/src/main/resources/commons/web_en.properties trunk/cantharella.web/src/main/resources/commons/web_fr.properties Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java =================================================================== --- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/Molecule.java 2013-01-18 15:37:14 UTC (rev 52) @@ -27,6 +27,8 @@ import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; @@ -38,6 +40,7 @@ import javax.validation.constraints.NotNull; import nc.ird.cantharella.data.config.DataContext; +import nc.ird.cantharella.data.model.Specimen.TypeOrganisme; import nc.ird.cantharella.data.model.search.UtilisateurSearchFilter; import nc.ird.cantharella.data.model.utils.AbstractModel; @@ -108,8 +111,8 @@ private Campagne campagne; /** Identifiee par. */ - @ManyToOne(fetch = FetchType.EAGER) - private Personne identifieePar; + @Enumerated(EnumType.ORDINAL) + private TypeOrganisme identifieePar; /** Publication d'origine */ @Lob @@ -261,14 +264,14 @@ /** * @return the identifieePar */ - public Personne getIdentifieePar() { + public TypeOrganisme getIdentifieePar() { return identifieePar; } /** * @param identifieePar the identifieePar to set */ - public void setIdentifieePar(Personne identifieePar) { + public void setIdentifieePar(TypeOrganisme identifieePar) { this.identifieePar = identifieePar; } Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MoleculeProvenance.java =================================================================== --- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MoleculeProvenance.java 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/MoleculeProvenance.java 2013-01-18 15:37:14 UTC (rev 52) @@ -38,7 +38,7 @@ import nc.ird.cantharella.data.model.utils.AbstractModel; @Entity -public class MoleculeProvenance extends AbstractModel { +public class MoleculeProvenance extends AbstractModel implements Cloneable { /** Id */ @Id @@ -116,4 +116,15 @@ public void setProduit(Produit produit) { this.produit = produit; } + + /** {@inheritDoc} */ + @Override + public MoleculeProvenance clone() throws CloneNotSupportedException { + MoleculeProvenance clone = (MoleculeProvenance) super.clone(); + clone.id = id; + clone.pourcentage = pourcentage; + clone.molecule = molecule; + clone.produit = produit; + return clone; + } } Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/ResultatTestBio.java =================================================================== --- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/ResultatTestBio.java 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/model/ResultatTestBio.java 2013-01-18 15:37:14 UTC (rev 52) @@ -37,7 +37,6 @@ import javax.validation.constraints.NotNull; import nc.ird.cantharella.data.config.DataContext; -import nc.ird.cantharella.data.model.search.ProduitBridge; import nc.ird.cantharella.data.model.search.UtilisateurSearchFilter; import nc.ird.cantharella.data.model.utils.AbstractModel; import nc.ird.cantharella.data.validation.CollectionUniqueField; @@ -46,7 +45,6 @@ import org.apache.commons.beanutils.BeanComparator; import org.apache.commons.collections.comparators.ComparatorChain; import org.hibernate.annotations.Index; -import org.hibernate.search.annotations.FieldBridge; import org.hibernate.search.annotations.FullTextFilterDef; import org.hibernate.search.annotations.FullTextFilterDefs; import org.hibernate.search.annotations.Indexed; Modified: trunk/cantharella.data/src/main/resources/commons/data_en.properties =================================================================== --- trunk/cantharella.data/src/main/resources/commons/data_en.properties 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.data/src/main/resources/commons/data_en.properties 2013-01-18 15:37:14 UTC (rev 52) @@ -194,13 +194,13 @@ Molecule.publiOrigine=Publication d'origine Molecule.complement=Compl�ment Molecule.createur=Cr�ateur de la fiche -Molecule.produits=Provenance -Molecule.produits.produit.ref=R�f. Produit -Molecule.produits.presence=% -Molecule.produits.lot.ref=R�f. Lot -Molecule.produits.genre=Genre -Molecule.produits.espece=Esp�ce -Molecule.produits.campagne=Campagne +Molecule.provenance=Provenance +Molecule.provenance.produit.ref=R�f. Produit +Molecule.provenance.presence=% +Molecule.provenance.lot.ref=R�f. Lot +Molecule.provenance.genre=Genre +Molecule.provenance.espece=Esp�ce +Molecule.provenance.campagne=Campagne TestBio.ref=Test ref. Modified: trunk/cantharella.data/src/main/resources/commons/data_fr.properties =================================================================== --- trunk/cantharella.data/src/main/resources/commons/data_fr.properties 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.data/src/main/resources/commons/data_fr.properties 2013-01-18 15:37:14 UTC (rev 52) @@ -194,13 +194,13 @@ Molecule.publiOrigine=Publication d'origine Molecule.complement=Complément Molecule.createur=Créateur de la fiche -Molecule.produits=Provenance -Molecule.produits.produit.ref=Réf. Produit -Molecule.produits.presence=% -Molecule.produits.lot.ref=Réf. Lot -Molecule.produits.genre=Genre -Molecule.produits.espece=Espèce -Molecule.produits.campagne=Campagne +Molecule.provenance=Provenance +Molecule.provenance.produit.ref=Réf. Produit +Molecule.provenance.presence=% +Molecule.provenance.lot.ref=Réf. Lot +Molecule.provenance.genre=Genre +Molecule.provenance.espece=Espèce +Molecule.provenance.campagne=Campagne TestBio.ref=Réf. test TestBio.manipulateur=Manipulateur Modified: trunk/cantharella.data/src/main/resources/commons/sql/dev_update.sql =================================================================== --- trunk/cantharella.data/src/main/resources/commons/sql/dev_update.sql 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.data/src/main/resources/commons/sql/dev_update.sql 2013-01-18 15:37:14 UTC (rev 52) @@ -48,7 +48,7 @@ publiOrigine text, campagne_idCampagne int4, createur_idPersonne int4 not null, - identifieePar_idPersonne int4, + identifieePar int4, primary key (idMolecule) ) Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java =================================================================== --- trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java 2013-01-18 15:37:14 UTC (rev 52) @@ -27,6 +27,7 @@ import nc.ird.cantharella.data.exceptions.DataConstraintException; import nc.ird.cantharella.data.exceptions.DataNotFoundException; import nc.ird.cantharella.data.model.Molecule; +import nc.ird.cantharella.data.model.Utilisateur; import nc.ird.cantharella.service.utils.normalizers.MoleculeNormalizer; import nc.ird.cantharella.service.utils.normalizers.utils.Normalize; @@ -81,5 +82,12 @@ */ void updateMolecule(@Normalize(MoleculeNormalizer.class) Molecule molecule) throws DataConstraintException; - + /** + * Détermine si un utilisateur peut modifier ou supprimer une molecule. + * + * @param molecule la molecule + * @param utilisateur L'utilisateur + * @return TRUE s'il a le droit + */ + boolean updateOrdeleteMoleculeEnabled(Molecule molecule, Utilisateur utilisateur); } Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/MoleculeServiceImpl.java =================================================================== --- trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/MoleculeServiceImpl.java 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/MoleculeServiceImpl.java 2013-01-18 15:37:14 UTC (rev 52) @@ -29,6 +29,8 @@ import nc.ird.cantharella.data.exceptions.DataNotFoundException; import nc.ird.cantharella.data.exceptions.UnexpectedException; import nc.ird.cantharella.data.model.Molecule; +import nc.ird.cantharella.data.model.Utilisateur; +import nc.ird.cantharella.data.model.Utilisateur.TypeDroit; import nc.ird.cantharella.service.services.MoleculeService; import nc.ird.module.utils.AssertTools; import nc.ird.module.utils.LogTools; @@ -100,4 +102,10 @@ } } + + @Override + public boolean updateOrdeleteMoleculeEnabled(Molecule molecule, Utilisateur utilisateur) { + return utilisateur.getTypeDroit() == TypeDroit.ADMINISTRATEUR + || utilisateur.getIdPersonne() == molecule.getCreateur().getIdPersonne(); + } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java 2013-01-18 15:37:14 UTC (rev 52) @@ -25,13 +25,21 @@ import java.util.ArrayList; import java.util.List; +import nc.ird.cantharella.data.model.Lot; import nc.ird.cantharella.data.model.Molecule; import nc.ird.cantharella.service.services.MoleculeService; import nc.ird.cantharella.web.config.WebContext; import nc.ird.cantharella.web.pages.TemplatePage; +import nc.ird.cantharella.web.pages.domain.campagne.ReadCampagnePage; +import nc.ird.cantharella.web.pages.domain.lot.ManageLotPage; import nc.ird.cantharella.web.utils.CallerPage; +import nc.ird.cantharella.web.utils.columns.BooleanPropertyColumn; +import nc.ird.cantharella.web.utils.columns.DecimalPropertyColumn; +import nc.ird.cantharella.web.utils.columns.EnumPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; +import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn.LinkableImagePanel; +import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; import nc.ird.cantharella.web.utils.security.AuthRoles; @@ -43,6 +51,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; @@ -100,30 +109,46 @@ setResponsePage(new ReadMoleculePage(model.getObject().getIdMolecule(), currentPage)); } }); - + columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.formuleDevMol")), "formuleDevMol", + "formuleDevMol")); columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.nomCommun")), "nomCommun", "nomCommun")); columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.familleChimique")), "familleChimique", "familleChimique")); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.formuleDevMol")), "formuleDevMol", - "formuleDevMol")); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.nomIupca")), "nomIupca", - "nomIupca")); columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.formuleBrute")), "formuleBrute", "formuleBrute")); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.masseMolaire")), "masseMolaire", - "masseMolaire")); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.nouvMolecul")), "nouvMolecul", - "nouvMolecul")); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.campagne")), "campagne", - "campagne")); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.identifieePar")), "identifieePar", - "identifieePar")); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.publiOrigine")), "publiOrigine", - "publiOrigine")); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.complement")), "complement", - "complement")); + columns.add(new DecimalPropertyColumn<Molecule>(new Model<String>(getString("Molecule.masseMolaire")), "masseMolaire", + "masseMolaire", DecimalDisplFormat.SMALL, getLocale())); + columns.add(new BooleanPropertyColumn<Molecule>(new Model<String>(getString("Molecule.nouvMolecul")), "nouvMolecul", + "nouvMolecul", this)); + columns.add(new LinkPropertyColumn<Molecule>(new Model<String>(getString("Molecule.campagne")), "campagne", + "campagne", getString("Read")) { + @Override + public void onClick(Item<ICellPopulator<Molecule>> item, String componentId, IModel<Molecule> model) { + setResponsePage(new ReadCampagnePage(model.getObject().getCampagne().getIdCampagne(), currentPage)); + } + }); + columns.add(new EnumPropertyColumn<Molecule>(new Model<String>(getString("Molecule.identifieePar")), "identifieePar", + "identifieePar", this)); + columns.add(new LinkableImagePropertyColumn<Molecule>("images/edit.png", getString("Update"), getString("Update")) { + // pas de lien d'édition si l'utilisateur n'a pas les droits + @Override + public void populateItem(Item<ICellPopulator<Molecule>> item, String componentId, IModel<Molecule> model) { + if (moleculeService.updateOrdeleteMoleculeEnabled(model.getObject(), getSession().getUtilisateur())) { + item.add(new LinkableImagePanel(item, componentId, model)); + } else { + // label vide + item.add(new Label(componentId)); + } + } + + @Override + public void onClick(Item<ICellPopulator<Molecule>> item, String componentId, IModel<Molecule> model) { + setResponsePage(new ManageMoleculePage(model.getObject().getIdMolecule(), currentPage)); + } + }); + final DataTable<Molecule> moleculesDataTable = new AjaxFallbackDefaultDataTable<Molecule>("ListMoleculesPage.Molecules", columns, moleculesDataProvider, WebContext.ROWS_PER_PAGE); moleculesRefresh.add(moleculesDataTable); Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.html =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.html 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.html 2013-01-18 15:37:14 UTC (rev 52) @@ -53,7 +53,7 @@ <input type="text" id="Molecule.formuleBrute" wicket:id="Molecule.formuleBrute" /> </div> - <div class="property"> + <div class="property required"> <label for="Molecule.masseMolaire"><wicket:message key="Molecule.masseMolaire" /></label> <input type="text" id="Molecule.masseMolaire" wicket:id="Molecule.masseMolaire" /> </div> @@ -97,61 +97,61 @@ </div> <fieldset> - <legend><wicket:message key="Molecule.produits" /></legend> - <table class="large" cellspacing="0" wicket:id="Molecule.produits.Table"> + <legend><wicket:message key="Molecule.provenance" /></legend> + <table class="large" cellspacing="0" wicket:id="Molecule.provenance.Table"> <thead> <tr> <th class="required"> - <label for="Molecule.produits.List.produit.ref"><wicket:message key="Molecule.produits.produit.ref" /></label> + <label for="Molecule.provenance.List.produit.ref"><wicket:message key="Molecule.provenance.produit.ref" /></label> </th> <th class="required"> - <label for="Molecule.produits.List.presence"><wicket:message key="Molecule.produits.presence" /></label> + <label for="Molecule.provenance.List.presence"><wicket:message key="Molecule.provenance.presence" /></label> </th> <th> - <label for="Molecule.produits.List.lot.ref"><wicket:message key="Molecule.produits.lot.ref" /></label> + <label for="Molecule.provenance.List.lot.ref"><wicket:message key="Molecule.provenance.lot.ref" /></label> </th> <th> - <label for="Molecule.produits.List.genre"><wicket:message key="Molecule.produits.genre" /></label> + <label for="Molecule.provenance.List.genre"><wicket:message key="Molecule.provenance.genre" /></label> </th> <th> - <label for="Molecule.produits.List.espece"><wicket:message key="Molecule.produits.espece" /></label> + <label for="Molecule.provenance.List.espece"><wicket:message key="Molecule.provenance.espece" /></label> </th> <th> - <label for="Molecule.produits.List.campagne"><wicket:message key="Molecule.produits.campagne" /></label> + <label for="Molecule.provenance.List.campagne"><wicket:message key="Molecule.provenance.campagne" /></label> </th> <th><wicket:message key="Actions" /></th> </tr> </thead> <tbody> - <tr wicket:id="Molecule.produits.List"> + <tr wicket:id="Molecule.provenance.List"> <td> - <span wicket:id="Molecule.produits.List.produit.ref" /> + <span wicket:id="Molecule.provenance.List.produit.ref" /> </td> <td> - <span wicket:id="Molecule.produits.List.presence" /> + <span wicket:id="Molecule.provenance.List.presence" /> </td> <td> - <span wicket:id="Molecule.produits.List.lot.ref" /> + <span wicket:id="Molecule.provenance.List.lot.ref" /> </td> <td> - <span wicket:id="Molecule.produits.List.genre" /> + <span wicket:id="Molecule.provenance.List.genre" /> </td> <td> - <span wicket:id="Molecule.produits.List.espece" /> + <span wicket:id="Molecule.provenance.List.espece" /> </td> <td> - <span wicket:id="Molecule.produits.List.campagne" /> + <span wicket:id="Molecule.provenance.List.campagne" /> </td> <td> - <input wicket:id="Molecule.produits.List.Delete" type="submit" wicket:message="value:Delete" /> + <input wicket:id="Molecule.provenance.List.Delete" type="submit" wicket:message="value:Delete" /> </td> </tr> <tr> <td> - <select class="tiny" id="Molecule.produits.produit.ref" wicket:id="Molecule.produits.produit.ref" /> + <select class="tiny" id="Molecule.provenance.produit.ref" wicket:id="Molecule.provenance.produit.ref" /> </td> <td> - <input type="text" class="tiny" id="Molecule.produits.presence" wicket:id="Molecule.produits.presence" /> + <input type="text" class="tiny" id="Molecule.provenance.presence" wicket:id="Molecule.provenance.presence" /> </td> <td> todo lot @@ -166,10 +166,15 @@ todo campagne </td> <td> - <input wicket:id="Molecule.produits.Add" type="submit" wicket:message="value:Add" /> + <input wicket:id="Molecule.provenance.Add" type="submit" wicket:message="value:Add" /> </td> </tr> </tbody> + <tfoot class="highlightFoot" wicket:id="Molecule.provenance.resultsNotAccessibles"> + <tr> + <td colspan="7"><span class="info"><wicket:message key="Molecule.provenanceNotAccessibles"/></span></td> + </tr> + </tfoot> </table> </fieldset> Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.java 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.java 2013-01-18 15:37:14 UTC (rev 52) @@ -23,40 +23,58 @@ package nc.ird.cantharella.web.pages.domain.molecule; import java.math.BigDecimal; +import java.util.Arrays; import java.util.List; import nc.ird.cantharella.data.exceptions.DataConstraintException; import nc.ird.cantharella.data.exceptions.DataNotFoundException; import nc.ird.cantharella.data.exceptions.UnexpectedException; import nc.ird.cantharella.data.model.Campagne; +import nc.ird.cantharella.data.model.Extrait; +import nc.ird.cantharella.data.model.Fraction; import nc.ird.cantharella.data.model.Molecule; import nc.ird.cantharella.data.model.MoleculeProvenance; import nc.ird.cantharella.data.model.Personne; import nc.ird.cantharella.data.model.Produit; +import nc.ird.cantharella.data.model.ResultatTestBio; import nc.ird.cantharella.data.model.Utilisateur; +import nc.ird.cantharella.data.model.ResultatTestBio.TypeResultat; +import nc.ird.cantharella.data.model.Specimen.TypeOrganisme; import nc.ird.cantharella.data.validation.utils.ModelValidator; import nc.ird.cantharella.service.services.CampagneService; import nc.ird.cantharella.service.services.MoleculeService; import nc.ird.cantharella.service.services.PersonneService; import nc.ird.cantharella.service.services.ProduitService; +import nc.ird.cantharella.service.utils.normalizers.UniqueFieldNormalizer; +import nc.ird.cantharella.service.utils.normalizers.utils.Normalizer; import nc.ird.cantharella.web.pages.TemplatePage; import nc.ird.cantharella.web.pages.domain.campagne.ManageCampagnePage; +import nc.ird.cantharella.web.pages.domain.extraction.ReadExtractionPage; +import nc.ird.cantharella.web.pages.domain.purification.ReadPurificationPage; import nc.ird.cantharella.web.pages.renderers.PersonneRenderer; import nc.ird.cantharella.web.pages.renderers.ProduitRenderer; import nc.ird.cantharella.web.utils.CallerPage; import nc.ird.cantharella.web.utils.behaviors.JSConfirmationBehavior; +import nc.ird.cantharella.web.utils.behaviors.ReplaceEmptyLabelBehavior; import nc.ird.cantharella.web.utils.forms.SubmittableButton; import nc.ird.cantharella.web.utils.forms.SubmittableButtonEvents; +import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel; +import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; +import nc.ird.cantharella.web.utils.panels.PropertyLabelLinkProduitPanel; +import nc.ird.cantharella.web.utils.renderers.EnumChoiceRenderer; import nc.ird.cantharella.web.utils.security.AuthRole; import nc.ird.cantharella.web.utils.security.AuthRoles; import nc.ird.module.utils.LogTools; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.MarkupContainer; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.DropDownChoice; @@ -91,9 +109,6 @@ /** Logger */ private static final Log LOG = LogTools.getLog(); - /** Personnes */ - private final List<Personne> personnes; - /** Campagnes */ private final List<Campagne> campagnes; @@ -146,7 +161,7 @@ * @param callerPage Page appelante * @param multipleEntry Saisie multiple */ - private ManageMoleculePage(Integer idMolecule, final CallerPage callerPage) { + public ManageMoleculePage(Integer idMolecule, final CallerPage callerPage) { super(ManageMoleculePage.class); this.callerPage = callerPage; @@ -168,18 +183,21 @@ } // Initialisation des listes - personnes = personneService.listPersonnes(); campagnes = campagneService.listCampagnes(getSession().getUtilisateur()); final Form<Void> formView = new Form<Void>("Form"); - initProvenanceFields(formView); + initProvenanceFields(formView, currentPage); formView.add(new TextField<String>("Molecule.nomCommun", new PropertyModel<String>(moleculeModel, "nomCommun"))); formView.add(new TextField<String>("Molecule.familleChimique", new PropertyModel<String>(moleculeModel, "familleChimique"))); formView.add(new TextField<String>("Molecule.formuleDevMol", new PropertyModel<String>(moleculeModel, "formuleDevMol"))); formView.add(new TextField<String>("Molecule.nomIupca", new PropertyModel<String>(moleculeModel, "nomIupca"))); formView.add(new TextField<String>("Molecule.formuleBrute", new PropertyModel<String>(moleculeModel, "formuleBrute"))); - formView.add(new TextField<String>("Molecule.masseMolaire", new PropertyModel<String>(moleculeModel, "masseMolaire"))); + + TextField<String> masseMolaireField = new TextField<String>("Molecule.masseMolaire", new PropertyModel<String>(moleculeModel, "masseMolaire")); + masseMolaireField.setRequired(true); + formView.add(masseMolaireField); + // div qui englobe les champs visible ssi nouvMolecul est coché final MarkupContainer nouvMoleculRefresh = new WebMarkupContainer("Molecule.nouvMolecul.Refresh"); @@ -199,11 +217,11 @@ } }); - DropDownChoice<Personne> pers = new DropDownChoice<Personne>("Molecule.identifieePar", - new PropertyModel<Personne>(moleculeModel, "identifieePar"), personnes, new PersonneRenderer()); - //pers.setNullValid(false); - //pers.setModelObject(extractionModel.getObject().getManipulateur()); - nouvMoleculRefresh.add(pers); + DropDownChoice<TypeOrganisme> identifieeParInput = new DropDownChoice<TypeOrganisme>("Molecule.identifieePar", + new PropertyModel<TypeOrganisme>(moleculeModel, "identifieePar"), + Arrays.asList(TypeOrganisme.values()), new EnumChoiceRenderer<TypeOrganisme>(this)); + //identifieeParInput.setNullValid(false); + nouvMoleculRefresh.add(identifieeParInput); DropDownChoice<Campagne> campagnesInput = new DropDownChoice<Campagne>("Molecule.campagne", new PropertyModel<Campagne>(moleculeModel, "campagne"), campagnes); @@ -309,17 +327,76 @@ * * @param formView */ - private void initProvenanceFields(final Form<Void> formView) { + private void initProvenanceFields(final Form<Void> formView, final CallerPage currentPage) { // Déclaration tableau des provenances - final MarkupContainer provenanceTable = new WebMarkupContainer("Molecule.produits.Table"); + final MarkupContainer provenanceTable = new WebMarkupContainer("Molecule.provenance.Table"); provenanceTable.setOutputMarkupId(true); + final WebMarkupContainer resultNotAccessibleCont = new WebMarkupContainer( + "Molecule.provenance.resultsNotAccessibles"); + resultNotAccessibleCont.setOutputMarkupPlaceholderTag(true); + provenanceTable.add(resultNotAccessibleCont); + // Contenu tableaux provenance - provenanceTable.add(new ListView<MoleculeProvenance>("Molecule.produits.List", + provenanceTable.add(new ListView<MoleculeProvenance>("Molecule.provenance.List", new PropertyModel<List<MoleculeProvenance>>(moleculeModel, "provenances")) { @Override protected void populateItem(ListItem<MoleculeProvenance> item) { - // TODO echatellier it's NOT produit (new object with %) + if (item.getIndex() % 2 == 1) { + item.add(new AttributeModifier("class", item.getIndex() % 2 == 0 ? "even" : "odd")); + } + + IModel<MoleculeProvenance> provenanceModel = item.getModel(); + final MoleculeProvenance provenance = provenanceModel.getObject(); + + // affichage + lien vers la fiche + item.add(new PropertyLabelLinkProduitPanel("Molecule.provenance.List.produit.ref", + new PropertyModel<Produit>(provenanceModel, "produit"), (TemplatePage) getPage()) { + @Override + public void onClickIfExtrait(Extrait extrait) { + setResponsePage(new ReadExtractionPage(extrait.getExtraction().getIdExtraction(), currentPage)); + } + + @Override + public void onClickIfFraction(Fraction fraction) { + setResponsePage(new ReadPurificationPage(fraction.getPurification().getIdPurification(), + currentPage)); + } + }); + + item.add(new Label("Molecule.provenance.List.presence", new DisplayDecimalPropertyModel( + provenanceModel, "pourcentage", DecimalDisplFormat.SMALL, getLocale()))) + .add(new ReplaceEmptyLabelBehavior()); + item.add(new Label("Molecule.provenance.List.lot.ref", new PropertyModel<String>(provenanceModel, + "pourcentage")).add(new ReplaceEmptyLabelBehavior())); + item.add(new Label("Molecule.provenance.List.genre", new PropertyModel<String>(provenanceModel, + "pourcentage")).add(new ReplaceEmptyLabelBehavior())); + item.add(new Label("Molecule.provenance.List.espece", new PropertyModel<String>(provenanceModel, + "pourcentage")).add(new ReplaceEmptyLabelBehavior())); + item.add(new Label("Molecule.provenance.List.campagne", new PropertyModel<String>(provenanceModel, + "pourcentage")).add(new ReplaceEmptyLabelBehavior())); + + // Action : suppression d'un résultat de test + Button deleteButton = new AjaxFallbackButton("Molecule.provenance.List.Delete", formView) { + @Override + protected void onSubmit(AjaxRequestTarget target, Form<?> form) { + // Suppression + moleculeModel.getObject().getProvenances().remove(provenance); + + if (target != null) { + target.add(provenanceTable); + refreshFeedbackPage(target); + } + } + + @Override + protected void onError(AjaxRequestTarget target, Form<?> form) { + // never called + } + + }; + deleteButton.setDefaultFormProcessing(false); + item.add(deleteButton); } }); @@ -327,14 +404,15 @@ Utilisateur utilisateur = getSession().getUtilisateur(); List<Produit> utilisateurProduits = produitService.listProduits(utilisateur); final DropDownChoice<Produit> produitChoice = new DropDownChoice<Produit>( - "Molecule.produits.produit.ref", new PropertyModel<Produit>(newProvenanceModel, "produit"), + "Molecule.provenance.produit.ref", new PropertyModel<Produit>(newProvenanceModel, "produit"), utilisateurProduits, new ProduitRenderer()) { }; produitChoice.setNullValid(false); provenanceTable.add(produitChoice); + //FIXME echatellier enable or disable resultNotAccessibleCont if product are not listed - final TextField<BigDecimal> presenceInput = new TextField<BigDecimal>("Molecule.produits.presence", + final TextField<BigDecimal> presenceInput = new TextField<BigDecimal>("Molecule.provenance.presence", new PropertyModel<BigDecimal>(newProvenanceModel, "pourcentage")) { }; @@ -343,15 +421,42 @@ provenanceTable.add(presenceInput); // Bouton AJAX pour ajouter un résultat de test - addProvenanceButton = new AjaxFallbackButton("Molecule.produits.Add", formView) { + addProvenanceButton = new AjaxFallbackButton("Molecule.provenance.Add", formView) { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { + try { + // ajout du type molecule + newProvenanceModel.getObject().setMolecule(moleculeModel.getObject()); + // ajout à la liste + MoleculeProvenance provenanceAdded = newProvenanceModel.getObject().clone(); + moleculeModel.getObject().getProvenances().add(provenanceAdded); + + List<String> errors = validator.validate(newProvenanceModel.getObject(), getSession().getLocale()); + + if (errors.isEmpty()) { + // réinit des champs de la ligne "ajout" + newProvenanceModel.getObject().setProduit(null); + newProvenanceModel.getObject().setPourcentage(null); + newProvenanceModel.getObject().setMolecule(null); + } else { + moleculeModel.getObject().getProvenances().remove(provenanceAdded); + addValidationErrors(errors); + } + } catch (CloneNotSupportedException e) { + LOG.error(e.getMessage(), e); + throw new UnexpectedException(e); + } + + if (target != null) { + target.add(provenanceTable); + refreshFeedbackPage(target); + } } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { - + refreshFeedbackPage(target); } }; Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ReadMoleculePage.html =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ReadMoleculePage.html 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ReadMoleculePage.html 2013-01-18 15:37:14 UTC (rev 52) @@ -66,22 +66,24 @@ <span class="value" wicket:id="Molecule.nouvMolecul" ></span> </div> - <div class="property"> - <span class="label"><wicket:message key="Molecule.campagne" /></span> - <span class="value" wicket:id="Molecule.campagne" ></span> - </div> + <div wicket:id="Molecule.nouvMolecul.Refresh"> + <div class="property"> + <span class="label"><wicket:message key="Molecule.campagne" /></span> + <span class="value" wicket:id="Molecule.campagne" ></span> + </div> + + <div class="property"> + <span class="label"><wicket:message key="Molecule.identifieePar" /></span> + <span class="value" wicket:id="Molecule.identifieePar" ></span> + </div> + + <div class="property"> + <span class="label"><wicket:message key="Molecule.publiOrigine" /></span> + <span class="value" wicket:id="Molecule.publiOrigine" ></span> + </div> + </div> <div class="property"> - <span class="label"><wicket:message key="Molecule.identifieePar" /></span> - <span class="value" wicket:id="Molecule.identifieePar" ></span> - </div> - - <div class="property"> - <span class="label"><wicket:message key="Molecule.publiOrigine" /></span> - <span class="value" wicket:id="Molecule.publiOrigine" ></span> - </div> - - <div class="property"> <span class="label"><wicket:message key="Molecule.complement" /></span> <span class="value" wicket:id="Molecule.complement"></span> </div> @@ -92,42 +94,59 @@ </div> <fieldset> - <legend><wicket:message key="Molecule.produits" /></legend> - <!-- <table cellspacing="0" wicket:id="Molecule.produits.Table"> + <legend><wicket:message key="Molecule.provenance" /></legend> + <table cellspacing="0" wicket:id="Molecule.provenance.Table"> <thead> <tr> <th> - <wicket:message key="Extrait.typeExtrait" /> + <wicket:message key="Molecule.provenance.produit.ref" /> </th> <th> - <wicket:message key="Extrait.ref" /> + <wicket:message key="Molecule.provenance.presence" /> </th> <th> - <wicket:message key="Extrait.masseObtenue" /> + <wicket:message key="Molecule.provenance.lot.ref" /> </th> <th> - <wicket:message key="Extrait.rendement" /> + <wicket:message key="Molecule.provenance.genre" /> </th> + <th> + <wicket:message key="Molecule.provenance.espece" /> + </th> + <th> + <wicket:message key="Molecule.provenance.campagne" /> + </th> </tr> </thead> <tbody> - <tr wicket:id="Molecule.produits.List"> + <tr wicket:id="Molecule.provenance.List"> <td> - <span wicket:id="Extraction.extraits.List.typeExtrait" /><wicket:container wicket:id="Molecule.produits.List.typeExtrait.info"/> + <span wicket:id="Molecule.provenance.List.produit.ref" /> </td> <td> - <span wicket:id="Extraction.extraits.List.ref" /> + <span wicket:id="Molecule.provenance.List.presence" /> </td> <td> - <span wicket:id="Extraction.extraits.List.masseObtenue" /> + <span wicket:id="Molecule.provenance.List.lot.ref" /> </td> <td> - <span wicket:id="Extraction.extraits.List.rendement" /> + <span wicket:id="Molecule.provenance.List.genre" /> </td> + <td> + <span wicket:id="Molecule.provenance.List.espece" /> + </td> + <td> + <span wicket:id="Molecule.provenance.List.campagne" /> + </td> </tr> </tbody> - </table> --> - <div class="property" wicket:id="Molecule.produits.noTable"> + <tfoot class="highlightFoot" wicket:id="Molecule.provenance.resultsNotAccessibles"> + <tr> + <td colspan="6"><span class="info"><wicket:message key="Molecule.provenanceNotAccessibles"/></span></td> + </tr> + </tfoot> + </table> + <div class="property" wicket:id="Molecule.provenance.noTable"> <span class="label"> </span> <span class="value"><wicket:message key="List.none" /></span> </div> @@ -135,7 +154,7 @@ <form wicket:id="Form"> <div class="actions"> - <a class="edit" wicket:id="ReadMoleculePage.Lot.Update" wicket:message="title:Update"> + <a class="edit" wicket:id="ReadMoleculePage.Molecule.Update" wicket:message="title:Update"> <wicket:message key="Update" /> </a> Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ReadMoleculePage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ReadMoleculePage.java 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ReadMoleculePage.java 2013-01-18 15:37:14 UTC (rev 52) @@ -22,18 +22,60 @@ */ package nc.ird.cantharella.web.pages.domain.molecule; -import nc.ird.cantharella.data.model.Lot; +import java.math.BigDecimal; +import java.util.List; + +import nc.ird.cantharella.data.exceptions.DataConstraintException; +import nc.ird.cantharella.data.model.Campagne; +import nc.ird.cantharella.data.model.Extrait; +import nc.ird.cantharella.data.model.Fraction; import nc.ird.cantharella.data.model.Molecule; +import nc.ird.cantharella.data.model.MoleculeProvenance; +import nc.ird.cantharella.data.model.Personne; +import nc.ird.cantharella.data.model.Produit; +import nc.ird.cantharella.data.model.Station; +import nc.ird.cantharella.data.model.Utilisateur; +import nc.ird.cantharella.service.services.MoleculeService; +import nc.ird.cantharella.web.config.WebContext; import nc.ird.cantharella.web.pages.TemplatePage; +import nc.ird.cantharella.web.pages.domain.extraction.ReadExtractionPage; +import nc.ird.cantharella.web.pages.domain.lot.ManageLotPage; +import nc.ird.cantharella.web.pages.domain.personne.ReadPersonnePage; +import nc.ird.cantharella.web.pages.domain.purification.ReadPurificationPage; +import nc.ird.cantharella.web.pages.domain.station.ReadStationPage; +import nc.ird.cantharella.web.pages.renderers.ProduitRenderer; import nc.ird.cantharella.web.utils.CallerPage; +import nc.ird.cantharella.web.utils.behaviors.JSConfirmationBehavior; import nc.ird.cantharella.web.utils.behaviors.ReplaceEmptyLabelBehavior; +import nc.ird.cantharella.web.utils.forms.SubmittableButton; +import nc.ird.cantharella.web.utils.forms.SubmittableButtonEvents; +import nc.ird.cantharella.web.utils.models.DisplayBooleanPropertyModel; +import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel; +import nc.ird.cantharella.web.utils.models.DisplayMapValuePropertyModel; +import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; import nc.ird.cantharella.web.utils.models.GenericLoadableDetachableModel; +import nc.ird.cantharella.web.utils.panels.PropertyLabelLinkPanel; +import nc.ird.cantharella.web.utils.panels.PropertyLabelLinkProduitPanel; import nc.ird.cantharella.web.utils.security.AuthRole; import nc.ird.cantharella.web.utils.security.AuthRoles; +import org.apache.wicket.AttributeModifier; +import org.apache.wicket.MarkupContainer; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton; +import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Button; +import org.apache.wicket.markup.html.form.DropDownChoice; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.TextField; +import org.apache.wicket.markup.html.link.Link; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.spring.injection.annot.SpringBean; /** * Lecture d'une molécule. @@ -43,27 +85,169 @@ @AuthRoles( { AuthRole.ADMIN, AuthRole.USER }) public class ReadMoleculePage extends TemplatePage { + /** Action : delete */ + public static final String ACTION_DELETE = "Delete"; + /** Modèle : molecule */ private final IModel<Molecule> moleculeModel; + /** Service : molecule */ + @SpringBean + private MoleculeService moleculeService; + + /** Page appelante */ + private final CallerPage callerPage; + public ReadMoleculePage(Integer idMolecule, final CallerPage callerPage) { super(ReadMoleculePage.class); + this.callerPage = callerPage; + final CallerPage currentPage = new CallerPage(this); // Initialisation du modèle moleculeModel = new GenericLoadableDetachableModel<Molecule>(Molecule.class, idMolecule); + initProvenanceFields(currentPage); + add(new Label("Molecule.idMolecule", new PropertyModel<String>(moleculeModel, "idMolecule"))); add(new Label("Molecule.nomCommun", new PropertyModel<String>(moleculeModel, "nomCommun")).add(new ReplaceEmptyLabelBehavior())); add(new Label("Molecule.familleChimique", new PropertyModel<String>(moleculeModel, "familleChimique")).add(new ReplaceEmptyLabelBehavior())); add(new Label("Molecule.formuleDevMol", new PropertyModel<String>(moleculeModel, "formuleDevMol")).add(new ReplaceEmptyLabelBehavior())); add(new Label("Molecule.nomIupca", new PropertyModel<String>(moleculeModel, "nomIupca")).add(new ReplaceEmptyLabelBehavior())); add(new Label("Molecule.formuleBrute", new PropertyModel<String>(moleculeModel, "formuleBrute")).add(new ReplaceEmptyLabelBehavior())); - add(new Label("Molecule.idMolecule", new PropertyModel<String>(moleculeModel, "idMolecule")).add(new ReplaceEmptyLabelBehavior())); - add(new Label("Molecule.idMolecule", new PropertyModel<String>(moleculeModel, "idMolecule")).add(new ReplaceEmptyLabelBehavior())); - add(new Label("Molecule.idMolecule", new PropertyModel<String>(moleculeModel, "idMolecule")).add(new ReplaceEmptyLabelBehavior())); - add(new Label("Molecule.idMolecule", new PropertyModel<String>(moleculeModel, "idMolecule")).add(new ReplaceEmptyLabelBehavior())); - add(new Label("Molecule.idMolecule", new PropertyModel<String>(moleculeModel, "idMolecule")).add(new ReplaceEmptyLabelBehavior())); - add(new Label("Molecule.idMolecule", new PropertyModel<String>(moleculeModel, "idMolecule")).add(new ReplaceEmptyLabelBehavior())); + add(new Label("Molecule.masseMolaire", new DisplayDecimalPropertyModel(moleculeModel, "masseMolaire", DecimalDisplFormat.SMALL, getLocale())).add(new ReplaceEmptyLabelBehavior())); + add(new Label("Molecule.nouvMolecul", new DisplayBooleanPropertyModel(moleculeModel, "nouvMolecul", this)).add(new ReplaceEmptyLabelBehavior())); + + final MarkupContainer nouvMoleculRefresh = new WebMarkupContainer("Molecule.nouvMolecul.Refresh"); + nouvMoleculRefresh.setOutputMarkupId(true); + nouvMoleculRefresh.setVisible(moleculeModel.getObject().isNouvMolecul()); + nouvMoleculRefresh.add(new Label("Molecule.campagne", new PropertyModel<Campagne>(moleculeModel, "campagne")).add(new ReplaceEmptyLabelBehavior())); + nouvMoleculRefresh.add(new Label("Molecule.identifieePar", new PropertyModel<Personne>(moleculeModel, "identifieePar")).add(new ReplaceEmptyLabelBehavior())); + nouvMoleculRefresh.add(new Label("Molecule.publiOrigine", new PropertyModel<String>(moleculeModel, "publiOrigine")).add(new ReplaceEmptyLabelBehavior())); + add(nouvMoleculRefresh); + + add(new Label("Molecule.complement", new PropertyModel<String>(moleculeModel, "complement")).add(new ReplaceEmptyLabelBehavior())); + + add(new PropertyLabelLinkPanel<Personne>("Molecule.createur", new PropertyModel<Personne>(moleculeModel, "createur"), + getString("Read")) { + @Override + public void onClick() { + setResponsePage(new ReadPersonnePage(getModelObject().getIdPersonne(), currentPage)); + } + }); + + // Formulaire des actions + final Form<Void> formView = new Form<Void>("Form"); + + // Action : mise à jour (redirection vers le formulaire) + Link<Molecule> updateLink = new Link<Molecule>(getResource() + ".Molecule.Update", new Model<Molecule>(moleculeModel.getObject())) { + @Override + public void onClick() { + setResponsePage(new ManageMoleculePage(getModelObject().getIdMolecule(), currentPage)); + } + }; + updateLink.setVisibilityAllowed(moleculeService.updateOrdeleteMoleculeEnabled(moleculeModel.getObject(), getSession() + .getUtilisateur())); + formView.add(updateLink); + + // Action : suppression + Button deleteButton = new SubmittableButton(ACTION_DELETE, ManageLotPage.class, new SubmittableButtonEvents() { + @Override + public void onProcess() throws DataConstraintException { + moleculeService.deleteMolecule(moleculeModel.getObject()); + } + + @Override + public void onSuccess() { + successNextPage(ManageMoleculePage.class, ACTION_DELETE); + redirect(); + } + }); + deleteButton.setVisibilityAllowed(moleculeService.updateOrdeleteMoleculeEnabled(moleculeModel.getObject(), getSession() + .getUtilisateur())); + deleteButton.add(new JSConfirmationBehavior(getString("Confirm"))); + deleteButton.setDefaultFormProcessing(false); + formView.add(deleteButton); + + // Action : retour + formView.add(new Link<Void>(getResource() + ".Molecule.Back") { + @Override + public void onClick() { + callerPage.responsePage((TemplatePage) getPage()); + } + }); + add(formView); } + /** + * Redirection vers une autre page + */ + private void redirect() { + callerPage.responsePage(this); + } + + /** + * Init provenance table. + * + * @param formView + */ + private void initProvenanceFields(final CallerPage currentPage) { + // Déclaration tableau des provenances + final MarkupContainer provenanceTable = new WebMarkupContainer("Molecule.provenance.Table"); + provenanceTable.setOutputMarkupId(true); + + final WebMarkupContainer resultNotAccessibleCont = new WebMarkupContainer( + "Molecule.provenance.resultsNotAccessibles"); + resultNotAccessibleCont.setOutputMarkupPlaceholderTag(true); + provenanceTable.add(resultNotAccessibleCont); + + // Contenu tableaux provenance + ListView<MoleculeProvenance> provenanceListView = new ListView<MoleculeProvenance>("Molecule.provenance.List", + new PropertyModel<List<MoleculeProvenance>>(moleculeModel, "provenances")) { + @Override + protected void populateItem(ListItem<MoleculeProvenance> item) { + if (item.getIndex() % 2 == 1) { + item.add(new AttributeModifier("class", item.getIndex() % 2 == 0 ? "even" : "odd")); + } + + IModel<MoleculeProvenance> provenanceModel = item.getModel(); + // affichage + lien vers la fiche + item.add(new PropertyLabelLinkProduitPanel("Molecule.provenance.List.produit.ref", + new PropertyModel<Produit>(provenanceModel, "produit"), (TemplatePage) getPage()) { + @Override + public void onClickIfExtrait(Extrait extrait) { + setResponsePage(new ReadExtractionPage(extrait.getExtraction().getIdExtraction(), currentPage)); + } + + @Override + public void onClickIfFraction(Fraction fraction) { + setResponsePage(new ReadPurificationPage(fraction.getPurification().getIdPurification(), + currentPage)); + } + }); + + item.add(new Label("Molecule.provenance.List.presence", new DisplayDecimalPropertyModel( + provenanceModel, "pourcentage", DecimalDisplFormat.SMALL, getLocale()))) + .add(new ReplaceEmptyLabelBehavior()); + item.add(new Label("Molecule.provenance.List.lot.ref", new PropertyModel<String>(provenanceModel, + "pourcentage")).add(new ReplaceEmptyLabelBehavior())); + item.add(new Label("Molecule.provenance.List.genre", new PropertyModel<String>(provenanceModel, + "pourcentage")).add(new ReplaceEmptyLabelBehavior())); + item.add(new Label("Molecule.provenance.List.espece", new PropertyModel<String>(provenanceModel, + "pourcentage")).add(new ReplaceEmptyLabelBehavior())); + item.add(new Label("Molecule.provenance.List.campagne", new PropertyModel<String>(provenanceModel, + "pourcentage")).add(new ReplaceEmptyLabelBehavior())); + } + }; + provenanceTable.add(provenanceListView); + add(provenanceTable); + + // Selon la non existence d'elements dans la liste on affiche le span + MarkupContainer noTableProvenances = new WebMarkupContainer("Molecule.provenance.noTable") { + @Override + public boolean isVisible() { + return moleculeModel.getObject().getProvenances().isEmpty(); + } + }; + add(noTableProvenances); + } } Modified: trunk/cantharella.web/src/main/resources/commons/web_en.properties =================================================================== --- trunk/cantharella.web/src/main/resources/commons/web_en.properties 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.web/src/main/resources/commons/web_en.properties 2013-01-18 15:37:14 UTC (rev 52) @@ -370,6 +370,8 @@ MethodePurification.parametres.index.IConverter.Integer=The index must be an integer MethodePurification.parametres.index=Index +Molecule.provenanceNotAccessibles=Certains produits associés ne sont pas affichés car vous n'avez pas les droits nécéssaires + TestBio.date.IConverter.Date= The date is incorrectly formatted (DD/MM/YY) TestBio.concMasseDefaut.IConverter.BigDecimal=Default Conc./Mass - must be a decimal number TestBio.resultats.valeur.IConverter.BigDecimal=Value - must be a decimal number Modified: trunk/cantharella.web/src/main/resources/commons/web_fr.properties =================================================================== --- trunk/cantharella.web/src/main/resources/commons/web_fr.properties 2013-01-18 11:16:16 UTC (rev 51) +++ trunk/cantharella.web/src/main/resources/commons/web_fr.properties 2013-01-18 15:37:14 UTC (rev 52) @@ -368,6 +368,8 @@ MethodePurification.parametres.index.IConverter.Integer=L'index doit être un entier MethodePurification.parametres.index=Index +Molecule.provenanceNotAccessibles=Certains produits associés ne sont pas affichés car vous n'avez pas les droits nécéssaires + TestBio.date.IConverter.Date=La date est mal formatée (JJ/MM/AA) TestBio.concMasseDefaut.IConverter.BigDecimal=Conc./Masse par défaut - doit être un nombre décimal TestBio.resultats.valeur.IConverter.BigDecimal=Valeur - doit être un nombre décimal