diff --git a/app/assets/javascripts/editor/editor.js.erb b/app/assets/javascripts/editor/editor.js.erb index d6ef4c14..9739861c 100644 --- a/app/assets/javascripts/editor/editor.js.erb +++ b/app/assets/javascripts/editor/editor.js.erb @@ -90,7 +90,9 @@ var CodeOceanEditor = { }, getCardClass: function (result) { - if (result.stderr && !result.score) { + if (result.file_role === 'teacher_defined_linter') { + return 'card bg-info text-white' + } else if (result.stderr && !result.score) { return 'card bg-danger text-white'; } else if (result.score < 1) { return 'card bg-warning text-white'; @@ -428,8 +430,13 @@ var CodeOceanEditor = { card.find('.card-title .number').text(index + 1); card.find('.row .col-sm-9').eq(0).find('.number').eq(0).text(result.passed); card.find('.row .col-sm-9').eq(0).find('.number').eq(1).text(result.count); - card.find('.row .col-sm-9').eq(1).find('.number').eq(0).text(parseFloat((result.score * result.weight).toFixed(2))); - card.find('.row .col-sm-9').eq(1).find('.number').eq(1).text(result.weight); + if (result.weight !== 0) { + card.find('.row .col-sm-9').eq(1).find('.number').eq(0).text(parseFloat((result.score * result.weight).toFixed(2))); + card.find('.row .col-sm-9').eq(1).find('.number').eq(1).text(result.weight); + } else { + // Hide score row if no score could be achieved + card.find('.attribute-row.row').eq(1).addClass('d-none'); + } card.find('.row .col-sm-9').eq(2).html(result.message); // Add error message from code to card diff --git a/app/assets/javascripts/editor/evaluation.js b/app/assets/javascripts/editor/evaluation.js index 7000a3b7..eb9accf4 100644 --- a/app/assets/javascripts/editor/evaluation.js +++ b/app/assets/javascripts/editor/evaluation.js @@ -48,7 +48,12 @@ CodeOceanEditorEvaluation = { printScoringResult: function (result, index) { $('#results').show(); - var card = $('#dummies').children().first().clone(); + let card; + if (result.file_role === 'teacher_defined_linter') { + card = $('#linter-dummies').children().first().clone(); + } else { + card = $('#test-dummies').children().first().clone(); + } if (card.isPresent()) { // the card won't be present if @embed_options[:hide_test_results] == true this.populateCard(card, result, index); @@ -58,7 +63,7 @@ CodeOceanEditorEvaluation = { printScoringResults: function (response) { $('#results ul').first().html(''); - $('.test-count .number').html(response.length); + $('.test-count .number').html(response.filter(function(x) { return x.file_role === 'teacher_defined_test'; }).length); this.clearOutput(); _.each(response, function (result, index) { diff --git a/app/views/exercises/_editor_output.html.slim b/app/views/exercises/_editor_output.html.slim index 75855cb2..d9c377f0 100644 --- a/app/views/exercises/_editor_output.html.slim +++ b/app/views/exercises/_editor_output.html.slim @@ -12,16 +12,25 @@ div.h-100 id='output_sidebar_uncollapsed' class='d-none col-sm-12 enforce-bottom p.test-count == t('exercises.implement.test_count', count: 0) - unless @embed_options[:hide_test_results] ul.list-unstyled - ul#dummies.d-none.list-unstyled + ul#test-dummies.d-none.list-unstyled li.card.mt-2 .card-header.py-2 - h5.card-title.m-0 == t('exercises.implement.file', filename: '', number: 0) + h5.card-title.m-0 == t('exercises.implement.test_file', filename: '', number: 0) .card-body.bg-white.text-dark = row(label: 'exercises.implement.passed_tests', value: t('shared.out_of', maximum_value: 0, value: 0).html_safe) = row(label: 'activerecord.attributes.submission.score', value: t('shared.out_of', maximum_value: 0, value: 0).html_safe) = row(label: 'exercises.implement.feedback') = row(label: 'exercises.implement.error_messages') /= row(label: 'exercises.implement.output', value: link_to(t('shared.show'), '#')) + ul#linter-dummies.d-none.list-unstyled + li.card.mt-2 + .card-header.py-2 + h5.card-title.m-0 == t('exercises.implement.linter_file', filename: '', number: 0) + .card-body.bg-white.text-dark + = row(label: 'exercises.implement.code_rating', value: t('shared.out_of', maximum_value: 0, value: 0).html_safe) + = row(label: 'activerecord.attributes.submission.score', value: t('shared.out_of', maximum_value: 0, value: 0).html_safe) + = row(label: 'exercises.implement.feedback') + = row(label: 'exercises.implement.messages') #score data-maximum-score=@exercise.maximum_score data-score=@exercise.final_submission(@current_user).try(:score) h4 span == "#{t('activerecord.attributes.submission.score')}: " diff --git a/app/views/exercises/_file_form.html.slim b/app/views/exercises/_file_form.html.slim index e5c0a5cd..5d400dce 100644 --- a/app/views/exercises/_file_form.html.slim +++ b/app/views/exercises/_file_form.html.slim @@ -44,5 +44,5 @@ li.card.mt-2 .help-block.form-text = t('.hints.feedback_message') .form-group = f.label(:role, t('activerecord.attributes.file.weight')) - = f.number_field(:weight, class: 'form-control', min: 1, step: 'any') + = f.number_field(:weight, class: 'form-control', min: 0, step: 'any') = render('code_field', attribute: :content, form: f, label: t('activerecord.attributes.file.content')) diff --git a/config/locales/de.yml b/config/locales/de.yml index d9acfc1e..0aa5c30f 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -368,14 +368,17 @@ de: title: Ihr Browser wird nicht unterstützt! default_feedback: Sehr gut. Alle Tests waren erfolgreich. error_messages: Fehlermeldungen + messages: Meldungen feedback: Feedback - file: 'Test-Datei %{number} (%{filename})' + test_file: 'Test-Datei %{number} (%{filename})' + linter_file: 'Linter-Feedback (ohne Punkte)%{number}%{filename}' hint: Tipp no_files: Die Aufgabe umfasst noch keine sichtbaren Dateien. no_output: Die letzte Code-Ausführung terminierte am %{timestamp} ohne Ausgabe. no_output_yet: Bisher existiert noch keine Ausgabe. output: Programm-Ausgabe passed_tests: Erfolgreiche Tests + code_rating: Code-Stil progress: Fortschritt results: Ergebnisse start: Mit dem Programmieren beginnen diff --git a/config/locales/en.yml b/config/locales/en.yml index 46b8ce00..004d104d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -368,14 +368,17 @@ en: title: Your browser is not supported! default_feedback: Well done. All tests have been passed. error_messages: Error Messages + messages: Messages feedback: Feedback - file: 'Test File %{number} (%{filename})' + test_file: 'Test File %{number} (%{filename})' + linter_file: 'Linter Feedback (not graded)%{number}%{filename}' hint: Hint no_files: The exercise does not comprise visible files yet. no_output: The last code run finished on %{timestamp} without any output. no_output_yet: There is no output yet. output: Program Output passed_tests: Passed Tests + code_rating: Code Rating progress: Progress results: Results start: Start Coding