Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion frontend/src/components/admin/AuditLogView.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
Activity,
Hash
} from 'lucide-react';
import { getActionLabel } from '../../utils/statusHelper';

// --- HUVUDKOMPONENT ---
const AuditLogView = ({ logs = [], loading }) => {
Expand Down Expand Up @@ -149,7 +150,7 @@ const AuditLogView = ({ logs = [], loading }) => {
<div className="flex justify-between items-start mb-1">
<div className="flex items-center gap-3">
<h4 className="font-black text-slate-900 italic tracking-tight uppercase text-sm">
{log.action.replace('_', ' ')}
{getActionLabel(log.action)}
</h4>
<span className={`text-[9px] font-black px-2 py-0.5 rounded-md border ${
log.performedByRole?.includes('VET') ? 'bg-blue-50 text-blue-600 border-blue-100' :
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/pages/AdminDashboard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,8 @@ const AdminDashboard = ({ userName, initialTab = 'USERS' }) => {
<div className="bg-white p-6 rounded-[2rem] border border-slate-200 shadow-sm border-b-4 border-b-red-400">
<div className="flex items-center gap-4">
<div className="bg-red-50 p-3 rounded-2xl text-red-600"><ShieldAlert size={24} /></div>
<div className="text-left">
<p className="text-[10px] font-black text-slate-400 uppercase tracking-widest">Admininstratörer</p>
<div>
<p className="text-[10px] font-black text-slate-400 uppercase tracking-widest">Administratörer</p>
<p className="text-3xl font-black text-slate-900">{stats.admins}</p>
</div>
</div>
Expand Down Expand Up @@ -239,7 +239,7 @@ const AdminDashboard = ({ userName, initialTab = 'USERS' }) => {
activeTab === 'LOGS' ? 'bg-white text-slate-900 shadow-sm' : 'text-slate-400'
}`}
>
Audit Log
Aktivitetslogg
</button>
</div>
</div>
Expand Down
8 changes: 4 additions & 4 deletions frontend/src/pages/CaseDetail.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useState, useEffect, useRef } from 'react';
import { commentService, activityService, attachmentService, medicalRecordService } from '../services/api';
import { STATUS_MAP } from '../utils/statusHelper';
import { STATUS_MAP, ACTIVE_STATUS_KEYS } from '../utils/statusHelper';
import { Stethoscope, Lock, FileText, CheckCircle, Upload, Trash2, ExternalLink, UserMinus } from 'lucide-react';
Comment thread
coderabbitai[bot] marked this conversation as resolved.

const CaseDetail = ({ caseData, onBack, onGoToPet, currentUserId, userRole, onDirtyChange }) => {
Expand Down Expand Up @@ -252,9 +252,9 @@ const CaseDetail = ({ caseData, onBack, onGoToPet, currentUserId, userRole, onDi
onChange={(e) => handleStatusChange(e.target.value)}
className="bg-slate-800 border border-slate-700 text-sm font-bold rounded-xl px-4 py-2 outline-none focus:ring-2 focus:ring-vet-accent transition-all cursor-pointer"
>
<option value="OPEN">Öppen</option>
<option value="IN_PROGRESS">Under behandling</option>
<option value="AWAITING_INFO">Väntar på svar</option>
{ACTIVE_STATUS_KEYS.map((key) => (
<option key={key} value={key}>{STATUS_MAP[key].label}</option>
))}
</select>
</div>
{caseData.assignedVetId === currentUserId && (
Expand Down
37 changes: 32 additions & 5 deletions frontend/src/utils/statusHelper.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,34 @@
// src/utils/statusHelper.js
//
// Gemensam mappning från backend-enum till svenska visningstexter.
// Används överallt där status eller aktivitetsloggar visas i UI:t så att
// texterna förblir konsekventa. Motsvarighet finns i backend
// (RecordStatus.displayLabel()) för loggrader som skrivs till databasen.

export const STATUS_MAP = {
'OPEN': { label: 'Inskickat', color: 'bg-blue-50 text-blue-700 border-blue-100' },
'IN_PROGRESS': { label: 'Under behandling', color: 'bg-yellow-50 text-yellow-700 border-yellow-100' },
'AWAITING_INFO': { label: 'Väntar på svar', color: 'bg-purple-50 text-purple-700 border-purple-100' },
'CLOSED': { label: 'Avslutat', color: 'bg-slate-50 text-slate-500 border-slate-100' }
};
'OPEN': { label: 'Öppen', color: 'bg-blue-50 text-blue-700 border-blue-100' },
'IN_PROGRESS': { label: 'Under behandling', color: 'bg-yellow-50 text-yellow-700 border-yellow-100' },
'AWAITING_INFO': { label: 'Väntar på svar', color: 'bg-purple-50 text-purple-700 border-purple-100' },
'CLOSED': { label: 'Avslutad', color: 'bg-slate-50 text-slate-500 border-slate-100' }
};

// Statusar som VET kan välja i dropdown. CLOSED utesluts — stängning sker
// via "Slutför & Stäng"-modalen för att tvinga fram en slutnotering.
export const ACTIVE_STATUS_KEYS = ['OPEN', 'IN_PROGRESS', 'AWAITING_INFO'];

// Svensk label för en status, med fallback till raw-värdet om enum-värdet
// inte känns igen (t.ex. nytt värde tillagt i backend men inte här).
export const getStatusLabel = (status) => STATUS_MAP[status]?.label ?? status;

// Mappning för ActivityType-enum → svensk rubrik.
// Används av AuditLogView i admin-vyn där log.action visas direkt.
export const ACTION_LABELS = {
'CASE_CREATED': 'Ärende skapat',
'STATUS_CHANGED': 'Status ändrad',
'COMMENT_ADDED': 'Kommentar tillagd',
'ASSIGNED': 'Veterinär tilldelad',
'UNASSIGNED': 'Ärende släppt',
'UPDATED': 'Ärende uppdaterat'
};
Comment thread
coderabbitai[bot] marked this conversation as resolved.

export const getActionLabel = (action) => ACTION_LABELS[action] ?? action;
18 changes: 17 additions & 1 deletion src/main/java/org/example/vet1177/entities/RecordStatus.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,23 @@
package org.example.vet1177.entities;

public enum RecordStatus {
OPEN, IN_PROGRESS, AWAITING_INFO, CLOSED;
OPEN("Öppen"),
IN_PROGRESS("Under behandling"),
AWAITING_INFO("Väntar på svar"),
CLOSED("Avslutad");

private final String displayLabel;

RecordStatus(String displayLabel) {
this.displayLabel = displayLabel;
}

// Svensk visningstext. Används i serverskrivna aktivitetsloggar så att
// loggraderna i activity_log lagras på samma språk som övriga beskrivningar.
// Frontend har motsvarande STATUS_MAP i statusHelper.js.
public String displayLabel() {
return displayLabel;
}

public boolean isFinal() {
return this == CLOSED;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,10 +250,10 @@ public MedicalRecord updateStatus(UUID recordId, RecordStatus newStatus, User up

MedicalRecord updated = medicalRecordRepository.save(record);

// LOGGING
// LOGGING — använd svensk label så loggen matchar UI-texterna.
activityLogService.log(
ActivityType.STATUS_CHANGED,
"Status ändrad till: " + newStatus,
"Status ändrad till: " + newStatus.displayLabel(),
updatedBy,
updated
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ void updateStatus_shouldLogActivity() {

verify(activityLogService).log(
eq(ActivityType.STATUS_CHANGED),
contains("AWAITING_INFO"),
contains(RecordStatus.AWAITING_INFO.displayLabel()),
eq(currentUser),
eq(record));
}
Expand Down