/* * 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 permissions, final Map translations) { super(wicketId); // update existing permissions repeater RefreshingView dataView = new RefreshingView("permissionRow") { private static final long serialVersionUID = 1L; @Override protected Iterator> getItemModels() { // the iterator returns RepositoryPermission objects, but we need it to // return models return new ModelIteratorAdapter(permissions.iterator()) { @Override protected IModel model(RepositoryAccessPermission permission) { return new CompoundPropertyModel(permission); } }; } @Override protected Item newItem(String id, int index, IModel model) { // this item sets markup class attribute to either 'odd' or // 'even' for decoration return new OddEvenItem(id, index, model); } public void populateItem(final Item 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 permissionChoice = new DropDownChoice( "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 repositories = GitBlit.self().getRepositoryList(); for (RepositoryAccessPermission rp : permissions) { repositories.remove(rp.repository); } // add new permission form IModel addPermissionModel = new CompoundPropertyModel(new RepositoryAccessPermission()); Form addPermissionForm = new Form("addPermissionForm", addPermissionModel); addPermissionForm.add(new DropDownChoice("repository", repositories)); addPermissionForm.add(new DropDownChoice("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 { private static final long serialVersionUID = 1L; private final Map map; public AccessPermissionRenderer(Map 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); } } }