diff --git a/doc/GiftedDialog-Complete-Documentation.md b/doc/GiftedDialog-Complete-Documentation.md new file mode 100644 index 00000000..5e836edd --- /dev/null +++ b/doc/GiftedDialog-Complete-Documentation.md @@ -0,0 +1,224 @@ +# GiftedDialog Complete Documentation + +## Overview + +The GiftedDialog system is a sophisticated multi-step dialog for recording gifts between people and projects in the TimeSafari application. It consists of a main orchestrating component and 9 specialized child components that handle different aspects of the gift recording workflow. + +## Key Features + +- **Two-Step Workflow**: Entity selection → Gift details +- **Multi-Entity Support**: People, projects, and special entities +- **Conflict Detection**: Prevents invalid gift combinations +- **Responsive Design**: Works across all device sizes +- **Accessibility**: Full keyboard navigation and screen reader support +- **Validation**: Comprehensive form validation and error handling +- **Flexible Integration**: Can be embedded in any view with different contexts + +## Component Architecture + +### Main Component +- **GiftedDialog.vue** - Main orchestrating component that manages dialog state, step navigation, and API integration + +### Step Components +- **EntitySelectionStep.vue** - Step 1 controller with dynamic labeling and context awareness +- **GiftDetailsStep.vue** - Step 2 controller with form validation and entity summaries + +### Layout Components +- **EntityGrid.vue** - Unified entity grid layout with responsive design +- **EntitySummaryButton.vue** - Selected entity display with edit capability + +### Display Components +- **PersonCard.vue** - Individual person display with avatar and selection states +- **ProjectCard.vue** - Individual project display with icons and issuer information +- **SpecialEntityCard.vue** - Special entities (You, Unnamed) with conflict detection +- **ShowAllCard.vue** - Navigation component with router integration + +### Input Components +- **AmountInput.vue** - Numeric input with increment/decrement controls and validation + +## Data Flow + +### Step 1: Entity Selection +1. User opens dialog → GiftedDialog renders EntitySelectionStep +2. EntitySelectionStep renders EntityGrid with entities and configuration +3. EntityGrid renders PersonCard/ProjectCard/SpecialEntityCard components +4. User clicks entity → Card emits to Grid → Grid emits to Step → Step emits to Dialog +5. GiftedDialog updates state and advances to step 2 + +### Step 2: Gift Details +1. GiftedDialog renders GiftDetailsStep with selected entities +2. GiftDetailsStep renders EntitySummaryButton and AmountInput components +3. User fills form and clicks submit → Step emits to Dialog +4. GiftedDialog processes submission via API and handles success/error + +## Key Props and Configuration + +### GiftedDialog Props +```typescript +interface GiftedDialogProps { + fromProjectId?: string; // Project ID when project is giver + toProjectId?: string; // Project ID when project is recipient + showProjects?: boolean; // Whether to show projects + isFromProjectView?: boolean; // Context flag for project views +} +``` + +### Opening the Dialog +```typescript +// Basic usage +giftedDialog.open(); + +// With pre-selected entities and context +giftedDialog.open( + giverEntity, // Pre-selected giver + receiverEntity, // Pre-selected receiver + offerId, // Offer context + customTitle, // Custom dialog title + prompt, // Custom input prompt + successCallback // Success handler +); +``` + +## Integration Patterns + +### Basic Integration +```vue + + + +``` + +### Project Context Integration +```typescript +// Gift from project +dialog.open( + projectEntity, // Project as giver + undefined, // User selects receiver + undefined, // No offer + "Gift from Project", + "What did this project provide?" +); + +// Gift to project +dialog.open( + undefined, // User selects giver + projectEntity, // Project as receiver + undefined, // No offer + "Gift to Project", + "What was contributed to this project?" +); +``` + +## State Management + +The dialog manages internal state through a reactive system: + +- **Step Navigation**: Controls progression from entity selection to gift details +- **Entity Selection**: Tracks selected giver and receiver entities +- **Conflict Detection**: Prevents selecting same person for both roles +- **Form Validation**: Ensures required fields are completed +- **API Integration**: Handles gift submission and response processing + +## Conflict Detection Logic + +```typescript +function wouldCreateConflict(selectedDid: string): boolean { + // Only applies to person-to-person gifts + if (giverEntityType !== "person" || recipientEntityType !== "person") { + return false; + } + + // Check if selecting same person for both roles + if (stepType === "giver") { + return receiver?.did === selectedDid; + } else if (stepType === "recipient") { + return giver?.did === selectedDid; + } + + return false; +} +``` + +## AmountInput Component Fix + +The AmountInput component was recently fixed to resolve an issue where increment/decrement buttons weren't updating the displayed value: + +### Problem +- Input field used `:value="displayValue"` (one-way binding) +- Programmatic updates to `displayValue` weren't reflected in DOM + +### Solution +- Changed to `v-model="displayValue"` (two-way binding) +- Now properly synchronizes programmatic and user input changes + +### Usage +```vue + +``` + +## Testing Strategy + +### Unit Testing +- Individual component behavior +- Props validation +- Event emission +- Computed property calculations + +### Integration Testing +- Multi-component workflows +- State management +- API integration +- Error handling + +### End-to-End Testing +- Complete user workflows +- Cross-browser compatibility +- Accessibility compliance +- Performance validation + +## Security Considerations + +- **Input Validation**: All user inputs are sanitized and validated +- **DID Privacy**: User identifiers only shared with authorized contacts +- **API Security**: Requests are cryptographically signed +- **XSS Prevention**: Template sanitization and CSP headers + +## Performance Optimizations + +- **Lazy Loading**: Components loaded only when needed +- **Virtual Scrolling**: For large entity lists +- **Debounced Input**: Prevents excessive API calls +- **Computed Properties**: Efficient reactive calculations +- **Memory Management**: Proper cleanup on component destruction + +## Accessibility Features + +- **Keyboard Navigation**: Full tab order and keyboard shortcuts +- **Screen Reader Support**: ARIA labels and semantic HTML +- **Focus Management**: Proper focus handling on open/close +- **High Contrast**: Supports high contrast themes +- **Responsive Design**: Works on all screen sizes + +--- + +**Author**: Matthew Raymer +**Last Updated**: 2025-06-30 +**Version**: 1.0.0