]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/FilteringTreeSelect.js
(untested) generic filtering, tree-indenting combobox
[working/Evergreen.git] / Open-ILS / web / js / dojo / openils / widget / FilteringTreeSelect.js
1 /* EXAMPLES:
2
3 <div dojoType="openils.widget.FilteringTreeSelect" tree="orgTree" parentField="parent_ou" nameField="shortname"/>
4 <div dojoType="openils.widget.FilteringTreeSelect" tree="grpTree"/>
5
6 The tree attribute is expected to be a tree-shaped pile of OpenSRF objects.
7
8 */
9
10 if(!dojo._hasResource["openils.widget.FilteringTreeSelect"]){
11     dojo.provide("openils.widget.FilteringTreeSelect");
12     dojo.require("dijit.form.FilteringSelect");
13     dojo.require('dojo.data.ItemFileReadStore');
14     dojo.require('openils.Util');
15     dojo.require("dojox.jsonPath");
16
17     dojo.declare(
18         "openils.widget.FilteringTreeSelect", [dijit.form.ComboBox], 
19         {
20
21             defaultPad : 6,
22             childField : 'children',
23             parentField : 'parent',
24             nameField : 'name',
25             valueField : '',
26             tree : "",
27             options : [],
28             values : [],
29
30             startup : function () {
31                 this._tree = dojox.jsonPath.query(window, '$.' + this.tree, {evalType:"RESULT"});
32                 this._datalist = [];
33                 if (!this.valueField) this.valueField = this._tree.Identifier;
34
35                 this._add_items( this._tree, 0 );
36
37                 var construct = {data : {identifier : this.valueField, items: this.datalist}};
38                 this.store = new dojo.data.ItemFileReadStore(construct);
39
40                 this.inherited(arguments);
41             },
42
43             _add_items : function ( node, depth ) {
44                 var lpad = this.defaultPad * depth++;
45
46                 var data = node.toStoreData();
47                 data._label = '<div style="padding-left:'+lpad+'px;">' + node[this.nameField]() + '</div>';
48
49                 this._datalist.push( data );
50
51                 var kids = node[this.childField]();
52                 for (var j in kids) {
53                     this._add_items( kids[j], depth );
54                 }
55
56                 return null;
57             },
58
59             _getMenuLabelFromItem : function(item) {
60                 return {
61                     html: true,
62                     label: item._label
63                 };
64             }
65         }
66     );
67 }