001/**
002 * Copyright 2005-2018 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.krad.uif.container;
017
018import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
019import org.kuali.rice.krad.uif.component.BindingInfo;
020import org.kuali.rice.krad.uif.component.Component;
021import org.kuali.rice.krad.uif.component.ComponentSecurity;
022import org.kuali.rice.krad.uif.component.DataBinding;
023import org.kuali.rice.krad.uif.element.Action;
024import org.kuali.rice.krad.uif.element.Message;
025import org.kuali.rice.krad.uif.view.View;
026import org.kuali.rice.krad.uif.widget.QuickFinder;
027
028import java.util.List;
029
030/**
031 * Interface representing an editable collection within a view. 
032 * 
033 * @author Kuali Rice Team (rice.collab@kuali.org)
034 */
035public interface CollectionGroup extends Group, DataBinding {
036
037    /**
038     * Sets a reference in the context map for all nested components in the collection group
039     * instance, and sets selected collection path and id data attributes on nested actions of this group.
040     */
041    void pushCollectionGroupToReference();
042
043    /**
044     * New collection lines are handled in the framework by maintaining a map on
045     * the form. The map contains as a key the collection name, and as value an
046     * instance of the collection type. An entry is created here for the
047     * collection represented by the <code>CollectionGroup</code> if an instance
048     * is not available (clearExistingLine will force a new instance). The given
049     * model must be a subclass of <code>UifFormBase</code> in order to find the
050     * Map.
051     *
052     * @param model Model instance that contains the new collection lines Map
053     * @param clearExistingLine boolean that indicates whether the line should be set to a
054     * new instance if it already exists
055     */
056    void initializeNewCollectionLine(View view, Object model, CollectionGroup collectionGroup,
057            boolean clearExistingLine);
058
059    /**
060     * Object class the collection maintains. Used to get dictionary information
061     * in addition to creating new instances for the collection when necessary
062     *
063     * @return collection object class
064     */
065    Class<?> getCollectionObjectClass();
066
067    /**
068     * Setter for the collection object class
069     *
070     * @param collectionObjectClass
071     */
072    void setCollectionObjectClass(Class<?> collectionObjectClass);
073
074    /**
075     * Setter for the collections property name
076     *
077     * @param propertyName
078     */
079    void setPropertyName(String propertyName);
080
081    /**
082     * Action fields that should be rendered for each collection line. Example
083     * line action is the delete action
084     *
085     * @return line action fields
086     */
087    List<? extends Component> getLineActions();
088
089    /**
090     * Setter for the line action fields list
091     *
092     * @param lineActions
093     */
094    void setLineActions(List<? extends Component> lineActions);
095
096    /**
097     * Indicates whether the action column for the collection should be rendered
098     *
099     * @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}