Epic 08: Applications, Offers, Placements and Chats¶
Overview¶
The Applications, Offers, Placements and Chats Epic enables managers and clients to efficiently manage the flexworker lifecycle from initial application review through active placement management. This unified, workflow-driven module provides clear visibility of incoming candidate applications, streamlined offer creation and management, active placement tracking, and direct communication channels with flexworkers. Managers benefit from centralized candidate decisioning, transparent onboarding progress tracking, and reduced administrative overhead, while optimized mobile and desktop experiences support fast, accurate candidate and placement management.
Business Value¶
- Applications (Unprocessed, On-going, Declined), Offers (New, Accepted, Declined), Placements (Awaiting, Confirmed, Active, Discontinued), and Chats Enable quick, informed decision-making for managers on candidate applications and offers Improve operational efficiency through streamlined offer creation and renewal workflows Minimize support burden by surfacing candidate statuses, onboarding progress, and next actions proactively Establish direct communication channels with flexworkers to support placement lifecycle Optimize mobile and desktop usability to support fast, accurate candidate and placement management
Solution Concept¶
This epic implements four tightly integrated modules for managers: Applications Managers review, filter, and manage incoming candidate applications in a dedicated "Applications" section. The experience centers around three tabs (Unprocessed, On-going, Declined), each showing real-time counts and organized candidate cards. Cards display comprehensive application information including candidate ratings, job match data, work history, and skill tags. Status flows ensure each application is actionable and visible, with empty states providing helpful guidance. Managers can send offers, message candidates, or decline applications. Offers Managers create, send, and track job offers via the "Offers" page with three tabs (New, Accepted, Declined). Detailed offer cards and creation modals surface all offer information (candidate, job, hourly rate, contract terms). Workflows enable creating new offers, renewing expired offers, tracking acceptance/decline status, and capturing decline reasons. Real-time offer status tracking ensures visibility across the entire candidate lifecycle. Placements Upon candidate acceptance of an offer, managers track the staged onboarding process in "Placements": Awaiting (pending step 2 completion), Confirmed (step 2 completed, cannot be cancelled), Active (ongoing work), and Discontinued (declined or ended). Each placement shows detailed progress indicators of the three-step onboarding: ID/permit check, document signing, document upload. Managers can view placement cards, monitor verification status, message candidates, and discontinue placements when necessary. Recruitment The feature that aggregates all the candidate cards in one single page. It is helpful for general search through all the candidates that have ever got in touch with the company. On
Features and User Stories¶
8.1 Recruitment Page and Application Flow¶
8.1 Recruitment Page and Application Flow In Review Preview¶
User Story:
As a manager I want to see all candidates within recruitment process and to understand the complete application flow So that I can efficiently navigate the candidate management process and take appropriate actions at each stage
Описание: Recruitment Page aggregates all the candidate cards from all Applications, Offers and Placements pages for the manager to find workers fast and see what stage they are in. The Application Flow explains how candidates progress through the manager's application workflow, from initial unprocessed applications through to offer creation or decline. This story documents the complete lifecycle and status transitions of the candidate journeys and manager’s available actions. alt size=16 style="background-blend-mode:normal;background-clip:content-box;background-position:50% 50%;background-color:rgba(0,0,0,0);background-image:var(--sf-img-11);background-size:100% 100%;background-origin:content-box;background-repeat:no-repeat"> BlinkSoftware [HF] [Main]
Критерии приёмки: - Recruitment Page Header: - Page title: "Recruitment" - Explanation text: “The full list of applicants in any stage within the recruitment process, that could be useful mainly for search purposes” - Filter & Search: - Filter drawer - Sort by newest / oldest (newest by default) - Filter by Job ID - Multi select list of all job IDs with at least 1 item - If there is 0 items in this Job ID + tab - hide the Job ID from the list of options - List with 3 parent items - Select All, Active Jobs and Archived Jobs - “Select All” - selects all Job IDs - Active Jobs & Archived Jobs - select all Job IDs of corresponding type - If filters are applied - “filter applied” indicator added (orange dot on funnel icon) - Search bar - search by candidate name and job posting - Search on type, 3 symbols minimum - nice to have - “clear search” [x] button → search bar is empty, search results cleared - Empty States: - If there are no applicant cards on the current page: crossed briefcase icon + text “No applicants yet. - All of candidate cards will appear here” - Recruitment Page Content: - Simplified layout of candidate cards, with all available timestamps (newest first), so the timeline of the application is clear - Status Indicators: - Each application card shows availability (Open to Work / On Assignment / Unavailable) and onboarding (Onboarding / Onboarded) status badges - For recruitment page only - add hiring statuses on each candidate cards as badges (links) - Recruitment status link on candidate’s card (clickable): - Unprocessed Application - Ongoing Application - Declined Application - New Offer - Declined Offer - Awaiting Placement - Confirmed Placement - Active Placement - Discontinued Placement - Archived Placement - Click on status link redirects to corresponding page, filtered by candidate’s name - nice to have - Reverse chronological sorting order (most recent first), as on all pages of Recruitment process - Lazy loading, as within all pages of Recruitment process - Application Lifecycle Overview: - General rule: 1 candidate - 1 job - 1 offer (may be edited and renewed) - 1 placement - Candidate applies for job → Application appears in Unprocessed tab - Manager sends a message → Application moves to On-going tab - Manager declines application → Application moves to Applications > Declined tab (with reason) - Manager reconsiders declined application → Application moves to Applications > Ongoing tab - Manager sends offer → Application moves to (or appears in) New Offers tab - Offer accepted by candidate → Placement created in Placements > Awaiting - Offer declined by candidate → Application moves to Offers > Declined tab (with reason) - Offer withdrawn by manager → Application moves to Offers > Declined tab (with reason) - Manager reconsiders a declined/withdrawn offer → Application moves to Offers > New tab (with Renew Offer modal first) - Offer expired → Application remains in Offers > New - Offer edited / renewed → Application remains in Offers > New - Placement is confirmed by candidate (ID verified and Documents are signed) → Placements moves to Placements > Confirmed - Placement is not confirmed by candidate → Placement remains in Placements > Awaiting - Awaiting Placement discontinued by candidate or manager → Placement moves to Declined (with reason) - Manager reconsiders a discontinued placement → Application moves to Offers > New tab (with Renew Offer modal first) - Placements is confirmed + job start date (from offer) comes + IBAN & BSN are disclosed → Placement is moved to Placements > Active - Placement is active + job end date (from offer) comes → Placement moves to Placements > Archived - Manager sends a new offer on Active / Archived Placement → New application created in Offers > New (with Job Context and Send Offer modals first) - Application / Offer / Placement remains undecided → leave them where they are and wait for action to be taken - Manager Actions at Each Stage: - On every candidate card on any stage: - "Send Message" button on the left → Opens message thread with candidate - "View Profile" button on the right → Candidate full profile page with job context - Unprocessed Tab (New Applications): - "Decline" button (red/outline) → Decline an application (with reason modal) - "Send Offer" button → Send a new offer - On-going Tab (Communication going on): - "Decline" button (red/outline) → Decline an application - "Send Offer" button → Send a new offer - Declined Applications Tab: - "Reconsider" button → Application moves back to Applications > Ongoing - New Offers Tab: - "Withdraw" button (red outline) → Withdraw the sent offer with a reason modal - "Edit Offer" button → Send an updated offer to candidate - "Renew Offer" button (for expired) → Send an updated offer to candidate - Declined Offers Tab: - "Reconsider" button → Send an updated offer to candidate → Application moves back to Offers > New - Awaiting Placements Tab: - "Discontinue" button → End placement with a reason modal → placement moves to Discontinued tab - Confirmed Placements Tab: - "Discontinue" button → info modal “Contact Cruits” - Active Placements Tab: - "Send New Offer" button → New offer with new job context - "Discontinue" button → info modal “Contact Cruits” - Discontinued Placements Tab: - "Reconsider" button → Re-engage with declined candidate (send new offer) - Archived Placements Tab: - "Leave Review" button → Leave a Review modal (1 review on 1 placement) - "Send New Offer" button → New offer with new job context - Flow Chart of the Applications Lifecycle: - Open Application Flow-2026-01-05-090239.png
8.1.1 NOT NVP Confirmed or Active Placement discontinued by Cruits manager → Application moves to Declined (with reason by Cru¶
8.2 Application Management¶
User Story:
As a manager I want to view, filter, and manage all incoming and ongoing candidate applications in one centralized location So that I can efficiently review candidates and take appropriate hiring actions
Описание: The Applications feature enables managers to view and track all candidate applications for their job postings in one centralized location. Managers can see which candidates have applied, filter by job/status, send offers, message candidates, and view candidate profiles. The system provides clear visibility of application status and enables managers to take action on candidates efficiently. Access Points: Primary: left panel > Recruitment > Applications Secondary: Job posting > Applications tab
Критерии приёмки: - Applications Page Header: - Page title: "Applications" - Three tabs: "Unprocessed", "On-going", "Declined" - Default to "Unprocessed" tab - Tab badge showing count of items in each tab - Filter & Search: - Filter drawer - Sort by newest / oldest (newest by default) - Filter by Job ID - Multi select list of all job IDs with at least 1 item - If there is 0 items in this Job ID + tab - hide the Job ID from the list of options - List with 3 parent items - Select All, Active Jobs and Archived Jobs - “Select All” - selects all Job IDs - Active Jobs & Archived Jobs - select all Job IDs of corresponding type - If filters are applied - “filter applied” indicator added (orange dot on funnel icon) - Search bar - search by candidate name and job posting - Search on type, 3 symbols minimum - nice to have - “clear search” [x] button → search bar is empty, search results cleared - Empty States: - If there are no applicant cards on the current page: crossed briefcase icon + text “No applications yet. - Applications of candidates will appear here” - If there are no applicants in the current tab due to filters in the other tab applied : “No applicants match your filters. - Try adjusting your search criteria” + “Reset all Filters” button - Unprocessed Tab: - Display list of newly received applications (not yet actioned) - Card-based layout showing candidate information: - Candidate photo/avatar - Candidate name - Star rating, reviews count - Job applied for (job ID) - Location (with distance) - Match percentage badge (green/yellow/red) - Skill tags (e.g., "Warehouse", "Forklift", "Packing") - Work history indicator, if applicable (e.g., "Worked with you before: - Mar 2024 - Apr 2024") - Application date timestamp (Applied on [date, time]) - Action buttons on card: - "Send Message" button on the left → Opens message thread with candidate - "View Profile" button on the right → Candidate full profile page with job context - "Decline" button (red/outline) → Decline an application (with reason modal) - "Send Offer" button → Send a new offer - Sorted by date (most recent first) - Empty state: "No new applications" with helpful message - On-going Tab: - Display applications with offers sent and awaiting candidate response or confirmed - Same card layout as Unprocessed - Action buttons: - "Send Message" button on the left → Opens message thread with candidate - "View Profile" button on the right → Candidate full profile page with job context - "Decline" button (red/outline) → Decline an application (with reason modal) - "Send Offer" button → Send a new offer - Sorted by last message received date (most recent first) - Empty state: "No on-going applications" - Offers Tab: - Empty state: "Applicants are in "New Offers" page / Applicants who received an offer can be found in New Offers page" - “Go to New Offers” button → Offers > New - Declined Tab: - Display all declined applications and offers (read-only viewing available) - Card layout includes: - Candidate name, rating, location - Decline date - Decline reason (e.g., "Not interested", "Schedule doesn't work", custom reason) - Decline timestamp (Declined on [date] by [name]) - Action buttons: - ""Send Message" button on the left → Opens message thread with candidate - "View Profile" button on the right → Candidate full profile page with job context - "Reconsider" button → Application moves back to Applications > Ongoing - Sorted by decline date (most recent first) - Empty state: "No declined applications" - Decline Application Workflow: - Candidate Card highlighted on background - nice to have - Modal confirmation: - Heading: "Decline Application" - Message: "Are you sure you want to decline the application of [candidate name]?" - Reason text box (characters limit - 20-1500) - "Decline" button - "Cancel" button - On success: - Application removed from Unprocessed / Ongoing - Added to Applications > Declined tab - Candidate notified - View Profile - full candidate profile with job context: - Header section: - "Application Details" or "Candidate Profile" title - Back/close button - Candidate section: - Full name, photo, rating (with review count) - Location (distance from job) - Work history with your company (if applicable) - Application section: - Job title applied for - Application date and time - Match percentage and match details (skills, experience) - Skill comparison to job requirements - Work history timeline (recent placements) - Availability information - Action buttons: - "Send Offer" button → Offer creation modal - "Send Message" button → Message candidate - "Leave Review" button → Rate/review candidate - Send Message Workflow: - "Send Message" button opens message thread or creates new thread - Displays job context at top - See user story
8.2.1 (не MVP)¶
8.3 Offer Management¶
8.3 Offer Management In Review Preview¶
User Story:
As a manager I want to create, send, renew, and track job offers to candidates So that I can efficiently manage the hiring pipeline and maintain visibility of offer acceptance/decline status
Описание: The Offers feature enables managers to create job offers, send them to candidates, track offer status (sent, accepted, declined), renew expired offers, and capture decline reasons. Managers can view comprehensive offer details and manage the complete offer lifecycle. This feature bridges the gap between candidate selection and placement confirmation. alt size=16 style="background-blend-mode:normal;background-clip:content-box;background-position:50% 50%;background-color:rgba(0,0,0,0);background-image:var(--sf-img-11);background-size:100% 100%;background-origin:content-box;background-repeat:no-repeat"> BlinkSoftware [HF] [Main] Access Points: Primary: left panel > Offers tab Secondary: Applications > Send Offer button Tertiary: Placements > Send New Offer button
Критерии приёмки: - Offers Page Header: - Page title: "Offers" - Three tabs: "New", "Accepted", "Declined" - Default to "New" tab - Tab badge showing count of items in each tab - Filter & Search: - Filter drawer - Sort by newest / oldest (newest by default) - Filter by Job ID - Multi select list of all job IDs with at least 1 item - If there is 0 items in this Job ID + tab - hide the Job ID from the list of options - List with 3 parent items - Select All, Active Jobs and Archived Jobs - “Select All” - selects all Job IDs - Active Jobs & Archived Jobs - select all Job IDs of corresponding type - If filters are applied - “filter applied” indicator added (orange dot on funnel icon) - Search bar - search by candidate name and job posting - Search on type, 3 symbols minimum - nice to have - “clear search” [x] button → search bar is empty, search results cleared - Empty States: - If there are no applicant cards on the current page: crossed briefcase icon + text “No offers yet. - Your offers for candidates will appear here” - If there are no applicants in the current tab due to filters in the other tab applied: “No applicants match your filters. - Try adjusting your search criteria” + “Reset all Filters” button - New Offers Tab: - Displays all pending/sent offers (not yet accepted/declined/expired) - Card-based layout showing: - Same as in Applications, with some changes - Offer status badge "Offer sent [date]" - Expiry indicator: "Expiring [date]" or “Expired [date]” - Red text for Expired - Action buttons on card: - "View Profile" button → Candidate profile with job context - "Send Message" button → Message candidate - "Withdraw" button (red outline) → reason modal → withdraw the offer → candidate card moves to Offer > Declined - "Edit Offer" button (for not expired) → edit offer modal → Send an updated offer to candidate - "Renew Offer" button (for expired) → renew offer modal → Send an updated offer to candidate - Sorted by expiry date (expiring soon first) - Lazy loading for performance - Pull to refresh functionality - Accepted Offers Tab: - Empty state: "Applicants are in Awaiting Placements page / Candidates who accepted an offer can be found in Awaiting Placements page" - “Go to Awaiting Placements” button → Placements > Awaiting - Declined Offers Tab: - Displays all declined offers and withdrawn offers - Card layout: - Same as in New Offers, with some changes - Offer status badge "Offer sent at [date]" - Declined timestamp: “Declined at [date] by candidate” (if candidate declined) or “Withdrawn at [date] by [manager name]” (if manager withdrawn the offer) - Decline reason on hover - Action buttons: - "Send Message" button → Message candidate - "View Profile" button → Candidate profile - "Reconsider" button → Renew offer modal → Renew offer to declined candidate → application moves to Offers > New - Sorted by decline date (most recent first) - Empty state: "No declined offers" - Create Offer Workflow (Modal): - Heading: "Send Offer" - Job context info box - Warning box (for Onboarding candidates only) - Manager message text area - Offer details section: - Start date picker - End date picker (optional) - “Offer Expiration (days)” number field - "Send Offer" button → successful send, navigate to offer details - "Cancel" button → go back - Validation: - All required fields must be filled - End date must be after start date - Offer Expiration must be an integer - Edit / Renew Offer Workflow (modal): - Opens “Edit / Renew Offer” modal for not expired / expired offers - Has all the information pre-filled from most recent offer - Anything can be edited - “Offer Expiration” is empty and needs to be filled in - All validation rules are the same as for Send Offer - Withdraw Offer Workflow (modal): - Candidate Card highlighted on background - nice to have - Modal confirmation: - Heading: "Withdraw Offer" - Message: "Are you sure you want to withdraw the offer to [candidate]?" - Reason text box (characters limit - 20-1500) - "Withdraw" button - "Cancel" button - On success: - Offer removed from New tab - Added to Offers > Declined tab - Candidate notified - Reconsider Workflow (from Declined Offers): - "Reconsider" button on declined offer card opens Renew Offer modal: - same structure, as for Renew Offer flow - "Renew Offer" button - "Cancel" button - On success: - Offer renewed and sent - Removed from Offers > Declined - Moved to New Offers - Candidate receives notification - Offer Expiry Management: - Automatic expiry after set date - Red “Expired” text when expired - Offer remains in "New Offers" tab - Send Message Integration: - "Send Message" button opens message thread with job context - See user story
8.3.1 (не MVP)¶
8.4 Placement Management U¶
8.4 Placement Management In Review Preview s¶
User Story:
As a manager I want to view and track candidate placements across different onboarding stages So that I can monitor the hiring pipeline, verify document completion, and manage active work assignments
Описание: The Placements feature provides managers with a centralized view to track candidate placements across four states: Awaiting (candidate accepted, pending step 2 completion), Confirmed (step 2 completed, cannot be discontinued easily), Active (candidate working), and Discontinued (declined or ended). Managers can view placement cards with onboarding progress, monitor verification status, send messages, and take actions to manage placements. alt size=16 style="background-blend-mode:normal;background-clip:content-box;background-position:50% 50%;background-color:rgba(0,0,0,0);background-image:var(--sf-img-11);background-size:100% 100%;background-origin:content-box;background-repeat:no-repeat"> BlinkSoftware [HF] [Main] Access Points: Primary: left panel > Placements Secondary: Offers > Accepted tab
Критерии приёмки: - Placements Page Header: - Page title: "Placements" - Four tabs: "Awaiting", "Confirmed", "Active", "Discontinued" - Default to "Awaiting" tab - Tab badge showing count in each tab - Filter & Search: - Filter drawer - Sort by newest / oldest (newest by default) - Filter by Job ID - Multi select list of all job IDs with at least 1 item - If there is 0 items in this Job ID + tab - hide the Job ID from the list of options - List with 3 parent items - Select All, Active Jobs and Archived Jobs - “Select All” - selects all Job IDs - Active Jobs & Archived Jobs - select all Job IDs of corresponding type - If filters are applied - “filter applied” indicator added (orange dot on funnel icon) - Search bar - search by candidate name and job posting - Search on type, 3 symbols minimum - nice to have - “clear search” [x] button → search bar is empty, search results cleared - Empty States: - If there are no applicant cards on the current page: crossed briefcase icon + text “No placements yet. - Placements of candidates will appear here” - If there are no applicants in the current tab due to filters in the other tab applied : “No applicants match your filters. - Try adjusting your search criteria” + “Reset all Filters” button - Awaiting Tab: - Display placements (accepted offers) waiting for step 2 completion (document signing) - Each card shows the same info, as in Offers page, with some changes: - No Skills and Matching badges - No “Worked with you before” info - Offer start-end dates - Offer accepted timestamp (Accepted on [date]) - Step progress badges: - "ID Verifying" (blue) or "ID Verified" (green) - "Work Permit Verifying” (blue) or "Work Permit Verified" (green) - optional - "Contract Signing” (blue) - Action buttons: - "View Profile" → candidate full profile page - "Send Message" → Message candidate - "Discontinue" button (red outline) → reason modal → discontinue the placement → candidate card moves to Placements > Discontinued - Sorted by accepted date (most recent first) - Confirmed Placements: - Display placements with step 2 completed (contract signing done) - Each card shows the same info, as in Awaiting Placements page, with some changes: - Step progress badges: - ID Verified (green) - "Work Permit Verified" (green) - optional - Contract Signed (green) - "Documents Finalizing" (blue) or "Documents Finalized" (green) - Action buttons: - "View Profile" → candidate full profile page - "Send Message" → Message candidate - "Discontinue" button (red outline) → “Contact Cruits” modal - Sorted by most recent confirmation date - Empty state: "No confirmed placements" - Active Placements: - Display placements of candidates actively working - Each card shows the same info, as in Awaiting Placements page, with some changes: - No placement confirmation step badges - Start-end dates (from Offer) - Action buttons: - "View Details" → Candidate Ple page - "Send Message" → Message candidate - "Send New Offer" → New opportunity/extension - "Extend" button → “Contact Cruits” modal - "Discontinue" button (red outline) → “Contact Cruits” modal - Sorted by nearest end date - Empty state: "No active placements" - Archived Placements: - Display placements of candidates who finished working - Each card shows the same info, as in Active Placements page - Action buttons: - "View Details" → Candidate Profile - "Send Message" → Message candidate - "Leave Review" → Rate candidate performance (if no reviews on this placement) - "Send New Offer" → job context modal -> Send Offer - Discontinued Placements: - Display discontinued placements, either by a manager or by a worker - Each card shows the same info, as in Awaiting Placements page, with some changes: - Most recent confirmation step badges - Start-end dates (from Offer) - “Discontinued at [date] by [name]” red line with the discontinuation reason on hover, if ended by a manager - “Declined at [date] by [name]” red line with the decline reason on hover, if ended by a worker - Action buttons: - "View Details" → Candidate Profile page - "Send Message" → Message candidate - "Reconsider" → Renew Offer modal → move placement to Offers > New - Sorted by discontinuation date (most recent first) - Empty state: "No applicants who declined the placement and whose placement you discontinued" - Discontinue Placement Workflow: - Candidate Card highlighted on background - nice to have - For Awaiting Placement only - modal confirmation: - Heading: "Discontinue Placement" - Message: "Are you sure you want to discontinue the placement of [candidate name]?" - Reason text box (chars limit 20-1500) - "Discontinue" button - "Cancel" button - On success: - Success toast: "Placement discontinued" - Placement moved to Discontinued tab - Candidate notified - Reason captured for records - For Confirmed and Active Placements - info pop-up: - Info message: “If you would like to discontinue a confirmed or active placement, please contact Cruits vie email: admin@cruits.com ” - Close/Cancel button - Extend Placement Workflow: - Candidate Card highlighted on background - nice to have - For Active Placement only - info pop-up: - Info message: “If you would like to extend an active placement, please contact Cruits vie email: admin@cruits.com ” - Close/Cancel button - Send Message Integration: - "Send Message" button opens message thread with placement context - See user story
8.4.1 (не MVP)¶
8.5 Chats Us¶
8.5 Messages In Review Preview¶
User Story:
As a manager I want to send and receive messages with candidates in dedicated threads with placement context So that I can efficiently communicate about placement status, documents, onboarding issues, and provide candidate support
Описание: The Chats feature (former Messages) enables managers to maintain threaded conversations with candidates. Each message thread displays the associated job context at the top, allowing managers to provide targeted support and quickly reference the work relationship. Managers can initiate conversations from applications/offers/placements, view full conversation history, and manage multiple candidate conversations in one centralized interface. alt size=16 style="background-blend-mode:normal;background-clip:content-box;background-position:50% 50%;background-color:rgba(0,0,0,0);background-image:var(--sf-img-11);background-size:100% 100%;background-origin:content-box;background-repeat:no-repeat"> BlinkSoftware [HF] [Main] Access Points: Primary: left panel > Chats Secondary: "Send Message" button from Applications, Offers, or Placements cards Tertiary: Candidate profile page Quaternary: “Unread Chats” from Task Center widget on Dashboard
Критерии приёмки: - Chats Page Header: - Page title: "Chats" - Filter & Search: - Filter drawer - Sort by newest / oldest (newest by default) - Filter by Job ID - Multi select list of all job IDs with at least 1 item - If there is 0 items in this Job ID + tab - hide the Job ID from the list of options - List with 3 parent items - Select All, Active Jobs and Archived Jobs - “Select All” - selects all Job IDs - Active Jobs & Archived Jobs - select all Job IDs of corresponding type - If filters are applied - “filter applied” indicator added (orange dot on funnel icon) - Search bar - search by candidate name and job posting - Search on type, 3 symbols minimum - nice to have - “clear search” [x] button → search bar is empty, search results cleared - Message Threads List (Left Panel): - The list displays all active and recent candidate conversations - List sorted by most recent message date (most recent at top) - Conversation search/filter as you type - Each conversation thread item shows: - Candidate photo/avatar (circular) - Green online indicator on avatar - nice to have - Grey offline indicator on avatar - nice to have - Candidate name - Associated job ID (e.g., "Warehouse Assistant") - Last message preview text (truncated to 1-2 lines) - Timestamp of last message (date and time) - Unread message indicator: - Orange dot on right side if unread messages from candidate - Unread count badge - nice to have - Bold text for threads with unread messages - nice to have - Click conversation → Opens thread detail view - Empty state message: - Icon showing message bubble - Text: "No messages yet" - Helper text: "Start a chat by sending a message from a candidate profile or application" - Message Thread Detail View (Main Area): - Header section (sticky at top): - Candidate name and photo (circular avatar) - Green online indicator on avatar - nice to have - Onboarding / Availability status badges - Job Context Section (directly under header): - Clear background color/container to distinguish from messages - Job ID (e.g., "Warehouse Assistant") - Start - End Dates (from Job posting for MVP) - Message Thread Area: - Chronological message list (oldest at top, newest at bottom) - Messages scroll upward to load history - Automatic scroll to bottom when new message arrives - Manager messages: - Aligned to right side - Orange (primary) color background - Slightly rounded corners or bubble style - Candidate messages: - Aligned to left side - Grey (secondary) background color - Slightly rounded corners - Sender name label: "[Candidate Name]" - Each message shows: - Message text content (full text, no truncation) - Timestamp (time only for today, date + time for previous) - Optional: - Message status indicator on manager messages: - Single checkmark: - Double checkmark: - Delivered - Double checkmark (different color or filled): Read - Emoji support - nice to have - Link preview (URLs auto-preview) - nice to have - Grouped messages from same sender without repeating name - nice to have - Message Composition Area (sticky at bottom): - Text input field: - Placeholder text: "Type a message..." - Auto-expand as text grows (multiline support) - Max height before scroll (3-4 lines max, then scrollable) - Send button (right side): - Arrow icon - Changes appearance while typing ( highlighted when text present) - Disabled appearance when empty - Tap to send - Attachment button - chain icon (left side): - Opens file attachment modal - File size limit - 25 Mb - No file type restrictions - Character counter & character limit - as for Worker side ? - Message Interaction Details: - On typing: - Send button disabled if message is empty or only whitespace - Send button enabled immediately when text is typed - Typing indicator - nice to have - On send: - Message appears immediately in thread (optimistic UI) - "Sending..." indicator briefly shown - Message status updates to "Sent" then "Delivered" - Input field clears - Composition area remains ready for next message - If send fails: - Error message displayed - Message remains in input field - Retry/send button available - Real-time message delivery: - New messages from candidate appear immediately - Notification sent (if enabled) - Thread auto-focuses to bottom to show new message - Message Notifications: - Real-time in-app notification when candidate sends message - for next epic to come - Message read receipt - nice to have - Manager can see when candidate reads message - Shown as message status indicator - Chat History & Scrolling: - Scroll up in thread to load older messages - Lazy loading: - Fetches messages in batches (20-50 per load) - Loading indicator at top while fetching history - Automatic load on scroll - All historical messages remain accessible - No message deletion/archival (messages persist) - Timestamps on every message - Desktop View: - Left sidebar: - Thread list (fixed width, scrollable) - Main area: - Active thread detail - Right panel: - Placement/job context details (optional) - Responsive breakpoints for tablet/medium screens - Error Handling: - Message send failure: - Error message: "Failed to send message" - Message stays in input for retry - "Retry" or automatic retry option - Network error: - Connection status indicator (offline/slow connection) - Queue message for send when connection restored - Candidate blocked or conversation error: - Appropriate error message displayed - Search & Filter: - Search within all messages and threads - Search by candidate name - Filter by job ID, by active and archived jobs - Search and filter show combined results - Search results show thread preview with highlighted matches - Search and filters have “Clear” button to clear the results and go back to initial state