// impersonate.js — Admin kan byta till annan användare och återgå
(function(){
var IMP_KEY = 'gImpersonateOriginal';
var SESSION_KEYS = ['gStaffId','gUserEmail','gUserName','gUserRole','gUserAvatar','gAccessToken','gTokenExpiry'];
function isImpersonating(){ return !!sessionStorage.getItem(IMP_KEY); }
function _curRole(){ return sessionStorage.getItem('gUserRole') || ''; }
function isAdmin(){ return ['admin','systemadmin'].indexOf(_curRole()) >= 0; }
function _captureSession(){
var snap = {};
SESSION_KEYS.forEach(function(k){ snap[k] = sessionStorage.getItem(k) || ''; });
return snap;
}
function _applySession(snap){
SESSION_KEYS.forEach(function(k){
if(snap[k]) sessionStorage.setItem(k, snap[k]);
else sessionStorage.removeItem(k);
});
try {
if(typeof gStaffId !== 'undefined') gStaffId = snap.gStaffId || '';
if(typeof gUserEmail !== 'undefined') gUserEmail = snap.gUserEmail || '';
if(typeof gUserName !== 'undefined') gUserName = snap.gUserName || '';
if(typeof gUserRole !== 'undefined') gUserRole = snap.gUserRole || '';
if(typeof gUserAvatar !== 'undefined') gUserAvatar = snap.gUserAvatar || '';
} catch(e){}
}
window.openImpersonateModal = function(){
if(!isAdmin() && !isImpersonating()){
alert('Endast admin kan byta användare.'); return;
}
var existing = document.getElementById('impersonateModal');
if(existing) existing.remove();
var modal = document.createElement('div');
modal.id = 'impersonateModal';
modal.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:99999;display:flex;align-items:center;justify-content:center;padding:20px';
modal.innerHTML = '<div style="background:#fff;border-radius:14px;padding:24px;width:520px;max-width:95vw;max-height:80vh;display:flex;flex-direction:column;font-family:inherit">'
+ '<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:14px">'
+ '<h3 style="margin:0;font-size:18px;font-weight:700">Byt användare</h3>'
+ '<button onclick="document.getElementById(\'impersonateModal\').remove()" style="background:none;border:none;font-size:22px;cursor:pointer;color:#94a3b8">×</button>'
+ '</div>'
+ '<input id="impSearch" placeholder="Sök användare..." style="width:100%;padding:10px 14px;border:1.5px solid #e5e7eb;border-radius:8px;font-size:14px;margin-bottom:12px;font-family:inherit;box-sizing:border-box">'
+ '<div id="impList" style="overflow:auto;flex:1;border:1px solid #f1f5f9;border-radius:8px;min-height:200px">Laddar...</div>'
+ '</div>';
modal.onclick = function(e){ if(e.target === modal) modal.remove(); };
document.body.appendChild(modal);
fetch('/api/staff.php').then(function(r){ return r.json(); }).then(function(staff){
var list = Array.isArray(staff) ? staff : (staff.staff || []);
// Admin får inte impersonate systemadmin — bara systemadmin kan bli systemadmin.
var _myRole = (function(){
var orig = null;
try { orig = JSON.parse(sessionStorage.getItem(IMP_KEY) || 'null'); } catch(e){}
return (orig && orig.gUserRole) ? orig.gUserRole : (sessionStorage.getItem('gUserRole') || '');
})();
var canBecomeSystemadmin = (_myRole === 'systemadmin');
var renderList = function(filter){
var f = (filter || '').toLowerCase().trim();
var rows = list.filter(function(s){
if(!s.active) return false;
if(s.role === 'systemadmin' && !canBecomeSystemadmin) return false;
if(!f) return true;
return ((s.name||'')+' '+(s.email||'')+' '+(s.role||'')).toLowerCase().indexOf(f) >= 0;
});
if(!rows.length){
document.getElementById('impList').innerHTML = '<div style="padding:14px;color:#94a3b8;text-align:center">Inga matchningar</div>';
return;
}
var html = rows.map(function(s){
var roleColor = ({admin:'#dc2626',systemadmin:'#dc2626',saljchef:'#7c3aed',saljare:'#0d9488',installator:'#f59e0b',ekonomi:'#2563eb'}[s.role] || '#64748b');
return '<div style="padding:10px 14px;border-bottom:1px solid #f1f5f9;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:10px" onmouseover="this.style.background=\'#f8fafc\'" onmouseout="this.style.background=\'\'">'
+ '<div style="flex:1;min-width:0" onclick="impersonateAs('+s.id+')">'
+ '<div style="font-weight:600;font-size:14px">' + (s.name||'(utan namn)') + '</div>'
+ '<div style="font-size:11px;color:#64748b;display:flex;gap:6px;align-items:center">'
+ (s.email||'') + ' · <span style="color:'+roleColor+';font-weight:600">' + (s.role||'-') + '</span>'
+ '</div>'
+ '</div>'
+ '<button onclick="impersonateAs('+s.id+')" style="background:#024550;color:#fff;border:none;padding:6px 14px;border-radius:6px;font-size:12px;font-weight:700;cursor:pointer;font-family:inherit;flex-shrink:0">Bli</button>'
+ '</div>';
}).join('');
document.getElementById('impList').innerHTML = html;
};
renderList('');
document.getElementById('impSearch').addEventListener('input', function(e){ renderList(e.target.value); });
}).catch(function(e){
document.getElementById('impList').innerHTML = '<div style="padding:14px;color:#dc2626">Kunde inte ladda användare: ' + e + '</div>';
});
};
window.impersonateAs = function(staffId){
staffId = parseInt(staffId, 10);
if(!staffId) return;
if(!isImpersonating()){
sessionStorage.setItem(IMP_KEY, JSON.stringify(_captureSession()));
}
fetch('/api/staff.php?id=' + staffId).then(function(r){ return r.json(); }).then(function(d){
var user = Array.isArray(d) ? d[0] : (d && d.staff ? (Array.isArray(d.staff) ? d.staff[0] : d.staff) : d);
if(!user || !user.id){ alert('Hittade inte användaren.'); return; }
var newSnap = {
gStaffId: String(user.id),
gUserEmail: user.email || '',
gUserName: user.name || '',
gUserRole: user.role || 'saljare',
gUserAvatar:user.avatar_url || '',
gAccessToken: sessionStorage.getItem('gAccessToken') || '',
gTokenExpiry: sessionStorage.getItem('gTokenExpiry') || ''
};
_applySession(newSnap);
// Rensa per-user data så vi börjar på nytt som den användaren
try { localStorage.removeItem('faltProspects'); } catch(e){}
location.reload();
});
};
window.stopImpersonating = function(){
var orig = sessionStorage.getItem(IMP_KEY);
if(!orig) return;
try {
var snap = JSON.parse(orig);
_applySession(snap);
sessionStorage.removeItem(IMP_KEY);
try { localStorage.removeItem('faltProspects'); } catch(e){}
location.reload();
} catch(e){ alert('Kunde inte återgå: ' + e); }
};
function _renderBadge(){
// Top banner när vi impersonatear
var existing = document.getElementById('impBanner');
if(isImpersonating()){
var orig = {};
try { orig = JSON.parse(sessionStorage.getItem(IMP_KEY) || '{}'); } catch(e){}
if(!existing){
var bar = document.createElement('div');
bar.id = 'impBanner';
bar.style.cssText = 'position:fixed;top:0;left:0;right:0;z-index:99998;background:linear-gradient(90deg,#f59e0b,#dc2626);color:#fff;padding:8px 16px;display:flex;justify-content:center;align-items:center;gap:14px;font-size:13px;font-weight:600;box-shadow:0 2px 8px rgba(0,0,0,.15)';
bar.innerHTML = '<span>👤 Visar som <strong id="impCurName">' + (sessionStorage.getItem('gUserName')||'-') + '</strong></span>'
+ '<button onclick="stopImpersonating()" style="background:#fff;color:#92400e;border:none;padding:6px 16px;border-radius:6px;font-weight:700;cursor:pointer;font-family:inherit;font-size:12px">← Tillbaka till ' + (orig.gUserName || orig.gUserEmail || 'admin') + '</button>';
document.body.appendChild(bar);
document.body.style.paddingTop = '40px';
}
} else if(existing){
existing.remove();
document.body.style.paddingTop = '';
}
// Sidebar-knapp
var bottom = document.querySelector('.sidebar-bottom');
var existingBtn = document.getElementById('impSwitchBtn');
if(bottom && (isAdmin() || isImpersonating())){
if(!existingBtn){
var btn = document.createElement('button');
btn.id = 'impSwitchBtn';
btn.className = 'sidebar-logout';
btn.style.cssText = 'background:#7c3aed;color:#fff;margin-bottom:6px';
btn.innerHTML = '<svg viewBox="0 0 24 24" style="width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;margin-right:6px;vertical-align:middle"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M19 8l-2 2m0 0l-2-2m2 2v6"/></svg>Byt användare';
btn.onclick = openImpersonateModal;
var logout = bottom.querySelector('.sidebar-logout');
bottom.insertBefore(btn, logout);
}
} else if(existingBtn){
existingBtn.remove();
}
}
if(document.readyState === 'loading'){
document.addEventListener('DOMContentLoaded', function(){ setTimeout(_renderBadge, 300); });
} else {
setTimeout(_renderBadge, 300);
}
setInterval(_renderBadge, 1500);
})();