001 /** 002 * Copyright 2010 The Kuali Foundation Licensed under the 003 * Educational Community License, Version 2.0 (the "License"); you may 004 * not use this file except in compliance with the License. You may 005 * obtain a copy of the License at 006 * 007 * http://www.osedu.org/licenses/ECL-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, 010 * software distributed under the License is distributed on an "AS IS" 011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 012 * or implied. See the License for the specific language governing 013 * permissions and limitations under the License. 014 */ 015 package org.kuali.student.lum.common.client.widgets; 016 017 import java.util.ArrayList; 018 import java.util.List; 019 020 import org.kuali.student.common.ui.client.configurable.mvc.layouts.BasicLayout; 021 import org.kuali.student.common.ui.client.configurable.mvc.sections.Section; 022 import org.kuali.student.common.ui.client.mvc.*; 023 import org.kuali.student.common.ui.client.service.DataSaveResult; 024 import org.kuali.student.common.ui.client.widgets.progress.BlockingTask; 025 import org.kuali.student.common.ui.client.widgets.progress.KSBlockingProgressIndicator; 026 import org.kuali.student.common.ui.client.widgets.rules.AccessWidgetValue; 027 import org.kuali.student.core.assembly.data.Data; 028 import org.kuali.student.core.assembly.data.Metadata; 029 import org.kuali.student.core.validation.dto.ValidationResultInfo; 030 import org.kuali.student.core.validation.dto.ValidationResultInfo.ErrorLevel; 031 032 import com.google.gwt.core.client.GWT; 033 import com.google.gwt.user.client.Window; 034 import com.google.gwt.user.client.ui.FlowPanel; 035 036 public class BuildCluSetWidget extends FlowPanel implements AccessWidgetValue { 037 038 private CluSetRetriever cluSetRetriever; 039 private CluSetEditorWidget cluSetEditorWidgetView; 040 private static final String CLUSET_MODEL_ID = "clussetModelId"; 041 private DataModel ruleFieldsData; 042 private BasicLayout reqCompController; 043 public enum BuildCourseView {VIEW} 044 private BlockingTask retrievingTask = new BlockingTask("Retrieving ..."); 045 private String cluSetType; 046 private String metadataId; 047 private String itemLabel; 048 private boolean singularCluOnly; 049 050 public BuildCluSetWidget(final CluSetRetriever cluSetRetriever, String cluSetType, 051 boolean singularCluOnly) { 052 super(); 053 054 this.singularCluOnly = singularCluOnly; 055 cluSetEditorWidgetView = new CluSetEditorWidget( 056 new CluSetRetrieverImpl(), 057 BuildCourseView.VIEW, 058 "", CLUSET_MODEL_ID, false, 059 null, cluSetType, singularCluOnly); 060 061 ruleFieldsData = new DataModel(); 062 ruleFieldsData.setRoot(new Data()); 063 this.cluSetType = cluSetType; 064 if (cluSetType != null && cluSetType.equals("kuali.cluSet.type.Program")) { 065 this.metadataId = "programSet"; 066 this.itemLabel = "program"; 067 } else { 068 this.metadataId = "courseSet"; 069 this.itemLabel = "course"; 070 } 071 072 //setup controller 073 final CluSetRetriever theRetriever = cluSetRetriever; 074 this.cluSetRetriever = cluSetRetriever; 075 reqCompController = new BasicLayout(null); 076 reqCompController.addView(cluSetEditorWidgetView); 077 reqCompController.setDefaultModelId(CLUSET_MODEL_ID); 078 reqCompController.registerModel(CLUSET_MODEL_ID, new ModelProvider<DataModel>() { 079 @Override 080 public void requestModel(final ModelRequestCallback<DataModel> callback) { 081 if (ruleFieldsData.getDefinition() == null) { 082 theRetriever.getMetadata(metadataId, new Callback<Metadata>(){ 083 @Override 084 public void exec(Metadata result) { 085 DataModelDefinition def = new DataModelDefinition(result); 086 ruleFieldsData.setDefinition(def); 087 callback.onModelReady(ruleFieldsData); 088 } 089 }); 090 } else { 091 callback.onModelReady(ruleFieldsData); 092 } 093 } 094 }); 095 096 reqCompController.showView(BuildCourseView.VIEW); 097 add(reqCompController); 098 } 099 100 @Override 101 public void setValue(final String cluSetId) { 102 if (cluSetId != null) { 103 KSBlockingProgressIndicator.addTask(retrievingTask); 104 cluSetRetriever.getData(cluSetId, new Callback<Data>() { 105 @Override 106 public void exec(Data result) { 107 try { 108 ruleFieldsData.setRoot(result); 109 cluSetEditorWidgetView.updateView(ruleFieldsData); 110 reqCompController.showView(BuildCourseView.VIEW); 111 } finally { 112 KSBlockingProgressIndicator.removeTask(retrievingTask); 113 } 114 } 115 }); 116 } 117 } 118 119 @Override 120 public void initWidget(List<Metadata> fieldsMetadata) { 121 } 122 123 @Override 124 public void getValue(final Callback<String> doneSaveCallback) { 125 GWT.log("CluSetManagementController received save action request.", null); 126 reqCompController.getCurrentView().updateModel(); 127 if(ruleFieldsData!=null){ 128 ruleFieldsData.validate(new Callback<List<ValidationResultInfo>>() { 129 @Override 130 public void exec(List<ValidationResultInfo> result) { 131 132 boolean save = true; 133 View v = reqCompController.getCurrentView(); 134 if(v instanceof Section){ 135 ((Section) v).setFieldHasHadFocusFlags(true); 136 ErrorLevel status = ((Section) v).processValidationResults(result); 137 if(status == ErrorLevel.ERROR){ 138 save = false; 139 } 140 } 141 142 if(save){ 143 reqCompController.getCurrentView().updateModel(); 144 reqCompController.updateModel(); 145 // set reusable flag here for CluSetManagement. 146 Calendar startCal = new GregorianCalendar(); 147 startCal.set(Calendar.YEAR, 1990); 148 startCal.set(Calendar.MONTH, Calendar.JANUARY); 149 startCal.set(Calendar.DATE, 1); 150 startCal.set(Calendar.HOUR_OF_DAY, 1); 151 startCal.set(Calendar.MINUTE, 0); 152 startCal.set(Calendar.SECOND, 0); 153 Calendar endCal = new GregorianCalendar(); 154 endCal.set(Calendar.YEAR, 2200); 155 endCal.set(Calendar.MONTH, Calendar.JANUARY); 156 endCal.set(Calendar.DATE, 1); 157 endCal.set(Calendar.HOUR_OF_DAY, 1); 158 endCal.set(Calendar.MINUTE, 0); 159 endCal.set(Calendar.SECOND, 0); 160 CluSetHelper cluSetHelper = CluSetHelper.wrap(ruleFieldsData.getRoot()); 161 cluSetHelper.setType(cluSetType); 162 cluSetHelper.setName("AdHock"); 163 cluSetHelper.setReusable(new Boolean(false)); 164 cluSetHelper.setReferenceable(new Boolean(false)); 165 cluSetHelper.setEffectiveDate(startCal.getTime()); 166 cluSetHelper.setEffectiveDate(endCal.getTime()); 167 168 int numClus = 0; 169 if (cluSetHelper.getApprovedClus() != null) { 170 List<String> approvedCluIds = new ArrayList<String>(); 171 for (Data.Property p : cluSetHelper.getApprovedClus()) { 172 if(!"_runtimeData".equals(p.getKey())){ 173 String approvedCluId = p.getValue(); 174 approvedCluIds.add(approvedCluId); 175 } 176 } 177 numClus = numClus + approvedCluIds.size(); 178 } 179 if (cluSetHelper.getProposedClus() != null) { 180 List<String> proposedCluIds = new ArrayList<String>(); 181 for (Data.Property p : cluSetHelper.getProposedClus()) { 182 if(!"_runtimeData".equals(p.getKey())){ 183 String proposedCluId = p.getValue(); 184 proposedCluIds.add(proposedCluId); 185 } 186 } 187 numClus = numClus + proposedCluIds.size(); 188 } 189 if (singularCluOnly && numClus > 1) { 190 Window.alert("Only one " + itemLabel + " is allowed. " + 191 "Please delete all " + itemLabel + " until there is only one left."); 192 } else { 193 cluSetRetriever.saveData(ruleFieldsData.getRoot(), new Callback<DataSaveResult>() { 194 @Override 195 public void exec(DataSaveResult result) { 196 if (result.getValidationResults() != null && 197 !result.getValidationResults().isEmpty()) { 198 StringBuilder errorMessage = new StringBuilder(); 199 errorMessage.append("Validation error: "); 200 for (ValidationResultInfo validationError : result.getValidationResults()) { 201 errorMessage.append(validationError.getMessage()).append(" "); 202 } 203 doneSaveCallback.exec(null); 204 Window.alert(errorMessage.toString()); 205 } else { 206 ruleFieldsData.setRoot(result.getValue()); 207 CluSetHelper helper = CluSetHelper.wrap((Data)ruleFieldsData.getRoot()); 208 String cluSetId = helper.getId(); 209 Data approvedClusData = helper.getApprovedClus(); 210 Data proposedClusData = helper.getProposedClus(); 211 String cluId = null; 212 if (singularCluOnly) { 213 if (cluId == null && approvedClusData != null) { 214 for (Data.Property p : approvedClusData) { 215 if(!"_runtimeData".equals(p.getKey())){ 216 cluId = p.getValue(); 217 break; 218 } 219 } 220 } 221 if (cluId == null && proposedClusData != null) { 222 for (Data.Property p : proposedClusData) { 223 if(!"_runtimeData".equals(p.getKey())){ 224 cluId = p.getValue(); 225 break; 226 } 227 } 228 } 229 doneSaveCallback.exec(cluId); 230 } else { 231 doneSaveCallback.exec(cluSetId); 232 } 233 } 234 } 235 }); 236 } 237 } 238 else { 239 Window.alert("Save failed. Please check fields for errors."); 240 } 241 242 } 243 }); 244 } 245 } 246 247 }