Author: DavidK Date: 2010-02-24 20:27:00 +0100 (Wed, 24 Feb 2010) New Revision: 1855 Modified: trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/FilePlanningBean.java trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/debug/DebugBean.java trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/planningrel/PlanningModalBean.java trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/messages_cs.properties trunk/server/webServer2/SpringSource/cz/elvys/webServer/bl/api/elvysrel/PlanDocumentBL.java trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/elvysrel/PlanDocumentBLImpl.java trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/elvysrel/Rectangle.java trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/planning/api/PlanningModalBL.java trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/planning/impl/PlanningModalBLImpl.java trunk/server/webServer2/WebContent/secured/elvysrel/planDocuments.xhtml trunk/server/webServer2/WebContent/styles/planning/planDocuments.css Log: planning (not-modal part of) component upgraded- 1) disabling rectangles that are whole in past 2) modification improved - new dateFrom can be in past, but not further in past than original dateFrom Modified: trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/FilePlanningBean.java =================================================================== --- trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/FilePlanningBean.java 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/FilePlanningBean.java 2010-02-24 19:27:00 UTC (rev 1855) @@ -624,6 +624,9 @@ List<PanelOfRect> planningsOfAllPanels = new ArrayList<PanelOfRect>(); + // prepare now date - point of date when entering planning component + Date now = new Date(); + // Timelines -> Planning Rectangles // iterate through each panel for (int i=0; i< panelsToShow.size(); i++) { @@ -641,7 +644,8 @@ oneSlot, segmentFrom, segmentTo, - componentWidth); + componentWidth, + now); RectangleLine newLine = new RectangleLine(); newLine.setLineId(lineId); newLine.setRectangleList(rectList); Modified: trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/debug/DebugBean.java =================================================================== --- trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/debug/DebugBean.java 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/debug/DebugBean.java 2010-02-24 19:27:00 UTC (rev 1855) @@ -167,6 +167,7 @@ Date begin = new Date(); Date end = calendar.getTime(); + // planning panel1 File file1 = (File)HibUtils.findByID(Document.class, documentId1); if (file1 != null && file1 instanceof Document) { @@ -181,7 +182,6 @@ 1, layout.getId(), 1, - null, begin, end, new Date(), @@ -203,7 +203,6 @@ 1, layout.getId(), 2, - null, begin, end, new Date(), @@ -227,7 +226,6 @@ 2, layout.getId(), 3, - null, begin, end, new Date(), @@ -249,7 +247,6 @@ 2, layout.getId(), 4, - null, begin, end, new Date(), Modified: trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/planningrel/PlanningModalBean.java =================================================================== --- trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/planningrel/PlanningModalBean.java 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/planningrel/PlanningModalBean.java 2010-02-24 19:27:00 UTC (rev 1855) @@ -275,6 +275,8 @@ if (permittedTypes.size() >= 0) { // TODO nejakou heuristiku dodelat formContentType = permittedTypes.get(0); + // string representation of selectedContentType + selectedTypeOfPlanning = formContentType.getType(); innerBean = PlugablePlanningTypeBeanUtils.getInstance().chooseActiveByType(formContentType.getType(), companyId); innerBean.initPlanningModalSpecBean(formContentType); // no former planning @@ -430,17 +432,30 @@ // list of validation messages List<ValidationMessageHolder> messages; try { - messages = bl.store(formName, - panelPl, - panelOrd, - layoutID, - positionID, - modifying == true ? formerTimeline : null, - formShowStart, - formShowEnd, - nowDate, - formValues, - modifyingUser); + if (modifying) { + messages = bl.modify(formName, + panelPl, + panelOrd, + layoutID, + positionID, + formerTimeline, + formShowStart, + formShowEnd, + nowDate, + formValues, + modifyingUser); + } else { + messages = bl.store(formName, + panelPl, + panelOrd, + layoutID, + positionID, + formShowStart, + formShowEnd, + nowDate, + formValues, + modifyingUser); + } } catch (Exception e) { String message = ERR_NOT_STORED; log.error(message,e); Modified: trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/messages_cs.properties =================================================================== --- trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/messages_cs.properties 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/messages_cs.properties 2010-02-24 19:27:00 UTC (rev 1855) @@ -23,6 +23,7 @@ elvys.plan.modal.crossdates=Datum "od" mus\u00ED b\u00FDt p\u0159ed datumem "do". elvys.plan.modal.inpast=Datum "od" nesm\u00ED b\u00FDt v minulosti. +elvys.plan.modal.modifying.before.last=P\u0159i modifikaci pl\u00E1nov\u00E1n\u00ED nem\u016F\u017Ee b\u00FDt \u010Das za\u010D\u00E1tku v\u00EDce v minulosti ne\u017E p\u016Fvodn\u00ED \u010Das za\u010D\u00E1tku\: {0} elvys.plan.modal.conflict.begin.inside=Kolize se za\u010D\u00E1tkem jin\u00E9ho pl\u00E1nov\u00E1n\u00ED\: {0}. elvys.plan.modal.conflict.end.inside=Kolize s koncem jin\u00E9ho pl\u00E1nov\u00E1n\u00ED\: {0}. elvys.plan.modal.conflict.embrace=Pl\u00E1nov\u00E1n\u00ED je uvnit\u0159 jin\u00E9ho pl\u00E1nov\u00E1n\u00ED. Start\: {0}; Konec\: {1}. Modified: trunk/server/webServer2/SpringSource/cz/elvys/webServer/bl/api/elvysrel/PlanDocumentBL.java =================================================================== --- trunk/server/webServer2/SpringSource/cz/elvys/webServer/bl/api/elvysrel/PlanDocumentBL.java 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/SpringSource/cz/elvys/webServer/bl/api/elvysrel/PlanDocumentBL.java 2010-02-24 19:27:00 UTC (rev 1855) @@ -22,9 +22,19 @@ * @param scheduleFrom start of interval * @param scheduleTo end of interval * @param componentWidth width of the planning component + * @param now point of date when entering planning component * @return */ - public List<Rectangle> prepareRectanglesForOneLayoutPosition(Integer panelPl, Integer panelOrd, Integer layoutPos, Integer layoutId, List<Timeline> timelines, Date scheduleFrom, Date scheduleTo, int componentWidth) throws ExecutionException; + public List<Rectangle> prepareRectanglesForOneLayoutPosition( + Integer panelPl, + Integer panelOrd, + Integer layoutPos, + Integer layoutId, + List<Timeline> timelines, + Date scheduleFrom, + Date scheduleTo, + int componentWidth, + Date now) throws ExecutionException; /** * Prepares time axis labels Modified: trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/elvysrel/PlanDocumentBLImpl.java =================================================================== --- trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/elvysrel/PlanDocumentBLImpl.java 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/elvysrel/PlanDocumentBLImpl.java 2010-02-24 19:27:00 UTC (rev 1855) @@ -38,7 +38,8 @@ List<Timeline> timelines, Date scheduleFrom, Date scheduleTo, - int componentWidth) throws ExecutionException { + int componentWidth, + Date now) throws ExecutionException { List<Rectangle> result = new ArrayList<Rectangle>(); if(timelines.size() == 0) { @@ -57,7 +58,8 @@ gapStart, gapEnd, componentWidth, - null); + null, + now); result.add(wholePeriod); return result; } @@ -80,7 +82,8 @@ gapStart, timelines.get(0).getShowStart(), widthBefore, - null); + null, + now); result.add(spaceBeforeFirst); } @@ -122,7 +125,8 @@ realStart, realEnd, width, - frc); + frc, + now); result.add(plannedDocument); if (i!= last){ @@ -139,7 +143,8 @@ timelines.get(i).getShowEnd(), timelines.get(i+1).getShowStart(), widthBetween, - null); + null, + now); result.add(spaceBetween); } } @@ -162,7 +167,8 @@ timelines.get(last).getShowEnd(), gapEnd, widthAfter, - null); + null, + now); result.add(spaceAfter); } Modified: trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/elvysrel/Rectangle.java =================================================================== --- trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/elvysrel/Rectangle.java 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/elvysrel/Rectangle.java 2010-02-24 19:27:00 UTC (rev 1855) @@ -38,6 +38,8 @@ private Date lastModificationDate; // describes CONTENT. If it's null, then deals with free rectangle FrameContent frameContent = null; + // whether is whole in the past - then cannot be modified + private Boolean wholeInPast = true; // some other data Timeline origTimeline; @@ -165,8 +167,16 @@ public void setLastModificationDate(Date lastModificationDate) { this.lastModificationDate = lastModificationDate; } + public Boolean getWholeInPast() { + return wholeInPast; + } + public void setWholeInPast(Boolean wholeInPast) { + this.wholeInPast = wholeInPast; + } + + /** * TODO do i need both? timeline and content?? * Don't be afraid of this constructor. There's nothing bad :). Just info, what is needed by planning.. @@ -192,7 +202,8 @@ Date realStart, Date realEnd, int width, - FrameContent content) throws ClassCastException { + FrameContent content, + Date now) throws ClassCastException { this.panelPl = panelPl; this.panelOrd = panelOrd; @@ -211,6 +222,12 @@ this.realFromText = realFrom == null? "-" : makeStringFromDate(realFrom); this.realToText = realTo == null? "-" : makeStringFromDate(realTo); + // is rectangle whole in past? + if (this.to.before(now)) { + wholeInPast = true; + } else { + wholeInPast = false; + } this.frameContent = content; if (frameContent != null) { Modified: trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/planning/api/PlanningModalBL.java =================================================================== --- trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/planning/api/PlanningModalBL.java 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/planning/api/PlanningModalBL.java 2010-02-24 19:27:00 UTC (rev 1855) @@ -71,15 +71,44 @@ Session sess, Integer modifyingTimelineId) throws ExecuteException; + /** - * Stores planning. Stores either new planning or modified planning. + * Updates planning in DB. + * @param formName name of the form + * @param panelPl identifier of panel #1 + * @param panelOrd identifier of panel #2 + * @param layoutId identifier of layout + * @param positionId id of position + * @param oldTimeline old timeline (which is to be modified) + * @param valueDateFrom new dateFrom value + * @param valueDateTo new dateTo value + * @param now now timestamp (is not really now, is from the past) + * @param formValues type-specific values + * @param modifyingUser User object of modifying user + * @return List of validation messages + * @throws ExecuteException exception + */ + public List<ValidationMessageHolder> modify(String formName, + Integer panelPl, + Integer panelOrd, + Integer layoutId, + Integer positionId, + Timeline oldTimeline, + Date valueDateFrom, + Date valueDateTo, + Date now, + FrameContent formValues, + User modifyingUser) throws ExecuteException; + + + /** + * Stores new planning. * It depends on attributte oldFrameContent. * @param formName name of the formular (can be null, only for correctness of validation messages) * @param panelPl identifier of panel 1) * @param panelOrd identifier of panel 2) * @param layoutID id of the actual layout * @param positionID id of the actual position - * @param oldTimeline old frame content- null if you're not modifiyng planning (i.e. new planning) * @param valueDateFrom value of the form - planning from * @param valueDateTo value of the form - planning to * @param now point in time when planning started (e.g. showing planning component or sth. like this) @@ -93,7 +122,6 @@ Integer panelOrd, Integer layoutID, Integer positionID, - Timeline oldTimeline, Date valueDateFrom, Date valueDateTo, Date now, Modified: trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/planning/impl/PlanningModalBLImpl.java =================================================================== --- trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/planning/impl/PlanningModalBLImpl.java 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/planning/impl/PlanningModalBLImpl.java 2010-02-24 19:27:00 UTC (rev 1855) @@ -4,7 +4,6 @@ import java.util.Date; import java.util.List; -import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; @@ -78,14 +77,43 @@ return messages; } - // validate dateFrom is not in the past (comparing to the now parameter) - if (valueDateFrom.before(now)) { - ValidationMessageHolder message = new ValidationMessageHolder(); - message.setMessageRef("elvys.plan.modal.inpast"); - message.setComponentId(formDateStartId); - messages.add(message); + if (oldTimeline != null) { + // modifying + // validate dateFrom is not in past AND is not older than last dateFrom + Date oldDateFrom = oldTimeline.getShowStart(); + if (oldDateFrom.before(now)) { + // old dateFrom is already in past + // new dateFrom can be in past (but not before old dateFrom + if (valueDateFrom.before(oldDateFrom)) { + ValidationMessageHolder message = new ValidationMessageHolder(); + message.setMessageRef("elvys.plan.modal.modifying.before.last"); + message.setComponentId(formDateStartId); + message.setParams(new Object[]{oldDateFrom}); + messages.add(message); + } + } else { + // old dateFrom is not in past + // new dateFrom cannot be in past + if (valueDateFrom.before(now)) { + ValidationMessageHolder message = new ValidationMessageHolder(); + message.setMessageRef("elvys.plan.modal.inpast"); + message.setComponentId(formDateStartId); + messages.add(message); + } + } + + } else { + // creating new + // validate dateFrom is not in the past (comparing to the now parameter) + if (valueDateFrom.before(now)) { + ValidationMessageHolder message = new ValidationMessageHolder(); + message.setMessageRef("elvys.plan.modal.inpast"); + message.setComponentId(formDateStartId); + messages.add(message); + } } + // validate crossing of dates if (!valueDateFrom.before(valueDateTo)) { ValidationMessageHolder message = new ValidationMessageHolder(); @@ -251,94 +279,116 @@ } + public List<ValidationMessageHolder> modify(String formName, + Integer panelPl, + Integer panelOrd, + Integer layoutId, + Integer positionId, + Timeline oldTimeline, + Date valueDateFrom, + Date valueDateTo, + Date now, + FrameContent formValues, + User modifyingUser) throws ExecuteException { + + // 1) validate + List<ValidationMessageHolder> messages = validate(formName, + panelPl, panelOrd, layoutId, positionId, oldTimeline, valueDateFrom, + valueDateTo, now, formValues); + if (messages != null && messages.size() > 0) { + return messages; + } + + // 2) update in DB + // updating + Session sess = InitSessionFactory.getInstance().getCurrentSession(); + Transaction tx = HibUtils.startTx(sess); + + try { + FrameContent oldFrameContent = oldTimeline.getFrameContent(); + // delete old content + sess.delete(oldFrameContent); + // save new content, with new ID (I couldn't found any way to create new FrameContent with the same ID :( ) + sess.save(formValues); + // update reference and field values in old Timeline object + oldTimeline.setFrameContent(formValues); + oldTimeline.setShowStart(valueDateFrom); + oldTimeline.setShowEnd(valueDateTo); + oldTimeline.setUser(modifyingUser); + oldTimeline.setModified(new Date()); + sess.update(oldTimeline); + + // TODO do db udelat nejaky trigger. nebo aspon zacistovaci metodu, ktera to po ulozeni jeste jednou projede a kdyztak smaze vlozeny Timeline + tx.commit(); + } catch(Exception e) { + tx.rollback(); + String message = ERR_UPDATING_FAILED; + throw new Error(message,e); + } + + // return empty list of validation, everything went ok + List<ValidationMessageHolder> emptyList = new ArrayList<ValidationMessageHolder>(); + return emptyList; + } + + + + + @Override public List<ValidationMessageHolder> store(String formName, Integer panelPl, Integer panelOrd, Integer layoutID, Integer positionID, - Timeline oldTimeline, Date valueDateFrom, Date valueDateTo, Date now, FrameContent formValues, User modifyingUser) throws ExecuteException { - // validation + // 1) validate List<ValidationMessageHolder> messages = validate(formName, - panelPl, panelOrd, layoutID, positionID, oldTimeline, valueDateFrom, + panelPl, panelOrd, layoutID, positionID, null, valueDateFrom, valueDateTo, now, formValues); if (messages != null && messages.size()>0) { return messages; } - if (oldTimeline == null) { - // Not updating - creating new - Session sess = InitSessionFactory.getInstance().getCurrentSession(); - Transaction tx = HibUtils.startTx(sess); - - // TODO do db udelat nejaky trigger. nebo aspon zacistovaci metodu, ktera to po ulozeni jeste jednou projede a kdyztak smaze vlozeny Timeline - try { - sess.save(formValues); - } catch(Exception e) { - tx.rollback(); - throw new Error("",e); - } - Timeline timeline = new Timeline(); - timeline.setFrameContent(formValues); - timeline.setId(formValues.getId()); - - Panel panel = cbl.getPanelById(panelPl, panelOrd, sess); - - Layout layout = new Layout(); - layout.setId(layoutID); - timeline.setLayout(layout); - timeline.setPanel(panel); - timeline.setLayoutPos(positionID.byteValue()); - timeline.setShowStart(valueDateFrom); - timeline.setShowEnd(valueDateTo); - timeline.setUser(modifyingUser); - timeline.setModified(new Date()); - try { - sess.save(timeline); - tx.commit(); - } catch(Exception e) { - tx.rollback(); - String message = ERR_STORING_FAILED; - throw new Error(message,e); - } - } else { - // updating - Session sess = InitSessionFactory.getInstance().getCurrentSession(); - Transaction tx = sess.getTransaction(); - try { - tx.begin(); - } catch(HibernateException e) { - throw new Error("error occured when initializing hibernate session",e); - } - - try { - FrameContent oldFrameContent = oldTimeline.getFrameContent(); - // delete old content - sess.delete(oldFrameContent); - // save new content, with new ID (I couldn't found any way to create new FrameContent with the same ID :( ) - sess.save(formValues); - // update reference and field values in old Timeline object - oldTimeline.setFrameContent(formValues); - oldTimeline.setShowStart(valueDateFrom); - oldTimeline.setShowEnd(valueDateTo); - oldTimeline.setUser(modifyingUser); - oldTimeline.setModified(new Date()); - sess.update(oldTimeline); - - // TODO do db udelat nejaky trigger. nebo aspon zacistovaci metodu, ktera to po ulozeni jeste jednou projede a kdyztak smaze vlozeny Timeline - tx.commit(); - } catch(Exception e) { - tx.rollback(); - String message = ERR_UPDATING_FAILED; - throw new Error(message,e); - } + // 2) create new planning + Session sess = InitSessionFactory.getInstance().getCurrentSession(); + Transaction tx = HibUtils.startTx(sess); + + // TODO do db udelat nejaky trigger. nebo aspon zacistovaci metodu, ktera to po ulozeni jeste jednou projede a kdyztak smaze vlozeny Timeline + try { + sess.save(formValues); + } catch(Exception e) { + tx.rollback(); + throw new Error("",e); } + Timeline timeline = new Timeline(); + timeline.setFrameContent(formValues); + timeline.setId(formValues.getId()); + Panel panel = cbl.getPanelById(panelPl, panelOrd, sess); + + Layout layout = new Layout(); + layout.setId(layoutID); + timeline.setLayout(layout); + timeline.setPanel(panel); + timeline.setLayoutPos(positionID.byteValue()); + timeline.setShowStart(valueDateFrom); + timeline.setShowEnd(valueDateTo); + timeline.setUser(modifyingUser); + timeline.setModified(new Date()); + try { + sess.save(timeline); + tx.commit(); + } catch(Exception e) { + tx.rollback(); + String message = ERR_STORING_FAILED; + throw new Error(message,e); + } + // return empty list of validation, everything went ok List<ValidationMessageHolder> emptyList = new ArrayList<ValidationMessageHolder>(); return emptyList; Modified: trunk/server/webServer2/WebContent/secured/elvysrel/planDocuments.xhtml =================================================================== --- trunk/server/webServer2/WebContent/secured/elvysrel/planDocuments.xhtml 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/WebContent/secured/elvysrel/planDocuments.xhtml 2010-02-24 19:27:00 UTC (rev 1855) @@ -217,11 +217,13 @@ styleClass="sch-body-line-id"/> <a4j:repeat id="L3" value="#{rectangles.rectangleList}" var="rect"> <span class="rectangle_outer" style="width: #{rect.width}px;"> + + <!-- VACANT NOT IN PAST --> <a4j:commandLink id="VRL" reRender="planningModalForm_content" onclick="Richfaces.showModalPanel('planningModalForm_modal')" - rendered="#{rect.frameContent == null}" + rendered="#{rect.frameContent == null and !rect.wholeInPast}" onmouseover="moveVac(this.id)" > <h:panelGroup id="VR" @@ -244,6 +246,15 @@ </div> <h:panelGroup id="VPR"></h:panelGroup> </rich:toolTip> + + <!-- VACANT IN PAST --> + <h:panelGroup + id="VR_Past" + rendered="#{rect.frameContent == null and rect.wholeInPast}" + styleClass="rectangle grey" + style="width: #{rect.width}px;"/> + + <!-- OCCUPIED --> <a4j:commandLink id="ORL" reRender="planningModalForm_content" Modified: trunk/server/webServer2/WebContent/styles/planning/planDocuments.css =================================================================== --- trunk/server/webServer2/WebContent/styles/planning/planDocuments.css 2010-02-24 18:36:02 UTC (rev 1854) +++ trunk/server/webServer2/WebContent/styles/planning/planDocuments.css 2010-02-24 19:27:00 UTC (rev 1855) @@ -106,7 +106,9 @@ a .grey { background-color: #BBBBBB; } a:hover .grey { background-color: #C2C2C2; } a:link { text-decoration: none; color: black; } +.grey { background-color: #BBBBBB; } + /* tooltips */ .short_tooltip { width: 200px; }