X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/be2a6b23318edd40b491fc9f8a98360ae5618af7..7d9331d0912698ec04e95a8639600306525e00e6:/redakcja/static/edumed/js/edumed.coffee diff --git a/redakcja/static/edumed/js/edumed.coffee b/redakcja/static/edumed/js/edumed.coffee index ec1bcd0e..771e7c72 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).attr("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]}") @@ -61,8 +74,12 @@ class Wybor extends Excercise good = 0 solution = @get_value_list(question, 'solution') $(".question-piece", question).each (i, qpiece) => - piece_no = parseInt $(qpiece).attr 'data-no' - should_be_checked = solution.indexOf(piece_no) >= 0 + 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 is_checked = $("input", qpiece).is(":checked") if should_be_checked @@ -88,7 +105,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 +122,7 @@ class Uporzadkuj extends Excercise return [correct, all] +# XXX propozycje="1/0" class Luki extends Excercise constructor: (element) -> super element @@ -191,54 +209,130 @@ 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 - - $(".draggable", question).draggable(draggable_opts) - .droppable({ - accept: ".draggable" - }) - - $(".predicate .droppable", question).droppable - accept: ".draggable" - drop: (ev, ui) -> - is_multiple = ui.draggable.is(".multiple") - + if @multiple + helper_opts = { helper: "clone" } + else helper_opts = {} + + $(".draggable", question).draggable($.extend({}, draggable_opts, + helper_opts)) + + $(".predicate .droppable", question).parent().droppable + accept: (draggable) -> + $draggable = $(draggable) + if not $draggable.is(".draggable") + console.log('not draggable?') + return false + $predicate = $(this) + + for added in $predicate.find("li") + if $(added).text() == $draggable.text() + console.log('already here:' + $draggable.text()) + return false + return true + + drop: (ev, ui) => added = ui.draggable.clone() added.attr('style', '') - $(this).append(added) + $(ev.target).find(".droppable").append(added) added.draggable(draggable_opts) - if not is_multiple + if not @multiple or ui.draggable.closest(".predicate").length > 0 ui.draggable.remove() + $(".predicate .droppable", question).sortable + items: "> li" + $(".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] + + +class PrawdaFalsz extends Excercise + constructor: (element) -> + super element + + for qp in $(".question-piece", @element) + $(".true", qp).click (ev) -> + ev.preventDefault() + $(this).closest(".question-piece").data("value", "true") + $(this).addClass('chosen').siblings('a').removeClass('chosen') + $(".false", qp).click (ev) -> + ev.preventDefault() + $(this).closest(".question-piece").data("value", "false") + $(this).addClass('chosen').siblings('a').removeClass('chosen') + check_question: -> + all = 0 + good = 0 + for qp in $(".question-piece", @element) + if $(qp).data("solution").toString() == $(qp).data("value") + good += 1 + @piece_correct qp + else + @piece_incorrect qp + + all += 1 + + return [good, all] ########## @@ -249,6 +343,7 @@ excercise = (ele) -> luki: Luki zastap: Zastap przyporzadkuj: Przyporzadkuj + prawdafalsz: PrawdaFalsz cls = es[$(ele).attr('data-type')]