1 /** 2 * Copyright 2005-2014 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 Object[] getDefaultValues(); 217 218 /** 219 * Setter for the fields default values 220 * 221 * @param defaultValues 222 */ 223 void setDefaultValues(Object[] defaultValues); 224 225 String getForcedValue(); 226 227 void setForcedValue(String forcedValue); 228 229 /** 230 * Summary help text for the field 231 * 232 * @return summary help text 233 */ 234 String getHelpSummary(); 235 236 /** 237 * Setter for the summary help text 238 * 239 * @param helpSummary 240 */ 241 void setHelpSummary(String helpSummary); 242 243 /** 244 * Data Field Security object that indicates what authorization (permissions) exist for the field 245 * 246 * @return DataFieldSecurity instance 247 */ 248 DataFieldSecurity getDataFieldSecurity(); 249 250 /** 251 * Override to assert a {@link DataFieldSecurity} instance is set 252 * 253 * @param componentSecurity instance of DataFieldSecurity 254 */ 255 void setComponentSecurity(ComponentSecurity componentSecurity); 256 257 /** 258 * Indicates the field should be read-only but also a hidden should be generated for the field 259 * 260 * <p> 261 * Useful for when a value is just displayed but is needed by script 262 * </p> 263 * 264 * @return true if field should be readOnly hidden, false if not 265 */ 266 boolean isAddHiddenWhenReadOnly(); 267 268 /** 269 * Setter for the read-only hidden indicator 270 * 271 * @param addHiddenWhenReadOnly 272 */ 273 void setAddHiddenWhenReadOnly(boolean addHiddenWhenReadOnly); 274 275 /** 276 * Inquiry widget for the field 277 * 278 * <p> 279 * The inquiry widget will render a link for the field value when read-only 280 * that points to the associated inquiry view for the field. The inquiry can 281 * be configured to point to a certain <code>InquiryView</code>, or the 282 * framework will attempt to associate the field with a inquiry based on its 283 * metadata (in particular its relationships in the model) 284 * </p> 285 * 286 * @return Inquiry field inquiry 287 */ 288 Inquiry getInquiry(); 289 290 /** 291 * Setter for the inquiry widget 292 * 293 * @param inquiry 294 */ 295 void setInquiry(Inquiry inquiry); 296 297 /** 298 * Indicates whether inquiries should be automatically set when a relationship for the field's property 299 * is found 300 * 301 * <p> 302 * Note this only applies when the {@link #getInquiry()} widget has not been configured (is null) 303 * and is set to true by default 304 * </p> 305 * 306 * @return true if auto inquiries are enabled, false if not 307 */ 308 boolean isEnableAutoInquiry(); 309 310 /** 311 * Setter for enabling automatic inquiries 312 * 313 * @param enableAutoInquiry 314 */ 315 void setEnableAutoInquiry(boolean enableAutoInquiry); 316 317 /** 318 * When true, render the info message span which contains can contain additional information 319 * about the field (used by Field Query functionality) 320 * 321 * @return true if the span will be rendered, false otherwise 322 */ 323 boolean isRenderInfoMessageSpan(); 324 325 /** 326 * @see org.kuali.rice.krad.uif.field.DataField#isRenderInfoMessageSpan() 327 * @param renderInfoMessageSpan 328 */ 329 void setRenderInfoMessageSpan(boolean renderInfoMessageSpan); 330 331 /** 332 * When true, render the marker icon span to show icons related to the field (used by CompareFieldCreateModifier on 333 * maintenance documetnts to mark editted fields) 334 * 335 * @return true if the the marker icon span will be rendered, false otherwise 336 */ 337 boolean isRenderMarkerIconSpan(); 338 339 /** 340 * @see org.kuali.rice.krad.uif.field.DataField#isRenderMarkerIconSpan() 341 * @param renderMarkerIconSpan 342 */ 343 void setRenderMarkerIconSpan(boolean renderMarkerIconSpan); 344 345 /** 346 * Additional display attribute name, which will be displayed next to the actual field value 347 * when the field is readonly with hyphen in between like PropertyValue - AdditionalPropertyValue 348 * 349 * @param readOnlyDisplaySuffixPropertyName name of the additional display property 350 */ 351 void setReadOnlyDisplaySuffixPropertyName(String readOnlyDisplaySuffixPropertyName); 352 353 /** 354 * Returns the additional display attribute name to be displayed when the field is readonly 355 * 356 * @return additional display attribute name 357 */ 358 String getReadOnlyDisplaySuffixPropertyName(); 359 360 /** 361 * Sets the alternate display attribute name to be displayed when the field is readonly. 362 * This properties value will be displayed instead of actual fields value when the field is readonly. 363 * 364 * @param readOnlyDisplayReplacementPropertyName alternate display property name 365 */ 366 void setReadOnlyDisplayReplacementPropertyName(String readOnlyDisplayReplacementPropertyName); 367 368 /** 369 * Returns the alternate display attribute name to be displayed when the field is readonly. 370 * 371 * @return alternate Display Property Name 372 */ 373 String getReadOnlyDisplayReplacementPropertyName(); 374 375 /** 376 * Returns the alternate display value 377 * 378 * @return the alternate display value set for this field 379 */ 380 String getReadOnlyDisplayReplacement(); 381 382 /** 383 * Setter for the alternative display value 384 * 385 * @param value 386 */ 387 void setReadOnlyDisplayReplacement(String value); 388 389 /** 390 * Returns the additional display value. 391 * 392 * @return the additional display value set for this field 393 */ 394 String getReadOnlyDisplaySuffix(); 395 396 /** 397 * Setter for the additional display value 398 * 399 * @param value 400 */ 401 void setReadOnlyDisplaySuffix(String value); 402 403 /** 404 * Gets the readOnlyListDisplayType. 405 * 406 * <p>When this is not set, the list will default to the delimited list display with a default of comma and space 407 * (", ") - if readOnlyListDelimiter is not set as well. The type can be set as the following: 408 * <ul> 409 * <li>"DELIMITED" - list will be output with delimiters between each item defined by readOnlyListDelimiter</li> 410 * <li>"BREAK" - list will be output with breaks between each item</li> 411 * <li>"OL" - list will be output in ordered list format (numbered)</li> 412 * <li>"UL" - list will be output in unordered list format (bulleted)</li> 413 * </ul> 414 * </p> 415 * 416 * @return the display type to use 417 */ 418 String getReadOnlyListDisplayType(); 419 420 /** 421 * Set the readOnlyListDisplayType 422 * 423 * @param readOnlyListDisplayType 424 */ 425 void setReadOnlyListDisplayType(String readOnlyListDisplayType); 426 427 /** 428 * The readOnlyListDelimiter is used to set the delimiter used when "DELIMITED" type is set for 429 * readOnlyListDisplayType 430 * 431 * @return the delimiter to use in readOnly list output with "DELIMITED" type set 432 */ 433 String getReadOnlyListDelimiter(); 434 435 /** 436 * Set the readOnlyListDelimiter 437 * 438 * @param readOnlyListDelimiter 439 */ 440 void setReadOnlyListDelimiter(String readOnlyListDelimiter); 441 442 /** 443 * Indicates whether the value for the field should be masked (or partially masked) on display 444 * 445 * <p> 446 * If set to true, the field value will be masked by applying the configured {@link #getMaskFormatter()} 447 * </p> 448 * 449 * <p> 450 * If a KIM permission exists that should be checked to determine whether the value should be masked or not, 451 * this value should not be set but instead the mask or partialMask property on {@link #getComponentSecurity()} 452 * should be set to true. This indicates there is a mask permission that should be consulted. If the user 453 * does not have the permission, this flag will be set to true by the framework and the value masked using 454 * the mask formatter configured on the security object 455 * </p> 456 * 457 * @return true if the field value should be masked, false if not 458 */ 459 boolean isApplyMask(); 460 461 /** 462 * Setter for the apply value mask flag 463 * 464 * @param applyMask 465 */ 466 void setApplyMask(boolean applyMask); 467 468 /** 469 * MaskFormatter instance that will be used to mask the field value when {@link #isApplyMask()} is true 470 * 471 * <p> 472 * Note in cases where the mask is applied due to security (KIM permissions), the mask or partial mask formatter 473 * configured on {@link #getComponentSecurity()} will be used instead of this mask formatter 474 * </p> 475 * 476 * @return MaskFormatter instance 477 */ 478 MaskFormatter getMaskFormatter(); 479 480 /** 481 * Setter for the MaskFormatter instance to apply when the value is masked 482 * 483 * @param maskFormatter 484 */ 485 void setMaskFormatter(MaskFormatter maskFormatter); 486 487 /** 488 * Allows specifying hidden property names without having to specify as a 489 * field in the group config (that might impact layout) 490 * 491 * @return hidden property names 492 */ 493 List<String> getAdditionalHiddenPropertyNames(); 494 495 /** 496 * Setter for the hidden property names 497 * 498 * @param additionalHiddenPropertyNames 499 */ 500 void setAdditionalHiddenPropertyNames(List<String> additionalHiddenPropertyNames); 501 502 /** 503 * List of property names whose values should be displayed read-only under this field 504 * 505 * <p> 506 * In the attribute field template for each information property name given its values is 507 * outputted read-only. Informational property values can also be updated dynamically with 508 * the use of field attribute query 509 * </p> 510 * 511 * <p> 512 * Simple property names can be given if the property has the same binding parent as this 513 * field, in which case the binding path will be adjusted by the framework. If the property 514 * names starts with org.kuali.rice.krad.uif.UifConstants#NO_BIND_ADJUST_PREFIX, no binding 515 * prefix will be added. 516 * </p> 517 * 518 * @return informational property names 519 */ 520 List<String> getPropertyNamesForAdditionalDisplay(); 521 522 /** 523 * Setter for the list of informational property names 524 * 525 * @param propertyNamesForAdditionalDisplay 526 */ 527 void setPropertyNamesForAdditionalDisplay(List<String> propertyNamesForAdditionalDisplay); 528 529 /** 530 * Sets HTML escaping for this property value. HTML escaping will be handled in alternate and additional fields 531 * also. 532 */ 533 void setEscapeHtmlInPropertyValue(boolean escapeHtmlInPropertyValue); 534 535 /** 536 * Returns true if HTML escape allowed for this field 537 * 538 * @return true if escaping allowed 539 */ 540 boolean isEscapeHtmlInPropertyValue(); 541 542 /** 543 * Returns true if this field is of type {@code TextAreaControl}. 544 * 545 * <p> 546 * Used to preserve text formatting in a textarea when the view 547 * is readOnly by enclosing the text in a </pre> tag. 548 * </p> 549 * 550 * @return true if the field is of type {@code TextAreaControl} 551 */ 552 boolean isMultiLineReadOnlyDisplay(); 553 554 /** 555 * Setter for multiLineReadOnlyDisplay 556 * 557 * @param multiLineReadOnlyDisplay 558 */ 559 void setMultiLineReadOnlyDisplay(boolean multiLineReadOnlyDisplay); 560 561 /** 562 * Indicates whether the value for the field is secure. 563 * 564 * <p> 565 * A value will be secured if masking has been applied (by configuration or a failed KIM permission) or the field 566 * has been marked as hidden due to a required KIM permission check failing. 567 * </p> 568 * 569 * @return true if value is secure, false if not 570 */ 571 boolean hasSecureValue(); 572 573 boolean isRenderFieldset(); 574 575 /** 576 * @see org.kuali.rice.krad.uif.component.Component#completeValidation 577 */ 578 void completeValidation(ValidationTrace tracer); 579 580 }