- { name: 'realm.salesforce.orgId', defaultValue: 0 } | - { name: 'realm.salesforce.orgId', defaultValue: 0 } | ||||
- { name: 'realm.windows.defaultDomain', defaultValue: ' ' } | - { name: 'realm.windows.defaultDomain', defaultValue: ' ' } | ||||
- { name: 'realm.windows.backingUserService', defaultValue: 'users.conf' } | - { 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.activityCacheDays', defaultValue: 14 } | ||||
- { name: 'web.allowAppCloneLinks', defaultValue: 'true' } | - { name: 'web.allowAppCloneLinks', defaultValue: 'true' } | ||||
- { name: 'web.forceDefaultLocale', defaultValue: ' ' } | - { name: 'web.forceDefaultLocale', defaultValue: ' ' } |
# | # | ||||
# SPACE-DELIMITED | # SPACE-DELIMITED | ||||
# SINCE 1.3.0 | # 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, | # 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 | # and project pages. A value of 0 will disable all caching and will parse commits |
gb.starred = starred | gb.starred = starred | ||||
gb.owned = owned | gb.owned = owned | ||||
gb.starredAndOwned = starred & owned | gb.starredAndOwned = starred & owned | ||||
gb.reviewPatchset = review {0} patchset {1} | |||||
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 |
parameters = new PageParameters(params); | parameters = new PageParameters(params); | ||||
if (parameters.containsKey(parameter)) { | if (parameters.containsKey(parameter)) { | ||||
isSelected = params.getString(parameter).equals(value); | 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 { | } else { | ||||
// not currently selected | // not currently selected | ||||
isSelected = false; | isSelected = false; | ||||
} | } | ||||
} | } | ||||
private void setParameter(String parameter, String value) { | |||||
protected void setParameter(String parameter, String value) { | |||||
if (!StringUtils.isEmpty(parameter)) { | if (!StringUtils.isEmpty(parameter)) { | ||||
if (StringUtils.isEmpty(value)) { | if (StringUtils.isEmpty(value)) { | ||||
this.parameters.remove(parameter); | this.parameters.remove(parameter); | ||||
return displayText; | 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); | |||||
} | |||||
} | |||||
} | |||||
} | } |
} | } | ||||
public static int getDaysBack(PageParameters params) { | public static int getDaysBack(PageParameters params) { | ||||
return params.getInt("db", 7); | |||||
return params.getInt("db", 0); | |||||
} | } | ||||
public static String getUsername(PageParameters params) { | public static String getUsername(PageParameters params) { |
// parameters | // parameters | ||||
int daysBack = WicketUtils.getDaysBack(params); | int daysBack = WicketUtils.getDaysBack(params); | ||||
if (daysBack < 1) { | if (daysBack < 1) { | ||||
daysBack = 14; | |||||
daysBack = GitBlit.getInteger(Keys.web.activityDuration, 7); | |||||
} | } | ||||
String objectId = WicketUtils.getObject(params); | String objectId = WicketUtils.getObject(params); | ||||
List<Activity> recentActivity = ActivityUtils.getRecentActivity(models, | List<Activity> recentActivity = ActivityUtils.getRecentActivity(models, | ||||
daysBack, objectId, getTimeZone()); | 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) { | if (recentActivity.size() == 0) { | ||||
// no activity, skip graphs and activity panel | // no activity, skip graphs and activity panel | ||||
add(new Label("subheader", MessageFormat.format(getString("gb.recentActivityNone"), | |||||
add(new Label("subheader", MessageFormat.format(headerPattern, | |||||
daysBack))); | daysBack))); | ||||
add(new Label("activityPanel")); | add(new Label("activityPanel")); | ||||
} else { | } else { | ||||
int totalAuthors = uniqueAuthors.size(); | int totalAuthors = uniqueAuthors.size(); | ||||
// add the subheader with stat numbers | // 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))); | daysBack, totalCommits, totalAuthors))); | ||||
// create the activity charts | // create the activity charts |
// quiet or no starred repositories | // quiet or no starred repositories | ||||
if (repositories.size() == 0) { | if (repositories.size() == 0) { | ||||
if (UserModel.ANONYMOUS.equals(user)) { | 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 { | } else { | ||||
activityFragment.add(new LinkPanel("digests", null, getString("gb.findSomeRepositories"), RepositoriesPage.class)); | activityFragment.add(new LinkPanel("digests", null, getString("gb.findSomeRepositories"), RepositoriesPage.class)); | ||||
} | } | ||||
} else { | } 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 { | } else { | ||||
// show daily commit digest feed | // show daily commit digest feed | ||||
} | } | ||||
} | } | ||||
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()))); | daysBack, totalCommits, authorMetrics.size()))); | ||||
// build google charts | // build google charts |
// parameters | // parameters | ||||
int daysBack = params == null ? 0 : WicketUtils.getDaysBack(params); | int daysBack = params == null ? 0 : WicketUtils.getDaysBack(params); | ||||
if (daysBack < 1) { | if (daysBack < 1) { | ||||
daysBack = 7; | |||||
daysBack = GitBlit.getInteger(Keys.web.activityDuration, 7); | |||||
} | } | ||||
Calendar c = Calendar.getInstance(); | Calendar c = Calendar.getInstance(); | ||||
c.add(Calendar.DATE, -1*daysBack); | c.add(Calendar.DATE, -1*daysBack); |
} | } | ||||
int daysBack = params == null ? 0 : WicketUtils.getDaysBack(params); | int daysBack = params == null ? 0 : WicketUtils.getDaysBack(params); | ||||
if (daysBack < 1) { | if (daysBack < 1) { | ||||
daysBack = 7; | |||||
daysBack = GitBlit.getInteger(Keys.web.activityDuration, 7); | |||||
} | } | ||||
// reset the daysback parameter so that we have a complete project | // reset the daysback parameter so that we have a complete project | ||||
// repository list. the recent activity will be built up by the | // repository list. the recent activity will be built up by the | ||||
// reflog utils. | // reflog utils. | ||||
params.put("db", 0); | |||||
params.remove("db"); | |||||
List<RepositoryModel> repositories = getRepositories(params); | List<RepositoryModel> repositories = getRepositories(params); | ||||
Collections.sort(repositories, new Comparator<RepositoryModel>() { | Collections.sort(repositories, new Comparator<RepositoryModel>() { |
import com.gitblit.wicket.GitBlitWebSession; | import com.gitblit.wicket.GitBlitWebSession; | ||||
import com.gitblit.wicket.PageRegistration; | import com.gitblit.wicket.PageRegistration; | ||||
import com.gitblit.wicket.PageRegistration.DropDownMenuItem; | import com.gitblit.wicket.PageRegistration.DropDownMenuItem; | ||||
import com.gitblit.wicket.PageRegistration.DropDownToggleItem; | |||||
import com.gitblit.wicket.SessionlessForm; | import com.gitblit.wicket.SessionlessForm; | ||||
import com.gitblit.wicket.WicketUtils; | import com.gitblit.wicket.WicketUtils; | ||||
import com.gitblit.wicket.panels.GravatarImage; | import com.gitblit.wicket.panels.GravatarImage; | ||||
List<String> sets = new ArrayList<String>(setMap.keySet()); | List<String> sets = new ArrayList<String>(setMap.keySet()); | ||||
Collections.sort(sets); | Collections.sort(sets); | ||||
for (String set : 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)); | setMap.get(set).get()), "set", set, params)); | ||||
} | } | ||||
// divider | // divider | ||||
List<TeamModel> teams = new ArrayList<TeamModel>(user.teams); | List<TeamModel> teams = new ArrayList<TeamModel>(user.teams); | ||||
Collections.sort(teams); | Collections.sort(teams); | ||||
for (TeamModel team : 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)); | team.repositories.size()), "team", team.name, params)); | ||||
} | } | ||||
// divider | // divider | ||||
for (String expression : expressions) { | for (String expression : expressions) { | ||||
if (!StringUtils.isEmpty(expression)) { | if (!StringUtils.isEmpty(expression)) { | ||||
addedExpression = true; | 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 | // if we added any custom expressions, add a divider | ||||
if (daysBack < 1) { | if (daysBack < 1) { | ||||
daysBack = 7; | daysBack = 7; | ||||
} | } | ||||
PageParameters clonedParams;; | |||||
PageParameters clonedParams; | |||||
if (params == null) { | if (params == null) { | ||||
clonedParams = new PageParameters(); | clonedParams = new PageParameters(); | ||||
} else { | } else { | ||||
List<DropDownMenuItem> items = new ArrayList<DropDownMenuItem>(); | List<DropDownMenuItem> items = new ArrayList<DropDownMenuItem>(); | ||||
Set<Integer> choicesSet = new TreeSet<Integer>(GitBlit.getIntegers(Keys.web.activityDurationChoices)); | Set<Integer> choicesSet = new TreeSet<Integer>(GitBlit.getIntegers(Keys.web.activityDurationChoices)); | ||||
if (choicesSet.isEmpty()) { | 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); | List<Integer> choices = new ArrayList<Integer>(choicesSet); | ||||
Collections.sort(choices); | Collections.sort(choices); | ||||
String lastDaysPattern = getString("gb.lastNDays"); | String lastDaysPattern = getString("gb.lastNDays"); | ||||
for (Integer db : choices) { | 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()); | items.add(new DropDownMenuItem()); | ||||
return items; | return items; |