| Current Path : /proc/thread-self/root/snap/lxd/38450/share/lxd-ui/assets/ |
| Current File : //proc/thread-self/root/snap/lxd/38450/share/lxd-ui/assets/PlacementGroupList-2r8TtC6Y.js |
import{r as C,d as a,v as x,S,f as v,h as T,a9 as B,k as w,j as e,w as L,R,x as h,p as y,z as f,H as _,I as E,C as I,b3 as F}from"./index-BsQN_SZU.js";import{H as q}from"./HelpLink-BJF9zWZL.js";import{u as A}from"./useSortTableData-DkMx8bMp.js";import{P as g}from"./PageHeader-BkhUaI4-.js";import{U as D,V as H,W as K,X as U,u as G}from"./SshKeyForm-BNz7yPwa.js";import{u as j,p as b}from"./usePanelParams-CNAJZsSX.js";import{a as M,P as O,b as k}from"./PlacementGroupForm-BwX2oRGT.js";import{U as P}from"./UsedByRow-DlstYIKs.js";import"./limits-yeXZOxhv.js";import"./AutoExpandingTextArea-Bd-45rZK.js";import"./formFields-DzJouV_d.js";import"./scroll-Dc7Cgzms.js";import"./ProjectRichChip-DZzjTfq6.js";import"./ConfigFieldDescription-CjXKAIpa.js";import"./snapshots-LtzKNDw1.js";import"./UsedByItem-DYTdOZkC.js";import"./ExpandableList-DsGr0BpD.js";const $=()=>{const n=C.useState(null),o=j(),r=a.useNotify(),m=a.useToastNotification(),l=x(),{project:s}=S(),u=()=>{o.clear(),r.clear()},d=v().shape({name:T().test("deduplicate","A placement group with this name already exists",async c=>B(c,s?.name??"",n,"placement-groups")).matches(/^[A-Za-z0-9/\-:_.]+$/,{message:"Name can only contain alphanumeric, forward slash, hyphen, colon, underscore and full stop characters"}).required("Placement group name is required")}),t=w({initialValues:{name:"",description:"",policy:O,rigor:M},validationSchema:d,onSubmit:()=>{const c={name:t.values.name,description:t.values.description,config:{policy:t.values.policy,rigor:t.values.rigor}};D(JSON.stringify(c),s?.name??"").then(()=>{m.success(e.jsxs(e.Fragment,{children:["Placement group"," ",e.jsx(L,{type:"placement-group",value:c.name??"",to:`${R}/ui/project/${s?.name??"default"}/placement-groups/`})," ","created."]})),l.invalidateQueries({queryKey:[h.placementGroups,s?.name]}),u()}).catch(p=>{r.failure("Placement group creation failed",p),t.setSubmitting(!1)})}});return e.jsx(e.Fragment,{children:e.jsxs(a.SidePanel,{children:[e.jsx(a.SidePanel.Header,{children:e.jsx(a.SidePanel.HeaderTitle,{children:"Create placement group"})}),e.jsx(y,{className:"u-no-padding"}),e.jsx(a.SidePanel.Content,{className:"u-no-padding",children:e.jsx(a.ScrollableContainer,{dependencies:[r.notification],belowIds:["panel-footer"],children:e.jsx(k,{formik:t})})}),e.jsxs(a.SidePanel.Footer,{className:"u-align--right",children:[e.jsx(a.Button,{appearance:"base",onClick:u,className:"u-no-margin--bottom",children:"Cancel"}),e.jsx(a.ActionButton,{appearance:"positive",onClick:()=>{t.submitForm()},className:"u-no-margin--bottom",disabled:!t.isValid||t.isSubmitting||!t.values.name,loading:t.isSubmitting,children:"Create"})]})]})})},Q=({placementGroup:n})=>n?e.jsx("table",{children:e.jsxs("tbody",{children:[e.jsx(P,{entityType:"instance",usedBy:n.used_by}),e.jsx(P,{entityType:"profile",usedBy:n.used_by})]})}):null,V=()=>{const n=j(),o=a.useNotify(),r=a.useToastNotification(),m=x(),{project:l}=S(),{data:s}=H(n.group??"",l?.name??""),u=()=>{n.clear(),o.clear()},d=v().shape({name:T().required("Placement group name is required")}),t=w({initialValues:{name:s?.name,description:s?.description,policy:s?.config.policy,rigor:s?.config.rigor},enableReinitialize:!0,validationSchema:d,onSubmit:()=>{const c={name:t.values.name,description:t.values.description,config:{policy:t.values.policy,rigor:t.values.rigor}};K(c,l?.name??"").then(()=>{r.success(e.jsxs(e.Fragment,{children:["Placement group"," ",e.jsx(L,{type:"placement-group",value:c.name??"",to:`${R}/ui/project/${l?.name??"default"}/placement-groups/`})," ","updated."]})),m.invalidateQueries({queryKey:[h.placementGroups,l?.name]}),m.invalidateQueries({queryKey:[h.placementGroups,l?.name,c.name]}),u()}).catch(p=>{o.failure("Placement group update failed",p),t.setSubmitting(!1)})}});return e.jsx(e.Fragment,{children:e.jsxs(a.SidePanel,{children:[e.jsx(a.SidePanel.Header,{children:e.jsxs(a.SidePanel.HeaderTitle,{children:["Edit placement group ",s?.name]})}),e.jsx(y,{className:"u-no-padding"}),e.jsx(a.SidePanel.Content,{className:"u-no-padding",children:e.jsxs(a.ScrollableContainer,{dependencies:[o.notification],belowIds:["panel-footer"],children:[e.jsx(k,{formik:t,isEdit:!0}),e.jsx("div",{children:"Used by"}),e.jsx(Q,{placementGroup:s})]})}),e.jsxs(a.SidePanel.Footer,{className:"u-align--right",children:[e.jsx(a.Button,{appearance:"base",onClick:u,className:"u-no-margin--bottom",children:"Cancel"}),e.jsx(a.ActionButton,{appearance:"positive",onClick:()=>{t.submitForm()},className:"u-no-margin--bottom",disabled:!t.isValid||t.isSubmitting||!t.values.name,loading:t.isSubmitting,children:"Save changes"})]})]})})},z=({placementGroup:n,project:o})=>{const r=a.useNotify(),m=a.useToastNotification(),l=x(),[s,u]=C.useState(!1),d=n.used_by.length>0,t=()=>{u(!0),U(n.name,o).then(()=>{l.invalidateQueries({queryKey:[h.placementGroups,o]}),m.success(e.jsxs(e.Fragment,{children:["Placement group"," ",e.jsx(f,{bold:!0,type:"placement-group",value:n.name})," ","deleted."]}))}).catch(c=>{u(!1),r.failure("Placement group deletion failed",c)})};return e.jsx(a.ConfirmationButton,{appearance:"base",onHoverText:d?"Remove all usages to delete this placement group":"Delete placement group",className:"u-no-margin--bottom has-icon",disabled:s||d,loading:s,confirmationModalProps:{title:"Confirm delete",confirmButtonLabel:"Delete",onConfirm:t,children:e.jsxs("p",{children:["This will permanently delete placement group"," ",e.jsx(f,{bold:!0,type:"placement-group",value:n.name}),"."]})},shiftClickEnabled:!0,showShiftClickHint:!0,children:e.jsx(a.Icon,{name:"delete"})})},N=({className:n})=>{const o=_(E),r=j();return e.jsxs(a.Button,{appearance:"positive",className:n,onClick:r.openCreatePlacementGroup,hasIcon:!o,children:[!o&&e.jsx(a.Icon,{name:"plus",light:!0}),e.jsx("span",{children:"Create placement group"})]})},de=()=>{const n=j(),o=a.useNotify(),{project:r}=I();if(!r)return e.jsx(e.Fragment,{children:"Missing project"});const{data:m=[],error:l,isLoading:s}=G(r);l&&o.failure("Loading placement groups failed",l);const u=[{content:"Name",sortKey:"name"},{content:"Description",sortKey:"description"},{content:"Policy",sortKey:"policy"},{content:"Rigor",sortKey:"rigor"},{content:"Used by",sortKey:"usedBy"},{"aria-label":"Actions"}],d=m.map(i=>({key:i.name,columns:[{content:i.name,role:"rowheader","aria-label":"Name"},{content:e.jsx("div",{className:"table-description",title:`Description ${i.description}`,children:i.description}),role:"cell","aria-label":"Description"},{content:i.config.policy,role:"cell","aria-label":"Policy"},{content:i.config.rigor,role:"cell","aria-label":"Rigor"},{content:i.used_by.length,role:"cell","aria-label":"Rigor"},{content:e.jsx(a.List,{inline:!0,className:"actions-list",items:[e.jsx(a.Button,{appearance:"base",hasIcon:!0,title:"Edit placement group",onClick:()=>{o.clear(),n.openEditPlacementGroup(i.name)},children:e.jsx(a.Icon,{name:"edit"})},"edit"),e.jsx(z,{placementGroup:i,project:r},"delete")]}),role:"cell","aria-label":"Actions",className:"u-align--right"}],sortData:{name:i.name.toLowerCase(),description:i.description.toLowerCase(),policy:i.config.policy,rigor:i.config.rigor,used_by:i.used_by.length}})),{rows:t,updateSort:c}=A({rows:d});if(s)return e.jsx(a.Spinner,{className:"u-loader",text:"Loading...",isMainComponent:!0});const p=m.length===0;return e.jsxs(e.Fragment,{children:[e.jsxs(a.CustomLayout,{mainClassName:"placement-groups-list",header:e.jsxs(g,{children:[e.jsx(g.Left,{children:e.jsx(g.Title,{children:e.jsx(q,{docPath:"/howto/cluster_placement_groups/",title:"Learn how to use placement groups",children:"Placement groups"})})}),e.jsx(g.BaseActions,{children:!p&&e.jsx(N,{className:"u-no-margin--bottom u-float-right"})})]}),children:[e.jsx(y,{}),e.jsx(a.Row,{className:"no-grid-gap",children:e.jsxs(a.Col,{size:12,children:[p&&e.jsxs(a.EmptyState,{className:"empty-state",image:e.jsx(a.Icon,{name:"repository",className:"empty-state-icon"}),title:"No placement groups found",children:[e.jsx("p",{children:"There are no placement groups in this project."}),e.jsx("p",{children:e.jsx(F,{docPath:"/howto/cluster_placement_groups/",hasExternalIcon:!0,children:"Learn how to use placement groups"})}),e.jsx(N,{})]}),!p&&e.jsx(a.ScrollableTable,{dependencies:[m,o.notification],tableId:"placement-group-table",belowIds:["status-bar"],children:e.jsx(a.TablePagination,{id:"pagination",data:t,itemName:"placement group",className:"u-no-margin--top","aria-label":"Table pagination control",children:e.jsx(a.MainTable,{id:"placement-group-table",headers:u,sortable:!0,emptyStateMsg:"No placement groups found matching this search",onUpdateSort:c})})})]})})]}),n.panel===b.createPlacementGroup&&e.jsx($,{}),n.panel===b.editPlacementGroup&&e.jsx(V,{})]})};export{de as default};