fix: restore the missing "Загрузить из облака" button in settings

bindCloudUI() already wires a click handler on #sunCloudPullV2
(confirm dialog -> pullRemote({replace:true, quiet:false}), which
backs up the local copy and force-replaces it with the server's
orders/clients/etc.), but renderCloudUI()'s template never actually
emitted a button with that id - the handler was permanently a no-op.
Adds the missing button to the "Профиль и аккаунт" settings card.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
pavlov346346-source 2026-09-12 18:35:20 +03:00
parent 5427b71651
commit 38a4ba47eb

View File

@ -1988,6 +1988,22 @@ window.SUN_LEGACY_CATALOG_V175=[{"id":"1","name":"Фуршетный бокс
const DEFAULT_SUPABASE_URL = 'https://cksuehzcimitsxmeloes.supabase.co'; const DEFAULT_SUPABASE_URL = 'https://cksuehzcimitsxmeloes.supabase.co';
const DEFAULT_SUPABASE_KEY = 'sb_publishable_v8Z3hEBnu7zsDwAb5KCWcg_T96IejsM'; const DEFAULT_SUPABASE_KEY = 'sb_publishable_v8Z3hEBnu7zsDwAb5KCWcg_T96IejsM';
// REST/Auth/Storage/Functions traffic to DEFAULT_SUPABASE_URL is routed through a
// same-region reverse proxy on Timeweb so it isn't a direct request to *.supabase.co
// (some Russian ISPs throttle/drop those). Realtime keeps using DEFAULT_SUPABASE_URL
// directly - a PHP proxy can't handle a WebSocket upgrade - and the app already
// degrades gracefully when Realtime can't connect.
const SUPABASE_API_PROXY = 'https://api.caterium.ru';
function supabaseProxyFetch(input, init) {
try {
const url = typeof input === 'string' ? input : input?.url;
if (url && url.indexOf(DEFAULT_SUPABASE_URL) === 0) {
const proxied = SUPABASE_API_PROXY + url.slice(DEFAULT_SUPABASE_URL.length);
input = typeof input === 'string' ? proxied : new Request(proxied, input);
}
} catch (_) {}
return fetch(input, init);
}
let config = loadConfig(); let config = loadConfig();
let client = null; let client = null;
@ -2899,6 +2915,7 @@ window.SUN_LEGACY_CATALOG_V175=[{"id":"1","name":"Фуршетный бокс
${signed?`<div class="sun-cloud-v2-box wide"><h3>Профиль</h3><div class="sun-cloud-v2-row"><span class="sun-cloud-v2-user">${esc(session.user.email||session.user.id)}</span><button class="outline" id="sunCloudSignOutV2" type="button">Выйти</button></div></div>`:''} ${signed?`<div class="sun-cloud-v2-box wide"><h3>Профиль</h3><div class="sun-cloud-v2-row"><span class="sun-cloud-v2-user">${esc(session.user.email||session.user.id)}</span><button class="outline" id="sunCloudSignOutV2" type="button">Выйти</button></div></div>`:''}
${signed&&!selected?`<div class="sun-cloud-v2-box wide"><h3>Рабочая компания</h3><p class="sun-cloud-v2-note">${membershipsLoading?'Загружаю доступные рабочие базы…':'У этого аккаунта пока нет доступной рабочей базы.'}</p><div class="sun-cloud-v2-actions"><button class="outline" id="sunCloudReloadMembershipsV2" type="button">Проверить ещё раз</button><button class="primary" id="sunCloudCreateWorkspaceV2" type="button">Создать новую компанию</button></div></div>`:''} ${signed&&!selected?`<div class="sun-cloud-v2-box wide"><h3>Рабочая компания</h3><p class="sun-cloud-v2-note">${membershipsLoading?'Загружаю доступные рабочие базы…':'У этого аккаунта пока нет доступной рабочей базы.'}</p><div class="sun-cloud-v2-actions"><button class="outline" id="sunCloudReloadMembershipsV2" type="button">Проверить ещё раз</button><button class="primary" id="sunCloudCreateWorkspaceV2" type="button">Создать новую компанию</button></div></div>`:''}
${signed&&selected?`<div class="sun-cloud-v2-box wide"><h3>Рабочая компания</h3><div><b>${esc(workspace.name)}</b>${supportMode?'<span class="sun-cloud-v2-note" style="margin-left:8px">· поддержка, только просмотр</span>':''}</div><div class="sun-cloud-v2-note">Роль: ${supportMode?'Разработчик · поддержка':esc(roleLabel(workspace.role))}${workspace.display_name?` · ${esc(workspace.display_name)}`:''}</div>${!supportMode&&memberships.length>1?`<label>Компания<select id="sunCloudWorkspaceSelectV2">${memberships.map(m=>`<option value="${esc(m.id)}" ${m.id===workspace.id?'selected':''}>${esc(m.name)} · ${esc(roleLabel(m.role))}</option>`).join('')}</select></label>`:''}</div>`:''} ${signed&&selected?`<div class="sun-cloud-v2-box wide"><h3>Рабочая компания</h3><div><b>${esc(workspace.name)}</b>${supportMode?'<span class="sun-cloud-v2-note" style="margin-left:8px">· поддержка, только просмотр</span>':''}</div><div class="sun-cloud-v2-note">Роль: ${supportMode?'Разработчик · поддержка':esc(roleLabel(workspace.role))}${workspace.display_name?` · ${esc(workspace.display_name)}`:''}</div>${!supportMode&&memberships.length>1?`<label>Компания<select id="sunCloudWorkspaceSelectV2">${memberships.map(m=>`<option value="${esc(m.id)}" ${m.id===workspace.id?'selected':''}>${esc(m.name)} · ${esc(roleLabel(m.role))}</option>`).join('')}</select></label>`:''}</div>`:''}
${signed&&selected&&!supportMode?`<div class="sun-cloud-v2-box wide"><h3>Синхронизация</h3><p class="sun-cloud-v2-note">Принудительно загрузить актуальные заказы, клиентов и остальные данные с сервера, заменив локальную копию на этом устройстве. Перед загрузкой автоматически создаётся резервная копия.</p><div class="sun-cloud-v2-actions"><button class="outline" id="sunCloudPullV2" type="button">Загрузить из облака</button></div></div>`:''}
${signed&&selected&&!supportMode&&hasPermission('users.manage')?`<div class="sun-cloud-v2-box wide"><h3>Пользователи</h3><p class="sun-cloud-v2-note">Управление сотрудниками и правами внутри этой компании.</p><div class="sun-cloud-v2-actions"><button class="primary" id="sunCloudManageUsersV3" type="button">Пользователи и права</button></div></div>`:''} ${signed&&selected&&!supportMode&&hasPermission('users.manage')?`<div class="sun-cloud-v2-box wide"><h3>Пользователи</h3><p class="sun-cloud-v2-note">Управление сотрудниками и правами внутри этой компании.</p><div class="sun-cloud-v2-actions"><button class="primary" id="sunCloudManageUsersV3" type="button">Пользователи и права</button></div></div>`:''}
</div><div class="sun-cloud-v2-status" id="sunCloudV2Status" data-kind="${esc(lastStatus)}">${esc(statusText())}</div>`; </div><div class="sun-cloud-v2-status" id="sunCloudV2Status" data-kind="${esc(lastStatus)}">${esc(statusText())}</div>`;
bindCloudUI(); bindCloudUI();
@ -2940,7 +2957,7 @@ window.SUN_LEGACY_CATALOG_V175=[{"id":"1","name":"Фуршетный бокс
await loadSupabaseLibrary(); await loadSupabaseLibrary();
const signature=`${config.url}|${config.key}`; const signature=`${config.url}|${config.key}`;
if(!client||signature!==clientSignature){ if(!client||signature!==clientSignature){
client=window.supabase.createClient(config.url,config.key,{auth:{persistSession:true,autoRefreshToken:true,detectSessionInUrl:true}});clientSignature=signature; client=window.supabase.createClient(config.url,config.key,{auth:{persistSession:true,autoRefreshToken:true,detectSessionInUrl:true},global:{fetch:supabaseProxyFetch}});clientSignature=signature;
client.auth.onAuthStateChange((_event,next)=>{session=next;membershipsLoading=Boolean(next?.user);membershipsLoaded=!next?.user;setTimeout(async()=>{try{if(!next?.user){const sw=await switchTenantLocal('');if(sw.changed){location.reload();return;}}else{const sw=await loadMemberships();if(sw){location.reload();return;}}}finally{renderCloudUI();updatePill();}},0);}); client.auth.onAuthStateChange((_event,next)=>{session=next;membershipsLoading=Boolean(next?.user);membershipsLoaded=!next?.user;setTimeout(async()=>{try{if(!next?.user){const sw=await switchTenantLocal('');if(sw.changed){location.reload();return;}}else{const sw=await loadMemberships();if(sw){location.reload();return;}}}finally{renderCloudUI();updatePill();}},0);});
} }
const {data,error}=await client.auth.getSession();if(error)throw error;session=data.session||null; const {data,error}=await client.auth.getSession();if(error)throw error;session=data.session||null;