@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
|
-
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[7791],{57791:(e,t,s)=>{s.r(t),s.d(t,{ApiProductDetailPage:()=>E});var i=s(31085),n=s(95478),a=s(49634),l=s(22097),o=s(
|
|
2
|
-
//# sourceMappingURL=7791.
|
|
1
|
+
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[7791],{57791:(e,t,s)=>{s.r(t),s.d(t,{ApiProductDetailPage:()=>E});var i=s(31085),n=s(95478),a=s(49634),l=s(22097),o=s(70980),r=s(35015),d=s(289),c=s(15831),u=s(46681),p=s(42367),v=s(37725),m=s(94641),h=s(96040),A=s(41241),x=s(58837),j=s(10394),y=s(64947),P=s(71677),f=s(29365),g=s(72501),b=s(31653),w=s(38605),I=s(55735),k=s(75625),C=s(39590),S=s(4387),N=s(48351),R=s(26997),_=s(63221),D=s(86197),U=s(89509),z=s(71255),L=s(46205),O=s(97859),T=s(34955);const B=(0,x.A)(e=>({label:{fontWeight:600,color:e.palette.text.secondary,marginBottom:e.spacing(.5),fontSize:"0.75rem",textTransform:"uppercase"},actionButtons:{display:"flex",gap:e.spacing(1),alignItems:"center"},cardHeader:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:e.spacing(2)},cardActions:{display:"flex",gap:e.spacing(1),alignItems:"center"}})),E=()=>{var e,t,s,x,E,H,Y,$,F,K,M,V,W,q,G,J,Q,X,Z,ee,te,se,ie,ne,ae,le,oe,re,de,ce;const ue=B(),{namespace:pe,name:ve}=(0,a.useParams)(),me=(0,a.useNavigate)(),he=(0,l.useApi)(o.s),Ae=(0,l.useApi)(l.alertApiRef),[xe,je]=(0,n.useState)(0),[ye,Pe]=(0,n.useState)(!1),[fe,ge]=(0,n.useState)(!1),[be,we]=(0,n.useState)(!1),[Ie,ke]=(0,n.useState)(0),{allowed:Ce}=(0,L.l)(T.v_),{allowed:Se}=(0,L.l)(T.R_),Ne=Ce,{value:Re,loading:_e,error:De}=(0,r.A)(async()=>await he.getApiProduct(pe,ve),[pe,ve,he,Ie]),{value:Ue}=(0,r.A)(async()=>{var e,t,s;if(!(null==Re||null===(t=Re.spec)||void 0===t||null===(e=t.targetRef)||void 0===e?void 0:e.name))return null;const i=Re.spec.targetRef.name,n=await he.getHttpRoute(pe,i);return(null==n||null===(s=n.spec)||void 0===s?void 0:s.hostnames)||null},[Re,pe,he]),{value:ze,error:Le}=(0,r.A)(async()=>await he.getRateLimitPolicies(),[he,open]),Oe=async()=>{var e,t;if(!Re)return;const s="Published"===(null===(e=Re.spec)||void 0===e?void 0:e.publishStatus)?"Draft":"Published",i=null===(t=Re.metadata.labels)||void 0===t?void 0:t.lifecycle;if("Published"!==s||"retired"!==i)try{await he.updateApiProduct(pe,ve,{spec:{publishStatus:s}}),Ae.post({message:`API Product ${"Published"===s?"published":"unpublished"} successfully`,severity:"success",display:"transient"}),ke(e=>e+1)}catch(e){const t=e instanceof Error?e.message:"unknown error occurred";Ae.post({message:`Failed to update publish status. ${t}`,severity:"error",display:"transient"})}else Ae.post({message:"Cannot publish a retired API product. Please change the lifecycle status first.",severity:"error",display:"transient"})};if(_e)return(0,i.jsxs)(d.Y,{themeId:"tool",children:[(0,i.jsx)(c.Y,{title:"Loading..."}),(0,i.jsx)(u.U,{children:(0,i.jsx)(j.A,{p:2,children:[...Array(5)].map((e,t)=>(0,i.jsx)(j.A,{p:2,children:(0,i.jsx)(S.A,{variant:"text",width:"100%"})},t))})})]});if(De||!Re)return(0,i.jsx)(p._,{error:De||new Error("API product not found")});const Te="Published"===(null===(e=Re.spec)||void 0===e?void 0:e.publishStatus),Be=(null===(s=Re.status)||void 0===s||null===(t=s.conditions)||void 0===t?void 0:t.find(e=>"PlanPolicyDiscovered"===e.type))||null,Ee=(null===(E=Re.status)||void 0===E||null===(x=E.conditions)||void 0===x?void 0:x.find(e=>"AuthPolicyDiscovered"===e.type))||null,He={statusCondition:Be,discoveredPlans:(null===(H=Re.status)||void 0===H?void 0:H.discoveredPlans)||[]};var Ye;const $e={statusCondition:Ee,namespacedName:{name:"True"===(null==Ee?void 0:Ee.status)?(e=>{const t=e.split(" ");return t.length>=3?t[2]:""})(null!==(Ye=Ee.message)&&void 0!==Ye?Ye:""):"",namespace:Re.metadata.namespace}};if(Le)return(0,i.jsx)(p._,{error:Le});const Fe=(null==Re||null===(Y=Re.spec)||void 0===Y?void 0:Y.targetRef)?(0,O.d)(null==ze?void 0:ze.items,Re.metadata.namespace,null==Re||null===($=Re.spec)||void 0===$?void 0:$.targetRef.name):null,Ke=null==Fe||null===(K=Fe.status)||void 0===K||null===(F=K.conditions)||void 0===F?void 0:F.find(e=>"Accepted"===e.type),Me={namespacedName:{namespace:null==Fe?void 0:Fe.metadata.namespace,name:null==Fe?void 0:Fe.metadata.name},statusCondition:Ke},Ve=(null===(V=Re.status)||void 0===V||null===(M=V.discoveredAuthScheme)||void 0===M?void 0:M.authentication)||{},We=Object.values(Ve),qe=We.some(e=>e.hasOwnProperty("jwt")),Ge=We.find(e=>e.hasOwnProperty("jwt")),Je=(null==Ge||null===(W=Ge.jwt)||void 0===W?void 0:W.issuerUrl)||"unknown",Qe=(null===(G=Re.status)||void 0===G||null===(q=G.oidcDiscovery)||void 0===q?void 0:q.tokenEndpoint)||"unknown",Xe=!(!(null===(Q=Re.status)||void 0===Q||null===(J=Q.openapi)||void 0===J?void 0:J.raw)&&!(null===(Z=Re.spec)||void 0===Z||null===(X=Z.documentation)||void 0===X?void 0:X.openAPISpecURL));let Ze=0;const et=Ze++,tt=Xe?Ze++:-1,st=Ze++,it=qe?Ze++:-1;return(0,i.jsxs)(d.Y,{themeId:"tool",children:[(0,i.jsx)(c.Y,{title:(null===(ee=Re.spec)||void 0===ee?void 0:ee.displayName)||Re.metadata.name,subtitle:(null===(te=Re.spec)||void 0===te?void 0:te.description)||"",children:(0,i.jsxs)(j.A,{className:ue.actionButtons,children:[(0,i.jsx)(v.N_,{to:"/kuadrant/api-products",children:(0,i.jsx)(y.A,{startIcon:(0,i.jsx)(I.A,{}),children:"Back"})}),Ne&&(0,i.jsx)(y.A,{variant:"outlined",color:Te?"default":"primary",onClick:Oe,children:Te?"Unpublish API product":"Publish API product"}),Ce&&(0,i.jsx)(P.Ay,{title:"Edit",children:(0,i.jsx)(f.A,{onClick:()=>Pe(!0),size:"small",children:(0,i.jsx)(k.A,{})})}),Se&&(0,i.jsx)(P.Ay,{title:"Delete",children:(0,i.jsx)(f.A,{onClick:()=>ge(!0),size:"small",children:(0,i.jsx)(C.A,{})})})]})}),(0,i.jsxs)(u.U,{children:[(0,i.jsx)(j.A,{mb:2,children:(0,i.jsxs)(m.B,{"aria-label":"breadcrumb",children:[(0,i.jsx)(v.N_,{to:"/kuadrant/api-products",children:"API Products"}),(0,i.jsx)(g.A,{children:(null===(se=Re.spec)||void 0===se?void 0:se.displayName)||Re.metadata.name})]})}),"deprecated"===(null===(ie=Re.metadata.labels)||void 0===ie?void 0:ie.lifecycle)&&(0,i.jsx)(j.A,{mb:2,children:(0,i.jsxs)(N.A,{severity:"warning",children:[(0,i.jsx)("strong",{children:"This API is deprecated."})," Please contact your administrator for more details."]})}),"retired"===(null===(ne=Re.metadata.labels)||void 0===ne?void 0:ne.lifecycle)&&(0,i.jsx)(j.A,{mb:2,children:(0,i.jsxs)(N.A,{severity:"error",children:[(0,i.jsx)("strong",{children:"This API has been retired and is no longer available."})," Please contact your administrator for alternatives."]})}),(0,i.jsx)(j.A,{mb:2,children:(0,i.jsxs)(b.A,{value:xe,onChange:(e,t)=>je(t),indicatorColor:"primary",textColor:"primary",children:[(0,i.jsx)(w.A,{label:"Overview"}),Xe&&(0,i.jsx)(w.A,{label:"Definition"}),(0,i.jsx)(w.A,{label:"Policies"}),qe&&(0,i.jsx)(w.A,{label:"OIDC"})]})}),xe===et&&(0,i.jsxs)(h.n,{title:"API Product",children:[(0,i.jsxs)(j.A,{className:ue.cardHeader,children:[(0,i.jsxs)(j.A,{children:[(0,i.jsx)(g.A,{variant:"caption",className:ue.label,children:"Product Name"}),(0,i.jsx)(g.A,{variant:"h6",children:(null===(ae=Re.spec)||void 0===ae?void 0:ae.displayName)||Re.metadata.name})]}),(0,i.jsxs)(j.A,{className:ue.cardActions,children:[Ne&&(0,i.jsx)(y.A,{variant:"outlined",color:Te?"default":"primary",onClick:Oe,size:"small",children:Te?"Unpublish API product":"Publish API product"}),Ce&&(0,i.jsx)(f.A,{onClick:()=>Pe(!0),size:"small",children:(0,i.jsx)(k.A,{fontSize:"small"})}),Se&&(0,i.jsx)(f.A,{onClick:()=>ge(!0),size:"small",children:(0,i.jsx)(C.A,{fontSize:"small"})})]})]}),(0,i.jsx)(U.O,{product:Re,showStatus:!0,showCatalogLink:!0,httpRouteHostnames:Ue})]}),xe===tt&&Xe&&(0,i.jsx)(h.n,{title:"API Definition",children:(null===(oe=Re.status)||void 0===oe||null===(le=oe.openapi)||void 0===le?void 0:le.raw)?(0,i.jsx)(A.S,{definition:Re.status.openapi.raw}):(0,i.jsx)(g.A,{variant:"body2",color:"textSecondary",children:(null===(de=Re.spec)||void 0===de||null===(re=de.documentation)||void 0===re?void 0:re.openAPISpecURL)?(0,i.jsxs)(i.Fragment,{children:["OpenAPI specification not yet synced. View at:"," ",(0,i.jsx)(v.N_,{to:Re.spec.documentation.openAPISpecURL,target:"_blank",children:Re.spec.documentation.openAPISpecURL})]}):"No OpenAPI specification available for this API product."})}),xe===st&&(0,i.jsx)(h.n,{title:"Discovered Policies",children:(0,i.jsx)(D.K,{planPolicy:He,authPolicy:$e,rateLimitPolicy:Me,includeTopMargin:!1})}),xe===it&&qe&&(0,i.jsx)(z.n,{issuerUrl:Je,tokenEndpoint:Qe})]}),(0,i.jsx)(R.C,{open:ye,onClose:()=>Pe(!1),onSuccess:()=>{Pe(!1),ke(e=>e+1),Ae.post({message:"API Product updated successfully",severity:"success",display:"transient"})},namespace:pe||"",name:ve||""}),(0,i.jsx)(_.K,{open:fe,title:"Delete API Product",description:`Are you sure you want to delete "${(null===(ce=Re.spec)||void 0===ce?void 0:ce.displayName)||Re.metadata.name}"? This action cannot be undone.`,severity:"high",confirmText:Re.metadata.name,deleting:be,onConfirm:async()=>{if(Re){we(!0);try{await he.deleteApiProduct(pe,ve),ge(!1),Ae.post({message:"API Product deleted successfully",severity:"success",display:"transient"}),me("/kuadrant/api-products")}catch(e){const t=e instanceof Error?e.message:"unknown error occurred";Ae.post({message:`Failed to delete API product. ${t}`,severity:"error",display:"transient"})}finally{we(!1)}}},onCancel:()=>ge(!1)})]})}}}]);
|
|
2
|
+
//# sourceMappingURL=7791.ad31cf6d.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/7791.8f84478d.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/ApiProductDetailPage/ApiProductDetailPage.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useParams, useNavigate } from \"react-router-dom\";\nimport {\n useApi,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useAsync } from \"react-use\";\nimport {\n Header,\n Page,\n Content,\n ResponseErrorPanel,\n InfoCard,\n Link,\n Breadcrumbs,\n} from \"@backstage/core-components\";\nimport { OpenApiDefinitionWidget } from \"@backstage/plugin-api-docs\";\nimport {\n Box,\n Typography,\n IconButton,\n Tooltip,\n Tabs,\n Tab,\n Button,\n makeStyles,\n} from \"@material-ui/core\";\nimport ArrowBackIcon from \"@material-ui/icons/ArrowBack\";\nimport EditIcon from \"@material-ui/icons/Edit\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport { Alert, Skeleton } from '@material-ui/lab';\nimport { APIProduct } from \"../../types/api-management\";\nimport { EditAPIProductDialog } from \"../EditAPIProductDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { ApiProductPolicies, PlanPoliciesProps, AuthPoliciesProps, RateLimitPoliciesProps } from '../ApiProductPolicies';\nimport { ApiProductDetails } from \"../ApiProductDetails\";\nimport { OidcProviderCard } from \"../OidcProviderCard\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport { getPolicyForRoute } from '../../utils/policies';\nimport {\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductDeleteAllPermission,\n} from \"../../permissions\";\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n fontWeight: 600,\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(0.5),\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n },\n actionButtons: {\n display: \"flex\",\n gap: theme.spacing(1),\n alignItems: \"center\",\n },\n cardHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: theme.spacing(2),\n },\n cardActions: {\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n },\n}));\n\nexport const ApiProductDetailPage = () => {\n const classes = useStyles();\n const { namespace, name } = useParams<{ namespace: string; name: string }>();\n const navigate = useNavigate();\n const kuadrantApi = useApi(kuadrantApiRef);\n const alertApi = useApi(alertApiRef);\n\n const [selectedTab, setSelectedTab] = useState(0);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const { allowed: canUpdateApiProduct } = useKuadrantPermission(kuadrantApiProductUpdateAllPermission);\n const { allowed: canDeleteApiProduct } = useKuadrantPermission(kuadrantApiProductDeleteAllPermission);\n const canPublishApiProduct = canUpdateApiProduct;\n\n const {\n value: product,\n loading,\n error,\n } = useAsync(async () => {\n return await kuadrantApi.getApiProduct(namespace!, name!) as APIProduct;\n }, [namespace, name, kuadrantApi, refreshKey]);\n\n // fetch httproute to get hostnames\n const { value: httpRouteHostnames } = useAsync(async () => {\n if (!product?.spec?.targetRef?.name) {\n return null;\n }\n\n const routeName = product.spec.targetRef.name;\n const route = await kuadrantApi.getHttpRoute(namespace!, routeName)\n\n return route?.spec?.hostnames || null;\n }, [product, namespace, kuadrantApi]);\n\n // load ratelimitpolicies\n const {\n value: rateLimitPolicies,\n error: rateLimitPoliciesError\n } = useAsync(async () => {\n return await kuadrantApi.getRateLimitPolicies();\n }, [kuadrantApi, open]);\n\n const handlePublishToggle = async () => {\n if (!product) return;\n const newStatus = product.spec?.publishStatus === \"Published\" ? \"Draft\" : \"Published\";\n const lifecycle = product.metadata.labels?.lifecycle;\n\n // prevent publishing retired APIs\n if (newStatus === \"Published\" && lifecycle === \"retired\") {\n alertApi.post({\n message: `Cannot publish a retired API product. Please change the lifecycle status first.`,\n severity: \"error\",\n display: \"transient\",\n });\n return;\n }\n\n try {\n // @ts-ignore since updating partially the obj\n await kuadrantApi.updateApiProduct(namespace!, name!, { spec: { publishStatus: newStatus } });\n alertApi.post({\n message: `API Product ${newStatus === \"Published\" ? \"published\" : \"unpublished\"} successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n setRefreshKey((k) => k + 1);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to update publish status. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const handleEditSuccess = () => {\n setEditDialogOpen(false);\n setRefreshKey((k) => k + 1);\n alertApi.post({\n message: \"API Product updated successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n };\n\n const handleDelete = async () => {\n if (!product) return;\n setDeleting(true);\n try {\n await kuadrantApi.deleteApiProduct(namespace!, name!);\n setDeleteDialogOpen(false);\n alertApi.post({\n message: \"API Product deleted successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n navigate(\"/kuadrant/api-products\");\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to delete API product. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleting(false);\n }\n };\n\n if (loading) {\n return (\n <Page themeId=\"tool\">\n <Header title=\"Loading...\" />\n <Content>\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 </Content>\n </Page>\n );\n }\n\n if (error || !product) {\n return (\n <ResponseErrorPanel error={error || new Error(\"API product not found\")} />\n );\n }\n\n const isPublished = product.spec?.publishStatus === \"Published\";\n\n\n // get policy conditions from status\n const planPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"PlanPolicyDiscovered\"\n ) || null;\n const authPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"AuthPolicyDiscovered\"\n ) || null;\n const discoveredPlans = product.status?.discoveredPlans || [];\n\n const planPolicyProps: PlanPoliciesProps = {\n statusCondition: planPolicyCondition,\n discoveredPlans: discoveredPlans,\n };\n // Parse the auth policy name from the AuthPolicyDiscovered condition message\n // It's the only place to get the policy name without fetching all the policies.\n // Consider enhancing the developer portal controller to provide name in an structured way\n const parseNameFromMessage = (value: string) => {\n const parts = value.split(' ');\n return parts.length >= 3 ? parts[2] : '';\n };\n const authPolicyName = authPolicyCondition?.status === \"True\" ? parseNameFromMessage(authPolicyCondition.message ?? \"\") : \"\";\n\n const authPolicyProps: AuthPoliciesProps = {\n statusCondition: authPolicyCondition,\n namespacedName: {\n name: authPolicyName,\n namespace: product.metadata.namespace,\n },\n };\n\n\n if (rateLimitPoliciesError) {\n return (\n <ResponseErrorPanel error={rateLimitPoliciesError} />\n );\n }\n\n const selectedRateLimitPolicy = product?.spec?.targetRef\n ? getPolicyForRoute(rateLimitPolicies?.items, product.metadata.namespace, product?.spec?.targetRef.name)\n : null;\n const rateLimitPolicyAcceptedCondition = selectedRateLimitPolicy?.status?.conditions?.find(\n (c: any) => c.type === \"Accepted\"\n );\n const rateLimitPolicyProps: RateLimitPoliciesProps = {\n namespacedName: {\n namespace: selectedRateLimitPolicy?.metadata.namespace,\n name: selectedRateLimitPolicy?.metadata.name,\n },\n statusCondition: rateLimitPolicyAcceptedCondition,\n }\n\n const authSchemes = product.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const hasOIDCTab = schemeObjects.some((scheme: any) =>\n scheme.hasOwnProperty(\"jwt\"),\n );\n // Extract JWT issuer from the first JWT scheme\n const jwtScheme = schemeObjects.find((scheme: any) => scheme.hasOwnProperty(\"jwt\"));\n const jwtIssuer = (jwtScheme as any)?.jwt?.issuerUrl || \"unknown\";\n const jwtTokenEndpoint = product.status?.oidcDiscovery?.tokenEndpoint || \"unknown\";\n\n // compute tab indices\n const hasDefinitionTab = !!(product.status?.openapi?.raw || product.spec?.documentation?.openAPISpecURL);\n\n let nextIndex = 0;\n const overviewTabIndex = nextIndex++;\n const definitionTabIndex = hasDefinitionTab ? nextIndex++ : -1;\n const policiesTabIndex = nextIndex++;\n const oidcTabIndex = hasOIDCTab ? nextIndex++ : -1;\n\n return (\n <Page themeId=\"tool\">\n <Header\n title={product.spec?.displayName || product.metadata.name}\n subtitle={product.spec?.description || \"\"}\n >\n <Box className={classes.actionButtons}>\n <Link to=\"/kuadrant/api-products\">\n <Button startIcon={<ArrowBackIcon />}>Back</Button>\n </Link>\n {canPublishApiProduct && (\n <Button\n variant=\"outlined\"\n color={isPublished ? \"default\" : \"primary\"}\n onClick={handlePublishToggle}\n >\n {isPublished ? \"Unpublish API product\" : \"Publish API product\"}\n </Button>\n )}\n {canUpdateApiProduct && (\n <Tooltip title=\"Edit\">\n <IconButton onClick={() => setEditDialogOpen(true)} size=\"small\">\n <EditIcon />\n </IconButton>\n </Tooltip>\n )}\n {canDeleteApiProduct && (\n <Tooltip title=\"Delete\">\n <IconButton onClick={() => setDeleteDialogOpen(true)} size=\"small\">\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n )}\n </Box>\n </Header>\n <Content>\n <Box mb={2}>\n <Breadcrumbs aria-label=\"breadcrumb\">\n <Link to=\"/kuadrant/api-products\">API Products</Link>\n <Typography>{product.spec?.displayName || product.metadata.name}</Typography>\n </Breadcrumbs>\n </Box>\n\n\n {product.metadata.labels?.lifecycle === 'deprecated' && (\n <Box mb={2}>\n <Alert severity=\"warning\">\n <strong>This API is deprecated.</strong> Please contact your administrator for more details.\n </Alert>\n </Box>\n )}\n\n {product.metadata.labels?.lifecycle === 'retired' && (\n <Box mb={2}>\n <Alert severity=\"error\">\n <strong>This API has been retired and is no longer available.</strong> Please contact your administrator for alternatives.\n </Alert>\n </Box>\n )}\n\n <Box mb={2}>\n <Tabs\n value={selectedTab}\n onChange={(_, newValue) => setSelectedTab(newValue)}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n >\n <Tab label=\"Overview\" />\n {hasDefinitionTab && <Tab label=\"Definition\" />}\n <Tab label=\"Policies\" />\n {hasOIDCTab && <Tab label=\"OIDC\" />}\n </Tabs>\n </Box>\n\n {selectedTab === overviewTabIndex && (\n <InfoCard title=\"API Product\">\n <Box className={classes.cardHeader}>\n <Box>\n <Typography variant=\"caption\" className={classes.label}>\n Product Name\n </Typography>\n <Typography variant=\"h6\">\n {product.spec?.displayName || product.metadata.name}\n </Typography>\n </Box>\n <Box className={classes.cardActions}>\n {canPublishApiProduct && (\n <Button\n variant=\"outlined\"\n color={isPublished ? \"default\" : \"primary\"}\n onClick={handlePublishToggle}\n size=\"small\"\n >\n {isPublished ? \"Unpublish API product\" : \"Publish API product\"}\n </Button>\n )}\n {canUpdateApiProduct && (\n <IconButton onClick={() => setEditDialogOpen(true)} size=\"small\">\n <EditIcon fontSize=\"small\" />\n </IconButton>\n )}\n {canDeleteApiProduct && (\n <IconButton onClick={() => setDeleteDialogOpen(true)} size=\"small\">\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n </Box>\n\n <ApiProductDetails\n product={product}\n showStatus={true}\n showCatalogLink={true}\n httpRouteHostnames={httpRouteHostnames}\n />\n </InfoCard>\n )}\n\n {selectedTab === definitionTabIndex && hasDefinitionTab && (\n <InfoCard title=\"API Definition\">\n {product.status?.openapi?.raw ? (\n <OpenApiDefinitionWidget definition={product.status.openapi.raw} />\n ) : (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {product.spec?.documentation?.openAPISpecURL ? (\n <>\n OpenAPI specification not yet synced. View at:{\" \"}\n <Link to={product.spec.documentation.openAPISpecURL} target=\"_blank\">\n {product.spec.documentation.openAPISpecURL}\n </Link>\n </>\n ) : (\n \"No OpenAPI specification available for this API product.\"\n )}\n </Typography>\n )}\n </InfoCard>\n )}\n\n {selectedTab === policiesTabIndex && (\n <InfoCard title=\"Discovered Policies\">\n <ApiProductPolicies\n planPolicy={planPolicyProps}\n authPolicy={authPolicyProps}\n rateLimitPolicy={rateLimitPolicyProps}\n includeTopMargin={false}\n />\n </InfoCard>\n )}\n\n {selectedTab === oidcTabIndex && hasOIDCTab && (\n <OidcProviderCard\n issuerUrl={jwtIssuer}\n tokenEndpoint={jwtTokenEndpoint}\n />\n )}\n </Content>\n\n <EditAPIProductDialog\n open={editDialogOpen}\n onClose={() => setEditDialogOpen(false)}\n onSuccess={handleEditSuccess}\n namespace={namespace || \"\"}\n name={name || \"\"}\n />\n\n <ConfirmDeleteDialog\n open={deleteDialogOpen}\n title=\"Delete API Product\"\n description={`Are you sure you want to delete \"${product.spec?.displayName || product.metadata.name}\"? This action cannot be undone.`}\n severity=\"high\"\n confirmText={product.metadata.name}\n deleting={deleting}\n onConfirm={handleDelete}\n onCancel={() => setDeleteDialogOpen(false)}\n />\n </Page>\n );\n};\n"],"names":["useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","actionButtons","display","gap","alignItems","cardHeader","justifyContent","cardActions","ApiProductDetailPage","product","selectedRateLimitPolicy","classes","namespace","name","useParams","navigate","useNavigate","kuadrantApi","useApi","kuadrantApiRef","alertApi","alertApiRef","selectedTab","setSelectedTab","useState","editDialogOpen","setEditDialogOpen","deleteDialogOpen","setDeleteDialogOpen","deleting","setDeleting","refreshKey","setRefreshKey","allowed","canUpdateApiProduct","useKuadrantPermission","kuadrantApiProductUpdateAllPermission","canDeleteApiProduct","kuadrantApiProductDeleteAllPermission","canPublishApiProduct","value","loading","error","useAsync","async","getApiProduct","httpRouteHostnames","route","spec","targetRef","routeName","getHttpRoute","hostnames","rateLimitPolicies","rateLimitPoliciesError","getRateLimitPolicies","open","handlePublishToggle","newStatus","publishStatus","lifecycle","metadata","labels","updateApiProduct","post","message","severity","k","err","errorMessage","Error","Page","themeId","Header","title","Content","Box","p","Array","map","_","i","Skeleton","variant","width","ResponseErrorPanel","isPublished","planPolicyCondition","status","conditions","find","c","type","authPolicyCondition","planPolicyProps","statusCondition","discoveredPlans","authPolicyProps","namespacedName","parts","split","length","parseNameFromMessage","getPolicyForRoute","items","rateLimitPolicyAcceptedCondition","rateLimitPolicyProps","authSchemes","discoveredAuthScheme","authentication","schemeObjects","Object","values","hasOIDCTab","some","scheme","hasOwnProperty","jwtScheme","jwtIssuer","jwt","issuerUrl","jwtTokenEndpoint","oidcDiscovery","tokenEndpoint","hasDefinitionTab","openapi","raw","documentation","openAPISpecURL","nextIndex","overviewTabIndex","definitionTabIndex","policiesTabIndex","oidcTabIndex","displayName","subtitle","description","className","Link","to","Button","startIcon","ArrowBackIcon","onClick","Tooltip","IconButton","size","EditIcon","DeleteIcon","mb","Breadcrumbs","aria-label","Typography","Alert","strong","Tabs","onChange","newValue","indicatorColor","textColor","Tab","InfoCard","ApiProductDetails","showStatus","showCatalogLink","OpenApiDefinitionWidget","definition","target","ApiProductPolicies","planPolicy","authPolicy","rateLimitPolicy","includeTopMargin","OidcProviderCard","EditAPIProductDialog","onClose","onSuccess","ConfirmDeleteDialog","confirmText","onConfirm","deleteApiProduct","onCancel"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/7791.ad31cf6d.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./src/components/ApiProductDetailPage/ApiProductDetailPage.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { useParams, useNavigate } from \"react-router-dom\";\nimport {\n useApi,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useAsync } from \"react-use\";\nimport {\n Header,\n Page,\n Content,\n ResponseErrorPanel,\n InfoCard,\n Link,\n Breadcrumbs,\n} from \"@backstage/core-components\";\nimport { OpenApiDefinitionWidget } from \"@backstage/plugin-api-docs\";\nimport {\n Box,\n Typography,\n IconButton,\n Tooltip,\n Tabs,\n Tab,\n Button,\n makeStyles,\n} from \"@material-ui/core\";\nimport ArrowBackIcon from \"@material-ui/icons/ArrowBack\";\nimport EditIcon from \"@material-ui/icons/Edit\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport { Alert, Skeleton } from '@material-ui/lab';\nimport { APIProduct } from \"../../types/api-management\";\nimport { EditAPIProductDialog } from \"../EditAPIProductDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { ApiProductPolicies, PlanPoliciesProps, AuthPoliciesProps, RateLimitPoliciesProps } from '../ApiProductPolicies';\nimport { ApiProductDetails } from \"../ApiProductDetails\";\nimport { OidcProviderCard } from \"../OidcProviderCard\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport { getPolicyForRoute } from '../../utils/policies';\nimport {\n kuadrantApiProductUpdateAllPermission,\n kuadrantApiProductDeleteAllPermission,\n} from \"../../permissions\";\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n fontWeight: 600,\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(0.5),\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n },\n actionButtons: {\n display: \"flex\",\n gap: theme.spacing(1),\n alignItems: \"center\",\n },\n cardHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: theme.spacing(2),\n },\n cardActions: {\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n },\n}));\n\nexport const ApiProductDetailPage = () => {\n const classes = useStyles();\n const { namespace, name } = useParams<{ namespace: string; name: string }>();\n const navigate = useNavigate();\n const kuadrantApi = useApi(kuadrantApiRef);\n const alertApi = useApi(alertApiRef);\n\n const [selectedTab, setSelectedTab] = useState(0);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const { allowed: canUpdateApiProduct } = useKuadrantPermission(kuadrantApiProductUpdateAllPermission);\n const { allowed: canDeleteApiProduct } = useKuadrantPermission(kuadrantApiProductDeleteAllPermission);\n const canPublishApiProduct = canUpdateApiProduct;\n\n const {\n value: product,\n loading,\n error,\n } = useAsync(async () => {\n return await kuadrantApi.getApiProduct(namespace!, name!) as APIProduct;\n }, [namespace, name, kuadrantApi, refreshKey]);\n\n // fetch httproute to get hostnames\n const { value: httpRouteHostnames } = useAsync(async () => {\n if (!product?.spec?.targetRef?.name) {\n return null;\n }\n\n const routeName = product.spec.targetRef.name;\n const route = await kuadrantApi.getHttpRoute(namespace!, routeName)\n\n return route?.spec?.hostnames || null;\n }, [product, namespace, kuadrantApi]);\n\n // load ratelimitpolicies\n const {\n value: rateLimitPolicies,\n error: rateLimitPoliciesError\n } = useAsync(async () => {\n return await kuadrantApi.getRateLimitPolicies();\n }, [kuadrantApi, open]);\n\n const handlePublishToggle = async () => {\n if (!product) return;\n const newStatus = product.spec?.publishStatus === \"Published\" ? \"Draft\" : \"Published\";\n const lifecycle = product.metadata.labels?.lifecycle;\n\n // prevent publishing retired APIs\n if (newStatus === \"Published\" && lifecycle === \"retired\") {\n alertApi.post({\n message: `Cannot publish a retired API product. Please change the lifecycle status first.`,\n severity: \"error\",\n display: \"transient\",\n });\n return;\n }\n\n try {\n // @ts-ignore since updating partially the obj\n await kuadrantApi.updateApiProduct(namespace!, name!, { spec: { publishStatus: newStatus } });\n alertApi.post({\n message: `API Product ${newStatus === \"Published\" ? \"published\" : \"unpublished\"} successfully`,\n severity: \"success\",\n display: \"transient\",\n });\n setRefreshKey((k) => k + 1);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to update publish status. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n };\n\n const handleEditSuccess = () => {\n setEditDialogOpen(false);\n setRefreshKey((k) => k + 1);\n alertApi.post({\n message: \"API Product updated successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n };\n\n const handleDelete = async () => {\n if (!product) return;\n setDeleting(true);\n try {\n await kuadrantApi.deleteApiProduct(namespace!, name!);\n setDeleteDialogOpen(false);\n alertApi.post({\n message: \"API Product deleted successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n navigate(\"/kuadrant/api-products\");\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to delete API product. ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleting(false);\n }\n };\n\n if (loading) {\n return (\n <Page themeId=\"tool\">\n <Header title=\"Loading...\" />\n <Content>\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 </Content>\n </Page>\n );\n }\n\n if (error || !product) {\n return (\n <ResponseErrorPanel error={error || new Error(\"API product not found\")} />\n );\n }\n\n const isPublished = product.spec?.publishStatus === \"Published\";\n\n\n // get policy conditions from status\n const planPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"PlanPolicyDiscovered\"\n ) || null;\n const authPolicyCondition = product.status?.conditions?.find(\n (c) => c.type === \"AuthPolicyDiscovered\"\n ) || null;\n const discoveredPlans = product.status?.discoveredPlans || [];\n\n const planPolicyProps: PlanPoliciesProps = {\n statusCondition: planPolicyCondition,\n discoveredPlans: discoveredPlans,\n };\n // Parse the auth policy name from the AuthPolicyDiscovered condition message\n // It's the only place to get the policy name without fetching all the policies.\n // Consider enhancing the developer portal controller to provide name in an structured way\n const parseNameFromMessage = (value: string) => {\n const parts = value.split(' ');\n return parts.length >= 3 ? parts[2] : '';\n };\n const authPolicyName = authPolicyCondition?.status === \"True\" ? parseNameFromMessage(authPolicyCondition.message ?? \"\") : \"\";\n\n const authPolicyProps: AuthPoliciesProps = {\n statusCondition: authPolicyCondition,\n namespacedName: {\n name: authPolicyName,\n namespace: product.metadata.namespace,\n },\n };\n\n\n if (rateLimitPoliciesError) {\n return (\n <ResponseErrorPanel error={rateLimitPoliciesError} />\n );\n }\n\n const selectedRateLimitPolicy = product?.spec?.targetRef\n ? getPolicyForRoute(rateLimitPolicies?.items, product.metadata.namespace, product?.spec?.targetRef.name)\n : null;\n const rateLimitPolicyAcceptedCondition = selectedRateLimitPolicy?.status?.conditions?.find(\n (c: any) => c.type === \"Accepted\"\n );\n const rateLimitPolicyProps: RateLimitPoliciesProps = {\n namespacedName: {\n namespace: selectedRateLimitPolicy?.metadata.namespace,\n name: selectedRateLimitPolicy?.metadata.name,\n },\n statusCondition: rateLimitPolicyAcceptedCondition,\n }\n\n const authSchemes = product.status?.discoveredAuthScheme?.authentication || {};\n const schemeObjects = Object.values(authSchemes);\n const hasOIDCTab = schemeObjects.some((scheme: any) =>\n scheme.hasOwnProperty(\"jwt\"),\n );\n // Extract JWT issuer from the first JWT scheme\n const jwtScheme = schemeObjects.find((scheme: any) => scheme.hasOwnProperty(\"jwt\"));\n const jwtIssuer = (jwtScheme as any)?.jwt?.issuerUrl || \"unknown\";\n const jwtTokenEndpoint = product.status?.oidcDiscovery?.tokenEndpoint || \"unknown\";\n\n // compute tab indices\n const hasDefinitionTab = !!(product.status?.openapi?.raw || product.spec?.documentation?.openAPISpecURL);\n\n let nextIndex = 0;\n const overviewTabIndex = nextIndex++;\n const definitionTabIndex = hasDefinitionTab ? nextIndex++ : -1;\n const policiesTabIndex = nextIndex++;\n const oidcTabIndex = hasOIDCTab ? nextIndex++ : -1;\n\n return (\n <Page themeId=\"tool\">\n <Header\n title={product.spec?.displayName || product.metadata.name}\n subtitle={product.spec?.description || \"\"}\n >\n <Box className={classes.actionButtons}>\n <Link to=\"/kuadrant/api-products\">\n <Button startIcon={<ArrowBackIcon />}>Back</Button>\n </Link>\n {canPublishApiProduct && (\n <Button\n variant=\"outlined\"\n color={isPublished ? \"default\" : \"primary\"}\n onClick={handlePublishToggle}\n >\n {isPublished ? \"Unpublish API product\" : \"Publish API product\"}\n </Button>\n )}\n {canUpdateApiProduct && (\n <Tooltip title=\"Edit\">\n <IconButton onClick={() => setEditDialogOpen(true)} size=\"small\">\n <EditIcon />\n </IconButton>\n </Tooltip>\n )}\n {canDeleteApiProduct && (\n <Tooltip title=\"Delete\">\n <IconButton onClick={() => setDeleteDialogOpen(true)} size=\"small\">\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n )}\n </Box>\n </Header>\n <Content>\n <Box mb={2}>\n <Breadcrumbs aria-label=\"breadcrumb\">\n <Link to=\"/kuadrant/api-products\">API Products</Link>\n <Typography>{product.spec?.displayName || product.metadata.name}</Typography>\n </Breadcrumbs>\n </Box>\n\n\n {product.metadata.labels?.lifecycle === 'deprecated' && (\n <Box mb={2}>\n <Alert severity=\"warning\">\n <strong>This API is deprecated.</strong> Please contact your administrator for more details.\n </Alert>\n </Box>\n )}\n\n {product.metadata.labels?.lifecycle === 'retired' && (\n <Box mb={2}>\n <Alert severity=\"error\">\n <strong>This API has been retired and is no longer available.</strong> Please contact your administrator for alternatives.\n </Alert>\n </Box>\n )}\n\n <Box mb={2}>\n <Tabs\n value={selectedTab}\n onChange={(_, newValue) => setSelectedTab(newValue)}\n indicatorColor=\"primary\"\n textColor=\"primary\"\n >\n <Tab label=\"Overview\" />\n {hasDefinitionTab && <Tab label=\"Definition\" />}\n <Tab label=\"Policies\" />\n {hasOIDCTab && <Tab label=\"OIDC\" />}\n </Tabs>\n </Box>\n\n {selectedTab === overviewTabIndex && (\n <InfoCard title=\"API Product\">\n <Box className={classes.cardHeader}>\n <Box>\n <Typography variant=\"caption\" className={classes.label}>\n Product Name\n </Typography>\n <Typography variant=\"h6\">\n {product.spec?.displayName || product.metadata.name}\n </Typography>\n </Box>\n <Box className={classes.cardActions}>\n {canPublishApiProduct && (\n <Button\n variant=\"outlined\"\n color={isPublished ? \"default\" : \"primary\"}\n onClick={handlePublishToggle}\n size=\"small\"\n >\n {isPublished ? \"Unpublish API product\" : \"Publish API product\"}\n </Button>\n )}\n {canUpdateApiProduct && (\n <IconButton onClick={() => setEditDialogOpen(true)} size=\"small\">\n <EditIcon fontSize=\"small\" />\n </IconButton>\n )}\n {canDeleteApiProduct && (\n <IconButton onClick={() => setDeleteDialogOpen(true)} size=\"small\">\n <DeleteIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n </Box>\n\n <ApiProductDetails\n product={product}\n showStatus={true}\n showCatalogLink={true}\n httpRouteHostnames={httpRouteHostnames}\n />\n </InfoCard>\n )}\n\n {selectedTab === definitionTabIndex && hasDefinitionTab && (\n <InfoCard title=\"API Definition\">\n {product.status?.openapi?.raw ? (\n <OpenApiDefinitionWidget definition={product.status.openapi.raw} />\n ) : (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {product.spec?.documentation?.openAPISpecURL ? (\n <>\n OpenAPI specification not yet synced. View at:{\" \"}\n <Link to={product.spec.documentation.openAPISpecURL} target=\"_blank\">\n {product.spec.documentation.openAPISpecURL}\n </Link>\n </>\n ) : (\n \"No OpenAPI specification available for this API product.\"\n )}\n </Typography>\n )}\n </InfoCard>\n )}\n\n {selectedTab === policiesTabIndex && (\n <InfoCard title=\"Discovered Policies\">\n <ApiProductPolicies\n planPolicy={planPolicyProps}\n authPolicy={authPolicyProps}\n rateLimitPolicy={rateLimitPolicyProps}\n includeTopMargin={false}\n />\n </InfoCard>\n )}\n\n {selectedTab === oidcTabIndex && hasOIDCTab && (\n <OidcProviderCard\n issuerUrl={jwtIssuer}\n tokenEndpoint={jwtTokenEndpoint}\n />\n )}\n </Content>\n\n <EditAPIProductDialog\n open={editDialogOpen}\n onClose={() => setEditDialogOpen(false)}\n onSuccess={handleEditSuccess}\n namespace={namespace || \"\"}\n name={name || \"\"}\n />\n\n <ConfirmDeleteDialog\n open={deleteDialogOpen}\n title=\"Delete API Product\"\n description={`Are you sure you want to delete \"${product.spec?.displayName || product.metadata.name}\"? This action cannot be undone.`}\n severity=\"high\"\n confirmText={product.metadata.name}\n deleting={deleting}\n onConfirm={handleDelete}\n onCancel={() => setDeleteDialogOpen(false)}\n />\n </Page>\n );\n};\n"],"names":["useStyles","makeStyles","theme","label","fontWeight","color","palette","text","secondary","marginBottom","spacing","fontSize","textTransform","actionButtons","display","gap","alignItems","cardHeader","justifyContent","cardActions","ApiProductDetailPage","product","selectedRateLimitPolicy","classes","namespace","name","useParams","navigate","useNavigate","kuadrantApi","useApi","kuadrantApiRef","alertApi","alertApiRef","selectedTab","setSelectedTab","useState","editDialogOpen","setEditDialogOpen","deleteDialogOpen","setDeleteDialogOpen","deleting","setDeleting","refreshKey","setRefreshKey","allowed","canUpdateApiProduct","useKuadrantPermission","kuadrantApiProductUpdateAllPermission","canDeleteApiProduct","kuadrantApiProductDeleteAllPermission","canPublishApiProduct","value","loading","error","useAsync","async","getApiProduct","httpRouteHostnames","route","spec","targetRef","routeName","getHttpRoute","hostnames","rateLimitPolicies","rateLimitPoliciesError","getRateLimitPolicies","open","handlePublishToggle","newStatus","publishStatus","lifecycle","metadata","labels","updateApiProduct","post","message","severity","k","err","errorMessage","Error","Page","themeId","Header","title","Content","Box","p","Array","map","_","i","Skeleton","variant","width","ResponseErrorPanel","isPublished","planPolicyCondition","status","conditions","find","c","type","authPolicyCondition","planPolicyProps","statusCondition","discoveredPlans","authPolicyProps","namespacedName","parts","split","length","parseNameFromMessage","getPolicyForRoute","items","rateLimitPolicyAcceptedCondition","rateLimitPolicyProps","authSchemes","discoveredAuthScheme","authentication","schemeObjects","Object","values","hasOIDCTab","some","scheme","hasOwnProperty","jwtScheme","jwtIssuer","jwt","issuerUrl","jwtTokenEndpoint","oidcDiscovery","tokenEndpoint","hasDefinitionTab","openapi","raw","documentation","openAPISpecURL","nextIndex","overviewTabIndex","definitionTabIndex","policiesTabIndex","oidcTabIndex","displayName","subtitle","description","className","Link","to","Button","startIcon","ArrowBackIcon","onClick","Tooltip","IconButton","size","EditIcon","DeleteIcon","mb","Breadcrumbs","aria-label","Typography","Alert","strong","Tabs","onChange","newValue","indicatorColor","textColor","Tab","InfoCard","ApiProductDetails","showStatus","showCatalogLink","OpenApiDefinitionWidget","definition","target","ApiProductPolicies","planPolicy","authPolicy","rateLimitPolicy","includeTopMargin","OidcProviderCard","EditAPIProductDialog","onClose","onSuccess","ConfirmDeleteDialog","confirmText","onConfirm","deleteApiProduct","onCancel"],"sourceRoot":""}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
/*! For license information please see 8563.
|
|
1
|
+
/*! For license information please see 8563.6501eafb.chunk.js.LICENSE.txt */
|
|
2
2
|
(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[8563],{289:(e,t,n)=>{"use strict";n.d(t,{Y:()=>s});var r=n(31085),o=n(37976),i=n(53373),a=n.n(i);const c=(0,o.makeStyles)(e=>({root:{display:"grid",gridTemplateAreas:"'pageHeader pageHeader pageHeader' 'pageSubheader pageSubheader pageSubheader' 'pageNav pageContent pageSidebar'",gridTemplateRows:"max-content auto 1fr",gridTemplateColumns:"auto 1fr auto",overflowY:"auto",height:"100vh",[e.breakpoints.down("xs")]:{height:"100%"},"@media print":{display:"block",height:"auto",overflowY:"inherit"}}}),{name:"BackstagePage"});function s(e){const{themeId:t,className:n,children:i}=e,s=c();return(0,r.jsx)(o.ThemeProvider,{theme:e=>({...e,page:e.getPageTheme({themeId:t})}),children:(0,r.jsx)("main",{className:a()(s.root,n),children:i})})}},15831:(e,t,n)=>{"use strict";n.d(t,{Y:()=>be});var r,o,i,a,c=n(31085),s=n(22097),l=n(10394),u=n(42899),p=n(37976),f=n(71677),d=n(72501),h=n(39067),g=n.n(h),m=n(86399),y=n.n(m),b=n(79772),v=n.n(b),w=n(95478),T=n.n(w),A=n(61513),x=n.n(A),j="bodyAttributes",S="htmlAttributes",O={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},C=(Object.keys(O).map(function(e){return O[e]}),"charset"),k="cssText",E="href",L="innerHTML",P="itemprop",I="rel",N={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},B=Object.keys(N).reduce(function(e,t){return e[N[t]]=t,e},{}),R=[O.NOSCRIPT,O.SCRIPT,O.STYLE],_="data-react-helmet",M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},H=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),z=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},D=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n},F=function(e){return!1===(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},Y=function(e){var t=$(e,O.TITLE),n=$(e,"titleTemplate");if(n&&t)return n.replace(/%s/g,function(){return Array.isArray(t)?t.join(""):t});var r=$(e,"defaultTitle");return t||r||void 0},q=function(e){return $(e,"onChangeClientState")||function(){}},U=function(e,t){return t.filter(function(t){return void 0!==t[e]}).map(function(t){return t[e]}).reduce(function(e,t){return z({},e,t)},{})},W=function(e,t){return t.filter(function(e){return void 0!==e[O.BASE]}).map(function(e){return e[O.BASE]}).reverse().reduce(function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o<r.length;o++){var i=r[o].toLowerCase();if(-1!==e.indexOf(i)&&n[i])return t.concat(n)}return t},[])},V=function(e,t,n){var r={};return n.filter(function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&X("Helmet: "+e+' should be of type "Array". Instead found type "'+M(t[e])+'"'),!1)}).map(function(t){return t[e]}).reverse().reduce(function(e,n){var o={};n.filter(function(e){for(var n=void 0,i=Object.keys(e),a=0;a<i.length;a++){var c=i[a],s=c.toLowerCase();-1===t.indexOf(s)||n===I&&"canonical"===e[n].toLowerCase()||s===I&&"stylesheet"===e[s].toLowerCase()||(n=s),-1===t.indexOf(c)||c!==L&&c!==k&&c!==P||(n=c)}if(!n||!e[n])return!1;var l=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][l]&&(o[n][l]=!0,!0)}).reverse().forEach(function(t){return e.push(t)});for(var i=Object.keys(o),a=0;a<i.length;a++){var c=i[a],s=x()({},r[c],o[c]);r[c]=s}return e},[]).reverse()},$=function(e,t){for(var n=e.length-1;n>=0;n--){var r=e[n];if(r.hasOwnProperty(t))return r[t]}return null},K=(r=Date.now(),function(e){var t=Date.now();t-r>16?(r=t,e(t)):setTimeout(function(){K(e)},0)}),G=function(e){return clearTimeout(e)},J="undefined"!=typeof window?window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||K:n.g.requestAnimationFrame||K,Q="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||G:n.g.cancelAnimationFrame||G,X=function(e){return console&&"function"==typeof console.warn&&console.warn(e)},Z=null,ee=function(e,t){var n=e.baseTag,r=e.bodyAttributes,o=e.htmlAttributes,i=e.linkTags,a=e.metaTags,c=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,u=e.styleTags,p=e.title,f=e.titleAttributes;re(O.BODY,r),re(O.HTML,o),ne(p,f);var d={baseTag:oe(O.BASE,n),linkTags:oe(O.LINK,i),metaTags:oe(O.META,a),noscriptTags:oe(O.NOSCRIPT,c),scriptTags:oe(O.SCRIPT,l),styleTags:oe(O.STYLE,u)},h={},g={};Object.keys(d).forEach(function(e){var t=d[e],n=t.newTags,r=t.oldTags;n.length&&(h[e]=n),r.length&&(g[e]=d[e].oldTags)}),t&&t(),s(e,h,g)},te=function(e){return Array.isArray(e)?e.join(""):e},ne=function(e,t){void 0!==e&&document.title!==e&&(document.title=te(e)),re(O.TITLE,t)},re=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute(_),o=r?r.split(","):[],i=[].concat(o),a=Object.keys(t),c=0;c<a.length;c++){var s=a[c],l=t[s]||"";n.getAttribute(s)!==l&&n.setAttribute(s,l),-1===o.indexOf(s)&&o.push(s);var u=i.indexOf(s);-1!==u&&i.splice(u,1)}for(var p=i.length-1;p>=0;p--)n.removeAttribute(i[p]);o.length===i.length?n.removeAttribute(_):n.getAttribute(_)!==a.join(",")&&n.setAttribute(_,a.join(","))}},oe=function(e,t){var n=document.head||document.querySelector(O.HEAD),r=n.querySelectorAll(e+"["+_+"]"),o=Array.prototype.slice.call(r),i=[],a=void 0;return t&&t.length&&t.forEach(function(t){var n=document.createElement(e);for(var r in t)if(t.hasOwnProperty(r))if(r===L)n.innerHTML=t.innerHTML;else if(r===k)n.styleSheet?n.styleSheet.cssText=t.cssText:n.appendChild(document.createTextNode(t.cssText));else{var c=void 0===t[r]?"":t[r];n.setAttribute(r,c)}n.setAttribute(_,"true"),o.some(function(e,t){return a=t,n.isEqualNode(e)})?o.splice(a,1):i.push(n)}),o.forEach(function(e){return e.parentNode.removeChild(e)}),i.forEach(function(e){return n.appendChild(e)}),{oldTags:o,newTags:i}},ie=function(e){return Object.keys(e).reduce(function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r},"")},ae=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce(function(t,n){return t[N[n]||n]=e[n],t},t)},ce=function(e,t,n){switch(e){case O.TITLE:return{toComponent:function(){return e=t.title,n=t.titleAttributes,(r={key:e})[_]=!0,o=ae(n,r),[T().createElement(O.TITLE,o,e)];var e,n,r,o},toString:function(){return function(e,t,n,r){var o=ie(n),i=te(t);return o?"<"+e+" "+_+'="true" '+o+">"+F(i,r)+"</"+e+">":"<"+e+" "+_+'="true">'+F(i,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case j:case S:return{toComponent:function(){return ae(t)},toString:function(){return ie(t)}};default:return{toComponent:function(){return function(e,t){return t.map(function(t,n){var r,o=((r={key:n})[_]=!0,r);return Object.keys(t).forEach(function(e){var n=N[e]||e;if(n===L||n===k){var r=t.innerHTML||t.cssText;o.dangerouslySetInnerHTML={__html:r}}else o[n]=t[e]}),T().createElement(e,o)})}(e,t)},toString:function(){return function(e,t,n){return t.reduce(function(t,r){var o=Object.keys(r).filter(function(e){return!(e===L||e===k)}).reduce(function(e,t){var o=void 0===r[t]?t:t+'="'+F(r[t],n)+'"';return e?e+" "+o:o},""),i=r.innerHTML||r.cssText||"",a=-1===R.indexOf(e);return t+"<"+e+" "+_+'="true" '+o+(a?"/>":">"+i+"</"+e+">")},"")}(e,t,n)}}}},se=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,i=e.linkTags,a=e.metaTags,c=e.noscriptTags,s=e.scriptTags,l=e.styleTags,u=e.title,p=void 0===u?"":u,f=e.titleAttributes;return{base:ce(O.BASE,t,r),bodyAttributes:ce(j,n,r),htmlAttributes:ce(S,o,r),link:ce(O.LINK,i,r),meta:ce(O.META,a,r),noscript:ce(O.NOSCRIPT,c,r),script:ce(O.SCRIPT,s,r),style:ce(O.STYLE,l,r),title:ce(O.TITLE,{title:p,titleAttributes:f},r)}},le=y()(function(e){return{baseTag:W([E,"target"],e),bodyAttributes:U(j,e),defer:$(e,"defer"),encode:$(e,"encodeSpecialCharacters"),htmlAttributes:U(S,e),linkTags:V(O.LINK,[I,E],e),metaTags:V(O.META,["name",C,"http-equiv","property",P],e),noscriptTags:V(O.NOSCRIPT,[L],e),onChangeClientState:q(e),scriptTags:V(O.SCRIPT,["src",L],e),styleTags:V(O.STYLE,[k],e),title:Y(e),titleAttributes:U("titleAttributes",e)}},function(e){Z&&Q(Z),e.defer?Z=J(function(){ee(e,function(){Z=null})}):(ee(e),Z=null)},se)(function(){return null}),ue=(o=le,a=i=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,e.apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.shouldComponentUpdate=function(e){return!v()(this.props,e)},t.prototype.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case O.SCRIPT:case O.NOSCRIPT:return{innerHTML:t};case O.STYLE:return{cssText:t}}throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},t.prototype.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren,o=e.newChildProps,i=e.nestedChildren;return z({},r,((t={})[n.type]=[].concat(r[n.type]||[],[z({},o,this.mapNestedChildrenToProps(n,i))]),t))},t.prototype.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,i=e.newChildProps,a=e.nestedChildren;switch(r.type){case O.TITLE:return z({},o,((t={})[r.type]=a,t.titleAttributes=z({},i),t));case O.BODY:return z({},o,{bodyAttributes:z({},i)});case O.HTML:return z({},o,{htmlAttributes:z({},i)})}return z({},o,((n={})[r.type]=z({},i),n))},t.prototype.mapArrayTypeChildrenToProps=function(e,t){var n=z({},t);return Object.keys(e).forEach(function(t){var r;n=z({},n,((r={})[t]=e[t],r))}),n},t.prototype.warnOnInvalidChildren=function(e,t){return!0},t.prototype.mapChildrenToProps=function(e,t){var n=this,r={};return T().Children.forEach(e,function(e){if(e&&e.props){var o=e.props,i=o.children,a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce(function(t,n){return t[B[n]||n]=e[n],t},t)}(D(o,["children"]));switch(n.warnOnInvalidChildren(e,i),e.type){case O.LINK:case O.META:case O.NOSCRIPT:case O.SCRIPT:case O.STYLE:r=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:r,newChildProps:a,nestedChildren:i});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:a,nestedChildren:i})}}}),t=this.mapArrayTypeChildrenToProps(r,t)},t.prototype.render=function(){var e=this.props,t=e.children,n=D(e,["children"]),r=z({},n);return t&&(r=this.mapChildrenToProps(t,r)),T().createElement(o,r)},H(t,null,[{key:"canUseDOM",set:function(e){o.canUseDOM=e}}]),t}(T().Component),i.propTypes={base:g().object,bodyAttributes:g().object,children:g().oneOfType([g().arrayOf(g().node),g().node]),defaultTitle:g().string,defer:g().bool,encodeSpecialCharacters:g().bool,htmlAttributes:g().object,link:g().arrayOf(g().object),meta:g().arrayOf(g().object),noscript:g().arrayOf(g().object),onChangeClientState:g().func,script:g().arrayOf(g().object),style:g().arrayOf(g().object),title:g().string,titleAttributes:g().object,titleTemplate:g().string},i.defaultProps={defer:!0,encodeSpecialCharacters:!0},i.peek=o.peek,i.rewind=function(){var e=o.rewind();return e||(e=se({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),e},a);ue.renderStatic=ue.rewind;var pe=n(37725),fe=n(94641);(0,p.makeStyles)(e=>({root:{width:"100%",transition:"padding-left 0.1s ease-out",isolation:"isolate",[e.breakpoints.up("sm")]:{paddingLeft:e=>e.isPinned?e.sidebarConfig.drawerWidthOpen:e.sidebarConfig.drawerWidthClosed},[e.breakpoints.down("xs")]:{paddingBottom:e=>e.sidebarConfig.mobileSidebarHeight},"@media print":{padding:"0px !important"}},content:{zIndex:0,isolation:"isolate","&:focus":{outline:0}}}),{name:"BackstageSidebarPage"});const de=(0,w.createContext)({content:{contentRef:void 0}}),he=(0,p.makeStyles)(e=>({header:{gridArea:"pageHeader",padding:e.spacing(3),width:"100%",boxShadow:e.shadows[4],position:"relative",zIndex:100,display:"flex",flexDirection:"row",alignItems:"center",backgroundImage:e.page.backgroundImage,backgroundPosition:"center",backgroundSize:"cover",[e.breakpoints.down("sm")]:{flexWrap:"wrap"}},leftItemsBox:{maxWidth:"100%",flexGrow:1},rightItemsBox:{width:"auto",alignItems:"center"},title:{color:e.page.fontColor,wordBreak:"break-word",fontSize:e.typography.h3.fontSize,marginBottom:0},subtitle:{color:e.page.fontColor,opacity:.8,display:"inline-block",marginTop:e.spacing(1),maxWidth:"75ch"},type:{textTransform:"uppercase",fontSize:11,opacity:.8,marginBottom:e.spacing(1),color:e.page.fontColor},breadcrumb:{color:e.page.fontColor},breadcrumbType:{fontSize:"inherit",opacity:.7,marginRight:-e.spacing(.3),marginBottom:e.spacing(.3)},breadcrumbTitle:{fontSize:"inherit",marginLeft:-e.spacing(.3),marginBottom:e.spacing(.3)}}),{name:"BackstageHeader"}),ge=({type:e,typeLink:t,classes:n,pageTitle:r})=>e?t?(0,c.jsxs)(fe.B,{className:n.breadcrumb,children:[(0,c.jsx)(pe.N_,{to:t,children:e}),(0,c.jsx)(d.A,{children:r})]}):(0,c.jsx)(d.A,{className:n.type,children:e}):null,me=({pageTitle:e,classes:t,tooltip:n})=>{const{contentRef:r}=function(){const{content:e}=(0,w.useContext)(de);return{focusContent:(0,w.useCallback)(()=>{e?.contentRef?.current?.focus()},[e]),contentRef:e?.contentRef}}(),o=(0,c.jsx)(d.A,{ref:r,tabIndex:-1,className:t.title,variant:"h1",children:e});return n?(0,c.jsx)(f.Ay,{title:n,placement:"top-start",children:o}):o},ye=({classes:e,subtitle:t})=>t?"string"!=typeof t?(0,c.jsx)(c.Fragment,{children:t}):(0,c.jsx)(d.A,{className:e.subtitle,variant:"subtitle2",component:"span",children:t}):null;function be(e){const{children:t,pageTitleOverride:n,style:r,subtitle:o,title:i,tooltip:a,type:p,typeLink:f}=e,d=he(),h=(0,s.useApi)(s.configApiRef).getOptionalString("app.title")||"Backstage",g=n||i,m=i||n,y=`${g} | %s | ${h}`,b=`${g} | ${h}`;return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ue,{titleTemplate:y,defaultTitle:b}),(0,c.jsxs)("header",{style:r,className:d.header,children:[(0,c.jsxs)(l.A,{className:d.leftItemsBox,children:[(0,c.jsx)(ge,{classes:d,type:p,typeLink:f,pageTitle:m}),(0,c.jsx)(me,{classes:d,pageTitle:m,tooltip:a}),(0,c.jsx)(ye,{classes:d,subtitle:o})]}),(0,c.jsx)(u.A,{container:!0,className:d.rightItemsBox,spacing:4,children:t})]})]})}},37725:(e,t,n)=>{"use strict";n.d(t,{N_:()=>w});var r=n(31085),o=n(22097),i=n(49203),a=n(37976),c=n(72501),s=n(53373),l=n.n(s),u=n(45250),p=n(95478),f=n(49634),d=n(39330);const h=(0,a.makeStyles)(e=>({visuallyHidden:{clip:"rect(0 0 0 0)",clipPath:"inset(50%)",overflow:"hidden",position:"absolute",userSelect:"none",whiteSpace:"nowrap",height:1,width:1},externalLink:{position:"relative"},externalLinkIcon:{verticalAlign:"bottom",marginLeft:e.spacing(.5)}}),{name:"Link"}),g=()=>{const e=(0,o.useApp)().getSystemIcon("externalLink")||d.A,t=h();return(0,r.jsx)(e,{className:t.externalLinkIcon})},m=e=>/^([a-z+.-]+):/.test(e),y=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i,b=window.open;if(b&&!b.__backstage){const e=function(...e){const t=String(e[0]);if(y.test(t))throw new Error("Rejected window.open() with a javascript: URL as a security precaution");return b.apply(this,e)};e.__backstage=!0,window.open=e}const v=e=>e instanceof Array?e.map(v).join(" ").trim():"object"==typeof e&&e?v(e?.props?.children):["string","number"].includes(typeof e)?String(e):"",w=(0,p.forwardRef)(({onClick:e,noTrack:t,externalLinkIcon:n,...a},s)=>{const p=h(),d=(0,o.useAnalytics)(),b=function(){const[e]=(0,f.createRoutesFromChildren)((0,r.jsx)(f.Route,{index:!0,element:(0,r.jsx)("div",{})}));return!e.index}()?(e=>{let t=String(e);const n=(()=>{const e=(()=>{try{return(0,o.useApi)(o.configApiRef).getOptionalString("app.baseUrl")}catch{return}})()??"/",{pathname:t}=new URL(e,"http://sample.dev");return(0,u.trimEnd)(t,"/")})(),r=m(t),i=t.startsWith(n);return r||i||(t=n.concat(t)),t})(a.to):a.to,w=v(a.children)||b,T=m(b),A=T&&!!/^https?:/.exec(b);if(y.test(b))throw new Error("Link component rejected javascript: URL as a security precaution");const x=n=>{e?.(n),t||d.captureEvent("click",w,{attributes:{to:b}})};return T?(0,r.jsxs)(i.A,{...A?{target:"_blank",rel:"noopener"}:{},...a,...a["aria-label"]?{"aria-label":`${a["aria-label"]}, Opens in a new window`}:{},ref:s,href:b,onClick:x,className:l()(p.externalLink,a.className),children:[a.children,n&&(0,r.jsx)(g,{}),(0,r.jsx)(c.A,{component:"span",className:p.visuallyHidden,children:", Opens in a new window"})]}):(0,r.jsx)(i.A,{...a,ref:s,component:f.Link,to:b,onClick:x})})},39330:(e,t,n)=>{"use strict";var r=n(4293),o=n(78920);t.A=void 0;var i=o(n(95478)),a=(0,r(n(74044)).default)(i.createElement("path",{d:"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"}),"OpenInNew");t.A=a},46681:(e,t,n)=>{"use strict";n.d(t,{U:()=>s});var r=n(31085),o=n(37976),i=n(53373),a=n.n(i);const c=(0,o.makeStyles)(e=>({root:{gridArea:"pageContent",minWidth:0,paddingTop:e.spacing(3),paddingBottom:e.spacing(3),paddingLeft:e.spacing(2),paddingRight:e.spacing(2),[e.breakpoints.up("sm")]:{paddingLeft:e.spacing(3),paddingRight:e.spacing(3)}},stretch:{display:"flex",flexDirection:"column",flexGrow:1},noPadding:{padding:0}}),{name:"BackstageContent"});function s(e){const{className:t,stretch:n,noPadding:o,children:i,...s}=e,l=c();return(0,r.jsx)("article",{...s,className:a()(l.root,t,{[l.stretch]:n,[l.noPadding]:o}),children:i})}},61513:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,o){for(var i,a,c=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s<arguments.length;s++){for(var l in i=Object(arguments[s]))n.call(i,l)&&(c[l]=i[l]);if(t){a=t(i);for(var u=0;u<a.length;u++)r.call(i,a[u])&&(c[a[u]]=i[a[u]])}}return c}},79772:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function i(e,a){if(e===a)return!0;if(e&&a&&"object"==typeof e&&"object"==typeof a){if(e.constructor!==a.constructor)return!1;var c,s,l,u;if(Array.isArray(e)){if((c=e.length)!=a.length)return!1;for(s=c;0!==s--;)if(!i(e[s],a[s]))return!1;return!0}if(n&&e instanceof Map&&a instanceof Map){if(e.size!==a.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!a.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!i(s.value[1],a.get(s.value[0])))return!1;return!0}if(r&&e instanceof Set&&a instanceof Set){if(e.size!==a.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!a.has(s.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(a)){if((c=e.length)!=a.length)return!1;for(s=c;0!==s--;)if(e[s]!==a[s])return!1;return!0}if(e.constructor===RegExp)return e.source===a.source&&e.flags===a.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof a.valueOf)return e.valueOf()===a.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof a.toString)return e.toString()===a.toString();if((c=(l=Object.keys(e)).length)!==Object.keys(a).length)return!1;for(s=c;0!==s--;)if(!Object.prototype.hasOwnProperty.call(a,l[s]))return!1;if(t&&e instanceof Element)return!1;for(s=c;0!==s--;)if(("_owner"!==l[s]&&"__v"!==l[s]&&"__o"!==l[s]||!e.$$typeof)&&!i(e[l[s]],a[l[s]]))return!1;return!0}return e!=e&&a!=a}e.exports=function(e,t){try{return i(e,t)}catch(e){if((e.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw e}}},86399:(e,t,n)=>{"use strict";var r,o=n(95478),i=(r=o)&&"object"==typeof r&&"default"in r?r.default:r;function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=!("undefined"==typeof window||!window.document||!window.document.createElement);e.exports=function(e,t,n){if("function"!=typeof e)throw new Error("Expected reducePropsToState to be a function.");if("function"!=typeof t)throw new Error("Expected handleStateChangeOnClient to be a function.");if(void 0!==n&&"function"!=typeof n)throw new Error("Expected mapStateOnServer to either be undefined or a function.");return function(r){if("function"!=typeof r)throw new Error("Expected WrappedComponent to be a React component.");var s,l=[];function u(){s=e(l.map(function(e){return e.props})),p.canUseDOM?t(s):n&&(s=n(s))}var p=function(e){var t,n;function o(){return e.apply(this,arguments)||this}n=e,(t=o).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,o.peek=function(){return s},o.rewind=function(){if(o.canUseDOM)throw new Error("You may only call rewind() on the server. Call peek() to read the current state.");var e=s;return s=void 0,l=[],e};var a=o.prototype;return a.UNSAFE_componentWillMount=function(){l.push(this),u()},a.componentDidUpdate=function(){u()},a.componentWillUnmount=function(){var e=l.indexOf(this);l.splice(e,1),u()},a.render=function(){return i.createElement(r,this.props)},o}(o.PureComponent);return a(p,"displayName","SideEffect("+function(e){return e.displayName||e.name||"Component"}(r)+")"),a(p,"canUseDOM",c),p}}},94641:(e,t,n)=>{"use strict";n.d(t,{B:()=>g});var r=n(31085),o=n(10394),i=n(45634),a=n(58007),c=n(8109),s=n(55197),l=n(37976),u=n(72501),p=n(95478);const f=(0,l.withStyles)({root:{textDecoration:"underline",cursor:"pointer"}},{name:"BackstageBreadcrumbsClickableText"})(u.A),d=(0,l.withStyles)({root:{textDecoration:"underline",color:"inherit"}},{name:"BackstageBreadcrumbsStyledBox"})(o.A),h=(0,l.withStyles)({root:{fontStyle:"italic"}},{name:"BreadcrumbsCurrentPage"})(o.A);function g(e){const{children:t,...n}=e,[o,l]=(0,p.useState)(null),u=p.Children.toArray(t),[g,m,...y]=u,b=y.length?y.pop():u[u.length-1],v=u.length>3,w=Boolean(o);return(0,r.jsxs)(p.Fragment,{children:[(0,r.jsxs)(i.A,{"aria-label":"breadcrumb",...n,children:[u.length>1&&(0,r.jsx)(d,{clone:!0,children:g}),u.length>2&&(0,r.jsx)(d,{clone:!0,children:m}),v&&(0,r.jsx)(f,{onClick:e=>{l(e.currentTarget)},children:"..."}),(0,r.jsx)(h,{children:b})]}),(0,r.jsx)(s.Ay,{open:w,anchorEl:o,onClose:()=>{l(null)},anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},children:(0,r.jsx)(a.A,{children:y.map((e,t)=>(0,r.jsx)(c.A,{button:!0,children:(0,r.jsx)(d,{clone:!0,children:e})},t))})})]})}}}]);
|
|
3
|
-
//# sourceMappingURL=8563.
|
|
3
|
+
//# sourceMappingURL=8563.6501eafb.chunk.js.map
|