| Current Path : /snap/lxd/current/share/lxd-ui/assets/ |
| Current File : //snap/lxd/current/share/lxd-ui/assets/PermissionGroups-CbJ_q7B_.js |
import{u as Be,au as ce,v as X,d as a,r as C,b as fe,j as e,T,z as de,x as O,a9 as Oe,em as Y,e as Z,ew as be,eB as U,R as ee,O as qe,eC as ze,eD as ye,P as He,V as Ke,J as ue,eE as xe,cx as Ue,y as je,s as J,f as Ne,h as Se,k as ve,p as te,eq as oe,w as ae,eo as Ye,bu as Qe,H as Ve,b3 as Je}from"./index-BsQN_SZU.js";import{S as re}from"./SelectableMainTable-DBx4rRiq.js";import{S as We}from"./SelectedTableNotification-BpePAhdG.js";import{u as le}from"./useSortTableData-DkMx8bMp.js";import{u as z,p as ie}from"./usePanelParams-CNAJZsSX.js";import{P as V}from"./PageHeader-BkhUaI4-.js";import{H as Xe}from"./HelpLink-BJF9zWZL.js";import{d as Ze,c as et,r as tt,a as me,u as nt}from"./useAuthGroups-D8vRxz3-.js";import{L as Ie,u as Ce,G as st,S as it,A as ot,Q as at,i as rt,P as lt}from"./GroupOrIdentityChangesTable-BL03ROPA.js";import{A as ct}from"./AutoExpandingTextArea-Bd-45rZK.js";import{F as pe,B as dt}from"./FormLink-3uUdaYvf.js";import{g as ut}from"./images-dZFGKb1g.js";import{P as mt}from"./PermissionGroupsFilter-CX61qN2q.js";import{u as pt,M as ht}from"./ModifiedStatusAction-BFtE1DQS.js";import"./searchAndFilter-DtC_P-vv.js";const Q=()=>{const{isFineGrained:t}=Be();return{canDeleteGroup:o=>ce(t,"can_delete",o?.access_entitlements),canEditGroup:o=>ce(t,"can_edit",o?.access_entitlements)}},we=({groups:t,close:n})=>{const s=X(),o=a.useNotify(),i=a.useToastNotification(),[u,f]=C.useState(!0),[l,c]=C.useState(!1),h="confirm-delete-group",{canDeleteGroup:j}=Q(),{data:g}=fe(),I=g?.auth_user_name??"",v=[],y=[];let r=!1;t.forEach(d=>{j(d)?(d.identities?.oidc?.includes(I)&&(r=!0),d.identities?.tls?.includes(I)&&(r=!0),y.push(d)):v.push(d)});const b=y.length===1,P=d=>{f(d.target.value!==h)},x=()=>{c(!0);const m=y.length===1?e.jsxs(e.Fragment,{children:["Group"," ",e.jsx(de,{bold:!0,type:"auth-group",value:y[0].name})," ","deleted."]}):`${y.length} groups deleted.`;Ze(y.map(S=>S.name)).then(()=>{s.invalidateQueries({predicate:S=>[O.identities,O.authGroups].includes(S.queryKey[0])}),i.success(m),n()}).catch(S=>{o.failure(`Failed deleting ${y.length} ${T("group",y.length)}.`,S)}).finally(()=>{c(!1)})},w=()=>{const d=v.length?e.jsxs(e.Fragment,{children:[e.jsxs("li",{className:"p-list__item",children:["-"," ",`${y.length} ${T("group",y.length)} will be deleted.`]}),e.jsxs("li",{className:"p-list__item",children:["-"," ",`${v.length} ${T("group",v.length)} that you do not have permission to delete will be ignored.`]})]}):null,m=b?e.jsxs(e.Fragment,{children:[" ","the group"," ",e.jsx(de,{type:"auth-group",value:y[0].name,bold:!0})]}):e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:y.length})," ",T("group",y.length)]});return e.jsxs(e.Fragment,{children:[d&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{children:[e.jsx("b",{children:t.length})," ",T("group",t.length)," ","selected:"]}),e.jsx("ul",{className:"p-list",children:d})]}),e.jsxs("p",{className:"u-no-padding--top",children:["This will permanently delete ",m,".",`
`,"This action cannot be undone and may result in users losing access to LXD, including the possibility that all users lose admin access."]}),r&&e.jsx("div",{className:"u-sv1",children:e.jsx(Ie,{isVisible:r})}),e.jsx("p",{children:"To continue, please type the confirmation text below."}),e.jsx("p",{children:e.jsx("strong",{children:h})})]})};return e.jsx(a.Modal,{title:"Confirm group deletion",className:"delete-group-confirm-modal",close:n,buttonRow:[e.jsx("span",{className:"u-float-left confirm-input",children:e.jsx(a.Input,{id:"confirm-delete-group-input",name:"confirm-delete-group-input",type:"text",onChange:P,placeholder:h,className:"u-no-margin--bottom",disabled:!y.length})},"confirm-input"),e.jsxs(a.ActionButton,{appearance:"negative",className:"u-no-margin--bottom",onClick:x,loading:l,disabled:u||l,children:["Permanently delete ",y.length," ",T("group",y.length)]},"confirm-action-button")],children:w()})},gt=({group:t})=>{const n=z(),{openPortal:s,closePortal:o,isOpen:i,Portal:u}=a.usePortal(),{canDeleteGroup:f,canEditGroup:l}=Q();return e.jsxs(e.Fragment,{children:[e.jsx(a.List,{inline:!0,className:"u-no-margin--bottom actions-list",items:[e.jsx(a.Button,{appearance:"base",dense:!0,hasIcon:!0,onClick:()=>{n.openEditGroup(t.name)},type:"button",title:l(t)?"Edit group":"Edit group - You do not have permission to edit this group",disabled:!l(t),children:e.jsx(a.Icon,{name:"edit"})},"edit"),e.jsx(a.Button,{appearance:"base",dense:!0,hasIcon:!0,onClick:s,type:"button",title:f(t)?"Delete group":"Delete group - You do not have permission to delete this group",disabled:!f(t),children:e.jsx(a.Icon,{name:"delete"})},"delete")]}),i&&e.jsx(u,{children:e.jsx(we,{groups:[t],close:o})})]})},Ge=({formik:t,setSubForm:n,identityCount:s,identityModifyCount:o,permissionCount:i,permissionModifyCount:u,isEditing:f=!0,group:l})=>{const{canEditGroup:c}=Q(),h=r=>({id:r,name:r,onBlur:t.handleBlur,onChange:t.handleChange,value:t.values[r]??"",error:t.touched[r]?t.errors[r]:null,placeholder:`Enter ${r.replaceAll("_"," ")}`}),j=!f||c(l)?"":"You do not have permission to modify this group",g=!t.values.name||!!t.errors.name,I=!!j||g,y=(()=>{if(j)return j;if(g)return"Enter a valid group name first"})();return e.jsxs(a.Form,{onSubmit:t.handleSubmit,children:[e.jsx(a.Input,{type:"submit",hidden:!0,value:"Hidden input"}),e.jsx(a.Input,{...h("name"),type:"text",label:"Name",required:!0,autoFocus:!0,disabled:!!j,title:j}),e.jsx(ct,{...h("description"),label:"Description",disabled:I,title:y}),e.jsx(pe,{title:(f?"Edit ":"Add ")+T("identity",2),icon:"user-group",onClick:()=>{n("identity")},isModified:o>0,subText:s===0?`No ${T("identity",2)}`:`${s} ${T("identity",s)}`,disabled:I,onHoverText:y}),e.jsx(pe,{title:(f?"Edit ":"Add ")+T("permission",2),icon:"lock-locked",onClick:()=>{n("permission")},isModified:u>0,subText:i===0?`No ${T("permission",2)}`:`${i} ${T("permission",i)}`,disabled:I,onHoverText:y})]})},Re=(t,n)=>["deduplicate","A group with this name already exists",async s=>n&&s===n||Oe(s,"",t,"auth/groups")],ft=(t,n)=>{const s=t.length,o=[],i=[],u=[];for(const f of n){let l=0;const c=new Set(f.groups||[]);for(const g of t)c.has(g.name)&&l++;const h=l===s,j=!h&&l>0;if(h){o.push(f.id);continue}if(j){i.push(f.id);continue}u.push(f.id)}return{identityIdsInAllGroups:o,identityIdsInSomeGroups:i,identityIdsInNoGroups:u}},Pe=(t,n,s)=>t.filter(i=>n.has(i.id)||s.has(i.id)),Ee=(t,n,s,o)=>{const i=new Set(t),u=new Set(n),f=new Set(s.map(c=>c.name)),l={};for(const c of o){const h=c.groups||[],j=new Set(h);for(const g of h)u.has(c.id)&&f.has(g)&&j.delete(g);for(const g of s)i.has(c.id)&&j.add(g.name);l[c.id]=Array.from(j)}return l},bt=(t,n,s,o)=>{const i=Pe(t,s,o),u=Ee(s,o,n,i),f={};for(const l of i){const c=u[l.id];if(!c)continue;const h=new Set,j=new Set,g=new Set(l.groups);for(const v of c)g.has(v)||h.add(v);const I=new Set(c);for(const v of l.groups||[])I.has(v)||j.add(v);(h.size||j.size)&&(f[l.id]={added:h,removed:j,name:Y(l)})}return f},Le=({selected:t,setSelected:n,groupName:s,group:o})=>{const i=a.useNotify(),[u,f]=C.useState(null),{data:l=[],error:c}=Z(),{canEditIdentity:h}=Ce(),j=l.filter(d=>!h(d)).map(d=>d.id);c&&i.failure("Loading details failed",c);const g=l.filter(d=>!be(d)),I=new Set(U(o)),v=I.size>0,y=d=>{if(j.includes(d))return;const m=t.find(S=>S.id===d);if(m){const S=t.filter(B=>B.id!==d),L={...m,isAdded:!m.isAdded,isRemoved:!m.isRemoved},$=m.groups?.includes(s);if(L.isRemoved&&!$){n(S);return}L.isAdded=!$,n([...S,L])}else{const S=l.find(L=>L.id===d);if(!S){i.failure("Selection failed",new Error("Identity not found"));return}n([...t,{...S,isAdded:!0,isRemoved:!1}])}},r=d=>{if(d.length===0){const S=[];t.forEach(L=>{L.groups?.includes(s)&&S.push({...L,isAdded:!1,isRemoved:!0})}),n(S);return}const m=l.filter(S=>d.includes(S.id)).map(S=>({...S,isAdded:!S.groups?.includes(s),isRemoved:!1}));n(m)},b=[{content:"Identity",sortKey:"name"},{content:"","aria-label":"Modified status",className:"modified-status"}],x=g.filter(d=>u?Y(d).toLowerCase().includes(u.toLowerCase()):!0).map(d=>{const m=()=>{y(d.id)},S=t.find(D=>D.id===d.id),L=S?.isAdded||S?.isRemoved,$=Y(d);return{key:d.id,name:d.id,className:"u-row",columns:[{content:$,role:"rowheader","aria-label":"Identity",title:h(d)?$:"You do not have permission to allocate this identity to the group",onClick:m,className:"clickable-cell"},{content:L&&e.jsx(a.Icon,{name:"status-in-progress-small"}),role:"cell","aria-label":"Modified status",className:"modified-status u-align--right"}],sortData:{name:$.toLowerCase(),isPreselected:I.has(d.id)}}}),{rows:w}=le({rows:x,defaultSort:v?"isPreselected":"name",defaultSortDirection:v?"descending":"ascending"});return e.jsxs(e.Fragment,{children:[e.jsx(a.SearchBox,{onChange:d=>{f(d)}}),e.jsx(a.ScrollableTable,{dependencies:[l,t,i.notification],tableId:"group-identities-table",belowIds:["panel-footer"],children:e.jsx(re,{id:"group-identities-table",headers:b,rows:w,sortable:!0,emptyStateMsg:"No identities found",itemName:"identity",parentName:"server",selectedNames:t.filter(d=>!d.isRemoved).map(d=>d.id),setSelectedNames:r,disabledNames:j,filteredNames:g.map(d=>d.id),indeterminateNames:[],onToggleRow:y,hideContextualMenu:!0,disableSelectAll:!!j.length})})]})},yt=async t=>{const n=new URLSearchParams;return n.set("entity-type",t),fetch(`${ee}/1.0/auth/permissions?${n.toString()}`).then(qe).then(s=>s.metadata.sort((o,i)=>o.url===i.url?o.entitlement===i.entitlement?o.entity_type.localeCompare(i.entity_type):o.entitlement.localeCompare(i.entitlement):o.url.localeCompare(i.url)))},xt=({resource:t})=>{const s=Me(t.type).map(o=>{let i=t[o]||"-";return Array.isArray(i)&&(i=i.join(", ")||"-"),e.jsx("span",{title:i,className:"resource u-truncate",children:i},o)});return e.jsx("div",{className:"label",children:s})},jt=({entitlement:t,description:n})=>e.jsxs("div",{className:"label",children:[e.jsx("span",{title:t,className:"entitlement u-truncate",children:t}),e.jsx("span",{title:n,className:"entitlement-description u-truncate u-text--muted",children:n})]});var he=ze();const Nt={disabled:!0,label:"None available",value:""},Ae=[{value:"server",label:"Server"},{value:"identity",label:"Identity"},{value:"group",label:"Group"},{value:"certificate",label:"Certificate"},{value:"project",label:"Project"},{value:"profile",label:"Profile"},{value:"instance",label:"Instance"},{value:"image",label:"Image"},{value:"image_alias",label:"Image alias"},{value:"storage_pool",label:"Storage pool"},{value:"storage_volume",label:"Storage volume"},{value:"storage_bucket",label:"Storage bucket"},{value:"network",label:"Network"},{value:"network_acl",label:"Network ACL"},{value:"network_zone",label:"Network zone"}],W=(t,n)=>{const s=he.getOptionText(t)||t.value,o=he.getOptionText(n)||n.value;return s.localeCompare(o)},St=t=>{if(!t||!t.entities)return Ae.sort(W);const n=[],s=Object.keys(t.entities);for(const o of s){const i=o.split("_");i[0]=He(i[0]),n.push({value:o,label:i.join(" ")})}return n},vt=(t,n,s,o)=>{if(!n.length||!t)return[];const i=[],u=new Set;for(const f of n){const l=ye(t,f.url,s,o),c=Te(l);u.has(c)||(u.add(c),i.push({value:f.url,label:e.jsx(xt,{resource:l}),text:c}))}return i.sort(W),i},It=(t,n)=>{const s={},o=t.entities[n].entitlements;for(const i of o)s[i.name]=i.description;return s},Ct=(t,n,s)=>{if(!n||!t)return[];const o=n[0].url,i=[],u=[];for(const l of n){if(l.url!==o)continue;const c={value:l.entitlement,label:l.entitlement};if(l.entitlement.includes("can_")){u.push({...c});continue}i.push({...c})}i.sort(W),u.sort(W),i.length>1&&u.length&&(i.unshift({disabled:!0,label:"Built-in roles",value:"group"}),u.unshift({disabled:!0,label:"Granular entitlements",value:"group"}));const f=[...i,...u];if(s&&s.entities){const l=It(s,t);for(const c of f)c.value&&typeof c.value=="string"&&l[c.value]&&(c.text=c.value,c.label=e.jsx(jt,{entitlement:c.value,description:l[c.value]})),c.value==="group"&&(c.label=e.jsx("div",{className:"header u-no-padding",children:e.jsx("span",{className:"u-no-margin",children:e.jsx("h5",{className:"u-no-margin u-no-padding",children:c.label})})}))}return[...i,...u]},Te=t=>{const n=t.project?` (project: ${t.project}) `:"",s=t.target?` (target: ${t.target}) `:"",o=t.pool?` (pool: ${t.pool}) `:"",i=t.aliases?` (aliases: ${t.aliases.join(", ")}) `:"",u=t.fingerprint?` (fingerprint: ${t.fingerprint}) `:"";return`${t.name}${s}${o}${n}${i}${u}`},ne=t=>t.entity_type+t.url+t.entitlement,wt=t=>t.map(n=>ne(n)),ke=(t,n,s)=>{const o=ye(t.entity_type,t.url,n,s);return Te(o)},Fe=t=>{const n={};for(const s of t)n[s.fingerprint]={...s,name:`${ut(s)} (${s.type})`};return n},$e=t=>{const n={};for(const s of t)n[s.id]=Y(s);return n},Gt=()=>{const t={};return Ae.forEach((n,s)=>{t[n.value]=s}),t},ge=Gt(),Rt=(t,n)=>{const s=ge[t.entity_type]-ge[n.entity_type],o=t.resourceLabel?.localeCompare(n.resourceLabel??""),i=t.entitlement.localeCompare(n.entitlement);return s||o||i},Me=t=>{const n={image:["description","aliases","fingerprint","imageType","project"],image_alias:["name","project"],instance:["name","project"],network:["name","project"],network_acl:["name","project"],network_zone:["name","project"],profile:["name","project"],storage_bucket:["name","project"],storage_volume:["name","pool","project"],default:["name"]};return n[t]??n.default},Pt=({resourceType:t})=>{const n=Me(t);if(n.length<2)return null;const s=n.map(o=>e.jsx("span",{className:"resource u-no-margin--bottom",children:o==="imageType"?"image type":o},o));return e.jsx("div",{className:"header",children:s})},Et=({onAddPermission:t,disableReason:n})=>{const s=a.useNotify(),[o,i]=C.useState(""),[u,f]=C.useState(""),[l,c]=C.useState(""),{hasMetadataConfiguration:h,hasEntityTypeMetadata:j}=Ke(),g=C.useRef(null),I=C.useRef(null),v=C.useRef(null),y=C.useRef(null),{data:r,isLoading:b,error:P}=ue({queryKey:[O.permissions,o],queryFn:async()=>yt(o),enabled:!!o&&!n}),{data:x=[]}=xe(),{data:w=[]}=Z(),d=Fe(x),m=$e(w),{data:S,isLoading:L}=ue({queryKey:[O.configOptions],queryFn:async()=>Ue(h)}),$=b||L;C.useEffect(()=>{setTimeout(()=>{g.current&&(g.current.focus(),g.current.tabIndex=-1)},100)},[]);const D=(A,p,R)=>{if(p==="server")return y.current?.open(),p;if(!A&&p||A&&p===A){if(R?.length)return v.current?.open(),p;I.current?.focus()}return p};C.useEffect(()=>{D("",o,r)},[o,r]);const B=A=>{const p=A;c(""),i(R=>D(R,p,r)),f(p==="server"?"/1.0":"")},G=A=>{f(A),y.current?.open()},H=A=>{c(A),document.getElementById("add-entitlement")?.focus()},_=()=>{const A={entity_type:o,url:u,entitlement:l};t({...A,id:ne(A),resourceLabel:ke(A,d,m)}),c("")};P&&s.failure("Loading permissions failed",P);const N=vt(o,r??[],d,m),k=Ct(o,r,j?S:null),E=o==="server",F=N.length;return e.jsxs("div",{className:"permission-selector",tabIndex:0,ref:g,title:n,children:[e.jsx(a.CustomSelect,{id:"resourceType",name:"resourceType",label:e.jsx("strong",{children:"Resource Type"}),options:St(S),toggleClassName:"u-no-margin--bottom","aria-label":"Resource type",onChange:B,value:o,selectRef:I,searchable:"always",disabled:!!n}),e.jsx(a.CustomSelect,{id:"resource",name:"resource",label:e.jsx("strong",{children:"Resource"}),options:F?N:[Nt],toggleClassName:"u-no-margin--bottom","aria-label":"Resource",onChange:G,value:u,disabled:$||!o||E||!F,dropdownClassName:"permissions-select-dropdown",header:e.jsx(Pt,{resourceType:o}),selectRef:v,searchable:"always"}),e.jsx(a.CustomSelect,{id:"entitlement",name:"entitlement",label:e.jsx("strong",{children:"Entitlement"}),options:k,toggleClassName:"u-no-margin--bottom","aria-label":"Entitlement",onChange:H,value:l,disabled:$||!u&&!E,dropdownClassName:"permissions-select-dropdown",selectRef:y,searchable:"always",initialPosition:"right"}),e.jsx("div",{className:"add-entitlement",children:e.jsx(a.Button,{id:"add-entitlement",appearance:"positive",onClick:_,className:"u-no-margin--bottom",disabled:!l,tabIndex:l?void 0:-1,children:"Add"})})]})},De=({permissions:t,setPermissions:n,group:s})=>{const o=a.useNotify(),[i,u]=C.useState(""),{canViewPermissions:f}=je(),{canEditGroup:l}=Q(),c=()=>s&&!l(s)?"You do not have permission to edit this group":f()?"":"You are not allowed to view permissions",h=r=>{const b=t.find(d=>d.id===r.id);if(b&&!b.isRemoved)return;const x=wt(s?.permissions??[]).includes(r.id??""),w={...r,isAdded:!x,isRemoved:!1};if(b&&b.isRemoved){const d=t.map(m=>m.id===r.id?w:m);n(d);return}b||n([...t,w])},j=r=>{let b;s?.permissions?.some(x=>ne(x)===r)?b=t.map(x=>x.id===r?{...x,isRemoved:!0,isAdded:!1}:x):b=t.filter(x=>x.id!==r),n(b)},g=i?t.filter(r=>r.entitlement.includes(i)||r.entity_type.includes(i)||r.resourceLabel?.toLowerCase().includes(i)):t,I=C.useMemo(()=>g.sort(Rt),[g]),v=[{content:"Resource type",sortKey:"resourceType",className:"resource-type"},{content:"Resource",sortKey:"resource",className:"resource"},{content:"Entitlement",sortKey:"entitlement",className:"entitlement"},{"aria-label":"Actions",className:"u-align--right actions"}],y=I.map(r=>{const b=r.isAdded||r.isRemoved;return{key:r.id,name:r.id,className:J("u-row",{strikeout:r.isRemoved}),columns:[{content:r.entity_type,title:r.entity_type,role:"rowheader","aria-label":"Resource type",className:"resource-type"},{content:r.resourceLabel,role:"cell","aria-label":"Resource",className:"u-truncate resource",title:r.resourceLabel},{content:r.entitlement,role:"cell","aria-label":"Entitlement",className:"u-truncate entitlement",title:r.entitlement},{className:"actions u-align--right",content:e.jsxs(e.Fragment,{children:[r.isRemoved?e.jsx(a.Button,{appearance:"base",hasIcon:!0,dense:!0,onClick:()=>{h(r)},type:"button","aria-label":"Restore permission",title:"Restore permission",className:"u-no-margin--right",children:e.jsx(a.Icon,{name:"restart",className:"u-no-margin--right"})}):e.jsx(a.Button,{appearance:"base",hasIcon:!0,dense:!0,onClick:()=>{j(r.id??"")},type:"button","aria-label":"Delete permission",title:c()??"Delete permission",className:"u-no-margin--right",disabled:!!c(),children:e.jsx(a.Icon,{name:"delete",className:"u-no-margin--right"})}),e.jsx(a.Icon,{name:"status-in-progress-small",className:J({"hide-modified-status":!b}),"aria-hidden":!b,"aria-label":"Permission modified"})]}),role:"cell","aria-label":"Delete permission"}],sortData:{resourceType:r.entity_type.toLowerCase(),resource:r.resourceLabel?.toLowerCase(),entitlement:r.entitlement.toLowerCase()}}});return e.jsxs(a.ScrollableContainer,{dependencies:[o.notification,t.length],belowIds:["panel-footer"],children:[e.jsxs(a.Card,{children:[e.jsx("strong",{children:e.jsx("p",{className:"u-no-margin--bottom",children:"Add permissions"})}),e.jsx("span",{children:"Entitlements need to be given in relation to a specific resource. Select the appropriate resource and entitlement below and add it to the list of permissions for this group."}),e.jsx(Et,{onAddPermission:h,disableReason:c()})]}),e.jsx(a.SearchBox,{externallyControlled:!0,value:i,onChange:u}),t.length?e.jsx(a.MainTable,{id:"permissions-table",headers:v,sortable:!0,responsive:!0,emptyStateMsg:"No permissions match the search criteria.",rows:y,className:"permissions-table"}):e.jsx(a.EmptyState,{className:"empty-state empty-state__full-width",image:e.jsx(a.Icon,{name:"plans",className:"empty-state-icon"}),title:"No permissions",children:e.jsx("p",{children:"Select a permission above and add to the group"})})]})},_e=({subForm:t,setSubForm:n,group:s})=>{if(t===null)return s?`Edit auth group ${s?.name}`:"Create auth group";const o=s?"Edit":"Add";return e.jsx(dt,{linkText:s?"Edit auth group":"Create auth group",title:`${o} ${T(t,2)}`,onClick:()=>{n(null)}})},Lt=()=>{const t=z(),n=a.useNotify(),s=a.useToastNotification(),o=X(),i=C.useState(null),[u,f]=C.useState([]),[l,c]=C.useState([]),h=t.subForm,j=b=>{t.openCreateGroup(b)},g=()=>{t.clear(),n.clear()},I=Ne().shape({name:Se().test(...Re(i)).required("Group name is required")}),v=b=>{s.success(e.jsxs(e.Fragment,{children:["Group"," ",e.jsx(ae,{type:"auth-group",value:b,to:`${ee}/ui/permissions/groups`})," ","created."]})),g()},y=b=>{if(u.length===0){v(b);return}const P=u.map(x=>{const w=x.groups||[];return x.groups=[...w,b],x});oe(P).then(()=>{v(b)}).catch(x=>{n.failure(`Group ${b} created, failed to add identities.`,x)}).finally(()=>{r.setSubmitting(!1),o.invalidateQueries({queryKey:[O.authGroups]})})},r=ve({initialValues:{name:"",description:""},validationSchema:I,onSubmit:b=>{et({name:b.name,description:b.description,permissions:l.filter(P=>!P.isRemoved)}).then(()=>{y(b.name)}).catch(P=>{n.failure("Group creation failed",P)}).finally(()=>{r.setSubmitting(!1),o.invalidateQueries({queryKey:[O.authGroups]})})}});return e.jsx(e.Fragment,{children:e.jsxs(a.SidePanel,{className:J({"edit-permissions-panel":h==="permission"}),children:[e.jsx(a.SidePanel.Header,{children:e.jsx(a.SidePanel.HeaderTitle,{children:e.jsx(_e,{subForm:h,setSubForm:j})},h??"start")}),e.jsx(te,{className:"u-no-padding"}),e.jsx(a.SidePanel.Content,{className:"u-no-padding",children:e.jsxs(a.ScrollableContainer,{dependencies:[n.notification,h],belowIds:["panel-footer"],children:[h===null&&e.jsx(Ge,{formik:r,setSubForm:j,identityCount:u.length,identityModifyCount:u.length,permissionCount:l.length,permissionModifyCount:l.length,isEditing:!1}),h==="identity"&&e.jsx(Le,{selected:u,setSelected:f,groupName:r.values.name}),h==="permission"&&e.jsx(De,{permissions:l,setPermissions:c})]})}),e.jsxs(a.SidePanel.Footer,{className:"u-align--right",children:[e.jsx(a.Button,{appearance:"base",onClick:g,className:"u-no-margin--bottom",children:"Cancel"}),e.jsx(a.ActionButton,{appearance:"positive",loading:r.isSubmitting,onClick:()=>{r.submitForm()},className:"u-no-margin--bottom",disabled:!r.isValid||r.isSubmitting||!r.values.name,children:"Create group"})]})]})})},At=({group:t,onClose:n})=>{const s=z(),o=a.useNotify(),i=a.useToastNotification(),u=X(),f=C.useState(null),[l,c]=C.useState(!1),[h,j]=C.useState(U(t).map(N=>({id:N}))),[g,I]=C.useState(t.permissions??[]),{data:v}=fe(),y=v?.auth_user_name??"",{canEditGroup:r}=Q(),b=s.subForm,P=N=>{s.openEditGroup(s.group??"",N)},{data:x=[],isLoading:w,isError:d}=Z();C.useEffect(()=>{if(!w&&!d){const N=new Set(U(t)),M=x.filter(k=>N.has(k.id));j(M)}},[w,d,x,t]);const{data:m=[],isLoading:S,isError:L}=xe();C.useEffect(()=>{if(!w&&!d&&!S&&!L){const N=Fe(m),M=$e(x),k=(t.permissions??[]).map(E=>{const F=ne(E),A=ke(E,N,M);return{...E,resourceLabel:A,id:F}});I(k)}},[w,d,S,L,x,m,t]);const $=Ne().shape({name:Se().test(...Re(f,s.group??"")).required("Group name is required")}),D=async()=>{const N=h.filter(E=>E.isAdded),M=h.filter(E=>E.isRemoved);if(N.length===0&&M.length===0)return;const k=[];return N.map(E=>{k.push({...E,groups:[...E.groups||[],G.values.name]})}),M.map(E=>{k.push({...E,groups:[...(E.groups||[]).filter(F=>F!==G.values.name)]})}),oe(k)},B=N=>{const M=N.name!==t?.name,k={...t,name:N.name,description:N.description,permissions:g.filter(F=>!F.isRemoved)};(async()=>r(t)?M?tt(t?.name??"",N.name).then(async()=>me(k)).then(D):me(k).then(D):D())().then(()=>{H(),i.success(e.jsxs(e.Fragment,{children:["Auth group"," ",e.jsx(ae,{type:"auth-group",value:N.name,to:`${ee}/ui/permissions/groups`})," ","updated."]}))}).catch(F=>{o.failure("Group update failed",F)}).finally(()=>{G.setSubmitting(!1),u.invalidateQueries({queryKey:[O.authGroups]})})},G=ve({initialValues:{name:t?.name??"",description:t?.description??""},enableReinitialize:!0,validationSchema:$,onSubmit:N=>{const M=U(t).includes(y),k=h.find(F=>F.id===y)?.isRemoved,E=g.find(F=>F.isRemoved);k||M&&E?c(!0):B(N)}}),H=()=>{s.clear(),o.clear(),n?.()},_=h.filter(N=>N.isAdded||N.isRemoved).length+g.filter(N=>N.isAdded||N.isRemoved).length+(G.values.name!==t.name?1:0)+(G.values.description!==t.description?1:0);return e.jsxs(e.Fragment,{children:[e.jsxs(a.SidePanel,{className:J({"edit-permissions-panel":b==="permission"}),children:[e.jsx(a.SidePanel.Header,{children:e.jsx(a.SidePanel.HeaderTitle,{className:"u-truncate",children:e.jsx(_e,{subForm:b,setSubForm:P,group:t})},b??"start")}),e.jsx(te,{className:"u-no-padding"}),e.jsxs(a.SidePanel.Content,{className:"u-no-padding",children:[b===null&&e.jsx(a.ScrollableContainer,{dependencies:[o.notification,b],belowIds:["panel-footer"],children:e.jsx(Ge,{formik:G,setSubForm:P,identityCount:h.filter(N=>!N.isRemoved).length,identityModifyCount:h.filter(N=>N.isAdded||N.isRemoved).length,permissionCount:g.filter(N=>!N.isRemoved).length,permissionModifyCount:g.filter(N=>N.isAdded||N.isRemoved).length,group:t})}),b==="identity"&&e.jsx(Le,{selected:h,setSelected:j,groupName:t.name,group:t}),b==="permission"&&e.jsx(De,{permissions:g,setPermissions:I,group:t})]}),e.jsxs(a.SidePanel.Footer,{className:"u-align--right",children:[e.jsx(a.Button,{appearance:"base",onClick:H,className:"u-no-margin--bottom",children:"Cancel"}),e.jsx(a.ActionButton,{appearance:"positive",loading:G.isSubmitting,onClick:()=>{G.submitForm()},className:"u-no-margin--bottom",disabled:!G.isValid||G.isSubmitting||!G.values.name||_===0,children:_===0?"Save changes":`Save ${_} ${T("change",_)}`})]})]}),l&&e.jsx(a.ConfirmationModal,{confirmButtonLabel:"Confirm changes",confirmButtonAppearance:"positive",onConfirm:()=>{B(G.values)},close:()=>{c(!1),G.setSubmitting(!1)},title:"Confirm permission modification",className:"permission-confirm-modal",children:e.jsx(Ie,{isVisible:!0})})]})},Tt=({groups:t,className:n})=>{const s=z();return e.jsx(e.Fragment,{children:e.jsxs(a.Button,{onClick:()=>{s.openGroupIdentities()},"aria-label":"Manage identities",title:"Manage identities",className:n,disabled:!t.length,hasIcon:!0,children:[e.jsx(a.Icon,{name:"user-group"}),e.jsx("span",{children:"Manage identities"})]})})},kt=({onConfirm:t,close:n,addedIdentities:s,removedIdentities:o,selectedGroups:i,allIdentities:u})=>{const[f,l]=C.useState(!1),c=a.useNotify(),h=z(),j=X(),g=a.useToastNotification(),I=bt(u,i,s,o),v=Ye(I),y=()=>{l(!0);const r=Pe(u,s,o),b=Ee(s,o,i,r),P=r.map(x=>({...x,groups:b[x.id]}));oe(P).then(()=>{j.invalidateQueries({predicate:d=>[O.identities,O.authGroups].includes(d.queryKey[0])});const x=Object.keys(v),w=x.length>1?`Updated identities for ${x.length} groups`:e.jsxs(e.Fragment,{children:["Updated identities for"," ",e.jsx(ae,{type:"auth-group",value:x[0],to:`${ee}/ui/permissions/groups`})]});g.success(w),h.clear(),c.clear()}).catch(x=>{c.failure("Update groups failed",x)}).finally(()=>{l(!1),t()})};return e.jsx(a.ConfirmationModal,{confirmButtonLabel:"Confirm changes",confirmButtonAppearance:"positive",onConfirm:y,close:n,title:"Confirm modification",className:"permission-confirm-modal",confirmButtonLoading:f,children:e.jsx(st,{identityGroupsChangeSummary:I,groupIdentitiesChangeSummary:v,identities:u,initialGroupBy:"group"})})},Ft=({groups:t})=>{const n=z(),[s]=Qe(),o=a.useNotify(),[i,u]=C.useState(!1),{data:f=[],error:l,isLoading:c}=Z(),{canEditIdentity:h}=Ce(),j=f.filter(p=>!h(p)),{desiredState:g,save:I,undo:v}=pt({initialState:{identitiesAdded:new Set,identitiesRemoved:new Set}});l&&o.failure("Loading panel details failed",l),C.useEffect(()=>{if(!t.length){n.clear();return}},[t]);const y=f.filter(p=>!be(p)),{identityIdsInAllGroups:r,identityIdsInNoGroups:b,identityIdsInSomeGroups:P}=ft(t,y),x=new Set(g.identitiesAdded);for(const p of r)g.identitiesRemoved.has(p)||x.add(p);const w=new Set(P.filter(p=>!x.has(p)&&!g.identitiesRemoved.has(p))),d=new Set;t.forEach(p=>{U(p).forEach(R=>d.add(R))});const m=d.size>0,S=()=>{const p=new Set;for(const R of r)x.has(R)||p.add(R);for(const R of P)w.has(R)||p.add(R);for(const R of b)x.has(R)&&p.add(R);return p},L=(p,R)=>{I(R?{identitiesAdded:new Set,identitiesRemoved:new Set(y.map(K=>K.id))}:{identitiesAdded:new Set(p),identitiesRemoved:new Set})},$=p=>{const R=x.has(p),K=w.has(p),q=new Set(g.identitiesAdded),se=new Set(g.identitiesRemoved);R||K?(q.delete(p),se.add(p)):(q.add(p),se.delete(p)),I({identitiesAdded:q,identitiesRemoved:se})},D=()=>{n.clear(),o.clear(),u(!1)},B=()=>{o.clear(),u(!1)},G=S(),H=[{content:"Identity",sortKey:"name"},{content:"","aria-label":"Modified status",className:"modified-status"}],_={queries:s.getAll(at),authMethod:s.getAll(ot),systemIdentities:s.get(it)},M=y.filter(p=>!(_.systemIdentities==="hide"&&rt(p)||!_.queries.every(R=>Y(p).toLowerCase().includes(R)||p.id.toLowerCase().includes(R))||_.authMethod.length>0&&!_.authMethod.includes(p.authentication_method))).map(p=>{const R=t.length>1?"all selected groups":`group ${t[0].name}`,K=g.identitiesAdded.has(p.id)?`Identity will be added to ${R}`:g.identitiesRemoved.has(p.id)?`Identity will be removed from ${R}`:"",q=Y(p);return{key:p.id,name:p.id,className:"u-row",columns:[{content:q,role:"rowheader","aria-label":"Identity",title:h(p)?q:"You do not have permission to manage this identity"},{content:G.has(p.id)&&e.jsx(a.Icon,{name:"status-in-progress-small"}),role:"cell","aria-label":"Modified status",className:"modified-status u-align--right",title:K}],sortData:{name:q.toLowerCase(),isPreselected:d.has(p.id)}}}),{rows:k}=le({rows:M,defaultSort:m?"isPreselected":"name",defaultSortDirection:m?"descending":"ascending"}),E=e.jsx(a.ScrollableTable,{dependencies:[f,G.size,o.notification],tableId:"group-identities-table",belowIds:["panel-footer"],children:e.jsx(re,{id:"group-identities-table",headers:H,rows:k,sortable:!0,emptyStateMsg:"No identities found",itemName:"identity",parentName:"server",selectedNames:Array.from(x),setSelectedNames:L,disabledNames:j.map(p=>p.id),filteredNames:y.map(p=>p.id),indeterminateNames:Array.from(w),onToggleRow:$,hideContextualMenu:!0,disableSelectAll:!!j.length})}),F=G.size?`Apply ${G.size} identity ${T("change",G.size)}`:"Modify identities",A=t.length>1?`Change identities for ${t.length} groups`:`Change identities for ${t[0]?.name}`;return e.jsxs(e.Fragment,{children:[e.jsxs(a.SidePanel,{loading:c,hasError:!f,children:[e.jsx(a.SidePanel.Header,{children:e.jsx(a.SidePanel.HeaderTitle,{children:A})}),e.jsx(te,{className:"u-no-padding"}),e.jsx(lt,{}),e.jsx(a.SidePanel.Content,{className:"u-no-padding",children:e.jsx(a.ScrollableContainer,{dependencies:[G.size,o.notification],belowIds:["panel-footer"],children:E})}),e.jsxs(a.SidePanel.Footer,{className:"u-align--right",children:[G.size?e.jsx(ht,{modifiedCount:G.size,onUndoChange:v,itemName:"identity"}):null,e.jsx(a.Button,{appearance:"base",onClick:D,className:"u-no-margin--bottom",children:"Cancel"}),e.jsx(a.ActionButton,{appearance:"positive",onClick:()=>{u(!0)},className:"u-no-margin--bottom",disabled:G.size===0,children:F})]})]}),i&&e.jsx(kt,{close:B,onConfirm:B,selectedGroups:t,addedIdentities:g.identitiesAdded,removedIdentities:g.identitiesRemoved,allIdentities:y})]})},$t=({groups:t,className:n,onDelete:s})=>{const[o,i]=C.useState(!1),{canDeleteGroup:u}=Q(),f=t.filter(u),l=()=>{i(!0)},c=()=>{s(),i(!1)};return e.jsxs(e.Fragment,{children:[e.jsxs(a.Button,{onClick:l,title:f.length?"Delete groups":`You do not have permission to delete the selected ${T("group",t.length)}`,className:n,hasIcon:!0,disabled:!f.length,children:[e.jsx(a.Icon,{name:"delete"}),e.jsx("span",{children:`Delete ${t.length} ${T("group",t.length)}`})]}),o&&e.jsx(we,{groups:t,close:c})]})},Xt=()=>{const t=a.useNotify(),{data:n=[],error:s,isLoading:o}=nt(),i=z(),[u,f]=C.useState(""),[l,c]=C.useState([]),{canCreateGroups:h}=je(),j=Ve();s&&t.failure("Loading groups failed",s),C.useEffect(()=>{const m=l.filter(S=>n.some(L=>L.name===S));m.length!==l.length&&c(m)},[n]),C.useEffect(()=>{i.group&&c([i.group])},[i.group,n]);const g=[{content:"Name",className:"name",sortKey:"name"},{content:"Description",className:"description",sortKey:"description"},{content:"Identities",sortKey:"identities",className:"u-align--right identities"},{content:"Permissions",sortKey:"permissions",className:"u-align--right permissions"},{"aria-label":"Actions",className:"u-align--right actions"}],I=n.filter(m=>!u||m.name.toLowerCase().includes(u)||m.description.toLowerCase().includes(u)),v=n.filter(m=>l.includes(m.name)),y=n.find(m=>m.name===i.group),r=I.map(m=>{const S=U(m);return{key:m.name,name:m.name,className:"u-row",columns:[{content:m.name,role:"rowheader","aria-label":"Name",className:"u-truncate name",title:m.name},{content:e.jsx("span",{children:m.description}),role:"cell","aria-label":"Description",className:"description",title:m.description},{content:e.jsx(a.Button,{appearance:"link",dense:!0,onClick:()=>{i.openEditGroup(m.name,"identity")},children:S.length}),role:"cell",className:"u-align--right identities","aria-label":"Identities in this group"},{content:e.jsx(a.Button,{appearance:"link",dense:!0,onClick:()=>{i.openEditGroup(m.name,"permission")},children:m.permissions?.length||0}),role:"cell",className:"u-align--right permissions","aria-label":"Permissions for this group"},{className:"actions u-align--right",content:e.jsx(gt,{group:m}),role:"cell","aria-label":"Actions"}],sortData:{name:m.name.toLowerCase(),description:m.description.toLowerCase(),permissions:m.permissions?.length||0,identities:S.length}}}),{rows:b,updateSort:P}=le({rows:r,defaultSort:"name"});if(o)return e.jsx(a.Spinner,{className:"u-loader",text:"Loading...",isMainComponent:!0});const x=()=>l.length>0?e.jsx(We,{totalCount:n.length??0,itemName:"group",parentName:"",selectedNames:l,setSelectedNames:c,filteredNames:I.map(m=>m.name),hideActions:!!i.panel}):null,w=n.length>0,d=w?e.jsx(a.ScrollableTable,{dependencies:[n],tableId:"groups-table",belowIds:["status-bar"],children:e.jsx(a.TablePagination,{data:b,id:"pagination",itemName:"group",className:"u-no-margin--top","aria-label":"Table pagination control",description:x(),children:e.jsx(re,{id:"groups-table",className:"groups-table",headers:g,rows:b,sortable:!0,emptyStateMsg:"No groups found matching this search",onUpdateSort:P,itemName:"group",parentName:"",selectedNames:l,setSelectedNames:c,disabledNames:[],filteredNames:I.map(m=>m.name),disableSelect:!!i.panel})})}):e.jsxs(a.EmptyState,{className:"empty-state",image:e.jsx(a.Icon,{name:"user-group",className:"empty-state-icon"}),title:"No groups",children:[e.jsx("p",{children:"Groups are an easy way to manage the structured assignment of permissions"}),e.jsx("p",{children:e.jsx(Je,{docPath:"/explanation/authorization",hasExternalIcon:!0,children:"Learn more about permissions"})}),e.jsxs(a.Button,{className:"empty-state-button",appearance:"positive",onClick:()=>{i.openCreateGroup()},disabled:!h(),title:h()?"":"You do not have permission to create groups",hasIcon:!j,children:[!j&&e.jsx(a.Icon,{name:"plus",light:!0}),e.jsx("span",{children:"Create group"})]})]});return e.jsxs(e.Fragment,{children:[e.jsxs(a.CustomLayout,{mainClassName:"permission-groups-list",contentClassName:"u-no-padding--bottom",header:e.jsxs(V,{children:[e.jsxs(V.Left,{children:[e.jsx(V.Title,{children:e.jsx(Xe,{docPath:"/explanation/authorization",title:"Learn more about permissions",children:"Auth groups"})}),!l.length&&w&&e.jsx(V.Search,{children:e.jsx(mt,{onChange:f,value:u,disabled:!!i.group,className:"u-no-margin--bottom"})}),l.length>0&&!i.panel&&e.jsxs(e.Fragment,{children:[e.jsx(Tt,{groups:v,className:"u-no-margin--bottom"}),e.jsx($t,{groups:v,className:"u-no-margin--bottom",onDelete:()=>{c([])}})]})]}),w&&e.jsx(V.BaseActions,{children:!l.length&&e.jsxs(a.Button,{appearance:"positive",className:"u-no-margin--bottom u-float-right",onClick:()=>{i.openCreateGroup()},disabled:!h(),title:h()?"":"You do not have permission to create groups",hasIcon:!j,children:[!j&&e.jsx(a.Icon,{name:"plus",light:!0}),e.jsx("span",{children:"Create group"})]})})]}),children:[!i.panel&&e.jsx(te,{}),e.jsx(a.Row,{className:"permission-groups",children:d})]}),i.panel===ie.createGroup&&e.jsx(Lt,{}),i.panel===ie.editGroup&&y&&e.jsx(At,{group:y,onClose:()=>{c([])}}),i.panel===ie.groupIdentities&&!!v.length&&e.jsx(Ft,{groups:v})]})};export{Xt as default};