cabinet: Telegram WebApp init (expand + start_param token), add Политика ПДн to signing docs

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wasrusgen 2026-05-30 16:59:48 +03:00
parent e61ae25647
commit 1d9d4ef9c8
2 changed files with 14 additions and 4 deletions

View File

@ -4,6 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Кабинет клиента · @wasrusgen1 | КОНСАЛТИНГ</title> <title>Кабинет клиента · @wasrusgen1 | КОНСАЛТИНГ</title>
<script src="https://telegram.org/js/telegram-web-app.js"></script>
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Montserrat:wght@700;800&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Montserrat:wght@700;800&display=swap" rel="stylesheet">
<style> <style>
@ -188,7 +189,8 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ
<div style="background:var(--subtle);border:1.5px solid var(--border);border-radius:11px;padding:14px;margin-bottom:16px;font-size:13px;line-height:1.6"> <div style="background:var(--subtle);border:1.5px solid var(--border);border-radius:11px;padding:14px;margin-bottom:16px;font-size:13px;line-height:1.6">
Ознакомьтесь с документами:<br> Ознакомьтесь с документами:<br>
📄 <a href="#" onclick="viewDoc('offer');return false" style="color:var(--primary);font-weight:600">Договор-оферта на консультационные услуги</a><br> 📄 <a href="#" onclick="viewDoc('offer');return false" style="color:var(--primary);font-weight:600">Договор-оферта на консультационные услуги</a><br>
📄 <a href="#" onclick="viewDoc('pep');return false" style="color:var(--primary);font-weight:600">Соглашение об использовании ПЭП</a> 📄 <a href="#" onclick="viewDoc('pep');return false" style="color:var(--primary);font-weight:600">Соглашение об использовании ПЭП</a><br>
📄 <a href="#" onclick="viewDoc('pdn');return false" style="color:var(--primary);font-weight:600">Политика обработки персональных данных</a>
</div> </div>
<label style="display:flex;align-items:flex-start;gap:10px;margin-bottom:16px;cursor:pointer"> <label style="display:flex;align-items:flex-start;gap:10px;margin-bottom:16px;cursor:pointer">
<input type="checkbox" id="signAgree" style="width:18px;height:18px;margin-top:2px;flex-shrink:0"> <input type="checkbox" id="signAgree" style="width:18px;height:18px;margin-top:2px;flex-shrink:0">
@ -357,6 +359,9 @@ function showTyping(){const t=document.createElement("div");t.className="msg";t.
function hideTyping(){const t=document.getElementById("typing");if(t)t.remove()} function hideTyping(){const t=document.getElementById("typing");if(t)t.remove()}
async function init(){ async function init(){
// Telegram Mini App: развернуть на весь экран + токен из start_param если нет в URL
const tg=window.Telegram&&window.Telegram.WebApp;
if(tg){try{tg.ready();tg.expand();const sp=tg.initDataUnsafe&&tg.initDataUnsafe.start_param;if(sp&&!token){token=sp;localStorage.setItem("cab_token",token);}}catch(e){}}
if(token){const r=await fetch(`${API}/api/project/${token}`);if(r.ok){state=await r.json();renderAll(); if(token){const r=await fetch(`${API}/api/project/${token}`);if(r.ok){state=await r.json();renderAll();
fillProfile(); fillProfile();
// Если профиль не заполнен — открыть вкладку Профиль // Если профиль не заполнен — открыть вкладку Профиль
@ -423,7 +428,7 @@ async function viewDoc(doc){
const dm=document.getElementById("docModal"); const dm=document.getElementById("docModal");
document.getElementById("docTitle").textContent="Загрузка...";document.getElementById("docText").textContent="";dm.classList.add("show"); document.getElementById("docTitle").textContent="Загрузка...";document.getElementById("docText").textContent="";dm.classList.add("show");
try{const r=await fetch(`${API}/api/legal/${doc}`);const d=await r.json(); try{const r=await fetch(`${API}/api/legal/${doc}`);const d=await r.json();
document.getElementById("docTitle").textContent=doc==="offer"?"Договор-оферта":"Соглашение об использовании ПЭП"; document.getElementById("docTitle").textContent={offer:"Договор-оферта",pep:"Соглашение об использовании ПЭП",pdn:"Политика обработки персональных данных"}[doc]||"Документ";
document.getElementById("docText").textContent=d.text||d.error||"Документ недоступен"; document.getElementById("docText").textContent=d.text||d.error||"Документ недоступен";
}catch(e){document.getElementById("docText").textContent="Ошибка: "+e.message} }catch(e){document.getElementById("docText").textContent="Ошибка: "+e.message}
} }

View File

@ -4,6 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Кабинет клиента · @wasrusgen1 | КОНСАЛТИНГ</title> <title>Кабинет клиента · @wasrusgen1 | КОНСАЛТИНГ</title>
<script src="https://telegram.org/js/telegram-web-app.js"></script>
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Montserrat:wght@700;800&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Montserrat:wght@700;800&display=swap" rel="stylesheet">
<style> <style>
@ -188,7 +189,8 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ
<div style="background:var(--subtle);border:1.5px solid var(--border);border-radius:11px;padding:14px;margin-bottom:16px;font-size:13px;line-height:1.6"> <div style="background:var(--subtle);border:1.5px solid var(--border);border-radius:11px;padding:14px;margin-bottom:16px;font-size:13px;line-height:1.6">
Ознакомьтесь с документами:<br> Ознакомьтесь с документами:<br>
📄 <a href="#" onclick="viewDoc('offer');return false" style="color:var(--primary);font-weight:600">Договор-оферта на консультационные услуги</a><br> 📄 <a href="#" onclick="viewDoc('offer');return false" style="color:var(--primary);font-weight:600">Договор-оферта на консультационные услуги</a><br>
📄 <a href="#" onclick="viewDoc('pep');return false" style="color:var(--primary);font-weight:600">Соглашение об использовании ПЭП</a> 📄 <a href="#" onclick="viewDoc('pep');return false" style="color:var(--primary);font-weight:600">Соглашение об использовании ПЭП</a><br>
📄 <a href="#" onclick="viewDoc('pdn');return false" style="color:var(--primary);font-weight:600">Политика обработки персональных данных</a>
</div> </div>
<label style="display:flex;align-items:flex-start;gap:10px;margin-bottom:16px;cursor:pointer"> <label style="display:flex;align-items:flex-start;gap:10px;margin-bottom:16px;cursor:pointer">
<input type="checkbox" id="signAgree" style="width:18px;height:18px;margin-top:2px;flex-shrink:0"> <input type="checkbox" id="signAgree" style="width:18px;height:18px;margin-top:2px;flex-shrink:0">
@ -357,6 +359,9 @@ function showTyping(){const t=document.createElement("div");t.className="msg";t.
function hideTyping(){const t=document.getElementById("typing");if(t)t.remove()} function hideTyping(){const t=document.getElementById("typing");if(t)t.remove()}
async function init(){ async function init(){
// Telegram Mini App: развернуть на весь экран + токен из start_param если нет в URL
const tg=window.Telegram&&window.Telegram.WebApp;
if(tg){try{tg.ready();tg.expand();const sp=tg.initDataUnsafe&&tg.initDataUnsafe.start_param;if(sp&&!token){token=sp;localStorage.setItem("cab_token",token);}}catch(e){}}
if(token){const r=await fetch(`${API}/api/project/${token}`);if(r.ok){state=await r.json();renderAll(); if(token){const r=await fetch(`${API}/api/project/${token}`);if(r.ok){state=await r.json();renderAll();
fillProfile(); fillProfile();
// Если профиль не заполнен — открыть вкладку Профиль // Если профиль не заполнен — открыть вкладку Профиль
@ -423,7 +428,7 @@ async function viewDoc(doc){
const dm=document.getElementById("docModal"); const dm=document.getElementById("docModal");
document.getElementById("docTitle").textContent="Загрузка...";document.getElementById("docText").textContent="";dm.classList.add("show"); document.getElementById("docTitle").textContent="Загрузка...";document.getElementById("docText").textContent="";dm.classList.add("show");
try{const r=await fetch(`${API}/api/legal/${doc}`);const d=await r.json(); try{const r=await fetch(`${API}/api/legal/${doc}`);const d=await r.json();
document.getElementById("docTitle").textContent=doc==="offer"?"Договор-оферта":"Соглашение об использовании ПЭП"; document.getElementById("docTitle").textContent={offer:"Договор-оферта",pep:"Соглашение об использовании ПЭП",pdn:"Политика обработки персональных данных"}[doc]||"Документ";
document.getElementById("docText").textContent=d.text||d.error||"Документ недоступен"; document.getElementById("docText").textContent=d.text||d.error||"Документ недоступен";
}catch(e){document.getElementById("docText").textContent="Ошибка: "+e.message} }catch(e){document.getElementById("docText").textContent="Ошибка: "+e.message}
} }