On 07/24/2013 03:52 PM, Ana Krivokapic wrote:
On 07/23/2013 06:09 PM, Petr Vobornik wrote:
On 07/22/2013 04:46 PM, Ana Krivokapic wrote:
On 07/18/2013 09:47 AM, Petr Vobornik wrote:
On 07/17/2013 09:18 PM, Ana Krivokapic wrote:
Hello,

This patch addresses ticket https://fedorahosted.org/freeipa/ticket/3793.


Hello,

1) IMO  we should not create attribute which is just a negation of another.

2) We should add set_enabled method to base widget. Existing set_enabled
methods should use it and maintain widget output consistent with the attribute
(ie. one should not directly set the attr and should use set_enabled instead).
The method should be also callable when content is not yet created.
get_enabled methods might become unnecessary - one can get the state form
'enabled' attribute.


The attached updated patch implements the following changes:

1) set_enabled method has been added to the base widget class.
2) get_enabled/is_enabled methods have been removed.
3) Widget classes that inherit from the base widget class override the
set_enabled method where necessary.
4) Using 'enabled: true/false' in the widget definition should now work
correctly for all types of widgets.



Thanks.

1. set_enabled method in input_widget uses `that.input`. Input widget is a
base class which doesn't set the property and therefore we can't be certain
that the descendant will set it. Also it may break when you call
set_enabled(val) before create() .

We should test for `that.input` presence.

Same content-created test should be perform on other places:
widget.js:1017,1147,2006

2. The changes in option_widget_base break disabling if user doesn't have
write-rights. (can be reproduced when navigated (by manual change of url) to
service in self-service.

Note the differences between read_only, writable and enabled:
* read_only - reflects metadata
* writable - reflects ACL
* enabled - context specific

read_only and writable don't offer edit interface (label instead of textbox).
Enabled controls disabled state of textbox. For some widgets the result might
be the same (radios, checkboxes).

option_widget_base.set_enabled should be changed. The mixin overwrites the
original method and therefore doesn't set 'enabled' property.

3. multiple_choice_section.set_enabled should be renamed. It's related to
individual choices and not the widget itself. And then new set_enabled should
be added which would call the old one for each choice.

4. widget.js:3870 - not sure if it's needed but if so, one should also change
`action_clicked` method.


All fixed. Updated patch attached.

Thanks for the review.


1. Following code is incorrect (line 2030):

        var input = $('input[name="'+that.name+'"]', that.table);
        if (input) {
            input.prop('disabled', !enabled);
        }

It will perform document wide search, when that.table is not set, and find all inputs with that.name. The test should be:

        if (that.table) {
$('input[name="'+that.name+'"]', that.table).prop('disabled', !enabled);
        }

2. There are issues with option_widget_base. This widget is really a beast.

a) There is an existing issue - that.container is not set - which revealed itself in this patch. The result is that nested options are not enabled. Attaching a fix.

b) I have doubts about option_widget_base changes on line ~1023. It will most-likely work for our cases, but has unwanted behavior. It will set enabled to false if read_only or writable is false. So enabled will remain false even when writable/read_only changes back to true. It won't probably happen, but it might if user would somehow obtain new rights during Web UI lifetime.

It may be better if original set_enabled method would be renamed and it would only reflect the desired state in UI.

Proposed changes are also in attached diff.


I'm thinking about developing a testing page with various widgets where one could test how they behave with various setting.

--
Petr Vobornik
diff --git a/install/ui/src/freeipa/widget.js b/install/ui/src/freeipa/widget.js
index 739abcd..f6bcd64 100644
--- a/install/ui/src/freeipa/widget.js
+++ b/install/ui/src/freeipa/widget.js
@@ -910,7 +910,7 @@ IPA.option_widget_base = function(spec, that) {
 
             var parents_selected = [];
 
-            $(that._selector+':checked', that.container).each(function() {
+            $(that._selector+':checked', that.$node).each(function() {
                 var value = $(this).val();
                 var option = that.get_option(value);
                 if (option && option.nested) {
@@ -924,7 +924,7 @@ IPA.option_widget_base = function(spec, that) {
 
                 if (option.nested) {
                     var selected = parents_selected.indexOf(option.value) > -1;
-                    option.widget.set_enabled(selected, true);
+                    option.widget.update_enabled(selected, true);
                 }
             }
         }
@@ -937,7 +937,7 @@ IPA.option_widget_base = function(spec, that) {
 
         if (that.$node) {
 
-            $(that._selector+':checked', that.container).each(function() {
+            $(that._selector+':checked', that.$node).each(function() {
                 var value = $(this).val();
                 var child_values = [];
                 var option = that.get_option(value);
@@ -970,7 +970,7 @@ IPA.option_widget_base = function(spec, that) {
 
             var writable = !that.read_only && !!that.writable && that.enabled;
             if (!that.nested) {
-                that.set_enabled(writable);
+                that.update_enabled(writable);
             }
 
             if (values && values.length > 0) {
@@ -996,7 +996,7 @@ IPA.option_widget_base = function(spec, that) {
                         check(that._selector+'[value="'+ option.value +'"]');
                     }
                     if (option.widget) {
-                        option.widget.set_enabled(writable && has_opt, false);
+                        option.widget.update_enabled(writable && has_opt, false);
                     }
                 }
             } else {
@@ -1013,6 +1013,7 @@ IPA.option_widget_base = function(spec, that) {
                 var widget = that._child_widgets[j];
                 widget.writable = that.writable;
                 widget.read_only = that.read_only;
+                widget.enabled = that.enabled;
                 widget.update(values);
             }
         }
@@ -1020,21 +1021,22 @@ IPA.option_widget_base = function(spec, that) {
         that.updated.notify([], that);
     };
 
-    that.set_enabled = function(enabled, clear) {
-        if (that.widget_set_enabled) {
-            that.widget_set_enabled(enabled);
-        } else {
-            that.enabled = enabled;
-        }
+    that.set_enabled = function(enabled) {
 
-        if (that._selector && that.container) {
-            $(that._selector, that.container).prop('disabled', !enabled);
-        }
+        that.enabled = enabled;
+        that.update_enabled(enabled);
+    };
+
+    that.update_enabled = function(enabled, clear) {
+
+        if (!that.$node) return;
+
+        $(that._selector, that.$node).prop('disabled', !enabled);
 
         if (!enabled && clear) that.clear();
 
         for (var i=0; i<that._child_widgets.length;i++) {
-            that._child_widgets[i].set_enabled(enabled, clear);
+            that._child_widgets[i].update_enabled(enabled, clear);
         }
     };
 
_______________________________________________
Freeipa-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to