@aiquants/auth-react-router 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/admin.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var x={title:"Users & Groups",heading:"\u{1F464} User administration",tabs:{users:"\u{1F464} Users",groups:"\u{1F465} Groups",groupMembers:"\u{1F517} Members",allowlist:"\u2709\uFE0F Allowlist"},usersView:{title:"Users",searchPlaceholder:"Search by name or email...",addUser:"\uFF0B Add user",editUser:"Edit user",id:"ID",displayName:"Name",email:"Email",status:"Status",active:"Active",inactive:"Inactive",actions:"Actions",edit:"Edit",activate:"Activate",deactivate:"Deactivate",empty:"No matching users",save:"Save",cancel:"Cancel"},groupsView:{title:"Groups",searchPlaceholder:"Search by group name or key...",addGroup:"\uFF0B Add group",editGroup:"Edit group",id:"ID",groupKey:"Group key",name:"Name",description:"Description",memberCount:"Members",status:"Status",actions:"Actions",edit:"Edit",delete:"Delete",confirmDelete:"Delete this group?",noDescription:"No description",groupKeyPlaceholder:"e.g. dev-team",namePlaceholder:"e.g. Development team",empty:"No groups registered",save:"Save",cancel:"Cancel"},groupMembersView:{selectGroup:"Select a group",selectPrompt:"Select a group to manage its members",actionAdd:"Add",actionRemove:"Remove"},allowlistView:{title:"Sign-in allowlist",addEntry:"\uFF0B Add pattern",pattern:"Pattern (e.g. @example.com or user@example.com)",type:"Type",emailType:"Exact email match",domainType:"Domain match",emailTypeShort:"Email",domainTypeShort:"Domain",description:"Description",actions:"Actions",readOnly:"Read-only",delete:"Delete",empty:"No allowlist entries registered",save:"Add",cancel:"Cancel"}},j={title:"\u30E6\u30FC\u30B6\u30FC\u30FB\u30B0\u30EB\u30FC\u30D7\u7BA1\u7406",heading:"\u{1F464} \u30E6\u30FC\u30B6\u30FC\u7BA1\u7406",tabs:{users:"\u{1F464} \u30E6\u30FC\u30B6\u30FC\u4E00\u89A7",groups:"\u{1F465} \u30E6\u30FC\u30B6\u30FC\u30B0\u30EB\u30FC\u30D7",groupMembers:"\u{1F517} \u30B0\u30EB\u30FC\u30D7\u30E1\u30F3\u30D0\u30FC",allowlist:"\u2709\uFE0F \u30A2\u30AF\u30BB\u30B9\u8A31\u53EF\u30EA\u30B9\u30C8"},usersView:{title:"\u30E6\u30FC\u30B6\u30FC\u7BA1\u7406",searchPlaceholder:"\u8868\u793A\u540D\u3084 Email \u3067\u691C\u7D22...",addUser:"\uFF0B \u30E6\u30FC\u30B6\u30FC\u8FFD\u52A0",editUser:"\u30E6\u30FC\u30B6\u30FC\u306E\u7DE8\u96C6",id:"ID",displayName:"\u8868\u793A\u540D",email:"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9",status:"\u30B9\u30C6\u30FC\u30BF\u30B9",active:"\u6709\u52B9",inactive:"\u7121\u52B9",actions:"\u64CD\u4F5C",edit:"\u7DE8\u96C6",activate:"\u6709\u52B9\u5316",deactivate:"\u7121\u52B9\u5316",empty:"\u8A72\u5F53\u3059\u308B\u30E6\u30FC\u30B6\u30FC\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",save:"\u4FDD\u5B58",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB"},groupsView:{title:"\u30E6\u30FC\u30B6\u30FC\u30B0\u30EB\u30FC\u30D7\u7BA1\u7406",searchPlaceholder:"\u30B0\u30EB\u30FC\u30D7\u540D\u3084\u30AD\u30FC\u3067\u691C\u7D22...",addGroup:"\uFF0B \u30B0\u30EB\u30FC\u30D7\u4F5C\u6210",editGroup:"\u30B0\u30EB\u30FC\u30D7\u306E\u7DE8\u96C6",id:"ID",groupKey:"\u30B0\u30EB\u30FC\u30D7\u30AD\u30FC",name:"\u30B0\u30EB\u30FC\u30D7\u540D",description:"\u8AAC\u660E",memberCount:"\u30E1\u30F3\u30D0\u30FC\u6570",status:"\u30B9\u30C6\u30FC\u30BF\u30B9",actions:"\u64CD\u4F5C",edit:"\u7DE8\u96C6",delete:"\u524A\u9664",confirmDelete:"\u3053\u306E\u30B0\u30EB\u30FC\u30D7\u3092\u524A\u9664\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F",noDescription:"\u8AAC\u660E\u306A\u3057",groupKeyPlaceholder:"\u4F8B: dev-team",namePlaceholder:"\u4F8B: \u958B\u767A\u30C1\u30FC\u30E0",empty:"\u30B0\u30EB\u30FC\u30D7\u304C\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u305B\u3093",save:"\u4FDD\u5B58",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB"},groupMembersView:{selectGroup:"\u30B0\u30EB\u30FC\u30D7\u9078\u629E",selectPrompt:"\u30B0\u30EB\u30FC\u30D7\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044",actionAdd:"\u8FFD\u52A0",actionRemove:"\u9664\u5916"},allowlistView:{title:"\u30A2\u30AF\u30BB\u30B9\u8A31\u53EF\u30EA\u30B9\u30C8 (Allowlist)",addEntry:"\uFF0B \u8A31\u53EF\u30D1\u30BF\u30FC\u30F3\u8FFD\u52A0",pattern:"\u30D1\u30BF\u30FC\u30F3 (\u4F8B: @example.com \u307E\u305F\u306F user@example.com)",type:"\u7A2E\u5225",emailType:"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u5B8C\u5168\u4E00\u81F4",domainType:"\u30C9\u30E1\u30A4\u30F3\u4E00\u81F4",emailTypeShort:"Email \u5B8C\u5168\u4E00\u81F4",domainTypeShort:"\u30C9\u30E1\u30A4\u30F3\u4E00\u81F4",description:"\u8AAC\u660E / \u5099\u8003",actions:"\u64CD\u4F5C",readOnly:"\u5909\u66F4\u4E0D\u53EF",delete:"\u524A\u9664",empty:"\u30A2\u30ED\u30EF\u30EA\u30B9\u30C8\u30A8\u30F3\u30C8\u30EA\u304C\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u305B\u3093",save:"\u767B\u9332",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB"}};function I(s){let a=x;return s?{title:s.title??a.title,heading:s.heading??a.heading,tabs:{...a.tabs,...s.tabs},usersView:{...a.usersView,...s.usersView},groupsView:{...a.groupsView,...s.groupsView},groupMembersView:{...a.groupMembersView,...s.groupMembersView},allowlistView:{...a.allowlistView,...s.allowlistView}}:a}function Q(s){let a=s?.users??[{id:1,email:"admin@example.com",displayName:"\u30B7\u30B9\u30C6\u30E0\u7BA1\u7406\u8005",isActive:!0},{id:2,email:"user1@example.com",displayName:"\u958B\u767A \u592A\u90CE",isActive:!0},{id:3,email:"user2@example.com",displayName:"\u55B6\u696D \u82B1\u5B50",isActive:!0}],t=s?.groups??[{id:1,groupKey:"dev-team",name:"\u958B\u767A\u30C1\u30FC\u30E0",description:"\u30B7\u30B9\u30C6\u30E0\u958B\u767A\u62C5\u5F53\u30B0\u30EB\u30FC\u30D7",isActive:!0},{id:2,groupKey:"sales-dept",name:"\u55B6\u696D\u90E8",description:"\u55B6\u696D\u30BD\u30EA\u30E5\u30FC\u30B7\u30E7\u30F3\u62C5\u5F53",isActive:!0}],l=s?.groupMembers??[{id:1,groupId:1,userId:2},{id:2,groupId:2,userId:3}],g=s?.allowlist??[{id:1,pattern:"admin@example.com",type:"email",description:"\u521D\u671F\u7BA1\u7406\u8005"},{id:2,pattern:"@example.com",type:"domain",description:"\u793E\u5185\u30C9\u30E1\u30A4\u30F3"}];return{async listUsers(){return[...a]},async createUser(i){let r={id:Math.max(...a.map(o=>o.id),0)+1,email:i.email,displayName:i.displayName,isActive:!0};return a.push(r),r},async updateUser(i,r){let o=a.findIndex(n=>n.id===i);if(o===-1)throw new Error(`User not found: ${i}`);return a[o]={...a[o],displayName:r.displayName,email:r.email},a[o]},async toggleUserActive(i,r){let o=a.findIndex(n=>n.id===i);if(o===-1)throw new Error(`User not found: ${i}`);return a[o]={...a[o],isActive:r},a[o]},async listGroups(){return[...t]},async createGroup(i){let r={id:Math.max(...t.map(o=>o.id),0)+1,groupKey:i.groupKey,name:i.name,description:i.description,isActive:!0};return t.push(r),r},async updateGroup(i,r){let o=t.findIndex(n=>n.id===i);if(o===-1)throw new Error(`Group not found: ${i}`);return t[o]={...t[o],name:r.name,description:r.description},t[o]},async deleteGroup(i){t=t.filter(r=>r.id!==i),l=l.filter(r=>r.groupId!==i)},async listGroupMembers(){return[...l]},async addGroupMember(i,r){let o=l.find(p=>p.groupId===i&&p.userId===r);if(o)return o;let n={id:Math.max(...l.map(p=>p.id),0)+1,groupId:i,userId:r};return l.push(n),n},async removeGroupMember(i,r){l=l.filter(o=>!(o.groupId===i&&o.userId===r))},async listAllowlist(){return[...g]},async addAllowlistEntry(i){let r={id:Math.max(...g.map(o=>o.id),0)+1,pattern:i.pattern,type:i.type,description:i.description};return g.push(r),r},async removeAllowlistEntry(i){g=g.filter(r=>r.id!==i)}}}var B=new Map([["createUser","create"],["updateUser","update"],["toggleUserActive","update"],["createGroup","create"],["updateGroup","update"],["deleteGroup","delete"],["addGroupMember","create"],["removeGroupMember","delete"],["addAllowlistEntry","create"],["removeAllowlistEntry","delete"]]);function y(s,a){let t=s.get(a),l=Number(t);if(t===null||String(t).trim()===""||!Number.isInteger(l)||l<=0)throw new Error(`Invalid or missing "${a}"`);return l}function h(s,a){let t=String(s.get(a)??"").trim();if(t==="")throw new Error(`Invalid or missing "${a}"`);return t}function R(s,a){let t=String(s.get(a)??"").trim();return t===""?void 0:t}function H(s){let a=I(s.labels);async function t({request:i}){await s.guards.requireAccess(i,{action:"read",intent:"loader"});let o=new URL(i.url).pathname.split("/").filter(Boolean),n=o[o.length-1]??"users",[p,f,m,w]=await Promise.all([s.store.listUsers(),s.store.listGroups(),s.store.listGroupMembers(),s.store.listAllowlist()]);return{segment:["groups","group_members","allowlist"].includes(n)?n:"users",users:p,groups:f,groupMembers:m,allowlist:w,labels:a}}async function l({request:i}){let r=await i.formData(),o=String(r.get("intent")??""),n=B.get(o);if(!n)return{ok:!1,error:`Unknown intent: ${o}`};await s.guards.requireAccess(i,{action:n,intent:o});try{return await g(o,r)}catch(p){if(p instanceof Response)throw p;return{ok:!1,error:p instanceof Error?p.message:String(p)}}}async function g(i,r){if(i==="createUser")return await s.store.createUser({displayName:h(r,"displayName"),email:h(r,"email")}),{ok:!0};if(i==="updateUser")return await s.store.updateUser(y(r,"userId"),{displayName:h(r,"displayName"),email:h(r,"email")}),{ok:!0};if(i==="toggleUserActive"){let o=String(r.get("isActive")??"");if(o!=="true"&&o!=="false")throw new Error('Invalid or missing "isActive"');return await s.store.toggleUserActive(y(r,"userId"),o==="true"),{ok:!0}}if(i==="createGroup")return await s.store.createGroup({groupKey:h(r,"groupKey"),name:h(r,"name"),description:R(r,"description")}),{ok:!0};if(i==="updateGroup")return await s.store.updateGroup(y(r,"groupId"),{name:h(r,"name"),description:R(r,"description")}),{ok:!0};if(i==="deleteGroup")return await s.store.deleteGroup(y(r,"groupId")),{ok:!0};if(i==="addGroupMember")return await s.store.addGroupMember(y(r,"groupId"),y(r,"userId")),{ok:!0};if(i==="removeGroupMember")return await s.store.removeGroupMember(y(r,"groupId"),y(r,"userId")),{ok:!0};if(i==="addAllowlistEntry"){let o=r.get("type")==="domain"?"domain":"email";return await s.store.addAllowlistEntry({pattern:h(r,"pattern"),type:o,description:R(r,"description")}),{ok:!0}}return i==="removeAllowlistEntry"?(await s.store.removeAllowlistEntry(y(r,"entryId")),{ok:!0}):{ok:!1,error:`Unknown intent: ${i}`}}return{loader:t,action:l}}import{Link as D,useLoaderData as T}from"react-router";import{jsx as v,jsxs as z}from"react/jsx-runtime";function M({children:s,renderHeader:a}){let t=T(),l=t?.segment??"users",g=t?.labels??x,i=[{key:"users",label:g.tabs.users,href:"/users"},{key:"groups",label:g.tabs.groups,href:"/users/groups"},{key:"group_members",label:g.tabs.groupMembers,href:"/users/group_members"},{key:"allowlist",label:g.tabs.allowlist,href:"/users/allowlist"}],r=v("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},"data-testid":"user-admin-header-annotation",children:v("span",{style:{fontSize:"0.75rem",backgroundColor:"#e0f2fe",color:"#0369a1",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:g.heading})});return z("div",{"data-testid":"user-admin-shell",style:{width:"100%",minHeight:"100vh",backgroundColor:"#f8fafc",padding:"1.5rem",boxSizing:"border-box"},children:[a?a({title:g.title,annotation:r}):z("div",{style:{marginBottom:"1.5rem",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[v("h1",{style:{margin:0,fontSize:"1.5rem",fontWeight:700,color:"#0f172a"},children:g.title}),r]}),v("div",{style:{display:"flex",gap:"0.5rem",marginBottom:"1.2rem",borderBottom:"2px solid #e2e8f0",paddingBottom:"0.5rem"},children:i.map(o=>{let n=l===o.key;return v(D,{to:o.href,"data-testid":`user-admin-tab-${o.key}`,style:{padding:"0.5rem 1rem",borderRadius:"6px 6px 0 0",fontSize:"0.88rem",fontWeight:n?700:500,color:n?"#0284c7":"#64748b",backgroundColor:n?"#ffffff":"transparent",textDecoration:"none",borderBottom:n?"3px solid #0284c7":"3px solid transparent",transition:"all 0.15s ease"},children:o.label},o.key)})}),v("main",{children:s})]})}import{useState as b}from"react";import{useFetcher as U,useLoaderData as S}from"react-router";import{Fragment as q,jsx as e,jsxs as d}from"react/jsx-runtime";function k({fetcher:s}){let a=s.data;return a?.ok!==!1||!a.error?null:e("div",{"data-testid":"user-admin-action-error",role:"alert",style:{padding:"0.7rem 1rem",borderRadius:"6px",border:"1px solid #fecaca",backgroundColor:"#fef2f2",color:"#b91c1c",fontSize:"0.85rem"},children:a.error})}function E(){let s=S(),a=U(),t=s.labels??x,[l,g]=b(""),[i,r]=b(null),[o,n]=b(!1),[p,f]=b(""),[m,w]=b(""),A=s.users.filter(u=>u.displayName.toLowerCase().includes(l.toLowerCase())||u.email.toLowerCase().includes(l.toLowerCase())),C=u=>{a.submit({intent:"toggleUserActive",userId:String(u.id),isActive:String(!u.isActive)},{method:"post"})},V=u=>{u.preventDefault(),p&&m&&(a.submit({intent:"createUser",displayName:p,email:m},{method:"post"}),f(""),w(""),n(!1))},G=u=>{u.preventDefault(),i&&(a.submit({intent:"updateUser",userId:String(i.id),displayName:i.displayName,email:i.email},{method:"post"}),r(null))};return d("section",{"data-testid":"users-view-section",style:{display:"flex",flexDirection:"column",gap:"1rem"},children:[e(k,{fetcher:a}),d("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",backgroundColor:"#ffffff",padding:"1rem",borderRadius:"8px",border:"1px solid #e2e8f0"},children:[e("input",{type:"text",placeholder:t.usersView.searchPlaceholder,value:l,onChange:u=>g(u.target.value),"data-testid":"users-search-input",style:{padding:"6px 12px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.85rem",width:"260px"}}),e("button",{type:"button",onClick:()=>n(!0),"data-testid":"users-add-button",style:{padding:"6px 14px",borderRadius:"6px",backgroundColor:"#0284c7",color:"#ffffff",border:"none",fontSize:"0.85rem",fontWeight:600,cursor:"pointer"},children:t.usersView.addUser})]}),e("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",overflow:"hidden"},children:d("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:"0.85rem",textAlign:"left"},children:[e("thead",{children:d("tr",{style:{backgroundColor:"#f8fafc",borderBottom:"1px solid #e2e8f0",color:"#475569"},children:[e("th",{style:{padding:"10px 14px"},children:t.usersView.id}),e("th",{style:{padding:"10px 14px"},children:t.usersView.displayName}),e("th",{style:{padding:"10px 14px"},children:t.usersView.email}),e("th",{style:{padding:"10px 14px"},children:t.usersView.status}),e("th",{style:{padding:"10px 14px",textAlign:"right"},children:t.usersView.actions})]})}),d("tbody",{children:[A.map(u=>d("tr",{style:{borderBottom:"1px solid #f1f5f9"},"data-testid":`user-row-${u.id}`,children:[d("td",{style:{padding:"10px 14px",color:"#64748b"},children:["#",u.id]}),e("td",{style:{padding:"10px 14px",fontWeight:600,color:"#0f172a"},children:u.displayName}),e("td",{style:{padding:"10px 14px",color:"#475569"},children:u.email}),e("td",{style:{padding:"10px 14px"},children:e("span",{style:{fontSize:"0.75rem",padding:"2px 8px",borderRadius:"10px",backgroundColor:u.isActive?"#dcfce7":"#fee2e2",color:u.isActive?"#15803d":"#b91c1c",fontWeight:600},children:u.isActive?t.usersView.active:t.usersView.inactive})}),d("td",{style:{padding:"10px 14px",textAlign:"right"},children:[e("button",{type:"button",onClick:()=>r(u),"data-testid":`edit-user-btn-${u.id}`,style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",fontSize:"0.78rem",cursor:"pointer",marginRight:"6px"},children:t.usersView.edit}),e("button",{type:"button",onClick:()=>C(u),"data-testid":`toggle-user-btn-${u.id}`,style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",fontSize:"0.78rem",cursor:"pointer",color:u.isActive?"#b91c1c":"#15803d"},children:u.isActive?t.usersView.deactivate:t.usersView.activate})]})]},u.id)),A.length===0&&e("tr",{children:e("td",{colSpan:5,style:{padding:"2rem",textAlign:"center",color:"#94a3b8"},children:t.usersView.empty})})]})]})}),o&&e("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.4)",display:"flex",justifyContent:"center",alignItems:"center",zIndex:100},"data-testid":"user-create-modal",children:d("form",{onSubmit:V,style:{backgroundColor:"#ffffff",padding:"1.5rem",borderRadius:"8px",width:"360px",boxShadow:"0 10px 25px rgba(0,0,0,0.15)"},children:[e("h3",{style:{margin:"0 0 1rem 0",fontSize:"1.1rem"},children:t.usersView.addUser}),d("div",{style:{marginBottom:"1rem"},children:[e("label",{htmlFor:"create-user-display-name-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.usersView.displayName}),e("input",{id:"create-user-display-name-input",type:"text",value:p,onChange:u=>f(u.target.value),required:!0,"data-testid":"create-user-display-name",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),d("div",{style:{marginBottom:"1.2rem"},children:[e("label",{htmlFor:"create-user-email-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.usersView.email}),e("input",{id:"create-user-email-input",type:"email",value:m,onChange:u=>w(u.target.value),required:!0,"data-testid":"create-user-email",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),d("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.5rem"},children:[e("button",{type:"button",onClick:()=>n(!1),style:{padding:"6px 12px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",cursor:"pointer"},children:"\u30AD\u30E3\u30F3\u30BB\u30EB"}),e("button",{type:"submit","data-testid":"submit-create-user",style:{padding:"6px 12px",borderRadius:"4px",backgroundColor:"#0284c7",color:"#ffffff",border:"none",cursor:"pointer"},children:"\u4F5C\u6210"})]})]})}),i&&e("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.4)",display:"flex",justifyContent:"center",alignItems:"center",zIndex:100},"data-testid":"user-edit-modal",children:d("form",{onSubmit:G,style:{backgroundColor:"#ffffff",padding:"1.5rem",borderRadius:"8px",width:"360px",boxShadow:"0 10px 25px rgba(0,0,0,0.15)"},children:[e("h3",{style:{margin:"0 0 1rem 0",fontSize:"1.1rem"},children:t.usersView.editUser}),d("div",{style:{marginBottom:"1rem"},children:[e("label",{htmlFor:"edit-user-display-name-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.usersView.displayName}),e("input",{id:"edit-user-display-name-input",type:"text",value:i.displayName,onChange:u=>r({...i,displayName:u.target.value}),required:!0,"data-testid":"edit-user-display-name",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),d("div",{style:{marginBottom:"1.2rem"},children:[e("label",{htmlFor:"edit-user-email-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.usersView.email}),e("input",{id:"edit-user-email-input",type:"email",value:i.email,onChange:u=>r({...i,email:u.target.value}),required:!0,"data-testid":"edit-user-email",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),d("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.5rem"},children:[e("button",{type:"button",onClick:()=>r(null),style:{padding:"6px 12px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",cursor:"pointer"},children:t.usersView.cancel}),e("button",{type:"submit","data-testid":"submit-edit-user",style:{padding:"6px 12px",borderRadius:"4px",backgroundColor:"#0284c7",color:"#ffffff",border:"none",cursor:"pointer"},children:t.usersView.save})]})]})})]})}function F(){let s=S(),a=U(),t=s.labels??x,[l,g]=b(""),[i,r]=b(!1),[o,n]=b(null),[p,f]=b(""),[m,w]=b(""),[A,C]=b(""),V=s.groups.filter(c=>c.name.toLowerCase().includes(l.toLowerCase())||c.groupKey.toLowerCase().includes(l.toLowerCase())),G=c=>{c.preventDefault(),p&&m&&(a.submit({intent:"createGroup",groupKey:p,name:m,description:A},{method:"post"}),f(""),w(""),C(""),r(!1))},u=c=>{c.preventDefault(),o&&(a.submit({intent:"updateGroup",groupId:String(o.id),name:o.name,description:o.description??""},{method:"post"}),n(null))},P=c=>{window.confirm(t.groupsView.confirmDelete)&&a.submit({intent:"deleteGroup",groupId:String(c)},{method:"post"})};return d("section",{"data-testid":"groups-view-section",style:{display:"flex",flexDirection:"column",gap:"1rem"},children:[e(k,{fetcher:a}),d("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",backgroundColor:"#ffffff",padding:"1rem",borderRadius:"8px",border:"1px solid #e2e8f0"},children:[e("input",{type:"text",placeholder:t.groupsView.searchPlaceholder,value:l,onChange:c=>g(c.target.value),"data-testid":"groups-search-input",style:{padding:"6px 12px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.85rem",width:"260px"}}),e("button",{type:"button",onClick:()=>r(!0),"data-testid":"groups-add-button",style:{padding:"6px 14px",borderRadius:"6px",backgroundColor:"#4338ca",color:"#ffffff",border:"none",fontSize:"0.85rem",fontWeight:600,cursor:"pointer"},children:t.groupsView.addGroup})]}),e("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(280px, 1fr))",gap:"1rem"},children:V.map(c=>{let N=s.groupMembers.filter(L=>L.groupId===c.id).length;return d("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",padding:"1rem",display:"flex",flexDirection:"column",justifyContent:"space-between"},"data-testid":`group-card-${c.id}`,children:[d("div",{children:[d("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"0.5rem"},children:[e("h4",{style:{margin:0,fontSize:"1rem",color:"#0f172a"},children:c.name}),e("span",{style:{fontSize:"0.72rem",backgroundColor:"#e0e7ff",color:"#4338ca",padding:"2px 6px",borderRadius:"4px",fontFamily:"monospace"},children:c.groupKey})]}),e("p",{style:{margin:"0 0 0.8rem 0",fontSize:"0.82rem",color:"#64748b",minHeight:"2.4em"},children:c.description||t.groupsView.noDescription})]}),d("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",borderTop:"1px solid #f1f5f9",paddingTop:"0.6rem"},children:[d("span",{style:{fontSize:"0.78rem",color:"#475569"},children:["\u{1F465} \u30E1\u30F3\u30D0\u30FC: ",e("strong",{children:N})," \u4EBA"]}),d("div",{children:[e("button",{type:"button",onClick:()=>n(c),"data-testid":`edit-group-btn-${c.id}`,style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",fontSize:"0.75rem",cursor:"pointer",marginRight:"4px"},children:t.usersView.edit}),e("button",{type:"button",onClick:()=>P(c.id),"data-testid":`delete-group-btn-${c.id}`,style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #fee2e2",backgroundColor:"#fff5f5",color:"#b91c1c",fontSize:"0.75rem",cursor:"pointer"},children:"\u524A\u9664"})]})]})]},c.id)})}),i&&e("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.4)",display:"flex",justifyContent:"center",alignItems:"center",zIndex:100},"data-testid":"group-create-modal",children:d("form",{onSubmit:G,style:{backgroundColor:"#ffffff",padding:"1.5rem",borderRadius:"8px",width:"360px",boxShadow:"0 10px 25px rgba(0,0,0,0.15)"},children:[e("h3",{style:{margin:"0 0 1rem 0",fontSize:"1.1rem"},children:t.groupsView.addGroup}),d("div",{style:{marginBottom:"1rem"},children:[e("label",{htmlFor:"create-group-key-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.groupsView.groupKey}),e("input",{id:"create-group-key-input",type:"text",value:p,onChange:c=>f(c.target.value),placeholder:t.groupsView.groupKeyPlaceholder,required:!0,"data-testid":"create-group-key",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),d("div",{style:{marginBottom:"1rem"},children:[e("label",{htmlFor:"create-group-name-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.groupsView.name}),e("input",{id:"create-group-name-input",type:"text",value:m,onChange:c=>w(c.target.value),placeholder:t.groupsView.namePlaceholder,required:!0,"data-testid":"create-group-name",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),d("div",{style:{marginBottom:"1.2rem"},children:[e("label",{htmlFor:"create-group-desc-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.groupsView.description}),e("textarea",{id:"create-group-desc-input",value:A,onChange:c=>C(c.target.value),"data-testid":"create-group-description",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box",height:"60px"}})]}),d("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.5rem"},children:[e("button",{type:"button",onClick:()=>r(!1),style:{padding:"6px 12px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",cursor:"pointer"},children:"\u30AD\u30E3\u30F3\u30BB\u30EB"}),e("button",{type:"submit","data-testid":"submit-create-group",style:{padding:"6px 12px",borderRadius:"4px",backgroundColor:"#4338ca",color:"#ffffff",border:"none",cursor:"pointer"},children:"\u4F5C\u6210"})]})]})}),o&&e("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.4)",display:"flex",justifyContent:"center",alignItems:"center",zIndex:100},"data-testid":"group-edit-modal",children:d("form",{onSubmit:u,style:{backgroundColor:"#ffffff",padding:"1.5rem",borderRadius:"8px",width:"360px",boxShadow:"0 10px 25px rgba(0,0,0,0.15)"},children:[e("h3",{style:{margin:"0 0 1rem 0",fontSize:"1.1rem"},children:t.groupsView.editGroup}),d("div",{style:{marginBottom:"1rem"},children:[e("label",{htmlFor:"edit-group-name-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.groupsView.name}),e("input",{id:"edit-group-name-input",type:"text",value:o.name,onChange:c=>n({...o,name:c.target.value}),required:!0,"data-testid":"edit-group-name",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),d("div",{style:{marginBottom:"1.2rem"},children:[e("label",{htmlFor:"edit-group-desc-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.groupsView.description}),e("textarea",{id:"edit-group-desc-input",value:o.description??"",onChange:c=>n({...o,description:c.target.value}),"data-testid":"edit-group-description",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box",height:"60px"}})]}),d("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.5rem"},children:[e("button",{type:"button",onClick:()=>n(null),style:{padding:"6px 12px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",cursor:"pointer"},children:t.groupsView.cancel}),e("button",{type:"submit","data-testid":"submit-edit-group",style:{padding:"6px 12px",borderRadius:"4px",backgroundColor:"#4338ca",color:"#ffffff",border:"none",cursor:"pointer"},children:t.groupsView.save})]})]})})]})}function K(){let s=S(),a=U(),t=s.labels??x,[l,g]=b(s.groups[0]?.id??0),i=s.groups.find(n=>n.id===l),r=new Set(s.groupMembers.filter(n=>n.groupId===l).map(n=>n.userId)),o=(n,p)=>{p?a.submit({intent:"removeGroupMember",groupId:String(l),userId:String(n)},{method:"post"}):a.submit({intent:"addGroupMember",groupId:String(l),userId:String(n)},{method:"post"})};return d("section",{"data-testid":"group-members-view-section",style:{display:"grid",gridTemplateColumns:"240px 1fr",gap:"1.2rem"},children:[e(k,{fetcher:a}),d("div",{style:{backgroundColor:"#ffffff",padding:"1rem",borderRadius:"8px",border:"1px solid #e2e8f0"},children:[e("h4",{style:{margin:"0 0 0.8rem 0",fontSize:"0.9rem",color:"#475569"},children:t.groupMembersView.selectGroup}),e("div",{style:{display:"flex",flexDirection:"column",gap:"0.4rem"},children:s.groups.map(n=>{let p=n.id===l;return e("button",{type:"button",onClick:()=>g(n.id),"data-testid":`select-group-btn-${n.id}`,style:{textAlign:"left",padding:"8px 10px",borderRadius:"6px",border:p?"1px solid #6366f1":"1px solid #e2e8f0",backgroundColor:p?"#e0e7ff":"#ffffff",color:p?"#3730a3":"#0f172a",cursor:"pointer",fontWeight:p?600:400,fontSize:"0.85rem"},children:n.name},n.id)})})]}),e("div",{style:{backgroundColor:"#ffffff",padding:"1.2rem",borderRadius:"8px",border:"1px solid #e2e8f0"},children:i?d(q,{children:[d("div",{style:{marginBottom:"1rem",borderBottom:"1px solid #e2e8f0",paddingBottom:"0.8rem"},children:[d("h3",{style:{margin:0,fontSize:"1.1rem",color:"#0f172a"},children:[i.name," \u306E\u6240\u5C5E\u30E1\u30F3\u30D0\u30FC"]}),d("span",{style:{fontSize:"0.8rem",color:"#64748b"},children:["\u30B0\u30EB\u30FC\u30D7\u30AD\u30FC: ",i.groupKey]})]}),e("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem"},children:s.users.map(n=>{let p=r.has(n.id);return d("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"8px 12px",borderRadius:"6px",border:"1px solid #f1f5f9",backgroundColor:p?"#f0fdf4":"#ffffff"},"data-testid":`member-row-${n.id}`,children:[d("div",{children:[e("span",{style:{fontWeight:600,fontSize:"0.88rem",color:"#0f172a",marginRight:"8px"},children:n.displayName}),d("span",{style:{fontSize:"0.78rem",color:"#64748b"},children:["(",n.email,")"]})]}),e("button",{type:"button",onClick:()=>o(n.id,p),"data-testid":`toggle-member-btn-${n.id}`,style:{padding:"4px 12px",borderRadius:"4px",border:p?"1px solid #b91c1c":"1px solid #0284c7",backgroundColor:p?"#ffffff":"#0284c7",color:p?"#b91c1c":"#ffffff",fontSize:"0.78rem",fontWeight:600,cursor:"pointer"},children:p?t.groupMembersView.actionRemove:t.groupMembersView.actionAdd})]},n.id)})})]}):e("div",{style:{color:"#94a3b8",textAlign:"center",padding:"2rem"},children:t.groupMembersView.selectPrompt})})]})}function $(){let s=S(),a=U(),t=s.labels??x,[l,g]=b(""),[i,r]=b("email"),[o,n]=b(""),p=m=>{m.preventDefault(),l&&(a.submit({intent:"addAllowlistEntry",pattern:l,type:i,description:o},{method:"post"}),g(""),n(""))},f=m=>{a.submit({intent:"removeAllowlistEntry",entryId:String(m)},{method:"post"})};return d("section",{"data-testid":"allowlist-view-section",style:{display:"flex",flexDirection:"column",gap:"1.2rem"},children:[e(k,{fetcher:a}),d("form",{onSubmit:p,style:{backgroundColor:"#ffffff",padding:"1.2rem",borderRadius:"8px",border:"1px solid #e2e8f0",display:"flex",flexWrap:"wrap",gap:"0.8rem",alignItems:"flex-end"},children:[d("div",{style:{flex:2,minWidth:"220px"},children:[e("label",{htmlFor:"allowlist-pattern-input-field",style:{display:"block",fontSize:"0.78rem",color:"#475569",marginBottom:"4px"},children:t.allowlistView.pattern}),e("input",{id:"allowlist-pattern-input-field",type:"text",value:l,onChange:m=>g(m.target.value),required:!0,"data-testid":"allowlist-pattern-input",style:{width:"100%",padding:"6px 10px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.85rem",boxSizing:"border-box"}})]}),d("div",{style:{flex:1,minWidth:"140px"},children:[e("label",{htmlFor:"allowlist-type-select-field",style:{display:"block",fontSize:"0.78rem",color:"#475569",marginBottom:"4px"},children:t.allowlistView.type}),d("select",{id:"allowlist-type-select-field",value:i,onChange:m=>r(m.target.value),"data-testid":"allowlist-type-select",style:{width:"100%",padding:"6px 10px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.85rem",boxSizing:"border-box"},children:[e("option",{value:"email",children:t.allowlistView.emailType}),e("option",{value:"domain",children:t.allowlistView.domainType})]})]}),d("div",{style:{flex:2,minWidth:"200px"},children:[e("label",{htmlFor:"allowlist-desc-input-field",style:{display:"block",fontSize:"0.78rem",color:"#475569",marginBottom:"4px"},children:t.allowlistView.description}),e("input",{id:"allowlist-desc-input-field",type:"text",value:o,onChange:m=>n(m.target.value),"data-testid":"allowlist-desc-input",style:{width:"100%",padding:"6px 10px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.85rem",boxSizing:"border-box"}})]}),e("button",{type:"submit","data-testid":"submit-allowlist-add",style:{padding:"7px 16px",borderRadius:"6px",backgroundColor:"#047857",color:"#ffffff",border:"none",fontSize:"0.85rem",fontWeight:600,cursor:"pointer"},children:t.allowlistView.addEntry})]}),e("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",overflow:"hidden"},children:d("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:"0.85rem",textAlign:"left"},children:[e("thead",{children:d("tr",{style:{backgroundColor:"#f8fafc",borderBottom:"1px solid #e2e8f0",color:"#475569"},children:[e("th",{style:{padding:"10px 14px"},children:"ID"}),e("th",{style:{padding:"10px 14px"},children:t.allowlistView.pattern}),e("th",{style:{padding:"10px 14px"},children:t.allowlistView.type}),e("th",{style:{padding:"10px 14px"},children:t.allowlistView.description}),e("th",{style:{padding:"10px 14px",textAlign:"right"},children:t.allowlistView.actions})]})}),d("tbody",{children:[s.allowlist.map(m=>d("tr",{style:{borderBottom:"1px solid #f1f5f9"},"data-testid":`allowlist-row-${m.id}`,children:[d("td",{style:{padding:"10px 14px",color:"#64748b"},children:["#",m.id]}),e("td",{style:{padding:"10px 14px",fontWeight:600,color:"#0f172a",fontFamily:"monospace"},children:m.pattern}),e("td",{style:{padding:"10px 14px"},children:e("span",{style:{fontSize:"0.75rem",padding:"2px 8px",borderRadius:"10px",backgroundColor:m.type==="email"?"#e0f2fe":"#fef3c7",color:m.type==="email"?"#0369a1":"#b45309",fontWeight:600},children:m.type==="email"?t.allowlistView.emailTypeShort:t.allowlistView.domainTypeShort})}),e("td",{style:{padding:"10px 14px",color:"#475569"},children:m.description||"-"}),e("td",{style:{padding:"10px 14px",textAlign:"right"},children:m.readOnly?e("span",{"data-testid":`readonly-allowlist-${m.id}`,style:{fontSize:"0.75rem",color:"#94a3b8"},children:t.allowlistView.readOnly}):e("button",{type:"button",onClick:()=>f(m.id),"data-testid":`remove-allowlist-btn-${m.id}`,style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #fee2e2",backgroundColor:"#fff5f5",color:"#b91c1c",fontSize:"0.78rem",cursor:"pointer"},children:"\u524A\u9664"})})]},m.id)),s.allowlist.length===0&&e("tr",{children:e("td",{colSpan:5,style:{padding:"2rem",textAlign:"center",color:"#94a3b8"},children:t.allowlistView.empty})})]})]})})]})}var W={users:E,groups:F,group_members:K,allowlist:$};function se({renderHeader:s}={}){let t=S()?.segment??"users",l=W[t]??E;return e(M,{renderHeader:s,children:e(l,{})})}export{$ as AllowlistView,se as AuthUserAdminAppView,K as GroupMembersView,F as GroupsView,M as UserAdminShell,E as UsersView,Q as createInMemoryUserAdminStore,H as createUserAdminApp,x as defaultUserAdminLabels,j as jaUserAdminLabels,I as resolveUserAdminLabels};
1
+ var A={title:"Users & Groups",heading:"\u{1F464} User administration",tabs:{users:"\u{1F464} Users",groups:"\u{1F465} Groups",groupMembers:"\u{1F517} Members",allowlist:"\u2709\uFE0F Allowlist"},usersView:{title:"Users",searchPlaceholder:"Search by name or email...",addUser:"\uFF0B Add user",editUser:"Edit user",id:"ID",displayName:"Name",email:"Email",status:"Status",active:"Active",inactive:"Inactive",actions:"Actions",edit:"Edit",activate:"Activate",deactivate:"Deactivate",empty:"No matching users",save:"Save",cancel:"Cancel"},groupsView:{title:"Groups",searchPlaceholder:"Search by group name or key...",addGroup:"\uFF0B Add group",editGroup:"Edit group",id:"ID",groupKey:"Group key",name:"Name",description:"Description",memberCount:"Members",status:"Status",actions:"Actions",edit:"Edit",delete:"Delete",confirmDelete:"Delete this group?",noDescription:"No description",groupKeyPlaceholder:"e.g. dev-team",namePlaceholder:"e.g. Development team",empty:"No groups registered",save:"Save",cancel:"Cancel"},groupMembersView:{selectGroup:"Select a group",selectPrompt:"Select a group to manage its members",actionAdd:"Add",actionRemove:"Remove"},allowlistView:{title:"Sign-in allowlist",addEntry:"\uFF0B Add pattern",pattern:"Pattern (e.g. @example.com or user@example.com)",type:"Type",emailType:"Exact email match",domainType:"Domain match",emailTypeShort:"Email",domainTypeShort:"Domain",description:"Description",actions:"Actions",readOnly:"Read-only",delete:"Delete",empty:"No allowlist entries registered",save:"Add",cancel:"Cancel"}},O={title:"\u30E6\u30FC\u30B6\u30FC\u30FB\u30B0\u30EB\u30FC\u30D7\u7BA1\u7406",heading:"\u{1F464} \u30E6\u30FC\u30B6\u30FC\u7BA1\u7406",tabs:{users:"\u{1F464} \u30E6\u30FC\u30B6\u30FC\u4E00\u89A7",groups:"\u{1F465} \u30E6\u30FC\u30B6\u30FC\u30B0\u30EB\u30FC\u30D7",groupMembers:"\u{1F517} \u30B0\u30EB\u30FC\u30D7\u30E1\u30F3\u30D0\u30FC",allowlist:"\u2709\uFE0F \u30A2\u30AF\u30BB\u30B9\u8A31\u53EF\u30EA\u30B9\u30C8"},usersView:{title:"\u30E6\u30FC\u30B6\u30FC\u7BA1\u7406",searchPlaceholder:"\u8868\u793A\u540D\u3084 Email \u3067\u691C\u7D22...",addUser:"\uFF0B \u30E6\u30FC\u30B6\u30FC\u8FFD\u52A0",editUser:"\u30E6\u30FC\u30B6\u30FC\u306E\u7DE8\u96C6",id:"ID",displayName:"\u8868\u793A\u540D",email:"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9",status:"\u30B9\u30C6\u30FC\u30BF\u30B9",active:"\u6709\u52B9",inactive:"\u7121\u52B9",actions:"\u64CD\u4F5C",edit:"\u7DE8\u96C6",activate:"\u6709\u52B9\u5316",deactivate:"\u7121\u52B9\u5316",empty:"\u8A72\u5F53\u3059\u308B\u30E6\u30FC\u30B6\u30FC\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",save:"\u4FDD\u5B58",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB"},groupsView:{title:"\u30E6\u30FC\u30B6\u30FC\u30B0\u30EB\u30FC\u30D7\u7BA1\u7406",searchPlaceholder:"\u30B0\u30EB\u30FC\u30D7\u540D\u3084\u30AD\u30FC\u3067\u691C\u7D22...",addGroup:"\uFF0B \u30B0\u30EB\u30FC\u30D7\u4F5C\u6210",editGroup:"\u30B0\u30EB\u30FC\u30D7\u306E\u7DE8\u96C6",id:"ID",groupKey:"\u30B0\u30EB\u30FC\u30D7\u30AD\u30FC",name:"\u30B0\u30EB\u30FC\u30D7\u540D",description:"\u8AAC\u660E",memberCount:"\u30E1\u30F3\u30D0\u30FC\u6570",status:"\u30B9\u30C6\u30FC\u30BF\u30B9",actions:"\u64CD\u4F5C",edit:"\u7DE8\u96C6",delete:"\u524A\u9664",confirmDelete:"\u3053\u306E\u30B0\u30EB\u30FC\u30D7\u3092\u524A\u9664\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F",noDescription:"\u8AAC\u660E\u306A\u3057",groupKeyPlaceholder:"\u4F8B: dev-team",namePlaceholder:"\u4F8B: \u958B\u767A\u30C1\u30FC\u30E0",empty:"\u30B0\u30EB\u30FC\u30D7\u304C\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u305B\u3093",save:"\u4FDD\u5B58",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB"},groupMembersView:{selectGroup:"\u30B0\u30EB\u30FC\u30D7\u9078\u629E",selectPrompt:"\u30B0\u30EB\u30FC\u30D7\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044",actionAdd:"\u8FFD\u52A0",actionRemove:"\u9664\u5916"},allowlistView:{title:"\u30A2\u30AF\u30BB\u30B9\u8A31\u53EF\u30EA\u30B9\u30C8 (Allowlist)",addEntry:"\uFF0B \u8A31\u53EF\u30D1\u30BF\u30FC\u30F3\u8FFD\u52A0",pattern:"\u30D1\u30BF\u30FC\u30F3 (\u4F8B: @example.com \u307E\u305F\u306F user@example.com)",type:"\u7A2E\u5225",emailType:"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u5B8C\u5168\u4E00\u81F4",domainType:"\u30C9\u30E1\u30A4\u30F3\u4E00\u81F4",emailTypeShort:"Email \u5B8C\u5168\u4E00\u81F4",domainTypeShort:"\u30C9\u30E1\u30A4\u30F3\u4E00\u81F4",description:"\u8AAC\u660E / \u5099\u8003",actions:"\u64CD\u4F5C",readOnly:"\u5909\u66F4\u4E0D\u53EF",delete:"\u524A\u9664",empty:"\u30A2\u30ED\u30EF\u30EA\u30B9\u30C8\u30A8\u30F3\u30C8\u30EA\u304C\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u305B\u3093",save:"\u767B\u9332",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB"}};function P(o){let s=A;return o?{title:o.title??s.title,heading:o.heading??s.heading,tabs:{...s.tabs,...o.tabs},usersView:{...s.usersView,...o.usersView},groupsView:{...s.groupsView,...o.groupsView},groupMembersView:{...s.groupMembersView,...o.groupMembersView},allowlistView:{...s.allowlistView,...o.allowlistView}}:s}function Q(o){let s=o?.users??[{id:1,email:"admin@example.com",displayName:"\u30B7\u30B9\u30C6\u30E0\u7BA1\u7406\u8005",isActive:!0},{id:2,email:"user1@example.com",displayName:"\u958B\u767A \u592A\u90CE",isActive:!0},{id:3,email:"user2@example.com",displayName:"\u55B6\u696D \u82B1\u5B50",isActive:!0}],t=o?.groups??[{id:1,groupKey:"dev-team",name:"\u958B\u767A\u30C1\u30FC\u30E0",description:"\u30B7\u30B9\u30C6\u30E0\u958B\u767A\u62C5\u5F53\u30B0\u30EB\u30FC\u30D7",isActive:!0},{id:2,groupKey:"sales-dept",name:"\u55B6\u696D\u90E8",description:"\u55B6\u696D\u30BD\u30EA\u30E5\u30FC\u30B7\u30E7\u30F3\u62C5\u5F53",isActive:!0}],p=o?.groupMembers??[{id:1,groupId:1,userId:2},{id:2,groupId:2,userId:3}],g=o?.allowlist??[{id:1,pattern:"admin@example.com",type:"email",description:"\u521D\u671F\u7BA1\u7406\u8005"},{id:2,pattern:"@example.com",type:"domain",description:"\u793E\u5185\u30C9\u30E1\u30A4\u30F3"}];return{async listUsers(){return[...s]},async createUser(i){let r={id:Math.max(...s.map(n=>n.id),0)+1,email:i.email,displayName:i.displayName,isActive:!0};return s.push(r),r},async updateUser(i,r){let n=s.findIndex(d=>d.id===i);if(n===-1)throw new Error(`User not found: ${i}`);return s[n]={...s[n],displayName:r.displayName,email:r.email},s[n]},async toggleUserActive(i,r){let n=s.findIndex(d=>d.id===i);if(n===-1)throw new Error(`User not found: ${i}`);return s[n]={...s[n],isActive:r},s[n]},async listGroups(){return[...t]},async createGroup(i){let r={id:Math.max(...t.map(n=>n.id),0)+1,groupKey:i.groupKey,name:i.name,description:i.description,isActive:!0};return t.push(r),r},async updateGroup(i,r){let n=t.findIndex(d=>d.id===i);if(n===-1)throw new Error(`Group not found: ${i}`);return t[n]={...t[n],name:r.name,description:r.description},t[n]},async deleteGroup(i){t=t.filter(r=>r.id!==i),p=p.filter(r=>r.groupId!==i)},async listGroupMembers(){return[...p]},async addGroupMember(i,r){let n=p.find(l=>l.groupId===i&&l.userId===r);if(n)return n;let d={id:Math.max(...p.map(l=>l.id),0)+1,groupId:i,userId:r};return p.push(d),d},async removeGroupMember(i,r){p=p.filter(n=>!(n.groupId===i&&n.userId===r))},async listAllowlist(){return[...g]},async addAllowlistEntry(i){let r={id:Math.max(...g.map(n=>n.id),0)+1,pattern:i.pattern,type:i.type,description:i.description};return g.push(r),r},async removeAllowlistEntry(i){g=g.filter(r=>r.id!==i)}}}var D=new Map([["createUser","create"],["updateUser","update"],["toggleUserActive","update"],["createGroup","create"],["updateGroup","update"],["deleteGroup","delete"],["addGroupMember","create"],["removeGroupMember","delete"],["addAllowlistEntry","create"],["removeAllowlistEntry","delete"]]);function v(o,s){let t=o.get(s),p=Number(t);if(t===null||String(t).trim()===""||!Number.isInteger(p)||p<=0)throw new Error(`Invalid or missing "${s}"`);return p}function S(o,s){let t=String(o.get(s)??"").trim();if(t==="")throw new Error(`Invalid or missing "${s}"`);return t}function I(o,s){let t=String(o.get(s)??"").trim();return t===""?void 0:t}function J(o){let s=P(o.labels);async function t({request:i}){await o.guards.requireAccess(i,{action:"read",intent:"loader"});let n=new URL(i.url).pathname.split("/").filter(Boolean),d=n[n.length-1]??"users",[l,x,m,w,b]=await Promise.all([o.store.listUsers(),o.store.listGroups(),o.store.listGroupMembers(),o.store.listAllowlist(),o.getMyPermissions?o.getMyPermissions(i).catch(y=>(console.error("[@aiquants/auth-react-router] getMyPermissions failed; rendering the permission badge as unknown:",y),null)):Promise.resolve(null)]);return{resourceLabels:o.resourceLabels,segment:["groups","group_members","allowlist"].includes(d)?d:"users",users:l,groups:x,groupMembers:m,allowlist:w,myPermissions:b,labels:s}}async function p({request:i}){let r=await i.formData(),n=String(r.get("intent")??""),d=D.get(n);if(!d)return{ok:!1,error:`Unknown intent: ${n}`};await o.guards.requireAccess(i,{action:d,intent:n});try{return await g(n,r)}catch(l){if(l instanceof Response)throw l;return{ok:!1,error:l instanceof Error?l.message:String(l)}}}async function g(i,r){if(i==="createUser")return await o.store.createUser({displayName:S(r,"displayName"),email:S(r,"email")}),{ok:!0};if(i==="updateUser")return await o.store.updateUser(v(r,"userId"),{displayName:S(r,"displayName"),email:S(r,"email")}),{ok:!0};if(i==="toggleUserActive"){let n=String(r.get("isActive")??"");if(n!=="true"&&n!=="false")throw new Error('Invalid or missing "isActive"');return await o.store.toggleUserActive(v(r,"userId"),n==="true"),{ok:!0}}if(i==="createGroup")return await o.store.createGroup({groupKey:S(r,"groupKey"),name:S(r,"name"),description:I(r,"description")}),{ok:!0};if(i==="updateGroup")return await o.store.updateGroup(v(r,"groupId"),{name:S(r,"name"),description:I(r,"description")}),{ok:!0};if(i==="deleteGroup")return await o.store.deleteGroup(v(r,"groupId")),{ok:!0};if(i==="addGroupMember")return await o.store.addGroupMember(v(r,"groupId"),v(r,"userId")),{ok:!0};if(i==="removeGroupMember")return await o.store.removeGroupMember(v(r,"groupId"),v(r,"userId")),{ok:!0};if(i==="addAllowlistEntry"){let n=r.get("type")==="domain"?"domain":"email";return await o.store.addAllowlistEntry({pattern:S(r,"pattern"),type:n,description:I(r,"description")}),{ok:!0}}return i==="removeAllowlistEntry"?(await o.store.removeAllowlistEntry(v(r,"entryId")),{ok:!0}):{ok:!1,error:`Unknown intent: ${i}`}}return{loader:t,action:p}}import{Link as T,useLoaderData as F}from"react-router";import{jsx as h,jsxs as C}from"react/jsx-runtime";function z({label:o,summary:s}){return C("span",{style:{display:"inline-flex",alignItems:"center",gap:"0.18rem",fontSize:"0.65rem",padding:"0.08rem 0.35rem",borderRadius:"9999px",backgroundColor:s.bgColor,color:s.color,border:`1px solid ${s.borderColor}`,fontWeight:600,lineHeight:"1.2"},children:[C("span",{children:[o,":"]}),h("span",{children:s.text})]})}function M({children:o,renderHeader:s}){let t=F(),p=t?.segment??"users",g=t?.labels??A,i=t?.myPermissions??null,r=t?.resourceLabels??{},n=b=>Object.hasOwn(r,b)?r[b]:b,d=[{key:"users",label:g.tabs.users,href:"/users"},{key:"groups",label:g.tabs.groups,href:"/users/groups"},{key:"group_members",label:g.tabs.groupMembers,href:"/users/group_members"},{key:"allowlist",label:g.tabs.allowlist,href:"/users/allowlist"}],l=Object.entries(i??{}),x=b=>b?.canWrite?{text:"\u7DE8\u96C6\u53EF",color:"#047857",bgColor:"#ecfdf5",borderColor:"#a7f3d0"}:b?.canRead?{text:"\u95B2\u89A7\u306E\u307F",color:"#1d4ed8",bgColor:"#eff6ff",borderColor:"#bfdbfe"}:{text:"\u6A29\u9650\u306A\u3057",color:"#64748b",bgColor:"#f1f5f9",borderColor:"#cbd5e1"},m={text:"\u6A29\u9650\u4E0D\u660E",color:"#92400e",bgColor:"#fffbeb",borderColor:"#fde68a"},w=C("div",{style:{display:"flex",alignItems:"center",gap:"0.4rem"},"data-testid":"user-admin-header-annotation",children:[h("span",{style:{fontSize:"0.75rem",backgroundColor:"#e0f2fe",color:"#0369a1",padding:"2px 8px",borderRadius:"12px",fontWeight:600},children:g.heading}),C("div",{style:{display:"inline-flex",alignItems:"center",gap:"0.25rem",fontSize:"0.68rem",color:"#475569"},"data-testid":"user-admin-permissions-badge",children:[h("span",{style:{fontWeight:600,color:"#334155"},children:"\u3042\u306A\u305F\u306E\u6A29\u9650:"}),h("span",{style:{display:"inline-flex",alignItems:"center",gap:"0.18rem"},children:l.length===0?h("span",{"data-testid":"user-admin-permission-unavailable",children:h(z,{label:g.heading,summary:m})}):l.map(([b,y])=>h(z,{label:n(b),summary:x(y)},b))})]})]});return C("div",{"data-testid":"user-admin-shell",style:{width:"100%",minHeight:"100vh",backgroundColor:"#f8fafc",padding:"1.5rem",boxSizing:"border-box"},children:[s?s({title:g.title,annotation:w}):C("div",{style:{marginBottom:"1.5rem",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[h("h1",{style:{margin:0,fontSize:"1.5rem",fontWeight:700,color:"#0f172a"},children:g.title}),w]}),h("div",{style:{display:"flex",gap:"0.5rem",marginBottom:"1.2rem",borderBottom:"2px solid #e2e8f0",paddingBottom:"0.5rem"},children:d.map(b=>{let y=p===b.key;return h(T,{to:b.href,"data-testid":`user-admin-tab-${b.key}`,style:{padding:"0.5rem 1rem",borderRadius:"6px 6px 0 0",fontSize:"0.88rem",fontWeight:y?700:500,color:y?"#0284c7":"#64748b",backgroundColor:y?"#ffffff":"transparent",textDecoration:"none",borderBottom:y?"3px solid #0284c7":"3px solid transparent",transition:"all 0.15s ease"},children:b.label},b.key)})}),h("main",{children:o})]})}import{useState as f}from"react";import{useFetcher as k,useLoaderData as U}from"react-router";import{Fragment as j,jsx as e,jsxs as a}from"react/jsx-runtime";function V({fetcher:o}){let s=o.data;return s?.ok!==!1||!s.error?null:e("div",{"data-testid":"user-admin-action-error",role:"alert",style:{padding:"0.7rem 1rem",borderRadius:"6px",border:"1px solid #fecaca",backgroundColor:"#fef2f2",color:"#b91c1c",fontSize:"0.85rem"},children:s.error})}function E(){let o=U(),s=k(),t=o.labels??A,[p,g]=f(""),[i,r]=f(null),[n,d]=f(!1),[l,x]=f(""),[m,w]=f(""),b=o.users.filter(u=>u.displayName.toLowerCase().includes(p.toLowerCase())||u.email.toLowerCase().includes(p.toLowerCase())),y=u=>{s.submit({intent:"toggleUserActive",userId:String(u.id),isActive:String(!u.isActive)},{method:"post"})},R=u=>{u.preventDefault(),l&&m&&(s.submit({intent:"createUser",displayName:l,email:m},{method:"post"}),x(""),w(""),d(!1))},G=u=>{u.preventDefault(),i&&(s.submit({intent:"updateUser",userId:String(i.id),displayName:i.displayName,email:i.email},{method:"post"}),r(null))};return a("section",{"data-testid":"users-view-section",style:{display:"flex",flexDirection:"column",gap:"1rem"},children:[e(V,{fetcher:s}),a("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",backgroundColor:"#ffffff",padding:"1rem",borderRadius:"8px",border:"1px solid #e2e8f0"},children:[e("input",{type:"text",placeholder:t.usersView.searchPlaceholder,value:p,onChange:u=>g(u.target.value),"data-testid":"users-search-input",style:{padding:"6px 12px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.85rem",width:"260px"}}),e("button",{type:"button",onClick:()=>d(!0),"data-testid":"users-add-button",style:{padding:"6px 14px",borderRadius:"6px",backgroundColor:"#0284c7",color:"#ffffff",border:"none",fontSize:"0.85rem",fontWeight:600,cursor:"pointer"},children:t.usersView.addUser})]}),e("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",overflow:"hidden"},children:a("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:"0.85rem",textAlign:"left"},children:[e("thead",{children:a("tr",{style:{backgroundColor:"#f8fafc",borderBottom:"1px solid #e2e8f0",color:"#475569"},children:[e("th",{style:{padding:"10px 14px"},children:t.usersView.id}),e("th",{style:{padding:"10px 14px"},children:t.usersView.displayName}),e("th",{style:{padding:"10px 14px"},children:t.usersView.email}),e("th",{style:{padding:"10px 14px"},children:t.usersView.status}),e("th",{style:{padding:"10px 14px",textAlign:"right"},children:t.usersView.actions})]})}),a("tbody",{children:[b.map(u=>a("tr",{style:{borderBottom:"1px solid #f1f5f9"},"data-testid":`user-row-${u.id}`,children:[a("td",{style:{padding:"10px 14px",color:"#64748b"},children:["#",u.id]}),e("td",{style:{padding:"10px 14px",fontWeight:600,color:"#0f172a"},children:u.displayName}),e("td",{style:{padding:"10px 14px",color:"#475569"},children:u.email}),e("td",{style:{padding:"10px 14px"},children:e("span",{style:{fontSize:"0.75rem",padding:"2px 8px",borderRadius:"10px",backgroundColor:u.isActive?"#dcfce7":"#fee2e2",color:u.isActive?"#15803d":"#b91c1c",fontWeight:600},children:u.isActive?t.usersView.active:t.usersView.inactive})}),a("td",{style:{padding:"10px 14px",textAlign:"right"},children:[e("button",{type:"button",onClick:()=>r(u),"data-testid":`edit-user-btn-${u.id}`,style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",fontSize:"0.78rem",cursor:"pointer",marginRight:"6px"},children:t.usersView.edit}),e("button",{type:"button",onClick:()=>y(u),"data-testid":`toggle-user-btn-${u.id}`,style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",fontSize:"0.78rem",cursor:"pointer",color:u.isActive?"#b91c1c":"#15803d"},children:u.isActive?t.usersView.deactivate:t.usersView.activate})]})]},u.id)),b.length===0&&e("tr",{children:e("td",{colSpan:5,style:{padding:"2rem",textAlign:"center",color:"#94a3b8"},children:t.usersView.empty})})]})]})}),n&&e("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.4)",display:"flex",justifyContent:"center",alignItems:"center",zIndex:100},"data-testid":"user-create-modal",children:a("form",{onSubmit:R,style:{backgroundColor:"#ffffff",padding:"1.5rem",borderRadius:"8px",width:"360px",boxShadow:"0 10px 25px rgba(0,0,0,0.15)"},children:[e("h3",{style:{margin:"0 0 1rem 0",fontSize:"1.1rem"},children:t.usersView.addUser}),a("div",{style:{marginBottom:"1rem"},children:[e("label",{htmlFor:"create-user-display-name-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.usersView.displayName}),e("input",{id:"create-user-display-name-input",type:"text",value:l,onChange:u=>x(u.target.value),required:!0,"data-testid":"create-user-display-name",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),a("div",{style:{marginBottom:"1.2rem"},children:[e("label",{htmlFor:"create-user-email-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.usersView.email}),e("input",{id:"create-user-email-input",type:"email",value:m,onChange:u=>w(u.target.value),required:!0,"data-testid":"create-user-email",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),a("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.5rem"},children:[e("button",{type:"button",onClick:()=>d(!1),style:{padding:"6px 12px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",cursor:"pointer"},children:"\u30AD\u30E3\u30F3\u30BB\u30EB"}),e("button",{type:"submit","data-testid":"submit-create-user",style:{padding:"6px 12px",borderRadius:"4px",backgroundColor:"#0284c7",color:"#ffffff",border:"none",cursor:"pointer"},children:"\u4F5C\u6210"})]})]})}),i&&e("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.4)",display:"flex",justifyContent:"center",alignItems:"center",zIndex:100},"data-testid":"user-edit-modal",children:a("form",{onSubmit:G,style:{backgroundColor:"#ffffff",padding:"1.5rem",borderRadius:"8px",width:"360px",boxShadow:"0 10px 25px rgba(0,0,0,0.15)"},children:[e("h3",{style:{margin:"0 0 1rem 0",fontSize:"1.1rem"},children:t.usersView.editUser}),a("div",{style:{marginBottom:"1rem"},children:[e("label",{htmlFor:"edit-user-display-name-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.usersView.displayName}),e("input",{id:"edit-user-display-name-input",type:"text",value:i.displayName,onChange:u=>r({...i,displayName:u.target.value}),required:!0,"data-testid":"edit-user-display-name",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),a("div",{style:{marginBottom:"1.2rem"},children:[e("label",{htmlFor:"edit-user-email-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.usersView.email}),e("input",{id:"edit-user-email-input",type:"email",value:i.email,onChange:u=>r({...i,email:u.target.value}),required:!0,"data-testid":"edit-user-email",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),a("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.5rem"},children:[e("button",{type:"button",onClick:()=>r(null),style:{padding:"6px 12px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",cursor:"pointer"},children:t.usersView.cancel}),e("button",{type:"submit","data-testid":"submit-edit-user",style:{padding:"6px 12px",borderRadius:"4px",backgroundColor:"#0284c7",color:"#ffffff",border:"none",cursor:"pointer"},children:t.usersView.save})]})]})})]})}function W(){let o=U(),s=k(),t=o.labels??A,[p,g]=f(""),[i,r]=f(!1),[n,d]=f(null),[l,x]=f(""),[m,w]=f(""),[b,y]=f(""),R=o.groups.filter(c=>c.name.toLowerCase().includes(p.toLowerCase())||c.groupKey.toLowerCase().includes(p.toLowerCase())),G=c=>{c.preventDefault(),l&&m&&(s.submit({intent:"createGroup",groupKey:l,name:m,description:b},{method:"post"}),x(""),w(""),y(""),r(!1))},u=c=>{c.preventDefault(),n&&(s.submit({intent:"updateGroup",groupId:String(n.id),name:n.name,description:n.description??""},{method:"post"}),d(null))},N=c=>{window.confirm(t.groupsView.confirmDelete)&&s.submit({intent:"deleteGroup",groupId:String(c)},{method:"post"})};return a("section",{"data-testid":"groups-view-section",style:{display:"flex",flexDirection:"column",gap:"1rem"},children:[e(V,{fetcher:s}),a("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",backgroundColor:"#ffffff",padding:"1rem",borderRadius:"8px",border:"1px solid #e2e8f0"},children:[e("input",{type:"text",placeholder:t.groupsView.searchPlaceholder,value:p,onChange:c=>g(c.target.value),"data-testid":"groups-search-input",style:{padding:"6px 12px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.85rem",width:"260px"}}),e("button",{type:"button",onClick:()=>r(!0),"data-testid":"groups-add-button",style:{padding:"6px 14px",borderRadius:"6px",backgroundColor:"#4338ca",color:"#ffffff",border:"none",fontSize:"0.85rem",fontWeight:600,cursor:"pointer"},children:t.groupsView.addGroup})]}),e("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(280px, 1fr))",gap:"1rem"},children:R.map(c=>{let L=o.groupMembers.filter(B=>B.groupId===c.id).length;return a("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",padding:"1rem",display:"flex",flexDirection:"column",justifyContent:"space-between"},"data-testid":`group-card-${c.id}`,children:[a("div",{children:[a("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"0.5rem"},children:[e("h4",{style:{margin:0,fontSize:"1rem",color:"#0f172a"},children:c.name}),e("span",{style:{fontSize:"0.72rem",backgroundColor:"#e0e7ff",color:"#4338ca",padding:"2px 6px",borderRadius:"4px",fontFamily:"monospace"},children:c.groupKey})]}),e("p",{style:{margin:"0 0 0.8rem 0",fontSize:"0.82rem",color:"#64748b",minHeight:"2.4em"},children:c.description||t.groupsView.noDescription})]}),a("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",borderTop:"1px solid #f1f5f9",paddingTop:"0.6rem"},children:[a("span",{style:{fontSize:"0.78rem",color:"#475569"},children:["\u{1F465} \u30E1\u30F3\u30D0\u30FC: ",e("strong",{children:L})," \u4EBA"]}),a("div",{children:[e("button",{type:"button",onClick:()=>d(c),"data-testid":`edit-group-btn-${c.id}`,style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",fontSize:"0.75rem",cursor:"pointer",marginRight:"4px"},children:t.usersView.edit}),e("button",{type:"button",onClick:()=>N(c.id),"data-testid":`delete-group-btn-${c.id}`,style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #fee2e2",backgroundColor:"#fff5f5",color:"#b91c1c",fontSize:"0.75rem",cursor:"pointer"},children:"\u524A\u9664"})]})]})]},c.id)})}),i&&e("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.4)",display:"flex",justifyContent:"center",alignItems:"center",zIndex:100},"data-testid":"group-create-modal",children:a("form",{onSubmit:G,style:{backgroundColor:"#ffffff",padding:"1.5rem",borderRadius:"8px",width:"360px",boxShadow:"0 10px 25px rgba(0,0,0,0.15)"},children:[e("h3",{style:{margin:"0 0 1rem 0",fontSize:"1.1rem"},children:t.groupsView.addGroup}),a("div",{style:{marginBottom:"1rem"},children:[e("label",{htmlFor:"create-group-key-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.groupsView.groupKey}),e("input",{id:"create-group-key-input",type:"text",value:l,onChange:c=>x(c.target.value),placeholder:t.groupsView.groupKeyPlaceholder,required:!0,"data-testid":"create-group-key",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),a("div",{style:{marginBottom:"1rem"},children:[e("label",{htmlFor:"create-group-name-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.groupsView.name}),e("input",{id:"create-group-name-input",type:"text",value:m,onChange:c=>w(c.target.value),placeholder:t.groupsView.namePlaceholder,required:!0,"data-testid":"create-group-name",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),a("div",{style:{marginBottom:"1.2rem"},children:[e("label",{htmlFor:"create-group-desc-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.groupsView.description}),e("textarea",{id:"create-group-desc-input",value:b,onChange:c=>y(c.target.value),"data-testid":"create-group-description",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box",height:"60px"}})]}),a("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.5rem"},children:[e("button",{type:"button",onClick:()=>r(!1),style:{padding:"6px 12px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",cursor:"pointer"},children:"\u30AD\u30E3\u30F3\u30BB\u30EB"}),e("button",{type:"submit","data-testid":"submit-create-group",style:{padding:"6px 12px",borderRadius:"4px",backgroundColor:"#4338ca",color:"#ffffff",border:"none",cursor:"pointer"},children:"\u4F5C\u6210"})]})]})}),n&&e("div",{style:{position:"fixed",inset:0,backgroundColor:"rgba(0,0,0,0.4)",display:"flex",justifyContent:"center",alignItems:"center",zIndex:100},"data-testid":"group-edit-modal",children:a("form",{onSubmit:u,style:{backgroundColor:"#ffffff",padding:"1.5rem",borderRadius:"8px",width:"360px",boxShadow:"0 10px 25px rgba(0,0,0,0.15)"},children:[e("h3",{style:{margin:"0 0 1rem 0",fontSize:"1.1rem"},children:t.groupsView.editGroup}),a("div",{style:{marginBottom:"1rem"},children:[e("label",{htmlFor:"edit-group-name-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.groupsView.name}),e("input",{id:"edit-group-name-input",type:"text",value:n.name,onChange:c=>d({...n,name:c.target.value}),required:!0,"data-testid":"edit-group-name",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box"}})]}),a("div",{style:{marginBottom:"1.2rem"},children:[e("label",{htmlFor:"edit-group-desc-input",style:{display:"block",fontSize:"0.8rem",color:"#475569",marginBottom:"4px"},children:t.groupsView.description}),e("textarea",{id:"edit-group-desc-input",value:n.description??"",onChange:c=>d({...n,description:c.target.value}),"data-testid":"edit-group-description",style:{width:"100%",padding:"6px",borderRadius:"4px",border:"1px solid #cbd5e1",boxSizing:"border-box",height:"60px"}})]}),a("div",{style:{display:"flex",justifyContent:"flex-end",gap:"0.5rem"},children:[e("button",{type:"button",onClick:()=>d(null),style:{padding:"6px 12px",borderRadius:"4px",border:"1px solid #cbd5e1",backgroundColor:"#ffffff",cursor:"pointer"},children:t.groupsView.cancel}),e("button",{type:"submit","data-testid":"submit-edit-group",style:{padding:"6px 12px",borderRadius:"4px",backgroundColor:"#4338ca",color:"#ffffff",border:"none",cursor:"pointer"},children:t.groupsView.save})]})]})})]})}function $(){let o=U(),s=k(),t=o.labels??A,[p,g]=f(o.groups[0]?.id??0),i=o.groups.find(d=>d.id===p),r=new Set(o.groupMembers.filter(d=>d.groupId===p).map(d=>d.userId)),n=(d,l)=>{l?s.submit({intent:"removeGroupMember",groupId:String(p),userId:String(d)},{method:"post"}):s.submit({intent:"addGroupMember",groupId:String(p),userId:String(d)},{method:"post"})};return a("section",{"data-testid":"group-members-view-section",style:{display:"grid",gridTemplateColumns:"240px 1fr",gap:"1.2rem"},children:[e(V,{fetcher:s}),a("div",{style:{backgroundColor:"#ffffff",padding:"1rem",borderRadius:"8px",border:"1px solid #e2e8f0"},children:[e("h4",{style:{margin:"0 0 0.8rem 0",fontSize:"0.9rem",color:"#475569"},children:t.groupMembersView.selectGroup}),e("div",{style:{display:"flex",flexDirection:"column",gap:"0.4rem"},children:o.groups.map(d=>{let l=d.id===p;return e("button",{type:"button",onClick:()=>g(d.id),"data-testid":`select-group-btn-${d.id}`,style:{textAlign:"left",padding:"8px 10px",borderRadius:"6px",border:l?"1px solid #6366f1":"1px solid #e2e8f0",backgroundColor:l?"#e0e7ff":"#ffffff",color:l?"#3730a3":"#0f172a",cursor:"pointer",fontWeight:l?600:400,fontSize:"0.85rem"},children:d.name},d.id)})})]}),e("div",{style:{backgroundColor:"#ffffff",padding:"1.2rem",borderRadius:"8px",border:"1px solid #e2e8f0"},children:i?a(j,{children:[a("div",{style:{marginBottom:"1rem",borderBottom:"1px solid #e2e8f0",paddingBottom:"0.8rem"},children:[a("h3",{style:{margin:0,fontSize:"1.1rem",color:"#0f172a"},children:[i.name," \u306E\u6240\u5C5E\u30E1\u30F3\u30D0\u30FC"]}),a("span",{style:{fontSize:"0.8rem",color:"#64748b"},children:["\u30B0\u30EB\u30FC\u30D7\u30AD\u30FC: ",i.groupKey]})]}),e("div",{style:{display:"flex",flexDirection:"column",gap:"0.5rem"},children:o.users.map(d=>{let l=r.has(d.id);return a("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"8px 12px",borderRadius:"6px",border:"1px solid #f1f5f9",backgroundColor:l?"#f0fdf4":"#ffffff"},"data-testid":`member-row-${d.id}`,children:[a("div",{children:[e("span",{style:{fontWeight:600,fontSize:"0.88rem",color:"#0f172a",marginRight:"8px"},children:d.displayName}),a("span",{style:{fontSize:"0.78rem",color:"#64748b"},children:["(",d.email,")"]})]}),e("button",{type:"button",onClick:()=>n(d.id,l),"data-testid":`toggle-member-btn-${d.id}`,style:{padding:"4px 12px",borderRadius:"4px",border:l?"1px solid #b91c1c":"1px solid #0284c7",backgroundColor:l?"#ffffff":"#0284c7",color:l?"#b91c1c":"#ffffff",fontSize:"0.78rem",fontWeight:600,cursor:"pointer"},children:l?t.groupMembersView.actionRemove:t.groupMembersView.actionAdd})]},d.id)})})]}):e("div",{style:{color:"#94a3b8",textAlign:"center",padding:"2rem"},children:t.groupMembersView.selectPrompt})})]})}function q(){let o=U(),s=k(),t=o.labels??A,[p,g]=f(""),[i,r]=f("email"),[n,d]=f(""),l=m=>{m.preventDefault(),p&&(s.submit({intent:"addAllowlistEntry",pattern:p,type:i,description:n},{method:"post"}),g(""),d(""))},x=m=>{s.submit({intent:"removeAllowlistEntry",entryId:String(m)},{method:"post"})};return a("section",{"data-testid":"allowlist-view-section",style:{display:"flex",flexDirection:"column",gap:"1.2rem"},children:[e(V,{fetcher:s}),a("form",{onSubmit:l,style:{backgroundColor:"#ffffff",padding:"1.2rem",borderRadius:"8px",border:"1px solid #e2e8f0",display:"flex",flexWrap:"wrap",gap:"0.8rem",alignItems:"flex-end"},children:[a("div",{style:{flex:2,minWidth:"220px"},children:[e("label",{htmlFor:"allowlist-pattern-input-field",style:{display:"block",fontSize:"0.78rem",color:"#475569",marginBottom:"4px"},children:t.allowlistView.pattern}),e("input",{id:"allowlist-pattern-input-field",type:"text",value:p,onChange:m=>g(m.target.value),required:!0,"data-testid":"allowlist-pattern-input",style:{width:"100%",padding:"6px 10px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.85rem",boxSizing:"border-box"}})]}),a("div",{style:{flex:1,minWidth:"140px"},children:[e("label",{htmlFor:"allowlist-type-select-field",style:{display:"block",fontSize:"0.78rem",color:"#475569",marginBottom:"4px"},children:t.allowlistView.type}),a("select",{id:"allowlist-type-select-field",value:i,onChange:m=>r(m.target.value),"data-testid":"allowlist-type-select",style:{width:"100%",padding:"6px 10px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.85rem",boxSizing:"border-box"},children:[e("option",{value:"email",children:t.allowlistView.emailType}),e("option",{value:"domain",children:t.allowlistView.domainType})]})]}),a("div",{style:{flex:2,minWidth:"200px"},children:[e("label",{htmlFor:"allowlist-desc-input-field",style:{display:"block",fontSize:"0.78rem",color:"#475569",marginBottom:"4px"},children:t.allowlistView.description}),e("input",{id:"allowlist-desc-input-field",type:"text",value:n,onChange:m=>d(m.target.value),"data-testid":"allowlist-desc-input",style:{width:"100%",padding:"6px 10px",borderRadius:"6px",border:"1px solid #cbd5e1",fontSize:"0.85rem",boxSizing:"border-box"}})]}),e("button",{type:"submit","data-testid":"submit-allowlist-add",style:{padding:"7px 16px",borderRadius:"6px",backgroundColor:"#047857",color:"#ffffff",border:"none",fontSize:"0.85rem",fontWeight:600,cursor:"pointer"},children:t.allowlistView.addEntry})]}),e("div",{style:{backgroundColor:"#ffffff",borderRadius:"8px",border:"1px solid #e2e8f0",overflow:"hidden"},children:a("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:"0.85rem",textAlign:"left"},children:[e("thead",{children:a("tr",{style:{backgroundColor:"#f8fafc",borderBottom:"1px solid #e2e8f0",color:"#475569"},children:[e("th",{style:{padding:"10px 14px"},children:"ID"}),e("th",{style:{padding:"10px 14px"},children:t.allowlistView.pattern}),e("th",{style:{padding:"10px 14px"},children:t.allowlistView.type}),e("th",{style:{padding:"10px 14px"},children:t.allowlistView.description}),e("th",{style:{padding:"10px 14px",textAlign:"right"},children:t.allowlistView.actions})]})}),a("tbody",{children:[o.allowlist.map(m=>a("tr",{style:{borderBottom:"1px solid #f1f5f9"},"data-testid":`allowlist-row-${m.id}`,children:[a("td",{style:{padding:"10px 14px",color:"#64748b"},children:["#",m.id]}),e("td",{style:{padding:"10px 14px",fontWeight:600,color:"#0f172a",fontFamily:"monospace"},children:m.pattern}),e("td",{style:{padding:"10px 14px"},children:e("span",{style:{fontSize:"0.75rem",padding:"2px 8px",borderRadius:"10px",backgroundColor:m.type==="email"?"#e0f2fe":"#fef3c7",color:m.type==="email"?"#0369a1":"#b45309",fontWeight:600},children:m.type==="email"?t.allowlistView.emailTypeShort:t.allowlistView.domainTypeShort})}),e("td",{style:{padding:"10px 14px",color:"#475569"},children:m.description||"-"}),e("td",{style:{padding:"10px 14px",textAlign:"right"},children:m.readOnly?e("span",{"data-testid":`readonly-allowlist-${m.id}`,style:{fontSize:"0.75rem",color:"#94a3b8"},children:t.allowlistView.readOnly}):e("button",{type:"button",onClick:()=>x(m.id),"data-testid":`remove-allowlist-btn-${m.id}`,style:{padding:"3px 8px",borderRadius:"4px",border:"1px solid #fee2e2",backgroundColor:"#fff5f5",color:"#b91c1c",fontSize:"0.78rem",cursor:"pointer"},children:"\u524A\u9664"})})]},m.id)),o.allowlist.length===0&&e("tr",{children:e("td",{colSpan:5,style:{padding:"2rem",textAlign:"center",color:"#94a3b8"},children:t.allowlistView.empty})})]})]})})]})}var K={users:E,groups:W,group_members:$,allowlist:q};function ne({renderHeader:o}={}){let t=U()?.segment??"users",p=K[t]??E;return e(M,{renderHeader:o,children:e(p,{})})}export{q as AllowlistView,ne as AuthUserAdminAppView,$ as GroupMembersView,W as GroupsView,M as UserAdminShell,E as UsersView,Q as createInMemoryUserAdminStore,J as createUserAdminApp,A as defaultUserAdminLabels,O as jaUserAdminLabels,P as resolveUserAdminLabels};
2
2
  //# sourceMappingURL=admin.mjs.map