Commit Graph

47 Commits

Author SHA1 Message Date
Mihretu Endeshaw
f7c886d59b Merge pull request #32 from Tria-plc/feature/exam-attempt-domain
Feature/exam attempt domain
2026-08-27 10:25:43 +03:00
mihretue
5ad43ba760 fix(exam): step the exam form instead of validating hidden tabs
Submitting from Basic Info complained that required fields on the Settings
tab were empty — a correct error the user could not act on, since Settings
had not been shown yet.

The primary action now reads "Next" while Basic Info is open and validates
only that tab before moving on; Create/Update appears on Settings, the final
step, alongside a Back button. Submit still checks both tabs, since the tab
headers stay clickable and a user can reach Settings without going through
Next.
2026-08-26 06:24:49 +00:00
Nati
bd65fc0eab Enhance certificate designer and seafarer registration features with image support and dynamic department/rank options 2026-08-24 14:15:55 +00:00
mihretue
b49de1c1a8 fix(exam): guard question assignment once the paper is locked
The detail page fired assign/draw requests blind and surfaced the raw
backend key to the user — a locked paper showed up as the literal string
"paper_locked_after_registration" in a toast.

Manage Questions is now disabled once any candidate has registered, with a
tooltip and badge explaining why; both the manual assign and the random draw
live behind that modal, so one guard covers the same ground the backend's
assertPaperEditable does. The empty-paper alert now explains the deadlock
instead of telling the user to click a button that will fail, and both
error handlers translate paper_locked_after_registration in case someone
registers while the modal is open.

Registrations come from the query ExamCandidatesPanel already runs on this
page, so RTK Query serves it from cache rather than issuing a second request.
2026-08-24 14:04:24 +00:00
mihretue
e0ed10b823 Merge remote-tracking branch 'origin/dev' into feature/exam-attempt-domain
# Conflicts:
#	apps/backoffice/src/app/features/exam/pages/ExamDetailPage.tsx
2026-08-24 12:59:11 +00:00
mihretue
35961ec809 feat(exam): let ONLINE exams take ESSAY/BOTH form, add grading-sheet API
Frontend half of the backend change: ExamPage no longer disables the
form Select or force-resets it to CHOICE when administrationMethod is
ONLINE (backend's assertOnlineIsChoiceOnly is gone, matching gate
removed here). Also wires up GET .../grading-sheet as
useGetGradingSheetQuery — RecordResultModal wiring (show candidate
answers, prefill auto-computed CHOICE scores) is next.
2026-08-24 12:57:37 +00:00
Nati
4a3ad7c2e6 Merge branch 'WorkflowChange' of github.com:Tria-plc/emaui into WorkflowChange 2026-08-24 12:37:42 +00:00
Nati
294a8ded6c Refactor exam form handling to support mixed paper types and update related interfaces 2026-08-24 12:37:06 +00:00
mihretue
9f8f29d614 fix(exam): stop hiding non-CHOICE questions from OFFLINE assignment picker
eligibleQuestions filtered by q.form === exam.form, which matched the
backend's own restriction (assertUsable) only for ONLINE exams. Once
exam.form gained the "BOTH" value for OFFLINE mixed papers, no question
ever has form "BOTH", so the picker silently emptied out or, for a
plain CHOICE-form exam, looked CHOICE-only regardless of administration
method. Now mirrors the backend: CHOICE-only gate applies only when
administrationMethod is ONLINE.
2026-08-24 11:30:56 +00:00
nati14575
ff47c7b0aa Add support for "BOTH" exam form type and update translations 2026-08-24 12:13:18 +03:00
Nati
e82714ba1f Enhance exam selection by displaying certification rank in options and remove admission number input from scheduling modal 2026-08-22 06:11:02 +00:00
Nati
21ffca9094 Merge branch 'WorkflowChange' of github.com:Tria-plc/emaui into WorkflowChange 2026-08-21 18:20:02 +00:00
Fistum
62492e957b backoffice 2026-08-21 13:09:40 +00:00
Fistum
6b5b99f42d ui chnages 2026-08-21 11:16:22 +00:00
mihretue
c0b5871dc3 Merge remote-tracking branch 'origin/WorkflowChange' into feature/exam-attempt-domain
# Conflicts:
#	apps/portal/src/app/features/exams/pages/ExamsPage/columns.tsx
#	apps/portal/src/app/features/exams/pages/ExamsPage/index.tsx
#	libs/api/src/lib/features/licensing/licensing.helpers.ts
#	libs/auth/src/lib/components/AuthBootstrap.tsx
2026-08-20 11:41:06 +00:00
mihretue
59bb8cefb9 fix(exam): stop print margins doubling up, fitting far fewer questions per page
body had its own 40px padding + max-width:800px for the on-screen preview
tab, which stacked with @page's own margin once actual printing kicked in
— the preview tab never shows @page at all, so it looked like one
continuous page while the real printed output wasted ~150px+ of page
height per side and was capped to 800px wide regardless of the physical
page width. In @media print specifically: padding:0, max-width:none —
@page's margin is the only inset that should apply once printing.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 12:59:08 +00:00
mihretue
20b7de2310 fix(exam): pin print footer to the bottom of every page
Footer was just the last thing in document flow, so on a short paper it
landed mid-page instead of at the bottom. position:fixed in @media print
(the standard trick for a repeating page footer) plus a matching @page
bottom margin so it never overlaps the last question's text.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 12:12:00 +00:00
mihretue
cb3f945a2a fix(exam): cap cutting point input at 100 for Percentage evaluation
Matches the new backend rule. Field caps at 100 and shows a hint the
moment Percentage is selected, instead of letting you type 150 and only
finding out later.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 12:02:45 +00:00
mihretue
ae3af7777e fix(exam,result,question): kebab-icon action menus, status change as a picker
Two follow-ups on the dropdown-actions pass:
- All four action menus (exams, results, questions, candidates panel) now
  trigger off a plain three-dot icon button instead of a text 'Actions'
  button with a chevron.
- Exam status change no longer lists all six statuses flat in the dropdown
  (bad UX, looked like six always-visible options). 'Status' is now one
  menu item that opens a small picker modal (current status + a Select +
  Update) rather than the full edit form.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 11:46:16 +00:00
mihretue
80db201676 fix(exam,result): collapse row actions into a dropdown menu everywhere
Same treatment as the questions table, applied consistently: exams list,
exam results list, and the exam-detail candidates panel all now show a
single Actions button opening a dropdown instead of a row of inline
buttons/icons. Also fixes the exams list's action column header, which was
rendering the literal untranslated key ('exam.columns.actions') — missing
a fallback string, same pattern already used elsewhere in this file.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 11:40:13 +00:00
mihretue
f0443b84b1 fix(exam): lock the exam form to CHOICE when administration is Online
Matches the new backend rule (online_exam_requires_choice_form) — picking
Online in the exam form now auto-sets Form to Choice and disables that
field with an explanatory hint, instead of letting the user pick Essay
and only finding out at save time.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 17:20:16 +00:00
mihretue
8239d7ebe2 feat(exam,result): quick status action, per-row publish
Two UX gaps found in testing:

- Exams list: changing status (e.g. PENDING -> ACTIVE) required opening the
  full Edit modal for a one-field change. Added a status menu (teal toggle
  icon) directly in the row actions, calling PUT /exams/:id with just
  {status} — the backend DTO was already PartialType, nothing to change
  there.
- Exam Results: publishing required first picking the exam in a page-level
  filter to un-grey the header Publish button — not discoverable, and an
  extra step disconnected from the row you actually care about. Added a
  Publish action directly on any APPROVED result's row, confirm-gated since
  it publishes every approved result for that exam (not just the one row)
  and notifies every candidate. The header filter+button still works too,
  for publishing a batch at once.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 12:20:21 +00:00
mihretue
83d309248d feat(exam): regrade action + stop inviting a re-take on a finished exam
Two fixes surfaced by actual candidate-flow testing:

- Portal 'My registrations' always showed 'Take exam' regardless of whether
  the candidate had already finished — clicking it just hit
  attempt_already_submitted server-side. The registrations/mine response
  now carries the attempt's status; the row shows a Completed/Time expired
  badge once finished, or 'Resume exam' while still in progress, and only
  invites a fresh start when there's genuinely nothing yet.
- Backoffice candidates panel: a Regrade button next to a SUBMITTED/EXPIRED
  sitting, calling the new POST /exam-attempts/:id/regrade — the officer's
  path to the same staff-triggered regrade, no SQL needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 12:00:45 +00:00
mihretue
4a7d36369f fix(exam): print real MCQ options, evaluation-method-aware cutting point check
Print showed blank A/B/C/D fill-in lines for every CHOICE question instead
of the real options — the detail page never fetched option data at all
(GET /exams/:id?i=questions, no nested options), and the print template
hardcoded the blanks regardless. Now requests
?i=questions,questions.options and prints the real option text, falling
back to blank lines only when a question genuinely has none on record.

Also fixed the print-time cutting-point guard: it compared raw point sum
to cutting point regardless of evaluationMethod, wrongly blocking valid
low-point-sum PERCENTAGE papers from printing. Now branches the same way
RecordResultModal's grading preview already does, and surfaces the
matching backend validation error (paper_cannot_reach_cutting_point) added
server-side for the same reason.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 09:43:09 +00:00
mihretue
4f692c6bcf fix(exam): stop Create/Update Exam form from silently failing to submit
Three bugs compounded into a button that looked unwired:

- cuttingPoint carried a native HTML required attribute while sitting on
  the hidden Settings tab (Mantine keeps inactive tab panels mounted with
  display:none). The browser blocked form submission entirely, silently
  - no toast, no error, nothing. Replaced required with withAsterisk and
  moved validation into JS.
- Manual required-field validation never checked type/form/adminMethod/
  evalMethod/cuttingPoint at all, so even without the native block above
  a half-filled Settings tab would silently no-op. Validation now covers
  every required field on both tabs and switches to whichever tab has
  the problem.
- Filling only the English Direction field (leaving Amharic blank) passed
  frontend validation but the backend hard-rejects it, producing a 400
  with a confusing error. Frontend now requires both-or-neither, matching
  the same rule already applied to MCQ options.

Also translates the previously hardcoded validation message in both
locales.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 08:48:32 +00:00
Estifo77
6330c9ea55 applying loader on pages 2026-08-15 11:25:30 +03:00
Nati
6852fc86c6 feat: implement permission-based access control across various pages and components
- Added RequirePermission component to manage access based on user permissions.
- Integrated permission checks in MySeaRecordsPage, SeafarerRegistrationPage, VesselRegistrationPage, WaiverPage, and PortalLayout.
- Updated router to enforce permissions for specific routes.
- Introduced PORTAL_PERMISSIONS and LICENSE_PERMISSIONS constants for consistent permission management.
- Enhanced usePermissions hook to fetch permissions from the server and determine access rights.
- Refactored UI components to conditionally render based on user permissions, improving security and user experience.
2026-08-13 12:58:11 +00:00
Nati
220ed2d018 Merge branch 'dev' of github.com:Tria-plc/emaui into Refactor
Resolved by unifying on the lib/data AdvancedTable (PR #10) as the canonical
table component: kept its API plus teammate i18n/feature work, kept the
folder-per-table structure (index.tsx + columns.tsx + actions.tsx) across all
27 tables, removed the parallel lib/table implementation, and fixed
pre-existing compile breaks in ExamDetailPage/QuestionAssigner/RecordResultModal.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 11:31:27 +00:00
Nati
2af9e60800 feat(vessel-registration): add vessel registration page with incident reporting and certificate download functionality
feat(waiver): implement waiver page with application tracking and letter download feature

feat(ui): introduce AdvancedTable component for enhanced table functionality across the application

chore: update package-lock.json to remove unnecessary dependencies
2026-08-13 09:11:50 +00:00
estifanos
9897a9bf78 feat: implement date display utility across various pages
- Added `useDateDisplayer` hook and `dateDisplayer` function to format dates consistently based on the user's language.
- Updated multiple components and pages in both backoffice and portal applications to utilize the new date display functionality, ensuring proper formatting for dates in lists, tables, and detail views.
- Introduced Ethiopian date formatting for Amharic language support.
- Refactored date handling in components such as ExamAppealsPage, ResultPage, SeafarerRegistryPage, and others to improve localization and user experience.
2026-08-12 10:22:39 +00:00
estifanos
7c9f78c680 feat: replace Paper with Modal in CertificationPage, ConfigurationPage, ExamPage, and QuestionPage for consistent UI 2026-08-12 07:55:43 +00:00
estifanos
7c3a25245f UI fixes 2026-08-11 11:48:09 +00:00
Estifo77
203d2e5026 Merge branch 'dev' of https://github.com/Tria-plc/emaui into estif-branch-1 2026-08-08 09:03:50 +03:00
Mulu Mehari
7c968c7093 Adding more functionalities for all the license types 2026-08-07 11:50:07 +03:00
estifanos
7ba760d74b feat(AmharicDatePicker): implement Amharic date picker component with calendar type switching and time input 2026-08-05 10:14:03 +00:00
estifanos
bbae230ad5 feat: implement ModalFooter component for consistent modal action layout 2026-08-05 08:50:38 +00:00
estifanos
5fb6927d1a fix: remove hardcoded page size from useServerTable in multiple pages for consistency 2026-08-05 07:30:10 +00:00
estifanos
599dc4aa83 feat(i18n): add new translations for refresh, view, toggle columns, and no results
refactor(payment): remove payment API client and related tests, consolidating payment logic

refactor(payment): delete payment modal and associated constants, hooks, and types

fix(ui): enhance AdvancedTable with refresh button and column toggle functionality

fix(ui): implement pagination in useServerTable for better data handling
2026-08-03 09:22:02 +00:00
Estifo77
163e02e7af test 2026-07-27 11:52:56 +03:00
estifanos
8f7c163b9e feat: integrate error handling across various components
- Added `useErrorHandler` hook to centralize error handling logic.
- Updated components in the backoffice and portal applications to utilize the new error handling mechanism, replacing direct notify calls with `handleError` for improved error messaging.
- Enhanced localization files to include generic error messages for better user feedback.
- Refactored error handling in forms and API interactions to ensure consistent user experience across the application.
2026-07-24 09:08:41 +00:00
mengstabketemaw
7f76c862fb feat: implement i18n localization for exam components and detail page commit 2026-06-30 16:46:19 +03:00
mengstabketemaw
9fd59f52ed feat: add i18n support and localized labels to certification and profession features commit 2026-06-30 15:57:25 +03:00
Mengisteab
ae78c54c51 fix: update the exam module 2026-06-30 07:52:47 +00:00
mengstabketemaw
346c3585c1 feat: add logo to exam print view commit 2026-06-27 12:07:26 +03:00
mengstabketemaw
2b2ae71a8f feat: enhance exam result details and display comprehensive report information commit 2026-06-27 11:53:15 +03:00
mengstabketemaw
0b9322f016 feat(exam): implement dynamic question assignment modes and validation logic commit 2026-06-27 11:02:29 +03:00
mengstabketemaw
d7420d2de6 feat: added exam modules 2026-06-26 12:10:38 +03:00