On 07/08/2011 08:33 PM, Adam Young wrote:
Please do not push this yet. Is is merely posted to get an early code review. In order for this patch to be fully functional, it needs the dnsrecord_mod patch for the server to be pushed first.



Additionally, it uses many string literals that need to be put into the messages file for translation.


_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel
Now with unit test for entity_link widget, and cleaner naming for the other_entity.
From 0798fee081382d7c1da872613e50e6a756fc1e85 Mon Sep 17 00:00:00 2001
From: Adam Young <ayo...@redhat.com>
Date: Fri, 8 Jul 2011 12:06:30 -0400
Subject: [PATCH] dnsrecord-mod ui

Brings the DNS record infrastructure in line with the other entities.
Uses widgets, nested search, and a littel bit of overloading for dns specific behavior
The records now have their own page.

simplified link widget and use for dns
links work for nested entities.

https://fedorahosted.org/freeipa/ticket/1038
https://fedorahosted.org/freeipa/ticket/1448
https://fedorahosted.org/freeipa/ticket/577
https://fedorahosted.org/freeipa/ticket/1460

change the field in the link widget to other_entity to avoid name collision.

unit test for entity link.
---
 install/ui/add.js                        |    5 +
 install/ui/dns.js                        |  663 +++++++++---------------------
 install/ui/entity.js                     |    2 +-
 install/ui/host.js                       |   16 +-
 install/ui/navigation.js                 |   20 +
 install/ui/policy.js                     |    3 +-
 install/ui/search.js                     |    6 +-
 install/ui/test/data/dnsrecord_find.json |   37 ++-
 install/ui/test/data/dnsrecord_show.json |   73 ++++
 install/ui/test/widget_tests.js          |   35 ++
 install/ui/webui.js                      |    8 +-
 install/ui/widget.js                     |   68 ++--
 12 files changed, 430 insertions(+), 506 deletions(-)
 create mode 100644 install/ui/test/data/dnsrecord_show.json

diff --git a/install/ui/add.js b/install/ui/add.js
index 0a414b74b181e8d20fd80594a00f93b25c688f6e..b6b797c4502f28eda6f2a8f6e26cd69940dbc634 100644
--- a/install/ui/add.js
+++ b/install/ui/add.js
@@ -30,6 +30,7 @@ IPA.add_dialog = function (spec) {
     var that = IPA.dialog(spec);
 
     that.method = spec.method || 'add';
+    that.pre_execute_hook = spec.pre_execute_hook;
 
     function show_edit_page(entity_name,result){
         var pkey_name = IPA.metadata.objects[entity_name].primary_key;
@@ -160,9 +161,13 @@ IPA.add_dialog = function (spec) {
 
         //alert(JSON.stringify(command.to_json()));
 
+        if (that.pre_execute_hook){
+            that.pre_execute_hook(command);
+        }
         if (required_fields_filled){
             command.execute();
         }
+
     };
 
     that.add_dialog_init = that.init;
diff --git a/install/ui/dns.js b/install/ui/dns.js
index d689a89417e883a66152fa349d4a0f51292e1b47..25df539ce4f7cd07174940653615b48e411aeed1 100644
--- a/install/ui/dns.js
+++ b/install/ui/dns.js
@@ -54,13 +54,14 @@ IPA.entity_factories.dnszone = function() {
                     'idnsallowdynupdate',
                     'idnsupdatepolicy']}]
         }).
-        facet({
-            factory: IPA.dnsrecord_facet,
-            name: 'records',
+        nested_search_facet({
             facet_group: 'member',
+            nested_entity : 'dnsrecord',
+            name: 'records',
             title: IPA.metadata.objects.dnszone.label_singular,
             label: IPA.metadata.objects.dnsrecord.label,
-            columns: [
+            load: IPA.dns_record_search_load,
+            columns:[
                 {
                     name: 'idnsname',
                     label: IPA.get_entity_param('dnsrecord', 'idnsname').label,
@@ -87,6 +88,201 @@ IPA.entity_factories.dnszone = function() {
         build();
 };
 
+IPA.dns_record_search_load = function (result) {
+    this.table.empty();
+    var normalized_record;
+    var dns_record_types = IPA.dns_record_types();
+    for (var i = 0; i<result.length; i++) {
+        var record = result[i];
+        for (var j =0; j < dns_record_types.length; j += 1){
+            var record_type = dns_record_types[j].value;
+            if (record[record_type]){
+                var record_of_type = record[record_type];
+                for (var k =0;
+                     k < record_of_type.length;
+                     k+=1)
+                {
+                    normalized_record = {
+                        idnsname:record.idnsname,
+                        type:record_type,
+                        data:record_of_type[k]
+                    };
+                    this.table.add_record(normalized_record);
+
+                }
+            }
+        }
+    }
+};
+
+IPA.entity_factories.dnsrecord = function() {
+    return IPA.entity_builder().
+        entity('dnsrecord').
+        containing_entity('dnszone').
+        details_facet({
+            disable_breadcrumb: false,
+            sections:[
+               {
+                    name:'identity',
+                    fields:[
+                        { factory: IPA.entity_link_widget,
+                          name: 'idnsname',
+                          other_entity:'host',
+                          label:'FQDN',
+                          other_pkeys : function(){
+                              var pkey = this.entity.get_primary_key();
+                              return [pkey[0]+'.'+pkey[1]];
+                          }
+                        }
+                    ]
+               },
+                {
+                    name:'standard',
+                    label:'Standard Records',
+                    fields:[
+                        { factory: IPA.multivalued_text_widget,
+                          name: 'arecord',
+                          label:'A Records'
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          name: 'aaaarecord',
+                          label:'AAAA Records'
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          name: 'ptrrecord',
+                          label:'PTR Records'
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          name: 'srvrecord',
+                          label:'SRV Records'
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          name: 'txtrecord',
+                          label:'TXT Records'
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          name: 'cnamerecord',
+                          label:'CNAME Records'
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'MX',
+                          name:"mxrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'NS',
+                          name:"nsrecord"
+                        }
+
+                    ]
+                },
+                {
+                    name:'unusual',
+                    label:'Less common record types',
+                    fields:[
+                        { factory: IPA.multivalued_text_widget,
+                          label:'AFSDB',
+                          name: "afsdbrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'CERT',
+                          name:"certrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'DNAME',
+                          name:"dnamerecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'DSRECORD',
+                          name:"dsrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'KEY',
+                          name:"keyrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'KX',
+                          name:"kxrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'LOC',
+                          name:"locrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'NAPTR',
+                          name:"naptrrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'NSEC',
+                          name:"nsecrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'RRSIG',
+                          name:"rrsigrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'SIG',
+                          name:"sigrecord"
+                        },
+                        { factory: IPA.multivalued_text_widget,
+                          label:'SSHFP',
+                          name:"sshfprecord"
+                        }
+                    ]
+                }
+            ]
+        }).
+        adder_dialog({
+            pre_execute_hook:function(command){
+                var record_type = command.options.record_type;
+                var record_data = command.options.record_data;
+
+                delete  command.options.record_type;
+                delete  command.options.record_data;
+                command.options[record_type] = record_data;
+            },
+            fields: [
+                'idnsname',
+                {
+                    name:'record_type',
+                    label:IPA.messages.objects.dnsrecord.type,
+                    factory:IPA.dnsrecord_type_widget,
+                    undo: false
+                },
+                {
+                    name:'record_data',
+                    label:IPA.messages.objects.dnsrecord.data,
+                    factory:IPA.text_widget,
+                    undo: false
+                }
+            ]
+        }).
+        build();
+};
+
+IPA.dns_record_types = function(){
+    var attrs = IPA.metadata.objects.dnsrecord.default_attributes;
+    var record_types = [];
+    for (var i =0; i < attrs.length; i+=1){
+        var attr = attrs[i];
+        var index = attr.search('record$');
+        if (index > -1){
+            var rec_type = {
+                label:   attr.substring(0,index).toUpperCase(),
+                value:   attr
+            };
+            record_types.push(rec_type);
+        }
+    }
+    return record_types;
+};
+
+IPA.dnsrecord_type_widget = function (spec){
+
+    spec.options = IPA.dns_record_types();
+    var that = IPA.select_widget(spec);
+    return that;
+};
+
 IPA.force_dnszone_add_checkbox_widget = function(spec) {
     var param_info = IPA.get_method_option('dnszone_add', 'force');
     spec.name = 'force';
@@ -95,462 +291,3 @@ IPA.force_dnszone_add_checkbox_widget = function(spec) {
     spec.undo = false;
     return  IPA.checkbox_widget(spec);
 };
-
-IPA.dnsrecord_facet = function(spec) {
-
-    spec = spec || {};
-
-    spec.disable_breadcrumb = false;
-    spec.disable_facet_tabs = false;
-
-    var that = IPA.search_facet(spec);
-
-    function generate_recordtype_list(){
-        var attrs = IPA.metadata.objects.dnsrecord.default_attributes;
-        var record_types = [];
-        for (var i =0; i < attrs.length; i+=1){
-            var attr = attrs[i];
-            var index = attr.search('record$');
-            if (index > -1){
-                var rec_type = attr.substring(0,index);
-                record_types.push(rec_type);
-            }
-        }
-        return record_types;
-
-    }
-
-    var record_types =  generate_recordtype_list();
-
-    that.init = function() {
-
-        that.facet_init();
-
-        that.table = IPA.table_widget({
-            'class': 'content-table',
-            name: 'search',
-            label: IPA.metadata.objects[that.entity_name].label,
-            entity_name: that.entity_name,
-            scrollable: true
-        });
-
-        var columns = that.columns.values;
-        for (var i=0; i<columns.length; i++) {
-            var column = columns[i];
-            that.table.add_column(column);
-        }
-
-        that.table.select_changed = function() {
-            that.select_changed();
-        };
-
-        that.table.refresh = function() {
-            that.refresh();
-        };
-
-        that.table.init();
-    };
-
-    function create_type_select(id,add_none) {
-        var type_select = $('<select/>',{
-            id: id
-        });
-
-        if (add_none){
-            type_select.append($('<option/>', {
-                text: '(any)',
-                value: ''
-            }));
-        }
-        for (var t = 0 ; t < record_types.length ; t += 1){
-            var record_type = record_types[t].toUpperCase();
-
-            type_select.append($('<option/>',{
-                text: record_type,
-                value: record_type
-            }));
-        }
-        return type_select;
-    }
-
-    that.add = function() {
-
-        var title = IPA.messages.dialogs.add_title;
-        var label = IPA.metadata.objects.dnsrecord.label_singular;
-        title = title.replace('${entity}', label);
-
-        var dialog = IPA.dialog({
-            title: title
-        });
-
-        dialog.create = function() {
-
-            var dl = $('<dl/>').appendTo(dialog.container);
-
-            $('<dt/>', {
-                html: IPA.get_entity_param('dnsrecord', 'idnsname').label
-            }).appendTo(dl);
-
-            var dd = $('<dd/>').appendTo(dl);
-
-            dialog.resource = $('<input/>', {
-                type: 'text'
-            }).appendTo(dd);
-
-            $('<dt/>', {
-                html: IPA.messages.objects.dnsrecord.type
-            }).appendTo(dl);
-
-            dd = $('<dd/>').appendTo(dl);
-
-            dialog.type = create_type_select('dns-record-type').appendTo(dd);
-
-            $('<dt/>', {
-                html: IPA.messages.objects.dnsrecord.data
-            }).appendTo(dl);
-
-            dd = $('<dd/>').appendTo(dl);
-
-            dialog.data = $('<textarea/>', {
-                rows: 8,
-                cols: 20
-            }).appendTo(dd);
-        };
-
-        dialog.add_button(IPA.messages.buttons.add, function() {
-            dialog.add();
-            dialog.close();
-        });
-
-        dialog.add_button(IPA.messages.buttons.add_and_add_another, function() {
-            dialog.add();
-        });
-
-        dialog.add_button(IPA.messages.buttons.cancel, function() {
-            dialog.close();
-        });
-
-        dialog.add = function() {
-
-            var pkey = IPA.nav.get_state(that.entity_name+'-pkey');
-            var resource = dialog.resource.val();
-
-            var options = {};
-            var key =  dialog.type.val().toLowerCase()+'record';
-            options[key] = dialog.data.val();
-
-            var command = IPA.command({
-                entity: 'dnsrecord',
-                method: 'add',
-                args: [pkey, resource],
-                options: options,
-                on_success: function(data, text_status, xhr) {
-                    that.refresh();
-                }
-            });
-
-            command.execute();
-        };
-
-        dialog.init();
-
-        dialog.open(that.container);
-    };
-
-    that.remove = function() {
-
-        var values = that.table.get_selected_rows();
-
-        if (!values.length) {
-            return;
-        }
-
-        var zone = IPA.nav.get_state('dnszone-pkey');
-
-        var records = [];
-
-        values.each(function() {
-            var tr = $(this);
-
-            records.push({
-                resource: $('span[name=idnsname]', tr).text(),
-                type: $('span[name=type]', tr).text().toLowerCase(),
-                data: $('span[name=data]', tr).text()
-            });
-        });
-
-        var title = IPA.messages.dialogs.remove_title;
-        var label = IPA.metadata.objects.dnsrecord.label;
-        title = title.replace('${entity}', label);
-
-        var dialog = IPA.dialog({
-            title: title
-        });
-
-        dialog.create = function() {
-
-            var table = $('<table/>', {
-                'class': 'search-table'
-            }).appendTo(dialog.container);
-
-            var thead = $('<thead/>').appendTo(table);
-
-            var tr = $('<tr/>').appendTo(thead);
-
-            $('<th/>', {
-                text: IPA.get_entity_param('dnsrecord', 'idnsname').label
-            }).appendTo(tr);
-
-            $('<th/>', {
-                text: IPA.messages.objects.dnsrecord.type
-            }).appendTo(tr);
-
-            var tbody = $('<tbody/>').appendTo(table);
-
-            for (var i=0; i<records.length; i++) {
-                var record = records[i];
-
-                tr = $('<tr/>').appendTo(tbody);
-
-                $('<td/>', {
-                    html: record.resource
-                }).appendTo(tr);
-
-                $('<td/>', {
-                    html: record.type
-                }).appendTo(tr);
-            }
-
-            $('<p/>', {
-                text: IPA.messages.search.delete_confirm
-            }).appendTo(dialog.container);
-        };
-
-        dialog.add_button(IPA.messages.buttons.remove, function() {
-
-            var batch = IPA.batch_command({
-                on_success: function() {
-                    that.refresh();
-                    dialog.close();
-                },
-                on_error: function() {
-                    that.refresh();
-                    dialog.close();
-                }
-            });
-
-            for (var i=0; i<records.length; i++) {
-                var record = records[i];
-
-                var command = IPA.command({
-                    entity: 'dnsrecord',
-                    method: 'del',
-                    args: [zone, record.resource]
-                });
-
-                command.set_option(record.type+'record', record.data);
-
-                batch.add_command(command);
-            }
-
-            batch.execute();
-        });
-
-        dialog.add_button(IPA.messages.buttons.cancel, function() {
-            dialog.close();
-        });
-
-        dialog.init();
-
-        dialog.open(that.container);
-    };
-
-    that.create_header = function(container) {
-
-        that.facet_create_header(container);
-
-        var span = $('<span/>', {
-            'class': 'right-aligned-facet-controls'
-        }).appendTo(that.controls);
-
-        that.filter = $('<input/>', {
-            type: 'text',
-            'class': 'search-filter',
-            name: 'filter'
-        }).appendTo(span);
-
-        that.filter.keypress(function(e) {
-            /* if the key pressed is the enter key */
-            if (e.which == 13) {
-                that.find();
-            }
-        });
-
-        /*
-          The old DNS plugin allowed for search based on record type.
-          This one does not. If the plugin gets modified to support
-          Record type searches, uncomment the following lines and
-          adjust the code that modifies the search parameters.
-
-          that.controls.append('Type');
-          create_type_select('dns-record-type-filter',true).
-          appendTo(that.controls);
-        */
-
-        that.find_button = IPA.action_button({
-            name: 'find',
-            icon: 'search-icon',
-            click: function(){
-                that.find();
-                return false;
-            }
-        }).appendTo(span);
-
-        that.controls.append(IPA.create_network_spinner());
-
-        that.remove_button = IPA.action_button({
-            name: 'remove',
-            label: IPA.messages.buttons.remove,
-            icon: 'remove-icon',
-            click: function() {
-                if (that.remove_button.hasClass('input_link_disabled')) return false;
-                that.remove();
-                return false;
-            }
-        }).appendTo(that.controls);
-
-        that.add_button = IPA.action_button({
-            name: 'add',
-            label: IPA.messages.buttons.add,
-            icon: 'add-icon',
-            click: function() {
-                that.add();
-                return false;
-            }
-        }).appendTo(that.controls);
-    };
-
-    that.create_content = function(container) {
-
-        that.table.create(container);
-        that.table.setup(container);
-    };
-
-    that.setup = function(container) {
-
-        that.facet_setup(container);
-
-        //commented out until data is searchable
-        //control_span.append('Data');
-        //control_span.append($('<input />',{
-        //    type: "text",
-        //    id: 'dns-record-data-filter',
-        //    name: 'search-' + obj_name + '-filter'
-        //}));
-    };
-
-    that.show = function() {
-        that.facet_show();
-
-        that.record = IPA.nav.get_state(that.entity_name+'-record');
-        that.pkey = IPA.nav.get_state(that.entity_name+'-pkey');
-        that.header.set_pkey(that.pkey);
-    };
-
-
-    that.get_records = function(result) {
-        var idnsname;
-        if (result.idnsname) {
-            idnsname = result.idnsname[0];
-        } else {
-            idnsname = result.dn.split(',')[0].split('=')[1];
-        }
-
-        var records = [];
-        for (var i=0; i<record_types.length; i++){
-            var type = record_types[i];
-            var data = result[type+'record'] || [];
-            for (var j =0 ; j < data.length; j+=1){
-                var record = {
-                    idnsname: idnsname,
-                    type : type,
-                    data : data[j]
-                };
-                records.unshift(record);
-            }
-        }
-
-        return records;
-    };
-
-
-    that.refresh = function() {
-
-        function on_success(data, text_status, xhr) {
-
-            that.table.empty();
-
-            var result = data.result.result;
-            for (var i = 0; i<result.length; i++) {
-                var records = that.get_records(result[i]);
-
-                for (var j =0; j < records.length; j +=1){
-                    var record = records[j];
-                    that.table.add_record(record);
-                }
-            }
-
-            var summary = $('span[name=summary]', that.table.tfoot);
-            if (data.result.truncated) {
-                var message = IPA.messages.search.truncated;
-                message = message.replace('${counter}', data.result.count);
-                summary.text(message);
-            } else {
-                summary.text(data.result.summary);
-            }
-
-            that.filter.focus();
-            that.select_changed();
-        }
-
-        function on_error(xhr, text_status, error_thrown) {
-            var summary = $('span[name=summary]', that.table.tfoot).empty();
-            summary.append(error_thrown.name+': '+error_thrown.message);
-        }
-
-        var options = {};
-
-        var filter = that.filter.val();
-/*
-        if (filter){
-            options.idnsname = filter;
-        }
-
-        var type_filter = that.container.find("#dns-record-type-filter").val();
-        if (type_filter){
-            options.type = type_filter;
-        }
-
-        var data_filter = that.container.find("#dns-record-data-filter").val();
-        if (data_filter){
-            options.data = data_filter;
-        }
-*/
-        var args = [IPA.nav.get_state(that.entity_name+'-pkey')];
-
-        if (filter) {
-            args.push(filter);
-        }
-
-        IPA.command({
-            entity: 'dnsrecord',
-            method: 'find',
-            args: args,
-            options: options,
-            on_success: on_success,
-            on_error: on_error
-        }).execute();
-    };
-
-    return that;
-};
diff --git a/install/ui/entity.js b/install/ui/entity.js
index 82edb7bbe8bb36e409e8e89839905a2e43bf379c..ec0317897b9f94d4e278c55c1aced4d25de8ff2a 100644
--- a/install/ui/entity.js
+++ b/install/ui/entity.js
@@ -594,7 +594,7 @@ IPA.entity = function (spec) {
         return pkey;
     };
 
-    /*gets the primary key for trhe current entity out of the URL parameters */
+    /*gets the primary key for the current entity out of the URL parameters */
     that.get_primary_key = function() {
         var pkey = that.get_primary_key_prefix();
         var current_entity = that;
diff --git a/install/ui/host.js b/install/ui/host.js
index 6b5e3606e31c212483fa87f4f92061842bad279c..d73f06ba8e842d0a6c500a9297b810fbb3020752 100644
--- a/install/ui/host.js
+++ b/install/ui/host.js
@@ -39,7 +39,21 @@ IPA.entity_factories.host = function () {
             {
                 name:'details',
                 fields: [
-                    'fqdn',
+                    { factory: IPA.entity_link_widget,
+                      name: 'fqdn',
+                      other_entity:'dnsrecord',
+                      other_pkey : function(){
+                          return;
+                      },
+                      other_pkeys : function(){
+                          var pkey = this.entity.get_primary_key()[0];
+                          var first_dot = pkey.search(/\./);
+                          var pkeys = [];
+                          pkeys[1] = pkey.substring(0,first_dot);
+                          pkeys[0] = pkey.substring(first_dot+1);
+                          return pkeys;
+                      }
+                    },
                     'krbprincipalname',
                     {
                         factory: IPA.text_widget,
diff --git a/install/ui/navigation.js b/install/ui/navigation.js
index 9bcb20f057606f57a95528642bdb79b0de640959..25c519dcefd11b997765331ded37c66710ad17ed 100644
--- a/install/ui/navigation.js
+++ b/install/ui/navigation.js
@@ -172,6 +172,26 @@ IPA.navigation = function(spec) {
         that.push_state(state);
     };
 
+    /*like show page, but works for nested entities */
+    that.show_entity_page = function(entity, facet_name, pkeys) {
+        var state = that.get_path_state(entity.name);
+
+        if (facet_name) {
+            state[entity.name + '-facet'] = facet_name;
+        }
+
+        if (pkeys) {
+            var current_entity = entity;
+            while (current_entity){
+                state[current_entity.name + '-pkey'] = pkeys.pop();
+                current_entity = current_entity.containing_entity;
+            }
+        }
+
+        that.push_state(state);
+    };
+
+
     that.create = function() {
 
         var container = $('<div/>', {
diff --git a/install/ui/policy.js b/install/ui/policy.js
index cd0e499e14f4275c8f47806cc36aa9154ddf0c1b..46582f468c7f74ab2b3f6dd8a95b164a079e7926 100644
--- a/install/ui/policy.js
+++ b/install/ui/policy.js
@@ -37,8 +37,7 @@ IPA.entity_factories.pwpolicy = function() {
                         {
                             factory: IPA.entity_link_widget,
                             name: 'cn',
-                            entity: 'group',
-                            no_link_value: 'global_policy'
+                            other_entity: 'group'
                         },
                         'krbmaxpwdlife','krbminpwdlife','krbpwdhistorylength',
                         'krbpwdmindiffchars','krbpwdminlength']
diff --git a/install/ui/search.js b/install/ui/search.js
index b5f71e0d5ed7b201466aeed582b2b2dea2bd356b..adfd143cbfa70f16c863671d8982575cbb7393b7 100644
--- a/install/ui/search.js
+++ b/install/ui/search.js
@@ -261,7 +261,7 @@ IPA.search_facet = function(spec) {
         IPA.nav.push_state(state);
     };
 
-    that.load = function(result) {
+    function load(result) {
 
         that.table.empty();
 
@@ -269,7 +269,9 @@ IPA.search_facet = function(spec) {
             var record = that.table.get_record(result[i], 0);
             that.table.add_record(record);
         }
-    };
+    }
+
+    that.load = spec.load || load;
 
     that.refresh = function() {
         that.search_refresh(that.entity);
diff --git a/install/ui/test/data/dnsrecord_find.json b/install/ui/test/data/dnsrecord_find.json
index fa103d1098a039927dc8b66500fcf60349de26a2..87160e55ed0af4cd8e89af4e5a76f7fc4209c1ed 100644
--- a/install/ui/test/data/dnsrecord_find.json
+++ b/install/ui/test/data/dnsrecord_find.json
@@ -2,7 +2,7 @@
     "error": null,
     "id": null,
     "result": {
-        "count": 11,
+        "count": 12,
         "result": [
             {
                 "dn": "idnsname=ayoung.boston.devel.redhat.com,cn=dns,dc=server15,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com",
@@ -96,20 +96,41 @@
             },
             {
                 "aaaarecord": [
-                    "00::11",
-                    "00::112"
-                ],
-                "arecord": [
-                    "192.168.122.28",
-                    "1.2.3.4"
+                    "fec0::5054:ff:feb5:5a47"
                 ],
                 "dn": "idnsname=server15,idnsname=ayoung.boston.devel.redhat.com,cn=dns,dc=server15,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com",
                 "idnsname": [
                     "server15"
                 ]
+            },
+            {
+                "aaaarecord": [
+                    "feed:babe:beef:cafe::0001",
+                    "feed:babe:beef:cafe::0002",
+                    "feed:babe:beef:cafe::0004"
+                ],
+                "arecord": [
+                    "3.4.5.6",
+                    "1.3.5.7",
+                    "10.10.2.1"
+                ],
+                "dn": "idnsname=testrec,idnsname=ayoung.boston.devel.redhat.com,cn=dns,dc=server15,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com",
+                "idnsname": [
+                    "testrec"
+                ],
+                "keyrecord": [
+                    "key"
+                ],
+                "srvrecord": [
+                    "1 1 80 server15"
+                ],
+                "txtrecord": [
+                    "A TExt Record",
+                    "Another Text Record"
+                ]
             }
         ],
         "summary": null,
         "truncated": false
     }
-}
+}
\ No newline at end of file
diff --git a/install/ui/test/data/dnsrecord_show.json b/install/ui/test/data/dnsrecord_show.json
new file mode 100644
index 0000000000000000000000000000000000000000..e2a41254666fdbdd8a0d1f0910aa0a177e3a4ea7
--- /dev/null
+++ b/install/ui/test/data/dnsrecord_show.json
@@ -0,0 +1,73 @@
+{
+    "error": null,
+    "id": null,
+    "result": {
+        "result": {
+            "aaaarecord": [
+                "feed:babe:beef:cafe::0001",
+                "feed:babe:beef:cafe::0002",
+                "feed:babe:beef:cafe::0004"
+            ],
+            "arecord": [
+                "3.4.5.6",
+                "1.3.5.7",
+                "10.10.2.1"
+            ],
+            "attributelevelrights": {
+                "a6record": "rscwo",
+                "aaaarecord": "rscwo",
+                "aci": "rscwo",
+                "afsdbrecord": "rscwo",
+                "arecord": "rscwo",
+                "certrecord": "rscwo",
+                "cn": "rscwo",
+                "cnamerecord": "rscwo",
+                "dnamerecord": "rscwo",
+                "dnsclass": "rscwo",
+                "dnsttl": "rscwo",
+                "dsrecord": "rscwo",
+                "hinforecord": "rscwo",
+                "idnsallowdynupdate": "rscwo",
+                "idnsname": "rscwo",
+                "keyrecord": "rscwo",
+                "kxrecord": "rscwo",
+                "locrecord": "rscwo",
+                "mdrecord": "rscwo",
+                "minforecord": "rscwo",
+                "mxrecord": "rscwo",
+                "naptrrecord": "rscwo",
+                "nsaccountlock": "rscwo",
+                "nsecrecord": "rscwo",
+                "nsrecord": "rscwo",
+                "nxtrecord": "rscwo",
+                "objectclass": "rscwo",
+                "ptrrecord": "rscwo",
+                "rrsigrecord": "rscwo",
+                "sigrecord": "rscwo",
+                "srvrecord": "rscwo",
+                "sshfprecord": "rscwo",
+                "txtrecord": "rscwo"
+            },
+            "dn": "idnsname=testrec,idnsname=ayoung.boston.devel.redhat.com,cn=dns,dc=server15,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com",
+            "idnsname": [
+                "testrec"
+            ],
+            "keyrecord": [
+                "key"
+            ],
+            "objectclass": [
+                "top",
+                "idnsrecord"
+            ],
+            "srvrecord": [
+                "1 1 80 server15"
+            ],
+            "txtrecord": [
+                "A Text Record",
+                "Another Text Record"
+            ]
+        },
+        "summary": null,
+        "value": "testrec"
+    }
+}
\ No newline at end of file
diff --git a/install/ui/test/widget_tests.js b/install/ui/test/widget_tests.js
index f323f969718521c0de9928561b1479ec9ef09c0f..1abac1ca0a8cc91b50a814770da086890103da56 100644
--- a/install/ui/test/widget_tests.js
+++ b/install/ui/test/widget_tests.js
@@ -275,6 +275,41 @@ test("IPA.entity_select_widget" ,function(){
 });
 
 
+test("IPA.entity_link_widget" ,function(){
+    var widget = IPA.entity_link_widget({
+        name: 'gidnumber',
+        other_entity:'group',
+    });
+    base_widget_test(widget,'user','test_value');
+
+    var mock_entity = {
+        get_primary_key: function(){
+            return "";
+        }
+    };
+
+    mock_record = {'uid':'kfrog','gidnumber':'123456'};
+
+    widget.entity = mock_entity;
+    widget.create(widget_container);
+
+    var nonlink = widget_container.find('label');
+    var link = widget_container.find('a');
+
+    ok(nonlink.length > 1);
+    ok(link.length > 1);
+
+    widget.load(mock_record);
+
+    link = widget_container.find('a[text=123456]');
+
+    same(link.length, 1,'link is populated');
+    same(link.css('display'), 'inline','link is displayed');
+    same(widget.nonlink.css('display'), 'none','text is not displayed');
+
+});
+
+
 
 
 test("IPA.radio_widget" ,function(){
diff --git a/install/ui/webui.js b/install/ui/webui.js
index 06cfa1d6e83c71a1ff2832dc43bfea09ce139b0d..5e0063e341a4bdc54cd6fa4b4e8468b81a55a230 100644
--- a/install/ui/webui.js
+++ b/install/ui/webui.js
@@ -42,7 +42,13 @@ IPA.admin_navigation = function(spec) {
             {entity: 'service'}
         ]},
         {name: 'policy', label: IPA.messages.tabs.policy, children: [
-            {entity: 'dnszone', label: IPA.messages.tabs.dns},
+            {name:'dns',
+             label: IPA.messages.tabs.dns,
+             children:[
+                 {entity: 'dnszone', hidden:true},
+                 {entity: 'dnsrecord', hidden:true}
+             ]
+            },
             {name: 'hbac', label: IPA.messages.tabs.hbac, children: [
                  {entity: 'hbacrule'},
                  {entity: 'hbacsvc'},
diff --git a/install/ui/widget.js b/install/ui/widget.js
index 5eb58f6344c2d05687c53366db50822b598b6cd0..e48b64a24dae4730874233c794dd37517762ae45 100644
--- a/install/ui/widget.js
+++ b/install/ui/widget.js
@@ -161,7 +161,7 @@ IPA.widget = function(spec) {
 
     that.init = function() {
         if (that.entity_name) {
-            that.entity = IPA.get_entity(that.entity_name);
+            //that.entity = IPA.get_entity(that.entity_name);
             that.param_info = IPA.get_entity_param(that.entity_name, that.name);
 
             if (that.param_info) {
@@ -1749,10 +1749,12 @@ IPA.entity_select_widget = function(spec) {
 
 IPA.entity_link_widget = function(spec) {
     var that = IPA.widget(spec);
-    var no_link_value = spec.no_link_value || null;
-    var should_link = true;
-    var other_pkey = null;
-    var other_entity = spec.entity;
+    var other_entity = spec.other_entity;
+
+    function other_pkeys (){
+        return that.entity.get_primary_key();
+    }
+    that.other_pkeys = spec.other_pkeys || other_pkeys;
 
     that.super_create = that.create;
     that.create = function(container) {
@@ -1763,42 +1765,52 @@ IPA.entity_link_widget = function(spec) {
             title: '',
             html: '',
             click: function() {
-                if (should_link){
-                     IPA.nav.show_page(other_entity, 'default', other_pkey);
-                }
+                IPA.nav.show_entity_page(
+                    IPA.get_entity(other_entity),
+                    'default',
+                    that.other_pkeys());
                 return false;
             }
         }).appendTo(container);
 
-        that.label = $('<label/>').
+        that.nonlink = $('<label/>').
             appendTo(container);
     };
-    that.should_link = function(){
-        return (other_pkey !== no_link_value);
-    };
 
-    that.reset = function(record) {
-        other_pkey = null;
+    that.super_load = that.load;
+
+    that.load = function (record){
+        that.super_load(record);
         if (that.values || that.values.length > 0){
-            other_pkey = that.values[0];
-            var should_link =  that.should_link();
-            if (should_link){
-                that.link.html(other_pkey);
-                that.link.css('display','inline');
-                that.label.css('display','none');
-            }else{
-                that.label.html(other_pkey);
-                that.link.css('display','none');
-                that.label.css('display','inline');
-            }
+            that.nonlink.html(that.values[0]);
+            that.link.html(that.values[0]);
+            that.link.css('display','none');
+            that.nonlink.css('display','inline');
         }else{
-            should_link = false;
             that.link.html('');
-            that.label.html('');
+            that.nonlink.html('');
             that.link.css('display','none');
-            that.label.css('display','none');
+            that.nonlink.css('display','none');
         }
+
+        function find_success(result) {
+            if (result.result.count > 0){
+                that.link.css('display','inline');
+                that.nonlink.css('display','none');
+            }
+        }
+        function find_error(err){
+        }
+        IPA.command({
+            entity: other_entity,
+            method: 'find',
+            args:that.other_pkeys(),
+            options:{},
+            on_success:find_success,
+            on_error:find_error
+        }).execute();
     };
 
+
     return that;
 };
\ No newline at end of file
-- 
1.7.5.2

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

Reply via email to