package kornell.gui.client.presentation.admin.courseversion.courseversion.wizard.edit; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.github.gwtbootstrap.client.ui.Button; 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.Icon; import com.github.gwtbootstrap.client.ui.TextArea; import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.constants.AlertType; import com.google.gwt.core.client.GWT; import com.google.gwt.dev.util.Name; 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.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; 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.ScrollPanel; 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.CourseClassState; import kornell.core.entity.CourseVersion; import kornell.core.entity.Entity; import kornell.core.entity.RoleCategory; import kornell.core.to.RolesTO; import kornell.gui.client.presentation.admin.courseversion.courseversion.AdminCourseVersionContentView; import kornell.gui.client.presentation.admin.courseversion.courseversion.AdminCourseVersionContentView.Presenter; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.Wizard; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardElement; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardSlide; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardSlideItem; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardSlideItemType; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardSlideItemVideoLink; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardTopic; import kornell.gui.client.presentation.admin.courseversion.courseversion.wizard.WizardUtils; import kornell.gui.client.util.forms.FormHelper; import kornell.gui.client.util.forms.formfield.KornellFormFieldWrapper; import kornell.gui.client.util.view.KornellNotification; import kornell.gui.client.util.view.LoadingPopup; public class WizardSlideItemView extends Composite implements IWizardView { interface MyUiBinder extends UiBinder<Widget, WizardSlideItemView> { } private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); boolean isCurrentUser, showContactDetails, isRegisteredWithCPF; private FormHelper formHelper = GWT.create(FormHelper.class); private String titleLabel, textLabel; private KornellFormFieldWrapper title, text; private List<KornellFormFieldWrapper> fields; private IWizardView extendedItemView; private Integer displayOrder; @UiField FlowPanel slideItemWrapper; @UiField Icon slideItemIcon; @UiField Label slideItemLabel; @UiField Button btnDelete; @UiField Button btnMoveUp; @UiField Button btnMoveDown; private String changedString = "(*) "; private WizardSlideItem wizardSlideItem; private KeyUpHandler refreshFormKeyUpHandler; private Presenter presenter; private WizardSlideView wizardSlideView; FlowPanel slideItemFields; Image slideItemPreviewImage; private boolean isQuizItem; public WizardSlideItemView(WizardSlideItem wizardSlideItem, Presenter presenter, WizardSlideView wizardSlideView) { this.presenter = presenter; this.wizardSlideItem = wizardSlideItem; this.displayOrder = wizardSlideItem.getOrder(); this.wizardSlideView = wizardSlideView; initWidget(uiBinder.createAndBindUi(this)); init(); } public void init() { WizardUtils.createIcon(btnDelete, "fa-trash-o"); WizardUtils.createIcon(btnMoveUp, "fa-arrow-up"); WizardUtils.createIcon(btnMoveDown, "fa-arrow-down"); slideItemIcon.addStyleName(WizardUtils.getClasForWizardSlideItemViewIcon(wizardSlideItem.getWizardSlideItemType())); slideItemLabel.setText(getItemLabelText()); fields = new ArrayList<KornellFormFieldWrapper>(); slideItemFields = new FlowPanel(); isQuizItem = WizardSlideItemType.QUIZ.equals(wizardSlideItem.getWizardSlideItemType()); if(isQuizItem){ slideItemFields.addStyleName("quizWrapper"); extendedItemView = new WizardSlideItemQuizView(wizardSlideItem, this, presenter); slideItemFields.add((WizardSlideItemQuizView)extendedItemView); btnMoveUp.setVisible(false); btnMoveDown.setVisible(false); btnDelete.setVisible(false); } else { slideItemFields.addStyleName("fieldsWrapper"); refreshFormKeyUpHandler = new KeyUpHandler() { @Override public void onKeyUp(KeyUpEvent event) { refreshForm(); } }; titleLabel = "Título do Item"; title = new KornellFormFieldWrapper(titleLabel, formHelper.createTextBoxFormField(wizardSlideItem.getTitle()), true); ((TextBox)title.getFieldWidget()).addKeyUpHandler(refreshFormKeyUpHandler); fields.add(title); slideItemFields.add(title); textLabel = "Texto"; text = new KornellFormFieldWrapper(textLabel, formHelper.createTextAreaFormField(wizardSlideItem.getText(), 5), true); ((TextArea)text.getFieldWidget()).addKeyUpHandler(refreshFormKeyUpHandler); text.addStyleName("heightAuto marginBottom25"); fields.add(text); slideItemFields.add(text); switch (wizardSlideItem.getWizardSlideItemType()) { case IMAGE: extendedItemView = new WizardSlideItemImageView(wizardSlideItem, this, presenter); slideItemFields.add((WizardSlideItemImageView)extendedItemView); break; case TEXT: break; case VIDEO_LINK: extendedItemView = new WizardSlideItemVideoLinkView(wizardSlideItem, this, presenter); slideItemFields.add((WizardSlideItemVideoLinkView)extendedItemView); break; default: break; } btnMoveUp.setVisible(displayOrder > 0); btnMoveDown.setVisible(displayOrder < (((WizardSlide)presenter.getSelectedWizardElement()).getWizardSlideItems().size() -1)); btnDelete.setVisible(true); } slideItemWrapper.add(slideItemFields); updatePreviewImage(); } @UiHandler("btnMoveDown") void doMoveDown(ClickEvent e) { wizardSlideView.moveDownItem(wizardSlideItem); } @UiHandler("btnMoveUp") void doMoveUp(ClickEvent e) { wizardSlideView.moveUpItem(wizardSlideItem); } @UiHandler("btnDelete") void doDelete(ClickEvent e) { wizardSlideView.showModal(WizardSlideView.MODAL_DELETE_SLIDE_ITEM, wizardSlideItem); } @Override public void resetFormToOriginalValues(){ if(!isQuizItem){ ((TextBox)title.getFieldWidget()).setText(wizardSlideItem.getTitle()); ((TextArea)text.getFieldWidget()).setText(wizardSlideItem.getText()); } btnMoveUp.setVisible(displayOrder > 0); btnMoveDown.setVisible(displayOrder < (((WizardSlide)presenter.getSelectedWizardElement()).getWizardSlideItems().size() -1)); btnDelete.setVisible(true); if(extendedItemView != null){ extendedItemView.resetFormToOriginalValues(); } this.displayOrder = wizardSlideItem.getOrder(); presenter.valueChanged(wizardSlideItem, false); refreshForm(); } @Override public boolean refreshForm(){ boolean valueHasChanged = !wizardSlideItem.getOrder().equals(displayOrder) || refreshFormElementLabel(title, titleLabel, wizardSlideItem.getTitle()) || refreshFormElementLabel(text, textLabel, wizardSlideItem.getText()) || wizardSlideItem.getUUID().startsWith("new"); if(extendedItemView != null){ valueHasChanged = valueHasChanged || extendedItemView.refreshForm(); updatePreviewImage(); } presenter.valueChanged(wizardSlideItem, valueHasChanged); String itemLabelText = getItemLabelText(); slideItemLabel.setText((valueHasChanged ? changedString : "") + itemLabelText); validateFields(); btnMoveUp.setVisible(displayOrder > 0); btnMoveDown.setVisible(displayOrder < (wizardSlideView.getWizardSlideItemViewCount()-1)); btnDelete.setVisible(!isQuizItem); return valueHasChanged; } private void updatePreviewImage() { if(slideItemPreviewImage == null && (WizardSlideItemType.VIDEO_LINK.equals(wizardSlideItem.getWizardSlideItemType()) || WizardSlideItemType.IMAGE.equals(wizardSlideItem.getWizardSlideItemType()) ) ){ slideItemPreviewImage = new Image(); slideItemPreviewImage.addStyleName("slideItemPreviewImage"); slideItemWrapper.add(slideItemPreviewImage); } if(WizardSlideItemType.VIDEO_LINK.equals(wizardSlideItem.getWizardSlideItemType())){ String url = ((WizardSlideItemVideoLinkView)extendedItemView).getUrl(); String youtubeId = WizardUtils.stripIdFromVideoURL(url); slideItemPreviewImage.setUrl("http://img.youtube.com/vi/"+youtubeId+"/sddefault.jpg"); } else if(WizardSlideItemType.IMAGE.equals(wizardSlideItem.getWizardSlideItemType())){ String url = ((WizardSlideItemImageView)extendedItemView).getUrl(); slideItemPreviewImage.setUrl(url); } } private String getItemLabelText() { String itemLabelText = WizardUtils.getItemNameByType(wizardSlideItem.getWizardSlideItemType()) + " - " + wizardSlideItem.getParentOrder() + "." + (wizardSlideItem.getOrder()+1); return itemLabelText; } private boolean refreshFormElementLabel(KornellFormFieldWrapper kornellFormFieldWrapper, String label, String originalValue){ if(isQuizItem){ return false; } boolean valueHasChanged = !kornellFormFieldWrapper.getFieldPersistText().equals(originalValue); kornellFormFieldWrapper.setFieldLabelText((valueHasChanged ? changedString : "") + label); return valueHasChanged; } @Override public boolean validateFields() { formHelper.clearErrors(fields); if (WizardSlideItemType.TEXT.equals(wizardSlideItem.getWizardSlideItemType()) && !formHelper.isLengthValid(title.getFieldPersistText(), 2)) { title.setError("Insira o título"); } if (WizardSlideItemType.TEXT.equals(wizardSlideItem.getWizardSlideItemType()) && !formHelper.isLengthValid(text.getFieldPersistText(), 2)) { text.setError("Insira o texto"); } boolean extendedItemViewValidated = true; if(extendedItemView != null){ extendedItemViewValidated = extendedItemView.validateFields(); } return extendedItemViewValidated && !formHelper.checkErrors(fields); } @Override public void updateWizard() { if(!isQuizItem){ wizardSlideItem.setTitle(title.getFieldPersistText()); wizardSlideItem.setText(text.getFieldPersistText()); } wizardSlideItem.setOrder(displayOrder); if(extendedItemView != null){ extendedItemView.updateWizard(); } presenter.valueChanged(wizardSlideItem, false); refreshForm(); } public WizardSlideItem getWizardSlideItem() { return wizardSlideItem; } public Integer getDisplayOrder() { return displayOrder; } public void setDisplayOrder(Integer displayOrder) { this.displayOrder = displayOrder; refreshForm(); } }