Author: echatellier Date: 2013-02-15 12:49:11 +0100 (Fri, 15 Feb 2013) New Revision: 115 Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/115 Log: Merge search page data table will listXXXPage data table (unique definition) use wicket 6.2+ data table export toolbar for csv export Added: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ExtraitsColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/data/ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/data/TableExportToolbar.java Removed: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/CsvWriter.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportablePropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableTextFilteredPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/links/ Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/DataContext.java trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/dao/impl/ProduitDao.java trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/config/ServiceContext.java trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/DocumentService.java trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java trunk/cantharella.utils/src/test/java/nc/ird/module/utils/CaptchaToolsTest.java trunk/cantharella.utils/src/test/java/nc/ird/module/utils/PasswordToolsTest.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/config/WebContext.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/TemplatePage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/columns/TaxonomyPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/campagne/ListCampagnesPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/document/ManageDocumentPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ListExtractionsPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/lot/ListLotsPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/purification/ListPurificationsPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.html trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/specimen/ListSpecimensPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/station/ListStationsPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/testBio/ListTestsBioPage.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/behaviors/MoleculeEditorBehavior.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/behaviors/MoleculeViewBehavior.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/BooleanPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/DecimalPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/EnumPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/LinkPropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/MapValuePropertyColumn.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ShortDatePropertyColumn.java trunk/cantharella.web/src/main/resources/web_en.properties trunk/cantharella.web/src/main/resources/web_fr.properties trunk/cantharella.web/src/main/webapp/css/general.css Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/DataContext.java =================================================================== --- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/DataContext.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/config/DataContext.java 2013-02-15 11:49:11 UTC (rev 115) @@ -40,20 +40,23 @@ import nc.ird.cantharella.data.exceptions.UnexpectedException; import nc.ird.cantharella.data.validation.utils.ModelValidator; import nc.ird.cantharella.data.validation.utils.ModelValidatorImpl; +import nc.ird.module.utils.CantharellaConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.hibernate.SessionFactory; import org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory; import org.hibernate.cfg.Environment; import org.hibernate.dialect.PostgreSQL82Dialect; +import org.nuiton.util.ArgumentsParserException; import org.postgresql.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; import org.springframework.context.support.MessageSourceAccessor; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.orm.hibernate4.HibernateTransactionManager; import org.springframework.orm.hibernate4.LocalSessionFactoryBean; @@ -61,12 +64,6 @@ import com.mchange.v2.c3p0.ComboPooledDataSource; import com.mchange.v2.c3p0.impl.DefaultConnectionTester; -import java.util.logging.Level; -import javax.annotation.Resource; -import nc.ird.module.utils.CantharellaConfig; -import org.nuiton.util.ArgumentsParserException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; /** * Spring context for the data layer Modified: trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/dao/impl/ProduitDao.java =================================================================== --- trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/dao/impl/ProduitDao.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.data/src/main/java/nc/ird/cantharella/data/dao/impl/ProduitDao.java 2013-02-15 11:49:11 UTC (rev 115) @@ -22,12 +22,8 @@ */ package nc.ird.cantharella.data.dao.impl; -import java.util.Collections; - import nc.ird.cantharella.data.dao.AbstractModelDao; -import nc.ird.cantharella.data.model.Molecule; import nc.ird.cantharella.data.model.MoleculeProvenance; -import nc.ird.cantharella.data.model.Produit; import nc.ird.cantharella.data.model.Purification; import nc.ird.cantharella.data.model.ResultatTestBio; Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/config/ServiceContext.java =================================================================== --- trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/config/ServiceContext.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/config/ServiceContext.java 2013-02-15 11:49:11 UTC (rev 115) @@ -32,16 +32,15 @@ import nc.ird.cantharella.service.utils.normalizers.utils.Normalizer; import nc.ird.module.utils.CantharellaConfig; import nc.ird.module.utils.PasswordTools; + import org.nuiton.util.ArgumentsParserException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.ImportResource; import org.springframework.context.support.MessageSourceAccessor; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.context.support.ReloadableResourceBundleMessageSource; Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/DocumentService.java =================================================================== --- trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/DocumentService.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/DocumentService.java 2013-02-15 11:49:11 UTC (rev 115) @@ -29,7 +29,6 @@ import nc.ird.cantharella.data.model.Document; import nc.ird.cantharella.data.model.TypeDocument; import nc.ird.cantharella.data.model.Utilisateur; -import nc.ird.cantharella.service.utils.normalizers.DocumentNormalizer; import nc.ird.cantharella.service.utils.normalizers.TypeDocumentNormalizer; import nc.ird.cantharella.service.utils.normalizers.UniqueFieldNormalizer; import nc.ird.cantharella.service.utils.normalizers.utils.Normalize; Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java =================================================================== --- trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java 2013-02-15 11:49:11 UTC (rev 115) @@ -29,7 +29,6 @@ import nc.ird.cantharella.data.model.Molecule; import nc.ird.cantharella.data.model.MoleculeProvenance; import nc.ird.cantharella.data.model.Utilisateur; -import nc.ird.cantharella.data.model.utils.AbstractModel; import nc.ird.cantharella.service.model.MoleculeProvenanceBean; import nc.ird.cantharella.service.utils.normalizers.MoleculeNormalizer; import nc.ird.cantharella.service.utils.normalizers.utils.Normalize; Modified: trunk/cantharella.utils/src/test/java/nc/ird/module/utils/CaptchaToolsTest.java =================================================================== --- trunk/cantharella.utils/src/test/java/nc/ird/module/utils/CaptchaToolsTest.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.utils/src/test/java/nc/ird/module/utils/CaptchaToolsTest.java 2013-02-15 11:49:11 UTC (rev 115) @@ -22,8 +22,7 @@ */ package nc.ird.module.utils; -import junit.framework.Assert; - +import org.junit.Assert; import org.junit.Test; /** Modified: trunk/cantharella.utils/src/test/java/nc/ird/module/utils/PasswordToolsTest.java =================================================================== --- trunk/cantharella.utils/src/test/java/nc/ird/module/utils/PasswordToolsTest.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.utils/src/test/java/nc/ird/module/utils/PasswordToolsTest.java 2013-02-15 11:49:11 UTC (rev 115) @@ -22,8 +22,7 @@ */ package nc.ird.module.utils; -import junit.framework.Assert; - +import org.junit.Assert; import org.junit.Test; /** Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/config/WebContext.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/config/WebContext.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/config/WebContext.java 2013-02-15 11:49:11 UTC (rev 115) @@ -31,8 +31,8 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import javax.annotation.PostConstruct; +import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.validation.ValidatorFactory; @@ -57,7 +57,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.ImportResource; import org.springframework.context.support.MessageSourceAccessor; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.context.support.ReloadableResourceBundleMessageSource; Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/TemplatePage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/TemplatePage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/TemplatePage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -65,7 +65,6 @@ import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.util.value.ValueMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/columns/TaxonomyPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/columns/TaxonomyPropertyColumn.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/columns/TaxonomyPropertyColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -22,15 +22,11 @@ */ package nc.ird.cantharella.web.pages.columns; -import nc.ird.cantharella.web.utils.columns.CsvWriter; -import nc.ird.cantharella.web.utils.columns.ExportableColumn; - import org.apache.wicket.AttributeModifier; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -39,7 +35,7 @@ * @author Adrien Cheype * @param <T> Type of the row model */ -public class TaxonomyPropertyColumn<T, S> extends PropertyColumn<T, S> implements ExportableColumn<T, S> { +public class TaxonomyPropertyColumn<T, S> extends PropertyColumn<T, S> { /** * Constructor @@ -63,26 +59,8 @@ /** {@inheritDoc} */ @Override public void populateItem(Item<ICellPopulator<T>> item, String componentId, IModel<T> rowModel) { - Label label = new Label(componentId, createLabelModel(rowModel)); + Label label = new Label(componentId, getDataModel(rowModel)); label.add(new AttributeModifier("class", new Model<String>("taxonomy"))); item.add(label); } - - @Override - public String getHeaderName() { - return getDisplayModel().getObject().toString(); - } - - @Override - public void exportCsv(final T object, CsvWriter writer) { - IModel<?> textModel = createLabelModel(new AbstractReadOnlyModel<T>() { - @Override - public T getObject() { - return object; - } - }); - writer.write(textModel.getObject()); - textModel.detach(); - } - } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/campagne/ListCampagnesPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/campagne/ListCampagnesPage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/campagne/ListCampagnesPage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -34,6 +34,7 @@ import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; import nc.ird.cantharella.web.utils.columns.MapValuePropertyColumn; import nc.ird.cantharella.web.utils.columns.ShortDatePropertyColumn; +import nc.ird.cantharella.web.utils.data.TableExportToolbar; import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; import nc.ird.cantharella.web.utils.security.AuthRoles; @@ -139,7 +140,7 @@ final DataTable<Campagne, String> campagnesDataTable = new AjaxFallbackDefaultDataTable<Campagne, String>( "ListCampagnesPage.Campagnes", columns, campagnesDataProvider, WebContext.ROWS_PER_PAGE); - + campagnesDataTable.addBottomToolbar(new TableExportToolbar(campagnesDataTable, "campagnes", getSession().getLocale())); campagnesRefresh.add(campagnesDataTable); } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/document/ManageDocumentPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/document/ManageDocumentPage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/document/ManageDocumentPage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -99,9 +99,6 @@ @SpringBean(name = "webModelValidator") private ModelValidator validator; - /** Entity where document is attached. */ - private DocumentAttachable documentAttachable; - /** Caller page. */ private final CallerPage callerPage; @@ -153,7 +150,6 @@ assert idDocument == null || document == null; this.callerPage = callerPage; this.multipleEntry = multipleEntry; - this.documentAttachable = documentAttachable; final CallerPage currentPage = new CallerPage(this); Added: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ExtraitsColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ExtraitsColumn.java (rev 0) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ExtraitsColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -0,0 +1,119 @@ +/* + * #%L + * Cantharella :: Web + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below) + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package nc.ird.cantharella.web.pages.domain.extraction; + +import java.io.Serializable; +import java.util.List; +import java.util.Locale; + +import nc.ird.cantharella.data.model.Extraction; +import nc.ird.cantharella.data.model.Extrait; +import nc.ird.cantharella.web.utils.behaviors.ReplaceEmptyLabelBehavior; +import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel; +import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; + +import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; +import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.export.IExportableColumn; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; + +/** + * Extraits exportable column displaying 4 first extracts of current extractions. + * + * @author Eric Chatellier + */ +public class ExtraitsColumn extends AbstractColumn<Extraction, String> implements IExportableColumn<Extraction, String, Serializable> { + + /** Nombre d'extraits affichés dans la colonne de résumés des extraits. */ + private static final int MAX_EXTRAITS_DISPLAY = 4; + + /** Locale. */ + protected Locale locale; + + /** + * Constructor. + * + * @param displayModel model used to generate header text + * @param locale locale + */ + public ExtraitsColumn(IModel<String> displayModel, Locale locale) { + super(displayModel); + this.locale = locale; + } + + /** {@inheritDoc} */ + @Override + public void populateItem(Item<ICellPopulator<Extraction>> cellItem, String componentId, IModel<Extraction> rowModel) { + // affiche un résumé des types extraits et des masses, allant jusqu'à MAX_EXTRAITS_DISPLAY extraits + Label extraitsLabel = new Label(componentId, getDataModel(rowModel, true)); + extraitsLabel.setEscapeModelStrings(false); + extraitsLabel.add(new ReplaceEmptyLabelBehavior()); + cellItem.add(extraitsLabel); + } + + /** {@inheritDoc} */ + @Override + public IModel<Serializable> getDataModel(IModel<Extraction> rowModel) { + return getDataModel(rowModel, false); + } + + /** + * Improve data model to support optionnal html formatting. + */ + protected IModel<Serializable> getDataModel(IModel<Extraction> rowModel, final boolean html) { + return new Model<Serializable>(rowModel) { + /** {@inheritDoc} */ + @Override + public String getObject() { + StringBuilder extraitsResume = new StringBuilder(); + List<Extrait> extraits = new PropertyModel<List<Extrait>>(super.getObject(), "sortedExtraits") + .getObject(); + for (int i = 0; i < MAX_EXTRAITS_DISPLAY && i < extraits.size(); i++) { + Extrait curExtrait = extraits.get(i); + if (html) { + extraitsResume.append("<b>"); + } + extraitsResume.append(curExtrait.getTypeExtrait().getInitiales()); + if (html) { + extraitsResume.append("</b>"); + } + extraitsResume.append(" : "); + extraitsResume.append(curExtrait.getMasseObtenue() == null ? ReplaceEmptyLabelBehavior.NULL_PROPERTY + : new DisplayDecimalPropertyModel(curExtrait, "masseObtenue", + DecimalDisplFormat.SMALL, locale).getObject()); + if (i < MAX_EXTRAITS_DISPLAY - 1 && i < extraits.size() - 1) { + extraitsResume.append(", "); + } + if (i == MAX_EXTRAITS_DISPLAY - 1 && i < extraits.size() - 1) { + extraitsResume.append(", ..."); + } + } + return extraitsResume.toString(); + } + }; + } +} Property changes on: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ExtraitsColumn.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ListExtractionsPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ListExtractionsPage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/extraction/ListExtractionsPage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -22,24 +22,21 @@ */ package nc.ird.cantharella.web.pages.domain.extraction; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; import nc.ird.cantharella.data.model.Extraction; -import nc.ird.cantharella.data.model.Extrait; import nc.ird.cantharella.service.services.ExtractionService; import nc.ird.cantharella.web.config.WebContext; import nc.ird.cantharella.web.pages.TemplatePage; import nc.ird.cantharella.web.pages.domain.campagne.ReadCampagnePage; import nc.ird.cantharella.web.pages.domain.lot.ReadLotPage; import nc.ird.cantharella.web.utils.CallerPage; -import nc.ird.cantharella.web.utils.behaviors.ReplaceEmptyLabelBehavior; import nc.ird.cantharella.web.utils.columns.DecimalPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; import nc.ird.cantharella.web.utils.columns.ShortDatePropertyColumn; -import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel; +import nc.ird.cantharella.web.utils.data.TableExportToolbar; import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; @@ -48,7 +45,6 @@ import org.apache.wicket.MarkupContainer; import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; -import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; @@ -58,7 +54,6 @@ import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; /** @@ -73,11 +68,6 @@ private ExtractionService extractionService; /** - * Nombre d'extraits affichés dans la colonne de résumés des extraits - */ - private static int MAX_EXTRAITS_DISPLAY = 4; - - /** * Constructeur */ public ListExtractionsPage() { @@ -97,101 +87,86 @@ final MarkupContainer extractionsRefresh = new WebMarkupContainer(getResource() + ".Extractions.Refresh"); extractionsRefresh.setOutputMarkupId(true); add(extractionsRefresh); - + // Liste des Extractions final List<Extraction> extractions = extractionService.listExtractions(getSession().getUtilisateur()); + + DataTable<Extraction, String> extractionsDataTable = initExtractionsDataTable(this, + "ListExtractionsPage.Extractions", currentPage, extractions, extractionService); + extractionsRefresh.add(extractionsDataTable); + } + + /** + * Init data table with extractions list. + * + * This method is static to be reused in several places. + * + * @param templatePage parent page + * @param componentId data table id + * @param callerPage caller page + * @param extractions extractions list + * @param extractionService extraction service + * @return data table component + */ + public static DataTable<Extraction, String> initExtractionsDataTable(final TemplatePage templatePage, + final String componentId, final CallerPage callerPage, + List<Extraction> extractions, final ExtractionService extractionService) { + LoadableDetachableSortableListDataProvider<Extraction> extractionsDataProvider = new LoadableDetachableSortableListDataProvider<Extraction>( - extractions, getSession().getLocale()); + extractions, templatePage.getSession().getLocale()); List<IColumn<Extraction, String>> columns = new ArrayList<IColumn<Extraction, String>>(); - columns.add(new LinkableImagePropertyColumn<Extraction, String>("images/read.png", getString("Read"), getString("Read")) { + columns.add(new LinkableImagePropertyColumn<Extraction, String>("images/read.png", templatePage.getString("Read"), templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Extraction>> item, String componentId, IModel<Extraction> model) { - setResponsePage(new ReadExtractionPage(model.getObject().getIdExtraction(), currentPage)); + templatePage.setResponsePage(new ReadExtractionPage(model.getObject().getIdExtraction(), callerPage)); } }); - columns.add(new LinkPropertyColumn<Extraction, String>(new Model<String>(getString("Extraction.lot")), "lot", "lot", - getString("Read")) { + columns.add(new LinkPropertyColumn<Extraction, String>(new Model<String>(templatePage.getString("Extraction.lot")), "lot", "lot", + templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Extraction>> item, String componentId, IModel<Extraction> model) { - setResponsePage(new ReadLotPage(model.getObject().getLot().getIdLot(), currentPage)); + templatePage.setResponsePage(new ReadLotPage(model.getObject().getLot().getIdLot(), callerPage)); } }); - columns.add(new LinkPropertyColumn<Extraction, String>(new Model<String>(getString("Extraction.ref")), "ref", "ref", - getString("Read")) { + columns.add(new LinkPropertyColumn<Extraction, String>(new Model<String>(templatePage.getString("Extraction.ref")), "ref", "ref", + templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Extraction>> item, String componentId, IModel<Extraction> model) { - setResponsePage(new ReadExtractionPage(model.getObject().getIdExtraction(), currentPage)); + templatePage.setResponsePage(new ReadExtractionPage(model.getObject().getIdExtraction(), callerPage)); } }); - columns.add(new ShortDatePropertyColumn<Extraction, String>(new Model<String>(getString("Extraction.date")), "date", - "date", getLocale())); + columns.add(new ShortDatePropertyColumn<Extraction, String>(new Model<String>(templatePage.getString("Extraction.date")), "date", + "date", templatePage.getLocale())); - columns.add(new PropertyColumn<Extraction, String>(new Model<String>(getString("Extraction.methode2")), "methode", + columns.add(new PropertyColumn<Extraction, String>(new Model<String>(templatePage.getString("Extraction.methode2")), "methode", "methode")); - columns.add(new DecimalPropertyColumn<Extraction, String>(new Model<String>(getString("Extraction.masseDepart2")), - "masseDepart", "masseDepart", DecimalDisplFormat.SMALL, getLocale())); + columns.add(new DecimalPropertyColumn<Extraction, String>(new Model<String>(templatePage.getString("Extraction.masseDepart2")), + "masseDepart", "masseDepart", DecimalDisplFormat.SMALL, templatePage.getLocale())); - columns.add(new LinkPropertyColumn<Extraction, String>(new Model<String>(getString("Campagne")), "lot.campagne", - "lot.campagne", getString("Read")) { + columns.add(new LinkPropertyColumn<Extraction, String>(new Model<String>(templatePage.getString("Campagne")), "lot.campagne", + "lot.campagne", templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Extraction>> item, String componentId, IModel<Extraction> model) { - setResponsePage(new ReadCampagnePage(model.getObject().getLot().getCampagne().getIdCampagne(), - currentPage)); + templatePage.setResponsePage(new ReadCampagnePage(model.getObject().getLot().getCampagne().getIdCampagne(), + callerPage)); } }); - columns.add(new AbstractColumn<Extraction, String>(new Model<String>(getString("Extraction.extraits"))) { - @Override - public void populateItem(Item<ICellPopulator<Extraction>> cellItem, String componentId, - IModel<Extraction> rowModel) { + columns.add(new ExtraitsColumn(new Model<String>(templatePage.getString("Extraction.extraits")), templatePage.getLocale())); - // affiche un résumé des types extraits et des masses, allant jusqu'à MAX_EXTRAITS_DISPLAY extraits - Label extraitsLabel = new Label(componentId, new Model<Serializable>(rowModel) { - /** {@inheritDoc} */ - @Override - public String getObject() { - StringBuilder extraitsResume = new StringBuilder(); - List<Extrait> extraits = new PropertyModel<List<Extrait>>(super.getObject(), "sortedExtraits") - .getObject(); - for (int i = 0; i < MAX_EXTRAITS_DISPLAY && i < extraits.size(); i++) { - Extrait curExtrait = extraits.get(i); - extraitsResume.append("<b>"); - extraitsResume.append(curExtrait.getTypeExtrait().getInitiales()); - extraitsResume.append("</b>"); - extraitsResume.append(" : "); - extraitsResume.append(curExtrait.getMasseObtenue() == null ? ReplaceEmptyLabelBehavior.NULL_PROPERTY - : new DisplayDecimalPropertyModel(curExtrait, "masseObtenue", - DecimalDisplFormat.SMALL, getLocale()).getObject()); - if (i < MAX_EXTRAITS_DISPLAY - 1 && i < extraits.size() - 1) { - extraitsResume.append(", "); - } - if (i == MAX_EXTRAITS_DISPLAY - 1 && i < extraits.size() - 1) { - extraitsResume.append(", ..."); - } - } - return extraitsResume.toString(); - } - }); - extraitsLabel.setEscapeModelStrings(false); - extraitsLabel.add(new ReplaceEmptyLabelBehavior()); - cellItem.add(extraitsLabel); - } - - }); - - columns.add(new LinkableImagePropertyColumn<Extraction, String>("images/edit.png", getString("Update"), - getString("Update")) { + columns.add(new LinkableImagePropertyColumn<Extraction, String>("images/edit.png", templatePage.getString("Update"), + templatePage.getString("Update")) { // pas de lien d'édition si l'utilisateur n'a pas les droits @Override public void populateItem(Item<ICellPopulator<Extraction>> item, String componentId, IModel<Extraction> model) { - if (extractionService.updateOrdeleteExtractionEnabled(model.getObject(), getSession().getUtilisateur())) { + if (extractionService.updateOrdeleteExtractionEnabled(model.getObject(), templatePage.getSession().getUtilisateur())) { item.add(new LinkableImagePanel(item, componentId, model)); } else { // label vide @@ -201,13 +176,13 @@ @Override public void onClick(Item<ICellPopulator<Extraction>> item, String componentId, IModel<Extraction> model) { - setResponsePage(new ManageExtractionPage(model.getObject().getIdExtraction(), currentPage)); + templatePage.setResponsePage(new ManageExtractionPage(model.getObject().getIdExtraction(), callerPage)); } }); final DataTable<Extraction, String> extractionsDataTable = new AjaxFallbackDefaultDataTable<Extraction, String>( - "ListExtractionsPage.Extractions", columns, extractionsDataProvider, WebContext.ROWS_PER_PAGE); - extractionsRefresh.add(extractionsDataTable); - + componentId, columns, extractionsDataProvider, WebContext.ROWS_PER_PAGE); + extractionsDataTable.addBottomToolbar(new TableExportToolbar(extractionsDataTable, "extractions", templatePage.getSession().getLocale())); + return extractionsDataTable; } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/lot/ListLotsPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/lot/ListLotsPage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/lot/ListLotsPage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -39,8 +39,9 @@ import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; import nc.ird.cantharella.web.utils.columns.MapValuePropertyColumn; +import nc.ird.cantharella.web.utils.data.TableExportToolbar; +import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; -import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; import nc.ird.cantharella.web.utils.security.AuthRole; import nc.ird.cantharella.web.utils.security.AuthRoles; @@ -92,85 +93,103 @@ // Liste des lots final List<Lot> lots = lotService.listLots(getSession().getUtilisateur()); + DataTable<Lot, String> lotsDataTable = initLotsDataTable(this, "ListLotsPage.Lots", currentPage, lots, lotService); + lotsRefresh.add(lotsDataTable); + } + /** + * Init data table with lots list. + * + * This method is static to be reused in several places. + * + * @param templatePage parent page + * @param componentId data table id + * @param callerPage caller page + * @param lots lots list + * @param lotService lot service + * @return data table component + */ + public static DataTable<Lot, String> initLotsDataTable(final TemplatePage templatePage, + final String componentId, final CallerPage callerPage, + List<Lot> lots, final LotService lotService) { LoadableDetachableSortableListDataProvider<Lot> lotsDataProvider = new LoadableDetachableSortableListDataProvider<Lot>( - lots, getSession().getLocale()); + lots, templatePage.getSession().getLocale()); List<IColumn<Lot, String>> columns = new ArrayList<IColumn<Lot, String>>(); - columns.add(new LinkableImagePropertyColumn<Lot, String>("images/read.png", getString("Read"), getString("Read")) { + columns.add(new LinkableImagePropertyColumn<Lot, String>("images/read.png", templatePage.getString("Read"), templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ReadLotPage(model.getObject().getIdLot(), currentPage)); + templatePage.setResponsePage(new ReadLotPage(model.getObject().getIdLot(), callerPage)); } }); - columns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(getString("Lot.ref")), "ref", "ref", - getString("Read")) { + columns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Lot.ref")), "ref", "ref", + templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ReadLotPage(model.getObject().getIdLot(), currentPage)); + templatePage.setResponsePage(new ReadLotPage(model.getObject().getIdLot(), callerPage)); } }); - columns.add(new PropertyColumn<Lot, String>(new Model<String>(getString("Lot.dateRecolte2")), "dateRecolte", + columns.add(new PropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Lot.dateRecolte2")), "dateRecolte", "dateRecolte")); - columns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(getString("Lot.station")), "station", "station", - getString("Read")) { + columns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Lot.station")), "station", "station", + templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ReadStationPage(model.getObject().getStation().getIdStation(), currentPage)); + templatePage.setResponsePage(new ReadStationPage(model.getObject().getStation().getIdStation(), callerPage)); } }); - columns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(getString("Lot.specimenRef2")), "specimenRef", - "specimenRef", getString("Read")) { + columns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Lot.specimenRef2")), "specimenRef", + "specimenRef", templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ReadSpecimenPage(model.getObject().getSpecimenRef().getIdSpecimen(), currentPage)); + templatePage.setResponsePage(new ReadSpecimenPage(model.getObject().getSpecimenRef().getIdSpecimen(), callerPage)); } }); - columns.add(new EnumPropertyColumn<Lot, String>(new Model<String>(getString("Specimen.typeOrganisme")), - "specimenRef.typeOrganisme", "specimenRef.typeOrganisme", ListLotsPage.this)); + columns.add(new EnumPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Specimen.typeOrganisme")), + "specimenRef.typeOrganisme", "specimenRef.typeOrganisme", templatePage)); - columns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(getString("Specimen.embranchement")), + columns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Specimen.embranchement")), "specimenRef.embranchement", "specimenRef.embranchement")); - columns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(getString("Specimen.famille")), + columns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Specimen.famille")), "specimenRef.famille", "specimenRef.famille")); - columns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(getString("Specimen.genre")), + columns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Specimen.genre")), "specimenRef.genre", "specimenRef.genre")); - columns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(getString("Specimen.espece")), + columns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Specimen.espece")), "specimenRef.espece", "specimenRef.espece")); - columns.add(new PropertyColumn<Lot, String>(new Model<String>(getString("Lot.partie")), "partie", "partie")); + columns.add(new PropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Lot.partie")), "partie", "partie")); - columns.add(new DecimalPropertyColumn<Lot, String>(new Model<String>(getString("Lot.masseFraiche2")), "masseFraiche", - "masseFraiche", DecimalDisplFormat.SMALL, getLocale())); + columns.add(new DecimalPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Lot.masseFraiche2")), "masseFraiche", + "masseFraiche", DecimalDisplFormat.SMALL, templatePage.getLocale())); - columns.add(new DecimalPropertyColumn<Lot, String>(new Model<String>(getString("Lot.masseSeche2")), "masseSeche", - "masseSeche", DecimalDisplFormat.SMALL, getLocale())); + columns.add(new DecimalPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Lot.masseSeche2")), "masseSeche", + "masseSeche", DecimalDisplFormat.SMALL, templatePage.getLocale())); - columns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(getString("Lot.campagne")), "campagne", "campagne", - getString("Read")) { + columns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(templatePage.getString("Lot.campagne")), "campagne", "campagne", + templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ReadCampagnePage(model.getObject().getCampagne().getIdCampagne(), currentPage)); + templatePage.setResponsePage(new ReadCampagnePage(model.getObject().getCampagne().getIdCampagne(), callerPage)); } }); - columns.add(new MapValuePropertyColumn<Lot, String, String>(new Model<String>(getString("Campagne.codePays")), - "campagne.codePays", "campagne.codePays", WebContext.COUNTRIES.get(getSession().getLocale()))); + columns.add(new MapValuePropertyColumn<Lot, String, String>(new Model<String>(templatePage.getString("Campagne.codePays")), + "campagne.codePays", "campagne.codePays", WebContext.COUNTRIES.get(templatePage.getSession().getLocale()))); - columns.add(new LinkableImagePropertyColumn<Lot, String>("images/edit.png", getString("Update"), getString("Update")) { + columns.add(new LinkableImagePropertyColumn<Lot, String>("images/edit.png", templatePage.getString("Update"), templatePage.getString("Update")) { // pas de lien d'édition si l'utilisateur n'a pas les droits @Override public void populateItem(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - if (lotService.updateOrdeleteLotEnabled(model.getObject(), getSession().getUtilisateur())) { + if (lotService.updateOrdeleteLotEnabled(model.getObject(), templatePage.getSession().getUtilisateur())) { item.add(new LinkableImagePanel(item, componentId, model)); } else { // label vide @@ -180,13 +199,13 @@ @Override public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ManageLotPage(model.getObject().getIdLot(), currentPage)); + templatePage.setResponsePage(new ManageLotPage(model.getObject().getIdLot(), callerPage)); } }); - final DataTable<Lot, String> lotsDataTable = new AjaxFallbackDefaultDataTable<Lot, String>("ListLotsPage.Lots", columns, + final DataTable<Lot, String> lotsDataTable = new AjaxFallbackDefaultDataTable<Lot, String>(componentId, columns, lotsDataProvider, WebContext.ROWS_PER_PAGE); - lotsRefresh.add(lotsDataTable); - + lotsDataTable.addBottomToolbar(new TableExportToolbar(lotsDataTable, "lots", templatePage.getSession().getLocale())); + return lotsDataTable; } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -38,6 +38,7 @@ import nc.ird.cantharella.web.utils.columns.DecimalPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; +import nc.ird.cantharella.web.utils.data.TableExportToolbar; import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; import nc.ird.cantharella.web.utils.models.SimpleSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; @@ -97,7 +98,7 @@ Utilisateur utilisateur = getSession().getUtilisateur(); final List<MoleculeProvenanceBean> moleculeProvenances = moleculeService.listMoleculeProvenances(utilisateur); - DataTable<MoleculeProvenanceBean, String> moleculesDataTable = initMoleculesListTable(this, + DataTable<MoleculeProvenanceBean, String> moleculesDataTable = initMoleculesDataTable(this, "ListMoleculesPage.Molecules", currentPage, moleculeProvenances); moleculesRefresh.add(moleculesDataTable); } @@ -105,7 +106,7 @@ /** * Init data table with molecule provenances list. * - * This method is static to be resued in several places. + * This method is static to be reused in several places. * * @param templatePage parent page * @param componentId data table id @@ -113,7 +114,7 @@ * @param moleculeProvenances molecules provenance list * @return data table component */ - public static DataTable<MoleculeProvenanceBean, String> initMoleculesListTable(final TemplatePage templatePage, + public static DataTable<MoleculeProvenanceBean, String> initMoleculesDataTable(final TemplatePage templatePage, final String componentId, final CallerPage callerPage, List<MoleculeProvenanceBean> moleculeProvenances) { @@ -224,6 +225,7 @@ final DataTable<MoleculeProvenanceBean, String> moleculesDataTable = new AjaxFallbackDefaultDataTable<MoleculeProvenanceBean, String>( componentId, columns, moleculesDataProvider, WebContext.ROWS_PER_PAGE); + moleculesDataTable.addBottomToolbar(new TableExportToolbar(moleculesDataTable, "molecules", templatePage.getSession().getLocale())); return moleculesDataTable; } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ManageMoleculePage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -83,7 +83,6 @@ import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; -import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/purification/ListPurificationsPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/purification/ListPurificationsPage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/purification/ListPurificationsPage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -39,6 +39,7 @@ import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; import nc.ird.cantharella.web.utils.columns.ShortDatePropertyColumn; +import nc.ird.cantharella.web.utils.data.TableExportToolbar; import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; import nc.ird.cantharella.web.utils.security.AuthRoles; @@ -64,8 +65,6 @@ @AuthRoles({ AuthRole.ADMIN, AuthRole.USER }) public final class ListPurificationsPage extends TemplatePage { - /** Logger */ - //private static final Logger LOG = LoggerFactory.getLogger(ListPurificationsPage.class); /** Service : manipPurification */ @SpringBean private PurificationService purificationService; @@ -90,73 +89,97 @@ final MarkupContainer purificationsRefresh = new WebMarkupContainer(getResource() + ".Purifications.Refresh"); purificationsRefresh.setOutputMarkupId(true); add(purificationsRefresh); - + // Liste des Purifications final List<Purification> purifications = purificationService.listPurifications(getSession().getUtilisateur()); + + DataTable<Purification, String> purificationsDataTable = initPurificationsDataTable(this, + "ListPurificationsPage.Purifications", currentPage, purifications, purificationService); + purificationsRefresh.add(purificationsDataTable); + + } + + /** + * Init data table with purification list. + * + * This method is static to be reused in several places. + * + * @param templatePage parent page + * @param componentId data table id + * @param callerPage caller page + * @param purifications purifications list + * @param purificationService purification service + * @return data table component + */ + public static DataTable<Purification, String> initPurificationsDataTable(final TemplatePage templatePage, + final String componentId, final CallerPage callerPage, + List<Purification> purifications, final PurificationService purificationService) { + + LoadableDetachableSortableListDataProvider<Purification> purificationsDataProvider = new LoadableDetachableSortableListDataProvider<Purification>( - purifications, getSession().getLocale()); + purifications, templatePage.getSession().getLocale()); List<IColumn<Purification, String>> columns = new ArrayList<IColumn<Purification, String>>(); - columns.add(new LinkableImagePropertyColumn<Purification, String>("images/read.png", getString("Read"), - getString("Read")) { + columns.add(new LinkableImagePropertyColumn<Purification, String>("images/read.png", templatePage.getString("Read"), + templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { - setResponsePage(new ReadPurificationPage(model.getObject().getIdPurification(), currentPage)); + templatePage.setResponsePage(new ReadPurificationPage(model.getObject().getIdPurification(), callerPage)); } }); - columns.add(new LinkPropertyColumn<Purification, String>(new Model<String>(getString("Extraction.lot")), "lotSource", - "lotSource", getString("Read")) { + columns.add(new LinkPropertyColumn<Purification, String>(new Model<String>(templatePage.getString("Extraction.lot")), "lotSource", + "lotSource", templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { - setResponsePage(new ReadLotPage(model.getObject().getLotSource().getIdLot(), currentPage)); + templatePage.setResponsePage(new ReadLotPage(model.getObject().getLotSource().getIdLot(), callerPage)); } }); columns.add(new LinkProduitPropertyColumn<Purification, String>( - new Model<String>(getString("ResultatTestBio.produit")), "produit", "produit", (TemplatePage) getPage()) { + new Model<String>(templatePage.getString("ResultatTestBio.produit")), "produit", "produit", templatePage) { @Override public void onClickIfExtrait(Extrait extrait) { - setResponsePage(new ReadExtractionPage(extrait.getExtraction().getIdExtraction(), currentPage)); + templatePage.setResponsePage(new ReadExtractionPage(extrait.getExtraction().getIdExtraction(), callerPage)); } @Override public void onClickIfFraction(Fraction fraction) { - setResponsePage(new ReadPurificationPage(fraction.getPurification().getIdPurification(), currentPage)); + templatePage.setResponsePage(new ReadPurificationPage(fraction.getPurification().getIdPurification(), callerPage)); } }); - columns.add(new LinkPropertyColumn<Purification, String>(new Model<String>(getString("Purification.ref")), "ref", - "ref", getString("Read")) { + columns.add(new LinkPropertyColumn<Purification, String>(new Model<String>(templatePage.getString("Purification.ref")), "ref", + "ref", templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { - setResponsePage(new ReadPurificationPage(model.getObject().getIdPurification(), currentPage)); + templatePage.setResponsePage(new ReadPurificationPage(model.getObject().getIdPurification(), callerPage)); } }); - columns.add(new ShortDatePropertyColumn<Purification, String>(new Model<String>(getString("Purification.date")), - "date", "date", getLocale())); + columns.add(new ShortDatePropertyColumn<Purification, String>(new Model<String>(templatePage.getString("Purification.date")), + "date", "date", templatePage.getLocale())); - columns.add(new PropertyColumn<Purification, String>(new Model<String>(getString("Purification.methode2")), "methode", + columns.add(new PropertyColumn<Purification, String>(new Model<String>(templatePage.getString("Purification.methode2")), "methode", "methode")); - columns.add(new LinkPropertyColumn<Purification, String>(new Model<String>(getString("Campagne")), - "lotSource.campagne", "lotSource.campagne", getString("Read")) { + columns.add(new LinkPropertyColumn<Purification, String>(new Model<String>(templatePage.getString("Campagne")), + "lotSource.campagne", "lotSource.campagne", templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { - setResponsePage(new ReadCampagnePage(model.getObject().getLotSource().getCampagne().getIdCampagne(), - currentPage)); + templatePage.setResponsePage(new ReadCampagnePage(model.getObject().getLotSource().getCampagne().getIdCampagne(), + callerPage)); } }); - columns.add(new LinkableImagePropertyColumn<Purification, String>("images/edit.png", getString("Update"), - getString("Update")) { + columns.add(new LinkableImagePropertyColumn<Purification, String>("images/edit.png", templatePage.getString("Update"), + templatePage.getString("Update")) { // pas de lien d'édition si l'utilisateur n'a pas les droits @Override public void populateItem(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { - if (purificationService.updateOrdeletePurificationEnabled(model.getObject(), getSession() + if (purificationService.updateOrdeletePurificationEnabled(model.getObject(), templatePage.getSession() .getUtilisateur())) { item.add(new LinkableImagePanel(item, componentId, model)); } else { @@ -167,13 +190,14 @@ @Override public void onClick(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { - setResponsePage(new ManagePurificationPage(model.getObject().getIdPurification(), currentPage)); + templatePage.setResponsePage(new ManagePurificationPage(model.getObject().getIdPurification(), callerPage)); } }); final DataTable<Purification, String> purificationsDataTable = new AjaxFallbackDefaultDataTable<Purification, String>( - "ListPurificationsPage.Purifications", columns, purificationsDataProvider, WebContext.ROWS_PER_PAGE); - purificationsRefresh.add(purificationsDataTable); + componentId, columns, purificationsDataProvider, WebContext.ROWS_PER_PAGE); + purificationsDataTable.addBottomToolbar(new TableExportToolbar(purificationsDataTable, "purifications", templatePage.getSession().getLocale())); + return purificationsDataTable; } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.html =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.html 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.html 2013-02-15 11:49:11 UTC (rev 115) @@ -39,31 +39,25 @@ <h3><wicket:message key="SearchPage.Stations" /></h3> <table cellspacing="0" wicket:id="SearchPage.Stations.Results"/> -<a wicket:id="SearchPage.Stations.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> <h3><wicket:message key="SearchPage.Specimens" /></h3> <table cellspacing="0" wicket:id="SearchPage.Specimens.Results"/> -<a wicket:id="SearchPage.Specimens.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> <h3><wicket:message key="SearchPage.Lots" /></h3> <table cellspacing="0" wicket:id="SearchPage.Lots.Results"/> -<a wicket:id="SearchPage.Lots.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> <h3><wicket:message key="SearchPage.Extractions" /></h3> <table cellspacing="0" wicket:id="SearchPage.Extractions.Results"/> -<a wicket:id="SearchPage.Extractions.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> <h3><wicket:message key="SearchPage.Purifications" /></h3> <table cellspacing="0" wicket:id="SearchPage.Purifications.Results"/> -<a wicket:id="SearchPage.Purifications.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> <h3><wicket:message key="SearchPage.ResultatTestBios" /></h3> <table cellspacing="0" wicket:id="SearchPage.ResultatTestBios.Results"/> -<a wicket:id="SearchPage.ResultatTestBios.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> <h3><wicket:message key="SearchPage.Molecules" /></h3> <table cellspacing="0" wicket:id="SearchPage.Molecules.Results"/> -<a wicket:id="SearchPage.Molecules.ExportCSV"><wicket:message key="SearchPage.ExportCSV" /></a> + </wicket:extend> </body> </html> \ No newline at end of file Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/search/SearchPage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -22,13 +22,9 @@ */ package nc.ird.cantharella.web.pages.domain.search; -import java.io.Serializable; -import java.util.ArrayList; import java.util.List; import nc.ird.cantharella.data.model.Extraction; -import nc.ird.cantharella.data.model.Extrait; -import nc.ird.cantharella.data.model.Fraction; import nc.ird.cantharella.data.model.Lot; import nc.ird.cantharella.data.model.Molecule; import nc.ird.cantharella.data.model.Purification; @@ -38,51 +34,30 @@ import nc.ird.cantharella.data.model.Utilisateur; import nc.ird.cantharella.service.model.MoleculeProvenanceBean; import nc.ird.cantharella.service.model.SearchResult; +import nc.ird.cantharella.service.services.ExtractionService; +import nc.ird.cantharella.service.services.LotService; import nc.ird.cantharella.service.services.MoleculeService; +import nc.ird.cantharella.service.services.PurificationService; import nc.ird.cantharella.service.services.SearchService; -import nc.ird.cantharella.web.config.WebContext; +import nc.ird.cantharella.service.services.SpecimenService; +import nc.ird.cantharella.service.services.StationService; +import nc.ird.cantharella.service.services.TestBioService; import nc.ird.cantharella.web.pages.TemplatePage; -import nc.ird.cantharella.web.pages.columns.LinkProduitPropertyColumn; -import nc.ird.cantharella.web.pages.columns.TaxonomyPropertyColumn; -import nc.ird.cantharella.web.pages.domain.campagne.ReadCampagnePage; -import nc.ird.cantharella.web.pages.domain.extraction.ReadExtractionPage; -import nc.ird.cantharella.web.pages.domain.lot.ReadLotPage; +import nc.ird.cantharella.web.pages.domain.extraction.ListExtractionsPage; +import nc.ird.cantharella.web.pages.domain.lot.ListLotsPage; import nc.ird.cantharella.web.pages.domain.molecule.ListMoleculesPage; -import nc.ird.cantharella.web.pages.domain.purification.ReadPurificationPage; -import nc.ird.cantharella.web.pages.domain.specimen.ReadSpecimenPage; -import nc.ird.cantharella.web.pages.domain.station.ReadStationPage; -import nc.ird.cantharella.web.pages.domain.testBio.ReadTestBioPage; +import nc.ird.cantharella.web.pages.domain.purification.ListPurificationsPage; +import nc.ird.cantharella.web.pages.domain.specimen.ListSpecimensPage; +import nc.ird.cantharella.web.pages.domain.station.ListStationsPage; +import nc.ird.cantharella.web.pages.domain.testBio.ListTestsBioPage; import nc.ird.cantharella.web.utils.CallerPage; -import nc.ird.cantharella.web.utils.behaviors.ReplaceEmptyLabelBehavior; -import nc.ird.cantharella.web.utils.columns.BooleanPropertyColumn; -import nc.ird.cantharella.web.utils.columns.DecimalPropertyColumn; -import nc.ird.cantharella.web.utils.columns.EnumPropertyColumn; -import nc.ird.cantharella.web.utils.columns.ExportablePropertyColumn; -import nc.ird.cantharella.web.utils.columns.ExportableTextFilteredPropertyColumn; -import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; -import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; -import nc.ird.cantharella.web.utils.columns.MapValuePropertyColumn; -import nc.ird.cantharella.web.utils.columns.ShortDatePropertyColumn; -import nc.ird.cantharella.web.utils.links.CsvExportLink; -import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel; -import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; -import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; import nc.ird.cantharella.web.utils.security.AuthRoles; -import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable; -import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; -import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; -import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable; -import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; -import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.ExternalLink; -import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.util.value.ValueMap; @@ -102,13 +77,34 @@ @SpringBean protected SearchService searchService; + /** Specimen service. */ + @SpringBean + protected SpecimenService specimenService; + + /** Lot service. */ + @SpringBean + protected LotService lotService; + + /** Extraction service. */ + @SpringBean + protected ExtractionService extractionService; + + /** Purification service. */ + @SpringBean + protected PurificationService purificationService; + + /** Testbio service. */ + @SpringBean + protected TestBioService testBioService; + + /** Station service. */ + @SpringBean + protected StationService stationService; + /** Molecule service. */ @SpringBean protected MoleculeService moleculeService; - /** Nombre d'extraits affichés dans la colonne de résumés des extraits. */ - private static final int MAX_EXTRAITS_DISPLAY = 4; - /** * Constructor. * @@ -135,485 +131,52 @@ // search results Utilisateur utilisateur = getSession().getUtilisateur(); SearchResult searchResult = searchService.search(query, utilisateur); - addSpecimensTable(currentPage, searchResult); - addLotsTable(currentPage, searchResult); - addExtractionsTable(currentPage, searchResult); - addPurificationsTable(currentPage, searchResult); - addTestBiosTable(currentPage, searchResult); - addStationsTable(currentPage, searchResult); - - // additionnal transformation for molecule provenances + // Additional transformation for molecule provenances List<Molecule> molecules = searchResult.getMolecules(); List<MoleculeProvenanceBean> moleculeProvenances = moleculeService.listMoleculeProvenances(molecules, utilisateur); - // call static methods in ListXXXPage - DataTable<MoleculeProvenanceBean, String> moleculesDataTable = ListMoleculesPage.initMoleculesListTable(this, - "SearchPage.Molecules.Results", currentPage, moleculeProvenances); - add(moleculesDataTable); - add(new CsvExportLink("SearchPage.Molecules.ExportCSV", moleculesDataTable, "molecules.csv")); - } - - /** - * Get current form query value. - * - * @return form query value - */ - public String getQuery() { - return query; - } - - /** - * Format specimens result into table. - * - * @param currentPage current page - * @param searchResult search results - */ - protected void addSpecimensTable(final CallerPage currentPage, SearchResult searchResult) { - // search result : specimens - List<Specimen> specimens = searchResult.getSpecimens(); - List<IColumn<Specimen, String>> specimensColumns = new ArrayList<IColumn<Specimen, String>>(); - - specimensColumns.add(new LinkableImagePropertyColumn<Specimen, String>("images/read.png", getString("Read"), getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Specimen>> item, String componentId, IModel<Specimen> model) { - setResponsePage(new ReadSpecimenPage(model.getObject().getIdSpecimen(), currentPage)); - } - }); - - specimensColumns.add(new LinkPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.ref")), "ref", "ref", - getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Specimen>> item, String componentId, IModel<Specimen> model) { - setResponsePage(new ReadSpecimenPage(model.getObject().getIdSpecimen(), currentPage)); - } - }); - - specimensColumns.add(new EnumPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.typeOrganisme")), - "typeOrganisme", "typeOrganisme", SearchPage.this)); - - specimensColumns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.embranchement")), - "embranchement", "embranchement")); - - specimensColumns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.famille")), "famille", - "famille")); - - specimensColumns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.genre")), "genre", - "genre")); - - specimensColumns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.espece")), "espece", - "espece")); - - specimensColumns.add(new LinkPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.station2")), "station", - "station", getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Specimen>> item, String componentId, IModel<Specimen> model) { - setResponsePage(new ReadStationPage(model.getObject().getStation().getIdStation(), currentPage)); - } - }); - LoadableDetachableSortableListDataProvider<Specimen> specimensDataProvider = new LoadableDetachableSortableListDataProvider<Specimen>( - specimens, getSession().getLocale()); - final DataTable<Specimen, String> specimensDataTable = new DefaultDataTable<Specimen, String>(getResource() + ".Specimens.Results", - specimensColumns, specimensDataProvider, Integer.MAX_VALUE); + // specimens table + DataTable<Specimen, String> specimensDataTable = ListSpecimensPage.initSpecimensDataTable(this, + "SearchPage.Specimens.Results", currentPage, searchResult.getSpecimens(), specimenService); add(specimensDataTable); - add(new CsvExportLink("SearchPage.Specimens.ExportCSV", specimensDataTable, "specimens.csv")); - } - /** - * Format lots result into table. - * - * @param currentPage current page - * @param searchResult search results - */ - protected void addLotsTable(final CallerPage currentPage, SearchResult searchResult) { - // search result : lots - List<Lot> lots = searchResult.getLots(); - List<IColumn<Lot, String>> lotsColumns = new ArrayList<IColumn<Lot, String>>(); - - lotsColumns.add(new LinkableImagePropertyColumn<Lot, String>("images/read.png", getString("Read"), getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ReadLotPage(model.getObject().getIdLot(), currentPage)); - } - }); - - lotsColumns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(getString("Lot.ref")), "ref", "ref", - getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ReadLotPage(model.getObject().getIdLot(), currentPage)); - } - }); - - lotsColumns.add(new ExportablePropertyColumn<Lot, String>(new Model<String>(getString("Lot.dateRecolte2")), "dateRecolte", - "dateRecolte")); - - lotsColumns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(getString("Lot.station")), "station", "station", - getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ReadStationPage(model.getObject().getStation().getIdStation(), currentPage)); - } - }); - - lotsColumns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(getString("Lot.specimenRef2")), "specimenRef", - "specimenRef", getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ReadSpecimenPage(model.getObject().getSpecimenRef().getIdSpecimen(), currentPage)); - } - }); - - lotsColumns.add(new EnumPropertyColumn<Lot, String>(new Model<String>(getString("Specimen.typeOrganisme")), - "specimenRef.typeOrganisme", "specimenRef.typeOrganisme", SearchPage.this)); - - lotsColumns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(getString("Specimen.embranchement")), - "specimenRef.embranchement", "specimenRef.embranchement")); - - lotsColumns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(getString("Specimen.famille")), - "specimenRef.famille", "specimenRef.famille")); - - lotsColumns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(getString("Specimen.genre")), - "specimenRef.genre", "specimenRef.genre")); - - lotsColumns.add(new TaxonomyPropertyColumn<Lot, String>(new Model<String>(getString("Specimen.espece")), - "specimenRef.espece", "specimenRef.espece")); - - lotsColumns.add(new ExportablePropertyColumn<Lot, String>(new Model<String>(getString("Lot.partie")), "partie", "partie")); - - lotsColumns.add(new DecimalPropertyColumn<Lot, String>(new Model<String>(getString("Lot.masseFraiche2")), "masseFraiche", - "masseFraiche", DecimalDisplFormat.SMALL, getLocale())); - - lotsColumns.add(new DecimalPropertyColumn<Lot, String>(new Model<String>(getString("Lot.masseSeche2")), "masseSeche", - "masseSeche", DecimalDisplFormat.SMALL, getLocale())); - - lotsColumns.add(new LinkPropertyColumn<Lot, String>(new Model<String>(getString("Lot.campagne")), "campagne", "campagne", - getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { - setResponsePage(new ReadCampagnePage(model.getObject().getCampagne().getIdCampagne(), currentPage)); - } - }); - - lotsColumns.add(new MapValuePropertyColumn<Lot, String, String>(new Model<String>(getString("Campagne.codePays")), - "campagne.codePays", "campagne.codePays", WebContext.COUNTRIES.get(getSession().getLocale()))); - - LoadableDetachableSortableListDataProvider<Lot> lotsDataProvider = new LoadableDetachableSortableListDataProvider<Lot>( - lots, getSession().getLocale()); - final DataTable<Lot, String> lotsDataTable = new DefaultDataTable<Lot, String>(getResource() + ".Lots.Results", lotsColumns, - lotsDataProvider, Integer.MAX_VALUE); + // lot table + DataTable<Lot, String> lotsDataTable = ListLotsPage.initLotsDataTable(this, + "SearchPage.Lots.Results", currentPage, searchResult.getLots(), lotService); add(lotsDataTable); - add(new CsvExportLink("SearchPage.Lots.ExportCSV", lotsDataTable, "lots.csv")); - } - /** - * Format extractions result into table. - * - * @param currentPage current page - * @param searchResult search results - */ - protected void addExtractionsTable(final CallerPage currentPage, SearchResult searchResult) { - // search result : extractions - List<Extraction> extractions = searchResult.getExtractions(); - - List<IColumn<Extraction, String>> extractionsColumns = new ArrayList<IColumn<Extraction, String>>(); - - extractionsColumns.add(new LinkableImagePropertyColumn<Extraction, String>("images/read.png", getString("Read"), getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Extraction>> item, String componentId, IModel<Extraction> model) { - setResponsePage(new ReadExtractionPage(model.getObject().getIdExtraction(), currentPage)); - } - }); - - extractionsColumns.add(new LinkPropertyColumn<Extraction, String>(new Model<String>(getString("Extraction.lot")), "lot", "lot", - getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Extraction>> item, String componentId, IModel<Extraction> model) { - setResponsePage(new ReadLotPage(model.getObject().getLot().getIdLot(), currentPage)); - } - }); - - extractionsColumns.add(new LinkPropertyColumn<Extraction, String>(new Model<String>(getString("Extraction.ref")), "ref", "ref", - getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Extraction>> item, String componentId, IModel<Extraction> model) { - setResponsePage(new ReadExtractionPage(model.getObject().getIdExtraction(), currentPage)); - } - }); - - extractionsColumns.add(new ShortDatePropertyColumn<Extraction, String>(new Model<String>(getString("Extraction.date")), "date", - "date", getLocale())); - - extractionsColumns.add(new ExportablePropertyColumn<Extraction, String>(new Model<String>(getString("Extraction.methode2")), "methode", - "methode")); - - extractionsColumns.add(new DecimalPropertyColumn<Extraction, String>(new Model<String>(getString("Extraction.masseDepart2")), - "masseDepart", "masseDepart", DecimalDisplFormat.SMALL, getLocale())); - - extractionsColumns.add(new LinkPropertyColumn<Extraction, String>(new Model<String>(getString("Campagne")), "lot.campagne", - "lot.campagne", getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Extraction>> item, String componentId, IModel<Extraction> model) { - setResponsePage(new ReadCampagnePage(model.getObject().getLot().getCampagne().getIdCampagne(), - currentPage)); - } - }); - - extractionsColumns.add(new AbstractColumn<Extraction, String>(new Model<String>(getString("Extraction.extraits"))) { - @Override - public void populateItem(Item<ICellPopulator<Extraction>> cellItem, String componentId, - IModel<Extraction> rowModel) { - - // affiche un résumé des types extraits et des masses, allant jusqu'à MAX_EXTRAITS_DISPLAY extraits - Label extraitsLabel = new Label(componentId, new Model<Serializable>(rowModel) { - /** {@inheritDoc} */ - @Override - public String getObject() { - StringBuilder extraitsResume = new StringBuilder(); - List<Extrait> extraits = new PropertyModel<List<Extrait>>(super.getObject(), "sortedExtraits") - .getObject(); - for (int i = 0; i < MAX_EXTRAITS_DISPLAY && i < extraits.size(); i++) { - Extrait curExtrait = extraits.get(i); - extraitsResume.append("<b>"); - extraitsResume.append(curExtrait.getTypeExtrait().getInitiales()); - extraitsResume.append("</b>"); - extraitsResume.append(" : "); - extraitsResume.append(curExtrait.getMasseObtenue() == null ? ReplaceEmptyLabelBehavior.NULL_PROPERTY - : new DisplayDecimalPropertyModel(curExtrait, "masseObtenue", - DecimalDisplFormat.SMALL, getLocale()).getObject()); - if (i < MAX_EXTRAITS_DISPLAY - 1 && i < extraits.size() - 1) { - extraitsResume.append(", "); - } - if (i == MAX_EXTRAITS_DISPLAY - 1 && i < extraits.size() - 1) { - extraitsResume.append(", ..."); - } - } - return extraitsResume.toString(); - } - }); - extraitsLabel.setEscapeModelStrings(false); - extraitsLabel.add(new ReplaceEmptyLabelBehavior()); - cellItem.add(extraitsLabel); - } - - }); - - LoadableDetachableSortableListDataProvider<Extraction> extractionsDataProvider = new LoadableDetachableSortableListDataProvider<Extraction>( - extractions, getSession().getLocale()); - final DataTable<Extraction, String> extractionsDataTable = new DefaultDataTable<Extraction, String>( - getResource() + ".Extractions.Results", extractionsColumns, extractionsDataProvider, Integer.MAX_VALUE); + // extractions table + DataTable<Extraction, String> extractionsDataTable = ListExtractionsPage.initExtractionsDataTable(this, + "SearchPage.Extractions.Results", currentPage, searchResult.getExtractions(), extractionService); add(extractionsDataTable); - add(new CsvExportLink("SearchPage.Extractions.ExportCSV", extractionsDataTable, "extractions.csv")); - } - /** - * Format purification result into table. - * - * @param currentPage current page - * @param searchResult search results - */ - protected void addPurificationsTable(final CallerPage currentPage, SearchResult searchResult) { - List<Purification> purifications = searchResult.getPurifications(); - LoadableDetachableSortableListDataProvider<Purification> purificationsDataProvider = new LoadableDetachableSortableListDataProvider<Purification>( - purifications, getSession().getLocale()); - - List<IColumn<Purification, String>> columns = new ArrayList<IColumn<Purification, String>>(); - - columns.add(new LinkableImagePropertyColumn<Purification, String>("images/read.png", getString("Read"), - getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { - setResponsePage(new ReadPurificationPage(model.getObject().getIdPurification(), currentPage)); - } - }); - - columns.add(new LinkPropertyColumn<Purification, String>(new Model<String>(getString("Extraction.lot")), "lotSource", - "lotSource", getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { - setResponsePage(new ReadLotPage(model.getObject().getLotSource().getIdLot(), currentPage)); - } - }); - - columns.add(new LinkProduitPropertyColumn<Purification, String>( - new Model<String>(getString("ResultatTestBio.produit")), "produit", "produit", (TemplatePage) getPage()) { - @Override - public void onClickIfExtrait(Extrait extrait) { - setResponsePage(new ReadExtractionPage(extrait.getExtraction().getIdExtraction(), currentPage)); - } - - @Override - public void onClickIfFraction(Fraction fraction) { - setResponsePage(new ReadPurificationPage(fraction.getPurification().getIdPurification(), currentPage)); - } - }); - - columns.add(new LinkPropertyColumn<Purification, String>(new Model<String>(getString("Purification.ref")), "ref", - "ref", getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { - setResponsePage(new ReadPurificationPage(model.getObject().getIdPurification(), currentPage)); - } - }); - - columns.add(new ShortDatePropertyColumn<Purification, String>(new Model<String>(getString("Purification.date")), - "date", "date", getLocale())); - - columns.add(new ExportablePropertyColumn<Purification, String>(new Model<String>(getString("Purification.methode2")), "methode", - "methode")); - - columns.add(new LinkPropertyColumn<Purification, String>(new Model<String>(getString("Campagne")), - "lotSource.campagne", "lotSource.campagne", getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Purification>> item, String componentId, IModel<Purification> model) { - setResponsePage(new ReadCampagnePage(model.getObject().getLotSource().getCampagne().getIdCampagne(), - currentPage)); - } - }); - - final DataTable<Purification, String> purificationsDataTable = new DefaultDataTable<Purification, String>( - getResource() + ".Purifications.Results", columns, purificationsDataProvider, Integer.MAX_VALUE); + // purification table + DataTable<Purification, String> purificationsDataTable = ListPurificationsPage.initPurificationsDataTable(this, + "SearchPage.Purifications.Results", currentPage, searchResult.getPurifications(), purificationService); add(purificationsDataTable); - add(new CsvExportLink("SearchPage.Purifications.ExportCSV", purificationsDataTable, "purifications.csv")); - } - /** - * Format testBios result into table. - * - * @param currentPage current page - * @param searchResult search results - */ - protected void addTestBiosTable(final CallerPage currentPage, SearchResult searchResult) { - List<ResultatTestBio> resultatTestBios = searchResult.getResultatTestBios(); - LoadableDetachableSortableListDataProvider<ResultatTestBio> resTestBiosDataProvider = new LoadableDetachableSortableListDataProvider<ResultatTestBio>( - resultatTestBios, getSession().getLocale()); + // test bio table + DataTable<ResultatTestBio, String> testBiosDataTable = ListTestsBioPage.initTestsBioDataTable(this, + "SearchPage.ResultatTestBios.Results", currentPage, searchResult.getResultatTestBios(), testBioService); + add(testBiosDataTable); - List<IColumn<ResultatTestBio, String>> columns = new ArrayList<IColumn<ResultatTestBio, String>>(); + // stations table + DataTable<Station, String> stationsDataTable = ListStationsPage.initStationsDataTable(this, + "SearchPage.Stations.Results", currentPage, searchResult.getStations(), stationService); + add(stationsDataTable); - columns.add(new LinkableImagePropertyColumn<ResultatTestBio, String>("images/read.png", getString("Read"), - getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<ResultatTestBio>> item, String componentId, - IModel<ResultatTestBio> model) { - setResponsePage(new ReadTestBioPage(model.getObject().getTestBio().getIdTestBio(), currentPage)); - } - }); - - columns.add(new ExportableTextFilteredPropertyColumn<ResultatTestBio, String, String>(new Model<String>( - getString("MethodeTestBio.cible2")), "testBio.methode.cible", "testBio.methode.cible")); - - columns.add(new DecimalPropertyColumn<ResultatTestBio, String>(new Model<String>( - getString("ResultatTestBio.concMasse2")), "concMasse", "concMasse", DecimalDisplFormat.SMALL, - getLocale())); - - columns.add(new EnumPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("TestBio.uniteConcMasse2")), - "uniteConcMasse", "uniteConcMasse", (TemplatePage) getPage())); - - columns.add(new LinkProduitPropertyColumn<ResultatTestBio, String>(new Model<String>( - getString("ResultatTestBio.produit")), "produit", "produit", (TemplatePage) getPage()) { - @Override - public void onClickIfExtrait(Extrait extrait) { - setResponsePage(new ReadExtractionPage(extrait.getExtraction().getIdExtraction(), currentPage)); - } - - @Override - public void onClickIfFraction(Fraction fraction) { - setResponsePage(new ReadPurificationPage(fraction.getPurification().getIdPurification(), currentPage)); - } - }); - - columns.add(new DecimalPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("ResultatTestBio.valeur")), - "valeur", "valeur", DecimalDisplFormat.SMALL, getLocale())); - - columns.add(new ExportablePropertyColumn<ResultatTestBio, String>(new Model<String>(getString("MethodeTestBio.uniteResultat2")), - "testBio.methode.uniteResultat", "testBio.methode.uniteResultat")); - - columns.add(new ExportablePropertyColumn<ResultatTestBio, String>(new Model<String>(getString("Extrait.typeExtrait2")), - "typeExtraitSource", "typeExtraitSource")); - - columns.add(new BooleanPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("ResultatTestBio.actif")), - "actif", "actif", (TemplatePage) getPage())); - - columns.add(new TaxonomyPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("Specimen.famille")), - "lotSource.specimenRef.famille", "lotSource.specimenRef.famille")); - - columns.add(new TaxonomyPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("Specimen.genre")), - "lotSource.specimenRef.genre", "lotSource.specimenRef.genre")); - - columns.add(new TaxonomyPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("Specimen.espece")), - "lotSource.specimenRef.espece", "lotSource.specimenRef.espece")); - - columns.add(new MapValuePropertyColumn<ResultatTestBio, String, String>(new Model<String>( - getString("Campagne.codePays")), "lotSource.campagne.codePays", "lotSource.campagne.codePays", - WebContext.COUNTRIES.get(getSession().getLocale()))); - - columns.add(new ExportablePropertyColumn<ResultatTestBio, String>(new Model<String>(getString("ResultatTestBio.repere")), - "repere", "repere")); - - columns.add(new LinkPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("TestBio.ref")), "testBio.ref", - "testBio.ref", getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<ResultatTestBio>> item, String componentId, - IModel<ResultatTestBio> model) { - setResponsePage(new ReadTestBioPage(model.getObject().getTestBio().getIdTestBio(), currentPage)); - } - }); - - final DataTable<ResultatTestBio, String> resTestBiosDataTable = new DefaultDataTable<ResultatTestBio, String>( - getResource() + ".ResultatTestBios.Results", columns, resTestBiosDataProvider, Integer.MAX_VALUE); - - add(resTestBiosDataTable); - add(new CsvExportLink("SearchPage.ResultatTestBios.ExportCSV", resTestBiosDataTable, "testbios.csv")); - + // molecule table + DataTable<MoleculeProvenanceBean, String> moleculesDataTable = ListMoleculesPage.initMoleculesDataTable(this, + "SearchPage.Molecules.Results", currentPage, moleculeProvenances); + add(moleculesDataTable); } /** - * Format stations result into table. + * Get current form query value. * - * @param currentPage current page - * @param searchResult search results + * @return form query value */ - protected void addStationsTable(final CallerPage currentPage, SearchResult searchResult) { - - // Liste des stations - List<Station> stations = searchResult.getStations(); - - LoadableDetachableSortableListDataProvider<Station> stationsDataProvider = new LoadableDetachableSortableListDataProvider<Station>( - stations, getSession().getLocale()); - - List<IColumn<Station, String>> columns = new ArrayList<IColumn<Station, String>>(); - - columns.add(new LinkableImagePropertyColumn<Station, String>("images/read.png", getString("Read"), getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Station>> item, String componentId, IModel<Station> model) { - setResponsePage(new ReadStationPage(model.getObject().getIdStation(), currentPage)); - } - }); - - columns.add(new LinkPropertyColumn<Station, String>(new Model<String>(getString("Station.nom")), "nom", "nom", - getString("Read")) { - @Override - public void onClick(Item<ICellPopulator<Station>> item, String componentId, IModel<Station> model) { - setResponsePage(new ReadStationPage(model.getObject().getIdStation(), currentPage)); - } - }); - - columns.add(new MapValuePropertyColumn<Station, String, String>(new Model<String>(getString("Station.codePays")), - "codePays", "codePays", WebContext.COUNTRIES.get(getSession().getLocale()))); - - columns.add(new ExportablePropertyColumn<Station, String>(new Model<String>(getString("Station.localite")), "localite", - "localite")); - - columns.add(new ExportablePropertyColumn<Station, String>(new Model<String>(getString("Station.latitude")), "latitude", - "latitude")); - - columns.add(new ExportablePropertyColumn<Station, String>(new Model<String>(getString("Station.longitude")), "longitude", - "longitude")); - - - final DataTable<Station, String> stationsDataTable = new AjaxFallbackDefaultDataTable<Station, String>( - getResource() + ".Stations.Results", columns, stationsDataProvider, WebContext.ROWS_PER_PAGE); - - add(stationsDataTable); - add(new CsvExportLink("SearchPage.Stations.ExportCSV", stationsDataTable, "stations.csv")); + public String getQuery() { + return query; } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/specimen/ListSpecimensPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/specimen/ListSpecimensPage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/specimen/ListSpecimensPage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -35,6 +35,7 @@ import nc.ird.cantharella.web.utils.columns.EnumPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; +import nc.ird.cantharella.web.utils.data.TableExportToolbar; import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; import nc.ird.cantharella.web.utils.security.AuthRoles; @@ -88,51 +89,73 @@ // Liste des Specimens final List<Specimen> specimens = specimenService.listSpecimens(getSession().getUtilisateur()); + DataTable<Specimen, String> specimensDataTable = initSpecimensDataTable(this, + "ListSpecimensPage.Specimens", currentPage, specimens, specimenService); + specimensRefresh.add(specimensDataTable); + } + + /** + * Init data table with specimens list. + * + * This method is static to be reused in several places. + * + * @param templatePage parent page + * @param componentId data table id + * @param callerPage caller page + * @param specimens specimens list + * @param specimenService specimen service + * @return data table component + */ + public static DataTable<Specimen, String> initSpecimensDataTable(final TemplatePage templatePage, + final String componentId, final CallerPage callerPage, + List<Specimen> specimens, final SpecimenService specimenService) { + + LoadableDetachableSortableListDataProvider<Specimen> specimensDataProvider = new LoadableDetachableSortableListDataProvider<Specimen>( - specimens, getSession().getLocale()); + specimens, templatePage.getSession().getLocale()); List<IColumn<Specimen, String>> columns = new ArrayList<IColumn<Specimen, String>>(); - columns.add(new LinkableImagePropertyColumn<Specimen, String>("images/read.png", getString("Read"), getString("Read")) { + columns.add(new LinkableImagePropertyColumn<Specimen, String>("images/read.png", templatePage.getString("Read"), templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Specimen>> item, String componentId, IModel<Specimen> model) { - setResponsePage(new ReadSpecimenPage(model.getObject().getIdSpecimen(), currentPage)); + templatePage.setResponsePage(new ReadSpecimenPage(model.getObject().getIdSpecimen(), callerPage)); } }); - columns.add(new LinkPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.ref")), "ref", "ref", - getString("Read")) { + columns.add(new LinkPropertyColumn<Specimen, String>(new Model<String>(templatePage.getString("Specimen.ref")), "ref", "ref", + templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Specimen>> item, String componentId, IModel<Specimen> model) { - setResponsePage(new ReadSpecimenPage(model.getObject().getIdSpecimen(), currentPage)); + templatePage.setResponsePage(new ReadSpecimenPage(model.getObject().getIdSpecimen(), callerPage)); } }); - columns.add(new EnumPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.typeOrganisme")), - "typeOrganisme", "typeOrganisme", ListSpecimensPage.this)); + columns.add(new EnumPropertyColumn<Specimen, String>(new Model<String>(templatePage.getString("Specimen.typeOrganisme")), + "typeOrganisme", "typeOrganisme", templatePage)); - columns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.embranchement")), + columns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(templatePage.getString("Specimen.embranchement")), "embranchement", "embranchement")); - columns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.famille")), "famille", + columns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(templatePage.getString("Specimen.famille")), "famille", "famille")); - columns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.genre")), "genre", + columns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(templatePage.getString("Specimen.genre")), "genre", "genre")); - columns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.espece")), "espece", + columns.add(new TaxonomyPropertyColumn<Specimen, String>(new Model<String>(templatePage.getString("Specimen.espece")), "espece", "espece")); - columns.add(new LinkPropertyColumn<Specimen, String>(new Model<String>(getString("Specimen.station2")), "station", - "station", getString("Read")) { + columns.add(new LinkPropertyColumn<Specimen, String>(new Model<String>(templatePage.getString("Specimen.station2")), "station", + "station", templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Specimen>> item, String componentId, IModel<Specimen> model) { - setResponsePage(new ReadStationPage(model.getObject().getStation().getIdStation(), currentPage)); + templatePage.setResponsePage(new ReadStationPage(model.getObject().getStation().getIdStation(), callerPage)); } }); - columns.add(new LinkableImagePropertyColumn<Specimen, String>("images/edit.png", getString("Update"), - getString("Update")) { + columns.add(new LinkableImagePropertyColumn<Specimen, String>("images/edit.png", templatePage.getString("Update"), + templatePage.getString("Update")) { // pas de lien d'édition si l'utilisateur n'a pas les droits @Override public void populateItem(Item<ICellPopulator<Specimen>> item, String componentId, IModel<Specimen> model) { @@ -140,7 +163,7 @@ item.add(new AttributeModifier("class", item.getIndex() % 2 == 0 ? "even" : "odd")); } - if (specimenService.updateOrdeleteSpecimenEnabled(model.getObject(), getSession().getUtilisateur())) { + if (specimenService.updateOrdeleteSpecimenEnabled(model.getObject(), templatePage.getSession().getUtilisateur())) { item.add(new LinkableImagePanel(item, componentId, model)); } else { // label vide @@ -150,13 +173,13 @@ @Override public void onClick(Item<ICellPopulator<Specimen>> item, String componentId, IModel<Specimen> model) { - setResponsePage(new ManageSpecimenPage(model.getObject().getIdSpecimen(), currentPage)); + templatePage.setResponsePage(new ManageSpecimenPage(model.getObject().getIdSpecimen(), callerPage)); } }); final DataTable<Specimen, String> specimensDataTable = new AjaxFallbackDefaultDataTable<Specimen, String>( - "ListSpecimensPage.Specimens", columns, specimensDataProvider, WebContext.ROWS_PER_PAGE); - - specimensRefresh.add(specimensDataTable); + componentId, columns, specimensDataProvider, WebContext.ROWS_PER_PAGE); + specimensDataTable.addBottomToolbar(new TableExportToolbar(specimensDataTable, "specimens", templatePage.getSession().getLocale())); + return specimensDataTable; } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/station/ListStationsPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/station/ListStationsPage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/station/ListStationsPage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -33,6 +33,7 @@ import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; import nc.ird.cantharella.web.utils.columns.MapValuePropertyColumn; +import nc.ird.cantharella.web.utils.data.TableExportToolbar; import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; import nc.ird.cantharella.web.utils.security.AuthRoles; @@ -85,43 +86,65 @@ final MarkupContainer stationsRefresh = new WebMarkupContainer(getResource() + ".Stations.Refresh"); stationsRefresh.setOutputMarkupId(true); add(stationsRefresh); - + // Liste des stations final List<Station> stations = stationService.listStations(getSession().getUtilisateur()); + DataTable<Station, String> stationsDataTable = initStationsDataTable(this, + "ListStationsPage.Stations", currentPage, stations, stationService); + stationsRefresh.add(stationsDataTable); + + } + + /** + * Init data table with stations list. + * + * This method is static to be reused in several places. + * + * @param templatePage parent page + * @param componentId data table id + * @param callerPage caller page + * @param stations stations list + * @param stationService station service + * @return data table component + */ + public static DataTable<Station, String> initStationsDataTable(final TemplatePage templatePage, + final String componentId, final CallerPage callerPage, + List<Station> stations, final StationService stationService) { + LoadableDetachableSortableListDataProvider<Station> stationsDataProvider = new LoadableDetachableSortableListDataProvider<Station>( - stations, getSession().getLocale()); + stations, templatePage.getSession().getLocale()); List<IColumn<Station, String>> columns = new ArrayList<IColumn<Station, String>>(); - columns.add(new LinkableImagePropertyColumn<Station, String>("images/read.png", getString("Read"), getString("Read")) { + columns.add(new LinkableImagePropertyColumn<Station, String>("images/read.png", templatePage.getString("Read"), templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Station>> item, String componentId, IModel<Station> model) { - setResponsePage(new ReadStationPage(model.getObject().getIdStation(), currentPage)); + templatePage.setResponsePage(new ReadStationPage(model.getObject().getIdStation(), callerPage)); } }); - columns.add(new LinkPropertyColumn<Station, String>(new Model<String>(getString("Station.nom")), "nom", "nom", - getString("Read")) { + columns.add(new LinkPropertyColumn<Station, String>(new Model<String>(templatePage.getString("Station.nom")), "nom", "nom", + templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<Station>> item, String componentId, IModel<Station> model) { - setResponsePage(new ReadStationPage(model.getObject().getIdStation(), currentPage)); + templatePage.setResponsePage(new ReadStationPage(model.getObject().getIdStation(), callerPage)); } }); - columns.add(new MapValuePropertyColumn<Station, String, String>(new Model<String>(getString("Station.codePays")), - "codePays", "codePays", WebContext.COUNTRIES.get(getSession().getLocale()))); + columns.add(new MapValuePropertyColumn<Station, String, String>(new Model<String>(templatePage.getString("Station.codePays")), + "codePays", "codePays", WebContext.COUNTRIES.get(templatePage.getSession().getLocale()))); - columns.add(new PropertyColumn<Station, String>(new Model<String>(getString("Station.localite")), "localite", + columns.add(new PropertyColumn<Station, String>(new Model<String>(templatePage.getString("Station.localite")), "localite", "localite")); - columns.add(new PropertyColumn<Station, String>(new Model<String>(getString("Station.latitude")), "latitude", + columns.add(new PropertyColumn<Station, String>(new Model<String>(templatePage.getString("Station.latitude")), "latitude", "latitude")); - columns.add(new PropertyColumn<Station, String>(new Model<String>(getString("Station.longitude")), "longitude", + columns.add(new PropertyColumn<Station, String>(new Model<String>(templatePage.getString("Station.longitude")), "longitude", "longitude")); - columns.add(new LinkableImagePropertyColumn<Station, String>("images/edit.png", getString("Update"), - getString("Update")) { + columns.add(new LinkableImagePropertyColumn<Station, String>("images/edit.png", templatePage.getString("Update"), + templatePage.getString("Update")) { // pas de lien d'édition si l'utilisateur n'a pas les droits @Override public void populateItem(Item<ICellPopulator<Station>> item, String componentId, IModel<Station> model) { @@ -129,7 +152,7 @@ item.add(new AttributeModifier("class", item.getIndex() % 2 == 0 ? "even" : "odd")); } - if (stationService.updateOrdeleteStationEnabled(model.getObject(), getSession().getUtilisateur())) { + if (stationService.updateOrdeleteStationEnabled(model.getObject(), templatePage.getSession().getUtilisateur())) { item.add(new LinkableImagePanel(item, componentId, model)); } else { // label vide @@ -139,13 +162,13 @@ @Override public void onClick(Item<ICellPopulator<Station>> item, String componentId, IModel<Station> model) { - setResponsePage(new ManageStationPage(model.getObject().getIdStation(), currentPage)); + templatePage.setResponsePage(new ManageStationPage(model.getObject().getIdStation(), callerPage)); } }); final DataTable<Station, String> stationsDataTable = new AjaxFallbackDefaultDataTable<Station, String>( - "ListStationsPage.Stations", columns, stationsDataProvider, WebContext.ROWS_PER_PAGE); - - stationsRefresh.add(stationsDataTable); + componentId, columns, stationsDataProvider, WebContext.ROWS_PER_PAGE); + stationsDataTable.addBottomToolbar(new TableExportToolbar(stationsDataTable, "stations", templatePage.getSession().getLocale())); + return stationsDataTable; } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/testBio/ListTestsBioPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/testBio/ListTestsBioPage.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/testBio/ListTestsBioPage.java 2013-02-15 11:49:11 UTC (rev 115) @@ -42,6 +42,7 @@ import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; import nc.ird.cantharella.web.utils.columns.MapValuePropertyColumn; +import nc.ird.cantharella.web.utils.data.TableExportToolbar; import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; @@ -96,88 +97,108 @@ // Liste des résultats de tests biologiques final List<ResultatTestBio> resTestsBios = testBioService.listResultatsTestBio(getSession().getUtilisateur()); + DataTable<ResultatTestBio, String> resTestsBiosDataTable = initTestsBioDataTable(this, + "ListTestsBioPage.ResultatsTestsBio", currentPage, resTestsBios, testBioService); + resTestsBiosRefresh.add(resTestsBiosDataTable); + } + /** + * Init data table with testsbio list. + * + * This method is static to be reused in several places. + * + * @param templatePage parent page + * @param componentId data table id + * @param callerPage caller page + * @param resTestsBios tests bio list + * @param testBioService test bio service + * @return data table component + */ + public static DataTable<ResultatTestBio, String> initTestsBioDataTable(final TemplatePage templatePage, + final String componentId, final CallerPage callerPage, + List<ResultatTestBio> resTestsBios, final TestBioService testBioService) { + LoadableDetachableSortableListDataProvider<ResultatTestBio> resTestBiosDataProvider = new LoadableDetachableSortableListDataProvider<ResultatTestBio>( - resTestsBios, getSession().getLocale()); + resTestsBios, templatePage.getSession().getLocale()); List<IColumn<ResultatTestBio, String>> columns = new ArrayList<IColumn<ResultatTestBio, String>>(); - columns.add(new LinkableImagePropertyColumn<ResultatTestBio, String>("images/read.png", getString("Read"), - getString("Read")) { + columns.add(new LinkableImagePropertyColumn<ResultatTestBio, String>("images/read.png", templatePage.getString("Read"), + templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<ResultatTestBio>> item, String componentId, IModel<ResultatTestBio> model) { - setResponsePage(new ReadTestBioPage(model.getObject().getTestBio().getIdTestBio(), currentPage)); + templatePage.setResponsePage(new ReadTestBioPage(model.getObject().getTestBio().getIdTestBio(), callerPage)); } }); columns.add(new TextFilteredPropertyColumn<ResultatTestBio, String, String>(new Model<String>( - getString("MethodeTestBio.cible2")), "testBio.methode.cible", "testBio.methode.cible")); + templatePage.getString("MethodeTestBio.cible2")), "testBio.methode.cible", "testBio.methode.cible")); columns.add(new DecimalPropertyColumn<ResultatTestBio, String>(new Model<String>( - getString("ResultatTestBio.concMasse2")), "concMasse", "concMasse", DecimalDisplFormat.SMALL, - getLocale())); + templatePage.getString("ResultatTestBio.concMasse2")), "concMasse", "concMasse", DecimalDisplFormat.SMALL, + templatePage.getLocale())); - columns.add(new EnumPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("TestBio.uniteConcMasse2")), - "uniteConcMasse", "uniteConcMasse", (TemplatePage) getPage())); + columns.add(new EnumPropertyColumn<ResultatTestBio, String>(new Model<String>(templatePage.getString("TestBio.uniteConcMasse2")), + "uniteConcMasse", "uniteConcMasse", templatePage)); columns.add(new LinkProduitPropertyColumn<ResultatTestBio, String>(new Model<String>( - getString("ResultatTestBio.produit")), "produit", "produit", (TemplatePage) getPage()) { + templatePage.getString("ResultatTestBio.produit")), "produit", "produit", templatePage) { @Override public void onClickIfExtrait(Extrait extrait) { - setResponsePage(new ReadExtractionPage(extrait.getExtraction().getIdExtraction(), currentPage)); + templatePage.setResponsePage(new ReadExtractionPage(extrait.getExtraction().getIdExtraction(), callerPage)); } @Override public void onClickIfFraction(Fraction fraction) { - setResponsePage(new ReadPurificationPage(fraction.getPurification().getIdPurification(), currentPage)); + templatePage.setResponsePage(new ReadPurificationPage(fraction.getPurification().getIdPurification(), callerPage)); } }); - columns.add(new DecimalPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("ResultatTestBio.valeur")), - "valeur", "valeur", DecimalDisplFormat.SMALL, getLocale())); + columns.add(new DecimalPropertyColumn<ResultatTestBio, String>(new Model<String>(templatePage.getString("ResultatTestBio.valeur")), + "valeur", "valeur", DecimalDisplFormat.SMALL, templatePage.getLocale())); - columns.add(new PropertyColumn<ResultatTestBio, String>(new Model<String>(getString("MethodeTestBio.uniteResultat2")), + columns.add(new PropertyColumn<ResultatTestBio, String>(new Model<String>(templatePage.getString("MethodeTestBio.uniteResultat2")), "testBio.methode.uniteResultat", "testBio.methode.uniteResultat")); - columns.add(new PropertyColumn<ResultatTestBio, String>(new Model<String>(getString("Extrait.typeExtrait2")), + columns.add(new PropertyColumn<ResultatTestBio, String>(new Model<String>(templatePage.getString("Extrait.typeExtrait2")), "typeExtraitSource", "typeExtraitSource")); - columns.add(new BooleanPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("ResultatTestBio.actif")), - "actif", "actif", (TemplatePage) getPage())); + columns.add(new BooleanPropertyColumn<ResultatTestBio, String>(new Model<String>(templatePage.getString("ResultatTestBio.actif")), + "actif", "actif", templatePage)); - columns.add(new TaxonomyPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("Specimen.famille")), + columns.add(new TaxonomyPropertyColumn<ResultatTestBio, String>(new Model<String>(templatePage.getString("Specimen.famille")), "lotSource.specimenRef.famille", "lotSource.specimenRef.famille")); - columns.add(new TaxonomyPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("Specimen.genre")), + columns.add(new TaxonomyPropertyColumn<ResultatTestBio, String>(new Model<String>(templatePage.getString("Specimen.genre")), "lotSource.specimenRef.genre", "lotSource.specimenRef.genre")); - columns.add(new TaxonomyPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("Specimen.espece")), + columns.add(new TaxonomyPropertyColumn<ResultatTestBio, String>(new Model<String>(templatePage.getString("Specimen.espece")), "lotSource.specimenRef.espece", "lotSource.specimenRef.espece")); columns.add(new MapValuePropertyColumn<ResultatTestBio, String, String>(new Model<String>( - getString("Campagne.codePays")), "lotSource.campagne.codePays", "lotSource.campagne.codePays", - WebContext.COUNTRIES.get(getSession().getLocale()))); + templatePage.getString("Campagne.codePays")), "lotSource.campagne.codePays", "lotSource.campagne.codePays", + WebContext.COUNTRIES.get(templatePage.getSession().getLocale()))); - columns.add(new PropertyColumn<ResultatTestBio, String>(new Model<String>(getString("ResultatTestBio.repere")), + columns.add(new PropertyColumn<ResultatTestBio, String>(new Model<String>(templatePage.getString("ResultatTestBio.repere")), "repere", "repere")); - columns.add(new LinkPropertyColumn<ResultatTestBio, String>(new Model<String>(getString("TestBio.ref")), "testBio.ref", - "testBio.ref", getString("Read")) { + columns.add(new LinkPropertyColumn<ResultatTestBio, String>(new Model<String>(templatePage.getString("TestBio.ref")), "testBio.ref", + "testBio.ref", templatePage.getString("Read")) { @Override public void onClick(Item<ICellPopulator<ResultatTestBio>> item, String componentId, IModel<ResultatTestBio> model) { - setResponsePage(new ReadTestBioPage(model.getObject().getTestBio().getIdTestBio(), currentPage)); + templatePage.setResponsePage(new ReadTestBioPage(model.getObject().getTestBio().getIdTestBio(), callerPage)); } }); - columns.add(new LinkableImagePropertyColumn<ResultatTestBio, String>("images/edit.png", getString("Update"), - getString("Update")) { + columns.add(new LinkableImagePropertyColumn<ResultatTestBio, String>("images/edit.png", templatePage.getString("Update"), + templatePage.getString("Update")) { // pas de lien d'édition si l'utilisateur n'a pas les droits @Override public void populateItem(Item<ICellPopulator<ResultatTestBio>> item, String componentId, IModel<ResultatTestBio> model) { - if (testBioService.updateOrdeleteTestBioEnabled(model.getObject().getTestBio(), getSession() + if (testBioService.updateOrdeleteTestBioEnabled(model.getObject().getTestBio(), templatePage.getSession() .getUtilisateur())) { item.add(new LinkableImagePanel(item, componentId, model)); } else { @@ -189,13 +210,13 @@ @Override public void onClick(Item<ICellPopulator<ResultatTestBio>> item, String componentId, IModel<ResultatTestBio> model) { - setResponsePage(new ManageTestBioPage(model.getObject().getTestBio().getIdTestBio(), currentPage)); + templatePage.setResponsePage(new ManageTestBioPage(model.getObject().getTestBio().getIdTestBio(), callerPage)); } }); final DataTable<ResultatTestBio, String> resTestBiosDataTable = new AjaxFallbackDefaultDataTable<ResultatTestBio, String>( - "ListTestsBioPage.ResultatsTestsBio", columns, resTestBiosDataProvider, WebContext.ROWS_PER_PAGE); - + componentId, columns, resTestBiosDataProvider, WebContext.ROWS_PER_PAGE); + resTestBiosDataTable.addBottomToolbar(new TableExportToolbar(resTestBiosDataTable, "testsbio", templatePage.getSession().getLocale())); // DRAFT FOR FILTER TABLE // resTestBiosDataTable.addTopToolbar(new NavigationToolbar(resTestBiosDataTable)); // resTestBiosDataTable.addTopToolbar(new HeadersToolbar(resTestBiosDataTable, resTestBiosDataProvider)); @@ -207,7 +228,6 @@ * @Override protected void onSubmit() { resTestBiosDataTable.setCurrentPage(0); } }; resTestBiosDataTable * .addTopToolbar(new FilterToolbar(resTestBiosDataTable, filterForm, resTestBiosDataProvider)); */ - resTestsBiosRefresh.add(resTestBiosDataTable); - + return resTestBiosDataTable; } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/behaviors/MoleculeEditorBehavior.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/behaviors/MoleculeEditorBehavior.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/behaviors/MoleculeEditorBehavior.java 2013-02-15 11:49:11 UTC (rev 115) @@ -22,8 +22,6 @@ */ package nc.ird.cantharella.web.utils.behaviors; -import nc.ird.cantharella.web.pages.HomePage; - import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.core.util.string.JavaScriptUtils; @@ -32,8 +30,6 @@ import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.model.IModel; import org.apache.wicket.request.Response; -import org.apache.wicket.request.resource.CssResourceReference; -import org.apache.wicket.request.resource.JavaScriptResourceReference; /** * Permet d'ajouter la formule dans un attribut formula. L'attribut est ensuite Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/behaviors/MoleculeViewBehavior.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/behaviors/MoleculeViewBehavior.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/behaviors/MoleculeViewBehavior.java 2013-02-15 11:49:11 UTC (rev 115) @@ -22,8 +22,6 @@ */ package nc.ird.cantharella.web.utils.behaviors; -import nc.ird.cantharella.web.pages.HomePage; - import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.core.util.string.JavaScriptUtils; @@ -32,8 +30,6 @@ import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.model.IModel; import org.apache.wicket.request.Response; -import org.apache.wicket.request.resource.CssResourceReference; -import org.apache.wicket.request.resource.JavaScriptResourceReference; /** * Permet d'ajouter la formule dans un attribut formula. L'attribut est ensuite Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/BooleanPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/BooleanPropertyColumn.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/BooleanPropertyColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -27,9 +27,9 @@ import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.export.IExportableColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; /** @@ -38,7 +38,7 @@ * @param <T> Type of the row model * @param <S> the type of the sort property */ -public class BooleanPropertyColumn<T, S> extends AbstractColumn<T, S> implements ExportableColumn<T, S> { +public class BooleanPropertyColumn<T, S> extends AbstractColumn<T, S> implements IExportableColumn<T, S, Object> { /** wicket property expression */ private final String propertyExpression; @@ -63,26 +63,13 @@ /** {@inheritDoc} */ @Override public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> rowModel) { - cellItem.add(new Label(componentId, new DisplayBooleanPropertyModel(rowModel.getObject(), propertyExpression, - page))); + cellItem.add(new Label(componentId, getDataModel(rowModel))); } /** {@inheritDoc} */ @Override - public String getHeaderName() { - return getDisplayModel().getObject().toString(); + public IModel<Object> getDataModel(final IModel<T> rowModel) { + IModel<Object> textModel = new DisplayBooleanPropertyModel(rowModel.getObject(), propertyExpression, page); + return textModel; } - - /** {@inheritDoc} */ - @Override - public void exportCsv(final T object, CsvWriter writer) { - IModel<?> textModel = new DisplayBooleanPropertyModel(new AbstractReadOnlyModel<T>() { - @Override - public T getObject() { - return object; - } - }, propertyExpression, page); - writer.write(textModel.getObject()); - textModel.detach(); - } } Deleted: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/CsvWriter.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/CsvWriter.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/CsvWriter.java 2013-02-15 11:49:11 UTC (rev 115) @@ -1,102 +0,0 @@ -/* - * #%L - * Cantharella :: Web - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2013 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below) - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ -package nc.ird.cantharella.web.utils.columns; - -import java.io.OutputStream; -import java.io.PrintWriter; - -/** - * CsvWriter helper used to export data from data table. - * - * @author echatellier - */ -public class CsvWriter { - - /** Output writer. */ - private final PrintWriter out; - - /** First column flag. */ - private boolean first = true; - - /** Csv separator. */ - private char separator; - - /** - * Constructor. - * - * @param os output stream - * @param separator csv separator - */ - public CsvWriter(OutputStream os, char separator) { - out = new PrintWriter(os); - this.separator = separator; - } - - /** - * Write simple column data. - * - * @param value value to write - * @return {@code this} - */ - public CsvWriter write(Object value) { - if (!first) { - out.append(separator); - } - out.append("\""); - if (value != null) { - out.append(value.toString().replace("\"", "\"\"") - .replace("\n", " ")); - } - out.append("\""); - first = false; - return this; - } - - /** - * End current line. - * - * @return {@code this} - */ - public CsvWriter endLine() { - out.append("\r\n"); - first = true; - return this; - } - - /** - * Flush output stream. - * - * @return {@code this} - */ - public CsvWriter flush() { - out.flush(); - return this; - } - - /** - * Close output stream. - */ - public void close() { - out.close(); - } -} Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/DecimalPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/DecimalPropertyColumn.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/DecimalPropertyColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -29,9 +29,9 @@ import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.export.IExportableColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; /** @@ -40,7 +40,7 @@ * @param <T> Type of the row model * @param <S> the type of the sort property */ -public class DecimalPropertyColumn<T, S> extends AbstractColumn<T, S> implements ExportableColumn<T, S> { +public class DecimalPropertyColumn<T, S> extends AbstractColumn<T, S> implements IExportableColumn<T, S, Object> { /** wicket property expression */ private final String propertyExpression; @@ -70,27 +70,14 @@ /** {@inheritDoc} */ @Override public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> rowModel) { - cellItem.add(new Label(componentId, new DisplayDecimalPropertyModel(rowModel.getObject(), propertyExpression, - format, locale))); + cellItem.add(new Label(componentId, getDataModel(rowModel))); } /** {@inheritDoc} */ @Override - public String getHeaderName() { - return getDisplayModel().getObject().toString(); + public IModel<Object> getDataModel(IModel<T> rowModel) { + return new DisplayDecimalPropertyModel(rowModel.getObject(), propertyExpression, + format, locale); } - /** {@inheritDoc} */ - @Override - public void exportCsv(final T object, CsvWriter writer) { - IModel<?> textModel = new DisplayDecimalPropertyModel(new AbstractReadOnlyModel<T>() { - @Override - public T getObject() { - return object; - } - }, propertyExpression, format, locale); - writer.write(textModel.getObject()); - textModel.detach(); - } - } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/EnumPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/EnumPropertyColumn.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/EnumPropertyColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -27,9 +27,9 @@ import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.export.IExportableColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; /** @@ -38,7 +38,7 @@ * @param <T> Type of the row model * @param <S> the type of the sort property */ -public class EnumPropertyColumn<T, S> extends AbstractColumn<T, S> implements ExportableColumn<T, S> { +public class EnumPropertyColumn<T, S> extends AbstractColumn<T, S> implements IExportableColumn<T, S, Object> { /** wicket property expression */ private final String propertyExpression; @@ -63,26 +63,12 @@ /** {@inheritDoc} */ @Override public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> rowModel) { - cellItem.add(new Label(componentId, - new DisplayEnumPropertyModel(rowModel.getObject(), propertyExpression, page))); + cellItem.add(new Label(componentId, getDataModel(rowModel))); } /** {@inheritDoc} */ @Override - public String getHeaderName() { - return getDisplayModel().getObject().toString(); + public IModel<Object> getDataModel(IModel<T> rowModel) { + return new DisplayEnumPropertyModel(rowModel.getObject(), propertyExpression, page); } - - /** {@inheritDoc} */ - @Override - public void exportCsv(final T object, CsvWriter writer) { - IModel<?> textModel = new DisplayEnumPropertyModel(new AbstractReadOnlyModel<T>() { - @Override - public T getObject() { - return object; - } - }, propertyExpression, page); - writer.write(textModel.getObject()); - textModel.detach(); - } } Deleted: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableColumn.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -1,42 +0,0 @@ -/* - * #%L - * Cantharella :: Web - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below) - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ -package nc.ird.cantharella.web.utils.columns; - -import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; - -/** - * Interface to mark column as exportable. - * - * @author echatellier - * - * @param <T> - * @param <S> the type of the sort property - */ -public interface ExportableColumn<T, S> extends IColumn<T, S> { - - /** Export column name. */ - String getHeaderName(); - - /** Export current object into writer. */ - void exportCsv(T object, CsvWriter writer); - } Deleted: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportablePropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportablePropertyColumn.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportablePropertyColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -1,69 +0,0 @@ -/* - * #%L - * Cantharella :: Web - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below) - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ -package nc.ird.cantharella.web.utils.columns; - -import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; -import org.apache.wicket.model.AbstractReadOnlyModel; -import org.apache.wicket.model.IModel; - -/** - * Override {@link PropertyColumn} to addd export support. - * - * @author echatellier - * - * @param <T> - * @param <S> the type of the sort property - */ -public class ExportablePropertyColumn<T, S> extends PropertyColumn<T, S> implements - ExportableColumn<T, S> { - - /** - * Constructor. - * - * @param displayModel display model - * @param sortProperty wicket sort property - * @param propertyExpression wicket sort expression - */ - public ExportablePropertyColumn(IModel<String> displayModel, S sortProperty, String propertyExpression) { - super(displayModel, sortProperty, propertyExpression); - } - - /** {@inheritDoc} */ - @Override - public String getHeaderName() { - return getDisplayModel().getObject().toString(); - } - - /** {@inheritDoc} */ - @Override - public void exportCsv(final T object, CsvWriter writer) { - IModel<?> textModel = createLabelModel(new AbstractReadOnlyModel<T>() { - @Override - public T getObject() { - return object; - } - }); - writer.write(textModel.getObject()); - textModel.detach(); - } -} Deleted: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableTextFilteredPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableTextFilteredPropertyColumn.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ExportableTextFilteredPropertyColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -1,70 +0,0 @@ -/* - * #%L - * Cantharella :: Web - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below) - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ -package nc.ird.cantharella.web.utils.columns; - -import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.TextFilteredPropertyColumn; -import org.apache.wicket.model.AbstractReadOnlyModel; -import org.apache.wicket.model.IModel; - -/** - * Override {@link TextFilteredPropertyColumn} to add export support. - * - * @author echatellier - * - * @param <T> - * @param <F> - * @param <S> the type of the sort property - */ -public class ExportableTextFilteredPropertyColumn<T, F, S> extends TextFilteredPropertyColumn<T, F, S> implements ExportableColumn<T, S> { - - /** - * Constructor. - * - * @param displayModel display model - * @param sortProperty wicket sort property - * @param propertyExpression wicket sort expression - */ - public ExportableTextFilteredPropertyColumn(IModel<String> displayModel, - S sortProperty, String propertyExpression) { - super(displayModel, sortProperty, propertyExpression); - } - - /** {@inheritDoc} */ - @Override - public String getHeaderName() { - return getDisplayModel().getObject().toString(); - } - - /** {@inheritDoc} */ - @Override - public void exportCsv(final T object, CsvWriter writer) { - IModel<?> textModel = createLabelModel(new AbstractReadOnlyModel<T>() { - @Override - public T getObject() { - return object; - } - }); - writer.write(textModel.getObject()); - textModel.detach(); - } -} Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/LinkPropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/LinkPropertyColumn.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/LinkPropertyColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -30,7 +30,6 @@ import org.apache.wicket.markup.html.link.PopupSettings; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -40,7 +39,7 @@ * @param <T> Generic type * @param <S> the type of the sort property */ -abstract public class LinkPropertyColumn<T, S> extends PropertyColumn<T, S> implements ExportableColumn<T, S>{ +abstract public class LinkPropertyColumn<T, S> extends PropertyColumn<T, S> { /** Popup settings */ private PopupSettings popupSettings; @@ -166,29 +165,10 @@ IModel<?> tmpLabelModel = labelModel; if (labelModel == null) { - tmpLabelModel = createLabelModel(model); + tmpLabelModel = getDataModel(model); } link.add(new Label("label", tmpLabelModel)); } } - - /** {@inheritDoc} */ - @Override - public String getHeaderName() { - return getDisplayModel().getObject().toString(); - } - - /** {@inheritDoc} */ - @Override - public void exportCsv(final T object, CsvWriter writer) { - IModel<?> textModel = createLabelModel(new AbstractReadOnlyModel<T>() { - @Override - public T getObject() { - return object; - } - }); - writer.write(textModel.getObject()); - textModel.detach(); - } } \ No newline at end of file Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/MapValuePropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/MapValuePropertyColumn.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/MapValuePropertyColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -28,9 +28,9 @@ import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.export.IExportableColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; /** @@ -40,7 +40,7 @@ * @param <S> the type of the sort property * @param <U> Type of the map key. The map is thus parametred by <U, String> */ -public class MapValuePropertyColumn<T, S, U> extends AbstractColumn<T, S> implements ExportableColumn<T, S> { +public class MapValuePropertyColumn<T, S, U> extends AbstractColumn<T, S> implements IExportableColumn<T, S, Object> { /** wicket property expression */ private final String propertyExpression; @@ -65,26 +65,13 @@ /** {@inheritDoc} */ @Override public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> rowModel) { - cellItem.add(new Label(componentId, new DisplayMapValuePropertyModel<U>(rowModel.getObject(), - propertyExpression, map))); + cellItem.add(new Label(componentId, getDataModel(rowModel))); } /** {@inheritDoc} */ @Override - public String getHeaderName() { - return getDisplayModel().getObject().toString(); + public IModel<Object> getDataModel(IModel<T> rowModel) { + return new DisplayMapValuePropertyModel<U>(rowModel.getObject(), + propertyExpression, map); } - - /** {@inheritDoc} */ - @Override - public void exportCsv(final T object, CsvWriter writer) { - IModel<?> textModel = new DisplayMapValuePropertyModel<U>(new AbstractReadOnlyModel<T>() { - @Override - public T getObject() { - return object; - } - }, propertyExpression, map); - writer.write(textModel.getObject()); - textModel.detach(); - } } Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ShortDatePropertyColumn.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ShortDatePropertyColumn.java 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/columns/ShortDatePropertyColumn.java 2013-02-15 11:49:11 UTC (rev 115) @@ -28,9 +28,9 @@ import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.export.IExportableColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; /** @@ -39,7 +39,7 @@ * @param <T> Type of the row model * @param <S> the type of the sort property */ -public class ShortDatePropertyColumn<T, S> extends AbstractColumn<T, S> implements ExportableColumn<T, S> { +public class ShortDatePropertyColumn<T, S> extends AbstractColumn<T, S> implements IExportableColumn<T, S, Object> { /** wicket property expression */ private final String propertyExpression; @@ -64,26 +64,13 @@ /** {@inheritDoc} */ @Override public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> rowModel) { - cellItem.add(new Label(componentId, new DisplayShortDatePropertyModel(rowModel.getObject(), propertyExpression, - locale))); + cellItem.add(new Label(componentId, getDataModel(rowModel))); } /** {@inheritDoc} */ @Override - public String getHeaderName() { - return getDisplayModel().getObject().toString(); + public IModel<Object> getDataModel(IModel<T> rowModel) { + return new DisplayShortDatePropertyModel(rowModel.getObject(), propertyExpression, + locale); } - - /** {@inheritDoc} */ - @Override - public void exportCsv(final T object, CsvWriter writer) { - IModel<?> textModel = new DisplayShortDatePropertyModel(new AbstractReadOnlyModel<T>() { - @Override - public T getObject() { - return object; - } - }, propertyExpression, locale); - writer.write(textModel.getObject()); - textModel.detach(); - } } Added: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/data/TableExportToolbar.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/data/TableExportToolbar.java (rev 0) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/data/TableExportToolbar.java 2013-02-15 11:49:11 UTC (rev 115) @@ -0,0 +1,64 @@ +/* + * #%L + * Cantharella :: Web + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2012 IRD (Institut de Recherche pour le Developpement) and by respective authors (see below) + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package nc.ird.cantharella.web.utils.data; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; +import org.apache.wicket.extensions.markup.html.repeater.data.table.export.CSVDataExporter; +import org.apache.wicket.extensions.markup.html.repeater.data.table.export.ExportToolbar; +import org.apache.wicket.model.Model; + +/** + * Cantharella customisation of wicket {@link ExportToolbar}. + * + * @author Eric Chatellier + */ +public class TableExportToolbar extends ExportToolbar { + + public TableExportToolbar(DataTable<?, ?> table, String fileName, Locale locale) { + super(table); + + // set message model + setMessageModel(new Model<String>(getString("ExportTo"))); + + // file name model + DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd-HH_mm-"); + String headerFilename = dateFormat.format(new Date()); + setFileNameModel(new Model<String>(headerFilename + fileName)); + + CSVDataExporter csvDataExporter = new CSVDataExporter(); + // configuration du separateur suivant la locale + // fr : ; + // en : , + if (Locale.FRENCH.equals(locale)) { + csvDataExporter.setDelimiter(';'); + } else { + csvDataExporter.setDelimiter(','); + } + addDataExporter(csvDataExporter); + } +} Property changes on: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/utils/data/TableExportToolbar.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/cantharella.web/src/main/resources/web_en.properties =================================================================== --- trunk/cantharella.web/src/main/resources/web_en.properties 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/resources/web_en.properties 2013-02-15 11:49:11 UTC (rev 115) @@ -303,7 +303,6 @@ SearchPage.Molecules=Molecules SearchPage.QuerySyntax=Search terms (or parts of words using *). For a more advanced search, consult the ${advancedLink}. SearchPage.QuerySyntaxAdvanced=complete syntax -SearchPage.ExportCSV=Export to CSV #MODELS# @@ -418,7 +417,7 @@ Valid=Valid Reject=Reject Rebuild=Rebuild -Create=Create +Create=Create Add=Add Update=Modify Delete=Delete @@ -428,6 +427,7 @@ ReadPurification=View the purification TODO=ToDo Confirm=Are you sure? +ExportTo=Export to List.none=The list is empty. Boolean.true=yes Boolean.false=no Modified: trunk/cantharella.web/src/main/resources/web_fr.properties =================================================================== --- trunk/cantharella.web/src/main/resources/web_fr.properties 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/resources/web_fr.properties 2013-02-15 11:49:11 UTC (rev 115) @@ -302,7 +302,6 @@ SearchPage.Molecules=Molécules SearchPage.QuerySyntax=Rechercher des termes (ou des parties de termes avec *). Pour une utilisation plus avancée de la recherche, consulter la ${advancedLink}. SearchPage.QuerySyntaxAdvanced=synthaxe complète -SearchPage.ExportCSV=Exporter en CSV #MODELS# @@ -426,6 +425,7 @@ ReadPurification=Consulter la purification TODO=ToDo Confirm=Êtes-vous sûr ? +ExportTo=Exporter en List.none=La liste est vide. Boolean.true=oui Boolean.false=non Modified: trunk/cantharella.web/src/main/webapp/css/general.css =================================================================== --- trunk/cantharella.web/src/main/webapp/css/general.css 2013-02-15 07:33:46 UTC (rev 114) +++ trunk/cantharella.web/src/main/webapp/css/general.css 2013-02-15 11:49:11 UTC (rev 115) @@ -389,6 +389,14 @@ #content table thead { background-color: #CAD7E2; color:#003f58; +} + +#content table thead .navigatorLabel { + float: left; +} + +#content table thead .navigator { + text-align: right; } #content table th {