Files
MyClub/DOCS/NAVIGATION_MANAGEMENT_SYSTEM.md
Tomáš Dvořák 12cba639b9 upload
2025-10-16 13:32:05 +02:00

8.3 KiB

Navigation Management System - Implementation Summary

Overview

Successfully implemented a complete dynamic navigation management system that allows administrators to manage both frontend (public website) and admin panel navigation through a unified interface.

Key Features Implemented

1. Unified Navigation Management

  • Single admin interface (/admin/navigace) to manage:
    • Webová navigace: Public website navigation menu
    • Admin panel: Admin sidebar navigation
    • Sociální sítě: Social media links
  • Separate tabs for each navigation type
  • Visual drag-and-drop reordering (up/down buttons)
  • Support for nested navigation (dropdown menus)

2. Auto-Seeding Functionality

The system automatically creates default navigation items when the database is empty:

Frontend Navigation (12 items):

  • Domů, O klubu, Kalendář, Zápasy, Aktivity
  • Hráči, Tabulky, Články, Videa, Fotogalerie
  • Sponzoři, Kontakt

Admin Panel Navigation (26 items):

  • Hlavní: Nástěnka, Analytika
  • Obsah: Týmy, Zápasy, Aktivity, Hráči, Články, O klubu, Videa, Galerie, Scoreboard, Scoreboard Remote, Oblečení, Sponzoři, Bannery, Zprávy, Kontakty, Zpravodaj, Ankety
  • Nastavení: Navigace, Alias soutěží, Prefetch & Cache, Uživatelé, Nastavení, Soubory
  • Nápověda: Dokumentace

3. Dynamic Loading

  • Both frontend (Navbar.tsx) and admin sidebar (AdminSidebar.tsx) now load navigation from the API
  • Graceful fallback to hardcoded navigation if API fails
  • Automatic seeding triggers when navigation is empty

4. Navigation Types Supported

  • page: Links to predefined frontend pages (e.g., home, about, blog)
  • internal: Custom internal URLs (both frontend and admin)
  • external: External links (opens in new tab)
  • dropdown: Parent items with children (for sub-menus)

Technical Changes

Backend (Go)

1. Models (internal/models/navigation.go)

Enhanced GetURL() method to support both frontend and admin page types:

  • Added admin URL mapping for all admin pages
  • Automatic URL generation based on page_type and requires_admin flag

2. Controller (internal/controllers/navigation_controller.go)

Updated SeedDefaultNavigation() endpoint:

  • Creates 12 frontend navigation items
  • Creates 26 admin panel navigation items
  • Returns detailed count: frontend_count, admin_count, count

Frontend (TypeScript/React)

1. Navigation Service (services/navigation.ts)

Already had all necessary API endpoints:

  • getAllNavigationItems() - Get all nav items (admin)
  • getNavigationItems() - Get public nav items
  • seedDefaultNavigation() - Trigger auto-seeding

2. Admin Sidebar (components/admin/AdminSidebar.tsx)

  • Added: Dynamic navigation loading from API
  • Added: Auto-seeding when admin navigation is empty
  • Added: Icon mapping for all page types
  • Added: Loading spinner during fetch
  • Kept: Fallback to hardcoded navigation if API fails
  • Special: MyUIbrix Editor button added dynamically
  • Badge: Upcoming activities count maintained

3. Frontend Navbar (components/Navbar.tsx)

  • Added: Auto-seeding when navigation is empty (admin only)
  • Enhanced: Better handling of dynamic vs. hardcoded navigation
  • Maintains existing fallback behavior

4. Navigation Admin Page (pages/admin/NavigationAdminPage.tsx)

  • Added: Auto-seeding on first data load
  • Enhanced: Shows toast notification when auto-seeding occurs
  • Fixed: Better error handling
  • Split display between frontend and admin items

How It Works

First-Time Setup Flow

  1. User navigates to /admin/navigace
  2. System detects empty navigation database
  3. Automatically triggers seedDefaultNavigation()
  4. Creates 38 default navigation items (12 frontend + 26 admin)
  5. Shows success toast notification
  6. Loads and displays all items

Navigation Display Flow

Frontend:

  1. Navbar.tsx loads on page mount
  2. Calls getNavigationItems() API
  3. If empty and user is admin → auto-seed
  4. Displays dynamic navigation or falls back to hardcoded

Admin Panel:

  1. AdminSidebar.tsx loads on admin page mount
  2. Calls getAllNavigationItems() API
  3. Filters items where requires_admin = true
  4. If empty and user is admin → auto-seed
  5. Displays dynamic navigation or falls back to hardcoded

Management Flow

  1. Admin navigates to /admin/navigace
  2. Three tabs available:
    • Webová navigace: Manage public menu (shows frontend items)
    • Admin panel: Manage admin sidebar (shows admin items)
    • Sociální sítě: Manage social links
  3. Can add, edit, delete, reorder, hide/show items
  4. Changes reflect immediately on respective interfaces

Database Structure

navigation_items table

  • id - Primary key
  • label - Display text
  • url - Custom URL (optional)
  • type - internal/external/dropdown/page
  • page_type - Predefined page identifier
  • visible - Show/hide toggle
  • display_order - Sort order
  • parent_id - For nested items
  • requires_admin - Admin panel vs. frontend flag
  • target - _self or _blank

API Endpoints

  • GET /api/v1/navigation - Public navigation items
  • GET /api/v1/admin/navigation - All navigation items
  • POST /api/v1/admin/navigation - Create item
  • PUT /api/v1/admin/navigation/:id - Update item
  • DELETE /api/v1/admin/navigation/:id - Delete item
  • POST /api/v1/admin/navigation/reorder - Reorder items
  • POST /api/v1/admin/navigation/seed - Seed default navigation

Benefits

  1. Fully Manageable: Admins can customize both frontend and admin navigation
  2. Zero Configuration: Auto-seeding means it works out of the box
  3. Flexible: Supports nested menus, external links, custom URLs
  4. User-Friendly: Visual interface with drag-and-drop reordering
  5. Backward Compatible: Fallback to hardcoded navigation if needed
  6. Scalable: Easy to add new navigation items or pages

Usage Instructions

For Administrators

To Manage Navigation:

  1. Go to /admin/navigace
  2. Select the tab you want to manage
  3. Use "Přidat hlavní položku" to add new items
  4. Click up/down arrows to reorder
  5. Click edit icon to modify
  6. Toggle visibility switch to hide/show
  7. Changes apply immediately

To Add Custom Page:

  1. Click "Přidat hlavní položku"
  2. Enter label (e.g., "Vlastní stránka")
  3. Select type:
    • page: Select from predefined pages
    • internal: Enter custom URL (e.g., /custom-page)
    • external: Enter full URL (e.g., https://example.com)
    • dropdown: Create parent for sub-items
  4. Click "Uložit"

To Create Dropdown Menu:

  1. Create parent item with type "dropdown"
  2. After saving, click "Přidat podpoložku" button on parent
  3. Add child items
  4. Children appear in hover dropdown on frontend

For Developers

To Add New Predefined Page:

  1. Add page type to PAGE_TYPE_OPTIONS in NavigationAdminPage.tsx
  2. Add URL mapping in navigation.go model's GetURL() method
  3. Page will be available in dropdown selector

Testing Checklist

  • Auto-seeding works on empty database
  • Frontend navigation loads from API
  • Admin sidebar loads from API
  • Reordering works correctly
  • Add/Edit/Delete operations work
  • Visibility toggle works
  • Dropdown menus render correctly
  • External links open in new tab
  • Icons map correctly to page types
  • Fallback navigation works if API fails
  • Badge counts display correctly

Known Limitations

  1. Social links management UI exists but social icons in navbar still use settings (can be enhanced)
  2. Nested navigation only supports one level of children
  3. Icon selection is automatic based on page type (no custom icon picker yet)

Future Enhancements

  1. Custom icon selection for navigation items
  2. Multi-level nested navigation support
  3. Access control per navigation item (role-based)
  4. Navigation preview mode
  5. Import/export navigation configuration
  6. Drag-and-drop visual reordering
  7. Navigation item duplication feature

Conclusion

The navigation management system is now fully functional and provides a complete solution for managing both frontend and admin panel navigation through a single, intuitive interface. The auto-seeding feature ensures the system works immediately after deployment without manual configuration.