1 /**
2 * Copyright 2005-2016 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.field;
17
18 import java.beans.PropertyEditor;
19 import java.util.List;
20
21 import org.kuali.rice.krad.datadictionary.AttributeDefinition;
22 import org.kuali.rice.krad.datadictionary.mask.MaskFormatter;
23 import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
24 import org.kuali.rice.krad.uif.component.ComponentSecurity;
25 import org.kuali.rice.krad.uif.component.DataBinding;
26 import org.kuali.rice.krad.uif.widget.Helpable;
27 import org.kuali.rice.krad.uif.widget.Inquiry;
28 import org.kuali.rice.krad.valuefinder.ValueFinder;
29
30 /**
31 * Component interface for data fields.
32 *
33 * @author Kuali Rice Team (rice.collab@kuali.org)
34 */
35 public interface DataField extends DataBinding, Helpable, Field {
36
37 /**
38 * Defaults the properties of the <code>DataField</code> to the
39 * corresponding properties of its <code>AttributeDefinition</code>
40 * retrieved from the dictionary (if such an entry exists). If the field
41 * already contains a value for a property, the definitions value is not
42 * used.
43 *
44 * @param attributeDefinition AttributeDefinition instance the property values should be
45 * copied from
46 */
47 void copyFromAttributeDefinition(AttributeDefinition attributeDefinition);
48
49 /**
50 * Indicates whether the data field instance allows input, subclasses should override and set to
51 * true if input is allowed
52 *
53 * @return true if input is allowed, false if read only
54 */
55 boolean isInputAllowed();
56
57 /**
58 * Setter for the component's property name
59 *
60 * @param propertyName
61 */
62 void setPropertyName(String propertyName);
63
64 /**
65 * Performs formatting of the field value for display and then converting the value back to its
66 * expected type from a string
67 *
68 * <p>
69 * Note property editors exist and are already registered for the basic Java types and the
70 * common Kuali types such as [@link KualiDecimal}. Registration with this property is only
71 * needed for custom property editors
72 * </p>
73 *
74 * @return PropertyEditor property editor instance to use for this field
75 */
76 PropertyEditor getPropertyEditor();
77
78 /**
79 * Setter for the custom property editor to use for the field
80 *
81 * @param propertyEditor
82 */
83 void setPropertyEditor(PropertyEditor propertyEditor);
84
85 /**
86 * Convenience setter for configuring a property editor by class
87 *
88 * @param propertyEditorClass
89 */
90 void setPropertyEditorClass(Class<? extends PropertyEditor> propertyEditorClass);
91
92 /**
93 * Returns the full binding path (the path used in the name attribute of the input).
94 * This differs from propertyName in that it uses BindingInfo to determine the path.
95 *
96 * @return full binding path name
97 */
98 String getName();
99
100 /**
101 * Name of the attribute within the data dictionary the attribute field is
102 * associated with
103 *
104 * <p>
105 * During the initialize phase for the <code>View</code>, properties for
106 * attribute fields are defaulted from a corresponding
107 * <code>AttributeDefinition</code> in the data dictionary. Based on the
108 * propertyName and parent object class the framework attempts will
109 * determine the attribute definition that is associated with the field and
110 * set this property. However this property can also be set in the fields
111 * configuration to use another dictionary attribute.
112 * </p>
113 *
114 * <p>
115 * The attribute name is used along with the dictionary object entry to find
116 * the <code>AttributeDefinition</code>
117 * </p>
118 *
119 * @return attribute name
120 */
121 String getDictionaryAttributeName();
122
123 /**
124 * Setter for the dictionary attribute name
125 *
126 * @param dictionaryAttributeName
127 */
128 void setDictionaryAttributeName(String dictionaryAttributeName);
129
130 /**
131 * Object entry name in the data dictionary the associated attribute is
132 * apart of
133 *
134 * <p>
135 * During the initialize phase for the <code>View</code>, properties for
136 * attribute fields are defaulted from a corresponding
137 * <code>AttributeDefinition</code> in the data dictionary. Based on the
138 * parent object class the framework will determine the object entry for the
139 * associated attribute. However the object entry can be set in the field's
140 * configuration to use another object entry for the attribute
141 * </p>
142 *
143 * <p>
144 * The attribute name is used along with the dictionary object entry to find
145 * the <code>AttributeDefinition</code>
146 * </p>
147 *
148 * @return String
149 */
150 String getDictionaryObjectEntry();
151
152 /**
153 * Setter for the dictionary object entry
154 *
155 * @param dictionaryObjectEntry
156 */
157 void setDictionaryObjectEntry(String dictionaryObjectEntry);
158
159 /**
160 * Default value for the model property the field points to
161 *
162 * <p>
163 * When a new <code>View</code> instance is requested, the corresponding
164 * model will be newly created. During this initialization process the value
165 * for the model property will be set to the given default value, if it was null.
166 * This will only work on properties which can be determined to be null.
167 * Therefore a String property with an empty string value will
168 * not be ovewritten with the defaultValue set here.
169 * </p>
170 *
171 * <p>
172 * In addition, int, boolean, and other primitive types
173 * will not use this default value because they inherently have a value in Java (0 for int, false for boolean, etc).
174 * To use such types either using a primitive wrapper type (Integer, Boolean, etc) so an unset variable can
175 * be determined to be null, or explicitly set the default value on the form/object itself for these types and
176 * not through this property.
177 * </p>
178 *
179 * @return default value
180 */
181 Object getDefaultValue();
182
183 /**
184 * Setter for the fields default value
185 *
186 * @param defaultValue
187 */
188 void setDefaultValue(Object defaultValue);
189
190 /**
191 * Gives Class that should be invoked to produce the default value for the
192 * field
193 *
194 * @return default value finder class
195 */
196 Class<? extends ValueFinder> getDefaultValueFinderClass();
197
198 /**
199 * Setter for the default value finder class
200 *
201 * @param defaultValueFinderClass
202 */
203 void setDefaultValueFinderClass(Class<? extends ValueFinder> defaultValueFinderClass);
204
205 /**
206 * Array of default values for the model property the field points to
207 *
208 * <p>
209 * When a new <code>View</code> instance is requested, the corresponding
210 * model will be newly created. During this initialization process the value
211 * for the model property will be set to the given default values (if set)
212 * </p>
213 *
214 * @return default value
215 */
216 List<Object> getDefaultValues();
217
218 /**
219 * Setter for the fields default values
220 *
221 * @param defaultValues
222 */
223 void setDefaultValues(List<Object> defaultValues);
224
225 /**
226 * For read only DataFields, if forcedValue has a value, the value of it will be used instead of the value
227 * received from the propertyName specified for this field;
228 * this can be combined with SpringEL to format a property value in some way, for example.
229 *
230 * @return the forced value
231 */
232 String getForcedValue();
233
234 /**
235 * @see org.kuali.rice.krad.uif.field.DataField#setForcedValue(String)
236 */
237 void setForcedValue(String forcedValue);
238
239 /**
240 * Summary help text for the field
241 *
242 * @return summary help text
243 */
244 String getHelpSummary();
245
246 /**
247 * Setter for the summary help text
248 *
249 * @param helpSummary
250 */
251 void setHelpSummary(String helpSummary);
252
253 /**
254 * Data Field Security object that indicates what authorization (permissions) exist for the field
255 *
256 * @return DataFieldSecurity instance
257 */
258 DataFieldSecurity getDataFieldSecurity();
259
260 /**
261 * Override to assert a {@link DataFieldSecurity} instance is set
262 *
263 * @param componentSecurity instance of DataFieldSecurity
264 */
265 void setComponentSecurity(ComponentSecurity componentSecurity);
266
267 /**
268 * Indicates the field should be read-only but also a hidden should be generated for the field
269 *
270 * <p>
271 * Useful for when a value is just displayed but is needed by script
272 * </p>
273 *
274 * @return true if field should be readOnly hidden, false if not
275 */
276 boolean isAddHiddenWhenReadOnly();
277
278 /**
279 * Setter for the read-only hidden indicator
280 *
281 * @param addHiddenWhenReadOnly
282 */
283 void setAddHiddenWhenReadOnly(boolean addHiddenWhenReadOnly);
284
285 /**
286 * Inquiry widget for the field
287 *
288 * <p>
289 * The inquiry widget will render a link for the field value when read-only
290 * that points to the associated inquiry view for the field. The inquiry can
291 * be configured to point to a certain <code>InquiryView</code>, or the
292 * framework will attempt to associate the field with a inquiry based on its
293 * metadata (in particular its relationships in the model)
294 * </p>
295 *
296 * @return Inquiry field inquiry
297 */
298 Inquiry getInquiry();
299
300 /**
301 * Setter for the inquiry widget
302 *
303 * @param inquiry
304 */
305 void setInquiry(Inquiry inquiry);
306
307 /**
308 * Indicates whether inquiries should be automatically set when a relationship for the field's property
309 * is found
310 *
311 * <p>
312 * Note this only applies when the {@link #getInquiry()} widget has not been configured (is null)
313 * and is set to true by default
314 * </p>
315 *
316 * @return true if auto inquiries are enabled, false if not
317 */
318 boolean isEnableAutoInquiry();
319
320 /**
321 * Setter for enabling automatic inquiries
322 *
323 * @param enableAutoInquiry
324 */
325 void setEnableAutoInquiry(boolean enableAutoInquiry);
326
327 /**
328 * When true, render the info message span which contains can contain additional information
329 * about the field (used by Field Query functionality)
330 *
331 * @return true if the span will be rendered, false otherwise
332 */
333 boolean isRenderInfoMessageSpan();
334
335 /**
336 * @see org.kuali.rice.krad.uif.field.DataField#isRenderInfoMessageSpan()
337 * @param renderInfoMessageSpan
338 */
339 void setRenderInfoMessageSpan(boolean renderInfoMessageSpan);
340
341 /**
342 * When true, render the marker icon span to show icons related to the field (used by CompareFieldCreateModifier on
343 * maintenance documetnts to mark editted fields)
344 *
345 * @return true if the the marker icon span will be rendered, false otherwise
346 */
347 boolean isRenderMarkerIconSpan();
348
349 /**
350 * @see org.kuali.rice.krad.uif.field.DataField#isRenderMarkerIconSpan()
351 * @param renderMarkerIconSpan
352 */
353 void setRenderMarkerIconSpan(boolean renderMarkerIconSpan);
354
355 /**
356 * Additional display attribute name, which will be displayed next to the actual field value
357 * when the field is readonly with hyphen in between like PropertyValue - AdditionalPropertyValue
358 *
359 * @param readOnlyDisplaySuffixPropertyName name of the additional display property
360 */
361 void setReadOnlyDisplaySuffixPropertyName(String readOnlyDisplaySuffixPropertyName);
362
363 /**
364 * Returns the additional display attribute name to be displayed when the field is readonly
365 *
366 * @return additional display attribute name
367 */
368 String getReadOnlyDisplaySuffixPropertyName();
369
370 /**
371 * Sets the alternate display attribute name to be displayed when the field is readonly.
372 * This properties value will be displayed instead of actual fields value when the field is readonly.
373 *
374 * @param readOnlyDisplayReplacementPropertyName alternate display property name
375 */
376 void setReadOnlyDisplayReplacementPropertyName(String readOnlyDisplayReplacementPropertyName);
377
378 /**
379 * Returns the alternate display attribute name to be displayed when the field is readonly.
380 *
381 * @return alternate Display Property Name
382 */
383 String getReadOnlyDisplayReplacementPropertyName();
384
385 /**
386 * Returns the alternate display value
387 *
388 * @return the alternate display value set for this field
389 */
390 String getReadOnlyDisplayReplacement();
391
392 /**
393 * Setter for the alternative display value
394 *
395 * @param value
396 */
397 void setReadOnlyDisplayReplacement(String value);
398
399 /**
400 * Returns the additional display value.
401 *
402 * @return the additional display value set for this field
403 */
404 String getReadOnlyDisplaySuffix();
405
406 /**
407 * Setter for the additional display value
408 *
409 * @param value
410 */
411 void setReadOnlyDisplaySuffix(String value);
412
413 /**
414 * Gets the readOnlyListDisplayType.
415 *
416 * <p>When this is not set, the list will default to the delimited list display with a default of comma and space
417 * (", ") - if readOnlyListDelimiter is not set as well. The type can be set as the following:
418 * <ul>
419 * <li>"DELIMITED" - list will be output with delimiters between each item defined by readOnlyListDelimiter</li>
420 * <li>"BREAK" - list will be output with breaks between each item</li>
421 * <li>"OL" - list will be output in ordered list format (numbered)</li>
422 * <li>"UL" - list will be output in unordered list format (bulleted)</li>
423 * </ul>
424 * </p>
425 *
426 * @return the display type to use
427 */
428 String getReadOnlyListDisplayType();
429
430 /**
431 * Set the readOnlyListDisplayType
432 *
433 * @param readOnlyListDisplayType
434 */
435 void setReadOnlyListDisplayType(String readOnlyListDisplayType);
436
437 /**
438 * The readOnlyListDelimiter is used to set the delimiter used when "DELIMITED" type is set for
439 * readOnlyListDisplayType
440 *
441 * @return the delimiter to use in readOnly list output with "DELIMITED" type set
442 */
443 String getReadOnlyListDelimiter();
444
445 /**
446 * Set the readOnlyListDelimiter
447 *
448 * @param readOnlyListDelimiter
449 */
450 void setReadOnlyListDelimiter(String readOnlyListDelimiter);
451
452 /**
453 * Indicates whether the value for the field should be masked (or partially masked) on display
454 *
455 * <p>
456 * If set to true, the field value will be masked by applying the configured {@link #getMaskFormatter()}
457 * </p>
458 *
459 * <p>
460 * If a KIM permission exists that should be checked to determine whether the value should be masked or not,
461 * this value should not be set but instead the mask or partialMask property on {@link #getComponentSecurity()}
462 * should be set to true. This indicates there is a mask permission that should be consulted. If the user
463 * does not have the permission, this flag will be set to true by the framework and the value masked using
464 * the mask formatter configured on the security object
465 * </p>
466 *
467 * @return true if the field value should be masked, false if not
468 */
469 boolean isApplyMask();
470
471 /**
472 * Setter for the apply value mask flag
473 *
474 * @param applyMask
475 */
476 void setApplyMask(boolean applyMask);
477
478 /**
479 * MaskFormatter instance that will be used to mask the field value when {@link #isApplyMask()} is true
480 *
481 * <p>
482 * Note in cases where the mask is applied due to security (KIM permissions), the mask or partial mask formatter
483 * configured on {@link #getComponentSecurity()} will be used instead of this mask formatter
484 * </p>
485 *
486 * @return MaskFormatter instance
487 */
488 MaskFormatter getMaskFormatter();
489
490 /**
491 * Setter for the MaskFormatter instance to apply when the value is masked
492 *
493 * @param maskFormatter
494 */
495 void setMaskFormatter(MaskFormatter maskFormatter);
496
497 /**
498 * Allows specifying hidden property names without having to specify as a
499 * field in the group config (that might impact layout)
500 *
501 * @return hidden property names
502 */
503 List<String> getAdditionalHiddenPropertyNames();
504
505 /**
506 * Setter for the hidden property names
507 *
508 * @param additionalHiddenPropertyNames
509 */
510 void setAdditionalHiddenPropertyNames(List<String> additionalHiddenPropertyNames);
511
512 /**
513 * List of property names whose values should be displayed read-only under this field
514 *
515 * <p>
516 * In the attribute field template for each information property name given its values is
517 * outputted read-only. Informational property values can also be updated dynamically with
518 * the use of field attribute query
519 * </p>
520 *
521 * <p>
522 * Simple property names can be given if the property has the same binding parent as this
523 * field, in which case the binding path will be adjusted by the framework. If the property
524 * names starts with org.kuali.rice.krad.uif.UifConstants#NO_BIND_ADJUST_PREFIX, no binding
525 * prefix will be added.
526 * </p>
527 *
528 * @return informational property names
529 */
530 List<String> getPropertyNamesForAdditionalDisplay();
531
532 /**
533 * Setter for the list of informational property names
534 *
535 * @param propertyNamesForAdditionalDisplay
536 */
537 void setPropertyNamesForAdditionalDisplay(List<String> propertyNamesForAdditionalDisplay);
538
539 /**
540 * Sets HTML escaping for this property value. HTML escaping will be handled in alternate and additional fields
541 * also.
542 */
543 void setEscapeHtmlInPropertyValue(boolean escapeHtmlInPropertyValue);
544
545 /**
546 * Returns true if HTML escape allowed for this field
547 *
548 * @return true if escaping allowed
549 */
550 boolean isEscapeHtmlInPropertyValue();
551
552 /**
553 * Returns true if this field is of type {@code TextAreaControl}.
554 *
555 * <p>
556 * Used to preserve text formatting in a textarea when the view
557 * is readOnly by enclosing the text in a </pre> tag.
558 * </p>
559 *
560 * @return true if the field is of type {@code TextAreaControl}
561 */
562 boolean isMultiLineReadOnlyDisplay();
563
564 /**
565 * Setter for multiLineReadOnlyDisplay
566 *
567 * @param multiLineReadOnlyDisplay
568 */
569 void setMultiLineReadOnlyDisplay(boolean multiLineReadOnlyDisplay);
570
571 /**
572 * Indicates whether the value for the field is secure.
573 *
574 * <p>
575 * A value will be secured if masking has been applied (by configuration or a failed KIM permission) or the field
576 * has been marked as hidden due to a required KIM permission check failing.
577 * </p>
578 *
579 * @return true if value is secure, false if not
580 */
581 boolean hasSecureValue();
582
583 boolean isRenderFieldset();
584
585 /**
586 * Sets the sort type if this field is used within a collection
587 *
588 * <p>
589 * The default sort type is the Java class of the
590 * property being referenced. Since a String property may actually contain numeric or date values only this property
591 * can be used to better set the sort type.
592 * </p>
593 *
594 * @return string representation of the sort type
595 */
596 public String getSortAs();
597
598 public void setSortAs(String sortAs);
599
600 /**
601 * @see org.kuali.rice.krad.uif.component.Component#completeValidation
602 */
603 void completeValidation(ValidationTrace tracer);
604
605 }