1 /** 2 * Copyright 2005-2014 The Kuali Foundation 3 * 4 * Licensed under the Educational Community License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.opensource.org/licenses/ecl2.php 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package org.kuali.rice.krad.uif.container; 17 18 import org.kuali.rice.krad.datadictionary.validator.ValidationTrace; 19 import org.kuali.rice.krad.uif.component.BindingInfo; 20 import org.kuali.rice.krad.uif.component.Component; 21 import org.kuali.rice.krad.uif.component.ComponentSecurity; 22 import org.kuali.rice.krad.uif.component.DataBinding; 23 import org.kuali.rice.krad.uif.element.Action; 24 import org.kuali.rice.krad.uif.element.Message; 25 import org.kuali.rice.krad.uif.view.View; 26 import org.kuali.rice.krad.uif.widget.QuickFinder; 27 28 import java.util.List; 29 30 /** 31 * Interface representing an editable collection within a view. 32 * 33 * @author Kuali Rice Team (rice.collab@kuali.org) 34 */ 35 public interface CollectionGroup extends Group, DataBinding { 36 37 /** 38 * Sets a reference in the context map for all nested components in the collection group 39 * instance, and sets selected collection path and id data attributes on nested actions of this group. 40 */ 41 void pushCollectionGroupToReference(); 42 43 /** 44 * New collection lines are handled in the framework by maintaining a map on 45 * the form. The map contains as a key the collection name, and as value an 46 * instance of the collection type. An entry is created here for the 47 * collection represented by the <code>CollectionGroup</code> if an instance 48 * is not available (clearExistingLine will force a new instance). The given 49 * model must be a subclass of <code>UifFormBase</code> in order to find the 50 * Map. 51 * 52 * @param model Model instance that contains the new collection lines Map 53 * @param clearExistingLine boolean that indicates whether the line should be set to a 54 * new instance if it already exists 55 */ 56 void initializeNewCollectionLine(View view, Object model, CollectionGroup collectionGroup, 57 boolean clearExistingLine); 58 59 /** 60 * Object class the collection maintains. Used to get dictionary information 61 * in addition to creating new instances for the collection when necessary 62 * 63 * @return collection object class 64 */ 65 Class<?> getCollectionObjectClass(); 66 67 /** 68 * Setter for the collection object class 69 * 70 * @param collectionObjectClass 71 */ 72 void setCollectionObjectClass(Class<?> collectionObjectClass); 73 74 /** 75 * Setter for the collections property name 76 * 77 * @param propertyName 78 */ 79 void setPropertyName(String propertyName); 80 81 /** 82 * Action fields that should be rendered for each collection line. Example 83 * line action is the delete action 84 * 85 * @return line action fields 86 */ 87 List<? extends Component> getLineActions(); 88 89 /** 90 * Setter for the line action fields list 91 * 92 * @param lineActions 93 */ 94 void setLineActions(List<? extends Component> lineActions); 95 96 /** 97 * Indicates whether the action column for the collection should be rendered 98 * 99 * @return true if the actions should be rendered, false if not 100 * @see #getLineActions() 101 */ 102 boolean isRenderLineActions(); 103 104 /** 105 * Setter for the render line actions indicator 106 * 107 * @param renderLineActions 108 */ 109 void setRenderLineActions(boolean renderLineActions); 110 111 /** 112 * Indicates whether an add line should be rendered for the collection 113 * 114 * @return true if add line should be rendered, false if it should not be 115 */ 116 boolean isRenderAddLine(); 117 118 /** 119 * Setter for the render add line indicator 120 * 121 * @param renderAddLine 122 */ 123 void setRenderAddLine(boolean renderAddLine); 124 125 /** 126 * Get the id of the add line action to invoke when the enter key is pressed. 127 * 128 * <p>Use '@DEFAULT' if supposed to use first action where 'defaultEnterKeyAction' 129 * property is set to true.</p> 130 * 131 * @return id or '@DEFAULT' 132 */ 133 String getAddLineEnterKeyAction(); 134 135 /** 136 * @see #getAddLineEnterKeyAction() 137 */ 138 void setAddLineEnterKeyAction(String addLineEnterKeyAction); 139 140 /** 141 * Get the id of the nonAdd line action to invoke when the enter key is pressed. 142 * 143 * <p>Use '@DEFAULT' if supposed to use first action where 'defaultEnterKeyAction' 144 * property is set to true. In a collection may have to use SpringEL to identify 145 * line ID values. Here is a sample value: DemoButton@{#lineSuffix}. Notice the use 146 * of '@{#lineSuffix}' to help append line suffix information.</p> 147 * 148 * @return id or '@DEFAULT' 149 */ 150 String getLineEnterKeyAction(); 151 152 /** 153 * @see #getLineEnterKeyAction() 154 */ 155 void setLineEnterKeyAction(String lineEnterKeyAction); 156 157 /** 158 * Convenience getter for the add line label field text. The text is used to 159 * label the add line when rendered and its placement depends on the 160 * <code>LayoutManager</code> 161 * 162 * <p> 163 * For the <code>TableLayoutManager</code> the label appears in the sequence 164 * column to the left of the add line fields. For the 165 * <code>StackedLayoutManager</code> the label is placed into the group 166 * header for the line. 167 * </p> 168 * 169 * @return add line label 170 */ 171 String getAddLabel(); 172 173 /** 174 * Setter for the add line label text 175 * 176 * @param addLabelText 177 */ 178 void setAddLabel(String addLabelText); 179 180 /** 181 * <code>Message</code> instance for the add line label 182 * 183 * @return add line Message 184 * @see #getAddLabel 185 */ 186 Message getAddLineLabel(); 187 188 /** 189 * Setter for the <code>Message</code> instance for the add line label 190 * 191 * @param addLineLabel 192 * @see #getAddLabel 193 */ 194 void setAddLineLabel(Message addLineLabel); 195 196 /** 197 * Name of the property that contains an instance for the add line. If set 198 * this is used with the binding info to create the path to the add line. 199 * Can be left blank in which case the framework will manage the add line 200 * instance in a generic map. 201 * 202 * @return add line property name 203 */ 204 String getAddLinePropertyName(); 205 206 /** 207 * Setter for the add line property name 208 * 209 * @param addLinePropertyName 210 */ 211 void setAddLinePropertyName(String addLinePropertyName); 212 213 /** 214 * <code>BindingInfo</code> instance for the add line property used to 215 * determine the full binding path. If add line name given 216 * {@link #getAddLabel} then it is set as the binding name on the 217 * binding info. Add line label and binding info are not required, in which 218 * case the framework will manage the new add line instances through a 219 * generic map (model must extend UifFormBase) 220 * 221 * @return BindingInfo add line binding info 222 */ 223 BindingInfo getAddLineBindingInfo(); 224 225 /** 226 * Setter for the add line binding info 227 * 228 * @param addLineBindingInfo 229 */ 230 void setAddLineBindingInfo(BindingInfo addLineBindingInfo); 231 232 /** 233 * List of <code>Component</code> instances that should be rendered for the 234 * collection add line (if enabled). If not set, the default group's items 235 * list will be used 236 * 237 * @return add line field list 238 * @see CollectionGroup#performInitialization(Object) 239 */ 240 List<? extends Component> getAddLineItems(); 241 242 /** 243 * Setter for the add line field list 244 * 245 * @param addLineItems 246 */ 247 void setAddLineItems(List<? extends Component> addLineItems); 248 249 /** 250 * Component fields that should be rendered for the add line. 251 * 252 * <p>This is generally the add action (button) but can be configured to contain additional 253 * components 254 * </p> 255 * 256 * @return add line action fields 257 */ 258 List<? extends Component> getAddLineActions(); 259 260 /** 261 * Setter for the add line action components fields 262 * 263 * @param addLineActions 264 */ 265 void setAddLineActions(List<? extends Component> addLineActions); 266 267 /** 268 * Indicates whether lines of the collection group should be selected by rendering a 269 * field for each line that will allow selection 270 * 271 * <p> 272 * For example, having the select field enabled could allow selecting multiple lines from a search 273 * to return (multi-value lookup) 274 * </p> 275 * 276 * @return true if select field should be rendered, false if not 277 */ 278 boolean isIncludeLineSelectionField(); 279 280 /** 281 * Setter for the render selected field indicator 282 * 283 * @param includeLineSelectionField 284 */ 285 void setIncludeLineSelectionField(boolean includeLineSelectionField); 286 287 /** 288 * When {@link #isIncludeLineSelectionField()} is true, gives the name of the property the select field 289 * should bind to 290 * 291 * <p> 292 * Note if no prefix is given in the property name, such as 'form.', it is assumed the property is 293 * contained on the collection line. In this case the binding path to the collection line will be 294 * appended. In other cases, it is assumed the property is a list or set of String that will hold the 295 * selected identifier strings 296 * </p> 297 * 298 * <p> 299 * This property is not required. If not the set the framework will use a property contained on 300 * <code>UifFormBase</code> 301 * </p> 302 * 303 * @return property name for select field 304 */ 305 String getLineSelectPropertyName(); 306 307 /** 308 * Setter for the property name that will bind to the select field 309 * 310 * @param lineSelectPropertyName 311 */ 312 void setLineSelectPropertyName(String lineSelectPropertyName); 313 314 /** 315 * Instance of the <code>QuickFinder</code> widget that configures a multi-value lookup for the collection 316 * 317 * <p> 318 * If the collection lookup is enabled (by the render property of the quick finder), {@link 319 * #getCollectionObjectClass()} will be used as the data object class for the lookup (if not set). Field 320 * conversions need to be set as usual and will be applied for each line returned 321 * </p> 322 * 323 * @return instance configured for the collection lookup 324 */ 325 QuickFinder getCollectionLookup(); 326 327 /** 328 * Setter for the collection lookup quickfinder instance 329 * 330 * @param collectionLookup 331 */ 332 void setCollectionLookup(QuickFinder collectionLookup); 333 334 /** 335 * Indicates whether inactive collections lines should be displayed 336 * 337 * <p> 338 * Setting only applies when the collection line type implements the 339 * <code>Inactivatable</code> interface. If true and showInactive is 340 * set to false, the collection will be filtered to remove any items 341 * whose active status returns false 342 * </p> 343 * 344 * @return true to show inactive records, false to not render inactive records 345 */ 346 boolean isShowInactiveLines(); 347 348 /** 349 * Setter for the show inactive indicator 350 * 351 * @param showInactiveLines boolean show inactive 352 */ 353 void setShowInactiveLines(boolean showInactiveLines); 354 355 /** 356 * Collection filter instance for filtering the collection data when the 357 * showInactive flag is set to false 358 * 359 * @return CollectionFilter 360 */ 361 CollectionFilter getActiveCollectionFilter(); 362 363 /** 364 * Setter for the collection filter to use for filter inactive records from the 365 * collection 366 * 367 * @param activeCollectionFilter CollectionFilter instance 368 */ 369 void setActiveCollectionFilter(CollectionFilter activeCollectionFilter); 370 371 /** 372 * List of {@link CollectionFilter} instances that should be invoked to filter the collection before 373 * displaying 374 * 375 * @return List<CollectionFilter> 376 */ 377 List<CollectionFilter> getFilters(); 378 379 /** 380 * Setter for the List of collection filters for which the collection will be filtered against 381 * 382 * @param filters 383 */ 384 void setFilters(List<CollectionFilter> filters); 385 386 /** 387 * List of property names that should be checked for duplicates in the collection. 388 * 389 * @return the list of property names that should be checked for duplicates in the collection 390 */ 391 List<String> getDuplicateLinePropertyNames(); 392 393 /** 394 * @see CollectionGroup#getDuplicateLinePropertyNames() 395 */ 396 void setDuplicateLinePropertyNames(List<String> duplicateLinePropertyNames); 397 398 /** 399 * List of {@link BindingInfo} instances that represent lines not authorized to be viewed or edited by the user. 400 */ 401 List<BindingInfo> getUnauthorizedLineBindingInfos(); 402 403 /** 404 * @see CollectionGroup#getUnauthorizedLineBindingInfos() 405 */ 406 void setUnauthorizedLineBindingInfos(List<BindingInfo> unauthorizedLineBindingInfos); 407 408 /** 409 * List of <code>CollectionGroup</code> instances that are sub-collections 410 * of the collection represented by this collection group 411 * 412 * @return sub collections 413 */ 414 List<CollectionGroup> getSubCollections(); 415 416 /** 417 * Setter for the sub collection list 418 * 419 * @param subCollections 420 */ 421 void setSubCollections(List<CollectionGroup> subCollections); 422 423 /** 424 * Collection Security object that indicates what authorization (permissions) exist for the collection 425 * 426 * @return CollectionGroupSecurity instance 427 */ 428 CollectionGroupSecurity getCollectionGroupSecurity(); 429 430 /** 431 * Override to assert a {@link CollectionGroupSecurity} instance is set 432 * 433 * @param componentSecurity instance of CollectionGroupSecurity 434 */ 435 void setComponentSecurity(ComponentSecurity componentSecurity); 436 437 /** 438 * @see org.kuali.rice.krad.uif.container.CollectionGroupSecurity#isEditLineAuthz() 439 */ 440 boolean isEditLineAuthz(); 441 442 /** 443 * @see org.kuali.rice.krad.uif.container.CollectionGroupSecurity#setEditLineAuthz(boolean) 444 */ 445 void setEditLineAuthz(boolean editLineAuthz); 446 447 /** 448 * @see org.kuali.rice.krad.uif.container.CollectionGroupSecurity#isViewLineAuthz() 449 */ 450 boolean isViewLineAuthz(); 451 452 /** 453 * @see org.kuali.rice.krad.uif.container.CollectionGroupSecurity#setViewLineAuthz(boolean) 454 */ 455 void setViewLineAuthz(boolean viewLineAuthz); 456 457 /** 458 * <code>CollectionGroupBuilder</code> instance that will build the 459 * components dynamically for the collection instance 460 * 461 * @return CollectionGroupBuilder instance 462 */ 463 CollectionGroupBuilder getCollectionGroupBuilder(); 464 465 /** 466 * Setter for the collection group building instance 467 * 468 * @param collectionGroupBuilder 469 */ 470 void setCollectionGroupBuilder(CollectionGroupBuilder collectionGroupBuilder); 471 472 /** 473 * @param renderInactiveToggleButton the showHideInactiveButton to set 474 */ 475 void setRenderInactiveToggleButton(boolean renderInactiveToggleButton); 476 477 /** 478 * @return the showHideInactiveButton 479 */ 480 boolean isRenderInactiveToggleButton(); 481 482 /** 483 * The number of records to display for a collection 484 * 485 * @return int 486 */ 487 int getDisplayCollectionSize(); 488 489 /** 490 * Setter for the display collection size 491 * 492 * @param displayCollectionSize 493 */ 494 void setDisplayCollectionSize(int displayCollectionSize); 495 496 /** 497 * Indicates whether new items should be styled with the #newItemsCssClass 498 * 499 * @return true if new items must be highlighted 500 */ 501 boolean isHighlightNewItems(); 502 503 /** 504 * Setter for the flag that allows for different styling of new items 505 * 506 * @param highlightNewItems 507 */ 508 void setHighlightNewItems(boolean highlightNewItems); 509 510 /** 511 * The css style class that will be added on new items 512 * 513 * @return the new items css style class 514 */ 515 String getNewItemsCssClass(); 516 517 /** 518 * Setter for the new items css style class 519 * 520 * @param newItemsCssClass 521 */ 522 void setNewItemsCssClass(String newItemsCssClass); 523 524 /** 525 * The css style class that will be added on the add item group or row 526 * 527 * @return the add item group or row css style class 528 */ 529 String getAddItemCssClass(); 530 531 /** 532 * Setter for the add item css style class 533 * 534 * @param addItemCssClass 535 */ 536 void setAddItemCssClass(String addItemCssClass); 537 538 /** 539 * Indicates whether the add item group or row should be styled with the #addItemCssClass 540 * 541 * @return true if add item group or row must be highlighted 542 */ 543 boolean isHighlightAddItem(); 544 545 /** 546 * Setter for the flag that allows for different styling of the add item group or row 547 * 548 * @param highlightAddItem 549 */ 550 void setHighlightAddItem(boolean highlightAddItem); 551 552 /** 553 * Indicates that a button will be rendered that allows the user to add blank lines to the collection 554 * 555 * <p> 556 * The button will be added separately from the collection items. The default add line wil not be rendered. The 557 * action of the button will call the controller, add the blank line to the collection and do a component refresh. 558 * </p> 559 * 560 * @return boolean 561 */ 562 boolean isRenderAddBlankLineButton(); 563 564 /** 565 * Setter for the flag indicating that the add blank line button must be rendered 566 * 567 * @param renderAddBlankLineButton 568 */ 569 void setRenderAddBlankLineButton(boolean renderAddBlankLineButton); 570 571 /** 572 * The add blank line {@link Action} field rendered when renderAddBlankLineButton is true 573 * 574 * @return boolean 575 */ 576 Action getAddBlankLineAction(); 577 578 /** 579 * Setter for the add blank line {@link Action} field 580 * 581 * @param addBlankLineAction 582 */ 583 void setAddBlankLineAction(Action addBlankLineAction); 584 585 /** 586 * Indicates the add line placement 587 * 588 * <p> 589 * Valid values are 'TOP' or 'BOTTOM'. The default is 'TOP'. When the value is 'BOTTOM' the blank line will be 590 * added 591 * to the end of the collection. 592 * </p> 593 * 594 * @return the add blank line action placement 595 */ 596 String getAddLinePlacement(); 597 598 /** 599 * Setter for the add line placement 600 * 601 * @param addLinePlacement add line placement string 602 */ 603 void setAddLinePlacement(String addLinePlacement); 604 605 /** 606 * Indicates whether the save line actions should be rendered 607 * 608 * @return boolean 609 */ 610 boolean isRenderSaveLineActions(); 611 612 /** 613 * Setter for the flag indicating whether the save actions should be rendered 614 * 615 * @param renderSaveLineActions 616 */ 617 void setRenderSaveLineActions(boolean renderSaveLineActions); 618 619 /** 620 * Indicates that a add action should be rendered and that the add group be displayed in a model dialog. 621 * 622 * @return boolean true if add should be through model dialog, false if not 623 */ 624 boolean isAddWithDialog(); 625 626 /** 627 * @see CollectionGroup#isAddWithDialog() 628 */ 629 void setAddWithDialog(boolean addWithDialog); 630 631 /** 632 * The {@link Action} that will be displayed that will open the add line group in a dialog. 633 * 634 * @return Action 635 */ 636 Action getAddWithDialogAction(); 637 638 /** 639 * @see CollectionGroup#getAddWithDialogAction() 640 */ 641 void setAddWithDialogAction(Action addViaLightBoxAction); 642 643 /** 644 * Dialog group to use for the add line when {@link CollectionGroup#isAddWithDialog()} is true. 645 * 646 * <p>If dialog group is not set by add with dialog is true, a default dialog group will be created.</p> 647 * 648 * <p>The add line items and actions are still used as usual, unless the items and footer items have been 649 * explicity set in the dialog group</p> 650 * 651 * @return dialog group instance for add line 652 */ 653 DialogGroup getAddLineDialog(); 654 655 /** 656 * @see CollectionGroup#getAddLineDialog() 657 */ 658 void setAddLineDialog(DialogGroup addLineDialog); 659 660 /** 661 * Gets useServerPaging, the flag that indicates whether server side paging is enabled. Defaults to false. 662 * 663 * @return true if server side paging is enabled. 664 */ 665 boolean isUseServerPaging(); 666 667 /** 668 * Sets useServerPaging, the flag indicating whether server side paging is enabled. 669 * 670 * @param useServerPaging the useServerPaging value to set 671 */ 672 void setUseServerPaging(boolean useServerPaging); 673 674 int getPageSize(); 675 676 void setPageSize(int pageSize); 677 678 /** 679 * Gets the displayStart, the index of the first item to display on the page (assuming useServerPaging is enabled). 680 * 681 * <p>if this field has not been set, the returned value will be -1</p> 682 * 683 * @return the index of the first item to display, or -1 if unset 684 */ 685 int getDisplayStart(); 686 687 /** 688 * Sets the displayStart, the index of the first item to display on the page (assuming useServerPaging is enabled). 689 * 690 * @param displayStart the displayStart to set 691 */ 692 void setDisplayStart(int displayStart); 693 694 /** 695 * Gets the displayLength, the number of items to display on the page (assuming useServerPaging is enabled). 696 * 697 * <p>if this field has not been set, the returned value will be -1</p> 698 * 699 * @return the number of items to display on the page, or -1 if unset 700 */ 701 int getDisplayLength(); 702 703 /** 704 * Sets the displayLength, the number of items to display on the page (assuming useServerPaging is enabled). 705 * 706 * @param displayLength the displayLength to set 707 */ 708 void setDisplayLength(int displayLength); 709 710 /** 711 * Gets the number of un-filtered elements from the model collection. 712 * 713 * <p>if this field has not been set, the returned value will be -1</p> 714 * 715 * @return the filtered collection size, or -1 if unset 716 */ 717 int getFilteredCollectionSize(); 718 719 /** 720 * Sets the number of un-filtered elements from the model collection. 721 * 722 * <p>This value is used for display and rendering purposes, it has no effect on the model collection</p> 723 * 724 * @param filteredCollectionSize the filtered collection size 725 */ 726 void setFilteredCollectionSize(int filteredCollectionSize); 727 728 /** 729 * @see org.kuali.rice.krad.uif.component.Component#completeValidation 730 */ 731 void completeValidation(ValidationTrace tracer); 732 733 /** 734 * Indicates that an edit action should be rendered and that the edit group be displayed in a model dialog. 735 * 736 * @return boolean true if edit should be through model dialog, false if not 737 */ 738 public boolean isEditWithDialog(); 739 740 /** 741 * @see CollectionGroup#isEditWithDialog() 742 */ 743 public void setEditWithDialog(boolean editWithDialog); 744 745 /** 746 * Indicates that a custom edit line dialog is provided by the user. 747 * 748 * @return boolean true if custom edit line dialog 749 */ 750 public boolean isCustomEditLineDialog(); 751 752 /** 753 * @see org.kuali.rice.krad.uif.container.CollectionGroup#isCustomEditLineDialog() 754 */ 755 public void setCustomEditLineDialog(boolean customEditLineDialog); 756 757 /** 758 * Dialog group prototype to use to create the edit line dialog when {@link CollectionGroup#isEditWithDialog()} 759 * is true. 760 * 761 * <p>If not specified a default prototype edit line dialog will be created with the items from the collection.</p> 762 * 763 * @return dialog group prototype for edit line 764 */ 765 public DialogGroup getEditLineDialogPrototype(); 766 767 /** 768 * @see CollectionGroup#getEditLineDialogPrototype() 769 */ 770 public void setEditLineDialogPrototype(DialogGroup editLineDialogPrototype); 771 772 /** 773 * The {@link Action} that will be displayed that will open the edit line group in a dialog. 774 * 775 * @return Action 776 */ 777 public Action getEditWithDialogActionPrototype(); 778 779 /** 780 * @see CollectionGroup#getEditWithDialogActionPrototype() 781 */ 782 public void setEditWithDialogActionPrototype(Action editWithDialogActionPrototype); 783 784 /** 785 * The {@link Action} that will be displayed within the edit line group in a dialog. 786 * 787 * @return Action 788 */ 789 public Action getEditInDialogSaveActionPrototype(); 790 791 /** 792 * @see CollectionGroup#getEditInDialogSaveActionPrototype() 793 */ 794 public void setEditInDialogSaveActionPrototype(Action editInDialogSaveActionPrototype); 795 796 /** 797 * List of dialog groups that are configured for a line in the collection. 798 * 799 * @return list of dialog group instances 800 */ 801 public List<DialogGroup> getLineDialogs(); 802 803 /** 804 * @see CollectionGroup#getLineDialogs() 805 */ 806 public void setLineDialogs(List<DialogGroup> dialogGroups); 807 808 }