editor: core plugin - edumed - first take on order exercise
[fnpeditor.git] / src / editor / plugins / core / edumed / order / element.js
diff --git a/src/editor/plugins/core/edumed/order/element.js b/src/editor/plugins/core/edumed/order/element.js
new file mode 100644 (file)
index 0000000..7c5e383
--- /dev/null
@@ -0,0 +1,99 @@
+define(function(require) {
+    
+'use strict';
+
+/* globals gettext */
+
+var _ = require('libs/underscore');
+
+var documentElement = require('modules/documentCanvas/canvas/documentElement'),
+    OrderExerciseView = require('./view');
+
+var OrderExerciceElement = Object.create(documentElement.DocumentNodeElement.prototype);
+_.extend(OrderExerciceElement, {
+    init: function() {
+        documentElement.DocumentNodeElement.prototype.init.call(this);
+        
+        this.view = new OrderExerciseView(this, this.wlxmlNode);
+        this._container().append(this.view.dom);
+
+        this.view.on('newItemRequested', function() {
+            this.wlxmlNode.document.transaction(function() {
+                var textNode = this.wlxmlNode.object.addItem('');
+                var doc = this.wlxmlNode.document;
+                return doc.createFragment(doc.CaretFragment, {node: textNode, offset:0});
+            }.bind(this), {
+                metadata: {
+                    description: gettext('Add item to exercise')
+                },
+                success: function(ret) {
+                    this.canvas.select(ret);
+                }.bind(this)
+            });
+        }.bind(this));
+
+        this.view.on('moveAnswer', function(sourceItem, targetItem, where) {
+            this.wlxmlNode.document.transaction(function() {
+                sourceItem.setAnswer(targetItem.getAnswer() + (where === 'before' ? 0 : 1));
+            }, {
+                metadata: {
+                    description: gettext('Change solution')
+                }
+            });
+        }.bind(this));
+
+        this.view.on('moveItem', function(sourceItem, targetItem, where) {
+            this.wlxmlNode.document.transaction(function() {
+                targetItem.node[where](sourceItem.node);
+            }, {
+                metadata: {
+                    description: gettext('Change order')
+                }
+            });
+            
+        }.bind(this));
+
+        var exerciseNode = this.wlxmlNode;
+        this.createContainer(this.wlxmlNode.object.getDescription(), {
+            manages: function(node, removedFrom) {
+                if(node.is('list.orderable')) {
+                    return false;
+                }
+                return exerciseNode.sameNode(node.parent() || removedFrom); //!n.hasFollowingSibing(this.params.listnode);    
+            },
+            dom: this.view.dom.find('.description')
+        });
+
+        this.reloadView();
+    },
+    onNodeAdded: function(event) {
+        var node = event.meta.node;
+        if(this.wlxmlNode.object.isItemNode(node)) {
+            this.reloadView();
+        }
+    },
+    onNodeAttrChange: function(event) {
+        var node = event.meta.node;
+        if(node.is('item.answer') && node.parent() && node.parent().is('list.orderable')) {
+            this.reloadView();
+        }
+    },
+    reloadView: function() {
+        this.view.clearItems();
+        this.wlxmlNode.object.getItems().forEach(function(item) {
+            this.view.addItem(item);
+        }.bind(this));
+    },
+    getVerticallyFirstTextElement: function() {
+        var toret;
+        this.containers.some(function(container) {
+            toret = container.getVerticallyFirstTextElement();
+            return !!toret;
+        });
+        return toret;
+    }
+});
+
+return {tag: 'div', klass: 'exercise.order', prototype: OrderExerciceElement};
+
+});