--- a
+++ b/Allura/allura/ext/admin/widgets.py
@@ -0,0 +1,98 @@
+from pylons import g, c
+
+import ew as ew_core
+from ew import jinja2_ew as ew
+
+from allura import model as M
+from allura.lib import validators as V
+
+class CardField(ew_core.Widget):
+    template = 'jinja:admin_widgets/card_field.html'
+    defaults = dict(
+        ew_core.Widget.defaults,
+        id=None,
+        name='Deck',
+        icon_name='group',
+        items=None,
+        settings_href=None)
+
+    def item_display(self, item):
+        return repr(item)
+
+    def item_id(self, item):
+        return repr(item)
+
+    def resources(self):
+        yield ew.CSSScript('''.deck li input, .deck li select {
+margin: 2px 0 2px 3px;
+width: 148px;
+}''')
+        yield ew.JSScript('''$(function() {
+    $('.active-card').each(function() {
+        var newitem = $('.new-item', this);
+        var adder = $('.adder', this);
+        var deleters = $('.deleter', this);
+        newitem.remove();
+        newitem.removeClass('new-item');
+        deleters.click(function(evt) {
+            evt.stopPropagation();
+            evt.preventDefault();
+            var $this = $(this);
+            $this.closest('li').remove();
+        });
+        adder.click(function(evt) {
+            evt.stopPropagation();
+            evt.preventDefault();
+            newitem.clone().insertBefore(adder.closest('li'));
+        });
+    });
+})''')
+
+class GroupCard(CardField):
+    new_item=ew.InputField(attrs=dict(placeholder='type a username'))
+
+    def item_display(self, user):
+        return user.username
+
+    def item_id(self, user):
+        return user._id
+
+class _GroupSelect(ew.SingleSelectField):
+
+    def options(self):
+        roles = sorted(
+            (role for role in c.project.roles if role.name),
+            key=lambda r:r.name)
+        options = [
+            ew.Option(py_value=role._id, label=role.name)
+            for role in roles ]
+        return options
+
+class PermissionCard(CardField):
+    new_item = _GroupSelect()
+
+    def item_display(self, role):
+        return role.name
+
+    def item_id(self, role):
+        return role._id
+
+
+class GroupSettings(ew.SimpleForm):
+    submit_text=None
+
+    class hidden_fields(ew_core.NameList):
+        _id = ew.HiddenField(
+            validator=V.Ming(M.ProjectRole))
+
+    class fields(ew_core.NameList):
+        name = ew.InputField(label='Name')
+
+    class buttons(ew_core.NameList):
+        save = ew.SubmitButton(label='Save')
+        delete = ew.SubmitButton(label='Delete Group')
+
+class NewGroupSettings(ew.SimpleForm):
+    submit_text='Save'
+    class fields(ew_core.NameList):
+        name = ew.InputField(label='Name')