Refine the current dashboard flows around interviewer availability, candidate actions, recruitment-session timeslot creation, and date rendering so the behavior is explicit, reliable, and easier to manage from the app.
The main goal is to remove hidden behaviors, fix the current availability and timezone issues, and extend the dashboard with an admin-managed availability mask and a direct self-service control for firstTimeInterviewer.
Requirements
- split candidate actions in the candidate details flow, mainly around
ActionButtons.tsx, stageButtons.tsx, and DeleteInterviewButton.tsx, so interview deletion and stage transitions are separate actions with no hidden side effects
- keep interview deletion as an explicit standalone action on the candidate page and in the related interview service flow, mainly in the candidate
[id]/page.tsx flow and the interview service layer
- add a new admin-only dashboard page for an
availability mask, likely near the current availability overview page and sidebar configuration
- make the
availability mask reuse the same weekly-grid interaction model used by AvailabilitiesTable.tsx, but persist it separately from personal interviewer availability in the schema and timeslot-related services
- update aggregated availability and booking logic, mainly in
timeslots.ts, the aggregated availability table, and the manual booking flow, so the mask acts as a global filter over availability selection rather than as personal interviewer availability data
- investigate and fix the current availability update issues in the
My Availability flow, especially me/availability/page.tsx, AvailabilityClient.tsx, and src/lib/actions/availability.ts
- ensure saving availability is scoped correctly to the current recruitment session by adjusting the persistence and query logic in the availability action and timeslot service layer
- ensure users can clear all selected availability from
AvailabilityClient.tsx and still persist that empty state through the availability action
- add a direct control for
firstTimeInterviewer in the My Availability page, likely in me/availability/page.tsx and/or AvailabilityClient.tsx
- reuse the existing
isFirstTime flag and toggle flow already present in the auth schema, user actions, and users table, without introducing a second source of truth
- fix timezone hydration issues in the timeslot-based tables, especially
AvailabilitiesTable.tsx, AggregatedAvailabilityTable.tsx, and the booking-related table flows
- update recruitment-session timeslot generation in the recruitment creation form and
src/lib/actions/recruitmentSessions.ts so starting and ending hours are interpreted using an agreed user timezone instead of the server timezone
- make the timezone used for recruitment-session timeslot generation explicit in both the UI and the server-side generation logic
- when a user enters hours such as
9 to 20, generated timeslots must reflect 9:00 to 20:00 in the agreed timezone even if the server runs in a different timezone
- keep the implementation extensible by centralizing shared availability and time-handling logic in the relevant services and utilities
Suggested Order
- Investigate and fix the availability update issues in
My Availability.
- Fix timezone-safe rendering and hydration for timeslot tables.
- Fix Recruitment Session timeslot generation so submitted hours are interpreted in the agreed user timezone.
- Add the
firstTimeInterviewer toggle to My Availability.
- Introduce the admin
Availability Mask page and persistence model.
- Update aggregated availability and booking logic to respect the mask.
- Refactor candidate actions so interview deletion and stage moves are clearly detached.
- Verify the updated flows across candidate pages, personal availability, admin availability views, and recruitment-session creation.
Acceptance Criteria
Refine the current dashboard flows around interviewer availability, candidate actions, recruitment-session timeslot creation, and date rendering so the behavior is explicit, reliable, and easier to manage from the app.
The main goal is to remove hidden behaviors, fix the current availability and timezone issues, and extend the dashboard with an admin-managed availability mask and a direct self-service control for
firstTimeInterviewer.Requirements
ActionButtons.tsx,stageButtons.tsx, andDeleteInterviewButton.tsx, so interview deletion and stage transitions are separate actions with no hidden side effects[id]/page.tsxflow and the interview service layeravailability mask, likely near the current availability overview page and sidebar configurationavailability maskreuse the same weekly-grid interaction model used byAvailabilitiesTable.tsx, but persist it separately from personal interviewer availability in the schema and timeslot-related servicestimeslots.ts, the aggregated availability table, and the manual booking flow, so the mask acts as a global filter over availability selection rather than as personal interviewer availability dataMy Availabilityflow, especiallyme/availability/page.tsx,AvailabilityClient.tsx, andsrc/lib/actions/availability.tsAvailabilityClient.tsxand still persist that empty state through the availability actionfirstTimeInterviewerin theMy Availabilitypage, likely inme/availability/page.tsxand/orAvailabilityClient.tsxisFirstTimeflag and toggle flow already present in the auth schema, user actions, and users table, without introducing a second source of truthAvailabilitiesTable.tsx,AggregatedAvailabilityTable.tsx, and the booking-related table flowssrc/lib/actions/recruitmentSessions.tsso starting and ending hours are interpreted using an agreed user timezone instead of the server timezone9to20, generated timeslots must reflect9:00to20:00in the agreed timezone even if the server runs in a different timezoneSuggested Order
My Availability.firstTimeInterviewertoggle toMy Availability.Availability Maskpage and persistence model.Acceptance Criteria
My Availabilityupdates the correct recruitment-session data onlyMy Availabilityincludes a direct control for the current user’sfirstTimeInterviewerstatusfirstTimeInterviewerupdates the existing persisted user flag and the page reflects the new stateGMT+1and server timezoneGMTno longer turns submitted hours9to20into generated timeslots10to21