@kuadrant/kuadrant-backstage-plugin-frontend 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +21 -3
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +1 -7
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
- package/dist/components/KuadrantIcon/KuadrantIcon.esm.js +22 -0
- package/dist/components/KuadrantIcon/KuadrantIcon.esm.js.map +1 -0
- package/dist/components/icons.esm.js +11 -0
- package/dist/components/icons.esm.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -1
- package/dist-scalprum/internal.plugin-kuadrant.c4fb9c2347d3ad03a5d0.js +2 -0
- package/dist-scalprum/internal.plugin-kuadrant.c4fb9c2347d3ad03a5d0.js.map +1 -0
- package/dist-scalprum/plugin-manifest.json +3 -3
- package/dist-scalprum/static/{1037.58dd29ad.chunk.js → 1037.25758556.chunk.js} +1 -1
- package/dist-scalprum/static/{1037.58dd29ad.chunk.js.map → 1037.25758556.chunk.js.map} +1 -1
- package/dist-scalprum/static/{1584.ae3779f0.chunk.js → 1584.1e45e570.chunk.js} +2 -2
- package/dist-scalprum/static/{1584.ae3779f0.chunk.js.map → 1584.1e45e570.chunk.js.map} +1 -1
- package/dist-scalprum/static/1719.246c020d.chunk.js +2 -0
- package/dist-scalprum/static/1719.246c020d.chunk.js.map +1 -0
- package/dist-scalprum/static/{1881.8221c002.chunk.js → 1881.56cde36b.chunk.js} +1 -1
- package/dist-scalprum/static/{1881.8221c002.chunk.js.map → 1881.56cde36b.chunk.js.map} +1 -1
- package/dist-scalprum/static/286.ee43f560.chunk.js +2 -0
- package/dist-scalprum/static/286.ee43f560.chunk.js.map +1 -0
- package/dist-scalprum/static/2952.b54bd390.chunk.js +2 -0
- package/dist-scalprum/static/2952.b54bd390.chunk.js.map +1 -0
- package/dist-scalprum/static/2967.0c2ef90e.chunk.js +2 -0
- package/dist-scalprum/static/2967.0c2ef90e.chunk.js.map +1 -0
- package/dist-scalprum/static/3015.1fe097c2.chunk.js +3 -0
- package/dist-scalprum/static/3015.1fe097c2.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/3015.1fe097c2.chunk.js.map +1 -0
- package/dist-scalprum/static/{3581.b5b97f08.chunk.js → 3581.ebe5968a.chunk.js} +1 -1
- package/dist-scalprum/static/{3581.b5b97f08.chunk.js.map → 3581.ebe5968a.chunk.js.map} +1 -1
- package/dist-scalprum/static/3657.882640ca.chunk.js +3 -0
- package/dist-scalprum/static/3657.882640ca.chunk.js.LICENSE.txt +8 -0
- package/dist-scalprum/static/3657.882640ca.chunk.js.map +1 -0
- package/dist-scalprum/static/{3897.ef4554b5.chunk.js → 3897.6e9c07c0.chunk.js} +1 -1
- package/dist-scalprum/static/{3897.ef4554b5.chunk.js.map → 3897.6e9c07c0.chunk.js.map} +1 -1
- package/dist-scalprum/static/{3947.ad129ba4.chunk.js → 3947.4f4aa8c2.chunk.js} +1 -1
- package/dist-scalprum/static/{3947.ad129ba4.chunk.js.map → 3947.4f4aa8c2.chunk.js.map} +1 -1
- package/dist-scalprum/static/{3976.e0873210.chunk.js → 3976.e8a8fda2.chunk.js} +2 -2
- package/dist-scalprum/static/{3976.e0873210.chunk.js.map → 3976.e8a8fda2.chunk.js.map} +1 -1
- package/dist-scalprum/static/{4083.488ff7a9.chunk.js → 4083.811c4e7a.chunk.js} +2 -2
- package/dist-scalprum/static/{4083.488ff7a9.chunk.js.map → 4083.811c4e7a.chunk.js.map} +1 -1
- package/dist-scalprum/static/4908.196a4425.chunk.js +2 -0
- package/dist-scalprum/static/{5453.3c20d0a6.chunk.js.map → 4908.196a4425.chunk.js.map} +1 -1
- package/dist-scalprum/static/{5010.6241b64f.chunk.js → 5010.4f67737b.chunk.js} +2 -2
- package/dist-scalprum/static/{5010.6241b64f.chunk.js.map → 5010.4f67737b.chunk.js.map} +1 -1
- package/dist-scalprum/static/{512.f1c51799.chunk.js → 512.d592d164.chunk.js} +1 -1
- package/dist-scalprum/static/{512.f1c51799.chunk.js.map → 512.d592d164.chunk.js.map} +1 -1
- package/dist-scalprum/static/{5289.2e686027.chunk.js → 5289.55069930.chunk.js} +2 -2
- package/dist-scalprum/static/{5289.2e686027.chunk.js.map → 5289.55069930.chunk.js.map} +1 -1
- package/dist-scalprum/static/5605.430f697e.chunk.js +2 -0
- package/dist-scalprum/static/5605.430f697e.chunk.js.map +1 -0
- package/dist-scalprum/static/5978.bf347a09.chunk.js +2 -0
- package/dist-scalprum/static/5978.bf347a09.chunk.js.map +1 -0
- package/dist-scalprum/static/6038.63d1f832.chunk.js +3 -0
- package/dist-scalprum/static/6038.63d1f832.chunk.js.LICENSE.txt +8 -0
- package/dist-scalprum/static/6038.63d1f832.chunk.js.map +1 -0
- package/dist-scalprum/static/{6272.b5645dc2.chunk.js → 6272.3ed14ea4.chunk.js} +1 -1
- package/dist-scalprum/static/{6272.b5645dc2.chunk.js.map → 6272.3ed14ea4.chunk.js.map} +1 -1
- package/dist-scalprum/static/635.f63679a5.chunk.js +3 -0
- package/dist-scalprum/static/635.f63679a5.chunk.js.map +1 -0
- package/dist-scalprum/static/6371.7b57ac27.chunk.js +3 -0
- package/dist-scalprum/static/6371.7b57ac27.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/6371.7b57ac27.chunk.js.map +1 -0
- package/dist-scalprum/static/{6386.2d20c412.chunk.js → 6386.5922f271.chunk.js} +3 -3
- package/dist-scalprum/static/{6386.2d20c412.chunk.js.map → 6386.5922f271.chunk.js.map} +1 -1
- package/dist-scalprum/static/{6426.bf20c588.chunk.js → 6426.4c18bab5.chunk.js} +1 -1
- package/dist-scalprum/static/{6426.bf20c588.chunk.js.map → 6426.4c18bab5.chunk.js.map} +1 -1
- package/dist-scalprum/static/6777.a2b77ec5.chunk.js +2 -0
- package/dist-scalprum/static/6777.a2b77ec5.chunk.js.map +1 -0
- package/dist-scalprum/static/{6800.ddabed69.chunk.js → 6800.a45da2f4.chunk.js} +2 -2
- package/dist-scalprum/static/{6800.ddabed69.chunk.js.map → 6800.a45da2f4.chunk.js.map} +1 -1
- package/dist-scalprum/static/{6972.e47ec97e.chunk.js → 6972.f22b9446.chunk.js} +1 -1
- package/dist-scalprum/static/{6972.e47ec97e.chunk.js.map → 6972.f22b9446.chunk.js.map} +1 -1
- package/dist-scalprum/static/7005.8190ad95.chunk.js +2 -0
- package/dist-scalprum/static/7005.8190ad95.chunk.js.map +1 -0
- package/dist-scalprum/static/7164.5dc4bc72.chunk.js +2 -0
- package/dist-scalprum/static/7164.5dc4bc72.chunk.js.map +1 -0
- package/dist-scalprum/static/{7266.e760b8c3.chunk.js → 7266.3c4174cc.chunk.js} +1 -1
- package/dist-scalprum/static/{7266.e760b8c3.chunk.js.map → 7266.3c4174cc.chunk.js.map} +1 -1
- package/dist-scalprum/static/7270.d52407cd.chunk.js +2 -0
- package/dist-scalprum/static/7270.d52407cd.chunk.js.map +1 -0
- package/dist-scalprum/static/7717.6f5b9dd7.chunk.js +3 -0
- package/dist-scalprum/static/7717.6f5b9dd7.chunk.js.map +1 -0
- package/dist-scalprum/static/{7791.8f84478d.chunk.js → 7791.ad31cf6d.chunk.js} +2 -2
- package/dist-scalprum/static/{7791.8f84478d.chunk.js.map → 7791.ad31cf6d.chunk.js.map} +1 -1
- package/dist-scalprum/static/{8563.46f1a3e1.chunk.js → 8563.6501eafb.chunk.js} +2 -2
- package/dist-scalprum/static/{8563.46f1a3e1.chunk.js.map → 8563.6501eafb.chunk.js.map} +1 -1
- package/dist-scalprum/static/{9079.b6d5c19c.chunk.js → 9079.2ddaea57.chunk.js} +1 -1
- package/dist-scalprum/static/{9079.b6d5c19c.chunk.js.map → 9079.2ddaea57.chunk.js.map} +1 -1
- package/dist-scalprum/static/9239.1acfe112.chunk.js +2 -0
- package/dist-scalprum/static/9239.1acfe112.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js +3 -0
- package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-KuadrantPage.5ae00605.chunk.js +2 -0
- package/dist-scalprum/static/exposed-KuadrantPage.5ae00605.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-PluginRoot.949381c2.chunk.js +2 -0
- package/dist-scalprum/static/exposed-PluginRoot.949381c2.chunk.js.map +1 -0
- package/package.json +6 -3
- package/dist-scalprum/internal.plugin-kuadrant.b3d35dc8b21ce867aa09.js +0 -2
- package/dist-scalprum/internal.plugin-kuadrant.b3d35dc8b21ce867aa09.js.map +0 -1
- package/dist-scalprum/static/1319.ac195ac2.chunk.js +0 -2
- package/dist-scalprum/static/1319.ac195ac2.chunk.js.map +0 -1
- package/dist-scalprum/static/2967.7c6a34cd.chunk.js +0 -2
- package/dist-scalprum/static/2967.7c6a34cd.chunk.js.map +0 -1
- package/dist-scalprum/static/3118.daee3324.chunk.js +0 -3
- package/dist-scalprum/static/3118.daee3324.chunk.js.map +0 -1
- package/dist-scalprum/static/483.d55d6ab2.chunk.js +0 -2
- package/dist-scalprum/static/483.d55d6ab2.chunk.js.map +0 -1
- package/dist-scalprum/static/5203.3df62d7e.chunk.js +0 -2
- package/dist-scalprum/static/5203.3df62d7e.chunk.js.map +0 -1
- package/dist-scalprum/static/5453.3c20d0a6.chunk.js +0 -2
- package/dist-scalprum/static/6371.f183dddb.chunk.js +0 -3
- package/dist-scalprum/static/6371.f183dddb.chunk.js.map +0 -1
- package/dist-scalprum/static/7005.d548f8f1.chunk.js +0 -2
- package/dist-scalprum/static/7005.d548f8f1.chunk.js.map +0 -1
- package/dist-scalprum/static/7270.301a3c46.chunk.js +0 -2
- package/dist-scalprum/static/7270.301a3c46.chunk.js.map +0 -1
- package/dist-scalprum/static/9051.f095a8a1.chunk.js +0 -2
- package/dist-scalprum/static/9051.f095a8a1.chunk.js.map +0 -1
- package/dist-scalprum/static/9838.589f2156.chunk.js +0 -2
- package/dist-scalprum/static/9838.589f2156.chunk.js.map +0 -1
- package/dist-scalprum/static/exposed-PluginRoot.a8448fcc.chunk.js +0 -2
- package/dist-scalprum/static/exposed-PluginRoot.a8448fcc.chunk.js.map +0 -1
- /package/dist-scalprum/static/{1584.ae3779f0.chunk.js.LICENSE.txt → 1584.1e45e570.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{4083.488ff7a9.chunk.js.LICENSE.txt → 4083.811c4e7a.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{5010.6241b64f.chunk.js.LICENSE.txt → 5010.4f67737b.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{6371.f183dddb.chunk.js.LICENSE.txt → 635.f63679a5.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{6386.2d20c412.chunk.js.LICENSE.txt → 6386.5922f271.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{3118.daee3324.chunk.js.LICENSE.txt → 7717.6f5b9dd7.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{8563.46f1a3e1.chunk.js.LICENSE.txt → 8563.6501eafb.chunk.js.LICENSE.txt} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[6426],{4387:(t,e,n)=>{n.d(e,{A:()=>c});var a=n(89575),r=n(39850),i=n(95478),o=n(57384),l=n(37976),s=i.forwardRef(function(t,e){var n=t.animation,l=void 0===n?"pulse":n,s=t.classes,c=t.className,u=t.component,p=void 0===u?"span":u,d=t.height,h=t.variant,m=void 0===h?"text":h,f=t.width,g=(0,r.A)(t,["animation","classes","className","component","height","variant","width"]),v=Boolean(g.children);return i.createElement(p,(0,a.A)({ref:e,className:(0,o.A)(s.root,s[m],c,v&&[s.withChildren,!f&&s.fitContent,!d&&s.heightAuto],!1!==l&&s[l])},g,{style:(0,a.A)({width:f,height:d},g.style)}))});const c=(0,l.withStyles)(function(t){return{root:{display:"block",backgroundColor:(0,l.alpha)(t.palette.text.primary,"light"===t.palette.type?.11:.13),height:"1.2em"},text:{marginTop:0,marginBottom:0,height:"auto",transformOrigin:"0 60%",transform:"scale(1, 0.60)",borderRadius:t.shape.borderRadius,"&:empty:before":{content:'"\\00a0"'}},rect:{},circle:{borderRadius:"50%"},pulse:{animation:"$pulse 1.5s ease-in-out 0.5s infinite"},"@keyframes pulse":{"0%":{opacity:1},"50%":{opacity:.4},"100%":{opacity:1}},wave:{position:"relative",overflow:"hidden","&::after":{animation:"$wave 1.6s linear 0.5s infinite",background:"linear-gradient(90deg, transparent, ".concat(t.palette.action.hover,", transparent)"),content:'""',position:"absolute",transform:"translateX(-100%)",bottom:0,left:0,right:0,top:0}},"@keyframes wave":{"0%":{transform:"translateX(-100%)"},"60%":{transform:"translateX(100%)"},"100%":{transform:"translateX(100%)"}},withChildren:{"& > *":{visibility:"hidden"}},fitContent:{maxWidth:"fit-content"},heightAuto:{height:"auto"}}},{name:"MuiSkeleton"})(s)},5030:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0});var a=n(85608),r=n(95478),i=a.__importDefault(n(10009));e.default=function(t,e,n){void 0===e&&(e=[]),void 0===n&&(n={loading:!1});var o=r.useRef(0),l=i.default(),s=r.useState(n),c=s[0],u=s[1],p=r.useCallback(function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];var r=++o.current;return c.loading||u(function(t){return a.__assign(a.__assign({},t),{loading:!0})}),t.apply(void 0,e).then(function(t){return l()&&r===o.current&&u({value:t,loading:!1}),t},function(t){return l()&&r===o.current&&u({error:t,loading:!1}),t})},e);return[c,p]}},10009:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0});var a=n(95478);e.default=function(){var t=a.useRef(!1),e=a.useCallback(function(){return t.current},[]);return a.useEffect(function(){return t.current=!0,function(){t.current=!1}},[]),e}},23164:(t,e,n)=>{var a=n(4293),r=n(78920);e.A=void 0;var i=r(n(95478)),o=(0,a(n(74044)).default)(i.createElement("path",{d:"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"}),"ExpandLess");e.A=o},27799:(t,e,n)=>{var a=n(4293),r=n(78920);e.A=void 0;var i=r(n(95478)),o=(0,a(n(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");e.A=o},32269:(t,e,n)=>{var a=n(4293),r=n(78920);e.A=void 0;var i=r(n(95478)),o=(0,a(n(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");e.A=o},39590:(t,e,n)=>{var a=n(4293),r=n(78920);e.A=void 0;var i=r(n(95478)),o=(0,a(n(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");e.A=o},45210:(t,e,n)=>{n.d(e,{Y:()=>M});var a=n(31085),r=n(22097),i=n(10394),o=n(64947),l=n(93453),s=n(29365),c=n(46423),u=n(5951),p=n(26343),d=n(28233),h=n(55197),m=n(37976),f=n(72501),g=n(5893),v=n(95478),A=(n(45250),n(49634),n(21006)),b=n(67550);const k=()=>{const{t}=(0,b.i)(A.O);return{url:"https://github.com/backstage/backstage/issues",items:[{title:t("supportConfig.default.title"),icon:"warning",links:[{title:t("supportConfig.default.linkTitle"),url:"https://github.com/backstage/backstage/blob/master/app-config.yaml"}]}]}};var x=n(27799);function y(t){const{id:e,Fallback:n=x.A,...i}=t,o=(0,r.useApp)().getSystemIcon(e)??n;return(0,a.jsx)(o,{...i})}function j(t){return(0,a.jsx)(y,{id:"help",...t})}var C=n(37725);const z=(0,m.makeStyles)({popoverList:{minWidth:260,maxWidth:400},menuItem:{whiteSpace:"normal"}},{name:"BackstageSupportButton"}),S=({icon:t})=>{const e=(0,r.useApp)(),n=t?e.getSystemIcon(t)??j:j;return(0,a.jsx)(n,{})},_=({link:t})=>(0,a.jsx)(C.N_,{to:t.url,children:t.title??t.url}),w=({item:t})=>(0,a.jsxs)(p.A,{button:!1,children:[(0,a.jsx)(c.A,{children:(0,a.jsx)(S,{icon:t.icon})}),(0,a.jsx)(u.A,{primary:t.title,secondary:t.links?.reduce((t,e,n)=>[...t,n>0&&(0,a.jsx)("br",{},n),(0,a.jsx)(_,{link:e},e.url)],[])})]});function M(t){const{t:e}=(0,b.i)(A.O),{title:n,items:c,children:u}=t,{items:m}=function(){const t=(0,r.useApiHolder)().get(r.configApiRef),e=t?.getOptionalConfig("app.support"),n=k();return e?{url:e.getString("url"),items:e.getConfigArray("items").flatMap(t=>({title:t.getString("title"),icon:t.getOptionalString("icon"),links:(t.getOptionalConfigArray("links")??[]).flatMap(t=>({url:t.getString("url"),title:t.getOptionalString("title")??""}))}))}:n}(),[x,y]=(0,v.useState)(!1),[C,S]=(0,v.useState)(null),_=z(),M=(0,r.useApi)(r.configApiRef).getOptionalConfig("app.support"),O=(0,g.A)(t=>t.breakpoints.down("sm")),E=t=>{S(t.currentTarget),y(!0)},I=()=>{y(!1)};return M?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.A,{display:"flex",ml:1,children:O?(0,a.jsx)(s.A,{color:"primary",size:"small",onClick:E,"data-testid":"support-button","aria-label":"Support",children:(0,a.jsx)(j,{})}):(0,a.jsx)(o.A,{"data-testid":"support-button","aria-label":"Support",color:"primary",onClick:E,startIcon:(0,a.jsx)(j,{}),children:e("supportButton.title")})}),(0,a.jsxs)(h.Ay,{"data-testid":"support-button-popover",open:x,anchorEl:C,anchorOrigin:{vertical:"bottom",horizontal:"right"},transformOrigin:{vertical:"top",horizontal:"right"},onClose:I,children:[(0,a.jsxs)(d.A,{className:_.popoverList,autoFocusItem:Boolean(C),children:[n&&(0,a.jsx)(p.A,{button:!1,alignItems:"flex-start",className:_.menuItem,children:(0,a.jsx)(f.A,{variant:"subtitle1",children:n})}),v.Children.map(u,(t,e)=>(0,a.jsx)(p.A,{button:!1,alignItems:"flex-start",className:_.menuItem,children:t},`child-${e}`)),(c??m).map((t,e)=>(0,a.jsx)(w,{item:t},`item-${e}`))]}),(0,a.jsx)(l.A,{children:(0,a.jsx)(o.A,{color:"primary",onClick:I,"aria-label":"Close",children:e("supportButton.close")})})]})]}):null}},61524:(t,e,n)=>{var a=n(4293),r=n(78920);e.A=void 0;var i=r(n(95478)),o=(0,a(n(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");e.A=o},77225:(t,e,n)=>{var a=n(4293),r=n(78920);e.A=void 0;var i=r(n(95478)),o=(0,a(n(74044)).default)(i.createElement("path",{d:"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"}),"Warning");e.A=o},91638:(t,e,n)=>{var a=n(85608),r=n(95478),i=a.__importDefault(n(5030));e.A=function(t,e){void 0===e&&(e=[]);var n=i.default(t,e,{loading:!0}),a=n[0],o=n[1];return r.useEffect(function(){o()},[o]),a}}}]);
|
|
2
|
-
//# sourceMappingURL=6426.
|
|
2
|
+
//# sourceMappingURL=6426.4c18bab5.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/6426.bf20c588.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/Skeleton/Skeleton.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useAsyncFn.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useMountedState.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/ExpandLess.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/VisibilityOff.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Warning.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useAsync.js"],"sourcesContent":["import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { alpha, withStyles } from '@material-ui/core/styles';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'block',\n // Create a \"on paper\" color with sufficient contrast retaining the color\n backgroundColor: alpha(theme.palette.text.primary, theme.palette.type === 'light' ? 0.11 : 0.13),\n height: '1.2em'\n },\n\n /* Styles applied to the root element if `variant=\"text\"`. */\n text: {\n marginTop: 0,\n marginBottom: 0,\n height: 'auto',\n transformOrigin: '0 60%',\n transform: 'scale(1, 0.60)',\n borderRadius: theme.shape.borderRadius,\n '&:empty:before': {\n content: '\"\\\\00a0\"'\n }\n },\n\n /* Styles applied to the root element if `variant=\"rect\"`. */\n rect: {},\n\n /* Styles applied to the root element if `variant=\"circle\"`. */\n circle: {\n borderRadius: '50%'\n },\n\n /* Styles applied to the root element if `animation=\"pulse\"`. */\n pulse: {\n animation: '$pulse 1.5s ease-in-out 0.5s infinite'\n },\n '@keyframes pulse': {\n '0%': {\n opacity: 1\n },\n '50%': {\n opacity: 0.4\n },\n '100%': {\n opacity: 1\n }\n },\n\n /* Styles applied to the root element if `animation=\"wave\"`. */\n wave: {\n position: 'relative',\n overflow: 'hidden',\n '&::after': {\n animation: '$wave 1.6s linear 0.5s infinite',\n background: \"linear-gradient(90deg, transparent, \".concat(theme.palette.action.hover, \", transparent)\"),\n content: '\"\"',\n position: 'absolute',\n transform: 'translateX(-100%)',\n // Avoid flash during server-side hydration\n bottom: 0,\n left: 0,\n right: 0,\n top: 0\n }\n },\n '@keyframes wave': {\n '0%': {\n transform: 'translateX(-100%)'\n },\n '60%': {\n // +0.5s of delay between each loop\n transform: 'translateX(100%)'\n },\n '100%': {\n transform: 'translateX(100%)'\n }\n },\n\n /* Styles applied when the component is passed children. */\n withChildren: {\n '& > *': {\n visibility: 'hidden'\n }\n },\n\n /* Styles applied when the component is passed children and no width. */\n fitContent: {\n maxWidth: 'fit-content'\n },\n\n /* Styles applied when the component is passed children and no height. */\n heightAuto: {\n height: 'auto'\n }\n };\n};\nvar Skeleton = /*#__PURE__*/React.forwardRef(function Skeleton(props, ref) {\n var _props$animation = props.animation,\n animation = _props$animation === void 0 ? 'pulse' : _props$animation,\n classes = props.classes,\n className = props.className,\n _props$component = props.component,\n Component = _props$component === void 0 ? 'span' : _props$component,\n height = props.height,\n _props$variant = props.variant,\n variant = _props$variant === void 0 ? 'text' : _props$variant,\n width = props.width,\n other = _objectWithoutProperties(props, [\"animation\", \"classes\", \"className\", \"component\", \"height\", \"variant\", \"width\"]);\n\n var hasChildren = Boolean(other.children);\n return /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref,\n className: clsx(classes.root, classes[variant], className, hasChildren && [classes.withChildren, !width && classes.fitContent, !height && classes.heightAuto], animation !== false && classes[animation])\n }, other, {\n style: _extends({\n width: width,\n height: height\n }, other.style)\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? Skeleton.propTypes = {\n /**\n * The animation.\n * If `false` the animation effect is disabled.\n */\n animation: PropTypes.oneOf(['pulse', 'wave', false]),\n\n /**\n * Optional children to infer width and height from.\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.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes\n /* @typescript-to-proptypes-ignore */\n .elementType,\n\n /**\n * Height of the skeleton.\n * Useful when you don't want to adapt the skeleton to a text element but for instance a card.\n */\n height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n\n /**\n * The type of content that will be rendered.\n */\n variant: PropTypes.oneOf(['text', 'rect', 'circle']),\n\n /**\n * Width of the skeleton.\n * Useful when the skeleton is inside an inline element with no width of its own.\n */\n width: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiSkeleton'\n})(Skeleton);","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar react_1 = require(\"react\");\nvar useMountedState_1 = tslib_1.__importDefault(require(\"./useMountedState\"));\nfunction useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = react_1.useRef(0);\n var isMounted = useMountedState_1.default();\n var _a = react_1.useState(initialState), state = _a[0], set = _a[1];\n var callback = react_1.useCallback(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var callId = ++lastCallId.current;\n if (!state.loading) {\n set(function (prevState) { return (tslib_1.__assign(tslib_1.__assign({}, prevState), { loading: true })); });\n }\n return fn.apply(void 0, args).then(function (value) {\n isMounted() && callId === lastCallId.current && set({ value: value, loading: false });\n return value;\n }, function (error) {\n isMounted() && callId === lastCallId.current && set({ error: error, loading: false });\n return error;\n });\n }, deps);\n return [state, callback];\n}\nexports.default = useAsyncFn;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar react_1 = require(\"react\");\nfunction useMountedState() {\n var mountedRef = react_1.useRef(false);\n var get = react_1.useCallback(function () { return mountedRef.current; }, []);\n react_1.useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\nexports.default = useMountedState;\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 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\n}), 'ExpandLess');\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 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: \"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"\n}), 'Warning');\n\nexports.default = _default;","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar react_1 = require(\"react\");\nvar useAsyncFn_1 = tslib_1.__importDefault(require(\"./useAsyncFn\"));\nfunction useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn_1.default(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n react_1.useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\nexports.default = useAsync;\n"],"names":["Skeleton","props","ref","_props$animation","animation","classes","className","_props$component","component","Component","height","_props$variant","variant","width","other","hasChildren","Boolean","children","root","withChildren","fitContent","heightAuto","style","withStyles","theme","display","backgroundColor","alpha","palette","text","primary","type","marginTop","marginBottom","transformOrigin","transform","borderRadius","shape","content","rect","circle","pulse","opacity","wave","position","overflow","background","concat","action","hover","bottom","left","right","top","visibility","maxWidth","name","Object","defineProperty","exports","value","tslib_1","react_1","useMountedState_1","__importDefault","fn","deps","initialState","loading","lastCallId","useRef","isMounted","default","_a","useState","state","set","callback","useCallback","args","_i","arguments","length","callId","current","prevState","__assign","apply","then","error","mountedRef","get","useEffect","_interopRequireDefault","_interopRequireWildcard","React","_default","createElement","d","useDefaultSupportConfig","url","items","title","t","icon","links","AppIcon","id","key","Fallback","rest","Icon","useApp","getSystemIcon","jsx","HelpIcon","useStyles","makeStyles","popoverList","minWidth","menuItem","whiteSpace","SupportIcon","app","SupportLink","link","to","SupportListItem","item","jsxs","MenuItem","button","ListItemIcon","ListItemText","secondary","reduce","prev","idx","SupportButton","configItems","config","useApiHolder","configApiRef","supportConfig","getOptionalConfig","defaultSupportConfig","getString","getConfigArray","flatMap","itemConf","getOptionalString","getOptionalConfigArray","linkConf","useSupportConfig","popoverOpen","setPopoverOpen","anchorEl","setAnchorEl","useApi","isSmallScreen","useMediaQuery","breakpoints","down","onClickHandler","event","currentTarget","popoverCloseHandler","Fragment","Box","ml","IconButton","color","size","onClick","Button","startIcon","Popover","open","anchorOrigin","vertical","horizontal","onClose","MenuList","autoFocusItem","alignItems","Typography","Children","map","child","i","DialogActions","useAsyncFn_1"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/6426.4c18bab5.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/Skeleton/Skeleton.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useAsyncFn.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useMountedState.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/ExpandLess.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/VisibilityOff.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Warning.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/lib/useAsync.js"],"sourcesContent":["import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { alpha, withStyles } from '@material-ui/core/styles';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'block',\n // Create a \"on paper\" color with sufficient contrast retaining the color\n backgroundColor: alpha(theme.palette.text.primary, theme.palette.type === 'light' ? 0.11 : 0.13),\n height: '1.2em'\n },\n\n /* Styles applied to the root element if `variant=\"text\"`. */\n text: {\n marginTop: 0,\n marginBottom: 0,\n height: 'auto',\n transformOrigin: '0 60%',\n transform: 'scale(1, 0.60)',\n borderRadius: theme.shape.borderRadius,\n '&:empty:before': {\n content: '\"\\\\00a0\"'\n }\n },\n\n /* Styles applied to the root element if `variant=\"rect\"`. */\n rect: {},\n\n /* Styles applied to the root element if `variant=\"circle\"`. */\n circle: {\n borderRadius: '50%'\n },\n\n /* Styles applied to the root element if `animation=\"pulse\"`. */\n pulse: {\n animation: '$pulse 1.5s ease-in-out 0.5s infinite'\n },\n '@keyframes pulse': {\n '0%': {\n opacity: 1\n },\n '50%': {\n opacity: 0.4\n },\n '100%': {\n opacity: 1\n }\n },\n\n /* Styles applied to the root element if `animation=\"wave\"`. */\n wave: {\n position: 'relative',\n overflow: 'hidden',\n '&::after': {\n animation: '$wave 1.6s linear 0.5s infinite',\n background: \"linear-gradient(90deg, transparent, \".concat(theme.palette.action.hover, \", transparent)\"),\n content: '\"\"',\n position: 'absolute',\n transform: 'translateX(-100%)',\n // Avoid flash during server-side hydration\n bottom: 0,\n left: 0,\n right: 0,\n top: 0\n }\n },\n '@keyframes wave': {\n '0%': {\n transform: 'translateX(-100%)'\n },\n '60%': {\n // +0.5s of delay between each loop\n transform: 'translateX(100%)'\n },\n '100%': {\n transform: 'translateX(100%)'\n }\n },\n\n /* Styles applied when the component is passed children. */\n withChildren: {\n '& > *': {\n visibility: 'hidden'\n }\n },\n\n /* Styles applied when the component is passed children and no width. */\n fitContent: {\n maxWidth: 'fit-content'\n },\n\n /* Styles applied when the component is passed children and no height. */\n heightAuto: {\n height: 'auto'\n }\n };\n};\nvar Skeleton = /*#__PURE__*/React.forwardRef(function Skeleton(props, ref) {\n var _props$animation = props.animation,\n animation = _props$animation === void 0 ? 'pulse' : _props$animation,\n classes = props.classes,\n className = props.className,\n _props$component = props.component,\n Component = _props$component === void 0 ? 'span' : _props$component,\n height = props.height,\n _props$variant = props.variant,\n variant = _props$variant === void 0 ? 'text' : _props$variant,\n width = props.width,\n other = _objectWithoutProperties(props, [\"animation\", \"classes\", \"className\", \"component\", \"height\", \"variant\", \"width\"]);\n\n var hasChildren = Boolean(other.children);\n return /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref,\n className: clsx(classes.root, classes[variant], className, hasChildren && [classes.withChildren, !width && classes.fitContent, !height && classes.heightAuto], animation !== false && classes[animation])\n }, other, {\n style: _extends({\n width: width,\n height: height\n }, other.style)\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? Skeleton.propTypes = {\n /**\n * The animation.\n * If `false` the animation effect is disabled.\n */\n animation: PropTypes.oneOf(['pulse', 'wave', false]),\n\n /**\n * Optional children to infer width and height from.\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.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes\n /* @typescript-to-proptypes-ignore */\n .elementType,\n\n /**\n * Height of the skeleton.\n * Useful when you don't want to adapt the skeleton to a text element but for instance a card.\n */\n height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n\n /**\n * The type of content that will be rendered.\n */\n variant: PropTypes.oneOf(['text', 'rect', 'circle']),\n\n /**\n * Width of the skeleton.\n * Useful when the skeleton is inside an inline element with no width of its own.\n */\n width: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiSkeleton'\n})(Skeleton);","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar react_1 = require(\"react\");\nvar useMountedState_1 = tslib_1.__importDefault(require(\"./useMountedState\"));\nfunction useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = react_1.useRef(0);\n var isMounted = useMountedState_1.default();\n var _a = react_1.useState(initialState), state = _a[0], set = _a[1];\n var callback = react_1.useCallback(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var callId = ++lastCallId.current;\n if (!state.loading) {\n set(function (prevState) { return (tslib_1.__assign(tslib_1.__assign({}, prevState), { loading: true })); });\n }\n return fn.apply(void 0, args).then(function (value) {\n isMounted() && callId === lastCallId.current && set({ value: value, loading: false });\n return value;\n }, function (error) {\n isMounted() && callId === lastCallId.current && set({ error: error, loading: false });\n return error;\n });\n }, deps);\n return [state, callback];\n}\nexports.default = useAsyncFn;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar react_1 = require(\"react\");\nfunction useMountedState() {\n var mountedRef = react_1.useRef(false);\n var get = react_1.useCallback(function () { return mountedRef.current; }, []);\n react_1.useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\nexports.default = useMountedState;\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 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\n}), 'ExpandLess');\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 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: \"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"\n}), 'Warning');\n\nexports.default = _default;","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar react_1 = require(\"react\");\nvar useAsyncFn_1 = tslib_1.__importDefault(require(\"./useAsyncFn\"));\nfunction useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn_1.default(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n react_1.useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\nexports.default = useAsync;\n"],"names":["Skeleton","props","ref","_props$animation","animation","classes","className","_props$component","component","Component","height","_props$variant","variant","width","other","hasChildren","Boolean","children","root","withChildren","fitContent","heightAuto","style","withStyles","theme","display","backgroundColor","alpha","palette","text","primary","type","marginTop","marginBottom","transformOrigin","transform","borderRadius","shape","content","rect","circle","pulse","opacity","wave","position","overflow","background","concat","action","hover","bottom","left","right","top","visibility","maxWidth","name","Object","defineProperty","exports","value","tslib_1","react_1","useMountedState_1","__importDefault","fn","deps","initialState","loading","lastCallId","useRef","isMounted","default","_a","useState","state","set","callback","useCallback","args","_i","arguments","length","callId","current","prevState","__assign","apply","then","error","mountedRef","get","useEffect","_interopRequireDefault","_interopRequireWildcard","React","_default","createElement","d","useDefaultSupportConfig","url","items","title","t","icon","links","AppIcon","id","key","Fallback","rest","Icon","useApp","getSystemIcon","jsx","HelpIcon","useStyles","makeStyles","popoverList","minWidth","menuItem","whiteSpace","SupportIcon","app","SupportLink","link","to","SupportListItem","item","jsxs","MenuItem","button","ListItemIcon","ListItemText","secondary","reduce","prev","idx","SupportButton","configItems","config","useApiHolder","configApiRef","supportConfig","getOptionalConfig","defaultSupportConfig","getString","getConfigArray","flatMap","itemConf","getOptionalString","getOptionalConfigArray","linkConf","useSupportConfig","popoverOpen","setPopoverOpen","anchorEl","setAnchorEl","useApi","isSmallScreen","useMediaQuery","breakpoints","down","onClickHandler","event","currentTarget","popoverCloseHandler","Fragment","Box","ml","IconButton","color","size","onClick","Button","startIcon","Popover","open","anchorOrigin","vertical","horizontal","onClose","MenuList","autoFocusItem","alignItems","Typography","Children","map","child","i","DialogActions","useAsyncFn_1"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[6777],{14933:(e,n,t)=>{t.d(n,{c:()=>f});var a=t(31085),r=t(95478),s=t(76891),i=t(61477),o=t(46805),l=t(10394),d=t(72501),c=t(95061),p=t(48543),u=t(81215),h=t(26343),m=t(16249),y=t(93453),A=t(64947),g=t(78467),x=t(39053),v=t(22097),j=t(70980);const f=({open:e,onClose:n,onSuccess:t,apiProductName:f,namespace:b,userEmail:w,plans:k})=>{const C=(0,v.useApi)(j.s),$=(0,v.useApi)(v.alertApiRef),[P,S]=(0,r.useState)(""),[q,R]=(0,r.useState)(""),[I,T]=(0,r.useState)(!1),[E,z]=(0,r.useState)(null),B=()=>{S(""),R(""),z(null),n()};return(0,a.jsxs)(s.A,{open:e,onClose:B,maxWidth:"sm",fullWidth:!0,children:[(0,a.jsx)(i.A,{children:"Request API Access"}),(0,a.jsxs)(o.A,{children:[(0,a.jsxs)(l.A,{mb:2,p:1.5,bgcolor:"info.light",borderRadius:1,display:"flex",alignItems:"flex-start",style:{gap:8},children:[(0,a.jsx)(x.A,{color:"primary",fontSize:"small",style:{marginTop:2}}),(0,a.jsx)(d.A,{variant:"body2",children:"Your request will be reviewed by an API owner before access is granted."})]}),E&&(0,a.jsx)(l.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,a.jsx)(d.A,{variant:"body2",children:E})}),(0,a.jsxs)(c.A,{fullWidth:!0,margin:"normal",disabled:I,"data-testid":"tier-select-form",children:[(0,a.jsx)(p.A,{id:"tier-select-label",children:"Select Tier"}),(0,a.jsx)(u.A,{labelId:"tier-select-label","data-testid":"tier-select",value:P,onChange:e=>S(e.target.value),disabled:I,children:k.map(e=>{const n=Object.entries(e.limits||{}).map(([e,n])=>`${n} per ${e}`).join(", ");return(0,a.jsxs)(h.A,{value:e.tier,"data-testid":`tier-option-${e.tier}`,children:[e.tier," ",n?`(${n})`:""]},e.tier)})})]}),(0,a.jsx)(m.A,{label:"Use Case (optional)",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:q,onChange:e=>R(e.target.value),helperText:"Explain your intended use of this API for admin review",disabled:I})]}),(0,a.jsxs)(y.A,{children:[(0,a.jsx)(A.A,{onClick:B,disabled:I,children:"Cancel"}),(0,a.jsx)(A.A,{onClick:async()=>{if(P){T(!0),z(null);try{await C.createRequest({apiProductName:f,namespace:b,planTier:P,useCase:q.trim()||"",userEmail:w}),$.post({message:"API key requested successfully",severity:"success",display:"transient"}),S(""),R(""),t()}catch(e){const n=e instanceof Error?e.message:"unknown error occurred";$.post({message:`Failed to request API key: ${n}`,severity:"error",display:"transient"}),z(n)}finally{T(!1)}}},color:"primary",variant:"contained",disabled:!P||I,startIcon:I?(0,a.jsx)(g.A,{size:16,color:"inherit"}):void 0,children:I?"Submitting...":"Submit Request"})]})]})}},16397:(e,n,t)=>{t.d(n,{e:()=>j});var a=t(31085),r=t(95478),s=t(76891),i=t(61477),o=t(46805),l=t(10394),d=t(72501),c=t(95061),p=t(48543),u=t(81215),h=t(26343),m=t(16249),y=t(93453),A=t(64947),g=t(78467),x=t(22097),v=t(70980);const j=({open:e,onClose:n,onSuccess:t,request:j,availablePlans:f})=>{const b=(0,x.useApi)(v.s),[w,k]=(0,r.useState)(""),[C,$]=(0,r.useState)(""),[P,S]=(0,r.useState)(!1),[q,R]=(0,r.useState)("");(0,r.useEffect)(()=>{e&&j&&(k(j.spec.planTier||""),$(j.spec.useCase||""),R(""))},[e,j]);const I=()=>{P||(R(""),n())};return(0,a.jsxs)(s.A,{open:e,onClose:I,maxWidth:"sm",fullWidth:!0,children:[(0,a.jsx)(i.A,{children:"Edit API Key"}),(0,a.jsxs)(o.A,{children:[q&&(0,a.jsx)(l.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,a.jsx)(d.A,{variant:"body2",children:q})}),(0,a.jsxs)(c.A,{fullWidth:!0,margin:"normal",children:[(0,a.jsx)(p.A,{children:"Tier"}),(0,a.jsx)(u.A,{value:w,onChange:e=>k(e.target.value),disabled:P,children:f.map(e=>{const n=Object.entries(e.limits||{}).map(([e,n])=>`${n} per ${e}`).join(", ");return(0,a.jsxs)(h.A,{value:e.tier,children:[e.tier," ",n?`(${n})`:""]},e.tier)})})]}),(0,a.jsx)(m.A,{label:"Use Case",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:C,onChange:e=>$(e.target.value),disabled:P,helperText:"Explain your intended use of this API for admin review"})]}),(0,a.jsxs)(y.A,{children:[(0,a.jsx)(A.A,{onClick:I,disabled:P,children:"Cancel"}),(0,a.jsx)(A.A,{onClick:async()=>{if(w){R(""),S(!0);try{const e={spec:{planTier:w,useCase:C.trim()}};await b.updateRequest(j.metadata.name,j.metadata.namespace,e),t(),n()}catch(e){console.error("Error updating API key request:",e),R(e instanceof Error?e.message:"Unknown error occurred")}finally{S(!1)}}else R("Please select a tier")},color:"primary",variant:"contained",disabled:!w||P,startIcon:P?(0,a.jsx)(g.A,{size:16,color:"inherit"}):void 0,children:P?"Saving...":"Save Changes"})]})]})}},56777:(e,n,t)=>{t.d(n,{_:()=>X});var a=t(31085),r=t(95478),s=t(35015),i=t(82300),o=t(42367),l=t(25010),d=t(10394),c=t(72501),p=t(31653),u=t(38605),h=t(67720),m=t(71677),y=t(29365),A=t(78467),g=t(42899),x=t(64947),v=t(37757),j=t(26343),f=t(76891),b=t(61477),w=t(46805),k=t(93453),C=t(4387),$=t(22097),P=t(70980),S=t(25467),q=t(84692),R=t(32269),I=t(61524),T=t(93246),E=t(92399),z=t(18466),B=t(71407),K=t(99594),_=t(77225),D=t(34955),W=t(46205),N=t(16397),G=t(63221);function H(e,n,t){const a=t?`${t} `:"";return{curl:`curl -X GET ${e} \\\n -H "Authorization: ${t?`${t} ${n}`:n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': '${a}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nheaders = {\n 'Authorization': '${a}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.Header.Add("Authorization", "${a}" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}var U=t(14933);const X=({namespace:e})=>{var n,t,X,F,L;const{entity:M}=(0,S.tN)(),O=(0,$.useApi)(q.v),V=(0,$.useApi)(P.s),Y=(0,$.useApi)($.identityApiRef),J=(0,$.useApi)($.alertApiRef),[Q,Z]=(0,r.useState)(new Set),[ee,ne]=(0,r.useState)(0),[te,ae]=(0,r.useState)(""),[re,se]=(0,r.useState)(""),[ie,oe]=(0,r.useState)(!1),[le,de]=(0,r.useState)(!1),[ce,pe]=(0,r.useState)(null),[ue,he]=(0,r.useState)(null),[me,ye]=(0,r.useState)(null),[Ae,ge]=(0,r.useState)(null),[xe,ve]=(0,r.useState)(new Set),[je,fe]=(0,r.useState)({open:!1,request:null}),[be,we]=(0,r.useState)(new Map),[ke,Ce]=(0,r.useState)(new Set),[$e,Pe]=(0,r.useState)(new Set),[Se,qe]=(0,r.useState)(!1),[Re,Ie]=(0,r.useState)(null),Te=(null===(n=M.metadata.annotations)||void 0===n?void 0:n["kuadrant.io/apiproduct"])||M.metadata.name,Ee=(null===(t=M.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"])||e||"default";(0,s.A)(async()=>{const e=await Y.getBackstageIdentity(),n=await Y.getProfileInfo();ae(e.userEntityRef);let t=n.email||"";if(!t&&e.userEntityRef){var a,r;const n=await O.getEntityByRef(e.userEntityRef);(null==n||null===(r=n.spec)||void 0===r||null===(a=r.profile)||void 0===a?void 0:a.email)&&(t=n.spec.profile.email)}se(t)},[Y]);const{value:ze,loading:Be,error:Ke}=(0,s.A)(async()=>((await V.getRequestsByNamespace(Ee)).items||[]).filter(e=>e.spec.apiProductRef.name===Te&&e.metadata.namespace===Ee),[Te,Ee,ee,V]),{value:_e,loading:De,error:We}=(0,s.A)(async()=>{var e;return null===(e=(await V.getApiProducts()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===Ee&&e.metadata.name===Te)},[Ee,Te,V]),Ne=_e?`apiproduct:${_e.metadata.namespace}/${_e.metadata.name}`:void 0,{allowed:Ge,loading:He,error:Ue}=(0,W.l)(D.dp,Ne),{allowed:Xe,loading:Fe,error:Le}=(0,W.l)(D.uL),{allowed:Me,loading:Oe,error:Ve}=(0,W.l)(D.jH),{allowed:Ye,loading:Je,error:Qe}=(0,W.l)(D.q0),Ze=()=>{he(null),ye(null)},en=()=>{me&&(pe(me),de(!0),Ze())},nn=()=>{if(!me)return;const e=me;Ze(),fe({open:!0,request:e})},tn=e=>{Z(n=>{const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t})},an=(0,r.useMemo)(()=>[{render:e=>{var n;const t=e.rowData;if(!(null==t||null===(n=t.metadata)||void 0===n?void 0:n.name))return(0,a.jsx)(d.A,{});const r=`${t.metadata.namespace}/${t.metadata.name}`,s=be.get(r);return(0,a.jsx)(rn,{request:t,apiName:Te,revealedApiKey:s})}}],[Te,be]),rn=({request:e,apiName:n,revealedApiKey:t})=>{var s,o,l;const[h,m]=(0,r.useState)(0),y=(null===(s=e.status)||void 0===s?void 0:s.apiHostname)||`${n}.apps.example.com`,A=t||"<your-api-key>",g=function(e,n,t){const a=`https://${n}/api/v1/endpoint`;return e?e.authorizationHeader?H(a,t,e.authorizationHeader.prefix||""):e.customHeader?function(e,n,t,a){return{curl:`curl -X GET ${e} \\\n -H "${t}: ${a?`${a}${n}`:n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n '${t}': '${a}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nheaders = {\n '${t}': '${a}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.Header.Add("${t}", "${a}" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.customHeader.name,e.customHeader.prefix||""):e.queryString?function(e,n,t){return{curl:`curl -X GET "${e}?${t}=${n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}?${t}=' + apiKey;\n\nfetch(endpoint, {\n method: 'GET'\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nparams = {\n '${t}': api_key\n}\n\nresponse = requests.get(endpoint, params=params)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}?${t}=" + apiKey\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.queryString.name):e.cookie?function(e,n,t){return{curl:`curl -X GET ${e} \\\n --cookie "${t}=${n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Cookie': '${t}=' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\ncookies = {\n '${t}': api_key\n}\n\nresponse = requests.get(endpoint, cookies=cookies)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.AddCookie(&http.Cookie{\n Name: "${t}",\n Value: apiKey,\n })\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.cookie.name):H(a,t,"Bearer"):H(a,t,"Bearer")}(null===(l=e.status)||void 0===l||null===(o=l.authScheme)||void 0===o?void 0:o.credentials,y,A);return(0,a.jsxs)(d.A,{p:3,bgcolor:"background.default",onClick:e=>e.stopPropagation(),children:[e.spec.useCase&&(0,a.jsxs)(d.A,{mb:3,children:[(0,a.jsx)(c.A,{variant:"h6",gutterBottom:!0,children:"Use Case"}),(0,a.jsx)(d.A,{p:2,bgcolor:"background.paper",borderRadius:1,border:"1px solid rgba(0, 0, 0, 0.12)",children:(0,a.jsx)(c.A,{variant:"body2",style:{whiteSpace:"pre-wrap",wordBreak:"break-word",overflowWrap:"break-word"},children:e.spec.useCase})})]}),(0,a.jsx)(c.A,{variant:"h6",gutterBottom:!0,children:"Usage Examples"}),(0,a.jsxs)(c.A,{variant:"body2",paragraph:!0,children:["Use these code examples to test the API with your"," ",e.spec.planTier," tier key."]}),(0,a.jsx)(d.A,{onClick:e=>e.stopPropagation(),children:(0,a.jsxs)(p.A,{value:h,onChange:(e,n)=>{e.stopPropagation(),m(n)},indicatorColor:"primary",children:[(0,a.jsx)(u.A,{label:"cURL",onClick:e=>e.stopPropagation()}),(0,a.jsx)(u.A,{label:"Node.js",onClick:e=>e.stopPropagation()}),(0,a.jsx)(u.A,{label:"Python",onClick:e=>e.stopPropagation()}),(0,a.jsx)(u.A,{label:"Go",onClick:e=>e.stopPropagation()})]})}),(0,a.jsxs)(d.A,{mt:2,children:[0===h&&(0,a.jsx)(i.z,{text:g.curl,language:"bash",showCopyCodeButton:!0}),1===h&&(0,a.jsx)(i.z,{text:g.nodejs,language:"javascript",showCopyCodeButton:!0}),2===h&&(0,a.jsx)(i.z,{text:g.python,language:"python",showCopyCodeButton:!0}),3===h&&(0,a.jsx)(i.z,{text:g.go,language:"go",showCopyCodeButton:!0})]})]})},sn=Ke||We,on=Ue||Le||Ve||Qe;if(Be||De||He||Fe||Oe||Je)return(0,a.jsx)(d.A,{p:2,children:[...Array(5)].map((e,n)=>(0,a.jsx)(d.A,{p:2,children:(0,a.jsx)(C.A,{variant:"text",width:"100%"})},n))});if(sn)return(0,a.jsx)(o._,{error:sn});if(on){const e=Ue?"kuadrant.apikey.create":Le?"kuadrant.apikey.delete.own":Ve?"kuadrant.apikey.delete.all":Qe?"kuadrant.apikey.update.own":"unknown";return(0,a.jsxs)(d.A,{p:2,children:[(0,a.jsxs)(c.A,{color:"error",children:["Unable to check permissions: ",on.message]}),(0,a.jsxs)(c.A,{variant:"body2",color:"textSecondary",children:["Permission: ",e]}),(0,a.jsx)(c.A,{variant:"body2",color:"textSecondary",children:"Please try again or contact your administrator"})]})}const ln=(ze||[]).filter(e=>!xe.has(e.metadata.name)),dn=(null==_e||null===(X=_e.status)||void 0===X?void 0:X.discoveredPlans)||[],cn=ln.filter(e=>{var n;return!(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending"===e.status.phase}),pn=ln.filter(e=>{var n;return"Approved"===(null===(n=e.status)||void 0===n?void 0:n.phase)}),un=ln.filter(e=>{var n;return"Rejected"===(null===(n=e.status)||void 0===n?void 0:n.phase)}),hn=[{title:"Tier",field:"spec.planTier",render:e=>(0,a.jsx)(h.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Approved",field:"status.reviewedAt",render:e=>{var n;return(0,a.jsx)(c.A,{variant:"body2",children:(null===(n=e.status)||void 0===n?void 0:n.reviewedAt)?new Date(e.status.reviewedAt).toLocaleDateString():"-"})}},{title:"API Key",field:"status.secretRef",searchable:!1,filtering:!1,render:e=>{var n,t,r;const s=`${e.metadata.namespace}/${e.metadata.name}`,i=Q.has(e.metadata.name),o=ke.has(s),l=be.get(s),p=null===(t=e.status)||void 0===t||null===(n=t.secretRef)||void 0===n?void 0:n.name,u=!1!==(null===(r=e.status)||void 0===r?void 0:r.canReadSecret),h=$e.has(s)||!u;return p?h&&!l?(0,a.jsx)(m.Ay,{title:"This API key has already been viewed and cannot be retrieved again",children:(0,a.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(c.A,{variant:"body2",color:"textSecondary",style:{fontFamily:"monospace",marginRight:8},children:"Already viewed"}),(0,a.jsx)(I.A,{fontSize:"small",color:"disabled"})]})}):(0,a.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(c.A,{variant:"body2",style:{fontFamily:"monospace",marginRight:8},children:o?"Loading...":i&&l?l:"••••••••••••••••"}),i&&l&&(0,a.jsx)(m.Ay,{title:"Copy to clipboard",children:(0,a.jsx)(y.A,{size:"small",onClick:async()=>{l&&(await navigator.clipboard.writeText(l),J.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,a.jsx)(K.A,{fontSize:"small"})})}),(0,a.jsx)(m.Ay,{title:i?"Hide API key":"Reveal API key (one-time only)",children:(0,a.jsx)("span",{children:(0,a.jsx)(y.A,{size:"small",onClick:()=>{i?(((e,n)=>{const t=`${e}/${n}`;we(e=>{const n=new Map(e);return n.delete(t),n})})(e.metadata.namespace,e.metadata.name),tn(e.metadata.name)):h||(Ie({namespace:e.metadata.namespace,name:e.metadata.name}),qe(!0))},disabled:o||h&&!l,children:i?(0,a.jsx)(I.A,{}):(0,a.jsx)(R.A,{})})})})]}):(0,a.jsx)(c.A,{variant:"body2",color:"textSecondary",children:"Awaiting secret..."})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{if(Ae===e.metadata.name)return(0,a.jsx)(A.A,{size:20});const n=e.spec.requestedBy.userId;return(0,W.W)(n,te,Xe,Me)?(0,a.jsx)(y.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();he({top:t.bottom,left:t.left}),ye(e)},title:"Actions","aria-controls":ue?"actions-menu":void 0,"aria-haspopup":"true",children:(0,a.jsx)(B.A,{})}):null}}],mn=[{title:"Status",field:"status.phase",render:e=>{var n;const t=(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending",r="Pending"===t;return(0,a.jsx)(h.A,{label:t,size:"small",icon:r?(0,a.jsx)(T.A,{}):(0,a.jsx)(E.A,{}),color:r?"default":"secondary"})}},{title:"Tier",field:"spec.planTier",render:e=>(0,a.jsx)(h.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Use Case",field:"spec.useCase",render:e=>e.spec.useCase?(0,a.jsx)(m.Ay,{title:e.spec.useCase,placement:"top",children:(0,a.jsx)(c.A,{variant:"body2",style:{maxWidth:"200px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.spec.useCase})}):(0,a.jsx)(c.A,{variant:"body2",children:"-"})},{title:"Requested",field:"metadata.creationTimestamp",render:e=>(0,a.jsx)(c.A,{variant:"body2",children:e.metadata.creationTimestamp?new Date(e.metadata.creationTimestamp).toLocaleDateString():"-"})},{title:"Reviewed",field:"status.reviewedAt",render:e=>{var n;return(null===(n=e.status)||void 0===n?void 0:n.reviewedAt)?(0,a.jsx)(c.A,{variant:"body2",children:new Date(e.status.reviewedAt).toLocaleDateString()}):(0,a.jsx)(c.A,{variant:"body2",children:"-"})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{var n;if(Ae===e.metadata.name)return(0,a.jsx)(A.A,{size:20});const t=!(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending"===e.status.phase,r=e.spec.requestedBy.userId,s=(0,W.W)(r,te,Xe,Me);return t&&(Ye&&r===te||s)?(0,a.jsx)(y.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();he({top:t.bottom,left:t.left}),ye(e)},title:"Actions","aria-controls":ue?"actions-menu":void 0,"aria-haspopup":"true",children:(0,a.jsx)(B.A,{})}):null}}],yn=mn.filter(e=>"Reviewed"!==e.title&&"Reason"!==e.title);return(0,a.jsxs)(d.A,{p:2,children:[(0,a.jsxs)(g.A,{container:!0,spacing:3,direction:"column",children:[Ge&&(0,a.jsx)(g.A,{item:!0,children:(0,a.jsxs)(d.A,{display:"flex",flexDirection:"column",alignItems:"flex-end",mb:2,children:[(0,a.jsx)(x.A,{variant:"contained",color:"primary",startIcon:(0,a.jsx)(z.A,{}),onClick:()=>oe(!0),disabled:0===dn.length||!re,"data-testid":"request-api-access-button","data-plans-count":dn.length,children:"Request API Access"}),!re&&(0,a.jsx)(c.A,{variant:"caption",color:"textSecondary",style:{marginTop:4},"data-testid":"no-email-message",children:'"Email address is required"'}),0===dn.length&&(0,a.jsx)(c.A,{variant:"caption",color:"textSecondary",style:{marginTop:4},"data-testid":"no-plans-message",children:_e?(()=>{var e,n,t,a;const r=null===(n=_e.status)||void 0===n||null===(e=n.conditions)||void 0===e?void 0:e.find(e=>"Ready"===e.type),s=null===(a=_e.status)||void 0===a||null===(t=a.conditions)||void 0===t?void 0:t.find(e=>"PlanPolicyDiscovered"===e.type);return"True"!==(null==r?void 0:r.status)?`HTTPRoute not ready: ${(null==r?void 0:r.message)||"unknown"}`:"True"!==(null==s?void 0:s.status)?`No plans discovered: ${(null==s?void 0:s.message)||"no PlanPolicy found"}`:"No plans available"})():"API product not found"})]})}),0===cn.length&&0===un.length&&0===pn.length&&(0,a.jsx)(g.A,{item:!0,children:(0,a.jsx)(d.A,{p:3,textAlign:"center",children:(0,a.jsx)(c.A,{variant:"body1",color:"textSecondary",children:"No API keys yet. Request access to get started."})})}),cn.length>0&&(0,a.jsx)(g.A,{item:!0,children:(0,a.jsx)(l.X,{title:"Pending Requests",options:{paging:cn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:yn,data:cn})}),un.length>0&&(0,a.jsx)(g.A,{item:!0,children:(0,a.jsx)(l.X,{title:"Rejected Requests",options:{paging:un.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:mn,data:un})}),pn.length>0&&(0,a.jsx)(g.A,{item:!0,children:(0,a.jsx)(l.X,{title:"API Keys",options:{paging:pn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:hn,data:pn,detailPanel:an},"api-keys-table")})]}),(0,a.jsx)(U.c,{open:ie,onClose:()=>oe(!1),onSuccess:()=>{oe(!1),ne(e=>e+1)},apiProductName:Te,namespace:Ee,userEmail:re,plans:dn}),(0,a.jsx)(v.A,{id:"actions-menu",open:Boolean(ue),onClose:Ze,anchorReference:"anchorPosition",anchorPosition:ue||{top:0,left:0},children:me&&(()=>{var e;const n=!(null===(e=me.status)||void 0===e?void 0:e.phase)||"Pending"===me.status.phase,t=me.spec.requestedBy.userId,r=[];return Ye&&t===te&&n&&r.push((0,a.jsx)(j.A,{onClick:en,children:"Edit"},"edit")),r.push((0,a.jsx)(j.A,{onClick:nn,children:"Delete"},"delete")),r})()}),ce&&(0,a.jsx)(N.e,{open:le,onClose:()=>{de(!1),pe(null)},onSuccess:()=>{ne(e=>e+1),de(!1),J.post({message:"API key updated",severity:"success",display:"transient"}),pe(null)},request:ce,availablePlans:dn}),(0,a.jsx)(G.K,{open:je.open,title:"Delete Request",description:`Are you sure you want to delete this ${"Approved"===(null===(L=je.request)||void 0===L||null===(F=L.status)||void 0===F?void 0:F.phase)?"API key":"request"}?`,deleting:null!==Ae,onConfirm:async()=>{je.request&&(await(async e=>{ve(n=>new Set(n).add(e)),ge(e);try{await V.deleteRequest(Ee,e),J.post({message:"API key deleted successfully",severity:"success",display:"transient"}),ne(e=>e+1)}catch(n){const t=n instanceof Error?n.message:"unknown error occurred";ve(n=>{const t=new Set(n);return t.delete(e),t}),J.post({message:`Failed to delete API key: ${t}`,severity:"error",display:"transient"})}finally{ge(null)}})(je.request.metadata.name),fe({open:!1,request:null}))},onCancel:()=>{fe({open:!1,request:null})}}),(0,a.jsxs)(f.A,{open:Se,onClose:()=>{qe(!1),Ie(null)},maxWidth:"sm",children:[(0,a.jsx)(b.A,{children:(0,a.jsxs)(d.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(_.A,{color:"primary",style:{marginRight:8}}),"View API Key"]})}),(0,a.jsxs)(w.A,{children:[(0,a.jsxs)(c.A,{variant:"body1",paragraph:!0,children:["This API key can only be viewed ",(0,a.jsx)("strong",{children:"once"}),". After you reveal it, you will not be able to retrieve it again."]}),(0,a.jsx)(c.A,{variant:"body2",color:"textSecondary",children:"Make sure to copy and store it securely before closing this view."})]}),(0,a.jsxs)(k.A,{children:[(0,a.jsx)(x.A,{onClick:()=>{qe(!1),Ie(null)},children:"Cancel"}),(0,a.jsx)(x.A,{variant:"contained",color:"primary",onClick:()=>{Re&&((async(e,n)=>{const t=`${e}/${n}`;if(!ke.has(t)){Ce(e=>new Set(e).add(t));try{const a=await V.getApiKeySecret(e,n);we(e=>new Map(e).set(t,a.apiKey)),Pe(e=>new Set(e).add(t))}catch(e){const n=e instanceof Error?e.message:"unknown error occurred";n.includes("403")||n.includes("already been viewed")?(Pe(e=>new Set(e).add(t)),J.post({message:"This API key has already been viewed and cannot be retrieved again.",severity:"warning",display:"transient"})):J.post({message:`Failed to fetch api key: ${n}`,severity:"error",display:"transient"})}finally{Ce(e=>{const n=new Set(e);return n.delete(t),n})}}})(Re.namespace,Re.name),tn(Re.name)),qe(!1),Ie(null)},children:"Reveal API Key"})]})]})]})}},63221:(e,n,t)=>{t.d(n,{K:()=>A});var a=t(31085),r=t(95478),s=t(76891),i=t(61477),o=t(10394),l=t(46805),d=t(59461),c=t(72501),p=t(16249),u=t(93453),h=t(64947),m=t(78467),y=t(77225);const A=({open:e,title:n,description:t,confirmText:A,severity:g="normal",deleting:x=!1,onConfirm:v,onCancel:j})=>{const[f,b]=(0,r.useState)("");(0,r.useEffect)(()=>{e||b("")},[e]);const w="high"===g&&A,k=!w||f===A;return(0,a.jsxs)(s.A,{open:e,onClose:x?void 0:j,maxWidth:"sm",fullWidth:!0,children:[(0,a.jsxs)(i.A,{children:["high"===g&&(0,a.jsxs)(o.A,{display:"flex",alignItems:"center",style:{gap:8},children:[(0,a.jsx)(y.A,{color:"error"}),(0,a.jsx)("span",{children:n})]}),"high"!==g&&n]}),(0,a.jsxs)(l.A,{children:[(0,a.jsx)(d.A,{style:{whiteSpace:"pre-line"},children:t}),w&&(0,a.jsxs)(o.A,{mt:2,children:[(0,a.jsxs)(c.A,{variant:"body2",color:"textSecondary",gutterBottom:!0,children:["Type ",(0,a.jsx)("strong",{children:A})," to confirm:"]}),(0,a.jsx)(p.A,{fullWidth:!0,variant:"outlined",size:"small",value:f,onChange:e=>b(e.target.value),disabled:x,autoFocus:!0,placeholder:A})]})]}),(0,a.jsxs)(u.A,{children:[(0,a.jsx)(h.A,{onClick:j,disabled:x,children:"Cancel"}),(0,a.jsx)(h.A,{onClick:()=>{k&&v()},color:"secondary",variant:"contained",disabled:x||!k,startIcon:x?(0,a.jsx)(m.A,{size:16,color:"inherit"}):void 0,children:x?"Deleting...":"Delete"})]})]})}}}]);
|
|
2
|
+
//# sourceMappingURL=6777.a2b77ec5.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/6777.a2b77ec5.chunk.js","mappings":"gWAkCO,MAAMA,EAAsB,EACjCC,OACAC,UACAC,YACAC,iBACAC,YACAC,YACAC,YAEA,MAAMC,GAAcC,EAAAA,EAAAA,QAAOC,EAAAA,GACrBC,GAAWF,EAAAA,EAAAA,QAAOG,EAAAA,cAEjBC,EAAcC,IAAmBC,EAAAA,EAAAA,UAAS,KAC1CC,EAASC,IAAcF,EAAAA,EAAAA,UAAS,KAChCG,EAAUC,IAAeJ,EAAAA,EAAAA,WAAS,IAClCK,EAAaC,IAAkBN,EAAAA,EAAAA,UAAwB,MAExDO,EAAc,KAClBR,EAAgB,IAChBG,EAAW,IACXI,EAAe,MACfnB,KAwCF,OACE,UAACqB,EAAAA,EAAMA,CAACtB,KAAMA,EAAMC,QAASoB,EAAaE,SAAS,KAAKC,WAAS,E,WAC/D,SAACC,EAAAA,EAAWA,C,SAAC,wBACb,UAACC,EAAAA,EAAaA,C,WACZ,UAACC,EAAAA,EAAGA,CACFC,GAAI,EACJC,EAAG,IACHC,QAAQ,aACRC,aAAc,EACdC,QAAQ,OACRC,WAAW,aACXC,MAAO,CAAEC,IAAK,G,WAEd,SAACC,EAAAA,EAAQA,CACPC,MAAM,UACNC,SAAS,QACTJ,MAAO,CAAEK,UAAW,MAEtB,SAACC,EAAAA,EAAUA,CAACC,QAAQ,Q,SAAQ,+EAK7BtB,IACC,SAACQ,EAAAA,EAAGA,CACFC,GAAI,EACJC,EAAG,EACHC,QAAQ,aACRO,MAAM,qBACNN,aAAc,E,UAEd,SAACS,EAAAA,EAAUA,CAACC,QAAQ,Q,SAAStB,OAGjC,UAACuB,EAAAA,EAAWA,CACVlB,WAAS,EACTmB,OAAO,SACPC,SAAU3B,EACV4B,cAAY,mB,WAEZ,SAACC,EAAAA,EAAUA,CAACC,GAAG,oB,SAAoB,iBACnC,SAACC,EAAAA,EAAMA,CACLC,QAAQ,oBACRJ,cAAY,cACZK,MAAOtC,EACPuC,SAAWC,GAAMvC,EAAgBuC,EAAEC,OAAOH,OAC1CN,SAAU3B,E,SAETX,EAAMgD,IAAKC,IACV,MAAMC,EAAYC,OAAOC,QAAQH,EAAKI,QAAU,CAAC,GAC9CL,IAAI,EAAEM,EAAKC,KAAS,GAAGA,SAAWD,KAClCE,KAAK,MACR,OACE,UAACC,EAAAA,EAAQA,CAEPb,MAAOK,EAAKS,KACZnB,cAAa,eAAeU,EAAKS,O,UAEhCT,EAAKS,KAAK,IAAER,EAAY,IAAIA,KAAe,KAJvCD,EAAKS,cAUpB,SAACC,EAAAA,EAASA,CACRC,MAAM,sBACNC,YAAY,wCACZC,WAAS,EACTC,KAAM,EACN7C,WAAS,EACTmB,OAAO,SACPO,MAAOnC,EACPoC,SAAWC,GAAMpC,EAAWoC,EAAEC,OAAOH,OACrCoB,WAAW,yDACX1B,SAAU3B,QAGd,UAACsD,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CAACC,QAASpD,EAAauB,SAAU3B,E,SAAU,YAGlD,SAACuD,EAAAA,EAAMA,CACLC,QAvHoBC,UAC1B,GAAK9D,EAAL,CAEAM,GAAY,GACZE,EAAe,MACf,UACQb,EAAYoE,cAAc,CAC9BxE,iBACAC,YACAwE,SAAUhE,EACVG,QAASA,EAAQ8D,QAAU,GAC3BxE,cAGFK,EAASoE,KAAK,CACZC,QAAS,iCACTC,SAAU,UACVhD,QAAS,cAGXnB,EAAgB,IAChBG,EAAW,IACXd,GACF,CAAE,MAAO+E,GACP,MAAMC,EACJD,aAAeE,MAAQF,EAAIF,QAAU,yBACvCrE,EAASoE,KAAK,CACZC,QAAS,8BAA8BG,IACvCF,SAAU,QACVhD,QAAS,cAEXZ,EAAe8D,EACjB,CAAE,QACAhE,GAAY,EACd,CAjCyB,GAuHnBmB,MAAM,UACNI,QAAQ,YACRG,UAAWhC,GAAgBK,EAC3BmE,UACEnE,GACE,SAACoE,EAAAA,EAAgBA,CAACC,KAAM,GAAIjD,MAAM,iBAChCkD,E,SAGLtE,EAAW,gBAAkB,yB,kOC3JjC,MAAMuE,EAAmB,EAC9BxF,OACAC,UACAC,YACAuF,UACAC,qBAEA,MAAMnF,GAAcC,EAAAA,EAAAA,QAAOC,EAAAA,IAEpBmE,EAAUe,IAAe7E,EAAAA,EAAAA,UAAS,KAClCC,EAASC,IAAcF,EAAAA,EAAAA,UAAS,KAChC8E,EAAQC,IAAa/E,EAAAA,EAAAA,WAAS,IAC9BgF,EAAOC,IAAYjF,EAAAA,EAAAA,UAAS,KAEnCkF,EAAAA,EAAAA,WAAU,KACJhG,GAAQyF,IACVE,EAAYF,EAAQQ,KAAKrB,UAAY,IACrC5D,EAAWyE,EAAQQ,KAAKlF,SAAW,IACnCgF,EAAS,MAEV,CAAC/F,EAAMyF,IAEV,MAkCMpE,EAAc,KACbuE,IACHG,EAAS,IACT9F,MAIJ,OACE,UAACqB,EAAAA,EAAMA,CAACtB,KAAMA,EAAMC,QAASoB,EAAaE,SAAS,KAAKC,WAAS,E,WAC/D,SAACC,EAAAA,EAAWA,C,SAAC,kBACb,UAACC,EAAAA,EAAaA,C,UACXoE,IACC,SAACnE,EAAAA,EAAGA,CACFC,GAAI,EACJC,EAAG,EACHC,QAAQ,aACRO,MAAM,qBACNN,aAAc,E,UAEd,SAACS,EAAAA,EAAUA,CAACC,QAAQ,Q,SAASqD,OAIjC,UAACpD,EAAAA,EAAWA,CAAClB,WAAS,EAACmB,OAAO,S,WAC5B,SAACG,EAAAA,EAAUA,C,SAAC,UACZ,SAACE,EAAAA,EAAMA,CACLE,MAAO0B,EACPzB,SAAWC,GAAMuC,EAAYvC,EAAEC,OAAOH,OACtCN,SAAUgD,E,SAETF,EAAepC,IAAKC,IACnB,MAAMC,EAAYC,OAAOC,QAAQH,EAAKI,QAAU,CAAC,GAC9CL,IAAI,EAAEM,EAAKC,KAAS,GAAGA,SAAWD,KAClCE,KAAK,MACR,OACE,UAACC,EAAAA,EAAQA,CAAiBb,MAAOK,EAAKS,K,UACnCT,EAAKS,KAAK,IAAER,EAAY,IAAIA,KAAe,KAD/BD,EAAKS,cAQ5B,SAACC,EAAAA,EAASA,CACRC,MAAM,WACNC,YAAY,wCACZC,WAAS,EACTC,KAAM,EACN7C,WAAS,EACTmB,OAAO,SACPO,MAAOnC,EACPoC,SAAWC,GAAMpC,EAAWoC,EAAEC,OAAOH,OACrCN,SAAUgD,EACVtB,WAAW,+DAGf,UAACC,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CAACC,QAASpD,EAAauB,SAAUgD,E,SAAQ,YAGhD,SAACpB,EAAAA,EAAMA,CACLC,QA/FWC,UACjB,GAAKE,EAAL,CAKAmB,EAAS,IACTF,GAAU,GAEV,IACE,MAAMK,EAAQ,CACZD,KAAM,CACJrB,WACA7D,QAASA,EAAQ8D,eAIftE,EAAY4F,cAChBV,EAAQW,SAASC,KACjBZ,EAAQW,SAAShG,UAEjB8F,GAGFhG,IACAD,GACF,CAAE,MAAOgF,GACPqB,QAAQR,MAAM,kCAAmCb,GACjDc,EAASd,aAAeE,MAAQF,EAAIF,QAAU,yBAChD,CAAE,QACAc,GAAU,EACZ,CA3BA,MAFEE,EAAS,yBA8FL1D,MAAM,UACNI,QAAQ,YACRG,UAAWgC,GAAYgB,EACvBR,UACEQ,GAAS,SAACP,EAAAA,EAAgBA,CAACC,KAAM,GAAIjD,MAAM,iBAAekD,E,SAG3DK,EAAS,YAAc,uB,mdChHlC,SAASW,EACPC,EACAC,EACAC,GAEA,MACMC,EAAkBD,EAAS,GAAGA,KAAY,GAEhD,MAAO,CACLE,KAAM,eAAeJ,8BAJLE,EAAS,GAAGA,KAAUD,IAAWA,KAOjDI,OAAQ,2DAEMJ,0BACED,mFAKIG,qJAOpBG,OAAQ,iCAECL,mBACCD,4CAGUG,gGAMpBI,GAAI,qGASSN,wBACED,iIAIoBG,yOAavC,C,eChDO,MAAMK,EAAsB,EACjC5G,UAAW6G,M,IA0CTC,EAGAA,EA0ZaC,EAue4CC,EAAAA,EA56B3D,MAAM,OAAEF,IAAWG,EAAAA,EAAAA,MACbC,GAAa9G,EAAAA,EAAAA,QAAO+G,EAAAA,GACpBhH,GAAcC,EAAAA,EAAAA,QAAOC,EAAAA,GACrB+G,GAAchH,EAAAA,EAAAA,QAAOiH,EAAAA,gBACrB/G,GAAWF,EAAAA,EAAAA,QAAOG,EAAAA,cACjB+G,EAAaC,IAAkB7G,EAAAA,EAAAA,UAAsB,IAAI8G,MACzDC,GAASC,KAAchH,EAAAA,EAAAA,UAAS,IAChCiH,GAAQC,KAAalH,EAAAA,EAAAA,UAAiB,KACtCT,GAAW4H,KAAgBnH,EAAAA,EAAAA,UAAiB,KAC5CoH,GAAmBC,KAAwBrH,EAAAA,EAAAA,WAAS,IACpDsH,GAAgBC,KAAqBvH,EAAAA,EAAAA,WAAS,IAC9CwH,GAAeC,KAAoBzH,EAAAA,EAAAA,UAAwB,OAC3D0H,GAAYC,KAAiB3H,EAAAA,EAAAA,UAG1B,OACH4H,GAAaC,KAAkB7H,EAAAA,EAAAA,UAAwB,OACvD8H,GAAUC,KAAe/H,EAAAA,EAAAA,UAAwB,OACjDgI,GAAuBC,KAA4BjI,EAAAA,EAAAA,UAExD,IAAI8G,MACCR,GAAmB4B,KAAwBlI,EAAAA,EAAAA,UAG/C,CAAEd,MAAM,EAAOyF,QAAS,QACpBwD,GAAcC,KAAmBpI,EAAAA,EAAAA,UACtC,IAAIqI,MAECC,GAAeC,KAAoBvI,EAAAA,EAAAA,UAAsB,IAAI8G,MAC7D0B,GAAiBC,KAAsBzI,EAAAA,EAAAA,UAC5C,IAAI8G,MAEC4B,GAAqBC,KAA0B3I,EAAAA,EAAAA,WAAS,IACxD4I,GAAkBC,KAAuB7I,EAAAA,EAAAA,UAGtC,MAGJX,IACuB,QAA3B+G,EAAAA,EAAOd,SAASwD,mBAAhB1C,IAAAA,OAAAA,EAAAA,EAA8B,4BAC9BA,EAAOd,SAASC,KACZjG,IACuB,QAA3B8G,EAAAA,EAAOd,SAASwD,mBAAhB1C,IAAAA,OAAAA,EAAAA,EAA8B,2BAC9BD,GACA,WAEF4C,EAAAA,EAAAA,GAASnF,UACP,MAAMoF,QAAiBtC,EAAYuC,uBAC7BC,QAAgBxC,EAAYyC,iBAClCjC,GAAU8B,EAASI,eAGnB,IAAIC,EAAQH,EAAQG,OAAS,GAE7B,IAAKA,GAASL,EAASI,cAAe,C,IAE9BE,EAAAA,EADL,MAAMA,QAAmB9C,EAAW+C,eAAeP,EAASI,gBACvDE,SAAgB,QAAhBA,EAAAA,EAAYnE,YAAZmE,IAAAA,GAAyB,QAAzBA,EAAAA,EAAkBJ,eAAlBI,IAAAA,OAAAA,EAAAA,EAA2BD,SAC7BA,EAAQC,EAAWnE,KAAK+D,QAAQG,MAEtC,CAEAlC,GAAakC,IACZ,CAAC3C,IAEJ,MACEtE,MAAOoH,GACPC,QAASC,GACT1E,MAAO2E,KACLZ,EAAAA,EAAAA,GAASnF,iBACQnE,EAAYmK,uBAAuBtK,KAEzCuK,OAAS,IAAIC,OACvBC,GACCA,EAAE5E,KAAK6E,cAAczE,OAASlG,IAC9B0K,EAAEzE,SAAShG,YAAcA,IAE5B,CAACD,GAAgBC,GAAWyH,GAAStH,KAGtC2C,MAAOiE,GACPoD,QAASQ,GACTjF,MAAOkF,KACLnB,EAAAA,EAAAA,GAASnF,U,IAGKuG,EAMhB,OAN0B,QAAVA,SAFG1K,EAAY2K,kBAEVP,aAALM,IAAAA,OAAAA,EAAAA,EAAYE,KACzBtJ,GACCA,EAAEuE,SAAShG,YAAcA,IACzByB,EAAEuE,SAASC,OAASlG,KAIvB,CAACC,GAAWD,GAAgBI,IAGzB6K,GAAcjE,GAChB,cAAcA,GAAWf,SAAShG,aAAa+G,GAAWf,SAASC,YACnEd,GAGF8F,QAASC,GACTf,QAASgB,GACTzF,MAAO0F,KACLC,EAAAA,EAAAA,GAAsBC,EAAAA,GAAgCN,KAGxDC,QAASM,GACTpB,QAASqB,GACT9F,MAAO+F,KACLJ,EAAAA,EAAAA,GAAsBK,EAAAA,KAGxBT,QAASU,GACTxB,QAASyB,GACTlG,MAAOmG,KACLR,EAAAA,EAAAA,GAAsBS,EAAAA,KAGxBb,QAASc,GACT5B,QAAS6B,GACTtG,MAAOuG,KACLZ,EAAAA,EAAAA,GAAsBa,EAAAA,IAqGpBC,GAAkB,KACtB9D,GAAc,MACdE,GAAe,OAGX6D,GAAiB,KAChB9D,KArBLH,GAsBkBG,IArBlBL,IAAkB,GAsBlBkE,OAGIE,GAAwB,KAC5B,IAAK/D,GAAa,OAClB,MAAMjD,EAAUiD,GAChB6D,KACAvD,GAAqB,CAAEhJ,MAAM,EAAMyF,aAa/BiH,GAAoBC,IACxBhF,EAAgBiF,IACd,MAAMC,EAAS,IAAIjF,IAAIgF,GAMvB,OALIC,EAAOC,IAAIH,GACbE,EAAOE,OAAOJ,GAEdE,EAAOG,IAAIL,GAENE,KAILI,IAAoBC,EAAAA,EAAAA,SACxB,IAAM,CACJ,CACEC,OAASlC,I,IAGFxF,EADL,MAAMA,EAAUwF,EAAKmC,QACrB,KAAK3H,SAAiB,QAAjBA,EAAAA,EAASW,gBAATX,IAAAA,OAAAA,EAAAA,EAAmBY,MACtB,OAAO,SAAC1E,EAAAA,EAAGA,CAAAA,GAIb,MAAMiC,EAAM,GAAG6B,EAAQW,SAAShG,aAAaqF,EAAQW,SAASC,OACxDgH,EAAcpE,GAAaqE,IAAI1J,GACrC,OACE,SAAC2J,GAAAA,CACC9H,QAASA,EACT+H,QAASrN,GACTsN,eAAgBJ,OAM1B,CAAClN,GAAgB8I,KAIbsE,GAAqB,EACzB9H,UACA+H,QAASE,EACTD,qB,IAOiBhI,EAMGA,EAAAA,EAPpB,MAAOkI,EAAkBC,IAAuB9M,EAAAA,EAAAA,UAAS,GACnD+M,GAAyB,QAAdpI,EAAAA,EAAQqI,cAARrI,IAAAA,OAAAA,EAAAA,EAAgBsI,cAAe,GAAGL,qBAG7CM,EAAgBP,GAAkB,iBAIlCQ,ED5WH,SACLC,EACAL,EACApH,GAEA,MAAMD,EAAU,WAAWqH,oBAE3B,OAAKK,EAIDA,EAAYC,oBAEP5H,EAAoCC,EAASC,EADrCyH,EAAaC,oBAAqBzH,QAAU,IAIzDwH,EAAYE,aAwFlB,SACE5H,EACAC,EACA4H,EACA3H,GAIA,MAAO,CACLE,KAAM,eAAeJ,eACjB6H,MAJc3H,EAAS,GAAGA,IAASD,IAAWA,KAMlDI,OAAQ,2DAEMJ,0BACED,kEAKb6H,QAAiB3H,qJAOpBI,OAAQ,iCAECL,mBACCD,2BAGP6H,QAAiB3H,gGAMpBK,GAAI,qGASSN,wBACED,gHAIG6H,QAAiB3H,yOAavC,CAvJa4H,CAA6B9H,EAASC,EAF5ByH,EAAaE,aAAc/H,KAC7B6H,EAAaE,aAAc1H,QAAU,IAKpDwH,EAAYK,YAqJlB,SACE/H,EACAC,EACA+H,GAIA,MAAO,CACL5H,KAAM,gBAHgBJ,KAAWgI,KAAa/H,KAK9CI,OAAQ,2DAEMJ,0BACED,KAAWgI,wLAS3B1H,OAAQ,iCAECL,mBACCD,0BAGPgI,6FAMHzH,GAAI,qGASSN,wBACED,KAAWgI,8TAgB9B,CA/MWC,CAA4BjI,EAASC,EAD1ByH,EAAaK,YAAalI,MAI1C6H,EAAYQ,OA8MlB,SACElI,EACAC,EACAkI,GAEA,MAAO,CACL/H,KAAM,eAAeJ,qBACXmI,KAAclI,KAExBI,OAAQ,2DAEMJ,0BACED,4EAKHmI,sJAOb7H,OAAQ,iCAECL,mBACCD,2BAGPmI,+FAMH5H,GAAI,qGASSN,wBACED,6IAKDmI,gQAelB,CA9QWC,CAAuBpI,EAASC,EADpByH,EAAaQ,OAAQrI,MAInCE,EAAoCC,EAASC,EAAQ,UAzBnDF,EAAoCC,EAASC,EAAQ,SA0BhE,CC0UqBoI,CADiB,QAAdpJ,EAAAA,EAAQqI,cAARrI,IAAAA,GAA0B,QAA1BA,EAAAA,EAAgBqJ,kBAAhBrJ,IAAAA,OAAAA,EAAAA,EAA4ByI,YACOL,EAAUG,GAEjE,OACE,UAACrM,EAAAA,EAAGA,CACFE,EAAG,EACHC,QAAQ,qBACR2C,QAAUrB,GAAMA,EAAE2L,kB,UAEjBtJ,EAAQQ,KAAKlF,UACZ,UAACY,EAAAA,EAAGA,CAACC,GAAI,E,WACP,SAACY,EAAAA,EAAUA,CAACC,QAAQ,KAAKuM,cAAY,E,SAAC,cAGtC,SAACrN,EAAAA,EAAGA,CACFE,EAAG,EACHC,QAAQ,mBACRC,aAAc,EACdkN,OAAO,gC,UAEP,SAACzM,EAAAA,EAAUA,CACTC,QAAQ,QACRP,MAAO,CACLgN,WAAY,WACZC,UAAW,aACXC,aAAc,c,SAGf3J,EAAQQ,KAAKlF,gBAKtB,SAACyB,EAAAA,EAAUA,CAACC,QAAQ,KAAKuM,cAAY,E,SAAC,oBAGtC,UAACxM,EAAAA,EAAUA,CAACC,QAAQ,QAAQ4M,WAAS,E,UAAC,oDACc,IACjD5J,EAAQQ,KAAKrB,SAAS,iBAEzB,SAACjD,EAAAA,EAAGA,CAAC8C,QAAUrB,GAAMA,EAAE2L,kB,UACrB,UAACO,EAAAA,EAAIA,CACHpM,MAAOyK,EACPxK,SAAU,CAACC,EAAGmM,KACZnM,EAAE2L,kBACFnB,EAAoB2B,IAEtBC,eAAe,U,WAEf,SAACC,EAAAA,EAAGA,CAACvL,MAAM,OAAOO,QAAUrB,GAAMA,EAAE2L,qBACpC,SAACU,EAAAA,EAAGA,CAACvL,MAAM,UAAUO,QAAUrB,GAAMA,EAAE2L,qBACvC,SAACU,EAAAA,EAAGA,CAACvL,MAAM,SAASO,QAAUrB,GAAMA,EAAE2L,qBACtC,SAACU,EAAAA,EAAGA,CAACvL,MAAM,KAAKO,QAAUrB,GAAMA,EAAE2L,0BAGtC,UAACpN,EAAAA,EAAGA,CAAC+N,GAAI,E,UACe,IAArB/B,IACC,SAACgC,EAAAA,EAAWA,CACVC,KAAM3B,EAASrH,KACfiJ,SAAS,OACTC,oBAAkB,IAGA,IAArBnC,IACC,SAACgC,EAAAA,EAAWA,CACVC,KAAM3B,EAASpH,OACfgJ,SAAS,aACTC,oBAAkB,IAGA,IAArBnC,IACC,SAACgC,EAAAA,EAAWA,CACVC,KAAM3B,EAASnH,OACf+I,SAAS,SACTC,oBAAkB,IAGA,IAArBnC,IACC,SAACgC,EAAAA,EAAWA,CACVC,KAAM3B,EAASlH,GACf8I,SAAS,KACTC,oBAAkB,WAexBhK,GAAQ2E,IAAiBO,GACzB+E,GACJvE,IACAK,IACAI,IACAI,GAEF,GAbE7B,IACAO,IACAQ,IACAK,IACAI,IACAI,GASA,OACE,SAACzK,EAAAA,EAAGA,CAACE,EAAG,E,SACL,IAAImO,MAAM,IAAI1M,IAAI,CAAC2M,EAAGC,KACrB,SAACvO,EAAAA,EAAGA,CAASE,EAAG,E,UACd,SAACsO,EAAAA,EAAQA,CAAC1N,QAAQ,OAAO2N,MAAM,UADvBF,MAQlB,GAAIpK,GACF,OAAO,SAACuK,EAAAA,EAAkBA,CAACvK,MAAOA,KAGpC,GAAIiK,GAAiB,CACnB,MAAMO,EAAmB9E,GACrB,yBACAK,GACE,6BACAI,GACE,6BACAI,GACE,6BACA,UACV,OACE,UAAC1K,EAAAA,EAAGA,CAACE,EAAG,E,WACN,UAACW,EAAAA,EAAUA,CAACH,MAAM,Q,UAAQ,gCACM0N,GAAgBhL,YAEhD,UAACvC,EAAAA,EAAUA,CAACC,QAAQ,QAAQJ,MAAM,gB,UAAgB,eACnCiO,MAEf,SAAC9N,EAAAA,EAAUA,CAACC,QAAQ,QAAQJ,MAAM,gB,SAAgB,qDAKxD,CAEA,MAAMkO,IAAejG,IAAY,IAAiBM,OAC/CC,IAAO/B,GAAsBgE,IAAIjC,EAAEzE,SAASC,OAEzC/F,IAAS6G,UAAkB,QAAlBA,EAAAA,GAAY2G,cAAZ3G,IAAAA,OAAAA,EAAAA,EAAoBqJ,kBAAmB,GAEhDC,GAAkBF,GAAW3F,OAChCC,I,IAAOA,E,QAAQ,QAARA,EAAAA,EAAEiD,cAAFjD,IAAAA,OAAAA,EAAAA,EAAU6F,QAA4B,YAAnB7F,EAAEiD,OAAO4C,QAEhCC,GAAmBJ,GAAW3F,OACjCC,I,IAAMA,E,MAAoB,cAAZ,QAARA,EAAAA,EAAEiD,cAAFjD,IAAAA,OAAAA,EAAAA,EAAU6F,SAEbE,GAAmBL,GAAW3F,OACjCC,I,IAAMA,E,MAAoB,cAAZ,QAARA,EAAAA,EAAEiD,cAAFjD,IAAAA,OAAAA,EAAAA,EAAU6F,SAGbG,GAAyC,CAC7C,CACEC,MAAO,OACPC,MAAO,gBACP5D,OAAS6D,IACP,SAACC,EAAAA,EAAIA,CAAC/M,MAAO8M,EAAI/K,KAAKrB,SAAUvC,MAAM,UAAUiD,KAAK,WAGzD,CACEwL,MAAO,WACPC,MAAO,oBACP5D,OAAS6D,I,IAEJA,E,OADH,SAACxO,EAAAA,EAAUA,CAACC,QAAQ,Q,UACP,QAAVuO,EAAAA,EAAIlD,cAAJkD,IAAAA,OAAAA,EAAAA,EAAYE,YACT,IAAIC,KAAKH,EAAIlD,OAAOoD,YAAYE,qBAChC,QAIV,CACEN,MAAO,UACPC,MAAO,mBACPM,YAAY,EACZC,WAAW,EACXnE,OAAS6D,I,IAKcA,EAAAA,EACCA,EALtB,MAAMpN,EAAM,GAAGoN,EAAI5K,SAAShG,aAAa4Q,EAAI5K,SAASC,OAChDkL,EAAY7J,EAAYoF,IAAIkE,EAAI5K,SAASC,MACzCmL,EAAYpI,GAAc0D,IAAIlJ,GAC9B6N,EAAcxI,GAAaqE,IAAI1J,GAC/B8N,EAAyB,QAAVV,EAAAA,EAAIlD,cAAJkD,IAAAA,GAAqB,QAArBA,EAAAA,EAAYW,iBAAZX,IAAAA,OAAAA,EAAAA,EAAuB3K,KACtCuL,GAA8C,KAApB,QAAVZ,EAAAA,EAAIlD,cAAJkD,IAAAA,OAAAA,EAAAA,EAAYY,eAC5BC,EAAgBvI,GAAgBwD,IAAIlJ,KAASgO,EAEnD,OAAKF,EASDG,IAAkBJ,GAElB,SAACK,EAAAA,GAAOA,CAAChB,MAAM,qE,UACb,UAACnP,EAAAA,EAAGA,CAACK,QAAQ,OAAOC,WAAW,S,WAC7B,SAACO,EAAAA,EAAUA,CACTC,QAAQ,QACRJ,MAAM,gBACNH,MAAO,CAAE6P,WAAY,YAAaC,YAAa,G,SAChD,oBAGD,SAACC,EAAAA,EAAiBA,CAAC3P,SAAS,QAAQD,MAAM,mBAiChD,UAACV,EAAAA,EAAGA,CAACK,QAAQ,OAAOC,WAAW,S,WAC7B,SAACO,EAAAA,EAAUA,CACTC,QAAQ,QACRP,MAAO,CACL6P,WAAY,YACZC,YAAa,G,SAGdR,EACG,aACAD,GAAaE,EACXA,EACA,qBAEPF,GAAaE,IACZ,SAACK,EAAAA,GAAOA,CAAChB,MAAM,oB,UACb,SAACoB,EAAAA,EAAUA,CAAC5M,KAAK,QAAQb,QA5BdC,UACb+M,UACIU,UAAUC,UAAUC,UAAUZ,GACpC/Q,EAASoE,KAAK,CACZC,QAAS,8BACTC,SAAU,UACVhD,QAAS,gB,UAuBL,SAACsQ,EAAAA,EAAYA,CAAChQ,SAAS,eAI7B,SAACwP,EAAAA,GAAOA,CACNhB,MACES,EAAY,eAAiB,iC,UAG/B,SAACgB,OAAAA,C,UACC,SAACL,EAAAA,EAAUA,CACT5M,KAAK,QACLb,QAxDgB,KACpB8M,GAvUa,EAACiB,EAA0BC,KAClD,MAAM7O,EAAM,GAAG4O,KAAoBC,IACnCvJ,GAAiB0D,IACf,MAAM8F,EAAO,IAAIvJ,IAAIyD,GAErB,OADA8F,EAAK3F,OAAOnJ,GACL8O,KAoUDC,CAAiB3B,EAAI5K,SAAShG,UAAW4Q,EAAI5K,SAASC,MACtDqG,GAAiBsE,EAAI5K,SAASC,OACpBwL,IAEVlI,GAAoB,CAClBvJ,UAAW4Q,EAAI5K,SAAShG,UACxBiG,KAAM2K,EAAI5K,SAASC,OAErBoD,IAAuB,KA8CjB7G,SAAU4O,GAAcK,IAAkBJ,E,SAEzCF,GAAY,SAACU,EAAAA,EAAiBA,CAAAA,IAAM,SAACW,EAAAA,EAAcA,CAAAA,aAnF1D,SAACpQ,EAAAA,EAAUA,CAACC,QAAQ,QAAQJ,MAAM,gB,SAAgB,yBA2F1D,CACEyO,MAAO,GACPC,MAAO,UACPM,YAAY,EACZC,WAAW,EACXnE,OAAS6D,IAEP,GADmBpI,KAAaoI,EAAI5K,SAASC,KAE3C,OAAO,SAAChB,EAAAA,EAAgBA,CAACC,KAAM,KAEjC,MAAMuN,EAAU7B,EAAI/K,KAAK6M,YAAY/K,OAOrC,OANkBgL,EAAAA,EAAAA,GAChBF,EACA9K,GACA4D,GACAI,KAIA,SAACmG,EAAAA,EAAUA,CACT5M,KAAK,QACLb,QAAUrB,IACRA,EAAE2L,kBACF,MAAMiE,EAAO5P,EAAE6P,cAAcC,wBAC7BzK,GAAc,CAAE0K,IAAKH,EAAKI,OAAQC,KAAML,EAAKK,OAC7C1K,GAAeqI,IAEjBF,MAAM,UACNwC,gBAAe9K,GAAa,oBAAiBjD,EAC7CgO,gBAAc,O,UAEd,SAACC,EAAAA,EAAYA,CAAAA,KAdM,QAqBvBC,GAAwC,CAC5C,CACE3C,MAAO,SACPC,MAAO,eACP5D,OAAS6D,I,IACOA,EAAd,MAAMN,GAAkB,QAAVM,EAAAA,EAAIlD,cAAJkD,IAAAA,OAAAA,EAAAA,EAAYN,QAAS,UAC7BgD,EAAsB,YAAVhD,EAClB,OACE,SAACO,EAAAA,EAAIA,CACH/M,MAAOwM,EACPpL,KAAK,QACLqO,KAAMD,GAAY,SAACE,EAAAA,EAAkBA,CAAAA,IAAM,SAACC,EAAAA,EAAUA,CAAAA,GACtDxR,MAAOqR,EAAY,UAAY,gBAKvC,CACE5C,MAAO,OACPC,MAAO,gBACP5D,OAAS6D,IACP,SAACC,EAAAA,EAAIA,CAAC/M,MAAO8M,EAAI/K,KAAKrB,SAAUvC,MAAM,UAAUiD,KAAK,WAGzD,CACEwL,MAAO,WACPC,MAAO,eACP5D,OAAS6D,GACFA,EAAI/K,KAAKlF,SAIZ,SAAC+Q,EAAAA,GAAOA,CAAChB,MAAOE,EAAI/K,KAAKlF,QAAS+S,UAAU,M,UAC1C,SAACtR,EAAAA,EAAUA,CACTC,QAAQ,QACRP,MAAO,CACLX,SAAU,QACVwS,SAAU,SACVC,aAAc,WACd9E,WAAY,U,SAGb8B,EAAI/K,KAAKlF,aAbP,SAACyB,EAAAA,EAAUA,CAACC,QAAQ,Q,SAAQ,OAmBzC,CACEqO,MAAO,YACPC,MAAO,6BACP5D,OAAS6D,IACP,SAACxO,EAAAA,EAAUA,CAACC,QAAQ,Q,SACjBuO,EAAI5K,SAAS6N,kBACV,IAAI9C,KAAKH,EAAI5K,SAAS6N,mBAAmB7C,qBACzC,OAIV,CACEN,MAAO,WACPC,MAAO,oBACP5D,OAAS6D,I,IACFA,EAAL,OAAe,QAAVA,EAAAA,EAAIlD,cAAJkD,IAAAA,OAAAA,EAAAA,EAAYE,aAGf,SAAC1O,EAAAA,EAAUA,CAACC,QAAQ,Q,SACjB,IAAI0O,KAAKH,EAAIlD,OAAOoD,YAAYE,wBAH5B,SAAC5O,EAAAA,EAAUA,CAACC,QAAQ,Q,SAAQ,QAQzC,CACEqO,MAAO,GACPC,MAAO,UACPM,YAAY,EACZC,WAAW,EACXnE,OAAS6D,I,IAKYA,EAHnB,GADmBpI,KAAaoI,EAAI5K,SAASC,KAE3C,OAAO,SAAChB,EAAAA,EAAgBA,CAACC,KAAM,KAEjC,MAAMoO,IAAuB,QAAV1C,EAAAA,EAAIlD,cAAJkD,IAAAA,OAAAA,EAAAA,EAAYN,QAA8B,YAArBM,EAAIlD,OAAO4C,MAC7CmC,EAAU7B,EAAI/K,KAAK6M,YAAY/K,OAC/BmM,GAAYnB,EAAAA,EAAAA,GAChBF,EACA9K,GACA4D,GACAI,IAGF,OAAK2H,IADWvH,IAAoB0G,IAAY9K,IAChBmM,IAE9B,SAAChC,EAAAA,EAAUA,CACT5M,KAAK,QACLb,QAAUrB,IACRA,EAAE2L,kBACF,MAAMiE,EAAO5P,EAAE6P,cAAcC,wBAC7BzK,GAAc,CAAE0K,IAAKH,EAAKI,OAAQC,KAAML,EAAKK,OAC7C1K,GAAeqI,IAEjBF,MAAM,UACNwC,gBAAe9K,GAAa,oBAAiBjD,EAC7CgO,gBAAc,O,UAEd,SAACC,EAAAA,EAAYA,CAAAA,KAdkC,QAsBnDW,GAAwBV,GAAe7I,OAC1CwJ,GAAsB,aAAdA,EAAItD,OAAsC,WAAdsD,EAAItD,OAG3C,OACE,UAACnP,EAAAA,EAAGA,CAACE,EAAG,E,WACN,UAACwS,EAAAA,EAAIA,CAACC,WAAS,EAACC,QAAS,EAAGC,UAAU,S,UACnClJ,KACC,SAAC+I,EAAAA,EAAIA,CAACI,MAAI,E,UACR,UAAC9S,EAAAA,EAAGA,CACFK,QAAQ,OACR0S,cAAc,SACdzS,WAAW,WACXL,GAAI,E,WAEJ,SAAC4C,EAAAA,EAAMA,CACL/B,QAAQ,YACRJ,MAAM,UACN+C,WAAW,SAACuP,EAAAA,EAAOA,CAAAA,GACnBlQ,QAAS,IAAM0D,IAAqB,GACpCvF,SAA2B,IAAjBtC,GAAMsU,SAAiBvU,GACjCwC,cAAY,4BACZgS,mBAAkBvU,GAAMsU,O,SACzB,wBAGCvU,KACA,SAACmC,EAAAA,EAAUA,CACTC,QAAQ,UACRJ,MAAM,gBACNH,MAAO,CAAEK,UAAW,GACpBM,cAAY,mB,SACZ,gCAIc,IAAjBvC,GAAMsU,SACL,SAACpS,EAAAA,EAAUA,CACTC,QAAQ,UACRJ,MAAM,gBACNH,MAAO,CAAEK,UAAW,GACpBM,cAAY,mB,SAEVsE,GAEE,M,IAEEA,EAAAA,EAIAA,EAAAA,EALF,MAAM2N,EACa,QAAjB3N,EAAAA,GAAW2G,cAAX3G,IAAAA,GAA6B,QAA7BA,EAAAA,EAAmB4N,kBAAnB5N,IAAAA,OAAAA,EAAAA,EAA+BgE,KAC5B6J,GAAsB,UAAXA,EAAEC,MAEZC,EACa,QAAjB/N,EAAAA,GAAW2G,cAAX3G,IAAAA,GAA6B,QAA7BA,EAAAA,EAAmB4N,kBAAnB5N,IAAAA,OAAAA,EAAAA,EAA+BgE,KAC5B6J,GAAsB,yBAAXA,EAAEC,MAGlB,MAA+B,UAA3BH,aAAAA,EAAAA,EAAgBhH,QACX,yBAAwBgH,aAAAA,EAAAA,EAAgB/P,UAAW,YAE9B,UAA1BmQ,aAAAA,EAAAA,EAAepH,QACV,yBAAwBoH,aAAAA,EAAAA,EAAenQ,UAAW,wBAEpD,oBACR,EAjBC,GADA,+BAwBc,IAA3B0L,GAAgBmE,QACa,IAA5BhE,GAAiBgE,QACW,IAA5BjE,GAAiBiE,SACf,SAACP,EAAAA,EAAIA,CAACI,MAAI,E,UACR,SAAC9S,EAAAA,EAAGA,CAACE,EAAG,EAAGsT,UAAU,S,UACnB,SAAC3S,EAAAA,EAAUA,CAACC,QAAQ,QAAQJ,MAAM,gB,SAAgB,wDAMzDoO,GAAgBmE,OAAS,IACxB,SAACP,EAAAA,EAAIA,CAACI,MAAI,E,UACR,SAACW,EAAAA,EAAKA,CACJtE,MAAM,mBACNuE,QAAS,CACPC,OAAQ7E,GAAgBmE,OAAS,EACjCW,SAAU,GACVC,QAAQ,EACRlE,WAAW,EACXmE,iBAAkB,IAClBC,SAAS,EACTC,qBAAqB,GAEvBC,QAASzB,GACTlJ,KAAMwF,OAIXG,GAAiBgE,OAAS,IACzB,SAACP,EAAAA,EAAIA,CAACI,MAAI,E,UACR,SAACW,EAAAA,EAAKA,CACJtE,MAAM,oBACNuE,QAAS,CACPC,OAAQ1E,GAAiBgE,OAAS,EAClCW,SAAU,GACVC,QAAQ,EACRlE,WAAW,EACXmE,iBAAkB,IAClBC,SAAS,EACTC,qBAAqB,GAEvBC,QAASnC,GACTxI,KAAM2F,OAIXD,GAAiBiE,OAAS,IACzB,SAACP,EAAAA,EAAIA,CAACI,MAAI,E,UACR,SAACW,EAAAA,EAAKA,CAEJtE,MAAM,WACNuE,QAAS,CACPC,OAAQ3E,GAAiBiE,OAAS,EAClCW,SAAU,GACVC,QAAQ,EACRlE,WAAW,EACXmE,iBAAkB,IAClBC,SAAS,EACTC,qBAAqB,GAEvBC,QAAS/E,GACT5F,KAAM0F,GACNkF,YAAa5I,IAbT,wBAmBZ,SAAClN,EAAAA,EAAmBA,CAClBC,KAAMkI,GACNjI,QAAS,IAAMkI,IAAqB,GACpCjI,UAAW,KACTiI,IAAqB,GACrBL,GAAY+C,GAAMA,EAAI,IAExB1K,eAAgBA,GAChBC,UAAWA,GACXC,UAAWA,GACXC,MAAOA,MAGT,SAACwV,EAAAA,EAAIA,CACH/S,GAAG,eACH/C,KAAM+V,QAAQvN,IACdvI,QAASsM,GACTyJ,gBAAgB,iBAChBC,eAAgBzN,IAAc,CAAE2K,IAAK,EAAGE,KAAM,G,SAE7C3K,IACC,M,IAEKA,EADH,MAAMgL,IACe,QAAlBhL,EAAAA,GAAYoF,cAAZpF,IAAAA,OAAAA,EAAAA,EAAoBgI,QACQ,YAA7BhI,GAAYoF,OAAO4C,MACfmC,EAAUnK,GAAYzC,KAAK6M,YAAY/K,OAGvC4C,EAAQ,GAad,OAfgBwB,IAAoB0G,IAAY9K,IAAU2L,GAIxD/I,EAAMuL,MACJ,SAACnS,EAAAA,EAAQA,CAAYU,QAAS+H,G,SAAgB,QAAhC,SAKlB7B,EAAMuL,MACJ,SAACnS,EAAAA,EAAQA,CAAcU,QAASgI,G,SAAuB,UAAzC,WAIT9B,CACR,EArBD,KAwBHrC,KACC,SAAC9C,EAAAA,EAAgBA,CACfxF,KAAMoI,GACNnI,QAAS,KACPoI,IAAkB,GAClBE,GAAiB,OAEnBrI,UA/sBkB,KACxB4H,GAAY+C,GAAMA,EAAI,GACtBxC,IAAkB,GAClB3H,EAASoE,KAAK,CACZC,QAAS,kBACTC,SAAU,UACVhD,QAAS,cAEXuG,GAAiB,OAwsBX9C,QAAS6C,GACT5C,eAAgBpF,MAIpB,SAAC6V,EAAAA,EAAmBA,CAClBnW,KAAMoH,GAAkBpH,KACxB8Q,MAAM,iBACNsF,YAAa,wCAAqF,cAApB,QAAzBhP,EAAAA,GAAkB3B,eAAlB2B,IAAAA,GAAiC,QAAjCA,EAAAA,EAA2B0G,cAA3B1G,IAAAA,OAAAA,EAAAA,EAAmCsJ,OAAuB,UAAY,aAC3H9H,SAAuB,OAAbA,GACVyN,UA7rBsB3R,UACrB0C,GAAkB3B,eAtHGf,OAAO2B,IAEjC0C,GAA0B6D,GAAS,IAAIhF,IAAIgF,GAAMI,IAAI3G,IACrDwC,GAAYxC,GACZ,UACQ9F,EAAY+V,cAAclW,GAAWiG,GAC3C3F,EAASoE,KAAK,CACZC,QAAS,+BACTC,SAAU,UACVhD,QAAS,cAEX8F,GAAY+C,GAAMA,EAAI,EACxB,CAAE,MAAO5F,GACP,MAAMC,EACJD,aAAeE,MAAQF,EAAIF,QAAU,yBAEvCgE,GAA0B6D,IACxB,MAAM8F,EAAO,IAAI9K,IAAIgF,GAErB,OADA8F,EAAK3F,OAAO1G,GACLqM,IAEThS,EAASoE,KAAK,CACZC,QAAS,6BAA6BG,IACtCF,SAAU,QACVhD,QAAS,aAEb,CAAE,QACA6G,GAAY,KACd,GA2FM0N,CAAoBnP,GAAkB3B,QAAQW,SAASC,MAC7D2C,GAAqB,CAAEhJ,MAAM,EAAOyF,QAAS,SA2rBzC+Q,SAxrBqB,KACzBxN,GAAqB,CAAEhJ,MAAM,EAAOyF,QAAS,WA0rB3C,UAACnE,EAAAA,EAAMA,CACLtB,KAAMwJ,GACNvJ,QAAS,KACPwJ,IAAuB,GACvBE,GAAoB,OAEtBpI,SAAS,K,WAET,SAACE,EAAAA,EAAWA,C,UACV,UAACE,EAAAA,EAAGA,CAACK,QAAQ,OAAOC,WAAW,S,WAC7B,SAACwU,EAAAA,EAAWA,CAACpU,MAAM,UAAUH,MAAO,CAAE8P,YAAa,KAAO,qBAI9D,UAACtQ,EAAAA,EAAaA,C,WACZ,UAACc,EAAAA,EAAUA,CAACC,QAAQ,QAAQ4M,WAAS,E,UAAC,oCACJ,SAACqH,SAAAA,C,SAAO,SAAa,wEAGvD,SAAClU,EAAAA,EAAUA,CAACC,QAAQ,QAAQJ,MAAM,gB,SAAgB,0EAIpD,UAACkC,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CACLC,QAAS,KACPgF,IAAuB,GACvBE,GAAoB,O,SAEvB,YAGD,SAACnF,EAAAA,EAAMA,CACL/B,QAAQ,YACRJ,MAAM,UACNoC,QAAS,KACHiF,KA3zBchF,OAC5B8N,EACAC,KAEA,MAAM7O,EAAM,GAAG4O,KAAoBC,IACnC,IAAIrJ,GAAc0D,IAAIlJ,GAAtB,CAIAyF,GAAkBuD,GAAS,IAAIhF,IAAIgF,GAAMI,IAAIpJ,IAC7C,IACE,MAAMqH,QAAa1K,EAAYoW,gBAAgBnE,EAAkBC,GACjEvJ,GAAiB0D,GAAS,IAAIzD,IAAIyD,GAAMgK,IAAIhT,EAAKqH,EAAKxE,SAEtD8C,GAAoBqD,GAAS,IAAIhF,IAAIgF,GAAMI,IAAIpJ,GACjD,CAAE,MAAOqB,GACP,MAAMC,EACJD,aAAeE,MAAQF,EAAIF,QAAU,yBACnCG,EAAa2R,SAAS,QAAU3R,EAAa2R,SAAS,wBAExDtN,GAAoBqD,GAAS,IAAIhF,IAAIgF,GAAMI,IAAIpJ,IAC/ClD,EAASoE,KAAK,CACZC,QACE,sEACFC,SAAU,UACVhD,QAAS,eAGXtB,EAASoE,KAAK,CACZC,QAAS,4BAA4BG,IACrCF,SAAU,QACVhD,QAAS,aAGf,CAAE,QACAqH,GAAkBuD,IAChB,MAAM8F,EAAO,IAAI9K,IAAIgF,GAErB,OADA8F,EAAK3F,OAAOnJ,GACL8O,GAEX,CAjCA,GAqzBYoE,CACEpN,GAAiBtJ,UACjBsJ,GAAiBrD,MAEnBqG,GAAiBhD,GAAiBrD,OAEpCoD,IAAuB,GACvBE,GAAoB,O,SAEvB,4B,sLCtgCJ,MAAMwM,EAAsB,EACjCnW,OACA8Q,QACAsF,cACAW,cACA/R,WAAW,SACX4D,YAAW,EACXyN,YACAG,eAEA,MAAOQ,EAAYC,IAAiBnW,EAAAA,EAAAA,UAAS,KAG7CkF,EAAAA,EAAAA,WAAU,KACHhG,GACHiX,EAAc,KAEf,CAACjX,IAEJ,MAAMkX,EAAwC,SAAblS,GAAuB+R,EAClDI,GAAaD,GAA2BF,IAAeD,EAQ7D,OACE,UAACzV,EAAAA,EAAMA,CACLtB,KAAMA,EACNC,QAAS2I,OAAWrD,EAAYiR,EAChCjV,SAAS,KACTC,WAAS,E,WAET,UAACC,EAAAA,EAAWA,C,UACI,SAAbuD,IACC,UAACrD,EAAAA,EAAGA,CAACK,QAAQ,OAAOC,WAAW,SAASC,MAAO,CAAEC,IAAK,G,WACpD,SAACsU,EAAAA,EAAWA,CAACpU,MAAM,WACnB,SAACkQ,OAAAA,C,SAAMzB,OAGG,SAAb9L,GAAuB8L,MAE1B,UAACpP,EAAAA,EAAaA,C,WACZ,SAAC0V,EAAAA,EAAiBA,CAAClV,MAAO,CAAEgN,WAAY,Y,SACrCkH,IAEFc,IACC,UAACvV,EAAAA,EAAGA,CAAC+N,GAAI,E,WACP,UAAClN,EAAAA,EAAUA,CAACC,QAAQ,QAAQJ,MAAM,gBAAgB2M,cAAY,E,UAAC,SACxD,SAAC0H,SAAAA,C,SAAQK,IAAqB,mBAErC,SAAC9S,EAAAA,EAASA,CACRzC,WAAS,EACTiB,QAAQ,WACR6C,KAAK,QACLpC,MAAO8T,EACP7T,SAAUC,GAAK6T,EAAc7T,EAAEC,OAAOH,OACtCN,SAAUgG,EACVyO,WAAS,EACTlT,YAAa4S,WAKrB,UAACxS,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CAACC,QAAS+R,EAAU5T,SAAUgG,E,SAAU,YAG/C,SAACpE,EAAAA,EAAMA,CACLC,QAjDc,KAChB0S,GACFd,KAgDIhU,MAAM,YACNI,QAAQ,YACRG,SAAUgG,IAAauO,EACvB/R,UAAWwD,GAAW,SAACvD,EAAAA,EAAgBA,CAACC,KAAM,GAAIjD,MAAM,iBAAekD,E,SAEtEqD,EAAW,cAAgB,iB","sources":["webpack://internal.plugin-kuadrant/./src/components/RequestAccessDialog/RequestAccessDialog.tsx","webpack://internal.plugin-kuadrant/./src/components/EditAPIKeyDialog/EditAPIKeyDialog.tsx","webpack://internal.plugin-kuadrant/./src/utils/codeSnippets.ts","webpack://internal.plugin-kuadrant/./src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx","webpack://internal.plugin-kuadrant/./src/components/ConfirmDeleteDialog/ConfirmDeleteDialog.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Box,\n Typography,\n CircularProgress,\n} from '@material-ui/core';\nimport InfoIcon from '@material-ui/icons/Info';\nimport {\n useApi,\n alertApiRef,\n} from '@backstage/core-plugin-api';\nimport { kuadrantApiRef } from '../../api';\nimport { Plan } from \"../../types/api-management.ts\";\n\nexport interface RequestAccessDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n apiProductName: string;\n namespace: string;\n userEmail: string;\n plans: Plan[];\n}\n\nexport const RequestAccessDialog = ({\n open,\n onClose,\n onSuccess,\n apiProductName,\n namespace,\n userEmail,\n plans,\n}: RequestAccessDialogProps) => {\n const kuadrantApi = useApi(kuadrantApiRef);\n const alertApi = useApi(alertApiRef);\n\n const [selectedPlan, setSelectedPlan] = useState('');\n const [useCase, setUseCase] = useState('');\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const handleClose = () => {\n setSelectedPlan('');\n setUseCase('');\n setCreateError(null);\n onClose();\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n try {\n await kuadrantApi.createRequest({\n apiProductName,\n namespace,\n planTier: selectedPlan,\n useCase: useCase.trim() || '',\n userEmail,\n });\n\n alertApi.post({\n message: 'API key requested successfully',\n severity: 'success',\n display: 'transient',\n });\n\n setSelectedPlan('');\n setUseCase('');\n onSuccess();\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'unknown error occurred';\n alertApi.post({\n message: `Failed to request API key: ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n setCreateError(errorMessage);\n } finally {\n setCreating(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n <Box\n mb={2}\n p={1.5}\n bgcolor=\"info.light\"\n borderRadius={1}\n display=\"flex\"\n alignItems=\"flex-start\"\n style={{ gap: 8 }}\n >\n <InfoIcon\n color=\"primary\"\n fontSize=\"small\"\n style={{ marginTop: 2 }}\n />\n <Typography variant=\"body2\">\n Your request will be reviewed by an API owner before access is\n granted.\n </Typography>\n </Box>\n {createError && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl\n fullWidth\n margin=\"normal\"\n disabled={creating}\n data-testid=\"tier-select-form\"\n >\n <InputLabel id=\"tier-select-label\">Select Tier</InputLabel>\n <Select\n labelId=\"tier-select-label\"\n data-testid=\"tier-select\"\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\n disabled={creating}\n >\n {plans.map((plan: Plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(', ');\n return (\n <MenuItem\n key={plan.tier}\n value={plan.tier}\n data-testid={`tier-option-${plan.tier}`}\n >\n {plan.tier} {limitDesc ? `(${limitDesc})` : ''}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n <TextField\n label=\"Use Case (optional)\"\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 helperText=\"Explain your intended use of this API for admin review\"\n disabled={creating}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={creating}>\n Cancel\n </Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n variant=\"contained\"\n disabled={!selectedPlan || creating}\n startIcon={\n creating ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {creating ? 'Submitting...' : 'Submit Request'}\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 } from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { APIKey } from \"../../types/api-management\";\n\ninterface EditAPIKeyDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n request: APIKey;\n availablePlans: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n}\n\nexport const EditAPIKeyDialog = ({\n open,\n onClose,\n onSuccess,\n request,\n availablePlans,\n}: EditAPIKeyDialogProps) => {\n const kuadrantApi = useApi(kuadrantApiRef);\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 await kuadrantApi.updateRequest(\n request.metadata.name,\n request.metadata.namespace,\n // @ts-ignore Applying a partial obj\n patch,\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 Key</DialogTitle>\n <DialogContent>\n {error && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\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={\n saving ? <CircularProgress size={16} color=\"inherit\" /> : undefined\n }\n >\n {saving ? \"Saving...\" : \"Save Changes\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import { Credentials } from '../types/api-management';\n\nexport interface CodeSnippets {\n curl: string;\n nodejs: string;\n python: string;\n go: string;\n}\n\nexport function generateAuthCodeSnippets(\n credentials: Credentials | undefined,\n hostname: string,\n apiKey: string,\n): CodeSnippets {\n const baseUrl = `https://${hostname}/api/v1/endpoint`;\n\n if (!credentials) {\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, 'Bearer');\n }\n\n if (credentials.authorizationHeader) {\n const prefix = credentials!.authorizationHeader!.prefix || '';\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, prefix);\n }\n\n if (credentials.customHeader) {\n const headerName = credentials!.customHeader!.name;\n const prefix = credentials!.customHeader!.prefix || '';\n return generateCustomHeaderSnippets(baseUrl, apiKey, headerName, prefix);\n }\n\n\n if (credentials.queryString) {\n const paramName = credentials!.queryString!.name;\n return generateQueryStringSnippets(baseUrl, apiKey, paramName);\n }\n\n if (credentials.cookie) {\n const cookieName = credentials!.cookie!.name;\n return generateCookieSnippets(baseUrl, apiKey, cookieName);\n }\n // Default to Authorization Bearer if no authScheme specified\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, 'Bearer');\n}\n\nfunction generateAuthorizationHeaderSnippets(\n baseUrl: string,\n apiKey: string,\n prefix: string,\n): CodeSnippets {\n const authValue = prefix ? `${prefix} ${apiKey}` : apiKey;\n const prefixWithSpace = prefix ? `${prefix} ` : '';\n\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n -H \"Authorization: ${authValue}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': '${prefixWithSpace}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nheaders = {\n 'Authorization': '${prefixWithSpace}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"Authorization\", \"${prefixWithSpace}\" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateCustomHeaderSnippets(\n baseUrl: string,\n apiKey: string,\n headerName: string,\n prefix: string,\n): CodeSnippets {\n const headerValue = prefix ? `${prefix}${apiKey}` : apiKey;\n\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n -H \"${headerName}: ${headerValue}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n '${headerName}': '${prefix}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nheaders = {\n '${headerName}': '${prefix}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"${headerName}\", \"${prefix}\" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateQueryStringSnippets(\n baseUrl: string,\n apiKey: string,\n paramName: string,\n): CodeSnippets {\n const urlWithParam = `${baseUrl}?${paramName}=${apiKey}`;\n\n return {\n curl: `curl -X GET \"${urlWithParam}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}?${paramName}=' + apiKey;\n\nfetch(endpoint, {\n method: 'GET'\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nparams = {\n '${paramName}': api_key\n}\n\nresponse = requests.get(endpoint, params=params)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}?${paramName}=\" + apiKey\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateCookieSnippets(\n baseUrl: string,\n apiKey: string,\n cookieName: string,\n): CodeSnippets {\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n --cookie \"${cookieName}=${apiKey}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Cookie': '${cookieName}=' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\ncookies = {\n '${cookieName}': api_key\n}\n\nresponse = requests.get(endpoint, cookies=cookies)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.AddCookie(&http.Cookie{\n Name: \"${cookieName}\",\n Value: apiKey,\n })\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n","import React, { useState, useMemo } from \"react\";\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n ResponseErrorPanel,\n CodeSnippet,\n} from \"@backstage/core-components\";\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Tabs,\n Tab,\n Menu,\n MenuItem,\n Tooltip,\n CircularProgress,\n} from \"@material-ui/core\";\nimport { Skeleton } from \"@material-ui/lab\";\nimport {\n useApi,\n identityApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { UserEntity } from '@backstage/catalog-model';\nimport { useEntity, catalogApiRef } from \"@backstage/plugin-catalog-react\";\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\nimport VisibilityOffIcon from \"@material-ui/icons/VisibilityOff\";\nimport HourglassEmptyIcon from \"@material-ui/icons/HourglassEmpty\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport MoreVertIcon from \"@material-ui/icons/MoreVert\";\nimport FileCopyIcon from \"@material-ui/icons/FileCopy\";\nimport WarningIcon from \"@material-ui/icons/Warning\";\nimport { APIKey, APIProduct, Plan } from \"../../types/api-management\";\nimport {\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n} from \"../../permissions\";\nimport {\n useKuadrantPermission,\n canDeleteResource,\n} from \"../../utils/permissions\";\nimport { EditAPIKeyDialog } from \"../EditAPIKeyDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { generateAuthCodeSnippets } from \"../../utils/codeSnippets\";\nimport { RequestAccessDialog } from \"../RequestAccessDialog\";\n\nexport interface ApiKeyManagementTabProps {\n namespace?: string;\n}\n\nexport const ApiKeyManagementTab = ({\n namespace: propNamespace,\n}: ApiKeyManagementTabProps) => {\n const { entity } = useEntity();\n const catalogAPI = useApi(catalogApiRef);\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [refresh, setRefresh] = useState(0);\n const [userId, setUserId] = useState<string>(\"\");\n const [userEmail, setUserEmail] = useState<string>(\"\");\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [requestToEdit, setRequestToEdit] = useState<APIKey | null>(null);\n const [menuAnchor, setMenuAnchor] = useState<{\n top: number;\n left: number;\n } | null>(null);\n const [menuRequest, setMenuRequest] = useState<APIKey | null>(null);\n const [deleting, setDeleting] = useState<string | null>(null);\n const [optimisticallyDeleted, setOptimisticallyDeleted] = useState<\n Set<string>\n >(new Set());\n const [deleteDialogState, setDeleteDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n }>({ open: false, request: null });\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(\n new Map(),\n );\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n const [alreadyReadKeys, setAlreadyReadKeys] = useState<Set<string>>(\n new Set(),\n );\n const [showOnceWarningOpen, setShowOnceWarningOpen] = useState(false);\n const [pendingKeyReveal, setPendingKeyReveal] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName =\n entity.metadata.annotations?.[\"kuadrant.io/apiproduct\"] ||\n entity.metadata.name;\n const namespace =\n entity.metadata.annotations?.[\"kuadrant.io/namespace\"] ||\n propNamespace ||\n \"default\";\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const profile = await identityApi.getProfileInfo();\n setUserId(identity.userEntityRef);\n\n // Try profile email first (works for OAuth providers)\n let email = profile.email || \"\";\n // Fallback to catalog entity for guest/other providers\n if (!email && identity.userEntityRef) {\n const userEntity = await catalogAPI.getEntityByRef(identity.userEntityRef) as UserEntity;\n if (userEntity?.spec?.profile?.email) {\n email = userEntity.spec.profile.email as string;\n }\n }\n\n setUserEmail(email);\n }, [identityApi]);\n\n const {\n value: requests,\n loading: requestsLoading,\n error: requestsError,\n } = useAsync(async () => {\n const data = await kuadrantApi.getRequestsByNamespace(namespace);\n // filter by apiproduct name, not httproute name\n return (data.items || []).filter(\n (r: APIKey) =>\n r.spec.apiProductRef.name === apiProductName &&\n r.metadata.namespace === namespace, // APIProducts and APIKeys (and its Secret) will be in the same NS\n );\n }, [apiProductName, namespace, refresh, kuadrantApi]);\n\n const {\n value: apiProduct,\n loading: plansLoading,\n error: plansError,\n } = useAsync(async () => {\n const data = await kuadrantApi.getApiProducts();\n\n const product = data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n\n return product;\n }, [namespace, apiProductName, kuadrantApi]);\n\n // check permissions with resource reference once we have the apiproduct\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const {\n allowed: canCreateRequest,\n loading: createRequestPermissionLoading,\n error: createRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyCreatePermission, resourceRef);\n\n const {\n allowed: canDeleteOwnKey,\n loading: deleteOwnPermissionLoading,\n error: deleteOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllKeys,\n loading: deleteAllPermissionLoading,\n error: deleteAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);\n\n const {\n allowed: canUpdateRequest,\n loading: updateRequestPermissionLoading,\n error: updateRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateOwnPermission);\n\n const handleDeleteRequest = async (name: string) => {\n // optimistic update - remove from UI immediately\n setOptimisticallyDeleted((prev) => new Set(prev).add(name));\n setDeleting(name);\n try {\n await kuadrantApi.deleteRequest(namespace, name);\n alertApi.post({\n message: \"API key deleted successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n setRefresh((r) => r + 1);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n // rollback optimistic update on error\n setOptimisticallyDeleted((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n alertApi.post({\n message: `Failed to delete API key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleting(null);\n }\n };\n\n const fetchApiKeyFromSecret = async (\n requestNamespace: string,\n requestName: string,\n ) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const data = await kuadrantApi.getApiKeySecret(requestNamespace, requestName);\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n // after successful read, mark as already read (show-once behaviour)\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n if (errorMessage.includes(\"403\") || errorMessage.includes(\"already been viewed\")) {\n // secret has already been read\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n alertApi.post({\n message:\n \"This API key has already been viewed and cannot be retrieved again.\",\n severity: \"warning\",\n display: \"transient\",\n });\n } else {\n alertApi.post({\n message: `Failed to fetch api key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const handleEditRequest = (request: APIKey) => {\n setRequestToEdit(request);\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefresh((r) => r + 1);\n setEditDialogOpen(false);\n alertApi.post({\n message: \"API key updated\",\n severity: \"success\",\n display: \"transient\",\n });\n setRequestToEdit(null);\n };\n\n const handleMenuClose = () => {\n setMenuAnchor(null);\n setMenuRequest(null);\n };\n\n const handleMenuEdit = () => {\n if (!menuRequest) return;\n handleEditRequest(menuRequest);\n handleMenuClose();\n };\n\n const handleMenuDeleteClick = () => {\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 await handleDeleteRequest(deleteDialogState.request.metadata.name);\n setDeleteDialogState({ open: false, request: null });\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogState({ open: false, request: null });\n };\n\n const toggleVisibility = (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 detailPanelConfig = useMemo(\n () => [\n {\n render: (data: any) => {\n // backstage Table wraps the data in { rowData: actualData }\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n\n // pass already-revealed key from parent state (don't auto-fetch - that consumes show-once)\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const revealedKey = apiKeyValues.get(key);\n return (\n <DetailPanelContent\n request={request}\n apiName={apiProductName}\n revealedApiKey={revealedKey}\n />\n );\n },\n },\n ],\n [apiProductName, apiKeyValues],\n );\n\n // separate component to isolate state\n const DetailPanelContent = ({\n request,\n apiName: api,\n revealedApiKey,\n }: {\n request: APIKey;\n apiName: string;\n revealedApiKey?: string;\n }) => {\n const [selectedLanguage, setSelectedLanguage] = useState(0);\n const hostname = request.status?.apiHostname || `${api}.apps.example.com`;\n\n // use revealed key if available, otherwise show placeholder\n const displayApiKey = revealedApiKey || \"<your-api-key>\";\n\n // Generate code snippets based on authScheme credentials\n const credentials = request.status?.authScheme?.credentials;\n const snippets = generateAuthCodeSnippets(credentials, hostname, displayApiKey);\n\n return (\n <Box\n p={3}\n bgcolor=\"background.default\"\n onClick={(e) => e.stopPropagation()}\n >\n {request.spec.useCase && (\n <Box mb={3}>\n <Typography variant=\"h6\" gutterBottom>\n Use Case\n </Typography>\n <Box\n p={2}\n bgcolor=\"background.paper\"\n borderRadius={1}\n border=\"1px solid rgba(0, 0, 0, 0.12)\"\n >\n <Typography\n variant=\"body2\"\n style={{\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n overflowWrap: \"break-word\",\n }}\n >\n {request.spec.useCase}\n </Typography>\n </Box>\n </Box>\n )}\n <Typography variant=\"h6\" gutterBottom>\n Usage Examples\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use these code examples to test the API with your{\" \"}\n {request.spec.planTier} tier key.\n </Typography>\n <Box onClick={(e) => e.stopPropagation()}>\n <Tabs\n value={selectedLanguage}\n onChange={(e, newValue) => {\n e.stopPropagation();\n setSelectedLanguage(newValue);\n }}\n indicatorColor=\"primary\"\n >\n <Tab label=\"cURL\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Node.js\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Python\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Go\" onClick={(e) => e.stopPropagation()} />\n </Tabs>\n </Box>\n <Box mt={2}>\n {selectedLanguage === 0 && (\n <CodeSnippet\n text={snippets.curl}\n language=\"bash\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 1 && (\n <CodeSnippet\n text={snippets.nodejs}\n language=\"javascript\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 2 && (\n <CodeSnippet\n text={snippets.python}\n language=\"python\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 3 && (\n <CodeSnippet\n text={snippets.go}\n language=\"go\"\n showCopyCodeButton\n />\n )}\n </Box>\n </Box>\n );\n };\n\n const loading =\n requestsLoading ||\n plansLoading ||\n createRequestPermissionLoading ||\n deleteOwnPermissionLoading ||\n deleteAllPermissionLoading ||\n updateRequestPermissionLoading;\n const error = requestsError || plansError;\n const permissionError =\n createRequestPermissionError ||\n deleteOwnPermissionError ||\n deleteAllPermissionError ||\n updateRequestPermissionError;\n\n if (loading) {\n return (\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n const failedPermission = createRequestPermissionError\n ? \"kuadrant.apikey.create\"\n : deleteOwnPermissionError\n ? \"kuadrant.apikey.delete.own\"\n : deleteAllPermissionError\n ? \"kuadrant.apikey.delete.all\"\n : updateRequestPermissionError\n ? \"kuadrant.apikey.update.own\"\n : \"unknown\";\n return (\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: {failedPermission}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n const myRequests = ((requests || []) as APIKey[]).filter(\n (r) => !optimisticallyDeleted.has(r.metadata.name),\n );\n const plans = (apiProduct?.status?.discoveredPlans || []) as Plan[];\n\n const pendingRequests = myRequests.filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n const approvedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Approved\",\n );\n const rejectedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Rejected\",\n );\n\n const approvedColumns: TableColumn<APIKey>[] = [\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Approved\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt\n ? new Date(row.status.reviewedAt).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"API Key\",\n field: \"status.secretRef\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const key = `${row.metadata.namespace}/${row.metadata.name}`;\n const isVisible = visibleKeys.has(row.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = row.status?.secretRef?.name;\n const canReadSecret = row.status?.canReadSecret !== false;\n const isAlreadyRead = alreadyReadKeys.has(key) || !canReadSecret;\n\n if (!hasSecretRef) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n Awaiting secret...\n </Typography>\n );\n }\n\n // key has already been viewed and cannot be retrieved again\n if (isAlreadyRead && !apiKeyValue) {\n return (\n <Tooltip title=\"This API key has already been viewed and cannot be retrieved again\">\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n style={{ fontFamily: \"monospace\", marginRight: 8 }}\n >\n Already viewed\n </Typography>\n <VisibilityOffIcon fontSize=\"small\" color=\"disabled\" />\n </Box>\n </Tooltip>\n );\n }\n\n const handleRevealClick = () => {\n if (isVisible) {\n // hiding - clear the value from memory\n clearApiKeyValue(row.metadata.namespace, row.metadata.name);\n toggleVisibility(row.metadata.name);\n } else if (!isAlreadyRead) {\n // show warning dialog before first reveal\n setPendingKeyReveal({\n namespace: row.metadata.namespace,\n name: row.metadata.name,\n });\n setShowOnceWarningOpen(true);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: \"API key copied to clipboard\",\n severity: \"success\",\n display: \"transient\",\n });\n }\n };\n\n return (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: \"monospace\",\n marginRight: 8,\n }}\n >\n {isLoading\n ? \"Loading...\"\n : isVisible && apiKeyValue\n ? apiKeyValue\n : \"••••••••••••••••\"}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={\n isVisible ? \"Hide API key\" : \"Reveal API key (one-time only)\"\n }\n >\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading || (isAlreadyRead && !apiKeyValue)}\n >\n {isVisible ? <VisibilityOffIcon /> : <VisibilityIcon />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n if (!canDelete) return null;\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 title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const requestColumns: TableColumn<APIKey>[] = [\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row: APIKey) => {\n const phase = row.status?.phase || \"Pending\";\n const isPending = phase === \"Pending\";\n return (\n <Chip\n label={phase}\n size=\"small\"\n icon={isPending ? <HourglassEmptyIcon /> : <CancelIcon />}\n color={isPending ? \"default\" : \"secondary\"}\n />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Use Case\",\n field: \"spec.useCase\",\n render: (row: APIKey) => {\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: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp\n ? new Date(row.metadata.creationTimestamp).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"Reviewed\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => {\n if (!row.status?.reviewedAt)\n return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.status.reviewedAt).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const isPending = !row.status?.phase || row.status.phase === \"Pending\";\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n const canEdit = canUpdateRequest && ownerId === userId;\n if (!isPending || (!canEdit && !canDelete)) return null;\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 title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n // Filter columns for pending requests (no Reviewed or Reason)\n const pendingRequestColumns = requestColumns.filter(\n (col) => col.title !== \"Reviewed\" && col.title !== \"Reason\",\n );\n\n return (\n <Box p={2}>\n <Grid container spacing={3} direction=\"column\">\n {canCreateRequest && (\n <Grid item>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-end\"\n mb={2}\n >\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n disabled={plans.length === 0 || !userEmail}\n data-testid=\"request-api-access-button\"\n data-plans-count={plans.length}\n >\n Request API Access\n </Button>\n {!userEmail && (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n style={{ marginTop: 4 }}\n data-testid=\"no-email-message\"\n >\n \"Email address is required\"\n </Typography>\n )}\n {plans.length === 0 && (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n style={{ marginTop: 4 }}\n data-testid=\"no-plans-message\"\n >\n {!apiProduct\n ? \"API product not found\"\n : (() => {\n const readyCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"Ready\",\n );\n const planCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"PlanPolicyDiscovered\",\n );\n\n if (readyCondition?.status !== \"True\") {\n return `HTTPRoute not ready: ${readyCondition?.message || \"unknown\"}`;\n }\n if (planCondition?.status !== \"True\") {\n return `No plans discovered: ${planCondition?.message || \"no PlanPolicy found\"}`;\n }\n return \"No plans available\";\n })()}\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n {pendingRequests.length === 0 &&\n rejectedRequests.length === 0 &&\n approvedRequests.length === 0 && (\n <Grid item>\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys yet. Request access to get started.\n </Typography>\n </Box>\n </Grid>\n )}\n {pendingRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Pending Requests\"\n options={{\n paging: pendingRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={pendingRequestColumns}\n data={pendingRequests}\n />\n </Grid>\n )}\n {rejectedRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Rejected Requests\"\n options={{\n paging: rejectedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={requestColumns}\n data={rejectedRequests}\n />\n </Grid>\n )}\n {approvedRequests.length > 0 && (\n <Grid item>\n <Table\n key=\"api-keys-table\"\n title=\"API Keys\"\n options={{\n paging: approvedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={approvedColumns}\n data={approvedRequests}\n detailPanel={detailPanelConfig}\n />\n </Grid>\n )}\n </Grid>\n\n <RequestAccessDialog\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n onSuccess={() => {\n setRequestDialogOpen(false);\n setRefresh((r) => r + 1);\n }}\n apiProductName={apiProductName}\n namespace={namespace}\n userEmail={userEmail}\n plans={plans}\n />\n\n <Menu\n id=\"actions-menu\"\n open={Boolean(menuAnchor)}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuAnchor || { top: 0, left: 0 }}\n >\n {menuRequest &&\n (() => {\n const isPending =\n !menuRequest.status?.phase ||\n menuRequest.status.phase === \"Pending\";\n const ownerId = menuRequest.spec.requestedBy.userId;\n const canEdit = canUpdateRequest && ownerId === userId && isPending;\n\n const items = [];\n if (canEdit) {\n items.push(\n <MenuItem key=\"edit\" onClick={handleMenuEdit}>\n Edit\n </MenuItem>,\n );\n }\n items.push(\n <MenuItem key=\"delete\" onClick={handleMenuDeleteClick}>\n Delete\n </MenuItem>,\n );\n return items;\n })()}\n </Menu>\n\n {requestToEdit && (\n <EditAPIKeyDialog\n open={editDialogOpen}\n onClose={() => {\n setEditDialogOpen(false);\n setRequestToEdit(null);\n }}\n onSuccess={handleEditSuccess}\n request={requestToEdit}\n availablePlans={plans}\n />\n )}\n\n <ConfirmDeleteDialog\n open={deleteDialogState.open}\n title=\"Delete Request\"\n description={`Are you sure you want to delete this ${deleteDialogState.request?.status?.phase === \"Approved\" ? \"API key\" : \"request\"}?`}\n deleting={deleting !== null}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n\n <Dialog\n open={showOnceWarningOpen}\n onClose={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n maxWidth=\"sm\"\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\">\n <WarningIcon color=\"primary\" style={{ marginRight: 8 }} />\n View API Key\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\" paragraph>\n This API key can only be viewed <strong>once</strong>. After you\n reveal it, you will not be able to retrieve it again.\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure to copy and store it securely before closing this view.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (pendingKeyReveal) {\n fetchApiKeyFromSecret(\n pendingKeyReveal.namespace,\n pendingKeyReveal.name,\n );\n toggleVisibility(pendingKeyReveal.name);\n }\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Reveal API Key\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n};\n","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 style={{ whiteSpace: 'pre-line' }}>\n {description}\n </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"],"names":["RequestAccessDialog","open","onClose","onSuccess","apiProductName","namespace","userEmail","plans","kuadrantApi","useApi","kuadrantApiRef","alertApi","alertApiRef","selectedPlan","setSelectedPlan","useState","useCase","setUseCase","creating","setCreating","createError","setCreateError","handleClose","Dialog","maxWidth","fullWidth","DialogTitle","DialogContent","Box","mb","p","bgcolor","borderRadius","display","alignItems","style","gap","InfoIcon","color","fontSize","marginTop","Typography","variant","FormControl","margin","disabled","data-testid","InputLabel","id","Select","labelId","value","onChange","e","target","map","plan","limitDesc","Object","entries","limits","key","val","join","MenuItem","tier","TextField","label","placeholder","multiline","rows","helperText","DialogActions","Button","onClick","async","createRequest","planTier","trim","post","message","severity","err","errorMessage","Error","startIcon","CircularProgress","size","undefined","EditAPIKeyDialog","request","availablePlans","setPlanTier","saving","setSaving","error","setError","useEffect","spec","patch","updateRequest","metadata","name","console","generateAuthorizationHeaderSnippets","baseUrl","apiKey","prefix","prefixWithSpace","curl","nodejs","python","go","ApiKeyManagementTab","propNamespace","entity","apiProduct","deleteDialogState","useEntity","catalogAPI","catalogApiRef","identityApi","identityApiRef","visibleKeys","setVisibleKeys","Set","refresh","setRefresh","userId","setUserId","setUserEmail","requestDialogOpen","setRequestDialogOpen","editDialogOpen","setEditDialogOpen","requestToEdit","setRequestToEdit","menuAnchor","setMenuAnchor","menuRequest","setMenuRequest","deleting","setDeleting","optimisticallyDeleted","setOptimisticallyDeleted","setDeleteDialogState","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","alreadyReadKeys","setAlreadyReadKeys","showOnceWarningOpen","setShowOnceWarningOpen","pendingKeyReveal","setPendingKeyReveal","annotations","useAsync","identity","getBackstageIdentity","profile","getProfileInfo","userEntityRef","email","userEntity","getEntityByRef","requests","loading","requestsLoading","requestsError","getRequestsByNamespace","items","filter","r","apiProductRef","plansLoading","plansError","data","getApiProducts","find","resourceRef","allowed","canCreateRequest","createRequestPermissionLoading","createRequestPermissionError","useKuadrantPermission","kuadrantApiKeyCreatePermission","canDeleteOwnKey","deleteOwnPermissionLoading","deleteOwnPermissionError","kuadrantApiKeyDeleteOwnPermission","canDeleteAllKeys","deleteAllPermissionLoading","deleteAllPermissionError","kuadrantApiKeyDeleteAllPermission","canUpdateRequest","updateRequestPermissionLoading","updateRequestPermissionError","kuadrantApiKeyUpdateOwnPermission","handleMenuClose","handleMenuEdit","handleMenuDeleteClick","toggleVisibility","keyName","prev","newSet","has","delete","add","detailPanelConfig","useMemo","render","rowData","revealedKey","get","DetailPanelContent","apiName","revealedApiKey","api","selectedLanguage","setSelectedLanguage","hostname","status","apiHostname","displayApiKey","snippets","credentials","authorizationHeader","customHeader","headerName","generateCustomHeaderSnippets","queryString","paramName","generateQueryStringSnippets","cookie","cookieName","generateCookieSnippets","generateAuthCodeSnippets","authScheme","stopPropagation","gutterBottom","border","whiteSpace","wordBreak","overflowWrap","paragraph","Tabs","newValue","indicatorColor","Tab","mt","CodeSnippet","text","language","showCopyCodeButton","permissionError","Array","_","i","Skeleton","width","ResponseErrorPanel","failedPermission","myRequests","discoveredPlans","pendingRequests","phase","approvedRequests","rejectedRequests","approvedColumns","title","field","row","Chip","reviewedAt","Date","toLocaleDateString","searchable","filtering","isVisible","isLoading","apiKeyValue","hasSecretRef","secretRef","canReadSecret","isAlreadyRead","Tooltip","fontFamily","marginRight","VisibilityOffIcon","IconButton","navigator","clipboard","writeText","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","VisibilityIcon","ownerId","requestedBy","canDeleteResource","rect","currentTarget","getBoundingClientRect","top","bottom","left","aria-controls","aria-haspopup","MoreVertIcon","requestColumns","isPending","icon","HourglassEmptyIcon","CancelIcon","placement","overflow","textOverflow","creationTimestamp","canDelete","pendingRequestColumns","col","Grid","container","spacing","direction","item","flexDirection","AddIcon","length","data-plans-count","readyCondition","conditions","c","type","planCondition","textAlign","Table","options","paging","pageSize","search","debounceInterval","toolbar","emptyRowsWhenPaging","columns","detailPanel","Menu","Boolean","anchorReference","anchorPosition","push","ConfirmDeleteDialog","description","onConfirm","deleteRequest","handleDeleteRequest","onCancel","WarningIcon","strong","getApiKeySecret","set","includes","fetchApiKeyFromSecret","confirmText","inputValue","setInputValue","requiresTextConfirmation","canConfirm","DialogContentText","autoFocus"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[6800],{25467:(e,t,r)=>{r.d(t,{tN:()=>s}),r(31085),r(22097);var n=r(15427);function s(){const e=(0,n.useVersionedContext)("entity-context");if(!e)throw new Error("Entity context is not available");const t=e.atVersion(1);if(!t)throw new Error("EntityContext v1 not available");if(!t.entity)throw new Error("useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.");return{entity:t.entity}}(0,n.createVersionedContext)("entity-context")},46800:(e,t,r)=>{r.r(t),r.d(t,{EntityApiApprovalTab:()=>z});var n=r(31085),s=r(95478),a=r(25467),i=r(22097),o=r(
|
|
2
|
-
//# sourceMappingURL=6800.
|
|
1
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[6800],{25467:(e,t,r)=>{r.d(t,{tN:()=>s}),r(31085),r(22097);var n=r(15427);function s(){const e=(0,n.useVersionedContext)("entity-context");if(!e)throw new Error("Entity context is not available");const t=e.atVersion(1);if(!t)throw new Error("EntityContext v1 not available");if(!t.entity)throw new Error("useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.");return{entity:t.entity}}(0,n.createVersionedContext)("entity-context")},46800:(e,t,r)=>{r.r(t),r.d(t,{EntityApiApprovalTab:()=>z});var n=r(31085),s=r(95478),a=r(25467),i=r(22097),o=r(70980),l=r(35015),d=r(42367),c=r(25010),p=r(34955),u=r(46205),h=r(58837),v=r(10394),A=r(72501),x=r(76891),g=r(61477),y=r(46805),m=r(16249),j=r(93453),f=r(64947),b=r(78467),q=r(67720),C=r(71677),w=r(29365),k=r(4387),P=r(55429),R=r(92399),I=r(46299);const T=(0,h.A)(e=>({useCasePanel:{padding:e.spacing(2),backgroundColor:e.palette.background.default},useCaseLabel:{fontWeight:600,marginBottom:e.spacing(1),color:e.palette.text.secondary,textTransform:"uppercase",fontSize:"0.75rem"}})),E=({request:e})=>{const t=T();return(0,n.jsxs)(v.A,{className:t.useCasePanel,onClick:e=>e.stopPropagation(),children:[(0,n.jsx)(A.A,{className:t.useCaseLabel,children:"Use Case"}),(0,n.jsx)(A.A,{variant:"body2",children:e.spec.useCase||"No use case provided"})]})},S=({open:e,request:t,action:r,processing:a,onClose:i,onConfirm:o})=>{const[l,d]=(0,s.useState)(""),c=()=>{d(""),i()},p="reject"===r,u=(null==t?void 0:t.metadata.name)||"",h=l===u;return(0,n.jsxs)(x.A,{open:e,onClose:a?void 0:c,maxWidth:"sm",fullWidth:!0,children:[(0,n.jsx)(g.A,{children:p?"Reject API key":"Approve API key"}),(0,n.jsx)(y.A,{children:t&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(A.A,{variant:"body2",paragraph:!0,children:[(0,n.jsx)("strong",{children:"Requester:"})," ",t.spec.requestedBy.userId]}),(0,n.jsxs)(A.A,{variant:"body2",paragraph:!0,children:[(0,n.jsx)("strong",{children:"Tier:"})," ",t.spec.planTier]}),t.spec.useCase&&(0,n.jsxs)(A.A,{variant:"body2",paragraph:!0,children:[(0,n.jsx)("strong",{children:"Use Case:"})," ",t.spec.useCase]}),p&&(0,n.jsx)(v.A,{mt:2,p:2,bgcolor:"error.light",borderRadius:1,children:(0,n.jsx)(A.A,{variant:"body2",children:"This action will permanently deny access. The user will need to submit a new request."})}),(0,n.jsx)(v.A,{mt:2,children:(0,n.jsx)(m.A,{fullWidth:!0,label:`Type "${u}" to confirm`,value:l,onChange:e=>d(e.target.value),disabled:a,autoFocus:!0})})]})}),(0,n.jsxs)(j.A,{children:[(0,n.jsx)(f.A,{onClick:c,disabled:a,children:"Cancel"}),(0,n.jsx)(f.A,{onClick:()=>{o(l),d("")},color:p?"secondary":"primary",variant:"contained",disabled:!h||a,startIcon:a?(0,n.jsx)(b.A,{size:16,color:"inherit"}):void 0,children:a?p?"Rejecting...":"Approving...":p?"Reject":"Approve"})]})]})},z=()=>{var e,t;const{entity:r}=(0,a.tN)(),h=(0,i.useApi)(o.s),x=(0,i.useApi)(i.identityApiRef),g=(0,i.useApi)(i.alertApiRef),y=(null===(e=r.metadata.annotations)||void 0===e?void 0:e["kuadrant.io/apiproduct"])||r.metadata.name,m=(null===(t=r.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"])||"default",[j,f]=(0,s.useState)(0),[b,T]=(0,s.useState)({open:!1,request:null,action:"approve",processing:!1}),{allowed:z,loading:B,error:N}=(0,u.l)(p.KV),{value:W,loading:_,error:L}=(0,l.A)(async()=>{const e=(await x.getBackstageIdentity()).userEntityRef;return{requests:((await h.getRequests()).items||[]).filter(e=>{var t;return(null===(t=e.spec.apiProductRef)||void 0===t?void 0:t.name)===y&&e.metadata.namespace===m}),reviewedBy:e}},[h,x,y,m,j]);if(_||B)return(0,n.jsx)(v.A,{p:2,children:[...Array(5)].map((e,t)=>(0,n.jsx)(v.A,{p:2,children:(0,n.jsx)(k.A,{variant:"text",width:"100%"})},t))});if(L)return(0,n.jsx)(d._,{error:L});if(N)return(0,n.jsx)(v.A,{p:2,children:(0,n.jsxs)(A.A,{color:"error",children:["Unable to check permissions: ",N.message]})});if(!z)return(0,n.jsx)(v.A,{p:3,textAlign:"center",children:(0,n.jsx)(A.A,{variant:"body1",color:"textSecondary",children:"You don't have permission to view the approval queue for this API."})});const U=(null==W?void 0:W.requests)||[],V=U.filter(e=>{var t;return!(null===(t=e.status)||void 0===t?void 0:t.phase)||"Pending"===e.status.phase}),$=U.filter(e=>{var t;return"Approved"===(null===(t=e.status)||void 0===t?void 0:t.phase)}),D=U.filter(e=>{var t;return"Rejected"===(null===(t=e.status)||void 0===t?void 0:t.phase)}),F=[{title:"Requester",field:"spec.requestedBy.userId",render:e=>(0,n.jsx)(A.A,{variant:"body2",children:e.spec.requestedBy.userId})},{title:"Status",field:"status.phase",render:e=>{var t;const r=(null===(t=e.status)||void 0===t?void 0:t.phase)||"Pending",s="Approved"===r?"Active":r;return(0,n.jsx)(q.A,{label:s,size:"small",style:(0,I.uU)(r)})}},{title:"Tier",field:"spec.planTier",render:e=>(0,n.jsx)(q.A,{label:e.spec.planTier,size:"small",variant:"outlined"})},{title:"Requested",field:"metadata.creationTimestamp",render:e=>e.metadata.creationTimestamp?(0,n.jsx)(A.A,{variant:"body2",children:new Date(e.metadata.creationTimestamp).toLocaleDateString()}):(0,n.jsx)(A.A,{variant:"body2",children:"-"})},{title:"Actions",filtering:!1,render:e=>{var t;return"Pending"!==((null===(t=e.status)||void 0===t?void 0:t.phase)||"Pending")?null:(0,n.jsxs)(v.A,{display:"flex",style:{gap:4},children:[(0,n.jsx)(C.Ay,{title:"Approve",children:(0,n.jsx)(w.A,{size:"small",onClick:()=>{T({open:!0,request:e,action:"approve",processing:!1})},children:(0,n.jsx)(P.A,{color:"primary"})})}),(0,n.jsx)(C.Ay,{title:"Reject",children:(0,n.jsx)(w.A,{size:"small",onClick:()=>{T({open:!0,request:e,action:"reject",processing:!1})},children:(0,n.jsx)(R.A,{color:"error"})})})]})}}],K=[{render:e=>{var t;const r=e.rowData;return(null==r||null===(t=r.metadata)||void 0===t?void 0:t.name)?(0,n.jsx)(E,{request:r}):(0,n.jsx)(v.A,{})}}];return(0,n.jsxs)(v.A,{p:2,children:[(0,n.jsx)(v.A,{mb:2,children:(0,n.jsxs)(A.A,{variant:"body2",color:"textSecondary",children:[V.length," pending, ",$.length," approved,"," ",D.length," rejected"]})}),0===U.length?(0,n.jsx)(v.A,{p:3,textAlign:"center",children:(0,n.jsx)(A.A,{variant:"body1",color:"textSecondary",children:"No API keys for this API."})}):(0,n.jsx)(c.X,{options:{paging:U.length>10,pageSize:20,search:!0,filtering:!1,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:F,data:U.map(e=>({...e,id:e.metadata.name})),detailPanel:K}),(0,n.jsx)(S,{open:b.open,request:b.request,action:b.action,processing:b.processing,onClose:()=>T({open:!1,request:null,action:"approve",processing:!1}),onConfirm:async()=>{if(!b.request||!W)return;T(e=>({...e,processing:!0}));const e="approve"===b.action,t=e?(e,t,r)=>h.approveRequest(e,t,r):(e,t,r)=>h.rejectRequest(e,t,r);try{await t(b.request.metadata.namespace,b.request.metadata.name,W.reviewedBy),T({open:!1,request:null,action:"approve",processing:!1}),f(e=>e+1),g.post({message:"API key "+(e?"approved":"rejected"),severity:"success",display:"transient"})}catch(e){console.error(`Error ${b.action}ing request:`,e),T(e=>({...e,processing:!1}));const t=e instanceof Error?e.message:"unknown error occurred";g.post({message:`Failed to ${b.action} APIKey. ${t}`,severity:"error",display:"transient"})}}})]})}}}]);
|
|
2
|
+
//# sourceMappingURL=6800.a45da2f4.chunk.js.map
|