package kornell.gui.client.presentation.admin.courseclass.courseclass.generic;
import static com.google.gwt.dom.client.BrowserEvents.CLICK;
import java.util.LinkedList;
import java.util.List;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.CellTable;
import com.github.gwtbootstrap.client.ui.ListBox;
import com.github.gwtbootstrap.client.ui.Modal;
import com.github.gwtbootstrap.client.ui.Tab;
import com.github.gwtbootstrap.client.ui.TabPanel;
import com.github.gwtbootstrap.client.ui.TextArea;
import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.Tooltip;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.github.gwtbootstrap.client.ui.constants.IconType;
import com.github.gwtbootstrap.client.ui.constants.Placement;
import com.github.gwtbootstrap.client.ui.resources.ButtonSize;
import com.google.gwt.cell.client.ActionCell;
import com.google.gwt.cell.client.ActionCell.Delegate;
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.ValueUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
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.cellview.client.Column;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.event.shared.EventBus;
import kornell.api.client.Callback;
import kornell.api.client.KornellSession;
import kornell.core.entity.CourseClassState;
import kornell.core.entity.EnrollmentCategory;
import kornell.core.entity.EnrollmentProgressDescription;
import kornell.core.entity.EnrollmentState;
import kornell.core.entity.InstitutionType;
import kornell.core.entity.RegistrationType;
import kornell.core.to.CourseClassTO;
import kornell.core.to.CourseClassesTO;
import kornell.core.to.EnrollmentTO;
import kornell.core.to.UnreadChatThreadTO;
import kornell.core.util.StringUtils;
import kornell.gui.client.ViewFactory;
import kornell.gui.client.event.UnreadMessagesCountChangedEvent;
import kornell.gui.client.event.UnreadMessagesCountChangedEventHandler;
import kornell.gui.client.event.UnreadMessagesPerThreadFetchedEvent;
import kornell.gui.client.event.UnreadMessagesPerThreadFetchedEventHandler;
import kornell.gui.client.presentation.admin.courseclass.courseclass.AdminCourseClassView;
import kornell.gui.client.presentation.message.MessagePresenter;
import kornell.gui.client.util.AsciiUtils;
import kornell.gui.client.util.EnumTranslator;
import kornell.gui.client.util.forms.FormHelper;
import kornell.gui.client.util.view.KornellNotification;
import kornell.gui.client.util.view.KornellPagination;
import kornell.gui.client.util.view.LoadingPopup;
public class GenericAdminCourseClassView extends Composite implements AdminCourseClassView,
UnreadMessagesPerThreadFetchedEventHandler, UnreadMessagesCountChangedEventHandler {
interface MyUiBinder extends UiBinder<Widget, GenericAdminCourseClassView> {
}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private KornellSession session;
private EventBus bus;
private PlaceController placeCtrl;
private ViewFactory viewFactory;
private AdminCourseClassView.Presenter presenter;
final CellTable<EnrollmentTO> table;
private List<EnrollmentTO> enrollmentsOriginal;
private KornellPagination pagination;
private TextBox txtSearch;
private Button btnSearch;
private boolean isEnabled;
private Integer maxEnrollments = 0;
private Integer numEnrollments = 0;
private GenericCourseClassReportsView reportsView;
private GenericCourseClassMessagesView messagesView;
private FormHelper formHelper;
private Timer updateTimer;
private boolean canPerformEnrollmentAction = true;
private MessagePresenter messagePresenter;
private int totalCount = 0;
private EnrollmentTO selectedEnrollment;
private CourseClassTO courseClassTO;
@UiField
FlowPanel adminHomePanel;
@UiField
FlowPanel enrollPanel;
@UiField
FlowPanel enrollmentsPanel;
@UiField
FlowPanel addEnrollmentsPanel;
@UiField
Tab enrollmentsTab;
@UiField
Tab enrollTab;
@UiField
Tab configTab;
@UiField
FlowPanel configPanel;
@UiField
Tab reportsTab;
@UiField
FlowPanel reportsPanel;
@UiField
Tab messagesTab;
@UiField
FlowPanel messagesPanel;
@UiField
Button btnAddEnrollment;
@UiField
Button btnAddEnrollmentBatch;
@UiField
Button btnCancelEnrollmentBatch;
@UiField
TextBox txtFullName;
@UiField
TextBox txtEmail;
@UiField
TextArea txtAddEnrollmentBatch;
@UiField
Label identifierLabel;
@UiField
FlowPanel infoPanel;
@UiField
Modal errorModal;
@UiField
Label txtModal1;
@UiField
Label txtModal2;
@UiField
TextArea txtModalError;
@UiField
com.google.gwt.user.client.ui.Button btnModalOK;
@UiField
com.google.gwt.user.client.ui.Button btnModalCancel;
@UiField
Modal transferModal;
@UiField
Label txtModalTransfer1;
@UiField
ListBox courseClassListBox;
@UiField
com.google.gwt.user.client.ui.Button btnModalTransferOK;
@UiField
com.google.gwt.user.client.ui.Button btnModalTransferCancel;
@UiField
Modal batchCancelModal;
@UiField
com.google.gwt.user.client.ui.Button btnBatchCancelModalOK;
@UiField
com.google.gwt.user.client.ui.Button btnBatchCancelModalCancel;
@UiField
Label lblCourseClassName;
@UiField
Label lblCourseName;
@UiField
Label lblEnrollmentsCount;
@UiField
Label lblEnrollmentsCancelledCount;
@UiField
Label lblEnrollmentsAvailableCount;
@UiField
Label lblStatus;
@UiField
FlowPanel enrollmentsWrapper;
@UiField
TabPanel tabsPanel;
Tab adminsTab;
FlowPanel adminsPanel;
private List<UnreadChatThreadTO> unreadChatThreadTOs;
public GenericAdminCourseClassView(final KornellSession session, EventBus bus, PlaceController placeCtrl,
ViewFactory viewFactory) {
this.session = session;
this.bus = bus;
this.placeCtrl = placeCtrl;
this.viewFactory = viewFactory;
this.messagePresenter = viewFactory.getMessagePresenterCourseClass();
this.messagePresenter.enableMessagesUpdate(false);
initWidget(uiBinder.createAndBindUi(this));
tabsPanel.setVisible(false);
table = new CellTable<EnrollmentTO>();
formHelper = new FormHelper();
bus.addHandler(UnreadMessagesPerThreadFetchedEvent.TYPE, this);
bus.addHandler(UnreadMessagesCountChangedEvent.TYPE, this);
txtModalError.setReadOnly(true);
btnModalOK.setText("OK".toUpperCase());
btnModalCancel.setText("Cancelar".toUpperCase());
btnBatchCancelModalOK.setText("OK".toUpperCase());
btnBatchCancelModalCancel.setText("Cancelar".toUpperCase());
btnModalTransferOK.setText("OK".toUpperCase());
btnModalTransferCancel.setText("Cancelar".toUpperCase());
enrollmentsTab.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
presenter.updateCourseClass(session.getCurrentCourseClass().getCourseClass().getUUID());
messagePresenter.enableMessagesUpdate(false);
}
});
enrollTab.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
messagePresenter.enableMessagesUpdate(false);
}
});
configTab.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
buildConfigView(false);
messagePresenter.enableMessagesUpdate(false);
}
});
reportsTab.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
buildReportsView();
messagePresenter.enableMessagesUpdate(false);
}
});
messagesTab.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
messagePresenter.enableMessagesUpdate(true);
buildMessagesView();
}
});
if (session.isInstitutionAdmin()) {
adminsTab = new Tab();
adminsTab.setIcon(IconType.GROUP);
adminsTab.setHeading("Administradores");
adminsTab.setActive(false);
adminsPanel = new FlowPanel();
adminsTab.add(adminsPanel);
adminsTab.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
buildAdminsView();
messagePresenter.enableMessagesUpdate(false);
}
});
tabsPanel.add(adminsTab);
}
updateTimer = new Timer() {
@Override
public void run() {
filterEnrollments();
}
};
}
public void setTabsVisibility() {
enrollTab.asTabLink().setVisible(session.isCourseClassAdmin());
configTab.asTabLink().setVisible(session.isCourseClassAdmin());
reportsTab.asTabLink().setVisible(
session.isCourseClassAdmin() || session.isCourseClassObserver() || session.isCourseClassTutor());
messagesTab.asTabLink().setVisible(session.isCourseClassAdmin() || session.isCourseClassTutor());
if (adminsTab != null)
adminsTab.asTabLink().setVisible(session.isInstitutionAdmin());
}
@Override
public void prepareAddNewCourseClass(boolean addingNewCourseClass) {
adminHomePanel.clear();
if (!addingNewCourseClass) {
adminHomePanel.add(tabsPanel);
configPanel.clear();
configTab.setActive(false);
reportsPanel.clear();
reportsTab.setActive(false);
reportsView = null;
messagesTab.setActive(false);
messagesView = null;
if (adminsTab != null)
adminsTab.setActive(false);
enrollmentsTab.setActive(true);
enrollTab.setActive(false);
}
}
@Override
public void buildConfigView(boolean isCreationMode) {
prepareAddNewCourseClass(isCreationMode);
if (!isCreationMode) {
configPanel.add(new GenericCourseClassConfigView(session, bus, placeCtrl, presenter, session
.getCurrentCourseClass()));
}
}
@Override
public void buildReportsView() {
if (reportsView == null) {
reportsView = new GenericCourseClassReportsView(session, bus, presenter, session.getCurrentCourseClass());
}
reportsPanel.clear();
reportsPanel.add(reportsView);
}
@Override
public void buildMessagesView() {
if (messagesView == null) {
messagesView = new GenericCourseClassMessagesView(session, bus, placeCtrl, viewFactory, messagePresenter,
session.getCurrentCourseClass());
}
messagePresenter.filterAndShowThreads();
messagesPanel.clear();
messagesPanel.add(messagesView);
}
@Override
public void buildAdminsView() {
adminsPanel.clear();
if (!session.isInstitutionAdmin())
return;
adminsPanel.add(new GenericCourseClassAdminsView(session, presenter, session.getCurrentCourseClass()));
}
private void initSearch() {
if (txtSearch == null) {
txtSearch = new TextBox();
txtSearch.addStyleName("txtSearch");
txtSearch.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
scheduleEnrollmentFilter();
}
});
txtSearch.addKeyUpHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
scheduleEnrollmentFilter();
}
});
txtSearch.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
scheduleEnrollmentFilter();
}
});
btnSearch = new Button("Pesquisar");
btnSearch.setSize(ButtonSize.MINI);
btnSearch.setIcon(IconType.SEARCH);
btnSearch.addStyleName("btnNotSelected btnSearch");
btnSearch.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
scheduleEnrollmentFilter();
}
});
}
txtSearch.setValue(presenter.getSearchTerm());
txtSearch.setTitle("nome, "
+ EnumTranslator.translateEnum(session.getCurrentCourseClass().getCourseClass().getRegistrationType())
+ ", matrícula ou progresso");
}
private void initTable() {
table.addStyleName("adminCellTable");
table.addStyleName("lineWithoutLink");
table.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
for (int i = 0; table.getColumnCount() > 0;) {
table.removeColumn(i);
}
table.addColumn(new TextColumn<EnrollmentTO>() {
@Override
public String getValue(EnrollmentTO enrollmentTO) {
return enrollmentTO.getFullName();
}
}, "Nome");
table.addColumn(new TextColumn<EnrollmentTO>() {
@Override
public String getValue(EnrollmentTO enrollmentTO) {
return enrollmentTO.getUsername();
}
}, "Usuário");
table.addColumn(new TextColumn<EnrollmentTO>() {
@Override
public String getValue(EnrollmentTO enrollmentTO) {
return EnumTranslator.translateEnum(enrollmentTO.getEnrollment().getState());
}
}, "Matrícula");
table.addColumn(new TextColumn<EnrollmentTO>() {
@Override
public String getValue(EnrollmentTO enrollmentTO) {
String progressTxt = EnumTranslator.translateEnum(EnrollmentCategory
.getEnrollmentProgressDescription(enrollmentTO.getEnrollment()));
if (EnrollmentProgressDescription.inProgress.equals(EnrollmentCategory
.getEnrollmentProgressDescription(enrollmentTO.getEnrollment()))
&& new Integer(100).equals(enrollmentTO.getEnrollment().getProgress())) {
progressTxt = "Aguardando Avaliação";
} else if (EnrollmentProgressDescription.inProgress.equals(EnrollmentCategory
.getEnrollmentProgressDescription(enrollmentTO.getEnrollment()))) {
progressTxt += ": " + enrollmentTO.getEnrollment().getProgress() + "%";
} else if (EnrollmentProgressDescription.completed.equals(EnrollmentCategory
.getEnrollmentProgressDescription(enrollmentTO.getEnrollment()))
&& session.getCurrentCourseClass().getCourseClass().getRequiredScore() != null
&& session.getCurrentCourseClass().getCourseClass().getRequiredScore().intValue() != 0
&& enrollmentTO.getEnrollment().getAssessmentScore() != null) {
progressTxt += " - Nota: " + enrollmentTO.getEnrollment().getAssessmentScore().intValue();
}
return progressTxt;
}
}, "Progresso");
table.addColumn(new TextColumn<EnrollmentTO>() {
@Override
public String getValue(EnrollmentTO enrollmentTO) {
return formHelper.dateToString(enrollmentTO.getEnrollment().getEnrolledOn());
}
}, "Data da Matrícula");
List<HasCell<EnrollmentTO, ?>> cells = new LinkedList<HasCell<EnrollmentTO, ?>>();
cells.add(new EnrollmentActionsHasCell("Reenviar Email de Matrícula", getStateChangeDelegate(EnrollmentState.enrolled)));
cells.add(new EnrollmentActionsHasCell("Transferir", getTransferDelegate()));
cells.add(new EnrollmentActionsHasCell("Perfil", getGoToProfileDelegate()));
cells.add(new EnrollmentActionsHasCell("Certificado", getGenerateCertificateDelegate()));
cells.add(new EnrollmentActionsHasCell("Excluir", getDeleteEnrollmentDelegate()));
cells.add(new EnrollmentActionsHasCell("Matricular", getStateChangeDelegate(EnrollmentState.enrolled)));
cells.add(new EnrollmentActionsHasCell("Cancelar", getStateChangeDelegate(EnrollmentState.cancelled)));
cells.add(new EnrollmentActionsHasCell("Negar", getStateChangeDelegate(EnrollmentState.denied)));
cells.add(new EnrollmentActionsHasCell("Aceitar", getStateChangeDelegate(EnrollmentState.enrolled)));
CompositeCell<EnrollmentTO> cell = new CompositeCell<EnrollmentTO>(cells);
table.addColumn(new Column<EnrollmentTO, EnrollmentTO>(cell) {
@Override
public EnrollmentTO getValue(EnrollmentTO enrollmentTO) {
return enrollmentTO;
}
}, "Ações");
/*
* // Add a selection model to handle user selection. final
* SingleSelectionModel<EnrollmentTO> selectionModel = new
* SingleSelectionModel<EnrollmentTO>();
* table.setSelectionModel(selectionModel);
* selectionModel.addSelectionChangeHandler(new
* SelectionChangeEvent.Handler() { public void
* onSelectionChange(SelectionChangeEvent event) { // } });
*/
}
@Override
public void setPresenter(Presenter presenter) {
this.presenter = presenter;
pagination = new KornellPagination(table, presenter);
}
@UiHandler("btnModalOK")
void onModalOkButtonClicked(ClickEvent e) {
presenter.onModalOkButtonClicked();
}
@UiHandler("btnModalCancel")
void onModalCancelButtonClicked(ClickEvent e) {
errorModal.hide();
}
@UiHandler("btnModalTransferOK")
void onModalTransferOkButtonClicked(ClickEvent e) {
if (StringUtils.isSome(courseClassListBox.getSelectedValue())) {
presenter.onModalTransferOkButtonClicked(selectedEnrollment.getEnrollment().getUUID(),
courseClassListBox.getSelectedValue());
} else {
KornellNotification.show("Selecione uma turma.", AlertType.ERROR);
}
}
@UiHandler("btnModalTransferCancel")
void onModalTransferCancelButtonClicked(ClickEvent e) {
transferModal.hide();
}
@UiHandler("btnBatchCancelModalOK")
void onBatchCancelModalOkButtonClicked(ClickEvent e) {
presenter.onBatchCancelModalOkButtonClicked(txtAddEnrollmentBatch.getText());
batchCancelModal.hide();
}
@UiHandler("btnBatchCancelModalCancel")
void onBatchCancelModalCancelButtonClicked(ClickEvent e) {
batchCancelModal.hide();
}
@UiHandler("btnAddEnrollment")
void onAddEnrollmentButtonClicked(ClickEvent e) {
presenter.onAddEnrollmentButtonClicked(txtFullName.getText(), txtEmail.getText());
}
@UiHandler("btnAddEnrollmentBatch")
void doAddEnrollmentBatch(ClickEvent e) {
presenter.onAddEnrollmentBatchButtonClicked(txtAddEnrollmentBatch.getText());
}
@UiHandler("btnCancelEnrollmentBatch")
void doCancelEnrollmentBatch(ClickEvent e) {
if (courseClassTO.getCourseClass().isAllowBatchCancellation()) {
batchCancelModal.show();
}
}
@Override
public void setModalErrors(String title, String lbl1, String errors, String lbl2) {
errorModal.setTitle(title);
txtModal1.setText(lbl1);
txtModalError.setText(errors);
txtModal2.setText(lbl2);
}
@Override
public void setEnrollmentList(List<EnrollmentTO> enrollmentsIn, Integer count, Integer countCancelled,
Integer searchCount, boolean refresh) {
setTabsVisibility();
enrollmentsOriginal = enrollmentsIn;
this.isEnabled = CourseClassState.active.equals(session.getCurrentCourseClass().getCourseClass().getState());
addEnrollmentsPanel.setVisible(isEnabled);
numEnrollments = count;
maxEnrollments = session.getCurrentCourseClass().getCourseClass().getMaxEnrollments();
lblEnrollmentsCount.setText(numEnrollments + " / " + maxEnrollments);
lblEnrollmentsCancelledCount.setText("" + countCancelled);
lblEnrollmentsAvailableCount.setText("" + (maxEnrollments - numEnrollments));
if (!refresh)
return;
final ListBox pageSizeListBox = new ListBox();
enrollmentsWrapper.clear();
VerticalPanel panel = new VerticalPanel();
panel.setWidth("400");
panel.add(table);
// pageSizeListBox.addItem("1");
// pageSizeListBox.addItem("10");
pageSizeListBox.addItem("20");
pageSizeListBox.addItem("50");
pageSizeListBox.addItem("100");
pageSizeListBox.setSelectedValue(presenter.getPageSize());
pageSizeListBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
if (pageSizeListBox.getValue().matches("[0-9]*")) {
presenter.setPageNumber("1");
presenter.setPageSize(pageSizeListBox.getValue());
presenter.updateCourseClassUI(session.getCurrentCourseClass());
}
}
});
pageSizeListBox.addStyleName("pageSizeListBox");
FlowPanel tableTools = new FlowPanel();
tableTools.addStyleName("marginTop25");
tableTools.add(txtSearch);
tableTools.add(btnSearch);
tableTools.add(pageSizeListBox);
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
@Override
public void execute() {
txtSearch.setFocus(true);
}
});
enrollmentsWrapper.add(tableTools);
enrollmentsWrapper.add(panel);
enrollmentsWrapper.add(pagination);
pagination.setRowData(enrollmentsOriginal, StringUtils.isSome(presenter.getSearchTerm()) ? searchCount : count);
pageSizeListBox.setVisible(pagination.isVisible());
}
private void scheduleEnrollmentFilter() {
updateTimer.cancel();
updateTimer.schedule(500);
}
private void filterEnrollments() {
String newSearchTerm = AsciiUtils.convertNonAscii(txtSearch.getText().trim()).toLowerCase();
if (RegistrationType.cpf.equals(session.getCurrentCourseClass().getCourseClass().getRegistrationType())) {
newSearchTerm = newSearchTerm.replaceAll("-", "").replaceAll("\\.", "");
}
if (!presenter.getSearchTerm().equals(newSearchTerm)) {
presenter.setPageNumber("1");
presenter.setSearchTerm(newSearchTerm);
presenter.updateData();
}
}
@Override
public void showModal(boolean show, String type) {
if (show && "error".equals(type)) {
errorModal.show();
} else if (show && "transfer".equals(type)) {
transferModal.show();
} else {
errorModal.hide();
transferModal.hide();
}
}
@Override
public void setCanPerformEnrollmentAction(boolean allow) {
this.canPerformEnrollmentAction = allow;
}
private Delegate<EnrollmentTO> getStateChangeDelegate(final EnrollmentState state) {
return new Delegate<EnrollmentTO>() {
@Override
public void execute(EnrollmentTO object) {
if (canPerformEnrollmentAction) {
canPerformEnrollmentAction = false;
presenter.changeEnrollmentState(object, state);
}
}
};
}
private Delegate<EnrollmentTO> getDeleteEnrollmentDelegate() {
return new Delegate<EnrollmentTO>() {
@Override
public void execute(EnrollmentTO object) {
if (canPerformEnrollmentAction) {
canPerformEnrollmentAction = false;
presenter.deleteEnrollment(object);
}
}
};
}
private Delegate<EnrollmentTO> getTransferDelegate() {
return new Delegate<EnrollmentTO>() {
@Override
public void execute(EnrollmentTO object) {
if (canPerformEnrollmentAction &&
(!InstitutionType.DASHBOARD.equals(session.getInstitution().getInstitutionType()))) {
selectedEnrollment = object;
transferModal.setTitle("Transferir Matrícula");
txtModalTransfer1.setText("Selecione a turma desejada para transferir esse participante:");
LoadingPopup.show();
session.courseClasses().getAdministratedCourseClassesTOByCourseVersion(
courseClassTO.getCourseVersionTO().getCourseVersion().getUUID(),
new Callback<CourseClassesTO>() {
@Override
public void ok(CourseClassesTO to) {
LoadingPopup.hide();
if (to.getCourseClasses() == null
|| to.getCourseClasses().size() == 0
|| (to.getCourseClasses().size() == 1 && to.getCourseClasses().get(0)
.getCourseClass().getUUID()
.equals(courseClassTO.getCourseClass().getUUID()))) {
KornellNotification
.show("Nenhuma turma encontrada para a qual esse usuário possa ser transferido.",
AlertType.ERROR);
} else {
courseClassListBox.clear();
courseClassListBox.addItem("[Selecione uma turma]", "");
for (CourseClassTO courseClass : to.getCourseClasses()) {
if (!courseClass.getCourseClass().getUUID()
.equals(courseClassTO.getCourseClass().getUUID()))
courseClassListBox.addItem(courseClass.getCourseClass().getName(),
courseClass.getCourseClass().getUUID());
}
transferModal.show();
}
}
});
}
}
};
}
private Delegate<EnrollmentTO> getGoToProfileDelegate() {
return new Delegate<EnrollmentTO>() {
@Override
public void execute(EnrollmentTO object) {
if (canPerformEnrollmentAction) {
presenter.onUserClicked(object);
}
}
};
}
private Delegate<EnrollmentTO> getGenerateCertificateDelegate() {
return new Delegate<EnrollmentTO>() {
@Override
public void execute(EnrollmentTO object) {
if (canPerformEnrollmentAction) {
presenter.onGenerateCertificate(object);
}
}
};
}
@SuppressWarnings("hiding")
private class EnrollmentActionsActionCell<EnrollmentTO> extends ActionCell<EnrollmentTO> {
public EnrollmentActionsActionCell(String message, Delegate<EnrollmentTO> delegate) {
super(message, delegate);
}
@Override
public void onBrowserEvent(Context context, Element parent, EnrollmentTO value, NativeEvent event,
ValueUpdater<EnrollmentTO> valueUpdater) {
event.stopPropagation();
event.preventDefault();
super.onBrowserEvent(context, parent, value, event, valueUpdater);
if (CLICK.equals(event.getType())) {
EventTarget eventTarget = event.getEventTarget();
if (!Element.is(eventTarget)) {
return;
}
if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
// Ignore clicks that occur outside of the main element.
onEnterKeyDown(context, parent, value, event, valueUpdater);
}
}
}
}
private class EnrollmentActionsHasCell implements HasCell<EnrollmentTO, EnrollmentTO> {
private EnrollmentActionsActionCell<EnrollmentTO> cell;
public EnrollmentActionsHasCell(String text, Delegate<EnrollmentTO> delegate) {
final String actionName = text;
cell = new EnrollmentActionsActionCell<EnrollmentTO>(text, delegate) {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, EnrollmentTO object,
SafeHtmlBuilder sb) {
if (presenter.showActionButton(actionName, object)) {
SafeHtml html = SafeHtmlUtils.fromTrustedString(buildButtonHTML(actionName));
sb.append(html);
} else
sb.appendEscaped("");
}
private String buildButtonHTML(String actionName) {
Button btn = new Button();
btn.setSize(ButtonSize.SMALL);
btn.setTitle(actionName);
if ("Excluir".equals(actionName)) {
btn.setIcon(IconType.TRASH);
btn.addStyleName("btnNotSelected");
} else if ("Cancelar".equals(actionName)) {
btn.setIcon(IconType.REMOVE);
btn.addStyleName("btnSelected");
} else if ("Negar".equals(actionName)) {
btn.setIcon(IconType.THUMBS_DOWN);
btn.addStyleName("btnSelected");
} else if ("Matricular".equals(actionName)) {
btn.setIcon(IconType.BOOK);
btn.addStyleName("btnAction");
} else if ("Aceitar".equals(actionName)) {
btn.setIcon(IconType.THUMBS_UP);
btn.addStyleName("btnAction");
} else if ("Perfil".equals(actionName)) {
btn.setIcon(IconType.USER);
btn.addStyleName("btnNotSelected");
} else if ("Certificado".equals(actionName)) {
btn.setIcon(IconType.DOWNLOAD_ALT);
btn.addStyleName("btnNotSelected");
} else if ("Transferir".equals(actionName)) {
btn.setIcon(IconType.EXCHANGE);
btn.addStyleName("btnNotSelected");
} else if ("Reenviar Email de Matrícula".equals(actionName)) {
btn.setIcon(IconType.ENVELOPE);
btn.addStyleName("btnNotSelected");
}
btn.addStyleName("btnIconSolo");
return btn.toString();
}
};
}
@Override
public Cell<EnrollmentTO> getCell() {
return cell;
}
@Override
public FieldUpdater<EnrollmentTO, EnrollmentTO> getFieldUpdater() {
return null;
}
@Override
public EnrollmentTO getValue(EnrollmentTO object) {
return object;
}
}
@Override
public void setCourseClassTO(CourseClassTO courseClassTO) {
this.courseClassTO = courseClassTO;
this.lblCourseClassName.setText(courseClassTO.getCourseClass().getName());
this.lblCourseName.setText(courseClassTO.getCourseVersionTO().getCourse().getTitle());
String status = EnumTranslator.translateEnum(courseClassTO.getCourseClass().getState());
status += courseClassTO.getCourseClass().isInvisible() ? " / Invísivel" : "";
status += courseClassTO.getCourseClass().isPublicClass() ? " / Pública" : "";
this.lblStatus.setText(status);
}
@Override
public void setUserEnrollmentIdentificationType(RegistrationType registrationType) {
infoPanel.clear();
switch (registrationType) {
case email:
infoPanel.add(getLabel("Formato:", false));
infoPanel.add(getLabel("nome completo;email", true));
infoPanel.add(getLabel("* Um participante por linha", true));
infoPanel.add(getLabel("Exemplo:", false));
infoPanel.add(getLabel("Nome Sobrenome;email@example.com", true));
infoPanel.add(getLabel("Nome2 Sobrenome2;email2@example.com", true));
break;
case cpf:
infoPanel.add(getLabel("Formato:", false));
infoPanel.add(getLabel("nome completo;cpf", true));
infoPanel.add(getLabel("* Um participante por linha", true));
infoPanel.add(getLabel("Exemplo:", false));
infoPanel.add(getLabel("Nome Sobrenome;123.456.789-12", true));
infoPanel.add(getLabel("Nome2 Sobrenome2;12345687913", true));
break;
case username:
infoPanel.add(getLabel("Formato:", false));
infoPanel.add(getLabel("\"nome;usuário\"", true));
infoPanel.add(getLabel("* Um participante por linha", true));
infoPanel.add(getLabel("Exemplo:", false));
infoPanel.add(getLabel("Nome Sobrenome;12345", true));
infoPanel.add(getLabel("Nome2 Sobrenome2;12346", true));
break;
default:
break;
}
if (courseClassTO.getCourseClass().isAllowBatchCancellation()) {
infoPanel.add(getLabel("Cancelamento:", false));
infoPanel.add(getLabel("* Só os nomes de usuário", true));
}
identifierLabel.setText(EnumTranslator.translateEnum(session.getCurrentCourseClass().getCourseClass()
.getRegistrationType())
+ ":");
btnCancelEnrollmentBatch.setVisible(courseClassTO.getCourseClass().isAllowBatchCancellation());
initTable();
initSearch();
}
private Label getLabel(String labelTxt, boolean isHighlight) {
Label lbl = new Label(labelTxt);
lbl.addStyleName(isHighlight ? "niceTextColor" : "highlightText");
return lbl;
}
@Override
public void setHomeTabActive() {
enrollmentsTab.setActive(true);
configTab.setActive(false);
}
@Override
public void showEnrollmentsPanel(boolean visible) {
enrollmentsPanel.setVisible(visible);
}
@Override
public void showTabsPanel(boolean visible) {
tabsPanel.setVisible(visible);
}
private void updateMessagesTabHeading() {
messagesTab.setHeading("Mensagens" + (totalCount > 0 ? " (" + totalCount + ")" : ""));
}
@Override
public void onUnreadMessagesPerThreadFetched(UnreadMessagesPerThreadFetchedEvent event) {
unreadChatThreadTOs = event.getUnreadChatThreadTOs();
refreshMessagesCount();
}
private void refreshMessagesCount() {
if (unreadChatThreadTOs != null) {
int count = 0;
for (UnreadChatThreadTO unreadChatThreadTO : unreadChatThreadTOs) {
if (session.getCurrentCourseClass() != null
&& session.getCurrentCourseClass().getCourseClass().getUUID()
.equals(unreadChatThreadTO.getEntityUUID()))
count = count + Integer.parseInt(unreadChatThreadTO.getUnreadMessages());
}
totalCount = count;
} else {
totalCount = 0;
}
updateMessagesTabHeading();
}
@Override
public void onUnreadMessagesCountChanged(UnreadMessagesCountChangedEvent event) {
totalCount = event.isIncrement() ? totalCount + event.getCountChange() : totalCount - event.getCountChange();
updateMessagesTabHeading();
}
@Override
public void clearEnrollmentFields() {
txtFullName.setValue("");
txtEmail.setValue("");
txtAddEnrollmentBatch.setValue("");
}
@Override
public void clearPagination() {
presenter.setPageNumber("1");
presenter.setPageSize("20");
presenter.setSearchTerm("");
if (txtSearch != null) {
txtSearch.setText("");
}
}
}