v93: multi-branch files + user management panel
This commit is contained in:
parent
d807e15dc1
commit
5bfab18e7e
122
index.html
122
index.html
@ -84,8 +84,9 @@ tr:hover{background:#FAFBFC}
|
||||
<a class="" id="snav_analytics" onclick="switchTab('analytics')"><span>Аналитика</span></a>
|
||||
<a class="" id="snav_reports" onclick="switchTab('reports')"><span>Отчётность</span></a>
|
||||
<a class="" id="snav_ai" onclick="switchTab('ai')"><span>ИИ-помощник</span></a>
|
||||
<a class="" id="snav_hse" onclick="switchTab('hse')"><span>HSE.sk.kz</span></a>
|
||||
<div class="logout"><button class="btn btn-sm btn-r" style="width:100%" onclick="doLogout()">Выйти</button></div>
|
||||
<a class="" id="snav_hse" onclick="switchTab('hse')"><span>HSE.sk.kz</span></a>
|
||||
<a class="" id="snav_users" onclick="switchTab('users')"><span>Учётные записи</span></a>
|
||||
<div class="logout"><button class="btn btn-sm btn-r" style="width:100%" onclick="doLogout()">Выйти</button></div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="top"><h2 id="page_title">Мероприятия</h2>
|
||||
@ -151,6 +152,20 @@ tr:hover{background:#FAFBFC}
|
||||
</div>
|
||||
<div class="card" id="rp_preview"></div>
|
||||
</div>
|
||||
<div id="tab_users" style="display:none">
|
||||
<div class="card"><h3>Учётные записи</h3>
|
||||
<p style="font-size:13px;color:#64748B;margin-bottom:12px">Управление ответственными лицами по филиалам</p>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr 1fr 2fr 1fr;gap:6px;margin-bottom:12px;align-items:end">
|
||||
<div><span style="font-size:11px;color:#64748B">Email (логин)</span><input id="uf_email" placeholder="ivanov" style="width:100%;padding:5px 8px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px"></div>
|
||||
<div><span style="font-size:11px;color:#64748B">ФИО</span><input id="uf_name" placeholder="Иванов И.И." style="width:100%;padding:5px 8px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px"></div>
|
||||
<div><span style="font-size:11px;color:#64748B">Телефон</span><input id="uf_phone" placeholder="+7700..." style="width:100%;padding:5px 8px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px"></div>
|
||||
<div><span style="font-size:11px;color:#64748B">Филиал</span><select id="uf_branch" style="width:100%;padding:5px 8px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px"></select></div>
|
||||
<div><span style="font-size:11px;color:#64748B">Пароль</span><input id="uf_pass" placeholder="****" style="width:100%;padding:5px 8px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px"></div>
|
||||
</div>
|
||||
<button class="btn btn-sm btn-g" onclick="addUser()">Добавить</button>
|
||||
<button class="btn btn-sm btn-o" onclick="saveUsers()">Сохранить изменения</button>
|
||||
<div id="users_list" style="margin-top:14px"></div>
|
||||
</div></div>
|
||||
<div id="tab_hse" style="display:none">
|
||||
<div class="card"><h3>Интеграция с HSE.sk.kz</h3>
|
||||
<p style="font-size:13px;color:#64748B;margin-bottom:16px">Направление подписанного сводного отчёта по месяцам в систему hse.sk.kz</p>
|
||||
@ -194,7 +209,7 @@ var secs=["Раздел I. Обучение, компетенции и куль
|
||||
var brs=["Дирекция производственной безопасности","Объединение «Дивизион «Сеть»","Дивизион по корпоративному бизнесу","Дивизион по розничному бизнесу","Сервисная фабрика","Дирекция «Телеком Комплект»","Корпоративный университет","Дирекция управления проектами","Дивизион цифрового бизнеса"];
|
||||
var stn={warn:"В процессе",late:"Просрочено",done:"Исполнено"};
|
||||
var stc={warn:"a",late:"r",done:"g"};
|
||||
var UNS = {curator:"Куратор ПБ",admin:"Администратор",dpp:"Директор ДПБ",ivanov:"Иванов Иван",petrov:"Петров Петр",sidorov:"Сидоров Сидор",kozhin:"Кожин А.М.",ismailov:"Исмаилов Р.К.",nurpeisov:"Нурпеисов Д.А.",suleimenov:"Сулейменов К.Т.",kassenov:"Касенов Б.Б.",serikov:"Сериков Е.С.",zhunusov:"Жунусов А.А.",muratov:"Муратов А.Т.",bakirov:"Бакиров Т.Н."};
|
||||
var USR={curator:{n:"Куратор ПБ",bg:0},admin:{n:"Администратор",bg:0},dpp:{n:"Директор ДПБ",bg:0},ivanov:{n:"Иванов Иван",bg:1},petrov:{n:"Петров Петр",bg:2},sidorov:{n:"Сидоров Сидор",bg:3},kozhin:{n:"Кожин А.М.",bg:4},ismailov:{n:"Исмаилов Р.К.",bg:1},nurpeisov:{n:"Нурпеисов Д.А.",bg:5},suleimenov:{n:"Сулейменов К.Т.",bg:6},kassenov:{n:"Касенов Б.Б.",bg:7},serikov:{n:"Сериков Е.С.",bg:8},zhunusov:{n:"Жунусов А.А.",bg:2},muratov:{n:"Муратов А.Т.",bg:3},bakirov:{n:"Бакиров Т.Н.",bg:4}};
|
||||
|
||||
function esc(s){
|
||||
return String(s).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")
|
||||
@ -244,8 +259,9 @@ function init(){
|
||||
function doLogin(){
|
||||
var e=document.getElementById("lem").value.trim().toLowerCase();
|
||||
var k=e.split("@")[0];
|
||||
if(UNS[k]){
|
||||
cu={n:UNS[k]};
|
||||
var u=USR[k];
|
||||
if(u){
|
||||
cu={n:u.n,bg:u.bg};
|
||||
localStorage.setItem("su",JSON.stringify(cu));
|
||||
showApp()
|
||||
}else{
|
||||
@ -262,6 +278,8 @@ function showApp(){
|
||||
document.getElementById("login").style.display="none";
|
||||
document.getElementById("app").style.display="block";
|
||||
document.getElementById("su_name").textContent=cu?cu.n:"";
|
||||
var unav=document.getElementById("snav_users");
|
||||
if(unav)unav.style.display=cu&&cu.bg===0?"":"none";
|
||||
switchTab("events")
|
||||
}
|
||||
|
||||
@ -304,8 +322,8 @@ function saveEv(){
|
||||
|
||||
function switchTab(t){
|
||||
tab=t;
|
||||
var tabs=["events","analytics","reports","ai","hse"];
|
||||
var tn={events:"Мероприятия",analytics:"Аналитика",reports:"Отчётность",ai:"ИИ-помощник",hse:"HSE.sk.kz"};
|
||||
var tabs=["events","analytics","reports","ai","users","hse"];
|
||||
var tn={events:"Мероприятия",analytics:"Аналитика",reports:"Отчётность",ai:"ИИ-помощник",users:"Учётные записи",hse:"HSE.sk.kz"};
|
||||
for(var i=0;i<tabs.length;i++){
|
||||
var el=document.getElementById("tab_"+tabs[i]);
|
||||
if(el)el.style.display="none";
|
||||
@ -320,6 +338,7 @@ function switchTab(t){
|
||||
if(t==="reports")renderReports();
|
||||
if(t==="ai")renderAI()
|
||||
if(t==="hse"){var hm=document.getElementById("hse_month");if(hm&&!hm.value)hm.value=new Date().toISOString().slice(0,7)}
|
||||
if(t==="users")renderUsers()
|
||||
}
|
||||
|
||||
function daysRem(due){
|
||||
@ -455,15 +474,33 @@ function openEv(id,subIdx){
|
||||
h+="</select></div>";
|
||||
h+="<div style='margin-bottom:12px'><textarea id='evn_"+e.id+"' placeholder='Примечание / описание выполнения...' style='width:100%;padding:8px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px;resize:vertical;min-height:50px'>"+esc(e.n||"")+"</textarea></div>";
|
||||
h+="<div style='margin-bottom:12px'><strong>Файлы:</strong>";
|
||||
var fd=localStorage.getItem(fk);
|
||||
if(fd){
|
||||
try{
|
||||
var fa=JSON.parse(fd);
|
||||
for(var fi=0;fi<fa.length;fi++){
|
||||
var f=fa[fi];
|
||||
h+="<div class='file-item'><span class='fn'>"+esc(f.n)+"</span><span class='fs'>("+(f.s?Math.round(f.s/1024)+"KB":"")+", "+esc(f.u||"")+" "+esc(f.d||"")+")</span><a onclick='dlFile("+e.id+","+fi+")'>Скачать</a><a style='color:#EF4444;margin-left:4px' onclick='delFile("+e.id+","+fi+")'>Удалить</a></div>"
|
||||
if(cu&&cu.bg===0){
|
||||
for(var bi=0;bi<brs.length;bi++){
|
||||
var bk=fk+"_b"+bi;
|
||||
var fd=localStorage.getItem(bk);
|
||||
if(fd){
|
||||
try{
|
||||
var fa=JSON.parse(fd);
|
||||
if(fa.length)h+="<div style='font-size:11px;color:#64748B;margin-top:4px'><strong>"+esc(brs[bi])+":</strong></div>";
|
||||
for(var fi=0;fi<fa.length;fi++){
|
||||
var f=fa[fi];
|
||||
h+="<div class='file-item'><span class='fn'>"+esc(f.n)+"</span><span class='fs'>("+(f.s?Math.round(f.s/1024)+"KB":"")+", "+esc(f.u||"")+" "+esc(f.d||"")+")</span><a onclick='dlFile("+e.id+","+fi+")'>Скачать</a><a style='color:#EF4444;margin-left:4px' onclick='delFile("+e.id+","+fi+")'>Удалить</a></div>"
|
||||
}
|
||||
}catch(ex){}
|
||||
}
|
||||
}catch(ex){}
|
||||
}
|
||||
}else{
|
||||
var bk=fk+"_b"+(cu?cu.bg:0);
|
||||
var fd=localStorage.getItem(bk);
|
||||
if(fd){
|
||||
try{
|
||||
var fa=JSON.parse(fd);
|
||||
for(var fi=0;fi<fa.length;fi++){
|
||||
var f=fa[fi];
|
||||
h+="<div class='file-item'><span class='fn'>"+esc(f.n)+"</span><span class='fs'>("+(f.s?Math.round(f.s/1024)+"KB":"")+", "+esc(f.u||"")+" "+esc(f.d||"")+")</span><a onclick='dlFile("+e.id+","+fi+")'>Скачать</a><a style='color:#EF4444;margin-left:4px' onclick='delFile("+e.id+","+fi+")'>Удалить</a></div>"
|
||||
}
|
||||
}catch(ex){}
|
||||
}
|
||||
}
|
||||
h+="<div style='margin-top:6px'><input type='file' id='fu_"+e.id+"' style='font-size:12px' onchange='upFile("+e.id+(subIdx!==undefined?","+subIdx:"")+")'></div>";
|
||||
h+="</div>";
|
||||
@ -536,8 +573,9 @@ function upFile(id){
|
||||
if(f.size>3145728){alert("\u0424\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 3MB");return}
|
||||
var fr=new FileReader();
|
||||
var subKey=curSub!==null?"_s"+curSub:"";
|
||||
var brKey="_b"+(cu?cu.bg:0);
|
||||
fr.onload=function(){
|
||||
var key="sf_"+id+subKey;
|
||||
var key="sf_"+id+subKey+brKey;
|
||||
var arr=[];
|
||||
var ex=localStorage.getItem(key);
|
||||
if(ex){try{arr=JSON.parse(ex)}catch(e){}}
|
||||
@ -549,7 +587,7 @@ function upFile(id){
|
||||
fr.readAsDataURL(f)
|
||||
}
|
||||
function dlFile(id,idx){
|
||||
var key="sf_"+id+(curSub!==null?"_s"+curSub:"");
|
||||
var key="sf_"+id+(curSub!==null?"_s"+curSub:"")+"_b"+(cu?cu.bg:0);
|
||||
var ex=localStorage.getItem(key);
|
||||
if(!ex)return;
|
||||
try{
|
||||
@ -566,7 +604,7 @@ function dlFile(id,idx){
|
||||
}
|
||||
function delFile(id,idx){
|
||||
if(!confirm("\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0444\u0430\u0439\u043B?"))return;
|
||||
var key="sf_"+id+(curSub!==null?"_s"+curSub:"");
|
||||
var key="sf_"+id+(curSub!==null?"_s"+curSub:"")+"_b"+(cu?cu.bg:0);
|
||||
var ex=localStorage.getItem(key);
|
||||
if(!ex)return;
|
||||
try{
|
||||
@ -923,6 +961,54 @@ function aiResp(q){
|
||||
|
||||
addMsg("b",ans,"ИИ-помощник")
|
||||
}
|
||||
function renderUsers(){
|
||||
if(!cu||cu.bg!==0){document.getElementById("tab_users").innerHTML="<div class='card'><p style='color:#EF4444'>Доступ запрещён</p></div>";return}
|
||||
var ub=document.getElementById("uf_branch");
|
||||
if(ub&&!ub.options.length){
|
||||
for(var i=0;i<brs.length;i++){
|
||||
var o=document.createElement("option");
|
||||
o.value=i;o.textContent=brs[i];
|
||||
ub.appendChild(o)
|
||||
}
|
||||
}
|
||||
var ex=localStorage.getItem("ext_users");
|
||||
if(ex){try{var eu=JSON.parse(ex);for(var k in eu){if(eu.hasOwnProperty(k)&&!USR[k])USR[k]=eu[k]}}catch(e){}}
|
||||
var h="<table><tr><th>Логин</th><th>ФИО</th><th>Телефон</th><th>Филиал</th><th></th></tr>";
|
||||
for(var k in USR){
|
||||
if(!USR.hasOwnProperty(k))continue;
|
||||
var u=USR[k];
|
||||
h+="<tr><td>"+esc(k)+"@telecom.kz</td><td>"+esc(u.n)+"</td><td>"+esc(u.ph||"")+"</td><td>"+esc(brs[u.bg]||"")+"</td>";
|
||||
h+="<td><button class='btn btn-sm btn-r' style='padding:3px 10px' onclick='delUser(\""+esc(k)+"\")'>Удалить</button></td></tr>"
|
||||
}
|
||||
h+="</table>";
|
||||
document.getElementById("users_list").innerHTML=h
|
||||
}
|
||||
function addUser(){
|
||||
var em=document.getElementById("uf_email").value.trim().toLowerCase();
|
||||
var nm=document.getElementById("uf_name").value.trim();
|
||||
var ph=document.getElementById("uf_phone").value.trim();
|
||||
var bg=parseInt(document.getElementById("uf_branch").value,10);
|
||||
var pw=document.getElementById("uf_pass").value.trim();
|
||||
if(!em||!nm){alert("Заполните логин и ФИО");return}
|
||||
USR[em]={n:nm,bg:bg,ph:ph};
|
||||
if(pw)USR[em].pw=pw;
|
||||
saveUsers();
|
||||
renderUsers()
|
||||
}
|
||||
function delUser(k){
|
||||
if(!confirm("Удалить "+k+"?"))return;
|
||||
delete USR[k];
|
||||
saveUsers();
|
||||
renderUsers()
|
||||
}
|
||||
function saveUsers(){
|
||||
var ex={};
|
||||
for(var k in USR){
|
||||
if(!USR.hasOwnProperty(k))continue;
|
||||
if(k!=="curator"&&k!=="admin"&&k!=="dpp")ex[k]=USR[k]
|
||||
}
|
||||
try{localStorage.setItem("ext_users",JSON.stringify(ex))}catch(e){}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user