Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
LookupView |
|
| 1.3170731707317074;1.317 |
1 | /** | |
2 | * Copyright 2005-2011 The Kuali Foundation | |
3 | * | |
4 | * Licensed under the Educational Community License, Version 2.0 (the "License"); | |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at | |
7 | * | |
8 | * http://www.opensource.org/licenses/ecl2.php | |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
15 | */ | |
16 | package org.kuali.rice.krad.uif.view; | |
17 | ||
18 | import org.apache.commons.lang.StringUtils; | |
19 | import org.kuali.rice.krad.uif.UifConstants.ViewType; | |
20 | import org.kuali.rice.krad.uif.UifPropertyPaths; | |
21 | import org.kuali.rice.krad.uif.container.CollectionGroup; | |
22 | import org.kuali.rice.krad.uif.container.Group; | |
23 | import org.kuali.rice.krad.uif.component.Component; | |
24 | import org.kuali.rice.krad.uif.component.RequestParameter; | |
25 | import org.kuali.rice.krad.uif.field.Field; | |
26 | import org.kuali.rice.krad.web.form.LookupForm; | |
27 | ||
28 | import java.util.Arrays; | |
29 | import java.util.List; | |
30 | ||
31 | /** | |
32 | * View type for Maintenance documents | |
33 | * | |
34 | * <p> | |
35 | * Supports doing a search against a data object class or performing a more advanced query. The view | |
36 | * type is primarily made up of two groups, the search (or criteria) group and the results group. Many | |
37 | * options are supported on the view to enable/disable certain features, like what actions are available | |
38 | * on the search results. | |
39 | * </p> | |
40 | * | |
41 | * <p> | |
42 | * Works in conjunction with <code>LookupableImpl</code> which customizes the view and carries out the | |
43 | * business functionality | |
44 | * </p> | |
45 | * | |
46 | * @author Kuali Rice Team (rice.collab@kuali.org) | |
47 | */ | |
48 | public class LookupView extends FormView { | |
49 | private static final long serialVersionUID = 716926008488403616L; | |
50 | ||
51 | private Class<?> dataObjectClassName; | |
52 | ||
53 | private Group criteriaGroup; | |
54 | private CollectionGroup resultsGroup; | |
55 | ||
56 | private Field resultsActionsField; | |
57 | private Field resultsReturnField; | |
58 | ||
59 | private List<Component> criteriaFields; | |
60 | private List<Component> resultFields; | |
61 | private List<String> defaultSortAttributeNames; | |
62 | ||
63 | 0 | protected boolean defaultSortAscending = true; |
64 | ||
65 | 0 | @RequestParameter |
66 | private boolean hideReturnLinks = false; | |
67 | 0 | @RequestParameter |
68 | private boolean suppressActions = false; | |
69 | 0 | @RequestParameter |
70 | private boolean showMaintenanceLinks = false; | |
71 | 0 | @RequestParameter |
72 | private boolean multipleValuesSelect = false; | |
73 | ||
74 | @RequestParameter | |
75 | private String returnTarget; | |
76 | ||
77 | @RequestParameter | |
78 | private boolean returnByScript; | |
79 | ||
80 | 0 | private boolean lookupCriteriaEnabled = true; |
81 | 0 | private boolean supplementalActionsEnabled = false; |
82 | 0 | private boolean disableSearchButtons = false; |
83 | ||
84 | 0 | private Integer resultSetLimit = null; |
85 | ||
86 | private String maintenanceUrlMapping; | |
87 | ||
88 | public LookupView() { | |
89 | 0 | super(); |
90 | 0 | setViewTypeName(ViewType.LOOKUP); |
91 | 0 | setValidateDirty(false); |
92 | 0 | } |
93 | ||
94 | /** | |
95 | * The following initialization is performed: | |
96 | * | |
97 | * <ul> | |
98 | * <li>Set the abstractTypeClasses map for the lookup object path</li> | |
99 | * </ul> | |
100 | * | |
101 | * @see org.kuali.rice.krad.uif.container.ContainerBase#performInitialization(org.kuali.rice.krad.uif.view.View, java.lang.Object) | |
102 | */ | |
103 | @Override | |
104 | public void performInitialization(View view, Object model) { | |
105 | 0 | initializeGroups(); |
106 | 0 | if (getItems().isEmpty()) { |
107 | 0 | setItems(Arrays.asList(getCriteriaGroup(), getResultsGroup())); |
108 | } | |
109 | 0 | super.performInitialization(view, model); |
110 | ||
111 | 0 | getAbstractTypeClasses().put(UifPropertyPaths.CRITERIA_FIELDS, getDataObjectClassName()); |
112 | 0 | if (StringUtils.isNotBlank(getDefaultBindingObjectPath())) { |
113 | 0 | getAbstractTypeClasses().put(getDefaultBindingObjectPath(), getDataObjectClassName()); |
114 | } | |
115 | 0 | } |
116 | ||
117 | protected void initializeGroups() { | |
118 | 0 | if ((getCriteriaGroup() != null) && (getCriteriaGroup().getItems().isEmpty())) { |
119 | 0 | getCriteriaGroup().setItems(getCriteriaFields()); |
120 | } | |
121 | 0 | if (getResultsGroup() != null) { |
122 | 0 | if ((getResultsGroup().getItems().isEmpty()) && (getResultFields() != null)) { |
123 | 0 | getResultsGroup().setItems(getResultFields()); |
124 | } | |
125 | 0 | if (getResultsGroup().getCollectionObjectClass() == null) { |
126 | 0 | getResultsGroup().setCollectionObjectClass(getDataObjectClassName()); |
127 | } | |
128 | } | |
129 | 0 | } |
130 | ||
131 | /** | |
132 | * @see org.kuali.rice.krad.uif.container.ContainerBase#performApplyModel(org.kuali.rice.krad.uif.view.View, | |
133 | * java.lang.Object) | |
134 | */ | |
135 | @Override | |
136 | public void performApplyModel(View view, Object model, Component parent) { | |
137 | 0 | LookupForm lookupForm = (LookupForm) model; |
138 | ||
139 | // TODO: need to check lookupForm.isAtLeastOneRowHasActions() somewhere | |
140 | 0 | if (!isSuppressActions() && isShowMaintenanceLinks()) { |
141 | 0 | ((List<Field>) getResultsGroup().getItems()).add(0, getResultsActionsField()); |
142 | } | |
143 | ||
144 | 0 | if (StringUtils.isNotBlank(lookupForm.getReturnFormKey()) && |
145 | StringUtils.isNotBlank(lookupForm.getReturnLocation()) && !isHideReturnLinks()) { | |
146 | 0 | ((List<Field>) getResultsGroup().getItems()).add(0, getResultsReturnField()); |
147 | } | |
148 | ||
149 | 0 | super.performApplyModel(view, model, parent); |
150 | 0 | } |
151 | ||
152 | /** | |
153 | * @see org.kuali.rice.krad.uif.component.Component#getComponentPrototypes() | |
154 | */ | |
155 | @Override | |
156 | public List<Component> getComponentPrototypes() { | |
157 | 0 | List<Component> components = super.getComponentPrototypes(); |
158 | ||
159 | 0 | components.add(criteriaGroup); |
160 | 0 | components.add(resultsGroup); |
161 | 0 | components.add(resultsActionsField); |
162 | 0 | components.add(resultsReturnField); |
163 | 0 | components.addAll(criteriaFields); |
164 | 0 | components.addAll(resultFields); |
165 | ||
166 | 0 | return components; |
167 | } | |
168 | ||
169 | public void applyConditionalLogicForFieldDisplay() { | |
170 | // TODO: work into view lifecycle | |
171 | // LookupViewHelperService lookupViewHelperService = (LookupViewHelperService) getViewHelperService(); | |
172 | // Set<String> readOnlyFields = lookupViewHelperService.getConditionallyReadOnlyPropertyNames(); | |
173 | // Set<String> requiredFields = lookupViewHelperService.getConditionallyRequiredPropertyNames(); | |
174 | // Set<String> hiddenFields = lookupViewHelperService.getConditionallyHiddenPropertyNames(); | |
175 | // if ( (readOnlyFields != null && !readOnlyFields.isEmpty()) || | |
176 | // (requiredFields != null && !requiredFields.isEmpty()) || | |
177 | // (hiddenFields != null && !hiddenFields.isEmpty()) | |
178 | // ) { | |
179 | // for (Field field : getResultsGroup().getItems()) { | |
180 | // if (InputField.class.isAssignableFrom(field.getClass())) { | |
181 | // InputField attributeField = (InputField) field; | |
182 | // if (readOnlyFields != null && readOnlyFields.contains(attributeField.getBindingInfo().getBindingName())) { | |
183 | // attributeField.setReadOnly(true); | |
184 | // } | |
185 | // if (requiredFields != null && requiredFields.contains(attributeField.getBindingInfo().getBindingName())) { | |
186 | // attributeField.setRequired(Boolean.TRUE); | |
187 | // } | |
188 | // if (hiddenFields != null && hiddenFields.contains(attributeField.getBindingInfo().getBindingName())) { | |
189 | // attributeField.setControl(LookupInquiryUtils.generateCustomLookupControlFromExisting(HiddenControl.class, null)); | |
190 | // } | |
191 | // } | |
192 | // } | |
193 | // } | |
194 | 0 | } |
195 | ||
196 | /** | |
197 | * Class name for the object the lookup applies to | |
198 | * | |
199 | * <p> | |
200 | * The object class name is used to pick up a dictionary entry which will | |
201 | * feed the attribute field definitions and other configuration. In addition | |
202 | * it is to configure the <code>Lookupable</code> which will carry out the | |
203 | * lookup action | |
204 | * </p> | |
205 | * | |
206 | * @return Class<?> lookup data object class | |
207 | */ | |
208 | public Class<?> getDataObjectClassName() { | |
209 | 0 | return this.dataObjectClassName; |
210 | } | |
211 | ||
212 | /** | |
213 | * Setter for the object class name | |
214 | * | |
215 | * @param dataObjectClassName | |
216 | */ | |
217 | public void setDataObjectClassName(Class<?> dataObjectClassName) { | |
218 | 0 | this.dataObjectClassName = dataObjectClassName; |
219 | 0 | } |
220 | ||
221 | /** | |
222 | * @return the hideReturnLinks | |
223 | */ | |
224 | public boolean isHideReturnLinks() { | |
225 | 0 | return this.hideReturnLinks; |
226 | } | |
227 | ||
228 | /** | |
229 | * @param hideReturnLinks the hideReturnLinks to set | |
230 | */ | |
231 | public void setHideReturnLinks(boolean hideReturnLinks) { | |
232 | 0 | this.hideReturnLinks = hideReturnLinks; |
233 | 0 | } |
234 | ||
235 | /** | |
236 | * @return the suppressActions | |
237 | */ | |
238 | public boolean isSuppressActions() { | |
239 | 0 | return this.suppressActions; |
240 | } | |
241 | ||
242 | /** | |
243 | * @param suppressActions the suppressActions to set | |
244 | */ | |
245 | public void setSuppressActions(boolean suppressActions) { | |
246 | 0 | this.suppressActions = suppressActions; |
247 | 0 | } |
248 | ||
249 | /** | |
250 | * @return the showMaintenanceLinks | |
251 | */ | |
252 | public boolean isShowMaintenanceLinks() { | |
253 | 0 | return this.showMaintenanceLinks; |
254 | } | |
255 | ||
256 | /** | |
257 | * @param showMaintenanceLinks the showMaintenanceLinks to set | |
258 | */ | |
259 | public void setShowMaintenanceLinks(boolean showMaintenanceLinks) { | |
260 | 0 | this.showMaintenanceLinks = showMaintenanceLinks; |
261 | 0 | } |
262 | ||
263 | /** | |
264 | * Indicates whether multiple values select should be enabled for the lookup | |
265 | * | |
266 | * <p> | |
267 | * When set to true, the select field is enabled for the lookup results group that allows the user | |
268 | * to select one or more rows for returning | |
269 | * </p> | |
270 | * | |
271 | * @return boolean true if multiple values should be enabled, false otherwise | |
272 | */ | |
273 | public boolean isMultipleValuesSelect() { | |
274 | 0 | return multipleValuesSelect; |
275 | } | |
276 | ||
277 | /** | |
278 | * Setter for the multiple values select indicator | |
279 | * | |
280 | * @param multipleValuesSelect | |
281 | */ | |
282 | public void setMultipleValuesSelect(boolean multipleValuesSelect) { | |
283 | 0 | this.multipleValuesSelect = multipleValuesSelect; |
284 | 0 | } |
285 | ||
286 | /** | |
287 | * @return the resultsActionsField | |
288 | */ | |
289 | public Field getResultsActionsField() { | |
290 | 0 | return this.resultsActionsField; |
291 | } | |
292 | ||
293 | /** | |
294 | * @param resultsActionsField the resultsActionsField to set | |
295 | */ | |
296 | public void setResultsActionsField(Field resultsActionsField) { | |
297 | 0 | this.resultsActionsField = resultsActionsField; |
298 | 0 | } |
299 | ||
300 | /** | |
301 | * @return the resultsReturnField | |
302 | */ | |
303 | public Field getResultsReturnField() { | |
304 | 0 | return this.resultsReturnField; |
305 | } | |
306 | ||
307 | /** | |
308 | * @param resultsReturnField the resultsReturnField to set | |
309 | */ | |
310 | public void setResultsReturnField(Field resultsReturnField) { | |
311 | 0 | this.resultsReturnField = resultsReturnField; |
312 | 0 | } |
313 | ||
314 | public Group getCriteriaGroup() { | |
315 | 0 | return this.criteriaGroup; |
316 | } | |
317 | ||
318 | public void setCriteriaGroup(Group criteriaGroup) { | |
319 | 0 | this.criteriaGroup = criteriaGroup; |
320 | 0 | } |
321 | ||
322 | public CollectionGroup getResultsGroup() { | |
323 | 0 | return this.resultsGroup; |
324 | } | |
325 | ||
326 | public void setResultsGroup(CollectionGroup resultsGroup) { | |
327 | 0 | this.resultsGroup = resultsGroup; |
328 | 0 | } |
329 | ||
330 | public List<Component> getCriteriaFields() { | |
331 | 0 | return this.criteriaFields; |
332 | } | |
333 | ||
334 | public void setCriteriaFields(List<Component> criteriaFields) { | |
335 | 0 | this.criteriaFields = criteriaFields; |
336 | 0 | } |
337 | ||
338 | public List<Component> getResultFields() { | |
339 | 0 | return this.resultFields; |
340 | } | |
341 | ||
342 | public void setResultFields(List<Component> resultFields) { | |
343 | 0 | this.resultFields = resultFields; |
344 | 0 | } |
345 | ||
346 | public List<String> getDefaultSortAttributeNames() { | |
347 | 0 | return this.defaultSortAttributeNames; |
348 | } | |
349 | ||
350 | public void setDefaultSortAttributeNames(List<String> defaultSortAttributeNames) { | |
351 | 0 | this.defaultSortAttributeNames = defaultSortAttributeNames; |
352 | 0 | } |
353 | ||
354 | public boolean isDefaultSortAscending() { | |
355 | 0 | return this.defaultSortAscending; |
356 | } | |
357 | ||
358 | public void setDefaultSortAscending(boolean defaultSortAscending) { | |
359 | 0 | this.defaultSortAscending = defaultSortAscending; |
360 | 0 | } |
361 | ||
362 | /** | |
363 | * Retrieves the maximum number of records that will be listed | |
364 | * as a result of the lookup search | |
365 | * | |
366 | * @return Integer result set limit | |
367 | */ | |
368 | public Integer getResultSetLimit() { | |
369 | 0 | return resultSetLimit; |
370 | } | |
371 | ||
372 | /** | |
373 | * Setter for the result list limit | |
374 | * | |
375 | * @param resultSetLimit Integer specifying limit | |
376 | */ | |
377 | public void setResultSetLimit(Integer resultSetLimit) { | |
378 | 0 | this.resultSetLimit = resultSetLimit; |
379 | 0 | } |
380 | ||
381 | /** | |
382 | * Indicates whether a result set limit has been specified for the | |
383 | * view | |
384 | * | |
385 | * @return true if this instance has a result set limit | |
386 | */ | |
387 | public boolean hasResultSetLimit() { | |
388 | 0 | return (resultSetLimit != null); |
389 | } | |
390 | ||
391 | /** | |
392 | * @param returnTarget the returnTarget to set | |
393 | */ | |
394 | public void setReturnTarget(String returnTarget) { | |
395 | 0 | this.returnTarget = returnTarget; |
396 | 0 | } |
397 | ||
398 | /** | |
399 | * @return the returnTarget | |
400 | */ | |
401 | public String getReturnTarget() { | |
402 | 0 | return returnTarget; |
403 | } | |
404 | ||
405 | /** | |
406 | * @return the returnByScript | |
407 | */ | |
408 | public boolean isReturnByScript() { | |
409 | 0 | return returnByScript; |
410 | } | |
411 | ||
412 | /** | |
413 | * Setter for the flag to indicate that lookups will return the value | |
414 | * by script and not a post | |
415 | * | |
416 | * @param returnByScript the returnByScript flag | |
417 | */ | |
418 | public void setReturnByScript(boolean returnByScript) { | |
419 | 0 | this.returnByScript = returnByScript; |
420 | 0 | } |
421 | ||
422 | /** | |
423 | * String that maps to the maintenance controller for the maintenance document (if any) associated with the | |
424 | * lookup data object class | |
425 | * | |
426 | * <p> | |
427 | * Mapping will be used to build the maintenance action links (such as edit, copy, and new). If not given, the | |
428 | * default maintenance mapping will be used | |
429 | * </p> | |
430 | * | |
431 | * @return String mapping string | |
432 | */ | |
433 | public String getMaintenanceUrlMapping() { | |
434 | 0 | return maintenanceUrlMapping; |
435 | } | |
436 | ||
437 | /** | |
438 | * Setter for the URL mapping string that will be used to build up maintenance action URLs | |
439 | * | |
440 | * @param maintenanceUrlMapping | |
441 | */ | |
442 | public void setMaintenanceUrlMapping(String maintenanceUrlMapping) { | |
443 | 0 | this.maintenanceUrlMapping = maintenanceUrlMapping; |
444 | 0 | } |
445 | } |