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