weeks fixed
This commit is contained in:
1 parent
fb879b1a23
commit
8e2f6dac0c
3 files changed
+111
-49
No files matched your search
+21
-7
@@ -11,13 +11,27 @@
|
|||||||
"bot",
|
"bot",
|
||||||
"snot"
|
"snot"
|
||||||
],
|
],
|
||||||
"nate": [
|
"nate": {
|
||||||
"computer",
|
"weeks": [
|
||||||
"keyboard",
|
{
|
||||||
"mouse",
|
"date": "2025-08-03",
|
||||||
"screen",
|
"words": [
|
||||||
"printer"
|
"not",
|
||||||
],
|
"bot",
|
||||||
|
"snot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-10",
|
||||||
|
"words": [
|
||||||
|
"bate",
|
||||||
|
"hate",
|
||||||
|
"late"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"activeWeek": "2025-08-10"
|
||||||
|
},
|
||||||
"testuser": [
|
"testuser": [
|
||||||
"hello",
|
"hello",
|
||||||
"world",
|
"world",
|
||||||
|
|||||||
@@ -293,9 +293,35 @@ async function loadWordsForSelectedUser() {
|
|||||||
const selectedUser = document.getElementById("wordUserSelect").value;
|
const selectedUser = document.getElementById("wordUserSelect").value;
|
||||||
if (!selectedUser) return;
|
if (!selectedUser) return;
|
||||||
|
|
||||||
|
// Fetch the user's word list object (could be array or {weeks, activeWeek})
|
||||||
const res = await fetch(`/getWordList?username=${encodeURIComponent(selectedUser)}`);
|
const res = await fetch(`/getWordList?username=${encodeURIComponent(selectedUser)}`);
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
allWords = data.words || [];
|
allWords = data.words || [];
|
||||||
|
// Now also fetch the raw wordlists object to get weeks/activeWeek
|
||||||
|
const wordlistsRes = await fetch('/getWordlistsRaw');
|
||||||
|
const wordlists = await wordlistsRes.json();
|
||||||
|
const userList = wordlists[selectedUser];
|
||||||
|
// If userList is an object with weeks, populate week cards and dropdown
|
||||||
|
if (userList && typeof userList === 'object' && Array.isArray(userList.weeks)) {
|
||||||
|
// Clear current week cards
|
||||||
|
document.getElementById('weeksContainer').innerHTML = '';
|
||||||
|
userList.weeks.forEach(week => {
|
||||||
|
window.addWeekInput();
|
||||||
|
const cards = document.querySelectorAll('#weeksContainer .week-input-card');
|
||||||
|
const lastCard = cards[cards.length - 1];
|
||||||
|
if (lastCard) {
|
||||||
|
lastCard.querySelector('.week-date').value = week.date;
|
||||||
|
lastCard.querySelector('.week-words').value = (week.words || []).join('\n');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Repopulate the active week dropdown
|
||||||
|
window.populateActiveWeekDropdown();
|
||||||
|
// Set the dropdown to the saved activeWeek if present
|
||||||
|
if (userList.activeWeek) {
|
||||||
|
const select = document.getElementById('activeWeekSelect');
|
||||||
|
select.value = userList.activeWeek;
|
||||||
|
}
|
||||||
|
}
|
||||||
displayWordList();
|
displayWordList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,12 @@ const path = require('path');
|
|||||||
const app = express();
|
const app = express();
|
||||||
const PORT = 3000;
|
const PORT = 3000;
|
||||||
|
|
||||||
|
// Serve raw wordlists.json for admin UI (must come after app is defined)
|
||||||
|
app.get('/getWordlistsRaw', (req, res) => {
|
||||||
|
const wordlists = readJsonSafe(path.join(DATA_DIR, files.wordlists), {});
|
||||||
|
res.json(wordlists);
|
||||||
|
});
|
||||||
|
|
||||||
// 📁 Static assets
|
// 📁 Static assets
|
||||||
app.use(express.static('public'));
|
app.use(express.static('public'));
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
@@ -285,9 +291,23 @@ app.get('/getWordList', (req, res) => {
|
|||||||
console.log('Available wordlists:', Object.keys(wordLists));
|
console.log('Available wordlists:', Object.keys(wordLists));
|
||||||
|
|
||||||
// Get words for specific user
|
// Get words for specific user
|
||||||
const userWords = wordLists[username] || [];
|
let userWords = wordLists[username] || [];
|
||||||
|
// If the user's word list is an object (weeks/activeWeek)
|
||||||
|
if (userWords && typeof userWords === 'object' && !Array.isArray(userWords)) {
|
||||||
|
if (Array.isArray(userWords.weeks)) {
|
||||||
|
// If activeWeek is set, return only that week's words
|
||||||
|
if (userWords.activeWeek) {
|
||||||
|
const found = userWords.weeks.find(w => w.date === userWords.activeWeek);
|
||||||
|
userWords = found && Array.isArray(found.words) ? found.words : [];
|
||||||
|
} else {
|
||||||
|
// No activeWeek, flatten all words from all weeks
|
||||||
|
userWords = userWords.weeks.flatMap(w => Array.isArray(w.words) ? w.words : []);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
userWords = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
console.log(`Words found for ${username}:`, userWords);
|
console.log(`Words found for ${username}:`, userWords);
|
||||||
|
|
||||||
res.json({ words: userWords });
|
res.json({ words: userWords });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error in getWordList:', error);
|
console.error('Error in getWordList:', error);
|
||||||
@@ -295,47 +315,8 @@ app.get('/getWordList', (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Save a word list for a user
|
||||||
app.post('/saveWordList', (req, res) => {
|
app.post('/saveWordList', (req, res) => {
|
||||||
// Save multiple weeks with dates for a user
|
|
||||||
app.post('/saveWeeksWordList', (req, res) => {
|
|
||||||
// Set active week for a user
|
|
||||||
app.post('/setActiveWeek', (req, res) => {
|
|
||||||
const { username, activeWeek } = req.body;
|
|
||||||
if (typeof username !== 'string' || typeof activeWeek !== 'string') {
|
|
||||||
return res.status(400).send('Invalid data');
|
|
||||||
}
|
|
||||||
const wordlistsPath = path.join(DATA_DIR, files.wordlists);
|
|
||||||
const wordlists = readJsonSafe(wordlistsPath);
|
|
||||||
if (!wordlists[username]) {
|
|
||||||
return res.status(404).send('User not found');
|
|
||||||
}
|
|
||||||
if (typeof wordlists[username] === 'object') {
|
|
||||||
wordlists[username].activeWeek = activeWeek;
|
|
||||||
} else {
|
|
||||||
wordlists[username] = { weeks: [], activeWeek };
|
|
||||||
}
|
|
||||||
fs.writeFileSync(wordlistsPath, JSON.stringify(wordlists, null, 2));
|
|
||||||
res.send(`✅ Active week set for ${username}: ${activeWeek}`);
|
|
||||||
});
|
|
||||||
const { username, weeks } = req.body;
|
|
||||||
if (
|
|
||||||
typeof username !== 'string' ||
|
|
||||||
!Array.isArray(weeks) ||
|
|
||||||
weeks.length > 100 ||
|
|
||||||
weeks.some(w => typeof w.date !== 'string' || !Array.isArray(w.words) || w.words.some(word => typeof word !== 'string'))
|
|
||||||
) return res.status(400).send('Invalid weeks data');
|
|
||||||
|
|
||||||
const userList = readJsonSafe(path.join(DATA_DIR, files.users), []);
|
|
||||||
if (!userList.find(u => u.username === username)) {
|
|
||||||
return res.status(404).send('User not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
const wordlistsPath = path.join(DATA_DIR, files.wordlists);
|
|
||||||
const wordlists = readJsonSafe(wordlistsPath);
|
|
||||||
wordlists[username] = { weeks };
|
|
||||||
fs.writeFileSync(wordlistsPath, JSON.stringify(wordlists, null, 2));
|
|
||||||
res.send(`✅ Weeks word list saved for ${username}`);
|
|
||||||
});
|
|
||||||
const { username, words } = req.body;
|
const { username, words } = req.body;
|
||||||
if (
|
if (
|
||||||
typeof username !== 'string' ||
|
typeof username !== 'string' ||
|
||||||
@@ -356,6 +337,47 @@ app.post('/setActiveWeek', (req, res) => {
|
|||||||
res.send(`✅ Word list saved for ${username}`);
|
res.send(`✅ Word list saved for ${username}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Save multiple weeks with dates for a user
|
||||||
|
app.post('/saveWeeksWordList', (req, res) => {
|
||||||
|
const { username, weeks } = req.body;
|
||||||
|
if (
|
||||||
|
typeof username !== 'string' ||
|
||||||
|
!Array.isArray(weeks) ||
|
||||||
|
weeks.length > 100 ||
|
||||||
|
weeks.some(w => typeof w.date !== 'string' || !Array.isArray(w.words) || w.words.some(word => typeof word !== 'string'))
|
||||||
|
) return res.status(400).send('Invalid weeks data');
|
||||||
|
|
||||||
|
const userList = readJsonSafe(path.join(DATA_DIR, files.users), []);
|
||||||
|
if (!userList.find(u => u.username === username)) {
|
||||||
|
return res.status(404).send('User not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
const wordlistsPath = path.join(DATA_DIR, files.wordlists);
|
||||||
|
const wordlists = readJsonSafe(wordlistsPath);
|
||||||
|
wordlists[username] = { weeks };
|
||||||
|
fs.writeFileSync(wordlistsPath, JSON.stringify(wordlists, null, 2));
|
||||||
|
res.send(`✅ Weeks word list saved for ${username}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set active week for a user
|
||||||
|
app.post('/setActiveWeek', (req, res) => {
|
||||||
|
const { username, activeWeek } = req.body;
|
||||||
|
if (typeof username !== 'string' || typeof activeWeek !== 'string') {
|
||||||
|
return res.status(400).send('Invalid data');
|
||||||
|
}
|
||||||
|
const wordlistsPath = path.join(DATA_DIR, files.wordlists);
|
||||||
|
const wordlists = readJsonSafe(wordlistsPath);
|
||||||
|
if (!wordlists[username] || typeof wordlists[username] !== 'object') {
|
||||||
|
return res.status(404).send('User not found or no weeks data');
|
||||||
|
}
|
||||||
|
wordlists[username].activeWeek = activeWeek;
|
||||||
|
fs.writeFileSync(wordlistsPath, JSON.stringify(wordlists, null, 2));
|
||||||
|
res.send(`✅ Active week set for ${username}: ${activeWeek}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set active week for a user
|
||||||
|
// ...existing code...
|
||||||
|
|
||||||
// 📊 Results
|
// 📊 Results
|
||||||
app.get('/getResults', (req, res) => {
|
app.get('/getResults', (req, res) => {
|
||||||
const results = readJsonSafe(path.join(DATA_DIR, files.results));
|
const results = readJsonSafe(path.join(DATA_DIR, files.results));
|
||||||
|
|||||||
Reference in new issue
Block a user