package com.constellio.app.modules.rm.ui.pages.containers; import static com.constellio.app.ui.i18n.i18n.$; import java.util.Arrays; import java.util.List; import org.vaadin.dialogs.ConfirmDialog; import com.constellio.app.modules.rm.model.labelTemplate.LabelTemplate; import com.constellio.app.modules.rm.reports.factories.labels.LabelsReportParameters; import com.constellio.app.modules.rm.wrappers.ContainerRecord; import com.constellio.app.ui.entities.LabelParametersVO; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.framework.buttons.ConfirmDialogButton; import com.constellio.app.ui.framework.buttons.DisplayButton; import com.constellio.app.ui.framework.buttons.EditButton; import com.constellio.app.ui.framework.buttons.LabelsButton; import com.constellio.app.ui.framework.buttons.LabelsButton.RecordSelector; import com.constellio.app.ui.framework.buttons.ReportButton; import com.constellio.app.ui.framework.buttons.WindowButton; import com.constellio.app.ui.framework.components.BaseForm; import com.constellio.app.ui.framework.components.ComponentState; import com.constellio.app.ui.framework.components.RecordDisplay; import com.constellio.app.ui.framework.components.ReportViewer; import com.constellio.app.ui.framework.components.table.RecordVOTable; import com.constellio.app.ui.framework.containers.ButtonsContainer; import com.constellio.app.ui.framework.containers.ButtonsContainer.ContainerButton; import com.constellio.app.ui.framework.containers.RecordVOLazyContainer; import com.constellio.app.ui.framework.data.RecordVODataProvider; import com.constellio.app.ui.framework.reports.NewReportWriterFactory; import com.constellio.app.ui.pages.base.BaseViewImpl; import com.constellio.data.utils.Factory; import com.constellio.model.frameworks.validation.ValidationException; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.data.fieldgroup.PropertyId; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.ComboBox; import com.vaadin.ui.Component; import com.vaadin.ui.Label; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; public class DisplayContainerViewImpl extends BaseViewImpl implements DisplayContainerView, RecordSelector { private final DisplayContainerPresenter presenter; private Label borrowedLabel; public DisplayContainerViewImpl() { presenter = new DisplayContainerPresenter(this); } @Override protected void initBeforeCreateComponents(ViewChangeEvent event) { presenter.forContainerId(event.getParameters()); } public DisplayContainerPresenter getPresenter() { return this.presenter; } @Override protected void afterViewAssembled(ViewChangeEvent event) { setBorrowedMessage(presenter.getBorrowMessageState(presenter.getContainer())); } @Override protected Component buildMainComponent(ViewChangeEvent event) { VerticalLayout layout = new VerticalLayout(); layout.setWidth("100%"); layout.setSpacing(true); RecordVO container = presenter.getContainer(); borrowedLabel = new Label(); borrowedLabel.setVisible(false); borrowedLabel.addStyleName(ValoTheme.LABEL_COLORED); borrowedLabel.addStyleName(ValoTheme.LABEL_BOLD); layout.addComponents(borrowedLabel, new RecordDisplay(container)); try { Double fillRatio = presenter.getFillRatio(container); layout.addComponent(new ContainerRatioPanel(fillRatio)); } catch (ContainerWithoutCapacityException e) { layout.addComponent(new ContainerRatioPanel($("ContainerWithoutCapacityException"))); } catch (RecordInContainerWithoutLinearMeasure e) { layout.addComponent(new ContainerRatioPanel($("RecordInContainerWithoutLinearMeasure"))); } layout.addComponent(buildFoldersTable(presenter.getFolders())); return layout; } @Override protected ClickListener getBackButtonClickListener() { return new ClickListener() { @Override public void buttonClick(ClickEvent event) { presenter.backButtonClicked(); } }; } private Component buildFoldersTable(final RecordVODataProvider provider) { RecordVOLazyContainer folders = new RecordVOLazyContainer(provider); ButtonsContainer<RecordVOLazyContainer> container = new ButtonsContainer<>(folders, "buttons"); container.addButton(new ContainerButton() { @Override protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) { return new DisplayButton() { @Override protected void buttonClick(ClickEvent event) { Integer index = (Integer) itemId; RecordVO entity = provider.getRecordVO(index); presenter.displayFolderButtonClicked(entity); } }; } }); RecordVOTable table = new RecordVOTable($("DisplayContainerView.foldersTableTitle"), container); table.setWidth("100%"); table.setColumnHeader("buttons", ""); table.setPageLength(provider.size()); return table; } @Override protected String getTitle() { return $("DisplayContainerView.viewTitle"); } @Override protected List<Button> buildActionMenuButtons(ViewChangeEvent event) { List<Button> buttons = super.buildActionMenuButtons(event); Button edit = new EditButton($("DisplayContainerView.edit")) { @Override protected void buttonClick(ClickEvent event) { presenter.editContainer(); } }; edit.setVisible(presenter.isEditButtonVisible()); buttons.add(edit); Button slip = new ReportButton("Reports.ContainerRecordReport", presenter) { @Override protected Component buildWindowContent() { presenter.saveIfFirstTimeReportCreated(); return super.buildWindowContent(); } }; slip.setCaption($("DisplayContainerView.slip")); slip.setStyleName(ValoTheme.BUTTON_LINK); slip.setEnabled(presenter.canPrintReports()); buttons.add(slip); Factory<List<LabelTemplate>> customLabelTemplatesFactory = new Factory<List<LabelTemplate>>() { @Override public List<LabelTemplate> get() { return presenter.getCustomTemplates(); } }; Factory<List<LabelTemplate>> defaultLabelTemplatesFactory = new Factory<List<LabelTemplate>>() { @Override public List<LabelTemplate> get() { return presenter.getDefaultTemplates(); } }; Button labels = new LabelsButton($("SearchView.labels"), $("SearchView.printLabels"), customLabelTemplatesFactory, defaultLabelTemplatesFactory, getConstellioFactories().getAppLayerFactory(), getSessionContext().getCurrentCollection(), ContainerRecord.SCHEMA_TYPE, presenter.getContainerId(), getSessionContext().getCurrentUser().getUsername()); labels.setEnabled(presenter.canPrintReports()); buttons.add(labels); Button empty = new ConfirmDialogButton($("DisplayContainerView.empty")) { @Override protected String getConfirmDialogMessage() { return $("DisplayContainerView.confirmEmpty"); } @Override protected void confirmButtonClick(ConfirmDialog dialog) { presenter.emptyButtonClicked(); } }; ComponentState state = presenter.getEmptyButtonState(); empty.setVisible(state.isVisible()); empty.setEnabled(state.isEnabled()); buttons.add(empty); return buttons; } @Override public List<String> getSelectedRecordIds() { return Arrays.asList(presenter.getContainerId()); } // TODO: Quick hack to make printing container labels work... public static class ContainerLabelsButton extends WindowButton { private final RecordSelector selector; private final List<LabelTemplate> labelTemplates; private NewReportWriterFactory<LabelsReportParameters> labelsReportFactory; @PropertyId("startPosition") private ComboBox startPosition; @PropertyId("numberOfCopies") private TextField copies; @PropertyId("labelConfiguration") private ComboBox labelConfiguration; public ContainerLabelsButton(String caption, String windowCaption, RecordSelector selector, List<LabelTemplate> labelTemplates, final NewReportWriterFactory<LabelsReportParameters> labelsReportFactory) { super(caption, windowCaption, WindowConfiguration.modalDialog("75%", "75%")); this.selector = selector; this.labelTemplates = labelTemplates; this.labelsReportFactory = labelsReportFactory; } @Override protected Component buildWindowContent() { startPosition = new ComboBox($("LabelsButton.startPosition")); if (labelTemplates.size() > 0) { int size = labelTemplates.get(0).getLabelsReportLayout().getNumberOfLabelsPerPage(); startPosition.clear(); for (int i = 1; i <= size; i++) { startPosition.addItem(i); } } for (int i = 1; i <= 10; i++) { startPosition.addItem(i); } startPosition.setNullSelectionAllowed(false); labelConfiguration = new ComboBox($("LabelsButton.labelFormat")); for (LabelTemplate labelTemplate : labelTemplates) { labelConfiguration.addItem(labelTemplate); labelConfiguration.setItemCaption(labelTemplate, $(labelTemplate.getName())); } labelConfiguration.setNullSelectionAllowed(false); labelConfiguration.setImmediate(true); labelConfiguration.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { LabelTemplate labelTemplate = (LabelTemplate) event.getProperty().getValue(); int size = labelTemplate.getLabelsReportLayout().getNumberOfLabelsPerPage(); startPosition.clear(); startPosition.removeAllItems(); for (int i = 1; i <= size; i++) { startPosition.addItem(i); } } }); copies = new TextField($("LabelsButton.numberOfCopies")); copies.setConverter(Integer.class); return new BaseForm<LabelParametersVO>( new LabelParametersVO(labelTemplates.get(0)), this, labelConfiguration, startPosition, copies) { @Override protected void saveButtonClick(LabelParametersVO parameters) throws ValidationException { LabelsReportParameters labelsReportParameters = new LabelsReportParameters( selector.getSelectedRecordIds(), parameters.getLabelConfiguration(), parameters.getStartPosition(), parameters.getNumberOfCopies()); getWindow().setContent(new ReportViewer(labelsReportFactory.getReportBuilder(labelsReportParameters), labelsReportFactory.getFilename(null))); } @Override protected void cancelButtonClick(LabelParametersVO parameters) { getWindow().close(); } }; } } @Override public void setBorrowedMessage(String borrowedMessage) { if (borrowedMessage != null) { borrowedLabel.setVisible(true); borrowedLabel.setValue($(borrowedMessage)); } else { borrowedLabel.setVisible(false); borrowedLabel.setValue(null); } } }