diff --git a/assets/js/admin-connect.js b/assets/js/admin-connect.js index 334a019..f213d81 100644 --- a/assets/js/admin-connect.js +++ b/assets/js/admin-connect.js @@ -2,6 +2,52 @@ 'use strict'; $(function () { + const diagBtn = $('#octavawms-connectivity-run'); + const diagOut = $('#octavawms-connectivity-output'); + const diagCfg = window.octavawmsConnect; + if ( + diagBtn.length && + diagOut.length && + diagCfg && + diagCfg.ajaxUrl && + diagCfg.connectivityProbeAction && + diagCfg.connectivityProbeNonce + ) { + const spDiag = $('#octavawms-connectivity-spinner'); + const strings = diagCfg.strings || {}; + diagBtn.on('click', function () { + diagBtn.prop('disabled', true); + spDiag.css('visibility', 'visible'); + diagOut.text(strings.connectivityRunning || 'Running diagnostics…'); + $.post( + diagCfg.ajaxUrl, + { + action: diagCfg.connectivityProbeAction, + security: diagCfg.connectivityProbeNonce, + }, + function (res) { + if (res && res.success && res.data && typeof res.data.report === 'string') { + diagOut.text(res.data.report); + return; + } + diagOut.text( + (res && res.data && res.data.message) || + strings.connectivityFailed || + 'Diagnostics failed.' + ); + }, + 'json' + ) + .fail(function () { + diagOut.text(strings.connectivityFailed || 'Diagnostics failed.'); + }) + .always(function () { + spDiag.css('visibility', 'hidden'); + diagBtn.prop('disabled', false); + }); + }); + } + const btn = $('#octavawms-connect-btn'); const panelBtn = $('#octavawms-panel-login-btn'); if (!btn.length && !panelBtn.length) { diff --git a/assets/js/admin-settings-matrix.js b/assets/js/admin-settings-matrix.js index 6b0a673..5f59b4a 100644 --- a/assets/js/admin-settings-matrix.js +++ b/assets/js/admin-settings-matrix.js @@ -13,7 +13,120 @@ return window.octavawmsCarrierMatrix || {}; } + function matrixStrings() { + return cfg().strings || {}; + } + + function matrixAjaxConfigOk() { + var c = cfg(); + return !!(c.ajaxUrl && c.action && c.nonce); + } + + function rejectMissingMatrixAjaxConfig() { + var msg = + matrixStrings().ajaxMissingConfig || + 'Carrier matrix script configuration is missing. Reload the page or clear your cache.'; + var fakeXhr = { + status: 0, + responseText: '', + responseJSON: { data: { message: msg } } + }; + var d = $.Deferred(); + d.reject(fakeXhr, 'error', msg); + return d.promise(); + } + + function appendAjaxDebug(base, xhr, textStatus) { + if (!cfg().detailAjaxErrors) { + return base; + } + var status = xhr && xhr.status != null ? xhr.status : ''; + var raw = xhr && xhr.responseText != null ? String(xhr.responseText).trim() : ''; + var first = raw ? raw.split(/\r?\n/)[0] : ''; + if (first.length > 200) { + first = first.slice(0, 200) + '…'; + } + var bits = []; + if (status !== '') { + bits.push('HTTP ' + status); + } + if (textStatus) { + bits.push(textStatus); + } + if (first) { + bits.push(first); + } + return bits.length ? base + ' [' + bits.join(' | ') + ']' : base; + } + + /** + * Maps admin-ajax failures (including WordPress bare "0" + 400) to a readable message. + * + * @param {JQuery.jqXHR|null} xhr + * @param {string} textStatus + * @returns {string} + */ + function formatMatrixAjaxError(xhr, textStatus) { + var s = matrixStrings(); + if (textStatus === 'parsererror') { + return appendAjaxDebug(s.ajaxParseError || s.saveFailed || 'Error', xhr, textStatus); + } + var wpJsonMsg = null; + if (xhr && xhr.responseJSON && xhr.responseJSON.data && xhr.responseJSON.data.message) { + wpJsonMsg = String(xhr.responseJSON.data.message); + } else if (xhr && xhr.responseText) { + try { + var parsed = JSON.parse(String(xhr.responseText)); + if (parsed && parsed.data && parsed.data.message) { + wpJsonMsg = String(parsed.data.message); + } + } catch (ignore) { + /* not JSON */ + } + } + if (wpJsonMsg) { + return appendAjaxDebug(wpJsonMsg, xhr, textStatus); + } + var status = xhr && xhr.status != null ? xhr.status : 0; + var body = xhr && xhr.responseText != null ? String(xhr.responseText).trim() : ''; + if (status === 400 && body === '0') { + return appendAjaxDebug(s.ajaxNoHandler || s.saveFailed || 'Error', xhr, textStatus); + } + if (status === 403 && (body === '-1' || body === '0')) { + return appendAjaxDebug(s.ajaxNonceExpired || s.saveFailed || 'Error', xhr, textStatus); + } + if (status >= 400) { + return appendAjaxDebug(s.ajaxHttpError || s.saveFailed || 'Error', xhr, textStatus); + } + return appendAjaxDebug(s.ajaxHttpError || s.saveFailed || 'Error', xhr, textStatus); + } + + function setSpinner(on) { + var $sp = $('#octavawms-matrix-spinner'); + if (!$sp.length) { + return; + } + $sp.css('visibility', on ? 'visible' : 'hidden'); + if (on) { + $sp.addClass('is-active'); + } else { + $sp.removeClass('is-active'); + } + } + + function setMessage(text, isError) { + var $m = $('#octavawms-matrix-message'); + if (!$m.length) { + return; + } + $m.text(text || ''); + $m.css('color', isError ? '#b32d2d' : '#1e4620'); + } + function post(subaction, extra) { + if (!matrixAjaxConfigOk()) { + return rejectMissingMatrixAjaxConfig(); + } var data = $.extend( { action: cfg().action, @@ -79,7 +192,7 @@ $('
').text(ds).html() + '" data-initial-label="">' + '' + '' + '' @@ -109,23 +222,27 @@ var $rate = $tr.find('.octavawms-rate'); $rate.empty(); $rate.append( - $('