001 package org.kuali.student.lum.program.client.requirements; 002 003 import org.kuali.student.common.ui.client.application.Application; 004 import org.kuali.student.common.ui.client.configurable.mvc.layouts.BasicLayout; 005 import org.kuali.student.common.ui.client.configurable.mvc.views.SectionView; 006 import org.kuali.student.common.ui.client.mvc.*; 007 import org.kuali.student.common.ui.client.widgets.buttongroups.ButtonEnumerations; 008 import org.kuali.student.common.ui.client.widgets.dialog.ButtonMessageDialog; 009 import org.kuali.student.common.ui.client.widgets.field.layout.button.ButtonGroup; 010 import org.kuali.student.common.ui.client.widgets.field.layout.button.YesNoCancelGroup; 011 import org.kuali.student.lum.program.client.ProgramConstants; 012 import org.kuali.student.lum.program.client.ProgramMsgConstants; 013 import org.kuali.student.lum.program.client.widgets.EditableHeader; 014 015 import com.google.gwt.event.shared.HandlerManager; 016 017 public class ProgramRequirementsViewController extends BasicLayout { 018 019 public enum ProgramRequirementsViews { 020 PREVIEW, 021 MANAGE 022 } 023 024 public static final String PROGRAM_RULES_MODEL_ID = "programRulesModelId"; 025 private ProgramRequirementsSummaryView preview; 026 boolean reloadFlag; 027 028 public ProgramRequirementsViewController(Controller controller, HandlerManager eventBus, String name, Enum<?> viewType, boolean isReadOnly, EditableHeader header, boolean reloadFlag){ 029 this(controller, eventBus, name, viewType, isReadOnly, header); 030 this.reloadFlag = reloadFlag; 031 } 032 033 public ProgramRequirementsViewController(Controller controller, HandlerManager eventBus, String name, Enum<?> viewType, boolean isReadOnly, EditableHeader header) { 034 super(ProgramRequirementsViewController.class.getName()); 035 super.setController(controller); 036 super.setName(name); 037 super.setViewEnum(viewType); 038 super.setDefaultModelId(PROGRAM_RULES_MODEL_ID); 039 super.setParentController(controller); 040 041 this.setDefaultView(ProgramRequirementsViews.PREVIEW); 042 043 //not used 044 super.registerModel(PROGRAM_RULES_MODEL_ID, new ModelProvider<DataModel>() { 045 @Override 046 public void requestModel(final ModelRequestCallback<DataModel> callback) { 047 callback.onModelReady(new DataModel()); 048 } 049 }); 050 051 //no name for the view so that breadcrumbs do not extra link 052 String previewTitle = getLabel(ProgramMsgConstants.PROGRAM_MENU_SECTIONS_REQUIREMENTS); 053 if (isReadOnly && (header != null)) { 054 preview = new ProgramRequirementsSummaryView(this, eventBus, ProgramRequirementsViews.PREVIEW, "", ProgramConstants.PROGRAM_MODEL_ID, isReadOnly, header); 055 } else { 056 preview = new ProgramRequirementsSummaryView(this, eventBus, ProgramRequirementsViews.PREVIEW, (isReadOnly ? previewTitle : ""), ProgramConstants.PROGRAM_MODEL_ID, isReadOnly); 057 } 058 super.addView(preview); 059 060 if (!isReadOnly) { 061 ProgramRequirementsManageView manageView = new ProgramRequirementsManageView(this, ProgramRequirementsViews.MANAGE, "Add and Combine Rules", PROGRAM_RULES_MODEL_ID); 062 super.addView(manageView); 063 } 064 } 065 066 @Override 067 public void updateModel() { 068 preview.updateModel(); 069 } 070 071 @Override 072 public void beforeViewChange(final Enum<?> viewChangingTo, final Callback<Boolean> okToChange) { 073 074 if (getCurrentView() == null) { 075 okToChange.exec(true); 076 return; 077 } 078 079 super.beforeViewChange(viewChangingTo, new Callback<Boolean>() { 080 081 @Override 082 public void exec(Boolean result) { 083 084 //moving from PREVIEW to MANAGE page 085 //no dialog if user is going to the Manage Rule page 086 if (viewChangingTo.name().equals(ProgramRequirementsViews.MANAGE.name())) 087 { 088 okToChange.exec(true); 089 return; 090 } 091 092 //moving from MANAGE to PREVIEW page 093 //no dialog if user clicks on the 'Save' or cancel button on the Manage Rule page 094 if (getCurrentView() instanceof ProgramRequirementsManageView) { 095 okToChange.exec(true); 096 return; 097 } 098 099 //moving from MANAGE to other page 100 //TODO show dialog if user clicks on a menu from Manage Rules page 101 102 //moving from other page to PREVIEW page 103 if (viewChangingTo.name().equals(ProgramRequirementsViews.PREVIEW.name())) { 104 preview.getRules().setupRules(ProgramRequirementsViewController.this, ProgramConstants.PROGRAM_MODEL_ID, new Callback<Boolean>() { 105 @Override 106 public void exec(Boolean result) { 107 okToChange.exec(result); 108 return; 109 } 110 }); 111 return; 112 } 113 114 //moving from PREVIEW to other page (rules have NOT changed) 115 //user is moving to another program section and no changes were made to the rules so allow it to happen 116 if (!((SectionView) getCurrentView()).isDirty()) { 117 okToChange.exec(true); 118 return; 119 } 120 121 //moving from PREVIEW to other page (rules have changed) 122 //user is moving to another program section and rules have been changed, user needs to either save rules or abandon changes before proceeding 123 ButtonGroup<ButtonEnumerations.YesNoCancelEnum> buttonGroup = new YesNoCancelGroup(); 124 final ButtonMessageDialog<ButtonEnumerations.YesNoCancelEnum> dialog = 125 new ButtonMessageDialog<ButtonEnumerations.YesNoCancelEnum>("Warning", "You may have unsaved changes. Save changes?", buttonGroup); 126 buttonGroup.addCallback(new Callback<ButtonEnumerations.YesNoCancelEnum>() { 127 128 @Override 129 public void exec(ButtonEnumerations.YesNoCancelEnum result) { 130 switch (result) { 131 case YES: 132 dialog.hide(); 133 preview.storeRules(new Callback<Boolean>() { 134 @Override 135 public void exec(Boolean result) { 136 okToChange.exec(true); 137 } 138 }); 139 break; 140 case NO: 141 dialog.hide(); 142 //preview.revertRuleChanges(); //TODO put back if we will NOT reset rules every time user comes to PREVIEW page above... 143 okToChange.exec(true); 144 break; 145 case CANCEL: 146 okToChange.exec(false); 147 dialog.hide(); 148 break; 149 } 150 } 151 }); 152 dialog.show(); 153 } 154 }); 155 } 156 157 @Override 158 public void beforeShow(final Callback<Boolean> onReadyCallback) { 159 showDefaultView(onReadyCallback); 160 } 161 162 public ProgramRequirementsSummaryView getProgramRequirementsView() { 163 return preview; 164 } 165 166 protected String getLabel(String messageKey) { 167 return Application.getApplicationContext().getUILabel(ProgramMsgConstants.PROGRAM_MSG_GROUP, messageKey); 168 } 169 }