From 12551a1641c2b9229ea40b8bba361ef43610621c Mon Sep 17 00:00:00 2001 From: erickson Date: Thu, 2 Sep 2010 21:12:58 +0000 Subject: [PATCH] back-porting: 17416 17417 17418 => filtering-tree-select disable fields query w/ auto-widget pass-thru; disable non-user-group fields in patron editor git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_2_0@17461 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- .../web/js/dojo/openils/widget/AutoFieldWidget.js | 3 ++ .../js/dojo/openils/widget/FilteringTreeSelect.js | 40 ++++++++++++++++++++-- Open-ILS/web/js/ui/default/actor/user/register.js | 19 ++++++---- 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js b/Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js index 6cfe1cbba9..aeaaf01534 100644 --- a/Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js +++ b/Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js @@ -44,6 +44,8 @@ if(!dojo._hasResource['openils.widget.AutoFieldWidget']) { * dataLoader : Bypass the default PermaCrud linked data fetcher and use this function instead. * Function arguments are (link class name, search filter, callback) * The fetched objects should be passed to the callback as an array + * disableQuery : dojo.data query passed to FilteringTreeSelect-based widgets to disable + * (but leave visible) certain options. */ constructor : function(args) { for(var k in args) @@ -560,6 +562,7 @@ if(!dojo._hasResource['openils.widget.AutoFieldWidget']) { _buildPermGrpSelector : function() { dojo.require('openils.widget.FilteringTreeSelect'); this.widget = new openils.widget.FilteringTreeSelect(this.dijitArgs, this.parentNode); + this.widget.disableQuery = this.disableQuery; this.widget.searchAttr = 'name'; if(this.cache.permGrpTree) { diff --git a/Open-ILS/web/js/dojo/openils/widget/FilteringTreeSelect.js b/Open-ILS/web/js/dojo/openils/widget/FilteringTreeSelect.js index ac5fe1af48..1833f95703 100644 --- a/Open-ILS/web/js/dojo/openils/widget/FilteringTreeSelect.js +++ b/Open-ILS/web/js/dojo/openils/widget/FilteringTreeSelect.js @@ -24,6 +24,7 @@ if(!dojo._hasResource["openils.widget.FilteringTreeSelect"]){ parentField : 'parent', labelAttr : 'name', childField : 'children', + disableQuery : null, tree : null, startup : function() { @@ -44,6 +45,33 @@ if(!dojo._hasResource["openils.widget.FilteringTreeSelect"]){ this.store = new dojo.data.ItemFileReadStore({data:storeData}); } this.inherited(arguments); + + if(this.dataList.length > 0 && this.disableQuery) + this._setDisabled(); + }, + + _setDisabled : function() { + + // tag disabled items + this.store.fetch({ + query : this.disableQuery, + onItem : function(item) { item._disabled = 'true'; } + }); + + // disallow selecting of disabled items + var self = this; + dojo.connect(this, 'onChange', + function(ident) { + if(!ident) return; + self.store.fetchItemByIdentity({ + identity : ident, + onItem : function(item) { + if(item._disabled == 'true') + self.attr('value', ''); + } + }); + } + ); }, // Compile the tree down to a depth-first list of dojo data items @@ -52,18 +80,24 @@ if(!dojo._hasResource["openils.widget.FilteringTreeSelect"]){ var storeItem = node.toStoreItem(); storeItem._depth = depth++; this.dataList.push(storeItem); + for(var i in node[this.childField]()) this._makeNodeList(node[this.childField]()[i], depth); }, // For each item, find the depth at display time by searching up the tree. _getMenuLabelFromItem : function(item) { + + var style = 'padding-left:'+ (item._depth * this.defaultPad) +'px;'; + + if(item._disabled == 'true') // TODO: external CSS + style += 'background-color:#CCC;cursor:wait'; + return { html: true, - label: '
' + - this.store.getValue(item, this.labelAttr) + '
' + label: '
' + this.store.getValue(item, this.labelAttr) + '
' } - } + }, } ); } diff --git a/Open-ILS/web/js/ui/default/actor/user/register.js b/Open-ILS/web/js/ui/default/actor/user/register.js index 0c1015f2d4..94f6e45f8a 100644 --- a/Open-ILS/web/js/ui/default/actor/user/register.js +++ b/Open-ILS/web/js/ui/default/actor/user/register.js @@ -549,12 +549,7 @@ function fleshFMRow(row, fmcls, args) { if(value !== null) dijitArgs.value = value; - // fetch profile groups non-async so existing expire_date is - // not overwritten when the profile groups arrive and update - var sync = (fmfield == 'profile') ? true : false; - - var widget = new openils.widget.AutoFieldWidget({ - forceSync : sync, + var wargs = { idlField : fieldIdl, fmObject : fmObject, fmClass : fmcls, @@ -563,8 +558,18 @@ function fleshFMRow(row, fmcls, args) { dijitArgs : dijitArgs, orgDefaultsToWs : true, orgLimitPerms : ['UPDATE_USER'], - }); + }; + + if(fmfield == 'profile') { + // fetch profile groups non-async so existing expire_date is + // not overwritten when the profile groups arrive and update + wargs.forceSync = true; + wargs.disableQuery = {usergroup : 'f'}; + } else { + wargs.forceSync = false; + } + var widget = new openils.widget.AutoFieldWidget(wargs); widget.build(); // now put it back before we register the widget -- 2.11.0