refactor: replace date preview flow with single Create Season button
Remove two-step preview+add flow. One button now generates dates, skips duplicates, and saves directly with a clear result message. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
7273b76c52
commit
c66fefcc19
@ -187,15 +187,10 @@
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group" style="justify-content: flex-end;">
|
||||
<button class="btn btn-secondary" onclick="previewDates()">Preview Dates</button>
|
||||
<button class="btn" onclick="createSeason()">Create Season</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="msg" id="dates-msg"></div>
|
||||
<div id="preview-box">
|
||||
<div id="preview-summary"></div>
|
||||
<div id="preview-dates"></div>
|
||||
<button class="btn" id="add-dates-btn" onclick="addDates()" style="display:none;"></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PLAYER MANAGEMENT -->
|
||||
@ -228,7 +223,6 @@
|
||||
<script>
|
||||
let existingDates = [];
|
||||
let allPlayers = [];
|
||||
let previewResult = null;
|
||||
|
||||
// Block XSS chars in text inputs
|
||||
document.querySelectorAll('input[type="text"]').forEach(inp => {
|
||||
@ -310,16 +304,17 @@
|
||||
return dates;
|
||||
}
|
||||
|
||||
function previewDates() {
|
||||
async function createSeason() {
|
||||
const startStr = document.getElementById('start-date').value.trim();
|
||||
const weeks = parseInt(document.getElementById('weeks').value);
|
||||
const dayOfWeek = parseInt(document.getElementById('day-of-week').value);
|
||||
const datesMsg = document.getElementById('dates-msg');
|
||||
datesMsg.textContent = '';
|
||||
datesMsg.className = 'msg';
|
||||
|
||||
if (!/^\d{2}\/\d{2}\/\d{2}$/.test(startStr)) {
|
||||
datesMsg.className = 'msg err';
|
||||
datesMsg.textContent = 'Invalid start date. Use DD/MM/YY format.';
|
||||
datesMsg.textContent = 'Invalid start date. Use DD/MM/YY format (e.g. 02/04/26).';
|
||||
return;
|
||||
}
|
||||
if (!weeks || weeks < 1 || weeks > 104) {
|
||||
@ -335,42 +330,20 @@
|
||||
return;
|
||||
}
|
||||
|
||||
const existingSet = new Set(existingDates);
|
||||
const newDates = generated.filter(d => !existingSet.has(d));
|
||||
const dupDates = generated.filter(d => existingSet.has(d));
|
||||
|
||||
previewResult = { generated, newDates };
|
||||
|
||||
const summaryEl = document.getElementById('preview-summary');
|
||||
summaryEl.textContent = `${generated.length} dates total: ${newDates.length} new, ${dupDates.length} already in database (skipped).`;
|
||||
|
||||
const datesEl = document.getElementById('preview-dates');
|
||||
datesEl.innerHTML = generated.map(d => {
|
||||
const isNew = !existingSet.has(d);
|
||||
return `<span class="date-chip ${isNew ? 'new' : 'dup'}">${d}</span>`;
|
||||
}).join('');
|
||||
|
||||
const addBtn = document.getElementById('add-dates-btn');
|
||||
if (newDates.length > 0) {
|
||||
addBtn.style.display = '';
|
||||
addBtn.textContent = `Add ${newDates.length} New Date${newDates.length !== 1 ? 's' : ''} to Database`;
|
||||
} else {
|
||||
addBtn.style.display = 'none';
|
||||
}
|
||||
|
||||
document.getElementById('preview-box').style.display = '';
|
||||
}
|
||||
|
||||
async function addDates() {
|
||||
if (!previewResult || previewResult.newDates.length === 0) return;
|
||||
const datesMsg = document.getElementById('dates-msg');
|
||||
datesMsg.textContent = '';
|
||||
|
||||
// Fetch current full data, merge new dates, POST back
|
||||
// Fetch current data and skip existing dates
|
||||
const res = await fetch('/api/data');
|
||||
const data = await res.json();
|
||||
const mergedDates = [...(data.dates || []), ...previewResult.newDates];
|
||||
const existingSet = new Set(data.dates || []);
|
||||
const newDates = generated.filter(d => !existingSet.has(d));
|
||||
const skipped = generated.length - newDates.length;
|
||||
|
||||
if (newDates.length === 0) {
|
||||
datesMsg.className = 'msg ok';
|
||||
datesMsg.textContent = `All ${generated.length} dates already exist in the database — nothing to add.`;
|
||||
return;
|
||||
}
|
||||
|
||||
const mergedDates = [...(data.dates || []), ...newDates];
|
||||
const payload = {
|
||||
players: data.players || [],
|
||||
guest: data.guest || 'Guest',
|
||||
@ -387,16 +360,12 @@
|
||||
const result = await postRes.json();
|
||||
|
||||
if (result.status === 'success') {
|
||||
datesMsg.className = 'msg ok';
|
||||
datesMsg.textContent = `${previewResult.newDates.length} date${previewResult.newDates.length !== 1 ? 's' : ''} added successfully.`;
|
||||
existingDates = mergedDates;
|
||||
previewResult = null;
|
||||
document.getElementById('add-dates-btn').style.display = 'none';
|
||||
// Re-mark chips as duplicates
|
||||
previewDates();
|
||||
datesMsg.className = 'msg ok';
|
||||
datesMsg.textContent = `Done — ${newDates.length} date${newDates.length !== 1 ? 's' : ''} added${skipped ? `, ${skipped} already existed (skipped)` : ''}.`;
|
||||
} else {
|
||||
datesMsg.className = 'msg err';
|
||||
datesMsg.textContent = result.message || 'Error adding dates.';
|
||||
datesMsg.textContent = result.message || 'Error saving dates.';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user