From 88d1651a8ef2ff5e669ab2799fd2d01bbe0f664e Mon Sep 17 00:00:00 2001 From: Marcin Koziej Date: Wed, 23 Jan 2013 15:29:16 +0100 Subject: [PATCH 1/1] reset + solutions --- lib/librarian | 2 +- redakcja/static/edumed/js/edumed.coffee | 130 ++++++++++++--- redakcja/static/edumed/js/edumed.js | 205 +++++++++++++++++++----- 3 files changed, 278 insertions(+), 59 deletions(-) diff --git a/lib/librarian b/lib/librarian index a17ace82..b22e1811 160000 --- a/lib/librarian +++ b/lib/librarian @@ -1 +1 @@ -Subproject commit a17ace8296df1d91d9f940c80d96a269eba626e5 +Subproject commit b22e1811ddec4e7af6f7e369cf1b868f8cc8140b diff --git a/redakcja/static/edumed/js/edumed.coffee b/redakcja/static/edumed/js/edumed.coffee index 75624ae7..db198085 100644 --- a/redakcja/static/edumed/js/edumed.coffee +++ b/redakcja/static/edumed/js/edumed.coffee @@ -20,11 +20,19 @@ class EduModule extends Binding class Excercise extends Binding constructor: (element) -> super 'excercise', element + # just save the html to reset the excercise + $(@element).data("excercise-html", $(@element).html()) $(".check", @element).click => @check() $('.solutions', @element).click => @show_solutions() + $('.reset', @element).click => + @reset() + + reset: -> + $(@element).html($(@element).data('excercise-html')) + excercise @element piece_correct: (qpiece) -> $(qpiece).removeClass('incorrect').addClass('correct') @@ -43,6 +51,11 @@ class Excercise extends Binding score[1] += s[1] @show_score(score) + show_solutions: -> + @reset() + $(".question", @element).each (i, question) => + @solve_question question + # Parses a list of values, separated by space or comma. # The list is read from data attribute of elem using data_key # Returns a list with elements @@ -87,8 +100,22 @@ class Excercise extends Binding return false return true - draggable_dropped: ($draggable) -> - $draggable.append('x') + draggable_move: ($draggable, $placeholder, ismultiple) -> + $added = $draggable.clone() + $added.data("original", $draggable.get(0)) + if not ismultiple + $draggable.addClass('disabled').draggable('disable') + + $placeholder.after($added) + if not $placeholder.hasClass('multiple') + $placeholder.hide() + $added.append('x') + $('.remove', $added).click (ev) => + $added.prev(".placeholder:not(.multiple)").show() + if not ismultiple + $($added.data('original')).removeClass('disabled').draggable('enable') + $added.remove() + dragging: (ismultiple, issortable) -> $(".question", @element).each (i, question) => @@ -115,24 +142,25 @@ class Excercise extends Binding $(this).removeClass 'accepting' return is_accepted - drop: (ev, ui) -> + drop: (ev, ui) => $(ev.target).removeClass 'accepting dragover' - added = $(ui.draggable).clone() - $added = added - $added.data("original", ui.draggable) - if not ismultiple - $(ui.draggable).addClass('disabled').draggable('disable') - - $(ev.target).after(added) - if not $(ev.target).hasClass('multiple') - $(ev.target).hide() - $added.append('x') - $('.remove', added).click (ev) => - $added.prev(".placeholder:not(.multiple)").show() - if not ismultiple - $added.data('original').removeClass('disabled').draggable('enable') - $(added).remove() + @draggable_move $(ui.draggable), $(ev.target), ismultiple + + # $added = $(ui.draggable).clone() + # $added.data("original", ui.draggable) + # if not ismultiple + # $(ui.draggable).addClass('disabled').draggable('disable') + + # $(ev.target).after(added) + # if not $(ev.target).hasClass('multiple') + # $(ev.target).hide() + # $added.append('x') + # $('.remove', added).click (ev) => + # $added.prev(".placeholder:not(.multiple)").show() + # if not ismultiple + # $added.data('original').removeClass('disabled').draggable('enable') + # $(added).remove() over: (ev, ui) -> $(ev.target).addClass 'dragover' @@ -142,6 +170,7 @@ class Excercise extends Binding $(ev.target).removeClass 'dragover' + class Wybor extends Excercise constructor: (element) -> super element @@ -174,7 +203,18 @@ class Wybor extends Excercise return [good, all] - show_solutions: -> + solve_question: (question) -> + solution = @get_value_list(question, 'solution') + $(".question-piece", question).each (i, qpiece) => + piece_no = $(qpiece).attr 'data-no' + piece_name = $(qpiece).attr 'data-name' + if piece_name + should_be_checked = solution.indexOf(piece_name) >= 0 + else + should_be_checked = solution.indexOf(piece_no) >= 0 + console.log("check " + $("input[type=checkbox]", qpiece).attr("id") + " -> " + should_be_checked) + $("input[type=checkbox]", qpiece).prop 'checked', should_be_checked + class Uporzadkuj extends Excercise @@ -191,7 +231,7 @@ class Uporzadkuj extends Excercise all = 0 for pkt in [0...pkts.length] - all +=1 + all += 1 if pkts.eq(pkt).data('pos') == sorted[pkt] correct += 1 @piece_correct pkts.eq(pkt) @@ -199,6 +239,21 @@ class Uporzadkuj extends Excercise @piece_incorrect pkts.eq(pkt) return [correct, all] + solve_question: (question) -> + positions = @get_value_list(question, 'original', true) + sorted = positions.sort() + pkts = $('.question-piece', question) + pkts.sort (a, b) -> + q = $(a).data('pos') + w = $(b).data('pos') + return 1 if q < w + return -1 if q > w + return 0 + + parent = pkts.eq(0).parent() + for p in pkts + parent.prepend(p) + # XXX propozycje="1/0" class Luki extends Excercise @@ -220,6 +275,11 @@ class Luki extends Excercise @show_score [correct, all] + solve_question: (question) -> + $(".placeholder", question).each (i, placeholder) => + $qp = $(".question-piece[data-no=" + $(placeholder).data('solution') + "]", question) + @draggable_move $qp, $(placeholder), false + class Zastap extends Excercise constructor: (element) -> @@ -234,7 +294,6 @@ class Zastap extends Excercise $(".paragraph", @element).each (i, par) => $(".placeholder", par).each (j, qpiece) => - should_be_checked = false $qp = $(qpiece) $dragged = $qp.next(".draggable") if $qp.data("solution") @@ -247,6 +306,15 @@ class Zastap extends Excercise @show_score [correct, all] + show_solutions: -> + @reset() + $(".paragraph", @element).each (i, par) => + $(".placeholder[data-solution]", par).each (j, qpiece) => + $qp = $(qpiece) + $dr = $(".draggable[data-no=" + $qp.data('solution') + "]", @element) + @draggable_move $dr, $qp, false + + wrap_words: (element, wrapper) -> # This function wraps each word of element in wrapper, but does not descend into child-tags of element. # It doesn't wrap things between words (defined by ignore RE below). Warning - ignore must begin with ^ @@ -326,6 +394,17 @@ class Przyporzadkuj extends Excercise else return [count, all] + solve_question: (question) -> + for qp in $(".subject .question-piece", question) + v = @get_value_optional_list qp, 'solution' + mandatory = v[0] + optional = v[1] + for m in mandatory.concat(optional) + $pr = $(".predicate [data-predicate=" + m + "]", question) + $ph = $pr.find ".placeholder" + @draggable_move $(qp), $ph, @multiple + + class PrawdaFalsz extends Excercise constructor: (element) -> @@ -356,6 +435,15 @@ class PrawdaFalsz extends Excercise return [good, all] + show_solutions: -> + reset() + for qp in $(".question-piece", @element) + if $(qp).data('solution') == 'true' + $(".true", qp).click() + else + $(".false", qp).click() + + ########## excercise = (ele) -> diff --git a/redakcja/static/edumed/js/edumed.js b/redakcja/static/edumed/js/edumed.js index d8f3d946..803eb042 100644 --- a/redakcja/static/edumed/js/edumed.js +++ b/redakcja/static/edumed/js/edumed.js @@ -1,7 +1,8 @@ +// Generated by CoffeeScript 1.4.0 (function() { var $, Binding, EduModule, Excercise, Luki, PrawdaFalsz, Przyporzadkuj, Uporzadkuj, Wybor, Zastap, excercise, - __hasProp = Object.prototype.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }; + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; $ = jQuery; @@ -44,14 +45,23 @@ function Excercise(element) { var _this = this; Excercise.__super__.constructor.call(this, 'excercise', element); + $(this.element).data("excercise-html", $(this.element).html()); $(".check", this.element).click(function() { return _this.check(); }); $('.solutions', this.element).click(function() { return _this.show_solutions(); }); + $('.reset', this.element).click(function() { + return _this.reset(); + }); } + Excercise.prototype.reset = function() { + $(this.element).html($(this.element).data('excercise-html')); + return excercise(this.element); + }; + Excercise.prototype.piece_correct = function(qpiece) { return $(qpiece).removeClass('incorrect').addClass('correct'); }; @@ -75,6 +85,14 @@ return this.show_score(score); }; + Excercise.prototype.show_solutions = function() { + var _this = this; + this.reset(); + return $(".question", this.element).each(function(i, question) { + return _this.solve_question(question); + }); + }; + Excercise.prototype.get_value_list = function(elem, data_key, numbers) { var vl; vl = $(elem).attr("data-" + data_key).split(/[ ,]+/).map($.trim); @@ -115,13 +133,33 @@ dropped = $droppable.closest("ul, ol").find(".draggable"); for (_i = 0, _len = dropped.length; _i < _len; _i++) { d = dropped[_i]; - if (this.draggable_equal($draggable, $(d))) return false; + if (this.draggable_equal($draggable, $(d))) { + return false; + } } return true; }; - Excercise.prototype.draggable_dropped = function($draggable) { - return $draggable.append('x'); + Excercise.prototype.draggable_move = function($draggable, $placeholder, ismultiple) { + var $added, + _this = this; + $added = $draggable.clone(); + $added.data("original", $draggable.get(0)); + if (!ismultiple) { + $draggable.addClass('disabled').draggable('disable'); + } + $placeholder.after($added); + if (!$placeholder.hasClass('multiple')) { + $placeholder.hide(); + } + $added.append('x'); + return $('.remove', $added).click(function(ev) { + $added.prev(".placeholder:not(.multiple)").show(); + if (!ismultiple) { + $($added.data('original')).removeClass('disabled').draggable('enable'); + } + return $added.remove(); + }); }; Excercise.prototype.dragging = function(ismultiple, issortable) { @@ -139,7 +177,9 @@ var $draggable, is_accepted; $draggable = $(draggable); is_accepted = true; - if (!$draggable.is(".draggable")) is_accepted = false; + if (!$draggable.is(".draggable")) { + is_accepted = false; + } if (is_accepted) { is_accepted = self.draggable_accept($draggable, $(this)); } @@ -151,25 +191,8 @@ return is_accepted; }, drop: function(ev, ui) { - var $added, added, - _this = this; $(ev.target).removeClass('accepting dragover'); - added = $(ui.draggable).clone(); - $added = added; - $added.data("original", ui.draggable); - if (!ismultiple) { - $(ui.draggable).addClass('disabled').draggable('disable'); - } - $(ev.target).after(added); - if (!$(ev.target).hasClass('multiple')) $(ev.target).hide(); - $added.append('x'); - return $('.remove', added).click(function(ev) { - $added.prev(".placeholder:not(.multiple)").show(); - if (!ismultiple) { - $added.data('original').removeClass('disabled').draggable('enable'); - } - return $(added).remove(); - }); + return _this.draggable_move($(ui.draggable), $(ev.target), ismultiple); }, over: function(ev, ui) { return $(ev.target).addClass('dragover'); @@ -209,7 +232,9 @@ should_be_checked = solution.indexOf(piece_no) >= 0; } is_checked = $("input", qpiece).is(":checked"); - if (should_be_checked) all += 1; + if (should_be_checked) { + all += 1; + } if (is_checked) { if (should_be_checked) { good += 1; @@ -224,7 +249,23 @@ return [good, all]; }; - Wybor.prototype.show_solutions = function() {}; + Wybor.prototype.solve_question = function(question) { + var solution, + _this = this; + solution = this.get_value_list(question, 'solution'); + return $(".question-piece", question).each(function(i, qpiece) { + var piece_name, piece_no, should_be_checked; + piece_no = $(qpiece).attr('data-no'); + piece_name = $(qpiece).attr('data-name'); + if (piece_name) { + should_be_checked = solution.indexOf(piece_name) >= 0; + } else { + should_be_checked = solution.indexOf(piece_no) >= 0; + } + console.log("check " + $("input[type=checkbox]", qpiece).attr("id") + " -> " + should_be_checked); + return $("input[type=checkbox]", qpiece).prop('checked', should_be_checked); + }); + }; return Wybor; @@ -242,13 +283,13 @@ } Uporzadkuj.prototype.check_question = function(question) { - var all, correct, pkt, pkts, positions, sorted, _ref; + var all, correct, pkt, pkts, positions, sorted, _i, _ref; positions = this.get_value_list(question, 'original', true); sorted = positions.sort(); pkts = $('.question-piece', question); correct = 0; all = 0; - for (pkt = 0, _ref = pkts.length; 0 <= _ref ? pkt < _ref : pkt > _ref; 0 <= _ref ? pkt++ : pkt--) { + for (pkt = _i = 0, _ref = pkts.length; 0 <= _ref ? _i < _ref : _i > _ref; pkt = 0 <= _ref ? ++_i : --_i) { all += 1; if (pkts.eq(pkt).data('pos') === sorted[pkt]) { correct += 1; @@ -260,6 +301,32 @@ return [correct, all]; }; + Uporzadkuj.prototype.solve_question = function(question) { + var p, parent, pkts, positions, sorted, _i, _len, _results; + positions = this.get_value_list(question, 'original', true); + sorted = positions.sort(); + pkts = $('.question-piece', question); + pkts.sort(function(a, b) { + var q, w; + q = $(a).data('pos'); + w = $(b).data('pos'); + if (q < w) { + return 1; + } + if (q > w) { + return -1; + } + return 0; + }); + parent = pkts.eq(0).parent(); + _results = []; + for (_i = 0, _len = pkts.length; _i < _len; _i++) { + p = pkts[_i]; + _results.push(parent.prepend(p)); + } + return _results; + }; + return Uporzadkuj; })(Excercise); @@ -292,6 +359,15 @@ return this.show_score([correct, all]); }; + Luki.prototype.solve_question = function(question) { + var _this = this; + return $(".placeholder", question).each(function(i, placeholder) { + var $qp; + $qp = $(".question-piece[data-no=" + $(placeholder).data('solution') + "]", question); + return _this.draggable_move($qp, $(placeholder), false); + }); + }; + return Luki; })(Excercise); @@ -316,8 +392,7 @@ correct = 0; $(".paragraph", this.element).each(function(i, par) { return $(".placeholder", par).each(function(j, qpiece) { - var $dragged, $qp, should_be_checked; - should_be_checked = false; + var $dragged, $qp; $qp = $(qpiece); $dragged = $qp.next(".draggable"); if ($qp.data("solution")) { @@ -332,8 +407,21 @@ return this.show_score([correct, all]); }; + Zastap.prototype.show_solutions = function() { + var _this = this; + this.reset(); + return $(".paragraph", this.element).each(function(i, par) { + return $(".placeholder[data-solution]", par).each(function(j, qpiece) { + var $dr, $qp; + $qp = $(qpiece); + $dr = $(".draggable[data-no=" + $qp.data('solution') + "]", _this.element); + return _this.draggable_move($dr, $qp, false); + }); + }); + }; + Zastap.prototype.wrap_words = function(element, wrapper) { - var chld, i, ignore, insertWrapped, j, len, space, wordb, _ref, _results; + var chld, i, ignore, insertWrapped, j, len, space, wordb, _i, _ref, _results; ignore = /^[ \t.,:;()]+/; insertWrapped = function(txt, elem) { var nw; @@ -341,7 +429,7 @@ return $(document.createTextNode(txt)).wrap(nw).parent().attr("data-original", txt).insertBefore(elem); }; _results = []; - for (j = _ref = element.get(0).childNodes.length - 1; _ref <= 0 ? j <= 0 : j >= 0; _ref <= 0 ? j++ : j--) { + for (j = _i = _ref = element.get(0).childNodes.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; j = _ref <= 0 ? ++_i : --_i) { chld = element.get(0).childNodes[j]; if (chld.nodeType === document.TEXT_NODE) { len = chld.textContent.length; @@ -384,7 +472,9 @@ _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; + if ($(qp).data('solution').split(/[ ,]+/).length > 1) { + return true; + } } return false; }; @@ -400,7 +490,7 @@ }; Przyporzadkuj.prototype.check_question = function(question) { - var all, all_multiple, count, mandatory, optional, pn, pred, qp, v, _i, _j, _len, _len2, _ref, _ref2; + var all, all_multiple, count, mandatory, optional, pn, pred, qp, v, _i, _j, _len, _len1, _ref, _ref1; count = 0; all = 0; all_multiple = 0; @@ -422,9 +512,9 @@ all += 1; } if (this.multiple) { - _ref2 = $(".subject .question-piece", question); - for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) { - qp = _ref2[_j]; + _ref1 = $(".subject .question-piece", question); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + qp = _ref1[_j]; v = this.get_value_optional_list(qp, 'solution'); mandatory = v[0]; optional = v[1]; @@ -436,6 +526,31 @@ } }; + Przyporzadkuj.prototype.solve_question = function(question) { + var $ph, $pr, m, mandatory, optional, qp, v, _i, _len, _ref, _results; + _ref = $(".subject .question-piece", question); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + qp = _ref[_i]; + v = this.get_value_optional_list(qp, 'solution'); + mandatory = v[0]; + optional = v[1]; + _results.push((function() { + var _j, _len1, _ref1, _results1; + _ref1 = mandatory.concat(optional); + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + m = _ref1[_j]; + $pr = $(".predicate [data-predicate=" + m + "]", question); + $ph = $pr.find(".placeholder"); + _results1.push(this.draggable_move($(qp), $ph, this.multiple)); + } + return _results1; + }).call(this)); + } + return _results; + }; + return Przyporzadkuj; })(Excercise); @@ -481,6 +596,22 @@ return [good, all]; }; + PrawdaFalsz.prototype.show_solutions = function() { + var qp, _i, _len, _ref, _results; + reset(); + _ref = $(".question-piece", this.element); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + qp = _ref[_i]; + if ($(qp).data('solution') === 'true') { + _results.push($(".true", qp).click()); + } else { + _results.push($(".false", qp).click()); + } + } + return _results; + }; + return PrawdaFalsz; })(Excercise); -- 2.20.1