268 lines
8.8 KiB
JavaScript
268 lines
8.8 KiB
JavaScript
|
|
import API from "../../api.js";
|
|
import TableBasePage from "../base_table.js";
|
|
import Utils from "../../lib/utils.js";
|
|
|
|
export default class PageMtgGames extends TableBasePage {
|
|
static hash = hashPageMtgGames;
|
|
static attrIdRowObject = attrGameId;
|
|
callSaveTableContent = API.saveGame;
|
|
|
|
constructor(router) {
|
|
super(router);
|
|
}
|
|
|
|
initialize() {
|
|
this.sharedInitialize();
|
|
}
|
|
hookupFilters() {
|
|
/*
|
|
this.sharedHookupFilters();
|
|
this.hookupFilterActive();
|
|
*/
|
|
}
|
|
|
|
loadRowTable(rowJson) {
|
|
if (rowJson == null) return;
|
|
if (_verbose) { Utils.consoleLogIfNotProductionEnvironment("applying data row: ", rowJson); }
|
|
}
|
|
getJsonRow(row) {
|
|
return;
|
|
}
|
|
initialiseRowNew(tbody, row) {
|
|
}
|
|
postInitialiseRowNewCallback(tbody) {
|
|
}
|
|
|
|
hookupTableMain() {
|
|
super.hookupTableMain();
|
|
// this.hookupTableMainRows();
|
|
this.hookupTcgGames();
|
|
// PageMtgGames.hideNewGameForm();
|
|
}
|
|
hookupTcgGames() {
|
|
console.log("hookupTableMain PageMtgGames");
|
|
// Initialize form submission
|
|
const newGameForm = document.getElementById('newGameForm');
|
|
if (newGameForm) {
|
|
newGameForm.addEventListener('submit', this.handleNewGameSubmit.bind(this)); // () => { this.handleNewGameSubmit.bind(this); });
|
|
}
|
|
|
|
// Initialize filter form
|
|
const filterForm = document.getElementById('formFilters');
|
|
if (filterForm) {
|
|
filterForm.addEventListener('submit', PageMtgGames.handleFilterSubmit);
|
|
}
|
|
|
|
// Close modal on escape key
|
|
document.addEventListener('keydown', function(e) {
|
|
if (e.key === 'Escape') {
|
|
PageMtgGames.hideNewGameForm();
|
|
}
|
|
});
|
|
|
|
// Close modal on backdrop click
|
|
const modal = document.getElementById('newGameModal');
|
|
if (modal) {
|
|
modal.addEventListener('click', function(e) {
|
|
if (e.target === modal) {
|
|
PageMtgGames.hideNewGameForm();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Button onclicks
|
|
const newGameButton = document.getElementById('btnNewGame');
|
|
if (newGameButton) {
|
|
newGameButton.addEventListener('click', PageMtgGames.showNewGameForm);
|
|
}
|
|
const cancelNewGameButtons = document.querySelectorAll(
|
|
'#newGameForm .form-actions .btn-tcg.btn-tcg-secondary'
|
|
+ ','
|
|
+ '#newGameModal .modal-content .modal-header .modal-close'
|
|
);
|
|
if (cancelNewGameButtons.length > 0) {
|
|
cancelNewGameButtons.forEach((button) => {
|
|
button.addEventListener('click', PageMtgGames.hideNewGameForm);
|
|
});
|
|
}
|
|
|
|
}
|
|
static showNewGameForm() {
|
|
const modal = document.getElementById('newGameModal');
|
|
if (modal) {
|
|
modal.classList.remove(flagIsCollapsed);
|
|
document.body.style.overflow = 'hidden';
|
|
|
|
// Focus on first input
|
|
const firstInput = modal.querySelector('input, select');
|
|
if (firstInput) {
|
|
firstInput.focus();
|
|
}
|
|
}
|
|
}
|
|
static hideNewGameForm() {
|
|
const modal = document.getElementById('newGameModal');
|
|
if (modal) {
|
|
modal.classList.add(flagIsCollapsed);
|
|
document.body.style.overflow = '';
|
|
|
|
// Reset form
|
|
const form = document.getElementById('newGameForm');
|
|
if (form) {
|
|
form.reset();
|
|
}
|
|
}
|
|
}
|
|
async handleNewGameSubmit(e) {
|
|
e.preventDefault();
|
|
|
|
const form = e.target;
|
|
const formData = new FormData(form);
|
|
|
|
const gameType = formData.get('game_type');
|
|
const gameData = {
|
|
[attrGameId]: -1
|
|
, [flagIsCommander]: gameType === 'commander'
|
|
, [flagIsDraft]: gameType === 'draft'
|
|
, [flagIsSealed]: gameType === 'sealed'
|
|
, [flagLocationName]: formData.get(flagLocationName) || null
|
|
, [flagNotes]: formData.get(flagNotes) || null
|
|
, [flagStartOn]: new Date().toISOString()
|
|
, [flagStartingLife]: formData.get(flagStartingLife) || 40
|
|
, [flagActive]: true
|
|
};
|
|
|
|
const submitBtn = form.querySelector('button[type="submit"]');
|
|
const originalText = submitBtn.textContent;
|
|
submitBtn.textContent = 'Creating...';
|
|
submitBtn.disabled = true;
|
|
|
|
const games = [gameData];
|
|
const comment = 'Create new game';
|
|
API.saveGame(games, form, comment)
|
|
.then(data => {
|
|
if (data[flagStatus] == flagSuccess) {
|
|
if (_verbose) {
|
|
Utils.consoleLogIfNotProductionEnvironment('Records saved!');
|
|
Utils.consoleLogIfNotProductionEnvironment('Data received:', data);
|
|
}
|
|
const gamePageHash = `${hashPageGame}/${data[attrGameId]}`;
|
|
let filtersJson = {};
|
|
this.leave();
|
|
API.goToHash(gamePageHash, filtersJson);
|
|
}
|
|
else {
|
|
Utils.consoleLogIfNotProductionEnvironment("error: " + data[flagMessage]);
|
|
// OverlayError.show(data[flagMessage]);
|
|
window.location.reload();
|
|
}
|
|
})
|
|
.catch(error => {
|
|
console.error('Error creating game:', error);
|
|
PageMtgGames.showError('An error occurred while creating the game');
|
|
})
|
|
.finally(() => {
|
|
submitBtn.textContent = originalText;
|
|
submitBtn.disabled = false;
|
|
});
|
|
|
|
}
|
|
static handleFilterSubmit(e) {
|
|
// Let the form submit normally - it will reload with query params
|
|
// You can add client-side filtering here if needed
|
|
}
|
|
static getCSRFToken() {
|
|
// Try meta tag first
|
|
const metaTag = document.querySelector('meta[name="csrf-token"]');
|
|
if (metaTag) {
|
|
return metaTag.getAttribute('content');
|
|
}
|
|
|
|
// Try hidden input
|
|
const hiddenInput = document.querySelector('input[name="csrf_token"]');
|
|
if (hiddenInput) {
|
|
return hiddenInput.value;
|
|
}
|
|
|
|
// Try cookie
|
|
const cookies = document.cookie.split(';');
|
|
for (let cookie of cookies) {
|
|
const [name, value] = cookie.trim().split('=');
|
|
if (name === 'csrf_token') {
|
|
return value;
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
static showError(message) {
|
|
// Check if there's an overlay error element
|
|
const errorOverlay = document.getElementById('overlayError');
|
|
if (errorOverlay) {
|
|
const errorLabel = errorOverlay.querySelector('.error-message, #labelError');
|
|
if (errorLabel) {
|
|
errorLabel.textContent = message;
|
|
}
|
|
errorOverlay.classList.remove(flagIsCollapsed);
|
|
errorOverlay.style.display = 'flex';
|
|
} else {
|
|
// Fallback to alert
|
|
alert(message);
|
|
}
|
|
}
|
|
static showSuccess(message) {
|
|
// Could implement a toast notification here
|
|
console.log('Success:', message);
|
|
}
|
|
static joinGame(gameId) {
|
|
window.location.href = `${hashPageGame}/${gameId}`;
|
|
}
|
|
static async deleteGame(gameId) {
|
|
if (!confirm('Are you sure you want to delete this game? This action cannot be undone.')) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const gameData = {
|
|
'game_id': gameId,
|
|
'active': false
|
|
};
|
|
|
|
const response = await fetch(hashSaveGame, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'X-CSRFToken': PageMtgGames.getCSRFToken()
|
|
},
|
|
body: JSON.stringify({
|
|
[flagGame]: [gameData],
|
|
'form-filters': {},
|
|
'comment': 'Game deleted'
|
|
})
|
|
});
|
|
|
|
const result = await response.json();
|
|
|
|
if (result.status === 'success') {
|
|
// Remove the row from the table
|
|
const row = document.querySelector(`tr[data-game-id="${gameId}"]`);
|
|
if (row) {
|
|
row.style.animation = 'tcg-fadeOut 0.3s ease-out forwards';
|
|
setTimeout(() => row.remove(), 300);
|
|
}
|
|
} else {
|
|
PageMtgGames.showError(result.message || 'Failed to delete game');
|
|
}
|
|
} catch (error) {
|
|
console.error('Error deleting game:', error);
|
|
PageMtgGames.showError('An error occurred while deleting the game');
|
|
}
|
|
}
|
|
|
|
toggleShowButtonsSaveCancel() {}
|
|
leave() {
|
|
super.leave();
|
|
}
|
|
}
|