Skip to content

Commit 9a96341

Browse files
committed
Add no-diff mode to diff viewer.
Sometimes, you want to easily read the submission instead of the diff with the previous submission. Unfortunately, Monaco cannot easily switch between a diff editor and a normal editor (see microsoft/monaco-editor#1881). We mimic the normal editor behaviour instead. Store the current diff mode instead of the side-by-side boolean in local storage. The latest release did not yet include the storage variable, so no migration is added.
1 parent 9138d68 commit 9a96341

File tree

3 files changed

+48
-25
lines changed

3 files changed

+48
-25
lines changed

webapp/public/js/domjudge.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,18 +124,18 @@ function applyEditorTheme(theme = undefined, isExternal = false)
124124
});
125125
}
126126

127-
function isDiffSideBySide()
127+
function getDiffMode()
128128
{
129-
let sideBySide = localStorage.getItem('domjudge_editor_side_by_side');
130-
if (sideBySide === undefined) {
131-
return true;
129+
let diffMode = localStorage.getItem('domjudge_editor_diff_mode');
130+
if (diffMode === undefined) {
131+
return 'side-by-side';
132132
}
133-
return sideBySide == 'true';
133+
return diffMode;
134134
}
135135

136-
function setDiffSideBySide(value)
136+
function setDiffMode(value)
137137
{
138-
localStorage.setItem('domjudge_editor_side_by_side', value);
138+
localStorage.setItem('domjudge_editor_diff_mode', value);
139139
}
140140

141141
// Send a notification if notifications have been enabled.

webapp/src/Twig/TwigExtension.php

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,11 @@ public function getGlobals(): array
172172
'hc-light' => ['name' => 'High contrast (light)'],
173173
'hc-black' => ['name' => 'High contrast (dark)'],
174174
],
175+
'diff_modes' => [
176+
'no-diff' => ["name" => "No diff"],
177+
'side-by-side' => ["name" => "Side-by-side"],
178+
'inline' => ["name" => "Inline"],
179+
],
175180
];
176181
}
177182

@@ -955,16 +960,10 @@ public function showDiff(string $id, SubmissionFile $newFile, SubmissionFile $ol
955960
monaco.Uri.parse("diff-new/%s")
956961
);
957962
958-
const sideBySide = isDiffSideBySide()
959-
const diffSelect = $("#diffselect-__EDITOR__");
960-
diffSelect.find("input[value='side-by-side']").prop('checked', sideBySide);
961-
diffSelect.find("input[value='inline']").prop('checked', !sideBySide);
962-
diffSelect.find("input[type='radio']").change(function(e) {
963-
const sbs = e.target.value === 'side-by-side';
964-
setDiffSideBySide(sbs);
965-
diffEditor.updateOptions({
966-
renderSideBySide: sbs,
967-
});
963+
const initialDiffMode = getDiffMode();
964+
const radios = $("#diffselect-__EDITOR__ > input[name='__EDITOR__-mode']");
965+
radios.each((_, radio) => {
966+
$(radio).prop('checked', radio.value === initialDiffMode);
968967
});
969968
970969
const diffEditor = monaco.editor.createDiffEditor(
@@ -976,13 +975,37 @@ public function showDiff(string $id, SubmissionFile $newFile, SubmissionFile $ol
976975
scrollBeyondLastLine: false,
977976
automaticLayout: true,
978977
readOnly: true,
979-
renderSideBySide: sideBySide,
980978
theme: getCurrentEditorTheme(),
981979
});
982-
diffEditor.setModel({
983-
original: originalModel,
984-
modified: modifiedModel,
980+
981+
const updateMode = (diffMode) => {
982+
setDiffMode(diffMode);
983+
const noDiff = diffMode === 'no-diff';
984+
diffEditor.updateOptions({
985+
renderOverviewRuler: !noDiff,
986+
renderSideBySide: diffMode === 'side-by-side',
987+
});
988+
989+
const oldViewState = diffEditor.saveViewState();
990+
diffEditor.setModel({
991+
original: noDiff ? modifiedModel : originalModel,
992+
modified: modifiedModel,
993+
});
994+
diffEditor.restoreViewState(oldViewState);
995+
996+
diffEditor.getOriginalEditor().updateOptions({
997+
lineNumbers: !noDiff,
998+
});
999+
diffEditor.getModifiedEditor().updateOptions({
1000+
minimap: {
1001+
enabled: noDiff,
1002+
},
1003+
})
1004+
};
1005+
radios.change((e) => {
1006+
updateMode(e.target.value);
9851007
});
1008+
updateMode(initialDiffMode);
9861009
});
9871010
});
9881011
</script>

webapp/templates/jury/partials/submission_diff.html.twig

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@
5757
{% endif %}
5858
<div id="diffselect-{{ diff_id }}" class="btn-group">
5959
<a href="#" role="button" class="btn btn-secondary btn-sm pe-none" aria-disabled="true"><i class="fas fa-code-branch"></i></a>
60-
<input type="radio" class="btn-check" name="{{ diff_id }}-mode" id="{{ diff_id }}-side-by-side" value="side-by-side" autocomplete="off">
61-
<label class="btn btn-outline-secondary btn-sm" for="{{ diff_id }}-side-by-side">side-by-side</label>
62-
<input type="radio" class="btn-check" name="{{ diff_id }}-mode" id="{{ diff_id }}-inline" value="inline" autocomplete="off">
63-
<label class="btn btn-outline-secondary btn-sm" for="{{ diff_id }}-inline">inline</label>
60+
{%- for mode_id, mode in diff_modes %}
61+
<input type="radio" class="btn-check" name="{{ diff_id }}-mode" id="{{ diff_id }}-{{ mode_id }}" value="{{ mode_id }}" autocomplete="off">
62+
<label class="btn btn-outline-secondary btn-sm" for="{{ diff_id }}-{{ mode_id }}">{{ mode.name }}</label>
63+
{%- endfor %}
6464
</div>
6565
</div>
6666
{{ showDiff(diff_id, filePair.0, filePair.1) }}

0 commit comments

Comments
 (0)