Overview
The Questionnaire Templates feature in @admin-lite enables organizations to create, manage, and utilize reusable questionnaire blueprints. This significantly reduces the time and effort required to create new questionnaires while ensuring consistency across similar audits and inspections.
Templates leverage the existing questionnaire system, allowing any questionnaire to be saved as a template and any template to be used as the starting point for a new questionnaire. For core questionnaire concepts, refer to Questionnaires.
Key Features
- Template Creation: Save any questionnaire as a reusable template
- Template Library: Organized repository of default and custom templates
- Search & Filter: Find templates quickly with advanced filtering
- Version Management: Track template updates and modifications
- Access Control: Organization-specific templates with visibility controls
- Seamless Integration: Direct integration with questionnaire creation workflow
Architecture
Frontend Structure (@admin-lite)
app/admin/questionnaires/
├── templates/
│ └── page.tsx # Template list page
├── _components/
│ └── modals/
│ └── save-as-template-modal.tsx # Save questionnaire as template
└── _lib/
├── template-queries.ts # React Query configurations
├── template-repository.ts # API communication
├── template-service.ts # Business logic
└── template-converter.ts # Conversion utilities
Backend Structure (@api-questionnaires)
domains/questionnaireTemplate/
├── repository/
│ └── questionnaireTemplate.mongo.repository.ts
├── schema/
│ └── questionnaireTemplate.mongoschema.ts
└── usecase/
└── questionnaireTemplate.usecase.ts
Template Types
1. Default Templates
- Created by Nimbly administrators
- Available to all organizations
- Read-only for end users
- Curated for common use cases
2. Custom Templates
- Created by organization users
- Organization-specific access
- Full CRUD operations
- Can be shared within the organization
User Workflows
Creating a Template
From Existing Questionnaire
- Navigate to questionnaire list
- Select “Save as Template” from actions menu
- Configure template details:
interface TemplateConfig { title: string; description?: string; publish: boolean; // Draft or Published } - Save to template library
From Scratch
- Create a new questionnaire
- Configure all questions and settings
- Save as template instead of publishing
Using a Template
-
Navigate to Create Questionnaire
/admin/questionnaires/create -
Select “Create from Template”
- Opens template selection modal
- Browse or search templates
-
Choose Template
- View template details
- Preview questions
- Select and load
-
Customize
- Modify questions as needed
- Update departments and settings
- Save as new questionnaire
Managing Templates
Template List View
// Enhanced list with filtering
<TemplateList
filters={{
search: string,
type: ['default', 'custom'],
status: ['draft', 'published', 'archived']
}}
onTemplateSelect={(template) => {
// Load template for editing or preview
}}
/>Template Actions
- Edit: Modify template content (custom templates only)
- Clone: Create a copy of the template
- Archive: Soft delete (can be restored)
- Restore: Bring back archived templates
- Preview: View template structure
API Integration
Endpoints
Get Templates
// GET /api/v2/questionnairetemplates/v2
interface GetTemplatesParams {
search?: string;
type?: 'default' | 'custom';
status?: 'draft' | 'published' | 'archived';
page?: number;
limit?: number;
sortBy?: 'title' | 'createdAt' | 'updatedAt';
sortOrder?: 'asc' | 'desc';
}Create Template
// POST /api/v2/questionnairetemplates/v2/create-template
interface CreateTemplateDto {
title: string;
description?: string;
publish: boolean;
questions: Question[];
}Update Template
// PATCH /api/v2/questionnairetemplates/v2/update-template/:templateID
interface UpdateTemplateDto {
title?: string;
description?: string;
publish?: boolean;
questions?: Question[];
}For complete API documentation, see the backend repository @api-questionnaires/QUESTIONNAIRE_TEMPLATE_API.md.
Template Schema
Templates use the same question structure as questionnaires:
interface QuestionnaireTemplate {
templateID: string;
organizationID?: string; // null for default templates
type: 'default' | 'custom';
title: string;
description?: string;
questions: Question[]; // Same as questionnaire questions
visibility: 'organization' | 'public';
status: 'draft' | 'published' | 'archived';
createdBy: string;
modifiedByName?: string;
modifiedBy: string;
version?: string;
createdAt: Date;
updatedAt: Date;
}UI Components
Template List
- Search Bar: Real-time search in title and description
- Filter Panel: Type, status, and date filters
- Template Cards: Visual representation with preview
- Action Menu: Context actions per template
Save as Template Modal
<SaveAsTemplateModal
questionnaire={currentQuestionnaire}
onSave={async (templateConfig) => {
const template = await templateService.createFromQuestionnaire(
questionnaire,
templateConfig
);
toast.success('Template saved successfully');
}}
/>Template Selection Modal
<TemplateSelectionModal
onSelect={async (templateId) => {
const template = await templateService.getById(templateId);
const questionnaire = TemplateConverter.toQuestionnaire(template);
// Load into editor
}}
/>Status Workflow
graph LR A[Draft] --> B[Published] B --> C[Archived] C --> A[Draft] style A fill:#f9f,stroke:#333 style B fill:#9f9,stroke:#333 style C fill:#999,stroke:#333
Status Rules
- Draft: Work in progress, not visible in selection
- Published: Available for use
- Archived: Soft deleted, can be restored
Best Practices
Template Design
- Comprehensive Coverage: Include all necessary questions
- Clear Categorization: Organize questions logically
- Descriptive Names: Use clear, searchable titles
- Documentation: Add helpful descriptions
- Version Control: Update templates carefully
Template Usage
- Regular Review: Keep templates up to date
- Feedback Loop: Gather user feedback for improvements
- Standardization: Use templates for consistency
- Customization: Allow flexibility when using templates
Performance Considerations
Optimization Strategies
// Lazy load template content
const templateDetails = useQuery({
queryKey: ['template', templateId],
queryFn: () => templateService.getById(templateId),
enabled: !!templateId // Only fetch when ID is available
});
// Cache template list
const templates = useQuery({
queryKey: ['templates', filters],
queryFn: () => templateService.findAll(filters),
staleTime: 5 * 60 * 1000 // 5 minutes
});Search Performance
- Server-side search with debouncing
- Indexed fields for fast queries
- Pagination for large result sets
Integration Points
With Questionnaire Creation
Templates seamlessly integrate into the questionnaire creation workflow:
- User starts questionnaire creation
- Option to “Create from Template”
- Template content loads into editor
- User customizes and saves
With Bulk Operations
- Export templates to Excel
- Import templates from other organizations
- Bulk update template properties
Security & Permissions
Access Control
// Template visibility rules
const canViewTemplate = (template: Template, user: User) => {
return (
template.type === 'default' || // All users can see default templates
template.organizationID === user.organizationID // Own org templates
);
};
// Modification permissions
const canEditTemplate = (template: Template, user: User) => {
return (
template.type === 'custom' && // Only custom templates
template.organizationID === user.organizationID && // Own org
user.role in ['Admin', 'AccountHolder'] // Proper role
);
};Future Enhancements
Planned Features
- Template Categories: Organize by industry or use case
- Template Sharing: Share between organizations
- Version History: Track all template changes
- Usage Analytics: See which templates are most used
- AI Suggestions: Recommend templates based on usage
Under Consideration
- Template marketplace
- Industry-specific template packs
- Template approval workflows
- Multi-language templates
Related Documentation
Core System
- Questionnaires - Main questionnaire system
- Questionnaire Create Admin Frontend V2 - V2 editor
- Questionnaires Backend - API documentation
Implementation
- @admin-lite - Frontend implementation
- @api-questionnaires - Backend API
- Template API Documentation - Detailed API specs