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.component;
17
18 import org.kuali.rice.krad.datadictionary.uif.UifDictionaryBean;
19 import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
20 import org.kuali.rice.krad.uif.layout.CssGridSizes;
21 import org.kuali.rice.krad.uif.lifecycle.RunComponentModifiersTask;
22 import org.kuali.rice.krad.uif.lifecycle.ViewLifecycleUtils;
23 import org.kuali.rice.krad.uif.modifier.ComponentModifier;
24 import org.kuali.rice.krad.uif.util.LifecycleElement;
25 import org.kuali.rice.krad.uif.widget.Tooltip;
26
27 import java.io.Serializable;
28 import java.util.List;
29 import java.util.Map;
30
31 /**
32 * Component defines basic properties and methods that all rendering element implement
33 *
34 * <p>
35 * All classes of the UIF that are used as a rendering element implement the
36 * component interface. All components within the framework have the
37 * following structure:
38 * <ul>
39 * <li>Dictionary Configuration/Composition</li>
40 * <li>Java Class (the Component implementation</li>
41 * <li>>JSP Template Renderer</li>
42 * </ul>
43 * </p>
44 * <p>
45 * There are three basic types of components:
46 * <ul>
47 * <li>Container Components: {@code View}, {@code Group}</li>
48 * <li>Field Components: {@code Field}</li>
49 * <li>Widget Components: {@code Widget}</li>
50 * </ul>
51 * </p>
52 *
53 * @author Kuali Rice Team (rice.collab@kuali.org)
54 * @see org.kuali.rice.krad.uif.container.Container
55 * @see org.kuali.rice.krad.uif.field.Field
56 * @see org.kuali.rice.krad.uif.widget.Widget
57 */
58 public interface Component extends UifDictionaryBean, LifecycleElement, Serializable, Ordered, ScriptEventSupport {
59
60 /**
61 * The name for the component type
62 *
63 * <p>
64 * This is used within the rendering layer to pass the component instance into the template. The component instance
65 * is exported under the name given by this method.
66 * </p>
67 *
68 * @return String type name
69 */
70 String getComponentTypeName();
71
72 /**
73 * Indicates whether the component has been fully rendered.
74 *
75 * @return True if the component has fully rendered, false if not.
76 */
77 boolean isRendered();
78
79 /**
80 * Invoked by the view lifecycle after expressions are evaluated at the apply model phase.
81 *
82 * <p>
83 * In general, this method is preferred to {@link #performApplyModel(Object, LifecycleElement)}
84 * for populating model data via code, since it is called before client-side state is synchronize.
85 * </p>
86 */
87 void afterEvaluateExpression();
88
89 /**
90 * Set the view lifecycle processing status for this component, explicitly.
91 *
92 * @param status The view status for this component.
93 */
94 void setViewStatus(String status);
95
96 /**
97 * The path to the JSP file that should be called to render the component
98 *
99 * <p>
100 * The path should be relative to the web root. An attribute will be available to the component to use under the
101 * name given by the method {@code getComponentTypeName}. Based on the component type, additional attributes could
102 * be available for use. See the component documentation for more information on such attributes.
103 * </p>
104 *
105 * <p>
106 * e.g. '/krad/WEB-INF/jsp/tiles/component.jsp'
107 * </p>
108 *
109 * @return String representing the template path
110 */
111 String getTemplate();
112
113 /**
114 * Setter for the components template
115 *
116 * @param template
117 */
118 void setTemplate(String template);
119
120 /**
121 * Gets additional templates that will be required during the rendering of this component.
122 *
123 * <p>
124 * If a parent or sibling component is referred to by this component's template,
125 * include that component's template here to ensure that it has been compiled already during
126 * bottom-up inline rendering.
127 * </p>
128 *
129 * @return additional templates required during rendering
130 */
131 List<String> getAdditionalTemplates();
132
133 /**
134 * The name for which the template can be invoked by
135 *
136 * <p>
137 * Whether the template name is needed depends on the underlying rendering engine being used. In the example of
138 * Freemarker, the template points to the actual source file, which then loads a macro. From then on the macro is
139 * simply invoked to execute the template
140 * </p>
141 *
142 * <p>
143 * e.g. 'uif_text'
144 * </p>
145 *
146 * @return template name
147 */
148 public String getTemplateName();
149
150 /**
151 * Setter for the name of the template (a name which can be used to invoke)
152 *
153 * @param templateName
154 */
155 public void setTemplateName(String templateName);
156
157 /**
158 * The component title
159 *
160 * <p>
161 * Depending on the component can be used in various ways. For example with a Container component the title is
162 * used to set the header text. For components like controls other other components that render an HTML element it
163 * is used to set the HTML title attribute.
164 * </p>
165 *
166 * @return String title for component
167 */
168 String getTitle();
169
170 /**
171 * Setter for the component's title
172 *
173 * @param title
174 */
175 void setTitle(String title);
176
177 /**
178 * List of components that are contained within the List of {@code PropertyReplacer} in component
179 *
180 * <p>
181 * Used to get all the nested components in the property replacers.
182 * </p>
183 *
184 * @return List<Component> {@code PropertyReplacer} child components
185 */
186 List<Component> getPropertyReplacerComponents();
187
188 /**
189 * {@code ComponentModifier} instances that should be invoked to
190 * initialize the component
191 *
192 * <p>
193 * These provide dynamic initialization behavior for the component and are
194 * configured through the components definition. Each initializer will get
195 * invoked by the initialize method.
196 * </p>
197 *
198 * @return List of component modifiers
199 * @see RunComponentModifiersTask
200 */
201 List<ComponentModifier> getComponentModifiers();
202
203 /**
204 * Setter for the components List of {@code ComponentModifier}
205 * instances
206 *
207 * @param componentModifiers
208 */
209 void setComponentModifiers(List<ComponentModifier> componentModifiers);
210
211 /**
212 * When true, this component will render as a placeholder component instead of rendering normally because the
213 * content will be later retrieved through manually ajax retrieval calls in the js
214 *
215 * <p>This flag does not imply any automation, there must be a js call invoked for the content to be retrieved
216 * by the server, but this does mark it with a placeholder component which KRAD js uses during these calls.
217 * This placeholder component is used for ajax retrievals. In particular, this flag is useful for use in
218 * combination with the <b>showLightboxComponent</b> js function which will automatically retrieve the
219 * real content of a component through ajax if a placeholder component is detected. This allows for the full
220 * content to only be retrieved when the lightbox is first opened.
221 * When this flag is set to true, the forceSessionPersistence
222 * flag is set to true AUTOMATICALLY because it is implied that this component will be retrieved by an ajax call
223 * in the future. This may also be useful for direct custom calls to <b>retrieveComponent</b> function,
224 * as well, which also relies on the placeholder being present.</p>
225 *
226 * @return true if this component is being rendered as a placeholder for use in replacement during and ajax call,
227 * false otherwise
228 */
229 public boolean isRetrieveViaAjax();
230
231 /**
232 * When true, this component will render as a placeholder component instead of rendering normally because the
233 * content will be later retrieved through manually ajax retrieval calls in the js
234 *
235 * @param useAjaxCallForContent
236 */
237 public void setRetrieveViaAjax(boolean useAjaxCallForContent);
238
239 /**
240 * Indicates whether the component should be hidden in the UI
241 *
242 * <p>
243 * How the hidden data is maintained depends on the views persistence mode.
244 * If the mode is request, the corresponding data will be rendered to the UI
245 * but not visible. If the mode is session, the data will not be rendered to
246 * the UI but maintained server side.
247 * </p>
248 *
249 * <p>
250 * For a {@code Container} component, the hidden setting will apply to
251 * all contained components (making a section hidden makes all fields within
252 * the section hidden)
253 * </p>
254 *
255 * @return boolean true if the component should be hidden, false if it
256 * should be visible
257 */
258 boolean isHidden();
259
260 /**
261 * Setter for the hidden indicator
262 *
263 * @param hidden
264 */
265 void setHidden(boolean hidden);
266
267 /**
268 * Indicates whether the component can be edited
269 *
270 * <p>
271 * When readOnly the controls and widgets of {@code Field} components
272 * will not be rendered. If the Field has an underlying value it will be
273 * displayed readOnly to the user.
274 * </p>
275 *
276 * <p>
277 * For a {@code Container} component, the readOnly setting will apply
278 * to all contained components (making a section readOnly makes all fields
279 * within the section readOnly).
280 * </p>
281 *
282 * @return boolean true if the component should be readOnly, false if is
283 * allows editing
284 */
285 Boolean getReadOnly();
286
287 /**
288 * Setter for the read only indicator
289 *
290 * @param readOnly
291 */
292 void setReadOnly(Boolean readOnly);
293
294 /**
295 * Indicates whether the component should be cleared on copy
296 *
297 * <p>
298 * By default this property is false. ReadOnly components are cleared on a copy operation.
299 * If set this prevents the component from being cleared.
300 * </p>
301 * @return
302 */
303 Boolean getCanCopyOnReadOnly();
304
305 /**
306 * Setter for the canCopyOnReadOnly indicator
307 *
308 * @param canCopyOnReadOnly
309 */
310 void setCanCopyOnReadOnly(Boolean canCopyOnReadOnly);
311 /**
312 * Indicates whether the component is required
313 *
314 * <p>
315 * At the general component level required means there is some action the
316 * user needs to take within the component. For example, within a section it
317 * might mean the fields within the section should be completed. At a field
318 * level, it means the field should be completed. This provides the ability
319 * for the renderers to indicate the required action.
320 * </p>
321 *
322 * @return boolean true if the component is required, false if it is not
323 * required
324 */
325 Boolean getRequired();
326
327 /**
328 * Setter for the required indicator
329 *
330 * @param required
331 */
332 void setRequired(Boolean required);
333
334 /**
335 * Horizontal alignment of the component within its container
336 *
337 * <p>
338 * All components belong to a <code>Container</code> and are placed using a
339 * <code>LayoutManager</code>. This property specifies how the component
340 * should be aligned horizontally within the container. During the finalize
341 * phase the CSS text-align style will be created for the align setting.
342 * </p>
343 *
344 * @return String horizontal align
345 * @see org.kuali.rice.krad.uif.CssConstants.TextAligns
346 */
347 public String getAlign();
348
349 /**
350 * Sets the components horizontal alignment
351 *
352 * @param align
353 */
354 public void setAlign(String align);
355
356 /**
357 * Vertical alignment of the component within its container
358 *
359 * <p>
360 * All components belong to a <code>Container</code> and are placed using a
361 * <code>LayoutManager</code>. This property specifies how the component
362 * should be aligned vertically within the container. During the finalize
363 * phase the CSS vertical-align style will be created for the valign
364 * setting.
365 * </p>
366 *
367 * @return String vertical align
368 * @see org.kuali.rice.krad.uif.CssConstants.VerticalAligns
369 */
370 public String getValign();
371
372 /**
373 * Setter for the component's vertical align
374 *
375 * @param valign
376 */
377 public void setValign(String valign);
378
379 /**
380 * Width the component should take up in the container
381 *
382 * <p>
383 * All components belong to a <code>Container</code> and are placed using a
384 * <code>LayoutManager</code>. This property specifies a width the component
385 * should take up in the Container. This is not applicable for all layout
386 * managers. During the finalize phase the CSS width style will be created
387 * for the width setting.
388 * </p>
389 *
390 * <p>
391 * e.g. '30%', '55px'
392 * </p>
393 *
394 * @return String width string
395 */
396 public String getWidth();
397
398 /**
399 * Setter for the components width
400 *
401 * @param width
402 */
403 public void setWidth(String width);
404
405 /**
406 * CSS style string to be applied to the component
407 *
408 * <p>
409 * Any style override or additions can be specified with this attribute.
410 * This is used by the renderer to set the style attribute on the
411 * corresponding element.
412 * </p>
413 *
414 * <p>
415 * e.g. 'color: #000000;text-decoration: underline;'
416 * </p>
417 *
418 * @return String css style string
419 */
420 String getStyle();
421
422 /**
423 * Setter for the components style
424 *
425 * @param style
426 */
427 void setStyle(String style);
428
429 public List<String> getLibraryCssClasses();
430
431 public void setLibraryCssClasses(List<String> libraryCssClasses);
432
433 /**
434 * CSS style class(s) to be applied to the component
435 *
436 * <p>
437 * Declares style classes for the component. Multiple classes are specified
438 * with a space delimiter. This is used by the renderer to set the class
439 * attribute on the corresponding element. The class(s) declared must be
440 * available in the common style sheets or the style sheets specified for
441 * the view
442 * </p>
443 *
444 * @return List<String> css style classes to appear on the 'class' attribute
445 */
446 List<String> getCssClasses();
447
448 /**
449 * Setter for the components style classes
450 *
451 * @param styleClasses
452 */
453 void setCssClasses(List<String> styleClasses);
454
455 /**
456 * Convenience property for adding css class names to the end of the list of cssClasses that may already exist on
457 * this Component (this is to avoid explicitly having to set list merge in the bean definition)
458 *
459 * @return the additionalCssClasses
460 */
461 List<String> getAdditionalCssClasses();
462
463 /**
464 * Set the additionalCssClasses
465 *
466 * @param styleClasses
467 */
468 void setAdditionalCssClasses(List<String> styleClasses);
469
470 /**
471 * Adds a single style to the list of styles on this component
472 *
473 * @param styleClass
474 */
475 void addStyleClass(String styleClass);
476
477 /**
478 * Appends to the inline style set on a component
479 *
480 * @param itemStyle
481 */
482 void appendToStyle(String itemStyle);
483
484 /**
485 * Number of places the component should take up horizontally in the
486 * container; when using a CssGridLayoutManager this is converted to the appropriate medium size.
487 *
488 * <p>
489 * All components belong to a {@code Container} and are placed using a
490 * {@code LayoutManager}. This property specifies how many places
491 * horizontally the component should take up within the container. This is
492 * only applicable for table based layout managers. Default is 1
493 * </p>
494 *
495 * TODO: this should not be on component interface since it only applies if
496 * the layout manager supports it, need some sort of layoutOptions map for
497 * field level options that depend on the manager
498 *
499 * @return int number of columns to span
500 */
501 int getColSpan();
502
503 /**
504 * Setter for the components column span
505 *
506 * @param colSpan
507 */
508 void setColSpan(int colSpan);
509
510 /**
511 * Number of places the component should take up vertically in the container
512 *
513 * <p>
514 * All components belong to a {@code Container} and are placed using a
515 * {@code LayoutManager}. This property specifies how many places
516 * vertically the component should take up within the container. This is
517 * only applicable for table based layout managers. Default is 1
518 * </p>
519 *
520 * TODO: this should not be on component interface since it only applies if
521 * the layout manager supports it, need some sort of layoutOptions map for
522 * field level options that depend on the manager
523 *
524 * @return int number of rows to span
525 */
526 int getRowSpan();
527
528 /**
529 * Setter for the component row span
530 *
531 * @param rowSpan
532 */
533 void setRowSpan(int rowSpan);
534
535 /**
536 * The cellCssClasses property defines the classes that will be placed on the corresponding td (or th) elements
537 * relating to this component when used in a table backed layout. This property has no effect on other layouts.
538 *
539 * @return the css classes to apply to the wrapping td (or th) element for this component
540 */
541 public List<String> getWrapperCssClasses();
542
543 /**
544 * Set the cellCssClasses property which defines the classes that will be placed on the corresponding td (or th)
545 * relating to this component when used in a table backed layout. This property has no effect on other layouts.
546 *
547 * @param cellCssClasses
548 */
549 public void setWrapperCssClasses(List<String> cellCssClasses);
550
551 /**
552 * Add a cell css class to the cell classes list
553 *
554 * @param cssClass the name of the class to add
555 */
556 public void addWrapperCssClass(String cssClass);
557
558 /**
559 * CSS style string to be applied to the cell containing the component (only applies within
560 * table based layouts)
561 *
562 * <p>
563 * e.g. 'align: right;'
564 * </p>
565 *
566 * @return String css style string
567 */
568 public String getWrapperStyle();
569
570 /**
571 * Setter for the cell style attribute
572 *
573 * @param cellStyle
574 */
575 public void setWrapperStyle(String cellStyle);
576
577 /**
578 * Width setting for the cell containing the component (only applies within table based
579 * layouts)
580 *
581 * @return String width ('25%', '155px')
582 */
583 public String getCellWidth();
584
585 /**
586 * Setter for the containing cell width
587 *
588 * @param cellWidth
589 */
590 public void setCellWidth(String cellWidth);
591
592 /**
593 * CssGridSizes represent the size (width) the content's div "cell" will take up in the "row" at each screen
594 * size (extra small, small, medium, large) when using a group backed by a CssGridLayoutManager.
595 *
596 * <p>
597 * This object is NOT used by other layouts.
598 * For specifics of how css grids work, refer to the krad guide and bootstrap css grid documentation.
599 * </p>
600 *
601 * @return
602 */
603 public CssGridSizes getCssGridSizes();
604
605 /**
606 * @see org.kuali.rice.krad.uif.component.Component#getCssGridSizes()
607 */
608 public void setCssGridSizes(CssGridSizes cssGridSizes);
609
610 /**
611 * Context map for the component
612 *
613 * <p>
614 * Any el statements configured for the components properties (e.g.
615 * title="@{foo.property}") are evaluated using the el context map. This map
616 * will get populated with default objects like the model, view, and request
617 * from the {@code ViewHelperService}. Other components can push
618 * further objects into the context so that they are available for use with
619 * that component. For example, {@code Field} instances that are part
620 * of a collection line as receive the current line instance
621 * </p>
622 *
623 * <p>
624 * Context map also provides objects to methods that are invoked for
625 * {@code GeneratedField} instances
626 * </p>
627 *
628 * <p>
629 * The Map key gives the name of the variable that can be used within
630 * expressions, and the Map value gives the object instance for which
631 * expressions containing the variable should evaluate against
632 * </p>
633 *
634 * <p>
635 * NOTE: Calling getContext().putAll() will skip updating any configured property replacers for the
636 * component. Instead you should call #pushAllToContextDeep
637 * </p>
638 *
639 * @return Map<String, Object> context
640 */
641 Map<String, Object> getContext();
642
643 /**
644 * Setter for the context Map
645 *
646 * @param context
647 */
648 void setContext(Map<String, Object> context);
649
650 /**
651 * gets a list of {@code PropertyReplacer} instances
652 *
653 * <p>They will be evaluated
654 * during the view lifecycle to conditionally set properties on the
655 * {@code Component} based on expression evaluations</p>
656 *
657 * @return List<PropertyReplacer> replacers to evaluate
658 */
659 List<PropertyReplacer> getPropertyReplacers();
660
661 /**
662 * Setter for the components property substitutions
663 *
664 * @param propertyReplacers
665 */
666 void setPropertyReplacers(List<PropertyReplacer> propertyReplacers);
667
668 /**
669 * The options that are passed through to the Component renderer
670 *
671 * <p>
672 * The Map key is the option name, with the Map value as the option value. See
673 * documentation on the particular widget render for available options.
674 * </p>
675 *
676 * @return Map<String, String> options
677 */
678 Map<String, String> getTemplateOptions();
679
680 /**
681 * Setter for the template's options
682 *
683 * @param templateOptions
684 */
685 void setTemplateOptions(Map<String, String> templateOptions);
686
687 /**
688 * Builds a string from the underlying <code>Map</code> of template options that will export that options as a
689 * JavaScript Map for use in js and jQuery plugins
690 *
691 * <p>
692 * See documentation on the particular component render for available options.
693 * </p>
694 *
695 * @return String options
696 */
697 String getTemplateOptionsJSString();
698
699 /**
700 * Setter for the template's options
701 *
702 * @param templateOptionsJSString
703 */
704 void setTemplateOptionsJSString(String templateOptionsJSString);
705
706 /**
707 * Order of a component within a List of other components
708 *
709 * <p>Lower numbers are placed higher up in the list, while higher numbers are placed
710 * lower in the list</p>
711 *
712 * @return int ordering number
713 * @see org.springframework.core.Ordered#getOrder()
714 */
715 int getOrder();
716
717 /**
718 * Setter for the component's order
719 *
720 * @param order
721 */
722 void setOrder(int order);
723
724 /**
725 * The Tooltip widget that renders a tooltip with additional information about the element on
726 * specified trigger event
727 *
728 * @return Tooltip
729 */
730 Tooltip getToolTip();
731
732 /**
733 * Setter for the component tooltip widget instance
734 *
735 * @param toolTip
736 */
737 void setToolTip(Tooltip toolTip);
738
739 /**
740 * String containing JavaScript code for registering event handlers for this component
741 * (blur, focus, click, etc.)
742 *
743 * @return JS event handler script
744 */
745 public String getEventHandlerScript();
746
747 /**
748 * The name of the method that should be invoked for finalizing the component
749 * configuration (full method name, without parameters or return type)
750 *
751 * <p>
752 * Note the method can also be set with the finalizeMethodInvoker
753 * targetMethod property. If the method is on the configured
754 * {@code ViewHelperService}, only this property needs to be configured
755 * </p>
756 *
757 * <p>
758 * The model backing the view will be passed as the first argument method and then
759 * the {@code Component} instance as the second argument. If any additional method
760 * arguments are declared with the finalizeMethodAdditionalArguments, they will then
761 * be passed in the order declared in the list
762 * </p>
763 *
764 * <p>
765 * If the component is selfRendered, the finalize method can return a string which
766 * will be set as the component's renderOutput. The selfRendered indicator will also
767 * be set to true on the component.
768 * </p>
769 *
770 * @return String method name
771 */
772 String getFinalizeMethodToCall();
773
774 /**
775 * The List of Object instances that should be passed as arguments to the finalize method
776 *
777 * <p>
778 * These arguments are passed to the finalize method after the standard model and component
779 * arguments. They are passed in the order declared in the list
780 * </p>
781 *
782 * @return List<Object> additional method arguments
783 */
784 List<Object> getFinalizeMethodAdditionalArguments();
785
786 /**
787 * {@code MethodInvokerConfig} instance for the method that should be invoked
788 * for finalizing the component configuration
789 *
790 * <p>
791 * MethodInvoker can be configured to specify the class or object the method
792 * should be called on. For static method invocations, the targetClass
793 * property can be configured. For object invocations, that targetObject
794 * property can be configured
795 * </p>
796 *
797 * <p>
798 * If the component is selfRendered, the finalize method can return a string which
799 * will be set as the component's renderOutput. The selfRendered indicator will also
800 * be set to true on the component.
801 * </p>
802 *
803 * @return MethodInvokerConfig instance
804 */
805 MethodInvokerConfig getFinalizeMethodInvoker();
806
807 /**
808 * Indicates whether the component contains its own render output (through
809 * the renderOutput property)
810 *
811 * <p>
812 * If self rendered is true, the corresponding template for the component
813 * will not be invoked and the renderOutput String will be written to the
814 * response as is.
815 * </p>
816 *
817 * @return boolean true if component is self rendered, false if not (renders
818 * through template)
819 */
820 boolean isSelfRendered();
821
822 /**
823 * Setter for the self render indicator
824 *
825 * @param selfRendered
826 */
827 void setSelfRendered(boolean selfRendered);
828
829 /**
830 * Rendering output for the component that will be sent as part of the
831 * response (can contain static text and HTML)
832 *
833 * @return String render output
834 */
835 String getRenderedHtmlOutput();
836
837 /**
838 * Setter for the component's render output
839 *
840 * @param renderOutput
841 */
842 void setRenderedHtmlOutput(String renderOutput);
843
844 /**
845 * Disables the storage of the component in session (when the framework determines it needs to be due to a
846 * refresh condition)
847 *
848 * <p>
849 * When the framework determines there is a condition on the component that requires it to keep around between
850 * posts, it will store the component instance in session. This flag can be set to disable this behavior (which
851 * would require custom application logic to support behavior such as refresh)
852 * </p>
853 *
854 * @return boolean true if the component should not be stored in session, false if session storage is allowed
855 */
856 boolean isDisableSessionPersistence();
857
858 /**
859 * Setter for disabling storage of the component in session
860 *
861 * @param disableSessionPersistence
862 */
863 void setDisableSessionPersistence(boolean disableSessionPersistence);
864
865 /**
866 * Indicates whether the component should be stored with the session view regardless of configuration
867 *
868 * <p>
869 * By default the framework nulls out any components that do not have a refresh condition or are needed for
870 * collection processing. This can be a problem if custom application code is written to refresh a component
871 * without setting the corresponding component flag. In this case this property can be set to true to force the
872 * framework to keep the component in session. Defaults to false
873 * </p>
874 *
875 * @return boolean true if the component should be stored in session, false if not
876 */
877 boolean isForceSessionPersistence();
878
879 /**
880 * Setter for the indicator to force persistence of the component in session
881 *
882 * @param persistInSession
883 */
884 void setForceSessionPersistence(boolean persistInSession);
885
886 /**
887 * Security object that indicates what authorization (permissions) exist for the component
888 *
889 * @return ComponentSecurity instance
890 */
891 ComponentSecurity getComponentSecurity();
892
893 /**
894 * Setter for the components security object
895 *
896 * @param componentSecurity
897 */
898 void setComponentSecurity(ComponentSecurity componentSecurity);
899
900 /**
901 * Spring EL expression, which when evaluates to true, makes this component visible
902 *
903 * @return the SpEl expression string
904 */
905 String getProgressiveRender();
906
907 /**
908 * Setter for progressiveRender Spring EL expression
909 *
910 * @param progressiveRender the progressiveRender to set
911 */
912 void setProgressiveRender(String progressiveRender);
913
914 /**
915 * Spring EL expression, which when evaluates to true, causes this component to be refreshed
916 *
917 * @return the SpEl expression string
918 */
919 String getConditionalRefresh();
920
921 /**
922 * Setter for conditionalRefresh Spring EL expression
923 *
924 * @param conditionalRefresh the conditionalRefresh to set
925 */
926 void setConditionalRefresh(String conditionalRefresh);
927
928 /**
929 * List of control names (ids) extracted from {@link #getProgressiveRender()}
930 *
931 * @return the list of control names
932 */
933 List<String> getProgressiveDisclosureControlNames();
934
935 /**
936 * A JavaScript expression constructed from {@link #getConditionalRefresh()}
937 *
938 * <p>The script can be executed on the client to determine if the original exp was satisfied before
939 * interacting with the server.</p>
940 *
941 * @return the JS script
942 */
943 String getProgressiveDisclosureConditionJs();
944
945 /**
946 * A JavaScript expression constructed from {@link #getProgressiveRender()}
947 *
948 * <p>The script can be executed on the client to determine if the original exp was satisfied before
949 * interacting with the server.</p>
950 *
951 * @return the JS script
952 */
953 String getConditionalRefreshConditionJs();
954
955 /**
956 * The list of control names (ids) extracted from {@link #getConditionalRefresh()}
957 *
958 * @return the list of control names
959 */
960 List<String> getConditionalRefreshControlNames();
961
962 /**
963 * Indicates whether the component will be stored on the client, but hidden, after the first retrieval
964 *
965 * <p>
966 * The component will not be rendered hidden after first retrieval if this flag is set to true. The component will
967 * then be fetched via an ajax call when it should be rendered.
968 * </p>
969 *
970 * @return the progressiveRenderViaAJAX
971 */
972 boolean isProgressiveRenderViaAJAX();
973
974 /**
975 * Setter for the progressiveRenderViaAJAX flag
976 *
977 * @param progressiveRenderViaAJAX the progressiveRenderViaAJAX to set
978 */
979 void setProgressiveRenderViaAJAX(boolean progressiveRenderViaAJAX);
980
981 /**
982 * Determines whether the component will always be retrieved from the server and shown
983 *
984 * <p>
985 * If true, when the progressiveRender condition is satisfied, the component
986 * will always be retrieved from the server and shown(as opposed to being
987 * stored on the client, but hidden, after the first retrieval as is the
988 * case with the progressiveRenderViaAJAX option). <b>By default, this is
989 * false, so components with progressive render capabilities will always be
990 * already within the client html and toggled to be hidden or visible.</b> </p>
991 *
992 * @return the progressiveRenderAndRefresh
993 */
994 boolean isProgressiveRenderAndRefresh();
995
996 /**
997 * Setter for the progressiveRenderAndRefresh flag
998 *
999 * @param progressiveRenderAndRefresh the progressiveRenderAndRefresh to set
1000 */
1001 void setProgressiveRenderAndRefresh(boolean progressiveRenderAndRefresh);
1002
1003 /**
1004 * Specifies a property by name that when its value changes will automatically perform
1005 * a refresh on this component
1006 *
1007 * <p>
1008 * This can be a comma
1009 * separated list of multiple properties that require this component to be
1010 * refreshed when any of them change. <Br>DO NOT use with progressiveRender
1011 * unless it is know that progressiveRender condition will always be
1012 * satisfied before one of these fields can be changed.
1013 * </p>
1014 *
1015 * @return List property names that should trigger a refresh when their values change
1016 */
1017 List<String> getRefreshWhenChangedPropertyNames();
1018
1019 /**
1020 * Setter for the list of property names that trigger a refresh
1021 *
1022 * @param refreshWhenChangedPropertyNames
1023 */
1024 void setRefreshWhenChangedPropertyNames(List<String> refreshWhenChangedPropertyNames);
1025
1026 /**
1027 * Returns a list of componentIds which will be also be refreshed when this component is refreshed
1028 *
1029 * <p>
1030 * This will be a comma separated list of componentIds that need to be refreshed when a refresh
1031 * condition has been set on this component.
1032 * </p>
1033 *
1034 * @return List<String>
1035 */
1036 public List<String> getAdditionalComponentsToRefresh();
1037
1038 /**
1039 * Setter for alsoRefreshComponents
1040 *
1041 * @param additionalComponentsToRefresh
1042 */
1043 public void setAdditionalComponentsToRefresh(List<String> additionalComponentsToRefresh);
1044
1045 /**
1046 * Returns a string for representing the list of additional components to be refreshed as
1047 * a JavaScript value
1048 *
1049 * @return String representation of the list of componentIds for the components that need to be refreshed
1050 */
1051 public String getAdditionalComponentsToRefreshJs();
1052
1053 /**
1054 * Indicates the component can be refreshed by an action
1055 *
1056 * <p>
1057 * This is set by the framework for configured ajax action buttons, should not be set in
1058 * configuration
1059 * </p>
1060 *
1061 * @return boolean true if the component is refreshed by an action, false if not
1062 */
1063 boolean isRefreshedByAction();
1064
1065 /**
1066 * Setter for the refreshed by action indicator
1067 *
1068 * <p>
1069 * This is set by the framework for configured ajax action buttons, should not be set in
1070 * configuration
1071 * </p>
1072 *
1073 * @param refreshedByAction
1074 */
1075 void setRefreshedByAction(boolean refreshedByAction);
1076
1077 /**
1078 * If true if this component is disclosed by an action in js, a placeholder will be put in this components place
1079 * if render is also false.
1080 *
1081 * @return true if this component is disclosed by an action
1082 */
1083 public boolean isDisclosedByAction();
1084
1085 /**
1086 * Set if this component is disclosed by some outside action
1087 *
1088 * @param disclosedByAction
1089 */
1090 public void setDisclosedByAction(boolean disclosedByAction);
1091
1092 /**
1093 * Indicates whether data contained within the component should be reset (set to default) when the
1094 * component is refreshed
1095 *
1096 * @return boolean true if data should be refreshed, false if data should remain as is
1097 */
1098 boolean isResetDataOnRefresh();
1099
1100 /**
1101 * Setter for the reset data on refresh indicator
1102 *
1103 * @param resetDataOnRefresh
1104 */
1105 void setResetDataOnRefresh(boolean resetDataOnRefresh);
1106
1107 /**
1108 * Time in seconds after which the component is automatically refreshed
1109 *
1110 * @return time in seconds
1111 */
1112 int getRefreshTimer();
1113
1114 /**
1115 * Setter for refreshTimer
1116 *
1117 * @param refreshTimer
1118 */
1119 void setRefreshTimer(int refreshTimer);
1120
1121 /**
1122 * The DataAttributes that will be written to the html element for this component as data-
1123 *
1124 * <p>They can be access through .data() call in jQuery.</p>
1125 *
1126 * @return map of data attributes, where key is data attribute name and the map value is the data
1127 * attribute value
1128 */
1129 Map<String, String> getDataAttributes();
1130
1131 /**
1132 * Setter for data attributes to include for the component
1133 *
1134 * @param dataAttributes
1135 */
1136 void setDataAttributes(Map<String, String> dataAttributes);
1137
1138 /**
1139 * Setter for script data attributes to include for the component
1140 *
1141 * @param dataAttributes
1142 */
1143 void setScriptDataAttributes(Map<String, String> dataAttributes);
1144
1145 /**
1146 * The DataAttributes that will be written to the html as a script call to data for this component (these cannot be
1147 * used for jQuery selection directly)
1148 *
1149 * <p>They can be accessed through .data() call in jQuery.</p>
1150 *
1151 * @return map of data attributes, where key is data attribute name and the map value is the data
1152 * attribute value
1153 */
1154 Map<String, String> getScriptDataAttributes();
1155
1156 /**
1157 * Add a data attribute to the dataAttributes map
1158 *
1159 * @param key
1160 * @param value
1161 */
1162 void addDataAttribute(String key, String value);
1163
1164 /**
1165 * Add a script data attribute to the scriptDataAttributes map
1166 *
1167 * @param key
1168 * @param value
1169 */
1170 void addScriptDataAttribute(String key, String value);
1171
1172 /**
1173 * The string that can be put into a the tag of a component to add data attributes inline
1174 *
1175 * @return html string for data attributes as html formatted element attributes
1176 */
1177 String getSimpleDataAttributes();
1178
1179 /**
1180 * Returns a js string that can be used to right js data attributes to for the component
1181 *
1182 * @return html string for the js required to add the script data attributes
1183 */
1184 String getScriptDataAttributesJs();
1185
1186 /**
1187 * The role attribute of this component, use to define aria roles
1188 *
1189 * @return the role attribute
1190 */
1191 String getRole();
1192
1193 /**
1194 * @see Component#getRole()
1195 */
1196 void setRole(String role);
1197
1198 /**
1199 * The aria attributes of this component and their values
1200 * (without "aria-", this is automatically appended during rendering)
1201 *
1202 * @return the aria attributes of this component
1203 */
1204 Map<String, String> getAriaAttributes();
1205
1206 /**
1207 * @see org.kuali.rice.krad.uif.component.Component#getAriaAttributes()
1208 */
1209 void setAriaAttributes(Map<String, String> ariaAttributes);
1210
1211 /**
1212 * Add an aria attribute to the ariaAttributes list
1213 *
1214 * @param key the attribute (no "aria-" prefix)
1215 * @param value the attribute's value
1216 */
1217 void addAriaAttribute(String key, String value);
1218
1219 /**
1220 * Get the aria attributes as a String that can be used during template output
1221 *
1222 * @return the aria attributes as a string
1223 */
1224 String getAriaAttributesAsString();
1225
1226 /**
1227 * Validates different requirements of component compiling a series of reports detailing information on errors
1228 * found in the component. Used by the RiceDictionaryValidator.
1229 *
1230 * @param tracer Record of component's location
1231 */
1232 void completeValidation(ValidationTrace tracer);
1233
1234 /**
1235 * Raw html or string content to render before this component renders
1236 *
1237 * @return the preRenderContent string
1238 */
1239 public String getPreRenderContent();
1240
1241 /**
1242 * Set the preRenderContent
1243 *
1244 * @param preRenderContent
1245 */
1246 public void setPreRenderContent(String preRenderContent);
1247
1248 /**
1249 * Raw html or string content to render after this component renders
1250 *
1251 * @return the postRenderContent string
1252 */
1253 public String getPostRenderContent();
1254
1255 /**
1256 * Set the postRenderContent
1257 *
1258 * @param postRenderContent
1259 */
1260 public void setPostRenderContent(String postRenderContent);
1261
1262 /**
1263 * Gets the method to call on refresh.
1264 *
1265 * @return method to call
1266 */
1267 String getMethodToCallOnRefresh();
1268
1269 /**
1270 * Limits the field data to send on a refresh methodToCall server call to the names/group id/field id
1271 * specified in this list.
1272 *
1273 * <p>The names in the list should be the propertyNames of the fields sent with this request. A wildcard("*")
1274 * can be used at the END of a name to specify all fields with names that begin with the string
1275 * before the wildcard. If the array contains 1 item with the keyword "NONE", then no form fields are sent.
1276 * In addition, a group id or field id with the "#" id selector prefix can be used to send all input data which
1277 * are nested within them. Note that this only limits the fields which exist on the form and data required
1278 * by the KRAD framework is still sent (eg, methodToCall, formKey, sessionId, etc.)</p>
1279 *
1280 * @return the only input fields to send by name with the action request
1281 */
1282 public List<String> getFieldsToSendOnRefresh();
1283
1284 /**
1285 * @see org.kuali.rice.krad.uif.component.Component#getFieldsToSendOnRefresh()
1286 */
1287 public void setFieldsToSendOnRefresh(List<String> fieldsToSendOnRefresh);
1288
1289 /**
1290 * Gets a string representing all CSS style classes.
1291 *
1292 * @return string representation of CSS classes
1293 */
1294 String getStyleClassesAsString();
1295
1296 /**
1297 * Names a model property path, which if set and resolves to true, indicates that this component
1298 * should be excluded from the lifecycle at the initialize phase.
1299 *
1300 * <p>
1301 * If prefixed with the '#' character, this path will be relative to the view's "pre-model"
1302 * context rather than the model.
1303 * </p>
1304 *
1305 * <p>
1306 * This property is superseded by {@link #getExcludeUnless()}; when both resolve to true, the
1307 * component will be included. When neither property is set, the component is unconditionally
1308 * included.
1309 * </p>
1310 *
1311 * @return model property path
1312 * @see ViewLifecycleUtils#isExcluded(Component)
1313 */
1314 String getExcludeIf();
1315
1316 /**
1317 * Names a model property path, which if set and resolves to null or false, indicates that this
1318 * component should be excluded from the lifecycle at the initialize phase.
1319 *
1320 * <p>
1321 * If prefixed with the '#' character, this path will be relative to the view's "pre-model"
1322 * context rather than the model.
1323 * </p>
1324 *
1325 * <p>
1326 * This property supersedes {@link #getExcludeIf()}; when both resolve to true, the component
1327 * will be included. When neither property is set, the component is unconditionally included.
1328 * </p>
1329 *
1330 * @return model property path
1331 * @see ViewLifecycleUtils#isExcluded(Component)
1332 */
1333 String getExcludeUnless();
1334
1335 /**
1336 * Whether to omit fields from form post unless they are explicitly specified by the
1337 * {@link org.kuali.rice.krad.uif.element.Action#fieldsToSend} property.
1338 *
1339 * @return whether fields will be omitted from form post
1340 */
1341 boolean isOmitFromFormPost();
1342
1343 /**
1344 * @see #isOmitFromFormPost()
1345 */
1346 void setOmitFromFormPost(boolean omitFromFormPost);
1347
1348
1349 }