🎨 Refactor tournament display logic by replacing inline components with reusable TournamentGrid and TournamentDetail components
This commit is contained in:
@@ -161,150 +161,34 @@
|
|||||||
{{ loading ? 'Loading...' : 'List My Tournaments' }}
|
{{ loading ? 'Loading...' : 'List My Tournaments' }}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div v-if="error" class="error-box">
|
<div v-if="error" class="error-message">{{ error }}</div>
|
||||||
<strong>Errors:</strong>
|
<div v-if="paginationInfo" class="pagination-info">
|
||||||
<ul class="error-list">
|
{{ paginationInfo }}
|
||||||
<li
|
</div>
|
||||||
v-for="(err, index) in Array.isArray(error) ? error : [error]"
|
|
||||||
:key="index"
|
<!-- Tournament Grid Component -->
|
||||||
|
<TournamentGrid
|
||||||
|
:tournaments="tournaments"
|
||||||
|
:loading="loading"
|
||||||
|
:loading-more="loadingMore"
|
||||||
|
:error="error"
|
||||||
|
v-model:search-query="searchQuery"
|
||||||
|
:filtered-tournaments="filteredTournaments"
|
||||||
|
:expanded-tournament-id="expandedTournamentId"
|
||||||
|
:has-next-page="hasNextPage"
|
||||||
|
:api-version="apiVersion"
|
||||||
|
@load-more="loadMoreTournaments"
|
||||||
|
@toggle-details="toggleTournamentDetails"
|
||||||
>
|
>
|
||||||
<span class="error-status">{{ err.status || 'Error' }}:</span>
|
<template #tournament-details="{ tournament, isExpanded }">
|
||||||
<span class="error-message">{{
|
<TournamentDetail
|
||||||
err.message || err.detail || err
|
:tournament-details="tournamentDetails"
|
||||||
}}</span>
|
:loading="tournamentDetailsState.isLoading.value"
|
||||||
<span v-if="err.field" class="error-field"
|
:error="tournamentDetailsState.error.value"
|
||||||
>({{ err.field }})</span
|
:is-expanded="isExpanded"
|
||||||
>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="help-text">
|
|
||||||
<p>Common issues:</p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<strong>401 Unauthorized:</strong> Invalid API key - check API
|
|
||||||
Key Manager
|
|
||||||
</li>
|
|
||||||
<li><strong>403 Forbidden:</strong> Insufficient permissions</li>
|
|
||||||
<li>
|
|
||||||
<strong>404 Not Found:</strong> Tournament may have been deleted
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<strong>Network Error:</strong> Connection problems or CORS
|
|
||||||
issues
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="tournaments" class="results">
|
|
||||||
<div class="results-header">
|
|
||||||
<h3>✅ Success!</h3>
|
|
||||||
<p class="pagination-info">{{ paginationInfo }}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="tournaments.length === 0" class="info-box">
|
|
||||||
No tournaments found. Create one at
|
|
||||||
<a href="https://challonge.com" target="_blank">Challonge.com</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-else>
|
|
||||||
<!-- Search Filter -->
|
|
||||||
<div class="search-box">
|
|
||||||
<input
|
|
||||||
v-model="searchQuery"
|
|
||||||
type="text"
|
|
||||||
placeholder="🔍 Search tournaments by name (client-side)..."
|
|
||||||
class="search-input"
|
|
||||||
/>
|
/>
|
||||||
<span v-if="searchQuery" class="search-info">
|
</template>
|
||||||
Showing {{ filteredTournaments.length }} of
|
</TournamentGrid>
|
||||||
{{ tournaments.length }} tournaments
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="tournament-list">
|
|
||||||
<div
|
|
||||||
v-for="tournament in filteredTournaments"
|
|
||||||
:key="getTournamentId(tournament)"
|
|
||||||
class="tournament-card"
|
|
||||||
>
|
|
||||||
<div class="tournament-header">
|
|
||||||
<h4>{{ getTournamentName(tournament) }}</h4>
|
|
||||||
<span
|
|
||||||
class="tournament-state"
|
|
||||||
:class="getTournamentProp(tournament, 'state')"
|
|
||||||
>
|
|
||||||
{{ getTournamentProp(tournament, 'state') }}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="tournament-details">
|
|
||||||
<p>
|
|
||||||
<strong>URL:</strong>
|
|
||||||
{{ getTournamentProp(tournament, 'url') }}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<strong>Type:</strong>
|
|
||||||
{{ getTournamentProp(tournament, 'tournament_type') }}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<strong>Participants:</strong>
|
|
||||||
{{ getTournamentProp(tournament, 'participants_count') }}
|
|
||||||
</p>
|
|
||||||
<p v-if="getTournamentProp(tournament, 'started_at')">
|
|
||||||
<strong>Started:</strong>
|
|
||||||
{{
|
|
||||||
formatDate(getTournamentProp(tournament, 'started_at'))
|
|
||||||
}}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
@click="toggleTournamentDetails(getTournamentId(tournament))"
|
|
||||||
class="btn btn-small"
|
|
||||||
:class="{
|
|
||||||
'btn-active':
|
|
||||||
expandedTournamentId === getTournamentId(tournament)
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
{{
|
|
||||||
expandedTournamentId === getTournamentId(tournament)
|
|
||||||
? 'Hide Details'
|
|
||||||
: 'Load Details'
|
|
||||||
}}
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<!-- Collapsible Details Section -->
|
|
||||||
<div
|
|
||||||
v-if="
|
|
||||||
expandedTournamentId === getTournamentId(tournament) &&
|
|
||||||
tournamentDetails
|
|
||||||
"
|
|
||||||
class="tournament-details-inline"
|
|
||||||
>
|
|
||||||
<div class="details-header">
|
|
||||||
<h4>Full Tournament Details</h4>
|
|
||||||
</div>
|
|
||||||
<pre class="details-content">{{
|
|
||||||
JSON.stringify(tournamentDetails, null, 2)
|
|
||||||
}}</pre>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Load More Button (v2.1 only) -->
|
|
||||||
<div
|
|
||||||
v-if="apiVersion === 'v2.1' && hasNextPage"
|
|
||||||
class="load-more-section"
|
|
||||||
>
|
|
||||||
<button
|
|
||||||
@click="loadMoreTournaments"
|
|
||||||
:disabled="loadingMore"
|
|
||||||
class="btn btn-secondary"
|
|
||||||
>
|
|
||||||
{{ loadingMore ? 'Loading...' : 'Load More Tournaments' }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Configuration Instructions -->
|
<!-- Configuration Instructions -->
|
||||||
|
|||||||
Reference in New Issue
Block a user