@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-844db4d → 0.0.2-dev-d4f65ae

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.
Files changed (39) hide show
  1. package/README.md +4 -4
  2. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +69 -22
  3. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
  4. package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js +93 -53
  5. package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js.map +1 -1
  6. package/dist/components/ConfirmDeleteDialog/ConfirmDeleteDialog.esm.js +65 -0
  7. package/dist/components/ConfirmDeleteDialog/ConfirmDeleteDialog.esm.js.map +1 -0
  8. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +28 -15
  9. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
  10. package/dist/components/EditAPIKeyRequestDialog/EditAPIKeyRequestDialog.esm.js +6 -4
  11. package/dist/components/EditAPIKeyRequestDialog/EditAPIKeyRequestDialog.esm.js.map +1 -1
  12. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +26 -14
  13. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
  14. package/dist/components/KuadrantPage/KuadrantPage.esm.js +51 -22
  15. package/dist/components/KuadrantPage/KuadrantPage.esm.js.map +1 -1
  16. package/dist/components/MyApiKeysCard/MyApiKeysCard.esm.js +50 -12
  17. package/dist/components/MyApiKeysCard/MyApiKeysCard.esm.js.map +1 -1
  18. package/dist-scalprum/{internal.plugin-kuadrant.58f9452dd6d088d4816c.js → internal.plugin-kuadrant.810174392d0016a5a388.js} +2 -2
  19. package/dist-scalprum/{internal.plugin-kuadrant.58f9452dd6d088d4816c.js.map → internal.plugin-kuadrant.810174392d0016a5a388.js.map} +1 -1
  20. package/dist-scalprum/plugin-manifest.json +2 -2
  21. package/dist-scalprum/static/4306.4587e025.chunk.js +2 -0
  22. package/dist-scalprum/static/4306.4587e025.chunk.js.map +1 -0
  23. package/dist-scalprum/static/6281.b000c79f.chunk.js +2 -0
  24. package/dist-scalprum/static/6281.b000c79f.chunk.js.map +1 -0
  25. package/dist-scalprum/static/7632.daef27e4.chunk.js +2 -0
  26. package/dist-scalprum/static/7632.daef27e4.chunk.js.map +1 -0
  27. package/dist-scalprum/static/8441.62394cfd.chunk.js +2 -0
  28. package/dist-scalprum/static/8441.62394cfd.chunk.js.map +1 -0
  29. package/dist-scalprum/static/{exposed-PluginRoot.9522bcfa.chunk.js → exposed-PluginRoot.0ac7fe4b.chunk.js} +2 -2
  30. package/dist-scalprum/static/{exposed-PluginRoot.9522bcfa.chunk.js.map → exposed-PluginRoot.0ac7fe4b.chunk.js.map} +1 -1
  31. package/package.json +1 -1
  32. package/dist-scalprum/static/4306.bc289e67.chunk.js +0 -2
  33. package/dist-scalprum/static/4306.bc289e67.chunk.js.map +0 -1
  34. package/dist-scalprum/static/6281.e7e36f6a.chunk.js +0 -2
  35. package/dist-scalprum/static/6281.e7e36f6a.chunk.js.map +0 -1
  36. package/dist-scalprum/static/7632.4bb9bd69.chunk.js +0 -2
  37. package/dist-scalprum/static/7632.4bb9bd69.chunk.js.map +0 -1
  38. package/dist-scalprum/static/9555.59e77806.chunk.js +0 -2
  39. package/dist-scalprum/static/9555.59e77806.chunk.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[7632],{63221:(e,a,t)=>{t.d(a,{K:()=>A});var s=t(31085),l=t(95478),n=t(76891),i=t(61477),r=t(10394),o=t(46805),d=t(59461),c=t(72501),u=t(16249),p=t(93453),m=t(64947),h=t(78467),x=t(77225);const A=({open:e,title:a,description:t,confirmText:A,severity:v="normal",deleting:g=!1,onConfirm:j,onCancel:f})=>{const[y,b]=(0,l.useState)("");(0,l.useEffect)(()=>{e||b("")},[e]);const P="high"===v&&A,S=!P||y===A;return(0,s.jsxs)(n.A,{open:e,onClose:g?void 0:f,maxWidth:"sm",fullWidth:!0,children:[(0,s.jsxs)(i.A,{children:["high"===v&&(0,s.jsxs)(r.A,{display:"flex",alignItems:"center",style:{gap:8},children:[(0,s.jsx)(x.A,{color:"error"}),(0,s.jsx)("span",{children:a})]}),"high"!==v&&a]}),(0,s.jsxs)(o.A,{children:[(0,s.jsx)(d.A,{children:t}),P&&(0,s.jsxs)(r.A,{mt:2,children:[(0,s.jsxs)(c.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:["Type ",(0,s.jsx)("strong",{children:A})," to confirm:"]}),(0,s.jsx)(u.A,{fullWidth:!0,variant:"outlined",size:"small",value:y,onChange:e=>b(e.target.value),disabled:g,autoFocus:!0,placeholder:A})]})]}),(0,s.jsxs)(p.A,{children:[(0,s.jsx)(m.A,{onClick:f,disabled:g,children:"Cancel"}),(0,s.jsx)(m.A,{onClick:()=>{S&&j()},color:"secondary",variant:"contained",disabled:g||!S,startIcon:g?(0,s.jsx)(h.A,{size:16,color:"inherit"}):void 0,children:g?"Deleting...":"Delete"})]})]})}},84189:(e,a,t)=>{t.d(a,{n:()=>j});var s=t(31085),l=t(95478),n=t(76891),i=t(61477),r=t(46805),o=t(10394),d=t(72501),c=t(95061),u=t(48543),p=t(81215),m=t(26343),h=t(16249),x=t(93453),A=t(64947),v=t(78467),g=t(22097);const j=({open:e,onClose:a,onSuccess:t,request:j,availablePlans:f})=>{const y=(0,g.useApi)(g.configApiRef),b=(0,g.useApi)(g.fetchApiRef),P=y.getString("backend.baseUrl"),[S,k]=(0,l.useState)(""),[w,C]=(0,l.useState)(""),[T,R]=(0,l.useState)(!1),[I,$]=(0,l.useState)("");(0,l.useEffect)(()=>{e&&j&&(k(j.spec.planTier||""),C(j.spec.useCase||""),$(""))},[e,j]);const q=()=>{T||($(""),a())};return(0,s.jsxs)(n.A,{open:e,onClose:q,maxWidth:"sm",fullWidth:!0,children:[(0,s.jsx)(i.A,{children:"Edit API Access Request"}),(0,s.jsxs)(r.A,{children:[I&&(0,s.jsx)(o.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,s.jsx)(d.A,{variant:"body2",children:I})}),(0,s.jsxs)(c.A,{fullWidth:!0,margin:"normal",children:[(0,s.jsx)(u.A,{children:"Tier"}),(0,s.jsx)(p.A,{value:S,onChange:e=>k(e.target.value),disabled:T,children:f.map(e=>{const a=Object.entries(e.limits||{}).map(([e,a])=>`${a} per ${e}`).join(", ");return(0,s.jsxs)(m.A,{value:e.tier,children:[e.tier," ",a?`(${a})`:""]},e.tier)})})]}),(0,s.jsx)(h.A,{label:"Use Case",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:w,onChange:e=>C(e.target.value),disabled:T,helperText:"Explain your intended use of this API for admin review"})]}),(0,s.jsxs)(x.A,{children:[(0,s.jsx)(A.A,{onClick:q,disabled:T,children:"Cancel"}),(0,s.jsx)(A.A,{onClick:async()=>{if(S){$(""),R(!0);try{const e={spec:{planTier:S,useCase:w.trim()}},s=await b.fetch(`${P}/api/kuadrant/requests/${j.metadata.namespace}/${j.metadata.name}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!s.ok){const e=await s.json().catch(()=>({}));throw new Error(e.error||`Failed to update request: ${s.status}`)}t(),a()}catch(e){console.error("Error updating API key request:",e),$(e instanceof Error?e.message:"Unknown error occurred")}finally{R(!1)}}else $("Please select a tier")},color:"primary",variant:"contained",disabled:!S||T,startIcon:T?(0,s.jsx)(v.A,{size:16,color:"inherit"}):void 0,children:T?"Saving...":"Save Changes"})]})]})}},95251:(e,a,t)=>{t.r(a),t.d(a,{KuadrantPage:()=>ae});var s=t(31085),l=t(95478),n=t.n(l),i=t(67720),r=t(10394),o=t(29365),d=t(72501),c=t(42899),u=t(64947),p=t(18466),m=t(39590),h=t(75625),x=t(37725),A=t(25010),v=t(289),g=t(55639),j=t(45210),f=t(46681),y=t(86687),b=t(42367),P=t(96040),S=t(91638),k=t(22097),w=t(16281),C=t(71677),T=t(78467),R=t(31653),I=t(38605),$=t(37757),q=t(26343),W=t(32269),N=t(61524),E=t(71407),D=t(84189),z=t(63221);const M=()=>{var e;const a=(0,k.useApi)(k.configApiRef),t=(0,k.useApi)(k.fetchApiRef),n=(0,k.useApi)(k.identityApiRef),c=(0,k.useApi)(k.alertApiRef),u=a.getString("backend.baseUrl"),[p,m]=(0,l.useState)(0),[,h]=(0,l.useState)(""),[v,g]=(0,l.useState)(new Set),[j,f]=(0,l.useState)(null),[b,w]=(0,l.useState)(null),[M,K]=(0,l.useState)({open:!1,request:null,plans:[]}),[L,B]=(0,l.useState)(0),[U,H]=(0,l.useState)(null),[F,O]=(0,l.useState)({open:!1,request:null});(0,S.A)(async()=>{const e=await n.getBackstageIdentity(),a=e.userEntityRef.split("/")[1]||"guest";console.log(`MyApiKeysCard: setting userId from userEntityRef: ${e.userEntityRef} -> "${a}"`),h(a)},[n]);const[_,V]=(0,l.useState)(new Set),{value:J,loading:Y,error:X}=(0,S.A)(async()=>{const e=await t.fetch(`${u}/api/kuadrant/requests/my`);if(!e.ok)throw new Error("failed to fetch requests");return(await e.json()).items||[]},[u,t,L]);if(Y)return(0,s.jsx)(P.n,{title:"My API Keys",children:(0,s.jsx)(y.k,{})});if(X)return(0,s.jsx)(P.n,{title:"My API Keys",children:(0,s.jsxs)(d.A,{color:"error",children:["Error loading API keys: ",X.message]})});const G=(J||[]).filter(e=>!_.has(e.metadata.name)),Q=G.filter(e=>{var a;return"Approved"===(null===(a=e.status)||void 0===a?void 0:a.phase)}),Z=G.filter(e=>{var a;return!(null===(a=e.status)||void 0===a?void 0:a.phase)||"Pending"===e.status.phase}),ee=G.filter(e=>{var a;return"Rejected"===(null===(a=e.status)||void 0===a?void 0:a.phase)}),ae=()=>{f(null),w(null)},te=async()=>{if(!b)return;const e=b;ae();try{const s=await t.fetch(`${u}/api/kuadrant/apiproducts/${e.spec.apiNamespace}/${e.spec.apiName}`);if(s.ok){var a;const t=(null===(a=(await s.json()).spec)||void 0===a?void 0:a.plans)||[];K({open:!0,request:e,plans:t})}else console.error("Failed to fetch API product"),K({open:!0,request:e,plans:[]})}catch(a){console.error("Error fetching plans:",a),K({open:!0,request:e,plans:[]})}},se=()=>{if(!b)return;const e=b;ae(),O({open:!0,request:e})},le=[{title:"API Product",field:"spec.apiName",render:e=>(0,s.jsx)(x.N_,{to:`/catalog/default/api/${e.spec.apiName}/api-keys`,children:(0,s.jsx)("strong",{children:e.spec.apiName})})},{title:"Tier",field:"spec.planTier",render:e=>{const a="gold"===e.spec.planTier?"primary":"silver"===e.spec.planTier?"default":"secondary";return(0,s.jsx)(i.A,{label:e.spec.planTier,color:a,size:"small"})}},{title:"Use Case",field:"spec.useCase",render:e=>e.spec.useCase?(0,s.jsx)(C.Ay,{title:e.spec.useCase,placement:"top",children:(0,s.jsx)(d.A,{variant:"body2",style:{maxWidth:"200px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.spec.useCase})}):(0,s.jsx)(d.A,{variant:"body2",children:"-"})},{title:"Status",field:"status.phase",render:e=>{var a;const t=(null===(a=e.status)||void 0===a?void 0:a.phase)||"Pending",l="Approved"===t?"primary":"Rejected"===t?"secondary":"default";return(0,s.jsx)(i.A,{label:t,color:l,size:"small"})}},{title:"Reason",field:"status.reason",render:e=>{var a;if(null===(a=e.status)||void 0===a?void 0:a.reason){const a="Rejected"===e.status.phase?"error":"textPrimary";return(0,s.jsx)(C.Ay,{title:e.status.reason,placement:"top",children:(0,s.jsx)(d.A,{variant:"body2",color:a,style:{maxWidth:"200px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.status.reason})})}return(0,s.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"-"})}},{title:"Reviewed By",field:"status.reviewedBy",render:e=>{var a,t;if(("Approved"===(null===(a=e.status)||void 0===a?void 0:a.phase)||"Rejected"===(null===(t=e.status)||void 0===t?void 0:t.phase))&&e.status.reviewedBy){const a=e.status.reviewedAt?new Date(e.status.reviewedAt).toLocaleDateString():"";return(0,s.jsxs)(r.A,{children:[(0,s.jsx)(d.A,{variant:"body2",children:e.status.reviewedBy}),a&&(0,s.jsx)(d.A,{variant:"caption",color:"textSecondary",children:a})]})}return(0,s.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"-"})}},{title:"API Key",field:"status.apiKey",filtering:!1,render:e=>{var a;if("Approved"===(null===(a=e.status)||void 0===a?void 0:a.phase)&&e.status.apiKey){const a=v.has(e.metadata.name);return(0,s.jsxs)(r.A,{display:"flex",alignItems:"center",style:{gap:8},children:[(0,s.jsx)(r.A,{fontFamily:"monospace",fontSize:"0.875rem",children:a?e.status.apiKey:"•".repeat(20)+"..."}),(0,s.jsx)(C.Ay,{title:a?"hide key":"show key",children:(0,s.jsx)(o.A,{size:"small",onClick:()=>{return a=e.metadata.name,void g(e=>{const t=new Set(e);return t.has(a)?t.delete(a):t.add(a),t});var a},children:a?(0,s.jsx)(N.A,{fontSize:"small"}):(0,s.jsx)(W.A,{fontSize:"small"})})})]})}return(0,s.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"-"})}},{title:"Requested",field:"metadata.creationTimestamp",render:e=>{if(!e.metadata.creationTimestamp)return(0,s.jsx)(d.A,{variant:"body2",children:"-"});const a=new Date(e.metadata.creationTimestamp);return(0,s.jsx)(d.A,{variant:"body2",children:a.toLocaleDateString()})}},{title:"",filtering:!1,render:e=>U===e.metadata.name?(0,s.jsx)(T.A,{size:20}):(0,s.jsx)(o.A,{size:"small",onClick:a=>{a.stopPropagation();const t=a.currentTarget.getBoundingClientRect();f({top:t.bottom,left:t.left}),w(e)},"aria-controls":j?"myapikeys-menu":void 0,"aria-haspopup":"true",children:(0,s.jsx)(E.A,{})})}],ne=(()=>{switch(p){case 0:return Q;case 1:return Z;case 2:return ee;default:return G}})(),ie=(()=>{switch(p){case 0:return le.filter(e=>"Reason"!==e.title);case 1:return le.filter(e=>"Reason"!==e.title&&"Reviewed By"!==e.title&&"API Key"!==e.title);case 2:return le.filter(e=>"API Key"!==e.title);default:return le}})();return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(P.n,{title:"My API Keys",subheader:`${Q.length} active, ${Z.length} pending`,children:[(0,s.jsx)(r.A,{mb:2,children:(0,s.jsxs)(R.A,{value:p,onChange:(e,a)=>m(a),indicatorColor:"primary",textColor:"primary",children:[(0,s.jsx)(I.A,{label:`Active (${Q.length})`}),(0,s.jsx)(I.A,{label:`Pending (${Z.length})`}),(0,s.jsx)(I.A,{label:`Rejected (${ee.length})`})]})}),0===ne.length?(0,s.jsx)(r.A,{p:3,textAlign:"center",children:(0,s.jsxs)(d.A,{variant:"body1",color:"textSecondary",children:[0===p&&"No active API keys. Request access to an API to get started.",1===p&&"No pending requests.",2===p&&"No rejected requests."]})}):(0,s.jsx)(A.X,{options:{paging:ne.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:ie,data:ne.map(e=>({...e,id:e.metadata.name}))})]}),(0,s.jsx)($.A,{id:"myapikeys-menu",open:Boolean(j),onClose:ae,anchorReference:"anchorPosition",anchorPosition:j||{top:0,left:0},children:b&&(()=>{const e=[];var a;return(a=b).status&&"Pending"!==a.status.phase||e.push((0,s.jsx)(q.A,{onClick:te,children:"Edit"},"edit")),e.push((0,s.jsx)(q.A,{onClick:se,children:"Delete"},"delete")),e})()}),M.request&&(0,s.jsx)(D.n,{open:M.open,request:M.request,availablePlans:M.plans,onClose:()=>K({open:!1,request:null,plans:[]}),onSuccess:()=>{K({open:!1,request:null,plans:[]}),B(e=>e+1)}}),(0,s.jsx)(z.K,{open:F.open,title:"Delete API Key Request",description:`Are you sure you want to delete the API key request for ${(null===(e=F.request)||void 0===e?void 0:e.spec.apiName)||"this API"}?`,deleting:null!==U,onConfirm:async()=>{if(!F.request)return;const e=F.request,a=e.metadata.name;V(e=>new Set(e).add(a)),H(a);try{if(!(await t.fetch(`${u}/api/kuadrant/requests/${e.metadata.namespace}/${e.metadata.name}`,{method:"DELETE"})).ok)throw new Error("Failed to delete request");B(e=>e+1),c.post({message:"Request deleted",severity:"success",display:"transient"}),O({open:!1,request:null})}catch(e){console.error("Error deleting request:",e),V(e=>{const t=new Set(e);return t.delete(a),t}),c.post({message:"Failed to delete request",severity:"error",display:"transient"})}finally{H(null)}},onCancel:()=>{O({open:!1,request:null})}})]})};var K=t(46205);const L=({children:e,permission:a,fallback:t,errorMessage:l})=>{const{allowed:n,loading:i,error:o}=(0,K.l)(a);return i?(0,s.jsx)(y.k,{}):o?(0,s.jsxs)(r.A,{p:4,children:[(0,s.jsxs)(d.A,{color:"error",children:["Unable to check permissions: ",o.message]}),(0,s.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"Please try again or contact your administrator"})]}):n?(0,s.jsx)(s.Fragment,{children:e}):t?(0,s.jsx)(s.Fragment,{children:t}):(0,s.jsxs)(r.A,{p:4,children:[(0,s.jsx)(d.A,{color:"textSecondary",children:l||"You don't have permission to view this page"}),(0,s.jsx)(r.A,{mt:1,children:(0,s.jsxs)(d.A,{variant:"caption",color:"textSecondary",children:["Required permission: ",a.name]})})]})};var B=t(58837),U=t(76891),H=t(61477),F=t(46805),O=t(16249),_=t(93453),V=t(84441);const J=({selectedPolicy:e,alertSeverity:a="warning",alertMessage:t="No PlanPolicy found for this HTTPRoute. API keys and rate limiting may not be available.",includeTopMargin:l=!0})=>(0,s.jsx)(r.A,{mt:l?1:0,p:2,bgcolor:"#f5f5f5",borderRadius:1,border:"1px solid #e0e0e0",children:e?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(d.A,{variant:"subtitle2",gutterBottom:!0,style:{fontWeight:600},children:["Associated PlanPolicy: ",(0,s.jsx)("strong",{children:e.metadata.name})]}),e.plans&&e.plans.length>0?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(d.A,{variant:"caption",display:"block",gutterBottom:!0,color:"textSecondary",style:{marginTop:8},children:"Available Plans:"}),(0,s.jsx)(r.A,{display:"flex",flexWrap:"wrap",mt:1,style:{gap:8},children:e.plans.map((e,a)=>{var t,l,n;const r=(null===(t=e.limits)||void 0===t?void 0:t.daily)?`${e.limits.daily}/day`:(null===(l=e.limits)||void 0===l?void 0:l.monthly)?`${e.limits.monthly}/month`:(null===(n=e.limits)||void 0===n?void 0:n.yearly)?`${e.limits.yearly}/year`:"No limit";return(0,s.jsx)(i.A,{label:`${e.tier}: ${r}`,size:"small",variant:"outlined",color:"primary"},a)})}),e.plans.some(e=>e.description)&&(0,s.jsx)(r.A,{mt:1,children:e.plans.filter(e=>e.description).map((e,a)=>(0,s.jsxs)(d.A,{variant:"caption",display:"block",color:"textSecondary",children:["• ",(0,s.jsxs)("strong",{children:[e.tier,":"]})," ",e.description]},a))})]}):(0,s.jsx)(d.A,{variant:"caption",color:"textSecondary",children:"No plans defined in this PlanPolicy"})]}):(0,s.jsx)(V.A,{severity:a,children:t})}),Y=(0,B.A)({asterisk:{color:"#f44336"}}),X=({open:e,onClose:a,onSuccess:t})=>{const n=Y(),o=(0,k.useApi)(k.configApiRef),p=(0,k.useApi)(k.fetchApiRef),m=o.getString("backend.baseUrl"),[h,x]=(0,l.useState)(""),[A,v]=(0,l.useState)(""),[g,j]=(0,l.useState)(""),[f,y]=(0,l.useState)("v1"),[b,P]=(0,l.useState)("manual"),[w,C]=(0,l.useState)("Published"),[R,I]=(0,l.useState)([]),[$,W]=(0,l.useState)(""),[N,E]=(0,l.useState)(""),[D,z]=(0,l.useState)(""),[M,K]=(0,l.useState)(""),[L,B]=(0,l.useState)(""),[X,G]=(0,l.useState)(""),[Q,Z]=(0,l.useState)(""),[ee,ae]=(0,l.useState)(!1),{value:te,loading:se}=(0,S.A)(async()=>{const e=await p.fetch(`${m}/api/kuadrant/httproutes`);return((await e.json()).items||[]).filter(e=>{var a;return"true"===(null===(a=e.metadata.annotations)||void 0===a?void 0:a["backstage.io/expose"])})},[m,p,e]),{value:le}=(0,S.A)(async()=>{const e=await p.fetch(`${m}/api/kuadrant/planpolicies`);return await e.json()},[m,p,e]),ne=N?N.split("/"):null,ie=ne?(re=ne[0],oe=ne[1],(null==le?void 0:le.items)?le.items.find(e=>{const a=e.targetRef;return"HTTPRoute"===(null==a?void 0:a.kind)&&(null==a?void 0:a.name)===oe&&(!(null==a?void 0:a.namespace)||(null==a?void 0:a.namespace)===re)}):null):null;var re,oe;const de=()=>{$.trim()&&!R.includes($.trim())&&(I([...R,$.trim()]),W(""))},ce=()=>{x(""),v(""),j(""),y("v1"),P("manual"),C("Published"),I([]),W(""),E(""),z(""),K(""),B(""),G(""),Z(""),a()};return(0,s.jsxs)(U.A,{open:e,onClose:ce,maxWidth:"md",fullWidth:!0,children:[(0,s.jsx)(H.A,{children:"Create API Product"}),(0,s.jsxs)(F.A,{children:[Q&&(0,s.jsx)(V.A,{severity:"error",style:{marginBottom:16},children:Q}),(0,s.jsxs)(c.A,{container:!0,spacing:2,children:[(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Name",value:h,onChange:e=>x(e.target.value),placeholder:"my-api",helperText:"Kubernetes resource name (lowercase, hyphens)",margin:"normal",required:!0,disabled:ee,InputLabelProps:{classes:{asterisk:n.asterisk}}})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Display Name",value:A,onChange:e=>v(e.target.value),placeholder:"My API",margin:"normal",required:!0,disabled:ee,InputLabelProps:{classes:{asterisk:n.asterisk}}})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Version",value:f,onChange:e=>y(e.target.value),placeholder:"v1",margin:"normal",disabled:ee})}),(0,s.jsx)(c.A,{item:!0,xs:12,children:(0,s.jsxs)(O.A,{fullWidth:!0,select:!0,label:"Approval Mode",value:b,onChange:e=>P(e.target.value),margin:"normal",helperText:"Automatic: keys are created immediately. Manual: requires approval.",disabled:ee,children:[(0,s.jsx)(q.A,{value:"manual",children:"Manual"}),(0,s.jsx)(q.A,{value:"automatic",children:"Automatic"})]})}),(0,s.jsx)(c.A,{item:!0,xs:12,children:(0,s.jsxs)(O.A,{fullWidth:!0,select:!0,label:"Publish Status",value:w,onChange:e=>C(e.target.value),margin:"normal",helperText:"Draft: hidden from catalog. Published: visible to consumers.",disabled:ee,children:[(0,s.jsx)(q.A,{value:"Draft",children:"Draft"}),(0,s.jsx)(q.A,{value:"Published",children:"Published"})]})}),(0,s.jsx)(c.A,{item:!0,xs:12,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Description",value:g,onChange:e=>j(e.target.value),placeholder:"API description",margin:"normal",multiline:!0,rows:2,required:!0,disabled:ee,InputLabelProps:{classes:{asterisk:n.asterisk}}})}),(0,s.jsxs)(c.A,{item:!0,xs:12,children:[(0,s.jsx)(d.A,{variant:"subtitle2",gutterBottom:!0,style:{marginTop:16},children:"Tags"}),(0,s.jsx)(r.A,{display:"flex",flexWrap:"wrap",marginBottom:1,style:{gap:8},children:R.map(e=>(0,s.jsx)(i.A,{label:e,onDelete:ee?void 0:()=>{return a=e,void I(R.filter(e=>e!==a));var a},size:"small",disabled:ee},e))}),(0,s.jsxs)(r.A,{display:"flex",style:{gap:8},children:[(0,s.jsx)(O.A,{fullWidth:!0,size:"small",value:$,onChange:e=>W(e.target.value),onKeyPress:e=>"Enter"===e.key&&de(),placeholder:"Add tag",disabled:ee}),(0,s.jsx)(u.A,{onClick:de,variant:"outlined",size:"small",disabled:ee,children:"Add"})]})]}),(0,s.jsx)(c.A,{item:!0,xs:12,children:(0,s.jsxs)(O.A,{fullWidth:!0,select:!0,label:"HTTPRoute",value:N,onChange:e=>E(e.target.value),margin:"normal",required:!0,helperText:"Select an HTTPRoute (backstage.io/expose: true). APIProduct will be created in the same namespace.",disabled:se||ee,InputLabelProps:{classes:{asterisk:n.asterisk}},children:[se&&(0,s.jsx)(q.A,{value:"",children:"Loading..."}),!se&&te&&0===te.length&&(0,s.jsx)(q.A,{value:"",children:"No HTTPRoutes available"}),!se&&te&&te.map(e=>(0,s.jsxs)(q.A,{value:`${e.metadata.namespace}/${e.metadata.name}`,children:[e.metadata.name," (",e.metadata.namespace,")"]},`${e.metadata.namespace}/${e.metadata.name}`))]})}),N&&(0,s.jsx)(c.A,{item:!0,xs:12,children:(0,s.jsx)(J,{selectedPolicy:ie,alertSeverity:"warning",alertMessage:"No PlanPolicy found for this HTTPRoute. API keys and rate limiting may not be available.",includeTopMargin:!0})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Contact Email",value:D,onChange:e=>z(e.target.value),placeholder:"api-team@example.com",margin:"normal",disabled:ee})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Contact Team",value:M,onChange:e=>K(e.target.value),placeholder:"platform-team",margin:"normal",disabled:ee})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Docs URL",value:L,onChange:e=>B(e.target.value),placeholder:"https://api.example.com/docs",margin:"normal",disabled:ee})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"OpenAPI Spec URL",value:X,onChange:e=>G(e.target.value),placeholder:"https://api.example.com/openapi.json",margin:"normal",disabled:ee})})]})]}),(0,s.jsxs)(_.A,{children:[(0,s.jsx)(u.A,{onClick:ce,disabled:ee,children:"Cancel"}),(0,s.jsx)(u.A,{onClick:async()=>{Z(""),ae(!0);try{if(!N)throw new Error("Please select an HTTPRoute");const[e,a]=N.split("/"),s={apiVersion:"extensions.kuadrant.io/v1alpha1",kind:"APIProduct",metadata:{name:h,namespace:e},spec:{displayName:A,description:g,version:f,approvalMode:b,publishStatus:w,tags:R,targetRef:{group:"gateway.networking.k8s.io",kind:"HTTPRoute",name:a,namespace:e},...D||M?{contact:{...D&&{email:D},...M&&{team:M}}}:{},...L||X?{documentation:{...L&&{docsURL:L},...X&&{openAPISpec:X}}}:{}}},l=await p.fetch(`${m}/api/kuadrant/apiproducts`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(!l.ok){const e=await l.json();throw new Error(e.error||"failed to create apiproduct")}t(),ce()}catch(e){Z(e instanceof Error?e.message:String(e))}finally{ae(!1)}},color:"primary",variant:"contained",disabled:ee||!h||!A||!g||!N,startIcon:ee?(0,s.jsx)(T.A,{size:16,color:"inherit"}):void 0,children:ee?"Creating...":"Create"})]})]})};var G=t(34955);const Q=(0,B.A)({asterisk:{color:"#f44336"}}),Z=({open:e,onClose:a,onSuccess:t,namespace:o,name:p})=>{const m=Q(),h=(0,k.useApi)(k.configApiRef),x=(0,k.useApi)(k.fetchApiRef),A=h.getString("backend.baseUrl"),[v,g]=(0,l.useState)(!1),[j,f]=(0,l.useState)(""),[b,P]=(0,l.useState)(""),[w,C]=(0,l.useState)("v1"),[R,I]=(0,l.useState)("Draft"),[$,W]=(0,l.useState)("manual"),[N,E]=(0,l.useState)([]),[D,z]=(0,l.useState)(null),[M,K]=(0,l.useState)(""),[L,B]=(0,l.useState)(""),[Y,X]=(0,l.useState)(""),[G,Z]=(0,l.useState)(""),[ee,ae]=(0,l.useState)(""),[te,se]=(0,l.useState)(""),[le,ne]=(0,l.useState)(!1);(0,l.useEffect)(()=>{e&&o&&p&&(g(!0),se(""),x.fetch(`${A}/api/kuadrant/apiproducts/${o}/${p}`).then(async e=>{if(!e.ok){const a=await e.json();throw new Error(a.error||`Failed to fetch API product: ${e.status}`)}return e.json()}).then(e=>{var a,t,s,l;f(e.spec.displayName||""),P(e.spec.description||""),C(e.spec.version||"v1"),I(e.spec.publishStatus||"Draft"),W(e.spec.approvalMode||"manual"),E(e.spec.tags||[]),z(e.spec.targetRef||null),B((null===(a=e.spec.contact)||void 0===a?void 0:a.email)||""),X((null===(t=e.spec.contact)||void 0===t?void 0:t.team)||""),Z((null===(s=e.spec.documentation)||void 0===s?void 0:s.docsURL)||""),ae((null===(l=e.spec.documentation)||void 0===l?void 0:l.openAPISpec)||""),g(!1)}).catch(e=>{se(e.message||"Failed to load API product"),g(!1)}))},[e,o,p,A,x]);const{value:ie}=(0,S.A)(async()=>{if(!e)return null;const a=await x.fetch(`${A}/api/kuadrant/planpolicies`);return await a.json()},[A,x,e]),re=n().useMemo(()=>(null==ie?void 0:ie.items)&&D?ie.items.find(e=>{const a=e.targetRef;return"HTTPRoute"===(null==a?void 0:a.kind)&&(null==a?void 0:a.name)===D.name&&(!(null==a?void 0:a.namespace)||(null==a?void 0:a.namespace)===(D.namespace||o))}):null,[ie,D,o]),oe=()=>{M.trim()&&!N.includes(M.trim())&&(E([...N,M.trim()]),K(""))};return(0,s.jsxs)(U.A,{open:e,onClose:a,maxWidth:"md",fullWidth:!0,children:[(0,s.jsx)(H.A,{children:"Edit API Product"}),(0,s.jsxs)(F.A,{children:[te&&(0,s.jsx)(V.A,{severity:"error",style:{marginBottom:16},children:te}),v?(0,s.jsx)(y.k,{}):(0,s.jsxs)(c.A,{container:!0,spacing:2,children:[(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Name",value:p,disabled:!0,helperText:"Kubernetes resource name (immutable)",margin:"normal"})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Namespace",value:o,disabled:!0,helperText:"Derived from HTTPRoute (immutable)",margin:"normal"})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Display Name",value:j,onChange:e=>f(e.target.value),placeholder:"My API",margin:"normal",required:!0,disabled:le,InputLabelProps:{classes:{asterisk:m.asterisk}}})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Version",value:w,onChange:e=>C(e.target.value),placeholder:"v1",margin:"normal",disabled:le})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsxs)(O.A,{fullWidth:!0,select:!0,label:"Publish Status",value:R,onChange:e=>I(e.target.value),margin:"normal",helperText:"Draft: Hidden from catalog. Published: Visible in catalog.",disabled:le,children:[(0,s.jsx)(q.A,{value:"Draft",children:"Draft (Hidden)"}),(0,s.jsx)(q.A,{value:"Published",children:"Published (Visible)"})]})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsxs)(O.A,{fullWidth:!0,select:!0,label:"Approval Mode",value:$,onChange:e=>W(e.target.value),margin:"normal",helperText:"Automatic: keys created immediately. Manual: requires approval.",disabled:le,children:[(0,s.jsx)(q.A,{value:"manual",children:"Manual"}),(0,s.jsx)(q.A,{value:"automatic",children:"Automatic"})]})}),(0,s.jsx)(c.A,{item:!0,xs:12,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Description",value:b,onChange:e=>P(e.target.value),placeholder:"API description",margin:"normal",multiline:!0,rows:2,required:!0,disabled:le,InputLabelProps:{classes:{asterisk:m.asterisk}}})}),(0,s.jsxs)(c.A,{item:!0,xs:12,children:[(0,s.jsx)(d.A,{variant:"subtitle2",gutterBottom:!0,style:{marginTop:16},children:"Tags"}),(0,s.jsx)(r.A,{display:"flex",flexWrap:"wrap",marginBottom:1,style:{gap:8},children:N.map(e=>(0,s.jsx)(i.A,{label:e,onDelete:le?void 0:()=>{return a=e,void E(N.filter(e=>e!==a));var a},size:"small",disabled:le},e))}),(0,s.jsxs)(r.A,{display:"flex",style:{gap:8},children:[(0,s.jsx)(O.A,{fullWidth:!0,size:"small",value:M,onChange:e=>K(e.target.value),onKeyPress:e=>"Enter"===e.key&&oe(),placeholder:"Add tag",disabled:le}),(0,s.jsx)(u.A,{onClick:oe,variant:"outlined",size:"small",disabled:le,children:"Add"})]})]}),D&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(c.A,{item:!0,xs:12,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"HTTPRoute",value:`${D.namespace||o}/${D.name}`,disabled:!0,helperText:"Target HTTPRoute (immutable)",margin:"normal"})}),(0,s.jsx)(c.A,{item:!0,xs:12,children:(0,s.jsx)(J,{selectedPolicy:re,alertSeverity:"info",alertMessage:"No PlanPolicy found for this HTTPRoute.",includeTopMargin:!1})})]}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Contact Email",value:L,onChange:e=>B(e.target.value),placeholder:"api-team@example.com",margin:"normal",disabled:le})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Contact Team",value:Y,onChange:e=>X(e.target.value),placeholder:"platform-team",margin:"normal",disabled:le})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"Docs URL",value:G,onChange:e=>Z(e.target.value),placeholder:"https://api.example.com/docs",margin:"normal",disabled:le})}),(0,s.jsx)(c.A,{item:!0,xs:6,children:(0,s.jsx)(O.A,{fullWidth:!0,label:"OpenAPI Spec URL",value:ee,onChange:e=>ae(e.target.value),placeholder:"https://api.example.com/openapi.json",margin:"normal",disabled:le})})]})]}),(0,s.jsxs)(_.A,{children:[(0,s.jsx)(u.A,{onClick:a,disabled:le,children:"Cancel"}),(0,s.jsx)(u.A,{onClick:async()=>{se(""),ne(!0);try{const e={spec:{displayName:j,description:b,version:w,publishStatus:R,approvalMode:$,tags:N,targetRef:D,...L||Y?{contact:{...L&&{email:L},...Y&&{team:Y}}}:{},...G||ee?{documentation:{...G&&{docsURL:G},...ee&&{openAPISpec:ee}}}:{}}},s=await x.fetch(`${A}/api/kuadrant/apiproducts/${o}/${p}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!s.ok){const e=await s.json();throw new Error(e.error||"failed to update apiproduct")}t(),a()}catch(e){se(e instanceof Error?e.message:String(e))}finally{ne(!1)}},color:"primary",variant:"contained",disabled:le||v||!j||!b,startIcon:le?(0,s.jsx)(T.A,{size:16,color:"inherit"}):void 0,children:le?"Saving...":"Save"})]})]})},ee=()=>{const e=(0,k.useApi)(k.configApiRef),a=(0,k.useApi)(k.fetchApiRef),t=(0,k.useApi)(k.alertApiRef),n=(0,k.useApi)(k.identityApiRef),C=e.getString("backend.baseUrl"),[T,R]=(0,l.useState)(""),[I,$]=(0,l.useState)(!1),[q,W]=(0,l.useState)(!1),[N,E]=(0,l.useState)(0),[D,L]=(0,l.useState)(!1),[B,U]=(0,l.useState)(null),[H,F]=(0,l.useState)(null),[O,_]=(0,l.useState)(!1),{allowed:V,loading:J,error:Y}=(0,K.l)(G.FL),{allowed:Q,loading:ee}=(0,K.l)(G.TE),{allowed:ae,loading:te,error:se}=(0,K.l)(G.SU),le=Q||ae,ne=ee||te,{allowed:ie,loading:re}=(0,K.l)(G.EM),{allowed:oe,loading:de,error:ce}=(0,K.l)(G.R_),{allowed:ue}=(0,K.l)(G.U3),{allowed:pe}=(0,K.l)(G.v_),me=re||de,{allowed:he,loading:xe,error:Ae}=(0,K.l)(G.J);(0,S.A)(async()=>{const e=await n.getBackstageIdentity();R(e.userEntityRef)},[n]);const{value:ve,loading:ge,error:je}=(0,S.A)(async()=>{const e=await a.fetch(`${C}/api/kuadrant/apiproducts`);return await e.json()},[C,a,N]),{value:fe,loading:ye,error:be}=(0,S.A)(async()=>{const e=await a.fetch(`${C}/api/kuadrant/planpolicies`);return await e.json()},[C,a,N]),Pe=ge||ye||J||ne||me||xe,Se=je||be,ke=Y||se||ce||Ae,we=[{title:"Name",field:"spec.displayName",render:e=>{var a,t;const l="Published"===(null===(a=e.spec)||void 0===a?void 0:a.publishStatus);var n;const i=null!==(n=null===(t=e.spec)||void 0===t?void 0:t.displayName)&&void 0!==n?n:e.metadata.name;return l?(0,s.jsx)(x.N_,{to:`/catalog/default/api/${e.metadata.name}/api-product`,children:(0,s.jsx)("strong",{children:i})}):(0,s.jsx)("span",{className:"text-muted",children:(0,s.jsx)("strong",{children:i})})},customFilterAndSearch:(e,a)=>{var t;return((null===(t=a.spec)||void 0===t?void 0:t.displayName)||a.metadata.name||"").toLowerCase().includes(e.toLowerCase())}},{title:"Resource Name",field:"metadata.name"},{title:"Version",field:"spec.version",render:e=>{var a;return(null===(a=e.spec)||void 0===a?void 0:a.version)||"-"}},{title:"HTTPRoute",field:"spec.targetRef.name",render:e=>{var a,t;return(null===(t=e.spec)||void 0===t||null===(a=t.targetRef)||void 0===a?void 0:a.name)||"-"}},{title:"Publish Status",field:"spec.publishStatus",render:e=>{var a;const t=(null===(a=e.spec)||void 0===a?void 0:a.publishStatus)||"Draft";return(0,s.jsx)(i.A,{label:t,size:"small",color:"Published"===t?"primary":"default"})}},{title:"Approval Mode",field:"spec.approvalMode",render:e=>{var a;const t=(null===(a=e.spec)||void 0===a?void 0:a.approvalMode)||"manual";return(0,s.jsx)(i.A,{label:t,size:"small",color:"automatic"===t?"secondary":"default"})}},{title:"Namespace",field:"metadata.namespace"},{title:"Created",field:"metadata.creationTimestamp",render:e=>{return a=e.metadata.creationTimestamp,new Date(a).toLocaleDateString("en-GB",{year:"numeric",month:"short",day:"numeric"});var a}},{title:"Actions",field:"actions",filtering:!1,render:e=>{var a,t;const l=(null===(t=e.metadata)||void 0===t||null===(a=t.annotations)||void 0===a?void 0:a["backstage.io/owner"])===T,n=pe||ue&&l,i=oe||ie&&l;return n||i?(0,s.jsxs)(r.A,{display:"flex",style:{gap:4},children:[n&&(0,s.jsx)(o.A,{size:"small",onClick:()=>{return a=e.metadata.namespace,t=e.metadata.name,F({namespace:a,name:t}),void W(!0);var a,t},title:"Edit API Product",children:(0,s.jsx)(h.A,{fontSize:"small"})}),i&&(0,s.jsx)(o.A,{size:"small",onClick:()=>{return a=e.metadata.namespace,t=e.metadata.name,U({namespace:a,name:t}),void L(!0);var a,t},title:"Delete API Product",children:(0,s.jsx)(m.A,{fontSize:"small"})})]}):null}}],Ce=[{title:"Name",field:"metadata.name",render:e=>(0,s.jsx)(x.N_,{to:`/kuadrant/planpolicy/${e.metadata.namespace}/${e.metadata.name}`,children:(0,s.jsx)("strong",{children:e.metadata.name})})},{title:"Namespace",field:"metadata.namespace"}];return(0,s.jsxs)(v.Y,{themeId:"tool",children:[(0,s.jsx)(g.Y,{title:"Kuadrant",subtitle:"API management for Kubernetes",children:(0,s.jsx)(j.Y,{children:"Manage API products and access requests"})}),(0,s.jsxs)(f.U,{children:[Pe&&(0,s.jsx)(y.k,{}),Se&&(0,s.jsx)(b._,{error:Se}),ke&&(0,s.jsxs)(r.A,{p:2,children:[(0,s.jsxs)(d.A,{color:"error",children:["unable to check permissions: ",ke.message]}),(0,s.jsxs)(d.A,{variant:"body2",color:"textSecondary",children:["permission: ",Y?"kuadrant.apiproduct.create":ce?"kuadrant.apiproduct.delete":se?"kuadrant.apikeyrequest.read.all":Ae?"kuadrant.planpolicy.list":"unknown"]}),(0,s.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"please try again or contact your administrator"})]}),!Pe&&!Se&&!ke&&(0,s.jsxs)(c.A,{container:!0,spacing:3,direction:"column",children:[(0,s.jsx)(c.A,{item:!0,children:(0,s.jsx)(M,{})}),(0,s.jsx)(c.A,{item:!0,children:(0,s.jsx)(P.n,{title:"API Products",action:V?(0,s.jsx)(r.A,{display:"flex",alignItems:"center",height:"100%",mt:1,children:(0,s.jsx)(u.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,s.jsx)(p.A,{}),onClick:()=>$(!0),children:"Create API Product"})}):void 0,children:(Te=null==ve?void 0:ve.items,Te&&0!==Te.length?(0,s.jsx)(A.X,{options:{paging:Te.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:we,data:Te}):(0,s.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"No API products found"}))})}),he&&(0,s.jsx)(c.A,{item:!0,children:(0,s.jsx)(P.n,{title:"Plan Policies",children:(e=>e&&0!==e.length?(0,s.jsx)(A.X,{options:{paging:!1,search:!1,toolbar:!1},columns:Ce,data:e}):(0,s.jsx)(d.A,{variant:"body2",color:"textSecondary",children:"No plan policies found"}))(null==fe?void 0:fe.items)})}),le&&(0,s.jsx)(c.A,{item:!0,children:(0,s.jsx)(w.d,{})})]}),(0,s.jsx)(X,{open:I,onClose:()=>$(!1),onSuccess:()=>{E(e=>e+1),t.post({message:"API Product created",severity:"success",display:"transient"})}}),(0,s.jsx)(Z,{open:q,onClose:()=>W(!1),onSuccess:()=>{E(e=>e+1),t.post({message:"API Product updated",severity:"success",display:"transient"})},namespace:(null==H?void 0:H.namespace)||"",name:(null==H?void 0:H.name)||""}),(0,s.jsx)(z.K,{open:D,title:"Delete API Product",description:`This will permanently delete "${null==B?void 0:B.name}" from namespace "${null==B?void 0:B.namespace}" and remove it from Kubernetes. Any associated API keys will stop working.`,confirmText:null==B?void 0:B.name,severity:"high",deleting:O,onConfirm:async()=>{if(B){_(!0);try{if(!(await a.fetch(`${C}/api/kuadrant/apiproducts/${B.namespace}/${B.name}`,{method:"DELETE"})).ok)throw new Error("failed to delete apiproduct");E(e=>e+1),t.post({message:"API Product deleted",severity:"success",display:"transient"})}catch(e){console.error("error deleting apiproduct:",e),t.post({message:"Failed to delete API Product",severity:"error",display:"transient"})}finally{_(!1),L(!1),U(null)}}},onCancel:()=>{L(!1),U(null)}})]})]});var Te},ae=()=>(0,s.jsx)(L,{permission:G.OP,errorMessage:"you don't have permission to view the Kuadrant page",children:(0,s.jsx)(ee,{})})}}]);
2
+ //# sourceMappingURL=7632.daef27e4.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/7632.daef27e4.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/ConfirmDeleteDialog/ConfirmDeleteDialog.tsx","webpack://internal.plugin-kuadrant/./src/components/EditAPIKeyRequestDialog/EditAPIKeyRequestDialog.tsx","webpack://internal.plugin-kuadrant/./src/components/MyApiKeysCard/MyApiKeysCard.tsx","webpack://internal.plugin-kuadrant/./src/components/PermissionGate/PermissionGate.tsx","webpack://internal.plugin-kuadrant/./src/components/PlanPolicyDetailsCard/PlanPolicyDetails.tsx","webpack://internal.plugin-kuadrant/./src/components/CreateAPIProductDialog/CreateAPIProductDialog.tsx","webpack://internal.plugin-kuadrant/./src/components/EditAPIProductDialog/EditAPIProductDialog.tsx","webpack://internal.plugin-kuadrant/./src/components/KuadrantPage/KuadrantPage.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Button,\n TextField,\n Typography,\n Box,\n CircularProgress,\n} from '@material-ui/core';\nimport WarningIcon from '@material-ui/icons/Warning';\n\nexport interface ConfirmDeleteDialogProps {\n open: boolean;\n title: string;\n description: string;\n // for dangerous deletes, require typing this text to confirm\n confirmText?: string;\n // severity affects styling - 'high' shows warning icon and requires text confirmation\n severity?: 'normal' | 'high';\n deleting?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport const ConfirmDeleteDialog = ({\n open,\n title,\n description,\n confirmText,\n severity = 'normal',\n deleting = false,\n onConfirm,\n onCancel,\n}: ConfirmDeleteDialogProps) => {\n const [inputValue, setInputValue] = useState('');\n\n // reset input when dialog opens/closes\n useEffect(() => {\n if (!open) {\n setInputValue('');\n }\n }, [open]);\n\n const requiresTextConfirmation = severity === 'high' && confirmText;\n const canConfirm = requiresTextConfirmation ? inputValue === confirmText : true;\n\n const handleConfirm = () => {\n if (canConfirm) {\n onConfirm();\n }\n };\n\n return (\n <Dialog\n open={open}\n onClose={deleting ? undefined : onCancel}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n {severity === 'high' && (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n <WarningIcon color=\"error\" />\n <span>{title}</span>\n </Box>\n )}\n {severity !== 'high' && title}\n </DialogTitle>\n <DialogContent>\n <DialogContentText>{description}</DialogContentText>\n {requiresTextConfirmation && (\n <Box mt={2}>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n Type <strong>{confirmText}</strong> to confirm:\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n size=\"small\"\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n disabled={deleting}\n autoFocus\n placeholder={confirmText}\n />\n </Box>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onCancel} disabled={deleting}>\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n color=\"secondary\"\n variant=\"contained\"\n disabled={deleting || !canConfirm}\n startIcon={deleting ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n >\n {deleting ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Box,\n Typography,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n CircularProgress,\n} from '@material-ui/core';\nimport { useApi, configApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { APIKeyRequest } from '../../types/api-management';\n\ninterface EditAPIKeyRequestDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n request: APIKeyRequest;\n availablePlans: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n}\n\nexport const EditAPIKeyRequestDialog = ({\n open,\n onClose,\n onSuccess,\n request,\n availablePlans,\n}: EditAPIKeyRequestDialogProps) => {\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n\n const [planTier, setPlanTier] = useState('');\n const [useCase, setUseCase] = useState('');\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (open && request) {\n setPlanTier(request.spec.planTier || '');\n setUseCase(request.spec.useCase || '');\n setError('');\n }\n }, [open, request]);\n\n const handleSave = async () => {\n if (!planTier) {\n setError('Please select a tier');\n return;\n }\n\n setError('');\n setSaving(true);\n\n try {\n const patch = {\n spec: {\n planTier,\n useCase: useCase.trim(),\n },\n };\n\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/${request.metadata.namespace}/${request.metadata.name}`,\n {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(patch),\n }\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `Failed to update request: ${response.status}`);\n }\n\n onSuccess();\n onClose();\n } catch (err) {\n console.error('Error updating API key request:', err);\n setError(err instanceof Error ? err.message : 'Unknown error occurred');\n } finally {\n setSaving(false);\n }\n };\n\n const handleClose = () => {\n if (!saving) {\n setError('');\n onClose();\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Edit API Access Request</DialogTitle>\n <DialogContent>\n {error && (\n <Box mb={2} p={2} bgcolor=\"error.main\" color=\"error.contrastText\" borderRadius={1}>\n <Typography variant=\"body2\">{error}</Typography>\n </Box>\n )}\n\n <FormControl fullWidth margin=\"normal\">\n <InputLabel>Tier</InputLabel>\n <Select\n value={planTier}\n onChange={(e) => setPlanTier(e.target.value as string)}\n disabled={saving}\n >\n {availablePlans.map((plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(', ');\n return (\n <MenuItem key={plan.tier} value={plan.tier}>\n {plan.tier} {limitDesc ? `(${limitDesc})` : ''}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n\n <TextField\n label=\"Use Case\"\n placeholder=\"Describe how you plan to use this API\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={useCase}\n onChange={(e) => setUseCase(e.target.value)}\n disabled={saving}\n helperText=\"Explain your intended use of this API for admin review\"\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={saving}>\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n color=\"primary\"\n variant=\"contained\"\n disabled={!planTier || saving}\n startIcon={saving ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n >\n {saving ? 'Saving...' : 'Save Changes'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import React, { useState } from 'react';\nimport { InfoCard, Table, TableColumn, Link, Progress } from '@backstage/core-components';\nimport { useApi, configApiRef, fetchApiRef, identityApiRef, alertApiRef } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\nimport { Box, Chip, Typography, Tabs, Tab, IconButton, Tooltip, Menu, MenuItem, CircularProgress } from '@material-ui/core';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport { EditAPIKeyRequestDialog } from '../EditAPIKeyRequestDialog';\nimport { ConfirmDeleteDialog } from '../ConfirmDeleteDialog';\nimport { APIKeyRequest } from '../../types/api-management';\n\nexport const MyApiKeysCard = () => {\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [selectedTab, setSelectedTab] = useState(0);\n const [, setUserId] = useState<string>('');\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [menuAnchor, setMenuAnchor] = useState<{ top: number; left: number } | null>(null);\n const [menuRequest, setMenuRequest] = useState<APIKeyRequest | null>(null);\n const [editDialogState, setEditDialogState] = useState<{ open: boolean; request: APIKeyRequest | null; plans: any[] }>({\n open: false,\n request: null,\n plans: [],\n });\n const [refresh, setRefresh] = useState(0);\n const [deleting, setDeleting] = useState<string | null>(null);\n const [deleteDialogState, setDeleteDialogState] = useState<{\n open: boolean;\n request: APIKeyRequest | null;\n }>({ open: false, request: null });\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const extractedUserId = identity.userEntityRef.split('/')[1] || 'guest';\n console.log(`MyApiKeysCard: setting userId from userEntityRef: ${identity.userEntityRef} -> \"${extractedUserId}\"`);\n setUserId(extractedUserId);\n }, [identityApi]);\n\n const [optimisticallyDeleted, setOptimisticallyDeleted] = useState<Set<string>>(new Set());\n\n const { value: requests, loading, error } = useAsync(async () => {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/my`\n );\n if (!response.ok) {\n throw new Error('failed to fetch requests');\n }\n const data = await response.json();\n return data.items || [];\n }, [backendUrl, fetchApi, refresh]);\n\n if (loading) {\n return (\n <InfoCard title=\"My API Keys\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title=\"My API Keys\">\n <Typography color=\"error\">Error loading API keys: {error.message}</Typography>\n </InfoCard>\n );\n }\n\n const allRequests = (requests || []).filter(\n (r: APIKeyRequest) => !optimisticallyDeleted.has(r.metadata.name)\n );\n const approvedRequests = allRequests.filter((r: APIKeyRequest) => r.status?.phase === 'Approved');\n const pendingRequests = allRequests.filter((r: APIKeyRequest) => !r.status?.phase || r.status.phase === 'Pending');\n const rejectedRequests = allRequests.filter((r: APIKeyRequest) => r.status?.phase === 'Rejected');\n\n const toggleKeyVisibility = (keyName: string) => {\n setVisibleKeys(prev => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const handleMenuClose = () => {\n setMenuAnchor(null);\n setMenuRequest(null);\n };\n\n const handleEdit = async () => {\n if (!menuRequest) return;\n\n const request = menuRequest;\n handleMenuClose();\n\n // Fetch available plans for this API\n try {\n const apiProductResponse = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${request.spec.apiNamespace}/${request.spec.apiName}`\n );\n\n if (apiProductResponse.ok) {\n const apiProduct = await apiProductResponse.json();\n const plans = apiProduct.spec?.plans || [];\n setEditDialogState({ open: true, request, plans });\n } else {\n console.error('Failed to fetch API product');\n setEditDialogState({ open: true, request, plans: [] });\n }\n } catch (err) {\n console.error('Error fetching plans:', err);\n setEditDialogState({ open: true, request, plans: [] });\n }\n };\n\n const handleDeleteClick = () => {\n if (!menuRequest) return;\n const request = menuRequest;\n handleMenuClose();\n setDeleteDialogState({ open: true, request });\n };\n\n const handleDeleteConfirm = async () => {\n if (!deleteDialogState.request) return;\n\n const request = deleteDialogState.request;\n const requestName = request.metadata.name;\n\n // optimistic update - remove from UI immediately\n setOptimisticallyDeleted(prev => new Set(prev).add(requestName));\n setDeleting(requestName);\n\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/${request.metadata.namespace}/${request.metadata.name}`,\n { method: 'DELETE' }\n );\n\n if (!response.ok) {\n throw new Error('Failed to delete request');\n }\n\n setRefresh(r => r + 1);\n alertApi.post({ message: 'Request deleted', severity: 'success', display: 'transient' });\n setDeleteDialogState({ open: false, request: null });\n } catch (err) {\n console.error('Error deleting request:', err);\n // rollback optimistic update on error\n setOptimisticallyDeleted(prev => {\n const next = new Set(prev);\n next.delete(requestName);\n return next;\n });\n alertApi.post({ message: 'Failed to delete request', severity: 'error', display: 'transient' });\n } finally {\n setDeleting(null);\n }\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogState({ open: false, request: null });\n };\n\n const columns: TableColumn<APIKeyRequest>[] = [\n {\n title: 'API Product',\n field: 'spec.apiName',\n render: (row: APIKeyRequest) => (\n <Link to={`/catalog/default/api/${row.spec.apiName}/api-keys`}>\n <strong>{row.spec.apiName}</strong>\n </Link>\n ),\n },\n {\n title: 'Tier',\n field: 'spec.planTier',\n render: (row: APIKeyRequest) => {\n const color = row.spec.planTier === 'gold' ? 'primary' :\n row.spec.planTier === 'silver' ? 'default' : 'secondary';\n return <Chip label={row.spec.planTier} color={color} size=\"small\" />;\n },\n },\n {\n title: 'Use Case',\n field: 'spec.useCase',\n render: (row: APIKeyRequest) => {\n if (!row.spec.useCase) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n return (\n <Tooltip title={row.spec.useCase} placement=\"top\">\n <Typography\n variant=\"body2\"\n style={{\n maxWidth: '200px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {row.spec.useCase}\n </Typography>\n </Tooltip>\n );\n },\n },\n {\n title: 'Status',\n field: 'status.phase',\n render: (row: APIKeyRequest) => {\n const phase = row.status?.phase || 'Pending';\n const color = phase === 'Approved' ? 'primary' :\n phase === 'Rejected' ? 'secondary' : 'default';\n return <Chip label={phase} color={color} size=\"small\" />;\n },\n },\n {\n title: 'Reason',\n field: 'status.reason',\n render: (row: APIKeyRequest) => {\n if (row.status?.reason) {\n const color = row.status.phase === 'Rejected' ? 'error' : 'textPrimary';\n return (\n <Tooltip title={row.status.reason} placement=\"top\">\n <Typography\n variant=\"body2\"\n color={color}\n style={{\n maxWidth: '200px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {row.status.reason}\n </Typography>\n </Tooltip>\n );\n }\n return <Typography variant=\"body2\" color=\"textSecondary\">-</Typography>;\n },\n },\n {\n title: 'Reviewed By',\n field: 'status.reviewedBy',\n render: (row: APIKeyRequest) => {\n if ((row.status?.phase === 'Approved' || row.status?.phase === 'Rejected') && row.status.reviewedBy) {\n const reviewedDate = row.status.reviewedAt ? new Date(row.status.reviewedAt).toLocaleDateString() : '';\n return (\n <Box>\n <Typography variant=\"body2\">{row.status.reviewedBy}</Typography>\n {reviewedDate && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {reviewedDate}\n </Typography>\n )}\n </Box>\n );\n }\n return <Typography variant=\"body2\" color=\"textSecondary\">-</Typography>;\n },\n },\n {\n title: 'API Key',\n field: 'status.apiKey',\n filtering: false,\n render: (row: APIKeyRequest) => {\n if (row.status?.phase === 'Approved' && row.status.apiKey) {\n const isVisible = visibleKeys.has(row.metadata.name);\n return (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n <Box fontFamily=\"monospace\" fontSize=\"0.875rem\">\n {isVisible ? row.status.apiKey : '•'.repeat(20) + '...'}\n </Box>\n <Tooltip title={isVisible ? 'hide key' : 'show key'}>\n <IconButton\n size=\"small\"\n onClick={() => toggleKeyVisibility(row.metadata.name)}\n >\n {isVisible ? <VisibilityOffIcon fontSize=\"small\" /> : <VisibilityIcon fontSize=\"small\" />}\n </IconButton>\n </Tooltip>\n </Box>\n );\n }\n return <Typography variant=\"body2\" color=\"textSecondary\">-</Typography>;\n },\n },\n {\n title: 'Requested',\n field: 'metadata.creationTimestamp',\n render: (row: APIKeyRequest) => {\n if (!row.metadata.creationTimestamp) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n const date = new Date(row.metadata.creationTimestamp);\n return <Typography variant=\"body2\">{date.toLocaleDateString()}</Typography>;\n },\n },\n {\n title: '',\n filtering: false,\n render: (row: APIKeyRequest) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n aria-controls={menuAnchor ? 'myapikeys-menu' : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const getTabData = () => {\n switch (selectedTab) {\n case 0:\n return approvedRequests;\n case 1:\n return pendingRequests;\n case 2:\n return rejectedRequests;\n default:\n return allRequests;\n }\n };\n\n const getTabColumns = () => {\n switch (selectedTab) {\n case 0: // Active - no Reason\n return columns.filter(col => col.title !== 'Reason');\n case 1: // Pending - no Reason, Reviewed By, API Key\n return columns.filter(col =>\n col.title !== 'Reason' &&\n col.title !== 'Reviewed By' &&\n col.title !== 'API Key'\n );\n case 2: // Rejected - no API Key\n return columns.filter(col => col.title !== 'API Key');\n default:\n return columns;\n }\n };\n\n const tabData = getTabData();\n const tabColumns = getTabColumns();\n const isPending = (row: APIKeyRequest) => !row.status || row.status.phase === 'Pending';\n\n return (\n <>\n <InfoCard\n title=\"My API Keys\"\n subheader={`${approvedRequests.length} active, ${pendingRequests.length} pending`}\n >\n <Box mb={2}>\n <Tabs\n value={selectedTab}\n onChange={(_, newValue) => setSelectedTab(newValue)}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n >\n <Tab label={`Active (${approvedRequests.length})`} />\n <Tab label={`Pending (${pendingRequests.length})`} />\n <Tab label={`Rejected (${rejectedRequests.length})`} />\n </Tabs>\n </Box>\n {tabData.length === 0 ? (\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n {selectedTab === 0 && 'No active API keys. Request access to an API to get started.'}\n {selectedTab === 1 && 'No pending requests.'}\n {selectedTab === 2 && 'No rejected requests.'}\n </Typography>\n </Box>\n ) : (\n <Table\n options={{\n paging: tabData.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={tabColumns}\n data={tabData.map((item: APIKeyRequest) => ({\n ...item,\n id: item.metadata.name,\n }))}\n />\n )}\n </InfoCard>\n\n <Menu\n id=\"myapikeys-menu\"\n open={Boolean(menuAnchor)}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuAnchor || { top: 0, left: 0 }}\n >\n {menuRequest && (() => {\n const items = [];\n if (isPending(menuRequest)) {\n items.push(<MenuItem key=\"edit\" onClick={handleEdit}>Edit</MenuItem>);\n }\n items.push(<MenuItem key=\"delete\" onClick={handleDeleteClick}>Delete</MenuItem>);\n return items;\n })()}\n </Menu>\n\n {editDialogState.request && (\n <EditAPIKeyRequestDialog\n open={editDialogState.open}\n request={editDialogState.request}\n availablePlans={editDialogState.plans}\n onClose={() => setEditDialogState({ open: false, request: null, plans: [] })}\n onSuccess={() => {\n setEditDialogState({ open: false, request: null, plans: [] });\n setRefresh(r => r + 1);\n }}\n />\n )}\n\n <ConfirmDeleteDialog\n open={deleteDialogState.open}\n title=\"Delete API Key Request\"\n description={`Are you sure you want to delete the API key request for ${deleteDialogState.request?.spec.apiName || 'this API'}?`}\n deleting={deleting !== null}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n </>\n );\n};\n","import React from 'react';\nimport { Typography, Box } from '@material-ui/core';\nimport { Progress } from '@backstage/core-components';\nimport { Permission } from '@backstage/plugin-permission-common';\nimport { useKuadrantPermission } from '../../utils/permissions';\n\ninterface PermissionGateProps {\n children: React.ReactNode;\n permission: Permission;\n fallback?: React.ReactNode;\n errorMessage?: string;\n}\n\nexport const PermissionGate = ({ children, permission, fallback, errorMessage }: PermissionGateProps) => {\n const { allowed, loading, error } = useKuadrantPermission(permission);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <Box p={4}>\n <Typography color=\"error\">\n Unable to check permissions: {error.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n if (!allowed) {\n if (fallback) {\n return <>{fallback}</>;\n }\n return (\n <Box p={4}>\n <Typography color=\"textSecondary\">\n {errorMessage || 'You don\\'t have permission to view this page'}\n </Typography>\n <Box mt={1}>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Required permission: {permission.name}\n </Typography>\n </Box>\n </Box>\n );\n }\n\n return <>{children}</>;\n};\n","import React from 'react';\nimport { Box, Typography, Chip } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\n\ninterface PlanPolicyDetailsProps {\n selectedPolicy: {\n metadata: {\n name: string;\n };\n plans?: Array<{\n tier: string;\n description?: string;\n limits?: {\n daily?: number;\n monthly?: number;\n yearly?: number;\n };\n }>;\n } | null;\n alertSeverity?: 'warning' | 'info';\n alertMessage?: string;\n includeTopMargin?: boolean;\n}\n\nexport const PlanPolicyDetails: React.FC<PlanPolicyDetailsProps> = ({\n selectedPolicy,\n alertSeverity = 'warning',\n alertMessage = 'No PlanPolicy found for this HTTPRoute. API keys and rate limiting may not be available.',\n includeTopMargin = true,\n}) => {\n return (\n <Box\n mt={includeTopMargin ? 1 : 0}\n p={2}\n bgcolor=\"#f5f5f5\"\n borderRadius={1}\n border=\"1px solid #e0e0e0\"\n >\n {selectedPolicy ? (\n <>\n <Typography variant=\"subtitle2\" gutterBottom style={{ fontWeight: 600 }}>\n Associated PlanPolicy: <strong>{selectedPolicy.metadata.name}</strong>\n </Typography>\n\n {selectedPolicy.plans && selectedPolicy.plans.length > 0 ? (\n <>\n <Typography\n variant=\"caption\"\n display=\"block\"\n gutterBottom\n color=\"textSecondary\"\n style={{ marginTop: 8 }}\n >\n Available Plans:\n </Typography>\n <Box display=\"flex\" flexWrap=\"wrap\" mt={1} style={{ gap: 8 }}>\n {selectedPolicy.plans.map((plan: any, idx: number) => {\n const limitText = plan.limits?.daily\n ? `${plan.limits.daily}/day`\n : plan.limits?.monthly\n ? `${plan.limits.monthly}/month`\n : plan.limits?.yearly\n ? `${plan.limits.yearly}/year`\n : 'No limit';\n\n return (\n <Chip\n key={idx}\n label={`${plan.tier}: ${limitText}`}\n size=\"small\"\n variant=\"outlined\"\n color=\"primary\"\n />\n );\n })}\n </Box>\n {selectedPolicy.plans.some((p: any) => p.description) && (\n <Box mt={1}>\n {selectedPolicy.plans.filter((p: any) => p.description).map((plan: any, idx: number) => (\n <Typography key={idx} variant=\"caption\" display=\"block\" color=\"textSecondary\">\n • <strong>{plan.tier}:</strong> {plan.description}\n </Typography>\n ))}\n </Box>\n )}\n </>\n ) : (\n <Typography variant=\"caption\" color=\"textSecondary\">\n No plans defined in this PlanPolicy\n </Typography>\n )}\n </>\n ) : (\n <Alert severity={alertSeverity}>{alertMessage}</Alert>\n )}\n </Box>\n );\n};\n\n","import React, { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Box,\n Typography,\n Chip,\n Grid,\n MenuItem,\n CircularProgress,\n makeStyles,\n} from '@material-ui/core';\nimport { useApi, configApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { Alert } from '@material-ui/lab';\nimport useAsync from 'react-use/lib/useAsync';\nimport { PlanPolicyDetails } from '../PlanPolicyDetailsCard';\n\nconst useStyles = makeStyles({\n asterisk: {\n color: '#f44336',\n },\n});\n\ninterface CreateAPIProductDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n}\n\nexport const CreateAPIProductDialog = ({ open, onClose, onSuccess }: CreateAPIProductDialogProps) => {\n const classes = useStyles();\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n\n const [name, setName] = useState('');\n const [displayName, setDisplayName] = useState('');\n const [description, setDescription] = useState('');\n const [version, setVersion] = useState('v1');\n const [approvalMode, setApprovalMode] = useState<'automatic' | 'manual'>('manual');\n const [publishStatus, setPublishStatus] = useState<'Draft' | 'Published'>('Published');\n const [tags, setTags] = useState<string[]>([]);\n const [tagInput, setTagInput] = useState('');\n const [selectedHTTPRoute, setSelectedHTTPRoute] = useState('');\n const [contactEmail, setContactEmail] = useState('');\n const [contactTeam, setContactTeam] = useState('');\n const [docsURL, setDocsURL] = useState('');\n const [openAPISpec, setOpenAPISpec] = useState('');\n const [error, setError] = useState('');\n const [creating, setCreating] = useState(false);\n\n const { value: httpRoutes, loading: httpRoutesLoading } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/httproutes`);\n const data = await response.json();\n // filter to only show httproutes annotated for backstage exposure\n return (data.items || []).filter((route: any) =>\n route.metadata.annotations?.['backstage.io/expose'] === 'true'\n );\n }, [backendUrl, fetchApi, open]);\n\n // load planpolicies with full details to show associated plans\n const { value: planPolicies } = useAsync(async () => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/planpolicies`);\n return await response.json();\n }, [backendUrl, fetchApi, open]);\n\n // find planpolicy associated with selected httproute\n const getPlanPolicyForRoute = (routeNamespace: string, routeName: string) => {\n if (!planPolicies?.items) return null;\n\n return planPolicies.items.find((pp: any) => {\n const ref = pp.targetRef;\n return (\n ref?.kind === 'HTTPRoute' &&\n ref?.name === routeName &&\n (!ref?.namespace || ref?.namespace === routeNamespace)\n );\n });\n };\n\n const selectedRouteInfo = selectedHTTPRoute ? selectedHTTPRoute.split('/') : null;\n const selectedPolicy = selectedRouteInfo\n ? getPlanPolicyForRoute(selectedRouteInfo[0], selectedRouteInfo[1])\n : null;\n\n const handleAddTag = () => {\n if (tagInput.trim() && !tags.includes(tagInput.trim())) {\n setTags([...tags, tagInput.trim()]);\n setTagInput('');\n }\n };\n\n const handleDeleteTag = (tagToDelete: string) => {\n setTags(tags.filter(tag => tag !== tagToDelete));\n };\n\n const handleCreate = async () => {\n setError('');\n setCreating(true);\n\n try {\n if (!selectedHTTPRoute) {\n throw new Error('Please select an HTTPRoute');\n }\n\n const [selectedRouteNamespace, selectedRouteName] = selectedHTTPRoute.split('/');\n\n // derive namespace from selected httproute\n const namespace = selectedRouteNamespace;\n\n const apiProduct = {\n apiVersion: 'extensions.kuadrant.io/v1alpha1',\n kind: 'APIProduct',\n metadata: {\n name,\n namespace,\n },\n spec: {\n displayName,\n description,\n version,\n approvalMode,\n publishStatus,\n tags,\n targetRef: {\n group: 'gateway.networking.k8s.io',\n kind: 'HTTPRoute',\n name: selectedRouteName,\n namespace: selectedRouteNamespace,\n },\n ...(contactEmail || contactTeam ? {\n contact: {\n ...(contactEmail && { email: contactEmail }),\n ...(contactTeam && { team: contactTeam }),\n },\n } : {}),\n ...(docsURL || openAPISpec ? {\n documentation: {\n ...(docsURL && { docsURL }),\n ...(openAPISpec && { openAPISpec }),\n },\n } : {}),\n },\n };\n\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(apiProduct),\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'failed to create apiproduct');\n }\n\n onSuccess();\n handleClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setCreating(false);\n }\n };\n\n const handleClose = () => {\n setName('');\n setDisplayName('');\n setDescription('');\n setVersion('v1');\n setApprovalMode('manual');\n setPublishStatus('Published');\n setTags([]);\n setTagInput('');\n setSelectedHTTPRoute('');\n setContactEmail('');\n setContactTeam('');\n setDocsURL('');\n setOpenAPISpec('');\n setError('');\n onClose();\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"md\" fullWidth>\n <DialogTitle>Create API Product</DialogTitle>\n <DialogContent>\n {error && (\n <Alert severity=\"error\" style={{ marginBottom: 16 }}>\n {error}\n </Alert>\n )}\n\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Name\"\n value={name}\n onChange={e => setName(e.target.value)}\n placeholder=\"my-api\"\n helperText=\"Kubernetes resource name (lowercase, hyphens)\"\n margin=\"normal\"\n required\n disabled={creating}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Display Name\"\n value={displayName}\n onChange={e => setDisplayName(e.target.value)}\n placeholder=\"My API\"\n margin=\"normal\"\n required\n disabled={creating}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Version\"\n value={version}\n onChange={e => setVersion(e.target.value)}\n placeholder=\"v1\"\n margin=\"normal\"\n disabled={creating}\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n fullWidth\n select\n label=\"Approval Mode\"\n value={approvalMode}\n onChange={e => setApprovalMode(e.target.value as 'automatic' | 'manual')}\n margin=\"normal\"\n helperText=\"Automatic: keys are created immediately. Manual: requires approval.\"\n disabled={creating}\n >\n <MenuItem value=\"manual\">Manual</MenuItem>\n <MenuItem value=\"automatic\">Automatic</MenuItem>\n </TextField>\n </Grid>\n <Grid item xs={12}>\n <TextField\n fullWidth\n select\n label=\"Publish Status\"\n value={publishStatus}\n onChange={e => setPublishStatus(e.target.value as 'Draft' | 'Published')}\n margin=\"normal\"\n helperText=\"Draft: hidden from catalog. Published: visible to consumers.\"\n disabled={creating}\n >\n <MenuItem value=\"Draft\">Draft</MenuItem>\n <MenuItem value=\"Published\">Published</MenuItem>\n </TextField>\n </Grid>\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"Description\"\n value={description}\n onChange={e => setDescription(e.target.value)}\n placeholder=\"API description\"\n margin=\"normal\"\n multiline\n rows={2}\n required\n disabled={creating}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\" gutterBottom style={{ marginTop: 16 }}>\n Tags\n </Typography>\n <Box display=\"flex\" flexWrap=\"wrap\" marginBottom={1} style={{ gap: 8 }}>\n {tags.map(tag => (\n <Chip\n key={tag}\n label={tag}\n onDelete={creating ? undefined : () => handleDeleteTag(tag)}\n size=\"small\"\n disabled={creating}\n />\n ))}\n </Box>\n <Box display=\"flex\" style={{ gap: 8 }}>\n <TextField\n fullWidth\n size=\"small\"\n value={tagInput}\n onChange={e => setTagInput(e.target.value)}\n onKeyPress={e => e.key === 'Enter' && handleAddTag()}\n placeholder=\"Add tag\"\n disabled={creating}\n />\n <Button onClick={handleAddTag} variant=\"outlined\" size=\"small\" disabled={creating}>\n Add\n </Button>\n </Box>\n </Grid>\n\n <Grid item xs={12}>\n <TextField\n fullWidth\n select\n label=\"HTTPRoute\"\n value={selectedHTTPRoute}\n onChange={e => setSelectedHTTPRoute(e.target.value)}\n margin=\"normal\"\n required\n helperText=\"Select an HTTPRoute (backstage.io/expose: true). APIProduct will be created in the same namespace.\"\n disabled={httpRoutesLoading || creating}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n >\n {httpRoutesLoading && (\n <MenuItem value=\"\">Loading...</MenuItem>\n )}\n {!httpRoutesLoading && httpRoutes && httpRoutes.length === 0 && (\n <MenuItem value=\"\">No HTTPRoutes available</MenuItem>\n )}\n {!httpRoutesLoading && httpRoutes && httpRoutes.map((route: any) => (\n <MenuItem\n key={`${route.metadata.namespace}/${route.metadata.name}`}\n value={`${route.metadata.namespace}/${route.metadata.name}`}\n >\n {route.metadata.name} ({route.metadata.namespace})\n </MenuItem>\n ))}\n </TextField>\n </Grid>\n {selectedHTTPRoute && (\n <Grid item xs={12}>\n <PlanPolicyDetails\n selectedPolicy={selectedPolicy}\n alertSeverity=\"warning\"\n alertMessage=\"No PlanPolicy found for this HTTPRoute. API keys and rate limiting may not be available.\"\n includeTopMargin={true}\n />\n </Grid>\n )}\n\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Contact Email\"\n value={contactEmail}\n onChange={e => setContactEmail(e.target.value)}\n placeholder=\"api-team@example.com\"\n margin=\"normal\"\n disabled={creating}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Contact Team\"\n value={contactTeam}\n onChange={e => setContactTeam(e.target.value)}\n placeholder=\"platform-team\"\n margin=\"normal\"\n disabled={creating}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Docs URL\"\n value={docsURL}\n onChange={e => setDocsURL(e.target.value)}\n placeholder=\"https://api.example.com/docs\"\n margin=\"normal\"\n disabled={creating}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"OpenAPI Spec URL\"\n value={openAPISpec}\n onChange={e => setOpenAPISpec(e.target.value)}\n placeholder=\"https://api.example.com/openapi.json\"\n margin=\"normal\"\n disabled={creating}\n />\n </Grid>\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={creating}>Cancel</Button>\n <Button\n onClick={handleCreate}\n color=\"primary\"\n variant=\"contained\"\n disabled={creating || !name || !displayName || !description || !selectedHTTPRoute}\n startIcon={creating ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n >\n {creating ? 'Creating...' : 'Create'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Box,\n Typography,\n Chip,\n Grid,\n MenuItem,\n CircularProgress,\n makeStyles,\n} from '@material-ui/core';\nimport { useApi, configApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport { Alert } from '@material-ui/lab';\nimport { Progress } from '@backstage/core-components';\nimport useAsync from 'react-use/lib/useAsync';\nimport { PlanPolicyDetails } from '../PlanPolicyDetailsCard';\n\nconst useStyles = makeStyles({\n asterisk: {\n color: '#f44336',\n },\n});\n\ninterface EditAPIProductDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n namespace: string;\n name: string;\n}\n\nexport const EditAPIProductDialog = ({open, onClose, onSuccess, namespace, name}: EditAPIProductDialogProps) => {\n const classes = useStyles();\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [loading, setLoading] = useState(false);\n const [displayName, setDisplayName] = useState('');\n const [description, setDescription] = useState('');\n const [version, setVersion] = useState('v1');\n const [publishStatus, setPublishStatus] = useState<'Draft' | 'Published'>('Draft');\n const [approvalMode, setApprovalMode] = useState<'automatic' | 'manual'>('manual');\n const [tags, setTags] = useState<string[]>([]);\n const [targetRef, setTargetRef] = useState<any>(null);\n const [tagInput, setTagInput] = useState('');\n const [contactEmail, setContactEmail] = useState('');\n const [contactTeam, setContactTeam] = useState('');\n const [docsURL, setDocsURL] = useState('');\n const [openAPISpec, setOpenAPISpec] = useState('');\n const [error, setError] = useState('');\n const [saving, setSaving] = useState(false);\n\n // Load APIProduct data when dialog opens\n useEffect(() => {\n if (open && namespace && name) {\n setLoading(true);\n setError('');\n\n fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts/${namespace}/${name}`)\n .then(async res => {\n if (!res.ok) {\n const errorData = await res.json();\n throw new Error(errorData.error || `Failed to fetch API product: ${res.status}`);\n }\n return res.json();\n })\n .then(data => {\n setDisplayName(data.spec.displayName || '');\n setDescription(data.spec.description || '');\n setVersion(data.spec.version || 'v1');\n setPublishStatus(data.spec.publishStatus || 'Draft');\n setApprovalMode(data.spec.approvalMode || 'manual');\n setTags(data.spec.tags || []);\n setTargetRef(data.spec.targetRef || null);\n setContactEmail(data.spec.contact?.email || '');\n setContactTeam(data.spec.contact?.team || '');\n setDocsURL(data.spec.documentation?.docsURL || '');\n setOpenAPISpec(data.spec.documentation?.openAPISpec || '');\n setLoading(false);\n })\n .catch(err => {\n setError(err.message || 'Failed to load API product');\n setLoading(false);\n });\n }\n }, [open, namespace, name, backendUrl, fetchApi]);\n\n // load planpolicies with full details to show associated plans\n const { value: planPolicies } = useAsync(async () => {\n if (!open) return null;\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/planpolicies`);\n return await response.json();\n }, [backendUrl, fetchApi, open]);\n\n // find planpolicy associated with targetRef\n const selectedPolicy = React.useMemo(() => {\n if (!planPolicies?.items || !targetRef) return null;\n\n return planPolicies.items.find((pp: any) => {\n const ref = pp.targetRef;\n return (\n ref?.kind === 'HTTPRoute' &&\n ref?.name === targetRef.name &&\n (!ref?.namespace || ref?.namespace === (targetRef.namespace || namespace))\n );\n });\n }, [planPolicies, targetRef, namespace]);\n\n const handleAddTag = () => {\n if (tagInput.trim() && !tags.includes(tagInput.trim())) {\n setTags([...tags, tagInput.trim()]);\n setTagInput('');\n }\n };\n\n const handleDeleteTag = (tagToDelete: string) => {\n setTags(tags.filter(tag => tag !== tagToDelete));\n };\n\n const handleSave = async () => {\n setError('');\n setSaving(true);\n\n try {\n const patch = {\n spec: {\n displayName,\n description,\n version,\n publishStatus,\n approvalMode,\n tags,\n targetRef,\n ...(contactEmail || contactTeam ? {\n contact: {\n ...(contactEmail && { email: contactEmail }),\n ...(contactTeam && { team: contactTeam }),\n },\n } : {}),\n ...(docsURL || openAPISpec ? {\n documentation: {\n ...(docsURL && { docsURL }),\n ...(openAPISpec && { openAPISpec }),\n },\n } : {}),\n },\n };\n\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${namespace}/${name}`,\n {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(patch),\n }\n );\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.error || 'failed to update apiproduct');\n }\n\n onSuccess();\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"md\" fullWidth>\n <DialogTitle>Edit API Product</DialogTitle>\n <DialogContent>\n {error && (\n <Alert severity=\"error\" style={{ marginBottom: 16 }}>\n {error}\n </Alert>\n )}\n\n {loading ? (\n <Progress />\n ) : (\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Name\"\n value={name}\n disabled\n helperText=\"Kubernetes resource name (immutable)\"\n margin=\"normal\"\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Namespace\"\n value={namespace}\n disabled\n helperText=\"Derived from HTTPRoute (immutable)\"\n margin=\"normal\"\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Display Name\"\n value={displayName}\n onChange={e => setDisplayName(e.target.value)}\n placeholder=\"My API\"\n margin=\"normal\"\n required\n disabled={saving}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Version\"\n value={version}\n onChange={e => setVersion(e.target.value)}\n placeholder=\"v1\"\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n select\n label=\"Publish Status\"\n value={publishStatus}\n onChange={e => setPublishStatus(e.target.value as 'Draft' | 'Published')}\n margin=\"normal\"\n helperText=\"Draft: Hidden from catalog. Published: Visible in catalog.\"\n disabled={saving}\n >\n <MenuItem value=\"Draft\">Draft (Hidden)</MenuItem>\n <MenuItem value=\"Published\">Published (Visible)</MenuItem>\n </TextField>\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n select\n label=\"Approval Mode\"\n value={approvalMode}\n onChange={e => setApprovalMode(e.target.value as 'automatic' | 'manual')}\n margin=\"normal\"\n helperText=\"Automatic: keys created immediately. Manual: requires approval.\"\n disabled={saving}\n >\n <MenuItem value=\"manual\">Manual</MenuItem>\n <MenuItem value=\"automatic\">Automatic</MenuItem>\n </TextField>\n </Grid>\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"Description\"\n value={description}\n onChange={e => setDescription(e.target.value)}\n placeholder=\"API description\"\n margin=\"normal\"\n multiline\n rows={2}\n required\n disabled={saving}\n InputLabelProps={{\n classes: {\n asterisk: classes.asterisk,\n },\n }}\n />\n </Grid>\n\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\" gutterBottom style={{ marginTop: 16 }}>\n Tags\n </Typography>\n <Box display=\"flex\" flexWrap=\"wrap\" marginBottom={1} style={{ gap: 8 }}>\n {tags.map(tag => (\n <Chip\n key={tag}\n label={tag}\n onDelete={saving ? undefined : () => handleDeleteTag(tag)}\n size=\"small\"\n disabled={saving}\n />\n ))}\n </Box>\n <Box display=\"flex\" style={{ gap: 8 }}>\n <TextField\n fullWidth\n size=\"small\"\n value={tagInput}\n onChange={e => setTagInput(e.target.value)}\n onKeyPress={e => e.key === 'Enter' && handleAddTag()}\n placeholder=\"Add tag\"\n disabled={saving}\n />\n <Button onClick={handleAddTag} variant=\"outlined\" size=\"small\" disabled={saving}>\n Add\n </Button>\n </Box>\n </Grid>\n {targetRef && (\n <>\n <Grid item xs={12}>\n <TextField\n fullWidth\n label=\"HTTPRoute\"\n value={`${targetRef.namespace || namespace}/${targetRef.name}`}\n disabled\n helperText=\"Target HTTPRoute (immutable)\"\n margin=\"normal\"\n />\n </Grid>\n\n <Grid item xs={12}>\n <PlanPolicyDetails\n selectedPolicy={selectedPolicy}\n alertSeverity=\"info\"\n alertMessage=\"No PlanPolicy found for this HTTPRoute.\"\n includeTopMargin={false}\n />\n </Grid>\n </>\n )}\n\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Contact Email\"\n value={contactEmail}\n onChange={e => setContactEmail(e.target.value)}\n placeholder=\"api-team@example.com\"\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Contact Team\"\n value={contactTeam}\n onChange={e => setContactTeam(e.target.value)}\n placeholder=\"platform-team\"\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"Docs URL\"\n value={docsURL}\n onChange={e => setDocsURL(e.target.value)}\n placeholder=\"https://api.example.com/docs\"\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField\n fullWidth\n label=\"OpenAPI Spec URL\"\n value={openAPISpec}\n onChange={e => setOpenAPISpec(e.target.value)}\n placeholder=\"https://api.example.com/openapi.json\"\n margin=\"normal\"\n disabled={saving}\n />\n </Grid>\n </Grid>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={saving}>Cancel</Button>\n <Button\n onClick={handleSave}\n color=\"primary\"\n variant=\"contained\"\n disabled={saving || loading || !displayName || !description}\n startIcon={saving ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n >\n {saving ? 'Saving...' : 'Save'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import React, { useState } from 'react';\nimport { Typography, Grid, Box, Chip, Button, IconButton } from '@material-ui/core';\nimport AddIcon from '@material-ui/icons/Add';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport {\n InfoCard,\n Header,\n Page,\n Content,\n SupportButton,\n Progress,\n ResponseErrorPanel,\n Link,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useApi, configApiRef, fetchApiRef, alertApiRef, identityApiRef } from '@backstage/core-plugin-api';\nimport { ApprovalQueueCard } from '../ApprovalQueueCard';\nimport { MyApiKeysCard } from '../MyApiKeysCard';\nimport { PermissionGate } from '../PermissionGate';\nimport { CreateAPIProductDialog } from '../CreateAPIProductDialog';\nimport {\n kuadrantApiProductCreatePermission,\n kuadrantApiProductDeleteOwnPermission,\n kuadrantApiProductDeleteAllPermission,\n kuadrantApiProductUpdateOwnPermission,\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductListPermission,\n kuadrantApiKeyRequestReadAllPermission,\n kuadrantApiKeyRequestReadOwnPermission,\n kuadrantPlanPolicyListPermission,\n} from '../../permissions';\nimport { useKuadrantPermission } from '../../utils/permissions';\nimport { EditAPIProductDialog } from '../EditAPIProductDialog';\nimport { ConfirmDeleteDialog } from '../ConfirmDeleteDialog';\n\ntype KuadrantResource = {\n metadata: {\n name: string;\n namespace: string;\n creationTimestamp: string;\n annotations?: Record<string, string>;\n };\n spec?: any;\n};\n\ntype KuadrantList = {\n items: KuadrantResource[];\n};\n\nexport const ResourceList = () => {\n const config = useApi(configApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const identityApi = useApi(identityApiRef);\n const backendUrl = config.getString('backend.baseUrl');\n const [userEntityRef, setUserEntityRef] = useState<string>('');\n const [createDialogOpen, setCreateDialogOpen] = useState(false);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [refreshTrigger, setRefreshTrigger] = useState(0);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [apiProductToDelete, setApiProductToDelete] = useState<{ namespace: string; name: string } | null>(null);\n const [apiProductToEdit, setApiProductToEdit] = useState<{ namespace: string; name: string } | null>(null);\n const [deleting, setDeleting] = useState(false);\n\n const {\n allowed: canCreateApiProduct,\n loading: createPermissionLoading,\n error: createPermissionError,\n } = useKuadrantPermission(kuadrantApiProductCreatePermission);\n\n const {\n allowed: canViewAllRequests,\n loading: approvalQueueAllPermissionLoading,\n } = useKuadrantPermission(kuadrantApiKeyRequestReadAllPermission);\n\n const {\n allowed: canViewOwnRequests,\n loading: approvalQueueOwnPermissionLoading,\n error: approvalQueuePermissionError,\n } = useKuadrantPermission(kuadrantApiKeyRequestReadOwnPermission);\n\n const canViewApprovalQueue = canViewAllRequests || canViewOwnRequests;\n const approvalQueuePermissionLoading = approvalQueueAllPermissionLoading || approvalQueueOwnPermissionLoading;\n\n const {\n allowed: canDeleteOwnApiProduct,\n loading: deleteOwnPermissionLoading,\n } = useKuadrantPermission(kuadrantApiProductDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllApiProducts,\n loading: deleteAllPermissionLoading,\n error: deletePermissionError,\n } = useKuadrantPermission(kuadrantApiProductDeleteAllPermission);\n\n const {\n allowed: canUpdateOwnApiProduct,\n } = useKuadrantPermission(kuadrantApiProductUpdateOwnPermission);\n\n const {\n allowed: canUpdateAllApiProducts,\n } = useKuadrantPermission(kuadrantApiProductUpdateAllPermission);\n\n const deletePermissionLoading = deleteOwnPermissionLoading || deleteAllPermissionLoading;\n\n const {\n allowed: canListPlanPolicies,\n loading: planPolicyPermissionLoading,\n error: planPolicyPermissionError,\n } = useKuadrantPermission(kuadrantPlanPolicyListPermission);\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n setUserEntityRef(identity.userEntityRef);\n }, [identityApi]);\n\n const { value: apiProducts, loading: apiProductsLoading, error: apiProductsError } = useAsync(async (): Promise<KuadrantList> => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/apiproducts`);\n return await response.json();\n }, [backendUrl, fetchApi, refreshTrigger]);\n\n const { value: planPolicies, loading: planPoliciesLoading, error: planPoliciesError } = useAsync(async (): Promise<KuadrantList> => {\n const response = await fetchApi.fetch(`${backendUrl}/api/kuadrant/planpolicies`);\n return await response.json();\n }, [backendUrl, fetchApi, refreshTrigger]);\n\n const loading = apiProductsLoading || planPoliciesLoading || createPermissionLoading || approvalQueuePermissionLoading || deletePermissionLoading || planPolicyPermissionLoading;\n const error = apiProductsError || planPoliciesError;\n const permissionError = createPermissionError || approvalQueuePermissionError || deletePermissionError || planPolicyPermissionError;\n\n const handleCreateSuccess = () => {\n setRefreshTrigger(prev => prev + 1);\n alertApi.post({ message: 'API Product created', severity: 'success', display: 'transient' });\n };\n\n const handleEditClick = (namespace: string, name: string) => {\n setApiProductToEdit({ namespace, name });\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefreshTrigger(prev => prev + 1);\n alertApi.post({ message: 'API Product updated', severity: 'success', display: 'transient' });\n };\n\n const handleDeleteClick = (namespace: string, name: string) => {\n setApiProductToDelete({ namespace, name });\n setDeleteDialogOpen(true);\n };\n\n const handleDeleteConfirm = async () => {\n if (!apiProductToDelete) return;\n\n setDeleting(true);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts/${apiProductToDelete.namespace}/${apiProductToDelete.name}`,\n { method: 'DELETE' }\n );\n\n if (!response.ok) {\n throw new Error('failed to delete apiproduct');\n }\n\n setRefreshTrigger(prev => prev + 1);\n alertApi.post({ message: 'API Product deleted', severity: 'success', display: 'transient' });\n } catch (err) {\n console.error('error deleting apiproduct:', err);\n alertApi.post({ message: 'Failed to delete API Product', severity: 'error', display: 'transient' });\n } finally {\n setDeleting(false);\n setDeleteDialogOpen(false);\n setApiProductToDelete(null);\n }\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogOpen(false);\n setApiProductToDelete(null);\n };\n\n const formatDate = (dateString: string) => {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-GB', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n };\n\n const columns: TableColumn[] = [\n {\n title: 'Name',\n field: 'spec.displayName',\n render: (row: any) => {\n const publishStatus = row.spec?.publishStatus;\n const isPublished = publishStatus === 'Published';\n const displayName = row.spec?.displayName ?? row.metadata.name;\n\n if (isPublished) {\n return (\n <Link to={`/catalog/default/api/${row.metadata.name}/api-product`}>\n <strong>{displayName}</strong>\n </Link>\n );\n }\n\n return (\n <span className=\"text-muted\">\n <strong>{displayName}</strong>\n </span>\n );\n },\n customFilterAndSearch: (term, row: any) => {\n const displayName = row.spec?.displayName || row.metadata.name || '';\n return displayName.toLowerCase().includes(term.toLowerCase());\n },\n },\n {\n title: 'Resource Name',\n field: 'metadata.name',\n },\n {\n title: 'Version',\n field: 'spec.version',\n render: (row: any) => row.spec?.version || '-',\n },\n {\n title: 'HTTPRoute',\n field: 'spec.targetRef.name',\n render: (row: any) => row.spec?.targetRef?.name || '-',\n },\n {\n title: 'Publish Status',\n field: 'spec.publishStatus',\n render: (row: any) => {\n const status = row.spec?.publishStatus || 'Draft';\n return (\n <Chip\n label={status}\n size=\"small\"\n color={status === 'Published' ? 'primary' : 'default'}\n />\n );\n },\n },\n {\n title: 'Approval Mode',\n field: 'spec.approvalMode',\n render: (row: any) => {\n const mode = row.spec?.approvalMode || 'manual';\n return (\n <Chip\n label={mode}\n size=\"small\"\n color={mode === 'automatic' ? 'secondary' : 'default'}\n />\n );\n },\n },\n {\n title: 'Namespace',\n field: 'metadata.namespace',\n },\n {\n title: 'Created',\n field: 'metadata.creationTimestamp',\n render: (row: any) => formatDate(row.metadata.creationTimestamp),\n },\n {\n title: 'Actions',\n field: 'actions',\n filtering: false,\n render: (row: any) => {\n const owner = row.metadata?.annotations?.['backstage.io/owner'];\n const isOwner = owner === userEntityRef;\n const canEdit = canUpdateAllApiProducts || (canUpdateOwnApiProduct && isOwner);\n const canDelete = canDeleteAllApiProducts || (canDeleteOwnApiProduct && isOwner);\n\n if (!canEdit && !canDelete) return null;\n\n return (\n <Box display=\"flex\" style={{ gap: 4 }}>\n {canEdit && (\n <IconButton\n size=\"small\"\n onClick={() => handleEditClick(row.metadata.namespace, row.metadata.name)}\n title=\"Edit API Product\"\n >\n <EditIcon fontSize=\"small\" />\n </IconButton>\n )}\n\n {canDelete && (\n <IconButton\n size=\"small\"\n onClick={() => handleDeleteClick(row.metadata.namespace, row.metadata.name)}\n title=\"Delete API Product\"\n >\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n );\n },\n },\n ];\n\n const planPolicyColumns: TableColumn[] = [\n {\n title: 'Name',\n field: 'metadata.name',\n render: (row: any) => (\n <Link to={`/kuadrant/planpolicy/${row.metadata.namespace}/${row.metadata.name}`}>\n <strong>{row.metadata.name}</strong>\n </Link>\n ),\n },\n {\n title: 'Namespace',\n field: 'metadata.namespace',\n },\n ];\n\n const renderResources = (resources: KuadrantResource[] | undefined) => {\n if (!resources || resources.length === 0) {\n return <Typography variant=\"body2\" color=\"textSecondary\">No API products found</Typography>;\n }\n return (\n <Table\n options={{\n paging: resources.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={columns}\n data={resources}\n />\n );\n };\n\n const renderPlanPolicies = (resources: KuadrantResource[] | undefined) => {\n if (!resources || resources.length === 0) {\n return <Typography variant=\"body2\" color=\"textSecondary\">No plan policies found</Typography>;\n }\n return (\n <Table\n options={{ paging: false, search: false, toolbar: false }}\n columns={planPolicyColumns}\n data={resources}\n />\n );\n };\n\n return (\n <Page themeId=\"tool\">\n <Header title=\"Kuadrant\" subtitle=\"API management for Kubernetes\">\n <SupportButton>Manage API products and access requests</SupportButton>\n </Header>\n <Content>\n {loading && <Progress />}\n {error && <ResponseErrorPanel error={error} />}\n {permissionError && (\n <Box p={2}>\n <Typography color=\"error\">\n unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n permission: {createPermissionError ? 'kuadrant.apiproduct.create' :\n deletePermissionError ? 'kuadrant.apiproduct.delete' :\n approvalQueuePermissionError ? 'kuadrant.apikeyrequest.read.all' :\n planPolicyPermissionError ? 'kuadrant.planpolicy.list' : 'unknown'}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n please try again or contact your administrator\n </Typography>\n </Box>\n )}\n {!loading && !error && !permissionError && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <MyApiKeysCard />\n </Grid>\n\n <Grid item>\n <InfoCard\n title=\"API Products\"\n action={\n canCreateApiProduct ? (\n <Box display=\"flex\" alignItems=\"center\" height=\"100%\" mt={1}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n startIcon={<AddIcon />}\n onClick={() => setCreateDialogOpen(true)}\n >\n Create API Product\n </Button>\n </Box>\n ) : undefined\n }\n >\n {renderResources(apiProducts?.items)}\n </InfoCard>\n </Grid>\n\n {canListPlanPolicies && (\n <Grid item>\n <InfoCard title=\"Plan Policies\">\n {renderPlanPolicies(planPolicies?.items)}\n </InfoCard>\n </Grid>\n )}\n\n {canViewApprovalQueue && (\n <Grid item>\n <ApprovalQueueCard />\n </Grid>\n )}\n </Grid>\n )}\n <CreateAPIProductDialog\n open={createDialogOpen}\n onClose={() => setCreateDialogOpen(false)}\n onSuccess={handleCreateSuccess}\n />\n <EditAPIProductDialog\n open={editDialogOpen}\n onClose={() => setEditDialogOpen(false)}\n onSuccess={handleEditSuccess}\n namespace={apiProductToEdit?.namespace || ''}\n name={apiProductToEdit?.name || ''}\n />\n <ConfirmDeleteDialog\n open={deleteDialogOpen}\n title=\"Delete API Product\"\n description={`This will permanently delete \"${apiProductToDelete?.name}\" from namespace \"${apiProductToDelete?.namespace}\" and remove it from Kubernetes. Any associated API keys will stop working.`}\n confirmText={apiProductToDelete?.name}\n severity=\"high\"\n deleting={deleting}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n </Content>\n </Page>\n );\n};\n\nexport const KuadrantPage = () => {\n return (\n <PermissionGate\n permission={kuadrantApiProductListPermission}\n errorMessage=\"you don't have permission to view the Kuadrant page\"\n >\n <ResourceList />\n </PermissionGate>\n );\n};\n"],"names":["ConfirmDeleteDialog","open","title","description","confirmText","severity","deleting","onConfirm","onCancel","inputValue","setInputValue","useState","useEffect","requiresTextConfirmation","canConfirm","Dialog","onClose","undefined","maxWidth","fullWidth","DialogTitle","Box","display","alignItems","style","gap","WarningIcon","color","span","DialogContent","DialogContentText","mt","Typography","variant","gutterBottom","strong","TextField","size","value","onChange","e","target","disabled","autoFocus","placeholder","DialogActions","Button","onClick","startIcon","CircularProgress","EditAPIKeyRequestDialog","onSuccess","request","availablePlans","config","useApi","configApiRef","fetchApi","fetchApiRef","backendUrl","getString","planTier","setPlanTier","useCase","setUseCase","saving","setSaving","error","setError","spec","handleClose","mb","p","bgcolor","borderRadius","FormControl","margin","InputLabel","Select","map","plan","limitDesc","Object","entries","limits","key","val","join","MenuItem","tier","label","multiline","rows","helperText","async","patch","trim","response","fetch","metadata","namespace","name","method","headers","body","JSON","stringify","ok","errorData","json","catch","Error","status","err","console","message","MyApiKeysCard","deleteDialogState","identityApi","identityApiRef","alertApi","alertApiRef","selectedTab","setSelectedTab","setUserId","visibleKeys","setVisibleKeys","Set","menuAnchor","setMenuAnchor","menuRequest","setMenuRequest","editDialogState","setEditDialogState","plans","refresh","setRefresh","setDeleting","setDeleteDialogState","useAsync","identity","getBackstageIdentity","extractedUserId","userEntityRef","split","log","optimisticallyDeleted","setOptimisticallyDeleted","requests","loading","items","InfoCard","Progress","allRequests","filter","r","has","approvedRequests","phase","pendingRequests","rejectedRequests","handleMenuClose","handleEdit","apiProductResponse","apiNamespace","apiName","apiProduct","handleDeleteClick","columns","field","render","row","Link","to","Chip","Tooltip","placement","overflow","textOverflow","whiteSpace","reason","reviewedBy","reviewedDate","reviewedAt","Date","toLocaleDateString","filtering","apiKey","isVisible","fontFamily","fontSize","repeat","IconButton","toggleKeyVisibility","keyName","prev","newSet","delete","add","VisibilityOffIcon","VisibilityIcon","creationTimestamp","date","stopPropagation","rect","currentTarget","getBoundingClientRect","top","bottom","left","aria-controls","aria-haspopup","MoreVertIcon","tabData","getTabData","tabColumns","col","getTabColumns","subheader","length","Tabs","_","newValue","indicatorColor","textColor","Tab","textAlign","Table","options","paging","pageSize","search","debounceInterval","toolbar","emptyRowsWhenPaging","data","item","id","Menu","Boolean","anchorReference","anchorPosition","push","requestName","post","next","PermissionGate","children","permission","fallback","errorMessage","allowed","useKuadrantPermission","PlanPolicyDetails","selectedPolicy","alertSeverity","alertMessage","includeTopMargin","border","fontWeight","marginTop","flexWrap","idx","limitText","daily","monthly","yearly","some","Alert","useStyles","makeStyles","asterisk","CreateAPIProductDialog","classes","setName","displayName","setDisplayName","setDescription","version","setVersion","approvalMode","setApprovalMode","publishStatus","setPublishStatus","tags","setTags","tagInput","setTagInput","selectedHTTPRoute","setSelectedHTTPRoute","contactEmail","setContactEmail","contactTeam","setContactTeam","docsURL","setDocsURL","openAPISpec","setOpenAPISpec","creating","setCreating","httpRoutes","httpRoutesLoading","route","annotations","planPolicies","selectedRouteInfo","routeNamespace","routeName","find","pp","ref","targetRef","kind","handleAddTag","includes","marginBottom","Grid","container","spacing","xs","required","InputLabelProps","select","tag","onDelete","handleDeleteTag","tagToDelete","onKeyPress","selectedRouteNamespace","selectedRouteName","apiVersion","group","contact","email","team","documentation","String","EditAPIProductDialog","setLoading","setTargetRef","then","res","React","ResourceList","setUserEntityRef","createDialogOpen","setCreateDialogOpen","editDialogOpen","setEditDialogOpen","refreshTrigger","setRefreshTrigger","deleteDialogOpen","setDeleteDialogOpen","apiProductToDelete","setApiProductToDelete","apiProductToEdit","setApiProductToEdit","canCreateApiProduct","createPermissionLoading","createPermissionError","kuadrantApiProductCreatePermission","canViewAllRequests","approvalQueueAllPermissionLoading","kuadrantApiKeyRequestReadAllPermission","canViewOwnRequests","approvalQueueOwnPermissionLoading","approvalQueuePermissionError","kuadrantApiKeyRequestReadOwnPermission","canViewApprovalQueue","approvalQueuePermissionLoading","canDeleteOwnApiProduct","deleteOwnPermissionLoading","kuadrantApiProductDeleteOwnPermission","canDeleteAllApiProducts","deleteAllPermissionLoading","deletePermissionError","kuadrantApiProductDeleteAllPermission","canUpdateOwnApiProduct","kuadrantApiProductUpdateOwnPermission","canUpdateAllApiProducts","kuadrantApiProductUpdateAllPermission","deletePermissionLoading","canListPlanPolicies","planPolicyPermissionLoading","planPolicyPermissionError","kuadrantPlanPolicyListPermission","apiProducts","apiProductsLoading","apiProductsError","planPoliciesLoading","planPoliciesError","permissionError","isPublished","className","customFilterAndSearch","term","toLowerCase","mode","formatDate","dateString","year","month","day","isOwner","canEdit","canDelete","handleEditClick","EditIcon","DeleteIcon","planPolicyColumns","Page","themeId","Header","subtitle","SupportButton","Content","ResponseErrorPanel","direction","action","height","AddIcon","resources","renderPlanPolicies","ApprovalQueueCard","KuadrantPage","kuadrantApiProductListPermission"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[8441],{18466:(e,t,a)=>{var n=a(4293),r=a(78920);t.A=void 0;var i=r(a(95478)),o=(0,n(a(74044)).default)(i.createElement("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");t.A=o},27799:(e,t,a)=>{var n=a(4293),r=a(78920);t.A=void 0;var i=r(a(95478)),o=(0,n(a(74044)).default)(i.createElement("path",{d:"M21 5v6.59l-3-3.01-4 4.01-4-4-4 4-3-3.01V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2zm-3 6.42l3 3.01V19c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2v-6.58l3 2.99 4-4 4 4 4-3.99z"}),"BrokenImage");t.A=o},32269:(e,t,a)=>{var n=a(4293),r=a(78920);t.A=void 0;var i=r(a(95478)),o=(0,n(a(74044)).default)(i.createElement("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"}),"Visibility");t.A=o},39590:(e,t,a)=>{var n=a(4293),r=a(78920);t.A=void 0;var i=r(a(95478)),o=(0,n(a(74044)).default)(i.createElement("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"}),"Delete");t.A=o},45210:(e,t,a)=>{a.d(t,{Y:()=>L});var n=a(31085),r=a(22097),i=a(10394),o=a(64947),l=a(93453),c=a(29365),s=a(46423),p=a(5951),d=a(26343),m=a(28233),u=a(55197),h=a(37976),g=a(72501),f=a(5893),v=a(95478),A=(a(45250),a(42469),a(16098)),b=a(67550);const C=()=>{const{t:e}=(0,b.i)(A.O);return{url:"https://github.com/backstage/backstage/issues",items:[{title:e("supportConfig.default.title"),icon:"warning",links:[{title:e("supportConfig.default.linkTitle"),url:"https://github.com/backstage/backstage/blob/master/app-config.yaml"}]}]}};var x=a(27799);function y(e){const{id:t,Fallback:a=x.A,...i}=e,o=(0,r.useApp)().getSystemIcon(t)??a;return(0,n.jsx)(o,{...i})}function k(e){return(0,n.jsx)(y,{id:"help",...e})}var z=a(37725);const M=(0,h.makeStyles)({popoverList:{minWidth:260,maxWidth:400},menuItem:{whiteSpace:"normal"}},{name:"BackstageSupportButton"}),E=({icon:e})=>{const t=(0,r.useApp)(),a=e?t.getSystemIcon(e)??k:k;return(0,n.jsx)(a,{})},S=({link:e})=>(0,n.jsx)(z.N_,{to:e.url,children:e.title??e.url}),j=({item:e})=>(0,n.jsxs)(d.A,{button:!1,children:[(0,n.jsx)(s.A,{children:(0,n.jsx)(E,{icon:e.icon})}),(0,n.jsx)(p.A,{primary:e.title,secondary:e.links?.reduce((e,t,a)=>[...e,a>0&&(0,n.jsx)("br",{},a),(0,n.jsx)(S,{link:t},t.url)],[])})]});function L(e){const{t}=(0,b.i)(A.O),{title:a,items:s,children:p}=e,{items:h}=function(){const e=(0,r.useApiHolder)().get(r.configApiRef),t=e?.getOptionalConfig("app.support"),a=C();return t?{url:t.getString("url"),items:t.getConfigArray("items").flatMap(e=>({title:e.getString("title"),icon:e.getOptionalString("icon"),links:(e.getOptionalConfigArray("links")??[]).flatMap(e=>({url:e.getString("url"),title:e.getOptionalString("title")??""}))}))}:a}(),[x,y]=(0,v.useState)(!1),[z,E]=(0,v.useState)(null),S=M(),L=(0,r.useApi)(r.configApiRef).getOptionalConfig("app.support"),w=(0,f.A)(e=>e.breakpoints.down("sm")),I=e=>{E(e.currentTarget),y(!0)},O=()=>{y(!1)};return L?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.A,{display:"flex",ml:1,children:w?(0,n.jsx)(c.A,{color:"primary",size:"small",onClick:I,"data-testid":"support-button","aria-label":"Support",children:(0,n.jsx)(k,{})}):(0,n.jsx)(o.A,{"data-testid":"support-button","aria-label":"Support",color:"primary",onClick:I,startIcon:(0,n.jsx)(k,{}),children:t("supportButton.title")})}),(0,n.jsxs)(u.Ay,{"data-testid":"support-button-popover",open:x,anchorEl:z,anchorOrigin:{vertical:"bottom",horizontal:"right"},transformOrigin:{vertical:"top",horizontal:"right"},onClose:O,children:[(0,n.jsxs)(m.A,{className:S.popoverList,autoFocusItem:Boolean(z),children:[a&&(0,n.jsx)(d.A,{button:!1,alignItems:"flex-start",className:S.menuItem,children:(0,n.jsx)(g.A,{variant:"subtitle1",children:a})}),v.Children.map(p,(e,t)=>(0,n.jsx)(d.A,{button:!1,alignItems:"flex-start",className:S.menuItem,children:e},`child-${t}`)),(s??h).map((e,t)=>(0,n.jsx)(j,{item:e},`item-${t}`))]}),(0,n.jsx)(l.A,{children:(0,n.jsx)(o.A,{color:"primary",onClick:O,"aria-label":"Close",children:t("supportButton.close")})})]})]}):null}},55429:(e,t,a)=>{var n=a(4293),r=a(78920);t.A=void 0;var i=r(a(95478)),o=(0,n(a(74044)).default)(i.createElement("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"}),"CheckCircle");t.A=o},61524:(e,t,a)=>{var n=a(4293),r=a(78920);t.A=void 0;var i=r(a(95478)),o=(0,n(a(74044)).default)(i.createElement("path",{d:"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"}),"VisibilityOff");t.A=o},71407:(e,t,a)=>{var n=a(4293),r=a(78920);t.A=void 0;var i=r(a(95478)),o=(0,n(a(74044)).default)(i.createElement("path",{d:"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"}),"MoreVert");t.A=o},77225:(e,t,a)=>{var n=a(4293),r=a(78920);t.A=void 0;var i=r(a(95478)),o=(0,n(a(74044)).default)(i.createElement("path",{d:"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"}),"Warning");t.A=o},84441:(e,t,a)=>{a.d(t,{A:()=>x});var n=a(39850),r=a(89575),i=a(95478);function o(e){var t,a,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(a=o(e[t]))&&(n&&(n+=" "),n+=a);else for(t in e)e[t]&&(n&&(n+=" "),n+=t);return n}const l=function(){for(var e,t,a=0,n="";a<arguments.length;)(e=arguments[a++])&&(t=o(e))&&(n&&(n+=" "),n+=t);return n};var c=a(37976),s=a(4321),p=a(38483);const d=(0,p.A)(i.createElement("path",{d:"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z"}),"SuccessOutlined"),m=(0,p.A)(i.createElement("path",{d:"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"}),"ReportProblemOutlined"),u=(0,p.A)(i.createElement("path",{d:"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"ErrorOutline"),h=(0,p.A)(i.createElement("path",{d:"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z"}),"InfoOutlined"),g=(0,p.A)(i.createElement("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close");var f=a(29365),v=a(11192),A={success:i.createElement(d,{fontSize:"inherit"}),warning:i.createElement(m,{fontSize:"inherit"}),error:i.createElement(u,{fontSize:"inherit"}),info:i.createElement(h,{fontSize:"inherit"})},b=i.createElement(g,{fontSize:"small"}),C=i.forwardRef(function(e,t){var a=e.action,o=e.children,c=e.classes,p=e.className,d=e.closeText,m=void 0===d?"Close":d,u=e.color,h=e.icon,g=e.iconMapping,C=void 0===g?A:g,x=e.onClose,y=e.role,k=void 0===y?"alert":y,z=e.severity,M=void 0===z?"success":z,E=e.variant,S=void 0===E?"standard":E,j=(0,n.A)(e,["action","children","classes","className","closeText","color","icon","iconMapping","onClose","role","severity","variant"]);return i.createElement(s.A,(0,r.A)({role:k,square:!0,elevation:0,className:l(c.root,c["".concat(S).concat((0,v.A)(u||M))],p),ref:t},j),!1!==h?i.createElement("div",{className:c.icon},h||C[M]||A[M]):null,i.createElement("div",{className:c.message},o),null!=a?i.createElement("div",{className:c.action},a):null,null==a&&x?i.createElement("div",{className:c.action},i.createElement(f.A,{size:"small","aria-label":m,title:m,color:"inherit",onClick:x},b)):null)});const x=(0,c.withStyles)(function(e){var t="light"===e.palette.type?c.darken:c.lighten,a="light"===e.palette.type?c.lighten:c.darken;return{root:(0,r.A)({},e.typography.body2,{borderRadius:e.shape.borderRadius,backgroundColor:"transparent",display:"flex",padding:"6px 16px"}),standardSuccess:{color:t(e.palette.success.main,.6),backgroundColor:a(e.palette.success.main,.9),"& $icon":{color:e.palette.success.main}},standardInfo:{color:t(e.palette.info.main,.6),backgroundColor:a(e.palette.info.main,.9),"& $icon":{color:e.palette.info.main}},standardWarning:{color:t(e.palette.warning.main,.6),backgroundColor:a(e.palette.warning.main,.9),"& $icon":{color:e.palette.warning.main}},standardError:{color:t(e.palette.error.main,.6),backgroundColor:a(e.palette.error.main,.9),"& $icon":{color:e.palette.error.main}},outlinedSuccess:{color:t(e.palette.success.main,.6),border:"1px solid ".concat(e.palette.success.main),"& $icon":{color:e.palette.success.main}},outlinedInfo:{color:t(e.palette.info.main,.6),border:"1px solid ".concat(e.palette.info.main),"& $icon":{color:e.palette.info.main}},outlinedWarning:{color:t(e.palette.warning.main,.6),border:"1px solid ".concat(e.palette.warning.main),"& $icon":{color:e.palette.warning.main}},outlinedError:{color:t(e.palette.error.main,.6),border:"1px solid ".concat(e.palette.error.main),"& $icon":{color:e.palette.error.main}},filledSuccess:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.success.main},filledInfo:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.info.main},filledWarning:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.warning.main},filledError:{color:"#fff",fontWeight:e.typography.fontWeightMedium,backgroundColor:e.palette.error.main},icon:{marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9},message:{padding:"8px 0"},action:{display:"flex",alignItems:"center",marginLeft:"auto",paddingLeft:16,marginRight:-8}}},{name:"MuiAlert"})(C)}}]);
2
+ //# sourceMappingURL=8441.62394cfd.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/8441.62394cfd.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Add.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/BrokenImage.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Visibility.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Delete.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/hooks/useSupportConfig.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/icons/icons.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/core-components/dist/components/SupportButton/SupportButton.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/CheckCircle.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/VisibilityOff.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/MoreVert.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Warning.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/node_modules/clsx/dist/clsx.m.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/SuccessOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/ReportProblemOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/ErrorOutline.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/InfoOutlined.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/internal/svg-icons/Close.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/Alert/Alert.js"],"sourcesContent":["\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\n}), 'Add');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M21 5v6.59l-3-3.01-4 4.01-4-4-4 4-3-3.01V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2zm-3 6.42l3 3.01V19c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2v-6.58l3 2.99 4-4 4 4 4-3.99z\"\n}), 'BrokenImage');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"\n}), 'Visibility');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"\n}), 'Delete');\n\nexports.default = _default;","import { useApiHolder, configApiRef } from '@backstage/core-plugin-api';\nimport { coreComponentsTranslationRef } from '../translation.esm.js';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst useDefaultSupportConfig = () => {\n const { t } = useTranslationRef(coreComponentsTranslationRef);\n return {\n url: \"https://github.com/backstage/backstage/issues\",\n items: [\n {\n title: t(\"supportConfig.default.title\"),\n icon: \"warning\",\n links: [\n {\n // TODO: Update to dedicated support page on backstage.io/docs\n title: t(\"supportConfig.default.linkTitle\"),\n url: \"https://github.com/backstage/backstage/blob/master/app-config.yaml\"\n }\n ]\n }\n ]\n };\n};\nfunction useSupportConfig() {\n const apiHolder = useApiHolder();\n const config = apiHolder.get(configApiRef);\n const supportConfig = config?.getOptionalConfig(\"app.support\");\n const defaultSupportConfig = useDefaultSupportConfig();\n if (!supportConfig) {\n return defaultSupportConfig;\n }\n return {\n url: supportConfig.getString(\"url\"),\n items: supportConfig.getConfigArray(\"items\").flatMap((itemConf) => ({\n title: itemConf.getString(\"title\"),\n icon: itemConf.getOptionalString(\"icon\"),\n links: (itemConf.getOptionalConfigArray(\"links\") ?? []).flatMap(\n (linkConf) => ({\n url: linkConf.getString(\"url\"),\n title: linkConf.getOptionalString(\"title\") ?? \"\"\n })\n )\n }))\n };\n}\n\nexport { useSupportConfig };\n//# sourceMappingURL=useSupportConfig.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport { useApp } from '@backstage/core-plugin-api';\nimport MuiBrokenImageIcon from '@material-ui/icons/BrokenImage';\n\nfunction AppIcon(props) {\n const { id: key, Fallback = MuiBrokenImageIcon, ...rest } = props;\n const app = useApp();\n const Icon = app.getSystemIcon(key) ?? Fallback;\n return /* @__PURE__ */ jsx(Icon, { ...rest });\n}\nfunction BrokenImageIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"brokenImage\", ...props });\n}\nfunction CatalogIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"catalog\", ...props });\n}\nfunction ChatIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"chat\", ...props });\n}\nfunction DashboardIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"dashboard\", ...props });\n}\nfunction DocsIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"docs\", ...props });\n}\nfunction EmailIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"email\", ...props });\n}\nfunction GitHubIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"github\", ...props });\n}\nfunction GroupIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"group\", ...props });\n}\nfunction HelpIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"help\", ...props });\n}\nfunction UserIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"user\", ...props });\n}\nfunction WarningIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"warning\", ...props });\n}\nfunction StarIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"star\", ...props });\n}\nfunction UnstarredIcon(props) {\n return /* @__PURE__ */ jsx(AppIcon, { id: \"unstarred\", ...props });\n}\n\nexport { AppIcon, BrokenImageIcon, CatalogIcon, ChatIcon, DashboardIcon, DocsIcon, EmailIcon, GitHubIcon, GroupIcon, HelpIcon, StarIcon, UnstarredIcon, UserIcon, WarningIcon };\n//# sourceMappingURL=icons.esm.js.map\n","import { jsxs, Fragment, jsx } from 'react/jsx-runtime';\nimport { useApi, configApiRef, useApp } from '@backstage/core-plugin-api';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { useState, Children } from 'react';\nimport 'lodash';\nimport 'qs';\nimport 'react-router-dom';\nimport '@react-hookz/web';\nimport { useSupportConfig } from '../../hooks/useSupportConfig.esm.js';\nimport { HelpIcon } from '../../icons/icons.esm.js';\nimport { Link } from '../Link/Link.esm.js';\nimport { coreComponentsTranslationRef } from '../../translation.esm.js';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nconst useStyles = makeStyles(\n {\n popoverList: {\n minWidth: 260,\n maxWidth: 400\n },\n menuItem: {\n whiteSpace: \"normal\"\n }\n },\n { name: \"BackstageSupportButton\" }\n);\nconst SupportIcon = ({ icon }) => {\n const app = useApp();\n const Icon = icon ? app.getSystemIcon(icon) ?? HelpIcon : HelpIcon;\n return /* @__PURE__ */ jsx(Icon, {});\n};\nconst SupportLink = ({ link }) => /* @__PURE__ */ jsx(Link, { to: link.url, children: link.title ?? link.url });\nconst SupportListItem = ({ item }) => {\n return /* @__PURE__ */ jsxs(MenuItem, { button: false, children: [\n /* @__PURE__ */ jsx(ListItemIcon, { children: /* @__PURE__ */ jsx(SupportIcon, { icon: item.icon }) }),\n /* @__PURE__ */ jsx(\n ListItemText,\n {\n primary: item.title,\n secondary: item.links?.reduce(\n (prev, link, idx) => [\n ...prev,\n idx > 0 && /* @__PURE__ */ jsx(\"br\", {}, idx),\n /* @__PURE__ */ jsx(SupportLink, { link }, link.url)\n ],\n []\n )\n }\n )\n ] });\n};\nfunction SupportButton(props) {\n const { t } = useTranslationRef(coreComponentsTranslationRef);\n const { title, items, children } = props;\n const { items: configItems } = useSupportConfig();\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [anchorEl, setAnchorEl] = useState(null);\n const classes = useStyles();\n const supportConfig = useApi(configApiRef).getOptionalConfig(\"app.support\");\n const isSmallScreen = useMediaQuery(\n (theme) => theme.breakpoints.down(\"sm\")\n );\n const onClickHandler = (event) => {\n setAnchorEl(event.currentTarget);\n setPopoverOpen(true);\n };\n const popoverCloseHandler = () => {\n setPopoverOpen(false);\n };\n if (!supportConfig) {\n return null;\n }\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(Box, { display: \"flex\", ml: 1, children: isSmallScreen ? /* @__PURE__ */ jsx(\n IconButton,\n {\n color: \"primary\",\n size: \"small\",\n onClick: onClickHandler,\n \"data-testid\": \"support-button\",\n \"aria-label\": \"Support\",\n children: /* @__PURE__ */ jsx(HelpIcon, {})\n }\n ) : /* @__PURE__ */ jsx(\n Button,\n {\n \"data-testid\": \"support-button\",\n \"aria-label\": \"Support\",\n color: \"primary\",\n onClick: onClickHandler,\n startIcon: /* @__PURE__ */ jsx(HelpIcon, {}),\n children: t(\"supportButton.title\")\n }\n ) }),\n /* @__PURE__ */ jsxs(\n Popover,\n {\n \"data-testid\": \"support-button-popover\",\n open: popoverOpen,\n anchorEl,\n anchorOrigin: {\n vertical: \"bottom\",\n horizontal: \"right\"\n },\n transformOrigin: {\n vertical: \"top\",\n horizontal: \"right\"\n },\n onClose: popoverCloseHandler,\n children: [\n /* @__PURE__ */ jsxs(\n MenuList,\n {\n className: classes.popoverList,\n autoFocusItem: Boolean(anchorEl),\n children: [\n title && /* @__PURE__ */ jsx(\n MenuItem,\n {\n button: false,\n alignItems: \"flex-start\",\n className: classes.menuItem,\n children: /* @__PURE__ */ jsx(Typography, { variant: \"subtitle1\", children: title })\n }\n ),\n Children.map(children, (child, i) => /* @__PURE__ */ jsx(\n MenuItem,\n {\n button: false,\n alignItems: \"flex-start\",\n className: classes.menuItem,\n children: child\n },\n `child-${i}`\n )),\n (items ?? configItems).map((item, i) => /* @__PURE__ */ jsx(SupportListItem, { item }, `item-${i}`))\n ]\n }\n ),\n /* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(\n Button,\n {\n color: \"primary\",\n onClick: popoverCloseHandler,\n \"aria-label\": \"Close\",\n children: t(\"supportButton.close\")\n }\n ) })\n ]\n }\n )\n ] });\n}\n\nexport { SupportButton };\n//# sourceMappingURL=SupportButton.esm.js.map\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"\n}), 'CheckCircle');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"\n}), 'VisibilityOff');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n}), 'MoreVert');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"\n}), 'Warning');\n\nexports.default = _default;","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}export function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z\"\n}), 'SuccessOutlined');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z\"\n}), 'ReportProblemOutlined');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"\n}), 'ErrorOutline');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z\"\n}), 'InfoOutlined');","import * as React from 'react';\nimport { createSvgIcon } from '@material-ui/core/utils';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n}), 'Close');","import _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { withStyles, lighten, darken } from '@material-ui/core/styles';\nimport Paper from '@material-ui/core/Paper';\nimport SuccessOutlinedIcon from '../internal/svg-icons/SuccessOutlined';\nimport ReportProblemOutlinedIcon from '../internal/svg-icons/ReportProblemOutlined';\nimport ErrorOutlineIcon from '../internal/svg-icons/ErrorOutline';\nimport InfoOutlinedIcon from '../internal/svg-icons/InfoOutlined';\nimport CloseIcon from '../internal/svg-icons/Close';\nimport IconButton from '@material-ui/core/IconButton';\nimport { capitalize } from '@material-ui/core/utils';\nexport var styles = function styles(theme) {\n var getColor = theme.palette.type === 'light' ? darken : lighten;\n var getBackgroundColor = theme.palette.type === 'light' ? lighten : darken;\n return {\n /* Styles applied to the root element. */\n root: _extends({}, theme.typography.body2, {\n borderRadius: theme.shape.borderRadius,\n backgroundColor: 'transparent',\n display: 'flex',\n padding: '6px 16px'\n }),\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"success\"`. */\n standardSuccess: {\n color: getColor(theme.palette.success.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.success.main, 0.9),\n '& $icon': {\n color: theme.palette.success.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"info\"`. */\n standardInfo: {\n color: getColor(theme.palette.info.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.info.main, 0.9),\n '& $icon': {\n color: theme.palette.info.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"warning\"`. */\n standardWarning: {\n color: getColor(theme.palette.warning.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.warning.main, 0.9),\n '& $icon': {\n color: theme.palette.warning.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"standard\"` and `color=\"error\"`. */\n standardError: {\n color: getColor(theme.palette.error.main, 0.6),\n backgroundColor: getBackgroundColor(theme.palette.error.main, 0.9),\n '& $icon': {\n color: theme.palette.error.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"success\"`. */\n outlinedSuccess: {\n color: getColor(theme.palette.success.main, 0.6),\n border: \"1px solid \".concat(theme.palette.success.main),\n '& $icon': {\n color: theme.palette.success.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"info\"`. */\n outlinedInfo: {\n color: getColor(theme.palette.info.main, 0.6),\n border: \"1px solid \".concat(theme.palette.info.main),\n '& $icon': {\n color: theme.palette.info.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"warning\"`. */\n outlinedWarning: {\n color: getColor(theme.palette.warning.main, 0.6),\n border: \"1px solid \".concat(theme.palette.warning.main),\n '& $icon': {\n color: theme.palette.warning.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"error\"`. */\n outlinedError: {\n color: getColor(theme.palette.error.main, 0.6),\n border: \"1px solid \".concat(theme.palette.error.main),\n '& $icon': {\n color: theme.palette.error.main\n }\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"success\"`. */\n filledSuccess: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.success.main\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"info\"`. */\n filledInfo: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.info.main\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"warning\"`. */\n filledWarning: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.warning.main\n },\n\n /* Styles applied to the root element if `variant=\"filled\"` and `color=\"error\"`. */\n filledError: {\n color: '#fff',\n fontWeight: theme.typography.fontWeightMedium,\n backgroundColor: theme.palette.error.main\n },\n\n /* Styles applied to the icon wrapper element. */\n icon: {\n marginRight: 12,\n padding: '7px 0',\n display: 'flex',\n fontSize: 22,\n opacity: 0.9\n },\n\n /* Styles applied to the message wrapper element. */\n message: {\n padding: '8px 0'\n },\n\n /* Styles applied to the action wrapper element if `action` is provided. */\n action: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: 'auto',\n paddingLeft: 16,\n marginRight: -8\n }\n };\n};\nvar defaultIconMapping = {\n success: /*#__PURE__*/React.createElement(SuccessOutlinedIcon, {\n fontSize: \"inherit\"\n }),\n warning: /*#__PURE__*/React.createElement(ReportProblemOutlinedIcon, {\n fontSize: \"inherit\"\n }),\n error: /*#__PURE__*/React.createElement(ErrorOutlineIcon, {\n fontSize: \"inherit\"\n }),\n info: /*#__PURE__*/React.createElement(InfoOutlinedIcon, {\n fontSize: \"inherit\"\n })\n};\n\nvar _ref = /*#__PURE__*/React.createElement(CloseIcon, {\n fontSize: \"small\"\n});\n\nvar Alert = /*#__PURE__*/React.forwardRef(function Alert(props, ref) {\n var action = props.action,\n children = props.children,\n classes = props.classes,\n className = props.className,\n _props$closeText = props.closeText,\n closeText = _props$closeText === void 0 ? 'Close' : _props$closeText,\n color = props.color,\n icon = props.icon,\n _props$iconMapping = props.iconMapping,\n iconMapping = _props$iconMapping === void 0 ? defaultIconMapping : _props$iconMapping,\n onClose = props.onClose,\n _props$role = props.role,\n role = _props$role === void 0 ? 'alert' : _props$role,\n _props$severity = props.severity,\n severity = _props$severity === void 0 ? 'success' : _props$severity,\n _props$variant = props.variant,\n variant = _props$variant === void 0 ? 'standard' : _props$variant,\n other = _objectWithoutProperties(props, [\"action\", \"children\", \"classes\", \"className\", \"closeText\", \"color\", \"icon\", \"iconMapping\", \"onClose\", \"role\", \"severity\", \"variant\"]);\n\n return /*#__PURE__*/React.createElement(Paper, _extends({\n role: role,\n square: true,\n elevation: 0,\n className: clsx(classes.root, classes[\"\".concat(variant).concat(capitalize(color || severity))], className),\n ref: ref\n }, other), icon !== false ? /*#__PURE__*/React.createElement(\"div\", {\n className: classes.icon\n }, icon || iconMapping[severity] || defaultIconMapping[severity]) : null, /*#__PURE__*/React.createElement(\"div\", {\n className: classes.message\n }, children), action != null ? /*#__PURE__*/React.createElement(\"div\", {\n className: classes.action\n }, action) : null, action == null && onClose ? /*#__PURE__*/React.createElement(\"div\", {\n className: classes.action\n }, /*#__PURE__*/React.createElement(IconButton, {\n size: \"small\",\n \"aria-label\": closeText,\n title: closeText,\n color: \"inherit\",\n onClick: onClose\n }, _ref)) : null);\n});\nprocess.env.NODE_ENV !== \"production\" ? Alert.propTypes = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n\n /**\n * The action to display. It renders after the message, at the end of the alert.\n */\n action: PropTypes.node,\n\n /**\n * The content of the component.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * Override the default label for the *close popup* icon button.\n *\n * For localization purposes, you can use the provided [translations](/guides/localization/).\n */\n closeText: PropTypes.string,\n\n /**\n * The main color for the alert. Unless provided, the value is taken from the `severity` prop.\n */\n color: PropTypes.oneOf(['error', 'info', 'success', 'warning']),\n\n /**\n * Override the icon displayed before the children.\n * Unless provided, the icon is mapped to the value of the `severity` prop.\n */\n icon: PropTypes.node,\n\n /**\n * The component maps the `severity` prop to a range of different icons,\n * for instance success to `<SuccessOutlined>`.\n * If you wish to change this mapping, you can provide your own.\n * Alternatively, you can use the `icon` prop to override the icon displayed.\n */\n iconMapping: PropTypes.shape({\n error: PropTypes.node,\n info: PropTypes.node,\n success: PropTypes.node,\n warning: PropTypes.node\n }),\n\n /**\n * Callback fired when the component requests to be closed.\n * When provided and no `action` prop is set, a close icon button is displayed that triggers the callback when clicked.\n *\n * @param {object} event The event source of the callback.\n */\n onClose: PropTypes.func,\n\n /**\n * The ARIA role attribute of the element.\n */\n role: PropTypes.string,\n\n /**\n * The severity of the alert. This defines the color and icon used.\n */\n severity: PropTypes.oneOf(['error', 'info', 'success', 'warning']),\n\n /**\n * The variant to use.\n */\n variant: PropTypes.oneOf(['filled', 'outlined', 'standard'])\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiAlert'\n})(Alert);"],"names":["_interopRequireDefault","_interopRequireWildcard","exports","React","_default","default","createElement","d","useDefaultSupportConfig","t","url","items","title","icon","links","AppIcon","props","id","key","Fallback","rest","Icon","useApp","getSystemIcon","jsx","HelpIcon","useStyles","makeStyles","popoverList","minWidth","maxWidth","menuItem","whiteSpace","name","SupportIcon","app","SupportLink","link","to","children","SupportListItem","item","jsxs","MenuItem","button","ListItemIcon","ListItemText","primary","secondary","reduce","prev","idx","SupportButton","configItems","config","useApiHolder","get","configApiRef","supportConfig","getOptionalConfig","defaultSupportConfig","getString","getConfigArray","flatMap","itemConf","getOptionalString","getOptionalConfigArray","linkConf","useSupportConfig","popoverOpen","setPopoverOpen","useState","anchorEl","setAnchorEl","classes","useApi","isSmallScreen","useMediaQuery","theme","breakpoints","down","onClickHandler","event","currentTarget","popoverCloseHandler","Fragment","Box","display","ml","IconButton","color","size","onClick","Button","startIcon","Popover","open","anchorOrigin","vertical","horizontal","transformOrigin","onClose","MenuList","className","autoFocusItem","Boolean","alignItems","Typography","variant","Children","map","child","i","DialogActions","r","e","f","n","Array","isArray","length","arguments","createSvgIcon","defaultIconMapping","success","SuccessOutlined","fontSize","warning","ReportProblemOutlined","error","ErrorOutline","info","InfoOutlined","_ref","Close","Alert","ref","action","_props$closeText","closeText","_props$iconMapping","iconMapping","_props$role","role","_props$severity","severity","_props$variant","other","Paper","square","elevation","root","concat","capitalize","message","withStyles","getColor","palette","type","darken","lighten","getBackgroundColor","typography","body2","borderRadius","shape","backgroundColor","padding","standardSuccess","main","standardInfo","standardWarning","standardError","outlinedSuccess","border","outlinedInfo","outlinedWarning","outlinedError","filledSuccess","fontWeight","fontWeightMedium","filledInfo","filledWarning","filledError","marginRight","opacity","marginLeft","paddingLeft"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[879],{72627:(e,n,a)=>{a.r(n),a.d(n,{EntityKuadrantApiAccessCard:()=>p,EntityKuadrantApiKeyManagementTab:()=>u,EntityKuadrantApiKeysContent:()=>l,EntityKuadrantApiProductInfoContent:()=>m,KuadrantApprovalQueueCard:()=>c,KuadrantPage:()=>d,PlanPolicyDetailPage:()=>s,kuadrantPlugin:()=>i});var t=a(22097);const o=(0,t.createRouteRef)({id:"kuadrant"}),r=(0,t.createSubRouteRef)({id:"kuadrant/resource",parent:o,path:"/:kind/:namespace/:name"}),i=(0,t.createPlugin)({id:"kuadrant",routes:{root:o,resource:r}}),d=i.provide((0,t.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2120),a.e(2198),a.e(4556),a.e(3483),a.e(9555),a.e(5478),a.e(2469),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(7094),a.e(6281),a.e(7632)]).then(a.bind(a,95251)).then(e=>e.KuadrantPage),mountPoint:o})),p=i.provide((0,t.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(5478),a.e(2469),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(6659),a.e(441)]).then(a.bind(a,60441)).then(e=>e.ApiAccessCard)}})),u=i.provide((0,t.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2120),a.e(2198),a.e(4556),a.e(5478),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(7094),a.e(6659),a.e(4306)]).then(a.bind(a,54306)).then(e=>e.ApiKeyManagementTab)}})),l=i.provide((0,t.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2120),a.e(2198),a.e(4556),a.e(5478),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(7094),a.e(6659),a.e(4306)]).then(a.bind(a,54306)).then(e=>e.ApiKeyManagementTab)}})),c=i.provide((0,t.createComponentExtension)({name:"KuadrantApprovalQueueCard",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2120),a.e(2198),a.e(4556),a.e(5478),a.e(2469),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(7094),a.e(6281),a.e(5222)]).then(a.bind(a,95631)).then(e=>e.ApprovalQueueCard)}})),m=i.provide((0,t.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2120),a.e(5478),a.e(2469),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(7094),a.e(6659),a.e(5453)]).then(a.bind(a,75453)).then(e=>e.ApiProductInfoCard)}})),s=i.provide((0,t.createComponentExtension)({name:"PlanPolicyDetailPage",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2198),a.e(3483),a.e(5478),a.e(2469),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(8365)]).then(a.bind(a,58365)).then(e=>e.PlanPolicyDetailPage)}}))}}]);
2
- //# sourceMappingURL=exposed-PluginRoot.9522bcfa.chunk.js.map
1
+ "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[879],{72627:(e,n,a)=>{a.r(n),a.d(n,{EntityKuadrantApiAccessCard:()=>p,EntityKuadrantApiKeyManagementTab:()=>u,EntityKuadrantApiKeysContent:()=>l,EntityKuadrantApiProductInfoContent:()=>m,KuadrantApprovalQueueCard:()=>c,KuadrantPage:()=>d,PlanPolicyDetailPage:()=>s,kuadrantPlugin:()=>i});var t=a(22097);const o=(0,t.createRouteRef)({id:"kuadrant"}),r=(0,t.createSubRouteRef)({id:"kuadrant/resource",parent:o,path:"/:kind/:namespace/:name"}),i=(0,t.createPlugin)({id:"kuadrant",routes:{root:o,resource:r}}),d=i.provide((0,t.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2120),a.e(2198),a.e(4556),a.e(3483),a.e(8441),a.e(5478),a.e(2469),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(7094),a.e(6281),a.e(7632)]).then(a.bind(a,95251)).then(e=>e.KuadrantPage),mountPoint:o})),p=i.provide((0,t.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(5478),a.e(2469),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(6659),a.e(441)]).then(a.bind(a,60441)).then(e=>e.ApiAccessCard)}})),u=i.provide((0,t.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2120),a.e(2198),a.e(4556),a.e(5478),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(7094),a.e(6659),a.e(4306)]).then(a.bind(a,54306)).then(e=>e.ApiKeyManagementTab)}})),l=i.provide((0,t.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2120),a.e(2198),a.e(4556),a.e(5478),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(7094),a.e(6659),a.e(4306)]).then(a.bind(a,54306)).then(e=>e.ApiKeyManagementTab)}})),c=i.provide((0,t.createComponentExtension)({name:"KuadrantApprovalQueueCard",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2120),a.e(2198),a.e(4556),a.e(5478),a.e(2469),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(7094),a.e(6281),a.e(5222)]).then(a.bind(a,95631)).then(e=>e.ApprovalQueueCard)}})),m=i.provide((0,t.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2120),a.e(5478),a.e(2469),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(7094),a.e(6659),a.e(5453)]).then(a.bind(a,75453)).then(e=>e.ApiProductInfoCard)}})),s=i.provide((0,t.createComponentExtension)({name:"PlanPolicyDetailPage",component:{lazy:()=>Promise.all([a.e(5568),a.e(6352),a.e(9288),a.e(2198),a.e(3483),a.e(5478),a.e(2469),a.e(4218),a.e(484),a.e(1942),a.e(7976),a.e(8365)]).then(a.bind(a,58365)).then(e=>e.PlanPolicyDetailPage)}}))}}]);
2
+ //# sourceMappingURL=exposed-PluginRoot.0ac7fe4b.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"static/exposed-PluginRoot.9522bcfa.chunk.js","mappings":"6ZAEO,MAAMA,GAAeC,EAAAA,EAAAA,gBAAe,CACzCC,GAAI,aAGOC,GAAmBC,EAAAA,EAAAA,mBAAkB,CAChDF,GAAI,oBACJG,OAAQL,EACRM,KAAM,4BCDKC,GAAiBC,EAAAA,EAAAA,cAAa,CACzCN,GAAI,WACJO,OAAQ,CACNC,KAAMV,EACNW,SAAUR,KAIDS,EAAeL,EAAeM,SACzCC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,eACNC,UAAW,IACT,8MAAoCC,KAAKC,GAAKA,EAAEN,cAClDO,WAAYnB,KAIHoB,EAA8Bb,EAAeM,SACxDQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,8BACNC,UAAW,CACTM,KAAM,IACJ,iJAAqCL,KAAKC,GAAKA,EAAEK,mBAK5CC,EAAoCjB,EAAeM,SAC9DQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,oCACNC,UAAW,CACTM,KAAM,IACJ,gLAA2CL,KAAKC,GAAKA,EAAEO,yBAMlDC,EAA+BnB,EAAeM,SACzDQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,+BACNC,UAAW,CACTM,KAAM,IACJ,gLAA2CL,KAAKC,GAAKA,EAAEO,yBAKlDE,EAA4BpB,EAAeM,SACtDQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,4BACNC,UAAW,CACTM,KAAM,IACJ,0LAAyCL,KAAKC,GAAKA,EAAEU,uBAKhDC,EAAsCtB,EAAeM,SAChEQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,sCACNC,UAAW,CACTM,KAAM,IACJ,sKAA0CL,KAAKC,GAAKA,EAAEY,wBAKjDC,EAAuBxB,EAAeM,SACjDQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,uBACNC,UAAW,CACTM,KAAM,IACJ,4JAA4CL,KAAKC,GAAKA,EAAEa,yB","sources":["webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.KuadrantPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const KuadrantApprovalQueueCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'KuadrantApprovalQueueCard',\n component: {\n lazy: () =>\n import('./components/ApprovalQueueCard').then(m => m.ApprovalQueueCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const PlanPolicyDetailPage = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'PlanPolicyDetailPage',\n component: {\n lazy: () =>\n import('./components/PlanPolicyDetailPage').then(m => m.PlanPolicyDetailPage),\n },\n }),\n);\n"],"names":["rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","path","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","name","component","then","m","mountPoint","EntityKuadrantApiAccessCard","createComponentExtension","lazy","ApiAccessCard","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","KuadrantApprovalQueueCard","ApprovalQueueCard","EntityKuadrantApiProductInfoContent","ApiProductInfoCard","PlanPolicyDetailPage"],"sourceRoot":""}
1
+ {"version":3,"file":"static/exposed-PluginRoot.0ac7fe4b.chunk.js","mappings":"6ZAEO,MAAMA,GAAeC,EAAAA,EAAAA,gBAAe,CACzCC,GAAI,aAGOC,GAAmBC,EAAAA,EAAAA,mBAAkB,CAChDF,GAAI,oBACJG,OAAQL,EACRM,KAAM,4BCDKC,GAAiBC,EAAAA,EAAAA,cAAa,CACzCN,GAAI,WACJO,OAAQ,CACNC,KAAMV,EACNW,SAAUR,KAIDS,EAAeL,EAAeM,SACzCC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,eACNC,UAAW,IACT,8MAAoCC,KAAKC,GAAKA,EAAEN,cAClDO,WAAYnB,KAIHoB,EAA8Bb,EAAeM,SACxDQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,8BACNC,UAAW,CACTM,KAAM,IACJ,iJAAqCL,KAAKC,GAAKA,EAAEK,mBAK5CC,EAAoCjB,EAAeM,SAC9DQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,oCACNC,UAAW,CACTM,KAAM,IACJ,gLAA2CL,KAAKC,GAAKA,EAAEO,yBAMlDC,EAA+BnB,EAAeM,SACzDQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,+BACNC,UAAW,CACTM,KAAM,IACJ,gLAA2CL,KAAKC,GAAKA,EAAEO,yBAKlDE,EAA4BpB,EAAeM,SACtDQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,4BACNC,UAAW,CACTM,KAAM,IACJ,0LAAyCL,KAAKC,GAAKA,EAAEU,uBAKhDC,EAAsCtB,EAAeM,SAChEQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,sCACNC,UAAW,CACTM,KAAM,IACJ,sKAA0CL,KAAKC,GAAKA,EAAEY,wBAKjDC,EAAuBxB,EAAeM,SACjDQ,EAAAA,EAAAA,0BAAyB,CACvBN,KAAM,uBACNC,UAAW,CACTM,KAAM,IACJ,4JAA4CL,KAAKC,GAAKA,EAAEa,yB","sources":["webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.KuadrantPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const KuadrantApprovalQueueCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'KuadrantApprovalQueueCard',\n component: {\n lazy: () =>\n import('./components/ApprovalQueueCard').then(m => m.ApprovalQueueCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const PlanPolicyDetailPage = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'PlanPolicyDetailPage',\n component: {\n lazy: () =>\n import('./components/PlanPolicyDetailPage').then(m => m.PlanPolicyDetailPage),\n },\n }),\n);\n"],"names":["rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","path","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","name","component","then","m","mountPoint","EntityKuadrantApiAccessCard","createComponentExtension","lazy","ApiAccessCard","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","KuadrantApprovalQueueCard","ApprovalQueueCard","EntityKuadrantApiProductInfoContent","ApiProductInfoCard","PlanPolicyDetailPage"],"sourceRoot":""}