[Suiviobsmer-commits] r628 - in trunk/wao-ui/src/main: java/fr/ifremer/wao/ui/base java/fr/ifremer/wao/ui/data java/fr/ifremer/wao/ui/pages webapp webapp/css
Author: fdesbois Date: 2010-07-24 18:10:31 +0000 (Sat, 24 Jul 2010) New Revision: 628 Log: Evo #2369 : - Add filters in Cartography page (with automatic refresh) Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/base/AbstractFilteredPage.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/FiltersModel.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Cartography.java trunk/wao-ui/src/main/webapp/Cartography.tml trunk/wao-ui/src/main/webapp/css/cartography.css trunk/wao-ui/src/main/webapp/css/common.css Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/base/AbstractFilteredPage.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/base/AbstractFilteredPage.java 2010-07-24 18:09:59 UTC (rev 627) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/base/AbstractFilteredPage.java 2010-07-24 18:10:31 UTC (rev 628) @@ -35,6 +35,7 @@ import fr.ifremer.wao.service.ServiceReferential; import fr.ifremer.wao.service.ServiceSampling; import fr.ifremer.wao.service.ServiceUser; +import fr.ifremer.wao.ui.data.FiltersModel; import fr.ifremer.wao.ui.data.GenericSelectModel; import org.apache.tapestry5.OptionModel; import org.apache.tapestry5.SelectModel; @@ -82,7 +83,9 @@ * </pre> * * @author fdesbois <fdesbois at codelutin.com> + * @deprecated since 1.5.1 : too difficult to adapt on each page, use {@link FiltersModel} instead */ + at Deprecated public abstract class AbstractFilteredPage { @Inject Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/FiltersModel.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/FiltersModel.java 2010-07-24 18:09:59 UTC (rev 627) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/data/FiltersModel.java 2010-07-24 18:10:31 UTC (rev 628) @@ -1,15 +1,22 @@ package fr.ifremer.wao.ui.data; -import fr.ifremer.wao.bean.ContactFilter; +import fr.ifremer.wao.WaoException; +import fr.ifremer.wao.bean.SamplingFilter; import fr.ifremer.wao.bean.UserFilter; import fr.ifremer.wao.bean.WaoFilter; import fr.ifremer.wao.entity.Company; +import fr.ifremer.wao.entity.SampleRow; +import fr.ifremer.wao.service.ServiceSampling; import fr.ifremer.wao.service.ServiceUser; -import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.OptionModel; +import org.apache.tapestry5.SelectModel; +import org.apache.tapestry5.internal.OptionModelImpl; +import org.apache.tapestry5.internal.SelectModelImpl; import org.apache.tapestry5.ioc.services.PropertyAccess; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.List; /** @@ -27,18 +34,29 @@ private ServiceUser serviceUser; + private ServiceSampling serviceSampling; + /** MODELS */ private GenericSelectModel<Company> companySelectModel; + private SelectModel programSelectModel; + + private GenericSelectModel<SampleRow> sampleRowSelectModel; + /** DATA */ private F filter; - public FiltersModel(F filter, PropertyAccess propertyAccess) { + private boolean companyActive; - this.filter = filter; + public FiltersModel(PropertyAccess propertyAccess) { this.propertyAccess = propertyAccess; } + public FiltersModel(PropertyAccess propertyAccess, F filter) { + this(propertyAccess); + this.filter = filter; + } + /** * ServiceUser is used for filters : COMPANY. * @@ -49,14 +67,30 @@ } /** + * ServiceSampling is used for filters : PROGRAM_NAME, SAMPLE_ROW. + * + * @param serviceSampling ServiceSampling to set + */ + public void setServiceSampling(ServiceSampling serviceSampling) { + this.serviceSampling = serviceSampling; + } + + public void setCompanyActive(boolean companyActive) { + this.companyActive = companyActive; + } + + public void update(F filter) { + this.filter = filter; + } + + /** * Retrieve Company SelectModel to used in page. * - * @param activeOnly Will retrieve only activate companies * @return the GenericSelectModel for Company * @throws IllegalStateException if ServiceUser is not defined * @see ServiceUser#getCompanies(boolean) */ - public GenericSelectModel<Company> getCompanySelectModel(boolean activeOnly) + public GenericSelectModel<Company> getCompanySelectModel() throws IllegalStateException { if (serviceUser == null) { @@ -64,7 +98,7 @@ } if (companySelectModel == null) { - List<Company> companies = serviceUser.getCompanies(activeOnly); + List<Company> companies = serviceUser.getCompanies(companyActive); companySelectModel = new GenericSelectModel<Company>( companies, Company.class, @@ -85,17 +119,122 @@ * @param companyId Id of the company to set * @throws IllegalStateException if Company SelectModel is not defined */ - public void setCompany(String companyId) throws IllegalStateException { - + public void setCompanyId(String companyId) throws IllegalStateException { if (companySelectModel == null) { throw new IllegalStateException("Company selectModel not found !"); } - Company company = companySelectModel.findObject(companyId); getUserFilter().setCompany(company); } + public String getCompanyId() { + String companyId = null; + if (getUserFilter().getCompany() != null) { + companyId = getUserFilter().getCompany().getTopiaId(); + } + return companyId; + } + /** + * Update company with {@code companyId}. Will reset dependent selects + * (PROGRAM_NAME, SAMPLE_ROW). + * + * @param companyId Company id to set + */ + public void updateCompany(String companyId) { + setCompanyId(companyId); + + // Reset filter dependencies on company, on next load company filtered will be used + programSelectModel = null; + sampleRowSelectModel = null; + } + + /** + * Get select model for sampleRow program. Depends on company set in + * filter. + * + * @return the SelectModel for program names + */ + public SelectModel getProgramSelectModel() { + + if (serviceSampling == null) { + throw new IllegalStateException("ServiceSampling not exists to retrieve programs"); + } + + if (programSelectModel == null) { + List<OptionModel> options = new ArrayList<OptionModel>(); + for (String programName : serviceSampling.getPrograms(getUserFilter().getCompany())) { + options.add(new OptionModelImpl(programName, programName)); + } + programSelectModel = new SelectModelImpl(null, options); + } + return programSelectModel; + } + + /** + * Update program with {@code programName}. Will reset dependent selects + * (SAMPLE_ROW). + * + * @param programName Name of the program to set + */ + public void updateProgram(String programName) { + getSamplingFilter().setProgramName(programName); + + // Reset filter dependencies on program + sampleRowSelectModel = null; + } + + /** + * Get select model for sampleRows. Depends on filter (Sampling part only). + * The sampleRow set from filter is temporarly extracted to avoid returning + * only one element in the select. + * + * @return the GenericSelectModel<SampleRow> for sampleRows + * @throws WaoException + */ + public GenericSelectModel<SampleRow> getSampleRowSelectModel() { + + if (serviceSampling == null) { + throw new IllegalStateException("ServiceSampling not exists to retrieve sampleRows"); + } + + if (sampleRowSelectModel == null) { + // WARN : no use of sampleRow in the filter to retrieve sampleRows + SampleRow rowFiltered = getSamplingFilter().getSampleRow(); + getSamplingFilter().setSampleRow(null); + + List<SampleRow> sampleRows = serviceSampling.getSampleRowsByFilter(getSamplingFilter()); + + getSamplingFilter().setSampleRow(rowFiltered); + + sampleRowSelectModel = new GenericSelectModel<SampleRow>( + sampleRows, + SampleRow.class, + SampleRow.CODE, + SampleRow.TOPIA_ID, + propertyAccess + ); + } + return sampleRowSelectModel; + } + + public void setSampleRowId(String sampleRowId) { + if (sampleRowSelectModel == null) { + throw new IllegalStateException("SampleRow selectModel not found !"); + } + SampleRow sampleRow = sampleRowSelectModel.findObject(sampleRowId); + getSamplingFilter().setSampleRow(sampleRow); + } + + public String getSampleRowId() { + String sampleRowId = null; + if (getSamplingFilter().getSampleRow() != null) { + sampleRowId = getSamplingFilter().getSampleRow().getTopiaId(); + } + return sampleRowId; + } + + /** * Get the filter. * * @return the current filter associated to this model. @@ -105,11 +244,19 @@ } protected UserFilter getUserFilter() { - if (!UserFilter.class.isAssignableFrom(filter.getClass())) { - throw new ClassCastException("UserFilter not assignable from " + + checkAssignableFrom(UserFilter.class); + return (UserFilter)filter; + } + + protected SamplingFilter getSamplingFilter() { + checkAssignableFrom(SamplingFilter.class); + return (SamplingFilter)filter; + } + + private void checkAssignableFrom(Class filterClass) { + if (!filterClass.isAssignableFrom(filter.getClass())) { + throw new ClassCastException("SamplingFilter not assignable from " + filter.getClass().getName()); } - - return (UserFilter)filter; } } Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Cartography.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Cartography.java 2010-07-24 18:09:59 UTC (rev 627) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Cartography.java 2010-07-24 18:10:31 UTC (rev 628) @@ -21,31 +21,30 @@ */ package fr.ifremer.wao.ui.pages; -import fr.ifremer.wao.WaoException; import fr.ifremer.wao.bean.ConnectedUser; import fr.ifremer.wao.bean.ContactFilter; import fr.ifremer.wao.bean.ContactFilterImpl; import fr.ifremer.wao.bean.UserRole; import fr.ifremer.wao.bean.WaoFilter; import fr.ifremer.wao.entity.Company; -import fr.ifremer.wao.service.ServiceCartography; +import fr.ifremer.wao.service.ServiceSampling; import fr.ifremer.wao.service.ServiceUser; import fr.ifremer.wao.ui.data.FiltersModel; -import fr.ifremer.wao.ui.data.GenericSelectModel; import fr.ifremer.wao.ui.data.RequiresAuthentication; -import org.apache.commons.lang.RandomStringUtils; import org.apache.tapestry5.Link; +import org.apache.tapestry5.annotations.InjectComponent; +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.ioc.annotations.Inject; import org.apache.tapestry5.ioc.services.PropertyAccess; -import org.apache.tapestry5.services.ApplicationStateManager; import org.apache.tapestry5.services.PageRenderLinkSource; +import org.nuiton.util.PeriodDates; import org.slf4j.Logger; import java.io.IOException; -import java.util.List; /** * Created: 6 juil. 2010 @@ -72,14 +71,12 @@ @Inject private ServiceUser serviceUser; + @Inject + private ServiceSampling serviceSampling; + private String url; void setupRender() { - // Init filter if needed - initFilter(); - - // Init companyId for select - companyId = getCompany() != null ? getCompany().getTopiaId() : null; } /**************************** FILTERS *************************************/ @@ -90,16 +87,6 @@ @Persist private FiltersModel<ContactFilter> filtersModel; - @Property - private String companyId; - - protected void initFilter() { - if (cartographyFilter == null) { - cartographyFilter = new ContactFilterImpl(); - } - getFiltersModel(); - } - public FiltersModel<ContactFilter> getFiltersModel() { if (filtersModel == null) { @@ -108,35 +95,72 @@ } filtersModel = new FiltersModel<ContactFilter>( - (ContactFilter)cartographyFilter, propertyAccess); + propertyAccess, new ContactFilterImpl()); filtersModel.setServiceUser(serviceUser); + filtersModel.setServiceSampling(serviceSampling); + filtersModel.setCompanyActive(true); // Initialize company if (!user.isAdmin()) { - filtersModel.getFilter().setCompany(user.getCompany()); + getFilter().setCompany(user.getCompany()); } + + // Initialize period + PeriodDates period = PeriodDates.createMonthsPeriodFromToday(-12); + getFilter().setPeriod(period); + + // push in SessionState the filter + cartographyFilter = getFilter(); } return filtersModel; } - public GenericSelectModel<Company> getCompanySelectModel() { - return getFiltersModel().getCompanySelectModel(true); + public ContactFilter getFilter() { + return getFiltersModel().getFilter(); } public Company getCompany() { - return getFiltersModel().getFilter().getCompany(); + return getFilter().getCompany(); } - void onSuccessFromFilters() { + @InjectComponent + private Zone samplingFilterZone; + + @InjectComponent + private Zone sampleRowFilterZone; + + @Property + private boolean refreshSamplingZone; + + @Property + private boolean refreshSampleRowZone; + + @Log + Zone onChangeFromCompany(String companyId) { + getFiltersModel().updateCompany(companyId); + refreshSamplingZone = true; + return samplingFilterZone; + } + + @Log + Zone onChangeFromProgramName(String programName) { + getFiltersModel().updateProgram(programName); + refreshSampleRowZone = true; + return sampleRowFilterZone; + } + + void onSelectedFromReset() { + filtersModel = null; + } + +// void onSuccessFromFilters() { // if (!user.isAdmin()) { // throw new WaoException("Vous n'avez pas les droits nécessaires" + // " pour filtrer sur une société", null); // } +// } - getFiltersModel().setCompany(companyId); - } - /**************************** URL *************************************/ public String getUrl() throws IOException { Modified: trunk/wao-ui/src/main/webapp/Cartography.tml =================================================================== --- trunk/wao-ui/src/main/webapp/Cartography.tml 2010-07-24 18:09:59 UTC (rev 627) +++ trunk/wao-ui/src/main/webapp/Cartography.tml 2010-07-24 18:10:31 UTC (rev 628) @@ -58,14 +58,49 @@ <h1>${pageTitle}</h1> - <t:if t:test="user.admin"> - <div id="so-cartography-filters"> - <form t:type="form" t:id="filters" action="tapestry"> - <p><label for="company">Société</label> : </p> - <p><input t:type="select" t:id="company" t:model="companySelectModel" value="companyId" onchange="this.form.submit();"/></p> - </form> - </div> - </t:if> + + <div id="so-cartography-filters"> + <form t:type="form" t:id="filters" action="tapestry"> + <!-- PERIOD --> + <p class="mtop5">Période : </p> + <p> + <label for="periodBegin">du </label> + <input t:type="datefield" class="width70" t:id="periodBegin" t:value="filter.period.fromDate" t:validate="required"/> + <label for="periodEnd"> au </label> + <input t:type="datefield" class="width70" t:id="periodEnd" t:value="filter.period.thruDate" t:validate="required" /> + </p> + + <t:if t:test="user.admin"> + <!-- COMPANY --> + <p class="mtop5"><label for="company">Société</label> : </p> + <p><input t:type="select" t:id="company" t:model="filtersModel.companySelectModel" value="filtersModel.companyId" + t:mixins="nuiton/zoneUpdater" t:event="change" t:zone="cartography-filters-sampling" /></p> + </t:if> + + <t:zone t:id="samplingFilterZone" id="cartography-filters-sampling" t:update="show"> + <t:nuiton.subForm t:visible="refreshSamplingZone"> + <!-- PROGRAM --> + <p class="mtop5"><label for="programName">Programme</label> : </p> + <p><select t:type="select" t:id="programName" t:model="filtersModel.programSelectModel" value="filter.programName" + t:mixins="nuiton/zoneUpdater" t:event="change" t:zone="cartography-filters-sampleRow" /></p> + + <t:zone t:id="sampleRowFilterZone" id="cartography-filters-sampleRow" t:update="show"> + <t:nuiton.subForm t:visible="refreshSampleRowZone"> + <!-- SAMPLE_ROW --> + <p class="mtop5"><label for="sampleRow">Ligne du plan</label> : </p> + <p><input t:type="select" t:id="sampleRow" t:model="filtersModel.sampleRowSelectModel" value="filtersModel.sampleRowId" /></p> + </t:nuiton.subForm> + </t:zone> + + </t:nuiton.subForm> + </t:zone> + + <p class="mtop5"> + <input t:type="submit" class="ico search" value="Search" t:title="Répartition des contacts sur la carte en fonction des filtres saisis" /> + <input t:type="submit" class="ico undo22px" t:id="reset" value="Reset" title="Remettre les filtres par défaut" /> + </p> + </form> + </div> </div> Modified: trunk/wao-ui/src/main/webapp/css/cartography.css =================================================================== --- trunk/wao-ui/src/main/webapp/css/cartography.css 2010-07-24 18:09:59 UTC (rev 627) +++ trunk/wao-ui/src/main/webapp/css/cartography.css 2010-07-24 18:10:31 UTC (rev 628) @@ -33,7 +33,7 @@ } #so-cartography-border { - width: 220px; + width: 250px; } #so-cartography-border h1 { @@ -52,6 +52,8 @@ #so-cartography-filters { color: white; + margin-left: 10px; + font-size: 0.9em; } #so-cartography-map { Modified: trunk/wao-ui/src/main/webapp/css/common.css =================================================================== --- trunk/wao-ui/src/main/webapp/css/common.css 2010-07-24 18:09:59 UTC (rev 627) +++ trunk/wao-ui/src/main/webapp/css/common.css 2010-07-24 18:10:31 UTC (rev 628) @@ -117,6 +117,10 @@ margin-bottom: 10px; } +.mtop5 { + margin-top: 5px; +} + /* Lien sur une image */ a.img { text-decoration:none; @@ -184,6 +188,8 @@ } input.undo22px { + width: 22px; + height: 22px; background: url(../img/undo-22px.png) no-repeat center center; }
participants (1)
-
fdesbois@users.labs.libre-entreprise.org