From 5abe3350a38b3cdfc28ac2839860d28b88f2306a Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 24 Jun 2013 14:02:54 -0400
Subject: [PATCH] Improve time filter language and handling of daysBack parameter

---
 src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java |    2 
 src/main/java/com/gitblit/wicket/pages/ActivityPage.java    |   23 ++++++-
 src/main/java/com/gitblit/wicket/PageRegistration.java      |   32 ++++++++--
 src/main/java/com/gitblit/wicket/pages/DashboardPage.java   |   30 +++++++++-
 releases.moxie                                              |    3 
 src/main/java/com/gitblit/wicket/WicketUtils.java           |    2 
 src/main/distrib/data/gitblit.properties                    |    2 
 src/main/java/com/gitblit/wicket/GitBlitWebApp.properties   |    5 +
 src/main/java/com/gitblit/wicket/pages/ProjectPage.java     |    4 
 src/main/java/com/gitblit/wicket/pages/RootPage.java        |   19 ++++--
 10 files changed, 94 insertions(+), 28 deletions(-)

diff --git a/releases.moxie b/releases.moxie
index 02f1c7b..ba6951e 100644
--- a/releases.moxie
+++ b/releases.moxie
@@ -127,7 +127,8 @@
 	- { name: 'realm.salesforce.orgId', defaultValue: 0 }
 	- { name: 'realm.windows.defaultDomain', defaultValue: ' ' }
 	- { name: 'realm.windows.backingUserService', defaultValue: 'users.conf' }
-	- { name: 'web.activityDurationChoices', defaultValue: '7 14 21 28' }
+	- { name: 'web.activityDuration', defaultValue: 7 }
+	- { name: 'web.activityDurationChoices', defaultValue: '1 3 7 14 21 28' }
 	- { name: 'web.activityCacheDays', defaultValue: 14 }
 	- { name: 'web.allowAppCloneLinks', defaultValue: 'true' }
 	- { name: 'web.forceDefaultLocale', defaultValue: ' ' }
diff --git a/src/main/distrib/data/gitblit.properties b/src/main/distrib/data/gitblit.properties
index a3270e4..d5573a6 100644
--- a/src/main/distrib/data/gitblit.properties
+++ b/src/main/distrib/data/gitblit.properties
@@ -825,7 +825,7 @@
 #
 # SPACE-DELIMITED
 # SINCE 1.3.0
-web.activityDurationChoices = 7 14 21 28
+web.activityDurationChoices = 1 3 7 14 21 28
 
 # The number of days of commits to cache in memory for the dashboard, activity,
 # and project pages.  A value of 0 will disable all caching and will parse commits
diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
index 34ba138..bca0dc0 100644
--- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
@@ -497,4 +497,7 @@
 gb.starred = starred
 gb.owned = owned
 gb.starredAndOwned = starred & owned
-gb.reviewPatchset = review {0} patchset {1}
\ No newline at end of file
+gb.reviewPatchset = review {0} patchset {1}
+gb.todaysActivityStats = today / {1} commits by {2} authors
+gb.todaysActivityNone = today / none
+gb.noActivityToday = there has been no activity today
\ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/PageRegistration.java b/src/main/java/com/gitblit/wicket/PageRegistration.java
index 6cbd862..b0cb470 100644
--- a/src/main/java/com/gitblit/wicket/PageRegistration.java
+++ b/src/main/java/com/gitblit/wicket/PageRegistration.java
@@ -152,13 +152,8 @@
 				parameters = new PageParameters(params);
 				if (parameters.containsKey(parameter)) {
 					isSelected = params.getString(parameter).equals(value);
-					if (isSelected) {
-						// already selected, so remove this enables toggling
-						parameters.remove(parameter);
-					} else {
-						// set the new selection value
-						setParameter(parameter, value);
-					}
+					// set the new selection value
+					setParameter(parameter, value);
 				} else {
 					// not currently selected
 					isSelected = false;
@@ -167,7 +162,7 @@
 			}
 		}
 
-		private void setParameter(String parameter, String value) {
+		protected void setParameter(String parameter, String value) {
 			if (!StringUtils.isEmpty(parameter)) {
 				if (StringUtils.isEmpty(value)) {
 					this.parameters.remove(parameter);
@@ -224,4 +219,25 @@
 			return displayText;
 		}
 	}
+	
+	public static class DropDownToggleItem extends DropDownMenuItem {
+		
+		private static final long serialVersionUID = 1L;
+
+		/**
+		 * Toggle Menu Item constructor that preserves aggregate parameters.
+		 * 
+		 * @param displayText
+		 * @param parameter
+		 * @param value
+		 */
+		public DropDownToggleItem(String displayText, String parameter, String value,
+				PageParameters params) {
+			super(displayText, parameter, value, params);
+			if (isSelected) {
+				// already selected, so remove this enables toggling
+				parameters.remove(parameter);
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/WicketUtils.java b/src/main/java/com/gitblit/wicket/WicketUtils.java
index d2c14fc..87f2f3f 100644
--- a/src/main/java/com/gitblit/wicket/WicketUtils.java
+++ b/src/main/java/com/gitblit/wicket/WicketUtils.java
@@ -431,7 +431,7 @@
 	}
 
 	public static int getDaysBack(PageParameters params) {
-		return params.getInt("db", 7);
+		return params.getInt("db", 0);
 	}
 
 	public static String getUsername(PageParameters params) {
diff --git a/src/main/java/com/gitblit/wicket/pages/ActivityPage.java b/src/main/java/com/gitblit/wicket/pages/ActivityPage.java
index 61838ba..694fa60 100644
--- a/src/main/java/com/gitblit/wicket/pages/ActivityPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ActivityPage.java
@@ -61,7 +61,7 @@
 		// parameters
 		int daysBack = WicketUtils.getDaysBack(params);
 		if (daysBack < 1) {
-			daysBack = 14;
+			daysBack = GitBlit.getInteger(Keys.web.activityDuration, 7);
 		}
 		String objectId = WicketUtils.getObject(params);
 
@@ -70,9 +70,26 @@
 		List<Activity> recentActivity = ActivityUtils.getRecentActivity(models, 
 				daysBack, objectId, getTimeZone());
 
+		String headerPattern;
+		if (daysBack == 1) {
+			// today
+			if (recentActivity.size() == 0) {
+				headerPattern = getString("gb.todaysActivityNone");
+			} else {
+				headerPattern = getString("gb.todaysActivityStats");
+			}
+		} else {
+			// multiple days
+			if (recentActivity.size() == 0) {
+				headerPattern = getString("gb.recentActivityNone");
+			} else {
+				headerPattern = getString("gb.recentActivityStats");
+			}
+		}
+		
 		if (recentActivity.size() == 0) {
 			// no activity, skip graphs and activity panel
-			add(new Label("subheader", MessageFormat.format(getString("gb.recentActivityNone"),
+			add(new Label("subheader", MessageFormat.format(headerPattern,
 					daysBack)));
 			add(new Label("activityPanel"));
 		} else {
@@ -86,7 +103,7 @@
 			int totalAuthors = uniqueAuthors.size();
 
 			// add the subheader with stat numbers
-			add(new Label("subheader", MessageFormat.format(getString("gb.recentActivityStats"),
+			add(new Label("subheader", MessageFormat.format(headerPattern,
 					daysBack, totalCommits, totalAuthors)));
 
 			// create the activity charts
diff --git a/src/main/java/com/gitblit/wicket/pages/DashboardPage.java b/src/main/java/com/gitblit/wicket/pages/DashboardPage.java
index 64d5255..db3092d 100644
--- a/src/main/java/com/gitblit/wicket/pages/DashboardPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/DashboardPage.java
@@ -96,12 +96,20 @@
 			// quiet or no starred repositories
 			if (repositories.size() == 0) {
 				if (UserModel.ANONYMOUS.equals(user)) {
-					activityFragment.add(new Label("digests", MessageFormat.format(getString("gb.noActivity"), daysBack)));	
+					if (daysBack == 1) {
+						activityFragment.add(new Label("digests", getString("gb.noActivityToday")));
+					} else {
+						activityFragment.add(new Label("digests", MessageFormat.format(getString("gb.noActivity"), daysBack)));
+					}
 				} else {
 					activityFragment.add(new LinkPanel("digests", null, getString("gb.findSomeRepositories"), RepositoriesPage.class));
 				}
 			} else {
-				activityFragment.add(new Label("digests", MessageFormat.format(getString("gb.noActivity"), daysBack)));
+				if (daysBack == 1) {
+					activityFragment.add(new Label("digests", getString("gb.noActivityToday")));
+				} else {
+					activityFragment.add(new Label("digests", MessageFormat.format(getString("gb.noActivity"), daysBack)));
+				}
 			}
 		} else {
 			// show daily commit digest feed
@@ -228,7 +236,23 @@
 			}
 		}
 		
-		frag.add(new Label("feedheader", MessageFormat.format(getString("gb.recentActivityStats"),
+		String headerPattern;
+		if (daysBack == 1) {
+			// today
+			if (totalCommits == 0) {
+				headerPattern = getString("gb.todaysActivityNone");
+			} else {
+				headerPattern = getString("gb.todaysActivityStats");
+			}
+		} else {
+			// multiple days
+			if (totalCommits == 0) {
+				headerPattern = getString("gb.recentActivityNone");
+			} else {
+				headerPattern = getString("gb.recentActivityStats");
+			}
+		}
+		frag.add(new Label("feedheader", MessageFormat.format(headerPattern,
 				daysBack, totalCommits, authorMetrics.size())));
 
 		// build google charts
diff --git a/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java b/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java
index 69dadbd..d951da3 100644
--- a/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/MyDashboardPage.java
@@ -94,7 +94,7 @@
 		// parameters
 		int daysBack = params == null ? 0 : WicketUtils.getDaysBack(params);
 		if (daysBack < 1) {
-			daysBack = 7;
+			daysBack = GitBlit.getInteger(Keys.web.activityDuration, 7);
 		}
 		Calendar c = Calendar.getInstance();
 		c.add(Calendar.DATE, -1*daysBack);
diff --git a/src/main/java/com/gitblit/wicket/pages/ProjectPage.java b/src/main/java/com/gitblit/wicket/pages/ProjectPage.java
index fbd1db0..97a31f9 100644
--- a/src/main/java/com/gitblit/wicket/pages/ProjectPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/ProjectPage.java
@@ -106,12 +106,12 @@
 		}
 		int daysBack = params == null ? 0 : WicketUtils.getDaysBack(params);
 		if (daysBack < 1) {
-			daysBack = 7;
+			daysBack = GitBlit.getInteger(Keys.web.activityDuration, 7);
 		}
 		// reset the daysback parameter so that we have a complete project
 		// repository list.  the recent activity will be built up by the
 		// reflog utils.
-		params.put("db", 0);
+		params.remove("db");
 		
 		List<RepositoryModel> repositories = getRepositories(params);
 		Collections.sort(repositories, new Comparator<RepositoryModel>() {
diff --git a/src/main/java/com/gitblit/wicket/pages/RootPage.java b/src/main/java/com/gitblit/wicket/pages/RootPage.java
index 8760f5c..f4ac907 100644
--- a/src/main/java/com/gitblit/wicket/pages/RootPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RootPage.java
@@ -52,6 +52,7 @@
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.PageRegistration;
 import com.gitblit.wicket.PageRegistration.DropDownMenuItem;
+import com.gitblit.wicket.PageRegistration.DropDownToggleItem;
 import com.gitblit.wicket.SessionlessForm;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.panels.GravatarImage;
@@ -256,7 +257,7 @@
 			List<String> sets = new ArrayList<String>(setMap.keySet());
 			Collections.sort(sets);
 			for (String set : sets) {
-				filters.add(new DropDownMenuItem(MessageFormat.format("{0} ({1})", set,
+				filters.add(new DropDownToggleItem(MessageFormat.format("{0} ({1})", set,
 						setMap.get(set).get()), "set", set, params));
 			}
 			// divider
@@ -268,7 +269,7 @@
 			List<TeamModel> teams = new ArrayList<TeamModel>(user.teams);
 			Collections.sort(teams);
 			for (TeamModel team : teams) {
-				filters.add(new DropDownMenuItem(MessageFormat.format("{0} ({1})", team.name,
+				filters.add(new DropDownToggleItem(MessageFormat.format("{0} ({1})", team.name,
 						team.repositories.size()), "team", team.name, params));
 			}
 			// divider
@@ -283,7 +284,7 @@
 			for (String expression : expressions) {
 				if (!StringUtils.isEmpty(expression)) {
 					addedExpression = true;
-					filters.add(new DropDownMenuItem(null, "x", expression, params));
+					filters.add(new DropDownToggleItem(null, "x", expression, params));
 				}
 			}
 			// if we added any custom expressions, add a divider
@@ -300,7 +301,7 @@
 		if (daysBack < 1) {
 			daysBack = 7;
 		}
-		PageParameters clonedParams;;
+		PageParameters clonedParams;
 		if (params == null) {
 			clonedParams = new PageParameters();
 		} else {
@@ -314,14 +315,18 @@
 		List<DropDownMenuItem> items = new ArrayList<DropDownMenuItem>();
 		Set<Integer> choicesSet = new TreeSet<Integer>(GitBlit.getIntegers(Keys.web.activityDurationChoices));
 		if (choicesSet.isEmpty()) {
-			 choicesSet.addAll(Arrays.asList(7, 14, 28, 60, 90, 180));
+			 choicesSet.addAll(Arrays.asList(1, 3, 7, 14, 21, 28));
 		}
 		List<Integer> choices = new ArrayList<Integer>(choicesSet);
 		Collections.sort(choices);
 		String lastDaysPattern = getString("gb.lastNDays");
 		for (Integer db : choices) {
-			String txt = MessageFormat.format(lastDaysPattern, db);
-			items.add(new DropDownMenuItem(txt, "db", db.toString(), clonedParams));
+			if (db == 1) {
+				items.add(new DropDownMenuItem(getString("gb.time.today"), "db", db.toString(), clonedParams));
+			} else {
+				String txt = MessageFormat.format(lastDaysPattern, db);
+				items.add(new DropDownMenuItem(txt, "db", db.toString(), clonedParams));
+			}
 		}
 		items.add(new DropDownMenuItem());
 		return items;

--
Gitblit v1.9.1