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.layout; 17 18 import java.util.List; 19 import java.util.Map; 20 import java.util.Set; 21 22 import org.kuali.rice.krad.uif.component.Component; 23 import org.kuali.rice.krad.uif.container.Group; 24 import org.kuali.rice.krad.uif.element.Action; 25 import org.kuali.rice.krad.uif.element.Label; 26 import org.kuali.rice.krad.uif.field.Field; 27 import org.kuali.rice.krad.uif.field.FieldGroup; 28 import org.kuali.rice.krad.uif.util.ColumnCalculationInfo; 29 import org.kuali.rice.krad.uif.widget.RichTable; 30 31 /** 32 * Layout manager that works with {@code CollectionGroup} components and renders the collection as a 33 * Table. 34 * 35 * @author Kuali Rice Team (rice.collab@kuali.org) 36 */ 37 public interface TableLayoutManager extends CollectionLayoutManager { 38 39 /** 40 * Indicates the number of columns that should make up one row of data. 41 * 42 * <p>If the item count is greater than the number of columns, a new row will 43 * be created to render the remaining items (and so on until all items are 44 * placed).</p> 45 * 46 * <p>Note this does not include any generated columns by the layout manager, 47 * so the final column count could be greater (if label fields are 48 * separate).</p> 49 * 50 * @return int number of columns 51 */ 52 int getNumberOfColumns(); 53 54 /** 55 * @see TableLayoutManager#getNumberOfColumns() 56 */ 57 void setNumberOfColumns(int numberOfColumns); 58 59 /** 60 * Indicates whether the number of columns for the table data should match 61 * the number of fields given in the container's items list (so that each 62 * field takes up one column without wrapping), this overrides the configured 63 * numberOfColumns. 64 * 65 * <p>If set to true during the initialize phase the number of columns will be 66 * set to the size of the container's field list, if false the configured 67 * number of columns is used</p> 68 * 69 * @return true if the column count should match the container's 70 * field count, false to use the configured number of columns 71 */ 72 boolean isSuppressLineWrapping(); 73 74 /** 75 * @see TableLayoutManager#isSuppressLineWrapping() 76 */ 77 void setSuppressLineWrapping(boolean suppressLineWrapping); 78 79 /** 80 * Indicates whether alternating row styles should be applied. 81 * 82 * <p>Indicator to layout manager templates to apply alternating row styles. 83 * See the configured template for the actual style classes used</p> 84 * 85 * @return true if alternating styles should be applied, false if 86 * all rows should have the same style 87 */ 88 boolean isApplyAlternatingRowStyles(); 89 90 /** 91 * @see TableLayoutManager#isApplyAlternatingRowStyles() 92 */ 93 void setApplyAlternatingRowStyles(boolean applyAlternatingRowStyles); 94 95 /** 96 * Indicates whether the manager should default the cell widths. 97 * 98 * <p>If true, the manager will set the cell width by equally dividing by the 99 * number of columns</p> 100 * 101 * @return true if default cell widths should be applied, false if 102 * no defaults should be applied 103 */ 104 boolean isApplyDefaultCellWidths(); 105 106 /** 107 * @see TableLayoutManager#isApplyDefaultCellWidths() 108 */ 109 void setApplyDefaultCellWidths(boolean applyDefaultCellWidths); 110 111 /** 112 * List of styles for each row. 113 * 114 * <p>Each entry in the list gives the style for the row with the same index. This style will be added to 115 * the <tr> tag when the table rows are rendered in the grid.tag. This is used to store the styles for newly added lines 116 * and other special cases like the add item row.</p> 117 * 118 * @return list of styles for the rows 119 */ 120 List<String> getRowCssClasses(); 121 122 /** 123 * @see TableLayoutManager#getRowCssClasses() 124 */ 125 void setRowCssClasses(List<String> rowCssClasses); 126 127 /** 128 * List of data attributes for each row. 129 * 130 * <p>Each entry in the list gives the data attributes for the row with the same index. These data attributes will be added to 131 * the <tr> tag when the table rows are rendered in the grid.tag. This is used to store the data attributes for newly added lines 132 * and other special cases like the add item row.</p> 133 * 134 * @return list of styles for the rows 135 */ 136 List<String> getRowDataAttributes(); 137 138 /** 139 * @see TableLayoutManager#getRowDataAttributes() 140 */ 141 void setRowDataAttributes(List<String> rowDataAttributes); 142 143 /** 144 * Indicates whether the short label for the collection field should be used as the table header 145 * or the regular label 146 * 147 * @return true if short label should be used, false if long label should be used 148 */ 149 boolean isUseShortLabels(); 150 151 /** 152 * Setter for the use short label indicator 153 * 154 * @param useShortLabels 155 */ 156 void setUseShortLabels(boolean useShortLabels); 157 158 /** 159 * Indicates whether the header should be repeated before each collection row. If false the 160 * header is only rendered at the beginning of the table 161 * 162 * @return true if header should be repeated, false if it should only be rendered once 163 */ 164 boolean isRepeatHeader(); 165 166 /** 167 * Setter for the repeat header indicator 168 * 169 * @param repeatHeader 170 */ 171 void setRepeatHeader(boolean repeatHeader); 172 173 /** 174 * {@code Label} instance to use as a prototype for creating the tables header fields. For each 175 * header field the prototype will be copied and adjusted as necessary 176 * 177 * @return Label instance to serve as prototype 178 */ 179 Label getHeaderLabelPrototype(); 180 181 /** 182 * Setter for the header field prototype 183 * 184 * @param headerLabelPrototype 185 */ 186 void setHeaderLabelPrototype(Label headerLabelPrototype); 187 188 /** 189 * List of {@code Label} instances that should be rendered to make up the tables header 190 * 191 * @return List of label field instances 192 */ 193 List<Label> getHeaderLabels(); 194 195 /** 196 * Indicates whether the sequence field should be rendered for the collection 197 * 198 * @return true if sequence field should be rendered, false if not 199 */ 200 boolean isRenderSequenceField(); 201 202 /** 203 * Setter for the render sequence field indicator 204 * 205 * @param renderSequenceField 206 */ 207 void setRenderSequenceField(boolean renderSequenceField); 208 209 /** 210 * Attribute name to use as sequence value. For each collection line the value of this field on 211 * the line will be retrieved and used as the sequence value 212 * 213 * @return sequence property name 214 */ 215 String getSequencePropertyName(); 216 217 /** 218 * Setter for the sequence property name 219 * 220 * @param sequencePropertyName 221 */ 222 void setSequencePropertyName(String sequencePropertyName); 223 224 /** 225 * Indicates whether the sequence field should be generated with the current line number 226 * 227 * <p> 228 * If set to true the sequence field prototype will be changed to a message field (if not 229 * already a message field) and the text will be set to the current line number 230 * </p> 231 * 232 * @return true if the sequence field should be generated from the line number, false if not 233 */ 234 boolean isGenerateAutoSequence(); 235 236 /** 237 * Setter for the generate auto sequence field 238 * 239 * @param generateAutoSequence 240 */ 241 void setGenerateAutoSequence(boolean generateAutoSequence); 242 243 /** 244 * {@code Field} instance to serve as a prototype for the sequence field. For each collection 245 * line this instance is copied and adjusted as necessary 246 * 247 * @return Attribute field instance 248 */ 249 Field getSequenceFieldPrototype(); 250 251 /** 252 * Setter for the sequence field prototype 253 * 254 * @param sequenceFieldPrototype 255 */ 256 void setSequenceFieldPrototype(Field sequenceFieldPrototype); 257 258 /** 259 * {@code FieldGroup} instance to serve as a prototype for the actions column. For each 260 * collection line this instance is copied and adjusted as necessary. Note the actual actions 261 * for the group come from the collection groups actions List 262 * (org.kuali.rice.krad.uif.container.CollectionGroup.getActions()). The FieldGroup prototype is 263 * useful for setting styling of the actions column and for the layout of the action fields. 264 * Note also the label associated with the prototype is used for the action column header 265 * 266 * @return GroupField instance 267 */ 268 FieldGroup getActionFieldPrototype(); 269 270 /** 271 * Setter for the action field prototype 272 * 273 * @param actionFieldPrototype 274 */ 275 void setActionFieldPrototype(FieldGroup actionFieldPrototype); 276 277 /** 278 * Indicates whether the add line should be rendered in a separate group, or as part of the 279 * table (first line) 280 * 281 * <p> 282 * When separate add line is enabled, the fields for the add line will be placed in the 283 * {@link #getAddLineGroup()}. This group can be used to configure the add line presentation. In 284 * addition to the fields, the header on the group (unless already set) will be set to 285 * {@link org.kuali.rice.krad.uif.container.CollectionGroup#getAddLabel()} and the add line 286 * actions will be placed into the group's footer. 287 * </p> 288 * 289 * @return true if add line should be separated, false if it should be placed into the table 290 */ 291 boolean isSeparateAddLine(); 292 293 /** 294 * Setter for the separate add line indicator 295 * 296 * @param separateAddLine 297 */ 298 void setSeparateAddLine(boolean separateAddLine); 299 300 /** 301 * List of {@link Field} instances that make up all the table's rows of data 302 * 303 * @return table body fields 304 */ 305 List<Field> getAllRowFields(); 306 307 /** 308 * List of {@link Field} instances that make us the table's first row of data 309 * 310 * @return list of field instances 311 */ 312 List<Field> getFirstRowFields(); 313 314 /** 315 * Widget associated with the table to add functionality such as sorting, paging, and export 316 * 317 * @return RichTable instance 318 */ 319 RichTable getRichTable(); 320 321 /** 322 * Setter for the rich table widget 323 * 324 * @param richTable 325 */ 326 void setRichTable(RichTable richTable); 327 328 /** 329 * @return the numberOfDataColumns 330 */ 331 int getNumberOfDataColumns(); 332 333 /** 334 * @param numberOfDataColumns the numberOfDataColumns to set 335 */ 336 void setNumberOfDataColumns(int numberOfDataColumns); 337 338 /** 339 * Gets a set of property names defining hidden columns. 340 * 341 * @return set of property names 342 * @see org.kuali.rice.krad.uif.widget.RichTable#getHiddenColumns() 343 */ 344 Set<String> getHiddenColumns(); 345 346 /** 347 * Setter for {@link #getHiddenColumns()}. 348 * 349 * @param hiddenColumns set of property names 350 */ 351 void setHiddenColumns(Set<String> hiddenColumns); 352 353 /** 354 * Gets a set of property names defining sortable columns. 355 * 356 * @return set of property names 357 * @see org.kuali.rice.krad.uif.widget.RichTable#getSortableColumns() 358 */ 359 Set<String> getSortableColumns(); 360 361 /** 362 * Setterfor {@link #getSortableColumns()}. 363 * 364 * @param sortableColumns set of property names 365 */ 366 void setSortableColumns(Set<String> sortableColumns); 367 368 /** 369 * Indicates the index of the action column 370 * 371 * @return the action column index 372 */ 373 int getActionColumnIndex(); 374 375 /** 376 * Indicates the actions column placement 377 * 378 * <p> 379 * Valid values are 'LEFT', 'RIGHT' or any valid number. The default is 'RIGHT' or '-1'. The 380 * column placement index takes all displayed columns, including sequence and selection columns, 381 * into account. 382 * </p> 383 * 384 * @return the action column placement 385 */ 386 String getActionColumnPlacement(); 387 388 /** 389 * Setter for the action column placement 390 * 391 * @param actionColumnPlacement action column placement string 392 */ 393 void setActionColumnPlacement(String actionColumnPlacement); 394 395 /** 396 * The row details info group to use when using a TableLayoutManager with the a richTable. 397 * 398 * <p> 399 * This group will be displayed when the user clicks the "Details" link/image on a row. This 400 * allows extra/long data to be hidden in table rows and then revealed during interaction with 401 * the table without the need to leave the page. Allows for any group content. 402 * </p> 403 * 404 * <p> 405 * Does not currently work with javascript required content. 406 * </p> 407 * 408 * @return rowDetailsGroup component 409 */ 410 Group getRowDetailsGroup(); 411 412 /** 413 * Set the row details info group 414 * 415 * @param rowDetailsGroup row details group 416 */ 417 void setRowDetailsGroup(Group rowDetailsGroup); 418 419 /** 420 * A list of all the columns to be calculated 421 * 422 * <p> 423 * The list must contain valid column indexes. The indexes takes all displayed columns into 424 * account. 425 * </p> 426 * 427 * @return the total columns list 428 */ 429 List<String> getColumnsToCalculate(); 430 431 /** 432 * Gets showTotal. showTotal shows/calculates the total field when true, otherwise it is not 433 * rendered. <br/> 434 * <b>Only used when renderOnlyLeftTotalLabels is TRUE, this overrides the 435 * ColumnConfigurationInfo setting. Otherwise, the ColumnConfigurationInfo setting takes 436 * precedence.</b> 437 * 438 * @return true if showing the total, false otherwise. 439 */ 440 boolean isShowTotal(); 441 442 /** 443 * Sets showTotal. showTotal shows/calculates the total field when true, otherwise it is not 444 * rendered. <br/> 445 * <b>Only used when renderOnlyLeftTotalLabels is TRUE, this overrides the 446 * ColumnConfigurationInfo setting. Otherwise, the ColumnConfigurationInfo setting takes 447 * precedence.</b> 448 * 449 * @param showTotal 450 */ 451 void setShowTotal(boolean showTotal); 452 453 /** 454 * Gets showTotal. showTotal shows/calculates the total field when true, otherwise it is not 455 * rendered. <br/> 456 * <b>Only used when renderOnlyLeftTotalLabels is TRUE, this overrides the 457 * ColumnConfigurationInfo setting. Otherwise, the ColumnConfigurationInfo setting takes 458 * precedence.</b> 459 * 460 * @return true if showing the page total, false otherwise. 461 */ 462 boolean isShowPageTotal(); 463 464 /** 465 * Sets showPageTotal. showPageTotal shows/calculates the total field for the page when true 466 * (and only when the table actually has pages), otherwise it is not rendered. <br/> 467 * <b>Only used when renderOnlyLeftTotalLabels is TRUE, this overrides the 468 * ColumnConfigurationInfo setting. Otherwise, the ColumnConfigurationInfo setting takes 469 * precedence.</b> 470 * 471 * @param showPageTotal 472 */ 473 void setShowPageTotal(boolean showPageTotal); 474 475 /** 476 * Gets showGroupTotal. showGroupTotal shows/calculates the total field for each grouping when 477 * true (and only when the table actually has grouping turned on), otherwise it is not rendered. <br/> 478 * <b>Only used when renderOnlyLeftTotalLabels is TRUE, this overrides the 479 * ColumnConfigurationInfo setting. Otherwise, the ColumnConfigurationInfo setting takes 480 * precedence.</b> 481 * 482 * @return true if showing the group total, false otherwise. 483 */ 484 boolean isShowGroupTotal(); 485 486 /** 487 * Sets showGroupTotal. showGroupTotal shows/calculates the total field for each grouping when 488 * true (and only when the table actually has grouping turned on), otherwise it is not rendered. <br/> 489 * <b>Only used when renderOnlyLeftTotalLabels is TRUE, this overrides the 490 * ColumnConfigurationInfo setting. Otherwise, the ColumnConfigurationInfo setting takes 491 * precedence.</b> 492 * 493 * @param showGroupTotal 494 */ 495 void setShowGroupTotal(boolean showGroupTotal); 496 497 /** 498 * The total label to use when renderOnlyLeftTotalLabels is TRUE for total. This label will 499 * appear in the left most column. 500 * 501 * @return the totalLabel 502 */ 503 Label getTotalLabel(); 504 505 /** 506 * Sets the total label to use when renderOnlyLeftTotalLabels is TRUE for total. 507 * 508 * @param totalLabel 509 */ 510 void setTotalLabel(Label totalLabel); 511 512 /** 513 * The pageTotal label to use when renderOnlyLeftTotalLabels is TRUE for total. This label will 514 * appear in the left most column. 515 * 516 * @return the totalLabel 517 */ 518 Label getPageTotalLabel(); 519 520 /** 521 * Sets the pageTotal label to use when renderOnlyLeftTotalLabels is TRUE for total. 522 * 523 * @param pageTotalLabel 524 */ 525 void setPageTotalLabel(Label pageTotalLabel); 526 527 /** 528 * The groupTotal label to use when renderOnlyLeftTotalLabels is TRUE. This label will appear in 529 * the left most column. 530 * 531 * @return the totalLabel 532 */ 533 Label getGroupTotalLabelPrototype(); 534 535 /** 536 * Sets the groupTotal label to use when renderOnlyLeftTotalLabels is TRUE. 537 * 538 * @param groupTotalLabelPrototype 539 */ 540 void setGroupTotalLabelPrototype(Label groupTotalLabelPrototype); 541 542 /** 543 * Gets the column calculations. This is a list of ColumnCalcuationInfo that when set provides 544 * calculations to be performed on the columns they specify. These calculations appear in the 545 * table's footer. This feature is only available when using richTable functionality. 546 * 547 * @return the columnCalculations to use 548 */ 549 List<ColumnCalculationInfo> getColumnCalculations(); 550 551 /** 552 * Sets the columnCalculations. 553 * 554 * @param columnCalculations 555 */ 556 void setColumnCalculations(List<ColumnCalculationInfo> columnCalculations); 557 558 /** 559 * When true, labels for the totals fields will only appear in the left most column. Showing of 560 * the totals is controlled by the settings on the TableLayoutManager itself when this property 561 * is true. 562 * 563 * @return true when rendering totals footer labels in the left-most column, false otherwise 564 */ 565 boolean isRenderOnlyLeftTotalLabels(); 566 567 /** 568 * Set the renderOnlyLeftTotalLabels flag for rendring total labels in the left-most column 569 * 570 * @param renderOnlyLeftTotalLabels 571 */ 572 void setRenderOnlyLeftTotalLabels(boolean renderOnlyLeftTotalLabels); 573 574 /** 575 * Gets the footer calculation components to be used by the layout. These are set by the 576 * framework and cannot be set directly. 577 * 578 * @return the list of components for the footer 579 */ 580 List<Component> getFooterCalculationComponents(); 581 582 /** 583 * Gets the list of property names to use for grouping. 584 * 585 * <p> 586 * When this property is set, grouping for this collection will be enabled and the lines of the 587 * collection will be grouped by the propertyName(s) supplied. Supplying multiple property names 588 * will cause the grouping to be on multiple fields and ordered alphabetically on 589 * "propetyValue1, propertyValue2" (this is also how the group title will display for each 590 * group). The property names supplied must be relative to the line, so #lp SHOULD NOT be used 591 * (it is assumed automatically). 592 * </p> 593 * 594 * @return propertyNames to group on 595 */ 596 List<String> getGroupingPropertyNames(); 597 598 /** 599 * Sets the list of property names to use for grouping. 600 * 601 * @param groupingPropertyNames 602 */ 603 void setGroupingPropertyNames(List<String> groupingPropertyNames); 604 605 /** 606 * Get the groupingTitle. The groupingTitle MUST contain a SpringEL expression to uniquely 607 * identify a group's line (ie it cannot be a static string because each group must be 608 * identified by some value). <b>This overrides groupingPropertyNames(if set) because it 609 * provides full control of grouping value used by the collection. SpringEL defined here must 610 * use #lp if referencing values of the line.</b> 611 * 612 * @return groupingTitle to be used 613 */ 614 String getGroupingTitle(); 615 616 /** 617 * Set the groupingTitle. This will throw an exception if the title does not contain a SpringEL 618 * expression. 619 * 620 * @param groupingTitle 621 */ 622 void setGroupingTitle(String groupingTitle); 623 624 /** 625 * Get the groupingPrefix. The groupingPrefix is used to prefix the generated title (not used 626 * when groupingTitle is set directly) when using groupingPropertyNames. 627 * 628 * @return String 629 */ 630 String getGroupingPrefix(); 631 632 /** 633 * Set the groupingPrefix. This is not used when groupingTitle is set directly. 634 * 635 * @param groupingPrefix 636 */ 637 void setGroupingPrefix(String groupingPrefix); 638 639 /** 640 * If true, all details will be opened by default when the table loads. Can only be used on 641 * tables that have row details setup. 642 * 643 * @return true if row details 644 */ 645 boolean isRowDetailsOpen(); 646 647 /** 648 * Set if row details should be open on table load 649 * 650 * @param rowDetailsOpen 651 */ 652 void setRowDetailsOpen(boolean rowDetailsOpen); 653 654 /** 655 * If true, the toggleAllDetailsAction will be shown. This button allows all details to be 656 * open/closed simultaneously. 657 * 658 * @return true if the action button to toggle all row details opened/closed 659 */ 660 boolean isShowToggleAllDetails(); 661 662 /** 663 * Set if the toggleAllDetailsAction should be shown 664 * 665 * @param showToggleAllDetails 666 */ 667 void setShowToggleAllDetails(boolean showToggleAllDetails); 668 669 /** 670 * The toggleAllDetailsAction action component used to toggle all row details open/closed. This 671 * property is set by the default configuration and should not be reset in most cases. 672 * 673 * @return Action component to use for the toggle action button 674 */ 675 Action getToggleAllDetailsAction(); 676 677 /** 678 * Set the toggleAllDetailsAction action component used to toggle all row details open/closed. 679 * This property is set by the default configuration and should not be reset in most cases. 680 * 681 * @param toggleAllDetailsAction 682 */ 683 void setToggleAllDetailsAction(Action toggleAllDetailsAction); 684 685 /** 686 * If true, when a row details open action is performed, it will get the details content from 687 * the server the first time it is opened. The methodToCall will be a component "refresh" call 688 * by default (this can be set on expandDetailsActionPrototype) and the additional action 689 * parameters sent to the server will be those set on the expandDetailsActionPrototype 690 * (lineIndex will be sent by default). 691 * 692 * @return true if ajax row details retrieval will be used 693 */ 694 boolean isAjaxDetailsRetrieval(); 695 696 /** 697 * Set if row details content should be retrieved fromt he server 698 * 699 * @param ajaxDetailsRetrieval 700 */ 701 void setAjaxDetailsRetrieval(boolean ajaxDetailsRetrieval); 702 703 /** 704 * The Action prototype used for the row details expand link. Should be set to 705 * "Uif-ExpandDetailsAction" or "Uif-ExpandDetailsImageAction". Properties can be configured to 706 * allow for different methodToCall and actionParameters to be set for ajax row details 707 * retrieval. 708 * 709 * @return the Action details link prototype 710 */ 711 Action getExpandDetailsActionPrototype(); 712 713 /** 714 * Gets the grouping column index 715 * 716 * @return the grouping column index 717 */ 718 int getGroupingColumnIndex(); 719 720 /** 721 * Set the expand details Action prototype link 722 * 723 * @param expandDetailsActionPrototype 724 */ 725 void setExpandDetailsActionPrototype(Action expandDetailsActionPrototype); 726 727 /** 728 * The row css classes for the rows of this layout 729 * 730 * <p> 731 * To set a css class on all rows, use "all" as a key. To set a class for even rows, use "even" 732 * as a key, for odd rows, use "odd". Use a one-based index to target a specific row by index. 733 * SpringEL can be used as a key and the expression will be evaluated; if evaluated to true, the 734 * class(es) specified will be applied. 735 * </p> 736 * 737 * @return a map which represents the css classes of the rows of this layout 738 */ 739 Map<String, String> getConditionalRowCssClasses(); 740 741 /** 742 * Set the conditionalRowCssClasses 743 * 744 * @param conditionalRowCssClasses 745 */ 746 void setConditionalRowCssClasses(Map<String, String> conditionalRowCssClasses); 747 748 /** 749 * Gets a list of column calculation components. 750 * 751 * @return list of column calculation components 752 */ 753 List<Component> getColumnCalculationComponents(); 754 755 }