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