X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/e3f4ff223c5acd7cf97b6a9ba1cdd83111dba63b..856f00d24d37590a78b78833a8aa305983e58e45:/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 index 0000000..7c5e383 --- /dev/null +++ b/src/editor/plugins/core/edumed/order/element.js @@ -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}; + +});