source: Dev/trunk/client/qed/model/widgets/TabbedQuestionBrowser.js @ 442

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

Make dragging questions optional.

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],function(declare,lang,win,ContentPane,TabContainer,Standby,store,Selector){
11    return declare([TabContainer],{
12        tabPosition: 'left-h',
13        include: 'all',
14
15        selectedActions: null,
16        itemActions: null,
17        dndType: "question",
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                    dndType: this.dndType,
78                    title: (topic || '[No topic]')+" ("+count+")",
79                    selectedActions: this.selectedActions,
80                    itemActions: this.itemActions
81                }).placeAt(categoryMap._widget.containerNode);
82                w.startup();
83                categoryMap[topic] = {
84                    _widget: w
85                };
86                this._fillTopicSelector(topic,category);
87            }
88        },
89        _fillTopicSelector: function(topic,category) {
90            var categoryMap = this._dataMap[category];
91            var topicMap = categoryMap[topic];
92            if (!topicMap._filled) {
93                topicMap._filled = true;
94                this._busy();
95                store.query(this._query, {reduce:false,include_docs:true,key:[category,topic]})
96                .forEach(lang.hitch(this,function(value){
97                    var title;
98                    if ( this.include === 'all' ) {
99                        title = value.title+(value.publicationDate?' (published on '+value.publicationDate+')':' (unpublished)');
100                    }
101                    topicMap._widget.addItem(value,title);
102                })).then(lang.hitch(this,function(){
103                    this._done();
104                }));
105            }
106        },
107        _busy: function() {
108            if ( this._busyCount === 0 ) {
109                this._busyWidget.show();
110            }
111            this._busyCount++;
112        },
113        _done: function() {
114            if ( this._busyCount > 0 ) {
115                this._busyCount--;
116                if ( this._busyCount === 0 ) {
117                    this._busyWidget.hide();
118                }
119            } else {
120                console.warn('_done() was called more times than _busy().');
121            }
122        },
123        destroy: function() {
124            this._busyWidget.destroyRecursive();
125            this.inherited(arguments);
126        }
127    });
128});
Note: See TracBrowser for help on using the repository browser.