package de.tud.kom.socom.web.client.administration;
import java.util.Date;
import java.util.List;
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.i18n.client.DateTimeFormat;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.IntegerBox;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;
import de.tud.kom.socom.web.client.administration.AdministrationPresenter.AdministrationViewInterface;
import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorReportFilterRestrictionView;
import de.tud.kom.socom.web.client.htmlelements.ErrorList;
import de.tud.kom.socom.web.client.htmlelements.ErrorListItemView;
import de.tud.kom.socom.web.client.sharedmodels.Report;
public class ReportAdministrationView extends Composite implements AdministrationViewInterface<Report> {
private static AdministrationViewUiBinder uiBinder = GWT.create(AdministrationViewUiBinder.class);
private AdministrationPresenter presenter;
public static final DateTimeFormat DTF = DateTimeFormat.getFormat("d.MM.yy HH:mm");
interface AdministrationViewUiBinder extends UiBinder<Widget, ReportAdministrationView> {
}
public ReportAdministrationView(AdministrationPresenter presenter) {
this.presenter = presenter;
initWidget(uiBinder.createAndBindUi(this));
}
interface CellCss extends CssResource {
String reporttablecelleven();
String reporttablecellodd();
String reporttablecelltop();
String boldonhover();
}
@UiField
CellCss style;
@UiField
ErrorList errorList;
@UiField
Button unfoldButton;
@UiField
Button fetchButton;
@UiField
HTMLPanel filterPanel;
@UiField
HTMLPanel foldedFilterPanel;
@UiField
FlexTable reportTable;
@UiField
CheckBox userChk, contentChk, commentChk, inflansChk, showReviewedChk, useUserChk;
@UiField
TextBox informantBox;
@UiField
IntegerBox limitBox, offsetBox;
@UiField
ListBox orderbyList, orderbyAscDescList;
public ReportAdministrationView(String firstName) {
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler("fetchButton")
public void onFetchClicked(ClickEvent e) {
reportTable.removeAllRows();
hideErrors();
boolean user = userChk.getValue();
boolean content = contentChk.getValue();
boolean comment = commentChk.getValue();
boolean inflans = inflansChk.getValue();
String[] types = new String[0 + (user ? 1 : 0) + (content ? 1 : 0) + (comment ? 1 : 0) + (inflans ? 1 : 0)];
Integer limit = limitBox.getValue();
Integer offset = offsetBox.getValue();
if (limit < 1 || offset < 0 || types.length == 0) {
showError(new ErrorReportFilterRestrictionView());
return;
}
int c = 0;
if (user)
types[c++] = "user";
if (content)
types[c++] = "content";
if (comment)
types[c++] = "contentcomment";
if (inflans)
types[c++] = "influenceanswer";
boolean alreadyReviewed = showReviewedChk.getValue();
String fromInformant = useUserChk.getValue() ? informantBox.getValue() : null;
int sortPolicy = orderbyList.getSelectedIndex();
boolean ascending = orderbyAscDescList.getSelectedIndex() == 0;
presenter.loadReports(types, alreadyReviewed, fromInformant, limit, offset, sortPolicy, ascending);
filterPanel.addStyleName("hidden");
foldedFilterPanel.removeStyleName("hidden");
}
@UiHandler("unfoldButton")
public void onUnfoldFilterPanelClicked(ClickEvent e) {
foldedFilterPanel.addStyleName("hidden");
filterPanel.removeStyleName("hidden");
}
@Override
public void showError(ErrorListItemView error) {
this.errorList.addError(error);
}
@Override
public void hideErrors() {
this.errorList.clear();
}
@Override
public void hideError(ErrorListItemView error) {
this.errorList.removeError(error);
}
@Override
/**
* ignore parent (=null) since its always reportTable widget
*/
public void updateInformation(List<Report> res, UIObject parent) {
int col = 0;
reportTable.setText(0, col++, "ID");
reportTable.setText(0, col++, "Datum");
reportTable.setText(0, col++, "Typ");
reportTable.setText(0, col++, "Informant (ID)");
reportTable.setText(0, col++, "Grund");
reportTable.setText(0, col++, "Geprüft");
reportTable.setText(0, col, "Bearbeiten");
for (int row = 1; row < res.size() + 1; row++) {
col = 0;
Report report = res.get(row - 1);
reportTable.setText(row, col++, String.valueOf(report.getId()));
reportTable.setText(row, col++, DTF.format(new Date(report.getDate())));
reportTable.setText(row, col++, report.getTypeName());
reportTable.setText(row, col++, report.getInformantName() + " (" + report.getInformant() + ")");
reportTable.setText(row, col++, getShortenedReportText(report));
reportTable.setWidget(row, col++, createCheckbox(report));
reportTable.setWidget(row, col, createEditButton(report));
}
paintGrid();
reportTable.removeStyleName("hidden");
}
private void paintGrid() {
String[] widths = new String[]{"3%", "12%", "12%", "13%", "44%", "6%", "10%",
"10px", "10px", "10px", "10px"}; //last 4 are backup
int cols = reportTable.getCellCount(0);
for (int i = 0; i < cols; i++)
reportTable.getCellFormatter().addStyleName(0, i, style.reporttablecelltop());
for (int i = 1; i < reportTable.getRowCount(); i++){
reportTable.getRowFormatter().addStyleName(i, style.boldonhover());
for (int j = 0; j < cols; j++){
reportTable.getCellFormatter().addStyleName(i, j,
i % 2 == 0 ? style.reporttablecellodd() : style.reporttablecelleven());
reportTable.getCellFormatter().setWidth(i, j, widths[j]);
}
}
}
private String getShortenedReportText(Report report) {
String reportText = report.getReport();
if (reportText.length() > 65)
reportText = reportText.substring(0, 65) + "...";
return reportText;
}
private Button createEditButton(final Report report) {
Button b = new Button();
b.addStyleName("button");
b.setText(report.isReviewed() ? "Ändern" : "Prüfen");
b.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
presenter.onReportClicked(report);
}
});
return b;
}
private CheckBox createCheckbox(Report report) {
CheckBox cb = new CheckBox();
cb.setValue(report.isReviewed());
cb.setEnabled(false);
return cb;
}
public void checkReviewed(long id) {
for (int j = 0; j < reportTable.getRowCount(); j++){
if(reportTable.getText(j, 0).equals(String.valueOf(id))){
Widget cb = reportTable.getWidget(j, 5);
if(cb instanceof CheckBox)
((CheckBox)cb).setValue(true);
Widget b = reportTable.getWidget(j, 6);
if(b instanceof Button)
((Button)b).setText("Ändern");
break;
}
}
}
}