diff --git a/app/assets/javascripts/editor/editor.js.erb b/app/assets/javascripts/editor/editor.js.erb index bf48ae0e..91fae9ef 100644 --- a/app/assets/javascripts/editor/editor.js.erb +++ b/app/assets/javascripts/editor/editor.js.erb @@ -471,66 +471,67 @@ var CodeOceanEditor = { } }) + // delete all current elements + targetNode.text(''); + // create a new list and append each element + const ul = document.createElement("ul"); + + // Extract detailed linter results + if (result.file_role === 'teacher_defined_linter') { + const detailed_linter_results = result.detailed_linter_results; + const severity_groups = detailed_linter_results.reduce(function(map, obj) { + map[obj.severity] = map[obj.severity] || [] + map[obj.severity].push(obj); + return map; + }, {}); + + for (let severity in severity_groups) { + if (!severity_groups.hasOwnProperty(severity)) { + continue; + } + const linter_results = severity_groups[severity] + + const li = document.createElement("li"); + const text = $.parseHTML(`${severity}:`); + $(li).append(text); + ul.append(li); + + const sub_ul = document.createElement("ul"); + sub_ul.setAttribute('class', 'error_messages_list'); + for (let check_run of linter_results) { + const sub_li = document.createElement("li"); + + let scope = ''; + if (check_run.scope) { + scope = `, ${check_run.scope}()`; + } + const context = `${check_run.file_name}: ${check_run.line}${scope}`; + const line_link = `${context}`; + const message = `${check_run.name}: ${check_run.result} (${line_link})`; + const sub_text = $.parseHTML(message); + $(sub_li).append(sub_text).on("click", "a", this.jumpToSourceLine.bind(this)); + sub_ul.append(sub_li); + } + li.append(sub_ul); + } + + // Just show standard results for normal test results + } else { + errorMessagesToShow.forEach(function (item) { + var li = document.createElement("li"); + var text = $.parseHTML(item); + $(li).append(text); + ul.append(li); + }) + } + // one or more errors? if (errorMessagesToShow.length > 1) { - // delete all current elements - targetNode.text(''); - // create a new list and append each element - const ul = document.createElement("ul"); ul.setAttribute('class', 'error_messages_list'); - - // Extract detailed linter results - if (result.file_role === 'teacher_defined_linter') { - const detailed_linter_results = result.detailed_linter_results; - const severity_groups = detailed_linter_results.reduce(function(map, obj) { - map[obj.severity] = map[obj.severity] || [] - map[obj.severity].push(obj); - return map; - }, {}); - - for (let severity in severity_groups) { - if (!severity_groups.hasOwnProperty(severity)) { - continue; - } - const linter_results = severity_groups[severity] - - const li = document.createElement("li"); - const text = $.parseHTML(`${severity}:`); - $(li).append(text); - ul.append(li); - - const sub_ul = document.createElement("ul"); - sub_ul.setAttribute('class', 'error_messages_list'); - for (let check_run of linter_results) { - const sub_li = document.createElement("li"); - - let scope = ''; - if (check_run.scope) { - scope = `, ${check_run.scope}()`; - } - const context = `${check_run.file_name}: ${check_run.line}${scope}`; - const line_link = `${context}`; - const message = `${check_run.name}: ${check_run.result} (${line_link})`; - const sub_text = $.parseHTML(message); - $(sub_li).append(sub_text).on("click", "a", this.jumpToSourceLine.bind(this)); - sub_ul.append(sub_li); - } - li.append(sub_ul); - } - - // Just show standard results for normal test results - } else { - errorMessagesToShow.forEach(function (item) { - var li = document.createElement("li"); - var text = $.parseHTML(item); - $(li).append(text); - ul.append(li); - }) - } - targetNode.append(ul); } else { - targetNode.html(errorMessagesToShow.join('')); + ul.setAttribute('class', 'single_error_message'); } + targetNode.append(ul); } //card.find('.row .col-sm-9').eq(4).find('a').attr('href', '#output-' + index); }, diff --git a/app/assets/stylesheets/editor.css.scss b/app/assets/stylesheets/editor.css.scss index 752b6b78..fcfa2d92 100644 --- a/app/assets/stylesheets/editor.css.scss +++ b/app/assets/stylesheets/editor.css.scss @@ -157,6 +157,11 @@ button i.fa-spin { padding-inline-start: 1.25rem; } +.single_error_message { + list-style-type: none; + padding-inline-start: 0; +} + .enforce-top-margin { margin-top: 5px !important; }