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