/* === Bug bubble (bottom-right, collapses to edge tab) === */ #advally-bug-expanded { position:fixed; bottom:80px; right:20px; z-index:99999; display:flex; align-items:center; gap:4px; transition:opacity .2s, transform .2s; } #advally-bug-expanded.is-hidden { opacity:0; pointer-events:none; transform:translateX(20px); } #advally-bug-bubble { width:50px; height:50px; border-radius:50%; background:#1466b8; color:#fff; border:none; box-shadow:0 4px 12px rgba(0,0,0,.3); cursor:pointer; display:flex; align-items:center; justify-content:center; transition:transform .2s, box-shadow .2s, background .2s; } #advally-bug-bubble:hover { transform:scale(1.1); box-shadow:0 6px 16px rgba(0,0,0,.4); background:#0f4c8c; } #advally-bug-bubble:active { transform:scale(.95); } #advally-bug-bubble svg { width:24px; height:24px; } #advally-bug-collapse-btn { width:24px; height:24px; border-radius:50%; background:rgba(0,0,0,.5); color:#fff; border:none; cursor:pointer; display:flex; align-items:center; justify-content:center; opacity:0; transition:opacity .2s, background .2s; padding:0; font-size:14px; line-height:1; } #advally-bug-expanded:hover #advally-bug-collapse-btn { opacity:1; } #advally-bug-collapse-btn:hover { background:rgba(0,0,0,.7); } #advally-bug-tab { position:fixed; bottom:100px; right:0; z-index:99999; width:32px; height:48px; border-radius:8px 0 0 8px; background:#1466b8; color:#fff; border:none; box-shadow:-2px 2px 8px rgba(0,0,0,.2); cursor:pointer; display:flex; align-items:center; justify-content:center; transition:opacity .2s, transform .2s, width .2s; } #advally-bug-tab.is-hidden { opacity:0; pointer-events:none; transform:translateX(100%); } #advally-bug-tab:hover { width:40px; background:#0f4c8c; } #advally-bug-tab svg { width:18px; height:18px; } /* === Modal === */ #advally-bug-modal { position:fixed; inset:0; background:rgba(0,0,0,.5); z-index:99998; display:none; align-items:center; justify-content:center; } #advally-bug-modal.is-open { display:flex; } #advally-bug-modal .advally-bug-card { background:#fff; color:#222; padding:24px; border-radius:8px; max-width:680px; width:92%; max-height:92vh; overflow-y:auto; font-family:inherit; } #advally-bug-modal h3 { margin:0 0 16px; font-size:18px; display:flex; align-items:center; gap:8px; color:#222; } #advally-bug-modal h3 svg { color:#dc3545; flex:none; width:22px; height:22px; } #advally-bug-modal label { display:block; font-weight:600; margin-top:14px; font-size:13px; color:#333; } #advally-bug-modal label .req { color:#dc3545; } #advally-bug-modal input[type=text], #advally-bug-modal textarea, #advally-bug-modal select { width:100%; padding:8px; border:1px solid #ced4da; border-radius:4px; font-size:14px; box-sizing:border-box; font-family:inherit; background:#fff; color:#212529; } #advally-bug-modal input[type=text]::placeholder, #advally-bug-modal textarea::placeholder { color:#6c757d; } #advally-bug-modal input[type=text]:focus, #advally-bug-modal textarea:focus, #advally-bug-modal select:focus { outline:none; border-color:#86b7fe; box-shadow:0 0 0 .25rem rgba(13,110,253,.25); } #advally-bug-modal input[readonly] { background:#e9ecef; color:#495057; } #advally-bug-modal textarea { min-height:60px; resize:vertical; } #advally-bug-modal .advally-bug-context-row { display:grid; grid-template-columns:2fr 1fr; gap:12px; } #advally-bug-modal .advally-bug-context-row label { font-size:11px; color:#666; margin-top:0; text-transform:uppercase; letter-spacing:.05em; } #advally-bug-modal .advally-bug-context-row input { font-size:12px; padding:5px 8px; } #advally-bug-modal hr { border:0; border-top:1px solid #eee; margin:14px 0; } #advally-bug-modal .advally-bug-input-group { display:flex; gap:0; } #advally-bug-modal .advally-bug-input-group input { flex:1; border-top-right-radius:0; border-bottom-right-radius:0; } #advally-bug-modal .advally-bug-input-group button { padding:8px 14px; border:1px solid #1466b8; background:#1466b8; color:#fff; border-radius:0 4px 4px 0; cursor:pointer; font-weight:600; font-size:13px; white-space:nowrap; display:flex; align-items:center; gap:6px; } #advally-bug-modal .advally-bug-input-group button:hover { background:#0f4c8c; } #advally-bug-modal .advally-bug-input-group svg { width:14px; height:14px; } #advally-bug-modal small.advally-bug-hint { display:block; margin-top:4px; font-size:12px; color:#666; } #advally-bug-modal .advally-bug-actions { margin-top:18px; display:flex; gap:8px; justify-content:flex-end; } #advally-bug-modal button.advally-bug-action { padding:8px 16px; border:none; border-radius:4px; font-weight:600; cursor:pointer; font-family:inherit; font-size:14px; display:inline-flex; align-items:center; gap:6px; } #advally-bug-modal button.advally-bug-submit { background:#1466b8; color:#fff; } #advally-bug-modal button.advally-bug-submit[disabled] { opacity:.6; cursor:not-allowed; } #advally-bug-modal button.advally-bug-cancel { background:#eee; color:#222; } #advally-bug-modal .advally-bug-submit svg { width:14px; height:14px; } #advally-bug-modal .advally-bug-message { margin-top:12px; font-size:14px; padding:8px 10px; border-radius:4px; } #advally-bug-modal .advally-bug-message.is-error { color:#a00; background:#ffeaea; } #advally-bug-modal .advally-bug-message.is-success { color:#2a6; background:#eaffea; } #advally-bug-modal .advally-bug-message.is-info { color:#666; background:transparent; padding-left:0; } /* === Identify mode (overlay + crosshair) === */ .advally-bug-identify-mode, .advally-bug-identify-mode * { cursor:crosshair !important; } .advally-bug-highlight { outline:3px solid #e55353 !important; outline-offset:2px; background-color:rgba(229,83,83,.1) !important; } #advally-bug-identify-overlay { position:fixed; inset:0; background:rgba(0,0,0,.3); z-index:99997; pointer-events:none; } #advally-bug-identify-overlay .advally-bug-identify-instruction { position:fixed; top:20px; left:50%; transform:translateX(-50%); background:#1466b8; color:#fff; padding:14px 22px; border-radius:8px; text-align:center; pointer-events:auto; box-shadow:0 4px 20px rgba(0,0,0,.3); font-size:14px; font-family:inherit; } #advally-bug-identify-overlay .advally-bug-identify-instruction button { margin-top:10px; padding:5px 14px; background:transparent; color:#fff; border:1px solid rgba(255,255,255,.6); border-radius:4px; cursor:pointer; font-family:inherit; } #advally-bug-identify-overlay .advally-bug-identify-instruction button:hover { background:rgba(255,255,255,.15); }
(function(){ var MAX_CAPTURED_ERRORS = 10, MAX_OUTER_HTML = 1500, MAX_SELECTOR_DEPTH = 8, MAX_ANCESTOR_PATH = 5, STORAGE_KEY = 'advallyBugReporterCollapsed'; var capturedErrors = [], selectedLabel = null, selectedContext = null, isIdentifyMode = false; /* ----- console + window.error capture ----- */ var origErr = console.error; console.error = function(){ try { var msg = Array.prototype.slice.call(arguments).map(function(a){ try { return typeof a==='object' ? JSON.stringify(a) : String(a); } catch(_){ return String(a); } }).join(' '); capturedErrors.push({ type:'console.error', message: msg, timestamp: new Date().toISOString() }); if (capturedErrors.length > MAX_CAPTURED_ERRORS) capturedErrors.shift(); } catch(_){} return origErr.apply(console, arguments); }; window.addEventListener('error', function(ev){ capturedErrors.push({ type:'uncaught', message: ev.message, timestamp: new Date().toISOString() }); if (capturedErrors.length > MAX_CAPTURED_ERRORS) capturedErrors.shift(); }); /* ----- element labelling + selector path ----- */ function elLabel(el){ if (!el) return 'unknown element'; if (el.tagName === 'LABEL') return (el.textContent||'').trim().replace(/\*$/,'').trim(); if (el.tagName === 'INPUT' || el.tagName === 'SELECT' || el.tagName === 'TEXTAREA') { if (el.id) { var lbl = document.querySelector('label[for="'+el.id+'"]'); if (lbl) return (lbl.textContent||'').trim().replace(/\*$/,'').trim() + ' field'; } return (el.placeholder || el.name || 'Input') + ' field'; } if (el.tagName === 'BUTTON' || (el.tagName === 'A' && el.classList.contains('button'))) return ((el.textContent||'').trim() || el.title || 'Button') + ' button'; if (el.tagName === 'TD') { var tbl = el.closest('table'); if (tbl) { var th = tbl.querySelector('thead th:nth-child('+(el.cellIndex+1)+')'); if (th) return (th.textContent||'').trim() + ' column'; } return 'Table cell'; } if (el.tagName === 'TH') return (el.textContent||'').trim() + ' column header'; if (/^H[1-6]$/.test(el.tagName)) return (el.textContent||'').trim(); if (el.classList.contains('p-nav-list-item') || el.classList.contains('menu-linkRow')) return (el.textContent||'').trim() + ' menu item'; var t = (el.textContent||'').trim().substring(0,50); if (t && t.length > 2) return t + (t.length >= 50 ? '...' : ''); return el.tagName.toLowerCase() + ' element'; } function cssSelectorFor(el){ if (!el || el.nodeType !== 1) return null; if (el === document.body) return 'body'; var parts = [], cur = el; while (cur && cur !== document.body && parts.length < MAX_SELECTOR_DEPTH) { var p = cur.tagName.toLowerCase(); if (cur.id) { parts.unshift('#' + cur.id); break; } if (cur.className && typeof cur.className === 'string') { var classes = cur.className.trim().split(/\s+/).filter(function(c){ return c && c.indexOf('advally-bug-') !== 0; }).slice(0,3).join('.'); if (classes) p += '.' + classes; } var par = cur.parentElement; if (par) { var sib = Array.prototype.filter.call(par.children, function(c){ return c.tagName === cur.tagName; }); if (sib.length > 1) p += ':nth-of-type(' + (sib.indexOf(cur)+1) + ')'; } parts.unshift(p); cur = par; } return parts.join(' > '); } function truncateOuterHtml(el){ try { var clone = el.cloneNode(true); (function strip(n){ if (n.nodeType !== 1) return; if (n.classList && n.classList.length) { var rm = Array.prototype.filter.call(n.classList, function(c){ return c.indexOf('advally-bug-') === 0; }); rm.forEach(function(c){ n.classList.remove(c); }); if (n.classList.length === 0 && n.hasAttribute('class')) n.removeAttribute('class'); } for (var i=0;i 250 ? titleRaw.substring(0, 247) + '...' : titleRaw; if (title.length < 10) title = (title + ' — bug report').substring(0, 250); var descParts = [ '**What I was trying to do:**', trying, '', '**What went wrong:**', wrong, '', '**Affected element:** ' + affected ]; if (selectedContext && selectedContext.selector) descParts.push('', '**Element selector:** `' + selectedContext.selector + '`'); if (selectedContext && selectedContext.path && selectedContext.path.length) descParts.push('**Element ancestor path:** ' + selectedContext.path.join(' › ')); if (selectedContext && selectedContext.outerHtml) descParts.push('', '**Element markup:**', '```html', selectedContext.outerHtml, '```'); if (capturedErrors.length) { descParts.push('', '**Console errors (' + capturedErrors.length + '):**'); capturedErrors.forEach(function(er){ descParts.push('- [' + er.type + '] ' + er.message); }); } descParts.push('', '**Viewport:** ' + window.innerWidth + 'x' + window.innerHeight); var description = descParts.join('\n'); if (description.length > 5000) description = description.substring(0, 4990) + '\n…'; var fd = new FormData(form); fd.set('title', title); fd.set('description', description); fd.set('severity', severity); fd.set('page_url', window.location.href); fd.set('_xfResponseType', 'json'); var btn = form.querySelector('.advally-bug-submit'); btn.disabled = true; showMsg('info', 'Submitting…'); fetch(form.action, { method:'POST', body: fd, credentials:'same-origin', headers: { 'X-Requested-With':'XMLHttpRequest', 'Accept':'application/json' } }) .then(function(r){ return r.json().then(function(j){ return { ok:r.ok, body:j }; }); }) .then(function(res){ btn.disabled = false; if (res.ok && res.body && res.body.success) { showMsg('success', '{{ phrase("advally_feedback_widget_success") }}'); capturedErrors = []; selectedLabel = null; selectedContext = null; form.querySelector('[name=affected_element]').value = ''; form.querySelector('[name=what_trying_to_do]').value = ''; form.querySelector('[name=what_went_wrong]').value = ''; } else { showMsg('error', (res.body && res.body.error) || '{{ phrase("advally_feedback_widget_error_generic") }}'); } }) .catch(function(){ btn.disabled = false; showMsg('error', '{{ phrase("advally_feedback_widget_error_generic") }}'); }); }); function showMsg(kind, text){ if (!msg) return; msg.hidden = false; msg.className = 'advally-bug-message is-' + kind; msg.textContent = text; } })();