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