From 7edf00326732a92a3edaf45967533655615739f6 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Wed, 23 Jul 2008 08:50:27 +0000 Subject: [PATCH] * Started implementation for resource schedule and assignment. --- zkwebui/.classpath | 2 + zkwebui/.tomcatplugin | 15 + .../src/org/adempiere/webui/Desktop.java | 2 + .../adempiere/webui/TimelineEventFeed.java | 127 +++++ .../org/adempiere/webui/panel/WSchedule.java | 143 ++++++ .../adempiere/webui/part/MultiTabPart.java | 2 +- .../webui/session/SessionContextListener.java | 9 +- .../adempiere/webui/window/InfoSchedule.java | 442 ++++++++++++++++++ zkwebui/WEB-INF/web.xml | 13 +- 9 files changed, 749 insertions(+), 6 deletions(-) create mode 100644 zkwebui/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java create mode 100644 zkwebui/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java create mode 100644 zkwebui/WEB-INF/src/org/adempiere/webui/window/InfoSchedule.java diff --git a/zkwebui/.classpath b/zkwebui/.classpath index 6334eea88a..4d88e20cc9 100644 --- a/zkwebui/.classpath +++ b/zkwebui/.classpath @@ -20,5 +20,7 @@ + + diff --git a/zkwebui/.tomcatplugin b/zkwebui/.tomcatplugin index 521ce15ab8..8b4febbece 100644 --- a/zkwebui/.tomcatplugin +++ b/zkwebui/.tomcatplugin @@ -53,5 +53,20 @@ /tools/lib/swingx-0.9.0.jar /tools/lib/xdoclet-1.2.3.jar /tools/lib/xercesImpl.jar + /zkwebui/WEB-INF/classes + /zkwebui/WEB-INF/lib/junit.jar + /zkwebui/WEB-INF/lib/timelinez.jar + /zkwebui/WEB-INF/lib/zcommon.jar + /zkwebui/WEB-INF/lib/zhtml.jar + /zkwebui/WEB-INF/lib/zk.jar + /zkwebui/WEB-INF/lib/zkex.jar + /zkwebui/WEB-INF/lib/zkmax.jar + /zkwebui/WEB-INF/lib/zkplus.jar + /zkwebui/WEB-INF/lib/zul.jar + C:/Users/Low Heng Sin/Applications/eclipse/plugins/org.junit_3.8.2.v200706111738/junit.jar + org.eclipse.jdt.junit.JUNIT_CONTAINER/3 + org.eclipse.jst.j2ee.internal.module.container + org.eclipse.jst.j2ee.internal.web.container + org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/C-_applications_apache-tomcat-5.5.26 diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/Desktop.java b/zkwebui/WEB-INF/src/org/adempiere/webui/Desktop.java index b3fdc42276..ce86e21c64 100644 --- a/zkwebui/WEB-INF/src/org/adempiere/webui/Desktop.java +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/Desktop.java @@ -43,6 +43,7 @@ import org.adempiere.webui.panel.SidePanel; import org.adempiere.webui.part.AbstractUIPart; import org.adempiere.webui.part.WindowContainer; import org.adempiere.webui.window.ADWindow; +import org.adempiere.webui.window.InfoSchedule; import org.compiere.model.MClient; import org.compiere.model.MMenu; import org.compiere.model.MQuery; @@ -500,6 +501,7 @@ public class Desktop extends AbstractUIPart implements MenuListener, Serializabl { // TODO: Schedule Info Panel // new org.compiere.apps.search.InfoSchedule (Env.getFrame(c), null, false); + new InfoSchedule(null, false); } else if (actionCommand.equals("InfoOrder") && AEnv.canAccessInfo("ORDER")) { diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java b/zkwebui/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java new file mode 100644 index 0000000000..cced24b922 --- /dev/null +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java @@ -0,0 +1,127 @@ +package org.adempiere.webui; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.adempiere.webui.component.ZkCssHelper; +import org.adempiere.webui.session.SessionContextListener; +import org.adempiere.webui.session.WebContext; +import org.compiere.model.MAssignmentSlot; +import org.compiere.model.ScheduleUtil; +import org.compiere.util.Env; +import org.zkforge.timeline.util.TimelineUtil; +import org.zkoss.web.fn.XMLFns; +import org.zkoss.xml.XMLs; + +public class TimelineEventFeed extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + WebContext ctx = (WebContext)req.getSession().getAttribute(SessionContextListener.SESSION_CTX); + if (ctx == null) { + return; + } else { + WebContext.setCurrentInstance(ctx); + } + + int resourceId = 0; + String resourceIdParam = req.getParameter("S_Resource_ID"); + if (resourceIdParam != null && resourceIdParam.trim().length() > 0) { + try { + resourceId = Integer.parseInt(resourceIdParam.trim()); + } catch (Exception e) { + return; + } + } else { + return; + } + + String uuid = req.getParameter("uuid"); + if (uuid == null || uuid.trim().length() == 0) return; + + Date date = null; + String dateParam = req.getParameter("date"); + if (dateParam != null && dateParam.trim().length() > 0) { + try { + date = DateFormat.getInstance().parse(dateParam); + } catch (ParseException e) { + return; + } + } else { + return; + } + + resp.setContentType("application/xml"); + ScheduleUtil m_model = new ScheduleUtil (Env.getCtx()); + + // Calculate Start Day + GregorianCalendar cal = new GregorianCalendar(); + cal.setTime(date); + cal.set(Calendar.HOUR, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.set(Calendar.DAY_OF_MONTH, 1); + Timestamp startDate = new Timestamp(cal.getTimeInMillis()); + // Calculate End Date + cal.add(Calendar.MONTH, 1); + Timestamp endDate = new Timestamp (cal.getTimeInMillis()); + + MAssignmentSlot[] mas = m_model.getAssignmentSlots (resourceId, startDate, endDate, null, true, null); + if (mas == null || mas.length == 0) return; + + StringBuffer xml = new StringBuffer(); + xml.append("").append("\r\n"); + + for (MAssignmentSlot slot : mas) { + xml.append(""); + if (slot.getDescription() != null && slot.getDescription().trim().length() > 0) { + xml.append("\r\n") + .append(XMLs.encodeText(slot.getDescription())) + .append("
"); + } + if (slot.getMAssignment() != null) { + //encode assignment id as coordinate x + String link = "Edit"; + xml.append("\r\n").append(XMLs.encodeText(link)); + } + xml.append("\r\n").append("
").append("\r\n"); + } + + xml.append("
").append("\r\n"); + + PrintWriter writer = resp.getWriter(); + BufferedWriter buffer = new BufferedWriter(writer); + buffer.write(xml.toString()); + buffer.flush(); + } +} diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java b/zkwebui/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java new file mode 100644 index 0000000000..9116067446 --- /dev/null +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/panel/WSchedule.java @@ -0,0 +1,143 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package org.adempiere.webui.panel; + +import java.text.DateFormat; +import java.util.*; +import java.util.logging.*; + +import org.adempiere.webui.component.Panel; +import org.adempiere.webui.component.ToolBarButton; +import org.adempiere.webui.window.InfoSchedule; +import org.compiere.util.*; +import org.zkforge.timeline.Bandinfo; +import org.zkforge.timeline.Timeline; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; + +/** + * Visual and Control Part of Schedule. + * Contains Time and Schedule Panels + * + * @author Jorg Janke + * @version $Id: VSchedule.java,v 1.3 2006/07/30 00:51:27 jjanke Exp $ + */ +public class WSchedule extends Panel implements EventListener +{ + private InfoSchedule infoSchedule; + + /** + * Constructor + * @param is InfoSchedule for call back + * @param type Type of schedule TYPE_... + */ + public WSchedule (InfoSchedule is) + { + infoSchedule = is; + try + { + init(); + } + catch(Exception e) + { + log.log(Level.SEVERE, "VSchedule", e); + } + } // WSchedule + + /** Logger */ + private static CLogger log = CLogger.getCLogger(WSchedule.class); + + Timeline schedulePanel; + private Bandinfo hourBand; + private Bandinfo dayBand; + + private ToolBarButton button; + + /** + * Static init + *
+	 * 	timePanel (West)
+	 *  schedlePanel (in schedulePane - Center)
+	 *  
+ * @throws Exception + */ + private void init() throws Exception + { + schedulePanel = new Timeline(); + schedulePanel.setHeight("400px"); + schedulePanel.setWidth("100%"); + schedulePanel.setId("resoureSchedule"); + + this.appendChild(schedulePanel); + + hourBand = new Bandinfo(); + schedulePanel.appendChild(hourBand); + hourBand.setIntervalUnit("hour"); + hourBand.setWidth("60%"); + hourBand.setIntervalPixels(40); + hourBand.setId("hour"); + hourBand.setTimeZone(TimeZone.getDefault()); + + dayBand = new Bandinfo(); + schedulePanel.appendChild(dayBand); + dayBand.setIntervalUnit("day"); + dayBand.setWidth("40%"); + dayBand.setIntervalPixels(100); + dayBand.setId("day"); + dayBand.setSyncWith("hour"); + dayBand.setTimeZone(TimeZone.getDefault()); + dayBand.setShowEventText(false); + + button = new ToolBarButton(); + button.setLabel("Edit"); + button.setStyle("visibility: hidden; height: 0px; width: 0px"); + button.addEventListener(Events.ON_CLICK, this); + this.appendChild(button); + } // jbInit + + /** + * Recreate View + * @param S_Resource_ID Resource + * @param date Date + */ + public void recreate (int S_Resource_ID, Date date) + { + hourBand.setDate(date); + hourBand.scrollToCenter(date); + + String feedUrl = "timeline?S_Resource_ID=" + S_Resource_ID + "&date=" + DateFormat.getInstance().format(date) + + "&uuid=" + button.getUuid(); + hourBand.setEventSourceUrl(feedUrl); + dayBand.setEventSourceUrl(feedUrl); + schedulePanel.invalidate(); + } // recreate + + /** + * Enable/disable to Create New Assignments + * @param createNew if true, allows to create new Assignments + */ + public void setCreateNew (boolean createNew) + { +// schedulePanel.setCreateNew(createNew); + } // setCreateNew + + public void onEvent(Event event) throws Exception { + //TODO: Edit, S_ResourceAssignment_ID is in MouseEvent.x + } + +} // WSchedule diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/part/MultiTabPart.java b/zkwebui/WEB-INF/src/org/adempiere/webui/part/MultiTabPart.java index c0dcf3116d..f63896fb2f 100644 --- a/zkwebui/WEB-INF/src/org/adempiere/webui/part/MultiTabPart.java +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/part/MultiTabPart.java @@ -95,7 +95,7 @@ public class MultiTabPart extends AbstractUIPart tabbox.getSelectedTab().onClose(); } - public Component getComponent() { + public Tabbox getComponent() { return tabbox; } } diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java b/zkwebui/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java index 9488588801..b11c17f2f4 100644 --- a/zkwebui/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java @@ -38,7 +38,7 @@ import org.zkoss.zkplus.util.ThreadLocals; public class SessionContextListener implements ExecutionInit, ExecutionCleanup, EventThreadInit, EventThreadResume { - private static final String SESSION_CTX = "WebUISessionContext"; + public static final String SESSION_CTX = "WebUISessionContext"; public void init(Execution exec, Execution parent) { @@ -47,10 +47,10 @@ public class SessionContextListener implements ExecutionInit, WebContext ctx = (WebContext)exec.getDesktop().getSession().getAttribute(SESSION_CTX); if (ctx == null) { - ctx = new WebContext(); - setWebContext(ctx); + ctx = new WebContext(); exec.getDesktop().getSession().setAttribute(SESSION_CTX, ctx); } + setWebContext(ctx); exec.setAttribute(SESSION_CTX, ctx); } } @@ -93,9 +93,10 @@ public class SessionContextListener implements ExecutionInit, } @SuppressWarnings("unchecked") - private void setWebContext(WebContext ctx) + public void setWebContext(WebContext ctx) { getContextThreadLocal().set(ctx); + WebContext.setCurrentInstance(ctx); } private ThreadLocal getContextThreadLocal() diff --git a/zkwebui/WEB-INF/src/org/adempiere/webui/window/InfoSchedule.java b/zkwebui/WEB-INF/src/org/adempiere/webui/window/InfoSchedule.java new file mode 100644 index 0000000000..a216374de3 --- /dev/null +++ b/zkwebui/WEB-INF/src/org/adempiere/webui/window/InfoSchedule.java @@ -0,0 +1,442 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package org.adempiere.webui.window; + +import java.sql.*; +import java.util.*; +import java.util.Date; +import java.util.logging.*; + +import org.adempiere.webui.apps.AEnv; +import org.adempiere.webui.component.Button; +import org.adempiere.webui.component.ConfirmPanel; +import org.adempiere.webui.component.Datebox; +import org.adempiere.webui.component.Grid; +import org.adempiere.webui.component.Label; +import org.adempiere.webui.component.ListItem; +import org.adempiere.webui.component.Listbox; +import org.adempiere.webui.component.Row; +import org.adempiere.webui.component.Rows; +import org.adempiere.webui.component.Window; +import org.adempiere.webui.panel.StatusBarPanel; +import org.adempiere.webui.panel.WSchedule; +import org.compiere.model.*; +import org.compiere.util.*; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zul.Div; +import org.zkoss.zul.Vbox; + + +/** + * Schedule - Resource availability & assigment. + * + * @author Jorg Janke + * @version $Id: InfoSchedule.java,v 1.2 2006/07/30 00:51:27 jjanke Exp $ + * + * Zk Port + * @author Low Heng Sin + */ +public class InfoSchedule extends Window implements EventListener //, ChangeListener +{ + /** + * Constructor + * @param mAssignment optional assignment + * @param createNew if true, allows to create new assignments + */ + public InfoSchedule (MResourceAssignment mAssignment, boolean createNew) + { + super(); + setTitle(Msg.getMsg(Env.getCtx(), "InfoSchedule")); +// setAttribute("modal", Boolean.valueOf(createNew)); + setAttribute("mode", "overlapped"); + this.setWidth("600px"); + this.setHeight("600px"); + this.setBorder("normal"); + this.setStyle("position: absolute"); + if (mAssignment == null) + m_mAssignment = new MResourceAssignment(Env.getCtx(), 0, null); + else + m_mAssignment = mAssignment; + if (mAssignment != null) + log.info(mAssignment.toString()); + m_dateFrom = m_mAssignment.getAssignDateFrom(); + if (m_dateFrom == null) + m_dateFrom = new Timestamp(System.currentTimeMillis()); + m_createNew = createNew; + try + { + init(); + dynInit(createNew); + } + catch(Exception ex) + { + log.log(Level.SEVERE, "InfoSchedule", ex); + } + AEnv.showWindow(this); + } // InfoSchedule + + /** + * IDE Constructor + */ + public InfoSchedule() + { + this (null, false); + } // InfoSchedule + + /** Resource */ + private MResourceAssignment m_mAssignment; + /** Date */ + private Timestamp m_dateFrom = null; + /** Loading */ + private boolean m_loading = false; + /** Ability to create new assignments */ + private boolean m_createNew; + /** Logger */ + private static CLogger log = CLogger.getCLogger(InfoSchedule.class); + + private Vbox mainLayout = new Vbox(); + private Grid parameterPanel = new Grid(); + private Label labelResourceType = new Label(); + private Listbox fieldResourceType = new Listbox(); + private Label labelResource = new Label(); + private Listbox fieldResource = new Listbox(); + private Button bPrevious = new Button(); + private Label labelDate = new Label(); + private Datebox fieldDate = new Datebox(); + private Button bNext = new Button(); + private WSchedule schedulePane = new WSchedule(this); + private StatusBarPanel statusBar = new StatusBarPanel(); + private ConfirmPanel confirmPanel = new ConfirmPanel(true); + + /** + * Static Layout + * @throws Exception + */ + private void init() throws Exception + { + this.appendChild(mainLayout); + mainLayout.setHeight("100%"); + mainLayout.setWidth("100%"); + + labelResourceType.setValue(Msg.translate(Env.getCtx(), "S_ResourceType_ID")); + labelResource.setValue(Msg.translate(Env.getCtx(), "S_Resource_ID")); + bPrevious.setLabel("<"); + labelDate.setValue(Msg.translate(Env.getCtx(), "Date")); + bNext.setLabel(">"); + + mainLayout.appendChild(parameterPanel); + + Rows rows = new Rows(); + rows.setParent(parameterPanel); + Row row = new Row(); + rows.appendChild(row); + + row.appendChild(labelResourceType); + row.appendChild(labelResource); + row.appendChild(bPrevious); + row.appendChild(labelDate); + row.appendChild(bNext); + + row = new Row(); + rows.appendChild(row); + row.appendChild(fieldResourceType); + row.appendChild(fieldResource); + row.appendChild(new Label(" ")); + row.appendChild(fieldDate); + // + + mainLayout.appendChild(schedulePane); + + schedulePane.setWidth("100%"); + schedulePane.setHeight("400px"); + Div div = new Div(); + div.appendChild(confirmPanel); + div.appendChild(statusBar); + mainLayout.appendChild(div); + + fieldResourceType.setMold("select"); + fieldResource.setMold("select"); + } // jbInit + + /** + * Dynamic Init + * @param createNew if true, allows to create new assignments + */ + private void dynInit (boolean createNew) + { + // Resource + fillResourceType(); + fillResource(); + fieldResourceType.addEventListener(Events.ON_SELECT, this); + fieldResource.addEventListener(Events.ON_SELECT, this); + + // Date + fieldDate.setValue(m_dateFrom); + fieldDate.addEventListener(Events.ON_CHANGE, this); + bPrevious.addEventListener(Events.ON_CLICK, this); + bNext.addEventListener(Events.ON_CLICK, this); + + // + confirmPanel.addActionListener(Events.ON_CLICK, this); + Button button = confirmPanel.createButton("Add"); + confirmPanel.addComponentsLeft(button); + button.addEventListener(Events.ON_CLICK, this); + button.setLabel("Add"); + + displayCalendar(); + } // dynInit + + /** + * Fill Resource Type (one time) + */ + private void fillResourceType() + { + // Get ResourceType of selected Resource + int S_ResourceType_ID = 0; + if (m_mAssignment.getS_Resource_ID() != 0) + { + String sql = "SELECT S_ResourceType_ID FROM S_Resource WHERE S_Resource_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, m_mAssignment.getS_Resource_ID()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + S_ResourceType_ID = rs.getInt(1); + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + } + + // Get Resource Types + String sql = MRole.getDefault().addAccessSQL( + "SELECT S_ResourceType_ID, Name FROM S_ResourceType WHERE IsActive='Y' ORDER BY 2", + "S_ResourceType", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO); + KeyNamePair defaultValue = null; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) + { + KeyNamePair pp = new KeyNamePair(rs.getInt(1), rs.getString(2)); + if (S_ResourceType_ID == pp.getKey()) + defaultValue = pp; + fieldResourceType.appendItem(pp.getName(), pp.getKey()); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + if (defaultValue != null) { + int cnt = fieldResourceType.getItemCount(); + for(int i = 0; i < cnt; i++) { + ListItem li = fieldResourceType.getItemAtIndex(i); + Integer key = (Integer) li.getValue(); + if (key.intValue() == defaultValue.getKey()) { + fieldResourceType.setSelectedItem(li); + break; + } + } + } else if (fieldResourceType.getItemCount() > 0) { + fieldResourceType.setSelectedIndex(0); + } + } // fillResourceType + + /** + * Fill Resource Pick from Resource Type + */ + private void fillResource() + { + ListItem listItem = fieldResourceType.getSelectedItem(); + if (listItem == null) + return; + // Get Resource Type + KeyNamePair pp = new KeyNamePair((Integer)listItem.getValue(), listItem.getLabel()); + int S_ResourceType_ID = pp.getKey(); + + KeyNamePair defaultValue = null; + + // Load Resources + m_loading = true; + fieldResource.getChildren().clear(); + String sql = "SELECT S_Resource_ID, Name FROM S_Resource WHERE S_ResourceType_ID=? ORDER BY 2"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, S_ResourceType_ID); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) + { + pp = new KeyNamePair(rs.getInt(1), rs.getString(2)); + if (m_mAssignment.getS_Resource_ID() == pp.getKey()) + defaultValue = pp; + fieldResource.appendItem(pp.getName(), pp.getKey()); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + if (defaultValue != null) { + int cnt = fieldResource.getItemCount(); + for(int i = 0; i < cnt; i++) { + ListItem li = fieldResource.getItemAtIndex(i); + Integer key = (Integer) li.getValue(); + if (key.intValue() == defaultValue.getKey()) { + fieldResource.setSelectedItem(li); + break; + } + } + } else if ( fieldResource.getItemCount() > 0) { + fieldResource.setSelectedIndex(0); + } + + m_loading = false; + } // fillResource + + /** + * Display Calendar for selected Resource, Time(day/week/month) and Date + */ + private void displayCalendar () + { + // Get Values + ListItem listItem = fieldResource.getSelectedItem(); + if (listItem == null) + return; + KeyNamePair pp = new KeyNamePair((Integer)listItem.getValue(), listItem.getLabel()); + int S_Resource_ID = pp.getKey(); + m_mAssignment.setS_Resource_ID(S_Resource_ID); + Date date = fieldDate.getValue(); + + // Set Info + m_loading = true; + schedulePane.recreate(S_Resource_ID, date); + m_loading = false; + invalidate(); + } // displayCalendar + + /************************************************************************** + * Dispose. + */ + public void dispose() + { + this.detach(); + } // dispose + + /** + * Adjust Date + * @param diff difference + */ + private void adjustDate (int diff) + { + Date date = fieldDate.getValue(); + GregorianCalendar cal = new GregorianCalendar(); + cal.setTime(date); + cal.add(java.util.Calendar.DAY_OF_YEAR, diff); + fieldDate.setValue(new Date(cal.getTimeInMillis())); + displayCalendar (); + } // adjustDate + + /*************************************************************************/ + + /** + * Callback. + * Called from VSchedulePanel after VAssignmentDialog finished + * @param assignment New/Changed Assignment + */ + public void mAssignmentCallback (MResourceAssignment assignment) + { + m_mAssignment = assignment; + if (m_createNew) + dispose(); + else + displayCalendar(); + } // mAssignmentCallback + + /** + * Get Assignment + * @return Assignment + */ + public MResourceAssignment getMResourceAssignment() + { + return m_mAssignment; + } // getMResourceAssignment + + public void onEvent(Event event) throws Exception { + if (m_loading) + return; + + if (event.getTarget().getId().equals("Ok")) + dispose(); + else if (event.getTarget().getId().equals("Cancel")) + dispose(); + // + else if (event.getTarget() == fieldResourceType) + { + fillResource(); + displayCalendar(); + } + // + else if (event.getTarget() == fieldResource || event.getTarget() == fieldDate) + displayCalendar(); + // + else if (event.getTarget() == bPrevious) + adjustDate(-1); + else if (event.getTarget() == bNext) + adjustDate(+1); + else if (event.getTarget().getId().equals("Add")) + doAdd(); + // + + } + + private void doAdd() { + // TODO Auto-generated method stub + + } + + + + /** +SELECT o.DocumentNo, ol.Line, ol.Description +FROM C_OrderLine ol, C_Order o +WHERE ol.S_ResourceAssignment_ID=1 + AND ol.C_Order_ID=o.C_Order_ID +UNION +SELECT i.DocumentNo, il.Line, il.Description +FROM C_InvoiceLine il, C_Invoice i +WHERE il.S_ResourceAssignment_ID=1 + AND il.C_Invoice_ID=i.C_Invoice_ID +UNION +SELECT e.DocumentNo, el.Line, el.Description +FROM S_TimeExpenseLine el, S_TimeExpense e +WHERE el.S_ResourceAssignment_ID=1 + AND el.S_TimeExpense_ID=el.S_TimeExpense_ID + */ +} // InfoSchedule diff --git a/zkwebui/WEB-INF/web.xml b/zkwebui/WEB-INF/web.xml index ae99234a71..98bc56f5e5 100644 --- a/zkwebui/WEB-INF/web.xml +++ b/zkwebui/WEB-INF/web.xml @@ -64,7 +64,18 @@ auEngine /zkau/* - + + + servlet to provide timeline xml event feed + timelineFeed + + org.adempiere.webui.TimelineEventFeed + + + + timelineFeed + /timeline +