On 5/16/2011 11:23 AM, Endi Sukma Dewata wrote:
The IPA.entity has been modified to support customizable facet groups.
The default list of facet groups is defined in IPA.entity_header and can
be overridden in the entity definition.

The patch has been fixed to handle missing relationships in selfservice and delegation entity. The indirect tabs have been removed and will be added back in patch for ticket 1030.

--
Endi S. Dewata
From 018fd56823f07e9d1408d703d312c3dd73a5e74a Mon Sep 17 00:00:00 2001
From: Endi S. Dewata <edew...@redhat.com>
Date: Fri, 13 May 2011 20:05:35 -0500
Subject: [PATCH] Customizable facet groups.

The IPA.entity has been modified to support customizable facet groups.
The default list of facet groups is defined in IPA.entity_header and can
be overriden in the entity definition.

Ticket #1219
---
 install/ui/associate.js             |   11 +-
 install/ui/details.js               |    1 +
 install/ui/dns.js                   |    2 +-
 install/ui/entity.js                |  400 +++++++++++++++++++----------------
 install/ui/group.js                 |    4 +-
 install/ui/host.js                  |    2 +-
 install/ui/netgroup.js              |   40 +++-
 install/ui/service.js               |    2 +-
 install/ui/test/data/ipa_init.json  |   13 ++
 install/ui/test/data/user_show.json |    3 +
 install/ui/user.js                  |   64 ++++--
 ipalib/plugins/baseldap.py          |    3 +
 ipalib/plugins/internal.py          |    8 +
 13 files changed, 329 insertions(+), 224 deletions(-)

diff --git a/install/ui/associate.js b/install/ui/associate.js
index 15fdfbd72a16e094d08290535127f82504c0bfde..679e007003c52a198bf2b30e11ac9a00919bc13b 100644
--- a/install/ui/associate.js
+++ b/install/ui/associate.js
@@ -664,14 +664,12 @@ IPA.association_facet = function (spec) {
 
     var that = IPA.facet(spec);
 
-    var index = that.name.indexOf('_');
-    that.attribute_member = spec.attribute_member || that.name.substring(0, index);
-    that.other_entity = spec.other_entity || that.name.substring(index+1);
-
-    that.facet_group = spec.facet_group ||
-        IPA.fetch_facet_group(that.entity_name,that.attribute_member);
+    that.attribute_member = spec.attribute_member;
+    that.other_entity = spec.other_entity;
+    that.facet_group = spec.facet_group;
 
     that.label = that.label ? that.label : (IPA.metadata.objects[that.other_entity] ? IPA.metadata.objects[that.other_entity].label : that.other_entity);
+    that.read_only = spec.read_only;
 
     that.associator = spec.associator || IPA.bulk_associator;
     that.add_method = spec.add_method || 'add_member';
@@ -683,7 +681,6 @@ IPA.association_facet = function (spec) {
     that.adder_columns = [];
     that.adder_columns_by_name = {};
 
-
     that.get_column = function(name) {
         return that.columns_by_name[name];
     };
diff --git a/install/ui/details.js b/install/ui/details.js
index a4b36db7382548cdba5bac31f8af5fe15e2c78ca..44560b5b05ee0bd4ecf612e8337003dadc46f8d7 100644
--- a/install/ui/details.js
+++ b/install/ui/details.js
@@ -265,6 +265,7 @@ IPA.details_facet = function(spec) {
     var that = IPA.facet(spec);
 
     that.label = (IPA.messages && IPA.messages.facets && IPA.messages.facets.details) || spec.label;
+    that.facet_group = spec.facet_group || 'settings';
 
     that.sections = [];
 
diff --git a/install/ui/dns.js b/install/ui/dns.js
index 6784584b6bd8ab14aff4b1dd4bf2af0d79375530..e62459afb227863f41c514a37be86364aeee05b3 100644
--- a/install/ui/dns.js
+++ b/install/ui/dns.js
@@ -56,7 +56,7 @@ IPA.entity_factories.dnszone = function() {
         facet({
             factory: IPA.records_facet,
             name: 'records',
-            facet_group:'Member',
+            facet_group: 'member',
             label: IPA.metadata.objects.dnsrecord.label,
             columns: [
                 {
diff --git a/install/ui/entity.js b/install/ui/entity.js
index f649833e10177ff2c6465683b8f55b29af29186e..dbee2b32dd9094fda33d322820a75e7c8cc0c122 100644
--- a/install/ui/entity.js
+++ b/install/ui/entity.js
@@ -39,6 +39,7 @@ IPA.facet = function (spec) {
     that.dialogs = [];
     that.dialogs_by_name = {};
 
+    // facet group name
     that.facet_group = spec.facet_group;
 
     that.__defineGetter__('entity_name', function() {
@@ -203,17 +204,30 @@ IPA.table_facet = function(spec) {
     return that;
 };
 
-IPA.fetch_facet_group = function (name,attribute_member){
-    var relationships = IPA.metadata.objects[name].relationships;
-    var relationship = relationships[attribute_member];
-    if (!relationship){
-        relationship = ['Member', '', 'no_'];
-    }
-    var facet_group = relationship[0];
-    return facet_group;
+IPA.facet_group = function(spec) {
+
+    spec = spec || {};
+
+    var that = {};
+
+    that.name = spec.name;
+    that.label = spec.label;
+
+    that.facets = [];
+    that.facets_by_name = {};
+
+    that.add_facet = function(facet) {
+        that.facets.push(facet);
+        that.facets_by_name[facet.name] = facet;
+    };
+
+    that.get_facet = function(name) {
+        return that.facets_by_name[name];
+    };
+
+    return that;
 };
 
-
 IPA.entity = function (spec) {
 
     spec = spec || {};
@@ -231,13 +245,11 @@ IPA.entity = function (spec) {
     that.facets = [];
     that.facets_by_name = {};
 
+    // current facet
     that.facet_name = null;
-    /*TODO:  Facet_groups are currently unordered.  If we need to
-     * maintain order, we will introduce a class that keeps the order
-     in an array, while maintaining the dictionary for direct access.*/
-    that.facet_groups = {};
 
-    that.autogenerate_associations = false;
+    that.facet_groups = [];
+    that.facet_groups_by_name = {};
 
     that.get_dialog = function(name) {
         return that.dialogs_by_name[name];
@@ -254,31 +266,30 @@ IPA.entity = function (spec) {
         return that;
     };
 
-    function init_dialogs (){
-        var i;
-        for (i = 0; i < that.dialogs.length; i += 1){
-            that.dialogs[i].init();
-        }
-        return that;
-    }
+    that.add_facet_group = function(facet_group) {
+        that.facet_groups.push(facet_group);
+        that.facet_groups_by_name[facet_group.name] = facet_group;
+    };
+
+    that.get_facet_group = function(name) {
+        return that.facet_groups_by_name[name];
+    };
+
+    that.remove_facet_groups = function() {
+        that.facet_groups = [];
+        that.facet_groups_by_name = {};
+    };
 
     that.get_facet = function(name) {
-        if (name === 'default'){
-            var facet_group;
-            var facet;
-            if (that.facet_groups["Member"]){
-                facet_group = that.facet_groups["Member"];
-                facet =  facet_group[0];
-            } else if (that.facets_by_name.details){
-                facet= that.facets_by_name.details;
-            }else  if (that.facet_groups["Member Of"]){
-                facet_group = that.facet_groups["Member Of"];
-                facet =  facet_group[0];
-            }
-            if (facet){
-                name = facet.name;
-                return facet;
+        if (name === 'default') {
+            // return the first facet in the first facet group
+            for (var i=0; i<that.facet_groups.length; i++) {
+                var facet_group = that.facet_groups[i];
+                if (!facet_group.facets.length) continue;
+                return facet_group.facets[0];
             }
+
+            return that.facets[0];
         }
 
         return that.facets_by_name[name];
@@ -289,79 +300,27 @@ IPA.entity = function (spec) {
         that.facets.push(facet);
         that.facets_by_name[facet.name] = facet;
         
-        if (facet.facet_group){
-            if (!that.facet_groups[facet.facet_group]){
-                that.facet_groups[facet.facet_group] = [];
+        if (facet.facet_group) {
+            var facet_group = that.get_facet_group(facet.facet_group);
+            if (facet_group) {
+                facet_group.add_facet(facet);
             }
-            that.facet_groups[facet.facet_group].push(facet);
         }
-        return that;
-    };
-
-    that.create_association_facet = function(attribute_member, other_entity, label, facet_group) {
-
-        var association_name = attribute_member+'_'+other_entity;
-
-        //TODO remove from the facets and facets_by_name collections
-        var facet = that.get_facet(association_name);
-        if (facet) {
-            facet.facet_group = facet_group;
-            facet.attribute_member =  attribute_member;
-            return;
-        }
-
-        facet = IPA.association_facet({
-            name: association_name,
-            label: label,
-            attribute_member: attribute_member,
-            other_entity: other_entity,
-            facet_group: facet_group
-        });
-
-        that.add_facet(facet);
-    };
-
-    that.create_association_facets = function() {
 
-        var attribute_members = that.metadata.attribute_members;
-
-        for (var attribute_member in attribute_members) {
-
-            // skip non-assignable associations
-            if (attribute_member === 'memberindirect') continue;
-            if (attribute_member === 'memberofindirect') continue;
-            if (attribute_member === 'enrolledby') continue;
-
-            var other_entities = attribute_members[attribute_member];
-
-            for (var j = 0; j < other_entities.length; j++) {
-
-                var other_entity = other_entities[j];
-                var label = IPA.metadata.objects[other_entity].label;
-
-                var facet_group =
-                    IPA.fetch_facet_group(that.name,attribute_member);
-                that.create_association_facet(
-                    attribute_member, other_entity, label, facet_group);
-            }
-        }
         return that;
     };
 
-    that.standard_associations = that.create_association_facets;
-
     that.init = function() {
 
-        if (that.autogenerate_associations) {
-            that.create_association_facets();
-        }
-
         for (var i=0; i<that.facets.length; i++) {
             var facet = that.facets[i];
             facet.entity = that;
             facet.init();
         }
-        init_dialogs();
+
+        for (var j=0; j<that.dialogs.length; j++) {
+            that.dialogs[j].init();
+        }
     };
 
     that.create = function(container) {
@@ -552,30 +511,23 @@ IPA.entity_header = function(spec) {
         }).appendTo(li);
     };
 
-    that.facet_group = function(container, label) {
-        var facets = that.entity.facet_groups[label];
-        if (facets) {
-            that.tab_section(container, label, facets);
-        }
-    };
-
-    that.tab_section = function(container, label, facets) {
+    that.facet_group = function(facet_group) {
 
         var section = $('<span/>', {
             'class': 'facet-tab-group'
-        }).appendTo(container);
+        }).appendTo(that.facet_tabs);
 
         $('<label/>', {
-            text: label
+            text: facet_group.label
         }).appendTo(section);
 
         var ul = $('<ul/>', {
             'class': 'facet-tab'
         }).appendTo(section);
 
-        for (var i=0; i<facets.length; i++) {
-            var other_facet = facets[i];
-            that.facet_link(ul, other_facet);
+        for (var i=0; i<facet_group.facets.length; i++) {
+            var facet = facet_group.facets[i];
+            that.facet_link(ul, facet);
         }
     };
 
@@ -621,15 +573,13 @@ IPA.entity_header = function(spec) {
             'class': 'entity-tabs'
         }).appendTo(container);
 
-        that.facet_group(that.facet_tabs, "Member");
-
-        if (that.entity.facets_by_name.details) {
-            that.facet_tabs.append(
-                that.tab_section(that.facet_tabs, 'Settings', [that.entity.facets_by_name.details]));
+        var facet_groups = that.entity.facet_groups;
+        for (var i=0; i<facet_groups.length; i++) {
+            var facet_group = facet_groups[i];
+            if (facet_group.facets.length) {
+                that.facet_group(facet_group);
+            }
         }
-
-        that.facet_group(that.facet_tabs, "Member Of");
-        that.facet_group(that.facet_tabs, "Managed By");
     };
 
     return that;
@@ -638,11 +588,153 @@ IPA.entity_header = function(spec) {
 IPA.entity_builder = function(){
 
     var that = {};
+
     var entity = null;
+    var facet_group = null;
     var facet = null;
+    var section = null;
 
-    function section(spec){
-        var current_section = null;
+    that.entity = function(spec) {
+        var factory = IPA.entity;
+        if (spec instanceof Object) {
+            factory = spec.factory || IPA.entity;
+        } else {
+            spec = { name: spec };
+        }
+
+        spec.metadata = spec.metadata || IPA.metadata.objects[spec.name];
+        if (!spec.metadata) {
+            throw "Entity not supported by server.";
+        }
+
+        entity = factory(spec);
+
+        that.facet_groups([
+            'member',
+            'settings',
+            'memberof',
+            'managedby'
+        ]);
+
+        return that;
+    };
+
+    that.facet_group = function(spec) {
+        if (spec instanceof Object) {
+            var factory = spec.factory || IPA.facet_group;
+            facet_group = factory(spec);
+        } else {
+            facet_group = IPA.facet_group({ name: spec });
+        }
+
+        if (!facet_group.label) {
+            var relationships = IPA.metadata.objects[entity.name].relationships;
+            if (relationships) {
+                var relationship = relationships[facet_group.name];
+                if (relationship) {
+                    facet_group.label = relationship[0];
+                }
+            }
+        }
+
+        if (!facet_group.label) {
+            facet_group.label = IPA.messages.facet_groups[facet_group.name];
+        }
+
+        entity.add_facet_group(facet_group);
+
+        return that;
+    };
+
+    that.facet_groups = function(specs) {
+
+        entity.remove_facet_groups();
+
+        for (var i=0; i<specs.length; i++) {
+            that.facet_group(specs[i]);
+        }
+
+        return that;
+    };
+
+    that.facet = function(spec) {
+        spec.entity_name  = entity.name;
+        facet = spec.factory(spec);
+        entity.add_facet(facet);
+        return that;
+    };
+
+    that.search_facet = function(spec) {
+        facet = IPA.search_facet({
+            entity_name: entity.name,
+            search_all: spec.search_all || false,
+            columns: spec.columns
+        });
+        entity.add_facet(facet);
+        return that;
+    };
+
+    that.details_facet = function(spec) {
+        var sections = spec.sections;
+        spec.sections = null;
+        spec.entity_name = entity.name;
+        facet = IPA.details_facet(spec);
+        entity.add_facet(facet);
+
+        for (var i=0; i<sections.length; i++) {
+            that.section(sections[i]);
+        }
+
+        return that;
+    };
+
+    that.association_facet = function(spec) {
+
+        spec.entity_name = entity.name;
+
+        var index = spec.name.indexOf('_');
+        spec.attribute_member = spec.attribute_member || spec.name.substring(0, index);
+        spec.other_entity = spec.other_entity || spec.name.substring(index+1);
+
+        spec.facet_group = spec.facet_group || spec.attribute_member;
+
+        entity.add_facet(IPA.association_facet(spec));
+
+        return that;
+    };
+
+    that.standard_association_facets = function() {
+
+        var attribute_members = entity.metadata.attribute_members;
+
+        for (var attribute_member in attribute_members) {
+            that.association_facets(attribute_member);
+        }
+
+        return that;
+    };
+
+    that.association_facets = function(attribute_member) {
+
+        var other_entities = entity.metadata.attribute_members[attribute_member];
+
+        for (var i=0; i<other_entities.length; i++) {
+
+            var other_entity = other_entities[i];
+            var association_name = attribute_member+'_'+other_entity;
+
+            var facet = entity.get_facet(association_name);
+            if (facet) continue;
+
+            that.association_facet({
+                name: association_name
+            });
+        }
+
+        return that;
+    };
+
+    that.section = function(spec) {
         spec.entity_name = entity.name;
 
         if (!spec.label){
@@ -651,11 +743,11 @@ IPA.entity_builder = function(){
         }
 
         if (spec.factory){
-            current_section =  spec.factory(spec);
+            section =  spec.factory(spec);
         }else{
-            current_section = IPA.details_list_section(spec);
+            section = IPA.details_list_section(spec);
         }
-        facet.add_section(current_section);
+        facet.add_section(section);
         var fields = spec.fields;
         if (fields) {
             for (var i=0; i<fields.length; i++) {
@@ -672,27 +764,9 @@ IPA.entity_builder = function(){
                         entity_name: entity.name
                     });
                 }
-                current_section.add_field(field);
+                section.add_field(field);
             }
         }
-    }
-
-    that.entity = function(param) {
-        var spec;
-        var factory = IPA.entity;
-        if (param instanceof Object) {
-            factory = param.factory || IPA.entity;
-            spec = param;
-        } else {
-            spec = { name: param  };
-        }
-        spec.metadata = spec.metadata || IPA.metadata.objects[spec.name];
-        if (!spec.metadata){
-            throw "Entity not supported by server.";
-        }
-
-        entity = factory(spec);
-        return that;
     };
 
     that.dialog = function(spec) {
@@ -714,50 +788,6 @@ IPA.entity_builder = function(){
         return that.dialog(spec);
     };
 
-    that.details_facet = function (spec){
-        var sections = spec.sections;
-        spec.sections = null;
-        spec.entity_name = entity.name;
-        facet =IPA.details_facet(spec);
-        entity.add_facet(facet);
-
-        var i;
-        for ( i =0; i < sections.length; i += 1){
-            section(sections[i]);
-        }
-
-        return that;
-    };
-
-    that.facet = function(spec) {
-        spec.entity_name  = entity.name;
-        facet = spec.factory(spec);
-        entity.add_facet(facet);
-        return that;
-    };
-
-    that.search_facet = function (spec){
-        facet = IPA.search_facet({
-            entity_name: entity.name,
-            search_all: spec.search_all || false,
-            columns: spec.columns
-        });
-        entity.add_facet(facet);
-        return that;
-    };
-
-
-    that.association_facet = function(spec){
-        spec.entity_name = entity.name;
-        entity.add_facet(IPA.association_facet(spec));
-        return that;
-    };
-
-    that.standard_association_facets = function(){
-        entity.standard_associations();
-        return that;
-    };
-
     that.build = function(){
         var item = entity;
         entity = null;
diff --git a/install/ui/group.js b/install/ui/group.js
index e4a037a50961a3c8c856805bc50802288f7cb374..bc7925dc0cd0d7853d1615300bc508485598ca99 100644
--- a/install/ui/group.js
+++ b/install/ui/group.js
@@ -63,8 +63,8 @@ IPA.entity_factories.group =  function () {
 
         }).
         association_facet({
-                name: 'memberof_group',
-                associator: IPA.serial_associator
+            name: 'memberof_group',
+            associator: IPA.serial_associator
         }).
         association_facet({
             name: 'memberof_netgroup',
diff --git a/install/ui/host.js b/install/ui/host.js
index cf78970f8bcf3a8d975a61a7d106ff915c16205e..4c43caaa382c89b608507708bde76aef8ed9f42f 100644
--- a/install/ui/host.js
+++ b/install/ui/host.js
@@ -69,7 +69,7 @@ IPA.entity_factories.host = function () {
                     }
                 ]
             }]}).
-        facet({
+        association_facet({
             factory: IPA.host_managedby_host_facet,
             name: 'managedby_host'
         }).
diff --git a/install/ui/netgroup.js b/install/ui/netgroup.js
index 197925a8d4443745597e7d6fd4fa5ea39b21b0c2..2136f926c7c1db5690c43dcb4bd14f107f8b766c 100644
--- a/install/ui/netgroup.js
+++ b/install/ui/netgroup.js
@@ -23,20 +23,50 @@
 /* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
 
 IPA.entity_factories.netgroup = function() {
+
     return IPA.entity_builder().
         entity('netgroup').
         search_facet({
-            columns:['cn','description']}).
-        details_facet({sections:[{
-            name:'identity',
-            fields:['cn','description','nisdomainname']}]}).
+            columns:[
+                'cn',
+                'description'
+            ]
+        }).
+        details_facet({
+            sections:[{
+                name:'identity',
+                fields:[
+                    'cn',
+                    'description',
+                    'nisdomainname']
+            }]
+        }).
+        association_facet({
+            name: 'memberhost_host',
+            facet_group: 'member'
+        }).
+        association_facet({
+            name: 'memberhost_hostgroup',
+            facet_group: 'member'
+        }).
+        association_facet({
+            name: 'memberuser_user',
+            facet_group: 'member'
+        }).
+        association_facet({
+            name: 'memberuser_group',
+            facet_group: 'member'
+        }).
         association_facet({
             name: 'memberof_netgroup',
             associator: IPA.serial_associator
         }).
         standard_association_facets().
         adder_dialog({
-            fields:['cn', 'description']
+            fields:[
+                'cn',
+                'description'
+            ]
         }).
         build();
 };
diff --git a/install/ui/service.js b/install/ui/service.js
index 474eedfe51558ec8664e1e6ecb22e5c0cb4aa2fc..9b9b1d59bc7cd292559eb86e5c9fe8aaf7e8a7da 100644
--- a/install/ui/service.js
+++ b/install/ui/service.js
@@ -63,7 +63,7 @@ IPA.entity_factories.service = function() {
                     label: IPA.messages.objects.service.status
                 }]
             }]}).
-        facet({
+        association_facet({
             factory: IPA.service_managedby_host_facet,
             name: 'managedby_host',
             add_method: 'add_host',
diff --git a/install/ui/test/data/ipa_init.json b/install/ui/test/data/ipa_init.json
index a5c7d951f1453b26eee3e9e6cee43132e4032e89..4e4f06238707a2c1bdc5fd6fc85f1bc9aeae6237 100644
--- a/install/ui/test/data/ipa_init.json
+++ b/install/ui/test/data/ipa_init.json
@@ -9235,6 +9235,11 @@
                                 "Member Of",
                                 "in_",
                                 "not_in_"
+                            ],
+                            "memberofindirect": [
+                                "Indirect Member Of",
+                                null,
+                                "not_in_indirect_"
                             ]
                         },
                         "takes_params": [
@@ -9998,6 +10003,14 @@
                         "remove_empty": "Select ${entity} to be removed.",
                         "remove_title": "Remove ${entity}."
                     },
+                    "facet_groups": {
+                        "managedby": "Managed by",
+                        "member": "Member",
+                        "memberindirect": "Indirect Member",
+                        "memberof": "Member Of",
+                        "memberofindirect": "Indirect Member Of",
+                        "settings": "Settings"
+                    },
                     "facets": {
                         "details": "Settings",
                         "search": "Search"
diff --git a/install/ui/test/data/user_show.json b/install/ui/test/data/user_show.json
index 33893d77b5ce0053d9a13f77333c2748afe22df5..2fbd049e554ba9649311a300ed26b542f427ab94 100644
--- a/install/ui/test/data/user_show.json
+++ b/install/ui/test/data/user_show.json
@@ -129,6 +129,9 @@
                 "ipausers",
                 "muppets"
             ],
+            "memberofindirect_group": [
+                "editors"
+            ],
             "mepmanagedentry": [
                 "cn=kfrog,cn=groups,cn=accounts,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com"
             ],
diff --git a/install/ui/user.js b/install/ui/user.js
index 7a8adb78c2b668d6e9cb289454168888bd8a0545..63c2ec4c8b142026c9a77c1c864a7570b661ffc5 100644
--- a/install/ui/user.js
+++ b/install/ui/user.js
@@ -25,45 +25,68 @@
 
 
 IPA.entity_factories.user = function() {
-    var builder =  IPA.entity_builder();
+
+    var builder = IPA.entity_builder();
+
     builder.
         entity('user').
         search_facet({
-            columns:['uid','givenname','sn','uidnumber','mail','telephonenumber','title']
+            columns: [
+                'uid',
+                'givenname',
+                'sn',
+                'uidnumber',
+                'mail',
+                'telephonenumber',
+                'title'
+            ]
         }).
-        details_facet({sections:[
+        details_facet({ sections: [
             {
                 name: 'identity',
                 label: IPA.messages.details.identity,
-                fields:['title','givenname','sn','cn','displayname', 'initials']
+                fields: [
+                    'title',
+                    'givenname',
+                    'sn',
+                    'cn',
+                    'displayname',
+                    'initials'
+                ]
             },
             {
                 name: 'account',
-                fields:[{factory:IPA.user_status_widget,name:'nsaccountlock'},
-                        'uid',
-                        {factory: IPA.user_password_widget,name:'userpassword'},
-                        'uidnumber','gidnumber','loginshell','homedirectory']
+                fields: [
+                    { factory: IPA.user_status_widget, name: 'nsaccountlock' },
+                    'uid',
+                    { factory: IPA.user_password_widget, name: 'userpassword' },
+                    'uidnumber',
+                    'gidnumber',
+                    'loginshell',
+                    'homedirectory'
+                ]
             },
             {
                 name: 'contact',
-                fields:
-                [  {factory: IPA.multivalued_text_widget, name:'mail'},
-                   {factory: IPA.multivalued_text_widget, name:'telephonenumber'},
-                   {factory: IPA.multivalued_text_widget, name:'pager'},
-                   {factory: IPA.multivalued_text_widget, name:'mobile'},
-                   {factory: IPA.multivalued_text_widget, name:'facsimiletelephonenumber'}]
+                fields: [
+                    { factory: IPA.multivalued_text_widget, name: 'mail' },
+                    { factory: IPA.multivalued_text_widget, name: 'telephonenumber' },
+                    { factory: IPA.multivalued_text_widget, name: 'pager' },
+                    { factory: IPA.multivalued_text_widget, name: 'mobile' },
+                    { factory: IPA.multivalued_text_widget, name: 'facsimiletelephonenumber' }
+                ]
             },
             {
                 name: 'mailing',
-                fields: ['street','l','st','postalcode']
+                fields: ['street', 'l', 'st', 'postalcode']
             },
             {
                 name: 'employee',
-                fields: ['ou','manager']
+                fields: ['ou', 'manager']
             },
             {
                 name: 'misc',
-                fields:['carlicense']
+                fields: ['carlicense']
             }]}).
         association_facet({
             name: 'memberof_group',
@@ -79,13 +102,10 @@ IPA.entity_factories.user = function() {
         }).
         standard_association_facets().
         adder_dialog({
-            fields: ['uid','givenname','sn']
+            fields: ['uid', 'givenname', 'sn']
         });
 
-
-    var entity = builder.build();
-
-    return entity;
+    return builder.build();
 };
 
 /* ATTRIBUTE CALLBACKS */
diff --git a/ipalib/plugins/baseldap.py b/ipalib/plugins/baseldap.py
index 4b80c6d06dc3125e3c75bfc167d3168712815f31..43533c8c969e368f450cb049235816db8a954b46 100644
--- a/ipalib/plugins/baseldap.py
+++ b/ipalib/plugins/baseldap.py
@@ -272,6 +272,9 @@ class LDAPObject(Object):
         'memberindirect': (
             'Indirect Member', None, 'no_indirect_'
         ),
+        'memberofindirect': (
+            'Indirect Member Of', None, 'not_in_indirect_'
+        ),
     }
     label = _('Entry')
 
diff --git a/ipalib/plugins/internal.py b/ipalib/plugins/internal.py
index c15b104f41d7d192ad3d77cb17734c16ad2f1a92..28bc3b212c70ed8ef0bdf1a371e479328d7e2b4a 100644
--- a/ipalib/plugins/internal.py
+++ b/ipalib/plugins/internal.py
@@ -340,6 +340,14 @@ class i18n_messages(Command):
             "remove_title":_("Remove ${entity}."),
             "prospective":_("Prospective"),
             },
+        "facet_groups":{
+            "managedby":_("Managed by"),
+            "member":_("Member"),
+            "memberindirect":_("Indirect Member"),
+            "memberof":_("Member Of"),
+            "memberofindirect":_("Indirect Member Of"),
+            "settings": _("Settings"),
+            },
         "facets":{
             "search":_("Search"),
             "details": _("Settings"),
-- 
1.7.4

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to