/** * Facility status (comments) manager for adding, removing and editing user comments. */ // Create a namespace to avoid global scope conflicts with facilityData.js const CommentsManager = { // Initialization states state: { isInitializing: false, isinitialised: false, isDomReady: false, isAuthReady: false }, /** * initialise status functionality */ initialise() { if (this.state.isinitialised) return; console.log('Initializing comments...'); // initialise comment modal handlers this.initialiseCommentModals(); // Set up form handlers this.setupCommentFormHandlers(); console.log('Comments initialised with auth state:', { isAuthenticated: this.isAuthenticated(), user: window.simpleAuth.getUser() }); this.state.isinitialised = true; }, /** * Check if initialisation possible */ checkinitialise() { if (this.state.isDomReady && this.state.isAuthReady && !this.state.isInitializing) { this.state.isInitializing = true; this.initialise(); this.state.isInitializing = false; } }, /** * Check if user is authenticated */ isAuthenticated() { return window.simpleAuth && window.simpleAuth.isAuthenticated(); }, /** * initialise comment modals */ initialiseCommentModals() { // Status modal (comments view) const statusModal = document.getElementById('statusModal'); if (statusModal) { statusModal.addEventListener('show.bs.modal', (event) => { // Get facility ID from either the button or the modal's data attribute let facilityId; // First try to get it from the button that triggered the modal if (event.relatedTarget) { facilityId = event.relatedTarget.getAttribute('data-facility-id'); } // If not found in button, try the modal's data attribute if (!facilityId && statusModal.hasAttribute('data-facility-id')) { facilityId = statusModal.getAttribute('data-facility-id'); } if (!facilityId) { console.error('No facility ID found for comments'); return; } // Store the facility ID on the modal for later use statusModal.setAttribute('data-facility-id', facilityId); // Load facility comments this.loadFacilityComments(facilityId); }); } // Edit comment modal const editCommentModal = document.getElementById('editCommentModal'); if (editCommentModal) { editCommentModal.addEventListener('show.bs.modal', (event) => { const button = event.relatedTarget; const commentId = button.getAttribute('data-comment-id'); const commentText = button.getAttribute('data-comment-text'); // Set the comment ID and text in the form const editForm = document.getElementById('editCommentForm'); if (editForm) { const commentIdInput = editForm.querySelector('#editCommentId'); const commentTextArea = editForm.querySelector('#editCommentText'); if (commentIdInput && commentTextArea) { commentIdInput.value = commentId; commentTextArea.value = commentText; } } }); } }, /** * Set up comment form handlers */ setupCommentFormHandlers() { // Comment form handler const commentForm = document.getElementById('commentForm'); if (commentForm) { this.setupCommentFormHandler(commentForm); } // Edit comment form handler const editCommentForm = document.getElementById('editCommentForm'); if (editCommentForm) { this.setupEditCommentFormHandler(editCommentForm); } }, /** * Set up a single comment form handler */ setupCommentFormHandler(commentForm) { commentForm.addEventListener('submit', async (e) => { e.preventDefault(); // Prevent duplicate submissions if (commentForm.submitting) { return; } commentForm.submitting = true; // Check if user is authenticated if (!this.isAuthenticated()) { alert('You must be logged in to add comments'); commentForm.submitting = false; return; } const formData = new FormData(commentForm); // Get form data and ensure proper types const statusComment = formData.get('commentText'); const facilityId = formData.get('facilityId'); // Validate form data if (!facilityId) { console.error('No facility ID found in form'); alert('Error: No facility ID found'); commentForm.submitting = false; return; } if (!statusComment) { alert('Please enter a comment'); commentForm.submitting = false; return; } try { // Use the API client to add a status comment const data = await window.api.addFacilityStatus(facilityId.toString(), statusComment); if (data.success) { // Reset the form commentForm.reset(); // Reload comments to show the new one this.loadFacilityComments(facilityId.toString()); } else { console.error('Comment failed:', data.error); alert(data.error || 'Failed to add comment'); } } catch (error) { console.error('Error adding comment:', error); alert('Failed to add comment: ' + error.message); } finally { commentForm.submitting = false; } }); }, /** * Set up a single edit comment form handler */ setupEditCommentFormHandler(editCommentForm) { editCommentForm.addEventListener('submit', async (e) => { e.preventDefault(); // Prevent duplicate submissions if (editCommentForm.submitting) { return; } editCommentForm.submitting = true; // Check if user is authenticated if (!this.isAuthenticated()) { alert('You must be logged in to edit comments'); editCommentForm.submitting = false; return; } const formData = new FormData(editCommentForm); // Get form data const commentText = formData.get('editCommentText'); const commentId = formData.get('commentId'); const facilityId = document.getElementById('commentFacilityId').value; console.log('Edit comment form data:', { commentId, facilityId, commentText }); try { console.log('Sending edit comment request...'); // Use the API client to update a status comment const data = await window.api.updateFacilityStatus(commentId, commentText, facilityId); console.log('Edit comment response:', data); if (data.success) { console.log('Comment edited successfully'); // Close the edit modal const editModal = bootstrap.Modal.getInstance(document.getElementById('editCommentModal')); if (editModal) { editModal.hide(); } // Reload comments to show the updated one this.loadFacilityComments(facilityId); } else { console.error('Edit comment failed:', data.error); alert(data.error || 'Failed to edit comment'); } } catch (error) { console.error('Error editing comment:', error); alert('Failed to edit comment: ' + error.message); } finally { editCommentForm.submitting = false; } }); }, /** * Creates a comment form dynamically for authenticated users */ createCommentFormForAuthenticatedUser(facilityId) { // First check if simpleAuth is available if (!window.simpleAuth) { return `
Loading comments...
${this.escapeHtml(comment.statusComment)}