PluginProbe
MxChat – AI Chatbot & Content Generation for WordPress / 2.4.6
MxChat – AI Chatbot & Content Generation for WordPress v2.4.6
3.2.21 3.2.20 3.2.19 3.2.18 3.2.17 3.2.16 3.2.15 3.2.14 3.2.12 3.2.13 3.2.11 3.2.10 3.2.9 3.2.8 3.2.7 3.2.6 3.2.5 3.2.4 3.2.3 3.2.2 3.2.1 2.0.3 2.0.4 2.0.5 2.0.6 All 152 releases
mxchat-basic / js / mxchat_transcripts.js

mxchat_transcripts.js in MxChat – AI Chatbot & Content Generation for WordPress 2.4.6, at js/mxchat_transcripts.js

277 lines 10.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 jQuery(document).ready(function($) {
2 // Current page state
3 let currentPage = 1;
4 const perPage = 50; // Display 50 sessions per page
5 let totalPages = 1;
6
7 // Track selected sessions for bulk delete
8 let selectedSessions = new Set();
9
10 // Select/Deselect All functionality
11 const selectButton = $('#mxchat-select-all-transcripts');
12 let isSelected = false;
13
14 selectButton.click(function() {
15 isSelected = !isSelected;
16 $(this).toggleClass('selected');
17
18 // Update button text
19 const buttonText = $(this).find('.button-text');
20 buttonText.text(isSelected ? 'Deselect All' : 'Select All');
21
22 // Update session selection (for current page)
23 $('.mxchat-session-header').each(function() {
24 const sessionId = $(this).data('session-id');
25 const sessionContainer = $(this).closest('.mxchat-session');
26 if (isSelected) {
27 selectedSessions.add(sessionId);
28 sessionContainer.addClass('selected');
29 } else {
30 selectedSessions.delete(sessionId);
31 sessionContainer.removeClass('selected');
32 }
33 });
34
35 updateDeleteButtonState();
36 });
37
38 // Search functionality
39 $('#mxchat-search-transcripts').on('input', function() {
40 var searchTerm = $(this).val().toLowerCase();
41
42 if (searchTerm.length > 0) {
43 // Reset to first page when searching
44 currentPage = 1;
45
46 // Load with search filter
47 loadTranscripts(currentPage, searchTerm);
48 } else {
49 // Reset to first page with no search term
50 currentPage = 1;
51 loadTranscripts(currentPage, '');
52 }
53 });
54
55 // Initial load of transcripts
56 loadTranscripts(currentPage, '');
57
58 // Function to load transcripts with pagination
59 function loadTranscripts(page, searchTerm = '') {
60 $('#mxchat-transcripts').html('<div class="mxchat-loading">Loading transcripts...</div>');
61
62 $.ajax({
63 url: ajaxurl,
64 type: 'POST',
65 data: {
66 action: 'mxchat_fetch_chat_history',
67 page: page,
68 per_page: perPage,
69 search: searchTerm
70 },
71 success: function(response) {
72 $('#mxchat-transcripts').html(response.html);
73 currentPage = response.page;
74 totalPages = response.total_pages;
75
76 // Reset selection state when page changes (but keep selectedSessions for bulk operations)
77 isSelected = false;
78 selectButton.removeClass('selected');
79 selectButton.find('.button-text').text('Select All');
80
81 // Restore selection state for sessions on this page
82 $('.mxchat-session-header').each(function() {
83 const sessionId = $(this).data('session-id');
84 const sessionContainer = $(this).closest('.mxchat-session');
85 if (selectedSessions.has(sessionId)) {
86 sessionContainer.addClass('selected');
87 }
88 });
89
90 updateDeleteButtonState();
91
92 // Add click handlers to pagination buttons
93 $('.mxchat-pagination-button').on('click', function() {
94 var pageNum = $(this).data('page');
95 loadTranscripts(pageNum, searchTerm);
96
97 // Scroll to top of transcripts
98 $('html, body').animate({
99 scrollTop: $('#mxchat-transcripts').offset().top - 50
100 }, 300);
101 });
102
103 // Re-attach event handlers for newly loaded content
104 attachDynamicEventHandlers();
105 },
106 error: function(xhr, status, error) {
107 $('#mxchat-transcripts').html('<div class="mxchat-error">Error loading chat transcripts. Please try again.</div>');
108 console.error("AJAX Error: " + status + " - " + error);
109 }
110 });
111 }
112
113 // Attach event handlers to dynamically loaded content
114 function attachDynamicEventHandlers() {
115 // Handle individual delete button clicks
116 $('.mxchat-delete-btn').off('click').on('click', function(e) {
117 e.preventDefault();
118 e.stopPropagation();
119
120 const sessionId = $(this).data('session-id');
121
122 if (!confirm("Are you sure you want to delete this chat session? This action cannot be undone.")) {
123 return;
124 }
125
126 // Delete single session
127 deleteSessions([sessionId]);
128 });
129
130 // Handle session header clicks for selection (bulk delete)
131 $('.mxchat-session-header').off('click').on('click', function(e) {
132 // Don't trigger if clicking the delete button
133 if ($(e.target).hasClass('mxchat-delete-btn') || $(e.target).closest('.mxchat-delete-btn').length) {
134 return;
135 }
136
137 const sessionId = $(this).data('session-id');
138 const sessionContainer = $(this).closest('.mxchat-session');
139
140 if (selectedSessions.has(sessionId)) {
141 selectedSessions.delete(sessionId);
142 sessionContainer.removeClass('selected');
143 } else {
144 selectedSessions.add(sessionId);
145 sessionContainer.addClass('selected');
146 }
147
148 updateDeleteButtonState();
149 });
150 }
151
152 // Update delete button state based on selections
153 function updateDeleteButtonState() {
154 const deleteButton = $('.delete-chats-button');
155 if (selectedSessions.size > 0) {
156 deleteButton.prop('disabled', false);
157 } else {
158 deleteButton.prop('disabled', true);
159 }
160 }
161
162 // Function to delete sessions
163 function deleteSessions(sessionIds) {
164 $.ajax({
165 url: ajaxurl,
166 type: 'POST',
167 data: {
168 action: 'mxchat_delete_chat_history',
169 delete_session_ids: sessionIds,
170 security: $('#mxchat_delete_chat_nonce').val()
171 },
172 success: function(response) {
173 var jsonResponse = JSON.parse(response);
174 if (jsonResponse.success) {
175 alert("Success: " + jsonResponse.success);
176
177 // Remove deleted sessions from selectedSessions
178 sessionIds.forEach(id => selectedSessions.delete(id));
179
180 } else if (jsonResponse.error) {
181 alert("Error: " + jsonResponse.error);
182 } else {
183 //console.log("Unexpected response format.");
184 }
185
186 // Reload the current page of transcripts
187 loadTranscripts(currentPage);
188 },
189 error: function(xhr, status, error) {
190 //console.error("AJAX Error: " + status + " - " + error);
191 //console.log(xhr.responseText);
192 alert("An error occurred while deleting chat sessions. Please try again.");
193 }
194 });
195 }
196
197 // Delete form submission (bulk delete)
198 $('#mxchat-delete-form').submit(function(e) {
199 e.preventDefault();
200
201 if (selectedSessions.size === 0) {
202 alert("Please select at least one chat session to delete.");
203 return;
204 }
205
206 // Confirm deletion
207 if (!confirm(`Are you sure you want to delete the selected ${selectedSessions.size} chat session(s)? This action cannot be undone.`)) {
208 return;
209 }
210
211 // Convert Set to Array and delete
212 deleteSessions(Array.from(selectedSessions));
213 });
214
215 // Export functionality - this remains unchanged as it should export all transcripts
216 $('#mxchat-export-transcripts').on('click', function() {
217 var $button = $(this);
218 $button.prop('disabled', true).addClass('loading');
219
220 // Create a form and submit it
221 var $form = $('<form>', {
222 'method': 'post',
223 'action': ajaxurl
224 });
225
226 $form.append($('<input>', {
227 'type': 'hidden',
228 'name': 'action',
229 'value': 'mxchat_export_transcripts'
230 }));
231
232 $form.append($('<input>', {
233 'type': 'hidden',
234 'name': 'security',
235 'value': mxchatAdmin.export_nonce
236 }));
237
238 $form.appendTo('body').submit();
239
240 // Re-enable the button after a short delay
241 setTimeout(function() {
242 $button.prop('disabled', false).removeClass('loading');
243 }, 2000);
244 });
245
246 // Chat Email Notification Modal functionality
247
248 // Open modal
249 $('#mxchat-chat-email-notification-btn').on('click', function(e) {
250 e.preventDefault();
251 $('#mxchat-chat-email-notification-modal').fadeIn(300);
252 });
253
254 // Close modal
255 $('.mxchat-chat-notification-modal-close, .mxchat-chat-notification-modal-cancel').on('click', function() {
256 $('#mxchat-chat-email-notification-modal').fadeOut(300);
257 });
258
259 // Close modal on outside click
260 $('#mxchat-chat-email-notification-modal').on('click', function(e) {
261 if ($(e.target).is('#mxchat-chat-email-notification-modal')) {
262 $(this).fadeOut(300);
263 }
264 });
265
266 // Handle form submission - Let WordPress handle it normally for settings
267 $('#mxchat-chat-email-notification-form').on('submit', function(e) {
268 // Don't prevent default - let the form submit normally to WordPress options.php
269 var $submitButton = $(this).find('button[type="submit"]');
270 var originalText = $submitButton.text();
271
272 // Just show a loading state
273 $submitButton.text('Saving...').prop('disabled', true);
274
275 // The form will submit normally and reload the page
276 });
277 });