Scarab commit: svn commit: r10607 - trunk/src: java/org/tigris/scarab/actions java/org/tigris/scarab/reports java/org/tigris/scarab/util webapp/WEB-INF/templates/macros webapp/WEB-INF/templates/reports

[email protected]
Newsgroups gmane.comp.java.scarab.cvs
Message-ID <[email protected]>
Author: hair
Date: 2008-08-12 15:07:44-0700
New Revision: 10607

Modified:
   trunk/src/java/org/tigris/scarab/actions/ConfigureReport.java
   trunk/src/java/org/tigris/scarab/reports/ReportDateRange.java
   trunk/src/java/org/tigris/scarab/reports/ReportDefinition.java
   trunk/src/java/org/tigris/scarab/reports/ReportHeading.java
   trunk/src/java/org/tigris/scarab/reports/ReportTableModel.java
   trunk/src/java/org/tigris/scarab/util/ScarabUtil.java
   trunk/src/webapp/WEB-INF/templates/macros/ReportMacro.vm
   trunk/src/webapp/WEB-INF/templates/reports/SelectDates.vm

Log:
Issue SCB2549:  (Replace single dates by date ranges in reports) 
 patch from Johannes Hoechstaedter. lots of thanks.


Modified: trunk/src/java/org/tigris/scarab/actions/ConfigureReport.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/actions/ConfigureReport.java?view=diff&rev=10607&p1=trunk/src/java/org/tigris/scarab/actions/ConfigureReport.java&p2=trunk/src/java/org/tigris/scarab/actions/ConfigureReport.java&r1=10606&r2=10607
==============================================================================
--- trunk/src/java/org/tigris/scarab/actions/ConfigureReport.java	(original)
+++ trunk/src/java/org/tigris/scarab/actions/ConfigureReport.java	2008-08-12 15:07:44-0700
@@ -51,6 +51,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.fulcrum.intake.Intake;
@@ -68,6 +69,7 @@
 import org.tigris.scarab.reports.ReportAxis;
 import org.tigris.scarab.reports.ReportBridge;
 import org.tigris.scarab.reports.ReportDate;
+import org.tigris.scarab.reports.ReportDateRange;
 import org.tigris.scarab.reports.ReportDefinition;
 import org.tigris.scarab.reports.ReportGroup;
 import org.tigris.scarab.reports.ReportHeading;
@@ -82,7 +84,6 @@
 import org.tigris.scarab.util.ScarabUtil;
 import org.tigris.scarab.util.export.ExportFormat;
 import org.tigris.scarab.util.word.IssueSearch;
-import org.tigris.scarab.util.word.IssueSearchFactory;
 
 /**
  * This class is responsible for report generation forms
@@ -98,6 +99,11 @@
     private static final String ADD_USER = "add_user";
     private static final String SELECTED_USER = "select_user";
     
+    private static final Pattern RELATIVE_DATE_PATTERN = Pattern.compile(
+            "\\s*now\\s*(([+-])\\s*(\\d+)|)\\s*",
+    		Pattern.CASE_INSENSITIVE
+        );
+    
     ScarabLocalizationTool l10n;
     ScarabRequestTool scarabR;
     ReportBridge report;
@@ -926,6 +932,106 @@
         heading.addReportDate(rdate);
         scarabR.setConfirmMessage(L10NKeySet.DateAdded);
     }
+    
+    public void doAdddaterange(RunData data, TemplateContext context)
+    throws Exception
+    {
+    	setup(data,context);
+    	if (!report.isEditable(user)) 
+    	{
+    		setNoPermissionMessage();
+    		setTarget(data, "reports,ReportList.vm");
+    		return;
+    	}
+
+
+    	int axis = params.getInt("axis", 0); // 0=row; 1=column
+    	int level = params.getInt("heading", -1);
+
+    	ReportHeading heading = report.getReportDefinition()
+        	.getAxis(axis).getHeading(level);
+    	// if level was -1, we have created a new level.  So mark the new
+    	// level as the current one.
+    	params.setString("heading", "0");
+    
+    	List dates = heading.getReportDateRanges();
+    	int index = 1;
+    	if (dates == null)
+    	{
+    		// make sure the heading does not contain old option or user data
+    		heading.reset();
+    	}
+    	else 
+    	{
+    		index = dates.size() + 1;
+    	}
+
+    	ReportDateRange rdaterange = new ReportDateRange();
+    	
+    	String stateChangeFromDate = ScarabUtil.findValue(data, "stateChangeFromDate");
+    	String stateChangeToDate = ScarabUtil.findValue(data, "stateChangeToDate");
+    	
+    	boolean datesValid = true;
+    	
+    	if(stateChangeFromDate != null)
+        {
+    		
+    		if(ScarabUtil.validateDateFormat(stateChangeFromDate, user.getLocale()))
+                {
+    		
+    			rdaterange.setMinDateString(stateChangeFromDate);
+    		
+    		}
+    		else
+                {
+    			
+    			datesValid = false;
+    			
+    		}
+    		
+    	}
+    	
+    	if(stateChangeToDate != null)
+        {
+    		
+    		if(ScarabUtil.validateDateFormat(stateChangeToDate, user.getLocale()))
+                {
+    		
+    			rdaterange.setMaxDateString(stateChangeToDate);
+    		
+    		}
+    		else
+                {
+    			
+    			datesValid = false;
+    			
+    		}
+    		
+    	}
+    	
+    	if(stateChangeFromDate == null && stateChangeToDate == null)
+        {
+    		
+    		datesValid = false;
+    		
+    	}
+    	
+    	if(datesValid)
+        {
+    		
+    		heading.addReportDateRange(rdaterange);
+        	
+        	scarabR.setConfirmMessage(L10NKeySet.DateAdded);
+    		
+    	}
+    	else{
+    		
+    		L10NMessage msg = new L10NMessage(L10NKeySet.DateFormatPrompt,L10NKeySet.ShortDateDisplay);
+            scarabR.setAlertMessage(msg);
+    		
+    	}
+    	   	
+    }
 
     public void doDeletedate(RunData data, TemplateContext context)
         throws Exception
@@ -958,6 +1064,40 @@
             scarabR.setConfirmMessage(L10NKeySet.SelectedDateDeleted);
         }
     }
+    
+    public void doDeletedaterange(RunData data, TemplateContext context)
+    throws Exception
+    {
+    	setup(data,context);
+    
+    	if (!report.isEditable(user)) 
+    	{
+    		setNoPermissionMessage();
+    		setTarget(data, "reports,ReportList.vm");
+    		return;
+    	}
+    
+    	String[] dateIndices = params.getStrings("selectdaterange");
+    	if (dateIndices == null || dateIndices.length == 0) 
+    	{
+    		scarabR.setAlertMessage(L10NKeySet.NoDateSelected);
+    	}
+    	else
+    	{
+    		int axis = params.getInt("axis", 0); // 0=row; 1=column
+    		int level = params.getInt("heading", -1);
+    		List reportDateRanges = report.getReportDefinition()
+            	.getAxis(axis).getHeading(level).getReportDateRanges();
+
+        for (int j = dateIndices.length-1; j>=0; j--) 
+        {
+        	reportDateRanges.remove(Integer.parseInt(dateIndices[j])-1);
+        }
+        
+        scarabR.setConfirmMessage(L10NKeySet.SelectedDateDeleted);
+        
+    }
+}
 
 
     public void doRedirecttocrossmodulelist(RunData data, TemplateContext context)
@@ -1234,4 +1374,6 @@
         }
         return intakeReport;
     }
+    
 }
+   

Modified: trunk/src/java/org/tigris/scarab/reports/ReportDateRange.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/reports/ReportDateRange.java?view=diff&rev=10607&p1=trunk/src/java/org/tigris/scarab/reports/ReportDateRange.java&p2=trunk/src/java/org/tigris/scarab/reports/ReportDateRange.java&r1=10606&r2=10607
==============================================================================
--- trunk/src/java/org/tigris/scarab/reports/ReportDateRange.java	(original)
+++ trunk/src/java/org/tigris/scarab/reports/ReportDateRange.java	2008-08-12 15:07:44-0700
@@ -39,7 +39,13 @@
  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  */
 
+import java.text.ParseException;
+import java.util.Date;
+import java.util.Locale;
+
 import org.apache.fulcrum.intake.Retrievable;
+import org.tigris.scarab.util.ScarabUtil;
+
 
 /**
  * Represents a date range in the xml report definition.  The functionality
@@ -52,48 +58,13 @@
     implements java.io.Serializable,
                Retrievable
 {
-    private long minTime;
-
-    private long maxTime;
-
-    /**
-     * Get the MinTime value.
-     * @return the MinTime value.
-     */
-    public long getMinTime()
-    {
-        return minTime;
-    }
-
-    /**
-     * Set the MinTime value.
-     * @param newMinTime The new MinTime value.
-     */
-    public void setMinTime(long newMinTime)
-    {
-        this.minTime = newMinTime;
-    }
-
-    /**
-     * Get the MaxTime value.
-     * @return the MaxTime value.
-     */
-    public long getMaxTime()
-    {
-        return maxTime;
-    }
-
-    /**
-     * Set the MaxTime value.
-     * @param newMaxTime The new MaxTime value.
-     */
-    public void setMaxTime(long newMaxTime)
-    {
-        this.maxTime = newMaxTime;
-    }
+	
+	private String minDateString;
+	
+	private String maxDateString;
 
     private String queryKey;
-
+    
     /**
      * Get the QueryKey value.
      * @return the QueryKey value.
@@ -109,7 +80,60 @@
      */
     public void setQueryKey(String newQueryKey)
     {
-        this.queryKey = newQueryKey;
+        
+    	this.queryKey = newQueryKey;
+    	
     }
+    
+    public Date getMinDate(Locale locale)
+    throws ParseException
+    {
+    	
+    	if(minDateString == null || minDateString.trim().equals(""))
+        {
+    		
+    		return null;
+    		
+    	}
+    	
+    	return ScarabUtil.parseDate(minDateString, false, locale);
+    	
+    }
+    
+    public Date getMaxDate(Locale locale)
+    throws ParseException
+    {
+    	
+    	if(maxDateString == null || maxDateString.trim().equals(""))
+        {
+    		
+    		return null;
+    		
+    	}
+    	
+    	return ScarabUtil.parseDate(maxDateString, false, locale);
+    	
+    }
+
+	public String getMaxDateString()
+        {
+		return maxDateString;
+	}
+
+	public void setMaxDateString(String maxDateString)
+        {
+		this.maxDateString = maxDateString;
+	}
+
+	public String getMinDateString()
+        {
+		return minDateString;
+	}
+
+	public void setMinDateString(String minDateString)
+        {
+		this.minDateString = minDateString;
+	}
+	
 }
 

Modified: trunk/src/java/org/tigris/scarab/reports/ReportDefinition.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/reports/ReportDefinition.java?view=diff&rev=10607&p1=trunk/src/java/org/tigris/scarab/reports/ReportDefinition.java&p2=trunk/src/java/org/tigris/scarab/reports/ReportDefinition.java&r1=10606&r2=10607
==============================================================================
--- trunk/src/java/org/tigris/scarab/reports/ReportDefinition.java	(original)
+++ trunk/src/java/org/tigris/scarab/reports/ReportDefinition.java	2008-08-12 15:07:44-0700
@@ -556,13 +556,17 @@
             sb.setLength(sb.length() - 2);
             summary = sb.toString();
         }
-        // FIXME: Date ranges are not implemented yet.
         else if (heading.getReportDates() != null 
                  && !heading.getReportDates().isEmpty())
-            //|| heading.getReportDateRanges() != null) 
         {
             summary = "Dates";
         }
+        else if (heading.getReportDateRanges() != null 
+                 && !heading.getReportDateRanges().isEmpty())
+        {
+            summary = "Date Ranges";
+        }
+        
         return summary;
     }
 

Modified: trunk/src/java/org/tigris/scarab/reports/ReportHeading.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/reports/ReportHeading.java?view=diff&rev=10607&p1=trunk/src/java/org/tigris/scarab/reports/ReportHeading.java&p2=trunk/src/java/org/tigris/scarab/reports/ReportHeading.java&r1=10606&r2=10607
==============================================================================
--- trunk/src/java/org/tigris/scarab/reports/ReportHeading.java	(original)
+++ trunk/src/java/org/tigris/scarab/reports/ReportHeading.java	2008-08-12 15:07:44-0700
@@ -269,6 +269,10 @@
         {
             size = getReportDates().size();
         }
+        else if (getReportDateRanges() != null) 
+        {
+            size = getReportDateRanges().size();
+        }
         return size;
     }
 

Modified: trunk/src/java/org/tigris/scarab/reports/ReportTableModel.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/reports/ReportTableModel.java?view=diff&rev=10607&p1=trunk/src/java/org/tigris/scarab/reports/ReportTableModel.java&p2=trunk/src/java/org/tigris/scarab/reports/ReportTableModel.java&r1=10606&r2=10607
==============================================================================
--- trunk/src/java/org/tigris/scarab/reports/ReportTableModel.java	(original)
+++ trunk/src/java/org/tigris/scarab/reports/ReportTableModel.java	2008-08-12 15:07:44-0700
@@ -119,11 +119,15 @@
     private int[] rowspan;
     private boolean isSearchAllowed;
 
+    private ScarabUser searcher;
+    
     private final String GET_VALUE_AT="getValueAt";
 
     ReportTableModel(ReportBridge report, Date date, ScarabUser searcher)
         throws Exception
     {
+    	
+    	this.searcher = searcher;
         this.reportDefn = report.getReportDefinition();
         ReportAxis axis = null;
         List axes = reportDefn.getReportAxisList();
@@ -355,6 +359,31 @@
                    contents = "";
                 }
             }
+            else if (columnHeadings != null && columnHeadings.size() == 1 && 
+                    ((ReportHeading)columnHeadings.get(0)).get(0) instanceof ReportDateRange) 
+            {
+            	Date minDate =((ReportDateRange)((ReportHeading)columnHeadings.get(0))
+                        .get(column)).getMinDate(searcher.getLocale());
+            	
+            	Date maxDate = ((ReportDateRange)((ReportHeading)columnHeadings.get(0))
+                        .get(column)).getMaxDate(searcher.getLocale());
+            	
+            	contents = new Integer(getIssueCountRange(
+                        getRowDataArray(row), minDate, maxDate));
+            	
+            }
+            else if (rowHeadings != null && rowHeadings.size() == 1 && 
+                     ((ReportHeading)rowHeadings.get(0)).get(0) instanceof ReportDateRange)
+            {
+            	Date minDate = ((ReportDateRange)((ReportHeading)rowHeadings.get(0))
+                        .get(row)).getMinDate(searcher.getLocale());
+            	
+            	Date maxDate = ((ReportDateRange)((ReportHeading)rowHeadings.get(0))
+                        .get(row)).getMaxDate(searcher.getLocale());
+            	
+            	contents = new Integer(getIssueCountRange(
+                        getColumnDataArray(column), minDate, maxDate));
+            }
             else
             {
                 contents = new Integer(getIssueCount(
@@ -376,12 +405,12 @@
         int rowLength = rowData.length;
         for (int i=0; i<rowLength; i++) 
         {
-            addOptionOrGroup(i, rowData[i], date, crit);
+            addOptionOrGroup(i, rowData[i], null, date, crit);
             
         }
         for (int i=0; i<columnData.length; i++) 
         {
-            addOptionOrGroup(i+rowLength, columnData[i], date, crit);
+            addOptionOrGroup(i+rowLength, columnData[i], null, date, crit);
         }
         return getCountAndCleanUp(crit);
     }
@@ -393,13 +422,25 @@
         crit.addSelectColumn("count(DISTINCT a0." + ACT_ISSUE_ID + ')');
         for (int i=0; i<dataArray.length; i++) 
         {
-            addOptionOrGroup(i, dataArray[i], date, crit);
+            addOptionOrGroup(i, dataArray[i], null, date, crit);
         }
         return getCountAndCleanUp(crit);
     }
+    
+    public int getIssueCountRange(Object[] dataArray, Date minDate, Date maxDate)
+    throws Exception
+    {
+    	Criteria crit = new Criteria();
+    	crit.addSelectColumn("count(DISTINCT a0." + ACT_ISSUE_ID + ')');
+    	for (int i=0; i<dataArray.length; i++) 
+    	{
+    		addOptionOrGroup(i, dataArray[i], minDate, maxDate, crit);
+    	}
+    	return getCountAndCleanUp(crit);
+    }
 
     private void addOptionOrGroup(int alias, Object optionOrGroup, 
-                                  Date date, Criteria crit)
+                                  Date minDate, Date maxDate, Criteria crit)
     {
         if (optionOrGroup == null) 
         {
@@ -419,7 +460,15 @@
         crit.addAlias("t"+alias, ActivitySetPeer.TABLE_NAME);
         
         crit.addJoin(a+"."+ACT_TRANSACTION_ID, t+'.'+TRAN_TRANSACTION_ID);
-        crit.add(t, TRAN_CREATED_DATE, date, Criteria.LESS_THAN);   
+        
+        if(maxDate != null){
+        	crit.add(t, TRAN_CREATED_DATE, maxDate, Criteria.LESS_THAN); 
+        }
+
+        if(minDate != null){
+        	crit.add(t, TRAN_CREATED_DATE, minDate, Criteria.GREATER_THAN); 
+        }
+        
         // end date criteria
         Criteria.Criterion c1 = crit
             .getNewCriterion(a, ACT_END_DATE, date, Criteria.GREATER_THAN);
@@ -536,7 +585,12 @@
     {
         return obj instanceof ReportDate;
     }
-
+ 
+    public boolean isReportDateRange(Object obj)
+    {
+        return obj instanceof ReportDateRange;
+    }
+    
     public String displayAttribute(Object cell)
     {
         return reportDefn.displayAttribute(cell);

Modified: trunk/src/java/org/tigris/scarab/util/ScarabUtil.java
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/java/org/tigris/scarab/util/ScarabUtil.java?view=diff&rev=10607&p1=trunk/src/java/org/tigris/scarab/util/ScarabUtil.java&p2=trunk/src/java/org/tigris/scarab/util/ScarabUtil.java&r1=10606&r2=10607
==============================================================================
--- trunk/src/java/org/tigris/scarab/util/ScarabUtil.java	(original)
+++ trunk/src/java/org/tigris/scarab/util/ScarabUtil.java	2008-08-12 15:07:44-0700
@@ -47,15 +47,23 @@
  */ 
 
 import java.net.URLEncoder;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.fulcrum.parser.StringValueParser;
 import org.apache.turbine.RunData;
 import org.tigris.scarab.om.IssueManager;
 import org.tigris.scarab.om.Module;
-
+import org.tigris.scarab.tools.ScarabLocalizationTool;
+import org.tigris.scarab.tools.localization.L10NKeySet;
+import org.tigris.scarab.tools.localization.Localizable;
 /**
  * A Utility class for code that doesn't really go other places.
  *   
@@ -65,6 +73,11 @@
 public class ScarabUtil
 {
     
+	
+	 private static final Pattern RELATIVE_DATE_PATTERN = Pattern.compile(
+	            "\\s*now\\s*(([+-])\\s*(\\d+)|)\\s*",
+	    		Pattern.CASE_INSENSITIVE
+	        );
 
     
     /**
@@ -232,5 +245,140 @@
         parser.parse(url, '&', '=', true);
         return parser;
     }
+    
+    private static Date parseDate(String dateString, Localizable dateFormat, Locale locale) 
+    throws ParseException
+    {
+    	Date date;
+    	
+    	ScarabLocalizationTool l10n = new ScarabLocalizationTool();
+        l10n.init(locale);
+    	
+    	String[] patterns = {
+                            l10n.get(dateFormat),
+                            ScarabConstants.ISO_DATETIME_PATTERN };
+    	date = parseDate(dateString, patterns);
+    	return date;
+    	
+    }
+    
+    /**
+     * Attempts to parse a String as a Date, trying each pattern in
+     * turn until the string is successfully parsed or all patterns
+     * have been tried.
+     *
+     * @param s a <code>String</code> value that should be converted
+     * to a <code>Date</code>.
+     * @param patterns patterns to be used for conversion
+     * @return the equivalent <code>Date</code> if the string could
+     * be parsed. 
+     * @throws ParseException if input String is null, or the string
+     * could not be parsed.
+     */
+    private static Date parseDate(String s, String[] patterns)
+        throws ParseException
+    {
+        if (s == null) 
+        {
+            throw new ParseException("Input string was null", -1);
+        }
+
+        SimpleDateFormat formatter = new SimpleDateFormat();
+
+        for (int i = 0; i < patterns.length; i++) 
+        {
+        	Date date = null;
+        	formatter.applyPattern(patterns[i]);
+            try
+            {
+            	date = formatter.parse(s);
+            }
+            catch (ParseException ex)
+            {
+                // ignore, because we have to try all patterns
+            }            
+            if (date != null) 
+            {
+                return date;
+            }
+        }
+        
+        throw new ParseException("Date could not be parsed with any"
+                                 + " of the provided date patterns.", -1);
+    }
+    
+    
+    /**
+     * Attempts to parse a atring as a date, first using the locale-sepcific
+     * short date format, and then the ISO standard "yyyy-mm-dd". If it sees
+     * a ':' character in the date string then the string will be interpreted
+     * as a date <b>and</b> time. Throws a ParseException if the String does
+     * not contain a suitable format.
+     *
+     * @param dateString a <code>String</code> value
+     * @param locale the locale to use when determining the date patterns
+     * to try.
+     * @param addTwentyFourHours if no time is given in the date string and
+     * this flag is true, then 24 hours - 1 msec will be added to the date.
+     * @return a <code>Date</code> value
+     */
+    public static Date parseDate(String dateString, boolean addTwentyFourHours, Locale locale)
+        throws ParseException
+    {
+        Date date = null;
+        if (dateString != null) 
+        {
+            Matcher m = RELATIVE_DATE_PATTERN.matcher(dateString);
+        	if(m.matches())
+        	{
+                date = new Date();
+
+        		    String dateDifference = m.group(3);
+        		    String sign = m.group(2);
+        		    if(dateDifference!=null)
+        		{
+                    long hours = Long.parseLong(dateDifference);  
+                    if (sign.equals("-")) hours = hours * -1;
+                    date.setTime(date.getTime() + hours * 3600000 );
+        		}
+        	}
+            else if (dateString.indexOf(':') == -1)
+            {
+                date = parseDate(dateString, L10NKeySet.ShortDatePattern, locale);
+                
+                if (addTwentyFourHours) 
+                {                
+                    date.setTime(date.getTime() + 86399999);
+                }
+            }
+            else
+            {
+                date = parseDate(dateString, L10NKeySet.ShortDateTimePattern, locale);        
+            }
+        }
+        
+        return date;
+    }
+    
+    /**
+     * Attempts to parse a date passed in the query page.
+    */
+    public static boolean validateDateFormat(String date, Locale locale)
+    {
+        boolean valid = true;
+        try
+        {
+        	
+            parseDate(date, false, locale);
+            
+        }
+        catch (Exception e)
+        {
+        	
+            valid = false;
+       
+        }
+        return valid;
+    }
 
 }

Modified: trunk/src/webapp/WEB-INF/templates/macros/ReportMacro.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/macros/ReportMacro.vm?view=diff&rev=10607&p1=trunk/src/webapp/WEB-INF/templates/macros/ReportMacro.vm&p2=trunk/src/webapp/WEB-INF/templates/macros/ReportMacro.vm&r1=10606&r2=10607
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/macros/ReportMacro.vm	(original)
+++ trunk/src/webapp/WEB-INF/templates/macros/ReportMacro.vm	2008-08-12 15:07:44-0700
@@ -51,7 +51,14 @@
 #end
 
 #macro (reportLabel $model $cellLabel $singleAttribute)
-  #if ($model.isReportDate($cellLabel))
+  #if ($model.isReportDateRange($cellLabel))
+      #if($cellLabel.getMinDateString())
+    		$l10n.From $cellLabel.getMinDateString()
+	  #end
+	  #if($cellLabel.getMaxDateString())
+    		$l10n.To $cellLabel.getMaxDateString()
+      #end
+  #elseif ($model.isReportDate($cellLabel))
       $format.getDate('yyyy-MM-dd HH:mm', $cellLabel.dateValue())
   #elseif ($model.isOption($cellLabel))
       #if ($singleAttribute)

Modified: trunk/src/webapp/WEB-INF/templates/reports/SelectDates.vm
Url: http://scarab.tigris.org/source/browse/scarab/trunk/src/webapp/WEB-INF/templates/reports/SelectDates.vm?view=diff&rev=10607&p1=trunk/src/webapp/WEB-INF/templates/reports/SelectDates.vm&p2=trunk/src/webapp/WEB-INF/templates/reports/SelectDates.vm&r1=10606&r2=10607
==============================================================================
--- trunk/src/webapp/WEB-INF/templates/reports/SelectDates.vm	(original)
+++ trunk/src/webapp/WEB-INF/templates/reports/SelectDates.vm	2008-08-12 15:07:44-0700
@@ -6,53 +6,58 @@
 #end
 #end
 
-<h3>$l10n.format("SelectDatesHeader", $axisIndex)</h3>
+<h3>$l10n.DatesOrDatesRanges</h3>
 		
-
 <table border="1" cellspacing="2" cellpadding="3" width="100%">
 <tr>
 <th>&nbsp;</th>
 <th>#l10nRowCol($rowCol)</th>
 <th>$l10n.DateTime</th>
-<th>$l10n.Type</th>
 </tr>
 
 #set ($finalCount = 1)
-#set ($calendar = $scarabR.Calendar)
 #if ($headingIndex >= 0)
- #set ($reportDates = $reportDefn.getAxis($axisIndex).getHeading($headingIndex).ReportDates)
- #foreach ($reportDate in $reportDates)
-  $calendar.setTime($reportDate.dateValue())
-  #set ($selectedMonth = $calendar.get($scarabG.CALENDAR_MONTH_FIELD) + 1)
+ #set ($reportDateRanges = $reportDefn.getAxis($axisIndex).getHeading($headingIndex).ReportDateRanges)
+ #foreach ($reportDateRange in $reportDateRanges)
   #indexedRows($velocityCount)
-    <td><input type="checkbox" name="selectdate" value="$velocityCount"/></td>
+    <td><input type="checkbox" name="selectdaterange" value="$velocityCount"/></td>
     <td nowrap="nowrap">#l10nRowCol($rowCol) $velocityCount</td>
 #* showing dates as unmodifiable since there is not a button to handle it
     <td>#dateEntry("y_$velocityCount" 2004 $calendar.get($scarabG.CALENDAR_YEAR_FIELD) "m_$velocityCount" $selectedMonth "d_$velocityCount" $calendar.get($scarabG.CALENDAR_DAY_FIELD) "h_$velocityCount" $calendar.get($scarabG.CALENDAR_HOUR_FIELD))</td>
 *#
-    <td>$format.getDate('yyyy MMMM dd - HH:mm', $reportDate.dateValue())
-    <td>$l10n.SingleDateTime</td>
+    <td>
+    	#if($reportDateRange.getMinDateString())
+    		$l10n.From $reportDateRange.getMinDateString()

+	    #end
+    	#if($reportDateRange.getMaxDateString())
+    		$l10n.To $reportDateRange.getMaxDateString()
+      	#end
+	</td>
   </tr>
   #set ($finalCount = $velocityCount + 1)
  #end
 #end
+<table border="1" cellspacing="2" cellpadding="3" width="100%">
+#indexedRows($finalCount)
+ <td>
+  	$l10n.RangeFrom:&#160;<input type="text" id="stateChangeFromDate"
+			name="stateChangeFromDate" value="" size="20"
+			/>&#160;<a id="stateChangeFromDate" name="stateChangeFromDate" href="javascript:;"
+			onClick="calPopup.select(document.getElementById('stateChangeFromDate'),'stateChangeFromDate','$l10n.ShortDatePattern');return false;"><img src="$staticLink.setPath('/images/date.gif')" border="0"/></a>        
+        $l10n.RangeTo:&#160;<input type="text" id="stateChangeToDate"
+			name="stateChangeToDate" value="" size="20"
+			/>&#160;<a id="stateChangeToDate" name="stateChangeToDate" href="javascript:;"
+			onClick="calPopup.select(document.getElementById('stateChangeToDate'),'stateChangeToDate','$l10n.ShortDatePattern');return false;"><img src="$staticLink.setPath('/images/date.gif')" border="0"/></a>        
+        <p><small>$l10n.format("DateEg", $l10n.ShortDateTimeDisplay)</small></p>
+  	</td>
+</table>	
 
-
-  #set ($selectedMonth = $calendar.get($scarabG.CALENDAR_MONTH_FIELD) + 1)
-  #indexedRows($finalCount)
-    <td>&nbsp;</td>
-    <td nowrap="nowrap">#l10nRowCol($rowCol) $finalCount</td>
-    <td>#dateEntry("y_$finalCount" 2004 $calendar.get($scarabG.CALENDAR_YEAR_FIELD) "m_$finalCount" $selectedMonth "d_$finalCount" $calendar.get($scarabG.CALENDAR_DAY_FIELD) "h_$finalCount" $calendar.get($scarabG.CALENDAR_HOUR_FIELD))
-    <td>$l10n.SingleDateTime</td>
-  </tr>
-</table>
- 
 <div class="functnbar3">
-  <input type="submit" value="$l10n.AddSingleDateTime"
-      name="eventSubmit_doAdddate" />&#160;
+  <input type="submit" value="$l10n.Add"
+      name="eventSubmit_doAdddaterange" />&#160;
   ## <input type="submit" value="Add date/time range" />&nbsp;
   <input type="submit" value="$l10n.DeleteSelected"
-      name="eventSubmit_doDeletedate" />
+      name="eventSubmit_doDeletedaterange" />
 </div>
 
 #reportFunctionBar("functnbar2" $report)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.