feat: Implement comprehensive promoter system with dashboard and role-based access
This commit implements a complete promoter system that allows professional users (is_professionnal: true) to manage events with advanced analytics and controls. ## Key Features Added: ### Role-Based Access Control - Update User#can_manage_events? to use is_professionnal field - Add promoter? alias method for semantic clarity - Restrict event management to professional users only ### Enhanced Navigation - Add conditional "Créer un événement" and "Mes événements" links - Display promoter navigation only for professional users - Include responsive mobile navigation with appropriate icons - Maintain clean UI for regular users ### Comprehensive Promoter Dashboard - Revenue metrics with total earnings calculation - Tickets sold counter across all events - Published vs draft events statistics - Monthly revenue trend chart (6 months) - Recent events widget with quick management actions - Recent orders table with customer information ### Advanced Analytics - Real-time revenue calculations from order data - Monthly revenue trends with visual progress bars - Event performance metrics and status tracking - Customer order history and transaction details ### Event Management Workflow - Verified existing event CRUD operations are comprehensive - Maintains easy-to-use interface for event creation/editing - State management system (draft → published → cancelled) - Quick action buttons for common operations ### Documentation - Comprehensive implementation guide in docs/ - Technical details and architecture explanations - Future enhancement recommendations - Testing and deployment considerations ## Technical Implementation: - Optimized database queries to prevent N+1 problems - Proper eager loading for dashboard performance - Responsive design with Tailwind CSS components - Clean separation of promoter vs regular user features - Maintainable code structure following Rails conventions 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,18 @@
|
||||
Tableau de bord
|
||||
<% end %>
|
||||
|
||||
<% if user_signed_in? && current_user.promoter? %>
|
||||
<%= link_to new_promoter_event_path,
|
||||
class: "text-gray-700 hover:text-brand-primary py-2 text-sm font-medium transition-colors duration-200 relative after:absolute after:bottom-0 after:left-0 after:h-0.5 after:w-0 hover:after:w-full after:bg-brand-primary after:transition-all after:duration-200" do %>
|
||||
Créer un événement
|
||||
<% end %>
|
||||
|
||||
<%= link_to promoter_events_path,
|
||||
class: "text-gray-700 hover:text-brand-primary py-2 text-sm font-medium transition-colors duration-200 relative after:absolute after:bottom-0 after:left-0 after:h-0.5 after:w-0 hover:after:w-full after:bg-brand-primary after:transition-all after:duration-200" do %>
|
||||
Mes événements
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<!-- <%= link_to "#",
|
||||
class: "text-gray-700 hover:text-brand-primary py-2 text-sm font-medium transition-colors duration-200 relative after:absolute after:bottom-0 after:left-0 after:h-0.5 after:w-0 hover:after:w-full after:bg-brand-primary after:transition-all after:duration-200" do %>
|
||||
Concerts
|
||||
@@ -93,10 +105,24 @@
|
||||
|
||||
<%= link_to dashboard_path,
|
||||
class: "flex items-center px-3 py-2 rounded-lg text-base font-medium text-gray-700 hover:text-brand-primary hover:bg-gray-50" do %>
|
||||
<i data-lucide="calendar" class="w-4 h-4 mr-3"></i>
|
||||
<i data-lucide="bar-chart-3" class="w-4 h-4 mr-3"></i>
|
||||
Tableau de bord
|
||||
<% end %>
|
||||
|
||||
<% if user_signed_in? && current_user.promoter? %>
|
||||
<%= link_to new_promoter_event_path,
|
||||
class: "flex items-center px-3 py-2 rounded-lg text-base font-medium text-gray-700 hover:text-brand-primary hover:bg-gray-50" do %>
|
||||
<i data-lucide="plus-circle" class="w-4 h-4 mr-3"></i>
|
||||
Créer un événement
|
||||
<% end %>
|
||||
|
||||
<%= link_to promoter_events_path,
|
||||
class: "flex items-center px-3 py-2 rounded-lg text-base font-medium text-gray-700 hover:text-brand-primary hover:bg-gray-50" do %>
|
||||
<i data-lucide="calendar-check" class="w-4 h-4 mr-3"></i>
|
||||
Mes événements
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<!-- <%= link_to events_path,
|
||||
class: "flex items-center px-3 py-2 rounded-lg text-base font-medium text-gray-700 hover:text-brand-primary hover:bg-gray-50" do %>
|
||||
<i data-lucide="glass-water" class="w-4 h-4 mr-3"></i>
|
||||
|
||||
Reference in New Issue
Block a user