source: Dev/trunk/client/qed/model/widgets/QuestionEditorToolkit.js @ 426

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

Added grunt tasks and code cleanup.

Added grunt for less and jshint procesing.
Cleanup of code to pass jshint (one bug found :).

File size: 6.2 KB
Line 
1define([
2    'dojo/_base/declare',
3    'dojo/_base/lang',
4    'dojo/dnd/Source',
5    'dojo/dom-construct',
6    'dojo/store/Memory',
7    'dijit/_Container',
8    'dijit/_TemplatedMixin',
9    'dijit/_WidgetBase',
10    'dijit/_WidgetsInTemplateMixin',
11    'dijit/form/Button',
12    'dijit/form/ComboBox',
13    '../../store',
14    './CategoryListView',
15    'dojo/text!./templates/QuestionEditorToolkit.html'
16], function(declare, lang, Source, domConstruct, Memory, _Container,
17        _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, Button,
18        ComboBox, store, CategoryListView, template) {
19    return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _Container], {
20
21        templateString: template,
22        _list: null,
23        _categorySelect: null,
24        _categoryStore: null,
25        _topicSelect: null,
26        _topicStore: null,
27        _categories : null,
28
29        _contentItems: [
30            { type: "Header" },
31            { type: "Text" },
32            { type: "Image" },
33            { type: "ExternalMedia" },
34            { type: "Divider" }
35        ],
36        _inputsItems: [
37            { type: "StringInput" },
38            { type: "TextInput" },
39            { type: "IntegerInput" },
40            { type: "ScaleInput" },
41            { type: "MultipleChoiceInput" }
42        ],
43        _labelMap: {
44            "Header": "Header",
45            "Text": "Text",
46            "Image": "Image",
47            "ExternalMedia": "External media",
48            "Divider": "Divider",
49            "StringInput": "Text line",
50            "TextInput": "Free text",
51            "IntegerInput": "Integer number",
52            "ScaleInput": "Scale",
53            "MultipleChoiceInput": "Multiple choice"
54        },
55        _iconMap: {
56            "Header": "Header",
57            "Text": "TextBox",
58            "Image": "Image",
59            "ExternalMedia": "External",
60            "Divider": "Divider",
61            "StringInput": "Text",
62            "TextInput": "Text",
63            "IntegerInput": "Integer",
64            "ScaleInput": "Scale",
65            "MultipleChoiceInput": "MultipleChoice"
66        },
67
68        postCreate: function(){
69            this.inherited(arguments);
70            var creator = lang.hitch(this,"_creator");
71            this.contentSource = new Source(this.ToolkitContentSourceNode, {
72                accept: [],
73                copyOnly: true,
74                selfAccept: false,
75                singular: true,
76                creator: creator
77            });
78            this.inputsSource = new Source(this.ToolkitInputsSourceNode, {
79                accept: [],
80                copyOnly: true,
81                selfAccept: false,
82                singular: true,
83                creator: creator
84            });
85            this.contentSource.insertNodes(false, this._contentItems);
86            this.inputsSource.insertNodes(false, this._inputsItems);
87        },
88        _setValueAttr: function(question) {
89            this.propertiesForm.set('value', question);
90            this._categories = question.categories || [];
91            this._setupListView();
92            this._setupCategories();
93            this._setupTopic(question.topic);
94        },
95        _getValueAttr: function() {
96            var value = this.propertiesForm.get('value');
97            value.categories = this._categories;
98            return value;
99        },
100        onCategoryAdd: function() {
101            this._addCategory(this._categorySelect.get('displayedValue'));
102            this._categorySelect.reset();
103        },
104        _creator: function(item, hint) {
105            var node;
106            if (hint === "avatar") {
107                node = domConstruct.create('span',{
108                    innerHTML: this._labelMap[item.type] || item.type
109                });
110            } else {
111                var w = new Button({
112                    baseClass: "rftLargeButton",
113                    iconClass: "rftIcon rftIcon"+(this._iconMap[item.type]||"Unknown"),
114                    label: this._labelMap[item.type] || item.type,
115                    showLabel: true,
116                    'class': "newline"
117                });
118                node = w.domNode;
119            }
120            return {node: node, data: item, type: ["questionContent"]};
121        },
122        _setupListView: function() {
123            this._list = new CategoryListView( {
124                removeCallback: lang.hitch(this, this._removeCategory)
125            }).placeAt(this.listNode);
126            this._list.startup();               
127            for (var category in this._categories) {
128                this._list.appendItem(this._categories[category]);
129            }   
130        },
131        _setupCategories: function() {
132            this._categoryStore = new Memory({data: [] });
133            store.query("_design/questions/_view/all", {reduce:true, group:false, group_level:1})
134            .forPairs(lang.hitch(this, function(value, key) {
135                this._categoryStore.put({ id: key[0] });
136            }));
137            this._categorySelect = new ComboBox( {
138                name: "categories",
139                store: this._categoryStore,
140                searchAttr: "id"
141            }, this.categoriesBoxNode);
142            this._supportingWidgets.push(this._categorySelect);
143
144        },
145        _setupTopic: function(topic) {
146            this._topicStore = new Memory( {data: [] });
147            store.query("_design/questions/_view/all_topics", {reduce:true, group:true})
148            .forPairs(lang.hitch(this, function(value, key) {
149                this._topicStore.put({ id: key });
150            }));
151            this._topicSelect = new ComboBox( {
152                name: "topic",
153                store: this._topicStore,
154                searchAttr: "id",
155                value: topic
156            }, this.topicBoxNode);
157            this._supportingWidgets.push(this._topicSelect);
158        },
159        _addCategory: function(item) {
160            this._categories.push(item);
161            this._list.appendItem(item);
162        },
163        _removeCategory: function(item) {
164            this._categories.splice(this._categories.indexOf(item), 1);
165        }
166
167    });
168});
Note: See TracBrowser for help on using the repository browser.