Story 1.14: Company Management Screen - Wireframe
Story: Epic 1, Story 1.14 - Company Management Service Foundation
Visual Wireframe
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Back to Dashboard Company Management [+ Add New Company] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββ SEARCH & FILTERS ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β [π Search companies...] [Partner Only β] [Verified Only β] β β
β β β β
β β Industry: [All βΎ] Sort By: [Name A-Z βΎ] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ COMPANY LIST βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Showing 23 companies [Grid β£] [List β°]β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β [Logo] TechCorp AG β PARTNER β
VERIFIEDβ β β
β β β Zurich, Switzerland β β β
β β β Cloud Computing & DevOps β β β
β β β π techcorp.ch β β β
β β β [View Details] [Edit] [12 Associated Users β] β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β [Logo] SwissBank Ltd β
VERIFIEDβ β β
β β β Basel, Switzerland β β β
β β β Financial Services β β β
β β β π swissbank.ch β β β
β β β [View Details] [Edit] [5 Associated Users β] β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β [π·] Digital Solutions GmbH β³ PENDING β β β
β β β Bern, Switzerland β β β
β β β Software Development β β β
β β β π digitalsol.ch β β β
β β β [View Details] [Edit] [2 Associated Users β] β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β [Load More...] (20 more companies) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Create/Edit Company Modal
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [X] Create New Company β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββ COMPANY DETAILS ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Company Name * β β
β β [_______________________________________________________________________] β β
β β π‘ Start typing to see suggestions and check for duplicates β β
β β β β
β β Display Name (if different from legal name) β β
β β [_______________________________________________________________________] β β
β β β β
β β Swiss UID (Optional - for automatic verification) β β
β β [CHE-___.___.___] [π Verify] β β
β β βΉοΈ We'll validate this with the Swiss UID register β β
β β β β
β β Website β β
β β [https://_______________________________________________________________] β β
β β β β
β β Industry * β β
β β [Select Industry βΎ] β β
β β [Cloud Computing] [DevOps] [Financial Services] [Healthcare] [...] β β
β β β β
β β Sector (Optional) β β
β β [Select Sector βΎ] β β
β β [Public] [Private] [Non-profit] [Government] β β
β β β β
β β Location β β
β β City: [________________] Canton: [Select Canton βΎ] Country: [Switzerland βΎ] β β
β β β β
β β Description β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Brief description of the company's activities and expertise... β β β
β β β β β β
β β β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β 0/500 characters β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ LOGO UPLOAD ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Company Logo β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β β
β β β π Drag & drop logo here or click to browse β β β
β β β β β β
β β β Accepted: PNG, JPEG, SVG β’ Max size: 5 MB β β β
β β β Recommended: 500x500px square, transparent background β β β
β β β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β Preview: β β
β β βββββββββββ β β
β β β [Logo] β β
logo-techcorp.png (245 KB) [Remove] β β
β β βββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ PARTNER STATUS (Organizer Only) - Managed in Partner Service βββββββββββββββββ β
β β β β
β β β Partner Status β β
β β [β This company is a BATbern partner] β β
β β βΉοΈ Creates partnership via Partner Coordination Service β β
β β β β
β β Partner Benefits (when enabled): β β
β β β’ Priority speaker invitations β β
β β β’ Enhanced analytics dashboard access β β
β β β’ Topic voting privileges β β
β β β’ Logo display on event pages β β
β β β β
β β Partner Level: [Bronze βΎ] [Silver] [Gold] [Platinum] β β
β β Partnership Start Date: [DD/MM/YYYY] β β
β β Partnership End Date: [DD/MM/YYYY] β β
β β β β
β β βοΈ API: POST /api/v1/partnerships β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ VERIFICATION βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Verification Status: β³ PENDING β β
β β β β
β β [β Manually verify this company] (Organizer only) β β
β β β β
β β Verification Method: β β
β β β’ Swiss UID Register: β³ Pending validation β β
β β β’ Website Domain: β
Verified (techcorp.ch) β β
β β β’ Manual Review: β³ Pending organizer approval β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β [Cancel] [Save Draft] [Save & Create]β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Company Detail View
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Back to Companies TechCorp AG [Edit] [β Settings] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββ COMPANY PROFILE ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β ββββββββββ TechCorp AG β PARTNER β
VERIFIEDβ β
β β β β Cloud Computing & DevOps β β
β β β Logo β Zurich, Switzerland β β
β β β β π techcorp.ch β β
β β ββββββββββ Swiss UID: CHE-123.456.789 β β
β β Sector: Private β’ Founded: 2010 β β
β β β β
β β ββββ DESCRIPTION ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Leading provider of cloud-native solutions and DevOps consulting services β β β
β β β in Switzerland. Specializing in Kubernetes orchestration, infrastructure β β β
β β β automation, and cloud migration strategies for enterprise clients. β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ ASSOCIATED USERS (From User Service) βββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β 12 Associated Users [+ Link User] β β
β β βοΈ Data from: GET /api/v1/users?companyId={companyId} β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β [Photo] Dr. Peter Muller β’ Principal Cloud Architect β β β
β β β 8 Talks β’ 4.7β
Average Rating β β β
β β β [View Profile β] β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β [Photo] Anna Schmidt β’ Senior DevOps Engineer β β β
β β β 5 Talks β’ 4.9β
Average Rating β β β
β β β [View Profile β] β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β [View All Speakers (12) β] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ PARTNER INFORMATION (From Partner Service) ββββββββββββββββββββββββββββββββββββ β
β β β β
β β Partnership Level: Gold Partner β β
β β Partnership Period: Jan 2023 - Dec 2025 β β
β β Primary Contact: Maria Weber (maria.weber@techcorp.ch) β β
β β β β
β β Partnership Benefits Active: β β
β β β
Priority speaker invitations β β
β β β
Enhanced analytics dashboard β β
β β β
Topic voting (3 votes per event) β β
β β β
Logo on event pages and marketing materials β β
β β β β
β β βοΈ Data from: GET /api/v1/partnerships?companyId={companyId} β β
β β [π View Partner Analytics β] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ STATISTICS βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Event Participation β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Total Events with Speakers: 18 events β β β
β β β Total Presentations: 42 presentations β β β
β β β Total Attendees from Company: 156 attendees β β β
β β β First Event: Spring 2015 β β β
β β β Most Recent Event: Autumn 2024 β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β Topic Expertise (from speaker presentations) β β
β β [Kubernetes: 12] [Cloud Architecture: 8] [DevOps: 15] [CI/CD: 7] [...] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββ ACTIVITY HISTORY βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Recent Activity β β
β β β’ 2024-03-10: Dr. Peter Muller invited to speak at Spring 2024 Conference β β
β β β’ 2024-02-15: Company verified via Swiss UID register β β
β β β’ 2024-01-20: Partnership renewed until Dec 2025 β β
β β β’ 2023-11-05: Anna Schmidt confirmed for Autumn 2023 workshop β β
β β β β
β β [View Full History β] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key Interactive Elements
Company List View
- Search Bar: Real-time autocomplete search with Caffeine-backed suggestions
- Filter Controls: Partner status, verification status, industry
- View Toggle: Switch between grid and list view
- Sort Dropdown: Sort by name, industry, number of speakers, partnership status
- Company Cards: Clickable cards showing key company information
- Quick Actions: View, Edit, View Speakers buttons
- Load More: Pagination or infinite scroll for large company lists
Create/Edit Company Form
- Company Name Field: Real-time duplicate detection and name suggestions
- UID Verification: Swiss UID register integration for automatic verification
- Logo Upload: Drag-and-drop file upload with preview and validation
- Industry Tags: Multi-select industry/topic tags
- Partner Toggle: Enable/disable partner status with privilege configuration
- Verification Controls: Manual verification checkbox (organizer-only)
- Save Options: Save draft, save and continue, save and close
Company Detail View
- Profile Section: Complete company information display
- Speaker List: Associated speakers with quick links to profiles
- Partner Info: Partnership details and benefits (if applicable)
- Statistics Dashboard: Event participation and engagement metrics
- Activity Timeline: Recent company-related activities
- Action Buttons: Edit company, manage speakers, view analytics
Functional Requirements Met
- FR3: Core company management with CRUD operations and Swiss UID validation
- FR12: Partner company management (via Partner Coordination Service) with special status indicators, partnership levels, and benefit tracking
- Logo Management: S3-based logo upload with CDN integration for fast delivery
- Search & Discovery: Caffeine-backed autocomplete search for efficient company lookup
- Data Integrity: Duplicate detection, UID verification, and data validation
- User-Company Associations: User-company relationships managed via User Management Service
User Interactions
For Organizers (Full Access)
- Create Company: Click [+ Add New Company] β Fill form β Upload logo β Set partner status β Save
- Search Companies: Type in search bar β Filter by partner/verified status β Sort results
- Edit Company: Click company card β Click [Edit] β Modify fields β Save changes
- Verify Company: Open company β Check verification β Click [Manually verify] (if needed)
- Manage Partner Status: Create partnership β POST /api/v1/partnerships with company ID β Set partnership level β Save
- Link Speakers: Company detail β Click [+ Link Speaker] β Search and select speaker
- View Statistics: Company detail β Review participation metrics and topic expertise
- View Analytics: Click [π View Partner Analytics] (for partner companies)
For Speakers (Limited Access)
- Create Own Company: Click [+ Add New Company] β Fill basic details β Submit for verification
- View Company: Search and view company details (read-only for othersβ companies)
- Update Own Company: Edit company they created or are affiliated with
- See Associated Speakers: View list of colleagues from same company
Common Interactions
- Autocomplete Search: Start typing company name β Select from suggestions
- Filter Results: Apply filters β Results update automatically
- Toggle View: Switch between grid and list view for companies
- Upload Logo: Drag file to upload area OR click to browse β Preview β Confirm
- UID Verification: Enter Swiss UID β Click [π Verify] β Automatic validation
Technical Notes
Component Structure
- CompanyManagementScreen.tsx: Main screen component with search and list
- CompanyList.tsx: Paginated company list with grid/list views
- CompanyCard.tsx: Individual company card component
- CompanyForm.tsx: Create/edit form with validation
- CompanyDetailView.tsx: Detailed company profile display
- LogoUpload.tsx: Drag-and-drop logo upload component
- CompanySearch.tsx: Autocomplete search with Caffeine cache backend
- PartnerManagementPanel.tsx: Partner status and benefits configuration
State Management
- Local State: Form data, upload progress, UI toggles (grid/list)
- Zustand Store: Company search cache, filter preferences
- React Query: Server state for companies, speakers, statistics
companiesquery: Cached for 5 minutescompanyDetailquery: Cached for 10 minutescompanySuggestionsquery: Cached for 15 minutes
API Integration (Updated from Story 1.14 Refactoring)
Company Management Service (Company data only):
- List/Search:
GET /api/v1/companies?filter={}&sort={}&page={} - Autocomplete:
GET /api/v1/companies/search?query={}&limit=20(Caffeine cached) - Get Detail:
GET /api/v1/companies/{id}?include=statistics,logo - Create:
POST /api/v1/companies - Update:
PUT /api/v1/companies/{id}orPATCH /api/v1/companies/{id} - Delete:
DELETE /api/v1/companies/{id} - Swiss UID Validation:
GET /api/v1/companies/validate-uid?uid={} - Verify:
POST /api/v1/companies/{id}/verify - Logo Upload:
POST /api/v1/companies/{id}/logo(presigned S3 URL) - Statistics:
GET /api/v1/companies/{id}/statistics
Partner Coordination Service (Partnership management - Epic 8):
- List Partnerships:
GET /api/v1/partnerships?companyId={} - Create Partnership:
POST /api/v1/partnerships - Update Partnership:
PUT /api/v1/partnerships/{id} - Get Partnership Details:
GET /api/v1/partnerships/{id} - Partner Analytics:
GET /api/v1/partnerships/{id}/analytics
User Management Service (User-company associations):
- List Company Users:
GET /api/v1/users?companyId={} - Associate User with Company:
POST /api/v1/users/{userId}/company - Update User Company:
PUT /api/v1/users/{userId}/company
Benefits:
- Caffeine caching for <100ms (P95) autocomplete performance
- Swiss UID validation integration for automated verification
- Clear service boundaries following DDD principles
- Partnership data managed separately in Partner Coordination Service
File Upload Workflow
- User selects logo file (drag-and-drop or browse)
- Client validates file (type: PNG/JPEG/SVG, size: max 5MB)
- Client requests presigned URL:
POST /api/v1/files/presigned-upload-url - Client uploads directly to S3 using presigned URL
- Client confirms upload:
POST /api/v1/files/{fileId}/confirm - Server returns CDN URL for logo display
- Client updates company with logo CDN URL
Validation Rules
- Company Name: Required, 2-200 characters, duplicate check
- UID Format: CHE-XXX.XXX.XXX (Swiss format), optional
- Logo: PNG/JPEG/SVG, max 5MB, recommended 500x500px
- Website: Valid URL format, https preferred
- Industry: Required, select from predefined list
- Description: Max 500 characters
Caching Strategy
- Caffeine Autocomplete: Company name suggestions cached with 15-minute TTL
- React Query: Company details cached for 10 minutes
- CDN: Logo files cached with CloudFront (1-year max-age)
- Search Results: Cached for 5 minutes, invalidated on company updates
Security Considerations
- Role-Based Access: Organizers have full access, speakers limited to create/edit own
- Logo Upload: Presigned URLs valid for 15 minutes, MIME type validation
- UID Verification: Swiss UID register API integration with rate limiting
- Duplicate Prevention: Server-side duplicate detection before creation
- Audit Trail: All company changes logged with user ID and timestamp
API Requirements
Initial Page Load APIs
Updated with Story 1.22 Consolidated APIs
When the Company Management Screen loads, the following APIs are called:
-
GET /api/v1/companies?filter={}&sort={}&page={}
- Query params:
limit=20, page=1, sort=name, order=asc - Returns: Paginated list of companies with basic info
- Used for: Initial company list display
- Response includes: id, name, displayName, isPartner (from partnership join), logo CDN URL, industry, verificationStatus
- Consolidated: Replaces GET /companies, /companies/stats, /companies/filter (3 β 1 endpoint)
- Note: isPartner flag set if partnership exists in Partner Service
- Query params:
-
GET /api/v1/companies/search?query={}&limit=20
- Triggered by: User typing in search bar (debounced)
- Returns: Autocomplete suggestions from Caffeine cache
- Response:
{ suggestions: [{ id, name, displayName, logo }] } - Used for: Autocomplete dropdown
- Performance: <100ms (P95) with Caffeine caching
Action APIs
APIs called by user interactions:
Search & Filter (Consolidated)
-
GET /api/v1/companies?filter={}&sort={}&page={}
- Triggered by: Search input (debounced), filter changes, sort changes
- Query params:
filter={"isPartner":true,"industry":"Cloud"}&sort=name&page=1&limit=20 - Returns: Filtered and paginated company list
- Used for: Real-time search and filtering
- Consolidated: Single endpoint replaces /companies, /companies/filter, /companies/search
-
GET /api/v1/companies/search?query={}&limit=10
- Triggered by: Search input (autocomplete, debounced)
- Returns: Autocomplete suggestions from Caffeine cache
- Response:
{ suggestions: [{ id, name, displayName, logo }] } - Used for: Autocomplete dropdown
- Performance: <100ms (P95) with Caffeine caching
CRUD Operations (Consolidated)
-
POST /api/v1/companies
- Triggered by: [Save & Create] button in create form
- Payload: Company data (JSON)
- Returns: Created company with ID
- Side effects: Creates company, publishes CompanyCreatedEvent
- Note: Logo upload now uses separate endpoint
-
PUT /api/v1/companies/{id} or PATCH /api/v1/companies/{id}
- Triggered by: [Save] button in edit form
- Payload: Full (PUT) or partial (PATCH) company data
- Returns: Updated company object
- Side effects: Updates company, invalidates cache, publishes CompanyUpdatedEvent
- Consolidated: Supports both full and partial updates
-
DELETE /api/v1/companies/{id}
- Triggered by: [Delete] button confirmation
- Returns:
{ success: true } - Side effects: Soft delete company, removes from search index, publishes CompanyDeletedEvent
-
GET /api/v1/companies/{id}?include=statistics,logo
- Triggered by: Click company card, navigate to detail view
- Query params:
includeparameter for related data (statistics, logo) - Returns: Complete company details with included relations
- Used for: Detail view display
- Consolidated: Single endpoint with flexible includes (replaces 3 separate calls)
- Note: User-company associations retrieved from User Service separately
Logo Management (Consolidated)
- POST /api/v1/companies/{id}/logo
- Triggered by: Logo file selected in upload component
- Payload: Form data with logo file
- Returns:
{ logoUrl, cdnUrl, uploadedAt } - Used for: Upload company logo with presigned S3 URL workflow
- Consolidated: Single endpoint handles presigned URL generation and confirmation (replaces 3-step workflow)
- Benefits: Simpler integration, automatic S3 upload
Swiss UID Validation & Partner Management (Consolidated)
-
GET /api/v1/companies/validate-uid?uid={CHE-XXX.XXX.XXX}
- Triggered by: [π Verify] button for UID verification
- Query params:
uid(Swiss UID format) - Returns:
{ valid: true, companyName, verificationSource: "uid_register" } - Used for: Automatic Swiss UID verification against Swiss Business Registry
- New in Story 1.22: Swiss UID validation integration
-
POST /api/v1/companies/{id}/verify
- Triggered by: Manual verification or after UID validation
- Payload:
{ method: "uid|manual|domain", verificationData } - Returns:
{ verified: true, verifiedAt, verificationMethod } - Side effects: Updates verification status
- Consolidated: Unified verification endpoint
Partner Management (Partner Service)
-
POST /api/v1/partnerships
- Triggered by: Partner status toggle (organizer-only)
- Payload:
{ companyId, partnerLevel: "bronze|silver|gold|platinum", startDate, endDate, primaryContact } - Returns: Created partnership object
- Side effects: Publishes PartnershipCreatedEvent
- Service: Partner Coordination Service (Epic 8)
-
GET /api/v1/partnerships?companyId={companyId}
- Triggered by: Company detail view load (if company has partnership)
- Returns: Partnership details for the company
- Used for: Display partner information section
- Service: Partner Coordination Service
-
PUT /api/v1/partnerships/{id}
- Triggered by: Edit partnership details
- Payload: Partial partnership update
- Returns: Updated partnership object
- Service: Partner Coordination Service
User-Company Relationships (User Service)
-
GET /api/v1/users?companyId={companyId}
- Triggered by: Company detail view load
- Query params:
companyId, limit=10, page=1 - Returns: Paginated list of users associated with company
- Used for: Display associated users list in detail view
- Service: User Management Service
-
POST /api/v1/users/{userId}/company
- Triggered by: [+ Link User] button
- Payload:
{ companyId, jobTitle, role } - Returns:
{ success: true, association } - Used for: Associate user with company
- Service: User Management Service
-
DELETE /api/v1/users/{userId}/company
- Triggered by: [Unlink] button
- Returns:
{ success: true } - Used for: Remove user-company association
- Service: User Management Service
Statistics (Company Service)
- GET /api/v1/companies/{id}/statistics
- Triggered by: Company detail view load or [View Statistics] button
- Returns: Comprehensive participation statistics
- Response:
{ totalEvents, totalPresentations, totalAttendees, firstEvent, mostRecentEvent, topicExpertise } - Used for: Statistics section in detail view
- Consolidated: Single endpoint replaces /statistics and /activity (activity now included in statistics)
- Service: Company Management Service
Navigation Map
Primary Navigation Actions
-
β Back to Dashboard β Navigate to Event Management Dashboard
- Type: Full page navigation
- Target: story-1.16-event-management-dashboard.md
- Context: Returns to main organizer portal
-
[+ Add New Company] button β Opens create company modal
- Type: Modal overlay
- Opens: Create Company Form (inline modal)
- Role-based access: Organizer (full), Speaker (basic create only)
- Closes on: Save, Cancel, or ESC key
-
Company Card click β Navigate to company detail view
- Type: Full page navigation
- Target: Company Detail View (same file, different section)
- Context: Company ID passed as route parameter
-
[Edit] button β Opens edit company modal
- Type: Modal overlay
- Opens: Edit Company Form (inline modal)
- Pre-fills: Current company data
- Role-based access: Organizer (all companies), Speaker (own company only)
Secondary Navigation (Data Interactions)
-
[View Details] button β Navigate to company detail view
- Type: Full page navigation
- Same as company card click
-
[12 Associated Speakers β] link β Navigate to filtered speaker list
- Type: Full page navigation
- Target: Speaker Matching Interface story-3.1-speaker-matching-interface.md
- Context: Pre-filtered by company ID
-
Search input (autocomplete) β Show suggestions dropdown
- Type: In-place dropdown
- No navigation, displays suggestions below search bar
- Click suggestion β Filters company list
-
Filter controls β Update company list
- Type: In-place content update
- No navigation, updates company list with filtered results
- Visual feedback: Loading spinner during API call
-
[Grid/List] toggle β Switch view mode
- Type: In-place view change
- No navigation, re-renders company list in different layout
-
[Load More] button β Load additional companies
- Type: In-place content expansion
- API call: Increments offset, appends results
- Visual feedback: Loading spinner, then additional cards appear
Company Detail View Navigation
-
[View Profile β] link (Speaker card) β Navigate to speaker profile
- Type: Full page navigation
- Target: Speaker Profile Detail View story-7.1-speaker-profile-detail-view.md
- Context: Speaker ID passed as route parameter
-
[+ Link Speaker] button β Opens speaker search modal
- Type: Modal overlay
- Opens: Speaker search and selection modal
- API call:
POST /api/v1/companies/{companyId}/speakers/{speakerId}on selection
-
[π View Partner Analytics β] button β Navigate to partner analytics
- Type: Full page navigation
- Target: Partner Analytics Dashboard story-6.1-partner-analytics.md
- Context: Company ID and partner data passed
- Role-based access: Organizer and Partner users only
-
[β Settings] button β Opens company settings modal
- Type: Modal overlay
- Opens: Company settings (advanced configuration)
- Includes: Notifications, visibility, data export options
-
[View All Speakers (12) β] link β Navigate to speaker list
- Type: Full page navigation
- Target: Speaker Matching Interface story-3.1-speaker-matching-interface.md
- Context: Filtered by company
-
[View Full History β] link β Opens activity history modal or page
- Type: Modal or full page (depending on data volume)
- Shows: Complete activity timeline for company
- API call:
GET /api/v1/companies/{companyId}/activitywith full pagination
Logo Upload Workflow Navigation
-
Logo upload area click β Opens file browser
- Type: OS file dialog
- No navigation, returns to form with selected file
-
Drag & drop logo β Upload and preview
- Type: In-place file upload
- Shows: Upload progress bar, then preview
- API calls:
POST /api/v1/files/presigned-upload-url- Direct S3 upload via presigned URL
POST /api/v1/files/{fileId}/confirm
-
[Remove] logo button β Delete logo and clear preview
- Type: In-place action
- API call:
DELETE /api/v1/files/{fileId}(if already uploaded) - Visual feedback: Preview clears, upload area resets
Error States & Redirects
-
Company not found β Navigate to company list with error
- Type: Full page navigation with error message
- Target: Company Management Screen (list view)
- Message: βCompany not found or has been deletedβ
-
Unauthorized edit attempt β Show permission error
- Type: Inline error message
- Message: βYou donβt have permission to edit this companyβ
- No automatic navigation, edit button disabled
-
API error during save β Show error state
- Type: In-page error message above form
- Message: βUnable to save company. Please try again.β
- Action: [Retry] button to resubmit
-
Network error β Show offline state
- Type: Banner notification
- Message: βYou are offline. Changes will be saved when connection is restored.β
- Shows: Last cached data
-
Upload quota exceeded β Show quota error
- Type: Modal dialog
- Message: βStorage quota exceeded. Please remove old files or contact support.β
- Action: [Manage Files] button β User file management screen
Form Submission Flows
-
[Save Draft] button β Save without validation
- Type: API call with partial data
- No navigation, shows success toast: βDraft savedβ
- Allows: Incomplete data for later completion
-
[Save & Create] button β Validate and save
- Type: API call with full validation
- On success: Close modal, refresh company list, show toast: βCompany created successfullyβ
- On validation error: Show inline errors, keep modal open
-
[Cancel] button β Discard changes
- Type: Close modal
- If unsaved changes: Show confirmation dialog
- Confirmation: βDiscard unsaved changes?β
- Actions: [Discard] [Keep Editing]
Responsive Design Considerations
Mobile Layout Changes
- Search Bar: Full-width search with filters in collapsible panel
- Company Cards: Full-width cards, stacked vertically
- Logo Upload: Simplified upload button (no drag-and-drop on mobile)
- Form Fields: Full-width fields, stacked layout
- Partner Status: Collapse benefits into expandable accordion
- Statistics: Swipeable cards for different stat categories
Tablet Layout Changes
- Company Cards: Two-column grid layout
- Search & Filters: Side-by-side layout with search and filters
- Form Layout: Two-column form for better space utilization
- Detail View: Side-by-side profile and statistics sections
Mobile-Specific Interactions
- Swipe to Delete: Swipe left on company card to reveal delete option
- Pull to Refresh: Refresh company list by pulling down
- Bottom Sheet: Open filters and actions in bottom sheet instead of dropdown
- FAB Button: Floating action button for [+ Add New Company]
- Sticky Header: Company name sticky at top when scrolling detail view
Accessibility Notes
- Keyboard Navigation: All interactive elements accessible via Tab key
- ARIA Labels:
aria-label="Search companies"on search inputaria-label="Upload company logo"on upload areaaria-label="Mark as partner"on partner checkboxaria-label="Verify company via Swiss UID"on verify button
- Focus Indicators: 2px solid border on focused elements
- Screen Reader Support:
- Form fields have associated labels
- Error messages announced with
aria-live="polite" - Loading states announced: βLoading companiesβ¦β
- Success/error toasts announced automatically
- Color Contrast: All text meets WCAG 2.1 AA standards (4.5:1 minimum)
- Alt Text: Company logos include descriptive alt text: βCompany name logoβ
- Skip Links: βSkip to company listβ link for keyboard users
- ARIA Live Regions: Search results and filters update announced to screen readers
State Management
Local Component State
searchQuery: string - Current search textfilters: object - Active filters (isPartner, industry, verificationStatus)viewMode: βgridβ | βlistβ - Current view modesortBy: string - Current sort fieldisModalOpen: boolean - Create/edit modal stateselectedCompany: Company | null - Currently selected company for editinguploadProgress: number - Logo upload progress percentage
Global State (Zustand Store)
companies.searchCache: Map - Cached search resultscompanies.filterPreferences: object - Userβs saved filter preferencesauth.currentUser: User - Current authenticated userauth.currentRole: UserRole - Current user role (organizer, speaker)ui.notifications: Notification[] - Toast notifications
Server State (React Query)
companies: Company list (cached for 5 minutes)companyDetail: Individual company (cached for 10 minutes)companySuggestions: Autocomplete suggestions (cached for 15 minutes)companyStatistics: Company stats (cached for 5 minutes)associatedUsers: Company users (cached for 10 minutes, from User Service)partnerships: Company partnership details (cached for 10 minutes, from Partner Service)
Real-Time Updates
- WebSocket: Real-time company updates when other users make changes
- Company Created: Toast notification when new company added
- Partner Status Changed: Live update of partner badge and benefits
- Verification Status: Real-time verification updates from Swiss UID register
Edge Cases & Error Handling
- Empty Company List: Show βNo companies foundβ with [+ Add New Company] suggestion
- No Search Results: Show βNo companies match your searchβ with suggestion to clear filters
- Duplicate Company Name: Show warning: βA company with this name already exists. Continue anyway?β
- Missing Logo: Display default company icon placeholder
- Failed Logo Upload: Show error with [Retry Upload] button
- UID Verification Timeout: Show βVerification taking longer than expected. Weβll notify you when complete.β
- Loading State: Display skeleton screens while data loads
- API Error: Show error message with [Retry] button
- Permission Denied: Hide edit/delete buttons for unauthorized users
- Offline Mode: Show cached data with banner βViewing offline versionβ
- Slow Network: Show progress indicators for >2 seconds
- Upload Too Large: Prevent upload, show βFile too large (max 5MB)β
- Invalid File Type: Reject upload, show βPlease upload PNG, JPEG, or SVG files onlyβ
- Quota Exceeded: Block upload, show quota usage and [Manage Files] link
- Concurrent Edit Conflict: Show βThis company was modified by another user. Refresh to see latest?β
Change Log
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-10-14 | 2.0 | Architectural Refactoring: Updated wireframe to reflect Story 1.14 service boundary refactoring. Company Service now only manages company data (name, logo, Swiss UID, description, verification). Removed employee/user count fields and employee management features. Partnership management moved to Partner Coordination Service (Epic 8) with separate API endpoints. User-company associations moved to User Management Service. Updated all API Integration sections, UI elements, and data flows to use correct service boundaries per DDD principles. | Winston (Architect) |
| 2025-10-04 | 1.0 | Initial wireframe creation for Company Management Screen | Sally (UX Expert) |
Review Notes
Open Questions
- Company Ownership: Should speakers be allowed to claim/verify their company affiliation?
- Auto-Verification: Should we auto-verify companies based on email domain matching?
- Company Merging: What workflow for merging duplicate companies discovered later?
- Historical Data: How to handle company data from 20+ years of historical events?
- Multi-Company Affiliation: Can speakers be associated with multiple companies over time?
- Partner Self-Service: Should partner companies have self-service access to update their info?
Design Iterations
- v1.0: Initial comprehensive design with UID verification and partner management
- Consider adding: Company relationship graph showing connections between companies and speakers
- Consider adding: Company timeline showing participation history across all events
- Consider adding: Bulk import feature for migrating historical company data
Stakeholder Feedback
- Pending review from organizers for partner management workflow validation
- Need to validate Swiss UID verification integration with actual register API
- Confirm storage quota limits and CDN configuration with infrastructure team
- Validate duplicate detection logic with historical data patterns