Commit Graph

292 Commits

Author SHA1 Message Date
nati14575
a5c875f8f8 Refactor code structure for improved readability and maintainability 2026-08-29 12:56:47 +03:00
Nati
b8dc7274e6 feat(configuration): add BSID to NumberFormatScope and update related UI 2026-08-29 09:53:30 +00:00
Nati
e1f33be0e2 feat(biometric-enrollment): update profile picker to reflect seafarers awaiting enrolment and adjust UI messages
feat(seafarer-registration): add AWAITING_BIOMETRICS and UNDER_REVIEW statuses to registration constants and types
2026-08-29 08:48:49 +00:00
Nati
760eee9155 Merge branch 'WorkflowChange' of github.com:Tria-plc/emaui into WorkflowChange 2026-08-29 06:52:20 +00:00
Nati
890aca44f4 feat(signature): add signature functionality for officers and seafarers
- Implemented MySignaturePad component for officers to draw and upload their signatures.
- Added signature API endpoints for managing officer signatures in the backoffice.
- Created SignaturePad component for seafarers to manage their specimen signatures.
- Updated ProfilePage to include signature tabs for both officers and seafarers.
- Added translations for signature-related terms in English and Amharic.
- Introduced RankTier options for seafarer registration.
- Added tests for canvas-point utility to ensure accurate pointer mapping on signature pad.
2026-08-29 06:52:14 +00:00
fitse-yotor
fa217fc577 Merge origin/WorkflowChange into logestic_chnage
Resolves conflicts:
- LicenseReviewPage: dropped a duplicated schedule-issuance ActionIcon,
  keeping the Tooltip-wrapped one and adding scheduledPeriod (required
  by the scheduleIssuance mutation) to it.
- portal i18n (en.ts/am.ts): both sides added distinct keys under
  licensing.card (reportDamaged/reissueFailed vs status/statusReason) —
  kept both, additive.
- licensing.helpers.ts: kept sectionAppliesToKind (this branch) and
  switched to the centralized BASE_API_URL import from
  base-api/base-query-with-reauth (WorkflowChange), dropping the local
  duplicate constant.
2026-08-28 16:27:36 +03:00
fitse-yotor
a4fe5a7111 Merge branch into logestic_chnage, resolve licensing-api tag conflict
Kept both new cache tags (PickupOffice/PickupAppointment from this
branch, Department/Rank from origin) — additive, not conflicting.
2026-08-28 15:51:09 +03:00
fitse-yotor
687e3df3c2 feat: add pickup appointment scheduling and management features
- Introduced new pickup appointment functionalities in the licensing API, including scheduling, rescheduling, and managing pickup offices.
- Added UI components for the pickup desk, allowing officers to check in, issue documents, and manage no-show appointments.
- Implemented a new page for managing pickup offices with CRUD operations.
- Enhanced internationalization support for new pickup-related terms and messages.
- Updated licensing types to include new application kinds and issuance periods.
- Created a read-only panel for displaying scheduled pickup appointments in the licensing component.
2026-08-28 15:49:05 +03:00
Mihretu Endeshaw
bff1ae5375 Merge pull request #41 from Tria-plc/feature/fayda-auth-and-email-notifications
Feature/fayda auth and email notifications
2026-08-28 14:43:49 +03:00
nati14575
9841092ddc Merge branch 'WorkflowChange' of https://github.com/Tria-plc/emaui into WorkflowChange 2026-08-28 14:39:02 +03:00
nati14575
a66eef352c feat(i18n): add biometric-related translations and update navigation permissions 2026-08-28 14:38:56 +03:00
estifanos
215487fd0f fix: adjust SeafarerRegistryPage container padding and wrap table in scroll container for responsiveness 2026-08-28 10:54:40 +00:00
Estifo77
c53c1b8a45 Merge branch 'WorkflowChange' of https://github.com/Tria-plc/emaui into estif-branch-1 2026-08-28 12:47:46 +03:00
Nati
4b733d4dfb feat(biometric-enrollment): add BSID generation functionality and update translations 2026-08-28 09:40:13 +00:00
Nati
5006e4685b feat: add biometric enrollment and viewing capabilities with API integration 2026-08-28 08:15:39 +00:00
Nati
ea0a458ed0 Merge branch 'WorkflowChange' of github.com:Tria-plc/emaui into WorkflowChange 2026-08-28 06:49:06 +00:00
estifanos
51627f9918 feat: add inspection rescheduling workflow and unlock dependencies for flagged document sections 2026-08-28 06:46:06 +00:00
Nati
822abe4de4 feat(biometric-enrollment): add biometric enrollment feature with API integration and UI components 2026-08-28 06:45:47 +00:00
mihretue
c4e1f61691 Merge branch 'feature/fayda-auth-and-email-notifications' of github.com:Tria-plc/emaui into feature/fayda-auth-and-email-notifications 2026-08-27 17:08:20 +03:00
mihretue
7792128573 Merge branch 'dev' of github.com:Tria-plc/emaui into feature/fayda-auth-and-email-notifications 2026-08-27 17:07:31 +03:00
mihretue
22e4b84e23 Merge remote-tracking branch 'origin/dev' into feature/fayda-auth-and-email-notifications
# Conflicts:
#	apps/backoffice/src/app/features/user-management/UserManagementPage.tsx
2026-08-27 14:03:33 +00:00
mihretue
53edd90330 Merge remote-tracking branch 'origin/dev' into feature/exam-attempt-domain 2026-08-27 13:19:51 +00:00
mihretue
12ffa72cb2 fix(exam): gate Take Exam on confirmed attendance
The registrations table mirrored the server's old attendance deny-list —
ABSENT/WITHDRAWN/DISQUALIFIED — so the default REGISTERED fell through and
"Take exam" appeared before any invigilator had confirmed the candidate was
there. It is an allow-list now, PRESENT and LATE only, matching
ExamAttemptService.MAY_SIT.

A blocked candidate gets a reason rather than an empty cell: "Awaiting
attendance" with a tooltip while nobody has called the register, "Not sitting"
once attendance was taken and they are not. useExamAttempt does the same for
the direct-link path, and translates attendance_not_confirmed /
candidate_not_present instead of showing a raw error key on a Start button
that cannot work. The server refuses either way — this only makes the refusal
legible.

ScheduleExamModal no longer promises an admission number: scheduling makes a
sitting available, and the candidate registers for it themselves.
2026-08-27 13:10:46 +00:00
estifanos
88a1caa52b feat: add sorting support to seafarer registration query and default queue to newest first 2026-08-27 12:30:48 +00:00
Estifo77
82ddffd861 Merge branch 'WorkflowChange' of https://github.com/Tria-plc/emaui into estif-branch-1 2026-08-27 13:08:05 +03:00
Nati Nigussie
7035fb5676 Merge pull request #35 from Tria-plc/WorkflowChange
Workflow change
2026-08-27 12:08:26 +03:00
nati14575
14508635c5 refactor(actions): update action eligibility conditions and remove unused actions
refactor(i18n): remove 'assignReviewer' translation key from Amharic and English locales
refactor(nav-config): clean up navigation configuration by removing redundant items
refactor(licensing-api): remove assignReviewer mutation from licensing API
feat(package): add build script for parallel building of portal and backoffice
2026-08-27 12:07:08 +03:00
Nati Nigussie
b163aa4d3c Merge branch 'WorkflowChange' into logestic_chnage 2026-08-27 11:23:14 +03:00
nati14575
5e8fa6013f Merge branch 'WorkflowChange' of https://github.com/Tria-plc/emaui into WorkflowChange 2026-08-27 11:19:19 +03:00
nati14575
04c68e74c7 Update API URL fallback in UserManagementPage to ensure local development compatibility 2026-08-27 11:19:09 +03:00
estifanos
3d7bd99b4b style: update component background and icon colors to use semantic theme variables 2026-08-27 08:16:20 +00:00
fitse-yotor
12e7927d01 feat(certificate-designer): add custom page size options and update related components 2026-08-27 10:53:11 +03:00
estifanos
def6218dbf fix: show inspection-failed alert at page level, not inside the inspection tab
A license type configured without an inspection detail section (e.g. vessel
ownership transfer) would hide the "approval blocked" explanation entirely if
it ever reached INSPECTION_FAILED. The alert now renders beside the other
page-level status notices, so the reason is visible regardless of which detail
sections the type declares.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-27 07:50:43 +00:00
estifanos
f01c0ec31e feat: add INSPECTION_FAILED state, enforce inspection scheduling locks, and improve adjustment round UI for section locking and remark labeling 2026-08-27 07:36:07 +00:00
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
Nati
580ceaa139 Remove 'assign-reviewer' action and related functionality from license review process 2026-08-26 14:08:09 +00:00
Nati
2a16ca8584 Merge branch 'WorkflowChange' of github.com:Tria-plc/emaui into WorkflowChange 2026-08-26 13:34:24 +00:00
Nati
b5f1ffa6b8 Add 'assign-reviewer' action and related functionality for license review process 2026-08-26 13:34:06 +00:00
estifanos
f20ed670de fixes on backoffice for endorcement 2026-08-26 12:12:30 +00:00
estifanos
3cab22b58d fix: update conditional requirement validation to allow expressions using anyOf without a field 2026-08-26 09:44:37 +00:00
estifanos
13c3e8974d feat: consolidate CoC and GOC endorsement workflows into a new ENDORSEMENT_SEAFARER type and add anyOf support to conditional form field logic. 2026-08-26 09:44:08 +00:00
mihretue
c753009ed9 refactor(api): resolve the backend URL in one place
VITE_BASE_API_URL with a localhost:3001/api fallback was re-derived in six
files across libs/api, libs/auth, the portal and the backoffice — and a seventh
site (UserManagementPage) read the env raw with no fallback at all, handing the
IAM user-management app an undefined apiUrl whenever no .env was present.

BASE_API_URL in base-query-with-reauth.ts is now the single definition,
exported from @ema-platform/api; every other site imports it. Trims the env
value and treats blank as unset, matching how the backend reads its own keys.
2026-08-26 09:09:25 +00: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
Estifo77
a86f4750bc Merge branch 'WorkflowChange' of https://github.com/Tria-plc/emaui into estif-branch-1 2026-08-26 08:43:31 +03:00
mihretue
baea9f2b57 chore(dev): serve the portal on 3000 for the Fayda redirect
The Fayda redirect URI registered for local testing is
http://localhost:3000/callback, matched exactly by the provider, so the portal
has to be the thing listening there. Its dev and preview servers move from 4200
to 3000 and the API moves to 3001.

Every hardcoded fallback to http://localhost:3000/api follows — six copies of
the same default across libs/api, libs/auth, the portal and the backoffice —
otherwise a developer without a .env would have had the app calling itself.

e2e is unaffected: it binds its own ports (3011/4302/4303) explicitly.
2026-08-25 19:04:27 +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
34208ed0d6 feat(exam): show candidate answers + prefill auto-scores in RecordResultModal
Wires useGetGradingSheetQuery into the grading modal: a new 'Candidate's
Answer' column shows the selected option or essay text per question, and
whichever CHOICE scores auto-grading could already compute get prefilled
into the score inputs (tagged 'Auto-graded', still editable — the examiner
can override). Grading a mixed or ESSAY paper no longer means guessing at
what was answered or re-deriving the CHOICE portion by eye.

Degrades to blank inputs exactly as before for an OFFLINE candidate or one
who hasn't sat an online attempt (gradingSheet returns empty answers for
those, not an error).
2026-08-24 13:02:08 +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