Sync: localStorage→Supabase→localStorage, без дублирования клиента

This commit is contained in:
Dauren777 2026-06-05 10:53:45 +00:00
parent 2415e0ceab
commit a1f41535ae
2 changed files with 11 additions and 9 deletions

View File

@ -100,13 +100,18 @@ function allU(){var r=getU();r.admin={pass:"admin",name:"Администрат
function getA(){return JSON.parse(localStorage.getItem("pab_audits")||"[]")}
function saveA(d){localStorage.setItem("pab_audits",JSON.stringify(d))}
// Sync from Supabase to localStorage
// Sync: push localStorage to Supabase, then pull Supabase to localStorage
async function syncFromSB(){
try{
var u=await SB.from("users").select("*");if(u.data){var um={};u.data.forEach(function(x){um[x.login]={pass:x.pass,name:x.name,email:x.email,role:x.role,freq:x.freq,branch:x.branch,dept:x.dept,region:x.region,oblast:x.oblast,city:x.city}});saveU(um)}
var a=await SB.from("audits").select("*").order("created_at",{ascending:false});if(a.data){var am=a.data.map(function(x){return{id:x.id,number:x.number,date:x.date,location:x.location,region:x.region,workType:x.work_type,workerCount:x.worker_count,observer:x.observer,observerRole:x.observer_role,overallSafe:x.overall_safe,categories:x.categories,totalViolations:x.total_violations,dialogue:x.dialogue,docs:x.docs,createdBy:x.created_by,createdAt:x.created_at}});saveA(am)}
console.log("Synced from Supabase")
}catch(e){console.log("Supabase sync failed, using localStorage")}
// 1. Push localStorage users to Supabase
var lu=getU();for(var k in lu){await SB.from("users").upsert({login:k,pass:lu[k].pass,name:lu[k].name,email:lu[k].email,role:lu[k].role,freq:lu[k].freq,branch:lu[k].branch,dept:lu[k].dept,region:lu[k].region,oblast:lu[k].oblast,city:lu[k].city}).select();}
// 2. Push localStorage audits to Supabase
var la=getA();for(var i=0;i<la.length;i++){var a=la[i];await SB.from("audits").upsert({id:a.id,number:a.number,date:a.date,location:a.location,region:a.region,work_type:a.workType,worker_count:a.workerCount,observer:a.observer,observer_role:a.observerRole,overall_safe:a.overallSafe,categories:a.categories,total_violations:a.totalViolations,dialogue:a.dialogue,docs:a.docs,created_by:a.createdBy,created_at:a.createdAt}).select();}
// 3. Pull from Supabase back to localStorage (to get data from other PCs)
var su=await SB.from("users").select("*");if(su.data){var um={};su.data.forEach(function(x){um[x.login]={pass:x.pass,name:x.name,email:x.email,role:x.role,freq:x.freq,branch:x.branch,dept:x.dept,region:x.region,oblast:x.oblast,city:x.city}});saveU(um)}
var sa=await SB.from("audits").select("*").order("created_at",{ascending:false});if(sa.data){var am=[];sa.data.forEach(function(x){am.push({id:x.id,number:x.number,date:x.date,location:x.location,region:x.region,workType:x.work_type,workerCount:x.worker_count,observer:x.observer,observerRole:x.observer_role,overallSafe:x.overall_safe,categories:x.categories,totalViolations:x.total_violations,dialogue:x.dialogue,docs:x.docs,createdBy:x.created_by,createdAt:x.created_at})});saveA(am)}
console.log("Synced to/from Supabase")
}catch(e){console.log("Sync error:",e)}
}
// Write to Supabase

View File

@ -4,7 +4,6 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Вход — ПАБ</title>
<script src="https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2/dist/umd/supabase.min.js"></script>
<style>
*{box-sizing:border-box;margin:0;padding:0}
body{font:16px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;background:linear-gradient(135deg,#0F1218 0%,#1a2332 100%)}
@ -65,9 +64,7 @@ document.getElementById('lp').onkeydown=function(e){if(e.key==='Enter')document.
document.getElementById('rbb').onclick=function(){
var l=document.getElementById('rl').value.trim().toLowerCase(),p=document.getElementById('rp').value.trim(),n=document.getElementById('rn').value.trim(),em=document.getElementById('re').value.trim(),r=document.getElementById('rr').value,fr=document.getElementById('rf').value,br=document.getElementById('rb').value.trim(),dp=document.getElementById('rd').value.trim(),rg=document.getElementById('rg').value.trim(),ob=document.getElementById('ro').value.trim(),ct=document.getElementById('rc').value.trim();
var e=document.getElementById('rerr'),ok=document.getElementById('rok');ok.style.display='none';if(!l||l.length<2){e.textContent='Логин мин. 2 символа';e.style.display='block';return}if(!p||p.length<3){e.textContent='Пароль мин. 3 символа';e.style.display='block';return}if(!n){e.textContent='Укажите ФИО';e.style.display='block';return}if(!r){e.textContent='Выберите должность';e.style.display='block';return}if(!em||em.indexOf('@')<0){e.textContent='Укажите Email';e.style.display='block';return}if(!br){e.textContent='Укажите филиал';e.style.display='block';return}if(!rg){e.textContent='Укажите регион';e.style.display='block';return}if(!ct){e.textContent='Укажите город';e.style.display='block';return}if(!dp){e.textContent='Укажите подразделение';e.style.display='block';return}if(!fr){e.textContent='Укажите периодичность ПАБ';e.style.display='block';return}
var users={};try{users=JSON.parse(localStorage.getItem('pab_users')||'{}')}catch(e){}if(users[l]){e.textContent='Логин занят';e.style.display='block';return}e.style.display='none';users[l]={pass:p,name:n,email:em,role:r,freq:fr,branch:br,dept:dp,region:rg,oblast:ob,city:ct};localStorage.setItem('pab_users',JSON.stringify(users));
try{supabase.createClient("https://znexbjafkvyjffffbhlf.supabase.co","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InpuZXhiamFma3Z5amZmZmZiaGhsZiIsInJvbGUiOiJhbm9uIiwiaWF0IjoxNzgwNjQ0MTgyLCJleHAiOjIwOTYyMjAxODJ9.fhKixmi5Tx6yB-rRkGqHzOdepbXq3BoETdh7s__aDRk").from("users").upsert({login:l,pass:p,name:n,email:em,role:r,freq:fr,branch:br,dept:dp,region:rg,oblast:ob,city:ct})}catch(e){}
ok.style.display='block';document.getElementById('lu').value=l;setTimeout(function(){ok.style.display='none';document.getElementById('tL').onclick()},2000)
var users={};try{users=JSON.parse(localStorage.getItem('pab_users')||'{}')}catch(e){}if(users[l]){e.textContent='Логин занят';e.style.display='block';return}e.style.display='none';users[l]={pass:p,name:n,email:em,role:r,freq:fr,branch:br,dept:dp,region:rg,oblast:ob,city:ct};localStorage.setItem('pab_users',JSON.stringify(users));ok.style.display='block';document.getElementById('lu').value=l;setTimeout(function(){ok.style.display='none';document.getElementById('tL').onclick()},2000)
};
</script>
</body>