diff --git a/apps/backoffice/src/app/features/exam/components/ExamCandidatesPanel/columns.tsx b/apps/backoffice/src/app/features/exam/components/ExamCandidatesPanel/columns.tsx
index e25910ab2..0884a3db6 100644
--- a/apps/backoffice/src/app/features/exam/components/ExamCandidatesPanel/columns.tsx
+++ b/apps/backoffice/src/app/features/exam/components/ExamCandidatesPanel/columns.tsx
@@ -1,5 +1,5 @@
-import { Badge, Button, Menu, Text } from '@mantine/core';
-import { IconChevronDown, IconRefresh, IconUserCheck } from '@tabler/icons-react';
+import { ActionIcon, Badge, Menu, Text } from '@mantine/core';
+import { IconDotsVertical, IconRefresh, IconUserCheck } from '@tabler/icons-react';
import type { TFunction } from 'i18next';
import type { AdvancedColumn } from '@ema-platform/ui';
import { LICENSE_PERMISSIONS, RequirePermission } from '@ema-platform/auth';
@@ -88,14 +88,14 @@ export function examCandidateColumns(
return (
diff --git a/apps/backoffice/src/app/features/exam/pages/ExamPage/index.tsx b/apps/backoffice/src/app/features/exam/pages/ExamPage/index.tsx
index 75d6243ef..61ff9aa36 100644
--- a/apps/backoffice/src/app/features/exam/pages/ExamPage/index.tsx
+++ b/apps/backoffice/src/app/features/exam/pages/ExamPage/index.tsx
@@ -369,6 +369,10 @@ export function ExamPage() {
const [deleteOpened, { open: openDelete, close: closeDelete }] =
useDisclosure(false);
const [changingStatusId, setChangingStatusId] = useState(null);
+ const [statusTarget, setStatusTarget] = useState(null);
+ const [pendingStatus, setPendingStatus] = useState(null);
+ const [statusOpened, { open: openStatus, close: closeStatus }] =
+ useDisclosure(false);
const certOptions = certifications
.filter((c) => c.isActive)
@@ -419,11 +423,14 @@ export function ExamPage() {
}
};
- const handleChangeStatus = async (exam: Exam, status: Exam["status"]) => {
- setChangingStatusId(exam.id);
+ const handleChangeStatus = async () => {
+ if (!statusTarget || !pendingStatus) return;
+ setChangingStatusId(statusTarget.id);
try {
- await updateExam({ id: exam.id, status }).unwrap();
+ await updateExam({ id: statusTarget.id, status: pendingStatus }).unwrap();
notify.success(t("exam.updated"));
+ closeStatus();
+ setStatusTarget(null);
} catch (e) {
handleError(e);
} finally {
@@ -464,7 +471,11 @@ export function ExamPage() {
openDelete();
},
onDetails: (exam) => navigate(`/exams/${exam.id}`),
- onChangeStatus: handleChangeStatus,
+ onOpenStatusChange: (exam) => {
+ setStatusTarget(exam);
+ setPendingStatus(exam.status);
+ openStatus();
+ },
changingStatusId,
}),
];
@@ -541,6 +552,47 @@ export function ExamPage() {
+
+ {/* Quick status change — not the full edit form */}
+
+
+
+ {statusTarget?.title?.[locale]}
+
+
+
);
}
diff --git a/apps/backoffice/src/app/features/question/pages/QuestionPage/actions.tsx b/apps/backoffice/src/app/features/question/pages/QuestionPage/actions.tsx
index fcea510ff..7226fc109 100644
--- a/apps/backoffice/src/app/features/question/pages/QuestionPage/actions.tsx
+++ b/apps/backoffice/src/app/features/question/pages/QuestionPage/actions.tsx
@@ -1,6 +1,6 @@
-import { Button, Menu } from '@mantine/core';
+import { ActionIcon, Menu } from '@mantine/core';
import {
- IconChevronDown,
+ IconDotsVertical,
IconEdit,
IconGavel,
IconSend,
@@ -29,14 +29,14 @@ export function questionActionsColumn(
return (
- }
+
- {t('question.columns.actions', 'Actions')}
-
+
+
{(q.status === 'DRAFT' || q.status === 'REJECTED') && (
diff --git a/apps/backoffice/src/app/features/result/pages/ResultPage/actions.tsx b/apps/backoffice/src/app/features/result/pages/ResultPage/actions.tsx
index 90ea74d9b..0921e9459 100644
--- a/apps/backoffice/src/app/features/result/pages/ResultPage/actions.tsx
+++ b/apps/backoffice/src/app/features/result/pages/ResultPage/actions.tsx
@@ -1,5 +1,5 @@
-import { Button, Menu } from '@mantine/core';
-import { IconChevronDown, IconEye, IconSend, IconTrash } from '@tabler/icons-react';
+import { ActionIcon, Menu } from '@mantine/core';
+import { IconDotsVertical, IconEye, IconSend, IconTrash } from '@tabler/icons-react';
import type { TFunction } from 'i18next';
import type { AdvancedColumn } from '@ema-platform/ui';
import { LICENSE_PERMISSIONS, RequirePermission } from '@ema-platform/auth';
@@ -24,9 +24,9 @@ export function resultActionsColumn(
return (
- }>
- {t('result.columns.actions', 'Actions')}
-
+
+
+
} onClick={() => handlers.onViewDetail(r)}>