summaryrefslogtreecommitdiffstats
path: root/src/com/gitblit/wicket/panels/RepositoryPermissionsPanel.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/gitblit/wicket/panels/RepositoryPermissionsPanel.java')
-rw-r--r--src/com/gitblit/wicket/panels/RepositoryPermissionsPanel.java157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/com/gitblit/wicket/panels/RepositoryPermissionsPanel.java b/src/com/gitblit/wicket/panels/RepositoryPermissionsPanel.java
new file mode 100644
index 00000000..3d967d36
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/RepositoryPermissionsPanel.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2012 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.wicket.panels;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.IChoiceRenderer;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.OddEvenItem;
+import org.apache.wicket.markup.repeater.RefreshingView;
+import org.apache.wicket.markup.repeater.util.ModelIteratorAdapter;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+
+import com.gitblit.Constants.AccessPermission;
+import com.gitblit.GitBlit;
+import com.gitblit.models.RepositoryAccessPermission;
+import com.gitblit.utils.DeepCopier;
+
+/**
+ * Allows user to manipulate repository access permissions.
+ *
+ * @author James Moger
+ *
+ */
+public class RepositoryPermissionsPanel extends BasePanel {
+
+ private static final long serialVersionUID = 1L;
+
+ public RepositoryPermissionsPanel(String wicketId, final List<RepositoryAccessPermission> permissions, final Map<AccessPermission, String> translations) {
+ super(wicketId);
+
+ // update existing permissions repeater
+ RefreshingView<RepositoryAccessPermission> dataView = new RefreshingView<RepositoryAccessPermission>("permissionRow") {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected Iterator<IModel<RepositoryAccessPermission>> getItemModels() {
+ // the iterator returns RepositoryPermission objects, but we need it to
+ // return models
+ return new ModelIteratorAdapter<RepositoryAccessPermission>(permissions.iterator()) {
+ @Override
+ protected IModel<RepositoryAccessPermission> model(RepositoryAccessPermission permission) {
+ return new CompoundPropertyModel<RepositoryAccessPermission>(permission);
+ }
+ };
+ }
+
+ @Override
+ protected Item<RepositoryAccessPermission> newItem(String id, int index, IModel<RepositoryAccessPermission> model) {
+ // this item sets markup class attribute to either 'odd' or
+ // 'even' for decoration
+ return new OddEvenItem<RepositoryAccessPermission>(id, index, model);
+ }
+
+ public void populateItem(final Item<RepositoryAccessPermission> item) {
+ final RepositoryAccessPermission entry = item.getModelObject();
+ item.add(new Label("repository", entry.repository));
+
+ // 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") {
+
+ private static final long serialVersionUID = 1L;
+
+ protected void onUpdate(AjaxRequestTarget target) {
+ target.addComponent(permissionChoice);
+ }
+ });
+
+ item.add(permissionChoice);
+ }
+ };
+ add(dataView);
+ setOutputMarkupId(true);
+
+ // filter out repositories we already have permissions for
+ final List<String> repositories = GitBlit.self().getRepositoryList();
+ for (RepositoryAccessPermission rp : permissions) {
+ repositories.remove(rp.repository);
+ }
+
+ // add new permission form
+ IModel<RepositoryAccessPermission> addPermissionModel = new CompoundPropertyModel<RepositoryAccessPermission>(new RepositoryAccessPermission());
+ Form<RepositoryAccessPermission> addPermissionForm = new Form<RepositoryAccessPermission>("addPermissionForm", addPermissionModel);
+ addPermissionForm.add(new DropDownChoice<String>("repository", repositories));
+ addPermissionForm.add(new DropDownChoice<AccessPermission>("permission", Arrays
+ .asList(AccessPermission.NEWPERMISSIONS), new AccessPermissionRenderer(translations)));
+ AjaxButton button = new AjaxButton("addPermissionButton", addPermissionForm) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+ // add permission to our list
+ RepositoryAccessPermission rp = (RepositoryAccessPermission) form.getModel().getObject();
+ permissions.add(DeepCopier.copy(rp));
+
+ // remove repository from available choices
+ repositories.remove(rp.repository);
+
+ // force the panel to refresh
+ target.addComponent(RepositoryPermissionsPanel.this);
+ }
+ };
+ addPermissionForm.add(button);
+
+ // only show add permission form if we have a repository choice
+ add(addPermissionForm.setVisible(repositories.size() > 0));
+ }
+
+ private class AccessPermissionRenderer implements IChoiceRenderer<AccessPermission> {
+
+ private static final long serialVersionUID = 1L;
+
+ private final Map<AccessPermission, String> map;
+
+ public AccessPermissionRenderer(Map<AccessPermission, String> map) {
+ this.map = map;
+ }
+
+ @Override
+ public String getDisplayValue(AccessPermission type) {
+ return map.get(type);
+ }
+
+ @Override
+ public String getIdValue(AccessPermission type, int index) {
+ return Integer.toString(index);
+ }
+ }
+}