Story 6.2: Agenda Proposal Screen
Header Information
Story: Epic 6, Story 6.2 - Partner Meeting Coordination Screen: Agenda Proposal Screen User Role: Partner Related FR: FR8 (Partner users vote on topic priorities and submit strategic topic suggestions), FR21 (Long-term planning capabilities including seasonal partner meeting coordination)
Visual Wireframe
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Close Propose Agenda Item β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Meeting: Q2 2025 Partner Planning Session β
β Date: April 15, 2025 β’ 14:00-17:00 β
β Submission Deadline: April 8, 2025 (7 days remaining) β
β β
β ββββ PROPOSAL DETAILS ββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Agenda Item Title * β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β e.g., AI Integration Strategy for 2025 Events β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β (Max 100 characters) β β
β β β β
β β Description * β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Discuss opportunities to integrate AI-powered features into β β β
β β β our events, including automated content recommendations, β β β
β β β intelligent speaker matching, and attendee engagement β β β
β β β analytics. We'll review pilot results from Q1 and propose β β β
β β β a phased rollout strategy for Q3-Q4. β β β
β β β β β β
β β β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β (Max 1000 characters β’ 182/1000 used) β β
β β β β
β β Expected Outcomes / Discussion Goals β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β’ Alignment on AI integration priorities β β β
β β β β’ Budget allocation approval for pilot expansion β β β
β β β β’ Timeline commitment for Q3 rollout β β β
β β β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β (Optional β’ bullet points recommended) β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ TIME & PRIORITY βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Estimated Duration * β β
β β β 15 minutes β 30 minutes β 45 minutes β 60 minutes β β
β β β Custom: [____] minutes β β
β β β β
β β Priority Level * β β
β β β High Critical topic requiring immediate discussion β β
β β β Medium Important but can be scheduled flexibly β β
β β β Low Nice to discuss if time permits β β
β β β β
β β Preferred Time Slot (Optional) β β
β β β Early in meeting (high energy for complex topics) β β
β β β Middle of meeting (balanced attention) β β
β β β Late in meeting (lighter topics or follow-up discussions) β β
β β β No preference β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ SUPPORTING MATERIALS ββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Upload materials to help organizers and other partners prepare β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β π AI_Pilot_Results_Q1.pdf [Remove] β β β
β β β 2.3 MB β’ Uploaded 2 min ago β β β
β β β β β β
β β β π Budget_Proposal_AI_Integration.xlsx [Remove] β β β
β β β 486 KB β’ Uploaded just now β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β π [Upload Files] or drag and drop here β β β
β β β β β β
β β β Accepted: PDF, PPTX, XLSX, DOCX β’ Max 20 MB per file β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ STRATEGIC CONTEXT βββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Link to Company Strategic Goals (Optional) β β
β β β Innovation & Digital Transformation β β
β β β Employee Development & Skills β β
β β β Cost Optimization & Efficiency β β
β β β Customer Experience Enhancement β β
β β β Sustainability & Social Responsibility β β
β β β Other: [_________________________________] β β
β β β β
β β Business Impact (Optional) β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β This initiative directly supports our 2025 digital β β β
β β β transformation roadmap and could improve employee engagement β β β
β β β by 25-30% based on industry benchmarks. β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ PARTICIPANT PREPARATION βββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Pre-Reading Required? β β
β β β Yes, materials should be reviewed in advance β β
β β β No, materials are for reference only β β
β β β β
β β Requested Participants (Optional) β β
β β β All partners (default) β β
β β β Specific partners: [Search partners... βΌ] β β
β β β β
β β β Request specific expertise/roles: β β
β β β Technical/IT leads β C-level executives β β
β β β HR/Training leads β Budget/Finance leads β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ SIMILAR PROPOSALS βββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β π‘ Other partners have proposed similar agenda items: β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β π "Machine Learning in Event Analytics" β β β
β β β Proposed by: Swisscom β’ Priority: High β’ 30 min β β β
β β β Overlap: AI/ML focus, analytics discussion β β β
β β β [View Proposal] [Suggest Merge] β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β π¬ Consider supporting their proposal or suggesting a combined β β
β β session to maximize meeting efficiency. β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ PROPOSAL SUMMARY ββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Review your proposal before submission: β β
β β β β
β β Title: AI Integration Strategy for 2025 Events β β
β β Duration: 45 minutes β β
β β Priority: Medium β β
β β Materials: 2 files attached (2.8 MB total) β β
β β Goals: Innovation & Digital Transformation, Employee Dev. β β
β β β β
β β β οΈ Your proposal will be reviewed by organizers within 48 hours β β
β β π§ You'll receive email confirmation when status changes β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β I confirm this proposal aligns with our partnership goals and β
β represents my organization's priorities for this meeting β
β β
β [Cancel] [Save as Draft] [Submit Proposal] β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key Interactive Elements
Form Controls
- Text Input Fields: Title (100 char max), Description (1000 char max), Expected Outcomes (rich text)
- Character Counters: Real-time character count with visual warning at 90% capacity
- Radio Button Groups: Duration selection (15/30/45/60 min + custom), Priority levels (High/Medium/Low), Time slot preferences
- Checkboxes: Strategic goals (multi-select), participant requirements, pre-reading toggle
- File Upload Zone: Drag-and-drop area with browse button, progress indicators, file preview with remove option
Smart Features
- Auto-Save: Form data auto-saved to localStorage every 30 seconds to prevent data loss
- Duplicate Detection: Real-time similarity check against existing proposals, shows similar items with merge suggestions
- Character Validation: Live validation with helpful error messages (e.g., βTitle too long, 25 characters over limitβ)
- File Validation: Client-side validation for file type and size before upload, visual feedback for accepted/rejected files
Action Buttons
- [Cancel]: Discard proposal with confirmation dialog if unsaved changes exist
- [Save as Draft]: Save proposal without submitting, allowing later editing
- [Submit Proposal]: Final submission with validation check and confirmation modal
- [Upload Files]: Opens file browser or accepts drag-and-drop uploads
- [Remove]: Removes uploaded file with confirmation
- [View Proposal]: Opens similar proposal in modal overlay
- [Suggest Merge]: Initiates merge request with another proposal
Visual Indicators
- Required Field Markers (*): Red asterisk indicates mandatory fields
- Validation Icons: Green checkmark for valid, red X for invalid fields
- Progress Indicator: Shows completion percentage (e.g., β60% completeβ)
- Deadline Countdown: Visual countdown showing days/hours remaining until submission deadline
Functional Requirements Met
- FR8 (Topic Voting & Suggestions): Partners can submit strategic agenda item suggestions for partner meetings, influencing meeting content and priorities
- FR21 (Long-term Planning): Seasonal partner meeting coordination with structured agenda proposal workflow enables strategic partnership management
- FR2 (Event Workflow): Proposal submission integrates with meeting planning workflow, allowing organizers to review and approve agenda items
- FR7 (Email Notifications): Automated email notifications for proposal status changes (submitted, under review, approved/declined)
User Interactions
Opening the Proposal Form
- User clicks [Propose Agenda Item] button from Partner Meetings Hub
- System checks proposal submission deadline (must be at least 48 hours before meeting)
- If deadline passed: Display error modal βAgenda proposal deadline has passed for this meetingβ
- If deadline valid: Load Agenda Proposal Screen with meeting context pre-filled
- Form displays with empty fields and meeting details at top
Filling Out Proposal Details
- User enters Agenda Item Title (required)
- Character counter updates in real-time
- Warning displays at 90 characters (90% of limit)
- Error displays if exceeding 100 characters
- User enters Description (required)
- Rich text editor with basic formatting (bold, italic, bullets)
- Character counter shows usage (e.g., β182/1000 usedβ)
- Auto-expands textarea as content grows
- User enters Expected Outcomes (optional)
- Bullet point format recommended (auto-formatting)
- Helps organizers understand discussion goals
Setting Time and Priority
- User selects Estimated Duration
- Radio button selection (15/30/45/60 min or custom)
- If βCustomβ selected: Input field appears for manual entry (max 120 min)
- Duration validation: Warns if total proposed durations exceed meeting time
- User selects Priority Level
- High: Critical topic requiring immediate discussion
- Medium: Important but flexible scheduling
- Low: Nice to discuss if time permits
- Help tooltips explain each priority level
- User selects Preferred Time Slot (optional)
- Early/Middle/Late/No preference
- System considers preferences when scheduling but doesnβt guarantee placement
Uploading Supporting Materials
- User clicks [Upload Files] or drags files into upload zone
- File validation runs:
- Type check: PDF, PPTX, XLSX, DOCX accepted
- Size check: Max 20 MB per file, 100 MB total
- If invalid: Error toast with specific reason (e.g., βFile type .txt not acceptedβ)
- Valid files upload with progress bar
- Uploaded files appear in list with:
- File icon based on type
- File name (truncated if long)
- File size
- Upload timestamp
- [Remove] button
- User can remove files by clicking [Remove] (confirmation required if file > 5 MB)
Adding Strategic Context
- User selects Strategic Goals (checkboxes)
- Multi-select allowed
- βOtherβ option opens text field for custom goal
- User describes Business Impact (optional)
- Free-form text area
- Helps justify proposal importance
- Used by organizers in approval process
Participant Preparation Settings
- User toggles Pre-Reading Required
- Yes: Materials should be reviewed in advance
- No: Materials are for reference only
- Affects when materials are distributed (if Yes: 1 week before, if No: day before)
- User selects Requested Participants
- Default: All partners invited to meeting
- Optional: Search and select specific partners
- Optional: Request specific expertise/roles (checkboxes)
Duplicate Detection & Merge Suggestions
- As user types Title and Description, system performs similarity check
- If similar proposals found (>70% text similarity or same keywords):
- Similar Proposals section appears
- Shows matching proposals with:
- Proposal title
- Proposer company
- Priority and duration
- Overlap summary
- [View Proposal] button opens modal with full details
- [Suggest Merge] button initiates merge request workflow
- User can:
- View similar proposal and adjust their own to differentiate
- Suggest merging proposals into combined session
- Continue with separate proposal if topics genuinely different
Reviewing and Submitting
- User reviews Proposal Summary (auto-generated)
- Shows all key details in condensed format
- Highlights any validation warnings
- User checks Confirmation Checkbox (required)
- βI confirm this proposal aligns with our partnership goalsβ¦β
- Cannot submit without checking
- User clicks [Submit Proposal]
- Final validation runs:
- All required fields completed
- Files successfully uploaded (no pending uploads)
- Character limits respected
- Confirmation checkbox checked
- If validation fails:
- Error summary modal displays
- Scroll to first invalid field
- Highlight invalid fields in red
- If validation passes:
- Confirmation modal appears:
Submit Agenda Proposal? Your proposal "AI Integration Strategy for 2025 Events" will be sent to meeting organizers for review. You'll receive email confirmation within 48 hours. [Go Back] [Confirm Submission]
- Confirmation modal appears:
- On confirmation:
- API call executes (
POST /api/v1/partners/{partnerId}/meetings/{meetingId}/agenda/propose) - Success notification displays
- Email confirmation sent to user
- Screen closes, returns to Partner Meetings Hub
- Proposal appears in βYour Proposalsβ section with βUnder Reviewβ status
- API call executes (
Saving as Draft
- User clicks [Save as Draft] at any time
- Partial validation runs (required fields not enforced)
- Draft saved to database with βDRAFTβ status
- Success toast: βDraft saved successfullyβ
- User can:
- Continue editing
- Close screen (draft accessible later)
- Submit when ready
Canceling Proposal
- User clicks [Cancel] or close button (β)
- If unsaved changes detected:
- Confirmation dialog appears:
Discard Changes? You have unsaved changes. Do you want to save as draft before closing? [Discard] [Save Draft] [Keep Editing]
- Confirmation dialog appears:
- If no changes: Screen closes immediately
- If [Discard]: Screen closes, changes lost
- If [Save Draft]: Draft saved, then screen closes
- If [Keep Editing]: Dialog closes, user continues editing
Technical Notes
Frontend Implementation
- Framework: React 18.2 with TypeScript, Material-UI components (Modal, TextField, Radio, Checkbox, FileUpload)
- Form Management: React Hook Form with Zod schema validation for robust type-safe form handling
- Rich Text Editor: Draft.js or Slate.js for description field with basic formatting
- File Upload: Direct browser-to-S3 presigned URL upload (via Company Management API)
- Auto-Save: localStorage backup every 30s, synced with server on Submit/Save Draft
- Real-Time Validation: Debounced validation (500ms) to reduce API calls while providing immediate feedback
Duplicate Detection
- Algorithm: Cosine similarity on TF-IDF vectors of title + description text
- Threshold: 70% similarity triggers βsimilar proposalβ alert
- Keyword Matching: Exact matches on key terms (e.g., βAIβ, βbudgetβ, βstrategyβ) boost similarity score
- API:
POST /api/v1/meetings/{meetingId}/agenda/proposals/check-similaritywith proposal text - Response: List of similar proposals with similarity scores and overlap summaries
File Upload Process
- User selects files
- Frontend validates file type and size
- Request presigned upload URL:
POST /api/v1/files/presigned-upload-url - Direct upload to S3 using presigned URL (client-side)
- Confirm upload completion:
POST /api/v1/files/{fileId}/confirm - Attach file IDs to proposal on submission
- S3 lifecycle policy: Delete files if proposal not submitted within 7 days (cleanup orphaned files)
Character Limit Enforcement
- Client-Side:
maxLengthattribute on inputs, disabled submit if exceeded - Server-Side: Database column constraints, validation layer rejects oversized content
- User Feedback: Character counter changes color (green β yellow at 80% β red at 100%)
State Management
- Local State: React Hook Form for form fields, file upload progress
- Server State: React Query for meeting details, existing proposals, similarity checks
- Persistent State: localStorage for draft backup, restored on page reload
- Cache Strategy:
- Meeting details: 5 min cache
- Existing proposals: 2 min cache, invalidated on new submission
- Similarity check: No cache (always fresh)
Performance Optimization
- Debounced Similarity Check: 1 second debounce on title/description changes
- Lazy Load Similar Proposals: Only fetch on first similarity match
- File Upload Chunking: Large files (>10 MB) uploaded in chunks for reliability
- Optimistic UI Updates: Draft saves show success immediately, rollback on API failure
API Requirements
Initial Page Load APIs
-
GET /api/v1/partners/{partnerId}/meetings/{meetingId}?include=agenda,participants (Story 1.18)
- Consolidation: Uses
?include=pattern to fetch meeting details with agenda and participants in single request - Authorization: Requires
PARTNERrole - Query Params:
include=agenda,participants(expanded data)
- Returns: Meeting context for proposal formjson
{ "meetingId": "meeting-123", "title": "Q2 2025 Partner Planning Session", "date": "2025-04-15T14:00:00Z", "endTime": "2025-04-15T17:00:00Z", "location": "UBS Conference Center, Zurich", "agendaProposalDeadline": "2025-04-08T23:59:59Z", "totalDuration": 180, "allocatedDuration": 135, "availableDuration": 45, "organizerName": "Event Organizer Team", "organizerEmail": "organizers@batbern.ch", "agenda": { "items": [...], "totalProposals": 12 }, "participants": [...] } - Used for: Populate meeting context header, validate submission deadline, show available time, display existing agenda items
- Performance: <400ms (P95) for meeting with all included data
- Consolidation Benefit: Single request replaces 3 separate calls (meeting details, agenda, participants)
- Consolidation: Uses
-
GET /api/v1/partners/{partnerId}?include=settings (Story 1.18)
- Consolidation: Uses consolidated Partners API to fetch strategic goals from settings
- Authorization: Requires
PARTNERrole - Query Params:
include=settings(includes strategic goals configuration)
- Returns: Partner company information with strategic goalsjson
{ "companyId": "comp-456", "goals": [ { "id": "goal-1", "name": "Innovation & Digital Transformation", "description": "Driving digital innovation across all business units", "active": true }, { "id": "goal-2", "name": "Employee Development & Skills", "description": "Upskilling workforce for future readiness", "active": true }, // ... other goals ], "customGoalsAllowed": true } - Used for: Pre-populate strategic goals checkboxes with company-specific goals
-
GET /api/v1/partners/{partnerId}/meetings/{meetingId}/proposals/drafts
- Authorization: Requires
PARTNERrole - Query Params: None
- Returns: Userβs saved drafts for this meeting (if any)json
{ "drafts": [ { "draftId": "draft-789", "title": "AI Integration Strategy", "lastSaved": "2025-04-01T10:30:00Z", "completeness": 0.6 } ] } - Used for: Prompt user to continue existing draft if found
- Authorization: Requires
User Action APIs
-
POST /api/v1/partners/{partnerId}/meetings/{meetingId}/agenda/propose
- Triggered by: [Submit Proposal] button click after validation
- Authorization: Requires
PARTNERrole, partner must be invited to meeting - Payload:json
{ "title": "AI Integration Strategy for 2025 Events", "description": "Discuss opportunities to integrate AI-powered features...", "expectedOutcomes": "β’ Alignment on AI integration priorities\nβ’ Budget allocation approval...", "estimatedDurationMinutes": 45, "priority": "medium", "preferredTimeSlot": "middle", "supportingMaterialFileIds": ["file-123", "file-456"], "strategicGoalIds": ["goal-1", "goal-2"], "businessImpact": "This initiative directly supports our 2025 digital transformation...", "preReadingRequired": true, "requestedParticipants": "all", "requestedExpertise": ["technical_leads", "hr_leads"], "confirmationAcknowledged": true } - Validation:
- Title: Required, 1-100 characters
- Description: Required, 1-1000 characters
- Duration: Required, 15-120 minutes
- Priority: Required, enum [high, medium, low]
- File IDs must exist and belong to requesting partner
- Proposal deadline must not have passed
- Confirmation must be true
- Response (201 Created):json
{ "proposalId": "proposal-987", "status": "UNDER_REVIEW", "submittedAt": "2025-04-01T14:35:00Z", "estimatedReviewDate": "2025-04-03T14:35:00Z", "reviewers": ["organizer@batbern.ch"], "emailConfirmationSent": true } - Error Response (400 Bad Request):json
{ "error": "VALIDATION_FAILED", "message": "Proposal validation failed", "details": [ { "field": "title", "message": "Title exceeds maximum length of 100 characters" }, { "field": "estimatedDurationMinutes", "message": "Total proposed duration (245 min) exceeds available meeting time (45 min)" } ] } - Error Response (409 Conflict):json
{ "error": "DEADLINE_PASSED", "message": "Agenda proposal deadline has passed", "deadline": "2025-04-08T23:59:59Z", "currentTime": "2025-04-09T10:00:00Z" } - Used for: Submit final agenda proposal, trigger organizer review workflow
-
POST /api/v1/partners/{partnerId}/meetings/{meetingId}/agenda/proposals/check-similarity
- Triggered by: Real-time as user types title/description (debounced 1s)
- Authorization: Requires
PARTNERrole - Payload:json
{ "title": "AI Integration Strategy for 2025 Events", "description": "Discuss opportunities to integrate AI-powered features..." } - Response:json
{ "similarProposals": [ { "proposalId": "proposal-456", "title": "Machine Learning in Event Analytics", "proposedBy": { "companyName": "Swisscom", "companyId": "comp-789" }, "priority": "high", "estimatedDurationMinutes": 30, "similarityScore": 0.78, "overlapSummary": "AI/ML focus, analytics discussion", "keywords": ["AI", "machine learning", "analytics"] } ], "hasDuplicates": true, "mergeRecommended": true } - Used for: Detect similar proposals, suggest merges, prevent duplicate agenda items
-
POST /api/v1/partners/{partnerId}/meetings/{meetingId}/agenda/proposals/draft
- Triggered by: [Save as Draft] button or auto-save (every 30s)
- Authorization: Requires
PARTNERrole - Payload: Same structure as proposal submission, but required fields not enforcedjson
{ "draftId": "draft-789", "title": "AI Integration Strategy", "description": "Discuss opportunities...", "estimatedDurationMinutes": 45, "priority": "medium", "supportingMaterialFileIds": ["file-123"], "lastSaved": "2025-04-01T14:30:00Z" } - Response:json
{ "draftId": "draft-789", "saved": true, "savedAt": "2025-04-01T14:30:00Z", "completeness": 0.6, "missingRequiredFields": ["expectedOutcomes", "strategicGoalIds"] } - Used for: Save incomplete proposals for later editing, prevent data loss
-
PUT /api/v1/partners/{partnerId}/meetings/{meetingId}/agenda/proposals/{proposalId}/support
- Triggered by: [Support This Proposal] button on similar proposal
- Authorization: Requires
PARTNERrole, different from proposal author - Payload:json
{ "supportComment": "We also see value in this discussion and would contribute budget data" } - Response:json
{ "proposalId": "proposal-456", "supportCount": 3, "supportingPartners": ["UBS", "Credit Suisse", "Swiss Re"], "yourSupport": true, "increasedPriority": true } - Used for: Express support for other partnersβ proposals, increase priority through consensus
-
POST /api/v1/partners/{partnerId}/meetings/{meetingId}/agenda/proposals/merge-request
- Triggered by: [Suggest Merge] button on similar proposal
- Authorization: Requires
PARTNERrole - Payload:json
{ "proposalId1": "proposal-987", "proposalId2": "proposal-456", "mergedTitle": "AI & Machine Learning Strategy for 2025", "mergedDescription": "Combined session covering AI integration and ML analytics...", "combinedDurationMinutes": 60, "justification": "Both proposals share AI/ML focus, combining allows deeper discussion" } - Response:json
{ "mergeRequestId": "merge-123", "status": "PENDING_APPROVAL", "requiresApproval": ["partner-987", "partner-456", "organizer"], "notificationsSent": true } - Used for: Request merging similar proposals into combined agenda item
-
POST /api/v1/files/upload (Story 1.27)
- Consolidation: Simplified file upload with presigned URL pattern
- Triggered by: File selection in upload zone
- Authorization: Requires authenticated user
- Payload:json
{ "fileName": "AI_Pilot_Results_Q1.pdf", "fileSize": 2400000, "contentType": "application/pdf", "context": "AGENDA_PROPOSAL", "contextId": "meeting-123" } - Response:json
{ "fileId": "file-123", "uploadUrl": "https://s3.eu-central-1.amazonaws.com/batbern-content/...", "uploadFields": { "key": "proposals/meeting-123/file-123.pdf", "policy": "...", "x-amz-signature": "..." }, "expiresAt": "2025-04-01T15:30:00Z", "cdnUrl": "https://d3tsrt2aaweqwh.cloudfront.net/proposals/meeting-123/file-123.pdf" } - Used for: Generate presigned S3 upload URL for direct client-to-S3 upload
- Performance: <200ms (P95)
- Consolidation Benefit: Single endpoint handles presigned URL generation and file metadata
-
DELETE /api/v1/files/{fileId} (Story 1.27)
- Consolidation: Standard file deletion endpoint
- Triggered by: [Remove] button on uploaded file
- Authorization: Requires authenticated user, file owner
- Payload: None
- Response:json
{ "fileId": "file-123", "deleted": true, "deletedAt": "2025-04-01T14:32:00Z" } - Used for: Remove uploaded file before proposal submission
- Consolidation Benefit: Simplified file management (upload confirmation integrated into initial upload endpoint)
Navigation Map
Primary Navigation Actions
-
β Close button / [Cancel] β Close modal, return to
Partner Meetings Hub- Target:
story-6.2-partner-meetings.md(Partner Meetings screen) - Context: None if discarding, draft ID if saved
- Unsaved Changes: Prompt with βDiscard Changes?β dialog if form dirty
- Behavior: Modal closes, underlying Partner Meetings Hub remains in view
- Target:
-
[Submit Proposal] β Submit proposal, show confirmation, close modal
- Action: Execute proposal submission API
- Success Flow:
- Confirmation modal appears: βProposal submitted successfullyβ
- Email confirmation sent notification
- Modal closes after 2 seconds
- Partner Meetings Hub refreshes to show new proposal in βYour Proposalsβ section
- Failure Flow:
- Error modal with specific validation errors
- Remain on Agenda Proposal Screen
- Highlight invalid fields
-
[Save as Draft] β Save draft, remain on screen
- Action: Execute draft save API
- Success: Toast notification βDraft savedβ, update last saved timestamp
- Failure: Error toast with retry option
- Behavior: Form remains open for continued editing
Secondary Navigation (Data Interactions)
-
[View Proposal] button in Similar Proposals β Open proposal detail modal
- Target: Modal overlay showing full similar proposal details
- Content:
- Complete proposal information (title, description, outcomes, duration, priority)
- Proposer company information
- Similarity analysis (overlap keywords, shared topics)
- Support count and supporting partners
- Actions: [Close], [Support This Proposal], [Suggest Merge]
- Behavior: Modal over modal (Proposal Detail over Agenda Proposal Screen)
-
[Suggest Merge] button β Open merge request modal
- Target: Modal overlay for merge request form
- Content:
- Preview of both proposals side-by-side
- Merged title/description editor
- Combined duration calculation
- Justification text field
- Actions: [Cancel], [Send Merge Request]
- Behavior: On send, merge request API called, notifications sent to affected parties
-
File name click in uploaded materials β Preview or download file
- Behavior:
- PDFs: Open in browser preview modal
- Office docs (PPTX, XLSX, DOCX): Trigger download
- Images: Open in lightbox viewer
- No Navigation: Remains on Agenda Proposal Screen
- Behavior:
-
Strategic Goal βOtherβ text field β Enable custom goal input
- Trigger: Checking βOtherβ checkbox enables text input
- Behavior: User can type custom strategic goal (max 100 chars)
- Validation: Required if βOtherβ checked, auto-added to company goals library
- No Navigation: Remains on Agenda Proposal Screen
Event-Driven Navigation
-
Auto-save triggers β Background save, no navigation
- Trigger: 30 second timer or before window close
- Action: Silent draft save API call
- Notification: Small toast βDraft savedβ in bottom-right corner (non-intrusive)
- Failure: Retry up to 3 times, then warn user βUnable to auto-save. Please save manually.β
- No Navigation: Remains on current screen
-
Similar proposal detected β Show Similar Proposals section
- Trigger: Similarity check API returns matches (>70% similarity)
- Behavior: Similar Proposals section animates into view
- Notification: Info toast βWe found similar proposals. Consider merging or supporting existing items.β
- No Navigation: Remains on Agenda Proposal Screen
-
Proposal deadline approaching (24 hours) β Urgency indicator
- Trigger: Time-based check (frontend timer)
- Behavior:
- Deadline text changes color to red
- Warning banner appears: ββ οΈ Proposal deadline in 24 hoursβ
- [Submit Now] button highlighted
- No Navigation: Remains on current screen
-
File upload complete β Update file list
- Trigger: S3 upload success callback
- Behavior:
- Progress bar changes to checkmark
- File appears in uploaded materials list
- Success toast βFile uploaded successfullyβ
- No Navigation: Remains on Agenda Proposal Screen
-
File upload failed β Show error and retry option
- Trigger: S3 upload error callback
- Behavior:
- Progress bar changes to error icon
- Error toast with specific reason βUpload failed: File too large / Network error / Invalid typeβ
- [Retry Upload] button appears
- No Navigation: Remains on Agenda Proposal Screen
Error States & Redirects
-
Unauthorized access (403) β Redirect to Partner Dashboard
- Condition: User is not a partner or not invited to this meeting
- Notification: βYou donβt have permission to propose agenda items for this meeting.β
- Redirect: After 3 seconds, navigate to Partner Dashboard
- Target: Partner Dashboard (if wireframe exists, otherwise main app home)
-
Meeting not found (404) β Redirect to Partner Meetings Hub
- Condition: Meeting ID invalid or meeting deleted
- Notification: βMeeting not found. It may have been cancelled or deleted.β
- Redirect: Immediate navigation to Partner Meetings Hub
- Target:
story-6.2-partner-meetings.md
-
Proposal deadline passed (409) β Close modal with error
- Condition: Server validation detects deadline passed since modal opened
- Modal:
Deadline Passed The agenda proposal deadline for this meeting has passed. You can no longer submit new proposals. Deadline: April 8, 2025 at 11:59 PM [View Meeting Details] [Close] - [View Meeting Details]: Navigate to read-only meeting details
- [Close]: Close modal, return to Partner Meetings Hub
-
Session timeout (401) β Save draft, redirect to login
- Condition: JWT token expired during form editing
- Behavior:
- Attempt to save draft to localStorage (client-side backup)
- Display modal: βYour session has expired. Your draft has been saved locally and will be restored after login.β
- Redirect to login page
- After login: Restore from localStorage and prompt βWould you like to continue your unsaved proposal?β
-
Network error β Save locally, show offline indicator
- Condition: API calls fail due to network issues
- Behavior:
- Save form data to localStorage
- Show offline banner: βYou appear to be offline. Your changes are saved locally.β
- Display [Retry Connection] button
- When connection restored: Sync local changes to server
- No Navigation: Remains on Agenda Proposal Screen with offline mode active
-
Validation error (400) β Highlight errors inline
- Condition: Server-side validation fails on submission
- Behavior:
- Parse error response for field-specific errors
- Scroll to first invalid field
- Display inline error messages below each field
- Show error summary at top: βPlease fix 3 errors before submittingβ
- [Submit Proposal] button remains enabled for retry
- No Navigation: Remains on current screen for error correction
Responsive Design Considerations
Mobile Layout Changes (< 768px)
- Form Sections: Stack vertically, full width
- Radio Button Groups: Convert to dropdown selects to save vertical space
- Duration: Dropdown with β15 minβ, β30 minβ, β45 minβ, β60 minβ, βCustomβ options
- Priority: Dropdown with βHighβ, βMediumβ, βLowβ
- Time Slot: Dropdown or hidden on mobile (less critical on small screens)
- File Upload Zone: Full-width, larger touch target (min 60px height)
- Supporting Materials List: Cards instead of rows, with swipe-to-delete gesture
- Similar Proposals: Collapsible accordion, show summary only until expanded
- Action Buttons: Sticky footer with full-width buttons stacked vertically
- [Cancel] top
- [Save as Draft] middle
- [Submit Proposal] bottom (primary action)
- Character Counters: Move below text fields instead of inline
- Strategic Goals Checkboxes: Group in collapsible section to reduce screen height
Tablet Layout Changes (768px - 1024px)
- Two-Column Layout: Split form into left (main content) and right (context/summary) columns
- Radio Buttons: Remain horizontal for Duration and Priority
- File Upload: Half-width zone with file list adjacent
- Similar Proposals: Side-by-side cards (2 per row)
- Action Buttons: Bottom-right aligned, horizontal layout:
- [Cancel] left, [Save as Draft] center, [Submit Proposal] right
Mobile-Specific Interactions
- Pull-to-Refresh: Not applicable (modal form, no refresh needed)
- Swipe Gestures:
- Swipe left on uploaded file β Reveal [Remove] button
- Swipe down from top of modal β Close modal (with unsaved changes warning)
- Touch Targets: All interactive elements minimum 44x44px
- Virtual Keyboard: Form auto-scrolls to keep focused input visible above keyboard
- File Upload: Mobile allows βTake Photoβ option in addition to file selection
- Voice Input: Enable voice-to-text for description and business impact fields (browser native)
Accessibility Notes
- Keyboard Navigation:
- Full tab navigation through all form fields in logical order
- Enter key submits form when on [Submit Proposal] button
- Escape key closes modal (with unsaved changes warning)
- Arrow keys navigate radio button groups
- Focus Management:
- On modal open: Focus moves to first input (Title field)
- On modal close: Focus returns to trigger element (Propose Agenda Item button)
- On error: Focus moves to first invalid field
- ARIA Labels:
- Required fields:
aria-required="true"and visual asterisk - Character counters:
aria-live="polite"announce remaining characters - File upload zone:
aria-label="Upload supporting materials, accepts PDF, PowerPoint, Excel, Word, maximum 20 megabytes per file" - Similar proposals:
aria-label="Similar proposal: Machine Learning in Event Analytics by Swisscom"
- Required fields:
- Error Messaging:
- Invalid fields:
aria-invalid="true"andaria-describedbylinking to error message - Error summary:
role="alert"for immediate announcement - Field-specific errors: Associated via
aria-describedbyto input
- Invalid fields:
- Color Contrast:
- All text meets WCAG 2.1 AA standards (4.5:1 for normal text)
- Error states use both color (red) and icon (β οΈ) for colorblind users
- Focus indicators: 3px solid outline with 3:1 contrast ratio
- Screen Reader Support:
- Form progress announced: βForm 60% complete, 4 of 10 required fields filledβ
- File upload status: βUploading AI_Pilot_Results.pdf, 45% completeβ
- Similarity detection: β2 similar proposals found, review suggestedβ
- Auto-save: βDraft saved automatically at 2:30 PMβ
- Semantic HTML:
- Proper heading hierarchy (h1 for modal title, h2 for section headers)
<fieldset>and<legend>for radio button groups<label>elements explicitly associated with inputs<button>elements (not divs) for all actions
State Management
Local Component State
formData: Object containing all form field values (title, description, duration, priority, etc.)uploadedFiles: Array of uploaded file objects with metadata (id, name, size, uploadProgress)validationErrors: Object mapping field names to error messagesisDirty: Boolean indicating unsaved changes (triggers warning on close)isSaving: Boolean for save/submit loading stateisAutoSaving: Boolean for auto-save loading indicatorsimilarProposals: Array of detected similar proposalsshowSimilarProposals: Boolean to control Similar Proposals section visibilitydraftId: String ID if continuing existing draftlastSaved: Timestamp of last successful save (auto or manual)
Global State (Zustand Store)
currentPartner: Partner company information (id, name, tier, strategic goals)currentUser: User information (id, name, email, role)meetingContext: Current meeting details (from parent screen)userDrafts: Array of userβs saved drafts across all meetings (for quick access)
Server State (React Query)
-
Query Keys:
['meeting', meetingId, 'details']: Meeting details (5 min cache)['partner', partnerId, 'strategic-goals']: Company strategic goals (30 min cache)['meeting', meetingId, 'proposals', 'drafts']: Userβs drafts (no cache, always fresh)['meeting', meetingId, 'similarity-check']: Similarity results (1 min cache)
-
Mutations:
submitProposal: Invalidates['meeting', meetingId, 'proposals']query on successsaveDraft: Invalidates['meeting', meetingId, 'proposals', 'drafts']queryuploadFile: No cache invalidation, updates localuploadedFilesstatedeleteFile: Removes from localuploadedFilesstatecheckSimilarity: No cache, updates localsimilarProposalsstate
Real-Time Updates
- Auto-Save Polling: Every 30 seconds (configurable via
AUTO_SAVE_INTERVAL_MS) - Similarity Check: Debounced 1 second after last keystroke in title/description fields
- Deadline Countdown: Client-side timer updates every minute, visual urgency at <24 hours
- File Upload Progress: Real-time progress updates via S3 upload events
Form Validation Rules
Field-Level Validations
-
Title:
- Required: Cannot be empty
- Min Length: 10 characters
- Max Length: 100 characters
- Pattern: Alphanumeric with spaces, hyphens, basic punctuation allowed
- Trim: Leading/trailing whitespace removed
-
Description:
- Required: Cannot be empty
- Min Length: 50 characters (ensures sufficient detail)
- Max Length: 1000 characters
- Pattern: Rich text with basic formatting, no scripts/iframes
-
Expected Outcomes:
- Optional: Can be empty
- Max Length: 500 characters
- Recommended: Bullet point format (helpful hint shown)
-
Estimated Duration:
- Required: Must select a value
- Range: 15-120 minutes
- Custom: If selected, must be positive integer
- Validation: Cannot exceed available meeting time
-
Priority Level:
- Required: Must select High, Medium, or Low
- No additional validation
-
Preferred Time Slot:
- Optional: Can be left unselected
- Default: βNo preferenceβ
-
Supporting Materials:
- Optional: 0-10 files allowed
- File Type: PDF, PPTX, XLSX, DOCX only
- File Size: Max 20 MB per file, 100 MB total
- Validation: Type and size checked client-side before upload
-
Strategic Goals:
- Optional: 0-n selections allowed
- βOtherβ custom goal: Max 100 characters if specified
-
Business Impact:
- Optional: Can be empty
- Max Length: 500 characters
-
Pre-Reading Required:
- Required: Must select Yes or No (default: Yes)
-
Requested Participants:
- Optional: Default βAll partnersβ
- Validation: If specific partners selected, at least 1 required
-
Requested Expertise:
- Optional: 0-n selections allowed
-
Confirmation Checkbox:
- Required: Must be checked to submit (cannot submit until checked)
Form-Level Validations
-
Total Duration Check: Sum of all proposed agenda items (including this one) cannot exceed meeting total time
- Example: Meeting is 180 min, 135 min already allocated β max 45 min for new proposal
- Error: βTotal proposed duration (245 min) exceeds available meeting time (45 min remaining)β
-
Duplicate Title Check: Title cannot match existing proposal title exactly (case-insensitive)
- Error: βAn agenda item with this title already exists. Please use a unique title.β
-
File Upload Completion: All files must finish uploading before submission
- Error: βFile uploads in progress. Please wait for uploads to complete.β
-
Deadline Validation: Current time must be before agenda proposal deadline
- Error: βProposal deadline has passed (deadline was April 8, 2025 at 11:59 PM)β
-
Strategic Context: If strategic goals selected, business impact description recommended (warning, not error)
- Warning: βConsider adding business impact description to strengthen your proposalβ
Edge Cases & Error Handling
Empty States
- No Strategic Goals: If company has no strategic goals defined, show message βYour company has not defined strategic goals. You can add custom goals using the βOtherβ option.β
- No Similar Proposals: Similar Proposals section hidden if no matches found (>70% similarity threshold)
- No Uploaded Files: Upload zone displayed prominently with helpful text βAdd supporting materials to help organizers understand your proposalβ
Loading States
- Initial Load: Modal displays with loading skeleton for meeting details and strategic goals
- Saving Proposal: [Submit Proposal] button shows spinner and text changes to βSubmittingβ¦β
- Auto-Saving: Small spinner in top-right corner with βSaving draftβ¦β text (non-intrusive)
- File Uploading: Progress bar per file with percentage and βUploadingβ¦β text
- Similarity Check: Debounced loading indicator next to title field (small spinner, disappears after check)
Error States
-
API Unavailable (503):
- Modal: βService temporarily unavailable. Your draft is saved locally and will sync when service is restored.β
- Enable offline mode: All changes saved to localStorage
- Periodic retry: Attempt to reconnect every 30 seconds
- Visual indicator: Offline banner at top of form
-
File Upload Failed:
- Show error icon on failed file with reason (Network error, File too large, Invalid type)
- [Retry Upload] button appears next to failed file
- Option to remove failed file and try again
- Error persists: Suggest reducing file size or using different format
-
Validation Failed (400):
- Scroll to first invalid field
- Highlight all invalid fields with red border and error icon
- Show inline error message below each invalid field
- Display error summary banner at top: βPlease fix 3 errors before submittingβ
- [Submit Proposal] remains enabled for retry after corrections
-
Duplicate Proposal (409):
- Modal: βA similar proposal has been submitted while you were editing. Would you like to:β
- [View Similar Proposal] β Open comparison view
- [Modify Your Proposal] β Return to editing
- [Suggest Merge] β Initiate merge request
- [Submit Anyway] β Force submit as separate item
- Modal: βA similar proposal has been submitted while you were editing. Would you like to:β
-
Deadline Extension:
- If organizers extend deadline while user has modal open, show notification:
- βGood news! The proposal deadline has been extended to April 10, 2025.β
- Update deadline countdown automatically
- If organizers extend deadline while user has modal open, show notification:
Permission Issues
-
Partner Access Revoked Mid-Session:
- Modal: βYour partnership access has been updated. You can no longer submit proposals for this meeting.β
- Auto-save draft to localStorage before closing
- Redirect to Partner Dashboard after 5 seconds
-
Meeting Cancelled:
- Modal: βThis meeting has been cancelled. Agenda proposals are no longer accepted.β
- Option to save proposal as template for future meetings
- Redirect to Partner Meetings Hub
Data Integrity
-
Concurrent Editing:
- If user opens same draft in multiple tabs, show warning:
- βThis draft is open in another tab. Changes may conflict.β
- βWhich version do you want to keep: [This Tab] [Other Tab] [Merge Changes]β
- If user opens same draft in multiple tabs, show warning:
-
File Corruption:
- If uploaded file fails integrity check (checksum mismatch):
- Error: βFile upload verification failed. Please re-upload the file.β
- File removed from list automatically
- User prompted to upload again
- If uploaded file fails integrity check (checksum mismatch):
-
LocalStorage Quota Exceeded:
- If auto-save to localStorage fails due to quota:
- Warning: βUnable to save draft locally. Consider submitting now or saving draft to server.β
- Disable auto-save, rely on manual [Save as Draft] button
- Show persistent warning banner until issue resolved
- If auto-save to localStorage fails due to quota:
Meeting Time Constraints
-
Available Time Exceeded:
- Real-time check: If total proposed durations exceed available time, show warning:
- βWarning: Total proposed durations (245 min) exceed available time (45 min). Organizers may reduce durations or schedule additional meeting time.β
- Allow submission but flag proposal for organizer review
- Real-time check: If total proposed durations exceed available time, show warning:
-
Too Many Proposals:
- If meeting has 20+ proposed agenda items:
- Info banner: βThis meeting has many proposed items. Consider supporting existing proposals instead of adding new ones.β
- Highlight similar proposals more prominently
- If meeting has 20+ proposed agenda items:
Browser Compatibility
-
File Upload Fallback:
- If drag-and-drop not supported: Show standard file input button only
- If FormData API unavailable: Disable file uploads, show message βFile uploads not supported in this browser. Please use a modern browser.β
-
LocalStorage Unavailable:
- If localStorage blocked or unavailable:
- Disable auto-save feature
- Show warning: βAuto-save disabled. Please save drafts manually.β
- Rely entirely on server-side draft saves
- If localStorage blocked or unavailable:
Change Log
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-04-01 | 1.0 | Initial wireframe creation | Sally (UX) |
Review Notes
Stakeholder Feedback
To be added after stakeholder review
Design Iterations
To be documented as design evolves
Open Questions
-
Merge Workflow Complexity: Should merge requests require approval from both proposers AND organizers, or just organizers?
- Impact: More approvals = better consensus, but slower process
- Recommendation: Organizer approval only, with automatic notification to both proposers
-
Draft Expiration: Should saved drafts expire after a certain period (e.g., 30 days)?
- Current: Drafts persist indefinitely
- Consideration: Old drafts for past meetings may clutter UI
- Recommendation: Auto-archive drafts for meetings that occurred >30 days ago
-
Anonymous Proposals: Should partners be able to submit anonymous agenda proposals?
- Current: All proposals show proposer company name
- Use Case: Sensitive topics that partners hesitate to propose publicly
- Recommendation: Consider anonymous option in future iteration with organizer-only visibility of proposer
-
Voting on Proposals: Should other partners be able to vote on proposed agenda items to influence priority?
- Current: Partners can βsupportβ proposals, increasing visibility
- Enhancement: Formal voting with weighted votes by partnership tier
- Recommendation: Evaluate in pilot meetings, add if strong partner demand
-
Proposal Templates: Should system provide pre-defined proposal templates for common agenda types (budget review, strategic planning, innovation showcase)?
- Current: Blank form only
- Benefit: Faster proposal creation, consistent structure
- Recommendation: Add template library in future iteration based on most common proposal patterns