diff --git a/public/app.js b/public/app.js index 1f4f6af..46ae44b 100644 --- a/public/app.js +++ b/public/app.js @@ -96,6 +96,7 @@ async function load(){ state.products=await api("/api/products"); render(); } async function renderAdmin(){ const panel=$("#adminPanel"); panel.innerHTML='
Create administrators or read-only accounts. New and reset passwords must be changed at next login.
Create snapshots inside /data/backups, download an off-server copy, or restore a previous database.
No local backups yet.
"}The latest 250 security and data-changing events. Audit entries cannot be edited or deleted.
No audit events yet.
"}Manage access, protect your data, and review account activity.
Use your Stockroom account to continue.
${message?``:""}`; + state.user=null;document.body.className="auth-required";$("#authBody").innerHTML=`Use your vBoxStock account to continue.
${message?``:""}`; $("#loginForm").onsubmit=async e=>{e.preventDefault();const button=e.currentTarget.querySelector("button");button.disabled=true;try{const user=await api("/api/auth/login",{method:"POST",body:JSON.stringify(Object.fromEntries(new FormData(e.currentTarget)))});user.mustChangePassword?showPasswordChange(user):await enterApp(user);}catch(error){showLogin(error.message);}}; } function showPasswordChange(user){ - state.user=user;document.body.className="auth-required";$("#authBody").innerHTML=`Your temporary password must be replaced before you can use Stockroom.
`; + state.user=user;document.body.className="auth-required";$("#authBody").innerHTML=`Your temporary password must be replaced before you can use vBoxStock.
`; $("#passwordForm").onsubmit=async e=>{e.preventDefault();try{await api("/api/auth/change-password",{method:"POST",body:JSON.stringify(Object.fromEntries(new FormData(e.currentTarget)))});await enterApp({...user,mustChangePassword:false});}catch(error){toast(error.message);}};$("#changeLogout").onclick=logout; } async function enterApp(user){state.user=user;document.body.className=user.role==="admin"?"role-admin":"role-readonly";const account=$("#currentUser"),menu=$(".user-menu");account.innerHTML=`Logged in as${esc(user.username)}${user.role==="admin"?"Admin":"Read-Only"}`;account.style.width="104px";account.style.textAlign="right";menu.style.marginLeft="auto";menu.style.minWidth="280px";menu.style.justifyContent="flex-end";const adminTab=document.querySelector('[data-tab="admin"]');adminTab.hidden=user.role!=="admin";adminTab.style.display=user.role==="admin"?"":"none";document.querySelectorAll(".edit-only").forEach(el=>{el.hidden=user.role!=="admin";el.style.display=user.role==="admin"?"":"none";});if(user.role!=="admin"&&state.tab==="admin")state.tab="available";await load();} async function logout(){try{await api("/api/auth/logout",{method:"POST",body:"{}"});}catch{}showLogin();} -async function initialize(){try{const response=await fetch("/api/auth/me"),data=await response.json();if(!response.ok)return showLogin();data.mustChangePassword?showPasswordChange(data):await enterApp(data);}catch{showLogin("Unable to connect to Stockroom.");}} +async function initialize(){try{const response=await fetch("/api/auth/me"),data=await response.json();if(!response.ok)return showLogin();data.mustChangePassword?showPasswordChange(data):await enterApp(data);}catch{showLogin("Unable to connect to vBoxStock.");}} document.querySelectorAll("[data-tab]").forEach(b=>b.onclick=()=>{state.tab=b.dataset.tab;state.page=1;render();}); $("#search").oninput=e=>{state.query=e.target.value;state.page=1;render();}; $("[data-open=receive]").onclick=receiveForm; $("[data-open=sell]").onclick=()=>sellForm(); diff --git a/public/index.html b/public/index.html index 882173b..7d60926 100644 --- a/public/index.html +++ b/public/index.html @@ -1,5 +1,5 @@ -