shuffle answers in exercise order + fix answer numbering
[fnpeditor.git] / src / editor / plugins / core / edumed / order / element.js
index a81155e..4fb7507 100644 (file)
@@ -53,11 +53,21 @@ _.extend(OrderExerciceElement, {
             
         }.bind(this));
 
+        this.view.on('shuffleItems', function () {
+            this.wlxmlNode.document.transaction(function() {
+                this.shuffleItems();
+            }.bind(this), {
+                metadata: {
+                    description: gettext('Set random order')
+                }
+            });
+        }.bind(this));
+
         var exerciseNode = this.wlxmlNode;
         this.createContainer(this.wlxmlNode.object.getDescription(), {
             resetBackground: true,
             manages: function(node, removedFrom) {
-                if(node.is('list.orderable')) {
+                if(node.is('list.orderable') || (removedFrom && removedFrom.is('list.orderable'))) {
                     return false;
                 }
                 return exerciseNode.sameNode(node.parent() || removedFrom); //!n.hasFollowingSibing(this.params.listnode);    
@@ -79,12 +89,36 @@ _.extend(OrderExerciceElement, {
             this.reloadView();
         }
     },
+    onNodeDetached: function(event) {
+        var node = event.meta.node;
+        if(node.is('item.answer') && event.meta.parent && event.meta.parent.is('list.orderable')) {
+            this.reloadView();
+            this.updateNumbers();
+        }
+    },
     reloadView: function() {
         this.view.clearItems();
         this.wlxmlNode.object.getItems().forEach(function(item) {
             this.view.addItem(item);
         }.bind(this));
     },
+    updateNumbers: function () {
+        var answer = 1;
+        this.view.sortedItemViews().forEach(function (itemView) {
+            itemView.item.setAnswer(answer);
+            answer++;
+        })
+    },
+    shuffleItems: function () {
+        var items = this.wlxmlNode.object.getItems();
+        var currentIndex = items.length, randomIndex;
+        while (0 !== currentIndex) {
+            randomIndex = Math.floor(Math.random() * currentIndex);
+            currentIndex -= 1;
+            items[currentIndex].node.after(items[randomIndex].node);
+        }
+        this.reloadView();
+    },
     getVerticallyFirstTextElement: function() {
         var toret;
         this.containers.some(function(container) {