package kornell.gui.client.presentation.welcome.generic;
import static kornell.core.util.StringUtils.mkurl;
import java.util.Date;
import com.github.gwtbootstrap.client.ui.Heading;
import com.github.gwtbootstrap.client.ui.Paragraph;
import com.github.gwtbootstrap.client.ui.ProgressBar;
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.place.shared.PlaceController;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import kornell.api.client.Callback;
import kornell.api.client.KornellSession;
import kornell.core.entity.Course;
import kornell.core.entity.CourseClassState;
import kornell.core.entity.Enrollment;
import kornell.core.entity.EnrollmentProgress;
import kornell.core.entity.EnrollmentProgressDescription;
import kornell.core.entity.EnrollmentSource;
import kornell.core.entity.EnrollmentState;
import kornell.core.entity.EntityFactory;
import kornell.core.to.CourseClassTO;
import kornell.core.to.EnrollmentTO;
import kornell.core.to.TOFactory;
import kornell.core.util.StringUtils;
import kornell.gui.client.KornellConstants;
import kornell.gui.client.personnel.Student;
import kornell.gui.client.personnel.Teacher;
import kornell.gui.client.personnel.Teachers;
import kornell.gui.client.presentation.classroom.ClassroomPlace;
import kornell.gui.client.util.ClientConstants;
import kornell.gui.client.util.EnumTranslator;
public class GenericCourseSummaryView extends Composite {
interface MyUiBinder extends UiBinder<Widget, GenericCourseSummaryView> {
}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private KornellConstants constants = GWT.create(KornellConstants.class);
@UiField
Heading hTitle;
@UiField
Label lblSubTitle;
@UiField
Paragraph pDescription;
@UiField
Paragraph pStatus;
@UiField
Paragraph pStatusInfo;
@UiField
Paragraph pStatusErr;
@UiField
Paragraph pStatus2;
@UiField
Paragraph pStatusInfo2;
@UiField
ProgressBar progressBar;
@UiField
Image imgThumb;
@UiField
Image imgIconCourse;
@UiField
FlowPanel pnlCourseSummaryBar;
String ICON_COURSE_URL = mkurl(ClientConstants.IMAGES_PATH, "welcomeCourses");
String iconCourseURL;
private CourseClassTO courseClassTO;
private PlaceController placeCtrl;
private KornellSession session;
public GenericCourseSummaryView(final PlaceController placeCtrl,
final CourseClassTO courseClassTO, final KornellSession session) {
initWidget(uiBinder.createAndBindUi(this));
this.courseClassTO = courseClassTO;
this.placeCtrl = placeCtrl;
this.session = session;
Course course = courseClassTO.getCourseVersionTO().getCourse();
hTitle.setText(course.getTitle());
lblSubTitle.setText(constants.courseClass() + ": " + courseClassTO.getCourseClass().getName());
pDescription.setText(course.getDescription());
final Teacher teacher = Teachers.of(courseClassTO);
Student student = teacher.student(session.getCurrentUser());
if(courseClassTO.getEnrollment() != null && EnrollmentState.cancelled.equals(courseClassTO.getEnrollment().getState())){
pStatusErr.setText(constants.cancelledClassLabel());
pStatusErr.removeStyleName("shy");
}
if(!CourseClassState.active.equals(courseClassTO.getCourseClass().getState())){
pStatus.setText(constants.inactiveClassLabel());
iconCourseURL = mkurl(ICON_COURSE_URL, "iconNotStarted.png");
} else if (student.isEnrolled()) {
onEnrolled(student);
} else {
onNotEnrolled();
}
onEnrolledOrNot();
}
private void onEnrolledOrNot() {
imgThumb.setUrl(StringUtils.mkurl("/",courseClassTO.getCourseVersionTO().getDistributionURL(),courseClassTO.getCourseVersionTO().getCourseVersion().getDistributionPrefix(),"/classroom/images/thumb.jpg"));
imgIconCourse.setUrl(iconCourseURL);
sinkEvents(Event.ONCLICK);
addHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(courseClassTO.getEnrollment() == null && courseClassTO.getCourseClass().isApproveEnrollmentsAutomatically()){
requestEnrollment();
return;
} else if (courseClassTO.getEnrollment() != null){
session.setCurrentCourseClass(courseClassTO);
placeCtrl.goTo(new ClassroomPlace(courseClassTO
.getEnrollment().getUUID()));
}
}
}, ClickEvent.getType());
}
private void onNotEnrolled() {
Button requestEnrollmentBtn = new Button(courseClassTO.getCourseClass().isApproveEnrollmentsAutomatically() ? constants.startCourseLabel() : constants.requestEnrollmentLabel());
requestEnrollmentBtn.addStyleName("right btnAction");
pnlCourseSummaryBar.add(requestEnrollmentBtn);
pStatus.setText(constants.availableClassLabel());
iconCourseURL = mkurl(ICON_COURSE_URL, "iconAcquire.png");
}
private void onEnrolled(Student student) {
EnrollmentProgress progress = student.getEnrollmentProgress();
switch (progress.getDescription()) {
case notStarted:
onCourseNotStarted();
break;
case completed:
onCourseCompleted(progress.getCertifiedAt());
break;
case inProgress:
onCourseInProgress(progress.getProgress());
break;
}
}
private void onCourseInProgress(Integer progress) {
if(progress >= 100){
pStatus.setText(constants.pendingGradeLabel());
} else {
pStatus.setText(EnumTranslator.translateEnum(EnrollmentProgressDescription.inProgress)+": ");
progressBar.removeStyleName("shy");
progressBar.setPercent(progress);
pStatusInfo.setText(progress + "% ");
}
iconCourseURL = mkurl(ICON_COURSE_URL, "iconInProgress.png");
}
private void onCourseNotStarted() {
if(courseClassTO.getEnrollment() != null &&
EnrollmentState.requested.equals(courseClassTO.getEnrollment().getState())){
pStatus.setText(constants.pendingEnrollmentApproval());
iconCourseURL = mkurl(ICON_COURSE_URL, "iconWaiting.png");
} else {
pStatus.setText(constants.toStart());
iconCourseURL = mkurl(ICON_COURSE_URL, "iconNotStarted.png");
}
}
private void onCourseCompleted(Date certifiedAt) {
String statusText = EnumTranslator.translateEnum(EnrollmentProgressDescription.completed);
if(certifiedAt != null) {
statusText += " " + constants.completedOnToken() + ": ";
pStatusInfo.setText(DateTimeFormat.getFormat("yyyy-MM-dd").format(certifiedAt));
}
if(courseClassTO.getCourseClass().getRequiredScore() != null &&
courseClassTO.getCourseClass().getRequiredScore().intValue() != 0 &&
courseClassTO.getEnrollment().getAssessmentScore() != null){
pStatus2.setText(" - " + constants.completedCourseGradeLabel() + ":");
pStatusInfo2.setText(""+courseClassTO.getEnrollment().getAssessmentScore().intValue());
}
pStatus.setText(statusText);
iconCourseURL = mkurl(ICON_COURSE_URL, "iconFinished.png");
}
private void requestEnrollment() {
EntityFactory entityFactory = GWT.create(EntityFactory.class);
Enrollment enrollment = entityFactory.enrollment().as();
enrollment.setCourseClassUUID(courseClassTO.getCourseClass()
.getUUID());
enrollment.setPersonUUID(session.getCurrentUser().getPerson().getUUID());
enrollment.setState(courseClassTO.getCourseClass().isApproveEnrollmentsAutomatically() ? EnrollmentState.enrolled : EnrollmentState.requested);
enrollment.setEnrollmentSource(EnrollmentSource.WEBSITE);
session.enrollments().createEnrollment(enrollment,
new Callback<Enrollment>() {
@Override
public void ok(Enrollment enrollment) {
updateEnrollmentOnCourseClassTO(enrollment);
placeCtrl.goTo(new ClassroomPlace(enrollment.getUUID()));
}
});
}
private void updateEnrollmentOnCourseClassTO(Enrollment enrollment) {
TOFactory toFactory = GWT.create(TOFactory.class);
EnrollmentTO enrollmentTO = toFactory.newEnrollmentTO().as();
enrollmentTO.setEnrollment(enrollment);
enrollmentTO.setPersonUUID(session.getCurrentUser().getPerson().getUUID());
enrollmentTO.setFullName(session.getCurrentUser().getPerson().getFullName());
enrollmentTO.setUsername(session.getCurrentUser().getUsername());
courseClassTO.setEnrollment(enrollment);
session.setCurrentCourseClass(courseClassTO);
}
}