From dbeff3934ea6c90233d6f1fb232982ddab4ccaca Mon Sep 17 00:00:00 2001 From: rythmE Date: Thu, 11 Mar 2021 18:13:41 +0800 Subject: [PATCH 01/17] Updates for component tabs --- .../templates/openassessmentblock/edit/oa_edit.html | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit.html b/openassessment/templates/openassessmentblock/edit/oa_edit.html index efde4e24b5..0e5c635569 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit.html @@ -10,10 +10,13 @@
-
+ + From cd624365a3a17eacc2f5c951ffa0d17e28229ca3 Mon Sep 17 00:00:00 2001 From: rythmE Date: Fri, 19 Mar 2021 17:44:39 +0800 Subject: [PATCH 02/17] Updated span wrapper for lable title and question mark with help text --- .../templates/openassessmentblock/edit/oa_edit.html | 9 +++++++++ .../openassessmentblock/edit/oa_edit_criterion.html | 7 ++++--- .../openassessmentblock/edit/oa_edit_option.html | 6 +++--- .../edit/oa_edit_peer_assessment.html | 4 ++++ .../openassessmentblock/edit/oa_edit_rubric.html | 2 ++ .../edit/oa_edit_self_assessment.html | 2 ++ 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit.html b/openassessment/templates/openassessmentblock/edit/oa_edit.html index 0e5c635569..fb5380c924 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit.html @@ -44,6 +44,7 @@

{% trans "Rubric Change Impacts Settings +

{% trans "The display name for this component." %}

  • @@ -73,6 +74,7 @@

    {% trans "Rubric Change Impacts Settings value="{{ submission_start|utc|date:"H:i" }}" > +

    {% trans "The date and time when learners can begin submitting responses." %}

  • @@ -102,6 +104,7 @@

    {% trans "Rubric Change Impacts Settings value="{{ submission_due|utc|date:"H:i" }}" > +

    {% trans "The date and time when learners can no longer submit responses." %}

  • @@ -113,6 +116,7 @@

    {% trans "Rubric Change Impacts Settings {% endfor %} +

    {% trans "Specify whether learners must include a text based response to this problem's prompt." %}

    @@ -126,6 +130,7 @@

    {% trans "Rubric Change Impacts Settings {% endfor %} +

    {% trans "Specify whether learners are able to upload files as a part of their response." %}

    @@ -138,6 +143,7 @@

    {% trans "Rubric Change Impacts Settings +

    {% trans "Specify whether learners can submit files along with their text responses. Select Images to allow JPG, GIF, or PNG files. Select PDF or Images to allow PDF files and images. Select Custom File Types to allow files with extensions that you specify below. (Use the Select Custom File Types option with caution.)" %}

    @@ -150,6 +156,7 @@

    {% trans "Rubric Change Impacts Settings value="{{ white_listed_file_types }}" /> +

    {% trans "Enter the file extensions, separated by commas, that you want learners to be able to upload. For example: pdf,doc,docx." %}

      @@ -165,6 +172,7 @@

    {% trans "Rubric Change Impacts Settings +

    {% trans "Specify whether learners can write LaTeX formatted strings"%}

  • @@ -178,6 +186,7 @@

    {% trans "Rubric Change Impacts Settings min="0" max="99" /> +

    {% trans "Specify the number of top scoring responses to display. Valid numbers are 0 to 99. If the number is 0, the Top Responses section does not appear to learners." %}

  • diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_criterion.html b/openassessment/templates/openassessmentblock/edit/oa_edit_criterion.html index 6808a06913..d2e8d5fe97 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_criterion.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_criterion.html @@ -14,7 +14,7 @@
  • diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html index ea2238dd27..fb804c88fd 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html @@ -22,6 +22,7 @@ +

    {% trans "Specify the number of peer assessments that each learner must complete. Valid numbers are 0 to 99."%}

  • @@ -29,6 +30,7 @@ +

    {% trans "Specify the number of learners that each response must be assessed by. Valid numbers are 0 to 99."%}

  • @@ -50,6 +52,7 @@ value="{{ assessments.peer_assessment.start|utc|date:"H:i" }}" > +

    {% trans "Enter the date and time when learners can begin assessing peer responses." %}

  • @@ -71,6 +74,7 @@ value="{{ assessments.peer_assessment.due|utc|date:"H:i" }}" > +

    {% trans "Enter the date and time when all peer assessments must be complete." %}

  • diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_rubric.html b/openassessment/templates/openassessmentblock/edit/oa_edit_rubric.html index 6e11520841..6f59941813 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_rubric.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_rubric.html @@ -37,6 +37,7 @@
    +

    {% trans "Encourage learners to provide feedback on the response they have graded. You can replace the sample text with your own." %}

    @@ -46,6 +47,7 @@
    +

    {% trans "Enter feedback text that learners will see before they enter their own feedback. Use this text to show learners a good example peer assessment." %}

    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html index 9c5eb2d4d9..49961a4923 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html @@ -36,6 +36,7 @@ value="{{ assessments.self_assessment.start|utc|date:"H:i" }}" > +

    {% trans "Enter the date and time when learners can begin assessing their responses." %}

  • @@ -57,6 +58,7 @@ value="{{ assessments.self_assessment.due|utc|date:"H:i" }}" > +

    {% trans "Enter the date and time when all self assessments must be complete." %}

  • From 82d750d63a7f7afe2311fb3c0463f94db67f6d4e Mon Sep 17 00:00:00 2001 From: Sean Date: Thu, 25 Mar 2021 17:46:54 +0800 Subject: [PATCH 03/17] template modification for support styling. --- .../templates/openassessmentblock/edit/oa_edit.html | 7 ++++--- .../openassessmentblock/edit/oa_edit_criterion.html | 2 +- .../openassessmentblock/edit/oa_edit_option.html | 2 +- .../openassessmentblock/edit/oa_edit_prompt.html | 2 +- .../static/js/src/studio/oa_edit_validation_alert.js | 8 ++++---- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit.html b/openassessment/templates/openassessmentblock/edit/oa_edit.html index fb5380c924..f83ea78c13 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit.html @@ -32,6 +32,7 @@

    {% trans "Rubric Change Impacts Settings +
    {% include "openassessmentblock/edit/oa_edit_prompts.html" %} {% include "openassessmentblock/edit/oa_edit_rubric.html" %} @@ -203,17 +204,17 @@

    {% trans "Rubric Change Impacts Settings {% endfor %}

    + diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_criterion.html b/openassessment/templates/openassessmentblock/edit/oa_edit_criterion.html index d2e8d5fe97..2d82a45d22 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_criterion.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_criterion.html @@ -6,7 +6,7 @@

    {% trans "Criterion" %}

    {% trans "You cannot delete a criterion after the assignment has been released." %}

    -

    {% trans "Remove" %}

    +

    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_option.html b/openassessment/templates/openassessmentblock/edit/oa_edit_option.html index 782048f6ba..814360908d 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_option.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_option.html @@ -4,7 +4,7 @@
    {% trans "Option" %}
    -

    {% trans "Remove" %}

    +

    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_prompt.html b/openassessment/templates/openassessmentblock/edit/oa_edit_prompt.html index d9b11b09ef..ac463862e3 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_prompt.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_prompt.html @@ -7,7 +7,7 @@
    {% trans "Prompt" %}

    {% trans "You cannot delete a prompt after the assignment has been released." %}

    -

    {% trans "Remove" %}

    +

    diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_validation_alert.js b/openassessment/xblock/static/js/src/studio/oa_edit_validation_alert.js index e2415e90ee..4bfcc9fb9d 100644 --- a/openassessment/xblock/static/js/src/studio/oa_edit_validation_alert.js +++ b/openassessment/xblock/static/js/src/studio/oa_edit_validation_alert.js @@ -43,9 +43,9 @@ OpenAssessment.ValidationAlert.prototype = { var headerHeight = $('#openassessment_editor_header', this.editorElement).outerHeight(); this.element.addClass('covered'); var styles = { - 'height': 'Calc(100% - ' + headerHeight + 'px)', + /*'height': 'Calc(100% - ' + headerHeight + 'px)', 'border-top-right-radius': '3px', - 'border-top-left-radius': '3px' + 'border-top-left-radius': '3px'*/ }; $('.oa_editor_content_wrapper', this.editorElement).each(function() { @@ -79,9 +79,9 @@ OpenAssessment.ValidationAlert.prototype = { var headerHeight = $('#openassessment_editor_header', this.editorElement).outerHeight(); var heightString = 'Calc(100% - ' + (alertHeight + headerHeight) + 'px)'; var styles = { - 'height': heightString, + /*'height': heightString, 'border-top-right-radius': '0px', - 'border-top-left-radius': '0px' + 'border-top-left-radius': '0px'*/ }; $('.oa_editor_content_wrapper', this.editorElement).each(function() { From e2599731d1775144df12036193701cd2d0278186 Mon Sep 17 00:00:00 2001 From: Sean Date: Fri, 26 Mar 2021 11:35:57 +0800 Subject: [PATCH 04/17] enable question mark for setting panel of ORA2 component editing form --- .../openassessmentblock/edit/oa_edit.html | 18 +++++++++--------- .../static/js/src/studio/oa_edit_settings.js | 9 +++++++++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit.html b/openassessment/templates/openassessmentblock/edit/oa_edit.html index f83ea78c13..1891c2b183 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit.html @@ -44,8 +44,8 @@

    {% trans "Rubric Change Impacts Settings
    +
    -

    {% trans "The display name for this component." %}

  • @@ -74,8 +74,8 @@

    {% trans "Rubric Change Impacts Settings id="openassessment_submission_start_time" value="{{ submission_start|utc|date:"H:i" }}" > +

  • -

    {% trans "The date and time when learners can begin submitting responses." %}

  • @@ -104,8 +104,8 @@

    {% trans "Rubric Change Impacts Settings id="openassessment_submission_due_time" value="{{ submission_due|utc|date:"H:i" }}" > + -

    {% trans "The date and time when learners can no longer submit responses." %}

  • @@ -116,8 +116,8 @@

    {% trans "Rubric Change Impacts Settings {% endfor %} + -

    {% trans "Specify whether learners must include a text based response to this problem's prompt." %}

    @@ -130,8 +130,8 @@

    {% trans "Rubric Change Impacts Settings {% endfor %} + -

    {% trans "Specify whether learners are able to upload files as a part of their response." %}

    @@ -143,8 +143,8 @@

    {% trans "Rubric Change Impacts Settings + -

    {% trans "Specify whether learners can submit files along with their text responses. Select Images to allow JPG, GIF, or PNG files. Select PDF or Images to allow PDF files and images. Select Custom File Types to allow files with extensions that you specify below. (Use the Select Custom File Types option with caution.)" %}

    @@ -156,8 +156,8 @@

    {% trans "Rubric Change Impacts Settings type="text" value="{{ white_listed_file_types }}" /> + -

    {% trans "Enter the file extensions, separated by commas, that you want learners to be able to upload. For example: pdf,doc,docx." %}

      @@ -172,8 +172,8 @@

    {% trans "Rubric Change Impacts Settings + -

    {% trans "Specify whether learners can write LaTeX formatted strings"%}

  • @@ -186,8 +186,8 @@

    {% trans "Rubric Change Impacts Settings value="{{ leaderboard_show }}" min="0" max="99" /> + -

    {% trans "Specify the number of top scoring responses to display. Valid numbers are 0 to 99. If the number is 0, the Top Responses section does not appear to learners." %}

  • diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_settings.js b/openassessment/xblock/static/js/src/studio/oa_edit_settings.js index 7eca8398d7..21df948e92 100644 --- a/openassessment/xblock/static/js/src/studio/oa_edit_settings.js +++ b/openassessment/xblock/static/js/src/studio/oa_edit_settings.js @@ -81,6 +81,15 @@ OpenAssessment.EditSettingsView = function(element, assessmentViews, data) { ); this.initializeSortableAssessments(); + + if (LearningTribes && LearningTribes.QuestionMark) { + $wrappers = $('#oa_settings_editor_wrapper .question-mark-wrapper') + $wrappers.each(function(i, wrapper){ + new LearningTribes.QuestionMark(wrapper) + }) + } + //console.log('sss') + }; OpenAssessment.EditSettingsView.prototype = { From cbb910bc986ea7dcd4a37e19118425fac5eccdff Mon Sep 17 00:00:00 2001 From: Sean Date: Wed, 7 Apr 2021 17:08:04 +0800 Subject: [PATCH 05/17] sv2 --- .../edit/oa_edit_peer_assessment.html | 9 ++++--- .../edit/oa_edit_self_assessment.html | 4 +-- .../edit/oa_training_example.html | 25 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html index fb804c88fd..ea649f45fa 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html @@ -21,16 +21,16 @@
    +
    -

    {% trans "Specify the number of peer assessments that each learner must complete. Valid numbers are 0 to 99."%}

  • +
    -

    {% trans "Specify the number of learners that each response must be assessed by. Valid numbers are 0 to 99."%}

  • @@ -42,6 +42,7 @@ class="input setting-input" value="{{ assessments.peer_assessment.start|utc|date:"Y-m-d" }}" > +
    @@ -51,8 +52,8 @@ class="input setting-input" value="{{ assessments.peer_assessment.start|utc|date:"H:i" }}" > +
    -

    {% trans "Enter the date and time when learners can begin assessing peer responses." %}

  • @@ -73,8 +74,8 @@ class="input setting-input" value="{{ assessments.peer_assessment.due|utc|date:"H:i" }}" > + -

    {% trans "Enter the date and time when all peer assessments must be complete." %}

  • diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html index 49961a4923..28e1cd29b3 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html @@ -26,6 +26,7 @@ class="input setting-input" value="{{ assessments.self_assessment.start|utc|date:"Y-m-d" }}" > +
    @@ -36,7 +37,6 @@ value="{{ assessments.self_assessment.start|utc|date:"H:i" }}" >
    -

    {% trans "Enter the date and time when learners can begin assessing their responses." %}

  • @@ -48,6 +48,7 @@ class="input setting-input" value="{{ assessments.self_assessment.due|utc|date:"Y-m-d" }}" > +
    @@ -58,7 +59,6 @@ value="{{ assessments.self_assessment.due|utc|date:"H:i" }}" >
    -

    {% trans "Enter the date and time when all self assessments must be complete." %}

  • diff --git a/openassessment/templates/openassessmentblock/edit/oa_training_example.html b/openassessment/templates/openassessmentblock/edit/oa_training_example.html index 9736df9ca3..d390460869 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_training_example.html +++ b/openassessment/templates/openassessmentblock/edit/oa_training_example.html @@ -7,22 +7,11 @@
    {% trans "Scored Response" %}
    -

    {% trans "Remove" %}

    +

    -
    -

    {% trans "Response Score" %}

    -
      - {% for criterion in example.criteria %} - {% if criterion.options %} - {% include "openassessmentblock/edit/oa_training_example_criterion.html" with criterion=criterion %} - {% endif %} - {% endfor %} -
    -
    -

    {% trans "Response" %}

      @@ -33,6 +22,16 @@

      {% trans "Response" %}

      {% endfor %}
    +
    +

    {% trans "Response Score" %}

    +
      + {% for criterion in example.criteria %} + {% if criterion.options %} + {% include "openassessmentblock/edit/oa_training_example_criterion.html" with criterion=criterion %} + {% endif %} + {% endfor %} +
    +
    -{% endspaceless %} \ No newline at end of file +{% endspaceless %} From 43e4f868530b0a4275a89c39e4edaaeeac488e94 Mon Sep 17 00:00:00 2001 From: Sean Date: Mon, 19 Apr 2021 17:48:35 +0800 Subject: [PATCH 06/17] In editing form, stop the action of scrolling to top when user click save button. --- openassessment/xblock/static/js/src/studio/oa_edit.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/openassessment/xblock/static/js/src/studio/oa_edit.js b/openassessment/xblock/static/js/src/studio/oa_edit.js index d97fb9c4cf..4e1643a120 100644 --- a/openassessment/xblock/static/js/src/studio/oa_edit.js +++ b/openassessment/xblock/static/js/src/studio/oa_edit.js @@ -127,7 +127,7 @@ OpenAssessment.StudioView.prototype = { Save the problem's XML definition to the server. If the problem has been released, make the user confirm the save. **/ - save: function() { + save: function(e) { var view = this; this.saveTabState(); @@ -166,6 +166,9 @@ OpenAssessment.StudioView.prototype = { view.showError(errMsg); }); } + e.stopPropagation(); + e.preventDefault(); + return false; }, /** @@ -223,10 +226,13 @@ OpenAssessment.StudioView.prototype = { /** Cancel editing. **/ - cancel: function() { + cancel: function(e) { // Notify the client-side runtime so it will close the editing modal this.saveTabState(); this.runtime.notify('cancel', {}); + e.stopPropagation(); + e.preventDefault(); + return false; }, /** From 6fc5bc23f7d4b4ce60d16b2e4590e2e388cdc859 Mon Sep 17 00:00:00 2001 From: Sean Date: Tue, 20 Apr 2021 10:29:00 +0800 Subject: [PATCH 07/17] apply switcher onto checkbox --- .../edit/oa_edit_peer_assessment.html | 1 + .../edit/oa_edit_self_assessment.html | 1 + .../edit/oa_edit_staff_assessment.html | 1 + .../edit/oa_edit_student_training.html | 1 + .../xblock/static/js/src/studio/oa_edit_settings.js | 12 +++++++++++- 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html index ea649f45fa..fc18be8812 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html @@ -6,6 +6,7 @@
    +
    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html index 28e1cd29b3..879b3678dc 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html @@ -6,6 +6,7 @@
    +
    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html index b6ac517b00..a827fac590 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html @@ -5,6 +5,7 @@
    +
    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html b/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html index e873ed42ca..19715d2a9e 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html @@ -6,6 +6,7 @@
    +
    diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_settings.js b/openassessment/xblock/static/js/src/studio/oa_edit_settings.js index 21df948e92..99c24f3458 100644 --- a/openassessment/xblock/static/js/src/studio/oa_edit_settings.js +++ b/openassessment/xblock/static/js/src/studio/oa_edit_settings.js @@ -88,7 +88,17 @@ OpenAssessment.EditSettingsView = function(element, assessmentViews, data) { new LearningTribes.QuestionMark(wrapper) }) } - //console.log('sss') + if (LearningTribes && LearningTribes.Switcher) { + var $boxes = $('#oa_settings_editor_wrapper input[type=checkbox]') + $boxes.each(function(i, checkbox){ + var $checkbox = $(checkbox) + var $switcher = $checkbox.next('span.switcher-wrapper'); + new LearningTribes.Switcher($switcher[0], $checkbox.is(':checked').toString(), + function(checked){ + $checkbox.attr('checked', checked) + }) + }) + } }; From e703e6a92cc503b8daf255a90d5985beef69cd64 Mon Sep 17 00:00:00 2001 From: Sean Date: Thu, 22 Apr 2021 18:04:05 +0800 Subject: [PATCH 08/17] restore checkbox --- .../edit/oa_edit_peer_assessment.html | 1 - .../edit/oa_edit_self_assessment.html | 1 - .../edit/oa_edit_staff_assessment.html | 1 - .../edit/oa_edit_student_training.html | 1 - .../xblock/static/js/src/studio/oa_edit_settings.js | 11 ----------- 5 files changed, 15 deletions(-) diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html index fc18be8812..ea649f45fa 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html @@ -6,7 +6,6 @@
    -
    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html index 879b3678dc..28e1cd29b3 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html @@ -6,7 +6,6 @@
    -
    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html index a827fac590..b6ac517b00 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html @@ -5,7 +5,6 @@
    -
    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html b/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html index 19715d2a9e..e873ed42ca 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html @@ -6,7 +6,6 @@
    -
    diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_settings.js b/openassessment/xblock/static/js/src/studio/oa_edit_settings.js index 99c24f3458..e80f1315f0 100644 --- a/openassessment/xblock/static/js/src/studio/oa_edit_settings.js +++ b/openassessment/xblock/static/js/src/studio/oa_edit_settings.js @@ -88,17 +88,6 @@ OpenAssessment.EditSettingsView = function(element, assessmentViews, data) { new LearningTribes.QuestionMark(wrapper) }) } - if (LearningTribes && LearningTribes.Switcher) { - var $boxes = $('#oa_settings_editor_wrapper input[type=checkbox]') - $boxes.each(function(i, checkbox){ - var $checkbox = $(checkbox) - var $switcher = $checkbox.next('span.switcher-wrapper'); - new LearningTribes.Switcher($switcher[0], $checkbox.is(':checked').toString(), - function(checked){ - $checkbox.attr('checked', checked) - }) - }) - } }; From b96cc5b2a721d4cb6278f1f55f37eb095415e25e Mon Sep 17 00:00:00 2001 From: Sean Date: Fri, 23 Apr 2021 17:44:34 +0800 Subject: [PATCH 09/17] convert field "Allow LaTeX Responses" to switcher component --- .../openassessmentblock/edit/oa_edit.html | 1 + .../static/js/src/studio/oa_edit_settings.js | 21 ++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit.html b/openassessment/templates/openassessmentblock/edit/oa_edit.html index 1891c2b183..7bdba26580 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit.html @@ -172,6 +172,7 @@

    {% trans "Rubric Change Impacts Settings +

    {% trans "Specify whether learners can write LaTeX formatted strings"%}

    diff --git a/openassessment/xblock/static/js/src/studio/oa_edit_settings.js b/openassessment/xblock/static/js/src/studio/oa_edit_settings.js index e80f1315f0..b79874b0dd 100644 --- a/openassessment/xblock/static/js/src/studio/oa_edit_settings.js +++ b/openassessment/xblock/static/js/src/studio/oa_edit_settings.js @@ -82,11 +82,22 @@ OpenAssessment.EditSettingsView = function(element, assessmentViews, data) { this.initializeSortableAssessments(); - if (LearningTribes && LearningTribes.QuestionMark) { - $wrappers = $('#oa_settings_editor_wrapper .question-mark-wrapper') - $wrappers.each(function(i, wrapper){ - new LearningTribes.QuestionMark(wrapper) - }) + if (LearningTribes) { + if (LearningTribes.QuestionMark) { + var $wrappers = $('#oa_settings_editor_wrapper .question-mark-wrapper') + $wrappers.each(function(i, wrapper){ + new LearningTribes.QuestionMark(wrapper) + }) + } + if (LearningTribes.Switcher) { + var $sel = $('#openassessment_submission_latex_editor', this.settingsElement); + var $switcher = $sel.next(); + new LearningTribes.Switcher($switcher[0], $sel.val() === '1' ? true : false, + function(checked){ + $sel.val(checked ? 1 : 0); + }); + } + } }; From 0e9c2fa05a8fc2ad6ca136d27fc2da8e97892ab8 Mon Sep 17 00:00:00 2001 From: Sean Date: Sun, 25 Apr 2021 14:34:56 +0800 Subject: [PATCH 10/17] prevent page scroll to top when user click cancel button of ora2 editing form --- openassessment/xblock/static/js/src/studio/oa_edit.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openassessment/xblock/static/js/src/studio/oa_edit.js b/openassessment/xblock/static/js/src/studio/oa_edit.js index 4e1643a120..6a208d64dd 100644 --- a/openassessment/xblock/static/js/src/studio/oa_edit.js +++ b/openassessment/xblock/static/js/src/studio/oa_edit.js @@ -128,6 +128,8 @@ OpenAssessment.StudioView.prototype = { If the problem has been released, make the user confirm the save. **/ save: function(e) { + e.stopPropagation(); + e.preventDefault(); var view = this; this.saveTabState(); @@ -166,8 +168,6 @@ OpenAssessment.StudioView.prototype = { view.showError(errMsg); }); } - e.stopPropagation(); - e.preventDefault(); return false; }, @@ -227,11 +227,11 @@ OpenAssessment.StudioView.prototype = { Cancel editing. **/ cancel: function(e) { + e.stopPropagation(); + e.preventDefault(); // Notify the client-side runtime so it will close the editing modal this.saveTabState(); this.runtime.notify('cancel', {}); - e.stopPropagation(); - e.preventDefault(); return false; }, From 5be825c4472bbd3bf3ea11bb8f426b374beee943 Mon Sep 17 00:00:00 2001 From: Sean Date: Sun, 25 Apr 2021 15:47:38 +0800 Subject: [PATCH 11/17] prevent event propagation for save and cancel buttons of editing form(ora2) --- .../xblock/static/js/src/studio/oa_edit.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/openassessment/xblock/static/js/src/studio/oa_edit.js b/openassessment/xblock/static/js/src/studio/oa_edit.js index 6a208d64dd..3e2fedf666 100644 --- a/openassessment/xblock/static/js/src/studio/oa_edit.js +++ b/openassessment/xblock/static/js/src/studio/oa_edit.js @@ -71,6 +71,9 @@ OpenAssessment.StudioView = function(runtime, element, server, data) { // Install the save and cancel buttons $(".openassessment_save_button", this.element).click($.proxy(this.save, this)); $(".openassessment_cancel_button", this.element).click($.proxy(this.cancel, this)); + + $(".openassessment_save_button", this.element).click(this.stopPropagation); + $(".openassessment_cancel_button", this.element).click(this.stopPropagation); }; OpenAssessment.StudioView.prototype = { @@ -123,13 +126,17 @@ OpenAssessment.StudioView.prototype = { OpenAssessment.lastOpenEditingTab = tabElement.tabs('option', 'active'); }, + stopPropagation: function(e) { + e.stopPropagation(); + e.preventDefault(); + return false; + }, /** Save the problem's XML definition to the server. If the problem has been released, make the user confirm the save. **/ - save: function(e) { - e.stopPropagation(); - e.preventDefault(); + save: function() { + var view = this; this.saveTabState(); @@ -168,7 +175,6 @@ OpenAssessment.StudioView.prototype = { view.showError(errMsg); }); } - return false; }, /** From bc15f9ec0ba08d53548c165bf99629545c512676 Mon Sep 17 00:00:00 2001 From: Sean Date: Sun, 25 Apr 2021 17:17:42 +0800 Subject: [PATCH 12/17] # merge all files. --- openassessment/xblock/static/js/openassessment-studio.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openassessment/xblock/static/js/openassessment-studio.min.js b/openassessment/xblock/static/js/openassessment-studio.min.js index 6e6ae6e396..f9f81b14f9 100644 --- a/openassessment/xblock/static/js/openassessment-studio.min.js +++ b/openassessment/xblock/static/js/openassessment-studio.min.js @@ -1 +1 @@ -if("undefined"!=typeof OpenAssessment&&OpenAssessment||(OpenAssessment={}),void 0===window.gettext&&(window.gettext=function(text){return text}),void 0===window.ngetgext&&(window.ngettext=function(singularText,pluralText,n){return 1"),$(textarea).val(text));var newElId=Date.now()+"-textarea-"+100*Math.random();$(textarea).attr("id",newElId).tinymce(oaTinyMCE({base_asset_url:$("#openassessment_prompt_template").data("baseAssetUrl")}))}return $(el)},getFieldValues:function(){return{description:this.description()}},description:function(text){var sel=$(".openassessment_prompt_description",this.element);if(!this.tinyMCEEnabled)return OpenAssessment.Fields.stringField(sel,text);var tinyEl=window.tinyMCE.get(sel.attr("id"));if(!text)return tinyEl.getContent();tinyEl.setContent(text)},addEventListeners:function(){},addHandler:function(){this.notifier.notificationFired("promptAdd",{index:this.element.index()})},removeHandler:function(){this.notifier.notificationFired("promptRemove",{index:this.element.index()})},updateHandler:function(){},validate:function(){return!0},validationErrors:function(){return[]},clearValidationErrors:function(){}},OpenAssessment.RubricOption=function(element,notifier){this.element=element,this.notifier=notifier,this.pointsField=new OpenAssessment.IntField($(".openassessment_criterion_option_points",this.element),{min:0,max:999})},OpenAssessment.RubricOption.prototype={addEventListeners:function(){$(this.element).focusout($.proxy(this.updateHandler,this))},getFieldValues:function(){var fields={label:this.label(),points:this.points(),explanation:this.explanation()},nameString=OpenAssessment.Fields.stringField($(".openassessment_criterion_option_name",this.element));return""!==nameString&&(fields.name=nameString),fields},label:function(label){var sel=$(".openassessment_criterion_option_label",this.element);return OpenAssessment.Fields.stringField(sel,label)},points:function(points){return void 0!==points&&this.pointsField.set(points),this.pointsField.get()},explanation:function(explanation){var sel=$(".openassessment_criterion_option_explanation",this.element);return OpenAssessment.Fields.stringField(sel,explanation)},addHandler:function(){var criterionElement=$(this.element).closest(".openassessment_criterion"),criterionName=$(criterionElement).data("criterion"),criterionLabel=$(".openassessment_criterion_label",criterionElement).val(),options=$(".openassessment_criterion_option",this.element.parent()),name=OpenAssessment.ItemUtilities.createUniqueName(options,"data-option");$(this.element).attr("data-criterion",criterionName).attr("data-option",name),$(".openassessment_criterion_option_name",this.element).attr("value",name);var fields=this.getFieldValues();this.notifier.notificationFired("optionAdd",{criterionName:criterionName,criterionLabel:criterionLabel,name:name,label:fields.label,points:fields.points})},removeHandler:function(){var criterionName=$(this.element).data("criterion"),optionName=$(this.element).data("option");this.notifier.notificationFired("optionRemove",{criterionName:criterionName,name:optionName})},updateHandler:function(){var fields=this.getFieldValues(),criterionName=$(this.element).data("criterion"),optionName=$(this.element).data("option"),optionLabel=fields.label,optionPoints=fields.points;this.notifier.notificationFired("optionUpdated",{criterionName:criterionName,name:optionName,label:optionLabel,points:optionPoints})},validate:function(){return this.pointsField.validate()},validationErrors:function(){return 0=this.min&&value<=this.max;return-1!==this.input.val().indexOf(".")&&(isValid=!1),isValid||this.input.addClass("openassessment_highlighted_field"),isValid},clearValidationErrors:function(){this.input.removeClass("openassessment_highlighted_field")},validationErrors:function(){return this.input.hasClass("openassessment_highlighted_field")?["Int field is invalid"]:[]}},OpenAssessment.ToggleControl=function(checkboxSel,shownSel,hiddenSel,notifier){this.checkbox=checkboxSel,this.shownSection=shownSel,this.hiddenSection=hiddenSel,this.notifier=notifier},OpenAssessment.ToggleControl.prototype={install:function(){return this.checkbox.change(this,function(event){var control=event.data;this.checked?(control.notifier.notificationFired("toggleOn",{}),control.show()):(control.notifier.notificationFired("toggleOff",{}),control.hide())}),this},show:function(){this.hiddenSection.addClass("is--hidden"),this.shownSection.removeClass("is--hidden")},hide:function(){this.shownSection.addClass("is--hidden"),this.hiddenSection.removeClass("is--hidden")}},OpenAssessment.DatetimeControl=function(element,datePicker,timePicker){this.element=element,this.datePicker=datePicker,this.timePicker=timePicker},OpenAssessment.DatetimeControl.prototype={install:function(){var dateString=$(this.datePicker,this.element).val();return $(this.datePicker,this.element).datepicker({showButtonPanel:!0}).datepicker("option","dateFormat","yy-mm-dd").datepicker("setDate",dateString),$(this.timePicker,this.element).timepicker({timeFormat:"H:i",step:60}),this},datetime:function(dateString,timeString){var datePickerSel=$(this.datePicker,this.element),timePickerSel=$(this.timePicker,this.element);return void 0!==dateString&&datePickerSel.val(dateString),void 0!==timeString&&timePickerSel.val(timeString),datePickerSel.val()+"T"+timePickerSel.val()},validate:function(){var dateString=$(this.datePicker,this.element).val(),timeString=$(this.timePicker,this.element).val(),isDateValid=!1;try{isDateValid=$.datepicker.parseDate($.datepicker.ISO_8601,dateString)instanceof Date}catch(err){}isDateValid||$(this.datePicker,this.element).addClass("openassessment_highlighted_field");var isTimeValid=null!==timeString.match(/^\d{2}:\d{2}$/g);return isTimeValid||$(this.timePicker,this.element).addClass("openassessment_highlighted_field"),isDateValid&&isTimeValid},clearValidationErrors:function(){$(this.datePicker,this.element).removeClass("openassessment_highlighted_field"),$(this.timePicker,this.element).removeClass("openassessment_highlighted_field")},validationErrors:function(){var errors=[],dateHasError=$(this.datePicker,this.element).hasClass("openassessment_highlighted_field"),timeHasError=$(this.timePicker,this.element).hasClass("openassessment_highlighted_field");return dateHasError&&errors.push("Date is invalid"),timeHasError&&errors.push("Time is invalid"),errors}},OpenAssessment.SelectControl=function(selectSel,mapping,notifier){this.select=selectSel,this.mapping=mapping,this.notifier=notifier},OpenAssessment.SelectControl.prototype={install:function(){return this.select.change(this,function(event){var control=event.data;control.notifier.notificationFired("selectionChanged",{selected:this.value}),control.change(this.value)}),this},change:function(selected){$.isFunction(this.mapping)?this.mapping(selected):$.each(this.mapping,function(option,sel){option===selected?sel.removeClass("is--hidden"):sel.addClass("is--hidden")})}},OpenAssessment.InputControl=function(inputSel,validator){this.input=$(inputSel),this.validator=validator,this.errors=[]},OpenAssessment.InputControl.prototype={get:function(){return this.input.val()},set:function(val){this.input.val(val)},validate:function(){return this.errors=this.validator(this.get()),this.errors.length&&(this.input.addClass("openassessment_highlighted_field"),this.input.parent().nextAll(".message-status").text(this.errors.join(";")),this.input.parent().nextAll(".message-status").addClass("is-shown")),0===this.errors.length},clearValidationErrors:function(){this.input.removeClass("openassessment_highlighted_field"),this.input.parent().nextAll(".message-status").removeClass("is-shown")},validationErrors:function(){return this.errors}},OpenAssessment.StudentTrainingListener=function(){this.element=$("#oa_student_training_editor"),this.alert=new OpenAssessment.ValidationAlert},OpenAssessment.StudentTrainingListener.prototype={promptAdd:function(){var view=this.element;$("#openassessment_training_example_part_template").children().first().clone().removeAttr("id").toggleClass("is--hidden",!1).appendTo(".openassessment_training_example_essay",view)},promptRemove:function(data){var view=this.element;$(".openassessment_training_example_essay li:nth-child("+(data.index+1)+")",view).remove()},optionUpdated:function(data){this._optionSel(data.criterionName).each(function(){var option=$('option[value="'+data.name+'"]',this).attr("data-points",data.points).attr("data-label",data.label);OpenAssessment.ItemUtilities.refreshOptionString(option)})},optionAdd:function(data){var criterionAdded=!1;0===this._optionSel(data.criterionName).length&&(this.criterionAdd(data),criterionAdded=!0),this._optionSel(data.criterionName).each(function(){var option=$("").attr("value",data.name).attr("data-points",data.points).attr("data-label",data.label);OpenAssessment.ItemUtilities.refreshOptionString(option),$(this).append(option)}),criterionAdded&&this.displayAlertMsg(gettext("Criterion Added"),gettext("You have added a criterion. You will need to select an option for the criterion in the Learner Training step. To do this, click the Settings tab."))},optionRemove:function(data){var handler=this,invalidated=!1;this._optionSel(data.criterionName).each(function(){var criterionOption=this;$(criterionOption).val()===data.name.toString()&&($(criterionOption).val("").addClass("openassessment_highlighted_field").click(function(){$(criterionOption).removeClass("openassessment_highlighted_field")}),invalidated=!0),$('option[value="'+data.name+'"]',criterionOption).remove(),1===$("option",criterionOption).length&&(handler.removeAllOptions(data),invalidated=!1)}),invalidated&&this.displayAlertMsg(gettext("Option Deleted"),gettext("You have deleted an option. That option has been removed from its criterion in the sample responses in the Learner Training step. You might have to select a new option for the criterion."))},_optionSel:function(criterionName){return $('.openassessment_training_example_criterion_option[data-criterion="'+criterionName+'"]',this.element)},removeAllOptions:function(data){var changed=!1;$(".openassessment_training_example_criterion",this.element).each(function(){$(this).data("criterion")===data.criterionName&&($(this).remove(),changed=!0)}),changed&&this.displayAlertMsg(gettext("Option Deleted"),gettext("You have deleted all the options for this criterion. The criterion has been removed from the sample responses in the Learner Training step."))},criterionRemove:function(data){var changed=!1,sel='.openassessment_training_example_criterion[data-criterion="'+data.criterionName+'"]';$(sel,this.element).each(function(){$(this).remove(),changed=!0}),changed&&this.displayAlertMsg(gettext("Criterion Deleted"),gettext("You have deleted a criterion. The criterion has been removed from the example responses in the Learner Training step."))},displayAlertMsg:function(title,msg){$("#include_student_training",this.element).is(":checked")&&1<$(".openassessment_training_example",this.element).length&&this.alert.setMessage(title,msg).show()},criterionUpdated:function(data){var sel='.openassessment_training_example_criterion[data-criterion="'+data.criterionName+'"]';$(sel,this.element).each(function(){$(".openassessment_training_example_criterion_name_wrapper",this).text(data.criterionLabel)})},criterionAdd:function(data){var view=this.element,criterion=$("#openassessment_training_example_criterion_template").children().first().clone().removeAttr("id").attr("data-criterion",data.criterionName).toggleClass("is--hidden",!1).appendTo(".openassessment_training_example_criteria_selections",view);criterion.find(".openassessment_training_example_criterion_option").attr("data-criterion",data.criterionName),criterion.find(".openassessment_training_example_criterion_name_wrapper").text(data.label)},examplesCriteriaLabels:function(){var examples=[];return $(".openassessment_training_example_criteria_selections",this.element).each(function(){var exampleDescription={};$(".openassessment_training_example_criterion",this).each(function(){var criterionName=$(this).data("criterion"),criterionLabel=$(".openassessment_training_example_criterion_name_wrapper",this).text().trim();exampleDescription[criterionName]=criterionLabel}),examples.push(exampleDescription)}),examples},examplesOptionsLabels:function(){var examples=[];return $(".openassessment_training_example_criteria_selections",this.element).each(function(){var exampleDescription={};$(".openassessment_training_example_criterion_option",this).each(function(){var criterionName=$(this).data("criterion");exampleDescription[criterionName]={},$("option",this).each(function(){var optionName=$(this).val(),optionLabel=$(this).text().trim();exampleDescription[criterionName][optionName]=optionLabel})}),examples.push(exampleDescription)}),examples}},OpenAssessment.AssessmentToggleListener=function(){this.alert=new OpenAssessment.ValidationAlert},OpenAssessment.AssessmentToggleListener.prototype={toggleOff:function(){this.alert.setMessage(gettext("Warning"),gettext("Changes to steps that are not selected as part of the assignment will not be saved.")).show()},toggleOn:function(){this.alert.hide()}},OpenAssessment.Notifier=function(listeners){this.listeners=listeners},OpenAssessment.Notifier.prototype={notificationFired:function(name,data){for(var i=0;i",{tabIndex:-1,href:a,title:this.title||b,target:this.target}).text(b)),this.delegateEvents(),this}}),v=(h.EmailCell=t.extend({className:"email-cell",formatter:o,render:function(){this.$el.empty();var a=this.model,b=this.formatter.fromRaw(a.get(this.column.get("name")),a);return this.$el.append(g("",{tabIndex:-1,href:"mailto:"+b,title:b}).text(b)),this.delegateEvents(),this}}),h.NumberCell=s.extend({className:"number-cell",decimals:k.prototype.defaults.decimals,decimalSeparator:k.prototype.defaults.decimalSeparator,orderSeparator:k.prototype.defaults.orderSeparator,formatter:k,initialize:function(a){v.__super__.initialize.apply(this,arguments);var b=this.formatter;b.decimals=this.decimals,b.decimalSeparator=this.decimalSeparator,b.orderSeparator=this.orderSeparator}})),w=(h.IntegerCell=v.extend({className:"integer-cell",decimals:0}),h.PercentCell=v.extend({className:"percent-cell",multiplier:l.prototype.defaults.multiplier,symbol:l.prototype.defaults.symbol,formatter:l,initialize:function(){w.__super__.initialize.apply(this,arguments);var a=this.formatter;a.multiplier=this.multiplier,a.symbol=this.symbol}})),x=h.DatetimeCell=s.extend({className:"datetime-cell",includeDate:m.prototype.defaults.includeDate,includeTime:m.prototype.defaults.includeTime,includeMilli:m.prototype.defaults.includeMilli,formatter:m,initialize:function(b){x.__super__.initialize.apply(this,arguments);var c=this.formatter;c.includeDate=this.includeDate,c.includeTime=this.includeTime,c.includeMilli=this.includeMilli;var d=this.includeDate?"YYYY-MM-DD":"";d+=this.includeDate&&this.includeTime?"T":"",d+=this.includeTime?"HH:mm:ss":"",d+=this.includeTime&&this.includeMilli?".SSS":"",this.editor=this.editor.extend({attributes:a.extend({},this.editor.prototype.attributes,this.editor.attributes,{placeholder:d})})}}),y=(h.DateCell=x.extend({className:"date-cell",includeTime:!1}),h.TimeCell=x.extend({className:"time-cell",includeDate:!1}),h.BooleanCellEditor=q.extend({tagName:"input",attributes:{tabIndex:-1,type:"checkbox"},events:{mousedown:function(){this.mouseDown=!0},blur:"enterOrExitEditMode",mouseup:function(){this.mouseDown=!1},change:"saveOrCancel",keydown:"saveOrCancel"},render:function(){var a=this.model,b=this.formatter.fromRaw(a.get(this.column.get("name")),a);return this.$el.prop("checked",b),this},enterOrExitEditMode:function(a){if(!this.mouseDown){var b=this.model;b.trigger("backgrid:edited",b,this.column,new i(a))}},saveOrCancel:function(a){var b=this.model,c=this.column,d=this.formatter,e=new i(a);if(e.passThru()&&"change"!=a.type)return!0;e.cancel()&&(a.stopPropagation(),b.trigger("backgrid:edited",b,c,e));var f=this.$el;if(e.save()||e.moveLeft()||e.moveRight()||e.moveUp()||e.moveDown()){a.preventDefault(),a.stopPropagation();var g=d.toRaw(f.prop("checked"),b);b.set(c.get("name"),g),b.trigger("backgrid:edited",b,c,e)}else if("change"==a.type){g=d.toRaw(f.prop("checked"),b);b.set(c.get("name"),g),f.focus()}}})),z=(h.BooleanCell=s.extend({className:"boolean-cell",editor:y,events:{click:"enterEditMode"},render:function(){this.$el.empty();var a=this.model,b=this.column,c=h.callByNeed(b.editable(),b,a);return this.$el.append(g("",{tabIndex:-1,type:"checkbox",checked:this.formatter.fromRaw(a.get(b.get("name")),a),disabled:!c})),this.delegateEvents(),this}}),h.SelectCellEditor=q.extend({tagName:"select",events:{change:"save",blur:"close",keydown:"close"},template:a.template('',null,{variable:null,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g}),setOptionValues:function(b){this.optionValues=b,this.optionValues=a.result(this,"optionValues")},setMultiple:function(a){this.multiple=a,this.$el.prop("multiple",a)},_renderOptions:function(b,c){for(var d="",e=0;e",{label:h})).append(this._renderOptions.call(this,e.values,d)),this.$el.append(i)}}return this.delegateEvents(),this},save:function(a){var b=this.model,c=this.column;b.set(c.get("name"),this.formatter.toRaw(this.$el.val(),b))},close:function(a){var b=this.model,c=this.column,d=new i(a);d.cancel()?(a.stopPropagation(),b.trigger("backgrid:edited",b,c,new i(a))):(d.save()||d.moveLeft()||d.moveRight()||d.moveUp()||d.moveDown()||"blur"==a.type)&&(a.preventDefault(),a.stopPropagation(),this.save(a),b.trigger("backgrid:edited",b,c,new i(a)))}})),A=h.SelectCell=s.extend({className:"select-cell",editor:z,multiple:!1,formatter:p,optionValues:void 0,delimiter:", ",initialize:function(a){A.__super__.initialize.apply(this,arguments),this.listenTo(this.model,"backgrid:edit",function(a,b,c,d){b.get("name")==this.column.get("name")&&(d.setOptionValues(this.optionValues),d.setMultiple(this.multiple))})},render:function(){this.$el.empty();var b=a.result(this,"optionValues"),c=this.model,d=this.formatter.fromRaw(c.get(this.column.get("name")),c),e=[];try{if(!a.isArray(b)||a.isEmpty(b))throw new TypeError;for(var f=0;f|Array.<{name: string, values: Array.}>}");throw a}return this.delegateEvents(),this}}),B=h.Column=b.Model.extend({defaults:{name:void 0,label:void 0,sortable:!0,editable:!0,renderable:!0,formatter:void 0,sortType:"cycle",sortValue:void 0,direction:null,cell:void 0,headerCell:void 0},initialize:function(){this.has("label")||this.set({label:this.get("name")},{silent:!0});var a=h.resolveNameToClass(this.get("headerCell"),"HeaderCell"),b=h.resolveNameToClass(this.get("cell"),"Cell");this.set({cell:b,headerCell:a},{silent:!0})},sortValue:function(){var b=this.get("sortValue");return a.isString(b)?this[b]:a.isFunction(b)?b:function(a,b){return a.get(b)}}});a.each(["sortable","renderable","editable"],function(b){B.prototype[b]=function(){var c=this.get(b);return a.isString(c)?this[c]:a.isFunction(c)?c:!!c}});var C=h.Columns=b.Collection.extend({model:B}),D=h.Row=b.View.extend({tagName:"tr",initialize:function(a){var c=this.columns=a.columns;c instanceof b.Collection||(c=this.columns=new C(c));for(var d=this.cells=[],e=0;e").text(b.get("label")).append(""):document.createTextNode(b.get("label")),this.$el.append(a),this.$el.addClass(b.get("name")),this.$el.addClass(b.get("direction")),this.delegateEvents(),this}}),G=(h.HeaderRow=h.Row.extend({initialize:function(){h.Row.prototype.initialize.apply(this,arguments)},makeCell:function(a,b){var c=a.get("headerCell")||b.headerCell||F;return new c({column:a,collection:this.collection})}}),h.Header=b.View.extend({tagName:"thead",initialize:function(a){this.columns=a.columns,this.columns instanceof b.Collection||(this.columns=new C(this.columns)),this.row=new h.HeaderRow({columns:this.columns,collection:this.collection})},render:function(){return this.$el.append(this.row.render().$el),this.delegateEvents(),this},remove:function(){return this.row.remove.apply(this.row,arguments),b.View.prototype.remove.apply(this,arguments)}})),H=h.Body=b.View.extend({tagName:"tbody",initialize:function(a){this.columns=a.columns,this.columns instanceof b.Collection||(this.columns=new C(this.columns)),this.row=a.row||this.row||D,this.rows=this.collection.map(function(a){return new this.row({columns:this.columns,model:a})},this),this.emptyText=a.emptyText,this._unshiftEmptyRowMayBe();var c=this.collection;this.listenTo(c,"add",this.insertRow),this.listenTo(c,"remove",this.removeRow),this.listenTo(c,"sort",this.refresh),this.listenTo(c,"reset",this.refresh),this.listenTo(c,"backgrid:sort",this.sort),this.listenTo(c,"backgrid:edited",this.moveToNextCell),this.listenTo(this.columns,"add remove",this.updateEmptyRow)},_unshiftEmptyRowMayBe:function(){if(0===this.rows.length&&null!=this.emptyText)return this.emptyRow=new E({emptyText:this.emptyText,columns:this.columns}),this.rows.unshift(this.emptyRow),!0},insertRow:function(a,c,d){if(this.rows[0]instanceof E&&this.rows.pop().remove(),c instanceof b.Collection||d){var e=new this.row({columns:this.columns,model:a}),f=c.indexOf(a);this.rows.splice(f,0,e);var g=this.$el,h=g.children(),i=e.render().$el;return f>=h.length?g.append(i):h.eq(f).before(i),this}this.collection.add(a,d=c)},removeRow:function(b,c,d){return d?((a.isUndefined(d.render)||d.render)&&this.rows[d.index].remove(),this.rows.splice(d.index,1),this._unshiftEmptyRowMayBe()&&this.render(),this):(this.collection.remove(b,d=c),void(this._unshiftEmptyRowMayBe()&&this.render()))},updateEmptyRow:function(){null!=this.emptyRow&&this.emptyRow.render()},refresh:function(){for(var a=0;a").text(this.caption)),this.header&&this.$el.append(this.header.render().$el),this.footer&&this.$el.append(this.footer.render().$el),this.$el.append(this.body.render().$el),this.delegateEvents(),this.trigger("backgrid:rendered",this),this},remove:function(){return this.header&&this.header.remove.apply(this.header,arguments),this.body.remove.apply(this.body,arguments),this.footer&&this.footer.remove.apply(this.footer,arguments),b.View.prototype.remove.apply(this,arguments)}}),h}); +var jsonContentType;function oaTinyMCE(options){var _this=this,_getFonts=function(){return"Default='Open Sans', Verdana, Arial, Helvetica, sans-serif;Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats"};return this.initInstanceCallback=function(ed){return oaTinyMCE.prototype.initInstanceCallback.apply(_this,arguments)},this.saveLink=function(data){return oaTinyMCE.prototype.saveLink.apply(_this,arguments)},this.editLink=function(data){return oaTinyMCE.prototype.editLink.apply(_this,arguments)},this.saveImage=function(data){return oaTinyMCE.prototype.saveImage.apply(_this,arguments)},this.editImage=function(data){return oaTinyMCE.prototype.editImage.apply(_this,arguments)},this.setupTinyMCE=function(ed){return oaTinyMCE.prototype.setupTinyMCE.apply(_this,arguments)},oaTinyMCE.prototype.setupTinyMCE=function(ed){ed.on("SaveImage",this.saveImage),ed.on("EditImage",this.editImage),ed.on("SaveLink",this.saveLink),ed.on("EditLink",this.editLink)},oaTinyMCE.prototype.editImage=function(data){data.src&&(data.src=rewriteStaticLinks(data.src,this.base_asset_url,"/static/"))},oaTinyMCE.prototype.saveImage=function(data){data.src&&(data.src=rewriteStaticLinks(data.src,"/static/",this.base_asset_url))},oaTinyMCE.prototype.editLink=function(data){data.href&&(data.href=rewriteStaticLinks(data.href,this.base_asset_url,"/static/"))},oaTinyMCE.prototype.saveLink=function(data){data.href&&(data.href=rewriteStaticLinks(data.href,"/static/",this.base_asset_url))},oaTinyMCE.prototype.initInstanceCallback=function(ed){return ed.setContent(rewriteStaticLinks(ed.getContent({no_events:1}),"/static/",this.base_asset_url)),ed.focus()},this.base_asset_url=options.base_asset_url,{height:"300",font_formats:_getFonts(),base_url:"/static/studio/js/vendor/tinymce/js/tinymce",suffix:".min",theme:"silver",skin:"oxide",schema:"html5",convert_urls:!1,directionality:$(".wrapper-view, .window-wrap").prop("dir"),formats:{code:{inline:"code"}},visual:!1,plugins:"textcolor, link, image, media",image_advtab:!0,toolbar:"formatselect | fontselect | bold italic underline forecolor | bullist numlist outdent indent blockquote | link unlink image media",block_formats:gettext("Paragraph")+"=p;"+gettext("Preformatted")+"=pre;"+gettext("Heading 3")+"=h3;"+gettext("Heading 4")+"=h4;"+gettext("Heading 5")+"=h5;"+gettext("Heading 6")+"=h6",menubar:!1,statusbar:!1,valid_children:"+body[style]",valid_elements:"*[*]",extended_valid_elements:"*[*]",invalid_elements:"",setup:this.setupTinyMCE,init_instance_callback:this.initInstanceCallback,browser_spellcheck:!0}}function OpenAssessmentEditor(runtime,element,data){var server=new OpenAssessment.Server(runtime,element);new OpenAssessment.StudioView(runtime,element,server,data)}"undefined"!=typeof OpenAssessment&&OpenAssessment||(OpenAssessment={}),void 0===window.gettext&&(window.gettext=function(text){return text}),void 0===window.ngetgext&&(window.ngettext=function(singularText,pluralText,n){return 1"),$(textarea).val(newElId)),newElId=Date.now()+"-textarea-"+100*Math.random(),$(textarea).attr("id",newElId).tinymce(oaTinyMCE({base_asset_url:$("#openassessment_prompt_template").data("baseAssetUrl")}))),$(el)},getFieldValues:function(){return{description:this.description()}},description:function(text){var tinyEl=$(".openassessment_prompt_description",this.element);if(!this.tinyMCEEnabled)return OpenAssessment.Fields.stringField(tinyEl,text);tinyEl=window.tinyMCE.get(tinyEl.attr("id"));if(!text)return tinyEl.getContent();tinyEl.setContent(text)},addEventListeners:function(){},addHandler:function(){this.notifier.notificationFired("promptAdd",{index:this.element.index()})},removeHandler:function(){this.notifier.notificationFired("promptRemove",{index:this.element.index()})},updateHandler:function(){},validate:function(){return!0},validationErrors:function(){return[]},clearValidationErrors:function(){}},OpenAssessment.RubricOption=function(element,notifier){this.element=element,this.notifier=notifier,this.pointsField=new OpenAssessment.IntField($(".openassessment_criterion_option_points",this.element),{min:0,max:999})},OpenAssessment.RubricOption.prototype={addEventListeners:function(){$(this.element).focusout($.proxy(this.updateHandler,this))},getFieldValues:function(){var fields={label:this.label(),points:this.points(),explanation:this.explanation()},nameString=OpenAssessment.Fields.stringField($(".openassessment_criterion_option_name",this.element));return""!==nameString&&(fields.name=nameString),fields},label:function(label){var sel=$(".openassessment_criterion_option_label",this.element);return OpenAssessment.Fields.stringField(sel,label)},points:function(points){return void 0!==points&&this.pointsField.set(points),this.pointsField.get()},explanation:function(explanation){var sel=$(".openassessment_criterion_option_explanation",this.element);return OpenAssessment.Fields.stringField(sel,explanation)},addHandler:function(){var name=$(this.element).closest(".openassessment_criterion"),criterionName=$(name).data("criterion"),criterionLabel=$(".openassessment_criterion_label",name).val(),fields=$(".openassessment_criterion_option",this.element.parent()),name=OpenAssessment.ItemUtilities.createUniqueName(fields,"data-option");$(this.element).attr("data-criterion",criterionName).attr("data-option",name),$(".openassessment_criterion_option_name",this.element).attr("value",name);fields=this.getFieldValues();this.notifier.notificationFired("optionAdd",{criterionName:criterionName,criterionLabel:criterionLabel,name:name,label:fields.label,points:fields.points})},removeHandler:function(){var criterionName=$(this.element).data("criterion"),optionName=$(this.element).data("option");this.notifier.notificationFired("optionRemove",{criterionName:criterionName,name:optionName})},updateHandler:function(){var optionPoints=this.getFieldValues(),criterionName=$(this.element).data("criterion"),optionName=$(this.element).data("option"),optionLabel=optionPoints.label,optionPoints=optionPoints.points;this.notifier.notificationFired("optionUpdated",{criterionName:criterionName,name:optionName,label:optionLabel,points:optionPoints})},validate:function(){return this.pointsField.validate()},validationErrors:function(){return 0=this.min&&isValid<=this.max;return(isValid=-1!==this.input.val().indexOf(".")?!1:isValid)||this.input.addClass("openassessment_highlighted_field"),isValid},clearValidationErrors:function(){this.input.removeClass("openassessment_highlighted_field")},validationErrors:function(){return this.input.hasClass("openassessment_highlighted_field")?["Int field is invalid"]:[]}},OpenAssessment.ToggleControl=function(checkboxSel,shownSel,hiddenSel,notifier){this.checkbox=checkboxSel,this.shownSection=shownSel,this.hiddenSection=hiddenSel,this.notifier=notifier},OpenAssessment.ToggleControl.prototype={install:function(){return this.checkbox.change(this,function(control){control=control.data;this.checked?(control.notifier.notificationFired("toggleOn",{}),control.show()):(control.notifier.notificationFired("toggleOff",{}),control.hide())}),this},show:function(){this.hiddenSection.addClass("is--hidden"),this.shownSection.removeClass("is--hidden")},hide:function(){this.shownSection.addClass("is--hidden"),this.hiddenSection.removeClass("is--hidden")}},OpenAssessment.DatetimeControl=function(element,datePicker,timePicker){this.element=element,this.datePicker=datePicker,this.timePicker=timePicker},OpenAssessment.DatetimeControl.prototype={install:function(){var dateString=$(this.datePicker,this.element).val();return $(this.datePicker,this.element).datepicker({showButtonPanel:!0}).datepicker("option","dateFormat","yy-mm-dd").datepicker("setDate",dateString),$(this.timePicker,this.element).timepicker({timeFormat:"H:i",step:60}),this},datetime:function(dateString,timeString){var datePickerSel=$(this.datePicker,this.element),timePickerSel=$(this.timePicker,this.element);return void 0!==dateString&&datePickerSel.val(dateString),void 0!==timeString&&timePickerSel.val(timeString),datePickerSel.val()+"T"+timePickerSel.val()},validate:function(){var dateString=$(this.datePicker,this.element).val(),isTimeValid=$(this.timePicker,this.element).val(),isDateValid=!1;try{isDateValid=$.datepicker.parseDate($.datepicker.ISO_8601,dateString)instanceof Date}catch(err){}isDateValid||$(this.datePicker,this.element).addClass("openassessment_highlighted_field");isTimeValid=null!==isTimeValid.match(/^\d{2}:\d{2}$/g);return isTimeValid||$(this.timePicker,this.element).addClass("openassessment_highlighted_field"),isDateValid&&isTimeValid},clearValidationErrors:function(){$(this.datePicker,this.element).removeClass("openassessment_highlighted_field"),$(this.timePicker,this.element).removeClass("openassessment_highlighted_field")},validationErrors:function(){var errors=[],dateHasError=$(this.datePicker,this.element).hasClass("openassessment_highlighted_field"),timeHasError=$(this.timePicker,this.element).hasClass("openassessment_highlighted_field");return dateHasError&&errors.push("Date is invalid"),timeHasError&&errors.push("Time is invalid"),errors}},OpenAssessment.SelectControl=function(selectSel,mapping,notifier){this.select=selectSel,this.mapping=mapping,this.notifier=notifier},OpenAssessment.SelectControl.prototype={install:function(){return this.select.change(this,function(control){control=control.data;control.notifier.notificationFired("selectionChanged",{selected:this.value}),control.change(this.value)}),this},change:function(selected){$.isFunction(this.mapping)?this.mapping(selected):$.each(this.mapping,function(option,sel){option===selected?sel.removeClass("is--hidden"):sel.addClass("is--hidden")})}},OpenAssessment.InputControl=function(inputSel,validator){this.input=$(inputSel),this.validator=validator,this.errors=[]},OpenAssessment.InputControl.prototype={get:function(){return this.input.val()},set:function(val){this.input.val(val)},validate:function(){return this.errors=this.validator(this.get()),this.errors.length&&(this.input.addClass("openassessment_highlighted_field"),this.input.parent().nextAll(".message-status").text(this.errors.join(";")),this.input.parent().nextAll(".message-status").addClass("is-shown")),0===this.errors.length},clearValidationErrors:function(){this.input.removeClass("openassessment_highlighted_field"),this.input.parent().nextAll(".message-status").removeClass("is-shown")},validationErrors:function(){return this.errors}},OpenAssessment.StudentTrainingListener=function(){this.element=$("#oa_student_training_editor"),this.alert=new OpenAssessment.ValidationAlert},OpenAssessment.StudentTrainingListener.prototype={promptAdd:function(){var view=this.element;$("#openassessment_training_example_part_template").children().first().clone().removeAttr("id").toggleClass("is--hidden",!1).appendTo(".openassessment_training_example_essay",view)},promptRemove:function(data){var view=this.element;$(".openassessment_training_example_essay li:nth-child("+(data.index+1)+")",view).remove()},optionUpdated:function(data){this._optionSel(data.criterionName).each(function(){var option=$('option[value="'+data.name+'"]',this).attr("data-points",data.points).attr("data-label",data.label);OpenAssessment.ItemUtilities.refreshOptionString(option)})},optionAdd:function(data){var criterionAdded=!1;0===this._optionSel(data.criterionName).length&&(this.criterionAdd(data),criterionAdded=!0),this._optionSel(data.criterionName).each(function(){var option=$("").attr("value",data.name).attr("data-points",data.points).attr("data-label",data.label);OpenAssessment.ItemUtilities.refreshOptionString(option),$(this).append(option)}),criterionAdded&&this.displayAlertMsg(gettext("Criterion Added"),gettext("You have added a criterion. You will need to select an option for the criterion in the Learner Training step. To do this, click the Settings tab."))},optionRemove:function(data){var handler=this,invalidated=!1;this._optionSel(data.criterionName).each(function(){var criterionOption=this;$(criterionOption).val()===data.name.toString()&&($(criterionOption).val("").addClass("openassessment_highlighted_field").click(function(){$(criterionOption).removeClass("openassessment_highlighted_field")}),invalidated=!0),$('option[value="'+data.name+'"]',criterionOption).remove(),1===$("option",criterionOption).length&&(handler.removeAllOptions(data),invalidated=!1)}),invalidated&&this.displayAlertMsg(gettext("Option Deleted"),gettext("You have deleted an option. That option has been removed from its criterion in the sample responses in the Learner Training step. You might have to select a new option for the criterion."))},_optionSel:function(criterionName){return $('.openassessment_training_example_criterion_option[data-criterion="'+criterionName+'"]',this.element)},removeAllOptions:function(data){var changed=!1;$(".openassessment_training_example_criterion",this.element).each(function(){$(this).data("criterion")===data.criterionName&&($(this).remove(),changed=!0)}),changed&&this.displayAlertMsg(gettext("Option Deleted"),gettext("You have deleted all the options for this criterion. The criterion has been removed from the sample responses in the Learner Training step."))},criterionRemove:function(sel){var changed=!1,sel='.openassessment_training_example_criterion[data-criterion="'+sel.criterionName+'"]';$(sel,this.element).each(function(){$(this).remove(),changed=!0}),changed&&this.displayAlertMsg(gettext("Criterion Deleted"),gettext("You have deleted a criterion. The criterion has been removed from the example responses in the Learner Training step."))},displayAlertMsg:function(title,msg){$("#include_student_training",this.element).is(":checked")&&1<$(".openassessment_training_example",this.element).length&&this.alert.setMessage(title,msg).show()},criterionUpdated:function(data){var sel='.openassessment_training_example_criterion[data-criterion="'+data.criterionName+'"]';$(sel,this.element).each(function(){$(".openassessment_training_example_criterion_name_wrapper",this).text(data.criterionLabel)})},criterionAdd:function(data){var criterion=this.element,criterion=$("#openassessment_training_example_criterion_template").children().first().clone().removeAttr("id").attr("data-criterion",data.criterionName).toggleClass("is--hidden",!1).appendTo(".openassessment_training_example_criteria_selections",criterion);criterion.find(".openassessment_training_example_criterion_option").attr("data-criterion",data.criterionName),criterion.find(".openassessment_training_example_criterion_name_wrapper").text(data.label)},examplesCriteriaLabels:function(){var examples=[];return $(".openassessment_training_example_criteria_selections",this.element).each(function(){var exampleDescription={};$(".openassessment_training_example_criterion",this).each(function(){var criterionName=$(this).data("criterion"),criterionLabel=$(".openassessment_training_example_criterion_name_wrapper",this).text().trim();exampleDescription[criterionName]=criterionLabel}),examples.push(exampleDescription)}),examples},examplesOptionsLabels:function(){var examples=[];return $(".openassessment_training_example_criteria_selections",this.element).each(function(){var exampleDescription={};$(".openassessment_training_example_criterion_option",this).each(function(){var criterionName=$(this).data("criterion");exampleDescription[criterionName]={},$("option",this).each(function(){var optionName=$(this).val(),optionLabel=$(this).text().trim();exampleDescription[criterionName][optionName]=optionLabel})}),examples.push(exampleDescription)}),examples}},OpenAssessment.AssessmentToggleListener=function(){this.alert=new OpenAssessment.ValidationAlert},OpenAssessment.AssessmentToggleListener.prototype={toggleOff:function(){this.alert.setMessage(gettext("Warning"),gettext("Changes to steps that are not selected as part of the assignment will not be saved.")).show()},toggleOn:function(){this.alert.hide()}},OpenAssessment.Notifier=function(listeners){this.listeners=listeners},OpenAssessment.Notifier.prototype={notificationFired:function(name,data){for(var i=0;i",{tabIndex:-1,href:a,title:this.title||b,target:this.target}).text(b)),this.delegateEvents(),this}}),v=(h.EmailCell=t.extend({className:"email-cell",formatter:o,render:function(){this.$el.empty();var b=this.model,b=this.formatter.fromRaw(b.get(this.column.get("name")),b);return this.$el.append(g("",{tabIndex:-1,href:"mailto:"+b,title:b}).text(b)),this.delegateEvents(),this}}),h.NumberCell=s.extend({className:"number-cell",decimals:k.prototype.defaults.decimals,decimalSeparator:k.prototype.defaults.decimalSeparator,orderSeparator:k.prototype.defaults.orderSeparator,formatter:k,initialize:function(a){v.__super__.initialize.apply(this,arguments);var b=this.formatter;b.decimals=this.decimals,b.decimalSeparator=this.decimalSeparator,b.orderSeparator=this.orderSeparator}})),w=(h.IntegerCell=v.extend({className:"integer-cell",decimals:0}),h.PercentCell=v.extend({className:"percent-cell",multiplier:l.prototype.defaults.multiplier,symbol:l.prototype.defaults.symbol,formatter:l,initialize:function(){w.__super__.initialize.apply(this,arguments);var a=this.formatter;a.multiplier=this.multiplier,a.symbol=this.symbol}})),x=h.DatetimeCell=s.extend({className:"datetime-cell",includeDate:y.prototype.defaults.includeDate,includeTime:y.prototype.defaults.includeTime,includeMilli:y.prototype.defaults.includeMilli,formatter:y,initialize:function(b){x.__super__.initialize.apply(this,arguments);var d=this.formatter;d.includeDate=this.includeDate,d.includeTime=this.includeTime,d.includeMilli=this.includeMilli;d=this.includeDate?"YYYY-MM-DD":"";d+=this.includeDate&&this.includeTime?"T":"",d+=this.includeTime?"HH:mm:ss":"",d+=this.includeTime&&this.includeMilli?".SSS":"",this.editor=this.editor.extend({attributes:a.extend({},this.editor.prototype.attributes,this.editor.attributes,{placeholder:d})})}}),y=(h.DateCell=x.extend({className:"date-cell",includeTime:!1}),h.TimeCell=x.extend({className:"time-cell",includeDate:!1}),h.BooleanCellEditor=G.extend({tagName:"input",attributes:{tabIndex:-1,type:"checkbox"},events:{mousedown:function(){this.mouseDown=!0},blur:"enterOrExitEditMode",mouseup:function(){this.mouseDown=!1},change:"saveOrCancel",keydown:"saveOrCancel"},render:function(){var b=this.model,b=this.formatter.fromRaw(b.get(this.column.get("name")),b);return this.$el.prop("checked",b),this},enterOrExitEditMode:function(a){var b;this.mouseDown||(b=this.model).trigger("backgrid:edited",b,this.column,new i(a))},saveOrCancel:function(a){var b=this.model,c=this.column,d=this.formatter,e=new i(a);if(e.passThru()&&"change"!=a.type)return!0;e.cancel()&&(a.stopPropagation(),b.trigger("backgrid:edited",b,c,e));var g,f=this.$el;e.save()||e.moveLeft()||e.moveRight()||e.moveUp()||e.moveDown()?(a.preventDefault(),a.stopPropagation(),g=d.toRaw(f.prop("checked"),b),b.set(c.get("name"),g),b.trigger("backgrid:edited",b,c,e)):"change"==a.type&&(g=d.toRaw(f.prop("checked"),b),b.set(c.get("name"),g),f.focus())}})),G=(h.BooleanCell=s.extend({className:"boolean-cell",editor:y,events:{click:"enterEditMode"},render:function(){this.$el.empty();var a=this.model,b=this.column,c=h.callByNeed(b.editable(),b,a);return this.$el.append(g("",{tabIndex:-1,type:"checkbox",checked:this.formatter.fromRaw(a.get(b.get("name")),a),disabled:!c})),this.delegateEvents(),this}}),h.SelectCellEditor=G.extend({tagName:"select",events:{change:"save",blur:"close",keydown:"close"},template:a.template('',null,{variable:null,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g}),setOptionValues:function(b){this.optionValues=b,this.optionValues=a.result(this,"optionValues")},setMultiple:function(a){this.multiple=a,this.$el.prop("multiple",a)},_renderOptions:function(b,c){for(var d="",e=0;e",{label:h})).append(this._renderOptions.call(this,e.values,d)),this.$el.append(i)}}return this.delegateEvents(),this},save:function(a){var b=this.model,c=this.column;b.set(c.get("name"),this.formatter.toRaw(this.$el.val(),b))},close:function(a){var b=this.model,c=this.column,d=new i(a);d.cancel()?(a.stopPropagation(),b.trigger("backgrid:edited",b,c,new i(a))):(d.save()||d.moveLeft()||d.moveRight()||d.moveUp()||d.moveDown()||"blur"==a.type)&&(a.preventDefault(),a.stopPropagation(),this.save(a),b.trigger("backgrid:edited",b,c,new i(a)))}})),A=h.SelectCell=s.extend({className:"select-cell",editor:G,multiple:!1,formatter:H,optionValues:void 0,delimiter:", ",initialize:function(a){A.__super__.initialize.apply(this,arguments),this.listenTo(this.model,"backgrid:edit",function(a,b,c,d){b.get("name")==this.column.get("name")&&(d.setOptionValues(this.optionValues),d.setMultiple(this.multiple))})},render:function(){this.$el.empty();var b=a.result(this,"optionValues"),c=this.model,d=this.formatter.fromRaw(c.get(this.column.get("name")),c),e=[];try{if(!a.isArray(b)||a.isEmpty(b))throw new TypeError;for(var f=0;f|Array.<{name: string, values: Array.}>}");throw a}return this.delegateEvents(),this}}),B=h.Column=b.Model.extend({defaults:{name:void 0,label:void 0,sortable:!0,editable:!0,renderable:!0,formatter:void 0,sortType:"cycle",sortValue:void 0,direction:null,cell:void 0,headerCell:void 0},initialize:function(){this.has("label")||this.set({label:this.get("name")},{silent:!0});var a=h.resolveNameToClass(this.get("headerCell"),"HeaderCell"),b=h.resolveNameToClass(this.get("cell"),"Cell");this.set({cell:b,headerCell:a},{silent:!0})},sortValue:function(){var b=this.get("sortValue");return a.isString(b)?this[b]:a.isFunction(b)?b:function(a,b){return a.get(b)}}});a.each(["sortable","renderable","editable"],function(b){B.prototype[b]=function(){var c=this.get(b);return a.isString(c)?this[c]:a.isFunction(c)?c:!!c}});var C=h.Columns=b.Collection.extend({model:B}),D=h.Row=b.View.extend({tagName:"tr",initialize:function(a){var c=this.columns=a.columns;c instanceof b.Collection||(c=this.columns=new C(c));for(var d=this.cells=[],e=0;e").text(b.get("label")).append(""):document.createTextNode(b.get("label"));return this.$el.append(a),this.$el.addClass(b.get("name")),this.$el.addClass(b.get("direction")),this.delegateEvents(),this}}),G=(h.HeaderRow=h.Row.extend({initialize:function(){h.Row.prototype.initialize.apply(this,arguments)},makeCell:function(a,c){c=a.get("headerCell")||c.headerCell||F;return new c({column:a,collection:this.collection})}}),h.Header=b.View.extend({tagName:"thead",initialize:function(a){this.columns=a.columns,this.columns instanceof b.Collection||(this.columns=new C(this.columns)),this.row=new h.HeaderRow({columns:this.columns,collection:this.collection})},render:function(){return this.$el.append(this.row.render().$el),this.delegateEvents(),this},remove:function(){return this.row.remove.apply(this.row,arguments),b.View.prototype.remove.apply(this,arguments)}})),H=h.Body=b.View.extend({tagName:"tbody",initialize:function(c){this.columns=c.columns,this.columns instanceof b.Collection||(this.columns=new C(this.columns)),this.row=c.row||this.row||D,this.rows=this.collection.map(function(a){return new this.row({columns:this.columns,model:a})},this),this.emptyText=c.emptyText,this._unshiftEmptyRowMayBe();c=this.collection;this.listenTo(c,"add",this.insertRow),this.listenTo(c,"remove",this.removeRow),this.listenTo(c,"sort",this.refresh),this.listenTo(c,"reset",this.refresh),this.listenTo(c,"backgrid:sort",this.sort),this.listenTo(c,"backgrid:edited",this.moveToNextCell),this.listenTo(this.columns,"add remove",this.updateEmptyRow)},_unshiftEmptyRowMayBe:function(){if(0===this.rows.length&&null!=this.emptyText)return this.emptyRow=new E({emptyText:this.emptyText,columns:this.columns}),this.rows.unshift(this.emptyRow),!0},insertRow:function(a,c,d){if(this.rows[0]instanceof E&&this.rows.pop().remove(),c instanceof b.Collection||d){var i=new this.row({columns:this.columns,model:a}),f=c.indexOf(a);this.rows.splice(f,0,i);var g=this.$el,h=g.children(),i=i.render().$el;return f>=h.length?g.append(i):h.eq(f).before(i),this}this.collection.add(a,d=c)},removeRow:function(b,c,d){return d?((a.isUndefined(d.render)||d.render)&&this.rows[d.index].remove(),this.rows.splice(d.index,1),this._unshiftEmptyRowMayBe()&&this.render(),this):(this.collection.remove(b,d=c),void(this._unshiftEmptyRowMayBe()&&this.render()))},updateEmptyRow:function(){null!=this.emptyRow&&this.emptyRow.render()},refresh:function(){for(var a=0;a").text(this.caption)),this.header&&this.$el.append(this.header.render().$el),this.footer&&this.$el.append(this.footer.render().$el),this.$el.append(this.body.render().$el),this.delegateEvents(),this.trigger("backgrid:rendered",this),this},remove:function(){return this.header&&this.header.remove.apply(this.header,arguments),this.body.remove.apply(this.body,arguments),this.footer&&this.footer.remove.apply(this.footer,arguments),b.View.prototype.remove.apply(this,arguments)}}),h}); From b69e49c906e6d53b2988072fa5064c41276b601a Mon Sep 17 00:00:00 2001 From: Sean Date: Sun, 25 Apr 2021 17:20:22 +0800 Subject: [PATCH 13/17] stop event propagation on editing form adjust parameters for uglify js --- Makefile | 4 ++-- openassessment/xblock/static/js/src/studio/oa_edit.js | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 368eef778b..0b07aa5de1 100644 --- a/Makefile +++ b/Makefile @@ -25,8 +25,8 @@ update-npm-requirements: cp ./node_modules/backgrid/lib/backgrid*.css $(STATIC_CSS)/lib/backgrid/ javascript: update-npm-requirements - node_modules/.bin/uglifyjs $(STATIC_JS)/src/oa_shared.js $(STATIC_JS)/src/*.js $(STATIC_JS)/src/lms/*.js $(STATIC_JS)/lib/backgrid/backgrid.min.js -c warnings=false > "$(STATIC_JS)/openassessment-lms.min.js" - node_modules/.bin/uglifyjs $(STATIC_JS)/src/oa_shared.js $(STATIC_JS)/src/*.js $(STATIC_JS)/src/studio/*.js $(STATIC_JS)/lib/backgrid/backgrid.min.js -c warnings=false > "$(STATIC_JS)/openassessment-studio.min.js" + node_modules/.bin/uglifyjs $(STATIC_JS)/src/oa_shared.js $(STATIC_JS)/src/*.js $(STATIC_JS)/src/lms/*.js $(STATIC_JS)/lib/backgrid/backgrid.min.js -c > "$(STATIC_JS)/openassessment-lms.min.js" + node_modules/.bin/uglifyjs $(STATIC_JS)/src/oa_shared.js $(STATIC_JS)/src/*.js $(STATIC_JS)/src/studio/*.js $(STATIC_JS)/lib/backgrid/backgrid.min.js -c > "$(STATIC_JS)/openassessment-studio.min.js" sass: python scripts/compile_sass.py diff --git a/openassessment/xblock/static/js/src/studio/oa_edit.js b/openassessment/xblock/static/js/src/studio/oa_edit.js index 3e2fedf666..edda34d3a0 100644 --- a/openassessment/xblock/static/js/src/studio/oa_edit.js +++ b/openassessment/xblock/static/js/src/studio/oa_edit.js @@ -72,8 +72,6 @@ OpenAssessment.StudioView = function(runtime, element, server, data) { $(".openassessment_save_button", this.element).click($.proxy(this.save, this)); $(".openassessment_cancel_button", this.element).click($.proxy(this.cancel, this)); - $(".openassessment_save_button", this.element).click(this.stopPropagation); - $(".openassessment_cancel_button", this.element).click(this.stopPropagation); }; OpenAssessment.StudioView.prototype = { @@ -136,7 +134,7 @@ OpenAssessment.StudioView.prototype = { If the problem has been released, make the user confirm the save. **/ save: function() { - + this.stopPropagation(); var view = this; this.saveTabState(); @@ -233,8 +231,7 @@ OpenAssessment.StudioView.prototype = { Cancel editing. **/ cancel: function(e) { - e.stopPropagation(); - e.preventDefault(); + this.stopPropagation(); // Notify the client-side runtime so it will close the editing modal this.saveTabState(); this.runtime.notify('cancel', {}); From 1c65b33703713924aa9d3ed74e719d618dbefc89 Mon Sep 17 00:00:00 2001 From: Sean Date: Mon, 26 Apr 2021 09:51:21 +0800 Subject: [PATCH 14/17] add switcher back for settings tab. --- .../edit/oa_edit_peer_assessment.html | 3 ++- .../edit/oa_edit_self_assessment.html | 3 ++- .../edit/oa_edit_staff_assessment.html | 3 ++- .../edit/oa_edit_student_training.html | 3 ++- .../xblock/static/js/openassessment-lms.min.js | 2 +- .../static/js/openassessment-studio.min.js | 2 +- .../static/js/src/studio/oa_edit_settings.js | 18 ++++++++++++++++-- 7 files changed, 26 insertions(+), 8 deletions(-) diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html index ea649f45fa..f02731981a 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_peer_assessment.html @@ -6,7 +6,8 @@
    - + +

    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html index 28e1cd29b3..cdc7452c7f 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_self_assessment.html @@ -6,7 +6,8 @@

    - + +

    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html b/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html index b6ac517b00..0ec5b9c5ac 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_staff_assessment.html @@ -5,7 +5,8 @@

    - + +

    diff --git a/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html b/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html index e873ed42ca..70170bd295 100644 --- a/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html +++ b/openassessment/templates/openassessmentblock/edit/oa_edit_student_training.html @@ -6,7 +6,8 @@

    - + +
    diff --git a/openassessment/xblock/static/js/openassessment-lms.min.js b/openassessment/xblock/static/js/openassessment-lms.min.js index 19d33d99c4..756aa324f2 100644 --- a/openassessment/xblock/static/js/openassessment-lms.min.js +++ b/openassessment/xblock/static/js/openassessment-lms.min.js @@ -1 +1 @@ -if("undefined"!=typeof OpenAssessment&&OpenAssessment||(OpenAssessment={}),void 0===window.gettext&&(window.gettext=function(text){return text}),void 0===window.ngetgext&&(window.ngettext=function(singularText,pluralText,n){return 1 header ."+this.SLIDABLE_CLASS,this.element).focus())},srClear:function(){$(this.READER_FEEDBACK_CLASS).html("")},srReadTexts:function(texts){var $readerFeedbackSelector=$(this.READER_FEEDBACK_CLASS),htmlFeedback="";this.srClear(),$.each(texts,function(ids,value){htmlFeedback=htmlFeedback+"

    "+value+"

    \n"}),$readerFeedbackSelector.html(htmlFeedback)},areSRStepsLoading:function(){return this.responseView.isRendering||this.peerView.isRendering||this.selfView.isRendering||this.gradeView.isRendering||this.trainingView.isRendering||this.staffView.isRendering},announceStatusChangeToSRandFocus:function(stepID,usageID,gradeStatus,currentView,focusID){var text=this.getStatus(stepID,currentView,gradeStatus);void 0!==usageID&&$(stepID,currentView.element).hasClass("is--showing")&&void 0!==focusID?($(focusID,currentView.element).focus(),this.srStatusUpdates.push(text)):currentView.announceStatus&&this.srStatusUpdates.push(text),!this.areSRStepsLoading()&&0")),previewContainer.parent().parent().parent().show(),MathJax.Hub.Queue(["Typeset",MathJax.Hub,previewContainer[0]])})},getUsageID:function(){return this.usageID||(this.usageID=$(this.element).data("usage-id")),this.usageID},load:function(){this.responseView.load(),this.loadAssessmentModules(),this.staffAreaView.load()},loadAssessmentModules:function(usageID){this.trainingView.load(usageID),this.peerView.load(usageID),this.staffView.load(usageID),this.selfView.load(usageID),this.gradeView.load(usageID),this.leaderboardView.load(usageID)},loadMessageView:function(){this.messageView.load()},toggleActionError:function(type,message){var element=this.element,container=null;if("save"===type?container=".response__submission__actions":"submit"===type||"peer"===type||"self"===type||"student-training"===type?container=".step__actions":"feedback_assess"===type?container=".submission__feedback__actions":"upload"===type&&(container=".upload__error"),null===container?null!==message&&console.log(message):($(container+" .message__content",element).html("

    "+(message?_.escape(message):"")+"

    "),$(container,element).toggleClass("has--error",null!==message),$(container+" > .message",element).focus()),null!==message){var contentTitle=$(container+" .message__title").text();this.srReadTexts([contentTitle,message])}},showLoadError:function(stepName,errorMessage){errorMessage||(errorMessage=gettext("Unable to load"));var $container=$(".step--"+stepName);$container.toggleClass("has--error",!0),$container.removeClass("is--showing"),$container.find(".ui-slidable").attr("aria-expanded","false"),$container.find(".step__status__value i").removeClass().addClass("icon fa fa-exclamation-triangle"),$container.find(".step__status__value .copy").html(_.escape(errorMessage))},unsavedWarningEnabled:function(enabled,key,message){if(void 0===enabled)return null!==window.onbeforeunload;var usageID=$(this.element).data("usage-id");enabled?(void 0!==OpenAssessment.unsavedChanges[usageID]&&OpenAssessment.unsavedChanges[usageID]||(OpenAssessment.unsavedChanges[usageID]={}),OpenAssessment.unsavedChanges[usageID][key]=message,window.onbeforeunload=function(){for(var xblockUsageID in OpenAssessment.unsavedChanges)if(OpenAssessment.unsavedChanges.hasOwnProperty(xblockUsageID))for(var key in OpenAssessment.unsavedChanges[xblockUsageID])if(OpenAssessment.unsavedChanges[xblockUsageID].hasOwnProperty(key))return OpenAssessment.unsavedChanges[xblockUsageID][key]}):void 0!==OpenAssessment.unsavedChanges[usageID]&&(delete OpenAssessment.unsavedChanges[usageID][key],$.isEmptyObject(OpenAssessment.unsavedChanges[usageID])&&delete OpenAssessment.unsavedChanges[usageID],$.isEmptyObject(OpenAssessment.unsavedChanges)&&(window.onbeforeunload=null))},buttonEnabled:function(className,enabled){var $element=$(className,this.element);return void 0===enabled?!$element.prop("disabled"):($element.prop("disabled",!enabled),enabled)}},function(OpenAssessment){"use strict";OpenAssessment.CourseItemsListingView=function(runtime,element){var self=this,$section=$(element),block=$section.find(".open-response-assessment-block"),itemViewEnabled=1===parseInt(block.data("item-view-enabled"))&&XBlock;this.$section=$section,this.runtime=runtime,this.oraData=$.parseJSON($("#open-response-assessment-items").text()),$section.find(".open-response-assessment-content").hide(),$section.find(".open-response-assessment-item").hide(),$section.find(".open-response-assessment-msg").show();var AssessmentCell=Backgrid.UriCell.extend({staff:!1,render:function(){this.$el.empty();var url=this.model.get(this.staff?"url_grade_available_responses":"url_base"),rawValue=this.model.get(this.column.get("name")),staffAssessment=this.model.get("staff_assessment"),formattedValue=this.formatter.fromRaw(rawValue,this.model),link=null;return itemViewEnabled&&(!this.staff||this.staff&&staffAssessment)?(link=$("
    ",{text:formattedValue,title:this.title||formattedValue}),this.$el.append(link),link.on("click",$.proxy(self,"displayOraBlock",url))):this.$el.append(formattedValue),this.delegateEvents(),this}}),StaffCell=AssessmentCell.extend({staff:!0});this._columns=[{name:"parent_name",label:gettext("Unit Name"),label_summary:gettext("Units"),cell:"string",num:!1,editable:!1},{name:"name",label:gettext("Assessment"),label_summary:gettext("Assessments"),cell:AssessmentCell,num:!1,editable:!1},{name:"total",label:gettext("Total Responses"),label_summary:gettext("Total Responses"),cell:"string",num:!0,editable:!1},{name:"training",label:gettext("Training"),label_summary:gettext("Training"),cell:"string",num:!0,editable:!1},{name:"peer",label:gettext("Peer"),label_summary:gettext("Peer"),cell:"string",num:!0,editable:!1},{name:"self",label:gettext("Self"),label_summary:gettext("Self"),cell:"string",num:!0,editable:!1},{name:"waiting",label:gettext("Waiting"),label_summary:gettext("Waiting"),cell:"string",num:!0,editable:!1},{name:"staff",label:gettext("Staff"),label_summary:gettext("Staff"),cell:StaffCell,num:!0,editable:!1},{name:"done",label:gettext("Final Grade Received"),label_summary:gettext("Final Grade Received"),cell:"string",num:!0,editable:!1}]},OpenAssessment.CourseItemsListingView.prototype.refreshGrids=function(force){force=force||!1;var self=this,$section=this.$section,block=$section.find(".open-response-assessment-block"),dataUrl=this.runtime.handlerUrl($section,"get_ora2_responses");if(!parseInt(block.data("rendered"))||force)return $.Deferred(function(defer){$.ajax({type:"GET",dataType:"json",url:dataUrl}).done(function(data){self.renderGrids(data),defer.resolve()}).fail(function(data,textStatus){$section.find(".open-response-assessment-msg").text(gettext("List of Open Assessments is unavailable")),defer.rejectWith(this,[textStatus])})}).promise()},OpenAssessment.CourseItemsListingView.prototype.renderGrids=function(data){var $section=this.$section,block=$section.find(".open-response-assessment-block"),oraSteps=["training","peer","self","waiting","staff","done"];$.each(this.oraData,function(i,oraItem){var total=0,itemId=oraItem.id;$.each(oraSteps,function(j,step){oraItem[step]=0}),itemId in data&&(_.extend(oraItem,data[itemId]),oraItem.staff_assessment&&(oraItem.staff=oraItem.waiting,oraItem.waiting=0)),$.each(oraSteps,function(j,step){total+=oraItem[step]}),oraItem.total=total}),block.data("rendered",1),$section.find(".open-response-assessment-msg").hide(),this.showSummaryGrid(this.oraData),this.showOpenResponsesGrid(this.oraData)},OpenAssessment.CourseItemsListingView.prototype.showSummaryGrid=function(data){var $section=this.$section,summaryData=[],summaryDataMap={};$section.find(".open-response-assessment-summary").empty(),$.each(this._columns,function(index,v){summaryData.push({title:v.label_summary,value:0,num:v.num,class:v.name}),summaryDataMap[v.name]=index}),$.each(data,function(index,obj){$.each(obj,function(key,value){var idx=0;key in summaryDataMap&&(idx=summaryDataMap[key],summaryData[idx].num?summaryData[idx].value+=value:summaryData[idx].value+=1)})});var templateData=_.template($("#open-response-assessment-summary-tpl").text());$section.find(".open-response-assessment-summary").append(templateData({oraSummary:summaryData}))},OpenAssessment.CourseItemsListingView.prototype.showOpenResponsesGrid=function(data){var $section=this.$section;$section.find(".open-response-assessment-content").show();var collection=new Backbone.Collection(data);$section.find(".open-response-assessment-main-table").empty();var grid=new Backgrid.Grid({columns:this._columns,collection:collection});$section.find(".open-response-assessment-main-table").append(grid.render().el)},OpenAssessment.CourseItemsListingView.prototype.displayOraBlock=function(url){var $section=this.$section,self=this;return $section.find(".open-response-assessment-content").hide(),$section.find(".open-response-assessment-msg").text(gettext("Please wait")).show(),$.Deferred(function(defer){$.ajax({type:"GET",dataType:"json",url:url}).done(function(data){var el=$section.find(".open-response-assessment-item"),block=el.find(".open-response-assessment-item-block");$section.find(".open-response-assessment-msg").hide(),el.show(),self.renderBreadcrumbs(),block.html(data.html),XBlock.initializeBlock($(block).find(".xblock")[0]),defer.resolve()}).fail(function(data,textStatus){$section.find(".open-response-assessment-item").show(),$section.find(".open-response-assessment-msg").text(gettext("Block view is unavailable")),self.renderBreadcrumbs(),defer.rejectWith(this,[textStatus])})}).promise()},OpenAssessment.CourseItemsListingView.prototype.renderBreadcrumbs=function(){var breadcrumbs=this.$section.find(".open-response-assessment-item-breadcrumbs"),text=gettext("Back to Full List"),fullListItem=$("",{html:"← "+text,title:text});breadcrumbs.append(fullListItem),fullListItem.on("click",$.proxy(this,"backToOpenResponsesGrid"))},OpenAssessment.CourseItemsListingView.prototype.backToOpenResponsesGrid=function(){var $section=this.$section;$section.find(".open-response-assessment-item-breadcrumbs").empty(),$section.find(".open-response-assessment-item-block").empty(),$section.find(".open-response-assessment-item").hide(),$section.find(".open-response-assessment-msg").text(gettext("Please wait")).show(),this.refreshGrids(!0)}}(OpenAssessment),OpenAssessment.DateTimeFactory=function(element){this.element=element},OpenAssessment.DateTimeFactory.prototype={apply:function(){var dtFactory=this;$(".ora-datetime",this.element).each(function(){dtFactory.elementApply($(this))})},determineContext:function(el){return{datetime:el.data("datetime"),timezone:el.data("timezone"),language:el.data("language"),format:""}},determineDateToken:function(el){var dateToken="date";return this.isValid(el.data("datetoken"))&&(dateToken=el.data("datetoken")),dateToken},elementApply:function(el){var dtFactory=this;(function(require){require(["jquery","edx-ui-toolkit/js/utils/date-utils","edx-ui-toolkit/js/utils/string-utils"],function($,DateUtils,StringUtils){var context,localTimeString,displayDatetime,interpolateDict={};dtFactory.isValid(el.data("datetime"))?(context=dtFactory.determineContext(el),dtFactory.isValid(el.data("format"))&&(context.format=DateUtils.dateFormatEnum[el.data("format")]),localTimeString=DateUtils.localize(context),interpolateDict[dtFactory.determineDateToken(el)]=localTimeString,displayDatetime=dtFactory.isValid(el.data("string"))?StringUtils.interpolate(el.data("string"),interpolateDict):localTimeString):displayDatetime=StringUtils.interpolate(el.data("string"),interpolateDict),el.text(displayDatetime)})}).call(this,require||RequireJS.require)},isValid:function(candidateVariable){return void 0!==candidateVariable&&""!==candidateVariable&&"Invalid date"!==candidateVariable&&"None"!==candidateVariable}},OpenAssessment.FileUploader=function(){this.upload=function(url,file){return $.Deferred(function(defer){$.ajax({url:url,type:"PUT",data:file,async:!1,processData:!1,contentType:file.type}).done(function(){Logger.log("openassessment.upload_file",{fileName:file.name,fileSize:file.size,fileType:file.type}),defer.resolve()}).fail(function(data,textStatus){defer.rejectWith(this,[textStatus])})}).promise()}},OpenAssessment.GradeView=function(element,server,baseView){this.element=element,this.server=server,this.baseView=baseView,this.announceStatus=!1,this.isRendering=!1,this.dateFactory=new OpenAssessment.DateTimeFactory(this.element)},OpenAssessment.GradeView.prototype={load:function(usageID){var view=this,baseView=this.baseView,stepID=".step--grade",focusID="[id='oa_grade_"+usageID+"']";view.isRendering=!0,this.server.render("grade").done(function(html){$(stepID,view.element).replaceWith(html),view.server.renderLatex($(stepID,view.element)),view.isRendering=!1,view.installHandlers(),view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,!0,view,focusID),view.dateFactory.apply()}).fail(function(errMsg){baseView.showLoadError("grade",errMsg)})},installHandlers:function(){var sel=$(".step--grade",this.element);this.baseView.setUpCollapseExpand(sel);var view=this;sel.find(".feedback__submit").click(function(eventObject){eventObject.preventDefault(),view.submitFeedbackOnAssessment()})},feedbackText:function(text){var usageID=this.baseView.getUsageID()||"";if(void 0===text)return $("[id='feedback__remarks__value__"+usageID+"']",this.element).val();$("[id='feedback__remarks__value__"+usageID+"']",this.element).val(text)},feedbackOptions:function(options){var view=this,usageID=this.baseView.getUsageID()||"";if(void 0===options)return $.map($(".feedback__overall__value:checked",view.element),function(element){return $(element).val()});$(".feedback__overall__value",this.element).prop("checked",!1),$.each(options,function(index,opt){$("[id='feedback__overall__value--"+opt+"__"+usageID+"']",view.element).prop("checked",!0)})},setHidden:function(selector,hidden){selector.toggleClass("is--hidden",hidden),selector.attr("aria-hidden",hidden?"true":"false")},isHidden:function(selector){return selector.hasClass("is--hidden")&&"true"===selector.attr("aria-hidden")},feedbackState:function(newState){var containerSel=$(".submission__feedback__content",this.element),instructionsSel=containerSel.find(".submission__feedback__instructions"),fieldsSel=containerSel.find(".submission__feedback__fields"),actionsSel=containerSel.find(".submission__feedback__actions"),transitionSel=containerSel.find(".transition__status"),messageSel=containerSel.find(".message--complete");if(void 0===newState){var isSubmitting=containerSel.hasClass("is--transitioning")&&containerSel.hasClass("is--submitting")&&!this.isHidden(transitionSel)&&this.isHidden(messageSel)&&this.isHidden(instructionsSel)&&this.isHidden(fieldsSel)&&this.isHidden(actionsSel),hasSubmitted=containerSel.hasClass("is--submitted")&&this.isHidden(transitionSel)&&!this.isHidden(messageSel)&&this.isHidden(instructionsSel)&&this.isHidden(fieldsSel)&&this.isHidden(actionsSel);if(!containerSel.hasClass("is--submitted")&&!containerSel.hasClass("is--transitioning")&&!containerSel.hasClass("is--submitting")&&this.isHidden(transitionSel)&&this.isHidden(messageSel)&&!this.isHidden(instructionsSel)&&!this.isHidden(fieldsSel)&&!this.isHidden(actionsSel))return"open";if(isSubmitting)return"submitting";if(hasSubmitted)return"submitted";throw"Invalid feedback state"}"open"===newState?(containerSel.toggleClass("is--transitioning",!1),containerSel.toggleClass("is--submitting",!1),containerSel.toggleClass("is--submitted",!1),this.setHidden(instructionsSel,!1),this.setHidden(fieldsSel,!1),this.setHidden(actionsSel,!1),this.setHidden(transitionSel,!0),this.setHidden(messageSel,!0)):"submitting"===newState?(containerSel.toggleClass("is--transitioning",!0),containerSel.toggleClass("is--submitting",!0),containerSel.toggleClass("is--submitted",!1),this.setHidden(instructionsSel,!0),this.setHidden(fieldsSel,!0),this.setHidden(actionsSel,!0),this.setHidden(transitionSel,!1),this.setHidden(messageSel,!0)):"submitted"===newState&&(containerSel.toggleClass("is--transitioning",!1),containerSel.toggleClass("is--submitting",!1),containerSel.toggleClass("is--submitted",!0),this.setHidden(instructionsSel,!0),this.setHidden(fieldsSel,!0),this.setHidden(actionsSel,!0),this.setHidden(transitionSel,!0),this.setHidden(messageSel,!1))},submitFeedbackOnAssessment:function(){var view=this,baseView=this.baseView;$(".feedback__submit",this.element).prop("disabled",!0),view.feedbackState("submitting"),this.server.submitFeedbackOnAssessment(this.feedbackText(),this.feedbackOptions()).done(function(){view.feedbackState("submitted")}).fail(function(errMsg){baseView.toggleActionError("feedback_assess",errMsg)})}},OpenAssessment.LeaderboardView=function(element,server,baseView){this.element=element,this.server=server,this.baseView=baseView},OpenAssessment.LeaderboardView.prototype={load:function(usageID){var view=this,baseView=this.baseView,stepID=".step--leaderboard";this.server.render("leaderboard").done(function(html){$(stepID,view.element).replaceWith(html),view.server.renderLatex($(stepID,view.element)),view.installHandlers(),void 0!==usageID&&$(stepID,view.element).hasClass("is--showing")&&$("[id='oa_leaderboard_"+usageID+"']",view.element).focus()}).fail(function(errMsg){baseView.showLoadError("leaderboard",errMsg)})},installHandlers:function(){this.baseView.setUpCollapseExpand($(".step--leaderboard",this.element))}},OpenAssessment.MessageView=function(element,server,baseView){this.element=element,this.server=server,this.baseView=baseView},OpenAssessment.MessageView.prototype={load:function(){var view=this,baseView=this.baseView;this.server.render("message").done(function(html){$(".openassessment__message",view.element).replaceWith(html),view.server.renderLatex($(".openassessment__message",view.element))}).fail(function(errMsg){baseView.showLoadError("message",errMsg)})}},OpenAssessment.PeerView=function(element,server,baseView){this.element=element,this.server=server,this.baseView=baseView,this.rubric=null,this.isRendering=!1,this.announceStatus=!1,this.dateFactory=new OpenAssessment.DateTimeFactory(this.element)},OpenAssessment.PeerView.prototype={UNSAVED_WARNING_KEY:"peer-assessment",load:function(usageID){var view=this,stepID=".step--peer-assessment",focusID="[id='oa_peer_"+usageID+"']";view.isRendering=!0,this.server.render("peer_assessment").done(function(html){$(stepID,view.element).replaceWith(html),view.isRendering=!1,view.server.renderLatex($(stepID,view.element)),view.installHandlers(!1),view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,!1,view,focusID),view.announceStatus=!1,view.dateFactory.apply()}).fail(function(){view.baseView.showLoadError("peer-assessment")}),view.baseView.loadMessageView()},loadContinuedAssessment:function(usageID){var view=this,focusID="[id='oa_peer_"+usageID+"']";view.continueAssessmentEnabled(!1),view.isRendering=!0,this.server.renderContinuedPeer().done(function(html){$(".step--peer-assessment",view.element).replaceWith(html),view.server.renderLatex($(".step--peer-assessment",view.element)),view.isRendering=!1,view.installHandlers(!0),view.baseView.announceStatusChangeToSRandFocus(".step--peer-assessment",usageID,!1,view,focusID)}).fail(function(){view.baseView.showLoadError("peer-assessment"),view.continueAssessmentEnabled(!0)})},continueAssessmentEnabled:function(enabled){return this.baseView.buttonEnabled(".action--continue--grading",enabled)},installHandlers:function(isContinuedAssessment){var sel=$(".step--peer-assessment",this.element),view=this;this.baseView.setUpCollapseExpand(sel),this.baseView.bindLatexPreview(sel);var rubricSelector=$(".peer-assessment--001__assessment",this.element);if(0'+_.escape(label)+":\n"+msg)},response:function(texts){var sel=$(".response__submission .submission__answer__part__text__value",this.element);if(void 0===texts)return sel.map(function(){return $.trim($(this).val())}).get();sel.map(function(index){$(this).val(texts[index])})},responseChanged:function(){var savedResponse=this.savedResponse;return this.response().some(function(element,index){return element!==savedResponse[index]})},autoSave:function(){var timeSinceLastChange=Date.now()-this.lastChangeTime;this.responseChanged()&&timeSinceLastChange>this.AUTO_SAVE_WAIT&&!this.errorOnLastSave&&this.save()},handleResponseChanged:function(){if(this.checkSubmissionAbility(),this.responseChanged()){var saveAbility=this.checkSaveAbility();this.saveEnabled(saveAbility),this.previewEnabled(saveAbility),this.saveStatus(gettext("This response has not been saved.")),this.baseView.unsavedWarningEnabled(!0,this.UNSAVED_WARNING_KEY,gettext("If you leave this page without saving or submitting your response, you will lose any work you have done on the response."))}this.lastChangeTime=Date.now()},save:function(){this.errorOnLastSave=!1,this.saveStatus(gettext("Saving...")),this.baseView.toggleActionError("save",null),this.baseView.unsavedWarningEnabled(!1,this.UNSAVED_WARNING_KEY);var view=this,savedResponse=this.response();this.server.save(savedResponse).done(function(){if(view.savedResponse=savedResponse,view.checkSubmissionAbility(),view.response().every(function(element,index){return element===savedResponse[index]})){view.saveEnabled(!1);var msg=gettext("This response has been saved but not submitted.");view.saveStatus(msg),view.baseView.srReadTexts([msg])}}).fail(function(errMsg){view.saveStatus(gettext("Error")),view.baseView.toggleActionError("save",errMsg),view.errorOnLastSave=!0})},submit:function(){this.submitEnabled(!1);var view=this,baseView=this.baseView,fileDefer=$.Deferred();if(view.hasPendingUploadFiles()){if(!view.hasAllUploadFiles())return;var msg=gettext("Do you want to upload your file before submitting?");if(confirm(msg)&&!1===(fileDefer=view.uploadFiles()))return}else fileDefer.resolve();fileDefer.pipe(function(){return view.confirmSubmission().pipe(function(){var submission=view.response();return baseView.toggleActionError("response",null),view.server.submit(submission)})}).done($.proxy(view.moveToNextStep,view)).fail(function(errCode,errMsg){"ENOMULTI"===errCode?view.moveToNextStep():(errMsg&&baseView.toggleActionError("submit",errMsg),view.submitEnabled(!0))})},moveToNextStep:function(){var baseView=this.baseView,usageID=baseView.getUsageID();this.load(usageID),baseView.loadAssessmentModules(usageID),this.announceStatus=!0,baseView.unsavedWarningEnabled(!1,this.UNSAVED_WARNING_KEY)},confirmSubmission:function(){var msg=gettext("You're about to submit your response for this assignment. After you submit this response, you can't change it or submit a new response.");return $.Deferred(function(defer){confirm(msg)?defer.resolve():defer.reject()})},prepareUpload:function(files,uploadType,descriptions){this.files=null,this.filesType=uploadType;for(var totalSize=0,ext=null,fileType=null,errorCheckerTriggered=this.filesUploaded=!1,i=0;ithis.MAX_FILES_SIZE){this.baseView.toggleActionError("upload",gettext("File size must be 50MB or less.")),errorCheckerTriggered=!0;break}if("image"===uploadType&&-1===this.data.ALLOWED_IMAGE_MIME_TYPES.indexOf(fileType)){this.baseView.toggleActionError("upload",gettext("You can upload files with these file types: ")+"JPG, PNG or GIF"),errorCheckerTriggered=!0;break}if("pdf-and-image"===uploadType&&-1===this.data.ALLOWED_FILE_MIME_TYPES.indexOf(fileType)){this.baseView.toggleActionError("upload",gettext("You can upload files with these file types: ")+"JPG, PNG, GIF or PDF"),errorCheckerTriggered=!0;break}if("custom"===uploadType&&-1===this.data.FILE_TYPE_WHITE_LIST.indexOf(ext)){this.baseView.toggleActionError("upload",gettext("You can upload files with these file types: ")+this.data.FILE_TYPE_WHITE_LIST.join(", ")),errorCheckerTriggered=!0;break}if(-1!==this.data.FILE_EXT_BLACK_LIST.indexOf(ext)){this.baseView.toggleActionError("upload",gettext("File type is not allowed.")),errorCheckerTriggered=!0;break}}errorCheckerTriggered||(this.baseView.toggleActionError("upload",null),0"),(divLabel=$("
    ")).addClass("submission__file__description__label"),divLabel.text(gettext("Describe ")+files[i].name+" "+gettext("(required):")),divLabel.appendTo(mainDiv),(divTextarea=$("
    ")).addClass("submission__file__description"),textarea=$("