Index: openacs-4/packages/proctoring-support/proctoring-support.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/proctoring-support/proctoring-support.info,v
diff -u -r1.1.2.30 -r1.1.2.31
--- openacs-4/packages/proctoring-support/proctoring-support.info	21 Feb 2022 15:56:55 -0000	1.1.2.30
+++ openacs-4/packages/proctoring-support/proctoring-support.info	22 Feb 2022 14:30:06 -0000	1.1.2.31
@@ -10,7 +10,7 @@
     <inherit-templates-p>f</inherit-templates-p>
     <auto-mount>proctoring</auto-mount>
 
-    <version name="3.3.3" url="http://openacs.org/repository/download/apm/proctoring-support-3.3.3.apm">
+    <version name="3.3.4" url="http://openacs.org/repository/download/apm/proctoring-support-3.3.4.apm">
         <owner url="mailto:apisano@wu.ac.at">Antonio Pisano</owner>
         <summary>Set of tools to implement proctoring of user interaction</summary>
         <vendor url="https://www.wu.ac.at/">Wirtschaftsuniversität Wien</vendor>
@@ -21,7 +21,7 @@
 No real UI is provided by the package itself. Other packages must integrate the provided includes.</description>
         <maturity>0</maturity>
 
-        <provides url="proctoring-support" version="3.3.3"/>
+        <provides url="proctoring-support" version="3.3.4"/>
         <requires url="acs-templating" version="5.10.0"/>
         <requires url="xotcl-core" version="5.10.0"/>
 
Index: openacs-4/packages/proctoring-support/catalog/proctoring-support.de_DE.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/proctoring-support/catalog/proctoring-support.de_DE.ISO-8859-1.xml,v
diff -u -r1.1.2.18 -r1.1.2.19
--- openacs-4/packages/proctoring-support/catalog/proctoring-support.de_DE.ISO-8859-1.xml	21 Feb 2022 15:56:55 -0000	1.1.2.18
+++ openacs-4/packages/proctoring-support/catalog/proctoring-support.de_DE.ISO-8859-1.xml	22 Feb 2022 14:30:06 -0000	1.1.2.19
@@ -12,6 +12,7 @@
   <msg key="camera_permission_denied">Ihre Kamera kann nicht verwendet werden, da sie keine Berechtigung dazu hat. M�gliche Ursachen sind:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Die Kamera ist in Google Chrome allgemein blockiert&lt;/b&gt;: Gehen Sie in Google Chrome auf \&#34;Einstellungen\&#34; | \&#34;Datenschutz und Sicherheit\&#34; | \&#34;Website-Einstellungen\&#34; | \&#34;Berechtigungen\&#34; | \&#34;Kamera\&#34;. Wenn der Schieberegler auf \&#34;Blockiert\&#34; steht, dann setzen Sie ihn auf \&#34;Vor dem Zugriff nachfragen (empfohlen)\&#34;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Die Kamera ist in Google Chrome f�r %system_name% blockiert&lt;/b&gt;: Gehen Sie in Google Chrome auf \&#34;Einstellungen\&#34; | \&#34;Datenschutz und Sicherheit\&#34; | \&#34;Website-Einstellungen\&#34; | \&#34;Berechtigungen\&#34; | \&#34;Kamera\&#34;. Pr�fen Sie, ob unter \&#34;Blockieren\&#34; Links zu unseren Webseiten angef�hrt sind. L�schen Sie diese Webseiten aus der Liste �ber einen Klick auf das M�lltonnensymbol.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Die Kamera ist f�r Google Chrome blockiert (macOS)&lt;/b&gt;: Gehen Sie unter \&#34;Systemeinstellungen\&#34; auf \&#34;Sicherheit\&#34; | \&#34;Datenschutz\&#34; und dann in der Seitenleiste auf \&#34;Kamera\&#34;. Aktivieren Sie das Markierungsfeld neben Google Chrome. Starten Sie GoogleChrome neu.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Die Kamera ist in den Systemeinstellungen f�r Apps oder Desktop-Apps blockiert(Windows)&lt;/b&gt;: �ffnen Sie die Systemeinstellungen Ihres Computers und gehen Sie zu \&#34;Apps\&#34; und \&#34;Desktop-Apps\&#34;. Pr�fen Sie, ob Apps und Desktop-Apps auf Ihre Kamera zugreifen d�rfen. Wenn nicht, dann setzen Sie den Schieberegler jeweils auf \&#34;Ein\&#34;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Die Kamera ist in den Systemeinstellungen allgemein blockiert&lt;/b&gt;: (Windows) �ffnen Sie die Systemeinstellungen Ihres Computers und gehen Sie zu \&#34;Kamera\&#34;. Pr�fen Sie, ob der Kamerazugriff allgemein aktiviert ist. Wenn nicht, dann gehen Sie auf \&#34;�ndern\&#34;, um den Kamerazugriff allgemein zu aktivieren. (macOS) Pr�fen Sie, ob die Kamera aktiviert ist und funktioniert&lt;/b&gt;: &lt;a href=&#39;https://support.apple.com/de-at/HT211130&#39;&gt;Link zur Anleitung.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Die Kamera wurde aufgrund mangelnder Energieversorgung abgeschaltet (Windows)&lt;/b&gt;: Verbinden Sie Ihren Computer mit einer Stromquelle und aktivieren Sie die Kamera nunwieder. �ffnen Sie die Systemeinstellungen Ihres Computers und gehen Sie zu \&#34;Kamera\&#34;. Pr�fen Sie, ob der Kamerazugriff f�r dieses Ger�t noch aktiviert ist. Wenn nicht, dann gehen Sie auf \&#34;�ndern\&#34;, um den Kamerazugriff wieder zu aktivieren.&lt;/li&gt;&lt;/ul&gt;</msg>
   <msg key="check_again">Nochmals pr�fen</msg>
   <msg key="community_help_text">Wenn die automatisierte Online-Aufsicht aktiviert ist, erstellt das System Aufzeichnungen von den Teilnehmer/innen und deren Bildschirm.</msg>
+  <msg key="delete_users_artifacts_confirm_msg">Sind Sie sicher, dass Sie die Online-Aufsicht-Artefakte f�r ausgew�hlte Benutzer l�schen m�chten?</msg>
   <msg key="desktop_grabbing_not_supported">Sie arbeiten mit einem Browser der die automatische Online-Aufsicht nicht unterst�tzt. Bitte verwenden Sie die neueste Version von &lt;a href=&#39;https://www.google.de/chrome&#39;&gt;Google Chrome&lt;/a&gt;.</msg>
   <msg key="desktop_permission_denied">Ihr Bildschirm kann nicht aufgenommen werden, da Google Chrome keine Berechtigung dazu hat. M�gliche Ursachen sind: &lt;ul&gt; &lt;li&gt;&lt;b&gt;Die Bildschirmaufnahme ist durch ein Antivirenprogramm blockiert&lt;/b&gt;: Erlauben Sie Ihrem Antivirenprogramm bzw. der Antivirenschutzerweiterung in Google Chrome die Bildschirmaufnahme bzw. deaktivieren Sie alle Antivirusprogramme f�r die Dauer der Pr�fung.&lt;/li&gt; &lt;li&gt;&lt;b&gt;Die Bildschirmaufnahme ist in den Systemeinstellungen ist blockiert (macOS)&lt;/b&gt;: Gehen Sie unter \&#34;Systemeinstellungen\&#34; auf \&#34;Sicherheit\&#34; | \&#34;Datenschutz\&#34; und dann in der Seitenleiste auf \&#34;Bildschirmaufnahme\&#34;. Aktivieren Sie das Markierungsfeld neben Google Chrome. Starten Sie Google Chrome neu.&lt;/li&gt; &lt;/ul&gt;</msg>
   <msg key="display_surface_not_supported">Sie arbeiten mit einem Browser der die automatische Online-Aufsicht nicht unterst�tzt. Bitte verwenden Sie die neueste Version von &lt;a href=&#39;https://www.google.de/chrome&#39;&gt;Google Chrome&lt;/a&gt;.</msg>
@@ -112,6 +113,9 @@
   <msg key="microphone_volume_is_too_low">Die Tonaufnahme des Mikrofons ist unzureichend. M�gliche Ursachen sind:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Die Lautst�rke des Mikrofons ist zu leise eingestellt&lt;/b&gt;: Schalten Sie die Eingangslautst�rke lauter. (Windows) �ffnen Sie die Systemsteuerung Ihres Computers und gehen Sie zu\&#34;Sound\&#34; | \&#34;Eingabe\&#34; | \&#34;Ger�teeigenschaften\&#34;. Passen Sie hier die Lautst�rke an. (macOS)Klicken Sie auf \&#34;Systemeinstellungen\&#34; | \&#34;Ton\&#34; und �ffnen Sie den Reiter \&#34;Eingabe\&#34;. Passen Sie bei Ihrem Mikrofon die Eingangslautst�rke an.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Das Mikrofon ist stummgeschaltet&lt;/b&gt;: Heben Sie die Stummschaltung auf. Kontrollieren Sie die entsprechenden Tastaturbefehle und alle hardwareseitigen Einstellungen wie z.B. die Stummschaltung direkt in den Soundeinstellungen oder am Mikrofon/Headset selbst.&lt;/li&gt;&lt;/ul&gt;</msg>
   <msg key="missing_stream_message">Die Online-Aufsicht wurde beendet, ist f�r diese Pr�fung aber noch aktiviert. Bitte schlie�en Sie Google Chrome, um die Pr�fungsumgebung ganz zu verlassen, oder starten Sie die automatisierte Online-Aufsicht wieder mit einem Klick auf \&#34;OK\&#34;. Damit betreten Sie die Pr�fungsumgebung erneut.&lt;br&gt;&lt;br&gt;Wenn Sie �ber dieses Problem melden, inkludieren Sie bitte folgenden Text: </msg>
   <msg key="mobile_devices_are_unsupported">Mobile Ger�te werden nicht unterst�tzt.</msg>
+  <msg key="n_artifacts_label">Artefakte</msg>
+  <msg key="n_flagged_label">Markiert</msg>
+  <msg key="n_reviewed_label">�berpr�ft</msg>
   <msg key="not_reviewed_label">Nicht �berpr�ft</msg>
   <msg key="OnlineExam">Online-Pr�fung</msg>
   <msg key="Preview">Vorschau</msg>
@@ -123,6 +127,7 @@
   <msg key="recordings">Aufzeichnungen</msg>
   <msg key="reviewed_label">�berpr�ft</msg>
   <msg key="Start_date">Anfangsdatum</msg>
+  <msg key="student_id_label">Matrikelnummer</msg>
   <msg key="unflag_artifact_label">Als OK best�tigen</msg>
   <msg key="unflagged_label">Best�tigt OK</msg>
   <msg key="user_has_flagged_this_artifact_msg">Dieses Objekt wurde zur �berpr�fung vorgemerkt</msg>
Index: openacs-4/packages/proctoring-support/catalog/proctoring-support.en_US.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/proctoring-support/catalog/proctoring-support.en_US.ISO-8859-1.xml,v
diff -u -r1.1.2.22 -r1.1.2.23
--- openacs-4/packages/proctoring-support/catalog/proctoring-support.en_US.ISO-8859-1.xml	21 Feb 2022 15:56:55 -0000	1.1.2.22
+++ openacs-4/packages/proctoring-support/catalog/proctoring-support.en_US.ISO-8859-1.xml	22 Feb 2022 14:30:06 -0000	1.1.2.23
@@ -13,6 +13,7 @@
   <msg key="camera_permission_denied">Your camera cannot be recorded because it has no permission to do so. Possible causes are:&lt;ul&gt;&lt;li&gt;&lt;b&gt;The camera is blocked in Google Chrome&lt;/b&gt;: In Google Chrome go to \&#34;Settings\&#34; | \&#34;Privacy and security\&#34; | \&#34;Site Settings\&#34; | \&#34;Permissions\&#34; | \&#34;Camera\&#34;. If the slider is on \&#34;Blocked\&#34;, then set it to \&#34;Ask before accessing (recommended)\&#34;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The camera is blocked for %system_name% in Google Chrome&lt;/b&gt;: In Google Chrome go to \&#34;Settings\&#34; | \&#34;Privacy and security\&#34; | \&#34;Site Settings\&#34; | \&#34;Permissions\&#34; | \&#34;Camera\&#34;. Check whether there are links to our websites under \&#34;Block\&#34;. Delete these websites from the list by clicking on the garbage can symbol.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The camera is blocked for Google Chrome (macOS)&lt;/b&gt;: Go to \&#34;System Settings\&#34; | \&#34;Security\&#34; | \&#34;Privacy\&#34; and then in the sidebar on \&#34;Camera\&#34;. Activate the checkbox next to Google Chrome. Restart Google Chrome.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The camera is blocked in the system settings for apps or desktop apps (Windows)&lt;/b&gt;: Open the system settings of your computer and go to \&#34;Apps\&#34; and \&#34;Desktop apps\&#34;. Check if apps and desktop apps are allowed to access your camera. If not, set the slider to \&#34;On\&#34;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The camera is blocked in the system settings&lt;/b&gt;: (Windows) Open the system settings of your computer and go to \&#34;Camera\&#34;. Check whether camera access is generally activated. If not, go to \&#34;Change\&#34; to activate general camera access. (macOS) Check that the camera is activated and working&lt;/b&gt;: link to instructions.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The camera was switched off due to insufficient power supply (Windows)&lt;/b&gt;: Connect your computer to a power source. Open the system settings of your computer and go to \&#34;Camera\&#34;. Check that camera access is still enabled for this device. If not, go to \&#34;Change\&#34; to reactivate camera access.&lt;/li&gt;&lt;/ul&gt;</msg>
   <msg key="check_again">Check again</msg>
   <msg key="community_help_text">If automated exam-supervision is activated, the system will create recordings of the participants and their screen.</msg>
+  <msg key="delete_users_artifacts_confirm_msg">Are you sure you want to delete the proctoring artifacts for selected users?</msg>
   <msg key="desktop_cannot_be_recorded_because">Desktop cannot be recorded. Error is:</msg>
   <msg key="desktop_grabbing_not_supported">You are working with a browser that does not support the automated exam-supervision. Please use the latest version of Google &lt;a href=&#39;https://www.google.com/chrome/&#39;&gt;Chrome&lt;/a&gt;.</msg>
   <msg key="desktop_permission_denied">Your screen cannot be recorded because it has no permission to do so. Possible causes are: &lt;ul&gt; &lt;li&gt;&lt;b&gt;The screen recording is blocked by an antivirus program&lt;/b&gt;: Allow your antivirus program or the antivirus protection extension in Google Chrome to record the screen or deactivate all antivirus programs for the duration of the exam.&lt;/li&gt; &lt;li&gt;&lt;b&gt;The screen recording is blocked in the system settings (macOS)&lt;/b&gt;: Go to \&#34;System settings\&#34; | \&#34;Security\&#34; | \&#34;Privacy\&#34; and then click on \&#34;Screen recording\&#34; in the sidebar. Activate the checkbox next to Google Chrome. Restart Google Chrome.&lt;/li&gt; &lt;/ul&gt;</msg>
@@ -115,6 +116,9 @@
   <msg key="microphone_volume_is_too_low">The microphone&#39;s sound recording is insufficient. Possible causes are:&lt;ul&gt;&lt;li&gt;&lt;b&gt;The volume of the microphone is set too low&lt;/b&gt;: Turn up the input volume. (Windows) Open your computer&#39;s control panel and go to \&#34;Sound\&#34; | \&#34;Input\&#34; | \&#34;Device properties\&#34;. Adjust the volume here. (macOS) Click on \&#34;System Preferences\&#34; | \&#34;Sound\&#34; and open the \&#34;Input\&#34; tab.Adjust the input volume on your microphone.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The microphone is muted&lt;/b&gt;: Unmute it. Check the corresponding keyboard commands and all hardware settings such as the mute function directly in the sound settings or on the microphone / headset itself.&lt;/li&gt;&lt;/ul&gt;</msg>
   <msg key="missing_stream_message">Online Supervision has ended. However, it is still activated for this exam. Please close Google Chrome to completely exit the exam environment. Alternatively, you can restart the automated online supervision: By clicking \&#34;OK\&#34;, you are re-entering the exam environment.&lt;br&gt;&lt;br&gt;When reporting this issue, please mention the following message: </msg>
   <msg key="mobile_devices_are_unsupported">Mobile devices are unsupported.</msg>
+  <msg key="n_artifacts_label">Artifacts</msg>
+  <msg key="n_flagged_label">Flagged</msg>
+  <msg key="n_reviewed_label">Reviewed</msg>
   <msg key="not_reviewed_label">Not reviewed</msg>
   <msg key="OnlineExam">Online Exam</msg>
   <msg key="Preview">Preview</msg>
@@ -133,6 +137,7 @@
   <msg key="Safe_Exam_Browser_Key">Safe Exam Browser key</msg>
   <msg key="Safe_Exam_Browser_Key_help_text">Encryption key generated via the Safe Exam Browser configuration tool that will be used to ensure students are applying supplied configuration to their exam session.</msg>
   <msg key="Start_date">Start date</msg>
+  <msg key="student_id_label">Student ID</msg>
   <msg key="unflag_artifact_label">Confirm OK</msg>
   <msg key="unflagged_label">Confirmed OK</msg>
   <msg key="user_has_flagged_this_artifact_msg">This artifact has been flagged for revision</msg>
Index: openacs-4/packages/proctoring-support/catalog/proctoring-support.it_IT.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/proctoring-support/catalog/proctoring-support.it_IT.ISO-8859-1.xml,v
diff -u -r1.1.2.5 -r1.1.2.6
--- openacs-4/packages/proctoring-support/catalog/proctoring-support.it_IT.ISO-8859-1.xml	21 Feb 2022 15:56:55 -0000	1.1.2.5
+++ openacs-4/packages/proctoring-support/catalog/proctoring-support.it_IT.ISO-8859-1.xml	22 Feb 2022 14:30:06 -0000	1.1.2.6
@@ -13,6 +13,7 @@
   <msg key="camera_permission_denied">La tua videocamera non pu� essere registrata perch� non si ha il permesso di farlo. Le possibili cause sono:&lt;ul&gt;&lt;li&gt;&lt;b&gt;La videocamera � bloccata in Google Chrome&lt;/b&gt;: In Google Chrome vai su \&#34;Impostazioni\&#34; \&#34;Privacy e sicurezza\&#34; \&#34;Impostazioni sito\&#34; \&#34;Autorizzazioni\&#34; | \&#34;Camera\&#34;. Se il cursore � su \&#34;Bloccato\&#34;, impostalo su \&#34;Chiedi prima di accedere (consigliato)\&#34;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;La fotocamera � bloccata per yourdomain Network in Google Chrome&lt;/b&gt;: In Google Chrome vai su \&#34;Impostazioni\&#34; \&#34;Privacy e sicurezza\&#34; \&#34;Impostazioni del sito\&#34; \&#34;Autorizzazioni\&#34; | \&#34;Camera\&#34;. Controlla se ci sono collegamenti ai nostri siti web sotto \&#34;Blocco\&#34;. Cancella questi siti web dalla lista cliccando sul simbolo del bidone della spazzatura.&lt;/li&gt;&lt;li&gt;&lt;b&gt;La fotocamera � bloccata per Google Chrome (macOS)&lt;/b&gt;: Vai a \&#34;Impostazioni di sistema\&#34; | \&#34;Sicurezza\&#34; e poi nella barra laterale su \&#34;Fotocamera\&#34;. Attiva la casella di controllo accanto a Google Chrome. Riavvia Google Chrome.&lt;/li&gt;&lt;li&gt;&lt;b&gt;La fotocamera � bloccata nelle impostazioni di sistema per le app o le applicazioni desktop (Windows)&lt;/b&gt;: Apri le impostazioni di sistema del tuo computer e vai su \&#34;Apps\&#34; e \&#34;Desktop apps\&#34;. Controlla se le app e le applicazioni desktop sono autorizzate ad accedere alla tua fotocamera. In caso contrario, imposta il cursore su \&#34;On\&#34;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;La fotocamera � bloccata nelle impostazioni di sistema&lt;/b&gt;: (Windows) Apri le impostazioni di sistema del tuo computer e vai su \&#34;Fotocamera\&#34;. Controlla se l&#39;accesso alla videocamera � generalmente attivato. Se non lo �, vai su \&#34;Modifica\&#34; per attivare l&#39;accesso generale alla telecamera. (macOS) Controlla che la videocamera sia attivata e funzionante&lt;/b&gt;: link alle istruzioni.&lt;/li&gt;&lt;li&gt;&lt;b&gt;La videocamera si � spenta per insufficiente alimentazione (Windows)&lt;/b&gt;: Collega il tuo computer a una fonte di alimentazione. Apri le impostazioni di sistema del tuo computer e vai su \&#34;Camera\&#34;. Controlla che l&#39;accesso alla videocamera sia ancora abilitato per questo dispositivo. In caso contrario, vai su \&#34;Cambia\&#34; per riattivare l&#39;accesso alla videocamera.&lt;/li&gt;&lt;/ul&gt;</msg>
   <msg key="check_again">Controlla di nuovo</msg>
   <msg key="community_help_text">Se la supervisione automatica dell&#39;esame � attiva, il sistema creer� registrazioni dei partecipanti e del loro schermo.</msg>
+  <msg key="delete_users_artifacts_confirm_msg">Vuoi davvero eliminare gli artefatti prodotti dalla supervisione per gli utenti selezionati?</msg>
   <msg key="desktop_cannot_be_recorded_because">Il desktop non pu� essere registrato. L&#39;errore riportato �:</msg>
   <msg key="desktop_grabbing_not_supported">Stai lavorando con un browser che non supporta la supervisione automatica dell&#39;esame. Usa per favore la versione pi� recente di Google &lt;a href=&#39;https://www.google.com/chrome/&#39;&gt;Chrome&lt;/a&gt;</msg>
   <msg key="desktop_permission_denied">Il tuo schermo non pu� essere registrato perch� non si ha il permesso di farlo. Le possibili cause sono: &lt;ul&gt; &lt;li&gt;&lt;b&gt;La registrazione dello schermo � bloccata da un programma antivirus&lt;/b&gt;: Consenti al tuo programma antivirus o all&#39;estensione di protezione antivirus in Google Chrome di registrare lo schermo o disattiva tutti i programmi antivirus per la durata dell&#39;esame.&lt;/li&gt; &lt;li&gt;&lt;b&gt;La registrazione dello schermo � bloccata nelle impostazioni di sistema (macOS)&lt;/b&gt;: Vai a \&#34;Impostazioni di sistema\&#34; | \&#34;Sicurezza\&#34; e poi clicca su \&#34;Registrazione schermo\&#34; nella barra laterale. Attiva la casella di controllo accanto a Google Chrome. Riavvia Google Chrome.&lt;/li&gt; &lt;/ul&gt;</msg>
@@ -36,6 +37,9 @@
   <msg key="microphone_volume_is_too_low">Il suono del microfono � insufficiente. Le possibili cause sono:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Il volume del microfono � troppo basso&lt;/b&gt;: Alza il volume di ingresso. (Windows) Apri il pannello di controllo del tuo computer e vai su \&#34;Suono\&#34; | \&#34;Ingresso\&#34;. | \&#34;Propriet� dei dispositivi\&#34;. Regola qui il volume. (macOS) Clicca su \&#34;Preferenze di sistema\&#34; | (macOS) Clicca su \&#34;Preferenze di sistema\&#34;, \&#34;Suono\&#34; e apri la scheda \&#34;Ingresso\&#34;. Regola il volume del tuo microfono.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Il microfono � silenziato&lt;/b&gt;: Disattivarlo. Controlla i comandi da tastiera corrispondenti e tutte le impostazioni hardware come la funzione mute direttamente nelle impostazioni audio o sul microfono/cuffia stessa.&lt;/li&gt;&lt;/ul&gt;</msg>
   <msg key="missing_stream_message">La supervisione online � terminata. Tuttavia, � ancora attiva per questo esame. Si prega di chiudere Google Chrome per uscire completamente dall&#39;ambiente d&#39;esame. In alternativa, puoi riavviare la supervisione online automatica: Cliccando su \&#34;OK\&#34;, stai rientrando nell&#39;ambiente d&#39;esame.&lt;br&gt;&lt;br&gt;Nel segnalare questo problema, menziona il seguente messaggio:</msg>
   <msg key="mobile_devices_are_unsupported">I dispositivi movili non sono supportati.</msg>
+  <msg key="n_artifacts_label">Artefatti</msg>
+  <msg key="n_flagged_label">Segnati</msg>
+  <msg key="n_reviewed_label">Revisionati</msg>
   <msg key="not_reviewed_label">Non verificati</msg>
   <msg key="OnlineExam">Esame Online</msg>
   <msg key="Preview">Anteprima</msg>
@@ -54,6 +58,7 @@
   <msg key="Safe_Exam_Browser_Key">Chiave per Safe Exam Browser</msg>
   <msg key="Safe_Exam_Browser_Key_help_text">Chiave di cifratura generata tramite lo strumento di configurazione del Safe Exam Browser che sar� usata per verificare che gli studenti stiano davvero applicando la configurazione specificata alla loro sessione d&#39;esame.</msg>
   <msg key="Start_date">Data inizio</msg>
+  <msg key="student_id_label">ID Studente</msg>
   <msg key="unflag_artifact_label">Segna come OK</msg>
   <msg key="unflagged_label">Confermati OK</msg>
   <msg key="user_has_flagged_this_artifact_msg">Questo artefatto � stato segnalato per la revisione</msg>
Index: openacs-4/packages/proctoring-support/lib/proctoring-display.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/proctoring-support/lib/proctoring-display.adp,v
diff -u -r1.1.2.19 -r1.1.2.20
--- openacs-4/packages/proctoring-support/lib/proctoring-display.adp	21 Feb 2022 18:14:42 -0000	1.1.2.19
+++ openacs-4/packages/proctoring-support/lib/proctoring-display.adp	22 Feb 2022 14:30:06 -0000	1.1.2.20
@@ -246,18 +246,6 @@
     })
 
 </script>
-<if @swa_p;literal@ true and @folder_exists_p;literal@ true>
-  <p>
-    <a id="delete-button" href="@delete_url@" class="btn btn-danger">@delete_label@</a>
-  </p>
-  <script <if @::__csp_nonce@ not nil>nonce="@::__csp_nonce@"</if>>
-    document.querySelector("#delete-button").addEventListener("click", function(e) {
-        if (!confirm("@delete_confirm@")) {
-            e.preventDefault();
-        }
-    });
-  </script>
-</if>
 <if @user_id@ not nil>
     <if @file@ nil>
         <h2 style="border-bottom: 1px solid #eee;">@user_name@</h2>
@@ -593,14 +581,14 @@
                       data-artifact-id="">#acs-subsite.Comment#</button>
             </div>
             <div class="flex-12">
-              <button class="flag-all btn btn-danger"
-                      data-artifact-id="">
-                #proctoring-support.flag_artifact_label#
-              </button>
               <button class="unflag-all btn btn-success"
                       data-artifact-id="">
                 #proctoring-support.unflag_artifact_label#
               </button>
+              <button class="flag-all btn btn-danger"
+                      data-artifact-id="">
+                #proctoring-support.flag_artifact_label#
+              </button>
             </div>
           </div>
         </div>
@@ -693,53 +681,79 @@
     </if>
 </if>
 <else>
+  <style>
+    .review-status {
+        background-color:#f1f1f1;
+        border: 1px black solid;
+    }
+    .review-status div.inprogress {
+        background-color:orange;
+    }
+    .review-status div.flagged {
+        background-color:red;
+    }
+    .review-status div.ok {
+        background-color:green;
+    }
+  </style>
   <div class="form-group">
     <label for="filter">#acs-kernel.common_Search#:</label>
-    <input type="text" class="form-control" id="filter">
+    <input type="text" class="form-control" id="filter" value="">
   </div>
-  <if @swa_p;literal@ true>
-    <div class="btn-group">
-      <span class="btn btn-default">
-        <input type="checkbox" id="proctoring-bulk-all">
-      </span>
-      <span class="btn btn-default dropdown-toggle"
-            data-toggle="dropdown"
-            role="button"
-            aria-expanded="false">
-        #xotcl-core.Bulk_actions#<span class="caret"></span>
-      </span>
-      <ul class="dropdown-menu" role="menu">
-        <li><a id="proctoring-bulk-delete"
-               class="bin-empty">#acs-kernel.common_Delete#</a></li>
-      </ul>
-    </div>
-  </if>
-  <ul class="list-group">
-    <multiple name="users">
-      <li class="list-group-item" id="@users.user_id@" data-filter="@users.filter@">
-        <!-- <img src="@users.portrait_url@"> -->
-          <if @swa_p;literal@ true>
-            <input type="checkbox"
-                   class="proctoring-bulk"
-                   data-user-id="@users.user_id@">
-          </if>
-          <a style="display:inline-block;width:95%;"
-             href="@users.proctoring_url@">@users.last_name@ @users.first_names@</a>
-      </li>
-    </multiple>
-  </ul>
+
+  <listtemplate name="users"></listtemplate>
+
   <script <if @::__csp_nonce@ not nil>nonce="@::__csp_nonce@"</if>>
+    // When new artifacts are generated for this object, this websocket
+    // will trigger a page reload (capped to once every 60 seconds)
     var isLoading = false;
     initWS("@ws_url@", function(e) {
-        // A new user has pictures
-        if (!isLoading && document.querySelector("#" + e.data.user_id) == null) {
+        if (!isLoading) {
             isLoading = true;
             setTimeout(function() {
-                location.reload();
-            }, 10000);
+                if ( window.history.replaceState ) {
+                    window.history.replaceState(null, null, window.location.href);
+                }
+                window.location = window.location.href;
+            }, 60000);
         }
     });
 
+    // Enable the bulk-action delete button only when something has
+    // been selected.
+    var deleteButton = document.querySelector("#users-bulk_action-1");
+    if (deleteButton) {
+        deleteButton.setAttribute("disabled", "");
+        deleteButton.addEventListener("click", function(e) {
+            if (!confirm(`#proctoring-support.delete_users_artifacts_confirm_msg#`)) {
+                e.preventDefault();
+                e.stopImmediatePropagation();
+            }
+        });
+        var bulkCheckboxes = document.querySelectorAll(`
+            #users-bulkaction-control,
+            form[name=users] input[name=user_id]`);
+        function toggleBulkActionsOnSelection(e) {
+            var selected = false;
+            for (i of bulkCheckboxes) {
+                if (e.target.checked || i.checked) {
+                    selected = true;
+                    break;
+                }
+            }
+            if (selected) {
+                deleteButton.removeAttribute("disabled");
+            } else {
+                deleteButton.setAttribute("disabled", "");
+            }
+        }
+        for (i of bulkCheckboxes) {
+            i.checked = false;
+            i.addEventListener("change", toggleBulkActionsOnSelection);
+        }
+    }
+
+    // Filter the users list based on the search bar
     document.querySelector("#filter").addEventListener("keyup", function(e) {
         var visibleSelector, hiddenSelector;
         visibleSelector = "";
@@ -757,61 +771,20 @@
             hiddenSelector = "[data-filter]:not(" + visibleSelector.trim() + ")";
         }
 
-        var visible = document.querySelectorAll(visibleSelector);
-        console.log(visibleSelector);
-        for (var i = 0; i < visible.length; i++) {
-            visible[i].style.display = "";
+        for (visible of document.querySelectorAll(visibleSelector)) {
+            visible.parentElement.parentElement.style.display = "";
         }
 
         if (hiddenSelector.length > 0) {
-            var hidden = document.querySelectorAll(hiddenSelector);
-            for (var i = 0; i < hidden.length; i++) {
-                hidden[i].style.display = "none";
+            // Hidden checkboxes might still be selected. If we are
+            // hinding any element, we first reset them.
+            for (i of (bulkCheckboxes ? bulkCheckboxes : [])) {
+                i.checked = false;
             }
+            for (hidden of document.querySelectorAll(hiddenSelector)) {
+                hidden.parentElement.parentElement.style.display = "none";
+            }
         }
     });
-
-    var bulkSelectAllButton = document.querySelector('#proctoring-bulk-all');
-    if (bulkSelectAllButton) {
-        bulkSelectAllButton.addEventListener('click', function (e) {
-            for (checkbox of document.querySelectorAll('.proctoring-bulk')) {
-                checkbox.checked = this.checked;
-            }
-        });
-    }
-
-    var bulkDeleteButton = document.querySelector('#proctoring-bulk-delete');
-    if (bulkDeleteButton) {
-        bulkDeleteButton.addEventListener('click', function(e) {
-            e.preventDefault();
-            if (!confirm('#xowiki.delete_confirm#')) {
-                return;
-            }
-            var formData = new FormData();
-            formData.append('delete', true);
-            formData.append('object_id', @object_id;literal@);
-            for (checkbox of document.querySelectorAll('.proctoring-bulk')) {
-                console.log(checkbox.checked);
-                if (checkbox.checked) {
-                    var userId = checkbox.getAttribute('data-user-id');
-                    formData.append('user_id', userId);
-                }
-            }
-            if (!formData.has('user_id')) {
-                return;
-            }
-            var oReq = new XMLHttpRequest();
-            function reqListener () {
-                if (this.status == 200) {
-                    location.reload();
-                } else {
-                    console.error("Page returned status " + this.status);
-                }
-            }
-            oReq.addEventListener("load", reqListener);
-            oReq.open("POST", '@base_url@');
-            oReq.send(formData);
-        });
-    }
   </script>
 </else>
Index: openacs-4/packages/proctoring-support/lib/proctoring-display.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/proctoring-support/lib/proctoring-display.tcl,v
diff -u -r1.1.2.14 -r1.1.2.15
--- openacs-4/packages/proctoring-support/lib/proctoring-display.tcl	22 Feb 2022 09:01:24 -0000	1.1.2.14
+++ openacs-4/packages/proctoring-support/lib/proctoring-display.tcl	22 Feb 2022 14:30:06 -0000	1.1.2.15
@@ -86,9 +86,6 @@
     set folder [::proctoring::folder \
                     -object_id $object_id -user_id $user_id]
 
-    set delete_label [_ xowiki.delete]
-    set delete_confirm [_ xowiki.delete_confirm]
-
     if {$file ne ""} {
         #
         # Display a specific artifact file: this branch of the script
@@ -196,41 +193,113 @@
     set folder [::proctoring::folder \
                     -object_id $object_id]
 
-    set delete_label [_ xowiki.delete_all]
-    set delete_confirm [_ xowiki.delete_all_confirm]
-
-    if {$delete_p} {
-        #
-        # Delete all of the artifacts for this proctored object
-        #
-        ::proctoring::artifact::delete -object_id $object_id
-        ad_returnredirect $base_url
-        ad_script_abort
-    }
-
     #
     # Display the list of proctored users for this object for whom
     # artifacts exist
     #
+    set bulk_actions [list]
+    if {$swa_p} {
+        lappend bulk_actions \
+            "#acs-kernel.common_Delete#" [ad_conn url] "#acs-kernel.common_Delete#"
+    }
+
+    template::list::create \
+        -name users \
+        -multirow users \
+        -key user_id \
+        -actions [list] \
+        -bulk_actions $bulk_actions \
+        -bulk_action_method post \
+        -bulk_action_export_vars {
+            object_id {delete true}
+        } \
+        -elements {
+            filter {
+                label ""
+                display_template {
+                    <span data-filter="@users.filter@"></span>
+                }
+            }
+            name {
+                label "[_ acs-admin.Name]"
+                link_url_col proctoring_url
+            }
+            student_id {
+                label "[_ proctoring-support.student_id_label]"
+                link_url_col proctoring_url
+            }
+            status {
+                label "[_ acs-subsite.Status]"
+                display_template {
+                    <div class="review-status">
+                      <div
+                        <if @users.n_artifacts@ ne
+                            @users.n_reviewed@>
+                          class="inprogress"
+                          style="width:@users.completion@%;"
+                        </if>
+                        <elseif @users.n_flagged@ gt 0>
+                          class="flagged"
+                        </elseif>
+                        <else>
+                          class="ok"
+                        </else>
+                        >&nbsp;</div>
+                    </div>
+                }
+            }
+            n_artifacts {
+                label "[_ proctoring-support.n_artifacts_label]"
+            }
+            n_reviewed {
+                label "[_ proctoring-support.n_reviewed_label]"
+            }
+            n_flagged {
+                label "[_ proctoring-support.n_flagged_label]"
+            }
+        }
+
     db_multirow -extend {
         student_id
         proctoring_url
         portrait_url
         filter
+        completion
     } -unclobber users get_users {
-        select distinct a.user_id,
-                        p.first_names,
-                        p.last_name
+        with reviewed_picture_name as (
+          select name from proctoring_object_artifacts
+          where object_id = :object_id
+          order by metadata is not null desc
+          fetch first 1 rows only
+        )
+        select a.user_id,
+               p.last_name || ' ' || p.first_names as name,
+               count(*) as n_artifacts,
+               count(a.metadata->'revisions') as n_reviewed,
+               count(
+                   (select 1 from
+                    jsonb_path_query(a.metadata->'revisions',
+                                     '$[*] ? (@.flag == "true")')
+                    fetch first 1 rows only
+                    )
+                   ) as n_flagged
         from proctoring_object_artifacts a,
              persons p
         where object_id = :object_id
+          and (a.type = 'audio' or
+               a.name = (select name from reviewed_picture_name))
           and a.user_id = p.person_id
-        order by last_name asc, first_names asc
+        group by a.user_id, p.person_id
+        order by p.last_name asc, p.first_names asc
     } {
         set student_id [::party::email -party_id $user_id]
 
         set proctoring_url [export_vars -no_base_encode -base $base_url { user_id object_id }]
         set portrait_url /shared/portrait-bits.tcl?user_id=$user_id
-        set filter [string tolower "$last_name $first_names $student_id"]
+        set filter [string tolower "$name $student_id"]
+
+        if {$n_artifacts > 0} {
+            set completion [expr {round(100 * (($n_reviewed * 1.0) / ($n_artifacts * 1.0)))}]
+        }
     }
 }