diff --git a/REUSE.toml b/REUSE.toml index 8fbc7526a..cebe1b417 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -2521,12 +2521,7 @@ SPDX-FileCopyrightText = [ "2023 Jonas Huber © Reiner Lemoine Institut", "2023 Daryna Barabanova © Reiner Lemoine Institut © Reiner Lemoine Institut", "2023 Bryan Lancien © Reiner Lemoine Institut", - "2023 Daryna Barabanova © Reiner Lemoine Institut", - "2023 Jonas Huber © Reiner Lemoine Institut", - "2023 Jonas Huber © Reiner Lemoine Institut", - "2023 Jonas Huber © Reiner Lemoine Institut", - "2025 Daryna Barabanova © Reiner Lemoine Institut", - "2025 Daryna Barabanova © Reiner Lemoine Institut", + "2026 Vismaya Jochem © Reiner Lemoine Institut", ] [[annotations]] diff --git a/dataedit/static/peer_review/opr_reviewer.js b/dataedit/static/peer_review/opr_reviewer.js index 3c144ce69..af84f2389 100644 --- a/dataedit/static/peer_review/opr_reviewer.js +++ b/dataedit/static/peer_review/opr_reviewer.js @@ -29,6 +29,12 @@ import { switchCategoryTab, selectNextField, updatePercentageDisplay } from "./n import { renderSummaryPageFields, updateTabProgressIndicatorClasses } from "./summary.js"; import {isEmptyValue, isEffectivelyEmpty} from "./utilities.js";window.clientSideReviewFinished = window.clientSideReviewFinished ?? false; let initialReviewerSuggestions = {}; +document.addEventListener('DOMContentLoaded', function() { + initializeEmptyFields(); +}); +window.addEventListener('load', function() { + initializeEmptyFields(); +}) window.clientSideReviewFinished = window.clientSideReviewFinished ?? false; export function initReviewer() { initializeEventBindings(saveEntrancesForReviewer); @@ -76,6 +82,42 @@ export function initReviewer() { } } +function initializeEmptyFields() { + const allFields = document.querySelectorAll(".field"); + + allFields.forEach(fieldEl => { + const fieldKey = fieldEl.dataset.fieldkey; + const fieldValue = fieldEl.dataset.fieldvalue; + + const isEmpty = isEffectivelyEmpty(fieldKey, fieldValue); + + if (isEmpty) { + // Grey out + const labelEl = fieldEl.querySelector('.key'); + const valueEl = fieldEl.querySelector('.value'); + + if (labelEl) labelEl.style.color = '#6c757d'; + if (valueEl) valueEl.style.color = '#6c757d'; + + // Add explanation message + const safeKey = fieldKey.replace(/[^a-zA-Z0-9_-]/g, '_'); + + if (!document.getElementById(`explanation_${safeKey}`)) { + const explanationElement = document.createElement('p'); + explanationElement.id = `explanation_${safeKey}`; + explanationElement.classList.add('explanation', 'text-muted', 'mt-1'); + explanationElement.innerText = 'Field is empty. Reviewing is not possible.'; + fieldEl.appendChild(explanationElement); + } + + // Disable clicking completely + fieldEl.style.pointerEvents = "none"; + fieldEl.style.cursor = "not-allowed"; + fieldEl.style.opacity = "0.7"; + } + }); +} + function deletePeerReview() { if (!confirm("Are you sure?")) return; const json = JSON.stringify({ @@ -97,6 +139,9 @@ function click_field(fieldKey, fieldValue, category) { const isEmpty = isEffectivelyEmpty(fieldKey, fieldValue); const cleanedFieldKey = fieldKey.replace(/\.\d+/g, ''); + if (isEmpty) { + return; // Exit early, don't allow interaction + } switchCategoryTab(category); setSelectedField(fieldKey); setselectedFieldValue(fieldValue); @@ -112,17 +157,9 @@ function click_field(fieldKey, fieldValue, category) { // If it's empty, buttons MUST be disabled, regardless of previous state (unless you want to allow un-reviewing, but generally empty = no action) const buttons = ["ok-button", "rejected-button", "suggestion-button"]; - buttons.forEach(btn => { - const el = document.getElementById(btn); - if (isEmpty) { - el.disabled = true; // Force disable if empty - } else { - // If not empty, disable if no state is selected yet? - // Actually, in the original code, buttons were enabled if a state existed. - // But usually, you want buttons enabled so you CAN select a state. - // Let's assume buttons should be enabled if the field has content. - el.disabled = false; - } + buttons.forEach(btn => { + const el = document.getElementById(btn); + el.disabled = false; // Enable buttons since we know field is not empty }); // 3. Handle empty field messages @@ -243,4 +280,4 @@ function saveEntrancesForReviewer() { selectNextField(); check_if_review_finished(); -} \ No newline at end of file +} diff --git a/dataedit/templates/dataedit/opr_review.html b/dataedit/templates/dataedit/opr_review.html index dd37c4ddf..7259117ac 100644 --- a/dataedit/templates/dataedit/opr_review.html +++ b/dataedit/templates/dataedit/opr_review.html @@ -717,113 +717,113 @@

role="tabpanel" aria-labelledby="summary-tab"> - -
-
- -
- -
-
- - -
-
-
- -
-
- +
+
+ +
+ +
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
-
+
+
+
+ + +
+
+ + +
+ class="btn btn-warning review__field-save" + id="submitButton">Save comment/new value
-
+
+
+ + +
+ class="btn btn-warning review__field-save" + id="submitCommentButton">Save comment
-
-
-
- - -
-
- - -
- +
+
+
+ Dataset uploaded by bmlancien on 2022-09-19
-
-
- - -
- +
+ 0 review
-
-
- Dataset uploaded by bmlancien on 2022-09-19 -
-
- 0 review -
-