GitHub Actions commited on
Commit
31e54a8
·
1 Parent(s): afeed38

Sync from GitHub repo

Browse files
Files changed (1) hide show
  1. templates/arena.html +65 -23
templates/arena.html CHANGED
@@ -28,6 +28,10 @@
28
  <button type="submit" class="mobile-synth-btn">Synthesize</button>
29
  </form>
30
 
 
 
 
 
31
  <div class="loading-container" style="display: none;">
32
  <div class="loader-wrapper">
33
  <div class="loader-animation">
@@ -71,10 +75,6 @@
71
  </button>
72
  </div>
73
  </div>
74
-
75
- <div class="keyboard-hint">
76
- Press <kbd>Space</kbd> to play/pause audio, <kbd>A</kbd> or <kbd>B</kbd> to vote after listening, <kbd>R</kbd> for random audio, <kbd>Enter</kbd> to generate
77
- </div>
78
  </div>
79
 
80
  <div class="vote-results" style="display: none;">
@@ -90,7 +90,11 @@
90
  </div>
91
 
92
  <div class="next-round-container" style="display: none;">
93
- <button class="next-round-btn">Next Round <span class="shortcut-key">N</span></button>
 
 
 
 
94
  </div>
95
  </div>
96
 
@@ -166,10 +170,6 @@
166
  </div>
167
  </div>
168
 
169
- <div class="keyboard-hint">
170
- Press <kbd>Space</kbd> to play/pause audio, <kbd>A</kbd> or <kbd>B</kbd> to vote after listening, <kbd>R</kbd> for random audio, <kbd>Enter</kbd> to generate
171
- </div>
172
-
173
  <div class="podcast-vote-results vote-results" style="display: none;">
174
  <h3 class="results-heading">Vote Recorded!</h3>
175
  <div class="results-content">
@@ -1008,6 +1008,10 @@
1008
  const modelNameDisplays = document.querySelectorAll('.model-name-display');
1009
  const wavePlayerContainers = document.querySelectorAll('.wave-player-container');
1010
 
 
 
 
 
1011
  let bothSamplesPlayed = false;
1012
  let currentSessionId = null;
1013
  let modelNames = { a: '', b: '' };
@@ -1025,8 +1029,10 @@
1025
  });
1026
 
1027
  // Load fallback sentences directly from Flask variable (JSON string)
1028
- // Note: This might cause linter errors, but JSON is JS-compatible.
1029
- const fallbackRandomTexts = JSON.parse({{ harvard_sentences | tojson | safe }});
 
 
1030
 
1031
  // Fetch cached sentences on load
1032
  function fetchCachedSentences() {
@@ -1109,11 +1115,13 @@
1109
 
1110
  textInput.blur();
1111
 
1112
- // Show loading animation
1113
  loadingContainer.style.display = 'flex';
1114
  playersContainer.style.display = 'none';
1115
  voteResultsContainer.style.display = 'none';
1116
  nextRoundContainer.style.display = 'none';
 
 
1117
 
1118
  // Reset vote buttons
1119
  voteButtons.forEach(btn => {
@@ -1153,9 +1161,11 @@
1153
  wavePlayers.a.loadAudio(data.audio_a);
1154
  wavePlayers.b.loadAudio(data.audio_b);
1155
 
1156
- // Show players
1157
  loadingContainer.style.display = 'none';
1158
  playersContainer.style.display = 'flex';
 
 
1159
 
1160
  // Setup automatic sequential playback
1161
  wavePlayers.a.wavesurfer.once('ready', function() {
@@ -1297,6 +1307,10 @@
1297
 
1298
  // Reset the flag for both samples played
1299
  bothSamplesPlayed = false;
 
 
 
 
1300
  }
1301
 
1302
  function handleRandom() {
@@ -1324,6 +1338,18 @@
1324
  openToast("Please listen to both audio samples before voting", "info");
1325
  }
1326
 
 
 
 
 
 
 
 
 
 
 
 
 
1327
  // Add submit event listener to form
1328
  synthForm.addEventListener('submit', handleSynthesize);
1329
 
@@ -1347,10 +1373,27 @@
1347
 
1348
  // Only process keyboard shortcuts if text input is not focused
1349
  if (document.activeElement === textInput) {
1350
- return;
 
 
 
 
 
 
 
 
1351
  }
1352
-
1353
- if (e.key.toLowerCase() === 'a') {
 
 
 
 
 
 
 
 
 
1354
  if (bothSamplesPlayed && !voteButtons[0].disabled) {
1355
  handleVote('a');
1356
  } else if (playersContainer.style.display !== 'none' && !bothSamplesPlayed) {
@@ -1363,15 +1406,14 @@
1363
  showListenToastMessage();
1364
  }
1365
  } else if (e.key.toLowerCase() === 'n') {
1366
- if (nextRoundContainer.style.display === 'block') {
1367
- if (!e.ctrlKey && !e.metaKey) {
1368
- e.preventDefault();
1369
- }
1370
- resetToInitialState();
1371
  }
1372
  } else if (e.key.toLowerCase() === 'r') {
1373
- // Only trigger random if not trying to reload (Ctrl+R or Cmd+R)
1374
- if (!e.ctrlKey && !e.metaKey) {
1375
  e.preventDefault();
1376
  handleRandom();
1377
  }
 
28
  <button type="submit" class="mobile-synth-btn">Synthesize</button>
29
  </form>
30
 
31
+ <div id="initial-keyboard-hint" class="keyboard-hint">
32
+ Press <kbd>R</kbd> for random text, <kbd>N</kbd> for next random round, <kbd>Enter</kbd> to generate
33
+ </div>
34
+
35
  <div class="loading-container" style="display: none;">
36
  <div class="loader-wrapper">
37
  <div class="loader-animation">
 
75
  </button>
76
  </div>
77
  </div>
 
 
 
 
78
  </div>
79
 
80
  <div class="vote-results" style="display: none;">
 
90
  </div>
91
 
92
  <div class="next-round-container" style="display: none;">
93
+ <button class="next-round-btn">Next Round</button>
94
+ </div>
95
+
96
+ <div id="playback-keyboard-hint" class="keyboard-hint" style="display: none;">
97
+ Press <kbd>Space</kbd> to play/pause, <kbd>A</kbd>/<kbd>B</kbd> to vote, <kbd>R</kbd> for random text, <kbd>N</kbd> for next random round
98
  </div>
99
  </div>
100
 
 
170
  </div>
171
  </div>
172
 
 
 
 
 
173
  <div class="podcast-vote-results vote-results" style="display: none;">
174
  <h3 class="results-heading">Vote Recorded!</h3>
175
  <div class="results-content">
 
1008
  const modelNameDisplays = document.querySelectorAll('.model-name-display');
1009
  const wavePlayerContainers = document.querySelectorAll('.wave-player-container');
1010
 
1011
+ // Get references to the keyboard hint elements
1012
+ const initialKeyboardHint = document.getElementById('initial-keyboard-hint');
1013
+ const playbackKeyboardHint = document.getElementById('playback-keyboard-hint');
1014
+
1015
  let bothSamplesPlayed = false;
1016
  let currentSessionId = null;
1017
  let modelNames = { a: '', b: '' };
 
1029
  });
1030
 
1031
  // Load fallback sentences directly from Flask variable (JSON string)
1032
+ // Assign to a variable first to help linters
1033
+ // eslint-disable-next-line
1034
+ const fallbackSentencesJson = {{ harvard_sentences | tojson | safe }};
1035
+ const fallbackRandomTexts = JSON.parse(fallbackSentencesJson);
1036
 
1037
  // Fetch cached sentences on load
1038
  function fetchCachedSentences() {
 
1115
 
1116
  textInput.blur();
1117
 
1118
+ // Show loading animation and hide hints
1119
  loadingContainer.style.display = 'flex';
1120
  playersContainer.style.display = 'none';
1121
  voteResultsContainer.style.display = 'none';
1122
  nextRoundContainer.style.display = 'none';
1123
+ initialKeyboardHint.style.display = 'none';
1124
+ playbackKeyboardHint.style.display = 'none';
1125
 
1126
  // Reset vote buttons
1127
  voteButtons.forEach(btn => {
 
1161
  wavePlayers.a.loadAudio(data.audio_a);
1162
  wavePlayers.b.loadAudio(data.audio_b);
1163
 
1164
+ // Show players and playback hint, hide initial hint
1165
  loadingContainer.style.display = 'none';
1166
  playersContainer.style.display = 'flex';
1167
+ initialKeyboardHint.style.display = 'none';
1168
+ playbackKeyboardHint.style.display = 'block';
1169
 
1170
  // Setup automatic sequential playback
1171
  wavePlayers.a.wavesurfer.once('ready', function() {
 
1307
 
1308
  // Reset the flag for both samples played
1309
  bothSamplesPlayed = false;
1310
+
1311
+ // Show initial hint, hide playback hint
1312
+ initialKeyboardHint.style.display = 'block';
1313
+ playbackKeyboardHint.style.display = 'none';
1314
  }
1315
 
1316
  function handleRandom() {
 
1338
  openToast("Please listen to both audio samples before voting", "info");
1339
  }
1340
 
1341
+ // New function for N shortcut: Random + Synthesize
1342
+ function handleNextRandomRound() {
1343
+ console.log("Handling Next Random Round (N shortcut)");
1344
+ handleRandom(); // Selects random text and puts it in input
1345
+
1346
+ // Use setTimeout to ensure the input value is updated before synthesizing
1347
+ // Especially important if handleRandom involves async operations (though it doesn't currently)
1348
+ setTimeout(() => {
1349
+ handleSynthesize(); // Triggers synthesis with the text now in the input
1350
+ }, 0);
1351
+ }
1352
+
1353
  // Add submit event listener to form
1354
  synthForm.addEventListener('submit', handleSynthesize);
1355
 
 
1373
 
1374
  // Only process keyboard shortcuts if text input is not focused
1375
  if (document.activeElement === textInput) {
1376
+ // Allow Enter key to submit form from text input
1377
+ if (e.key === 'Enter') {
1378
+ // Check if Shift, Ctrl, Alt, or Meta keys are pressed
1379
+ if (!e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {
1380
+ e.preventDefault(); // Prevent default form submission if needed
1381
+ handleSynthesize(); // Trigger synthesis
1382
+ }
1383
+ }
1384
+ return; // Don't process other keys if input is focused
1385
  }
1386
+
1387
+ // Allow Enter key to submit form when button is focused maybe?
1388
+ // Or just generally allow Enter if not focused on input
1389
+ if (e.key === 'Enter' && !e.ctrlKey && !e.metaKey && !e.altKey) {
1390
+ // Check if the initial form is visible (or loading is not happening)
1391
+ if (playersContainer.style.display === 'none' && loadingContainer.style.display === 'none') {
1392
+ e.preventDefault();
1393
+ handleSynthesize();
1394
+ }
1395
+ // Do nothing if players are visible (don't want Enter to re-submit)
1396
+ } else if (e.key.toLowerCase() === 'a') {
1397
  if (bothSamplesPlayed && !voteButtons[0].disabled) {
1398
  handleVote('a');
1399
  } else if (playersContainer.style.display !== 'none' && !bothSamplesPlayed) {
 
1406
  showListenToastMessage();
1407
  }
1408
  } else if (e.key.toLowerCase() === 'n') {
1409
+ // N for Next Random Round (works anytime except when input focused)
1410
+ if (!e.ctrlKey && !e.metaKey && !e.altKey) { // Ensure Alt isn't pressed either
1411
+ e.preventDefault();
1412
+ handleNextRandomRound(); // New function for random + synthesize
 
1413
  }
1414
  } else if (e.key.toLowerCase() === 'r') {
1415
+ // R for Random Text (works anytime except when input focused)
1416
+ if (!e.ctrlKey && !e.metaKey && !e.altKey) { // Ensure Alt isn't pressed either
1417
  e.preventDefault();
1418
  handleRandom();
1419
  }