9.7 KiB
Survey Question Builder Implementation
Overview
A comprehensive, interactive survey question builder that allows users to create and manage survey templates with dynamic question forms, visual choice management, and real-time preview capabilities.
Features Implemented
Phase 1: Dynamic Question Management ✅
File: static/surveys/js/builder.js
Features:
- Add/Remove Questions: Dynamic addition and removal of survey questions
- Question Reordering: Move questions up/down to adjust order
- Question Numbering: Automatic question numbering
- Question Types: Support for multiple question types:
- Text (short answer)
- Rating (1-5 scale)
- Multiple Choice (checkboxes)
- Single Choice (radio buttons)
- Required Field Toggle: Mark questions as required or optional
- Formset Integration: Seamlessly integrates with Django formsets
- Visual Feedback: Highlight animations for new questions
Key Functions:
- addQuestion() - Adds a new question form
- deleteQuestion() - Removes a question with confirmation
- moveQuestion() - Reorders questions
- updateQuestionNumbers() - Updates question numbering
- setupQuestionTypeHandlers() - Manages question type visibility
Phase 2: Visual Choices Builder ✅
File: static/surveys/js/choices-builder.js
Features:
- Visual UI: Intuitive interface for managing multiple choice options
- Bilingual Support: Add choices in both English and Arabic
- Value Management: Assign unique values to each choice
- Add/Remove Choices: Dynamic management of choice options
- JSON Generation: Automatically generates valid JSON for choices
- Real-time Updates: Changes reflect immediately in JSON textarea
- Drag Handles: Ready for future drag-and-drop functionality
Key Functions:
- createChoicesUI() - Initializes the visual choices interface
- addChoice() - Adds a new choice option
- createChoiceElement() - Renders a single choice item
- updateChoicesJSON() - Updates the JSON textarea
- parseChoices() - Parses existing JSON from textarea
Choice Structure:
[
{
"value": "1",
"label": "Excellent",
"label_ar": "ممتاز"
}
]
Phase 3: Real-time Survey Preview ✅
File: static/surveys/js/preview.js
Features:
- Live Preview: Real-time preview as questions are added/modified
- Toggle Panel: Show/hide preview panel
- Expandable View: Expand preview for full-screen viewing
- Question Rendering: Renders all question types correctly:
- Text questions show input fields
- Rating questions show clickable rating badges
- Multiple choice shows checkboxes
- Single choice shows radio buttons
- Required Indicators: Shows asterisk for required questions
- Auto-scroll: Automatically scrolls to newly added questions
Key Functions:
- createPreviewPanel() - Creates the preview UI
- updatePreview() - Refreshes the preview content
- renderQuestionPreview() - Renders individual questions
- extractQuestionData() - Extracts question data from form
- togglePreview() - Shows/hides preview panel
File Structure
static/surveys/js/
├── builder.js # Main question builder functionality
├── choices-builder.js # Visual choices management
└── preview.js # Real-time survey preview
templates/surveys/
└── template_form.html # Survey template form with builder integration
Template Integration
JavaScript Modules
All three modules are loaded in template_form.html:
{% block extra_js %}
<script src="{% static 'surveys/js/builder.js' %}"></script>
<script src="{% static 'surveys/js/choices-builder.js' %}"></script>
<script src="{% static 'surveys/js/preview.js' %}"></script>
{% endblock %}
CSS Styles
Enhanced styling for:
- Question forms and animations
- Reorder controls
- Choices builder UI
- Preview panel
- Hover effects and transitions
User Interface
Survey Builder Interface
-
Template Details Section
- Survey name (English/Arabic)
- Hospital selection
- Survey type
- Scoring method
- Negative threshold
- Active status toggle
-
Questions Section
- "Add Question" button
- Question forms with:
- Delete button
- Reorder controls (up/down arrows)
- Question text (English/Arabic)
- Question type dropdown
- Order number
- Required checkbox
- Choices field (for choice-based questions)
-
Preview Button
- Located in page header
- Toggles preview panel
Preview Panel
- Header: Preview title with expand/close buttons
- Content: Real-time rendered survey preview
- Scrollable: Limited height with scroll when expanded
- Responsive: Adapts to different screen sizes
Usage Examples
Creating a Text Question
- Click "Add Question"
- Enter question text in English field
- Optionally enter Arabic translation
- Select "Text" as question type
- Set order number
- Check "Required" if needed
Creating a Rating Question
- Click "Add Question"
- Enter question text
- Select "Rating (1-5)" as question type
- Preview will show 5 clickable rating badges
Creating a Multiple Choice Question
- Click "Add Question"
- Enter question text
- Select "Multiple Choice" as question type
- Choices builder UI appears
- Click "Add Choice" for each option
- Enter:
- Value (e.g., "1", "2", "3")
- Label (English text)
- Label (Arabic translation)
- Preview shows checkboxes for each choice
Creating a Single Choice Question
Same as multiple choice, but preview shows radio buttons instead of checkboxes
Technical Details
Question Form Structure
Each question form contains:
- Hidden fields:
id,DELETE - Text fields:
text,text_ar - Select field:
question_type - Number field:
order - Checkbox:
is_required - Textarea:
choices_json(for choice-based questions)
Formset Management
- Uses Django formset for dynamic form management
TOTAL_FORMSupdated when adding questionsDELETEcheckboxes handle question removal- Form indexing automatically updated
Event Handling
- DOM Loaded: All modules initialize
- Form Changes: MutationObserver watches for changes
- Input Events: Live updates to preview
- Click Events: Button handlers for add/delete/move
- Change Events: Question type visibility toggles
Data Flow
User Input → JavaScript Module → Form Update → Preview Update
↓
JSON Generation (choices)
↓
Form Submission (Django)
Browser Compatibility
- Modern Browsers: Chrome, Firefox, Safari, Edge (latest versions)
- Features Used:
- ES6 Classes
- MutationObserver
- Template literals
- Arrow functions
- Array methods (map, filter, forEach)
Accessibility
- Semantic HTML elements
- Keyboard navigation support
- ARIA labels where appropriate
- High contrast colors
- Clear visual indicators for required fields
Performance Considerations
- MutationObserver efficiently watches for DOM changes
- Debouncing not implemented (could be added for large forms)
- Preview updates on every input change (could be debounced)
- Minimal DOM manipulation for smooth performance
Future Enhancements (Phase 4 & 5)
Potential Improvements
-
Question Templates
- Pre-built question templates
- Quick-insert common questions
- Question categories
-
Question Validation
- Real-time validation feedback
- Custom validation rules
- Pattern matching for text inputs
-
Question Grouping
- Group related questions
- Section headers
- Conditional logic (show/hide based on answers)
-
Import/Export
- Import questions from JSON
- Export to Word/PDF
- Copy questions between templates
-
Advanced Choice Features
- Drag-and-drop reordering
- Bulk edit choices
- Choice images/icons
-
Preview Enhancements
- Mobile preview mode
- Print preview
- Preview with sample responses
-
Collaboration Features
- Comment on questions
- Version history
- Multiple editors
-
Analytics Integration
- Question performance metrics
- Response rate predictions
- Survey completion estimates
Testing
Manual Testing Checklist
- Add question appears in list
- Delete question removes from list
- Reorder up moves question up
- Reorder down moves question down
- Question numbers update correctly
- Question type changes show correct fields
- Choices builder appears for choice questions
- Add choice creates new choice item
- Delete choice removes choice item
- JSON updates correctly
- Preview toggles on/off
- Preview shows all question types
- Preview updates in real-time
- Required questions show asterisk
- Form submits correctly
- Validation errors display correctly
Browser Testing
Test on:
- Chrome (desktop & mobile)
- Firefox (desktop)
- Safari (desktop & mobile)
- Edge (desktop)
Troubleshooting
Common Issues
Issue: Preview not updating
- Solution: Check browser console for JavaScript errors
Issue: Choices builder not appearing
- Solution: Ensure question type is "multiple_choice" or "single_choice"
Issue: Form submission fails
- Solution: Check that all required fields are filled
Issue: Question numbering incorrect
- Solution: Refresh page or manually update order numbers
Support
For issues or questions:
- Check browser console for errors
- Review Django logs
- Verify JavaScript files are loading
- Check network tab for failed requests
Version History
- v1.0 (2026-01-21): Initial implementation
- Phase 1: Dynamic question management
- Phase 2: Visual choices builder
- Phase 3: Real-time preview
- Enhanced CSS styling