PageSourceSearch

https://nashobahub-prod.onrender.com/assets/ProceduresUsers-B2xG854f.js

js nashobahub-prod.onrender.com collected 2026-10-03 11:42:21 UTC 7,865 bytes, 1 lines download raw bytes

1import{av as M,u as K,r as C,o as S,a as N,j as e,B as r,ax as $,b as H,an as R,C as Q,a4 as z,d as h,T as B,U as O,V,W as J,Y as W,Z as Y,L as p,I as D,a0 as Z,Q as v,q as y}from"./index-CU4TP-S4.js";import{S as _}from"./switch-DUkPOpLP.js";import{T as G,a as X,b as j,c as l,d as ee,e as t}from"./table-Br-uzwVA.js";import{T as se,a as ae,b,c as ie}from"./tabs-DGAvBb6E.js";import{F as te}from"./file-text-BgBpfFOt.js";import{C as re}from"./clipboard-list-Dq5GY23s.js";import{K as de}from"./key-CkbKzsog.js";import{P as ne}from"./pencil-C0OXxJ_w.js";import{f as ce}from"./format-Dvax21W1.js";function fe(){const[,m]=M(),{toast:d}=K(),[U,n]=C.useState(!1),[o,P]=C.useState(null),[a,c]=C.useState({displayName:"",pinCode:"",assignedProcedureCodes:[],isActive:!0}),{data:g,isLoading:E}=S({queryKey:["/api/procedures/users"]}),{data:u}=S({queryKey:["/api/procedures/templates"]}),w=N({mutationFn:s=>v("POST","/api/procedures/users",s),onSuccess:()=>{d({title:"User created successfully"}),y.invalidateQueries({queryKey:["/api/procedures/users"]}),n(!1),f()},onError:s=>{d({title:"Error creating user",description:s.message,variant:"destructive"})}}),A=N({mutationFn:({id:s,data:i})=>v("PATCH",`/api/procedures/users/${s}`,i),onSuccess:()=>{d({title:"User updated successfully"}),y.invalidateQueries({queryKey:["/api/procedures/users"]}),n(!1),f()},onError:s=>{d({title:"Error updating user",description:s.message,variant:"destructive"})}}),L=N({mutationFn:s=>v("DELETE",`/api/procedures/users/${s}`),onSuccess:()=>{d({title:"User deleted successfully"}),y.invalidateQueries({queryKey:["/api/procedures/users"]})},onError:s=>{d({title:"Error deleting user",description:s.message,variant:"destructive"})}}),f=()=>{P(null),c({displayName:"",pinCode:"",assignedProcedureCodes:[],isActive:!0})},k=s=>{P(s),c({displayName:s.displayName,pinCode:s.pinCode,assignedProcedureCodes:s.assignedProcedureCodes||[],isActive:s.isActive}),n(!0)},F=()=>{o?A.mutate({id:o.id,data:a}):w.mutate(a)},q=s=>{c(i=>({...i,assignedProcedureCodes:i.assignedProcedureCodes.includes(s)?i.assignedProcedureCodes.filter(x=>x!==s):[...i.assignedProcedureCodes,s]}))},I=w.isPending||A.isPending;return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{className:"flex flex-col gap-4 md:flex-row md:items-start md:justify-between",children:[e.jsxs("div",{className:"flex flex-1 flex-wrap items-center gap-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(r,{variant:"outline",size:"sm",onClick:()=>m("/staff-reporting"),"data-testid":"button-return-staff-reporting",children:"Staff Reporting"}),e.jsxs(r,{variant:"outline",size:"sm",onClick:()=>m("/"),"data-testid":"button-return-hub",children:[e.jsx($,{className:"w-4 h-4 mr-2"}),"Return to Hub"]})]}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h1",{className:"text-2xl font-bold",children:"Procedure Users"}),e.jsx("p",{className:"text-muted-foreground",children:"Manage staff access with PIN codes"})]})]}),e.jsxs(r,{onClick:()=>{f(),n(!0)},"data-testid":"button-add-user",children:[e.jsx(H,{className:"w-4 h-4 mr-2"}),"Add User"]})]}),e.jsxs(se,{defaultValue:"users",children:[e.jsxs(ae,{children:[e.jsxs(b,{value:"submissions",onClick:()=>m("/procedures/submissions"),"data-testid":"tab-submissions",children:[e.jsx(te,{className:"w-4 h-4 mr-2"}),"Submitted Reports"]}),e.jsxs(b,{value:"procedures",onClick:()=>m("/procedures/admin"),"data-testid":"tab-procedures",children:[e.jsx(re,{className:"w-4 h-4 mr-2"}),"Procedures"]}),e.jsxs(b,{value:"users","data-testid":"tab-users",children:[e.jsx(R,{className:"w-4 h-4 mr-2"}),"Users"]})]}),e.jsx(ie,{value:"users",className:"mt-6",children:e.jsx(Q,{children:e.jsx(z,{className:"p-0",children:e.jsxs(G,{children:[e.jsx(X,{children:e.jsxs(j,{children:[e.jsx(l,{children:"Name"}),e.jsx(l,{children:"PIN Code"}),e.jsx(l,{children:"Assigned Procedures"}),e.jsx(l,{children:"Last Login"}),e.jsx(l,{children:"Status"}),e.jsx(l,{className:"text-right",children:"Actions"})]})}),e.jsx(ee,{children:E?[...Array(3)].map((s,i)=>e.jsx(j,{children:e.jsx(t,{colSpan:6,className:"h-16",children:e.jsx("div",{className:"animate-pulse h-4 bg-muted rounded w-full"})})},i)):g&&g.length>0?g.map(s=>{var i,x;return e.jsxs(j,{children:[e.jsx(t,{className:"font-medium","data-testid":`text-user-name-${s.id}`,children:s.displayName}),e.jsx(t,{children:e.jsxs(h,{variant:"outline",children:[e.jsx(de,{className:"w-3 h-3 mr-1"}),s.pinCode]})}),e.jsx(t,{children:e.jsxs("div",{className:"flex flex-wrap gap-1",children:[(i=s.assignedProcedureCodes)==null?void 0:i.slice(0,3).map(T=>e.jsx(h,{variant:"secondary",children:T},T)),(((x=s.assignedProcedureCodes)==null?void 0:x.length)||0)>3&&e.jsxs(h,{variant:"outline",children:["+",s.assignedProcedureCodes.length-3]})]})}),e.jsx(t,{children:s.lastLoginAt?ce(new Date(s.lastLoginAt),"MMM d, yyyy h:mm a"):"Never"}),e.jsx(t,{children:e.jsx(h,{variant:s.isActive?"default":"secondary",children:s.isActive?"Active":"Inactive"})}),e.jsx(t,{className:"text-right",children:e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(r,{variant:"ghost",size:"icon",onClick:()=>k(s),"data-testid":`button-edit-user-${s.id}`,children:e.jsx(ne,{className:"w-4 h-4"})}),e.jsx(r,{variant:"ghost",size:"icon",onClick:()=>L.mutate(s.id),"data-testid":`button-delete-user-${s.id}`,children:e.jsx(B,{className:"w-4 h-4 text-destructive"})})]})})]},s.id)}):e.jsx(j,{children:e.jsx(t,{colSpan:6,className:"text-center py-8 text-muted-foreground",children:"No users found. Add a user to get started."})})})]})})})})]}),e.jsx(O,{open:U,onOpenChange:n,children:e.jsxs(V,{className:"max-w-lg",children:[e.jsxs(J,{children:[e.jsx(W,{children:o?"Edit User":"Add User"}),e.jsx(Y,{children:o?"Update user details and procedure access":"Create a new user with PIN access"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{htmlFor:"displayName",children:"Display Name *"}),e.jsx(D,{id:"displayName",value:a.displayName,onChange:s=>c({...a,displayName:s.target.value}),placeholder:"e.g., Jane Smith","data-testid":"input-display-name"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{htmlFor:"pinCode",children:"PIN Code *"}),e.jsx(D,{id:"pinCode",value:a.pinCode,onChange:s=>c({...a,pinCode:s.target.value.replace(/\D/g,"").slice(0,10)}),placeholder:"e.g., 1234",maxLength:10,"data-testid":"input-pin-code"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"A unique numeric code for login"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(p,{children:"Assigned Procedures"}),e.jsxs("div",{className:"border rounded-md p-3 max-h-48 overflow-y-auto space-y-2",children:[u==null?void 0:u.map(s=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",id:`proc-${s.id}`,checked:a.assignedProcedureCodes.includes(s.procedureCode),onChange:()=>q(s.procedureCode),className:"rounded"}),e.jsxs("label",{htmlFor:`proc-${s.id}`,className:"text-sm flex-1 cursor-pointer",children:[e.jsx("span",{className:"font-medium",children:s.procedureName}),e.jsxs("span",{className:"text-muted-foreground ml-2",children:["(",s.procedureCode,")"]})]})]},s.id)),(!u||u.length===0)&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"No procedures available. Create procedures first."})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{id:"isActive",checked:a.isActive,onCheckedChange:s=>c({...a,isActive:s}),"data-testid":"switch-user-active"}),e.jsx(p,{htmlFor:"isActive",children:"User is Active"})]})]}),e.jsxs(Z,{children:[e.jsx(r,{variant:"outline",onClick:()=>n(!1),"data-testid":"button-cancel",children:"Cancel"}),e.jsx(r,{onClick:F,disabled:I||!a.displayName||!a.pinCode,"data-testid":"button-submit-user",children:o?"Save Changes":"Create User"})]})]})})]})}export{fe as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.