Coverage Report - org.kuali.student.lum.lu.ui.course.client.requirements.CourseRequirementsManageView
 
Classes in this File Line Coverage Branch Coverage Complexity
CourseRequirementsManageView
0%
0/113
0%
0/20
1.523
CourseRequirementsManageView$1
0%
0/4
0%
0/2
1.523
CourseRequirementsManageView$10
0%
0/5
0%
0/2
1.523
CourseRequirementsManageView$10$1
0%
0/6
N/A
1.523
CourseRequirementsManageView$11
0%
0/7
0%
0/4
1.523
CourseRequirementsManageView$2
0%
0/5
N/A
1.523
CourseRequirementsManageView$3
0%
0/3
N/A
1.523
CourseRequirementsManageView$4
0%
0/8
0%
0/2
1.523
CourseRequirementsManageView$4$1
0%
0/26
0%
0/8
1.523
CourseRequirementsManageView$5
0%
0/3
N/A
1.523
CourseRequirementsManageView$6
0%
0/11
0%
0/4
1.523
CourseRequirementsManageView$7
0%
0/3
N/A
1.523
CourseRequirementsManageView$7$1
0%
0/6
N/A
1.523
CourseRequirementsManageView$7$1$1
0%
0/6
N/A
1.523
CourseRequirementsManageView$8
0%
0/3
N/A
1.523
CourseRequirementsManageView$8$1
0%
0/6
N/A
1.523
CourseRequirementsManageView$8$1$1
0%
0/6
N/A
1.523
CourseRequirementsManageView$9
0%
0/3
N/A
1.523
CourseRequirementsManageView$9$1
0%
0/6
N/A
1.523
 
 1  
 /**
 2  
  * Copyright 2010 The Kuali Foundation Licensed under the
 3  
  * Educational Community License, Version 2.0 (the "License"); you may
 4  
  * not use this file except in compliance with the License. You may
 5  
  * obtain a copy of the License at
 6  
  *
 7  
  * http://www.osedu.org/licenses/ECL-2.0
 8  
  *
 9  
  * Unless required by applicable law or agreed to in writing,
 10  
  * software distributed under the License is distributed on an "AS IS"
 11  
  * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 12  
  * or implied. See the License for the specific language governing
 13  
  * permissions and limitations under the License.
 14  
  */
 15  
 
 16  
 package org.kuali.student.lum.lu.ui.course.client.requirements;
 17  
 
 18  
 import java.util.HashMap;
 19  
 import java.util.List;
 20  
 import java.util.Map;
 21  
 
 22  
 import org.kuali.student.common.assembly.data.Metadata;
 23  
 import org.kuali.student.common.ui.client.application.KSAsyncCallback;
 24  
 import org.kuali.student.common.ui.client.configurable.mvc.SectionTitle;
 25  
 import org.kuali.student.common.ui.client.configurable.mvc.views.VerticalSectionView;
 26  
 import org.kuali.student.common.ui.client.mvc.Callback;
 27  
 import org.kuali.student.common.ui.client.service.MetadataRpcService;
 28  
 import org.kuali.student.common.ui.client.service.MetadataRpcServiceAsync;
 29  
 import org.kuali.student.common.ui.client.widgets.KSProgressIndicator;
 30  
 import org.kuali.student.common.ui.client.widgets.buttongroups.ButtonEnumerations;
 31  
 import org.kuali.student.common.ui.client.widgets.field.layout.button.ActionCancelGroup;
 32  
 import org.kuali.student.common.ui.client.widgets.progress.BlockingTask;
 33  
 import org.kuali.student.common.ui.client.widgets.progress.KSBlockingProgressIndicator;
 34  
 import org.kuali.student.common.versionmanagement.dto.VersionDisplayInfo;
 35  
 import org.kuali.student.core.statement.dto.ReqCompFieldInfo;
 36  
 import org.kuali.student.core.statement.dto.ReqCompFieldTypeInfo;
 37  
 import org.kuali.student.core.statement.dto.ReqComponentInfo;
 38  
 import org.kuali.student.core.statement.dto.ReqComponentTypeInfo;
 39  
 import org.kuali.student.core.statement.dto.StatementOperatorTypeKey;
 40  
 import org.kuali.student.core.statement.dto.StatementTreeViewInfo;
 41  
 import org.kuali.student.core.statement.ui.client.widgets.rules.ReqCompEditWidget;
 42  
 import org.kuali.student.core.statement.ui.client.widgets.rules.ReqComponentInfoUi;
 43  
 import org.kuali.student.core.statement.ui.client.widgets.rules.RuleManageWidget;
 44  
 import org.kuali.student.core.statement.ui.client.widgets.rules.RulesUtil;
 45  
 import org.kuali.student.lum.common.client.widgets.BuildCluSetWidget;
 46  
 import org.kuali.student.lum.common.client.widgets.CluSetRetrieverImpl;
 47  
 import org.kuali.student.lum.common.client.widgets.CourseWidget;
 48  
 import org.kuali.student.lum.common.client.widgets.GradeWidget;
 49  
 import org.kuali.student.lum.common.client.widgets.ProgramWidget;
 50  
 import org.kuali.student.lum.lu.dto.CluInfo;
 51  
 import org.kuali.student.lum.lu.ui.course.client.service.LuRpcService;
 52  
 import org.kuali.student.lum.lu.ui.course.client.service.LuRpcServiceAsync;
 53  
 import org.kuali.student.lum.program.client.rpc.StatementRpcService;
 54  
 import org.kuali.student.lum.program.client.rpc.StatementRpcServiceAsync;
 55  
 
 56  
 import com.google.gwt.core.client.GWT;
 57  
 import com.google.gwt.user.client.Window;
 58  
 import com.google.gwt.user.client.rpc.AsyncCallback;
 59  
 import com.google.gwt.user.client.ui.SimplePanel;
 60  
 import com.google.gwt.user.client.ui.VerticalPanel;
 61  
 import com.google.gwt.user.client.ui.Widget;
 62  
 
 63  0
 public class CourseRequirementsManageView extends VerticalSectionView {
 64  
 
 65  0
     private StatementRpcServiceAsync statementRpcServiceAsync = GWT.create(StatementRpcService.class);
 66  0
     private MetadataRpcServiceAsync metadataServiceAsync = GWT.create(MetadataRpcService.class);
 67  0
     private LuRpcServiceAsync luRpcServiceAsync = GWT.create(LuRpcService.class);    
 68  
 
 69  
     protected static final String TEMLATE_LANGUAGE = "en";
 70  
     protected static final String RULEEDIT_TEMLATE = "KUALI.RULE";
 71  
     protected static final String RULEPREVIEW_TEMLATE = "KUALI.RULE.PREVIEW";
 72  
     protected static final String COMPOSITION_TEMLATE = "KUALI.RULE.COMPOSITION";
 73  
     private static final String LU_NAMESPACE = "http://student.kuali.org/wsdl/lu";
 74  
     private static final String CLU_NAMESPACE_URI = "{" + LU_NAMESPACE + "}cluInfo";
 75  
 
 76  
     private CourseRequirementsViewController parentController;
 77  
 
 78  
     //view's widgets
 79  0
     protected VerticalPanel layout = new VerticalPanel();
 80  
     protected ReqCompEditWidget editReqCompWidget;
 81  
     protected RuleManageWidget ruleManageWidget;
 82  0
     protected SimplePanel twiddlerPanel = new SimplePanel();
 83  0
     private ActionCancelGroup actionCancelButtons = new ActionCancelGroup(ButtonEnumerations.SaveCancelEnum.SAVE, ButtonEnumerations.SaveCancelEnum.CANCEL);
 84  
 
 85  
     //view's data
 86  0
     private StatementTreeViewInfo rule = null;
 87  0
     private boolean isInitialized = false;
 88  0
     private boolean isNewRule = false;
 89  0
     private ReqComponentInfo editedReqCompInfo = null;
 90  0
     private static int tempStmtTreeViewInfoID = 9999;
 91  0
     private Integer internalCourseReqID = null;
 92  
     private String originalReqCompNL;
 93  
     private String originalLogicExpression;
 94  
 
 95  
     //   private boolean isLocalDirty = false;
 96  0
     private boolean userClickedSaveButton = false;
 97  0
         private BlockingTask creatingRuleTask = new BlockingTask("Creating Rule");
 98  
 
 99  
     public CourseRequirementsManageView() {
 100  0
         super();
 101  0
     }
 102  
 
 103  
     public CourseRequirementsManageView(CourseRequirementsViewController parentController, Enum<?> viewEnum,
 104  
             String name, String modelId) {
 105  0
         super(viewEnum, name, modelId);
 106  0
         this.parentController = parentController;
 107  0
     }
 108  
 
 109  
     public void init(CourseRequirementsViewController parentController, Enum<?> viewEnum, String name, String modelId) {
 110  0
         super.init(viewEnum, name, modelId, true);
 111  0
         this.parentController = parentController;
 112  0
     }
 113  
 
 114  
     @Override
 115  
     public void beforeShow(final Callback<Boolean> onReadyCallback) {
 116  
 
 117  0
         retrieveAndSetupReqCompTypes(); //TODO cache it for each statement type?
 118  0
         if (!isInitialized) {
 119  0
             setupHandlers();
 120  0
             draw();
 121  0
             isInitialized = true;
 122  
         }
 123  
 
 124  0
         onReadyCallback.exec(true);
 125  0
     }
 126  
 
 127  
     private void setupHandlers() {
 128  0
         editReqCompWidget.setReqCompConfirmButtonClickCallback(actionButtonClickedReqCompCallback);
 129  0
         editReqCompWidget.setNewReqCompSelectedCallbackCallback(newReqCompSelectedCallbackCallback);
 130  0
         editReqCompWidget.setRetrieveCompositionTemplateCallback(retrieveCompositionTemplateCallback);
 131  0
         editReqCompWidget.setRetrieveFieldsMetadataCallback(retrieveFieldsMetadataCallback);
 132  0
         editReqCompWidget.setRetrieveCustomWidgetCallback(retrieveCustomWidgetCallback);
 133  0
     }
 134  
 
 135  
     protected void draw() {
 136  
 
 137  0
         remove(layout);
 138  0
         layout.clear();
 139  
 
 140  
         //STEP 1
 141  0
         SectionTitle title = SectionTitle.generateH3Title("Step 1: Build and Add Rules");
 142  0
         title.setStyleName("KS-Course-Requisites-Manage-Step-header1");
 143  0
         layout.add(title);
 144  
 
 145  0
         layout.add(editReqCompWidget);
 146  
 
 147  
         //STEP 2
 148  0
         title = SectionTitle.generateH3Title("Step 2: Combine Rules with Logic");
 149  0
         title.setStyleName("KS-Course-Requisites-Manage-Step-header2");
 150  0
         layout.add(title);
 151  
 
 152  0
         layout.add(ruleManageWidget);
 153  
 
 154  
         //add progressive indicator when rules are being simplified
 155  0
         KSProgressIndicator twiddler = new KSProgressIndicator();
 156  0
         twiddler.setVisible(false);
 157  0
         twiddlerPanel.setWidget(twiddler);
 158  0
         layout.add(twiddlerPanel);
 159  
 
 160  0
         addWidget(layout);
 161  
 
 162  0
         displaySaveButton();
 163  0
     }
 164  
 
 165  
     protected void displaySaveButton() {
 166  0
         actionCancelButtons.addStyleName("KS-Course-Requisites-Save-Button");
 167  0
         actionCancelButtons.addCallback(new Callback<ButtonEnumerations.ButtonEnum>(){
 168  
              @Override
 169  
             public void exec(ButtonEnumerations.ButtonEnum result) {
 170  0
                 userClickedSaveButton = (result == ButtonEnumerations.SaveCancelEnum.SAVE);
 171  0
                 parentController.showView(CourseRequirementsViewController.CourseRequirementsViews.PREVIEW);
 172  0
             }
 173  
         });
 174  0
         addWidget(actionCancelButtons);
 175  0
     }
 176  
 
 177  
     // called by requirement display widget when user wants to edit or add a sub-rule
 178  
     public void setRuleTree(StatementTreeViewInfo stmtTreeInfo, boolean newRuleFlag, Integer internalCourseReqID) {
 179  
 
 180  0
         if (!isInitialized) {
 181  0
             editReqCompWidget = new ReqCompEditWidget(CourseRequirementsSummaryView.NEW_REQ_COMP_ID);
 182  0
             ruleManageWidget = new RuleManageWidget();
 183  0
             ruleManageWidget.setReqCompEditButtonClickCallback(editReqCompCallback);
 184  0
             ruleManageWidget.setRuleChangedButtonClickCallback(ruleChangedCallback);
 185  
         }
 186  
 
 187  0
         this.internalCourseReqID = internalCourseReqID;
 188  0
         editedReqCompInfo = null;
 189  0
         userClickedSaveButton = false;
 190  0
         rule = RulesUtil.clone(stmtTreeInfo);
 191  0
         isNewRule = newRuleFlag;
 192  0
         originalReqCompNL = getAllReqCompNLs();
 193  
 
 194  
         //update screen elements
 195  0
         editReqCompWidget.setupNewReqComp();
 196  0
         ruleManageWidget.redraw(rule, false);
 197  
        // originalLogicExpression = ruleManageWidget.getLogicExpression();
 198  0
     }
 199  
 
 200  
     //retrieve the latest version from rule table widget and update the local copy
 201  
     public StatementTreeViewInfo getRuleTree() {
 202  0
         rule = ruleManageWidget.getStatementTreeViewInfo();
 203  0
         return rule;
 204  
     }
 205  
 
 206  
     public boolean isNewRule() {
 207  0
         return isNewRule;
 208  
     }
 209  
 
 210  
     //called when user clicked on rule 'edit' link
 211  0
     protected Callback<ReqComponentInfo> editReqCompCallback = new Callback<ReqComponentInfo>(){
 212  
         public void exec(ReqComponentInfo reqComp) {
 213  0
             setEnabled(false);
 214  0
             editReqCompWidget.setupExistingReqComp(reqComp);
 215  0
             editedReqCompInfo = reqComp;
 216  0
         }
 217  
     };
 218  
 
 219  0
     protected Callback<Boolean> ruleChangedCallback = new Callback<Boolean>(){
 220  
         public void exec(Boolean ruleChanged) {
 221  0
             actionCancelButtons.getButton(ButtonEnumerations.SaveCancelEnum.SAVE).setEnabled(ruleChanged);
 222  0
         }
 223  
     };
 224  
 
 225  
     protected void setEnabled(boolean enabled) {
 226  0
         ruleManageWidget.setEnabled(enabled);
 227  0
         actionCancelButtons.getButton(ButtonEnumerations.SaveCancelEnum.SAVE).setEnabled(enabled);
 228  0
     }
 229  
 
 230  
     @Override
 231  
     public boolean isDirty() {
 232  0
         if (!isInitialized) {
 233  0
             return false;
 234  
         }
 235  
 
 236  
         //TODO until we figure out how to detect changes, always return true
 237  0
         return true;
 238  
 
 239  
         //first check logic expression
 240  
 //        if (!ruleManageWidget.getLogicExpression().equals(originalLogicExpression)) {
 241  
 //            return true;
 242  
 //        }
 243  
 
 244  
         //next check NL for req. components
 245  
       //  if ((originalNL == null) && (rule.getNaturalLanguageTranslation() == null)) {
 246  
       //      return !ruleManageWidget.getLogicExpression().equals(originalLogicExpression);
 247  
       //  }
 248  
         //TODO how to check whether rule changed or not?
 249  
        // !(ruleManageWidget.getLogicExpression().equals(originalLogicExpression) && getAllReqCompNLs().equals(originalReqCompNL));
 250  
     }
 251  
 
 252  
     private String getAllReqCompNLs() {
 253  0
         StringBuilder NL = new StringBuilder();
 254  0
         for (StatementTreeViewInfo tree : rule.getStatements()) {
 255  0
             for (ReqComponentInfo reqComp : tree.getReqComponents()) {
 256  0
                 NL.append(reqComp.getNaturalLanguageTranslation());
 257  
             }
 258  
         }
 259  0
         return NL.toString();
 260  
     }
 261  
 
 262  
     //called when user clicks 'Add Rule' or 'Update Rule' when editing a req. component
 263  0
     protected Callback<ReqComponentInfoUi> actionButtonClickedReqCompCallback = new Callback<ReqComponentInfoUi>(){
 264  
         public void exec(final ReqComponentInfoUi reqComp) {
 265  
 
 266  0
             editReqCompWidget.setupNewReqComp();
 267  0
             setEnabled(true);
 268  
 
 269  
             //true if user cancel adding/editing req. component
 270  0
             if (reqComp == null) {
 271  0
                 return;
 272  
             }
 273  
 
 274  0
             KSBlockingProgressIndicator.addTask(creatingRuleTask);
 275  
 
 276  
             //1. update NL for the req. component
 277  0
             statementRpcServiceAsync.translateReqComponentToNLs(reqComp, new String[]{RULEEDIT_TEMLATE, RULEPREVIEW_TEMLATE}, TEMLATE_LANGUAGE, new KSAsyncCallback<List<String>>() {
 278  
                 public void handleFailure(Throwable caught) {
 279  0
                     KSBlockingProgressIndicator.removeTask(creatingRuleTask);
 280  0
                     Window.alert(caught.getMessage());
 281  0
                     GWT.log("translateReqComponentToNL failed", caught);
 282  0
                }
 283  
 
 284  
                 public void onSuccess(final List<String> reqCompNL) {
 285  
 
 286  0
                     reqComp.setNaturalLanguageTranslation(reqCompNL.get(0));
 287  0
                     reqComp.setPreviewNaturalLanguageTranslation(reqCompNL.get(1));
 288  
 
 289  
                     //2. add / update req. component
 290  0
                     rule = ruleManageWidget.getStatementTreeViewInfo();  //TODO ?
 291  
 
 292  0
                     if (editedReqCompInfo == null) {  //add req. component
 293  0
                         if (rule.getStatements() != null && !rule.getStatements().isEmpty()) {
 294  0
                             StatementTreeViewInfo newStatementTreeViewInfo = new StatementTreeViewInfo();
 295  0
                             newStatementTreeViewInfo.setId(CourseRequirementsSummaryView.NEW_STMT_TREE_ID + Integer.toString(tempStmtTreeViewInfoID++));
 296  0
                             newStatementTreeViewInfo.setOperator(rule.getStatements().get(0).getOperator());
 297  0
                             newStatementTreeViewInfo.getReqComponents().add(reqComp);
 298  0
                             rule.getStatements().add(newStatementTreeViewInfo);
 299  0
                         } else {
 300  0
                             rule.getReqComponents().add(reqComp);
 301  
                             //set default operator between req. components of the rule
 302  0
                             if (rule.getOperator() == null) {
 303  0
                                 rule.setOperator(StatementOperatorTypeKey.AND);
 304  
                             }
 305  
                         }
 306  
                     } else {    //update req. component
 307  0
                         editedReqCompInfo.setNaturalLanguageTranslation(reqComp.getNaturalLanguageTranslation());
 308  0
                         editedReqCompInfo.setReqCompFields(reqComp.getReqCompFields());
 309  0
                         editedReqCompInfo.setType(reqComp.getType());
 310  0
                         editedReqCompInfo = null;  //de-reference from existing req. component
 311  
                     }
 312  
 
 313  0
                     ruleManageWidget.redraw(rule, true);
 314  0
                     KSBlockingProgressIndicator.removeTask(creatingRuleTask);
 315  0
                 }
 316  
             });
 317  0
         }
 318  
     };
 319  
 
 320  
     //called when user selects a rule type in the editor
 321  0
     protected Callback<ReqComponentInfo> newReqCompSelectedCallbackCallback = new Callback<ReqComponentInfo>(){
 322  
         public void exec(final ReqComponentInfo reqComp) {
 323  0
             setEnabled(false);
 324  0
         }
 325  
     };
 326  
 
 327  
     private void retrieveAndSetupReqCompTypes() {
 328  
 
 329  0
         statementRpcServiceAsync.getReqComponentTypesForStatementType(rule.getType(), new KSAsyncCallback<List<ReqComponentTypeInfo>>() {
 330  
             public void handleFailure(Throwable cause) {
 331  0
                     GWT.log("Failed to get req. component types for statement of type:" + rule.getType(), cause);
 332  0
                     Window.alert("Failed to get req. component types for statement of type:" + rule.getType());
 333  0
             }
 334  
 
 335  
             public void onSuccess(final List<ReqComponentTypeInfo> reqComponentTypeInfoList) {
 336  0
                 if (reqComponentTypeInfoList == null || reqComponentTypeInfoList.size() == 0) {
 337  0
                     GWT.log("Missing Requirement Component Types", null);
 338  0
                     Window.alert("Missing Requirement Component Types");
 339  0
                     return;
 340  
                 }
 341  0
                 editReqCompWidget.setReqCompList(reqComponentTypeInfoList);
 342  0
                 editReqCompWidget.setCustomWidgets(getCustomWidgets(reqComponentTypeInfoList));                
 343  0
             }
 344  
         });
 345  0
     }
 346  
 
 347  
     private Map<String, Widget> getCustomWidgets(List<ReqComponentTypeInfo> reqComponentTypeInfoList) {
 348  0
         Map<String, Widget> customWidgets = new HashMap<String, Widget>();
 349  
 
 350  0
         for (ReqComponentTypeInfo reqCompTypeInfo : reqComponentTypeInfoList) {
 351  0
             for (ReqCompFieldTypeInfo fieldTypeInfo : reqCompTypeInfo.getReqCompFieldTypeInfos()) {
 352  0
                 if (RulesUtil.isGradeWidget(fieldTypeInfo.getId())) {
 353  0
                     customWidgets.put("kuali.reqComponent.field.type.grade.id", new GradeWidget());
 354  0
                 } else if (RulesUtil.isCourseWidget(fieldTypeInfo.getId())) {
 355  
 
 356  0
                     final CourseWidget courseWidget = GWT.create(CourseWidget.class);
 357  
                     
 358  0
                     courseWidget.addGetCluNameCallback(new Callback() {
 359  
 
 360  
                         @Override
 361  
                         public void exec(Object id) {
 362  
 
 363  0
                             luRpcServiceAsync.getCurrentVersion(CLU_NAMESPACE_URI, (String)id, new AsyncCallback<VersionDisplayInfo>() {
 364  
                                 @Override
 365  
                                 public void onFailure(Throwable throwable) {
 366  0
                                     Window.alert(throwable.getMessage());
 367  0
                                     GWT.log("Failed to retrieve clu for id: '" +  "'", throwable);
 368  0
                                 }
 369  
 
 370  
                                 @Override
 371  
                                 public void onSuccess(final VersionDisplayInfo versionInfo) {
 372  0
                                     luRpcServiceAsync.getClu(versionInfo.getId(), new AsyncCallback<CluInfo>() {
 373  
                                         @Override
 374  
                                         public void onFailure(Throwable throwable) {
 375  0
                                             Window.alert(throwable.getMessage());
 376  0
                                             GWT.log("Failed to retrieve clu", throwable);
 377  0
                                         }
 378  
 
 379  
                                         @Override
 380  
                                         public void onSuccess(CluInfo cluInfo) {
 381  0
                                             courseWidget.setLabelContent(cluInfo.getVersionInfo().getVersionIndId(), cluInfo.getOfficialIdentifier().getCode());
 382  0
                                         }
 383  
                                     });
 384  0
                                 }
 385  
                             });
 386  
 
 387  
 
 388  0
                         }
 389  
                     });
 390  
 
 391  0
                     customWidgets.put("kuali.reqComponent.field.type.course.clu.id", courseWidget);
 392  0
                 } else if (RulesUtil.isProgramWidget(fieldTypeInfo.getId())) {
 393  0
                     final ProgramWidget programWidget = new ProgramWidget();
 394  
 
 395  0
                     programWidget.addGetCluNameCallback(new Callback() {
 396  
 
 397  
                         @Override
 398  
                         public void exec(Object id) {
 399  
 
 400  0
                             statementRpcServiceAsync.getCurrentVersion(CLU_NAMESPACE_URI, (String)id, new AsyncCallback<VersionDisplayInfo>() {
 401  
                                 @Override
 402  
                                 public void onFailure(Throwable throwable) {
 403  0
                                     Window.alert(throwable.getMessage());
 404  0
                                     GWT.log("Failed to retrieve clu for id: '" +  "'", throwable);
 405  0
                                 }
 406  
 
 407  
                                 @Override
 408  
                                 public void onSuccess(final VersionDisplayInfo versionInfo) {
 409  0
                                     statementRpcServiceAsync.getClu(versionInfo.getId(), new AsyncCallback<CluInfo>() {
 410  
                                         @Override
 411  
                                         public void onFailure(Throwable throwable) {
 412  0
                                             Window.alert(throwable.getMessage());
 413  0
                                             GWT.log("Failed to retrieve clu", throwable);
 414  0
                                         }
 415  
 
 416  
                                         @Override
 417  
                                         public void onSuccess(CluInfo cluInfo) {
 418  0
                                             programWidget.setLabelContent(cluInfo.getVersionInfo().getVersionIndId(), cluInfo.getOfficialIdentifier().getCode());
 419  0
                                         }
 420  
                                     });
 421  0
                                 }
 422  
                             });
 423  0
                         }
 424  
                     });
 425  
 
 426  0
                     customWidgets.put("kuali.reqComponent.field.type.program.clu.id", programWidget);
 427  0
                 }
 428  
             }
 429  
         }
 430  0
         return customWidgets;
 431  
     }
 432  
 
 433  
     //called when user selects a rule type in the rule editor
 434  0
     protected Callback<ReqComponentInfo> retrieveCompositionTemplateCallback = new Callback<ReqComponentInfo>(){
 435  
         public void exec(final ReqComponentInfo reqComp) {
 436  0
             statementRpcServiceAsync.translateReqComponentToNL(reqComp, COMPOSITION_TEMLATE, TEMLATE_LANGUAGE, new KSAsyncCallback<String>() {
 437  
                 public void handleFailure(Throwable caught) {
 438  0
                     Window.alert(caught.getMessage());
 439  0
                     GWT.log("translateReqComponentToNL failed for req. comp. type: '" + reqComp.getType() + "'",caught);
 440  0
                 }
 441  
 
 442  
                 public void onSuccess(final String compositionTemplate) {
 443  0
                     editReqCompWidget.displayFieldsStart(compositionTemplate);
 444  0
                 }
 445  
             });
 446  0
         }
 447  
     };
 448  
 
 449  0
     protected Callback<List<String>> retrieveFieldsMetadataCallback = new Callback<List<String>>(){
 450  
         public void exec(final List<String> fieldTypes) {
 451  
 
 452  0
             if (fieldTypes.contains("kuali.reqComponent.field.type.grade.id")) {
 453  0
                 fieldTypes.add("kuali.reqComponent.field.type.gradeType.id");
 454  
             }
 455  
 
 456  0
             metadataServiceAsync.getMetadataList(ReqCompFieldInfo.class.getName(), fieldTypes, null, new KSAsyncCallback<List<Metadata>>() {
 457  
                 public void handleFailure(Throwable caught) {
 458  0
                     Window.alert(caught.getMessage());
 459  0
                     GWT.log("getMetadataList failed for req. comp. types: '" + fieldTypes.toString() + "'",caught);
 460  0
                 }
 461  
 
 462  
                 public void onSuccess(final List<Metadata> metadataList) {
 463  0
                     editReqCompWidget.displayFieldsEnd(metadataList);
 464  0
                 }
 465  
             });
 466  0
         }
 467  
     };
 468  
 
 469  0
     protected Callback<String> retrieveCustomWidgetCallback = new Callback<String>(){
 470  
         public void exec(final String fieldType) {
 471  0
             if (RulesUtil.isCluSetWidget(fieldType)) {
 472  0
                 String clusetType = "kuali.cluSet.type.Course";
 473  0
                 if (fieldType.toLowerCase().indexOf("program") > 0) {
 474  0
                     clusetType = "kuali.cluSet.type.Program";
 475  
                 }
 476  0
                 editReqCompWidget.displayCustomWidget(fieldType, new BuildCluSetWidget(new CluSetRetrieverImpl(), clusetType, false));
 477  
             }
 478  0
         }
 479  
     };
 480  
 
 481  
     public boolean isUserClickedSaveButton() {
 482  0
         return userClickedSaveButton;
 483  
     }
 484  
 
 485  
     public void setUserClickedSaveButton(boolean userClickedSaveButton) {
 486  0
         this.userClickedSaveButton = userClickedSaveButton;
 487  0
     }
 488  
 
 489  
     public Integer getInternalCourseReqID() {
 490  0
         return internalCourseReqID;
 491  
     }
 492  
 }