[Suiviobsmer-commits] r148 - in trunk: suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock suiviobsmer-business/src/main/xmi suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/base suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages suiviobsmer
Author: fdesbois Date: 2009-12-22 18:09:31 +0000 (Tue, 22 Dec 2009) New Revision: 148 Added: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerBusinessException.java trunk/suiviobsmer-ui/src/main/webapp/img/contact-unavailable-22px.png Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerGlobal.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProfessionImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceUserImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceSamplingMock.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceUserMock.java trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/SuiviObsmerGlobalTest.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/base/GenericSelectModel.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Administration.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.java trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.properties trunk/suiviobsmer-ui/src/main/webapp/Boats.tml trunk/suiviobsmer-ui/src/main/webapp/Contacts.tml trunk/suiviobsmer-ui/src/main/webapp/SampleRowForm.tml trunk/suiviobsmer-ui/src/main/webapp/css/contacts.css trunk/suiviobsmer-ui/src/main/webapp/css/sampling.css Log: - Finishing SampleRowForm with validation - Change method getCompanies to have only those active - Improve style for Contacts and add images for mammals column in edition mode - Change some details on Boats page Added: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerBusinessException.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerBusinessException.java (rev 0) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerBusinessException.java 2009-12-22 18:09:31 UTC (rev 148) @@ -0,0 +1,46 @@ + +package fr.ifremer.suiviobsmer; + +/** + * SuiviObsmerBusinessException + * + * Created: 22 déc. 2009 + * + * @param <T> + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class SuiviObsmerBusinessException extends SuiviObsmerException { + + protected Type type; + + protected Class<?> serviceClass; + + public SuiviObsmerBusinessException(Type type, Class<?> serviceClass, String msg) { + super(msg); + this.type = type; + this.serviceClass = serviceClass; + } + + public SuiviObsmerBusinessException(Type type, Class<?> serviceClass, String msg, Throwable cause) { + super(msg, cause); + this.type = type; + this.serviceClass = serviceClass; + } + + public static enum Type { + IMPORT_ERROR, SELECT_PROBLEM, NOT_EXISTS; + } + + public Type getType() { + return this.type; + } + + public String getServiceName() { + return this.serviceClass.getSimpleName(); + } + +} Property changes on: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerBusinessException.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerGlobal.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerGlobal.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerGlobal.java 2009-12-22 18:09:31 UTC (rev 148) @@ -74,7 +74,7 @@ User user = dao.create( User.ADMIN, true, - User.ACTIVE, false, + User.ACTIVE, true, User.LOGIN, "admin", User.PASSWORD, password, User.FIRST_NAME, "Super", Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProfessionImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProfessionImpl.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProfessionImpl.java 2009-12-22 18:09:31 UTC (rev 148) @@ -22,6 +22,7 @@ package fr.ifremer.suiviobsmer.entity; import java.io.Serializable; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,7 +45,14 @@ @Override public String getCode() { - return getCodeDCF5() + " " + getMeshSize() + " " + getSize(); + String code = getCodeDCF5(); + if (!StringUtils.isEmpty(getMeshSize())) { + code += getMeshSize(); + } + if (!StringUtils.isEmpty(getSize())) { + code += getSize(); + } + return code; } } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java 2009-12-22 18:09:31 UTC (rev 148) @@ -165,11 +165,7 @@ */ @Override public boolean hasSampleMonthRealTideTime() { - List<SampleMonth> months = getSampleMonth(); - if (months == null) { - return false; - } - for (SampleMonth month : months) { + for (SampleMonth month : getSampleMonth()) { if (month.getRealTidesValue() != 0) { return true; } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java 2009-12-22 18:09:31 UTC (rev 148) @@ -24,6 +24,8 @@ import com.csvreader.CsvReader; import fr.ifremer.suiviobsmer.DataLoader; import fr.ifremer.suiviobsmer.QueryBuilder; +import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException; +import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException.Type; import fr.ifremer.suiviobsmer.SuiviObsmerContext; import fr.ifremer.suiviobsmer.SuiviObsmerException; import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; @@ -131,219 +133,6 @@ results.put(boat.getImmatriculation(), boat); } -// String boatClassName = Boat.class.getName(); -// String queryHead = "SELECT B FROM " + boatClassName + " B"; -// String query = ""; -// boolean alreadyFiltered = false; -// List<Object> params = new ArrayList<Object>(); -// -// // Immatriculation -// if (filter.getBoatImmatriculation() != null) { -// query += " WHERE B.immatriculation = :immatriculation"; -// params.add("immatriculation"); -// params.add(filter.getBoatImmatriculation()); -// alreadyFiltered = true; -// } -// // Name -// if (!StringUtils.isEmpty(filter.getBoatName())) { -// query += alreadyFiltered ? " AND " : " WHERE "; -// query += "B.name LIKE :name"; -// params.add("name"); -// params.add(filter.getBoatName() + "%"); -// alreadyFiltered = true; -// } -// // DistrictCode -// if (!StringUtils.isEmpty(filter.getBoatDistrictCode())) { -// query += alreadyFiltered ? " AND " : " WHERE "; -// query += "B.districtCode = :districtCode"; -// params.add("districtCode"); -// params.add(filter.getBoatDistrictCode()); -// alreadyFiltered = true; -// } -// -// boolean sampleRowCodeFiltered = !StringUtils.isEmpty(filter.getSampleRowCode()); -// boolean professionFiltered = filter.getProfession() != null; -// boolean fishingZoneFiltered = filter.getFishingZone() != null; -// boolean sampleRowFiltered = sampleRowCodeFiltered || professionFiltered || fishingZoneFiltered; -// -// // Add join for ElligibleBoat -// if (sampleRowFiltered) { -// String elligibleBoatClassName = ElligibleBoat.class.getName(); -// queryHead += ", " + elligibleBoatClassName + " E"; -// query += alreadyFiltered ? " AND " : " WHERE "; -// query += "E.boat = B"; -// } -// // SampleRowCode -// if (sampleRowCodeFiltered) { -// query += " AND E.sampleRow.code = :sampleRowCode"; -// params.add("sampleRowCode"); -// params.add(filter.getSampleRowCode()); -// } -// // Profession -// if (professionFiltered) { -// query += " AND E.sampleRow.profession = :profession"; -// params.add("profession"); -// params.add(filter.getProfession()); -// } -// // FishingZone -//// if (fishingZoneFiltered) { -//// String fishingZoneClassName = FishingZone.class.getName(); -//// queryHead += ", " + fishingZoneClassName + " F"; -//// query += " AND F.sampleRow = " + -//// query += " AND E.sampleRow.fishingZone = :fishingZone"; -//// params.add("profession"); -//// params.add(filter.getFishingZone()); -//// } -// // Company : only if an other filter is set for the sampleRow -// if (filter.getCompany() != null && sampleRowFiltered) { -// query += " AND E.sampleRow.company = :company"; -// query += " AND (E.companyActive = :booleanTrue "; -// query += " OR (E.companyActive IS NULL AND E.globalActive = :booleanTrue))"; -// params.add("company"); -// params.add(filter.getCompany()); -// params.add("booleanTrue"); -// params.add(Boolean.TRUE); -// } -// -// if (log.isDebugEnabled()) { -// log.debug("QUERY : " + queryHead + query); -// } -// -// List boats = transaction.find(queryHead + query, params.toArray()); -// for (Object o : boats) { -// Boat boat = (Boat)o; -// results.put(boat.getImmatriculation(), boat); -// } - - - - /******************** FILTER ON BOATS *****************************/ - -// // IMMATRICULATION : full -// if (filter.getBoatImmatriculation() != null) { -// if (log.isDebugEnabled()) { -// log.debug("Filter by immatriculation : " + filter.getBoatImmatriculation()); -// } -// Boat boat = dao.findByImmatriculation(filter.getBoatImmatriculation()); -// results.put(boat.getImmatriculation(), boat); -// return results; -// } -// // NAME : startWith -// if (!StringUtils.isEmpty(filter.getBoatName())) { -// if (log.isDebugEnabled()) { -// log.debug("Filter by boatName : " + filter.getBoatName()); -// } -// List list = transaction.find("FROM BoatImpl WHERE name LIKE :name", -// "name", filter.getBoatName() + "%"); -// for (Object o : list) { -// Boat boat = (Boat)o; -// results.put(boat.getImmatriculation(), boat); -// } -// alreadyFiltered = true; -// } -// // DISTRICT CODE : full -// if (!StringUtils.isEmpty(filter.getBoatDistrictCode())) { -// if (log.isDebugEnabled()) { -// log.debug("Filter by boatDistrictCode : " + filter.getBoatDistrictCode()); -// } -// // boats not filtered yet -// if (!alreadyFiltered) { -// List<Boat> boats = dao.findAllByDistrictCode(filter.getBoatDistrictCode()); -// for (Boat boat : boats) { -// results.put(boat.getImmatriculation(), boat); -// } -// // results may exist with some boats from previous query (boatName) -// } else { -// for (Integer key : results.keySet()) { -// Boat boat = results.get(key); -// if (!boat.getDistrictCode().equals(filter.getBoatDistrictCode())) { -// results.remove(key); -// } -// } -// } -// } -// -// /******************** FILTER ON SAMPLE ROWS ***********************/ -// -// // COMPANY FILTERED ? -// boolean companyFiltered = filter.getCompany() != null; -// boolean professionFiltered = filter.getProfession() != null; -// boolean fishingZoneFiltered = filter.getFishingZone() != null; -// -// SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); -// -// // CODE -// Map<String, Object> properties = new HashMap<String, Object>(); -// if (!StringUtils.isEmpty(filter.getSampleRowCode())) { -// if (log.isDebugEnabled()) { -// log.debug("Filter by rowCode : " + filter.getSampleRowCode()); -// } -// properties.put(SampleRow.CODE, filter.getSampleRowCode()); -// } else { -// // COMPANY : only if an other filter on SampleRow is set -// if (companyFiltered && (professionFiltered || fishingZoneFiltered)) { -// if (log.isDebugEnabled()) { -// log.debug("Filter by company : " + filter.getCompany().getName()); -// } -// // TODO add filter for non closed sampleRow, i.e. sampleRow.program.periodEnd > currentTime -// properties.put(SampleRow.COMPANY, filter.getCompany()); -// } -// // PROFESSION -// if (professionFiltered) { -// if (log.isDebugEnabled()) { -// log.debug("Filter by profession : " + filter.getProfession().getCode()); -// } -// properties.put(SampleRow.PROFESSION, filter.getProfession()); -// } -// } -// -// List<SampleRow> rows = new ArrayList<SampleRow>(); -// if (!properties.isEmpty()) { -// rows = rowDAO.findAllByProperties(properties); -// alreadyFiltered = true; -// } else if (fishingZoneFiltered) { -// rows = rowDAO.findAllContainsFishingZone(filter.getFishingZone()); -// alreadyFiltered = true; -// } -// -// /******************** CHECK ELLIGIBLE BOATS FOR EACH ROW **********/ -// -// for (SampleRow row : rows) { -// List<FishingZone> zones = row.getFishingZone(); -// // FILTER BY FISHING ZONE -// if (fishingZoneFiltered && !zones.contains(filter.getFishingZone())) { -// break; -// } -// -// for (ElligibleBoat elligible : row.getElligibleBoat()) { -// int immatriculation = elligible.getBoat().getImmatriculation(); -// -// // For company -// boolean condition1 = companyFiltered && -// BooleanUtils.isNotFalse(elligible.getCompanyActive()); -// -// // For admin -// boolean condition2 = !companyFiltered && elligible.getGlobalActive(); -// -// if (condition1 || condition2) { -// if (log.isDebugEnabled()) { -// log.debug("Add elligible boat : " + -// immatriculation + " - " + -// elligible.getBoat().getName()); -// } -// results.put(immatriculation, elligible.getBoat()); -// } -// -// } -// } -// -// // No filter set -// if (!alreadyFiltered) { -// for (Boat boat : dao.findAll()) { -// results.put(boat.getImmatriculation(), boat); -// } -// } - transaction.closeContext(); } catch (Exception eee) { SuiviObsmerContext.serviceException(transaction, "Impossible de filtrer la liste des navires", eee); @@ -458,8 +247,11 @@ transaction.commitTransaction(); transaction.closeContext(); } catch (Exception eee) { + Boat boat = companyBoatInfos.getBoatInfos().getBoat(); + Company company = companyBoatInfos.getCompany(); SuiviObsmerContext.serviceException(transaction, - "La chaîne d'immatriculations est incorrect ! Chaque immatriculation doit posséder 6 chiffres", eee); + "Impossible de créer ou modifier les informations liés au navire " + + boat.getImmatriculation() + " pour la société " + company.getName(), eee); } } @@ -482,7 +274,8 @@ int immatriculation = Integer.parseInt(res); Boat boat = dao.findByImmatriculation(immatriculation); if (boat == null) { - throw new SuiviObsmerException("Immatriculation " + immatriculation + " incorrect, ne référence aucun navire"); + throw new SuiviObsmerBusinessException(Type.NOT_EXISTS, ServiceBoat.class, + "Immatriculation " + immatriculation + " incorrect, ne référence aucun navire"); } boats.add(boat); } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java 2009-12-22 18:09:31 UTC (rev 148) @@ -326,6 +326,7 @@ row.setFishingZone(new ArrayList<FishingZone>()); row.setProgram(new ProgramImpl()); row.setElligibleBoat(new ArrayList<ElligibleBoat>()); + row.setSampleMonth(new ArrayList<SampleMonth>()); return row; } @@ -337,7 +338,26 @@ return month; } + /** + * Create a new profession from an existing one. Copy all attributes values from + * the profession in argument to a new profession not created yet in database. + * + * @param profession the profession source + * @return a new Profession + */ + @Override + public Profession getNewProfession(Profession profession) { + Profession newProfession = new ProfessionImpl(); + newProfession.setCodeDCF5(profession.getCodeDCF5()); + newProfession.setLibelle(profession.getLibelle()); + newProfession.setOther(profession.getOther()); + newProfession.setMeshSize(profession.getMeshSize()); + newProfession.setSize(profession.getSize()); + newProfession.setSpecies(profession.getSpecies()); + return newProfession; + } + @Override public int[] importSamplingPlanCsv(InputStream input) throws SuiviObsmerException { TopiaContext transaction = null; Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceUserImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceUserImpl.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceUserImpl.java 2009-12-22 18:09:31 UTC (rev 148) @@ -140,7 +140,7 @@ } @Override - public List<Company> getCompanies() throws SuiviObsmerException { + public List<Company> getCompanies(boolean activeOnly) throws SuiviObsmerException { TopiaContext transaction = null; List<Company> results = new ArrayList<Company>(); try { @@ -155,7 +155,11 @@ users.size(); }*/ - results = dao.findAll(); + if (activeOnly) { + results = dao.findAllByActive(activeOnly); + } else { + results = dao.findAll(); + } transaction.closeContext(); } catch (Exception eee) { Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceSamplingMock.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceSamplingMock.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceSamplingMock.java 2009-12-22 18:09:31 UTC (rev 148) @@ -26,6 +26,7 @@ import fr.ifremer.suiviobsmer.dto.SampleRowDTO; import fr.ifremer.suiviobsmer.entity.Boat; import fr.ifremer.suiviobsmer.entity.Company; +import fr.ifremer.suiviobsmer.entity.Profession; import fr.ifremer.suiviobsmer.entity.SampleMonth; import fr.ifremer.suiviobsmer.entity.SampleRow; import fr.ifremer.suiviobsmer.entity.SampleRowImpl; @@ -257,4 +258,9 @@ throw new UnsupportedOperationException("Not supported yet."); } + @Override + public Profession getNewProfession(Profession profession) { + throw new UnsupportedOperationException("Not supported yet."); + } + } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceUserMock.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceUserMock.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceUserMock.java 2009-12-22 18:09:31 UTC (rev 148) @@ -64,7 +64,7 @@ } @Override - public List<Company> getCompanies() throws SuiviObsmerException { + public List<Company> getCompanies(boolean activeOnly) throws SuiviObsmerException { List<Company> results = new ArrayList<Company>(); results.add(getIfremer()); results.add(getTartanpion()); Modified: trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo =================================================================== (Binary files differ) Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/SuiviObsmerGlobalTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/SuiviObsmerGlobalTest.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/SuiviObsmerGlobalTest.java 2009-12-22 18:09:31 UTC (rev 148) @@ -88,7 +88,7 @@ ServiceUser serviceUser = new ServiceUserImpl(); - List<Company> companies = serviceUser.getCompanies(); + List<Company> companies = serviceUser.getCompanies(false); assertEquals(1, companies.size()); Company company = companies.get(0); Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/base/GenericSelectModel.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/base/GenericSelectModel.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/base/GenericSelectModel.java 2009-12-22 18:09:31 UTC (rev 148) @@ -18,16 +18,16 @@ * <http://www.gnu.org/licenses/gpl-3.0.html>. * ##%* */ - package fr.ifremer.suiviobsmer.ui.base; +import fr.ifremer.suiviobsmer.ui.base.*; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.tapestry5.OptionGroupModel; import org.apache.tapestry5.OptionModel; -import org.apache.tapestry5.annotations.Log; +import org.apache.tapestry5.ValueEncoder; import org.apache.tapestry5.internal.OptionGroupModelImpl; import org.apache.tapestry5.internal.OptionModelImpl; import org.apache.tapestry5.ioc.annotations.Inject; @@ -42,6 +42,7 @@ * Based on IdSelectModel from <http://jumpstart.doublenegative.com.au:8080/jumpstart/examples/select/easyid> * A generic selection model whose value is the id of the chosen object, not the object itself. * + * @param <T> * @author fdesbois * @version $Revision: 3 $ * @@ -50,116 +51,115 @@ */ public class GenericSelectModel<T> extends AbstractSelectModel { - private List<T> list; - private Map<String, List<T>> map; - private PropertyAdapter labelFieldAdapter; - private PropertyAdapter idFieldAdapter; + private List<T> list; + private Map<String, List<T>> map; + private PropertyAdapter labelFieldAdapter; + private PropertyAdapter idFieldAdapter; + + @Inject + private Logger log; - @Inject - private Logger log; + /** + * @param list the list of objects you want modeled in a Select component. These objects MUST implement + * equals(Object obj) and hashCode(). If the objects are JPA entities, ensure their implementations of + * equals(Object obj) and hashCode() return the same thing for different instances of the same detached + * entity. + * @param clazz the class of objects in the list. + * @param labelField the name of the field you want displayed as the label in the selection list, eg. "name". + * @param idField the name of the field which is the unique identifier of each object in the list, eg. "id". This is + * used in the value property of the Select component. + * @param access Declare a PropertyAccess injected into your page (eg. Inject private PropertyAccess _access) then pass it in here. + * + */ + public GenericSelectModel(List<T> list, Class<T> clazz, String labelField, String idField, PropertyAccess access) { + init(clazz, labelField, idField, access); - /** - * @param list the list of objects you want modeled in a Select component. These objects MUST implement - * equals(Object obj) and hashCode(). If the objects are JPA entities, ensure their implementations of - * equals(Object obj) and hashCode() return the same thing for different instances of the same detached - * entity. - * @param clazz the class of objects in the list. - * @param labelField the name of the field you want displayed as the label in the selection list, eg. "name". - * @param idField the name of the field which is the unique identifier of each object in the list, eg. "id". This is - * used in the value property of the Select component. - * @param access Declare a PropertyAccess injected into your page (eg. Inject private PropertyAccess _access) then pass it in here. - * - */ - public GenericSelectModel(List<T> list, Class<T> clazz, String labelField, String idField, PropertyAccess access) { - init(clazz, labelField, idField, access); + this.list = list; + } - this.list = list; - } + public GenericSelectModel(Map<String, List<T>> map, Class<T> clazz, String labelField, String idField, PropertyAccess access) { + init(clazz, labelField, idField, access); - public GenericSelectModel(Map<String, List<T>> map, Class<T> clazz, String labelField, String idField, PropertyAccess access) { - init(clazz, labelField, idField, access); + this.map = map; + } - this.map = map; - } + private void init(Class<T> clazz, String labelField, String idField, PropertyAccess access) { + if (clazz == null) { + throw new IllegalArgumentException("clazz is required."); + } + if (idField == null) { + throw new IllegalArgumentException("idField is required."); + } + if (labelField == null) { + throw new IllegalArgumentException("labelField is required."); + } - private void init(Class<T> clazz, String labelField, String idField, PropertyAccess access) { - if (clazz == null) { - throw new IllegalArgumentException("clazz is required."); - } - if (idField == null) { - throw new IllegalArgumentException("idField is required."); - } - if (labelField == null) { - throw new IllegalArgumentException("labelField is required."); - } + this.idFieldAdapter = access.getAdapter(clazz).getPropertyAdapter(idField); + this.labelFieldAdapter = access.getAdapter(clazz).getPropertyAdapter(labelField); - this.idFieldAdapter = access.getAdapter(clazz).getPropertyAdapter(idField); - this.labelFieldAdapter = access.getAdapter(clazz).getPropertyAdapter(labelField); + if (idFieldAdapter == null) { + throw new IllegalArgumentException("idField " + idField + " does not exist in class " + clazz + "."); + } + if (labelFieldAdapter == null) { + throw new IllegalArgumentException("labelField " + idField + " does not exist in class " + clazz + "."); + } + } - if (idFieldAdapter == null) { - throw new IllegalArgumentException("idField " + idField + " does not exist in class " + clazz + "."); - } - if (labelFieldAdapter == null) { - throw new IllegalArgumentException("labelField " + idField + " does not exist in class " + clazz + "."); - } + @Override + public List<OptionGroupModel> getOptionGroups() { + if (list != null) { + return null; } + List<OptionGroupModel> optionGroupModelList = new ArrayList<OptionGroupModel>(); + for (String key : map.keySet()) { + optionGroupModelList.add(new OptionGroupModelImpl(key, false, getOptions(map.get(key)))); + } + return optionGroupModelList; + } - @Override - public List<OptionGroupModel> getOptionGroups() { - if (list != null) { - return null; - } - List<OptionGroupModel> optionGroupModelList = new ArrayList<OptionGroupModel>(); - for (String key : map.keySet()) { - optionGroupModelList.add(new OptionGroupModelImpl(key, false, getOptions(map.get(key)))); - } - return optionGroupModelList; - } + @Override + public List<OptionModel> getOptions() { + if (map != null) { + return null; + } + return getOptions(list); + } - @Override - public List<OptionModel> getOptions() { - if (map != null) { - return null; - } - return getOptions(list); - } + private List<OptionModel> getOptions(List<T> list) { + List<OptionModel> optionModelList = new ArrayList<OptionModel>(); + for (T obj : list) { + optionModelList.add(new OptionModelImpl(nvl(labelFieldAdapter.get(obj)), idFieldAdapter.get(obj))); + } + return optionModelList; + } - private List<OptionModel> getOptions(List<T> list) { - List<OptionModel> optionModelList = new ArrayList<OptionModel>(); - for (T obj : list) { - optionModelList.add(new OptionModelImpl(nvl(labelFieldAdapter.get(obj)), idFieldAdapter.get(obj))); + public List<T> getList() { + List<T> results; + if (map != null) { + results = new ArrayList<T>(); + for (String key : map.keySet()) { + results.addAll(map.get(key)); } - return optionModelList; + } else { + results = list; } + return results; + } - public List<T> getList() { - List<T> results; - if (map != null) { - results = new ArrayList<T>(); - for (String key : map.keySet()) { - results.addAll(map.get(key)); + public T findObject(String id) { + if (id != null) { + for (T current : getList()) { + Object currentId = idFieldAdapter.get(current); + if (currentId.equals(id)) { + return current; } - } else { - results = list; } - return results; } - - public T findObject(String id) { - if (id != null) { - for (T current : getList()) { - Object currentId = idFieldAdapter.get(current); - if (currentId.equals(id)) { - return current; - } - } - } - return null; - } + return null; + } - private String nvl(Object o) { - return o == null ? "" : o.toString(); - } - + private String nvl(Object o) { + return o == null ? "" : o.toString(); + } } Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Administration.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Administration.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Administration.java 2009-12-22 18:09:31 UTC (rev 148) @@ -158,7 +158,7 @@ if (log.isInfoEnabled()) { log.info("BUSINESS REQUEST [getCompanies]"); } - companies = serviceUser.getCompanies(); + companies = serviceUser.getCompanies(false); } catch(SuiviObsmerException eee) { // errors } Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java 2009-12-22 18:09:31 UTC (rev 148) @@ -32,6 +32,7 @@ import fr.ifremer.suiviobsmer.entity.ElligibleBoat; import fr.ifremer.suiviobsmer.entity.FishingZone; import fr.ifremer.suiviobsmer.entity.Profession; +import fr.ifremer.suiviobsmer.entity.Program; import fr.ifremer.suiviobsmer.entity.SampleRow; import fr.ifremer.suiviobsmer.entity.User; import fr.ifremer.suiviobsmer.services.ServiceBoat; @@ -442,6 +443,10 @@ public boolean canCreateNewContactFromList() throws SuiviObsmerException { if (!user.getAdmin() && isSampleRowExists()) { + Program program = getSampleRow().getProgram(); + if (program.isFinished()) { + return false; + } return boat.canCreateContact(user.getCompany()); } return false; @@ -527,7 +532,7 @@ if (log.isDebugEnabled()) { log.debug("BUSINESS REQUEST [getCompanies]"); } - List<Company> companies = serviceUser.getCompanies(); + List<Company> companies = serviceUser.getCompanies(true); companySelectModel = new GenericSelectModel<Company>(companies,Company.class, "name","topiaId",propertyAccess); } @@ -569,7 +574,11 @@ } public boolean canCreateNewContactFromElligibleBoat() throws SuiviObsmerException { - if (!user.getAdmin() && !isElligibleBoatCompanyActiveFalse()) { + if (!user.getAdmin() && !isElligibleBoatCompanyActiveFalse()) { + Program program = elligibleBoat.getSampleRow().getProgram(); + if (program.isFinished()) { + return false; + } Boat boat = getBoatInfos().getBoat(); return boat.canCreateContact(user.getCompany()); } Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.java 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.java 2009-12-22 18:09:31 UTC (rev 148) @@ -21,7 +21,10 @@ package fr.ifremer.suiviobsmer.ui.pages; +import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException; import fr.ifremer.suiviobsmer.SuiviObsmerException; +import fr.ifremer.suiviobsmer.entity.Boat; +import fr.ifremer.suiviobsmer.entity.Company; import fr.ifremer.suiviobsmer.entity.FishingZone; import fr.ifremer.suiviobsmer.entity.Profession; import fr.ifremer.suiviobsmer.entity.ProfessionImpl; @@ -29,6 +32,7 @@ import fr.ifremer.suiviobsmer.entity.ProgramImpl; import fr.ifremer.suiviobsmer.entity.SampleMonth; import fr.ifremer.suiviobsmer.entity.SampleRow; +import fr.ifremer.suiviobsmer.entity.User; import fr.ifremer.suiviobsmer.services.ServiceBoat; import fr.ifremer.suiviobsmer.services.ServiceReferential; import fr.ifremer.suiviobsmer.services.ServiceSampling; @@ -49,10 +53,12 @@ import org.apache.tapestry5.annotations.Log; import org.apache.tapestry5.annotations.Persist; import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.annotations.SessionState; import org.apache.tapestry5.beaneditor.BeanModel; import org.apache.tapestry5.corelib.components.Form; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.services.PropertyAccess; +import org.apache.tapestry5.runtime.Component; import org.apache.tapestry5.services.BeanModelSource; import org.nuiton.util.DateUtils; import org.nuiton.util.PeriodDates; @@ -92,6 +98,10 @@ @Inject private ServiceBoat serviceBoat; + @SessionState + @Property + private User user; + @Inject private PropertyAccess propertyAccess; @@ -109,27 +119,32 @@ void setupRender() throws SuiviObsmerException { // load models for select - professionSelectModel = null; - getProfessionSelectModel(); +// professionSelectModel = null; +// getProfessionSelectModel(); // programSelectModel = null; // getProgramSelectModel(); - fishingZoneSelectModel = null; - getFishingZoneSelectModel(); +// fishingZoneSelectModel = null; +// getFishingZoneSelectModel(); // load main sampleRow (use of sampleRowId in url) sampleRow = null; getSampleRow(); + + professionId = null; + sampleRowForm.clearErrors(); if (!isCreateMode()) { programId = getSampleRow().getProgram().getTopiaId(); + } else { + programId = null; } - // initialize companyId if exist for companySelect -// Company company = getSampleRow().getCompany(); -// if (company != null) { -// companyId = company.getTopiaId(); -// } -// immatriculations = getSampleRow().getMainElligibleBoatsAsString(); + Company company = getSampleRow().getCompany(); + if (company != null) { + companyId = company.getTopiaId(); + } + + immatriculations = getSampleRow().getMainElligibleBoatsAsString(); // Initialize fishingZones, programPeriod and sampleMonths for edition // fishingZones = null; // getFishingZones(); @@ -141,21 +156,32 @@ /*************************** PROFESSION ***********************************/ + /** Select model which contains all professions **/ @Persist private GenericSelectModel<Profession> professionSelectModel; + /** The current selected professionId **/ + @Property + private String professionId; + + /** Bean model source to create the BeanModel for profession **/ @Inject private BeanModelSource beanModelSource; + /** Component resources needed to create the BeanModel for profession **/ @Inject private ComponentResources resources; - @Property - private String professionId; - + /** Field codeDCF5 for validation : must be provided **/ // @InjectComponent -// private Zone professionZone; +// private BeanEditor professionEditor; + /** + * Get SelectModel for profession input Select. The select contains all existing professions. + * + * @return a GenericSelectModel<Profession> + * @throws SuiviObsmerException + */ public GenericSelectModel<Profession> getProfessionSelectModel() throws SuiviObsmerException { if (professionSelectModel == null) { if (log.isInfoEnabled()) { @@ -168,57 +194,61 @@ return professionSelectModel; } + /** + * Get the Profession model for BeanDisplay component. + * + * @return a BeanModel<Profession> + */ public BeanModel<Profession> getProfessionModel() { return beanModelSource.createDisplayModel(Profession.class, resources.getMessages()); } -// void onSelectedFromSearchProfession() throws SuiviObsmerException { -// if (log.isDebugEnabled()) { -// log.debug("professionId : " + professionId); -// } -// Profession professionSelected = getProfessionSelectModel().findObject(professionId); -// sampleRow.setProfession(professionSelected); -// } - + /** + * Action on submit : addNewProfession. Used to set a new profession from the selected one. + * + * @throws SuiviObsmerException + */ void onSelectedFromAddNewProfession() throws SuiviObsmerException { Profession profession = new ProfessionImpl(); - if (!StringUtils.isEmpty(professionId)) { - profession = getProfessionSelectModel().findObject(professionId); + if (!StringUtils.isEmpty(professionId)) { + Profession professionSelected = getProfessionSelectModel().findObject(professionId); if (log.isDebugEnabled()) { - log.debug("Add new profession from : " + profession); + log.debug("Add new profession from : " + professionSelected); } - // TODO add this method in Business to copy attributes from the profession in - // argument to a new one - //serviceSampling.getNewProfession(profession); + profession = serviceSampling.getNewProfession(professionSelected); } getSampleRow().setProfession(profession); edited = true; } -// Block onSuccessFromProfessionForm() throws SuiviObsmerException { -// return professionZone.getBody(); -// } - /*************************** FISHING ZONE *********************************/ + /** Select model for the FishingZone list **/ @Persist private GenericSelectModel<FishingZone> fishingZoneSelectModel; + /** Current fishingZone id selected **/ @Property private String fishingZoneId; -// @InjectComponent -// private Zone fishingZoneZone; - + /** Current fishingZone for loop **/ @Property private FishingZone fishingZone; - //@Persist - private List<FishingZone> fishingZones; - + /** Current index in the loop **/ @Property private int indexFishingZone; + /** Field fishingZone for validation : must have at least one fishingZone **/ + @InjectComponent + private Field fishingZoneSelect; + + /** + * Get the select model for FishingZone. The select contains all existing fishingZones. + * + * @return a GenericSelectModel<FishingZone> + * @throws SuiviObsmerException + */ public GenericSelectModel<FishingZone> getFishingZoneSelectModel() throws SuiviObsmerException { if (fishingZoneSelectModel == null) { if (log.isInfoEnabled()) { @@ -231,13 +261,21 @@ return fishingZoneSelectModel; } + /** + * Get the list of FishingZones from the SampleRow. + * + * @return a List of FishingZone linked with the SampleRow + * @throws SuiviObsmerException + */ public List<FishingZone> getFishingZones() throws SuiviObsmerException { - if (fishingZones == null) { - fishingZones = getSampleRow().getFishingZone(); - } - return fishingZones; + return getSampleRow().getFishingZone(); } + /** + * Action on submit : addFishingZone. Used to add the selected fishingZone to the SampleRow. + * + * @throws SuiviObsmerException + */ void onSelectedFromAddFishingZone() throws SuiviObsmerException { fishingZone = getFishingZoneSelectModel().findObject(fishingZoneId); if (!getFishingZones().contains(fishingZone)) { @@ -249,6 +287,12 @@ edited = true; } + /** + * Action on submit : removeFishingZone. Used to remove the fishingZone from the SampleRow. + * + * @param index of the FishingZone in the list (from loop component) + * @throws SuiviObsmerException + */ void onSelectedFromRemoveFishingZone(int index) throws SuiviObsmerException { if (log.isDebugEnabled()) { log.debug("Remove fishingZone at position : " + index); @@ -257,13 +301,6 @@ edited = true; } -// Block onSuccessFromFishingZoneForm() { -// if (!edited) { -// sampleRow.setFishingZone(fishingZones); -// } -// return fishingZoneZone.getBody(); -// } - /*************************** PROGRAM & MONTHS *****************************/ @Persist @@ -275,19 +312,11 @@ @Property private String programId; -// @InjectComponent -// private Zone periodZone; - - /** Program to saved **/ - private Program program; - @Property private Date month; - //@Persist private PeriodDates period; - //@Persist private List<SampleMonth> sampleMonths; @Property @@ -299,6 +328,9 @@ @InjectComponent private Field programPeriodEnd; + @InjectComponent + private Field program; + private boolean programChanged; public GenericSelectModel<Program> getProgramSelectModel() throws SuiviObsmerException { @@ -326,11 +358,6 @@ Date begin = getProgram().getPeriodBegin(); Date end = getProgram().getPeriodEnd(); period = new PeriodDates(begin, end); -// if (begin != null && end != null) { -// period = new PeriodDates(begin, end); -// } else { -// period = new PeriodDates(); -// } } return period; } @@ -354,28 +381,29 @@ } /** - * Search a program from the list. + * Search a program from the list. * The program will be set from the one selected. If no selection, a new one will be set. * @throws SuiviObsmerException */ void onSelectedFromSearchProgram() throws SuiviObsmerException { - program = new ProgramImpl(); + Program sampleRowProgram = new ProgramImpl(); if (!StringUtils.isEmpty(programId)) { - program = getProgramSelectModel().findObject(programId); - } - // Period will be reinitialized from program params - //getSampleRow().setProgram(program); + sampleRowProgram = getProgramSelectModel().findObject(programId); + programName = null; + period = null; + sampleMonths = null; + // Period will be reinitialized from program params + getSampleRow().setProgram(sampleRowProgram); + // Update sampleRowCode from program + if (isCreateMode()) { + String rowCode = sampleRowProgram.getNewSampleRowCode(); + getSampleRow().setCode(rowCode); + } - // SampleMonths ?? - - //programName = null; - // Reset period to get the one from selected program - //period = null; - // Reset sampleMonths for new period - //sampleMonths = null; - //saveProgramAndSampleMonths(); - programChanged = true; + validateProgram(); + } + edited = true; } /** @@ -384,66 +412,71 @@ * The period dates will be saved in program (validation will be done in onSuccess). * @throws SuiviObsmerException */ + @Log void onSelectedFromRefreshMonths() throws SuiviObsmerException { + Program sampleRowProgram = null; if (!StringUtils.isEmpty(programName)) { // New program - program = new ProgramImpl(); - program.setName(programName); - //getSampleRow().setProgram(program); - //programId = null; + sampleRowProgram = new ProgramImpl(); + sampleRowProgram.setName(programName); + getSampleRow().setProgram(sampleRowProgram); + programId = null; } else { - program = getSampleRow().getProgram(); + sampleRowProgram = getSampleRow().getProgram(); } - program.setPeriodBegin(period.getFromDate()); - program.setPeriodEnd(period.getThruDate()); - - // SampleMonths ?? + sampleRowProgram.setPeriodBegin(period.getFromDate()); + sampleRowProgram.setPeriodEnd(period.getThruDate()); - // Reset sampleMonths cause of period modification - //sampleMonths = null; - //saveProgramAndSampleMonths(); - programChanged = true; + // Update sampleRowCode from program + if (isCreateMode()) { + String rowCode = sampleRowProgram.getNewSampleRowCode(); + getSampleRow().setCode(rowCode); + } + validateProgram(); + edited = true; } -// private void saveProgramAndSampleMonths() throws SuiviObsmerException { -// // New program -// if (!getSampleRow().hasSampleMonthRealTideTime()) { -// // Name not empty : suppress programId for select -// if (!StringUtils.isEmpty(programName)) { -// programId = null; -// } -// -// Program currentProgram = getSampleRow().getProgram(); -// // Name changed : init new program with current periodBegin and periodEnd -// if (!StringUtils.isEmpty(programName) && !programName.equals(currentProgram.getName())) { -// program = new ProgramImpl(); -// program.setName(programName); -// // ProgramId not empty in select : find program with id in selectModel -// } else if (!StringUtils.isEmpty(programId)) { -// program = getProgramSelectModel().findObject(programId); -// // Nor programId neither programName : reinit program object -// } else { -// program = new ProgramImpl(); -// } -// // Set program to session with sampleRow -// getSampleRow().setProgram(program); -// } -// // Save sampleMonth -// if (sampleMonths != null) { -// getSampleRow().setSampleMonth(sampleMonths); -// } -//// if (!edited) { -//// // Save period dates -//// program = getSampleRow().getProgram(); -//// program.setPeriodBegin(period.getFromDate()); -//// program.setPeriodEnd(period.getThruDate()); -//// } -//// -//// return periodZone.getBody(); -// } + @Log + protected boolean validateProgram() throws SuiviObsmerException { + sampleRowForm.clearErrors(); + if (StringUtils.isEmpty(getProgram().getName())) { + sampleRowForm.recordError(program, + "Vous devez choisir un programme existant ou en créer un nouveau"); + } + Date periodBegin = getProgram().getPeriodBegin(); + Date periodEnd = getProgram().getPeriodEnd(); + // Validation for period dates + if (periodBegin == null) { + sampleRowForm.recordError(programPeriodBegin, + "Vous ne pouvez pas rafraîchir les mois avec une date de début de programme vide"); + } + if (periodEnd == null) { + sampleRowForm.recordError(programPeriodEnd, + "Vous ne pouvez pas rafraîchir les mois avec une date de fin de programme vide"); + } + + if (periodBegin != null && periodEnd != null) { + + int size = getSampleMonths().size(); + + SampleMonth firstMonth = getSampleMonths().get(0); + SampleMonth lastMonth = getSampleMonths().get(size-1); + + Date firstDate = DateUtils.createDate( + 1, firstMonth.getPeriodMonth(), firstMonth.getPeriodYear()); + + if (periodBegin.after(firstDate) && firstMonth.getRealTidesValue() != 0) { + sampleRowForm.recordError(programPeriodBegin, + "Vous ne pouvez pas réduire la période du programme. " + + "Il existe des enregistrements de marées réels."); + } + } + return !sampleRowForm.getHasErrors(); + } + /*************************** SAMPLE ROW ***********************************/ private String sampleRowId; @@ -451,20 +484,24 @@ @Persist private SampleRow sampleRow; + private BeanModel<SampleRow> sampleRowModel; + @InjectComponent private Form sampleRowForm; -// @Property -// private String updateComment; -// -// @Property -// private String immatriculations; -// -// @Property -// private String companyId; -// -// private GenericSelectModel<Company> companySelectModel; + @Property + private String updateComment; + @Property + private String immatriculations; + + @Property + private String companyId; + + private GenericSelectModel<Company> companySelectModel; + + private boolean cancel; + public SampleRow getSampleRow() throws SuiviObsmerException { if (sampleRow == null) { if (!StringUtils.isEmpty(sampleRowId)) { @@ -479,85 +516,83 @@ return sampleRow; } -// public GenericSelectModel<Company> getCompanySelectModel() throws SuiviObsmerException { -// if (companySelectModel == null) { -// if (log.isInfoEnabled()) { -// log.info("BUSINESS REQUEST [getCompanies]"); -// } -// List<Company> companies = serviceUser.getCompanies(); -// companySelectModel = new GenericSelectModel<Company>(companies, Company.class, -// "name", "topiaId", propertyAccess); -// } -// return companySelectModel; -// } + public BeanModel<SampleRow> getSampleRowModel() { + if (sampleRowModel == null) { + sampleRowModel = beanModelSource.createEditModel(SampleRow.class, resources.getMessages()); + sampleRowModel.add("company", null); + sampleRowModel.add("boats", null); + sampleRowModel.include("code", "company", "nbObservants", "averageTideTime", "boats", "comment"); + } + return sampleRowModel; + } + public GenericSelectModel<Company> getCompanySelectModel() throws SuiviObsmerException { + if (companySelectModel == null) { + if (log.isInfoEnabled()) { + log.info("BUSINESS REQUEST [getCompanies]"); + } + List<Company> companies = serviceUser.getCompanies(true); + companySelectModel = new GenericSelectModel<Company>(companies, Company.class, + "name", "topiaId", propertyAccess); + } + return companySelectModel; + } + public boolean isCreateMode() throws SuiviObsmerException { return StringUtils.isEmpty(getSampleRow().getTopiaId()); } void onSelectedFromCancelSave() { - edited = true; + cancel = true; } @Log Object onSuccessFromSampleRowForm() throws SuiviObsmerException { - sampleRowForm.clearErrors(); - if (programChanged) { - String programTopiaId = program.getTopiaId(); - // Reinitialize programId for select if it's not the current one - if (programTopiaId != null && !programTopiaId.equals(programId)) { - programId = null; - // Reinitialize programName, period and sampleMonths if it's the one selected - } else { - programName = null; - period = null; - sampleMonths = null; - } + if (cancel) { + return this; + } + if (!edited) { + if (validateProgram()) { + sampleRowForm.clearErrors(); + Profession profession = getSampleRow().getProfession(); + if (StringUtils.isEmpty(profession.getCodeDCF5())) { + sampleRowForm.recordError( + "Le métier doit obligatoirement avoir un Code DCF niveau 5"); + } + int nbZones = getSampleRow().sizeFishingZone(); + if (nbZones == 0) { + sampleRowForm.recordError(fishingZoneSelect, + "Vous devez ajouter au moins une zone de pêche à la ligne"); + } + if (sampleRowForm.getHasErrors()) { + return sampleRowForm; + } - Date periodBegin = program.getPeriodBegin(); - Date periodEnd = program.getPeriodEnd(); + // Save company + Company company = getCompanySelectModel().findObject(companyId); + getSampleRow().setCompany(company); - // Validation for period dates - if (periodBegin == null) { - sampleRowForm.recordError(programPeriodBegin, - "Vous ne pouvez pas rafraîchir les mois avec une date de début de programme vide"); - } - if (periodEnd == null) { - sampleRowForm.recordError(programPeriodEnd, - "Vous ne pouvez pas rafraîchir les mois avec une date de fin de programme vide"); - } + // Save sampleMonths + getSampleRow().setSampleMonth(getSampleMonths()); - if (periodBegin != null && periodEnd != null) { + try { + List<Boat> boats = serviceBoat.getBoats(immatriculations); - int size = getSampleMonths().size(); + serviceSampling.createUpdateSampleRow(sampleRow, boats); - SampleMonth firstMonth = getSampleMonths().get(0); - SampleMonth lastMonth = getSampleMonths().get(size-1); - - Date firstDate = DateUtils.createDate( - 1, firstMonth.getPeriodMonth(), firstMonth.getPeriodYear()); - - if (periodBegin.after(firstDate) && firstMonth.getRealTidesValue() != 0) { - sampleRowForm.recordError(programPeriodBegin, - "Vous ne pouvez pas réduire la période du programme. " + - "Il existe des enregistrements de marées réels."); + return SamplingPlan.class; + } catch (SuiviObsmerBusinessException eee) { + sampleRowForm.recordError(eee.getMessage()); + log.error("BUSINESS ERROR : " + eee.getType() + " depuis " + eee.getServiceName()); } } - - if (!sampleRowForm.getHasErrors()) { - // Save program - getSampleRow().setProgram(program); - // Save sampleMonths - //getSampleRow().setSampleMonth(sampleMonths); - } - } else if (!edited) { //sampleRow.setFishingZone(fishingZones); USEFUL ? // Save period dates //program = getSampleRow().getProgram(); //program.setPeriodBegin(period.getFromDate()); //program.setPeriodEnd(period.getThruDate()); - return null; + //return null; // Company company = getCompanySelectModel().findObject(companyId); // getSampleRow().setCompany(company); // @@ -569,6 +604,18 @@ } else { // Reinitialize professionId for select to avoid selection from existing Profession professionId = null; + +// String programTopiaId = program.getTopiaId(); +// // Reinitialize programId for select if it's not the current one +// if (programTopiaId != null && !programTopiaId.equals(programId)) { +// programId = null; +// } + // Reinitialize programName, period and sampleMonths if it's the one selected +// } else { +// programName = null; +// period = null; +// sampleMonths = null; +// } } return sampleRowForm; } Modified: trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.properties =================================================================== --- trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.properties 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.properties 2009-12-22 18:09:31 UTC (rev 148) @@ -1,6 +1,6 @@ # FOR PROFESSION PART professionSelect-label: Code m\u00E9tier -codeDCF5-label: Code DCF Niv. 5 +codeDCF5-label: Code DCF Niv. 5* meshSize-label: Maillage (mm) size-label: Taille (mm) other-label: Autre information @@ -9,15 +9,19 @@ # FOR FISHING-ZONE PART fishingZoneSelect-label: Code zone de p\u00EAche -fishingZoneInfos-label: Autre information +fishingZonesInfos-label: Autre information # FOR PROGRAM/PERIOD PART program-label: Programme -programPeriod-label: P\u00E9riode +programPeriodBegin-label: P\u00E9riode # OTHER +code-label: Code de la ligne company-label: Soci\u00E9t\u00E9 boats-label: Navires elligibles nbObservants-label: Nombre d'observateurs averageTideTime-label: Dur\u00E9e moyenne d'une mar\u00E9e -comment-label: Commentaire \ No newline at end of file +comment-label: Commentaire sur la ligne + +# FORM +errors-banner: La ligne n'a pas \u00E9t\u00E9 sauvegard\u00E9 \u00E0 cause des erreurs suivantes : \ No newline at end of file Modified: trunk/suiviobsmer-ui/src/main/webapp/Boats.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/Boats.tml 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-ui/src/main/webapp/Boats.tml 2009-12-22 18:09:31 UTC (rev 148) @@ -198,7 +198,7 @@ </fieldset>--> <t:if t:test="companyBoatInfos.lastContact"> <fieldset id="so-boats-boat-infos-shipowner"> - <legend>Dernier contact avec le navire</legend> + <legend>Dernier contact avec le navire pour votre société</legend> <div t:type="beandisplay" t:id="boatInfosLastContact" t:object="companyBoatInfos.lastContact" t:include="topiaCreateDate, state" t:add="createdBy, sampleRowCode"> <p:createdBy> @@ -237,7 +237,7 @@ <p> <form t:type="form" t:id="CalculateBoardings" t:zone="so-boats-boat-infos"> <t:label t:for="fromDate"/> : - <input t:type="datefield" t:id="fromDate" value="boardingFromDate" /> + <input t:type="datefield" t:id="fromDate" class="width70" value="boardingFromDate" /> <input t:type="submit" class="ico refresh" t:id="refreshBoardings" value="Refresh" title="Recalculer les embarquements"/> </form> </p> @@ -259,6 +259,9 @@ <a t:type="actionlink" t:id="addNewContactFromSampleRow" t:context="elligibleBoat.sampleRow.code"> <img src="${asset:context:}/img/contact-22px.png" title="Créer un nouveau contact pour ce navire et cette ligne du plan"/> </a> + <p:else> + <img src="${asset:context:}/img/contact-unavailable-22px.png" title="Création d'un nouveau contact impossible"/> + </p:else> </t:if> </li> </ul> Modified: trunk/suiviobsmer-ui/src/main/webapp/Contacts.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/Contacts.tml 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-ui/src/main/webapp/Contacts.tml 2009-12-22 18:09:31 UTC (rev 148) @@ -53,8 +53,16 @@ </p:nbObservantsCell> <p:mammalsCell> <t:if t:test="editionMode"> - <input t:type="checkbox" value="contact.mammalsObservation" title="Observations de mammifères"/> - <input t:type="checkbox" value="contact.mammalsCapture" title="Capture de mammifères" /> + <input t:type="checkbox" t:id="mammalsObservation" value="contact.mammalsObservation"/> + <t:label t:for="mammalsObservation"> + <img src="${asset:context:}/img/eye-22px.png" alt="Observations de mammifères" + title="Observations de mammifères" /> + </t:label> + <input t:type="checkbox" t:id="mammalsCapture" value="contact.mammalsCapture" /> + <t:label t:for="mammalsCapture"> + <img src="${asset:context:}/img/fishing-net-22px.png" alt="Capture de mammifères" + title="Capture de mammifères" /> + </t:label> <p:else> <!--t:booleanImage t:value="contact.mammalsObservation" t:trueTitle="Observations de mammifères" t:falseTitle="Aucune observation faites" /> @@ -85,7 +93,7 @@ </p:dataInputDateCell> <p:commentCell> <t:if t:test="editionMode"> - <input t:type="textarea" t:id="comment" cols="20" rows="2" value="contact.comment" /> + <input t:type="textarea" t:id="comment" cols="15" rows="2" value="contact.comment" /> <p:else> ${contact.comment} </p:else> Modified: trunk/suiviobsmer-ui/src/main/webapp/SampleRowForm.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/SampleRowForm.tml 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-ui/src/main/webapp/SampleRowForm.tml 2009-12-22 18:09:31 UTC (rev 148) @@ -2,12 +2,9 @@ <t:layout t:pageTitle="Modification d'une ligne du plan" t:contentId="so-samplerow-form" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> - <t:zone t:id="globalZone"><!--t:update="show"--> + <t:zone t:id="globalZone" t:update="show"> <form t:type="form" t:id="sampleRowForm" t:zone="globalZone"> - <p> LIGNE DU PLAN : ${sampleRow.code} </p> - <t:errors /> - <!-- PROFESSION --> <fieldset> <legend>Métier</legend> @@ -21,8 +18,8 @@ <t:label t:for="professionSelect" /> : <input t:type="select" t:id="professionSelect" t:model="professionSelectModel" t:value="professionId" /> - <input t:type="submit" class="ico add" - t:id="addNewProfession" value="Ajouter un nouveau métier" /> + <input t:type="submit" class="ico add" t:id="addNewProfession" value="Add" + title="Créer un nouveau métier à partir de celui sélectionné"/> </div> <div class="t-beaneditor"> <t:beaneditor t:id="professionEditor" t:object="sampleRow.profession" @@ -45,7 +42,7 @@ <p:else> <!-- EDITION --> <div class="select"> - <t:label t:for="fishingZoneSelect" /> : + <t:label t:for="fishingZoneSelect" />* : <input t:type="select" t:id="fishingZoneSelect" t:model="fishingZoneSelectModel" t:value="fishingZoneId" /> <input t:type="submit" class="ico add" t:id="addFishingZone" value="Add" @@ -79,7 +76,7 @@ <p:else> <!-- EDITION PROGRAM --> <div class="select"> - <t:label t:for="program"/> : + <t:label t:for="program"/>* : <input t:type="select" t:id="program" t:model="programSelectModel" value="programId" /> <input t:type="submit" class="ico search" t:id="searchProgram" value="Search" title="Afficher les détails du programme"/> @@ -90,7 +87,7 @@ </div> <!-- EDITION PROGRAM PERIOD --> <div class="select"> - <t:label t:for="programPeriodBegin"/> : + <t:label t:for="programPeriodBegin"/>* : du <input t:type="datefield" t:id="programPeriodBegin" value="period.fromDate" /> jusqu'au <input t:type="datefield" t:id="programPeriodEnd" value="period.thruDate" /> <input t:type="submit" class="ico refresh" t:id="refreshMonths" value="Refresh" title="Rafraîchir les mois"/> @@ -111,11 +108,51 @@ </table> </div> </fieldset> - - <div class="actions"> - <input t:type="submit" t:id="saveData" class="ico save" value="Save" /> - <input t:type="submit" t:id="cancelSave" class="ico undo" value="Undo" /> - </div> + <!-- OTHER DATA : nbObservants, averageTideTime, company, boats, comment --> + <fieldset id="so-samplerow-form-other"> + <legend>Autres données de la ligne d'échantillonnage</legend> + <div class="t-beaneditor"> + <t:beaneditor t:id="sampleRowEditor" t:object="sampleRow" t:model="sampleRowModel"> + <p:code> + <label>${message:code-label}</label> + <!--${sampleRow.code}--> + <t:if t:test="sampleRow.code"> + <strong>${sampleRow.code}</strong> + <p:else> + <span class="code-missing"> + Date de début du programme manquante pour générer le code de la ligne ! + </span> + </p:else> + </t:if> + </p:code> + <p:company> + <t:label t:for="company" /> + <input t:type="select" t:id="company" t:model="companySelectModel" value="companyId" /> + </p:company> + <p:boats> + <t:label t:for="boats" /> + <input t:type="textarea" t:id="boats" cols="40" rows="2" value="immatriculations" /> + </p:boats> + <p:comment> + <t:label t:for="comment" /> + <input t:type="textarea" t:id="comment" cols="40" rows="3" value="sampleRow.comment" /> + </p:comment> + </t:beaneditor> + </div> + </fieldset> + <fieldset class="clearfix"> + <t:errors t:banner="message:errors-banner"/> + <p><label>Enregistrement fait par : </label>${user.fullName}</p> + <t:unless t:test="createMode"> + <p><label>Commentaire sur la modification* :</label></p> + <p><input t:type="textarea" t:id="updateComment" cols="50" rows="5" value="updateComment"/></p> + </t:unless> + <div class="fright"> + <input t:type="submit" t:id="saveData" class="ico save" value="Save" title="Enregistrer les modifications" /> + <input t:type="submit" t:id="cancelSave" class="ico undo" value="Undo" title="Annuler les modifications" /> + </div> + </fieldset> + </form> </t:zone> Modified: trunk/suiviobsmer-ui/src/main/webapp/css/contacts.css =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/css/contacts.css 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-ui/src/main/webapp/css/contacts.css 2009-12-22 18:09:31 UTC (rev 148) @@ -50,7 +50,7 @@ div#so-contacts table.t-data-grid thead tr th.dataInputDate, div#so-contacts table.t-data-grid thead tr th.tideEndDate, div#so-contacts table.t-data-grid thead tr th.tideBeginDate { - width: 120px; + /*width: 120px;*/ white-space: normal; text-align: center; } @@ -70,6 +70,10 @@ width: 90px; } +div#so-contacts table.t-data-grid tbody tr td { + white-space: nowrap; +} + td.validation, td.mammals, /* TEMP */ div#so-contacts table.t-data-grid tbody td.validation, div#so-contacts table.t-data-grid tbody td.mammals { Modified: trunk/suiviobsmer-ui/src/main/webapp/css/sampling.css =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/css/sampling.css 2009-12-22 11:58:16 UTC (rev 147) +++ trunk/suiviobsmer-ui/src/main/webapp/css/sampling.css 2009-12-22 18:09:31 UTC (rev 148) @@ -3,7 +3,7 @@ Created on : 10 nov. 2009, 14:31:28 Author : fdesbois Description: - Stylesheet for SamplingPlan page + Stylesheet for SamplingPlan and SampleRowForm pages */ div#so-sampling { @@ -157,19 +157,42 @@ margin-right: auto; } -div#so-samplerow-form legend { - font-weight: bold; +div#so-samplerow-form div.t-error { + margin: 5px auto; + font-size: 0.8em; } +div#so-samplerow-form div.t-error li { + margin-left: 20px; +} + +div#so-samplerow-form fieldset { + margin-bottom: 10px; + padding: 8px; +} + +/*div#so-samplerow-form legend { + font-weight: bold; +}*/ + + div#so-samplerow-form div.select { width: 100%; text-align: center; margin: 5px; color: #007CC2; - font-weight: bold; } -div#so-samplerow-form fieldset.user-form { +div#so-samplerow-form label { + color: #007CC2; +} + +div#so-samplerow-form div.t-beaneditor { + background-color: transparent; + border: 0px; +} + +/*div#so-samplerow-form fieldset.user-form { width: 100%; } @@ -178,43 +201,31 @@ border: 0px; } -div#so-samplerow-form div.formPart { - width: 70%; - margin-left: auto; - margin-right: auto; - margin-bottom: 10px; -} - -/*div#so-samplerow-form-fishingzone { - width: 70%; - margin-left: auto; - margin-right: auto; - margin-bottom: 10px; -}*/ - div#so-samplerow-form-fishingzone div.fishingzone-row { width: 400px; -} - -/*div#so-samplerow-form-period { - width: 70%; - margin-left: auto; - margin-right: auto; - margin-bottom: 10px; }*/ -div#so-samplerow-form-period table#so-samplerow-form-months { +#so-samplerow-form-months { margin: 10px; } -div#so-samplerow-form-period table#so-samplerow-form-months tr.firstRow { +#so-samplerow-form-months tr.firstRow { background-color: #19A28D; color: white; border: 2px outset blue; font-size: 0.8em; } -div#so-samplerow-form-period table#so-samplerow-form-months tr.firstRow td { +#so-samplerow-form-months tr.firstRow td { padding: 3px; text-align: center; } + +#so-samplerow-form-other input.t-number { + width: 50px; +} + +#so-samplerow-form-other span.code-missing { + font-size: 0.8em; + color: red; +} Added: trunk/suiviobsmer-ui/src/main/webapp/img/contact-unavailable-22px.png =================================================================== (Binary files differ) Property changes on: trunk/suiviobsmer-ui/src/main/webapp/img/contact-unavailable-22px.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream
participants (1)
-
fdesbois@users.labs.libre-entreprise.org