Capabilities:';
var capabilities = [];
if (number.capabilities.voice) capabilities.push('Voice');
if (number.capabilities.sms) capabilities.push('SMS');
if (number.capabilities.mms) capabilities.push('MMS');
html += capabilities.join(', ') + '
';
html += '
';
html += '
';
html += '';
html += '';
html += '
';
html += '
';
});
html += '
';
$('#twp-numbers-list').html(html);
}
function displayAvailableNumbers(numbers) {
if (numbers.length === 0) {
$('#search-results').html('
No numbers found matching your criteria. Try different search terms.
');
return;
}
var html = '';
numbers.forEach(function(number) {
html += '
';
html += '
';
html += '
' + number.phone_number + '
';
html += '
';
var capabilities = [];
if (number.capabilities.voice) capabilities.push('Voice');
if (number.capabilities.sms) capabilities.push('SMS');
if (number.capabilities.mms) capabilities.push('MMS');
html += capabilities.join(', ');
html += '
';
html += '
';
html += '
$1.00/month
';
html += '';
html += '
';
});
$('#search-results').html(html);
}
window.purchaseNumber = function(phoneNumber) {
if (confirm('Purchase ' + phoneNumber + ' for $1.00/month?')) {
$.post(twp_ajax.ajax_url, {
action: 'twp_purchase_number',
phone_number: phoneNumber,
voice_url: twp_ajax.rest_url + 'twilio-webhook/v1/voice',
sms_url: twp_ajax.rest_url + 'twilio-webhook/v1/sms',
nonce: twp_ajax.nonce
}, function(response) {
if (response.success) {
alert('Phone number purchased successfully!');
refreshNumbers();
$('#twp-available-numbers').hide();
} else {
alert('Error purchasing number: ' + response.error);
}
});
}
};
window.configureNumber = function(numberSid, phoneNumber) {
$('#number-sid').val(numberSid);
$('#phone-number').val(phoneNumber);
$('#number-config-modal').show();
};
window.closeNumberConfigModal = function() {
$('#number-config-modal').hide();
};
$('#number-config-form').on('submit', function(e) {
e.preventDefault();
var formData = $(this).serialize();
formData += '&action=twp_configure_number&nonce=' + twp_ajax.nonce;
$.post(twp_ajax.ajax_url, formData, function(response) {
if (response.success) {
alert('Phone number configured successfully!');
closeNumberConfigModal();
refreshNumbers();
} else {
alert('Error configuring number: ' + response.error);
}
});
});
window.releaseNumber = function(numberSid, phoneNumber) {
if (confirm('Are you sure you want to release ' + phoneNumber + '? This action cannot be undone and you will lose this phone number.')) {
$.post(twp_ajax.ajax_url, {
action: 'twp_release_number',
number_sid: numberSid,
nonce: twp_ajax.nonce
}, function(response) {
if (response.success) {
alert('Phone number released successfully!');
refreshNumbers();
} else {
alert('Error releasing number: ' + response.error);
}
});
}
};
// Initialize phone numbers if on that page
if ($('#twp-numbers-list').length) {
refreshNumbers();
}
// Queue management for workflow steps
window.loadQueues = function(button) {
var $button = $(button);
var $select = $button.prev('select.queue-select');
var currentValue = $select.data('current');
$button.text('Loading...').prop('disabled', true);
$.post(twp_ajax.ajax_url, {
action: 'twp_get_all_queues',
nonce: twp_ajax.nonce
}, function(response) {
$button.text('Load Queues').prop('disabled', false);
if (response.success) {
var options = '';
response.data.forEach(function(queue) {
var selected = queue.queue_name === currentValue ? ' selected' : '';
options += '';
});
$select.html(options);
} else {
alert('Error loading queues: ' + (response.data || 'Unknown error'));
}
}).fail(function() {
$button.text('Load Queues').prop('disabled', false);
alert('Failed to load queues');
});
};
// Voice management for workflow steps
window.loadWorkflowVoices = function(button) {
var $button = $(button);
var $select = $button.prev('select.voice-select');
var currentValue = $select.data('current');
$button.text('Loading...').prop('disabled', true);
$.post(twp_ajax.ajax_url, {
action: 'twp_get_elevenlabs_voices',
nonce: twp_ajax.nonce
}, function(response) {
$button.text('Load Voices').prop('disabled', false);
if (response.success) {
var options = '';
response.data.forEach(function(voice) {
var selected = voice.voice_id === currentValue ? ' selected' : '';
var description = voice.labels ? Object.values(voice.labels).join(', ') : '';
var optionText = voice.name + (description ? ' (' + description + ')' : '');
options += '';
});
$select.html(options);
} else {
var errorMessage = 'Error loading voices: ';
if (typeof response.data === 'string') {
errorMessage += response.data;
} else if (response.data && response.data.detail) {
errorMessage += response.data.detail;
} else if (response.data && response.data.error) {
errorMessage += response.data.error;
} else {
errorMessage += 'Unknown error occurred';
}
alert(errorMessage);
}
}).fail(function() {
$button.text('Load Voices').prop('disabled', false);
alert('Failed to load voices. Please check your API key.');
});
};
// Toggle TTS options visibility
$(document).on('change', 'input[name="use_tts"]', function() {
var $ttsOptions = $(this).closest('.step-config-section').find('.tts-options');
if ($(this).is(':checked')) {
$ttsOptions.show();
} else {
$ttsOptions.hide();
}
});
// Auto-load voices when step config modal opens if API key exists
$(document).on('click', '.step-btn', function() {
setTimeout(function() {
// Check if API key exists in main settings
if (twp_ajax.has_elevenlabs_key) {
$('.voice-select').each(function() {
if ($(this).find('option').length <= 1) {
var button = $(this).next('button');
if (button.length) {
loadWorkflowVoices(button[0]);
}
}
});
}
}, 500);
});
// Voicemail Management
window.playVoicemail = function(voicemailId, recordingUrl) {
var audio = document.getElementById('voicemail-audio');
if (audio) {
audio.src = recordingUrl;
audio.play();
// Show voicemail modal and load transcription
showVoicemail(voicemailId, recordingUrl);
}
};
window.viewVoicemail = function(voicemailId) {
// Load voicemail details via AJAX
$.post(twp_ajax.ajax_url, {
action: 'twp_get_voicemail',
voicemail_id: voicemailId,
nonce: twp_ajax.nonce
}, function(response) {
if (response.success) {
var voicemail = response.data;
showVoicemail(voicemail.id, voicemail.recording_url, voicemail.transcription);
} else {
alert('Error loading voicemail details');
}
});
};
function showVoicemail(voicemailId, recordingUrl, transcription) {
// Set the audio source
var audio = document.getElementById('voicemail-audio');
if (audio && recordingUrl) {
audio.src = recordingUrl;
}
// Set transcription text
var transcriptionDiv = document.getElementById('voicemail-transcription-text');
if (transcriptionDiv) {
if (transcription && transcription !== 'Transcription pending...' && transcription !== 'Transcription failed') {
transcriptionDiv.innerHTML = '
' + transcription + '
';
// Hide the generate transcription button if we have a transcription
var transcribeBtn = document.getElementById('transcribe-btn');
if (transcribeBtn) {
transcribeBtn.style.display = 'none';
}
} else if (transcription === 'Transcription failed') {
transcriptionDiv.innerHTML = '
Transcription failed. Please try again.
';
} else {
transcriptionDiv.innerHTML = 'Transcription pending... This will be updated automatically when ready.';
// Show the generate transcription button
var transcribeBtn = document.getElementById('transcribe-btn');
if (transcribeBtn) {
transcribeBtn.style.display = 'inline-block';
}
}
}
// Store current voicemail ID for actions
window.currentVoicemailId = voicemailId;
window.currentRecordingUrl = recordingUrl;
// Show modal
var modal = document.getElementById('voicemail-modal');
if (modal) {
modal.style.display = 'flex';
}
}
window.closeVoicemailModal = function() {
var modal = document.getElementById('voicemail-modal');
if (modal) {
modal.style.display = 'none';
}
// Stop audio playback
var audio = document.getElementById('voicemail-audio');
if (audio) {
audio.pause();
audio.currentTime = 0;
}
};
window.downloadVoicemail = function() {
if (window.currentRecordingUrl) {
window.open(window.currentRecordingUrl, '_blank');
}
};
window.deleteVoicemail = function() {
if (confirm('Are you sure you want to delete this voicemail?')) {
$.post(twp_ajax.ajax_url, {
action: 'twp_delete_voicemail',
voicemail_id: window.currentVoicemailId,
nonce: twp_ajax.nonce
}, function(response) {
if (response.success) {
closeVoicemailModal();
location.reload();
} else {
alert('Error deleting voicemail');
}
});
}
};
window.deleteVoicemailConfirm = function(voicemailId) {
if (confirm('Are you sure you want to delete this voicemail?')) {
$.post(twp_ajax.ajax_url, {
action: 'twp_delete_voicemail',
voicemail_id: voicemailId,
nonce: twp_ajax.nonce
}, function(response) {
if (response.success) {
location.reload();
} else {
alert('Error deleting voicemail');
}
});
}
};
window.transcribeVoicemail = function() {
if (window.currentVoicemailId) {
var transcribeBtn = document.getElementById('transcribe-btn');
if (transcribeBtn) {
transcribeBtn.innerHTML = 'Generating...';
transcribeBtn.disabled = true;
}
$.post(twp_ajax.ajax_url, {
action: 'twp_transcribe_voicemail',
voicemail_id: window.currentVoicemailId,
nonce: twp_ajax.nonce
}, function(response) {
if (response.success) {
var transcriptionDiv = document.getElementById('voicemail-transcription-text');
if (transcriptionDiv) {
transcriptionDiv.innerHTML = '
' + response.data.transcription + '
';
}
if (transcribeBtn) {
transcribeBtn.style.display = 'none';
}
} else {
alert('Error generating transcription: ' + response.data);
if (transcribeBtn) {
transcribeBtn.innerHTML = 'Generate Transcription';
transcribeBtn.disabled = false;
}
}
});
}
};
// Close modal when clicking outside
$(document).on('click', '#voicemail-modal', function(e) {
if (e.target.id === 'voicemail-modal') {
closeVoicemailModal();
}
});
// Agent Group Management Functions
window.openGroupModal = function() {
$('#group-modal').show();
$('#group-form')[0].reset();
$('#group-id').val('');
$('#group-modal-title').text('Add New Group');
};
window.closeGroupModal = function() {
$('#group-modal').hide();
};
window.saveGroup = function() {
var formData = $('#group-form').serialize();
formData += '&action=twp_save_group&nonce=' + twp_ajax.nonce;
$.post(twp_ajax.ajax_url, formData, function(response) {
if (response.success) {
closeGroupModal();
location.reload();
} else {
alert('Error saving group: ' + (response.data || 'Unknown error'));
}
});
};
window.editGroup = function(groupId) {
$.post(twp_ajax.ajax_url, {
action: 'twp_get_group',
group_id: groupId,
nonce: twp_ajax.nonce
}, function(response) {
if (response.success) {
var group = response.data;
$('#group-modal-title').text('Edit Group');
$('#group-id').val(group.id);
$('[name="group_name"]').val(group.group_name);
$('[name="description"]').val(group.description);
$('[name="ring_strategy"]').val(group.ring_strategy);
$('[name="timeout_seconds"]').val(group.timeout_seconds);
$('#group-modal').show();
} else {
alert('Error loading group: ' + (response.data || 'Unknown error'));
}
});
};
window.deleteGroup = function(groupId) {
if (confirm('Are you sure you want to delete this group? All members will be removed.')) {
$.post(twp_ajax.ajax_url, {
action: 'twp_delete_group',
group_id: groupId,
nonce: twp_ajax.nonce
}, function(response) {
if (response.success) {
location.reload();
} else {
alert('Error deleting group: ' + (response.data || 'Unknown error'));
}
});
}
};
window.manageGroupMembers = function(groupId) {
$('#current-group-id').val(groupId);
loadGroupMembers(groupId);
$('#members-modal').show();
};
window.closeMembersModal = function() {
$('#members-modal').hide();
};
function loadGroupMembers(groupId) {
$.post(twp_ajax.ajax_url, {
action: 'twp_get_group_members',
group_id: groupId,
nonce: twp_ajax.nonce
}, function(response) {
if (response.success) {
var html = '';
response.data.forEach(function(member) {
html += '