[Freeipa-devel] Nesting widgets

Adam Young ayoung at redhat.com
Wed Oct 19 13:57:33 UTC 2011


Reposting to bring this discussion back to life.  We started having it 
on IRC.

On 09/28/2011 08:38 PM, Adam Young wrote:
> So I decided to try to get an IP Address widget working.  See the 
> attached patch.  It was fairly trivial.
>
> However, this widget is not really all that useful by itself.  It 
> would need to work as a part of a multivalued_text widget in order to 
> replace the widget used on the dnsrecord page.  And looking at the 
> multivalued text widget, I think you will agree that is going to be 
> tricky.
>
> The problem is that we don't really have the API set up for nesting.  
> This has burnt us on the Sections  as well as making more complex 
> widgets.  Usually, instead of reusing the widgets we have, it is 
> easier to go straight to the HTML.
>
> I think the crux comes from the 1-1  mapping between widgets and 
> fields of the request/result JSON.  For widget it is:  load(record)  
> and the load command knows how to find the value it needs inside the 
> record.  For save, on the other hand, it just returns the values it 
> needs.
>
>
> In order to make the widget scheme more nestable,    the section 
> section.load and save  can do more work,  such as scoping down the  
> piece of the request record to just that portion required by the 
> widget.  Bascially, it can do what widget.load does, just externally
>
>
>         var value = record[that.name];
>         if (value instanceof Array) {
>             widget.values = value;
>         } else {
>             widget.values = value ? [value] : [];
>         }
>
>         widget.writable = true;
>
>         if (widget.param_info) { Re:
>             if (widget.param_info.primary_key) {
>                 widget.writable = false;
>             }
>
>             if (widget.param_info.flags && 'no_update' in 
> that.param_info.flags) {
>                 widget.writable = false;
>             }
>         }
> Re:
>         if (widget.record.attributelevelrights) {
>             var rights = that.record.attributelevelrights[that.name];
>             if (!rights || rights.indexOf('w') < 0) {
>                 widget.writable = false;
>             }
>         }
>
>
> This seems to break encapsulation, but I think it might be the right 
> level of abstraction.  We can make this code reusable by other 
> sections by calling it something like section.widget_load.
>
> load then becomes nothing more than a call to reset for most widgets.  
> But, for the widgets that need nesting, or that need additional 
> rendering logic (like select) we still have a place for them to over 
> ride it.  I think it is telling that most of the overridden load 
> functions still cal the parent function first.  I thik that is an 
> indicator that what we have can be refactored.
>
>
> Looking through  widget.js,  I'd say that most of the widgets can be 
> safely redone this way.  Text_area.load looks suspect, it should 
> probbly be using the load functionality from the base class.  
> table_widget will need some thought, but I think it will work is the 
> value is set as an array, and then  the code   is called.
>
>       if (that.values) {
>             for (var i=0; i<that.values.length; i++) {
>                 var record = that.get_record(result, i);
>                 that.add_record(record);
>             }
>         }
>         that.unselect_all();
>
>
> I think that the save functions be OK as is.  the multivalue save 
> should be able to work with the result of calling sae from each 
> individual text area.
>
>
>
> So where would this help us. DNS records is probably the big one.  
> With users, we might have to store multiple keys or certificates.  We 
> don't currently validate email addresses, and we could there.  It 
> would probably simplify the code for ACIs, but there really is no 
> reason to put effort in to reworking that for its own sake.
>
>
>
> The other possibility is that we could redo the multivalue widget as a 
> section.  I know we've done that else where.  On the user page, the  
> Email addresses and phone numbers would then each go into their own 
> section....or we leave the multivlue widget there, but apply this 
> approach else where.  For DNS records, this means that each record 
> type would basically become its own section.  I don't favor this 
> approach, but I could buy the argument that redoing the widget API is 
> too much work.
>
>
>
>
>




More information about the Freeipa-devel mailing list