View Javadoc
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.util.List;
19  
20  import org.kuali.rice.core.api.data.DataType;
21  import org.kuali.rice.krad.datadictionary.validation.capability.CaseConstrainable;
22  import org.kuali.rice.krad.datadictionary.validation.capability.MustOccurConstrainable;
23  import org.kuali.rice.krad.datadictionary.validation.capability.PrerequisiteConstrainable;
24  import org.kuali.rice.krad.datadictionary.validation.capability.SimpleConstrainable;
25  import org.kuali.rice.krad.datadictionary.validation.capability.ValidCharactersConstrainable;
26  import org.kuali.rice.krad.datadictionary.validation.constraint.CaseConstraint;
27  import org.kuali.rice.krad.datadictionary.validation.constraint.MustOccurConstraint;
28  import org.kuali.rice.krad.datadictionary.validation.constraint.PrerequisiteConstraint;
29  import org.kuali.rice.krad.datadictionary.validation.constraint.SimpleConstraint;
30  import org.kuali.rice.krad.datadictionary.validation.constraint.ValidCharactersConstraint;
31  import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
32  import org.kuali.rice.krad.keyvalues.KeyValuesFinder;
33  import org.kuali.rice.krad.uif.component.Component;
34  import org.kuali.rice.krad.uif.control.Control;
35  import org.kuali.rice.krad.uif.element.Message;
36  import org.kuali.rice.krad.uif.element.ValidationMessages;
37  import org.kuali.rice.krad.uif.widget.QuickFinder;
38  import org.kuali.rice.krad.uif.widget.Suggest;
39  
40  /**
41   * TODO mark don't forget to fill this in. 
42   * 
43   * @author Kuali Rice Team (rice.collab@kuali.org)
44   */
45  public interface InputField extends SimpleConstrainable, CaseConstrainable,
46          PrerequisiteConstrainable, MustOccurConstrainable, ValidCharactersConstrainable, DataField {
47  
48      /**
49       * @see DataField#isInputAllowed()
50       */
51      boolean isInputAllowed();
52  
53      /**
54       * {@code Control} instance that should be used to input data for the
55       * field
56       *
57       * <p>
58       * When the field is editable, the control will be rendered so the user can
59       * input a value(s). Controls typically are part of a Form and render
60       * standard HTML control elements such as text input, select, and checkbox
61       * </p>
62       *
63       * @return Control instance
64       */
65      Control getControl();
66  
67      /**
68       * Setter for the field's control
69       *
70       * @param control
71       */
72      void setControl(Control control);
73  
74      /**
75       * Field that contains the messages (errors) for the input field. The
76       * {@code ValidationMessages} holds configuration on associated messages along
77       * with information on rendering the messages in the user interface
78       *
79       * @return ValidationMessages instance
80       */
81      ValidationMessages getValidationMessages();
82  
83      /**
84       * Setter for the input field's errors field
85       *
86       * @param validationMessages
87       */
88      void setValidationMessages(ValidationMessages validationMessages);
89  
90      /**
91       * Instance of {@code KeyValuesFinder} that should be invoked to
92       * provide a List of values the field can have. Generally used to provide
93       * the options for a multi-value control or to validate the submitted field
94       * value
95       *
96       * @return KeyValuesFinder instance
97       */
98      KeyValuesFinder getOptionsFinder();
99  
100     /**
101      * Setter for the field's KeyValuesFinder instance
102      *
103      * @param optionsFinder
104      */
105     void setOptionsFinder(KeyValuesFinder optionsFinder);
106 
107     /**
108      * Get the class of the optionsFinder being used by this InputField
109      *
110      * @return the class of the set optionsFinder, if not set or not applicable, returns null
111      */
112     Class<? extends KeyValuesFinder> getOptionsFinderClass();
113 
114     /**
115      * Setter that takes in the class name for the options finder and creates a
116      * new instance to use as the finder for the input field
117      *
118      * @param optionsFinderClass the options finder class to set
119      */
120     void setOptionsFinderClass(Class<? extends KeyValuesFinder> optionsFinderClass);
121 
122     /**
123      * Indicates whether direct inquiries should be automatically set when a relationship for
124      * the field's property is found
125      *
126      * <p>
127      * Note this only applies when the {@link #getInquiry()} widget has not been configured (is null)
128      * and is set to true by default
129      * </p>
130      *
131      * @return true if auto direct inquiries are enabled, false if not
132      */
133     boolean isEnableAutoDirectInquiry();
134 
135     /**
136      * Setter for enabling automatic direct inquiries
137      *
138      * @param enableAutoDirectInquiry
139      */
140     void setEnableAutoDirectInquiry(boolean enableAutoDirectInquiry);
141 
142     /**
143      * Lookup finder widget for the field
144      *
145      * <p>
146      * The quickfinder widget places a small icon next to the field that allows
147      * the user to bring up a search screen for finding valid field values. The
148      * {@code Widget} instance can be configured to point to a certain
149      * {@code LookupView}, or the framework will attempt to associate the
150      * field with a lookup based on its metadata (in particular its
151      * relationships in the model)
152      * </p>
153      *
154      * @return QuickFinder lookup widget
155      */
156     QuickFinder getQuickfinder();
157 
158     /**
159      * Setter for the lookup widget
160      *
161      * @param quickfinder the field lookup widget to set
162      */
163     void setQuickfinder(QuickFinder quickfinder);
164 
165     /**
166      * Indicates whether quickfinders should be automatically set when a relationship for the field's
167      * property is found
168      *
169      * <p>
170      * Note this only applies when the {@link #getQuickfinder()} widget has not been configured (is null)
171      * and is set to true by default
172      * </p>
173      *
174      * @return true if auto quickfinders are enabled, false if not
175      */
176     boolean isEnableAutoQuickfinder();
177 
178     /**
179      * Setter for enabling automatic quickfinders
180      *
181      * @param enableAutoQuickfinder
182      */
183     void setEnableAutoQuickfinder(boolean enableAutoQuickfinder);
184 
185     /**
186      * Suggest box widget for the input field
187      *
188      * <p>
189      * If enabled (by render flag), as the user inputs data into the
190      * fields control a dynamic query is performed to provide the user
191      * suggestions on values which they can then select
192      * </p>
193      *
194      * <p>
195      * Note the Suggest widget is only valid when using a standard TextControl
196      * </p>
197      *
198      * @return Suggest instance
199      */
200     Suggest getSuggest();
201 
202     /**
203      * Setter for the fields suggest widget
204      *
205      * @param suggest the field suggest widget to  set
206      */
207     void setSuggest(Suggest suggest);
208 
209     /**
210      * Indicates indicates whether the field can only be updated through a widget
211      *
212      * widgetInputOnly behaves similar to ReadOnly with the exception that the value of the input field
213      * can be changed via the associated widget (e.g. spinner, date picker, quickfinder, etc).
214      *
215      * @return true if only widget input is allowed, false otherwise
216      */
217     boolean isWidgetInputOnly();
218 
219     /**
220      * Setter for the widget input only indicator
221      *
222      * @param widgetInputOnly
223      */
224     void setWidgetInputOnly(boolean widgetInputOnly);
225 
226     /**
227      * Forces rendering of the input group div around the control.
228      *
229      * <p>If other components add content through script that should be grouped with the control, this flag
230      * can be set to true to generate the input group, even though {@link InputField#getPostInputAddons()} may
231      * be empty</p>
232      *
233      * @return boolean true to force rendering of the input group, false if not
234      */
235     boolean isRenderInputAddonGroup();
236 
237     /**
238      * @see InputField#isRenderInputAddonGroup()
239      */
240     void setRenderInputAddonGroup(boolean renderInputAddonGroup);
241 
242     /**
243      * List of CSS classes that will be applied to the span that wraps the post input components.
244      *
245      * TODO: revisist this, possibly getting the classes from component wrapper css classes once created
246      *
247      * @return List of CSS classes
248      */
249     List<String> getPostInputCssClasses();
250 
251     /**
252      * Returns the list of post input css classes as a string formed by joining the classes with a space.
253      *
254      * @return post input css classes string
255      */
256     String getPostInputCssClassesAsString();
257 
258     /**
259      * @see InputField#getPostInputCssClasses()
260      */
261     void setPostInputCssClasses(List<String> postInputCssClasses);
262 
263     /**
264      * List of components that will be grouped with the input field control to form an input group.
265      *
266      * <p>Generally these are icon, link, or button components that should be rendered with the control.</p>
267      *
268      * <p>See <a href="http://getbootstrap.com/components/#input-groups">Bootstrap Input Groups</a></p>
269      *
270      * @return List of post input components
271      */
272     List<Component> getPostInputAddons();
273 
274     /**
275      * @see org.kuali.rice.krad.uif.field.InputField#getPostInputAddons()
276      */
277     void setPostInputAddons(List<Component> postInputAddons);
278 
279     /**
280      * Adds a component to the list of post input addon components.
281      *
282      * @param addOn component to add
283      * @see InputField#getPostInputAddons()
284      */
285     void addPostInputAddon(Component addOn);
286 
287     /**
288      * Instructional text that display an explanation of the field usage
289      *
290      * <p>
291      * Text explaining how to use the field, including things like what values should be selected
292      * in certain cases and so on (instructions)
293      * </p>
294      *
295      * @return instructional message
296      */
297     String getInstructionalText();
298 
299     /**
300      * Setter for the instructional message
301      *
302      * @param instructionalText the instructional text to set
303      */
304     void setInstructionalText(String instructionalText);
305 
306     /**
307      * Message field that displays instructional text
308      *
309      * <p>
310      * This message field can be configured to for adjusting how the instructional text will display. Generally
311      * the styleClasses property will be of most interest
312      * </p>
313      *
314      * @return instructional message field
315      */
316     Message getInstructionalMessage();
317 
318     /**
319      * Setter for the instructional text message field
320      *
321      * <p>
322      * Note this is the setter for the field that will render the instructional text. The actual text can be
323      * set on the field but can also be set using {@link #setInstructionalText(String)}
324      * </p>
325      *
326      * @param instructionalMessage the instructional message to set
327      */
328     void setInstructionalMessage(Message instructionalMessage);
329 
330     /**
331      * Help text that displays under the control and is disclosed on focus.
332      *
333      * @return String help text for input
334      */
335     String getHelperText();
336 
337     /**
338      * @see InputField#getHelperText()
339      */
340     void setHelperText(String helperText);
341 
342     /**
343      * Text that display a restriction on the value a field can hold
344      *
345      * <p>
346      * For example when the value must be a valid format (phone number, email), certain length, min/max value and
347      * so on this text can be used to indicate the constraint to the user. Generally displays with the control so
348      * it is visible when the user tabs to the field
349      * </p>
350      *
351      * @return text to display for the constraint message
352      */
353     String getConstraintText();
354 
355     /**
356      * Setter for the constraint message text
357      *
358      * @param constraintText the constraint text to set
359      */
360     void setConstraintText(String constraintText);
361 
362     /**
363      * Message field that displays constraint text
364      *
365      * <p>
366      * This message field can be configured to for adjusting how the constrain text will display. Generally
367      * the styleClasses property will be of most interest
368      * </p>
369      *
370      * @return constraint message field
371      */
372     Message getConstraintMessage();
373 
374     /**
375      * Setter for the constraint text message field
376      *
377      * <p>
378      * Note this is the setter for the field that will render the constraint text. The actual text can be
379      * set on the field but can also be set using {@link #setConstraintText(String)}
380      * </p>
381      *
382      * @param constraintMessage the constrain message field to set
383      */
384     void setConstraintMessage(Message constraintMessage);
385 
386     /**
387      * Setter for {@code validCharacterConstraint}
388      *
389      * @param validCharactersConstraint the {@code ValidCharactersConstraint} to set
390      */
391     void setValidCharactersConstraint(ValidCharactersConstraint validCharactersConstraint);
392 
393     /**
394      * Setter for {@code caseConstraint}
395      *
396      * @param caseConstraint the {@code CaseConstraint} to set
397      */
398     void setCaseConstraint(CaseConstraint caseConstraint);
399 
400     /**
401      * List of {@code PrerequisiteConstraint} that apply to this {@code InputField}
402      *
403      * @return the dependency constraints for this input field
404      */
405     List<PrerequisiteConstraint> getDependencyConstraints();
406 
407     /**
408      * Setter for {@code dependencyConstraints}
409      *
410      * @param dependencyConstraints list of {@code PrerequisiteConstraint} to set
411      */
412     void setDependencyConstraints(List<PrerequisiteConstraint> dependencyConstraints);
413 
414     /**
415      * Setter for {@code mustOccurConstraints}
416      *
417      * @param mustOccurConstraints list of {@code MustOccurConstraint} to set
418      */
419     void setMustOccurConstraints(List<MustOccurConstraint> mustOccurConstraints);
420 
421     /**
422      * Setter for simple constraint
423      *
424      * <p>
425      * When a simple constraint is set on this object ALL simple validation
426      * constraints set directly will be overridden - recommended to use this or
427      * the other gets/sets for defining simple constraints, not both.
428      * </p>
429      *
430      * @param simpleConstraint the simple constraint to set
431      */
432     void setSimpleConstraint(SimpleConstraint simpleConstraint);
433 
434     /**
435      * This does not have to be set, represents the DataType constraint of this field.
436      * This is only checked during server side validation.
437      *
438      * @param dataType the dataType to set
439      */
440     void setDataType(DataType dataType);
441 
442     void setDataType(String dataType);
443 
444     /**
445      * Gets the DataType of this InputField, note that DataType set to be date
446      * when this field is using a date picker with a TextControl and has not otherwise been
447      * explicitly set.
448      *
449      * @return DataType
450      */
451     DataType getDataType();
452 
453     /**
454      * Maximum number of characters the input field value is allowed to have
455      *
456      * <p>
457      * The maximum length determines the maximum allowable length of the value
458      * for data entry editing purposes.  The maximum length is inclusive and can
459      * be smaller or longer than the actual control size.  The constraint
460      * is enforced on all data types (e.g. a numeric data type needs to meet the
461      * maximum length constraint in which digits and symbols are counted).
462      * </p>
463      *
464      * @return the maximum length of the input field
465      */
466     Integer getMaxLength();
467 
468     /**
469      * Setter for input field max length
470      *
471      * @param maxLength the maximum length to set
472      */
473     void setMaxLength(Integer maxLength);
474 
475     /**
476      * Minimum number of characters the input field value needs to be
477      *
478      * <p>
479      * The minimum length determines the minimum required length of the value for
480      * data entry editing purposes.  The minimum length is inclusive. The constraint
481      * is enforced on all data types (e.g. a numeric data type needs to meet the
482      * minimum length requirement in which digits and symbols are counted).
483      * </p>
484      *
485      * @return the minimum length of the input field
486      */
487     Integer getMinLength();
488 
489     /**
490      * Setter for input field minimum length
491      *
492      * @param minLength the minLength to set
493      */
494     void setMinLength(Integer minLength);
495 
496     /**
497      * @see org.kuali.rice.krad.uif.component.ComponentBase#getRequired()
498      */
499     Boolean getRequired();
500 
501     /**
502      * @see org.kuali.rice.krad.uif.component.ComponentBase#setRequired(java.lang.Boolean)
503      */
504     void setRequired(Boolean required);
505 
506     /**
507      * The exclusive minimum value for numeric or date field.
508      *
509      * <p>
510      * The exclusiveMin element determines the minimum allowable value for data
511      * entry editing purposes. This constrain is supported for numeric and
512      * date fields and to be used in conjunction with the appropriate
513      * {@link ValidCharactersConstraint}.
514      *
515      * For numeric constraint the value can be an integer or decimal such as -.001 or 99.
516      * </p>
517      *
518      * @return the exclusive minimum numeric value of the input field
519      */
520     String getExclusiveMin();
521 
522     /**
523      * Setter for the field's exclusive minimum value
524      *
525      * @param exclusiveMin the minimum value to set
526      */
527     void setExclusiveMin(String exclusiveMin);
528 
529     /**
530      * The inclusive maximum value for numeric or date field.
531      *
532      * <p>
533      * The inclusiveMax element determines the maximum allowable value for data
534      * entry editing purposes. This constrain is supported for numeric and
535      * date fields and to be used in conjunction with the appropriate
536      * {@link ValidCharactersConstraint}.
537      *
538      * For numeric constraint the value can be an integer or decimal such as -.001 or 99.
539      * </p>
540      *
541      * @return the inclusive maximum numeric value of the input field
542      */
543     String getInclusiveMax();
544 
545     /**
546      * Setter for the field's inclusive maximum value
547      *
548      * @param inclusiveMax the maximum value to set
549      */
550     void setInclusiveMax(String inclusiveMax);
551 
552     /**
553      * Attribute query instance configured for this field to dynamically pull information back for
554      * updates other fields or providing messages
555      *
556      * <p>
557      * If field attribute query is not null, associated event script will be generated to trigger the
558      * query from the UI. This will invoke the {@code AttributeQueryService} to
559      * execute the query and return an instance of {@code AttributeQueryResult} that is then
560      * read by the script to update the UI. Typically used to update informational property values or
561      * other field values
562      * </p>
563      *
564      * @return AttributeQuery instance
565      */
566     AttributeQuery getAttributeQuery();
567 
568     /**
569      * Setter for this field's attribute query
570      *
571      * @param attributeQuery
572      */
573     void setAttributeQuery(AttributeQuery attributeQuery);
574 
575     /**
576      * Perform uppercase flag for this field to force input to uppercase.
577      *
578      * <p>
579      * It this flag is set to true the 'text-transform' style on the field will be set to 'uppercase'
580      * which will automatically change any text input into the field to uppercase.
581      * </p>
582      *
583      * @return performUppercase flag
584      */
585     boolean isUppercaseValue();
586 
587     /**
588      * Setter for this field's performUppercase flag
589      *
590      * @param uppercaseValue boolean flag
591      */
592     void setUppercaseValue(boolean uppercaseValue);
593 
594     /**
595      * Indicates whether the browser autocomplete functionality should be disabled for the
596      * input field (adds autocomplete="off")
597      *
598      * <p>
599      * The browser's native autocomplete functionality can cause issues with security fields and also fields
600      * with the UIF suggest widget enabled
601      * </p>
602      *
603      * @return true if the native autocomplete should be turned off for the input field, false if not
604      */
605     boolean isDisableNativeAutocomplete();
606 
607     /**
608      * Setter to disable browser autocomplete for the input field
609      *
610      * @param disableNativeAutocomplete
611      */
612     void setDisableNativeAutocomplete(boolean disableNativeAutocomplete);
613 
614     boolean isRenderFieldset();
615 
616     /**
617      * @see org.kuali.rice.krad.uif.component.Component#completeValidation
618      */
619     void completeValidation(ValidationTrace tracer);
620 
621     void setCustomValidatorClass(String customValidatorClass);
622 
623 }