package kornell.gui.client.presentation.admin.courseversion.courseversion.generic; import java.util.ArrayList; import java.util.List; import com.github.gwtbootstrap.client.ui.CheckBox; import com.github.gwtbootstrap.client.ui.FileUpload; import com.github.gwtbootstrap.client.ui.Form; 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.google.gwt.core.client.GWT; 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.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.place.shared.PlaceChangeEvent; 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.uibinder.client.UiHandler; 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.HTMLPanel; import com.google.gwt.user.client.ui.Label; 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.ContentSpec; import kornell.core.entity.Course; import kornell.core.entity.CourseVersion; import kornell.core.entity.EntityFactory; import kornell.core.entity.InstitutionType; import kornell.core.to.CourseVersionTO; import kornell.core.to.CourseVersionsTO; import kornell.core.to.CoursesTO; import kornell.gui.client.presentation.admin.course.course.generic.GenericCourseReportsView; import kornell.gui.client.presentation.admin.courseversion.courseversion.AdminCourseVersionContentPresenter; import kornell.gui.client.presentation.admin.courseversion.courseversion.AdminCourseVersionContentView; import kornell.gui.client.presentation.admin.courseversion.courseversion.AdminCourseVersionPlace; import kornell.gui.client.presentation.admin.courseversion.courseversion.AdminCourseVersionPresenter; import kornell.gui.client.presentation.admin.courseversion.courseversion.AdminCourseVersionView; import kornell.gui.client.presentation.admin.courseversion.courseversions.AdminCourseVersionsPlace; import kornell.gui.client.util.forms.FormHelper; import kornell.gui.client.util.forms.formfield.KornellFormFieldWrapper; import kornell.gui.client.util.forms.formfield.ListBoxFormField; import kornell.gui.client.util.view.LoadingPopup; public class GenericAdminCourseVersionView extends Composite implements AdminCourseVersionView { interface MyUiBinder extends UiBinder<Widget, GenericAdminCourseVersionView> { } private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); public static final EntityFactory entityFactory = GWT.create(EntityFactory.class); private KornellSession session; private PlaceController placeCtrl; private EventBus bus; private FormHelper formHelper = GWT.create(FormHelper.class); private boolean isCreationMode, isInstitutionAdmin; boolean isCurrentUser, showContactDetails, isRegisteredWithCPF; private Presenter presenter; @UiField TabPanel tabsPanel; @UiField Tab editTab; @UiField Tab contentsTab; @UiField FlowPanel contentsPanel; @UiField HTMLPanel titleEdit; @UiField HTMLPanel titleCreate; @UiField Form form; @UiField FlowPanel courseVersionFields; @UiField Button btnOK; @UiField Button btnCancel; @UiField Modal confirmModal; @UiField Label confirmText; @UiField Button btnModalOK; @UiField Button btnModalCancel; private CourseVersion courseVersion; private KornellFormFieldWrapper name, course, distributionPrefix, contentSpec, disabled, parentCourseVersion, instanceCount, label; private List<KornellFormFieldWrapper> fields; private String courseVersionUUID; private boolean initializing = false; public GenericAdminCourseVersionView(final KornellSession session, EventBus bus, final PlaceController placeCtrl) { this.session = session; this.placeCtrl = placeCtrl; this.isInstitutionAdmin = session.isInstitutionAdmin(); this.bus = bus; initWidget(uiBinder.createAndBindUi(this)); // i18n btnOK.setText("Salvar".toUpperCase()); btnCancel.setText("Cancelar".toUpperCase()); btnModalOK.setText("OK".toUpperCase()); btnModalCancel.setText("Cancelar".toUpperCase()); bus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() { @Override public void onPlaceChange(PlaceChangeEvent event) { if(event.getNewPlace() instanceof AdminCourseVersionPlace && !initializing){ init(); } } }); init(); } @Override public void init(){ if(initializing) return; initializing = true; asWidget().setVisible(false); if(placeCtrl.getWhere() instanceof AdminCourseVersionPlace && ((AdminCourseVersionPlace)placeCtrl.getWhere()).getCourseVersionUUID() != null){ this.courseVersionUUID = ((AdminCourseVersionPlace)placeCtrl.getWhere()).getCourseVersionUUID(); isCreationMode = false; session.courseVersion(courseVersionUUID).get(new Callback<CourseVersionTO>() { @Override public void ok(CourseVersionTO to) { courseVersion = to.getCourseVersion(); initData(); } }); } else { isCreationMode = true; courseVersion = entityFactory.newCourseVersion().as(); initData(); } } public void initData() { if(!isCreationMode && ContentSpec.WIZARD.equals(courseVersion.getContentSpec())) presenter.buildContentView(courseVersion); contentsTab.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { presenter.buildContentView(courseVersion); } }); courseVersionFields.setVisible(false); this.fields = new ArrayList<KornellFormFieldWrapper>(); courseVersionFields.clear(); titleEdit.setVisible(!isCreationMode); titleCreate.setVisible(isCreationMode); btnOK.setVisible(isInstitutionAdmin|| isCreationMode); btnCancel.setVisible(isInstitutionAdmin); session.courses().get(new Callback<CoursesTO>() { @Override public void ok(CoursesTO to) { createCoursesField(to); asWidget().setVisible(true); if(!isCreationMode) ((ListBox)course.getFieldWidget()).setSelectedValue(courseVersion.getCourseUUID()); } }); name = new KornellFormFieldWrapper("Nome", formHelper.createTextBoxFormField(courseVersion.getName()), isInstitutionAdmin); fields.add(name); courseVersionFields.add(name); distributionPrefix = new KornellFormFieldWrapper("Prefixo de Distribuição", formHelper.createTextBoxFormField(courseVersion.getDistributionPrefix()), isInstitutionAdmin); fields.add(distributionPrefix); courseVersionFields.add(distributionPrefix); final ListBox contentSpecTypes = new ListBox(); contentSpecTypes.addItem("KNL", ContentSpec.KNL.toString()); contentSpecTypes.addItem("SCORM12", ContentSpec.SCORM12.toString()); //contentSpecTypes.addItem("WIZARD", ContentSpec.WIZARD.toString()); if (!isCreationMode) { contentSpecTypes.setSelectedValue(courseVersion.getContentSpec().toString()); } contentSpec = new KornellFormFieldWrapper("Tipo", new ListBoxFormField(contentSpecTypes), isInstitutionAdmin); fields.add(contentSpec); courseVersionFields.add(contentSpec); disabled = new KornellFormFieldWrapper("Desabilitar?", formHelper.createCheckBoxFormField(courseVersion.isDisabled()), isInstitutionAdmin); fields.add(disabled); courseVersionFields.add(disabled); ((CheckBox)disabled.getFieldWidget()).addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { if(event.getValue()){ } } }); if(InstitutionType.DASHBOARD.equals(session.getInstitution().getInstitutionType())){ if (isCreationMode || isInstitutionAdmin) { session.courseVersions().get(new Callback<CourseVersionsTO>() { @Override public void ok(CourseVersionsTO to) { createCourseVersionsField(to); } }); } else { createCourseVersionsField(null); } String instanceCountStr = courseVersion.getInstanceCount() == null ? "" : courseVersion.getInstanceCount().toString(); instanceCount = new KornellFormFieldWrapper("Quantidade de Instâncias", formHelper.createTextBoxFormField(instanceCountStr), isInstitutionAdmin); fields.add(instanceCount); courseVersionFields.add(instanceCount); label = new KornellFormFieldWrapper("Rótulo", formHelper.createTextBoxFormField(courseVersion.getLabel()), isInstitutionAdmin); fields.add(label); courseVersionFields.add(label); } courseVersionFields.add(formHelper.getImageSeparator()); courseVersionFields.setVisible(true); } private void createCourseVersionsField(CourseVersionsTO to) { final ListBox courseVersions = new ListBox(); if(to != null){ courseVersions.addItem("Nenhuma", "null"); for (CourseVersion courseVersion : to.getCourseVersions()) { courseVersions.addItem(courseVersion.getName(), courseVersion.getUUID()); } } else { courseVersions.addItem(courseVersion.getParentVersionUUID(), courseVersion.getParentVersionUUID()); } if(parentCourseVersion != null && courseVersionFields.getElement().isOrHasChild(parentCourseVersion.getElement())){ fields.remove(parentCourseVersion); courseVersionFields.getElement().removeChild(parentCourseVersion.getElement()); } if (!isCreationMode) { courseVersions.setSelectedValue(courseVersion.getParentVersionUUID() == null? "null" : courseVersion.getParentVersionUUID()); } parentCourseVersion = new KornellFormFieldWrapper("Versão Pai do Curso", new ListBoxFormField(courseVersions), (isCreationMode || isInstitutionAdmin)); fields.add(parentCourseVersion); courseVersionFields.insert(parentCourseVersion, 5); courseVersionFields.setVisible(true); } private void createCoursesField(CoursesTO to) { final ListBox courses = new ListBox(); if(to != null){ for (Course course : to.getCourses()) { courses.addItem(course.getTitle(), course.getUUID()); } }/* else { courses.addItem(courseVersion.getCourse().getTitle(), courseVersion.getCourse().getUUID()); }*/ courses.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { } }); if (!isCreationMode) { courses.setSelectedValue(courseVersion.getCourseUUID()); } course = new KornellFormFieldWrapper("Curso", new ListBoxFormField(courses), isInstitutionAdmin); if(course != null && courseVersionFields.getElement().isOrHasChild(course.getElement())){ fields.remove(course); courseVersionFields.getElement().removeChild(course.getElement()); } fields.add(course); courses.setSelectedIndex(0); courseVersionFields.insert(course, 0); initializing = false; } private boolean validateFields() { if (!formHelper.isLengthValid(name.getFieldPersistText(), 2, 100)) { name.setError("Insira o nome da versão"); } if (!formHelper.isListBoxSelected((ListBox)course.getFieldWidget())) { course.setError("Escolha o curso"); } if (!formHelper.isLengthValid(distributionPrefix.getFieldPersistText(), 2, 200)) { distributionPrefix.setError("Insira o prefixo de distribuição"); } if (!formHelper.isLengthValid(contentSpec.getFieldPersistText(), 2, 20)) { contentSpec.setError("Insira o tipo"); } else { try { ContentSpec.valueOf(contentSpec.getFieldPersistText()); } catch (Exception e) { contentSpec.setError("Tipo inválido."); } } if(InstitutionType.DASHBOARD.equals(session.getInstitution().getInstitutionType())){ if (!formHelper.isValidNumber(instanceCount.getFieldPersistText()) || !formHelper.isNumberRangeValid(Integer.parseInt(instanceCount.getFieldPersistText()), 1, 100)) { instanceCount.setError("Insira a um número entre 1 e 100."); } } return !formHelper.checkErrors(fields); } @UiHandler("btnOK") void doOK(ClickEvent e) { formHelper.clearErrors(fields); if (isInstitutionAdmin && validateFields()) { LoadingPopup.show(); CourseVersion courseVersion = getCourseVersionInfoFromForm(); presenter.upsertCourseVersion(courseVersion); } } private CourseVersion getCourseVersionInfoFromForm() { CourseVersion version = courseVersion; version.setName(name.getFieldPersistText()); version.setCourseUUID(course.getFieldPersistText()); version.setDistributionPrefix(distributionPrefix.getFieldPersistText()); version.setContentSpec(ContentSpec.valueOf(contentSpec.getFieldPersistText())); version.setDisabled(disabled.getFieldPersistText().equals("true")); if(InstitutionType.DASHBOARD.equals(session.getInstitution().getInstitutionType())){ String parentVersionUUID = (parentCourseVersion.getFieldPersistText().equals("null") ? null : parentCourseVersion.getFieldPersistText()); version.setParentVersionUUID(parentVersionUUID); version.setInstanceCount(instanceCount.getFieldPersistText().length() > 0 ? Integer.parseInt(instanceCount.getFieldPersistText()) : null); version.setLabel(label.getFieldPersistText()); } return version; } @UiHandler("btnCancel") void doCancel(ClickEvent e) { this.placeCtrl.goTo(new AdminCourseVersionsPlace()); } @Override public void setPresenter(Presenter presenter) { this.presenter = presenter; } @Override public Presenter getPresenter() { return presenter; } @Override public void addContentPanel(AdminCourseVersionContentView adminCourseVersionContentView) { contentsPanel.clear(); contentsPanel.add(adminCourseVersionContentView); } }