From e26d9338ddc5f0f0440947e60013a57b82043783 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Tue, 30 Oct 2012 17:01:57 -0400
Subject: [PATCH] Refactor GC period into an integer for simpler translations

---
 src/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java |   82 +++++++++++++++++++++++++++++++++++-----
 1 files changed, 71 insertions(+), 11 deletions(-)

diff --git a/src/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java b/src/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java
index 936659d..27e48fb 100644
--- a/src/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java
+++ b/src/com/gitblit/wicket/panels/RegistrantPermissionsPanel.java
@@ -36,8 +36,12 @@
 import org.apache.wicket.model.IModel;
 
 import com.gitblit.Constants.AccessPermission;
+import com.gitblit.Constants.PermissionType;
+import com.gitblit.Constants.RegistrantType;
 import com.gitblit.models.RegistrantAccessPermission;
 import com.gitblit.utils.DeepCopier;
+import com.gitblit.utils.StringUtils;
+import com.gitblit.wicket.WicketUtils;
 
 /**
  * Allows user to manipulate registrant access permissions.
@@ -49,8 +53,9 @@
 
 	private static final long serialVersionUID = 1L;
 
-	public RegistrantPermissionsPanel(String wicketId, List<String> allRegistrants, final List<RegistrantAccessPermission> permissions, final Map<AccessPermission, String> translations) {
+	public RegistrantPermissionsPanel(String wicketId, RegistrantType registrantType, List<String> allRegistrants, final List<RegistrantAccessPermission> permissions, final Map<AccessPermission, String> translations) {
 		super(wicketId);
+		setOutputMarkupId(true);
 		
 		// update existing permissions repeater
 		RefreshingView<RegistrantAccessPermission> dataView = new RefreshingView<RegistrantAccessPermission>("permissionRow") {
@@ -77,21 +82,62 @@
             
 			public void populateItem(final Item<RegistrantAccessPermission> item) {
 				final RegistrantAccessPermission entry = item.getModelObject();
-				item.add(new Label("registrant", entry.registrant));
+				if (RegistrantType.REPOSITORY.equals(entry.registrantType)) {
+					String repoName = StringUtils.stripDotGit(entry.registrant);
+					if (StringUtils.findInvalidCharacter(repoName) == null) {
+						// repository, strip .git and show swatch
+						Label registrant = new Label("registrant", repoName);
+						WicketUtils.setCssClass(registrant, "repositorySwatch");
+						WicketUtils.setCssBackground(registrant, repoName);
+						item.add(registrant);
+					} else {
+						// likely a regex
+						Label label = new Label("registrant", entry.registrant);
+						WicketUtils.setCssStyle(label, "font-weight: bold;");
+						item.add(label);
+					}
+				} else {
+					// user or team
+					Label label = new Label("registrant", entry.registrant);
+					WicketUtils.setCssStyle(label, "font-weight: bold;");
+					item.add(label);
+				}
+				switch (entry.permissionType) {
+				case OWNER:
+					Label owner = new Label("pType", "owner");
+					WicketUtils.setHtmlTooltip(owner, getString("gb.ownerPermission"));
+					item.add(owner);
+					break;
+				case REGEX:
+					Label regex = new Label("pType", "regex");
+					WicketUtils.setHtmlTooltip(regex, getString("gb.regexPermission"));
+					item.add(regex);
+					break;
+				default:
+					item.add(new Label("pType", "").setVisible(false));
+					break;
+				}
 
 				// use ajax to get immediate update of permission level change
 				// otherwise we can lose it if they change levels and then add
 				// a new repository permission
 				final DropDownChoice<AccessPermission> permissionChoice = new DropDownChoice<AccessPermission>(
 						"permission", Arrays.asList(AccessPermission.values()), new AccessPermissionRenderer(translations));
-				permissionChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
+				// only allow changing an explicitly defined permission
+				// this is designed to prevent changing a regex permission in
+				// a repository
+				permissionChoice.setEnabled(entry.isEditable);
+				permissionChoice.setOutputMarkupId(true);
+				if (entry.isEditable) {
+					permissionChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
 		           
-					private static final long serialVersionUID = 1L;
+						private static final long serialVersionUID = 1L;
 
-					protected void onUpdate(AjaxRequestTarget target) {
-		                target.addComponent(permissionChoice);
-		            }
-		        });
+						protected void onUpdate(AjaxRequestTarget target) {
+							target.addComponent(permissionChoice);
+						}
+					});
+				}
 
 				item.add(permissionChoice);
 			}
@@ -102,11 +148,15 @@
 		// filter out registrants we already have permissions for
 		final List<String> registrants = new ArrayList<String>(allRegistrants);
 		for (RegistrantAccessPermission rp : permissions) {
-			registrants.remove(rp.registrant);
+			if (rp.isEditable) {
+				// only remove editable duplicates
+				// this allows for specifying an explicit permission
+				registrants.remove(rp.registrant);
+			}
 		}
 
 		// add new permission form
-		IModel<RegistrantAccessPermission> addPermissionModel = new CompoundPropertyModel<RegistrantAccessPermission>(new RegistrantAccessPermission());
+		IModel<RegistrantAccessPermission> addPermissionModel = new CompoundPropertyModel<RegistrantAccessPermission>(new RegistrantAccessPermission(registrantType));
 		Form<RegistrantAccessPermission> addPermissionForm = new Form<RegistrantAccessPermission>("addPermissionForm", addPermissionModel);
 		addPermissionForm.add(new DropDownChoice<String>("registrant", registrants));
 		addPermissionForm.add(new DropDownChoice<AccessPermission>("permission", Arrays
@@ -119,7 +169,11 @@
 			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 				// add permission to our list
 				RegistrantAccessPermission rp = (RegistrantAccessPermission) form.getModel().getObject();
-				permissions.add(DeepCopier.copy(rp));
+				RegistrantAccessPermission copy = DeepCopier.copy(rp);
+				if (StringUtils.findInvalidCharacter(copy.registrant) != null) {
+					copy.permissionType = PermissionType.REGEX;
+				}
+				permissions.add(copy);
 				
 				// remove registrant from available choices
 				registrants.remove(rp.registrant);
@@ -134,6 +188,12 @@
 		add(addPermissionForm.setVisible(registrants.size() > 0));
 	}
 	
+	protected boolean getStatelessHint()
+	{
+		return false;
+	}
+
+	
 	private class AccessPermissionRenderer implements IChoiceRenderer<AccessPermission> {
 
 		private static final long serialVersionUID = 1L;

--
Gitblit v1.9.1