js/impersonate.js.bak_20260428_194337_filter

Code: DEV-056221F1 Size: 10.1 KB Lines: 174 Path: /home/prodconfig.wenesthosting.com/dev.solargroup.wenest.se/js/impersonate.js.bak_20260428_194337_filter

Task / Comment

Open report form
// 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">&times;</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);
})();