mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 18:52:56 +00:00
133 lines
5.2 KiB
Markdown
133 lines
5.2 KiB
Markdown
# Finished Matches Display Feature
|
|
|
|
## Overview
|
|
Implemented a feature to display recent finished matches with scores on the homepage for a configurable number of days (default: 2 days). This ensures that visitors can see match results for a period of time before the next upcoming match is displayed.
|
|
|
|
## Implementation Details
|
|
|
|
### Backend Changes
|
|
|
|
#### 1. Database Model (`internal/models/models.go`)
|
|
Added new field to the `Settings` struct:
|
|
```go
|
|
// Homepage matches display configuration
|
|
FinishedMatchDisplayDays int `gorm:"default:2" json:"finished_match_display_days"` // Number of days to show finished matches with scores on homepage
|
|
```
|
|
|
|
#### 2. Database Migration
|
|
Created migration files:
|
|
- `database/migrations/000025_add_finished_match_display_days.up.sql`
|
|
- `database/migrations/000025_add_finished_match_display_days.down.sql`
|
|
|
|
To apply the migration, run:
|
|
```bash
|
|
make migrate-up
|
|
```
|
|
|
|
### Frontend Changes
|
|
|
|
#### 1. TypeScript Types (`frontend/src/services/settings.ts`)
|
|
Added the field to the `AdminSettings` type:
|
|
```typescript
|
|
// Homepage matches display configuration
|
|
finished_match_display_days?: number; // Number of days to show finished matches with scores on homepage
|
|
```
|
|
|
|
#### 2. Homepage Logic (`frontend/src/pages/HomePage.tsx`)
|
|
Updated the match filtering logic to:
|
|
- Load the `finished_match_display_days` setting (defaults to 2 days)
|
|
- Filter for recent finished matches that:
|
|
- Have a score available
|
|
- Occurred within the configured number of days
|
|
- Are in the past
|
|
- Display the most recent finished match with score **before** the next upcoming match
|
|
- Show the score prominently in the "Next Match" section when displaying a finished match
|
|
|
|
**Key Logic:**
|
|
```typescript
|
|
// Get recent finished matches with scores (within display days)
|
|
const recentFinished = allMatches
|
|
.filter((m) =>
|
|
matchTime < now &&
|
|
matchTime >= cutoffTime &&
|
|
m.score // Only show if there's a score
|
|
)
|
|
.sort((a, b) => b.time - a.time); // Most recent first
|
|
|
|
// Show recent finished match first if exists, then upcoming matches
|
|
const chosen = recentFinished.length > 0 ? [...recentFinished.slice(0, 1), ...upcoming] : upcoming;
|
|
```
|
|
|
|
**Display Logic:**
|
|
When a finished match is shown in the "Next Match" section:
|
|
- Shows the final score instead of countdown
|
|
- Displays "Skončeno" (Finished) instead of "Začátek zápasu" (Match start)
|
|
- Maintains the same layout with team logos and names
|
|
|
|
#### 3. Admin UI (`frontend/src/pages/admin/SettingsAdminPage.tsx`)
|
|
Added configuration field in the General Settings tab:
|
|
- **Label:** "Počet dní zobrazení dokončených zápasů"
|
|
- **Type:** Number input (0-30 days)
|
|
- **Default:** 2 days
|
|
- **Helper Text:** Explains that this controls how long finished matches with scores are displayed on the homepage
|
|
|
|
## Usage
|
|
|
|
### For Administrators
|
|
1. Go to Admin Panel → Settings → General (Nastavení)
|
|
2. Scroll to "Zobrazení zápasů" section
|
|
3. Set the desired number of days (0-30) to show finished matches
|
|
4. Click "Uložit nastavení" to save
|
|
|
|
### Behavior
|
|
- **If set to 0:** Finished matches are never shown; only upcoming matches are displayed
|
|
- **If set to 2 (default):** A finished match with a score will be shown for 2 days after it finishes, then switches to the next upcoming match
|
|
- **If set to 7:** Results are shown for a full week before switching
|
|
|
|
## Technical Details
|
|
|
|
### Match Selection Priority
|
|
1. **Recent finished match with score** (within configured days) - shown first
|
|
2. **Next upcoming match** - shown if no recent finished match or after the display period expires
|
|
3. **Fallback to first available match** - if neither of above are available
|
|
|
|
### Score Display Requirements
|
|
A match must have:
|
|
- A valid `score` field (e.g., "2:1", "0:0")
|
|
- A match time in the past
|
|
- A match time within the configured display window
|
|
|
|
### Cache & Performance
|
|
- The setting is cached with other settings in `/cache/prefetch/settings.json`
|
|
- Frontend reads the setting once on page load
|
|
- Changes take effect after saving settings and refreshing the homepage
|
|
|
|
## Files Modified
|
|
|
|
### Backend
|
|
- `internal/models/models.go` - Added field to Settings model
|
|
- `database/migrations/000025_add_finished_match_display_days.up.sql` - Migration up
|
|
- `database/migrations/000025_add_finished_match_display_days.down.sql` - Migration down
|
|
|
|
### Frontend
|
|
- `frontend/src/services/settings.ts` - Added TypeScript type
|
|
- `frontend/src/pages/HomePage.tsx` - Implemented match filtering logic
|
|
- `frontend/src/pages/admin/SettingsAdminPage.tsx` - Added admin UI configuration
|
|
|
|
## Testing
|
|
|
|
### Manual Testing Steps
|
|
1. Ensure a match has finished with a score in the FACR data
|
|
2. Set `finished_match_display_days` to a value like 7 days
|
|
3. Verify the finished match appears in the "Next Match" section with the score
|
|
4. Verify it shows "Skončeno" instead of countdown
|
|
5. Set the value to 0 days
|
|
6. Verify only upcoming matches are shown
|
|
7. Test with multiple competitions using the carousel arrows
|
|
|
|
## Future Enhancements
|
|
- Add option to show multiple finished matches (currently only shows the most recent one)
|
|
- Add visual distinction for finished vs upcoming matches in the matches slider
|
|
- Option to hide finished matches without scores
|
|
- Configurable display format for finished matches (e.g., "Final", "FT", etc.)
|