source: Dev/branches/rest-dojo-ui/client/rft/model/widgets/TabbedQuestionBrowser.js @ 417

Last change on this file since 417 was 417, checked in by hendrikvanantwerpen, 12 years ago

Put all model dependent code in one place. More separation of general and domain code.

File size: 4.7 KB
Line 
1define([
2    'dojo/_base/declare',
3    'dojo/_base/lang',
4    'dojo/_base/window',
5    'dijit/layout/ContentPane',
6    'dijit/layout/TabContainer',
7    'dojox/widget/Standby',
8    '../../store',
9    '../../widgets/Selector',
10    'dojo/domReady!'
11],function(declare,lang,win,ContentPane,TabContainer,Standby,store,Selector){
12    return declare([TabContainer],{
13        tabPosition: 'left-h',
14        include: 'all',
15
16        selectedActions: null,
17        itemActions: null,
18
19        _dataMap: null,
20        _busyCount: 0,
21        constructor: function(){
22            this.inherited(arguments);
23            this._dataMap = {};
24        },
25        postCreate: function() {
26            this.inherited(arguments);
27            this._query = '_design/questions/_view/'+this.include;
28        },
29        startup: function() {
30            if ( this._started ){ return; }
31            this.inherited(arguments);
32            this._busyWidget = new Standby({
33                target: this.domNode,
34                duration: 200
35            }).placeAt(win.body());
36            this._busyWidget.startup();
37            this.watch("selectedChildWidget",lang.hitch(this,function(name,oldTab,newTab){
38                this._fillCategoryTab(newTab.__category);
39            }));
40            store.query(this._query, {reduce:true,group:true,group_level:1})
41            .forPairs(lang.hitch(this,function(value,key){
42                this._createCategoryTab(key[0],value);
43            }));
44        },
45        _createCategoryTab: function(category,count) {
46            if (this._dataMap[category] === undefined) {
47                var categoryTab = new ContentPane({
48                    __category: category,
49                    title: (category || '[No category]')+" ("+count+")"
50                });
51                categoryTab.startup();
52                this._dataMap[category] = {
53                    _widget: categoryTab
54                };
55                this.addChild(categoryTab);
56            }
57        },
58        _fillCategoryTab: function(category) {
59            var categoryMap = this._dataMap[category];
60            if (!categoryMap._filled) {
61                this._busy();
62                categoryMap._filled = true;
63                store.query(this._query, {reduce:true,group:true,group_level:2,startkey:[category],endkey:[category,{}]})
64                .forPairs(lang.hitch(this,function(value,key){
65                    this._createTopicSelector(key[1],category,value);
66                })).then(lang.hitch(this,function(){
67                    this._done();
68                }));
69            }
70        },
71        _createTopicSelector: function(topic,category,count){
72            var categoryMap = this._dataMap[category];
73            if (categoryMap[topic] === undefined) {
74                var w = new Selector({
75                    __category: category,
76                    __topic: topic,
77                    title: (topic || '[No topic]')+" ("+count+")",
78                    selectedActions: this.selectedActions,
79                    itemActions: this.itemActions
80                }).placeAt(categoryMap._widget.containerNode);
81                w.startup();
82                categoryMap[topic] = {
83                    _widget: w
84                };
85                this._fillTopicSelector(topic,category);
86            }
87        },
88        _fillTopicSelector: function(topic,category) {
89            var categoryMap = this._dataMap[category];
90            var topicMap = categoryMap[topic];
91            if (!topicMap._filled) {
92                topicMap._filled = true;
93                this._busy();
94                store.query(this._query, {reduce:false,include_docs:true,key:[category,topic]})
95                .forEach(lang.hitch(this,function(value){
96                    var title;
97                    if ( this.include === 'all' ) {
98                        title = value.title+(value.publicationDate?' (published on '+value.publicationDate+')':' (unpublished)');
99                    }
100                    topicMap._widget.addItem(value,title);
101                })).then(lang.hitch(this,function(){
102                    this._done();
103                }));
104            }
105        },
106        _busy: function() {
107            if ( this._busyCount === 0 ) {
108                this._busyWidget.show();
109            }
110            this._busyCount++;
111        },
112        _done: function() {
113            if ( this._busyCount > 0 ) {
114                this._busyCount--;
115                if ( this._busyCount === 0 ) {
116                    this._busyWidget.hide();
117                }
118            } else {
119                console.warn('_done() was called more times than _busy().');
120            }
121        },
122        destroy: function() {
123            this._busyWidget.destroyRecursive();
124            this.inherited(arguments);
125        }
126    });
127});
Note: See TracBrowser for help on using the repository browser.