mirror of
https://github.com/DRYTRIX/TimeTracker.git
synced 2026-05-04 11:29:37 -05:00
6cad084c8c
Add comprehensive Activity Feed Widget to dashboard providing team visibility and audit trail functionality. The widget displays recent user activities with advanced filtering, pagination, and auto-refresh capabilities. Features: - Dashboard widget showing last 10 activities with infinite scroll - Filter by entity type (projects, tasks, time entries, templates, users, etc.) - Real-time auto-refresh every 30 seconds - Visual indicators for active filters (checkmark + dot) - Load more pagination with "has_next" detection - Refresh button with spinning animation feedback API Endpoints: - GET /api/activities - Retrieve activities with filtering & pagination - GET /api/activities/stats - Activity statistics and analytics - Support for user_id, entity_type, action, and date range filters Activity Logging Integration: - Projects: create, update, delete, archive, unarchive - Tasks: create, update, delete - Time Entries: start timer, stop timer - All operations log user, IP address, and user agent for security UI/UX Improvements: - Vanilla JS implementation (removed Alpine.js dependency) - Dark mode support with proper color schemes - Responsive dropdown with scrollable content - Action-specific icons (Font Awesome) - Relative timestamps with timeago filter - Error handling with user-friendly messages Testing & Documentation: - Comprehensive test suite (model, API, integration, widget) - Feature documentation in docs/features/activity_feed.md - Implementation summary and integration guide - Console logging for debugging Bug Fixes: - Fixed "Load More" button not appending results - Fixed refresh clearing list without reloading - Fixed filter dropdown using Alpine.js (now vanilla JS) - Fixed entity_type filter sending 'all' to API - Added missing entity types (time_entry_template, user) Technical Details: - Activity model with optimized indexes for performance - Promise-based async loading with proper error handling - Credentials included in fetch for authentication - Filter state management with visual feedback - Graceful degradation on API failures Impact: - Team visibility into real-time activities - Comprehensive audit trail for compliance - Better accountability and transparency - Improved troubleshooting capabilities
302 lines
8.6 KiB
Markdown
302 lines
8.6 KiB
Markdown
# Activity Feed Widget
|
|
|
|
The Activity Feed Widget provides real-time visibility into team activities and creates a comprehensive audit trail for your TimeTracker instance.
|
|
|
|
## Overview
|
|
|
|
The Activity Feed automatically tracks and displays all major actions performed in the system, including:
|
|
- Project management (create, update, delete, archive)
|
|
- Task operations (create, update, delete, status changes, assignments)
|
|
- Time tracking (start/stop timer, manual entries, edits)
|
|
- Invoice activities (create, send, mark paid)
|
|
- Client management
|
|
- And more...
|
|
|
|
## Features
|
|
|
|
### Dashboard Widget
|
|
|
|
The Activity Feed Widget appears on the main dashboard in the right sidebar, displaying:
|
|
- **Recent Activities**: Last 10 activities by default
|
|
- **User Attribution**: Shows who performed each action
|
|
- **Timestamps**: Displays how long ago each action occurred
|
|
- **Action Icons**: Visual indicators for different types of actions
|
|
- **Entity Details**: Clear description of what was done
|
|
|
|
### Filtering
|
|
|
|
Click the filter icon (🔽) to filter activities by type:
|
|
- All Activities
|
|
- Projects only
|
|
- Tasks only
|
|
- Time Entries only
|
|
- Invoices only
|
|
- Clients only
|
|
|
|
### Real-time Updates
|
|
|
|
The activity feed automatically refreshes every 30 seconds to show the latest team activities.
|
|
|
|
## User Permissions
|
|
|
|
### Regular Users
|
|
- See their own activities
|
|
- View activities related to projects they have access to
|
|
|
|
### Administrators
|
|
- See all activities across the entire organization
|
|
- Access to advanced filtering and export options
|
|
- View activity statistics
|
|
|
|
## API Endpoints
|
|
|
|
### Get Activities
|
|
|
|
```http
|
|
GET /api/activities
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `limit` (int): Number of activities to return (default: 50)
|
|
- `page` (int): Page number for pagination (default: 1)
|
|
- `user_id` (int): Filter by specific user (admin only)
|
|
- `entity_type` (string): Filter by entity type (project, task, time_entry, invoice, client)
|
|
- `action` (string): Filter by action type (created, updated, deleted, started, stopped, etc.)
|
|
- `start_date` (ISO string): Filter activities after this date
|
|
- `end_date` (ISO string): Filter activities before this date
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"activities": [
|
|
{
|
|
"id": 123,
|
|
"user_id": 5,
|
|
"username": "john.doe",
|
|
"display_name": "John Doe",
|
|
"action": "created",
|
|
"entity_type": "project",
|
|
"entity_id": 42,
|
|
"entity_name": "New Website",
|
|
"description": "Created project \"New Website\"",
|
|
"extra_data": {},
|
|
"created_at": "2025-10-30T14:30:00Z"
|
|
}
|
|
],
|
|
"total": 150,
|
|
"pages": 3,
|
|
"current_page": 1,
|
|
"has_next": true,
|
|
"has_prev": false
|
|
}
|
|
```
|
|
|
|
### Get Activity Statistics
|
|
|
|
```http
|
|
GET /api/activities/stats?days=7
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `days` (int): Number of days to analyze (default: 7)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"total_activities": 342,
|
|
"entity_counts": {
|
|
"project": 45,
|
|
"task": 128,
|
|
"time_entry": 156,
|
|
"invoice": 13
|
|
},
|
|
"action_counts": {
|
|
"created": 89,
|
|
"updated": 167,
|
|
"deleted": 12,
|
|
"started": 42,
|
|
"stopped": 32
|
|
},
|
|
"user_activity": [
|
|
{
|
|
"username": "john.doe",
|
|
"display_name": "John Doe",
|
|
"count": 156
|
|
}
|
|
],
|
|
"period_days": 7
|
|
}
|
|
```
|
|
|
|
## Action Types
|
|
|
|
The system tracks the following action types:
|
|
|
|
| Action | Description | Used For |
|
|
|--------|-------------|----------|
|
|
| `created` | Entity was created | Projects, Tasks, Clients, Invoices |
|
|
| `updated` | Entity was modified | Projects, Tasks, Time Entries |
|
|
| `deleted` | Entity was removed | Projects, Tasks, Time Entries |
|
|
| `started` | Timer started | Time Entries |
|
|
| `stopped` | Timer stopped | Time Entries |
|
|
| `completed` | Task marked as done | Tasks |
|
|
| `assigned` | Task assigned to user | Tasks |
|
|
| `commented` | Comment added | Tasks |
|
|
| `status_changed` | Status modified | Tasks, Invoices |
|
|
| `sent` | Invoice sent to client | Invoices |
|
|
| `paid` | Payment recorded | Invoices |
|
|
| `archived` | Entity archived | Projects |
|
|
| `unarchived` | Entity unarchived | Projects |
|
|
|
|
## Entity Types
|
|
|
|
Activities can be tracked for the following entity types:
|
|
|
|
- `project` - Project management
|
|
- `task` - Task operations
|
|
- `time_entry` - Time tracking
|
|
- `invoice` - Invoicing
|
|
- `client` - Client management
|
|
- `user` - User administration (admin only)
|
|
- `comment` - Comments and discussions
|
|
|
|
## Integration Guide
|
|
|
|
### For Developers
|
|
|
|
To add activity logging to new features, use the `Activity.log()` method:
|
|
|
|
```python
|
|
from app.models import Activity
|
|
|
|
Activity.log(
|
|
user_id=current_user.id,
|
|
action='created', # Action type
|
|
entity_type='project', # Entity type
|
|
entity_id=project.id,
|
|
entity_name=project.name,
|
|
description=f'Created project "{project.name}"',
|
|
extra_data={'client_id': client.id}, # Optional metadata
|
|
ip_address=request.remote_addr, # Optional
|
|
user_agent=request.headers.get('User-Agent') # Optional
|
|
)
|
|
```
|
|
|
|
**Best Practices:**
|
|
|
|
1. **Always log after successful operations** - Log after the database commit succeeds
|
|
2. **Provide clear descriptions** - Make descriptions human-readable
|
|
3. **Include relevant metadata** - Use `extra_data` for additional context
|
|
4. **Store entity names** - Cache the entity name in case it's deleted later
|
|
5. **Handle failures gracefully** - Activity logging includes built-in error handling
|
|
|
|
### Already Integrated
|
|
|
|
Activity logging is already integrated for:
|
|
- ✅ Projects (create, update, delete, archive, unarchive)
|
|
- ✅ Tasks (create, update, delete, status changes, assignments)
|
|
- ✅ Time Entries (start timer, stop timer, manual create, edit, delete)
|
|
- ⏳ Invoices (create, update, status change, payment, send) - *coming soon*
|
|
- ⏳ Clients (create, update, delete) - *coming soon*
|
|
- ⏳ Comments (create) - *coming soon*
|
|
|
|
## Use Cases
|
|
|
|
### Team Visibility
|
|
- See what your team members are working on
|
|
- Track project progress in real-time
|
|
- Understand team activity patterns
|
|
|
|
### Audit Trail
|
|
- Compliance and record-keeping
|
|
- Track who made what changes and when
|
|
- Identify suspicious or unusual activity
|
|
|
|
### Project Management
|
|
- Monitor task completion rates
|
|
- Track project milestones
|
|
- Review team productivity
|
|
|
|
### Troubleshooting
|
|
- Investigate issues by reviewing recent changes
|
|
- Identify when problems were introduced
|
|
- Track down missing or deleted items
|
|
|
|
## Configuration
|
|
|
|
No special configuration is required. The Activity Feed is enabled by default for all users.
|
|
|
|
### Database Indexes
|
|
|
|
The Activity model includes optimized indexes for:
|
|
- User-based queries (`user_id`, `created_at`)
|
|
- Entity lookups (`entity_type`, `entity_id`)
|
|
- Date range queries (`created_at`)
|
|
|
|
### Performance
|
|
|
|
- Activities are paginated to prevent slow page loads
|
|
- Old activities are automatically retained (no automatic cleanup)
|
|
- Database queries are optimized with proper indexes
|
|
- Widget auto-refreshes are throttled to every 30 seconds
|
|
|
|
## Privacy & Security
|
|
|
|
### Data Retention
|
|
- Activities are stored indefinitely by default
|
|
- Administrators can manually delete old activities if needed
|
|
- Consider implementing a retention policy for compliance
|
|
|
|
### Access Control
|
|
- Users can only see their own activities (unless admin)
|
|
- Administrators see all activities system-wide
|
|
- Activity logs cannot be edited or tampered with
|
|
- IP addresses and user agents are stored for security auditing
|
|
|
|
### GDPR Compliance
|
|
When a user requests data deletion:
|
|
1. Their activities are preserved for audit purposes
|
|
2. User information can be anonymized
|
|
3. Activities show "Deleted User" for anonymized accounts
|
|
|
|
## Troubleshooting
|
|
|
|
### Activities not appearing?
|
|
|
|
1. **Check permissions** - Regular users only see their own activities
|
|
2. **Verify integration** - Ensure the route has Activity.log() calls
|
|
3. **Database issues** - Check logs for database errors
|
|
4. **Browser cache** - Clear cache or hard refresh the dashboard
|
|
|
|
### Widget not loading?
|
|
|
|
1. **Check API endpoint** - Visit `/api/activities` directly
|
|
2. **JavaScript errors** - Check browser console for errors
|
|
3. **Authentication** - Ensure user is logged in
|
|
4. **Network issues** - Check network tab in dev tools
|
|
|
|
### Missing activities for certain actions?
|
|
|
|
Some features may not have activity logging integrated yet. Check the "Already Integrated" section above.
|
|
|
|
## Future Enhancements
|
|
|
|
Planned improvements for the Activity Feed:
|
|
|
|
- [ ] Export activities to CSV/JSON
|
|
- [ ] Email notifications for specific activities
|
|
- [ ] Advanced search and filtering
|
|
- [ ] Activity feed for specific projects/tasks
|
|
- [ ] Webhook integration for external systems
|
|
- [ ] Custom activity types and actions
|
|
- [ ] Activity trends and analytics dashboard
|
|
|
|
## Support
|
|
|
|
For issues or questions about the Activity Feed:
|
|
- Check the [FAQ](../faq.md)
|
|
- Review the [API Documentation](../api/README.md)
|
|
- Open an issue on GitHub
|
|
- Contact support
|
|
|