(untested) generic filtering, tree-indenting combobox
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 2 Jan 2009 21:34:45 +0000 (21:34 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 2 Jan 2009 21:34:45 +0000 (21:34 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@11735 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/web/js/dojo/openils/widget/FilteringTreeSelect.js [new file with mode: 0644]

diff --git a/Open-ILS/web/js/dojo/openils/widget/FilteringTreeSelect.js b/Open-ILS/web/js/dojo/openils/widget/FilteringTreeSelect.js
new file mode 100644 (file)
index 0000000..2e474eb
--- /dev/null
@@ -0,0 +1,67 @@
+/* EXAMPLES:
+
+<div dojoType="openils.widget.FilteringTreeSelect" tree="orgTree" parentField="parent_ou" nameField="shortname"/>
+<div dojoType="openils.widget.FilteringTreeSelect" tree="grpTree"/>
+
+The tree attribute is expected to be a tree-shaped pile of OpenSRF objects.
+
+*/
+
+if(!dojo._hasResource["openils.widget.FilteringTreeSelect"]){
+    dojo.provide("openils.widget.FilteringTreeSelect");
+    dojo.require("dijit.form.FilteringSelect");
+    dojo.require('dojo.data.ItemFileReadStore');
+    dojo.require('openils.Util');
+    dojo.require("dojox.jsonPath");
+
+    dojo.declare(
+        "openils.widget.FilteringTreeSelect", [dijit.form.ComboBox], 
+        {
+
+            defaultPad : 6,
+            childField : 'children',
+            parentField : 'parent',
+            nameField : 'name',
+            valueField : '',
+            tree : "",
+            options : [],
+            values : [],
+
+            startup : function () {
+                this._tree = dojox.jsonPath.query(window, '$.' + this.tree, {evalType:"RESULT"});
+                this._datalist = [];
+                if (!this.valueField) this.valueField = this._tree.Identifier;
+
+                this._add_items( this._tree, 0 );
+
+                var construct = {data : {identifier : this.valueField, items: this.datalist}};
+                this.store = new dojo.data.ItemFileReadStore(construct);
+
+                this.inherited(arguments);
+            },
+
+            _add_items : function ( node, depth ) {
+                var lpad = this.defaultPad * depth++;
+
+                var data = node.toStoreData();
+                data._label = '<div style="padding-left:'+lpad+'px;">' + node[this.nameField]() + '</div>';
+
+                this._datalist.push( data );
+
+                var kids = node[this.childField]();
+                for (var j in kids) {
+                    this._add_items( kids[j], depth );
+                }
+
+                return null;
+            },
+
+            _getMenuLabelFromItem : function(item) {
+                return {
+                    html: true,
+                    label: item._label
+                };
+            }
+        }
+    );
+}