1 /**
2 * Copyright 2005-2012 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.util;
17
18 import org.kuali.rice.krad.datadictionary.parse.BeanTag;
19 import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute;
20 import org.kuali.rice.krad.datadictionary.parse.BeanTags;
21 import org.kuali.rice.krad.datadictionary.uif.UifDictionaryBeanBase;
22 import org.kuali.rice.krad.uif.field.MessageField;
23
24 /**
25 * ColumnCalculationInfo is used to specify which columns and what types of calculations are performed on those columns
26 * of table collection. This functionality can only be used when the dataTables plugin is being used
27 * (richTable.render="true" for TableLayoutManager)
28 */
29 @BeanTags({@BeanTag(name = "columnCalculationInfo", parent = "Uif-ColumnCalculationInfo"),
30 @BeanTag(name = "columnCalculationInfo-sum", parent = "Uif-ColumnCalculationInfo-Sum"),
31 @BeanTag(name = "columnCalculationInfo-average", parent = "Uif-ColumnCalculationInfo-Average"),
32 @BeanTag(name = "columnCalculationInfo-max", parent = "Uif-ColumnCalculationInfo-Max"),
33 @BeanTag(name = "columnCalculationInfo-min", parent = "Uif-ColumnCalculationInfo-Min")})
34 public class ColumnCalculationInfo extends UifDictionaryBeanBase {
35 private Integer columnNumber;
36 private String propertyName;
37
38 private boolean showTotal;
39 private boolean showPageTotal;
40 private boolean showGroupTotal;
41
42 private MessageField totalField;
43 private MessageField pageTotalField;
44 private MessageField groupTotalFieldPrototype;
45
46 private String calculationFunctionName;
47 private String calculationFunctionExtraData;
48
49 private boolean calculateOnKeyUp;
50 private boolean recalculateTotalClientside;
51
52 /**
53 * Gets the column number. This should not be set through configuration as it is overridden by the
54 * propertyName's caclculated column number. <b>Do not set through xml configuration</b>
55 *
56 * @return columnNumber to perform calculations on
57 */
58 @BeanTagAttribute(name = "columnNumber")
59 public Integer getColumnNumber() {
60 return columnNumber;
61 }
62
63 /**
64 * Sets the column number. <b>Do not set through xml configuration</b>
65 *
66 * @param columnNumber
67 */
68 public void setColumnNumber(Integer columnNumber) {
69 this.columnNumber = columnNumber;
70 }
71
72 /**
73 * Gets showTotal. showTotal shows/calculates the total field when true, otherwise it is not rendered.
74 *
75 * @return true if showing the total, false otherwise.
76 */
77 @BeanTagAttribute(name = "showTotal")
78 public boolean isShowTotal() {
79 return showTotal;
80 }
81
82 /**
83 * Sets showTotal. showTotal shows/calculates the total field when true, otherwise it is not rendered.
84 *
85 * @param showTotal
86 */
87 public void setShowTotal(boolean showTotal) {
88 this.showTotal = showTotal;
89 }
90
91 /**
92 * Gets showTotal. showTotal shows/calculates the total field when true, otherwise it is not rendered.
93 *
94 * @return true if showing the page total, false otherwise.
95 */
96 @BeanTagAttribute(name = "showPageTotal")
97 public boolean isShowPageTotal() {
98 return showPageTotal;
99 }
100
101 /**
102 * Sets showPageTotal. showPageTotal shows/calculates the total field for the page when true (and only
103 * when the table actually has pages), otherwise it is not rendered.
104 *
105 * @param showPageTotal
106 */
107 public void setShowPageTotal(boolean showPageTotal) {
108 this.showPageTotal = showPageTotal;
109 }
110
111 /**
112 * Gets showGroupTotal. showGroupTotal shows/calculates the total field for each grouping when true (and only
113 * when the table actually has grouping turned on), otherwise it is not rendered.
114 *
115 * @return true if showing the group total, false otherwise.
116 */
117 @BeanTagAttribute(name = "showGroupTotal")
118 public boolean isShowGroupTotal() {
119 return showGroupTotal;
120 }
121
122 /**
123 * Sets showGroupTotal. showGroupTotal shows/calculates the total field for each grouping when true (and only
124 * when the table actually has grouping turned on), otherwise it is not rendered.
125 *
126 * @param showGroupTotal
127 */
128 public void setShowGroupTotal(boolean showGroupTotal) {
129 this.showGroupTotal = showGroupTotal;
130 }
131
132 /**
133 * Gets the js calculationFunctionName. This is the name of the js function to use in column calculations.
134 *
135 * <p>
136 * <b>This must be ONLY the function by name (no parenthesis or params)</b><br/>
137 * The actual js function declaration MUST take in an array of values as its first parameter. The values passed in
138 * will be all the relavant values for the calculation. Optionally, the function can also take a second parameter
139 * which can be specified by calculationFunctionExtraData. This parameter can take any valid javascript value
140 * (integer, string, JSON object, etc). In either case, the values parameter MUST be the first parameter.
141 * </p>
142 *
143 * @return calculatinoFunctionName to call for column calculations in js
144 */
145 @BeanTagAttribute(name = "calculationFunctionName")
146 public String getCalculationFunctionName() {
147 return calculationFunctionName;
148 }
149
150 /**
151 * Sets the calculationFunctionName to call when doing column calculations
152 *
153 * @param calculationFunctionName
154 */
155 public void setCalculationFunctionName(String calculationFunctionName) {
156 this.calculationFunctionName = calculationFunctionName;
157 }
158
159 /**
160 * Gets the totalField. This field is the field which holds the total for the column and specifies its label.
161 * This SHOULD NOT BE SET except by the base bean (in MOST cases).
162 *
163 * @return the totalField
164 */
165 @BeanTagAttribute(name = "totalField", type = BeanTagAttribute.AttributeType.SINGLEBEAN)
166 public MessageField getTotalField() {
167 return totalField;
168 }
169
170 /**
171 * Sets the totalField. This SHOULD NOT BE SET except by the base bean (in MOST cases). Setting this property
172 * without the appropriate settings WILL break functionality.
173 *
174 * @param totalField
175 */
176 public void setTotalField(MessageField totalField) {
177 this.totalField = totalField;
178 }
179
180 /**
181 * Gets the pageTotalField. This field is the field which holds the pageTotal for the column
182 * and specifies its label. This SHOULD NOT BE SET except by the base bean (in MOST cases).
183 *
184 * @return the pageTotalField
185 */
186 @BeanTagAttribute(name = "pageTotalField", type = BeanTagAttribute.AttributeType.SINGLEBEAN)
187 public MessageField getPageTotalField() {
188 return pageTotalField;
189 }
190
191 /**
192 * Sets the pageTotalField. This SHOULD NOT BE SET except by the base bean (in MOST cases). Setting this property
193 * without the appropriate settings WILL break functionality.
194 *
195 * @param pageTotalField
196 */
197 public void setPageTotalField(MessageField pageTotalField) {
198 this.pageTotalField = pageTotalField;
199 }
200
201 /**
202 * Gets the groupTotalFieldPrototype. This field is copied and holds the groupTotal for the column
203 * and specifies its label. This SHOULD NOT BE SET except by the base bean (in MOST cases).
204 *
205 * @return the groupTotalFieldPrototype
206 */
207 @BeanTagAttribute(name = "groupTotalFieldPrototype", type = BeanTagAttribute.AttributeType.SINGLEBEAN)
208 public MessageField getGroupTotalFieldPrototype() {
209 return groupTotalFieldPrototype;
210 }
211
212 /**
213 * Sets the groupTotalFieldPrototype. This SHOULD NOT BE SET except by the base bean (in MOST cases).
214 * Setting this property without the appropriate settings WILL break functionality.
215 *
216 * @param groupTotalFieldPrototype
217 */
218 public void setGroupTotalFieldPrototype(MessageField groupTotalFieldPrototype) {
219 this.groupTotalFieldPrototype = groupTotalFieldPrototype;
220 }
221
222 /**
223 * If true, the column is calculated when the user enters a character on each key up. There is a small delay
224 * built in to prevent calculations from being fired for each key stroke.
225 *
226 * @return true if calculated the column on key up, false if calculating on change (default)
227 */
228 @BeanTagAttribute(name = "calculationOnKeyUp")
229 public boolean isCalculateOnKeyUp() {
230 return calculateOnKeyUp;
231 }
232
233 /**
234 * Sets calculateOnKeyUp which controls the type of handler used
235 *
236 * @param calculateOnKeyUp
237 */
238 public void setCalculateOnKeyUp(boolean calculateOnKeyUp) {
239 this.calculateOnKeyUp = calculateOnKeyUp;
240 }
241
242 /**
243 * When set to false, calculations will not be fired for the totalField client-side. This ONLY effects the
244 * totalField. If page and group totals are still shown, they will (and can only) be calculated client-side.
245 *
246 * <p>
247 * To use this particular feature: set this to false, and use springEL in the totalField's message.messageText
248 * to get a pre-calculated total from a field on the form. This will be refreshed when the table is refreshed,
249 * but will not be updated by client-side interactions - used for complex or special calculation mechanisms
250 * that may require server only information.
251 * </p>
252 *
253 * @return true if calculating the totalField client-side, false otherwise
254 */
255 @BeanTagAttribute(name = "recalculateTotalClientside")
256 public boolean isRecalculateTotalClientside() {
257 return recalculateTotalClientside;
258 }
259
260 /**
261 * Set the recalculateTotalClientside flag
262 *
263 * @param recalculateTotalClientside
264 */
265 public void setRecalculateTotalClientside(boolean recalculateTotalClientside) {
266 this.recalculateTotalClientside = recalculateTotalClientside;
267 }
268
269 /**
270 * This specifies extra data to be sent to the calculation function. This can be any valid javascript value
271 * (number, string, JSON - for passing multiple settings, etc).
272 * <br/>
273 * <b>The function specified by calculationFunctionName MUST take a second parameter when using this option.</b>
274 *
275 * @return the extra data to pass into the function specified by name in calculationFunctionName
276 */
277 @BeanTagAttribute(name = "calculationFunctionExtraData")
278 public String getCalculationFunctionExtraData() {
279 return calculationFunctionExtraData;
280 }
281
282 /**
283 * Sets the calculationFunctionExtraData which specifies additional data to pass into the calculationFunction.
284 *
285 * @param calculationFunctionExtraData
286 */
287 public void setCalculationFunctionExtraData(String calculationFunctionExtraData) {
288 this.calculationFunctionExtraData = calculationFunctionExtraData;
289 }
290
291 /**
292 * Get the propertyName of the field to do calculations. This field MUST exist as one of the fields
293 * of the collection. <b>This property must be set or an exception will be thrown.</b>
294 *
295 * @return propertyName of the field(the column) to do calculations on
296 */
297 @BeanTagAttribute(name = "propertyName")
298 public String getPropertyName() {
299 return propertyName;
300 }
301
302 /**
303 * Set the propertyName of the field to do calculations on
304 *
305 * @param propertyName
306 */
307 public void setPropertyName(String propertyName) {
308 this.propertyName = propertyName;
309 }
310 }