001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.krad.uif.widget;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.krad.uif.UifConstants;
020import org.kuali.rice.krad.uif.UifParameters;
021import org.kuali.rice.krad.uif.field.InputField;
022import org.kuali.rice.krad.uif.view.View;
023import org.kuali.rice.krad.uif.component.BindingInfo;
024import org.kuali.rice.krad.uif.component.Component;
025import org.kuali.rice.krad.uif.field.ActionField;
026import org.kuali.rice.krad.util.UrlFactory;
027
028import java.util.List;
029import java.util.Map;
030import java.util.Map.Entry;
031import 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 */
038public 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}