1 package org.kuali.ole.select.document.krad;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Map;
6
7 import org.apache.log4j.Logger;
8 import org.kuali.ole.module.purap.businessobject.options.DiscountTypeValuesFinder;
9 import org.kuali.ole.select.businessobject.OleInvoiceItem;
10 import org.kuali.ole.select.document.OleInvoiceDocument;
11 import org.kuali.ole.select.form.OLEInvoiceForm;
12 import org.kuali.rice.core.api.util.KeyValue;
13 import org.kuali.rice.kew.api.WorkflowDocument;
14 import org.kuali.rice.krad.uif.UifConstants;
15 import org.kuali.rice.krad.uif.UifPropertyPaths;
16 import org.kuali.rice.krad.uif.component.BindingInfo;
17 import org.kuali.rice.krad.uif.component.Component;
18 import org.kuali.rice.krad.uif.container.CollectionGroup;
19 import org.kuali.rice.krad.uif.container.Container;
20 import org.kuali.rice.krad.uif.container.Group;
21 import org.kuali.rice.krad.uif.element.Action;
22 import org.kuali.rice.krad.uif.field.Field;
23 import org.kuali.rice.krad.uif.field.FieldGroup;
24 import org.kuali.rice.krad.uif.layout.CollectionLayoutManager;
25 import org.kuali.rice.krad.uif.layout.LayoutManagerBase;
26 import org.kuali.rice.krad.uif.util.ComponentUtils;
27 import org.kuali.rice.krad.uif.util.ObjectPropertyUtils;
28 import org.kuali.rice.krad.uif.view.View;
29 import org.kuali.rice.krad.uif.widget.Pager;
30 import org.kuali.rice.krad.uif.widget.QuickFinder;
31
32 public class OleInvoiceItemsLayout extends LayoutManagerBase implements
33 CollectionLayoutManager {
34
35 private static final long serialVersionUID = 5289870490845303915L;
36 private static final Logger LOG = Logger
37 .getLogger(OleInvoiceItemsLayout.class);
38
39 @SuppressWarnings("unchecked")
40 private static final List<KeyValue> DISCOUNT_KEY_VALUES = new DiscountTypeValuesFinder()
41 .getKeyValues();
42
43 private List<OleInvoiceItemsLine> itemLines = new ArrayList<OleInvoiceItemsLine>();
44 private int filteredLines;
45 private int displayedLines;
46 private int totalLines;
47 private boolean foreignCurrency;
48
49 private int pageSize;
50 private int currentPage;
51 private Pager pager;
52 private QuickFinder relinkQuickfinder;
53 private Group rowDetailsGroup;
54 private String actionRefreshId;
55
56 private List<Component> components = new ArrayList<Component>();
57
58 private void setUpPager(OLEInvoiceForm form, CollectionGroup collection) {
59 if (pageSize == 0 || pager == null)
60 return;
61
62 int total = 0;
63 for (OleInvoiceItem item : ObjectPropertyUtils
64 .<List<OleInvoiceItem>> getPropertyValue(form, collection
65 .getBindingInfo().getBindingPath()))
66 if ("Qty".equals(item.getItemType().getItemTypeDescription()))
67 total++;
68 totalLines = total;
69
70 String extensionKey = collection.getId() + ".currentPage";
71 Map<String, Object> extension = form.getExtensionData();
72 int lastPage = total / pageSize + (total % pageSize == 0 ? 0 : 1);
73 Integer currentPage = (Integer) extension.get(extensionKey);
74 if (currentPage == null)
75 currentPage = 1;
76
77 String pageNumber = form.getPageNumber();
78 if (pageNumber != null)
79 switch (pageNumber) {
80 case UifConstants.PageRequest.FIRST:
81 currentPage = 1;
82 break;
83 case UifConstants.PageRequest.LAST:
84 currentPage = lastPage;
85 break;
86 case UifConstants.PageRequest.NEXT:
87 currentPage = Math.min(currentPage + 1, lastPage);
88 break;
89 case UifConstants.PageRequest.PREV:
90 currentPage = Math.max(currentPage - 1, 1);
91 break;
92 default:
93 try {
94 currentPage = Math.max(1,
95 Math.min(lastPage, Integer.parseInt(pageNumber)));
96 } catch (NumberFormatException e) {
97 LOG.warn("Invalid page number " + form.getPageNumber(), e);
98 }
99 break;
100 }
101 form.setPageNumber(null);
102
103 pager.setCurrentPage(currentPage);
104 pager.setNumberOfPages(lastPage);
105 this.currentPage = currentPage;
106
107 synchronized (extension) {
108 extension.put(extensionKey, currentPage);
109 }
110 }
111
112 private Group getRowDetails(OLEInvoiceForm form, String idSuffix,
113 int lineIndex, CollectionGroup collection, View view,
114 String bindingPath, OleInvoiceItem item) {
115 String lineId = collection.getBaseId() + idSuffix;
116 String selectedRowDetails = form.getSelectRowDetails();
117 String extensionKey = lineId + ".rowDetails";
118 Map<String, Object> extension = form.getExtensionData();
119 if (lineId.equals(selectedRowDetails))
120 synchronized (extension) {
121 if (form.isShowSelectedRowDetails())
122 extension.put(extensionKey, true);
123 else
124 extension.remove(extensionKey);
125 }
126
127 if (!Boolean.TRUE.equals(extension.get(extensionKey))) {
128 if (LOG.isDebugEnabled())
129 LOG.debug("Omitting row details " + extensionKey + ", "
130 + form.getSelectRowDetails() + " "
131 + form.isShowSelectedRowDetails());
132 return null;
133 }
134
135 if (LOG.isDebugEnabled())
136 LOG.debug("Including row details " + extensionKey + ", "
137 + form.getSelectRowDetails() + " "
138 + form.isShowSelectedRowDetails());
139
140 Group rowDetails = ComponentUtils.copy(rowDetailsGroup, idSuffix);
141 rowDetails.setFieldBindByNamePrefix(bindingPath);
142 ComponentUtils.updateContextForLine(rowDetails, item, lineIndex,
143 idSuffix);
144 view.getViewHelperService().spawnSubLifecyle(view, form, rowDetails,
145 collection, null, UifConstants.ViewPhases.INITIALIZE);
146
147 synchronized (components) {
148 components.add(rowDetails);
149 }
150
151 return rowDetails;
152 }
153
154 @Override
155 public void performApplyModel(View view, Object model, Container container) {
156 OLEInvoiceForm form = (OLEInvoiceForm) model;
157 CollectionGroup collection = (CollectionGroup) container;
158
159 setUpPager(form, collection);
160
161 if (LOG.isDebugEnabled())
162 LOG.debug(collection
163 + " ro is "
164 + collection.isReadOnly()
165 + " "
166 + ((CollectionGroup) collection).isRenderAddLine()
167 + " "
168 + ((CollectionGroup) collection)
169 .isRenderAddBlankLineButton());
170
171 foreignCurrency = ((OleInvoiceDocument) ((OLEInvoiceForm) model)
172 .getDocument()).isForeignCurrencyFlag();
173
174 super.performApplyModel(view, model, container);
175 }
176
177 @Override
178 public void buildLine(View view, Object model,
179 CollectionGroup collectionGroup, List<Field> lineFields,
180 List<FieldGroup> subCollectionFields, String bindingPath,
181 List<Action> actions, String idSuffix, Object currentLine,
182 int lineIndex) {
183
184 OleInvoiceItem item = (OleInvoiceItem) currentLine;
185 if (!"Qty".equals(item.getItemType().getItemTypeDescription())) {
186 filteredLines++;
187 return;
188 }
189
190 if (currentPage > 0
191 && (lineIndex < (currentPage - 1) * pageSize || lineIndex >= currentPage
192 * pageSize))
193 return;
194
195 OLEInvoiceForm form = (OLEInvoiceForm) model;
196
197 BindingInfo bi = new BindingInfo();
198 bi.setBindByNamePrefix(bindingPath
199 .startsWith(UifPropertyPaths.NEW_COLLECTION_LINES) ? bindingPath
200 : view.getDefaultBindingObjectPath() + '.' + bindingPath);
201
202 OleInvoiceItemsLine line = new OleInvoiceItemsLine();
203 line.setLineNumber(lineIndex);
204 line.setLineId(collectionGroup.getBaseId() + idSuffix);
205 line.setBindPath(bi.getBindByNamePrefix());
206 line.setItem(item);
207 line.setRowDetails(getRowDetails(form, idSuffix, lineIndex,
208 collectionGroup, view, bindingPath, item));
209
210 line.setActions(actions);
211
212 WorkflowDocument workflowDocument = form.getDocument()
213 .getDocumentHeader().getWorkflowDocument();
214 if ((workflowDocument.isInitiated() || workflowDocument.isSaved() || workflowDocument
215 .isEnroute())
216 && (item.getItemTitleId() == null || item
217 .getTempPurchaseOrderIdentifier() == null)) {
218 QuickFinder relinkQuickfinder = ComponentUtils.copy(
219 this.relinkQuickfinder, idSuffix);
220 relinkQuickfinder.updateFieldConversions(bi);
221 relinkQuickfinder.updateLookupParameters(bi);
222 relinkQuickfinder.updateReferencesToRefresh(bi);
223 ComponentUtils.updateContextForLine(relinkQuickfinder, currentLine,
224 lineIndex, idSuffix);
225 view.getViewHelperService().spawnSubLifecyle(view, model,
226 relinkQuickfinder, collectionGroup, null,
227 UifConstants.ViewPhases.INITIALIZE);
228 synchronized (components) {
229 components.add(relinkQuickfinder);
230 }
231 line.setRelinkQuickfinder(relinkQuickfinder);
232 }
233
234 if (actionRefreshId != null)
235 for (Action action : actions) {
236 action.setRefreshId(actionRefreshId);
237 if (LOG.isDebugEnabled())
238 LOG.debug("Action " + action.getId() + " refresh ID = "
239 + action.getRefreshId() + ", jump to "
240 + action.getJumpToIdAfterSubmit());
241 }
242
243 synchronized (components) {
244 components.addAll(actions);
245 }
246
247 synchronized (itemLines) {
248 itemLines.add(line);
249 }
250
251 displayedLines++;
252 }
253
254 public List<KeyValue> getDiscountKeyValues() {
255 return DISCOUNT_KEY_VALUES;
256 }
257
258 @Override
259 public FieldGroup getSubCollectionFieldGroupPrototype() {
260 return null;
261 }
262
263 public int getPageSize() {
264 return pageSize;
265 }
266
267 public void setPageSize(int pageSize) {
268 this.pageSize = pageSize;
269 }
270
271 public int getFilteredLines() {
272 return filteredLines;
273 }
274
275 public int getDisplayedLines() {
276 return displayedLines;
277 }
278
279 public int getTotalLines() {
280 return totalLines;
281 }
282
283 public List<OleInvoiceItemsLine> getItemLines() {
284 return itemLines;
285 }
286
287 public boolean isForeignCurrency() {
288 return foreignCurrency;
289 }
290
291 public void setForeignCurrency(boolean foreignCurrency) {
292 this.foreignCurrency = foreignCurrency;
293 }
294
295 public QuickFinder getRelinkQuickfinder() {
296 return relinkQuickfinder;
297 }
298
299 public void setRelinkQuickfinder(QuickFinder relinkQuickfinder) {
300 this.relinkQuickfinder = relinkQuickfinder;
301 }
302
303 public Group getRowDetailsGroup() {
304 return rowDetailsGroup;
305 }
306
307 public void setRowDetailsGroup(Group rowDetailsGroup) {
308 this.rowDetailsGroup = rowDetailsGroup;
309 }
310
311 public Pager getPager() {
312 return pager;
313 }
314
315 public void setPager(Pager pager) {
316 this.pager = pager;
317 }
318
319 public String getActionRefreshId() {
320 return actionRefreshId;
321 }
322
323 public void setActionRefreshId(String actionRefreshId) {
324 this.actionRefreshId = actionRefreshId;
325 }
326
327 @Override
328 public List<Component> getComponentPrototypes() {
329 List<Component> rv = super.getComponentPrototypes();
330 rv.add(rowDetailsGroup);
331 rv.add(relinkQuickfinder);
332 return rv;
333 }
334
335 @Override
336 public List<Component> getComponentsForLifecycle() {
337 List<Component> rv = super.getComponentsForLifecycle();
338 if (components != null)
339 rv.addAll(components);
340 if (pager != null)
341 rv.add(pager);
342 return rv;
343 }
344
345 @Override
346 protected <T> void copyProperties(T copy) {
347 super.copyProperties(copy);
348
349 OleInvoiceItemsLayout c = (OleInvoiceItemsLayout) copy;
350 c.pageSize = pageSize;
351 c.actionRefreshId = actionRefreshId;
352 if (rowDetailsGroup != null)
353 c.setRowDetailsGroup(ComponentUtils.copy(rowDetailsGroup));
354 if (relinkQuickfinder != null)
355 c.setRelinkQuickfinder(ComponentUtils.copy(relinkQuickfinder));
356 if (pager != null)
357 c.setPager(ComponentUtils.copy(pager));
358 }
359
360 }
361