X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/ff191b1dc1ac37864898b775ce973f3900ddda89..3e4d96cd7fdd08910887be91ead79e446a96fe53:/redakcja/static/edumed/js/edumed.coffee diff --git a/redakcja/static/edumed/js/edumed.coffee b/redakcja/static/edumed/js/edumed.coffee index 2c02cd8d..59430a29 100644 --- a/redakcja/static/edumed/js/edumed.coffee +++ b/redakcja/static/edumed/js/edumed.coffee @@ -10,21 +10,36 @@ class EduModule extends Binding constructor: (element) -> super 'edumodule', element - $("[name=teacher-toggle]").change (ev) => - if $(ev.target).is(":checked") - $(".teacher", @element).addClass "show" - else - $(".teacher", @element).removeClass "show" + # $("[name=teacher-toggle]").change (ev) => + # if $(ev.target).is(":checked") + # $(".teacher", @element).addClass "show" + # else + # $(".teacher", @element).removeClass "show" -class Excercise extends Binding +class Exercise extends Binding constructor: (element) -> - super 'excercise', element + super 'exercise', element + # just save the html to reset the exercise + $(@element).data("exercise-html", $(@element).html()) - $(".check", @element).click => + $(".check", @element).click (ev) => @check() + $(ev.target).next(".retry").show() + $(ev.target).hide() + $(".retry", @element).click (ev) => + $(".correct, .incorrect", @element).removeClass("correct incorrect") + $(ev.target).prev(".check").show() + $(ev.target).hide() $('.solutions', @element).click => @show_solutions() + $(".comment", @element).show() + $('.reset', @element).click => + @reset() + + reset: -> + $(@element).html($(@element).data('exercise-html')) + exercise @element piece_correct: (qpiece) -> $(qpiece).removeClass('incorrect').addClass('correct') @@ -43,12 +58,30 @@ 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 + # eg.: things_i_need: "house bike tv playstation" + # yields ["house", "bike", "tv", "playstation"] + # If optional numbers argument is true, returns list of numbers + # instead of strings 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 + # Parses a list of values, separated by space or comma. + # The list is read from data attribute of elem using data_key + # Returns a 2-element list with mandatory and optional + # items. optional items are marked with a question mark on the end + # eg.: things_i_need: "house bike tv? playstation?" + # yields [[ "house", "bike"], ["tv", "playstation"]] get_value_optional_list: (elem, data_key) -> vals = @get_value_list(elem, data_key) mandat = [] @@ -74,9 +107,30 @@ 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() + if $added.is(".add-li") + $added.wrap("
") + $added.append('x') + $('.remove', $added).click (ev) => + if not ismultiple + $($added.data('original')).removeClass('disabled').draggable('enable') + + if $added.is(".add-li") + $added = $added.closest('li') + $added.prev(".placeholder:not(.multiple)").show() + $added.remove() + + +## XXX co z issortable? dragging: (ismultiple, issortable) -> $(".question", @element).each (i, question) => draggable_opts = @@ -88,75 +142,50 @@ class Excercise extends Binding $(".placeholder", question).droppable accept: (draggable) -> $draggable = $(draggable) + is_accepted = true + if not $draggable.is(".draggable") - return false - return self.draggable_accept $draggable, $(this) - - drop: (ev, ui) -> - 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() - - - -# $(".droppable", question).each (i, droppable) => -# $droppable = $(droppable) -# $droppable.droppable -# accept: (draggable) => -# return false -# $draggable = $(draggable) -# if not $draggable.is(".draggable") -# console.log('not draggable?') -# return false - -# for added in $droppable.children(".draggable") -# if @draggable_equal($(added), $draggable) -# console.log('already here:' + $draggable.text()) -# return false - -# return @draggable_accept $draggable - -# drop: (ev, ui) => -# added = ui.draggable.clone() -# # added.attr('style', '') -# $(ev.target).append(added) -# added.draggable(draggable_opts) -# @draggable_dropped added - -# if not @multiple -# $(ui.draggable).draggable("disable") - - - # if issortable - # $(".droppable", question).sortable - # items: "> li" - - # receive: (event, ui) => - # console.log("receive " + $(ui.item).text()) - # if not accept(ui.item, event.target) - # console.log("REVERT") - # $(event.target).sortable('cancel') - - # over: (event, ui) => - # if not accept(ui.item, event.target) - # $(event.target).sortable('disable') - # out: (event, ui) => - # $(event.target).sortable('enable') - - -class Wybor extends Excercise + is_accepted = false + + if is_accepted + is_accepted= self.draggable_accept $draggable, $(this) + + if is_accepted + $(this).addClass 'accepting' + else + $(this).removeClass 'accepting' + return is_accepted + + drop: (ev, ui) => + $(ev.target).removeClass 'accepting dragover' + + @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' + + + out: (ev, ui) -> + $(ev.target).removeClass 'dragover' + + + +class Wybor extends Exercise constructor: (element) -> super element @@ -188,10 +217,21 @@ 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 + +class Uporzadkuj extends Exercise constructor: (element) -> super element $('ol, ul', @element).sortable({ items: "> li" }) @@ -205,7 +245,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) @@ -213,9 +253,24 @@ 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 +class Luki extends Exercise constructor: (element) -> super element @dragging false, false @@ -234,42 +289,46 @@ 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 +class Zastap extends Exercise constructor: (element) -> super element $(".paragraph", @element).each (i, par) => - @wrap_words $(par), $('') - spans = $("> span", par).attr("contenteditable", "true") - spans.click (ev) => - spans.filter(':not(:empty)').removeClass('editing') - $(ev.target).addClass('editing') - + @wrap_words $(par), $('') + @dragging false, false check: -> all = 0 correct = 0 - $(".question-piece", @element).each (i, qpiece) => - txt = $(qpiece).data('original') - should_be_changed = false - if not txt? - txt = $(qpiece).data('solution') - should_be_changed = true - if not txt? - return - - if should_be_changed - all += 1 - if txt != $(qpiece).text() - @piece_incorrect qpiece - else - if should_be_changed - @piece_correct qpiece - correct += 1 + $(".paragraph", @element).each (i, par) => + $(".placeholder", par).each (j, qpiece) => + $qp = $(qpiece) + $dragged = $qp.next(".draggable") + if $qp.data("solution") + if $dragged and $qp.data("solution") == $dragged.data("no") + @piece_correct $dragged + correct += 1 +# else -- we dont mark enything here, so not to hint user about solution. He sees he hasn't used all the draggables + + all += 1 @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 ^ @@ -302,7 +361,7 @@ class Zastap extends Excercise $(chld).remove() -class Przyporzadkuj extends Excercise +class Przyporzadkuj extends Exercise is_multiple: -> for qp in $(".question-piece", @element) if $(qp).data('solution').split(/[ ,]+/).length > 1 @@ -322,35 +381,50 @@ class Przyporzadkuj extends Excercise check_question: (question) -> # subjects placed in predicates + minimum = $(question).data("minimum") count = 0 all = 0 - all_multiple = 0 - for qp in $(".predicate .question-piece", question) - pred = $(qp).closest("[data-predicate]") + if not minimum + all = $(".subjects .question-piece", question).length + + for pred in $(".predicate [data-predicate]", question) + pn = $(pred).attr('data-predicate') + if minimum? + all += minimum + + for qp in $(".question-piece", pred) + v = @get_value_optional_list qp, 'solution' + mandatory = v[0] + optional = v[1] + + if mandatory.indexOf(pn) >= 0 or (minimum and optional.indexOf(pn) >= 0) + count += 1 + @piece_correct qp + else + @piece_incorrect qp + + return [count, all] + + solve_question: (question) -> + minimum = $(question).data("min") + + 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 - pn = pred.data('predicate') - if mandatory.indexOf(pn) >= 0 or optional.indexOf(pn) >= 0 - count += 1 - @piece_correct qp + + if minimum + draggables = mandatory.count(optional)[0...minimum] else - @piece_incorrect qp - all += 1 + draggables = mandatory + for m in draggables + $pr = $(".predicate [data-predicate=" + m + "]", question) + $ph = $pr.find ".placeholder:visible" + @draggable_move $(qp), $ph, @multiple - 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 +class PrawdaFalsz extends Exercise constructor: (element) -> super element @@ -379,9 +453,18 @@ 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) -> +exercise = (ele) -> es = wybor: Wybor uporzadkuj: Uporzadkuj @@ -404,5 +487,5 @@ window.edumed = $(document).ready () -> new EduModule($("#book-text")) - $(".excercise").each (i, el) -> - excercise(this) \ No newline at end of file + $(".exercise").each (i, el) -> + exercise(this) \ No newline at end of file