Files
llama-link/internal/web/dist/assets/AdminUsers-T_O7PFeC.js
T
darroyo ddc73957cb
CI / test (push) Failing after 12m38s
Fix: move keys and model-load routes under /api/v1/admin prefix
Routes now consistently under admin session auth:
- /api/v1/admin/keys (GET, POST, DELETE)
- /api/v1/admin/models/:name/load (POST)

Rebuilt frontend assets.
2026-07-31 17:17:23 -04:00

7 lines
5.3 KiB
JavaScript

import{d as D,q as L,c as n,a as e,b as k,e as h,x as M,g as f,F as $,i as S,w as U,f as y,v as _,t as u,y as j,r as l,s as w,o,n as z}from"./index-DGy3EgY7.js";import{P as E}from"./plus-DEUh38TR.js";import{c as I}from"./createLucideIcon-C8BmASko.js";import{T}from"./trash-2-LJ7Ux6P7.js";/**
* @license lucide-vue-next v0.460.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const q=I("PenIcon",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}]]),B={class:"flex items-center justify-between mb-6"},G={key:0,class:"text-text-muted"},H={class:"card"},J={class:"table"},K={class:"flex gap-2"},O=["onClick"],Q=["onClick"],R={key:0},W={key:1,class:"fixed inset-0 bg-black/50 flex items-center justify-center z-50"},X={class:"card w-full max-w-md"},Y={class:"mb-4"},Z={class:"mb-4"},ee={class:"flex gap-3 justify-end"},te={key:2,class:"fixed inset-0 bg-black/50 flex items-center justify-center z-50"},se={class:"card w-full max-w-md"},ae={class:"text-lg font-semibold mb-4"},le={class:"mb-4"},ne={class:"mb-4"},oe={class:"flex items-center gap-2"},ie={class:"flex gap-3 justify-end"},ve=D({__name:"AdminUsers",setup(re){const x=l([]),g=l(!0),d=l(!1),c=l(!1),m=l(""),v=l(""),i=l(null),r=l(""),b=l(!0);async function p(){g.value=!0;try{const s=await w.get("/api/v1/admin/users");x.value=s.data}catch(s){console.error("Failed to fetch users:",s)}finally{g.value=!1}}async function F(){try{await w.post("/api/v1/admin/users",{username:m.value,password:v.value}),d.value=!1,m.value="",v.value="",await p()}catch(s){console.error("Failed to create user:",s),alert("Failed to create user")}}async function A(){if(i.value)try{const s={};r.value&&(s.password=r.value),s.is_active=b.value,await w.put(`/api/v1/admin/users/${i.value.id}`,s),c.value=!1,i.value=null,r.value="",await p()}catch(s){console.error("Failed to update user:",s),alert("Failed to update user")}}async function N(s){if(confirm("Are you sure you want to delete this user?"))try{await w.delete(`/api/v1/admin/users/${s}`),await p()}catch(t){console.error("Failed to delete user:",t),alert("Failed to delete user")}}function P(s){i.value=s,b.value=s.is_active,r.value="",c.value=!0}function C(s){return s?new Date(s).toLocaleString():"Never"}return L(p),(s,t)=>(o(),n("div",null,[e("div",B,[t[8]||(t[8]=e("h1",{class:"text-2xl font-bold"},"Admin Users",-1)),e("button",{onClick:t[0]||(t[0]=a=>d.value=!0),class:"btn btn-primary"},[k(h(E),{class:"w-4 h-4 mr-2"}),t[7]||(t[7]=M(" New User ",-1))])]),g.value?(o(),n("div",G,"Loading...")):f("",!0),e("div",H,[e("table",J,[t[10]||(t[10]=e("thead",null,[e("tr",null,[e("th",null,"Username"),e("th",null,"Status"),e("th",null,"Created"),e("th",null,"Last Login"),e("th",null,"Actions")])],-1)),e("tbody",null,[(o(!0),n($,null,S(x.value,a=>(o(),n("tr",{key:a.id},[e("td",null,u(a.username),1),e("td",null,[e("span",{class:z([a.is_active?"badge-success":"badge-error","badge"])},u(a.is_active?"Active":"Inactive"),3)]),e("td",null,u(C(a.created_at)),1),e("td",null,u(C(a.last_login_at)),1),e("td",null,[e("div",K,[e("button",{onClick:V=>P(a),class:"btn btn-secondary btn-sm"},[k(h(q),{class:"w-4 h-4"})],8,O),e("button",{onClick:V=>N(a.id),class:"btn btn-danger btn-sm"},[k(h(T),{class:"w-4 h-4"})],8,Q)])])]))),128)),x.value.length===0?(o(),n("tr",R,[...t[9]||(t[9]=[e("td",{colspan:"5",class:"text-center text-text-muted py-8"}," No admin users yet. Create one to get started. ",-1)])])):f("",!0)])])]),d.value?(o(),n("div",W,[e("div",X,[t[14]||(t[14]=e("h2",{class:"text-lg font-semibold mb-4"},"Create Admin User",-1)),e("form",{onSubmit:U(F,["prevent"])},[e("div",Y,[t[11]||(t[11]=e("label",{class:"block text-sm font-medium mb-2"},"Username",-1)),y(e("input",{"onUpdate:modelValue":t[1]||(t[1]=a=>m.value=a),type:"text",class:"input",placeholder:"admin",required:"",minlength:"3",maxlength:"64"},null,512),[[_,m.value]])]),e("div",Z,[t[12]||(t[12]=e("label",{class:"block text-sm font-medium mb-2"},"Password",-1)),y(e("input",{"onUpdate:modelValue":t[2]||(t[2]=a=>v.value=a),type:"password",class:"input",placeholder:"Min 8 characters",required:"",minlength:"8"},null,512),[[_,v.value]])]),e("div",ee,[e("button",{type:"button",onClick:t[3]||(t[3]=a=>d.value=!1),class:"btn btn-secondary"}," Cancel "),t[13]||(t[13]=e("button",{type:"submit",class:"btn btn-primary"},"Create",-1))])],32)])])):f("",!0),c.value&&i.value?(o(),n("div",te,[e("div",se,[e("h2",ae,"Edit User: "+u(i.value.username),1),e("form",{onSubmit:U(A,["prevent"])},[e("div",le,[t[15]||(t[15]=e("label",{class:"block text-sm font-medium mb-2"},"New Password (leave blank to keep current)",-1)),y(e("input",{"onUpdate:modelValue":t[4]||(t[4]=a=>r.value=a),type:"password",class:"input",placeholder:"Min 8 characters",minlength:"8"},null,512),[[_,r.value]])]),e("div",ne,[e("label",oe,[y(e("input",{"onUpdate:modelValue":t[5]||(t[5]=a=>b.value=a),type:"checkbox",class:"rounded"},null,512),[[j,b.value]]),t[16]||(t[16]=e("span",{class:"text-sm font-medium"},"Active",-1))])]),e("div",ie,[e("button",{type:"button",onClick:t[6]||(t[6]=a=>c.value=!1),class:"btn btn-secondary"}," Cancel "),t[17]||(t[17]=e("button",{type:"submit",class:"btn btn-primary"},"Save",-1))])],32)])])):f("",!0)]))}});export{ve as default};