001 /**
002 * Copyright 2005-2014 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 */
016 package org.kuali.rice.krad.uif.container;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.rice.krad.datadictionary.parse.BeanTag;
020 import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute;
021 import org.kuali.rice.krad.datadictionary.parse.BeanTags;
022 import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
023 import org.kuali.rice.krad.uif.UifConstants;
024 import org.kuali.rice.krad.uif.component.Component;
025 import org.kuali.rice.krad.uif.element.Header;
026 import org.kuali.rice.krad.uif.lifecycle.ViewLifecycle;
027 import org.kuali.rice.krad.uif.util.BreadcrumbItem;
028 import org.kuali.rice.krad.uif.util.LifecycleElement;
029 import org.kuali.rice.krad.uif.util.PageBreadcrumbOptions;
030 import org.kuali.rice.krad.uif.view.FormView;
031 import org.kuali.rice.krad.uif.view.View;
032
033 import java.util.ArrayList;
034 import java.util.List;
035
036 /**
037 * A PageGroup represents a page of a View.
038 *
039 * <p>
040 * PageGroups should only be used with a View component. The contain the main content that will be seen by the
041 * user using the View. Like all other groups, PageGroup can contain items, headers and footers. Pages also
042 * have their own BreadcrumbItem.
043 * </p>
044 *
045 * @author Kuali Rice Team (rice.collab@kuali.org)
046 */
047 @BeanTags({@BeanTag(name = "page-bean", parent = "Uif-Page"),
048 @BeanTag(name = "disclosure-page-bean", parent = "Uif-Disclosure-Page"),
049 @BeanTag(name = "documentPage-bean", parent = "Uif-DocumentPage"),
050 @BeanTag(name = "inquiryPage-bean", parent = "Uif-InquiryPage"),
051 @BeanTag(name = "lookupPage-bean", parent = "Uif-LookupPage"),
052 @BeanTag(name = "maintenancePage-bean", parent = "Uif-MaintenancePage")})
053 public class PageGroupBase extends GroupBase implements PageGroup {
054 private static final long serialVersionUID = 7571981300587270274L;
055
056 private boolean autoFocus = false;
057
058 private PageBreadcrumbOptions breadcrumbOptions;
059 private BreadcrumbItem breadcrumbItem;
060 private boolean stickyFooter;
061 private String formPostUrl;
062
063
064 /**
065 * {@inheritDoc}
066 */
067 @Override
068 public void performInitialization(Object model) {
069 super.performInitialization(model);
070
071 //check to see if one of the items is a page, if so throw an exception
072 for (Component item : this.getItems()) {
073 if (item != null && item instanceof PageGroup) {
074 throw new RuntimeException("The page with id='"
075 + this.getId()
076 + "' contains a page with id='"
077 + item.getId()
078 + "'. Nesting a page within a page is not allowed since only one "
079 + "page's content can be shown on the View "
080 + "at a time. This may have been caused by possible misuse of the singlePageView flag (when "
081 + "this flag is true, items set on the View become items of the single page. Instead use "
082 + "the page property on the View to set the page being used).");
083 }
084 }
085
086 breadcrumbOptions.setupBreadcrumbs(model);
087 }
088
089 /**
090 * {@inheritDoc}
091 */
092 @Override
093 public void performFinalize(Object model, LifecycleElement parent) {
094 if (StringUtils.isBlank(this.getWrapperTag())) {
095 this.setWrapperTag(UifConstants.WrapperTags.MAIN);
096 }
097
098 super.performFinalize(model, parent);
099
100 this.addDataAttribute(UifConstants.DataAttributes.ROLE, UifConstants.RoleTypes.PAGE);
101
102 String prefixScript = "";
103 if (this.getOnDocumentReadyScript() != null) {
104 prefixScript = this.getOnDocumentReadyScript();
105 }
106
107 View view = ViewLifecycle.getView();
108 if (view instanceof FormView && ((FormView) view).isValidateClientSide()) {
109 this.setOnDocumentReadyScript(prefixScript + "\nsetupPage(true);");
110 } else {
111 this.setOnDocumentReadyScript(prefixScript + "\nsetupPage(false);");
112 }
113
114 breadcrumbOptions.finalizeBreadcrumbs(model, this, breadcrumbItem);
115 }
116
117 /**
118 * {@inheritDoc}
119 */
120 @Override
121 public List<String> getAdditionalTemplates() {
122 List<String> additionalTemplates = super.getAdditionalTemplates();
123
124 Header viewHeader = ViewLifecycle.getView().getHeader();
125 if (viewHeader != null) {
126 if (additionalTemplates.isEmpty()) {
127 additionalTemplates = new ArrayList<String>();
128 }
129 additionalTemplates.add(viewHeader.getTemplate());
130 }
131
132 return additionalTemplates;
133 }
134
135 /**
136 * {@inheritDoc}
137 */
138 @Override
139 public List<BreadcrumbItem> getHomewardPathBreadcrumbs() {
140 return breadcrumbOptions == null ? null : breadcrumbOptions.getHomewardPathBreadcrumbs();
141 }
142
143 /**
144 * {@inheritDoc}
145 */
146 @Override
147 public List<BreadcrumbItem> getPreViewBreadcrumbs() {
148 return breadcrumbOptions == null ? null : breadcrumbOptions.getPreViewBreadcrumbs();
149 }
150
151 /**
152 * {@inheritDoc}
153 */
154 @Override
155 public List<BreadcrumbItem> getPrePageBreadcrumbs() {
156 return breadcrumbOptions == null ? null : breadcrumbOptions.getPrePageBreadcrumbs();
157 }
158
159 /**
160 * {@inheritDoc}
161 */
162 @Override
163 public List<BreadcrumbItem> getBreadcrumbOverrides() {
164 return breadcrumbOptions == null ? null : breadcrumbOptions.getBreadcrumbOverrides();
165 }
166
167 /**
168 * {@inheritDoc}
169 */
170 @Override
171 @BeanTagAttribute(name = "autoFocus")
172 public boolean isAutoFocus() {
173 return this.autoFocus;
174 }
175
176 /**
177 * {@inheritDoc}
178 */
179 @Override
180 public void setAutoFocus(boolean autoFocus) {
181 this.autoFocus = autoFocus;
182 }
183
184 /**
185 * {@inheritDoc}
186 */
187 @Override
188 @BeanTagAttribute(name = "breadcrumbOptions", type = BeanTagAttribute.AttributeType.SINGLEBEAN)
189 public PageBreadcrumbOptions getBreadcrumbOptions() {
190 return breadcrumbOptions;
191 }
192
193 /**
194 * {@inheritDoc}
195 */
196 @Override
197 public void setBreadcrumbOptions(PageBreadcrumbOptions breadcrumbOptions) {
198 this.breadcrumbOptions = breadcrumbOptions;
199 }
200
201 /**
202 * {@inheritDoc}
203 */
204 @Override
205 @BeanTagAttribute(name = "breadcrumbItem", type = BeanTagAttribute.AttributeType.SINGLEBEAN)
206 public BreadcrumbItem getBreadcrumbItem() {
207 return breadcrumbItem;
208 }
209
210 /**
211 * {@inheritDoc}
212 */
213 @Override
214 public void setBreadcrumbItem(BreadcrumbItem breadcrumbItem) {
215 this.breadcrumbItem = breadcrumbItem;
216 }
217
218 /**
219 * {@inheritDoc}
220 */
221 @Override
222 @BeanTagAttribute(name = "stickyFooter")
223 public boolean isStickyFooter() {
224 return stickyFooter;
225 }
226
227 /**
228 * {@inheritDoc}
229 */
230 @Override
231 public void setStickyFooter(boolean stickyFooter) {
232 this.stickyFooter = stickyFooter;
233
234 if (this.getFooter() != null) {
235 this.getFooter().addDataAttribute(UifConstants.DataAttributes.STICKY_FOOTER, Boolean.toString(
236 stickyFooter));
237 }
238 }
239
240 /**
241 * {@inheritDoc}
242 */
243 @Override
244 public void completeValidation(ValidationTrace tracer) {
245 tracer.addBean(this);
246
247 // Checks that no invalid items are present
248 for (int i = 0; i < getItems().size(); i++) {
249 if (PageGroup.class.isAssignableFrom(getItems().get(i).getClass())
250 || NavigationGroup.class.isAssignableFrom(getItems().get(i).getClass())) {
251 String currentValues[] = {"item(" + i + ").class =" + getItems().get(i).getClass()};
252 tracer.createError("Items in PageGroup cannot be PageGroup or NaviagtionGroup", currentValues);
253 }
254 }
255
256 super.completeValidation(tracer.getCopy());
257 }
258
259 /**
260 * {@inheritDoc}
261 */
262 @Override
263 @BeanTagAttribute(name = "formPostUrl")
264 public String getFormPostUrl() {
265 return formPostUrl;
266 }
267
268 /**
269 * {@inheritDoc}
270 */
271 @Override
272 public void setFormPostUrl(String formPostUrl) {
273 this.formPostUrl = formPostUrl;
274 }
275
276 }