Java tutorial
/******************************************************************************* * SORMAS - Surveillance Outbreak Response Management & Analysis System * Copyright 2016-2018 Helmholtz-Zentrum fr Infektionsforschung GmbH (HZI) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. *******************************************************************************/ package de.symeda.sormas.ui.configuration.infrastructure; import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.Button; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; import com.vaadin.v7.ui.ComboBox; import com.vaadin.v7.ui.TextField; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.facility.FacilityCriteria; import de.symeda.sormas.api.facility.FacilityDto; import de.symeda.sormas.api.facility.FacilityType; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.Descriptions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.region.CommunityReferenceDto; import de.symeda.sormas.api.region.DistrictReferenceDto; import de.symeda.sormas.api.region.RegionReferenceDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; import de.symeda.sormas.ui.configuration.AbstractConfigurationView; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.FieldHelper; public abstract class AbstractFacilitiesView extends AbstractConfigurationView { private static final long serialVersionUID = -2015225571046243640L; private FacilityCriteria criteria; // Filter private TextField searchField; private ComboBox regionFilter; private ComboBox districtFilter; private ComboBox communityFilter; private Button resetButton; // private HorizontalLayout headerLayout; private HorizontalLayout filterLayout; private VerticalLayout gridLayout; protected FacilitiesGrid grid; protected Button createButton; protected Button exportButton; protected AbstractFacilitiesView(String viewName, boolean showLaboratories) { super(viewName); criteria = ViewModelProviders.of(AbstractFacilitiesView.class).get(FacilityCriteria.class); criteria.type(showLaboratories ? FacilityType.LABORATORY : null); grid = new FacilitiesGrid(); grid.setCriteria(criteria); gridLayout = new VerticalLayout(); // gridLayout.addComponent(createHeaderBar()); gridLayout.addComponent(createFilterBar()); gridLayout.addComponent(grid); gridLayout.setMargin(true); gridLayout.setSpacing(false); gridLayout.setExpandRatio(grid, 1); gridLayout.setSizeFull(); gridLayout.setStyleName("crud-main-layout"); if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_EXPORT)) { exportButton = new Button(I18nProperties.getCaption(Captions.export)); exportButton.setDescription(I18nProperties.getDescription(Descriptions.descExportButton)); exportButton.addStyleName(ValoTheme.BUTTON_PRIMARY); exportButton.setIcon(VaadinIcons.TABLE); addHeaderComponent(exportButton); } if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_CREATE)) { createButton = new Button(); createButton.addStyleName(ValoTheme.BUTTON_PRIMARY); createButton.setIcon(VaadinIcons.PLUS_CIRCLE); addHeaderComponent(createButton); } addComponent(gridLayout); } // TODO additional filter bar (active, archived and other) // private HorizontalLayout createHeaderBar() { // headerLayout = new HorizontalLayout(); // headerLayout.setSpacing(true); // headerLayout.setWidth(100, Unit.PERCENTAGE); // // return headerLayout; // } private HorizontalLayout createFilterBar() { filterLayout = new HorizontalLayout(); filterLayout.setMargin(false); filterLayout.setSpacing(true); searchField = new TextField(); searchField.setWidth(200, Unit.PIXELS); searchField.setNullRepresentation(""); searchField.setInputPrompt(I18nProperties.getString(Strings.promptSearch)); searchField.addTextChangeListener(e -> { criteria.nameCityLike(e.getText()); navigateTo(criteria); }); CssStyles.style(searchField, CssStyles.FORCE_CAPTION); filterLayout.addComponent(searchField); regionFilter = new ComboBox(); regionFilter.setWidth(140, Unit.PIXELS); regionFilter.setCaption(I18nProperties.getPrefixCaption(FacilityDto.I18N_PREFIX, FacilityDto.REGION)); regionFilter.addItems(FacadeProvider.getRegionFacade().getAllAsReference()); regionFilter.addValueChangeListener(e -> { RegionReferenceDto region = (RegionReferenceDto) e.getProperty().getValue(); criteria.region(region); navigateTo(criteria); FieldHelper.updateItems(districtFilter, region != null ? FacadeProvider.getDistrictFacade().getAllByRegion(region.getUuid()) : null); }); filterLayout.addComponent(regionFilter); districtFilter = new ComboBox(); districtFilter.setWidth(140, Unit.PIXELS); districtFilter.setCaption(I18nProperties.getPrefixCaption(FacilityDto.I18N_PREFIX, FacilityDto.DISTRICT)); districtFilter.addValueChangeListener(e -> { DistrictReferenceDto district = (DistrictReferenceDto) e.getProperty().getValue(); criteria.district(district); navigateTo(criteria); FieldHelper.updateItems(communityFilter, district != null ? FacadeProvider.getCommunityFacade().getAllByDistrict(district.getUuid()) : null); }); filterLayout.addComponent(districtFilter); communityFilter = new ComboBox(); communityFilter.setWidth(140, Unit.PIXELS); communityFilter.setCaption(I18nProperties.getPrefixCaption(FacilityDto.I18N_PREFIX, FacilityDto.COMMUNITY)); communityFilter.addValueChangeListener(e -> { criteria.community((CommunityReferenceDto) e.getProperty().getValue()); navigateTo(criteria); }); filterLayout.addComponent(communityFilter); resetButton = new Button(I18nProperties.getCaption(Captions.actionResetFilters)); resetButton.setVisible(false); CssStyles.style(resetButton, CssStyles.FORCE_CAPTION); resetButton.addClickListener(event -> { ViewModelProviders.of(AbstractFacilitiesView.class).remove(FacilityCriteria.class); navigateTo(null); }); filterLayout.addComponent(resetButton); return filterLayout; } @Override public void enter(ViewChangeEvent event) { super.enter(event); String params = event.getParameters().trim(); if (params.startsWith("?")) { params = params.substring(1); criteria.fromUrlParams(params); } updateFilterComponents(); grid.reload(); } public void updateFilterComponents() { // TODO replace with Vaadin 8 databinding applyingCriteria = true; resetButton.setVisible(criteria.hasAnyFilterActive()); searchField.setValue(criteria.getNameCityLike()); regionFilter.setValue(criteria.getRegion()); districtFilter.setValue(criteria.getDistrict()); communityFilter.setValue(criteria.getCommunity()); applyingCriteria = false; } }