Files
sales-trainer/frontend/dist/assets/Login-B9kRT3Au.js
Macky c19b23d44d fix(Docker): ship prebuilt frontend/dist, drop npm from image (removes 'vite not found')
The Vue SPA is now built locally and its frontend/dist/ committed (force-added).
Dockerfile is a single-stage runtime: copy prebuilt dist + python:3.11 + Flask.
No node/npm inside the image -> deterministic, no npm/esbuild postinstall flakiness.
To update UI: edit src, npm run build, commit frontend/dist/.
2026-08-07 19:46:20 +07:00

2 lines
1.7 KiB
JavaScript

import{c as d,a as e,t as s,u as c,i as o,w as y,v as b,b as w,d as x,e as k,r as l,f,g as S,h as V,o as v}from"./index-B1lw4PRH.js";import{_ as B}from"./_plugin-vue_export-helper-DlAUqK2U.js";const C={class:"login-wrap"},D={class:"card login-card"},K={class:"pw-wrap"},E=["type"],L=["aria-label"],M={key:0,class:"error",role:"alert"},N=["disabled"],R={key:0,class:"spinner"},U={key:1},q={__name:"Login",setup(H){const g=V(),_=S(),n=l(""),r=l(""),a=l(!1),u=l(""),i=l(!1);async function m(){u.value="",i.value=!0;try{await f.login(n.value.trim(),r.value),f.mustSetup?_.push({path:"/setup"}):_.push(g.query.redirect||"/")}catch{u.value=o.t("loginError")}finally{i.value=!1}}return(h,t)=>(v(),d("div",C,[e("div",D,[e("h1",null,"🎯 "+s(c(o).t("app")),1),t[3]||(t[3]=e("p",{class:"muted",style:{"margin-top":"-8px"}},"Sales training simulator",-1)),e("label",null,s(c(o).t("username")),1),y(e("input",{"onUpdate:modelValue":t[0]||(t[0]=p=>n.value=p),type:"text",autocomplete:"username",onKeyup:w(m,["enter"])},null,544),[[b,n.value]]),e("label",null,s(c(o).t("password")),1),e("div",K,[y(e("input",{"onUpdate:modelValue":t[1]||(t[1]=p=>r.value=p),type:a.value?"text":"password",autocomplete:"current-password",onKeyup:w(m,["enter"])},null,40,E),[[x,r.value]]),e("button",{type:"button",class:"pw-toggle",onClick:t[2]||(t[2]=p=>a.value=!a.value),"aria-label":a.value?"Hide password":"Show password"},s(a.value?"🙈":"👁"),9,L)]),u.value?(v(),d("div",M,s(u.value),1)):k("",!0),e("button",{class:"primary",style:{width:"100%","margin-top":"16px"},disabled:i.value||!n.value||!r.value,onClick:m},[i.value?(v(),d("span",R)):(v(),d("span",U,s(c(o).t("login")),1))],8,N)])]))}},T=B(q,[["__scopeId","data-v-f7904d9f"]]);export{T as default};