[Suiviobsmer-commits] r197 - in trunk/suiviobsmer-ui/src/main: java/fr/ifremer/suiviobsmer/ui/base java/fr/ifremer/suiviobsmer/ui/pages webapp webapp/css
Author: fdesbois Date: 2010-01-14 18:05:59 +0000 (Thu, 14 Jan 2010) New Revision: 197 Added: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/base/AbstractFilteredPage.java Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Synthesis.java trunk/suiviobsmer-ui/src/main/webapp/Synthesis.tml trunk/suiviobsmer-ui/src/main/webapp/css/main.css Log: Add abstractFilteredPage for Contacts and Synthesis (not tested yet) Added: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/base/AbstractFilteredPage.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/base/AbstractFilteredPage.java (rev 0) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/base/AbstractFilteredPage.java 2010-01-14 18:05:59 UTC (rev 197) @@ -0,0 +1,154 @@ + +package fr.ifremer.suiviobsmer.ui.base; + +import fr.ifremer.suiviobsmer.SuiviObsmerException; +import fr.ifremer.suiviobsmer.bean.BoatFilter; +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; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang.StringUtils; +import org.apache.tapestry5.OptionModel; +import org.apache.tapestry5.SelectModel; +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.corelib.components.Zone; +import org.apache.tapestry5.internal.OptionModelImpl; +import org.apache.tapestry5.internal.SelectModelImpl; +import org.apache.tapestry5.ioc.annotations.Inject; +import org.apache.tapestry5.ioc.services.PropertyAccess; +import org.slf4j.Logger; + +/** + * AbstractFilteredPage + * + * Created: 14 janv. 2010 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public abstract class AbstractFilteredPage { + + @Inject + private Logger log; + + @SessionState + @Property + private User user; + + @Inject + private PropertyAccess propertyAccess; + + @Inject + private ServiceReferential serviceReferential; + + @Inject + private ServiceSampling serviceSampling; + + @Inject + private ServiceBoat serviceBoat; + + @Persist + private GenericSelectModel<SampleRow> sampleRowSelectModel; + + @Property + private String sampleRowId; + + @Persist + private SelectModel facadeSelectModel; + + @Persist + private SelectModel sectorSelectModel; + + void setupRender() throws SuiviObsmerException { + facadeSelectModel = null; + getFacadeSelectModel(); + sectorSelectModel = null; + getSectorSelectModel(); + sampleRowSelectModel = null; + getSampleRowSelectModel(); + } + + public SelectModel getFacadeSelectModel() throws SuiviObsmerException { + if (facadeSelectModel == null) { + if (log.isInfoEnabled()) { + log.info("BUSINESS REQUEST [getFacades]"); + } + List<OptionModel> options = new ArrayList<OptionModel>(); + for (String facadeName : serviceReferential.getFacades()) { + options.add(new OptionModelImpl(facadeName,facadeName)); + } + facadeSelectModel = new SelectModelImpl(null, options); + } + return facadeSelectModel; + } + + public SelectModel getSectorSelectModel() throws SuiviObsmerException { + if (sectorSelectModel == null) { + if (log.isInfoEnabled()) { + log.info("BUSINESS REQUEST [getSectors]"); + } + List<OptionModel> options = new ArrayList<OptionModel>(); + for (String sectorName : serviceReferential.getSectors(getFilter().getFacadeName())) { + options.add(new OptionModelImpl(sectorName,sectorName)); + } + sectorSelectModel = new SelectModelImpl(null, options); + } + return sectorSelectModel; + } + + public GenericSelectModel<SampleRow> getSampleRowSelectModel() throws SuiviObsmerException { + if (sampleRowSelectModel == null) { + if (log.isInfoEnabled()) { + log.info("BUSINESS REQUEST [getSampleRowsForUser]"); + } + List<SampleRow> sampleRows = serviceSampling.getSampleRowsForUser(user); + sampleRowSelectModel = new GenericSelectModel<SampleRow>(sampleRows, SampleRow.class, + "code", "topiaId", propertyAccess); + } + return sampleRowSelectModel; + } + + public String[] onProvideCompletionsFromBoatName(String input) throws SuiviObsmerException { + if (log.isInfoEnabled()) { + log.info("BUSINESS REQUEST [getBoatNamesStartWith]"); + } + List<String> results = serviceBoat.getBoatNamesStartWith(input); + return results.toArray(new String[0]); + } + + protected abstract BoatFilter getFilter() throws SuiviObsmerException; + + protected abstract void resetFilter(); + + protected abstract Zone getFilterZone(); + + @Log + public Object onChangeFromFacadeName(String value) throws SuiviObsmerException { + if (!StringUtils.isEmpty(value.trim())) { + // Reset filter to avoid strange behavior (cause of no form submit) + resetFilter();// = null; + // set facadeName selected in filter + getFilter().setFacadeName(value); + // Reset sectors to use facadeName selected + sectorSelectModel = null; + return getFilterZone().getBody(); + } + return null; + } + + @Log + public void onPrepareForSubmit() throws SuiviObsmerException { + SampleRow row = getSampleRowSelectModel().findObject(sampleRowId); + getFilter().setSampleRow(row); + } + +} Property changes on: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/base/AbstractFilteredPage.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java 2010-01-14 18:04:42 UTC (rev 196) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java 2010-01-14 18:05:59 UTC (rev 197) @@ -24,6 +24,7 @@ import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException; import fr.ifremer.suiviobsmer.SuiviObsmerContext; import fr.ifremer.suiviobsmer.SuiviObsmerException; +import fr.ifremer.suiviobsmer.bean.BoatFilter; import fr.ifremer.suiviobsmer.bean.ContactFilter; import fr.ifremer.suiviobsmer.bean.ContactFilterImpl; import fr.ifremer.suiviobsmer.bean.ContactState; @@ -36,6 +37,7 @@ import fr.ifremer.suiviobsmer.services.ServiceContact; import fr.ifremer.suiviobsmer.services.ServiceReferential; import fr.ifremer.suiviobsmer.services.ServiceSampling; +import fr.ifremer.suiviobsmer.ui.base.AbstractFilteredPage; import fr.ifremer.suiviobsmer.ui.data.BusinessUtils; import fr.ifremer.suiviobsmer.ui.base.GenericSelectModel; import fr.ifremer.suiviobsmer.ui.base.SuiviObsmerPage; @@ -86,7 +88,7 @@ * par : $Author$ */ @IncludeStylesheet("context:css/contacts.css") -public class Contacts implements SuiviObsmerPage { +public class Contacts extends AbstractFilteredPage implements SuiviObsmerPage { @Override public boolean isOnlyForAdmin() { @@ -132,22 +134,22 @@ @InjectComponent private Zone importExportZone; - @Persist - private GenericSelectModel<SampleRow> sampleRowSelectModel; +// @Persist +// private GenericSelectModel<SampleRow> sampleRowSelectModel; +// +// @Property +// private String sampleRowId; +// +// @Inject +// private ServiceReferential serviceReferential; +// +// @Persist +// private SelectModel facadeSelectModel; +// +// @Persist +// private SelectModel sectorSelectModel; @Property - private String sampleRowId; - - @Inject - private ServiceReferential serviceReferential; - - @Persist - private SelectModel facadeSelectModel; - - @Persist - private SelectModel sectorSelectModel; - - @Property @Persist("flash") private boolean filtersVisible; @@ -163,54 +165,69 @@ return contactFilter; } - public SelectModel getFacadeSelectModel() throws SuiviObsmerException { - if (facadeSelectModel == null) { - if (log.isInfoEnabled()) { - log.info("BUSINESS REQUEST [getFacades]"); - } - List<OptionModel> options = new ArrayList<OptionModel>(); - for (String facadeName : serviceReferential.getFacades()) { - options.add(new OptionModelImpl(facadeName,facadeName)); - } - facadeSelectModel = new SelectModelImpl(null, options); - } - return facadeSelectModel; + @Override + protected BoatFilter getFilter() throws SuiviObsmerException { + return getContactFilter(); } - public SelectModel getSectorSelectModel() throws SuiviObsmerException { - if (sectorSelectModel == null) { - if (log.isInfoEnabled()) { - log.info("BUSINESS REQUEST [getSectors]"); - } - List<OptionModel> options = new ArrayList<OptionModel>(); - for (String sectorName : serviceReferential.getSectors(getContactFilter().getFacadeName())) { - options.add(new OptionModelImpl(sectorName,sectorName)); - } - sectorSelectModel = new SelectModelImpl(null, options); - } - return sectorSelectModel; + @Override + protected void resetFilter() { + contactFilter = null; } - public GenericSelectModel<SampleRow> getSampleRowSelectModel() throws SuiviObsmerException { - if (sampleRowSelectModel == null) { - if (log.isInfoEnabled()) { - log.info("BUSINESS REQUEST [getSampleRowsForUser]"); - } - List<SampleRow> sampleRows = serviceSampling.getSampleRowsForUser(user); - sampleRowSelectModel = new GenericSelectModel<SampleRow>(sampleRows, SampleRow.class, - "code", "topiaId", propertyAccess); - } - return sampleRowSelectModel; + @Override + protected Zone getFilterZone() { + return filtersZone; } - String[] onProvideCompletionsFromBoatName(String input) throws SuiviObsmerException { - if (log.isInfoEnabled()) { - log.info("BUSINESS REQUEST [getBoatNamesStartWith]"); - } - List<String> results = serviceBoat.getBoatNamesStartWith(input); - return results.toArray(new String[0]); - } +// public SelectModel getFacadeSelectModel() throws SuiviObsmerException { +// if (facadeSelectModel == null) { +// if (log.isInfoEnabled()) { +// log.info("BUSINESS REQUEST [getFacades]"); +// } +// List<OptionModel> options = new ArrayList<OptionModel>(); +// for (String facadeName : serviceReferential.getFacades()) { +// options.add(new OptionModelImpl(facadeName,facadeName)); +// } +// facadeSelectModel = new SelectModelImpl(null, options); +// } +// return facadeSelectModel; +// } +// public SelectModel getSectorSelectModel() throws SuiviObsmerException { +// if (sectorSelectModel == null) { +// if (log.isInfoEnabled()) { +// log.info("BUSINESS REQUEST [getSectors]"); +// } +// List<OptionModel> options = new ArrayList<OptionModel>(); +// for (String sectorName : serviceReferential.getSectors(getContactFilter().getFacadeName())) { +// options.add(new OptionModelImpl(sectorName,sectorName)); +// } +// sectorSelectModel = new SelectModelImpl(null, options); +// } +// return sectorSelectModel; +// } +// +// public GenericSelectModel<SampleRow> getSampleRowSelectModel() throws SuiviObsmerException { +// if (sampleRowSelectModel == null) { +// if (log.isInfoEnabled()) { +// log.info("BUSINESS REQUEST [getSampleRowsForUser]"); +// } +// List<SampleRow> sampleRows = serviceSampling.getSampleRowsForUser(user); +// sampleRowSelectModel = new GenericSelectModel<SampleRow>(sampleRows, SampleRow.class, +// "code", "topiaId", propertyAccess); +// } +// return sampleRowSelectModel; +// } + +// String[] onProvideCompletionsFromBoatName(String input) throws SuiviObsmerException { +// if (log.isInfoEnabled()) { +// log.info("BUSINESS REQUEST [getBoatNamesStartWith]"); +// } +// List<String> results = serviceBoat.getBoatNamesStartWith(input); +// return results.toArray(new String[0]); +// } + void onSuccessFromSearchBoat() { } @@ -224,19 +241,19 @@ return importExportZone.getBody(); } - @Log - public Object onChangeFromFacadeName(String value) throws SuiviObsmerException { - if (!StringUtils.isEmpty(value.trim())) { - // Reset contactFilter to avoid strange behavior (cause of no form submit) - contactFilter = null; - // set facadeName selected in contactFilter - getContactFilter().setFacadeName(value); - // Reset sectors to use facadeName selected - sectorSelectModel = null; - return filtersZone.getBody(); - } - return null; - } +// @Log +// public Object onChangeFromFacadeName(String value) throws SuiviObsmerException { +// if (!StringUtils.isEmpty(value.trim())) { +// // Reset contactFilter to avoid strange behavior (cause of no form submit) +// contactFilter = null; +// // set facadeName selected in contactFilter +// getContactFilter().setFacadeName(value); +// // Reset sectors to use facadeName selected +// sectorSelectModel = null; +// return filtersZone.getBody(); +// } +// return null; +// } void onSelectedFromReset() { reset = true; Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Synthesis.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Synthesis.java 2010-01-14 18:04:42 UTC (rev 196) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Synthesis.java 2010-01-14 18:05:59 UTC (rev 197) @@ -22,7 +22,11 @@ package fr.ifremer.suiviobsmer.ui.pages; import fr.ifremer.suiviobsmer.SuiviObsmerException; +import fr.ifremer.suiviobsmer.bean.BoatFilter; +import fr.ifremer.suiviobsmer.bean.BoatFilterImpl; +import fr.ifremer.suiviobsmer.entity.User; import fr.ifremer.suiviobsmer.services.ServiceSynthesis; +import fr.ifremer.suiviobsmer.ui.base.AbstractFilteredPage; import fr.ifremer.suiviobsmer.ui.base.SuiviObsmerPage; import fr.ifremer.suiviobsmer.ui.data.ChartUtils; import fr.ifremer.suiviobsmer.ui.data.ChartUtils.ChartType; @@ -32,7 +36,11 @@ import java.util.Map; import java.util.SortedMap; import org.apache.tapestry5.annotations.IncludeStylesheet; +import org.apache.tapestry5.annotations.InjectComponent; import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.annotations.SessionState; +import org.apache.tapestry5.corelib.components.Zone; import org.apache.tapestry5.ioc.annotations.Inject; import org.jfree.chart.JFreeChart; import org.nuiton.util.PeriodDates; @@ -50,7 +58,7 @@ * par : $Author$ */ @IncludeStylesheet("context:css/synthesis.css") -public class Synthesis implements SuiviObsmerPage { +public class Synthesis extends AbstractFilteredPage implements SuiviObsmerPage { @Override public boolean isOnlyForAdmin() { @@ -63,20 +71,58 @@ @Inject private Logger log; + @SessionState + @Property + private User user; + + void setupRender() { + + } + /********************* DYNAMICAL GRAPH : DATASAMPLING *********************/ + + @Persist + private BoatFilter dataSamplingFilter; + @InjectComponent + private Zone dataSamplingFiltersZone; + @Persist private ChartType dataSamplingChartType; + private boolean reset; + + @Override + protected BoatFilter getFilter() throws SuiviObsmerException { + if (dataSamplingFilter == null) { + dataSamplingFilter = new BoatFilterImpl(); + if (!user.getAdmin()) { + dataSamplingFilter.setCompany(user.getCompany()); + } + PeriodDates period = PeriodDates.createMonthsPeriodFromToday(-12); + if (log.isDebugEnabled()) { + log.debug("Period : " + period); + } + dataSamplingFilter.setPeriod(period); + } + return dataSamplingFilter; + } + + @Override + protected void resetFilter() { + dataSamplingFilter = null; + } + + @Override + protected Zone getFilterZone() { + return dataSamplingFiltersZone; + } + public JFreeChart getDataSamplingChart() throws SuiviObsmerException { if (log.isInfoEnabled()) { log.info("BUSINESS REQUEST [getDataSampling]"); - } - PeriodDates period = PeriodDates.createMonthsPeriodFromToday(-12); - if (log.isDebugEnabled()) { - log.debug("Period : " + period); - } - List<SortedMap<Date, Integer>> res = serviceSynthesis.getDataSampling(period); + } + List<SortedMap<Date, Integer>> res = serviceSynthesis.getDataSampling(getFilter()); Map<String, SortedMap<Date, Integer>> data = new HashMap<String, SortedMap<Date, Integer>>(); data.put("Données prévus", res.get(0)); data.put("Données réels", res.get(1)); @@ -106,5 +152,14 @@ this.dataSamplingChartType = ChartType.LINE; } + void onSelectedFromReset() { + reset = true; + } + + void onSuccessFromFiltersForm() { + if (reset) { + resetFilter(); + } + } } Modified: trunk/suiviobsmer-ui/src/main/webapp/Synthesis.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/Synthesis.tml 2010-01-14 18:04:42 UTC (rev 196) +++ trunk/suiviobsmer-ui/src/main/webapp/Synthesis.tml 2010-01-14 18:05:59 UTC (rev 197) @@ -2,7 +2,7 @@ <t:layout t:pageTitle="Synthèse et indicateurs" t:contentId="so-synthesis" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> - <div class="clearfix" id="so-synthesis-indicators"> +<!-- <div class="clearfix" id="so-synthesis-indicators"> <div class="indicator fleft"> <p class="title"> <span t:type="ck/Tooltip" title="Description" t:effect="appear" @@ -32,7 +32,7 @@ <p class="number">MAYFLOWERS (18)</p> </div> - </div> + </div>--> <!-- <div class="graph"> <img src="${asset:context:}/tmp/graph1.png" alt="graphe"/> <p class="description">Proin eu molestie dolor. Aliquam eget ultrices lorem. Phasellus molestie iaculis eleifend. @@ -43,10 +43,53 @@ sed rutrum libero. </p> </div>--> - <p> - <a t:type="actionlink" t:id="setDataSamplingChartBarType">BAR</a> - <a t:type="actionlink" t:id="setDataSamplingChartAreaType">AREA</a> - <a t:type="actionlink" t:id="setDataSamplingChartLineType">LINE</a> - </p> - <t:chart t:width="550" t:height="400" t:chart="dataSamplingChart" /> + <div class="acenter"> + <fieldset> + <legend>Recherche avancée</legend> + <div class="so-filters-form"> + <div t:type="zone" t:id="dataSamplingFiltersZone" t:update="show" id="so-datasampling-filters"> + <form t:type="form" t:id="filtersForm"> + <t:errors /> + <div class="t-beaneditor"> + <div> + <t:label t:for="boatName" />: + <input t:type="textfield" t:id="boatName" class="width50" t:value="dataSamplingFilter.boatName" t:mixins="Autocomplete" /> + <t:label t:for="boatImmatriculation" />: + <input t:type="textfield" t:id="boatImmatriculation" class="width50" t:value="dataSamplingFilter.boatImmatriculation" /> + <t:label t:for="boatDistrictCode" />: + <input t:type="textfield" t:id="boatDistrictCode" class="width50" t:value="dataSamplingFilter.boatDistrictCode" /> + <t:label t:for="facadeName" />: + <select t:type="select" t:id="facadeName" t:model="facadeSelectModel" value="dataSamplingFilter.facadeName" + t:mixins="zoneUpdater" t:event="change" t:zone="so-contacts-filters"/> + <t:label t:for="sectorName" />: + <select t:type="select" t:id="sectorName" t:model="sectorSelectModel" value="dataSamplingFilter.sectorName" /> + <t:label t:for="sampleRow" />: + <input t:type="select" t:id="sampleRow" t:model="sampleRowSelectModel" value="sampleRowId" /> +<!-- <t:if t:test="user.admin"> + <t:label t:for="program" />: + <input t:type="select" t:id="program" t:model="programSelectModel" value="dataSamplingFilter.programName" /> + </t:if> + <t:label t:for="observer" />: + <input t:type="select" t:id="observer" t:model="observerSelectModel" value="observerId" /> + <t:if t:test="user.admin"> + <t:label t:for="company" />: + <input t:type="select" t:id="company" t:model="companySelectModel" value="companyId" /> + </t:if>--> + </div><p> </p> + <div class="t-beaneditor-row aright"> + <input t:type="submit" class="ico search-32px" t:id="search" value="Search" /> + <input t:type="submit" class="ico undo" t:id="reset" value="Reset" /> + </div> + </div> + </form> + </div> + </div> + </fieldset> + <p> + <a t:type="actionlink" t:id="setDataSamplingChartBarType">BAR</a> + <a t:type="actionlink" t:id="setDataSamplingChartAreaType">AREA</a> + <a t:type="actionlink" t:id="setDataSamplingChartLineType">LINE</a> + </p> + <t:chart t:width="550" t:height="350" t:chart="dataSamplingChart" /> + </div> </t:layout> Modified: trunk/suiviobsmer-ui/src/main/webapp/css/main.css =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/css/main.css 2010-01-14 18:04:42 UTC (rev 196) +++ trunk/suiviobsmer-ui/src/main/webapp/css/main.css 2010-01-14 18:05:59 UTC (rev 197) @@ -140,6 +140,7 @@ div#so-footer { margin-top: 20px; + margin-bottom: 20px; width: 100%; text-align: center; font-size: 0.8em;
participants (1)
-
fdesbois@users.labs.libre-entreprise.org