001 /**
002 * Copyright 2005-2012 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.krad.uif.widget;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.rice.krad.uif.UifConstants;
020 import org.kuali.rice.krad.uif.UifParameters;
021 import org.kuali.rice.krad.uif.field.InputField;
022 import org.kuali.rice.krad.uif.view.View;
023 import org.kuali.rice.krad.uif.component.BindingInfo;
024 import org.kuali.rice.krad.uif.component.Component;
025 import org.kuali.rice.krad.uif.field.ActionField;
026 import org.kuali.rice.krad.util.UrlFactory;
027
028 import java.util.List;
029 import java.util.Map;
030 import java.util.Map.Entry;
031 import java.util.Properties;
032
033 /**
034 * Widget for rendering an Direct Inquiry link icon next to a input field
035 *
036 * @author Kuali Rice Team (rice.collab@kuali.org)
037 */
038 public class DirectInquiry extends Inquiry {
039 private static final long serialVersionUID = -2490979579285984314L;
040
041 private ActionField directInquiryActionField;
042
043 private boolean adjustInquiryParameters;
044 private BindingInfo fieldBindingInfo;
045
046 public DirectInquiry() {
047 super();
048
049 adjustInquiryParameters = false;
050 }
051
052 /**
053 * @see org.kuali.rice.krad.uif.widget.WidgetBase#performFinalize(org.kuali.rice.krad.uif.view.View,
054 * java.lang.Object, org.kuali.rice.krad.uif.component.Component)
055 */
056 @Override
057 public void performFinalize(View view, Object model, Component parent) {
058 super.performFinalize(view, model, parent);
059
060 // only set inquiry if enabled
061 if (!isRender() || isReadOnly()) {
062 return;
063 }
064
065 // set render to false until we find an inquiry class
066 setRender(false);
067
068 InputField field = (InputField) parent;
069
070 // determine whether inquiry parameters will need adjusted
071 if (StringUtils.isBlank(getDataObjectClassName())
072 || (getInquiryParameters() == null)
073 || getInquiryParameters().isEmpty()) {
074 // if inquiry parameters not given, they will not be adjusted by super
075 adjustInquiryParameters = true;
076 fieldBindingInfo = field.getBindingInfo();
077 }
078
079 setupLink(view, model, field);
080 }
081
082 /**
083 * Builds the inquiry link and onclick script based on the given inquiry class and parameters
084 *
085 * @param dataObject
086 * - parent object that contains the data (used to pull inquiry
087 * parameters)
088 * @param propertyName
089 * - name of the property the inquiry is set on
090 * @param inquiryObjectClass
091 * - class of the object the inquiry should point to
092 * @param inquiryParms
093 * - map of key field mappings for the inquiry
094 */
095 public void buildInquiryLink(Object dataObject, String propertyName,
096 Class<?> inquiryObjectClass, Map<String, String> inquiryParms) {
097 Properties urlParameters = new Properties();
098
099 urlParameters.put(UifParameters.DATA_OBJECT_CLASS_NAME,
100 inquiryObjectClass.getName());
101 urlParameters.put(UifParameters.METHOD_TO_CALL,
102 UifConstants.MethodToCallNames.START);
103
104 // Direct inquiry
105 String inquiryUrl = UrlFactory.parameterizeUrl(getBaseInquiryUrl(),
106 urlParameters);
107 StringBuilder paramMapString = new StringBuilder();
108
109 // Check if lightbox is set. Get lightbox options.
110 String lightBoxOptions = "";
111 boolean lightBoxShow = directInquiryActionField.getLightBoxDirectInquiry() != null;
112 if (lightBoxShow) {
113 lightBoxOptions = directInquiryActionField.getLightBoxDirectInquiry()
114 .getComponentOptionsJSString();
115 }
116
117 // Build parameter string using the actual names of the fields as on the
118 // html page
119 for (Entry<String, String> inquiryParameter : inquiryParms.entrySet()) {
120 String inquiryParameterFrom = inquiryParameter.getKey();
121 if (adjustInquiryParameters && (fieldBindingInfo != null)) {
122 inquiryParameterFrom = fieldBindingInfo.getPropertyAdjustedBindingPath(inquiryParameterFrom);
123 }
124 paramMapString.append(inquiryParameterFrom);
125 paramMapString.append(":");
126 paramMapString.append(inquiryParameter.getValue());
127 paramMapString.append(",");
128 }
129 paramMapString.deleteCharAt(paramMapString.length() - 1);
130
131 // Create onlick script to open the inquiry window on the click event
132 // of the direct inquiry
133 StringBuilder onClickScript = new StringBuilder("showDirectInquiry(\"");
134 onClickScript.append(inquiryUrl);
135 onClickScript.append("\", \"");
136 onClickScript.append(paramMapString);
137 onClickScript.append("\", ");
138 onClickScript.append(lightBoxShow);
139 onClickScript.append(", ");
140 onClickScript.append(lightBoxOptions);
141 onClickScript.append(");");
142
143 directInquiryActionField.setBlockValidateDirty(true);
144 directInquiryActionField.setClientSideJs(onClickScript.toString());
145
146 setRender(true);
147 }
148
149 /**
150 * @see org.kuali.rice.krad.uif.component.ComponentBase#getComponentsForLifecycle()
151 */
152 @Override
153 public List<Component> getComponentsForLifecycle() {
154 List<Component> components = super.getComponentsForLifecycle();
155
156 components.add(directInquiryActionField);
157
158 return components;
159 }
160
161 /**
162 * @return the directInquiryActionField
163 */
164 public ActionField getDirectInquiryActionField() {
165 return this.directInquiryActionField;
166 }
167
168 /**
169 * @param directInquiryActionField the directInquiryActionField to set
170 */
171 public void setDirectInquiryActionField(ActionField directInquiryActionField) {
172 this.directInquiryActionField = directInquiryActionField;
173 }
174
175 }