summaryrefslogtreecommitdiffstatshomepage
path: root/includes/js/dojox/widget/Iterator.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojox/widget/Iterator.js')
-rw-r--r--includes/js/dojox/widget/Iterator.js177
1 files changed, 177 insertions, 0 deletions
diff --git a/includes/js/dojox/widget/Iterator.js b/includes/js/dojox/widget/Iterator.js
new file mode 100644
index 0000000..c2f510d
--- /dev/null
+++ b/includes/js/dojox/widget/Iterator.js
@@ -0,0 +1,177 @@
+if(!dojo._hasResource["dojox.widget.Iterator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.widget.Iterator"] = true;
+dojo.provide("dojox.widget.Iterator");
+dojo.require("dijit.Declaration");
+
+dojo.experimental("dojox.widget.Iterator"); // level: prototype, designed for dijit.chat.demo
+
+/*
+ example:
+ from markup:
+ | <span dojoType="dojo.data.ItemFileReadStore"
+ | jsId="cstore" url="countries.json"></span>
+ |
+ | <div>
+ | <div dojoType="dojox.widget.Iterator" store="cstore"
+ | query="{ name: 'A*'}">
+ | ${name} is a ${type}
+ | </div>
+ | </div>
+
+ example:
+ programmatic:
+ | var store = new dojo.data.ItemFileReadStore({ url: "countries.json" });
+ |
+ | var iter = new dojox.widget.Iterator({
+ | store: store,
+ | template: ""
+ | });
+ |
+
+ example:
+ programmatic from an array of objects:
+ | var dataArr = [
+ | { name: "foo", valueAttr: "bar" },
+ | { name: "thinger", valueAttr: "blah" }
+ | ];
+ |
+ | var iter = new dojox.widget.Iterator({
+ | data: dataArr,
+ | template: ""
+ | });
+
+ example:
+ programmatic from an array of strings:
+ | var dataArr = [
+ | { name: "foo", valueAttr: "bar" },
+ | { name: "thinger", valueAttr: "blah" }
+ | ];
+ |
+ | var iter = new dojox.widget.Iterator({
+ | data: dataArr,
+ | template: ""
+ | });
+
+*/
+
+
+dojo.declare("dojox.widget.Iterator",
+ [ dijit.Declaration ],
+ {
+
+ constructor: (function(){
+ var ctr = 0;
+ return function(){
+ this.attrs = [];
+ this.children = [];
+ this.widgetClass = "dojox.widget.Iterator._classes._"+(ctr++);
+ }
+ })(),
+
+ start: 0,
+ fetchMax: 1000,
+ query: { name: "*" },
+ attrs: [],
+ defaultValue: "",
+ widgetCtor: null,
+ dataValues: [], // an array of strings
+ data: null, // should be a reference to an Array
+ store: null,
+ _srcIndex: 0,
+ _srcParent: null,
+
+ _setSrcIndex: function(s){
+ this._srcIndex = 0;
+ this._srcParent = s.parentNode;
+ var ts = s;
+ while(ts.previousSibling){
+ this._srcIndex++;
+ ts = ts.previousSibling;
+ };
+ },
+
+ postscript: function(p, s){
+ // figure out the position of the source node in it's parent
+ this._setSrcIndex(s);
+ // this._srcIndex = dojo.query(">", this._srcParent).indexOf(s);
+
+ this.inherited("postscript", arguments);
+ var wc = this.widgetCtor = dojo.getObject(this.widgetClass);
+
+ this.attrs = dojo.map(
+ wc.prototype.templateString.match(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g),
+ function(s){ return s.slice(2, -1); }
+ );
+ dojo.forEach(
+ this.attrs,
+ function(m){ wc.prototype[m] = ""; }
+ );
+ this.update();
+ },
+
+ clear: function(){
+ if(this.children.length){
+ this._setSrcIndex(this.children[0].domNode);
+ }
+ dojo.forEach(this.children, "item.destroy();");
+ this.children = [];
+ },
+
+ update: function(){
+ if(this.store){
+ // we're executing a query
+ this.fetch();
+ }else{
+ // we came from an array of objects. Easier!
+ this.onDataAvailable(this.data||this.dataValues);
+ }
+ },
+
+ _addItem: function(/*Object*/config, idx){
+ if(dojo.isString(config)){
+ config = { value: config };
+ }
+ var widget = new this.widgetCtor(config);
+ this.children.push(widget);
+ dojo.place(widget.domNode, this._srcParent, this._srcIndex+idx);
+ },
+
+ getAttrValuesObj: function(item){
+ var obj = {};
+ if(dojo.isString(item)){
+ dojo.forEach(this.attrs, function(attr){
+ obj[attr] = (attr == "value") ? item : this.defaultValue;
+ }, this);
+ }else{
+ dojo.forEach(this.attrs, function(attr){
+ if(this.store){
+ obj[attr] = this.store.getValue(item, attr)||this.defaultValue;
+ }else{
+ obj[attr] = item[attr]||this.defaultValue;
+ }
+ }, this);
+ }
+ return obj;
+ },
+
+ onDataAvailable: function(data){
+ this.clear();
+ // console.debug(data);
+ dojo.forEach(data, function(item, idx){
+ this._addItem(this.getAttrValuesObj(item), idx);
+ }, this);
+ },
+
+ fetch: function(query, start, end){
+ this.store.fetch({
+ query: query||this.query,
+ start: start||this.start,
+ count: end||this.fetchMax,
+ onComplete: dojo.hitch(this,"onDataAvailable")
+ });
+ }
+});
+
+dojox.widget.Iterator._classes = {};
+
+}