/* * Copyright 2015 JBoss, by Red Hat, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.ext.widgets.common.client.tables.popup; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; import javax.enterprise.context.Dependent; import javax.enterprise.event.Event; import javax.inject.Inject; import com.google.gwt.cell.client.ActionCell; import com.google.gwt.cell.client.Cell; import com.google.gwt.cell.client.CompositeCell; import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.cell.client.HasCell; import com.google.gwt.cell.client.TextCell; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.AbstractImagePrototype; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.AsyncDataProvider; import com.google.gwt.view.client.HasData; import com.google.gwt.view.client.Range; import org.gwtbootstrap3.client.ui.Button; import org.gwtbootstrap3.client.ui.Form; import org.gwtbootstrap3.client.ui.FormGroup; import org.gwtbootstrap3.client.ui.FormLabel; import org.gwtbootstrap3.client.ui.HelpBlock; import org.gwtbootstrap3.client.ui.ListBox; import org.gwtbootstrap3.client.ui.ModalBody; import org.gwtbootstrap3.client.ui.TabListItem; import org.gwtbootstrap3.client.ui.TabPane; import org.gwtbootstrap3.client.ui.TextBox; import org.gwtbootstrap3.client.ui.constants.ButtonType; import org.gwtbootstrap3.client.ui.constants.ValidationState; import org.uberfire.ext.services.shared.preferences.GridPreferencesStore; import org.uberfire.ext.widgets.common.client.common.popups.BaseModal; import org.uberfire.ext.widgets.common.client.common.popups.footers.GenericModalFooter; import org.uberfire.ext.widgets.common.client.resources.CommonImages; import org.uberfire.ext.widgets.common.client.resources.i18n.CommonConstants; import org.uberfire.ext.widgets.common.client.tables.PagedTable; import org.uberfire.ext.widgets.table.client.ColumnMeta; import org.uberfire.mvp.Command; import org.uberfire.workbench.events.NotificationEvent; @Dependent public class NewFilterPopup extends BaseModal { public static String FILTER_NAME_PARAM = "filterName"; private static Binder uiBinder = GWT.create(Binder.class); private final List<FormGroup> filterControlGroups = new ArrayList<FormGroup>(); @UiField public TabListItem tabAdd; @UiField public TabListItem tabManagement; @UiField public Form horizontalForm; @UiField public FlowPanel existingFiltersPanel; @UiField public HelpBlock errorMessages; @UiField public FormGroup errorMessagesGroup; protected AsyncDataProvider<DataGridFilterSummary> dataProvider; @UiField TabPane tab1; @UiField TabPane tab2; HashMap formValues = new HashMap(); Command refreshFiltersCommand; PagedTable<DataGridFilterSummary> existingFiltersGrid = new PagedTable<DataGridFilterSummary>(5); @Inject private Event<NotificationEvent> notification; private GridPreferencesStore gridPreferenceStore; private CommonImages images = GWT.create(CommonImages.class); public NewFilterPopup() { createProvider(); initColumns(); setTitle(CommonConstants.INSTANCE.Filter_Management()); add(new ModalBody() {{ add(uiBinder.createAndBindUi(NewFilterPopup.this)); }}); tabAdd.setDataTargetWidget(tab1); tabManagement.setDataTargetWidget(tab2); init(); final GenericModalFooter footer = new GenericModalFooter(); footer.addButton(CommonConstants.INSTANCE.OK(), new Command() { @Override public void execute() { okButton(); } }, null, ButtonType.PRIMARY); add(footer); } public void show(Command addfilterCommand, Command refreshFilters, GridPreferencesStore gridPreferenceStore) { addCreateFilterButton(addfilterCommand); this.refreshFiltersCommand = refreshFilters; this.gridPreferenceStore = gridPreferenceStore; refreshGrid(); super.show(); } private void okButton() { refreshFiltersCommand.execute(); closePopup(); } public void init() { horizontalForm.clear(); filterControlGroups.clear(); FormGroup controlGroup = new FormGroup(); FormLabel controlLabel = new FormLabel(); controlLabel.setTitle(CommonConstants.INSTANCE.Filter_Name()); HTML lab = new HTML("<span style=\"color:red\"> * </span>" + "<span style=\"margin-right:10px\">" + CommonConstants.INSTANCE.Filter_Name() + "</span>"); controlLabel.setHTML(lab.getHTML()); TextBox fieldTextBox = new TextBox(); fieldTextBox.setName(FILTER_NAME_PARAM); controlGroup.add(controlLabel); controlGroup.add(fieldTextBox); filterControlGroups.add(controlGroup); horizontalForm.add(controlGroup); existingFiltersPanel.clear(); existingFiltersPanel.add(existingFiltersGrid); existingFiltersGrid.loadPageSizePreferences(); existingFiltersGrid.setColumnPickerButtonVisible(false); existingFiltersGrid.setEmptyTableCaption(CommonConstants.INSTANCE.NoCustomFilterAvailable()); } public void cleanFormValues(List<FormGroup> controlGroups) { formValues = new HashMap(); clearErrorMessages(); for (FormGroup groupControl : controlGroups) { if (groupControl.getWidget(1) instanceof TextBox) { ((TextBox) groupControl.getWidget(1)).setText(""); } else if (groupControl.getWidget(1) instanceof ListBox) { ListBox listBox = (ListBox) groupControl.getWidget(1); listBox.setSelectedIndex(-1); } } } public void closePopup() { cleanFormValues(filterControlGroups); hide(); super.hide(); } private boolean validateForm() { boolean valid = true; clearErrorMessages(); String filterName = (String) formValues.get(FILTER_NAME_PARAM); if (filterName == null || filterName.trim().length() == 0) { errorMessages.setText(CommonConstants.INSTANCE.Filter_Must_Have_A_Name()); errorMessagesGroup.setValidationState(ValidationState.ERROR); valid = false; } else { errorMessages.setText(""); errorMessagesGroup.setValidationState(ValidationState.NONE); } return valid; } public void getFormValues(List<FormGroup> controlGroups) { formValues = new HashMap(); for (FormGroup groupControl : controlGroups) { if (groupControl.getWidget(1) instanceof TextBox) { formValues.put(((TextBox) groupControl.getWidget(1)).getName(), ((TextBox) groupControl.getWidget(1)).getValue()); } else if (groupControl.getWidget(1) instanceof ListBox) { ListBox listBox = (ListBox) groupControl.getWidget(1); List<String> selectedValues = new ArrayList<String>(); for (int i = 0; i < listBox.getItemCount(); i++) { if (listBox.isItemSelected(i)) { selectedValues.add(listBox.getValue(i)); } } formValues.put(listBox.getName(), selectedValues); } } } private void clearErrorMessages() { errorMessages.setText(""); } public HashMap getFormValues() { return formValues; } public void addListBoxToFilter(String label, String fieldName, boolean multiselect, HashMap<String, String> listBoxInfo) { FormGroup controlGroup = new FormGroup(); FormLabel controlLabel = new FormLabel(); controlLabel.setTitle(label); HTML lab = new HTML("<span style=\"margin-right:10px\">" + label + "</span>"); controlLabel.setHTML(lab.getHTML()); ListBox listBox = new ListBox(multiselect); if (listBoxInfo != null) { Set listBoxKeys = listBoxInfo.keySet(); Iterator it = listBoxKeys.iterator(); String key; while (it.hasNext()) { key = (String) it.next(); listBox.addItem(listBoxInfo.get(key), key); } } listBox.setName(fieldName); controlGroup.add(controlLabel); controlGroup.add(listBox); filterControlGroups.add(controlGroup); horizontalForm.add(controlGroup); } public void addTextBoxToFilter(String label, String fieldName) { addTextBoxToFilter(label, fieldName, ""); } public void addTextBoxToFilter(String label, String fieldName, String defaultValue) { FormGroup controlGroup = new FormGroup(); FormLabel controlLabel = new FormLabel(); controlLabel.setTitle(label); HTML lab = new HTML("<span style=\"margin-right:10px\">" + label + "</span>"); controlLabel.setHTML(lab.getHTML()); TextBox textBox = new TextBox(); textBox.setName(fieldName); if (defaultValue != null && defaultValue.trim().length() > 0) { textBox.setText(defaultValue); } controlGroup.add(controlLabel); controlGroup.add(textBox); filterControlGroups.add(controlGroup); horizontalForm.add(controlGroup); } private void createProvider() { dataProvider = new AsyncDataProvider<DataGridFilterSummary>() { @Override protected void onRangeChanged(HasData<DataGridFilterSummary> display) { final Range visibleRange = display.getVisibleRange(); List<DataGridFilterSummary> currentCustomFilters = getData(); dataProvider.updateRowCount(currentCustomFilters.size(), true); int endRange; if (visibleRange.getStart() + 5 < currentCustomFilters.size()) { endRange = visibleRange.getStart() + 5; } else { endRange = currentCustomFilters.size(); } dataProvider.updateRowData(visibleRange.getStart(), currentCustomFilters.subList(visibleRange.getStart(), endRange)); } }; existingFiltersGrid.setDataProvider(dataProvider); } private List<DataGridFilterSummary> getData() { List<DataGridFilterSummary> customFilters = new ArrayList<DataGridFilterSummary>(); if (gridPreferenceStore != null) { final HashMap storedCustomFilters = gridPreferenceStore.getCustomFilters(); if (storedCustomFilters != null && storedCustomFilters.size() > 0) { Set customFilterKeys = storedCustomFilters.keySet(); Iterator it = customFilterKeys.iterator(); while (it.hasNext()) { final String customFilterName = (String) it.next(); customFilters.add(new DataGridFilterSummary(customFilterName)); } } } return customFilters; } public void initColumns() { com.google.gwt.user.cellview.client.Column descriptionColumn = initDescriptionColumn(); com.google.gwt.user.cellview.client.Column actionsColumn = initActionsColumn(); List<ColumnMeta<DataGridFilterSummary>> columnMetas = new ArrayList<ColumnMeta<DataGridFilterSummary>>(); columnMetas.add(new ColumnMeta<DataGridFilterSummary>(descriptionColumn, CommonConstants.INSTANCE.Filter_Name())); columnMetas.add(new ColumnMeta<DataGridFilterSummary>(actionsColumn, CommonConstants.INSTANCE.Actions())); existingFiltersGrid.addColumns(columnMetas); } private com.google.gwt.user.cellview.client.Column initDescriptionColumn() { // start time com.google.gwt.user.cellview.client.Column<DataGridFilterSummary, String> descriptionColumn = new com.google.gwt.user.cellview.client.Column<DataGridFilterSummary, String>(new TextCell()) { @Override public String getValue(DataGridFilterSummary object) { return object.getFilterName(); } }; descriptionColumn.setSortable(true); descriptionColumn.setDataStoreName("log.filterName"); return descriptionColumn; } private com.google.gwt.user.cellview.client.Column initActionsColumn() { List<HasCell<DataGridFilterSummary, ?>> cells = new LinkedList<HasCell<DataGridFilterSummary, ?>>(); cells.add(new RemoveActionHasCell("Remove", new ActionCell.Delegate<DataGridFilterSummary>() { @Override public void execute(DataGridFilterSummary filter) { gridPreferenceStore.removeCustomFilter(filter.getFilterName()); refreshGrid(); } })); CompositeCell<DataGridFilterSummary> cell = new CompositeCell<DataGridFilterSummary>(cells); com.google.gwt.user.cellview.client.Column<DataGridFilterSummary, DataGridFilterSummary> actionsColumn = new com.google.gwt.user.cellview.client.Column<DataGridFilterSummary, DataGridFilterSummary>( cell) { @Override public DataGridFilterSummary getValue(DataGridFilterSummary object) { return object; } }; return actionsColumn; } public void refreshGrid() { HasData<DataGridFilterSummary> next = dataProvider.getDataDisplays().iterator().next(); next.setVisibleRangeAndClearData(next.getVisibleRange(), true); } private void addCreateFilterButton(final Command addfilterCommand) { HorizontalPanel buttonPanel = new HorizontalPanel(); buttonPanel.setWidth("100%"); buttonPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); Button createFilterButton = new Button(); createFilterButton.setText(CommonConstants.INSTANCE.Add_New_Filter()); createFilterButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { getFormValues(filterControlGroups); if (validateForm()) { addfilterCommand.execute(); refreshGrid(); cleanFormValues(filterControlGroups); tabAdd.showTab(); } } }); buttonPanel.add(createFilterButton); horizontalForm.add(buttonPanel); } interface Binder extends UiBinder<Widget, NewFilterPopup> { } private class RemoveActionHasCell implements HasCell<DataGridFilterSummary, DataGridFilterSummary> { private ActionCell<DataGridFilterSummary> cell; public RemoveActionHasCell(String text, ActionCell.Delegate<DataGridFilterSummary> delegate) { cell = new ActionCell<DataGridFilterSummary>(text, delegate) { @Override public void render(Cell.Context context, final DataGridFilterSummary value, SafeHtmlBuilder sb) { AbstractImagePrototype imageProto = AbstractImagePrototype.create(images.close()); SafeHtmlBuilder mysb = new SafeHtmlBuilder(); mysb.appendHtmlConstant("<span title='" + CommonConstants.INSTANCE.RemoveFilter() + " " + value.getFilterName() + "' style='margin-right:5px;'>"); mysb.append(imageProto.getSafeHtml()); mysb.appendHtmlConstant("</span>"); sb.append(mysb.toSafeHtml()); } }; } @Override public Cell<DataGridFilterSummary> getCell() { return cell; } @Override public FieldUpdater<DataGridFilterSummary, DataGridFilterSummary> getFieldUpdater() { return null; } @Override public DataGridFilterSummary getValue(DataGridFilterSummary object) { return object; } } }