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.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 }