package com.constellio.app.ui.pages.management.facet.fields; import static com.constellio.app.ui.i18n.i18n.$; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.vaadin.dialogs.ConfirmDialog; import com.constellio.app.ui.framework.buttons.DeleteButton; import com.constellio.app.ui.pages.management.facet.AddEditFacetConfigurationPresenter; import com.constellio.model.entities.records.wrappers.structure.FacetType; import com.constellio.model.entities.structures.MapStringStringStructure; import com.vaadin.data.Item; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Component; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Table; import com.vaadin.ui.VerticalLayout; @SuppressWarnings("unchecked") public class ValuesLabelFieldImpl<ModifiableStructure> extends ValuesLabelField<ModifiableStructure> { private VerticalLayout mainLayout; private Table valuesList; private AddEditFacetConfigurationPresenter presenter; public ValuesLabelFieldImpl(AddEditFacetConfigurationPresenter presenter) { this.presenter = presenter; } @Override protected Component initContent() { String postfix = presenter.getTypePostfix(); mainLayout = new VerticalLayout(); mainLayout.setSizeFull(); mainLayout.setSpacing(true); Button addValueButton = new Button($("AddEditFacetConfiguration.values.new." + postfix)); addValueButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { addEmptyValue(); } }); Button populateLabelsValuesButton = new Button($("AddEditFacetConfiguration.values.populate")); populateLabelsValuesButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { Map<String, String> values = presenter .getAutomaticValueForFacet(presenter.getDataFieldCode(), getValuesInTable()); for (Entry<String, String> entry : values.entrySet()) { addItem(entry.getValue(), entry.getKey()); } } }); populateLabelsValuesButton.setVisible(FacetType.FIELD == presenter.getFacetType()); HorizontalLayout horizontalLayout = new HorizontalLayout(); horizontalLayout.addStyleName("buttons-sltyle"); horizontalLayout.setSpacing(true); horizontalLayout.addComponents(addValueButton, populateLabelsValuesButton); final Table table = new Table($("AddEditFacetConfiguration.tableTitle")); table.addContainerProperty("value", String.class, null); table.addContainerProperty("label", String.class, null); table.addContainerProperty("delete", DeleteButton.class, null); table.setColumnHeader("value", $("AddEditFacetConfiguration.values.value." + postfix)); table.setColumnHeader("label", $("AddEditFacetConfiguration.values.label." + postfix)); table.setColumnHeader("delete", ""); table.setColumnWidth("delete", 50); table.setWidth("100%"); table.setEditable(true); table.setPageLength(table.getItemIds().size()); valuesList = table; Map<String, String> values = presenter.getValueForFacet(); for (Entry<String, String> entry : values.entrySet()) { addItem(entry.getValue(), entry.getKey()); } mainLayout.addComponents(horizontalLayout, table); return mainLayout; } private List<String> getValuesInTable() { List<String> valuesInTable = new ArrayList<>(); if (valuesList != null) { List<Integer> ids = (List<Integer>) valuesList.getItemIds(); for (Integer id : ids) { Item item = valuesList.getItem(id); String value = (String) item.getItemProperty("value").getValue(); valuesInTable.add(value); } } return valuesInTable; } private void addEmptyValue() { addItem("", ""); } private void addItem(String label, String value) { int id = (int) valuesList.addItem(); addItem(label, value, id); } private void addItem(String label, final String value, final int id) { Item row1 = valuesList.getItem(id); DeleteButton delete = new DeleteButton() { @Override protected void confirmButtonClick(ConfirmDialog dialog) { saveValues(); presenter.removeValue(id); refreshTable(); } }; row1.getItemProperty("value").setValue(value); row1.getItemProperty("label").setValue(label); row1.getItemProperty("delete").setValue(delete); presenter.addValue(label, value, id); } @Override public void saveValues() { if (valuesList != null) { List<Integer> ids = (List<Integer>) valuesList.getItemIds(); for (Integer id : ids) { Item item = valuesList.getItem(id); String label = (String) item.getItemProperty("label").getValue(); String value = (String) item.getItemProperty("value").getValue(); presenter.addValue(label, value, id); } } } @Override public Table getValueListTable() { return valuesList; } private void refreshTable() { valuesList.removeAllItems(); Map<Integer, Map<String, String>> values = presenter.getValues(); for (Integer id : values.keySet()) { Map<String, String> value = values.get(id); for (final String label : value.keySet()) { valuesList.addItem(id); addItem(label, value.get(label), id); } } } @Override public Class getType() { return MapStringStringStructure.class; } }