hotfix (dataset): implement reject to reviewer functionality for editors

- Added "rejected_to_reviewer" state to the `ServerStates` enum.
- Implemented routes and controller actions (`rejectToReviewer`, `rejectToReviewerUpdate`) for editors to reject datasets back to reviewers with a rejection note.
- Added UI elements (button) in the editor dataset index and publish views to trigger the "reject to reviewer" action.
- Updated the reviewer dataset index view to display datasets in the "rejected_to_reviewer" state and show the editor's rejection note.
- Modified the reviewer dataset review page to allow reviewers to view and accept datasets that have been rejected back to them by editors.
- Updated the database migration to include the "rejected_to_reviewer" state in the `documents_server_state_check` constraint.
- Updated dependencies (pinia, redis).
This commit is contained in:
Kaimbacher 2025-05-02 14:35:58 +02:00
parent c245c8e97d
commit be6b38d0a3
15 changed files with 1647 additions and 404 deletions

View file

@ -51,6 +51,8 @@ const getRowClass = (dataset) => {
rowclass = 'bg-released';
} else if (dataset.server_state == 'published') {
rowclass = 'bg-published';
} else if (dataset.server_state == 'rejected_to_reviewer') {
rowclass = 'bg-rejected-reviewer';
} else {
rowclass = '';
}
@ -131,6 +133,21 @@ const formatServerState = (state: string) => {
</td>
<td class="py-4 whitespace-nowrap text-gray-700">
<div class="text-sm">{{ formatServerState(dataset.server_state) }}</div>
<div v-if="dataset.server_state === 'rejected_to_reviewer' && dataset.reject_editor_note"
class="inline-block relative ml-2 group">
<button
class="w-5 h-5 rounded-full bg-gray-200 text-gray-600 text-xs flex items-center justify-center focus:outline-none hover:bg-gray-300">
i
</button>
<div
class="absolute left-0 top-full mt-1 w-64 bg-white shadow-lg rounded-md p-3 text-xs text-left z-50 transform scale-0 origin-top-left transition-transform duration-100 group-hover:scale-100">
<p class="text-gray-700 max-h-40 overflow-y-auto overflow-x-hidden whitespace-normal break-words">
{{ dataset.reject_editor_note }}
</p>
<div class="absolute -top-1 left-1 w-2 h-2 bg-white transform rotate-45">
</div>
</div>
</div>
</td>
@ -146,12 +163,13 @@ const formatServerState = (state: string) => {
<td
class="py-4 whitespace-nowrap text-right text-sm font-medium text-gray-700">
<BaseButtons type="justify-start lg:justify-end" no-wrap>
<BaseButton v-if="can.review && (dataset.server_state == 'approved')"
<BaseButton
v-if="can.reject && (dataset.server_state == 'approved' || dataset.server_state == 'rejected_to_reviewer')"
:route-name="stardust.route('reviewer.dataset.review', [dataset.id])"
color="info" :icon="mdiGlasses" :label="'View'" small />
<BaseButton
v-if="can.reject && (dataset.server_state == 'approved')"
v-if="can.reject && (dataset.server_state == 'approved' || dataset.server_state == 'rejected_to_reviewer')"
:route-name="stardust.route('reviewer.dataset.reject', [dataset.id])"
color="info" :icon="mdiReiterate" :label="'Reject'" small />
</BaseButtons>