https://fedorahosted.org/freeipa/ticket/885

--
Endi S. Dewata
From bc6f406a758d519500c90f948e8e30753760b50e Mon Sep 17 00:00:00 2001
From: Endi S. Dewata <edew...@redhat.com>
Date: Wed, 2 Feb 2011 10:35:23 -0600
Subject: [PATCH] Added undo for permission target.

https://fedorahosted.org/freeipa/ticket/885
---
 install/ui/aci.js            |  314 ++++++++++++++++++++----------------------
 install/ui/dialog.js         |    2 +-
 install/ui/ipa.css           |    6 -
 install/ui/test/aci_tests.js |   95 ++++++++++++-
 install/ui/widget.js         |   39 ++++--
 5 files changed, 269 insertions(+), 187 deletions(-)

diff --git a/install/ui/aci.js b/install/ui/aci.js
index 67c2d5f87bd748ce793eb2428d1750ea3cd2d943..036731237ee8a0f3bd80957520e9ee9ca546bf21 100644
--- a/install/ui/aci.js
+++ b/install/ui/aci.js
@@ -24,7 +24,7 @@
 /* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */
 
 
-IPA.attribute_table_widget = function(spec) {
+IPA.attributes_widget = function(spec) {
 
     spec = spec || {};
 
@@ -35,38 +35,43 @@ IPA.attribute_table_widget = function(spec) {
     var id = spec.name;
     var dd_class = "other";
 
-    that.create = function(container){
+    that.create = function(container) {
 
         var dd = $('<dd/>', {
             'class': dd_class
         }).appendTo(container);
 
-        var span = $('<span/>', {
-            name: 'attrs'
-        }).appendTo(dd);
-
         that.table = $('<table/>', {
             id:id,
-            'class':'search-table aci-attribute-table'}).
+            'class':'search-table aci-attribute-table'
+        }).
             append('<thead/>').
-            append($('<tbody/>')).
-            appendTo(span);
+            append('<tbody/>').
+            appendTo(dd);
 
         var tr = $('<tr></tr>').appendTo($('thead', that.table));
-        tr.append($('<th/>',{
+        tr.append($('<th/>', {
             style:"height:2em; vertical-align:bottom;",
             html:$('<input/>',{
                 type: "checkbox",
                 click: function(){
                     $('.aci-attribute').
                         attr('checked', $(this).attr('checked'));
-                }})
+                },
+                change: function() {
+                    that.show_undo();
+                }
+            })
         })).
             append('<th class="aci-attribute-column">Attribute</th>');
+
+        if (that.undo) {
+            that.create_undo(dd);
+        }
+
         if (that.object_type){
             that.populate (that.object_type);
         }
-
     };
 
     that.load = function(record) {
@@ -85,11 +90,11 @@ IPA.attribute_table_widget = function(spec) {
 
     that.update = function() {
         that.populate(that.object_type);
-        that.checkboxes_update();
         that.append();
+        that.checkboxes_update();
     };
 
-    that.populate = function(object_type){
+    that.populate = function(object_type) {
 
         $('tbody tr', that.table).remove();
 
@@ -100,22 +105,21 @@ IPA.attribute_table_widget = function(spec) {
 
         var aciattrs = metadata.aciattrs;
 
-        var attr_per_col = 400;
-        var col_span = aciattrs.length / attr_per_col + 1;
-
         var tbody = $('tbody', that.table);
-        var td;
-        for (var a = 0; a < aciattrs.length ; a += 1){
-            var value = aciattrs[a].toLowerCase();
-            var aci_tr =  $('<tr/>').appendTo(tbody);
 
-            td =  $('<td/>').appendTo(aci_tr);
+        for (var i=0; i<aciattrs.length ; i++){
+            var value = aciattrs[i].toLowerCase();
+            var aci_tr = $('<tr/>').appendTo(tbody);
+
+            var td =  $('<td/>').appendTo(aci_tr);
             td.append($('<input/>',{
                 type: 'checkbox',
-                id: 'aciattr-'+value,
-                name: 'attrs',
+                name: that.name,
                 value: value,
-                'class': 'aci-attribute'
+                'class': 'aci-attribute',
+                change: function() {
+                    that.show_undo();
+                }
             }));
             td =  $('<td/>').appendTo(aci_tr);
             td.append($('<label/>',{
@@ -130,14 +134,13 @@ IPA.attribute_table_widget = function(spec) {
         var unmatched = [];
 
         for (var i=0; i<that.values.length; i++) {
-            var cb = $('#aciattr-'+that.values[i]);
-            if (!cb.length){
+            var input = $('input[name="'+that.name+'"][value="'+that.values[i]+'"]', that.container);
+            if (!input.length) {
                 unmatched.push(that.values[i]);
             }
-            cb.attr('checked',true);
         }
 
-        if (unmatched.length > 0){
+        if (unmatched.length > 0) {
             var tbody = $('tbody', that.table);
 
             for (var j=0; j<unmatched.length; j++) {
@@ -147,11 +150,12 @@ IPA.attribute_table_widget = function(spec) {
                 var td = $('<td/>').appendTo(tr);
                 td.append($('<input/>', {
                     type: 'checkbox',
-                    checked: true,
-                    id: 'aciattr-'+value,
-                    name: 'attrs',
+                    name: that.name,
                     value: value,
-                    'class': 'aci-attribute'
+                    'class': 'aci-attribute',
+                    change: function() {
+                        that.show_undo();
+                    }
                 }));
 
                 td = $('<td/>').appendTo(tr);
@@ -165,47 +169,24 @@ IPA.attribute_table_widget = function(spec) {
     return that;
 };
 
-
-
-IPA.type_widget = function(spec) {
-
-    spec = spec || {};
-
-    var that = IPA.select_widget(spec);
-
-    that.filter = spec.filter || '';
-
-    that.create = function(container) {
-        that.select = $('<select/>', {
-            name: that.name,
-            id: 'object_type_select'
-        }).appendTo(container);
-    };
-
-    return that;
-};
-
-
-
-IPA.rights_widget = function(spec){
-    var rights = ['write','add','delete'];
+IPA.rights_widget = function(spec) {
 
     var that = IPA.checkboxes_widget(spec);
-    that.id = spec.id;
+
+    that.rights = ['write', 'add', 'delete'];
 
     that.create = function(container){
 
-        for (var i = 0; i < rights.length; i++){
+        for (var i = 0; i<that.rights.length; i++) {
             $('<dd/>').
             append($('<input/>', {
                 type: 'checkbox',
-                id: rights[i],
                 name: that.name,
-                value: rights[i],
+                value: that.rights[i],
                 'class': that.entity_name +'_'+ that.name
             })).
             append($('<label/>', {
-                text: rights[i]
+                text: that.rights[i]
             })).
             appendTo(container);
         }
@@ -220,7 +201,7 @@ IPA.rights_widget = function(spec){
 };
 
 
-IPA.hidden_widget = function(spec){
+IPA.hidden_widget = function(spec) {
     spec.label = '';
     var that = IPA.widget(spec);
     that.id = spec.id;
@@ -244,7 +225,7 @@ IPA.hidden_widget = function(spec){
 };
 
 
-IPA.rights_section = function () {
+IPA.rights_section = function() {
     var spec =  {
         'name':'rights',
         'label': 'Rights'
@@ -256,20 +237,19 @@ IPA.rights_section = function () {
 };
 
 
-IPA.target_section = function () {
+IPA.target_section = function(spec) {
 
-    var spec =  {
-        'name':'target',
-        'label': 'Target'
-    };
+    spec = spec || {};
 
     var that = IPA.details_section(spec);
 
+    that.undo = typeof spec.undo == 'undefined' ? true : spec.undo;
+
     var groupings = ['aci_by_type',  'aci_by_query', 'aci_by_group',
                      'aci_by_filter' ];
     var inputs = ['input', 'select', 'textarea'];
 
-    function disable_inputs(){
+    function disable_inputs() {
         for (var g = 0; g < groupings.length; g += 1 ){
             for (var t = 0 ; t < inputs.length; t += 1){
                 $('.' + groupings[g] + ' '+ inputs[t]).
@@ -277,14 +257,14 @@ IPA.target_section = function () {
             }
         }
     }
-    function enable_by(grouping){
+    function enable_by(grouping) {
         for (var t = 0 ; t < inputs.length; t += 1){
             $('.' + grouping + ' '+ inputs[t]).
                 attr('disabled', '');
         }
     }
 
-    function display_filter_target(dl){
+    function display_filter_target(dl) {
         $('<dt/>').
         append($('<input/>', {
             type: 'radio',
@@ -297,25 +277,21 @@ IPA.target_section = function () {
         })).
         appendTo(dl);
 
-        $('<dd/>', {
+        var span = $('<span/>', {
+            name: 'filter'
+        }).
+        appendTo(dl);
+
+        var dd = $('<dd/>', {
             'class': 'aci_by_filter first'
         }).
-        append(
-            $('<span/>', {
-                name: 'filter'
-            }).
-            append(
-                $('<input/>', {
-                    name: 'filter',
-                    disabled: 'true',
-                    type: 'text',
-                    id: 'aci_filter'
-                }))).
-        appendTo(dl);
+        appendTo(span);
+
+        that.filter_text.create(dd);
     }
 
 
-    function display_type_target(dl){
+    function display_type_target(dl) {
         $('<dt/>').
         append($('<input/>', {
             type: 'radio',
@@ -338,31 +314,14 @@ IPA.target_section = function () {
 
         that.type_select.create(span);
 
-        var select = that.type_select.select;
-        select.change(function() {
-            that.attribute_table.object_type = this.options[this.selectedIndex].value;
-            that.attribute_table.reset();
-        });
+        span = $('<span/>', {
+            name: 'attrs'
+        }).appendTo(dl);
 
-        select.append($('<option/>', {
-            value: '',
-            text: ''
-        }));
-
-        var type_params = IPA.get_param_info('permission', 'type');
-        for (var pc =0; pc <  type_params.values.length; pc += 1){
-            select.append($('<option/>', {
-                value: type_params.values[pc],
-                text: type_params.values[pc]
-            }));
-        }
-
-        that.attribute_table = that.get_field('attrs');
-
-        that.attribute_table.create(dl);
+        that.attribute_table.create(span);
     }
 
-    function display_query_target(dl){
+    function display_query_target(dl) {
         $('<dt/>').
         append($('<input/>', {
             type: 'radio',
@@ -374,25 +333,19 @@ IPA.target_section = function () {
         })).
         appendTo(dl);
 
-        $('<dd/>', {
+        var span = $('<span/>', {
+            name: 'subtree'
+        }).appendTo(dl);
+
+        var dd = $('<dd/>', {
             'class': 'aci_by_query first'
-        }).append(
-            $('<span/>', {
-                name: 'subtree'
-            }).append(
-                $('<textarea/>', {
-                    name: 'subtree',
-                    id: 'aci_query_text',
-                    cols: '30',
-                    rows: '1'
-                }))).
-        appendTo(dl);
+        }).appendTo(span);
+
+        that.subtree_textarea.create(dd);
     }
 
-    function display_group_target(dl){
-
-
-        $('<dt/>' ).
+    function display_group_target(dl) {
+        $('<dt/>').
             append($('<input />', {
                 type: 'radio',
                 name: 'aci_type',
@@ -403,17 +356,15 @@ IPA.target_section = function () {
             })).
             appendTo(dl);
 
-
         var span = $('<span/>', {
             name: 'targetgroup'
         }).appendTo(dl);
 
-        var dd =         $('<dd/>', {
+        var dd = $('<dd/>', {
             'class': 'aci_by_group first'
         }).
         appendTo(span);
 
-
         that.group_select.create(dd);
     }
 
@@ -427,22 +378,22 @@ IPA.target_section = function () {
         display_group_target(dl);
         display_type_target(dl);
 
-        $('#aci_by_filter', dl).click(function (){
+        $('#aci_by_filter', dl).click(function() {
             disable_inputs();
             enable_by(groupings[3]);
         });
 
-        $('#aci_by_type', dl).click(function (){
+        $('#aci_by_type', dl).click(function() {
             disable_inputs();
             enable_by(groupings[0]);
         });
 
-        $('#aci_by_query', dl).click(function (){
+        $('#aci_by_query', dl).click(function() {
             disable_inputs();
             enable_by(groupings[1]);
         });
 
-        $('#aci_by_group', dl).click(function (){
+        $('#aci_by_group', dl).click(function() {
             disable_inputs();
             enable_by(groupings[2]);
         });
@@ -452,6 +403,32 @@ IPA.target_section = function () {
 
     that.setup = function(container) {
         that.section_setup(container);
+
+        var select = that.type_select.select;
+
+        select.change(function() {
+            that.attribute_table.object_type = that.type_select.save()[0];
+            that.attribute_table.reset();
+        });
+
+        select.append($('<option/>', {
+            value: '',
+            text: ''
+        }));
+
+        var type_params = IPA.get_param_info('permission', 'type');
+        for (var i=0; i<type_params.values.length; i++){
+            select.append($('<option/>', {
+                value: type_params.values[i],
+                text: type_params.values[i]
+            }));
+        }
+
+        that.type_select.update = function() {
+            that.type_select.select_update();
+            that.attribute_table.object_type = that.type_select.save()[0];
+            that.attribute_table.reset();
+        };
     };
 
     function set_aci_type(record) {
@@ -489,34 +466,43 @@ IPA.target_section = function () {
     };
 
     that.init = function() {
-        that.add_field(IPA.text_widget({name: 'filter'}));
-        that.add_field(IPA.textarea_widget({name: 'subtree'}));
+        that.filter_text = IPA.text_widget({name: 'filter', undo: that.undo});
+        that.add_field(that.filter_text);
+
+        that.subtree_textarea = IPA.textarea_widget({
+            name: 'subtree',
+            cols: 30, rows: 1,
+            undo: that.undo
+        });
+        that.add_field(that.subtree_textarea);
 
         that.group_select = IPA.entity_select_widget(
-            {name: 'targetgroup', entity:'group'});
+            {name: 'targetgroup', entity:'group', undo: that.undo});
         that.add_field(that.group_select);
 
-        that.type_select = IPA.type_widget({name: 'type'});
+        that.type_select = IPA.select_widget({name: 'type', undo: that.undo});
         that.add_field(that.type_select);
 
-        that.attribute_table = IPA.attribute_table_widget({name: 'attrs'});
+        that.attribute_table = IPA.attributes_widget({name: 'attrs', undo: that.undo});
         that.add_field(that.attribute_table);
     };
 
-    that.save = function (record){
+    that.save = function(record) {
 
         var record_type = $("input[name='aci_type']:checked").attr('id');
 
-        if (record_type === 'aci_by_group'){
+        if (record_type === 'aci_by_group') {
             record.targetgroup = that.group_select.save()[0];
-        }else if (record_type === 'aci_by_type'){
-            record.type = $('#object_type_select option:selected').val();
+
+        } else if (record_type === 'aci_by_type') {
+            record.type = that.type_select.save()[0];
             record.attrs =   that.attribute_table.save().join(',');
-        }else if (record_type === 'aci_by_query'){
-            record.subtree = $('#aci_query_text').val();
-        }else if (record_type === 'aci_by_filter'){
-            var filter =  $('#aci_filter').val();
-            record.filter = filter;
+
+        } else if (record_type === 'aci_by_query') {
+            record.subtree = that.subtree_textarea.save([0]);
+
+        } else if (record_type === 'aci_by_filter') {
+            record.filter = that.filter_text.save()[0];
         }
     };
 
@@ -557,7 +543,7 @@ IPA.permission_details_facet = function(spec) {
     return that;
 };
 
-IPA.entity_factories.permission = function () {
+IPA.entity_factories.permission = function() {
 
     return IPA.entity({
         'name': 'permission'
@@ -572,7 +558,7 @@ IPA.entity_factories.permission = function () {
                 undo: false
             })).
             field(IPA.rights_widget({name: 'permissions', label: 'Permissions', join: true, undo: false})).
-            section(IPA.target_section())).
+            section(IPA.target_section({name: 'target', label: 'Target', undo: false}))).
         facet(IPA.search_facet().
               column({name:'cn'})).
         facet(IPA.permission_details_facet({ name: 'details' }).
@@ -580,12 +566,12 @@ IPA.entity_factories.permission = function () {
                   IPA.stanza({name:'identity', label:'Identity'}).
                       input({name: 'cn', 'read_only': true})).
               section(IPA.rights_section()).
-              section(IPA.target_section()));
+              section(IPA.target_section({name: 'target', label: 'Target'})));
 
 };
 
 
-IPA.entity_factories.privilege =  function() {
+IPA.entity_factories.privilege = function() {
     var that = IPA.entity({
         'name': 'privilege'
     }).
@@ -619,7 +605,7 @@ IPA.entity_factories.privilege =  function() {
 };
 
 
-IPA.entity_factories.role =  function() {
+IPA.entity_factories.role = function() {
     return  IPA.entity({
         'name': 'role'
     }).
@@ -648,7 +634,7 @@ IPA.entity_factories.role =  function() {
 };
 
 
-IPA.entity_factories.selfservice =  function() {
+IPA.entity_factories.selfservice = function() {
     return IPA.entity({
         'name': 'selfservice'
     }).
@@ -659,7 +645,7 @@ IPA.entity_factories.selfservice =  function() {
                 section(
                     IPA.stanza({name:'general', label:'General'}).
                         input({name:'aciname'}).
-                        custom_input(IPA.attribute_table_widget({
+                        custom_input(IPA.attributes_widget({
                             object_type:'user',
                             name:'attrs'
                         })))).
@@ -669,14 +655,14 @@ IPA.entity_factories.selfservice =  function() {
                 title: 'Add Self Service Definition'
             }).
                 field(IPA.text_widget({ name: 'aciname', undo: false})).
-                field(IPA.attribute_table_widget({
+                field(IPA.attributes_widget({
                     object_type:'user',
                     name:'attrs'
                 })));
 };
 
 
-IPA.entity_factories.delegation =  function() {
+IPA.entity_factories.delegation = function() {
     var that = IPA.entity({
         'name': 'delegation'
     }).facet(
@@ -694,20 +680,22 @@ IPA.entity_factories.delegation =  function() {
                              entity:'group', join: true})).
                         custom_input(
                             IPA.rights_widget({name: 'permissions', label: 'Permissions',
-                                id:'delegation_rights', join: true})).
+                                join: true})).
                         custom_input(
-                            IPA.attribute_table_widget({
+                            IPA.attributes_widget({
                                 name:'attrs', object_type:'user', join: true})))).
         add_dialog(IPA.add_dialog({
             name: 'add',
-            title: 'Add Delegation'
+            title: 'Add Delegation',
+            width: '700px'
         }).
-                   field(IPA.text_widget({ name: 'aciname', undo: false})).
-                   field(IPA.entity_select_widget({name:'group',
-                                                   entity:'group'})).
-                   field(IPA.entity_select_widget({name:'memberof',
-                                                   entity:'group', join: true})).
-                   field(IPA.attribute_table_widget({ name: 'attrs', object_type:'user', join: true}))).
+            field(IPA.text_widget({ name: 'aciname', undo: false})).
+            field(IPA.entity_select_widget({name:'group',
+                entity:'group', undo: false})).
+            field(IPA.entity_select_widget({name:'memberof', entity:'group',
+                join: true, undo: false})).
+            field(IPA.attributes_widget({ name: 'attrs', object_type:'user',
+                join: true, undo: false}))).
         standard_associations();
     return that;
 
diff --git a/install/ui/dialog.js b/install/ui/dialog.js
index c2640267a5df9b293784ca1deddce626e86f8c77..b1f84a98bbd11a827415664d1357cdf90cb90fb3 100644
--- a/install/ui/dialog.js
+++ b/install/ui/dialog.js
@@ -157,7 +157,7 @@ IPA.dialog = function(spec) {
             field.setup(span);
         }
 
-        for (var j = 0; i<that.sections.length; j++) {
+        for (var j=0; j<that.sections.length; j++) {
             var section = that.sections[j];
 
             var div = $('#'+that.entity_name+'-'+that.name+'-'+section.name,
diff --git a/install/ui/ipa.css b/install/ui/ipa.css
index 6ba60dfff2a0e2568034d5d6ce6ca146dc11bcbc..8cde2fd14fbd8d2824cfdf6020ff7369f2fe277f 100644
--- a/install/ui/ipa.css
+++ b/install/ui/ipa.css
@@ -308,12 +308,6 @@ dl.aci-target input {
 
 }
 
-#aci_target_group_select {
-	display: block;
-	margin-left: 32em !important;
-	margin-top: -4em;
-}
-
 #group_filter {
 	margin-right: 2em;
 }
diff --git a/install/ui/test/aci_tests.js b/install/ui/test/aci_tests.js
index 1d9665990b9d43c037c5b93bfb45fb016bc50ab3..d1a5cb6bfa586a58c2e2cea609fd7169e9f7b6e5 100644
--- a/install/ui/test/aci_tests.js
+++ b/install/ui/test/aci_tests.js
@@ -19,8 +19,8 @@
  */
 
 
+var target_container;
 var target_section;
-var aci_container;
 
 module('aci',{
        setup: function() {
@@ -29,23 +29,104 @@ module('aci',{
                "data",
                true,
                function(data, text_status, xhr) {
-                   ok(true, "ipa_init() succeeded.");
                },
                function(xhr, text_status, error_thrown) {
                    ok(false, "ipa_init() failed: "+error_thrown);
                }
            );
-           aci_container = $('<div id="aci"/>').appendTo(document.body);
-           target_section = IPA.target_section();
+
+           target_container = $('<div id="target"/>').appendTo(document.body);
+           target_section = IPA.target_section({name: 'target', label: 'Target'});
            target_section.init();
-           target_section.create(aci_container);
+           target_section.create(target_container);
        },
        teardown: function() {
-           aci_container.remove();
+           target_container.remove();
        }}
 );
 
 
+test("IPA.attributes_widget.", function() {
+
+    var aciattrs = IPA.metadata['user'].aciattrs;
+
+    var container = $('<span/>', {
+        name: 'attrs'
+    });
+
+    var widget = IPA.attributes_widget({
+        name: 'attrs',
+        object_type: 'user'
+    });
+
+    widget.init();
+    widget.create(container);
+    widget.setup(container);
+
+    var table = $('table', container);
+
+    ok(
+        table,
+        'Widget contains table'
+    );
+
+    var tr = $('tbody tr', table);
+
+    same(
+        tr.length, aciattrs.length,
+        'Widget contains all user ACI attributes'
+    );
+
+    var record = {
+        'attrs': [
+            "unmatched",
+            "cn",
+            "description"
+        ]
+    };
+
+    same(
+        widget.save(), [],
+        'Widget has no initial values'
+    );
+
+    widget.load(record);
+
+    tr = $('tbody tr', table);
+
+    same(
+        tr.length, aciattrs.length+1,
+        'Widget contains all user ACI attributes plus 1 unmatched attribute'
+    );
+
+    same(
+        widget.save(), record.attrs.sort(),
+        'All loaded values are saved and sorted'
+    );
+});
+
+test("IPA.rights_widget.", function() {
+
+    var container = $('<span/>', {
+        name: 'permissions'
+    });
+
+    var widget = IPA.rights_widget({
+        name: 'permissions'
+    });
+
+    widget.init();
+    widget.create(container);
+    widget.setup(container);
+
+    var inputs = $('input', container);
+
+    same(
+        inputs.length, widget.rights.length,
+        'Widget displays all permissions'
+    );
+});
+
 test("Testing aci grouptarget.", function() {
     var sample_data_filter_only = {"targetgroup":"ipausers"};
     target_section.load(sample_data_filter_only);
@@ -59,7 +140,7 @@ test("Testing aci grouptarget.", function() {
 test("Testing aci object type.", function() {
     var sample_data_filter_only = {"type":"hostgroup"};
     target_section.load(sample_data_filter_only);
-    ok($('.aci-attribute', aci_container).length > 4);
+    ok($('.aci-attribute', target_container).length > 4);
     ok($('#aci_by_type')[0].checked, 'aci_by_type control selected');
 
 });
diff --git a/install/ui/widget.js b/install/ui/widget.js
index 9f6365a0bd442633cb538df4a7ea8d96d8f1061e..8f3eeb62f8dbf56d452b72890280852a77562fbd 100644
--- a/install/ui/widget.js
+++ b/install/ui/widget.js
@@ -32,7 +32,10 @@ IPA.widget = function(spec) {
     that.name = spec.name;
     that.label = spec.label;
     that.tooltip = spec.tooltip;
+
+    that.disabled = spec.disabled;
     that.read_only = spec.read_only;
+
     that._entity_name = spec.entity_name;
 
     that.width = spec.width;
@@ -257,14 +260,18 @@ IPA.text_widget = function(spec) {
         $('<input/>', {
             type: 'text',
             name: that.name,
+            disabled: that.disabled,
             size: that.size,
             title: that.tooltip
         }).appendTo(container);
 
         if (that.undo) {
+            container.append(' ');
             that.create_undo(container);
         }
 
+        container.append(' ');
+
         $("<span/>",{
             name:'error_link',
             html:"Text does not match field pattern",
@@ -452,11 +459,11 @@ IPA.checkboxes_widget = function (spec) {
             inputs.get(i).checked = false;
         }
 
-        for (var j=0; j<that.values.length; j++) {
+        for (var j=0; that.values && j<that.values.length; j++) {
             var value = that.values[j];
             var input = $('input[name="'+that.name+'"][value="'+value+'"]', that.container);
             if (!input.length) continue;
-            input.get(0).checked = true;
+            input.attr('checked', true);
         }
     };
 
@@ -521,13 +528,11 @@ IPA.radio_widget = function(spec) {
 
     that.update = function() {
 
-
-
         if (that.values) {
             var value;
-            if ((that.values instanceof Array ) && that.values.length){
-                value = that.values[0]
-            }else{
+            if ((that.values instanceof Array) && that.values.length) {
+                value = that.values[0];
+            } else {
                 value = that.values;
             }
 
@@ -575,6 +580,7 @@ IPA.select_widget = function(spec) {
         }
 
         if (that.undo) {
+            container.append(' ');
             that.create_undo(container);
         }
     };
@@ -623,6 +629,7 @@ IPA.select_widget = function(spec) {
     // methods that should be invoked by subclasses
     that.select_load = that.load;
     that.select_save = that.save;
+    that.select_update = that.update;
 
     return that;
 };
@@ -639,13 +646,15 @@ IPA.textarea_widget = function (spec) {
     that.create = function(container) {
 
         $('<textarea/>', {
+            name: that.name,
             rows: that.rows,
             cols: that.cols,
-            name: that.name,
+            disabled: that.disabled,
             title: that.tooltip
         }).appendTo(container);
 
         if (that.undo) {
+            container.append(' ');
             that.create_undo(container);
         }
 
@@ -663,7 +672,7 @@ IPA.textarea_widget = function (spec) {
 
         var input = $('textarea[name="'+that.name+'"]', that.container);
         input.keyup(function() {
-            undo.css('display', 'inline');
+            that.show_undo();
 
             var value = $(this).val();
             that.validate_input(value);
@@ -1055,6 +1064,7 @@ IPA.table_widget = function (spec) {
 
     return that;
 };
+
 IPA.entity_select_widget = function(spec){
 
     var that = IPA.widget(spec);
@@ -1064,6 +1074,14 @@ IPA.entity_select_widget = function(spec){
     function populate_select(value){
         function find_success(result){
             $('option', that.entity_select).remove();
+
+            // add default empty value
+            $('<option/>', {
+                text: '',
+                value: ''
+            }).
+            appendTo(that.entity_select);
+
             var entities = result.result.result;
             for (var i =0; i < result.result.count; i +=1){
                 var entity = entities[i];
@@ -1155,7 +1173,8 @@ IPA.entity_select_widget = function(spec){
     };
 
     that.save = function(){
-        return [$('option:selected', that.entity_select).val()];
+        var value = $('option:selected', that.entity_select).val();
+        return [value];
     };
 
     return that;
-- 
1.6.6.1

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

Reply via email to