From: Marcin Koziej Date: Wed, 9 Jan 2013 16:18:03 +0000 (+0100) Subject: excercies interactions + checking X-Git-Url: https://git.mdrn.pl/redakcja.git/commitdiff_plain/ca531bd353bd00ebe786c63df893f7f71167411b excercies interactions + checking --- diff --git a/lib/librarian b/lib/librarian index 36ded31b..ab001bc3 160000 --- a/lib/librarian +++ b/lib/librarian @@ -1 +1 @@ -Subproject commit 36ded31bc121ec258d35bd209d9da93224f773aa +Subproject commit ab001bc37c0f8ee0bb92b8762f5151b5b93f6ccc diff --git a/redakcja/static/edumed/css/edumed.css b/redakcja/static/edumed/css/edumed.css index c1c612f5..f1de5918 100644 --- a/redakcja/static/edumed/css/edumed.css +++ b/redakcja/static/edumed/css/edumed.css @@ -467,4 +467,33 @@ em.person { .question-piece.editing { margin: 2px; border: 1px solid; +} + +.przyporzadkuj .lista.predicate { + list-style: none; + position: relative; + clear: both; +} + +.przyporzadkuj .lista.predicate > li { + list-style: none; + display: block; + float: left; + width: 250px; +} + +.przyporzadkuj .lista.predicate .droppable { + min-height: 50px; + border: 1px dotted black; +} + + +.przyporzadkuj .draggable { + padding: 3px; + border: 1px dotted black; + display: inline-block; +} + +.clr { + clear: both; } \ No newline at end of file diff --git a/redakcja/static/edumed/js/edumed.coffee b/redakcja/static/edumed/js/edumed.coffee index ec1bcd0e..84fb91f1 100644 --- a/redakcja/static/edumed/js/edumed.coffee +++ b/redakcja/static/edumed/js/edumed.coffee @@ -43,9 +43,22 @@ class Excercise extends Binding score[1] += s[1] @show_score(score) - get_value_list: (elem, data_key) -> - $(elem).data(data_key).split(',').map($.trim).map((x) -> parseInt(x)) - + get_value_list: (elem, data_key, numbers) -> + vl = $(elem).data(data_key).split(/[ ,]+/).map($.trim) #.map((x) -> parseInt(x)) + if numbers + vl = vl.map((x) -> parseInt(x)) + return vl + + get_value_optional_list: (elem, data_key) -> + vals = @get_value_list(elem, data_key) + mandat = [] + opt = [] + for v in vals + if v.slice(-1) == "?" + opt.push v.slice(0, -1) + else + mandat.push v + return [mandat, opt] show_score: (score) -> $(".message", @element).text("Wynik: #{score[0]} / #{score[1]}") @@ -59,7 +72,7 @@ class Wybor extends Excercise check_question: (question) -> all = 0 good = 0 - solution = @get_value_list(question, 'solution') + solution = @get_value_list(question, 'solution', true) $(".question-piece", question).each (i, qpiece) => piece_no = parseInt $(qpiece).attr 'data-no' should_be_checked = solution.indexOf(piece_no) >= 0 @@ -88,7 +101,7 @@ class Uporzadkuj extends Excercise $('ol, ul', @element).sortable({ items: "> li" }) check_question: (question) -> - positions = @get_value_list(question, 'original') + positions = @get_value_list(question, 'original', true) sorted = positions.sort() pkts = $('.question-piece', question) @@ -105,6 +118,7 @@ class Uporzadkuj extends Excercise return [correct, all] +# XXX propozycje="1/0" class Luki extends Excercise constructor: (element) -> super element @@ -191,52 +205,99 @@ class Zastap extends Excercise class Przyporzadkuj extends Excercise + is_multiple: -> + for qp in $(".question-piece", @element) + if $(qp).data('solution').split(/[ ,]+/).length > 1 + return true + return false + constructor: (element) -> super element - if @element.attr('multiple')? - @multiple = true - else - @multiple = false + @multiple = @is_multiple() $(".question", @element).each (i, question) => draggable_opts = revert: 'invalid' - helper: if @multiple then "clone" else null + if @multiple + helper_opts = { helper: "clone" } + else helper_opts = {} - $(".draggable", question).draggable(draggable_opts) - .droppable({ - accept: ".draggable" - }) + $(".draggable", question).draggable($.extend({}, draggable_opts, + helper_opts)) $(".predicate .droppable", question).droppable - accept: ".draggable" - drop: (ev, ui) -> - is_multiple = ui.draggable.is(".multiple") - + accept: (draggable) -> + $draggable = $(draggable) + if not $draggable.is(".draggable") + return false + $predicate = $(this) + + for added in $predicate.find("li") + if $(added).text() == $draggable.text() + return false + return true + + drop: (ev, ui) => added = ui.draggable.clone() added.attr('style', '') - $(this).append(added) + $(ev.target).append(added) added.draggable(draggable_opts) - if not is_multiple + if not @multiple or ui.draggable.closest(".predicate").length > 0 ui.draggable.remove() + $(".subject", question).droppable accept: ".draggable" - drop: (ev, ui) -> - is_multiple = ui.draggable.is(".multiple") + drop: (ev, ui) => + # this is to prevent a situation of dragging out and + # dropping back to the same place + if $(ui.draggable).closest(".subject").length > 0 + return + added = ui.draggable.clone() added.attr('style', '') - if not is_multiple - $(this).append(added) - added.draggable(draggable_opts) + if not @multiple + $(ev.target).append(added) + added.draggable($.extend({}, draggable_opts, helper_opts)) ui.draggable.remove() + check_question: (question) -> + # subjects placed in predicates + count = 0 + all = 0 + all_multiple = 0 + for qp in $(".predicate .question-piece", question) + pred = $(qp).closest("[data-predicate]") + v = @get_value_optional_list qp, 'solution' + mandatory = v[0] + optional = v[1] + all_multiple += mandatory.length + optional.length + pn = pred.data('predicate') + if mandatory.indexOf(pn) >= 0 or optional.indexOf(pn) >= 0 + count += 1 + @piece_correct qp + else + @piece_incorrect qp + all += 1 + + if @multiple + for qp in $(".subject .question-piece", question) + v = @get_value_optional_list qp, 'solution' + mandatory = v[0] + optional = v[1] + all_multiple += mandatory.length + optional.length + return [count, all_multiple] + else + return [count, all] + + + diff --git a/redakcja/static/edumed/js/edumed.js b/redakcja/static/edumed/js/edumed.js index 89483802..aec1c4cb 100644 --- a/redakcja/static/edumed/js/edumed.js +++ b/redakcja/static/edumed/js/edumed.js @@ -75,10 +75,31 @@ return this.show_score(score); }; - Excercise.prototype.get_value_list = function(elem, data_key) { - return $(elem).data(data_key).split(',').map($.trim).map(function(x) { - return parseInt(x); - }); + Excercise.prototype.get_value_list = function(elem, data_key, numbers) { + var vl; + vl = $(elem).data(data_key).split(/[ ,]+/).map($.trim); + if (numbers) { + vl = vl.map(function(x) { + return parseInt(x); + }); + } + return vl; + }; + + Excercise.prototype.get_value_optional_list = function(elem, data_key) { + var mandat, opt, v, vals, _i, _len; + vals = this.get_value_list(elem, data_key); + mandat = []; + opt = []; + for (_i = 0, _len = vals.length; _i < _len; _i++) { + v = vals[_i]; + if (v.slice(-1) === "?") { + opt.push(v.slice(0, -1)); + } else { + mandat.push(v); + } + } + return [mandat, opt]; }; Excercise.prototype.show_score = function(score) { @@ -102,7 +123,7 @@ _this = this; all = 0; good = 0; - solution = this.get_value_list(question, 'solution'); + solution = this.get_value_list(question, 'solution', true); $(".question-piece", question).each(function(i, qpiece) { var is_checked, piece_no, should_be_checked; piece_no = parseInt($(qpiece).attr('data-no')); @@ -142,7 +163,7 @@ Uporzadkuj.prototype.check_question = function(question) { var all, correct, pkt, pkts, positions, sorted, _ref; - positions = this.get_value_list(question, 'original'); + positions = this.get_value_list(question, 'original', true); sorted = positions.sort(); pkts = $('.question-piece', question); correct = 0; @@ -284,45 +305,67 @@ __extends(Przyporzadkuj, _super); + Przyporzadkuj.prototype.is_multiple = function() { + var qp, _i, _len, _ref; + _ref = $(".question-piece", this.element); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + qp = _ref[_i]; + if ($(qp).data('solution').split(/[ ,]+/).length > 1) return true; + } + return false; + }; + function Przyporzadkuj(element) { var _this = this; Przyporzadkuj.__super__.constructor.call(this, element); - if (this.element.attr('multiple') != null) { - this.multiple = true; - } else { - this.multiple = false; - } + this.multiple = this.is_multiple(); $(".question", this.element).each(function(i, question) { - var draggable_opts; + var draggable_opts, helper_opts; draggable_opts = { - revert: 'invalid', - helper: _this.multiple ? "clone" : null + revert: 'invalid' }; - $(".draggable", question).draggable(draggable_opts).droppable({ - accept: ".draggable" - }); + if (_this.multiple) { + helper_opts = { + helper: "clone" + }; + } else { + helper_opts = {}; + } + $(".draggable", question).draggable($.extend({}, draggable_opts, helper_opts)); $(".predicate .droppable", question).droppable({ - accept: ".draggable", + accept: function(draggable) { + var $draggable, $predicate, added, _i, _len, _ref; + $draggable = $(draggable); + if (!$draggable.is(".draggable")) return false; + $predicate = $(this); + _ref = $predicate.find("li"); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + added = _ref[_i]; + if ($(added).text() === $draggable.text()) return false; + } + return true; + }, drop: function(ev, ui) { - var added, is_multiple; - is_multiple = ui.draggable.is(".multiple"); + var added; added = ui.draggable.clone(); added.attr('style', ''); - $(this).append(added); + $(ev.target).append(added); added.draggable(draggable_opts); - if (!is_multiple) return ui.draggable.remove(); + if (!_this.multiple || ui.draggable.closest(".predicate").length > 0) { + return ui.draggable.remove(); + } } }); return $(".subject", question).droppable({ accept: ".draggable", drop: function(ev, ui) { - var added, is_multiple; - is_multiple = ui.draggable.is(".multiple"); + var added; + if ($(ui.draggable).closest(".subject").length > 0) return; added = ui.draggable.clone(); added.attr('style', ''); - if (!is_multiple) { - $(this).append(added); - added.draggable(draggable_opts); + if (!_this.multiple) { + $(ev.target).append(added); + added.draggable($.extend({}, draggable_opts, helper_opts)); } return ui.draggable.remove(); } @@ -330,6 +373,43 @@ }); } + Przyporzadkuj.prototype.check_question = function(question) { + var all, all_multiple, count, mandatory, optional, pn, pred, qp, v, _i, _j, _len, _len2, _ref, _ref2; + count = 0; + all = 0; + all_multiple = 0; + _ref = $(".predicate .question-piece", question); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + qp = _ref[_i]; + pred = $(qp).closest("[data-predicate]"); + v = this.get_value_optional_list(qp, 'solution'); + mandatory = v[0]; + optional = v[1]; + all_multiple += mandatory.length + optional.length; + pn = pred.data('predicate'); + if (mandatory.indexOf(pn) >= 0 || optional.indexOf(pn) >= 0) { + count += 1; + this.piece_correct(qp); + } else { + this.piece_incorrect(qp); + } + all += 1; + } + if (this.multiple) { + _ref2 = $(".subject .question-piece", question); + for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) { + qp = _ref2[_j]; + v = this.get_value_optional_list(qp, 'solution'); + mandatory = v[0]; + optional = v[1]; + all_multiple += mandatory.length + optional.length; + } + return [count, all_multiple]; + } else { + return [count, all]; + } + }; + return Przyporzadkuj; })(Excercise);