unleash-server 6.0.0 → 6.0.2
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/lib/features/feature-lifecycle/feature-lifecycle-service.d.ts.map +1 -1
- package/dist/lib/features/feature-lifecycle/feature-lifecycle-service.js +1 -1
- package/dist/lib/features/feature-lifecycle/feature-lifecycle-service.js.map +1 -1
- package/dist/lib/features/feature-lifecycle/feature-lifecycle-service.test.js +2 -2
- package/dist/lib/features/feature-lifecycle/feature-lifecycle-service.test.js.map +1 -1
- package/dist/lib/features/feature-lifecycle/feature-lifecycle.e2e.test.js +3 -3
- package/dist/lib/features/feature-lifecycle/feature-lifecycle.e2e.test.js.map +1 -1
- package/dist/lib/features/metrics/client-metrics/metrics-service-v2.d.ts +1 -1
- package/dist/lib/features/metrics/client-metrics/metrics-service-v2.d.ts.map +1 -1
- package/dist/lib/features/metrics/client-metrics/metrics-service-v2.js +2 -0
- package/dist/lib/features/metrics/client-metrics/metrics-service-v2.js.map +1 -1
- package/dist/lib/types/events.d.ts +1 -0
- package/dist/lib/types/events.d.ts.map +1 -1
- package/dist/lib/types/events.js +5 -4
- package/dist/lib/types/events.js.map +1 -1
- package/frontend/build/index.html +1 -1
- package/frontend/build/static/{AdvancedPlayground-DIV201O4.js → AdvancedPlayground-p7tDUOqb.js} +1 -1
- package/frontend/build/static/{CheckCircleOutline-DDRfoMo-.js → CheckCircleOutline-CZoWHYza.js} +1 -1
- package/frontend/build/static/{CreateProject-CP51S2Nl.js → CreateProject-DhmoT0x8.js} +1 -1
- package/frontend/build/static/{FeatureMetricsChart-C22E7CHm.js → FeatureMetricsChart-CrJhmvRS.js} +1 -1
- package/frontend/build/static/{FeatureStaleDialog-CYuAeCFM.js → FeatureStaleDialog-z-UTple3.js} +1 -1
- package/frontend/build/static/{FeatureViewLazyExport-Bk1x90Kb.js → FeatureViewLazyExport-BOJHJp48.js} +2 -2
- package/frontend/build/static/{LazyAdminExport-Bq-oujr9.js → LazyAdminExport-BfaFcAaS.js} +2 -2
- package/frontend/build/static/{LazyProjectExport-DkbRhMrD.js → LazyProjectExport-DbkNqnlj.js} +13 -13
- package/frontend/build/static/{LineChartComponent-DvXrMkk5.js → LineChartComponent-CLaoKci9.js} +1 -1
- package/frontend/build/static/{NetworkOverview-D6owvVGW.js → NetworkOverview-Cq83oqfi.js} +1 -1
- package/frontend/build/static/{NetworkTraffic-D1BTTyb9.js → NetworkTraffic-Bt6v3FUz.js} +1 -1
- package/frontend/build/static/{NetworkTrafficUsage-BzhZdcFn.js → NetworkTrafficUsage-Dv8h54l9.js} +1 -1
- package/frontend/build/static/{ProjectForm-DAM_SI2w.js → ProjectForm-CrLtsMQu.js} +1 -1
- package/frontend/build/static/{ReactJSONEditor-DDbLRmis.js → ReactJSONEditor-C-nON7ak.js} +1 -1
- package/frontend/build/static/{RoleCell-C3ZKNTZg.js → RoleCell-6hhnTvjl.js} +1 -1
- package/frontend/build/static/{StrategyItemContainer-HujAs_3i.js → StrategyItemContainer-BDY93O1W.js} +1 -1
- package/frontend/build/static/{index-C5Of-pcr.js → index-DZdOsPxT.js} +1 -1
- package/frontend/build/static/{index-CamDenZi.js → index-lGwH-xa2.js} +6 -6
- package/frontend/build/static/{unknownify-Cate6SHg.js → unknownify-D-iKcXLX.js} +1 -1
- package/frontend/build/static/{useApiTokens-DSkTQEX_.js → useApiTokens-BhaMXLXr.js} +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{ax as Vs,ay as Ns,az as _t,aA as _n,aB as re,aC as ct,j as t,s as g,aD as On,aE as Pe,r as x,aF as qs,a as lt,aG as kt,aH as Be,aI as Ws,aJ as $,aK as W,aL as Bn,aM as oe,aN as je,aO as Ln,K as ge,A as Mn,aP as Hs,k as zn,aQ as Vn,aR as Nn,aS as Us,u as qn,f as Y,ak as be,aT as Te,aU as Se,c as ne,aV as Ot,aW as ie,B as Q,T as J,C as v,a2 as Gs,n as de,v as Je,aX as Bt,aY as Wn,M as Ce,aZ as Me,a_ as ze,a$ as De,b0 as Ys,b1 as Ke,b2 as Js,b3 as we,b4 as Zt,b5 as ke,b6 as Ks,b7 as qe,b8 as Qe,b9 as Lt,ba as Ee,bb as Qs,bc as Hn,bd as me,be as Ve,bf as Un,bg as Zs,bh as Gn,bi as Yn,bj as Xs,bk as Mt,bl as en,bm as Jn,bn as Kn,bo as Qn,bp as Zn,bq as Xn,br as ea,bs as ta,bt as sa,bu as G,bv as na,bw as aa,bx as Xt,by as es,bz as Ue,bA as oa,bB as xt,bC as ra,bD as ts,bE as ia,bF as ss,bG as ca,bH as la,bI as da,bJ as ua,bK as Ze,bL as We,bM as $e,bN as pa,bO as ga,bP as Xe,bQ as tn,bR as sn,bS as zt,bT as ha,bU as Ft,bV as fa,bW as xa,bX as ya,bY as ma,bZ as ja,b_ as ba,b$ as Sa,c0 as va,c1 as Ca,c2 as wa,c3 as ns,c4 as nn,c5 as Ta,ad as et,G as Ne,L as Ea,c6 as Vt,h as Fe,c7 as as,c8 as Ra,c9 as Aa,ca as Da,cb as $a,cc as ka,cd as Fa,ce as an,cf as Ia,cg as Pa,ch as _a,ci as Oa,cj as Ba,ck as La,V as Nt,cl as on,Z as Ma,cm as qt,cn as Le,co as za,cp as ve,cq as Va,cr as Na,Y as qa,aj as Wa,cs as Ha,ct as Ua,cu as Ga,cv as Ya,cw as Ja,cx as Ka,cy as Qa,cz as Za,cA as Wt,cB as Xa,cC as dt,cD as eo,R as rn,D as ut,cE as to,cF as so,cG as no,cH as ao,cI as cn,cJ as oo,cK as ln,cL as Ae,cM as It,cN as ro,cO as dn,cP as io,cQ as co,e as lo,cR as uo,cS as yt,cT as os,aw as po,cU as Oe,cV as rs,cW as go,cX as ho,cY as fo,au as Ht,av as xo,ap as is,cZ as yo,c_ as mo,c$ as jo,d0 as cs,ac as ot,w as bo,x as So,d1 as vo,a4 as mt,ag as Co,a6 as wo,a7 as To,a8 as Eo,a9 as Ro,aa as Ao,ab as Do,d2 as $o,d3 as ls,d4 as ko,d5 as Fo,d6 as jt,d7 as Io,d8 as Po,d9 as _o,da as Oo,m as Bo,db as ds,dc as Lo,dd as Mo,de as zo,df as Vo,dg as No,dh as qo,am as Wo,di as Ho,d as Uo,dj as Go,dk as Yo,dl as Jo,dm as Ko,dn as Qo,dp as Zo}from"./index-CamDenZi.js";import{u as Xo,a as er,F as un,M as tr,C as pn,b as sr,c as nr,d as ar,V as or,e as rr,f as ir,T as cr,g as lr,h as dr,i as ur,j as pr,k as gr}from"./FeatureStaleDialog-CYuAeCFM.js";import{S as hr}from"./StrategyItemContainer-HujAs_3i.js";function fr(e){return Vs("MuiPagination",e)}Ns("MuiPagination",["root","ul","outlined","text"]);const xr=["boundaryCount","componentName","count","defaultPage","disabled","hideNextButton","hidePrevButton","onChange","page","showFirstButton","showLastButton","siblingCount"];function yr(e={}){const{boundaryCount:s=1,componentName:n="usePagination",count:a=1,defaultPage:o=1,disabled:r=!1,hideNextButton:i=!1,hidePrevButton:c=!1,onChange:l,page:d,showFirstButton:p=!1,showLastButton:f=!1,siblingCount:y=1}=e,m=_t(e,xr),[j,S]=_n({controlled:d,default:o,name:n,state:"page"}),u=(D,L)=>{d||S(L),l&&l(D,L)},h=(D,L)=>{const Z=L-D+1;return Array.from({length:Z},(ee,b)=>D+b)},C=h(1,Math.min(s,a)),I=h(Math.max(a-s+1,s+1),a),_=Math.max(Math.min(j-y,a-s-y*2-1),s+2),B=Math.min(Math.max(j+y,s+y*2+2),I.length>0?I[0]-2:a-1),k=[...p?["first"]:[],...c?[]:["previous"],...C,..._>s+2?["start-ellipsis"]:s+1<a-s?[s+1]:[],...h(_,B),...B<a-s-1?["end-ellipsis"]:a-s>s?[a-s]:[],...I,...i?[]:["next"],...f?["last"]:[]],P=D=>{switch(D){case"first":return 1;case"previous":return j-1;case"next":return j+1;case"last":return a;default:return null}},A=k.map(D=>typeof D=="number"?{onClick:L=>{u(L,D)},type:"page",page:D,selected:D===j,disabled:r,"aria-current":D===j?"true":void 0}:{onClick:L=>{u(L,P(D))},type:D,page:P(D),selected:!1,disabled:r||D.indexOf("ellipsis")===-1&&(D==="next"||D==="last"?j>=a:j<=1)});return re({items:A},m)}function mr(e){return Vs("MuiPaginationItem",e)}const jr=Ns("MuiPaginationItem",["root","page","sizeSmall","sizeLarge","text","textPrimary","textSecondary","outlined","outlinedPrimary","outlinedSecondary","rounded","ellipsis","firstLast","previousNext","focusVisible","disabled","selected","icon"]),le=jr,us=ct(t.jsx("path",{d:"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"}),"FirstPage"),ps=ct(t.jsx("path",{d:"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"}),"LastPage"),gs=ct(t.jsx("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"}),"NavigateBefore"),hs=ct(t.jsx("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"}),"NavigateNext"),br=["className","color","component","components","disabled","page","selected","shape","size","slots","type","variant"],gn=(e,s)=>{const{ownerState:n}=e;return[s.root,s[n.variant],s[`size${Be(n.size)}`],n.variant==="text"&&s[`text${Be(n.color)}`],n.variant==="outlined"&&s[`outlined${Be(n.color)}`],n.shape==="rounded"&&s.rounded,n.type==="page"&&s.page,(n.type==="start-ellipsis"||n.type==="end-ellipsis")&&s.ellipsis,(n.type==="previous"||n.type==="next")&&s.previousNext,(n.type==="first"||n.type==="last")&&s.firstLast]},Sr=e=>{const{classes:s,color:n,disabled:a,selected:o,size:r,shape:i,type:c,variant:l}=e,d={root:["root",`size${Be(r)}`,l,i,n!=="standard"&&`${l}${Be(n)}`,a&&"disabled",o&&"selected",{page:"page",first:"firstLast",last:"firstLast","start-ellipsis":"ellipsis","end-ellipsis":"ellipsis",previous:"previousNext",next:"previousNext"}[c]],icon:["icon"]};return Ws(d,mr,s)},vr=g("div",{name:"MuiPaginationItem",slot:"Root",overridesResolver:gn})(({theme:e,ownerState:s})=>re({},e.typography.body2,{borderRadius:32/2,textAlign:"center",boxSizing:"border-box",minWidth:32,padding:"0 6px",margin:"0 3px",color:(e.vars||e).palette.text.primary,height:"auto",[`&.${le.disabled}`]:{opacity:(e.vars||e).palette.action.disabledOpacity}},s.size==="small"&&{minWidth:26,borderRadius:26/2,margin:"0 1px",padding:"0 4px"},s.size==="large"&&{minWidth:40,borderRadius:40/2,padding:"0 10px",fontSize:e.typography.pxToRem(15)})),Cr=g(On,{name:"MuiPaginationItem",slot:"Root",overridesResolver:gn})(({theme:e,ownerState:s})=>re({},e.typography.body2,{borderRadius:32/2,textAlign:"center",boxSizing:"border-box",minWidth:32,height:32,padding:"0 6px",margin:"0 3px",color:(e.vars||e).palette.text.primary,[`&.${le.focusVisible}`]:{backgroundColor:(e.vars||e).palette.action.focus},[`&.${le.disabled}`]:{opacity:(e.vars||e).palette.action.disabledOpacity},transition:e.transitions.create(["color","background-color"],{duration:e.transitions.duration.short}),"&:hover":{backgroundColor:(e.vars||e).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}},[`&.${le.selected}`]:{backgroundColor:(e.vars||e).palette.action.selected,"&:hover":{backgroundColor:e.vars?`rgba(${e.vars.palette.action.selectedChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.hoverOpacity}))`:Pe(e.palette.action.selected,e.palette.action.selectedOpacity+e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:(e.vars||e).palette.action.selected}},[`&.${le.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.action.selectedChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.focusOpacity}))`:Pe(e.palette.action.selected,e.palette.action.selectedOpacity+e.palette.action.focusOpacity)},[`&.${le.disabled}`]:{opacity:1,color:(e.vars||e).palette.action.disabled,backgroundColor:(e.vars||e).palette.action.selected}}},s.size==="small"&&{minWidth:26,height:26,borderRadius:26/2,margin:"0 1px",padding:"0 4px"},s.size==="large"&&{minWidth:40,height:40,borderRadius:40/2,padding:"0 10px",fontSize:e.typography.pxToRem(15)},s.shape==="rounded"&&{borderRadius:(e.vars||e).shape.borderRadius}),({theme:e,ownerState:s})=>re({},s.variant==="text"&&{[`&.${le.selected}`]:re({},s.color!=="standard"&&{color:(e.vars||e).palette[s.color].contrastText,backgroundColor:(e.vars||e).palette[s.color].main,"&:hover":{backgroundColor:(e.vars||e).palette[s.color].dark,"@media (hover: none)":{backgroundColor:(e.vars||e).palette[s.color].main}},[`&.${le.focusVisible}`]:{backgroundColor:(e.vars||e).palette[s.color].dark}},{[`&.${le.disabled}`]:{color:(e.vars||e).palette.action.disabled}})},s.variant==="outlined"&&{border:e.vars?`1px solid rgba(${e.vars.palette.common.onBackgroundChannel} / 0.23)`:`1px solid ${e.palette.mode==="light"?"rgba(0, 0, 0, 0.23)":"rgba(255, 255, 255, 0.23)"}`,[`&.${le.selected}`]:re({},s.color!=="standard"&&{color:(e.vars||e).palette[s.color].main,border:`1px solid ${e.vars?`rgba(${e.vars.palette[s.color].mainChannel} / 0.5)`:Pe(e.palette[s.color].main,.5)}`,backgroundColor:e.vars?`rgba(${e.vars.palette[s.color].mainChannel} / ${e.vars.palette.action.activatedOpacity})`:Pe(e.palette[s.color].main,e.palette.action.activatedOpacity),"&:hover":{backgroundColor:e.vars?`rgba(${e.vars.palette[s.color].mainChannel} / calc(${e.vars.palette.action.activatedOpacity} + ${e.vars.palette.action.focusOpacity}))`:Pe(e.palette[s.color].main,e.palette.action.activatedOpacity+e.palette.action.focusOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},[`&.${le.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette[s.color].mainChannel} / calc(${e.vars.palette.action.activatedOpacity} + ${e.vars.palette.action.focusOpacity}))`:Pe(e.palette[s.color].main,e.palette.action.activatedOpacity+e.palette.action.focusOpacity)}},{[`&.${le.disabled}`]:{borderColor:(e.vars||e).palette.action.disabledBackground,color:(e.vars||e).palette.action.disabled}})})),wr=g("div",{name:"MuiPaginationItem",slot:"Icon",overridesResolver:(e,s)=>s.icon})(({theme:e,ownerState:s})=>re({fontSize:e.typography.pxToRem(20),margin:"0 -8px"},s.size==="small"&&{fontSize:e.typography.pxToRem(18)},s.size==="large"&&{fontSize:e.typography.pxToRem(22)})),Tr=x.forwardRef(function(s,n){const a=qs({props:s,name:"MuiPaginationItem"}),{className:o,color:r="standard",component:i,components:c={},disabled:l=!1,page:d,selected:p=!1,shape:f="circular",size:y="medium",slots:m={},type:j="page",variant:S="text"}=a,u=_t(a,br),h=re({},a,{color:r,disabled:l,selected:p,shape:f,size:y,type:j,variant:S}),C=lt(),I=Sr(h),B=(C.direction==="rtl"?{previous:m.next||c.next||hs,next:m.previous||c.previous||gs,last:m.first||c.first||us,first:m.last||c.last||ps}:{previous:m.previous||c.previous||gs,next:m.next||c.next||hs,first:m.first||c.first||us,last:m.last||c.last||ps})[j];return j==="start-ellipsis"||j==="end-ellipsis"?t.jsx(vr,{ref:n,ownerState:h,className:kt(I.root,o),children:"…"}):t.jsxs(Cr,re({ref:n,ownerState:h,component:i,disabled:l,className:kt(I.root,o)},u,{children:[j==="page"&&d,B?t.jsx(wr,{as:B,ownerState:h,className:I.icon}):null]}))}),Er=Tr,Rr=["boundaryCount","className","color","count","defaultPage","disabled","getItemAriaLabel","hideNextButton","hidePrevButton","onChange","page","renderItem","shape","showFirstButton","showLastButton","siblingCount","size","variant"],Ar=e=>{const{classes:s,variant:n}=e;return Ws({root:["root",n],ul:["ul"]},fr,s)},Dr=g("nav",{name:"MuiPagination",slot:"Root",overridesResolver:(e,s)=>{const{ownerState:n}=e;return[s.root,s[n.variant]]}})({}),$r=g("ul",{name:"MuiPagination",slot:"Ul",overridesResolver:(e,s)=>s.ul})({display:"flex",flexWrap:"wrap",alignItems:"center",padding:0,margin:0,listStyle:"none"});function kr(e,s,n){return e==="page"?`${n?"":"Go to "}page ${s}`:`Go to ${e} page`}const Fr=x.forwardRef(function(s,n){const a=qs({props:s,name:"MuiPagination"}),{boundaryCount:o=1,className:r,color:i="standard",count:c=1,defaultPage:l=1,disabled:d=!1,getItemAriaLabel:p=kr,hideNextButton:f=!1,hidePrevButton:y=!1,renderItem:m=A=>t.jsx(Er,re({},A)),shape:j="circular",showFirstButton:S=!1,showLastButton:u=!1,siblingCount:h=1,size:C="medium",variant:I="text"}=a,_=_t(a,Rr),{items:B}=yr(re({},a,{componentName:"Pagination"})),k=re({},a,{boundaryCount:o,color:i,count:c,defaultPage:l,disabled:d,getItemAriaLabel:p,hideNextButton:f,hidePrevButton:y,renderItem:m,shape:j,showFirstButton:S,showLastButton:u,siblingCount:h,size:C,variant:I}),P=Ar(k);return t.jsx(Dr,re({"aria-label":"pagination navigation",className:kt(P.root,r),ownerState:k,ref:n},_,{children:t.jsx($r,{className:P.ul,ownerState:k,children:B.map((A,D)=>t.jsx("li",{children:m(re({},A,{color:i,"aria-label":p(A.type,A.page,A.selected),shape:j,size:C,variant:I}))},D))})}))}),Ir=Fr,Pr=g("div")(({theme:e})=>({borderRadius:e.spacing(1.5),backgroundColor:e.palette.background.paper,padding:e.spacing(4)})),_r=()=>{const e=$("projectId"),s=$("featureId"),{feature:n}=W(e,s);return n.name?t.jsx(Pr,{children:t.jsx(Bn,{title:"Event log",feature:s,displayInline:!0})}):null},Or=g(oe)(({theme:e})=>({textDecoration:"none",color:e.palette.primary.main,fontWeight:e.fontWeight.bold})),hn=({isOpen:e,onClose:s,features:n,project:a})=>t.jsxs(je,{title:"You can't archive a feature that other features depend on",open:e,primaryButtonText:"OK",onClick:s,children:[t.jsx("p",{children:"The following features depend on your feature:"}),t.jsx("ul",{children:n.map(o=>t.jsx("li",{children:t.jsx(Or,{to:`/projects/${a}/features/${o}`,target:"_blank",rel:"noopener noreferrer",children:o})},o))})]}),Ge=g("div")({display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center"}),_e=g("div")(({theme:e})=>({justifyContent:"center",paddingTop:e.spacing(.75),...Ln})),Ye=g("span")(({theme:e})=>({color:e.palette.text.secondary,marginRight:e.spacing(1)})),Ut=g(oe)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),Br=()=>t.jsxs(ge,{severity:"warning",children:["Remember to update your Unleash client! Feature dependencies require new SDK versions. Read more about ",t.jsx(Lr,{}),"."]}),Lr=()=>t.jsx("a",{href:"https://docs.getunleash.io/reference/dependent-features#client-sdk-support",target:"_blank",rel:"noreferrer",children:"Client SDK support for feature dependencies"}),Mr=g(Mn)(({theme:e})=>({marginTop:e.spacing(2),marginBottom:e.spacing(1.5)})),zr=({project:e,parent:s,onSelect:n,selectedValues:a})=>{const{parentVariantOptions:o}=Xo(e,s),r=t.jsx(Vn,{fontSize:"small"}),i=t.jsx(Nn,{fontSize:"small"});return t.jsx(Mr,{multiple:!0,id:"parent-variant-options",options:o,disableCloseOnSelect:!0,renderOption:(c,l,{selected:d})=>t.jsxs("li",{...c,children:[t.jsx(Hs,{icon:r,checkedIcon:i,style:{marginRight:8},checked:d}),l]}),renderInput:c=>t.jsx(zn,{...c,placeholder:"Select values"}),fullWidth:!0,value:a,onChange:(c,l)=>{n(l)}})},ye={key:"none (remove dependency)",label:"none (remove dependency)"},fn=g(Us)(({theme:e})=>({marginTop:e.spacing(2),marginBottom:e.spacing(1.5)})),Vr=({onSelect:e,parentValue:s})=>t.jsx(fn,{fullWidth:!0,options:[{key:"enabled",label:"enabled"},{key:"enabled_with_variants",label:"enabled with variants"},{key:"disabled",label:"disabled"}],value:s.status,onChange:e}),xn=e=>{const{makeRequest:s,createRequest:n,errors:a,loading:o}=qn({propagateErrors:!0}),r=async(d,p)=>{const f=n(`/api/admin/projects/${e}/features/${d}/dependencies`,{method:"POST",body:JSON.stringify(p)});await s(f.caller,f.id)},i=async(d,p)=>{const f=n(`/api/admin/projects/${e}/features/${d}/dependencies/${p}`,{method:"DELETE"});await s(f.caller,f.id)},c=async d=>{const p=n(`/api/admin/projects/${e}/features/${d}/dependencies`,{method:"DELETE"});await s(p.caller,p.id)},l=[n,s,Y,e];return{addDependency:x.useCallback(r,l),removeDependency:x.useCallback(i,l),removeDependencies:x.useCallback(c,l),errors:a,loading:o}},Nr=(e,s,n,a,o)=>{const{trackEvent:r}=be(),{addChange:i}=Te(),{refetch:c}=Se(e),{setToastData:l,setToastApiError:d}=ne(),{refetchFeature:p}=W(e,s),f=Ot(e)(),{isChangeRequestConfiguredInAnyEnv:y}=ie(e),{addDependency:m,removeDependencies:j}=xn(e),S=async u=>{if(!f){console.error("No change request environment");return}u==="addDependency"&&(await i(e,f,[{action:u,feature:s,payload:{feature:n,enabled:a.status!=="disabled",variants:a.status==="enabled_with_variants"?a.variants:[]}}]),r("dependent_features",{props:{eventType:"dependency added"}})),u==="deleteDependency"&&await i(e,f,[{action:u,feature:s,payload:void 0}]),c(),l({text:u==="addDependency"?`${s} will depend on ${n}`:`${s} dependency will be removed`,type:"success",title:"Change added to a draft"})};return async()=>{try{if(y()){const u=n===ye.key?"deleteDependency":"addDependency";await S(u),r("dependent_features",{props:{eventType:u==="addDependency"?"add dependency added to change request":"delete dependency added to change request"}})}else n===ye.key?(await j(s),r("dependent_features",{props:{eventType:"dependency removed"}}),l({title:"Dependency removed",type:"success"})):(await m(s,{feature:n,enabled:a.status!=="disabled",variants:a.status==="enabled_with_variants"?a.variants:[]}),r("dependent_features",{props:{eventType:"dependency added"}}),l({title:"Dependency added",type:"success"}))}catch(u){d(Y(u))}p(),o()}},qr=({project:e,featureId:s,parent:n,onSelect:a})=>{const{parentOptions:o}=er(e,s),r=o?[ye,...o.map(i=>({key:i,label:i}))]:[ye];return t.jsx(fn,{fullWidth:!0,options:r,value:n,onChange:a})},Wr=({project:e,featureId:s,parentDependency:n,showDependencyDialogue:a,onClose:o})=>{const[r,i]=x.useState((n==null?void 0:n.feature)||ye.key),c=()=>{var h;return n?(h=n.variants)!=null&&h.length?{status:"enabled_with_variants",variants:n.variants}:n.enabled===!1?{status:"disabled"}:{status:"enabled"}:{status:"enabled"}},[l,d]=x.useState(c),p=()=>{i((n==null?void 0:n.feature)||ye.key),d(c())};x.useEffect(()=>{p()},[JSON.stringify(n)]);const f=Nr(e,s,r,l,o),{isChangeRequestConfiguredInAnyEnv:y}=ie(e),m=r!==ye.key,j=r!==ye.key&&l.status==="enabled_with_variants",S=h=>{(h==="enabled"||h==="disabled")&&d({status:h}),h==="enabled_with_variants"&&d({status:h,variants:[]})},u=h=>{d({status:"enabled_with_variants",variants:h})};return t.jsx(je,{open:a,title:"Add parent feature dependency",onClose:o,onClick:f,primaryButtonText:y()?"Add change to draft":r===ye.key?"Remove":"Add",secondaryButtonText:"Cancel",children:t.jsxs(Q,{children:[t.jsx(Br,{}),t.jsxs(Q,{sx:{mt:2,mb:4},children:["Your feature will be evaluated only when the selected parent feature is"," ",t.jsx("b",{children:l.status==="disabled"?"disabled":"enabled"})," ","in the same environment."]}),t.jsxs(J,{children:["What ",t.jsx("b",{children:"feature"})," do you want to depend on?"]}),t.jsx(v,{condition:a,show:t.jsx(qr,{project:e,featureId:s,parent:r,onSelect:h=>{d({status:"enabled"}),i(h)}})}),t.jsx(v,{condition:m,show:t.jsxs(Q,{sx:{mt:2},children:[t.jsxs(J,{children:["What ",t.jsx("b",{children:"feature status"})," do you want to depend on?"]}),t.jsx(Vr,{parentValue:l,onSelect:S})]})}),t.jsx(v,{condition:j,show:l.status==="enabled_with_variants"&&t.jsxs(Q,{sx:{mt:2},children:[t.jsxs(J,{children:["What ",t.jsx("b",{children:"variant"})," do you want to depend on?"]}),t.jsx(zr,{parent:r,project:e,selectedValues:l.variants,onSelect:u})]})})]})})},Hr=g(Gs)(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,padding:e.spacing(1,1.5)})),Ur=({feature:e,onEdit:s,onDelete:n})=>{const a=`dependency-${e}-actions`,o=`${a}-menu`,[r,i]=x.useState(null),c=!!r,l=p=>{i(p.currentTarget)},d=()=>{i(null)};return t.jsxs(Q,{children:[t.jsx(de,{title:"Dependency actions",arrow:!0,describeChild:!0,children:t.jsx(Je,{sx:{mr:.25},id:a,"aria-controls":c?o:void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,onClick:l,type:"button",children:t.jsx(Bt,{})})}),t.jsx(Hr,{id:o,anchorEl:r,open:c,onClose:d,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},disableScrollLock:!0,children:t.jsxs(Wn,{"aria-labelledby":a,children:[t.jsx(v,{condition:!0,show:t.jsxs(Ce,{onClick:()=>{s(),d()},children:[t.jsx(Me,{children:t.jsx(ze,{})}),t.jsx(De,{children:t.jsx(J,{variant:"body2",children:"Edit"})})]})}),t.jsx(v,{condition:!0,show:t.jsxs(Ce,{onClick:()=>{n(),d()},children:[t.jsx(Me,{children:t.jsx(Ys,{})}),t.jsx(De,{children:t.jsx(J,{variant:"body2",children:"Delete"})})]})})]})})]})},yn=({childFeatures:e,project:s})=>t.jsx(Ke,{tooltip:t.jsx(t.Fragment,{children:e.map(n=>t.jsx(Ut,{to:`/projects/${s}/features/${n}`,children:t.jsx("div",{children:n})},`${s}-${n}`))}),children:e.length===1?"1 feature":`${e.length} features`}),Gr=({variants:e})=>e.length===1&&e[0].length<20?t.jsx("span",{children:e[0]}):t.jsx(Ke,{tooltip:t.jsx(t.Fragment,{children:e.map(s=>t.jsx("div",{children:s}))}),children:e.length===1?"1 variant":`${e.length} variants`}),Yr=(e,s)=>{const{trackEvent:n}=be(),{addChange:a}=Te(),{refetch:o}=Se(e),{setToastData:r,setToastApiError:i}=ne(),{refetchFeature:c}=W(e,s),l=Ot(e)(),{isChangeRequestConfiguredInAnyEnv:d}=ie(e),{removeDependencies:p}=xn(e),f=async()=>{if(!l){console.error("No change request environment");return}await a(e,l,[{action:"deleteDependency",feature:s,payload:void 0}])};return async()=>{try{d()?(await f(),n("dependent_features",{props:{eventType:"delete dependency added to change request"}}),r({text:`${s} dependency will be removed`,type:"success",title:"Change added to a draft"}),await o()):(await p(s),n("dependent_features",{props:{eventType:"dependency removed"}}),r({title:"Dependency removed",type:"success"}),await c())}catch(m){i(Y(m))}}},Jr=({feature:e})=>{var d,p,f,y,m,j;const[s,n]=x.useState(!1),a=!!e.project&&e.dependencies.length===0&&e.children.length===0,o=!!e.project&&e.dependencies.length>0,r=!!e.project&&e.children.length>0,i=Ot(e.project)(),c=Js(e.project),l=Yr(e.project,e.name);return t.jsxs(t.Fragment,{children:[t.jsx(v,{condition:a,show:t.jsx(Ge,{children:t.jsxs(_e,{children:[t.jsx(Ye,{children:"Dependency:"}),t.jsx(we,{permission:Zt,projectId:e.project,variant:"text",onClick:()=>{n(!0)},children:"Add parent feature"})]})})}),t.jsx(v,{condition:o,show:t.jsxs(Ge,{children:[t.jsxs(_e,{children:[t.jsx(Ye,{children:"Dependency:"}),t.jsx(Ut,{to:`/projects/${e.project}/features/${(d=e.dependencies[0])==null?void 0:d.feature}`,children:(p=e.dependencies[0])==null?void 0:p.feature})]}),t.jsx(v,{condition:c(Zt,i),show:t.jsx(Ur,{feature:e.name,onEdit:()=>n(!0),onDelete:l})})]})}),t.jsx(v,{condition:o&&!((f=e.dependencies[0])!=null&&f.enabled),show:t.jsx(Ge,{children:t.jsxs(_e,{children:[t.jsx(Ye,{children:"Dependency value:"}),t.jsx("span",{children:"disabled"})]})})}),t.jsx(v,{condition:o&&!!((m=(y=e.dependencies[0])==null?void 0:y.variants)!=null&&m.length),show:t.jsx(Ge,{children:t.jsxs(_e,{children:[t.jsx(Ye,{children:"Dependency value:"}),t.jsx(Gr,{variants:((j=e.dependencies[0])==null?void 0:j.variants)||[]})]})})}),t.jsx(v,{condition:r,show:t.jsx(Ge,{children:t.jsxs(_e,{children:[t.jsx(Ye,{children:"Children:"}),t.jsx(yn,{childFeatures:e.children,project:e.project})]})})}),t.jsx(v,{condition:!!e.project,show:t.jsx(Wr,{project:e.project,featureId:e.name,parentDependency:e.dependencies[0],onClose:()=>n(!1),showDependencyDialogue:s})})]})},Kr=(e,s={})=>{const n=ke(`/api/admin/projects/${e}/dependencies`),{data:a,error:o}=Ks(e,!1,n,Qr,s);return{dependenciesExist:a,error:o,loading:!o&&!a}},Qr=async e=>await(await fetch(e).then(qe("Dependencies exist check"))).json(),Zr=e=>{const{dependenciesExist:s}=Kr(e),{isOss:n}=Qe();return!!e&&!!(!n()||s)},Xr=g("div")(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,backgroundColor:e.palette.background.paper,display:"flex",flexDirection:"column",maxWidth:"350px",minWidth:"350px",marginRight:e.spacing(2),[e.breakpoints.down(1e3)]:{width:"100%",maxWidth:"none",minWidth:"auto"}})),ei=g("div")({padding:"1.5rem 1.5rem 0 1.5rem"}),ti=g("div")({display:"flex",alignItems:"center"}),si=g("h2")(({theme:e})=>({fontSize:e.fontSizes.mainHeader,fontWeight:"normal",margin:0})),ni=g("div")(({theme:e})=>({margin:e.spacing(2,0),display:"flex",flexDirection:"column",fontSize:e.fontSizes.smallBody})),fs=g("div")(({theme:e})=>({})),xs=g("div")(({theme:e})=>({display:"flex",justifyContent:"space-between",padding:e.spacing(1,0)})),ys=g("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"space-between"})),ai=g("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"space-between"})),oi=g("p")({wordBreak:"break-word"}),tt=g("span")(({theme:e})=>({color:e.palette.text.secondary,marginRight:e.spacing(1)})),ri=()=>{var h;const e=$("projectId"),s=$("featureId"),{feature:n,refetchFeature:a}=W(e,s),{project:o,description:r,type:i}=n,c=Lt("featureLifecycle"),l=Ee(),[d,p]=x.useState(!1),[f,y]=x.useState(!1),{locationSettings:m}=Qs(),j=Zr(n.project),S=(h=n.environments)==null?void 0:h.map(C=>({name:C.name,lastSeenAt:C.lastSeenAt,enabled:C.enabled,yes:C.yes,no:C.no})),u=Yn(i);return t.jsxs(Xr,{children:[t.jsxs(ei,{children:[t.jsxs(ti,{"data-loading":!0,children:[t.jsx(u,{sx:C=>({marginRight:C.spacing(2),height:"40px",width:"40px",padding:C.spacing(.5),backgroundColor:C.palette.background.alternative,fill:C.palette.primary.contrastText,borderRadius:`${C.shape.borderRadiusMedium}px`})})," ",t.jsxs(si,{children:[Be(i||"")," toggle"]})]}),t.jsxs(ni,{children:[t.jsxs(xs,{"data-loading":!0,children:[t.jsx(tt,{children:"Project:"}),t.jsx("span",{children:o})]}),t.jsx(v,{condition:c&&!!n.lifecycle,show:t.jsxs(xs,{"data-loading":!0,children:[t.jsx(tt,{children:"Lifecycle:"}),t.jsx(Hn,{feature:n,onArchive:()=>p(!0),onComplete:()=>y(!0),onUncomplete:a})]})}),t.jsx(v,{condition:!!r,show:t.jsxs(fs,{"data-loading":!0,sx:{pt:1},children:[t.jsx(tt,{children:"Description:"}),t.jsxs(ys,{children:[t.jsx(oi,{children:r}),t.jsx(me,{projectId:e,permission:Ve,component:oe,to:`/projects/${e}/features/${s}/settings`,tooltipProps:{title:"Edit description"},children:t.jsx(ze,{})})]})]}),elseShow:t.jsx("div",{"data-loading":!0,children:t.jsxs(ys,{children:["No description."," ",t.jsx(me,{projectId:e,permission:Ve,component:oe,to:`/projects/${e}/features/${s}/settings`,tooltipProps:{title:"Edit description"},children:t.jsx(ze,{})})]})})}),t.jsx(fs,{children:t.jsxs(ai,{children:[t.jsxs(_e,{children:[t.jsx(tt,{children:"Created at:"}),t.jsx("span",{children:Un(Zs(n.createdAt),m.locale)})]}),t.jsx(Gn,{featureLastSeen:n.lastSeenAt,environments:S})]})}),t.jsx(v,{condition:j,show:t.jsx(Jr,{feature:n})})]})]}),t.jsx(v,{condition:n.children.length>0,show:t.jsx(hn,{features:n.children,project:e,isOpen:d,onClose:()=>p(!1)}),elseShow:t.jsx(un,{isOpen:d,onConfirm:()=>{l(`/projects/${e}`)},onClose:()=>p(!1),projectId:e,featureIds:[s]})}),t.jsx(v,{condition:!!n.project,show:t.jsx(tr,{isOpen:f,setIsOpen:y,projectId:n.project,featureId:n.name,onComplete:a})})]})},ms={lastHourUsage:[],seenApplications:[]},ii=(e,s,n={})=>{const a=async()=>{const p=ke(`api/admin/client-metrics/features/${s}`),f=await fetch(p,{method:"GET"}).then(qe("feature metrics"));return f.ok?f.json():ms},o=`${e}_${s}_metrics`,{data:r,error:i}=Xs(o,a,{...n}),[c,l]=x.useState(!i&&!r),d=()=>{Mt(o)};return x.useEffect(()=>{l(!i&&!r)},[r,i]),{metrics:r||ms,error:i,loading:c,refetch:d,FEATURE_METRICS_CACHE_KEY:o}},ci=e=>({yes:0,no:0,environment:e,timestamp:""}),li=(e,s)=>e.map(n=>s.lastHourUsage.find(o=>o.environment===n.name)||ci(n.name)),js=en.use||(e=>{if(e.status==="pending")throw e;if(e.status==="fulfilled")return e.value;throw e.status==="rejected"?e.reason:(e.status="pending",e.then(s=>{e.status="fulfilled",e.value=s},s=>{e.status="rejected",e.reason=s}),e)}),bt={dedupe:!0},di=(e,s,n)=>{const{cache:a,compare:o,suspense:r,fallbackData:i,revalidateOnMount:c,revalidateIfStale:l,refreshInterval:d,refreshWhenHidden:p,refreshWhenOffline:f,keepPreviousData:y}=n,[m,j,S,u]=ea.get(a),[h,C]=ta(e),I=x.useRef(!1),_=x.useRef(!1),B=x.useRef(h),k=x.useRef(s),P=x.useRef(n),A=()=>P.current,D=()=>A().isVisible()&&A().isOnline(),[L,Z,ee,b]=sa(a,h),E=x.useRef({}).current,w=G(i)?n.fallback[h]:i,T=(V,N)=>{for(const se in E){const U=se;if(U==="data"){if(!o(V[U],N[U])&&(!G(V[U])||!o(K,N[U])))return!1}else if(N[U]!==V[U])return!1}return!0},F=x.useMemo(()=>{const V=!h||!s?!1:G(c)?A().isPaused()||r?!1:G(l)?!0:l:c,N=ae=>{const fe=ca(ae);return delete fe._k,V?{isValidating:!0,isLoading:!0,...fe}:fe},se=L(),U=b(),ue=N(se),Ie=se===U?ue:N(U);let X=ue;return[()=>{const ae=N(L());return T(ae,X)?(X.data=ae.data,X.isLoading=ae.isLoading,X.isValidating=ae.isValidating,X.error=ae.error,X):(X=ae,ae)},()=>Ie]},[a,h]),O=na.useSyncExternalStore(x.useCallback(V=>ee(h,(N,se)=>{T(se,N)||V()}),[a,h]),F[0],F[1]),q=!I.current,M=m[h]&&m[h].length>0,z=O.data,te=G(z)?w:z,H=O.error,R=x.useRef(te),K=y?G(z)?R.current:z:te,he=M&&!G(H)?!1:q&&!G(c)?c:A().isPaused()?!1:r?G(te)?!1:l:G(te)||l,Re=!!(h&&s&&q&&he),Fn=G(O.isValidating)?Re:O.isValidating,In=G(O.isLoading)?Re:O.isLoading,He=x.useCallback(async V=>{const N=k.current;if(!h||!N||_.current||A().isPaused())return!1;let se,U,ue=!0;const Ie=V||{},X=!S[h]||!Ie.dedupe,ae=()=>ss?!_.current&&h===B.current&&I.current:h===B.current,fe={isValidating:!1,isLoading:!1},Jt=()=>{Z(fe)},Kt=()=>{const ce=S[h];ce&&ce[1]===U&&delete S[h]},Qt={isValidating:!0};G(L().data)&&(Qt.isLoading=!0);try{if(X&&(Z(Qt),n.loadingTimeout&&G(L().data)&&setTimeout(()=>{ue&&ae()&&A().onLoadingSlow(h,n)},n.loadingTimeout),S[h]=[N(C),aa()]),[se,U]=S[h],se=await se,X&&setTimeout(Kt,n.dedupingInterval),!S[h]||S[h][1]!==U)return X&&ae()&&A().onDiscarded(h),!1;fe.error=Xt;const ce=j[h];if(!G(ce)&&(U<=ce[0]||U<=ce[1]||ce[1]===0))return Jt(),X&&ae()&&A().onDiscarded(h),!1;const xe=L().data;fe.data=o(xe,se)?xe:se,X&&ae()&&A().onSuccess(se,h,n)}catch(ce){Kt();const xe=A(),{shouldRetryOnError:ht}=xe;xe.isPaused()||(fe.error=ce,X&&ae()&&(xe.onError(ce,h,xe),(ht===!0||es(ht)&&ht(ce))&&(!A().revalidateOnFocus||!A().revalidateOnReconnect||D())&&xe.onErrorRetry(ce,h,xe,Pn=>{const ft=m[h];ft&&ft[0]&&ft[0](Ue.ERROR_REVALIDATE_EVENT,Pn)},{retryCount:(Ie.retryCount||0)+1,dedupe:!0})))}return ue=!1,Jt(),!0},[h,a]),Yt=x.useCallback((...V)=>oa(a,B.current,...V),[]);if(xt(()=>{k.current=s,P.current=n,G(z)||(R.current=z)}),xt(()=>{if(!h)return;const V=He.bind(Xt,bt);let N=0;const U=ra(h,m,(ue,Ie={})=>{if(ue==Ue.FOCUS_EVENT){const X=Date.now();A().revalidateOnFocus&&X>N&&D()&&(N=X+A().focusThrottleInterval,V())}else if(ue==Ue.RECONNECT_EVENT)A().revalidateOnReconnect&&D()&&V();else{if(ue==Ue.MUTATE_EVENT)return He();if(ue==Ue.ERROR_REVALIDATE_EVENT)return He(Ie)}});return _.current=!1,B.current=h,I.current=!0,Z({_k:C}),he&&(G(te)||ts?V():ia(V)),()=>{_.current=!0,U()}},[h]),xt(()=>{let V;function N(){const U=es(d)?d(L().data):d;U&&V!==-1&&(V=setTimeout(se,U))}function se(){!L().error&&(p||A().isVisible())&&(f||A().isOnline())?He(bt).then(N):N()}return N(),()=>{V&&(clearTimeout(V),V=-1)}},[d,p,f,h]),x.useDebugValue(K),r&&G(te)&&h){if(!ss&&ts)throw new Error("Fallback data is required when using suspense in SSR.");k.current=s,P.current=n,_.current=!1;const V=u[h];if(!G(V)){const N=Yt(V);js(N)}if(G(H)){const N=He(bt);G(K)||(N.status="fulfilled",N.value=!0),js(N)}else throw H}return{mutate:Yt,get data(){return E.data=!0,K},get error(){return E.error=!0,H},get isValidating(){return E.isValidating=!0,Fn},get isLoading(){return E.isLoading=!0,In}}};Jn.defineProperty(Kn,"defaultValue",{value:Qn});const ui=Xn(di),pi=e=>(s,n,a)=>(a.revalidateOnFocus=!1,a.revalidateIfStale=!1,a.revalidateOnReconnect=!1,e(s,n,a)),gi=Zn(ui,pi),mn=(e,s)=>{const{refetchFeature:n}=W(e,s),a=la(e,s),{data:o,error:r,mutate:i}=gi(["useFeatureImmutable",a],()=>da(a)),c=x.useCallback(async()=>{await i(),await n()},[i,n]);return{feature:(o==null?void 0:o.body)||ua,refetchFeature:c,loading:!r&&!o,status:o==null?void 0:o.status,error:r}},jn=(e,s,n)=>{const{setToastData:a,setToastApiError:o}=ne(),{addChange:r}=Te(),{refetch:i}=Se(e),[c,l]=x.useState({isOpen:!1}),d=x.useCallback((j,S,u)=>{l({featureName:s,environment:j,fromEnvironment:u,strategy:S,isOpen:!0})},[]),p=x.useCallback((j,S,u)=>{l({featureName:s,environment:j,fromEnvironment:u,strategies:S,isOpen:!0})},[]),f=x.useCallback(()=>{l({isOpen:!1})},[]),y=x.useCallback(async()=>{try{await r(e,c.environment,{feature:c.featureName,action:n,payload:c.strategy}),i(),l({isOpen:!1}),a({type:"success",title:"Changes added to the draft!"})}catch(j){o(Y(j)),l({isOpen:!1})}},[r]),m=x.useCallback(async()=>{try{await Promise.all(c.strategies.map(j=>r(e,c.environment,{feature:c.featureName,action:n,payload:j}))),i(),l({isOpen:!1}),a({type:"success",title:"Changes added to the draft!"})}catch(j){o(Y(j)),l({isOpen:!1})}},[r]);return{onChangeRequestAddStrategy:d,onChangeRequestAddStrategies:p,onChangeRequestAddStrategyClose:f,onChangeRequestAddStrategyConfirm:y,onChangeRequestAddStrategiesConfirm:m,changeRequestDialogDetails:c}},hi=({payload:e,fromEnvironment:s,environment:n})=>t.jsxs(J,{children:[t.jsxs("strong",{children:["Copy ",Ze((e==null?void 0:e.name)||"")," strategy"," "]})," ","from ",s," to ",n]}),fi=({environmentId:e,environments:s,strategy:n})=>{const a=$("projectId"),o=$("featureId"),[r,i]=x.useState(null),c=!!r,{addStrategyToFeature:l}=We(),{setToastData:d,setToastApiError:p}=ne(),{refetchFeature:f}=W(a,o),{refetchFeature:y}=mn(a,o),m=()=>{i(null)},j=Js(a),{isChangeRequestConfigured:S}=ie(a),{changeRequestDialogDetails:u,onChangeRequestAddStrategyClose:h,onChangeRequestAddStrategy:C,onChangeRequestAddStrategyConfirm:I}=jn(a,o,"addStrategy"),_=async k=>{const{id:P,...A}={...n,targetEnvironment:k};if(S(k)){await C(k,{id:P,...A},e);return}try{await l(a,o,k,n),f(),y(),d({title:"Strategy created",text:`Successfully copied a strategy to ${k}`,type:"success"})}catch(D){p(Y(D))}m()},B=s.some(k=>j($e,k));return t.jsxs("div",{children:[t.jsx(pn,{isOpen:u.isOpen,onClose:h,environment:u==null?void 0:u.environment,onConfirm:I,messageComponent:t.jsx(hi,{fromEnvironment:u.fromEnvironment,payload:u.strategy})}),t.jsx(de,{title:`Copy to another environment${B?"":" (Access denied)"}`,children:t.jsx("div",{children:t.jsx(Je,{size:"large",id:`copy-strategy-icon-menu-${n.id}`,"aria-controls":c?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,onClick:k=>{i(k.currentTarget)},"data-testid":pa,disabled:!B,children:t.jsx(ga,{})})})}),t.jsx(Xe,{id:"basic-menu",anchorEl:r,open:c,onClose:m,MenuListProps:{"aria-labelledby":`copy-strategy-icon-menu-${n.id}`},children:s.map(k=>{const P=j($e,k);return t.jsx(de,{title:P?"":"You don't have access to add a strategy to this environment",children:t.jsx("div",{children:t.jsxs(Ce,{onClick:()=>_(k),disabled:!P,children:[t.jsx(v,{condition:!P,show:t.jsx(Me,{children:t.jsx(tn,{fontSize:"small"})})}),t.jsxs(De,{children:["Copy to ",k]})]})})},k)})})]})},xi=()=>t.jsx(ge,{severity:"error",children:"Removing the strategy will change which users receive access to the feature."}),yi=g("div")(({theme:e})=>({"> * + *":{marginTop:e.spacing(1)}})),mi=({changeRequests:e,projectId:s})=>e&&e.length>0?t.jsxs(ge,{severity:"warning",children:[t.jsx("p",{children:"This strategy is in use by at least one scheduled change request. If you remove it, those change requests can no longer be applied."}),t.jsx("p",{children:"The following scheduled change requests use this strategy:"}),t.jsx("ul",{children:e.map(({id:n,title:a})=>{const o=a?`#${n} (${a})`:`#${n}`;return t.jsx("li",{children:t.jsx(oe,{to:`/projects/${s}/change-requests/${n}`,target:"_blank",rel:"noopener noreferrer",title:`Change request ${n}`,children:o})},n)})})]}):e===void 0?t.jsx(ge,{severity:"warning",children:t.jsx("p",{children:"This strategy may be in use by one or more scheduled change requests. If you remove it, those change requests can no longer be applied."})}):null,bn=({scheduledChangeRequestsForStrategy:e})=>t.jsxs(yi,{children:[t.jsx(xi,{}),t.jsx(mi,{projectId:e.projectId,changeRequests:e.changeRequests})]}),ji=({onRemove:e,onClose:s,isOpen:n,scheduledChangeRequestsForStrategy:a})=>t.jsx(je,{title:"Are you sure you want to delete this strategy?",open:n,primaryButtonText:"Remove strategy",secondaryButtonText:"Cancel",onClick:e,onClose:s,children:t.jsx(bn,{scheduledChangeRequestsForStrategy:a})}),bi=g("div")(({theme:e})=>({marginTop:e.spacing(3),marginBottom:e.spacing(1)})),Si=({onRemove:e,onClose:s,isOpen:n,scheduledChangeRequestsForStrategy:a})=>t.jsxs(je,{title:"Suggest changes",open:n,primaryButtonText:"Add suggestion to draft",secondaryButtonText:"Cancel",onClick:e,onClose:s,children:[t.jsx(bn,{scheduledChangeRequestsForStrategy:a}),t.jsx(bi,{children:t.jsx(J,{variant:"body2",color:"text.secondary",children:"Your suggestion:"})}),t.jsx(J,{fontWeight:"bold",children:"Remove strategy"})]}),vi=({projectId:e,featureId:s,environmentId:n,strategyId:a})=>{const{deleteStrategyFromFeature:o}=We(),{setToastData:r,setToastApiError:i}=ne(),c=Ee(),{refetchFeature:l}=W(e,s);return async p=>{try{p.preventDefault(),await o(e,s,n,a),r({title:"Strategy deleted",type:"success"}),l(),c(zt(e,s))}catch(f){i(Y(f))}}},Ci=({projectId:e,featureId:s,environmentId:n,strategyId:a})=>{const{addChange:o}=Te(),{refetch:r}=Se(e),{setToastData:i,setToastApiError:c}=ne();return async d=>{try{d.preventDefault(),await o(e,n,{action:"deleteStrategy",feature:s,payload:{id:a}}),i({title:"Changes added to the draft!",type:"success"}),await r()}catch(p){c(Y(p))}}},wi=({projectId:e,featureId:s,environmentId:n,strategyId:a,isOpen:o,onClose:r})=>{const{isChangeRequestConfigured:i}=ie(e),{changeRequests:c}=sn(e,a),l={changeRequests:c,projectId:e},d=vi({featureId:s,projectId:e,strategyId:a,environmentId:n}),p=Ci({featureId:s,projectId:e,strategyId:a,environmentId:n});return i(n)?t.jsx(Si,{isOpen:o,onClose:()=>r(),onRemove:async f=>{await p(f),r()},scheduledChangeRequestsForStrategy:l}):t.jsx(ji,{isOpen:o,onClose:()=>r(),onRemove:d,scheduledChangeRequestsForStrategy:l})},Ti=({projectId:e,environmentId:s,featureId:n,strategy:a})=>{const{refetchFeature:o}=W(e,n),{setStrategyDisabledState:r}=We(),{setToastData:i,setToastApiError:c}=ne(),l=d=>async()=>{try{await r(e,n,s,a.id,!d),i({title:`Strategy ${d?"enabled":"disabled"}`,type:"success"}),o()}catch(p){c(Y(p))}};return{onDisable:l(!1),onEnable:l(!0)}},Ei=({projectId:e,environmentId:s,featureId:n,strategy:a})=>{const{addChange:o}=Te(),{refetch:r}=Se(e),{setToastData:i,setToastApiError:c}=ne(),l=d=>async()=>{try{await o(e,s,{action:"updateStrategy",feature:n,payload:{...a,disabled:!d}}),i({title:"Changes added to the draft!",type:"success"}),await r()}catch(p){c(Y(p))}};return{onSuggestDisable:l(!1),onSuggestEnable:l(!0)}},Ri=({isOpen:e,onClose:s,...n})=>{var m;const{projectId:a,environmentId:o}=n,{isChangeRequestConfigured:r}=ie(a),i=r(o),{onSuggestEnable:c,onSuggestDisable:l}=Ei({...n}),{onEnable:d,onDisable:p}=Ti({...n}),f=!!((m=n.strategy)!=null&&m.disabled),y=j=>{j.preventDefault(),i?f?c():l():f?d():p(),s()};return t.jsx(je,{title:i?`Add ${f?"enable":"disable"} strategy to change request?`:`Are you sure you want to ${f?"enable":"disable"} this strategy?`,open:e,primaryButtonText:i?"Add to draft":`${f?"Enable":"Disable"} strategy`,secondaryButtonText:"Cancel",onClick:y,onClose:()=>s(),children:t.jsx(v,{condition:i,show:t.jsx(ha,{environment:o}),elseShow:t.jsxs(ge,{severity:"error",children:[f?"Enabling":"Disabling"," the strategy will change which users receive access to the feature."]})})})},Ai=({projectId:e,strategy:s,featureId:n,environmentId:a})=>{const[o,r]=x.useState(null),[i,c]=x.useState(!1),[l,d]=x.useState(!1),p=!!o,f=S=>{r(S.currentTarget)},y=S=>{r(null),S.stopPropagation()},m=Ft(fa,e,a),j=Ft(xa,e,a);return t.jsxs(t.Fragment,{children:[t.jsx(Q,{sx:{display:"flex",alignItems:"center",textAlign:"center"},children:t.jsx(de,{title:"More actions",children:t.jsx(Je,{onClick:f,size:"small","aria-controls":p?"actions-menu":void 0,"aria-haspopup":"true","aria-expanded":p?"true":void 0,"data-testid":ya,children:t.jsx(Bt,{sx:{width:32,height:32}})})})}),t.jsxs(Xe,{anchorEl:o,id:"actions-menu",open:p,onClose:y,onClick:y,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},"data-testid":ma,children:[t.jsx(de,{title:s.disabled?"Enable strategy":"Disable strategy",arrow:!0,placement:"left",children:t.jsxs(Ce,{disabled:!m,onClick:()=>c(!0),children:[t.jsx(Me,{children:s.disabled?t.jsx(ja,{}):t.jsx(ba,{})}),t.jsx(De,{children:s.disabled?"Enable":"Disable"})]})}),t.jsx(de,{title:"Remove strategy",arrow:!0,placement:"left",children:t.jsxs(Ce,{disabled:!j,onClick:()=>d(!0),"data-testid":Sa,children:[t.jsx(Me,{children:t.jsx(Ys,{})}),t.jsx(De,{children:"Remove"})]})})]}),t.jsx(Ri,{isOpen:i,onClose:()=>c(!1),projectId:e,featureId:n,environmentId:a,strategy:s}),t.jsx(wi,{isOpen:l,onClose:()=>d(!1),projectId:e,featureId:n,environmentId:a,strategyId:s.id})]})},Di=({environmentId:e,strategy:s,onDragStart:n,onDragEnd:a,otherEnvironments:o,orderNumber:r,headerChildren:i})=>{const c=$("projectId"),l=$("featureId"),d=va(c,l,e,s.id);return t.jsxs(hr,{strategy:s,onDragStart:n,onDragEnd:a,orderNumber:r,actions:t.jsxs(t.Fragment,{children:[i,t.jsx(v,{condition:!!(o&&(o==null?void 0:o.length)>0),show:()=>t.jsx(fi,{environmentId:e,environments:o,strategy:s})}),t.jsx(me,{permission:Ca,environmentId:e,projectId:c,component:oe,to:d,tooltipProps:{title:"Edit strategy"},"data-testid":`STRATEGY_EDIT-${s.name}`,children:t.jsx(ze,{})}),t.jsx(Ai,{projectId:c,featureId:l,environmentId:e,strategy:s})]}),children:[t.jsx(wa,{strategy:s}),s.variants&&s.variants.length>0&&(s.disabled?t.jsx(Q,{sx:{opacity:"0.5"},children:t.jsx(ns,{variants:s.variants})}):t.jsx(ns,{variants:s.variants}))]})},$i=e=>fetch(e).then(qe("ChangeRequest")).then(s=>s.json()),Sn=(e,s)=>{const{data:n,error:a,mutate:o}=nn([],ke(`api/admin/projects/${e}/change-requests/pending/${s}`),$i);return{changeRequests:n,loading:!a&&!n,refetch:o,error:a}},ki=(e,s,n,a)=>{const{user:o}=Ta(),{changeRequests:r}=Sn(e,s),i=[],c=r==null?void 0:r.filter(l=>l.environment===n);return c==null||c.forEach(l=>{const d=l==null?void 0:l.features.find(f=>f.name===s),p=d==null?void 0:d.changes.find(f=>f.action==="updateStrategy"||f.action==="deleteStrategy"?f.payload.id===a:!1);if(p){const f=l.state==="Scheduled",y=!f&&l.createdBy.id===(o==null?void 0:o.id);f&&i.push({changeRequestId:l.id,change:p,isScheduledChange:f}),y&&i.push({changeRequestId:l.id,change:p,isScheduledChange:f})}}),i},vn=({scheduledChangeRequestIds:e})=>{const s=lt(),n=et(s.breakpoints.down("sm")),a=$("projectId");return n?null:t.jsx(Q,{sx:{mr:1.5},children:t.jsx(Ke,{tooltip:t.jsx(t.Fragment,{children:e==null?void 0:e.map((o,r)=>t.jsxs(Ut,{to:`/projects/${a}/change-requests/${o}`,children:["Change request #",o]},`${a}-${r}`))}),children:t.jsx(Ne,{color:"warning",children:"Changes Scheduled"})})})},bs=({strategy:e,index:s,environmentName:n,otherEnvironments:a,isDragging:o,onDragStartRef:r,onDragOver:i,onDragEnd:c})=>{const l=$("projectId"),d=$("featureId"),p=x.useRef(null),f=ki(l,d,n,e.id),{changeRequests:y}=sn(l,e.id);return t.jsxs(Q,{ref:p,onDragOver:i(p,s),sx:{opacity:o?"0.5":"1"},children:[t.jsx(v,{condition:s>0,show:t.jsx(Ea,{text:"OR"})}),t.jsx(Di,{strategy:e,environmentId:n,otherEnvironments:a,onDragStart:r(p,s),onDragEnd:c,orderNumber:s+1,headerChildren:Ii(f,y)})]},e.id)},Fi=({change:e})=>{const s=lt();return et(s.breakpoints.down("sm"))?null:t.jsxs(Q,{sx:{mr:1.5},children:[t.jsx(v,{condition:(e==null?void 0:e.action)==="updateStrategy",show:t.jsx(Ne,{color:"warning",children:"Modified in draft"})}),t.jsx(v,{condition:(e==null?void 0:e.action)==="deleteStrategy",show:t.jsx(Ne,{color:"error",children:"Deleted in draft"})})]})},Ii=(e,s)=>{const n=[];if((e==null?void 0:e.length)===0&&(s==null?void 0:s.length)===0)return[];const a=e==null?void 0:e.find(({isScheduledChange:o})=>!o);return a&&n.push(t.jsx(Fi,{change:a.change},`draft-change#${a.change.id}`)),s&&s.length>0&&n.push(t.jsx(vn,{scheduledChangeRequestIds:s.map(o=>o.id)},"scheduled-changes")),n},Pi=({environmentId:e,environments:s,onClick:n})=>{const a=$("projectId"),[o,r]=x.useState(null),i=!!o,{hasAccess:c}=x.useContext(Vt),l=s.some(d=>c($e,a,d));return t.jsxs("div",{children:[t.jsx(de,{title:l?"":"(Access denied)",children:t.jsx("div",{children:t.jsx(Fe,{id:`copy-all-strategies-${e}`,"aria-controls":i?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":i?"true":void 0,onClick:d=>{r(d.currentTarget)},disabled:!l,variant:"outlined",children:"Copy from another environment"})})}),t.jsx(Xe,{id:"basic-menu",anchorEl:o,open:i,onClose:()=>{r(null)},MenuListProps:{"aria-labelledby":`copy-all-strategies-${e}`},children:s.map(d=>{const p=c($e,a,d);return t.jsx(de,{title:p?"":"You don't have access to add a strategy to this environment",children:t.jsx("div",{children:t.jsxs(Ce,{onClick:()=>n(d),disabled:!p,children:[t.jsx(v,{condition:!p,show:t.jsx(Me,{children:t.jsx(tn,{fontSize:"small"})})}),t.jsxs(De,{children:["Copy from ",d]})]})})},d)})})]})},_i=g("div")(({theme:e})=>({"&>*:nth-child(n)":{margin:e.spacing(1,0)}})),Oi=({payload:e,fromEnvironment:s,environment:n})=>t.jsxs(_i,{children:[t.jsx(J,{children:t.jsx("strong",{children:"Copy: "})}),e==null?void 0:e.map(a=>t.jsxs(J,{children:[t.jsxs("strong",{children:[Ze((a==null?void 0:a.name)||"")," strategy"," "]})," "]})),t.jsxs(J,{children:["from ",s," to ",n]})]}),Bi=(e,s)=>{const n={};return s.parameters.forEach(a=>{n[a.name]=Li(e,a)}),{name:s.name,constraints:[],parameters:n}},Li=(e,s)=>s.name==="rollout"||s.name==="percentage"||s.type==="percentage"?"50":s.name==="stickiness"?"":s.name==="groupId"?e:s.type==="boolean"?"false":"",Mi=()=>{const[e,s]=x.useState(0),n=$("projectId"),a=$("featureId"),o=as("environmentId"),r=as("strategyName"),{strategy:i,defaultStrategyFallback:c}=sr(n,o),l=JSON.parse(Ra().get("defaultStrategy")||"false"),{segments:d}=Aa(),p=(d||[]).filter(H=>{var R;return(R=i==null?void 0:i.segments)==null?void 0:R.includes(H.id)}),[f,y]=x.useState({}),[m,j]=x.useState(l?p:[]),{strategyDefinition:S}=Da(r),u=$a(),{addStrategyToFeature:h,loading:C}=We(),{addChange:I}=Te(),{setToastData:_,setToastApiError:B}=ne(),{uiConfig:k}=Qe(),{unleashUrl:P}=k,A=Ee(),{feature:D,refetchFeature:L}=W(n,a),Z=x.useRef(D),{isChangeRequestConfigured:ee}=ie(n),{refetch:b}=Se(n),{trackEvent:E}=be(),{data:w,staleDataNotification:T,forceRefreshCache:F}=ka({unleashGetter:W,params:[n,a],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},D,{afterSubmitAction:L},La);x.useEffect(()=>{Z.current.name===""&&D.name&&(F(D),Z.current=D)},[D.name]),x.useEffect(()=>{var H;if(l){const R=i||c;((H=R.parameters)==null?void 0:H.groupId)===""&&a?y({...R,parameters:{...R.parameters,groupId:a}}):y(R)}else S&&y(Bi(a,S))},[a,JSON.stringify(S),JSON.stringify(i),l]);const O=async H=>{await h(n,a,o,H),_({title:"Strategy created",type:"success",confetti:!0})},q=async H=>{await I(n,o,{action:"addStrategy",feature:a,payload:H}),_({title:"Strategy added to draft",type:"success",confetti:!0}),b()},M=Fa(f,m),z=async()=>{E("strategyTitle",{props:{hasTitle:!!f.title,on:"create"}});try{ee(o)?await q(M):await O(M),L(),A(zt(n,a))}catch(H){B(Y(H))}};return!w||!w.project?null:t.jsxs(an,{modal:!0,description:Ia,documentationLink:Pa,documentationLinkLabel:_a,disablePadding:!0,formatApiCode:()=>zi(n,a,o,M,P),children:[t.jsx(Oa,{projectId:n,feature:w,strategy:f,setStrategy:y,segments:m,setSegments:j,environmentId:o,onSubmit:z,loading:C,permission:$e,errors:u,isChangeRequest:ee(o),tab:e,setTab:s,StrategyVariants:t.jsx(Ba,{strategy:f,setStrategy:y,environment:o,projectId:n,editable:!0})}),T]})},Cn=(e,s,n,a,o=!1)=>{const r=new URLSearchParams({environmentId:n,strategyName:a,defaultStrategy:String(o)});return`/projects/${e}/features/${s}/strategies/create?${r}`},zi=(e,s,n,a,o)=>{if(!o)return"";const r=`${o}/api/admin/projects/${e}/features/${s}/environments/${n}/strategies`,i=JSON.stringify(a,void 0,2);return`curl --location --request POST '${r}' \\
|
|
1
|
+
import{ax as Vs,ay as Ns,az as _t,aA as _n,aB as re,aC as ct,j as t,s as g,aD as On,aE as Pe,r as x,aF as qs,a as lt,aG as kt,aH as Be,aI as Ws,aJ as $,aK as W,aL as Bn,aM as oe,aN as je,aO as Ln,K as ge,A as Mn,aP as Hs,k as zn,aQ as Vn,aR as Nn,aS as Us,u as qn,f as Y,ak as be,aT as Te,aU as Se,c as ne,aV as Ot,aW as ie,B as Q,T as J,C as v,a2 as Gs,n as de,v as Je,aX as Bt,aY as Wn,M as Ce,aZ as Me,a_ as ze,a$ as De,b0 as Ys,b1 as Ke,b2 as Js,b3 as we,b4 as Zt,b5 as ke,b6 as Ks,b7 as qe,b8 as Qe,b9 as Lt,ba as Ee,bb as Qs,bc as Hn,bd as me,be as Ve,bf as Un,bg as Zs,bh as Gn,bi as Yn,bj as Xs,bk as Mt,bl as en,bm as Jn,bn as Kn,bo as Qn,bp as Zn,bq as Xn,br as ea,bs as ta,bt as sa,bu as G,bv as na,bw as aa,bx as Xt,by as es,bz as Ue,bA as oa,bB as xt,bC as ra,bD as ts,bE as ia,bF as ss,bG as ca,bH as la,bI as da,bJ as ua,bK as Ze,bL as We,bM as $e,bN as pa,bO as ga,bP as Xe,bQ as tn,bR as sn,bS as zt,bT as ha,bU as Ft,bV as fa,bW as xa,bX as ya,bY as ma,bZ as ja,b_ as ba,b$ as Sa,c0 as va,c1 as Ca,c2 as wa,c3 as ns,c4 as nn,c5 as Ta,ad as et,G as Ne,L as Ea,c6 as Vt,h as Fe,c7 as as,c8 as Ra,c9 as Aa,ca as Da,cb as $a,cc as ka,cd as Fa,ce as an,cf as Ia,cg as Pa,ch as _a,ci as Oa,cj as Ba,ck as La,V as Nt,cl as on,Z as Ma,cm as qt,cn as Le,co as za,cp as ve,cq as Va,cr as Na,Y as qa,aj as Wa,cs as Ha,ct as Ua,cu as Ga,cv as Ya,cw as Ja,cx as Ka,cy as Qa,cz as Za,cA as Wt,cB as Xa,cC as dt,cD as eo,R as rn,D as ut,cE as to,cF as so,cG as no,cH as ao,cI as cn,cJ as oo,cK as ln,cL as Ae,cM as It,cN as ro,cO as dn,cP as io,cQ as co,e as lo,cR as uo,cS as yt,cT as os,aw as po,cU as Oe,cV as rs,cW as go,cX as ho,cY as fo,au as Ht,av as xo,ap as is,cZ as yo,c_ as mo,c$ as jo,d0 as cs,ac as ot,w as bo,x as So,d1 as vo,a4 as mt,ag as Co,a6 as wo,a7 as To,a8 as Eo,a9 as Ro,aa as Ao,ab as Do,d2 as $o,d3 as ls,d4 as ko,d5 as Fo,d6 as jt,d7 as Io,d8 as Po,d9 as _o,da as Oo,m as Bo,db as ds,dc as Lo,dd as Mo,de as zo,df as Vo,dg as No,dh as qo,am as Wo,di as Ho,d as Uo,dj as Go,dk as Yo,dl as Jo,dm as Ko,dn as Qo,dp as Zo}from"./index-lGwH-xa2.js";import{u as Xo,a as er,F as un,M as tr,C as pn,b as sr,c as nr,d as ar,V as or,e as rr,f as ir,T as cr,g as lr,h as dr,i as ur,j as pr,k as gr}from"./FeatureStaleDialog-z-UTple3.js";import{S as hr}from"./StrategyItemContainer-BDY93O1W.js";function fr(e){return Vs("MuiPagination",e)}Ns("MuiPagination",["root","ul","outlined","text"]);const xr=["boundaryCount","componentName","count","defaultPage","disabled","hideNextButton","hidePrevButton","onChange","page","showFirstButton","showLastButton","siblingCount"];function yr(e={}){const{boundaryCount:s=1,componentName:n="usePagination",count:a=1,defaultPage:o=1,disabled:r=!1,hideNextButton:i=!1,hidePrevButton:c=!1,onChange:l,page:d,showFirstButton:p=!1,showLastButton:f=!1,siblingCount:y=1}=e,m=_t(e,xr),[j,S]=_n({controlled:d,default:o,name:n,state:"page"}),u=(D,L)=>{d||S(L),l&&l(D,L)},h=(D,L)=>{const Z=L-D+1;return Array.from({length:Z},(ee,b)=>D+b)},C=h(1,Math.min(s,a)),I=h(Math.max(a-s+1,s+1),a),_=Math.max(Math.min(j-y,a-s-y*2-1),s+2),B=Math.min(Math.max(j+y,s+y*2+2),I.length>0?I[0]-2:a-1),k=[...p?["first"]:[],...c?[]:["previous"],...C,..._>s+2?["start-ellipsis"]:s+1<a-s?[s+1]:[],...h(_,B),...B<a-s-1?["end-ellipsis"]:a-s>s?[a-s]:[],...I,...i?[]:["next"],...f?["last"]:[]],P=D=>{switch(D){case"first":return 1;case"previous":return j-1;case"next":return j+1;case"last":return a;default:return null}},A=k.map(D=>typeof D=="number"?{onClick:L=>{u(L,D)},type:"page",page:D,selected:D===j,disabled:r,"aria-current":D===j?"true":void 0}:{onClick:L=>{u(L,P(D))},type:D,page:P(D),selected:!1,disabled:r||D.indexOf("ellipsis")===-1&&(D==="next"||D==="last"?j>=a:j<=1)});return re({items:A},m)}function mr(e){return Vs("MuiPaginationItem",e)}const jr=Ns("MuiPaginationItem",["root","page","sizeSmall","sizeLarge","text","textPrimary","textSecondary","outlined","outlinedPrimary","outlinedSecondary","rounded","ellipsis","firstLast","previousNext","focusVisible","disabled","selected","icon"]),le=jr,us=ct(t.jsx("path",{d:"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"}),"FirstPage"),ps=ct(t.jsx("path",{d:"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"}),"LastPage"),gs=ct(t.jsx("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"}),"NavigateBefore"),hs=ct(t.jsx("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"}),"NavigateNext"),br=["className","color","component","components","disabled","page","selected","shape","size","slots","type","variant"],gn=(e,s)=>{const{ownerState:n}=e;return[s.root,s[n.variant],s[`size${Be(n.size)}`],n.variant==="text"&&s[`text${Be(n.color)}`],n.variant==="outlined"&&s[`outlined${Be(n.color)}`],n.shape==="rounded"&&s.rounded,n.type==="page"&&s.page,(n.type==="start-ellipsis"||n.type==="end-ellipsis")&&s.ellipsis,(n.type==="previous"||n.type==="next")&&s.previousNext,(n.type==="first"||n.type==="last")&&s.firstLast]},Sr=e=>{const{classes:s,color:n,disabled:a,selected:o,size:r,shape:i,type:c,variant:l}=e,d={root:["root",`size${Be(r)}`,l,i,n!=="standard"&&`${l}${Be(n)}`,a&&"disabled",o&&"selected",{page:"page",first:"firstLast",last:"firstLast","start-ellipsis":"ellipsis","end-ellipsis":"ellipsis",previous:"previousNext",next:"previousNext"}[c]],icon:["icon"]};return Ws(d,mr,s)},vr=g("div",{name:"MuiPaginationItem",slot:"Root",overridesResolver:gn})(({theme:e,ownerState:s})=>re({},e.typography.body2,{borderRadius:32/2,textAlign:"center",boxSizing:"border-box",minWidth:32,padding:"0 6px",margin:"0 3px",color:(e.vars||e).palette.text.primary,height:"auto",[`&.${le.disabled}`]:{opacity:(e.vars||e).palette.action.disabledOpacity}},s.size==="small"&&{minWidth:26,borderRadius:26/2,margin:"0 1px",padding:"0 4px"},s.size==="large"&&{minWidth:40,borderRadius:40/2,padding:"0 10px",fontSize:e.typography.pxToRem(15)})),Cr=g(On,{name:"MuiPaginationItem",slot:"Root",overridesResolver:gn})(({theme:e,ownerState:s})=>re({},e.typography.body2,{borderRadius:32/2,textAlign:"center",boxSizing:"border-box",minWidth:32,height:32,padding:"0 6px",margin:"0 3px",color:(e.vars||e).palette.text.primary,[`&.${le.focusVisible}`]:{backgroundColor:(e.vars||e).palette.action.focus},[`&.${le.disabled}`]:{opacity:(e.vars||e).palette.action.disabledOpacity},transition:e.transitions.create(["color","background-color"],{duration:e.transitions.duration.short}),"&:hover":{backgroundColor:(e.vars||e).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}},[`&.${le.selected}`]:{backgroundColor:(e.vars||e).palette.action.selected,"&:hover":{backgroundColor:e.vars?`rgba(${e.vars.palette.action.selectedChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.hoverOpacity}))`:Pe(e.palette.action.selected,e.palette.action.selectedOpacity+e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:(e.vars||e).palette.action.selected}},[`&.${le.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.action.selectedChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.focusOpacity}))`:Pe(e.palette.action.selected,e.palette.action.selectedOpacity+e.palette.action.focusOpacity)},[`&.${le.disabled}`]:{opacity:1,color:(e.vars||e).palette.action.disabled,backgroundColor:(e.vars||e).palette.action.selected}}},s.size==="small"&&{minWidth:26,height:26,borderRadius:26/2,margin:"0 1px",padding:"0 4px"},s.size==="large"&&{minWidth:40,height:40,borderRadius:40/2,padding:"0 10px",fontSize:e.typography.pxToRem(15)},s.shape==="rounded"&&{borderRadius:(e.vars||e).shape.borderRadius}),({theme:e,ownerState:s})=>re({},s.variant==="text"&&{[`&.${le.selected}`]:re({},s.color!=="standard"&&{color:(e.vars||e).palette[s.color].contrastText,backgroundColor:(e.vars||e).palette[s.color].main,"&:hover":{backgroundColor:(e.vars||e).palette[s.color].dark,"@media (hover: none)":{backgroundColor:(e.vars||e).palette[s.color].main}},[`&.${le.focusVisible}`]:{backgroundColor:(e.vars||e).palette[s.color].dark}},{[`&.${le.disabled}`]:{color:(e.vars||e).palette.action.disabled}})},s.variant==="outlined"&&{border:e.vars?`1px solid rgba(${e.vars.palette.common.onBackgroundChannel} / 0.23)`:`1px solid ${e.palette.mode==="light"?"rgba(0, 0, 0, 0.23)":"rgba(255, 255, 255, 0.23)"}`,[`&.${le.selected}`]:re({},s.color!=="standard"&&{color:(e.vars||e).palette[s.color].main,border:`1px solid ${e.vars?`rgba(${e.vars.palette[s.color].mainChannel} / 0.5)`:Pe(e.palette[s.color].main,.5)}`,backgroundColor:e.vars?`rgba(${e.vars.palette[s.color].mainChannel} / ${e.vars.palette.action.activatedOpacity})`:Pe(e.palette[s.color].main,e.palette.action.activatedOpacity),"&:hover":{backgroundColor:e.vars?`rgba(${e.vars.palette[s.color].mainChannel} / calc(${e.vars.palette.action.activatedOpacity} + ${e.vars.palette.action.focusOpacity}))`:Pe(e.palette[s.color].main,e.palette.action.activatedOpacity+e.palette.action.focusOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},[`&.${le.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette[s.color].mainChannel} / calc(${e.vars.palette.action.activatedOpacity} + ${e.vars.palette.action.focusOpacity}))`:Pe(e.palette[s.color].main,e.palette.action.activatedOpacity+e.palette.action.focusOpacity)}},{[`&.${le.disabled}`]:{borderColor:(e.vars||e).palette.action.disabledBackground,color:(e.vars||e).palette.action.disabled}})})),wr=g("div",{name:"MuiPaginationItem",slot:"Icon",overridesResolver:(e,s)=>s.icon})(({theme:e,ownerState:s})=>re({fontSize:e.typography.pxToRem(20),margin:"0 -8px"},s.size==="small"&&{fontSize:e.typography.pxToRem(18)},s.size==="large"&&{fontSize:e.typography.pxToRem(22)})),Tr=x.forwardRef(function(s,n){const a=qs({props:s,name:"MuiPaginationItem"}),{className:o,color:r="standard",component:i,components:c={},disabled:l=!1,page:d,selected:p=!1,shape:f="circular",size:y="medium",slots:m={},type:j="page",variant:S="text"}=a,u=_t(a,br),h=re({},a,{color:r,disabled:l,selected:p,shape:f,size:y,type:j,variant:S}),C=lt(),I=Sr(h),B=(C.direction==="rtl"?{previous:m.next||c.next||hs,next:m.previous||c.previous||gs,last:m.first||c.first||us,first:m.last||c.last||ps}:{previous:m.previous||c.previous||gs,next:m.next||c.next||hs,first:m.first||c.first||us,last:m.last||c.last||ps})[j];return j==="start-ellipsis"||j==="end-ellipsis"?t.jsx(vr,{ref:n,ownerState:h,className:kt(I.root,o),children:"…"}):t.jsxs(Cr,re({ref:n,ownerState:h,component:i,disabled:l,className:kt(I.root,o)},u,{children:[j==="page"&&d,B?t.jsx(wr,{as:B,ownerState:h,className:I.icon}):null]}))}),Er=Tr,Rr=["boundaryCount","className","color","count","defaultPage","disabled","getItemAriaLabel","hideNextButton","hidePrevButton","onChange","page","renderItem","shape","showFirstButton","showLastButton","siblingCount","size","variant"],Ar=e=>{const{classes:s,variant:n}=e;return Ws({root:["root",n],ul:["ul"]},fr,s)},Dr=g("nav",{name:"MuiPagination",slot:"Root",overridesResolver:(e,s)=>{const{ownerState:n}=e;return[s.root,s[n.variant]]}})({}),$r=g("ul",{name:"MuiPagination",slot:"Ul",overridesResolver:(e,s)=>s.ul})({display:"flex",flexWrap:"wrap",alignItems:"center",padding:0,margin:0,listStyle:"none"});function kr(e,s,n){return e==="page"?`${n?"":"Go to "}page ${s}`:`Go to ${e} page`}const Fr=x.forwardRef(function(s,n){const a=qs({props:s,name:"MuiPagination"}),{boundaryCount:o=1,className:r,color:i="standard",count:c=1,defaultPage:l=1,disabled:d=!1,getItemAriaLabel:p=kr,hideNextButton:f=!1,hidePrevButton:y=!1,renderItem:m=A=>t.jsx(Er,re({},A)),shape:j="circular",showFirstButton:S=!1,showLastButton:u=!1,siblingCount:h=1,size:C="medium",variant:I="text"}=a,_=_t(a,Rr),{items:B}=yr(re({},a,{componentName:"Pagination"})),k=re({},a,{boundaryCount:o,color:i,count:c,defaultPage:l,disabled:d,getItemAriaLabel:p,hideNextButton:f,hidePrevButton:y,renderItem:m,shape:j,showFirstButton:S,showLastButton:u,siblingCount:h,size:C,variant:I}),P=Ar(k);return t.jsx(Dr,re({"aria-label":"pagination navigation",className:kt(P.root,r),ownerState:k,ref:n},_,{children:t.jsx($r,{className:P.ul,ownerState:k,children:B.map((A,D)=>t.jsx("li",{children:m(re({},A,{color:i,"aria-label":p(A.type,A.page,A.selected),shape:j,size:C,variant:I}))},D))})}))}),Ir=Fr,Pr=g("div")(({theme:e})=>({borderRadius:e.spacing(1.5),backgroundColor:e.palette.background.paper,padding:e.spacing(4)})),_r=()=>{const e=$("projectId"),s=$("featureId"),{feature:n}=W(e,s);return n.name?t.jsx(Pr,{children:t.jsx(Bn,{title:"Event log",feature:s,displayInline:!0})}):null},Or=g(oe)(({theme:e})=>({textDecoration:"none",color:e.palette.primary.main,fontWeight:e.fontWeight.bold})),hn=({isOpen:e,onClose:s,features:n,project:a})=>t.jsxs(je,{title:"You can't archive a feature that other features depend on",open:e,primaryButtonText:"OK",onClick:s,children:[t.jsx("p",{children:"The following features depend on your feature:"}),t.jsx("ul",{children:n.map(o=>t.jsx("li",{children:t.jsx(Or,{to:`/projects/${a}/features/${o}`,target:"_blank",rel:"noopener noreferrer",children:o})},o))})]}),Ge=g("div")({display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center"}),_e=g("div")(({theme:e})=>({justifyContent:"center",paddingTop:e.spacing(.75),...Ln})),Ye=g("span")(({theme:e})=>({color:e.palette.text.secondary,marginRight:e.spacing(1)})),Ut=g(oe)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),Br=()=>t.jsxs(ge,{severity:"warning",children:["Remember to update your Unleash client! Feature dependencies require new SDK versions. Read more about ",t.jsx(Lr,{}),"."]}),Lr=()=>t.jsx("a",{href:"https://docs.getunleash.io/reference/dependent-features#client-sdk-support",target:"_blank",rel:"noreferrer",children:"Client SDK support for feature dependencies"}),Mr=g(Mn)(({theme:e})=>({marginTop:e.spacing(2),marginBottom:e.spacing(1.5)})),zr=({project:e,parent:s,onSelect:n,selectedValues:a})=>{const{parentVariantOptions:o}=Xo(e,s),r=t.jsx(Vn,{fontSize:"small"}),i=t.jsx(Nn,{fontSize:"small"});return t.jsx(Mr,{multiple:!0,id:"parent-variant-options",options:o,disableCloseOnSelect:!0,renderOption:(c,l,{selected:d})=>t.jsxs("li",{...c,children:[t.jsx(Hs,{icon:r,checkedIcon:i,style:{marginRight:8},checked:d}),l]}),renderInput:c=>t.jsx(zn,{...c,placeholder:"Select values"}),fullWidth:!0,value:a,onChange:(c,l)=>{n(l)}})},ye={key:"none (remove dependency)",label:"none (remove dependency)"},fn=g(Us)(({theme:e})=>({marginTop:e.spacing(2),marginBottom:e.spacing(1.5)})),Vr=({onSelect:e,parentValue:s})=>t.jsx(fn,{fullWidth:!0,options:[{key:"enabled",label:"enabled"},{key:"enabled_with_variants",label:"enabled with variants"},{key:"disabled",label:"disabled"}],value:s.status,onChange:e}),xn=e=>{const{makeRequest:s,createRequest:n,errors:a,loading:o}=qn({propagateErrors:!0}),r=async(d,p)=>{const f=n(`/api/admin/projects/${e}/features/${d}/dependencies`,{method:"POST",body:JSON.stringify(p)});await s(f.caller,f.id)},i=async(d,p)=>{const f=n(`/api/admin/projects/${e}/features/${d}/dependencies/${p}`,{method:"DELETE"});await s(f.caller,f.id)},c=async d=>{const p=n(`/api/admin/projects/${e}/features/${d}/dependencies`,{method:"DELETE"});await s(p.caller,p.id)},l=[n,s,Y,e];return{addDependency:x.useCallback(r,l),removeDependency:x.useCallback(i,l),removeDependencies:x.useCallback(c,l),errors:a,loading:o}},Nr=(e,s,n,a,o)=>{const{trackEvent:r}=be(),{addChange:i}=Te(),{refetch:c}=Se(e),{setToastData:l,setToastApiError:d}=ne(),{refetchFeature:p}=W(e,s),f=Ot(e)(),{isChangeRequestConfiguredInAnyEnv:y}=ie(e),{addDependency:m,removeDependencies:j}=xn(e),S=async u=>{if(!f){console.error("No change request environment");return}u==="addDependency"&&(await i(e,f,[{action:u,feature:s,payload:{feature:n,enabled:a.status!=="disabled",variants:a.status==="enabled_with_variants"?a.variants:[]}}]),r("dependent_features",{props:{eventType:"dependency added"}})),u==="deleteDependency"&&await i(e,f,[{action:u,feature:s,payload:void 0}]),c(),l({text:u==="addDependency"?`${s} will depend on ${n}`:`${s} dependency will be removed`,type:"success",title:"Change added to a draft"})};return async()=>{try{if(y()){const u=n===ye.key?"deleteDependency":"addDependency";await S(u),r("dependent_features",{props:{eventType:u==="addDependency"?"add dependency added to change request":"delete dependency added to change request"}})}else n===ye.key?(await j(s),r("dependent_features",{props:{eventType:"dependency removed"}}),l({title:"Dependency removed",type:"success"})):(await m(s,{feature:n,enabled:a.status!=="disabled",variants:a.status==="enabled_with_variants"?a.variants:[]}),r("dependent_features",{props:{eventType:"dependency added"}}),l({title:"Dependency added",type:"success"}))}catch(u){d(Y(u))}p(),o()}},qr=({project:e,featureId:s,parent:n,onSelect:a})=>{const{parentOptions:o}=er(e,s),r=o?[ye,...o.map(i=>({key:i,label:i}))]:[ye];return t.jsx(fn,{fullWidth:!0,options:r,value:n,onChange:a})},Wr=({project:e,featureId:s,parentDependency:n,showDependencyDialogue:a,onClose:o})=>{const[r,i]=x.useState((n==null?void 0:n.feature)||ye.key),c=()=>{var h;return n?(h=n.variants)!=null&&h.length?{status:"enabled_with_variants",variants:n.variants}:n.enabled===!1?{status:"disabled"}:{status:"enabled"}:{status:"enabled"}},[l,d]=x.useState(c),p=()=>{i((n==null?void 0:n.feature)||ye.key),d(c())};x.useEffect(()=>{p()},[JSON.stringify(n)]);const f=Nr(e,s,r,l,o),{isChangeRequestConfiguredInAnyEnv:y}=ie(e),m=r!==ye.key,j=r!==ye.key&&l.status==="enabled_with_variants",S=h=>{(h==="enabled"||h==="disabled")&&d({status:h}),h==="enabled_with_variants"&&d({status:h,variants:[]})},u=h=>{d({status:"enabled_with_variants",variants:h})};return t.jsx(je,{open:a,title:"Add parent feature dependency",onClose:o,onClick:f,primaryButtonText:y()?"Add change to draft":r===ye.key?"Remove":"Add",secondaryButtonText:"Cancel",children:t.jsxs(Q,{children:[t.jsx(Br,{}),t.jsxs(Q,{sx:{mt:2,mb:4},children:["Your feature will be evaluated only when the selected parent feature is"," ",t.jsx("b",{children:l.status==="disabled"?"disabled":"enabled"})," ","in the same environment."]}),t.jsxs(J,{children:["What ",t.jsx("b",{children:"feature"})," do you want to depend on?"]}),t.jsx(v,{condition:a,show:t.jsx(qr,{project:e,featureId:s,parent:r,onSelect:h=>{d({status:"enabled"}),i(h)}})}),t.jsx(v,{condition:m,show:t.jsxs(Q,{sx:{mt:2},children:[t.jsxs(J,{children:["What ",t.jsx("b",{children:"feature status"})," do you want to depend on?"]}),t.jsx(Vr,{parentValue:l,onSelect:S})]})}),t.jsx(v,{condition:j,show:l.status==="enabled_with_variants"&&t.jsxs(Q,{sx:{mt:2},children:[t.jsxs(J,{children:["What ",t.jsx("b",{children:"variant"})," do you want to depend on?"]}),t.jsx(zr,{parent:r,project:e,selectedValues:l.variants,onSelect:u})]})})]})})},Hr=g(Gs)(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,padding:e.spacing(1,1.5)})),Ur=({feature:e,onEdit:s,onDelete:n})=>{const a=`dependency-${e}-actions`,o=`${a}-menu`,[r,i]=x.useState(null),c=!!r,l=p=>{i(p.currentTarget)},d=()=>{i(null)};return t.jsxs(Q,{children:[t.jsx(de,{title:"Dependency actions",arrow:!0,describeChild:!0,children:t.jsx(Je,{sx:{mr:.25},id:a,"aria-controls":c?o:void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,onClick:l,type:"button",children:t.jsx(Bt,{})})}),t.jsx(Hr,{id:o,anchorEl:r,open:c,onClose:d,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},disableScrollLock:!0,children:t.jsxs(Wn,{"aria-labelledby":a,children:[t.jsx(v,{condition:!0,show:t.jsxs(Ce,{onClick:()=>{s(),d()},children:[t.jsx(Me,{children:t.jsx(ze,{})}),t.jsx(De,{children:t.jsx(J,{variant:"body2",children:"Edit"})})]})}),t.jsx(v,{condition:!0,show:t.jsxs(Ce,{onClick:()=>{n(),d()},children:[t.jsx(Me,{children:t.jsx(Ys,{})}),t.jsx(De,{children:t.jsx(J,{variant:"body2",children:"Delete"})})]})})]})})]})},yn=({childFeatures:e,project:s})=>t.jsx(Ke,{tooltip:t.jsx(t.Fragment,{children:e.map(n=>t.jsx(Ut,{to:`/projects/${s}/features/${n}`,children:t.jsx("div",{children:n})},`${s}-${n}`))}),children:e.length===1?"1 feature":`${e.length} features`}),Gr=({variants:e})=>e.length===1&&e[0].length<20?t.jsx("span",{children:e[0]}):t.jsx(Ke,{tooltip:t.jsx(t.Fragment,{children:e.map(s=>t.jsx("div",{children:s}))}),children:e.length===1?"1 variant":`${e.length} variants`}),Yr=(e,s)=>{const{trackEvent:n}=be(),{addChange:a}=Te(),{refetch:o}=Se(e),{setToastData:r,setToastApiError:i}=ne(),{refetchFeature:c}=W(e,s),l=Ot(e)(),{isChangeRequestConfiguredInAnyEnv:d}=ie(e),{removeDependencies:p}=xn(e),f=async()=>{if(!l){console.error("No change request environment");return}await a(e,l,[{action:"deleteDependency",feature:s,payload:void 0}])};return async()=>{try{d()?(await f(),n("dependent_features",{props:{eventType:"delete dependency added to change request"}}),r({text:`${s} dependency will be removed`,type:"success",title:"Change added to a draft"}),await o()):(await p(s),n("dependent_features",{props:{eventType:"dependency removed"}}),r({title:"Dependency removed",type:"success"}),await c())}catch(m){i(Y(m))}}},Jr=({feature:e})=>{var d,p,f,y,m,j;const[s,n]=x.useState(!1),a=!!e.project&&e.dependencies.length===0&&e.children.length===0,o=!!e.project&&e.dependencies.length>0,r=!!e.project&&e.children.length>0,i=Ot(e.project)(),c=Js(e.project),l=Yr(e.project,e.name);return t.jsxs(t.Fragment,{children:[t.jsx(v,{condition:a,show:t.jsx(Ge,{children:t.jsxs(_e,{children:[t.jsx(Ye,{children:"Dependency:"}),t.jsx(we,{permission:Zt,projectId:e.project,variant:"text",onClick:()=>{n(!0)},children:"Add parent feature"})]})})}),t.jsx(v,{condition:o,show:t.jsxs(Ge,{children:[t.jsxs(_e,{children:[t.jsx(Ye,{children:"Dependency:"}),t.jsx(Ut,{to:`/projects/${e.project}/features/${(d=e.dependencies[0])==null?void 0:d.feature}`,children:(p=e.dependencies[0])==null?void 0:p.feature})]}),t.jsx(v,{condition:c(Zt,i),show:t.jsx(Ur,{feature:e.name,onEdit:()=>n(!0),onDelete:l})})]})}),t.jsx(v,{condition:o&&!((f=e.dependencies[0])!=null&&f.enabled),show:t.jsx(Ge,{children:t.jsxs(_e,{children:[t.jsx(Ye,{children:"Dependency value:"}),t.jsx("span",{children:"disabled"})]})})}),t.jsx(v,{condition:o&&!!((m=(y=e.dependencies[0])==null?void 0:y.variants)!=null&&m.length),show:t.jsx(Ge,{children:t.jsxs(_e,{children:[t.jsx(Ye,{children:"Dependency value:"}),t.jsx(Gr,{variants:((j=e.dependencies[0])==null?void 0:j.variants)||[]})]})})}),t.jsx(v,{condition:r,show:t.jsx(Ge,{children:t.jsxs(_e,{children:[t.jsx(Ye,{children:"Children:"}),t.jsx(yn,{childFeatures:e.children,project:e.project})]})})}),t.jsx(v,{condition:!!e.project,show:t.jsx(Wr,{project:e.project,featureId:e.name,parentDependency:e.dependencies[0],onClose:()=>n(!1),showDependencyDialogue:s})})]})},Kr=(e,s={})=>{const n=ke(`/api/admin/projects/${e}/dependencies`),{data:a,error:o}=Ks(e,!1,n,Qr,s);return{dependenciesExist:a,error:o,loading:!o&&!a}},Qr=async e=>await(await fetch(e).then(qe("Dependencies exist check"))).json(),Zr=e=>{const{dependenciesExist:s}=Kr(e),{isOss:n}=Qe();return!!e&&!!(!n()||s)},Xr=g("div")(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,backgroundColor:e.palette.background.paper,display:"flex",flexDirection:"column",maxWidth:"350px",minWidth:"350px",marginRight:e.spacing(2),[e.breakpoints.down(1e3)]:{width:"100%",maxWidth:"none",minWidth:"auto"}})),ei=g("div")({padding:"1.5rem 1.5rem 0 1.5rem"}),ti=g("div")({display:"flex",alignItems:"center"}),si=g("h2")(({theme:e})=>({fontSize:e.fontSizes.mainHeader,fontWeight:"normal",margin:0})),ni=g("div")(({theme:e})=>({margin:e.spacing(2,0),display:"flex",flexDirection:"column",fontSize:e.fontSizes.smallBody})),fs=g("div")(({theme:e})=>({})),xs=g("div")(({theme:e})=>({display:"flex",justifyContent:"space-between",padding:e.spacing(1,0)})),ys=g("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"space-between"})),ai=g("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"space-between"})),oi=g("p")({wordBreak:"break-word"}),tt=g("span")(({theme:e})=>({color:e.palette.text.secondary,marginRight:e.spacing(1)})),ri=()=>{var h;const e=$("projectId"),s=$("featureId"),{feature:n,refetchFeature:a}=W(e,s),{project:o,description:r,type:i}=n,c=Lt("featureLifecycle"),l=Ee(),[d,p]=x.useState(!1),[f,y]=x.useState(!1),{locationSettings:m}=Qs(),j=Zr(n.project),S=(h=n.environments)==null?void 0:h.map(C=>({name:C.name,lastSeenAt:C.lastSeenAt,enabled:C.enabled,yes:C.yes,no:C.no})),u=Yn(i);return t.jsxs(Xr,{children:[t.jsxs(ei,{children:[t.jsxs(ti,{"data-loading":!0,children:[t.jsx(u,{sx:C=>({marginRight:C.spacing(2),height:"40px",width:"40px",padding:C.spacing(.5),backgroundColor:C.palette.background.alternative,fill:C.palette.primary.contrastText,borderRadius:`${C.shape.borderRadiusMedium}px`})})," ",t.jsxs(si,{children:[Be(i||"")," toggle"]})]}),t.jsxs(ni,{children:[t.jsxs(xs,{"data-loading":!0,children:[t.jsx(tt,{children:"Project:"}),t.jsx("span",{children:o})]}),t.jsx(v,{condition:c&&!!n.lifecycle,show:t.jsxs(xs,{"data-loading":!0,children:[t.jsx(tt,{children:"Lifecycle:"}),t.jsx(Hn,{feature:n,onArchive:()=>p(!0),onComplete:()=>y(!0),onUncomplete:a})]})}),t.jsx(v,{condition:!!r,show:t.jsxs(fs,{"data-loading":!0,sx:{pt:1},children:[t.jsx(tt,{children:"Description:"}),t.jsxs(ys,{children:[t.jsx(oi,{children:r}),t.jsx(me,{projectId:e,permission:Ve,component:oe,to:`/projects/${e}/features/${s}/settings`,tooltipProps:{title:"Edit description"},children:t.jsx(ze,{})})]})]}),elseShow:t.jsx("div",{"data-loading":!0,children:t.jsxs(ys,{children:["No description."," ",t.jsx(me,{projectId:e,permission:Ve,component:oe,to:`/projects/${e}/features/${s}/settings`,tooltipProps:{title:"Edit description"},children:t.jsx(ze,{})})]})})}),t.jsx(fs,{children:t.jsxs(ai,{children:[t.jsxs(_e,{children:[t.jsx(tt,{children:"Created at:"}),t.jsx("span",{children:Un(Zs(n.createdAt),m.locale)})]}),t.jsx(Gn,{featureLastSeen:n.lastSeenAt,environments:S})]})}),t.jsx(v,{condition:j,show:t.jsx(Jr,{feature:n})})]})]}),t.jsx(v,{condition:n.children.length>0,show:t.jsx(hn,{features:n.children,project:e,isOpen:d,onClose:()=>p(!1)}),elseShow:t.jsx(un,{isOpen:d,onConfirm:()=>{l(`/projects/${e}`)},onClose:()=>p(!1),projectId:e,featureIds:[s]})}),t.jsx(v,{condition:!!n.project,show:t.jsx(tr,{isOpen:f,setIsOpen:y,projectId:n.project,featureId:n.name,onComplete:a})})]})},ms={lastHourUsage:[],seenApplications:[]},ii=(e,s,n={})=>{const a=async()=>{const p=ke(`api/admin/client-metrics/features/${s}`),f=await fetch(p,{method:"GET"}).then(qe("feature metrics"));return f.ok?f.json():ms},o=`${e}_${s}_metrics`,{data:r,error:i}=Xs(o,a,{...n}),[c,l]=x.useState(!i&&!r),d=()=>{Mt(o)};return x.useEffect(()=>{l(!i&&!r)},[r,i]),{metrics:r||ms,error:i,loading:c,refetch:d,FEATURE_METRICS_CACHE_KEY:o}},ci=e=>({yes:0,no:0,environment:e,timestamp:""}),li=(e,s)=>e.map(n=>s.lastHourUsage.find(o=>o.environment===n.name)||ci(n.name)),js=en.use||(e=>{if(e.status==="pending")throw e;if(e.status==="fulfilled")return e.value;throw e.status==="rejected"?e.reason:(e.status="pending",e.then(s=>{e.status="fulfilled",e.value=s},s=>{e.status="rejected",e.reason=s}),e)}),bt={dedupe:!0},di=(e,s,n)=>{const{cache:a,compare:o,suspense:r,fallbackData:i,revalidateOnMount:c,revalidateIfStale:l,refreshInterval:d,refreshWhenHidden:p,refreshWhenOffline:f,keepPreviousData:y}=n,[m,j,S,u]=ea.get(a),[h,C]=ta(e),I=x.useRef(!1),_=x.useRef(!1),B=x.useRef(h),k=x.useRef(s),P=x.useRef(n),A=()=>P.current,D=()=>A().isVisible()&&A().isOnline(),[L,Z,ee,b]=sa(a,h),E=x.useRef({}).current,w=G(i)?n.fallback[h]:i,T=(V,N)=>{for(const se in E){const U=se;if(U==="data"){if(!o(V[U],N[U])&&(!G(V[U])||!o(K,N[U])))return!1}else if(N[U]!==V[U])return!1}return!0},F=x.useMemo(()=>{const V=!h||!s?!1:G(c)?A().isPaused()||r?!1:G(l)?!0:l:c,N=ae=>{const fe=ca(ae);return delete fe._k,V?{isValidating:!0,isLoading:!0,...fe}:fe},se=L(),U=b(),ue=N(se),Ie=se===U?ue:N(U);let X=ue;return[()=>{const ae=N(L());return T(ae,X)?(X.data=ae.data,X.isLoading=ae.isLoading,X.isValidating=ae.isValidating,X.error=ae.error,X):(X=ae,ae)},()=>Ie]},[a,h]),O=na.useSyncExternalStore(x.useCallback(V=>ee(h,(N,se)=>{T(se,N)||V()}),[a,h]),F[0],F[1]),q=!I.current,M=m[h]&&m[h].length>0,z=O.data,te=G(z)?w:z,H=O.error,R=x.useRef(te),K=y?G(z)?R.current:z:te,he=M&&!G(H)?!1:q&&!G(c)?c:A().isPaused()?!1:r?G(te)?!1:l:G(te)||l,Re=!!(h&&s&&q&&he),Fn=G(O.isValidating)?Re:O.isValidating,In=G(O.isLoading)?Re:O.isLoading,He=x.useCallback(async V=>{const N=k.current;if(!h||!N||_.current||A().isPaused())return!1;let se,U,ue=!0;const Ie=V||{},X=!S[h]||!Ie.dedupe,ae=()=>ss?!_.current&&h===B.current&&I.current:h===B.current,fe={isValidating:!1,isLoading:!1},Jt=()=>{Z(fe)},Kt=()=>{const ce=S[h];ce&&ce[1]===U&&delete S[h]},Qt={isValidating:!0};G(L().data)&&(Qt.isLoading=!0);try{if(X&&(Z(Qt),n.loadingTimeout&&G(L().data)&&setTimeout(()=>{ue&&ae()&&A().onLoadingSlow(h,n)},n.loadingTimeout),S[h]=[N(C),aa()]),[se,U]=S[h],se=await se,X&&setTimeout(Kt,n.dedupingInterval),!S[h]||S[h][1]!==U)return X&&ae()&&A().onDiscarded(h),!1;fe.error=Xt;const ce=j[h];if(!G(ce)&&(U<=ce[0]||U<=ce[1]||ce[1]===0))return Jt(),X&&ae()&&A().onDiscarded(h),!1;const xe=L().data;fe.data=o(xe,se)?xe:se,X&&ae()&&A().onSuccess(se,h,n)}catch(ce){Kt();const xe=A(),{shouldRetryOnError:ht}=xe;xe.isPaused()||(fe.error=ce,X&&ae()&&(xe.onError(ce,h,xe),(ht===!0||es(ht)&&ht(ce))&&(!A().revalidateOnFocus||!A().revalidateOnReconnect||D())&&xe.onErrorRetry(ce,h,xe,Pn=>{const ft=m[h];ft&&ft[0]&&ft[0](Ue.ERROR_REVALIDATE_EVENT,Pn)},{retryCount:(Ie.retryCount||0)+1,dedupe:!0})))}return ue=!1,Jt(),!0},[h,a]),Yt=x.useCallback((...V)=>oa(a,B.current,...V),[]);if(xt(()=>{k.current=s,P.current=n,G(z)||(R.current=z)}),xt(()=>{if(!h)return;const V=He.bind(Xt,bt);let N=0;const U=ra(h,m,(ue,Ie={})=>{if(ue==Ue.FOCUS_EVENT){const X=Date.now();A().revalidateOnFocus&&X>N&&D()&&(N=X+A().focusThrottleInterval,V())}else if(ue==Ue.RECONNECT_EVENT)A().revalidateOnReconnect&&D()&&V();else{if(ue==Ue.MUTATE_EVENT)return He();if(ue==Ue.ERROR_REVALIDATE_EVENT)return He(Ie)}});return _.current=!1,B.current=h,I.current=!0,Z({_k:C}),he&&(G(te)||ts?V():ia(V)),()=>{_.current=!0,U()}},[h]),xt(()=>{let V;function N(){const U=es(d)?d(L().data):d;U&&V!==-1&&(V=setTimeout(se,U))}function se(){!L().error&&(p||A().isVisible())&&(f||A().isOnline())?He(bt).then(N):N()}return N(),()=>{V&&(clearTimeout(V),V=-1)}},[d,p,f,h]),x.useDebugValue(K),r&&G(te)&&h){if(!ss&&ts)throw new Error("Fallback data is required when using suspense in SSR.");k.current=s,P.current=n,_.current=!1;const V=u[h];if(!G(V)){const N=Yt(V);js(N)}if(G(H)){const N=He(bt);G(K)||(N.status="fulfilled",N.value=!0),js(N)}else throw H}return{mutate:Yt,get data(){return E.data=!0,K},get error(){return E.error=!0,H},get isValidating(){return E.isValidating=!0,Fn},get isLoading(){return E.isLoading=!0,In}}};Jn.defineProperty(Kn,"defaultValue",{value:Qn});const ui=Xn(di),pi=e=>(s,n,a)=>(a.revalidateOnFocus=!1,a.revalidateIfStale=!1,a.revalidateOnReconnect=!1,e(s,n,a)),gi=Zn(ui,pi),mn=(e,s)=>{const{refetchFeature:n}=W(e,s),a=la(e,s),{data:o,error:r,mutate:i}=gi(["useFeatureImmutable",a],()=>da(a)),c=x.useCallback(async()=>{await i(),await n()},[i,n]);return{feature:(o==null?void 0:o.body)||ua,refetchFeature:c,loading:!r&&!o,status:o==null?void 0:o.status,error:r}},jn=(e,s,n)=>{const{setToastData:a,setToastApiError:o}=ne(),{addChange:r}=Te(),{refetch:i}=Se(e),[c,l]=x.useState({isOpen:!1}),d=x.useCallback((j,S,u)=>{l({featureName:s,environment:j,fromEnvironment:u,strategy:S,isOpen:!0})},[]),p=x.useCallback((j,S,u)=>{l({featureName:s,environment:j,fromEnvironment:u,strategies:S,isOpen:!0})},[]),f=x.useCallback(()=>{l({isOpen:!1})},[]),y=x.useCallback(async()=>{try{await r(e,c.environment,{feature:c.featureName,action:n,payload:c.strategy}),i(),l({isOpen:!1}),a({type:"success",title:"Changes added to the draft!"})}catch(j){o(Y(j)),l({isOpen:!1})}},[r]),m=x.useCallback(async()=>{try{await Promise.all(c.strategies.map(j=>r(e,c.environment,{feature:c.featureName,action:n,payload:j}))),i(),l({isOpen:!1}),a({type:"success",title:"Changes added to the draft!"})}catch(j){o(Y(j)),l({isOpen:!1})}},[r]);return{onChangeRequestAddStrategy:d,onChangeRequestAddStrategies:p,onChangeRequestAddStrategyClose:f,onChangeRequestAddStrategyConfirm:y,onChangeRequestAddStrategiesConfirm:m,changeRequestDialogDetails:c}},hi=({payload:e,fromEnvironment:s,environment:n})=>t.jsxs(J,{children:[t.jsxs("strong",{children:["Copy ",Ze((e==null?void 0:e.name)||"")," strategy"," "]})," ","from ",s," to ",n]}),fi=({environmentId:e,environments:s,strategy:n})=>{const a=$("projectId"),o=$("featureId"),[r,i]=x.useState(null),c=!!r,{addStrategyToFeature:l}=We(),{setToastData:d,setToastApiError:p}=ne(),{refetchFeature:f}=W(a,o),{refetchFeature:y}=mn(a,o),m=()=>{i(null)},j=Js(a),{isChangeRequestConfigured:S}=ie(a),{changeRequestDialogDetails:u,onChangeRequestAddStrategyClose:h,onChangeRequestAddStrategy:C,onChangeRequestAddStrategyConfirm:I}=jn(a,o,"addStrategy"),_=async k=>{const{id:P,...A}={...n,targetEnvironment:k};if(S(k)){await C(k,{id:P,...A},e);return}try{await l(a,o,k,n),f(),y(),d({title:"Strategy created",text:`Successfully copied a strategy to ${k}`,type:"success"})}catch(D){p(Y(D))}m()},B=s.some(k=>j($e,k));return t.jsxs("div",{children:[t.jsx(pn,{isOpen:u.isOpen,onClose:h,environment:u==null?void 0:u.environment,onConfirm:I,messageComponent:t.jsx(hi,{fromEnvironment:u.fromEnvironment,payload:u.strategy})}),t.jsx(de,{title:`Copy to another environment${B?"":" (Access denied)"}`,children:t.jsx("div",{children:t.jsx(Je,{size:"large",id:`copy-strategy-icon-menu-${n.id}`,"aria-controls":c?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,onClick:k=>{i(k.currentTarget)},"data-testid":pa,disabled:!B,children:t.jsx(ga,{})})})}),t.jsx(Xe,{id:"basic-menu",anchorEl:r,open:c,onClose:m,MenuListProps:{"aria-labelledby":`copy-strategy-icon-menu-${n.id}`},children:s.map(k=>{const P=j($e,k);return t.jsx(de,{title:P?"":"You don't have access to add a strategy to this environment",children:t.jsx("div",{children:t.jsxs(Ce,{onClick:()=>_(k),disabled:!P,children:[t.jsx(v,{condition:!P,show:t.jsx(Me,{children:t.jsx(tn,{fontSize:"small"})})}),t.jsxs(De,{children:["Copy to ",k]})]})})},k)})})]})},xi=()=>t.jsx(ge,{severity:"error",children:"Removing the strategy will change which users receive access to the feature."}),yi=g("div")(({theme:e})=>({"> * + *":{marginTop:e.spacing(1)}})),mi=({changeRequests:e,projectId:s})=>e&&e.length>0?t.jsxs(ge,{severity:"warning",children:[t.jsx("p",{children:"This strategy is in use by at least one scheduled change request. If you remove it, those change requests can no longer be applied."}),t.jsx("p",{children:"The following scheduled change requests use this strategy:"}),t.jsx("ul",{children:e.map(({id:n,title:a})=>{const o=a?`#${n} (${a})`:`#${n}`;return t.jsx("li",{children:t.jsx(oe,{to:`/projects/${s}/change-requests/${n}`,target:"_blank",rel:"noopener noreferrer",title:`Change request ${n}`,children:o})},n)})})]}):e===void 0?t.jsx(ge,{severity:"warning",children:t.jsx("p",{children:"This strategy may be in use by one or more scheduled change requests. If you remove it, those change requests can no longer be applied."})}):null,bn=({scheduledChangeRequestsForStrategy:e})=>t.jsxs(yi,{children:[t.jsx(xi,{}),t.jsx(mi,{projectId:e.projectId,changeRequests:e.changeRequests})]}),ji=({onRemove:e,onClose:s,isOpen:n,scheduledChangeRequestsForStrategy:a})=>t.jsx(je,{title:"Are you sure you want to delete this strategy?",open:n,primaryButtonText:"Remove strategy",secondaryButtonText:"Cancel",onClick:e,onClose:s,children:t.jsx(bn,{scheduledChangeRequestsForStrategy:a})}),bi=g("div")(({theme:e})=>({marginTop:e.spacing(3),marginBottom:e.spacing(1)})),Si=({onRemove:e,onClose:s,isOpen:n,scheduledChangeRequestsForStrategy:a})=>t.jsxs(je,{title:"Suggest changes",open:n,primaryButtonText:"Add suggestion to draft",secondaryButtonText:"Cancel",onClick:e,onClose:s,children:[t.jsx(bn,{scheduledChangeRequestsForStrategy:a}),t.jsx(bi,{children:t.jsx(J,{variant:"body2",color:"text.secondary",children:"Your suggestion:"})}),t.jsx(J,{fontWeight:"bold",children:"Remove strategy"})]}),vi=({projectId:e,featureId:s,environmentId:n,strategyId:a})=>{const{deleteStrategyFromFeature:o}=We(),{setToastData:r,setToastApiError:i}=ne(),c=Ee(),{refetchFeature:l}=W(e,s);return async p=>{try{p.preventDefault(),await o(e,s,n,a),r({title:"Strategy deleted",type:"success"}),l(),c(zt(e,s))}catch(f){i(Y(f))}}},Ci=({projectId:e,featureId:s,environmentId:n,strategyId:a})=>{const{addChange:o}=Te(),{refetch:r}=Se(e),{setToastData:i,setToastApiError:c}=ne();return async d=>{try{d.preventDefault(),await o(e,n,{action:"deleteStrategy",feature:s,payload:{id:a}}),i({title:"Changes added to the draft!",type:"success"}),await r()}catch(p){c(Y(p))}}},wi=({projectId:e,featureId:s,environmentId:n,strategyId:a,isOpen:o,onClose:r})=>{const{isChangeRequestConfigured:i}=ie(e),{changeRequests:c}=sn(e,a),l={changeRequests:c,projectId:e},d=vi({featureId:s,projectId:e,strategyId:a,environmentId:n}),p=Ci({featureId:s,projectId:e,strategyId:a,environmentId:n});return i(n)?t.jsx(Si,{isOpen:o,onClose:()=>r(),onRemove:async f=>{await p(f),r()},scheduledChangeRequestsForStrategy:l}):t.jsx(ji,{isOpen:o,onClose:()=>r(),onRemove:d,scheduledChangeRequestsForStrategy:l})},Ti=({projectId:e,environmentId:s,featureId:n,strategy:a})=>{const{refetchFeature:o}=W(e,n),{setStrategyDisabledState:r}=We(),{setToastData:i,setToastApiError:c}=ne(),l=d=>async()=>{try{await r(e,n,s,a.id,!d),i({title:`Strategy ${d?"enabled":"disabled"}`,type:"success"}),o()}catch(p){c(Y(p))}};return{onDisable:l(!1),onEnable:l(!0)}},Ei=({projectId:e,environmentId:s,featureId:n,strategy:a})=>{const{addChange:o}=Te(),{refetch:r}=Se(e),{setToastData:i,setToastApiError:c}=ne(),l=d=>async()=>{try{await o(e,s,{action:"updateStrategy",feature:n,payload:{...a,disabled:!d}}),i({title:"Changes added to the draft!",type:"success"}),await r()}catch(p){c(Y(p))}};return{onSuggestDisable:l(!1),onSuggestEnable:l(!0)}},Ri=({isOpen:e,onClose:s,...n})=>{var m;const{projectId:a,environmentId:o}=n,{isChangeRequestConfigured:r}=ie(a),i=r(o),{onSuggestEnable:c,onSuggestDisable:l}=Ei({...n}),{onEnable:d,onDisable:p}=Ti({...n}),f=!!((m=n.strategy)!=null&&m.disabled),y=j=>{j.preventDefault(),i?f?c():l():f?d():p(),s()};return t.jsx(je,{title:i?`Add ${f?"enable":"disable"} strategy to change request?`:`Are you sure you want to ${f?"enable":"disable"} this strategy?`,open:e,primaryButtonText:i?"Add to draft":`${f?"Enable":"Disable"} strategy`,secondaryButtonText:"Cancel",onClick:y,onClose:()=>s(),children:t.jsx(v,{condition:i,show:t.jsx(ha,{environment:o}),elseShow:t.jsxs(ge,{severity:"error",children:[f?"Enabling":"Disabling"," the strategy will change which users receive access to the feature."]})})})},Ai=({projectId:e,strategy:s,featureId:n,environmentId:a})=>{const[o,r]=x.useState(null),[i,c]=x.useState(!1),[l,d]=x.useState(!1),p=!!o,f=S=>{r(S.currentTarget)},y=S=>{r(null),S.stopPropagation()},m=Ft(fa,e,a),j=Ft(xa,e,a);return t.jsxs(t.Fragment,{children:[t.jsx(Q,{sx:{display:"flex",alignItems:"center",textAlign:"center"},children:t.jsx(de,{title:"More actions",children:t.jsx(Je,{onClick:f,size:"small","aria-controls":p?"actions-menu":void 0,"aria-haspopup":"true","aria-expanded":p?"true":void 0,"data-testid":ya,children:t.jsx(Bt,{sx:{width:32,height:32}})})})}),t.jsxs(Xe,{anchorEl:o,id:"actions-menu",open:p,onClose:y,onClick:y,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},"data-testid":ma,children:[t.jsx(de,{title:s.disabled?"Enable strategy":"Disable strategy",arrow:!0,placement:"left",children:t.jsxs(Ce,{disabled:!m,onClick:()=>c(!0),children:[t.jsx(Me,{children:s.disabled?t.jsx(ja,{}):t.jsx(ba,{})}),t.jsx(De,{children:s.disabled?"Enable":"Disable"})]})}),t.jsx(de,{title:"Remove strategy",arrow:!0,placement:"left",children:t.jsxs(Ce,{disabled:!j,onClick:()=>d(!0),"data-testid":Sa,children:[t.jsx(Me,{children:t.jsx(Ys,{})}),t.jsx(De,{children:"Remove"})]})})]}),t.jsx(Ri,{isOpen:i,onClose:()=>c(!1),projectId:e,featureId:n,environmentId:a,strategy:s}),t.jsx(wi,{isOpen:l,onClose:()=>d(!1),projectId:e,featureId:n,environmentId:a,strategyId:s.id})]})},Di=({environmentId:e,strategy:s,onDragStart:n,onDragEnd:a,otherEnvironments:o,orderNumber:r,headerChildren:i})=>{const c=$("projectId"),l=$("featureId"),d=va(c,l,e,s.id);return t.jsxs(hr,{strategy:s,onDragStart:n,onDragEnd:a,orderNumber:r,actions:t.jsxs(t.Fragment,{children:[i,t.jsx(v,{condition:!!(o&&(o==null?void 0:o.length)>0),show:()=>t.jsx(fi,{environmentId:e,environments:o,strategy:s})}),t.jsx(me,{permission:Ca,environmentId:e,projectId:c,component:oe,to:d,tooltipProps:{title:"Edit strategy"},"data-testid":`STRATEGY_EDIT-${s.name}`,children:t.jsx(ze,{})}),t.jsx(Ai,{projectId:c,featureId:l,environmentId:e,strategy:s})]}),children:[t.jsx(wa,{strategy:s}),s.variants&&s.variants.length>0&&(s.disabled?t.jsx(Q,{sx:{opacity:"0.5"},children:t.jsx(ns,{variants:s.variants})}):t.jsx(ns,{variants:s.variants}))]})},$i=e=>fetch(e).then(qe("ChangeRequest")).then(s=>s.json()),Sn=(e,s)=>{const{data:n,error:a,mutate:o}=nn([],ke(`api/admin/projects/${e}/change-requests/pending/${s}`),$i);return{changeRequests:n,loading:!a&&!n,refetch:o,error:a}},ki=(e,s,n,a)=>{const{user:o}=Ta(),{changeRequests:r}=Sn(e,s),i=[],c=r==null?void 0:r.filter(l=>l.environment===n);return c==null||c.forEach(l=>{const d=l==null?void 0:l.features.find(f=>f.name===s),p=d==null?void 0:d.changes.find(f=>f.action==="updateStrategy"||f.action==="deleteStrategy"?f.payload.id===a:!1);if(p){const f=l.state==="Scheduled",y=!f&&l.createdBy.id===(o==null?void 0:o.id);f&&i.push({changeRequestId:l.id,change:p,isScheduledChange:f}),y&&i.push({changeRequestId:l.id,change:p,isScheduledChange:f})}}),i},vn=({scheduledChangeRequestIds:e})=>{const s=lt(),n=et(s.breakpoints.down("sm")),a=$("projectId");return n?null:t.jsx(Q,{sx:{mr:1.5},children:t.jsx(Ke,{tooltip:t.jsx(t.Fragment,{children:e==null?void 0:e.map((o,r)=>t.jsxs(Ut,{to:`/projects/${a}/change-requests/${o}`,children:["Change request #",o]},`${a}-${r}`))}),children:t.jsx(Ne,{color:"warning",children:"Changes Scheduled"})})})},bs=({strategy:e,index:s,environmentName:n,otherEnvironments:a,isDragging:o,onDragStartRef:r,onDragOver:i,onDragEnd:c})=>{const l=$("projectId"),d=$("featureId"),p=x.useRef(null),f=ki(l,d,n,e.id),{changeRequests:y}=sn(l,e.id);return t.jsxs(Q,{ref:p,onDragOver:i(p,s),sx:{opacity:o?"0.5":"1"},children:[t.jsx(v,{condition:s>0,show:t.jsx(Ea,{text:"OR"})}),t.jsx(Di,{strategy:e,environmentId:n,otherEnvironments:a,onDragStart:r(p,s),onDragEnd:c,orderNumber:s+1,headerChildren:Ii(f,y)})]},e.id)},Fi=({change:e})=>{const s=lt();return et(s.breakpoints.down("sm"))?null:t.jsxs(Q,{sx:{mr:1.5},children:[t.jsx(v,{condition:(e==null?void 0:e.action)==="updateStrategy",show:t.jsx(Ne,{color:"warning",children:"Modified in draft"})}),t.jsx(v,{condition:(e==null?void 0:e.action)==="deleteStrategy",show:t.jsx(Ne,{color:"error",children:"Deleted in draft"})})]})},Ii=(e,s)=>{const n=[];if((e==null?void 0:e.length)===0&&(s==null?void 0:s.length)===0)return[];const a=e==null?void 0:e.find(({isScheduledChange:o})=>!o);return a&&n.push(t.jsx(Fi,{change:a.change},`draft-change#${a.change.id}`)),s&&s.length>0&&n.push(t.jsx(vn,{scheduledChangeRequestIds:s.map(o=>o.id)},"scheduled-changes")),n},Pi=({environmentId:e,environments:s,onClick:n})=>{const a=$("projectId"),[o,r]=x.useState(null),i=!!o,{hasAccess:c}=x.useContext(Vt),l=s.some(d=>c($e,a,d));return t.jsxs("div",{children:[t.jsx(de,{title:l?"":"(Access denied)",children:t.jsx("div",{children:t.jsx(Fe,{id:`copy-all-strategies-${e}`,"aria-controls":i?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":i?"true":void 0,onClick:d=>{r(d.currentTarget)},disabled:!l,variant:"outlined",children:"Copy from another environment"})})}),t.jsx(Xe,{id:"basic-menu",anchorEl:o,open:i,onClose:()=>{r(null)},MenuListProps:{"aria-labelledby":`copy-all-strategies-${e}`},children:s.map(d=>{const p=c($e,a,d);return t.jsx(de,{title:p?"":"You don't have access to add a strategy to this environment",children:t.jsx("div",{children:t.jsxs(Ce,{onClick:()=>n(d),disabled:!p,children:[t.jsx(v,{condition:!p,show:t.jsx(Me,{children:t.jsx(tn,{fontSize:"small"})})}),t.jsxs(De,{children:["Copy from ",d]})]})})},d)})})]})},_i=g("div")(({theme:e})=>({"&>*:nth-child(n)":{margin:e.spacing(1,0)}})),Oi=({payload:e,fromEnvironment:s,environment:n})=>t.jsxs(_i,{children:[t.jsx(J,{children:t.jsx("strong",{children:"Copy: "})}),e==null?void 0:e.map(a=>t.jsxs(J,{children:[t.jsxs("strong",{children:[Ze((a==null?void 0:a.name)||"")," strategy"," "]})," "]})),t.jsxs(J,{children:["from ",s," to ",n]})]}),Bi=(e,s)=>{const n={};return s.parameters.forEach(a=>{n[a.name]=Li(e,a)}),{name:s.name,constraints:[],parameters:n}},Li=(e,s)=>s.name==="rollout"||s.name==="percentage"||s.type==="percentage"?"50":s.name==="stickiness"?"":s.name==="groupId"?e:s.type==="boolean"?"false":"",Mi=()=>{const[e,s]=x.useState(0),n=$("projectId"),a=$("featureId"),o=as("environmentId"),r=as("strategyName"),{strategy:i,defaultStrategyFallback:c}=sr(n,o),l=JSON.parse(Ra().get("defaultStrategy")||"false"),{segments:d}=Aa(),p=(d||[]).filter(H=>{var R;return(R=i==null?void 0:i.segments)==null?void 0:R.includes(H.id)}),[f,y]=x.useState({}),[m,j]=x.useState(l?p:[]),{strategyDefinition:S}=Da(r),u=$a(),{addStrategyToFeature:h,loading:C}=We(),{addChange:I}=Te(),{setToastData:_,setToastApiError:B}=ne(),{uiConfig:k}=Qe(),{unleashUrl:P}=k,A=Ee(),{feature:D,refetchFeature:L}=W(n,a),Z=x.useRef(D),{isChangeRequestConfigured:ee}=ie(n),{refetch:b}=Se(n),{trackEvent:E}=be(),{data:w,staleDataNotification:T,forceRefreshCache:F}=ka({unleashGetter:W,params:[n,a],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},D,{afterSubmitAction:L},La);x.useEffect(()=>{Z.current.name===""&&D.name&&(F(D),Z.current=D)},[D.name]),x.useEffect(()=>{var H;if(l){const R=i||c;((H=R.parameters)==null?void 0:H.groupId)===""&&a?y({...R,parameters:{...R.parameters,groupId:a}}):y(R)}else S&&y(Bi(a,S))},[a,JSON.stringify(S),JSON.stringify(i),l]);const O=async H=>{await h(n,a,o,H),_({title:"Strategy created",type:"success",confetti:!0})},q=async H=>{await I(n,o,{action:"addStrategy",feature:a,payload:H}),_({title:"Strategy added to draft",type:"success",confetti:!0}),b()},M=Fa(f,m),z=async()=>{E("strategyTitle",{props:{hasTitle:!!f.title,on:"create"}});try{ee(o)?await q(M):await O(M),L(),A(zt(n,a))}catch(H){B(Y(H))}};return!w||!w.project?null:t.jsxs(an,{modal:!0,description:Ia,documentationLink:Pa,documentationLinkLabel:_a,disablePadding:!0,formatApiCode:()=>zi(n,a,o,M,P),children:[t.jsx(Oa,{projectId:n,feature:w,strategy:f,setStrategy:y,segments:m,setSegments:j,environmentId:o,onSubmit:z,loading:C,permission:$e,errors:u,isChangeRequest:ee(o),tab:e,setTab:s,StrategyVariants:t.jsx(Ba,{strategy:f,setStrategy:y,environment:o,projectId:n,editable:!0})}),T]})},Cn=(e,s,n,a,o=!1)=>{const r=new URLSearchParams({environmentId:n,strategyName:a,defaultStrategy:String(o)});return`/projects/${e}/features/${s}/strategies/create?${r}`},zi=(e,s,n,a,o)=>{if(!o)return"";const r=`${o}/api/admin/projects/${e}/features/${s}/environments/${n}/strategies`,i=JSON.stringify(a,void 0,2);return`curl --location --request POST '${r}' \\
|
|
2
2
|
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
3
|
--header 'Content-Type: application/json' \\
|
|
4
4
|
--data-raw '${i}'`},Vi=g("div")(({theme:e})=>({width:e.spacing(4),height:"auto","& > svg":{fill:e.palette.primary.main},"& > div":{height:e.spacing(2),marginLeft:"-.75rem",color:e.palette.primary.main}})),Ni=g("div")(({theme:e})=>({fontSize:e.fontSizes.smallBody})),qi=g(Nt)(({theme:e})=>({fontWeight:e.fontWeight.bold})),Wi=g(oe)(({theme:e})=>({display:"grid",gridTemplateColumns:"3rem 1fr",width:"20rem",padding:e.spacing(2),color:"inherit",textDecoration:"inherit",lineHeight:1.25,borderWidth:"1px",borderStyle:"solid",borderColor:e.palette.divider,borderRadius:e.spacing(1),"&:hover, &:focus":{borderColor:e.palette.primary.main}})),St=({projectId:e,featureId:s,environmentId:n,strategy:a,defaultStrategy:o})=>{const r=on(a.name),i=Ze(a.name),{trackEvent:c}=be(),l=Cn(e,s,n,a.name,o),d=()=>{c("strategy-add",{props:{buttonTitle:a.displayName||i}})};return t.jsxs(Wi,{to:l,onClick:d,children:[t.jsx(Vi,{children:t.jsx(r,{})}),t.jsxs("div",{children:[t.jsx(qi,{text:a.displayName||i,maxWidth:"200",maxLength:25}),t.jsx(Ni,{children:a.description})]})]})},vt=g(J)(({theme:e})=>({fontSize:e.fontSizes.smallBody,padding:e.spacing(1,2)})),Hi=({projectId:e,featureId:s,environmentId:n})=>{const{strategies:a}=Ma(),o=a.filter(c=>!c.deprecated&&!c.editable),r=a.filter(c=>!c.deprecated&&c.editable),i={name:"flexibleRollout",displayName:"Default strategy",description:"This is the default strategy defined for this environment in the project"};return t.jsxs(qt,{dense:!0,children:[t.jsxs(t.Fragment,{children:[t.jsxs(vt,{color:"textSecondary",children:[n," environment default strategy"]}),t.jsx(Le,{children:t.jsx(St,{projectId:e,featureId:s,environmentId:n,strategy:i,defaultStrategy:!0})},i.name)]}),t.jsx(vt,{color:"textSecondary",children:"Predefined strategy types"}),o.map(c=>t.jsx(Le,{children:t.jsx(St,{projectId:e,featureId:s,environmentId:n,strategy:c})},c.name)),t.jsx(v,{condition:r.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(vt,{color:"textSecondary",children:"Custom strategies"}),r.map(c=>t.jsx(Le,{children:t.jsx(St,{projectId:e,featureId:s,environmentId:n,strategy:c})},c.name))]})})]})},Ui=g("div")({flexShrink:0}),Gi=g(we)(({theme:e})=>({minWidth:0,width:e.spacing(4.5),alignItems:"center",justifyContent:"center",align:"center",flexDirection:"column",marginLeft:e.spacing(1)})),Pt=({label:e,projectId:s,featureId:n,environmentId:a,variant:o,size:r,matchWidth:i})=>{const[c,l]=x.useState(),d=Ee(),{trackEvent:p}=be(),f=!!c,y=f?"FeatureStrategyMenuPopover":void 0,m=()=>{l(void 0)},j=h=>{p("strategy-add",{props:{buttonTitle:e}}),d(u)},S=h=>{l(h.currentTarget)},u=Cn(s,n,a,"flexibleRollout",!0);return t.jsxs(Ui,{onClick:h=>h.stopPropagation(),children:[t.jsx(we,{permission:$e,projectId:s,environmentId:a,onClick:j,"aria-labelledby":y,variant:o,size:r,sx:{minWidth:i?"282px":"auto"},children:e}),t.jsx(Gi,{permission:$e,projectId:s,environmentId:a,onClick:S,"aria-labelledby":y,variant:"outlined",size:r,hideLockIcon:!0,tooltipProps:{title:"More strategies"},children:t.jsx(Bt,{sx:h=>({margin:h.spacing(.25,0)})})}),t.jsx(Gs,{id:y,open:f,anchorEl:c,onClose:m,onClick:m,PaperProps:{sx:h=>({paddingBottom:h.spacing(1)})},children:t.jsx(Hi,{projectId:s,featureId:n,environmentId:a})})]})},Yi=g("div")(({theme:e})=>({display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",paddingTop:e.spacing(2)})),Ji=g("div")(({theme:e})=>({fontSize:e.fontSizes.bodySize,textAlign:"center",color:e.palette.text.primary,marginBottom:e.spacing(1)})),Ki=g("p")(({theme:e})=>({color:e.palette.text.secondary,fontSize:e.fontSizes.smallBody,textAlign:"center",marginBottom:e.spacing(3),a:{color:e.palette.links}})),Qi=({projectId:e,featureId:s,environmentId:n})=>{const{addStrategyToFeature:a}=We(),{setToastData:o,setToastApiError:r}=ne(),{refetchFeature:i}=W(e,s),{refetchFeature:c}=mn(e,s),{feature:l}=W(e,s),d=l==null?void 0:l.environments.filter(C=>C.name!==n&&C.strategies&&C.strategies.length>0),{isChangeRequestConfigured:p}=ie(e),{changeRequestDialogDetails:f,onChangeRequestAddStrategies:y,onChangeRequestAddStrategiesConfirm:m,onChangeRequestAddStrategyClose:j}=jn(e,s,"addStrategy"),S=(C=!1)=>{i(),c(),o({title:C?"Strategies created":"Strategy created",text:C?"Successfully copied from another environment":"Successfully created strategy",type:"success"})},u=async C=>{var _;const I=((_=d==null?void 0:d.find(B=>B.name===C))==null?void 0:_.strategies)||[];if(p(n)){await y(n,I,C);return}try{await Promise.all(I.map(B=>{const{id:k,...P}={...B,environment:n};return a(e,s,n,P)})),S(!0)}catch(B){r(Y(B))}},h=d&&d.length>0;return t.jsxs(t.Fragment,{children:[t.jsx(pn,{isOpen:f.isOpen,onClose:j,environment:f==null?void 0:f.environment,onConfirm:m,messageComponent:t.jsx(Oi,{fromEnvironment:f.fromEnvironment,payload:f.strategies})}),t.jsxs(Yi,{children:[t.jsx(Ji,{children:"You have not defined any strategies yet."}),t.jsxs(Ki,{children:["Strategies added in this environment will only be executed if the SDK is using an"," ",t.jsx(oe,{to:"/admin/api",children:"API key configured"})," for this environment."]}),t.jsxs(Q,{sx:{w:"100%",display:"flex",flexWrap:"wrap",gap:2,alignItems:"center",justifyContent:"center"},children:[t.jsx(Pt,{label:"Add your first strategy",projectId:e,featureId:s,environmentId:n,matchWidth:h}),t.jsx(v,{condition:h,show:t.jsx(Pi,{environmentId:n,environments:d.map(C=>C.name),onClick:u})})]})]})]})},Zi=(e,s)=>{const n=[];let a=0;if(e.length<=a)return e;for(;a<e.length;)if(a===0){a+=s;const o=e.slice(0,a);n.push(o)}else{const o=e.slice(a,a+s);a+=s,n.push(o)}return n},Xi=(e,s,n)=>{const[a,o]=x.useState([[]]),[r,i]=x.useState(0);x.useEffect(()=>{let f=e;n&&(f=e.filter(n));const y=Zi(f,s);o(y)},[JSON.stringify(e),s]);const c=()=>{r<a.length-1&&i(f=>f+1)},l=()=>{r>0&&i(f=>f-1)},d=()=>{i(a.length-1)},p=()=>{i(0)};return{page:a[r]||[],pages:a,nextPage:c,prevPage:l,lastPage:d,firstPage:p,setPageIndex:i,pageIndex:r}},ec=g("div")(({theme:e})=>({width:"100%",position:"relative",paddingBottom:e.spacing(2)})),tc=g("div")(({theme:e})=>({[e.breakpoints.down(400)]:{padding:e.spacing(1)}})),sc=({featureEnvironment:e,isDisabled:s,otherEnvironments:n})=>{const a=$("projectId"),o=$("featureId"),{setStrategiesSortOrder:r}=We(),{addChange:i}=Te(),{isChangeRequestConfigured:c}=ie(a),{refetch:l}=Se(a),{setToastData:d,setToastApiError:p}=ne(),{refetchFeature:f}=W(a,o),y=Lt("manyStrategiesPagination"),[m,j]=x.useState((e==null?void 0:e.strategies)||[]),{trackEvent:S}=be(),[u,h]=x.useState(null);if(x.useEffect(()=>{j((e==null?void 0:e.strategies)||[])},[e==null?void 0:e.strategies]),x.useEffect(()=>{m.length>50&&S("many-strategies")},[]),!e)return null;const C=20,{page:I,pages:_,setPageIndex:B,pageIndex:k}=Xi(m,C),P=async b=>{try{await r(a,o,e.name,b),f(),d({title:"Order of strategies updated",type:"success"})}catch(E){p(Y(E))}},A=async b=>{await i(a,e.name,{action:"reorderStrategy",feature:o,payload:b}),d({title:"Strategy execution order added to draft",type:"success",confetti:!0}),l()},D=async b=>{try{c(e.name)?await A(b):await P(b)}catch(E){p(Y(E))}},L=(b,E)=>w=>{var T;h({id:m[E].id,index:E,height:((T=b.current)==null?void 0:T.offsetHeight)||0}),b!=null&&b.current&&(w.dataTransfer.effectAllowed="move",w.dataTransfer.setData("text/html",b.current.outerHTML),w.dataTransfer.setDragImage(b.current,20,20))},Z=b=>(E,w)=>T=>{if(u===null||E.current===null||u.index===w||b===u.id)return;const{top:F,bottom:O}=E.current.getBoundingClientRect(),q=T.clientY-F<u.height,M=O-T.clientY<u.height,z=u.index>w;if(q&&z||M&&!z){const te=[...m],H=te.splice(u.index,1)[0];te.splice(w,0,H),j(te),h({...u,index:w})}},ee=()=>{h(null),D(m.map((b,E)=>({id:b.id,sortOrder:E})))};return t.jsx(ec,{children:t.jsxs(tc,{children:[t.jsx(v,{condition:m.length>0&&s,show:()=>t.jsx(ge,{severity:"warning",sx:{mb:2},children:"This environment is disabled, which means that none of your strategies are executing."})}),t.jsx(v,{condition:m.length>0,show:t.jsx(v,{condition:m.length<50||!y,show:t.jsx(t.Fragment,{children:m.map((b,E)=>t.jsx(bs,{strategy:b,index:E,environmentName:e.name,otherEnvironments:n,isDragging:(u==null?void 0:u.id)===b.id,onDragStartRef:L,onDragOver:Z(b.id),onDragEnd:ee},b.id))}),elseShow:t.jsxs(t.Fragment,{children:[t.jsx(ge,{severity:"error",children:"We noticed you're using a high number of activation strategies. To ensure a more targeted approach, consider leveraging constraints or segments."}),t.jsx("br",{}),I.map((b,E)=>t.jsx(bs,{strategy:b,index:E+k*C,environmentName:e.name,otherEnvironments:n,isDragging:!1,onDragStartRef:()=>{},onDragOver:()=>{},onDragEnd:()=>{}},b.id)),t.jsx("br",{}),t.jsx(Ir,{count:_.length,shape:"rounded",page:k+1,onChange:(b,E)=>B(E-1)})]})}),elseShow:t.jsx(Qi,{projectId:a,featureId:o,environmentId:e.name})})]})})},wn=(e,s)=>e===0?0:Math.round(s/e*100);var pt={},gt={};Object.defineProperty(gt,"__esModule",{value:!0});gt.defaultOptions=void 0;gt.defaultOptions={lowercase:!1,precision:1,space:!1,units:["","K","M","B","T","P","E"]};var pe={};Object.defineProperty(pe,"__esModule",{value:!0});pe.getLocales=pe.getFractionDigits=pe.roundTo=pe.parseValue=void 0;function nc(e){const s=parseFloat(e==null?void 0:e.toString());if(isNaN(s))throw new Error("Input value is not a number");if(s>Number.MAX_SAFE_INTEGER||s<Number.MIN_SAFE_INTEGER)throw new RangeError("Input value is outside of safe integer range");return s}pe.parseValue=nc;function ac(e,s){if(!Number.isFinite(e))throw new Error("Input value is not a finite number");if(!Number.isInteger(s)||s<0)throw new Error("Precision is not a positive integer");return Number.isInteger(e)?e:parseFloat(e.toFixed(s))}pe.roundTo=ac;function oc(e){var s;if(Number.isInteger(e))return 0;const n=e.toString().split(".")[1];return(s=n==null?void 0:n.length)!==null&&s!==void 0?s:0}pe.getFractionDigits=oc;function rc(){var e;return typeof navigator>"u"?[]:Array.from((e=navigator.languages)!==null&&e!==void 0?e:[])}pe.getLocales=rc;Object.defineProperty(pt,"__esModule",{value:!0});pt.millify=void 0;const Ss=gt,st=pe,vs=1e3;function*Cs(e){let s=vs;for(;;){const n=e/s;if(n<1)return;yield n,s*=vs}}function Tn(e,s){var n,a;const o=s?{...Ss.defaultOptions,...s}:Ss.defaultOptions;if(!Array.isArray(o.units)||!o.units.length)throw new Error("Option `units` must be a non-empty array");let r;try{r=st.parseValue(e)}catch(j){return j instanceof Error&&console.warn(`WARN: ${j.message} (millify)`),String(e)}const i=r<0?"-":"";r=Math.abs(r);let c=0;for(const j of Cs(r))r=j,c+=1;if(c>=o.units.length)return e.toString();let d=st.roundTo(r,o.precision);for(const j of Cs(d))d=j,c+=1;const p=(n=o.units[c])!==null&&n!==void 0?n:"",f=o.lowercase?p.toLowerCase():p,y=o.space?" ":"",m=d.toLocaleString((a=o.locales)!==null&&a!==void 0?a:st.getLocales(),{minimumFractionDigits:st.getFractionDigits(d)});return`${i}${m}${y}${f}`}pt.millify=Tn;var ic=pt.default=Tn;const rt=({value:e,threshold:s=1e6,precision:n=2})=>{let a,o=!1;e<s?a=e.toLocaleString():(a=ic(e,{precision:n}),o=!0);const r=t.jsx("span",{"data-testid":za,children:a});return t.jsx(v,{condition:o,show:t.jsx(de,{title:e.toLocaleString(),arrow:!0,children:r}),elseShow:r})},cc=e=>e>48?`${Math.floor(e/24)} days (UTC)`:`${e} hours (local time)`,Ct=g("article")(({theme:e})=>({padding:e.spacing(2),background:"transparent",borderRadius:e.spacing(2),textAlign:"center",[e.breakpoints.up("md")]:{padding:e.spacing(4)}})),wt=g("h3")(({theme:e})=>({margin:0,fontSize:e.fontSizes.bodySize,fontWeight:e.fontWeight.thin})),Tt=g("p")(({theme:e})=>({fontSize:"2.25rem",fontWeight:e.fontWeight.bold,color:e.palette.primary.main})),Et=g("p")(({theme:e})=>({margin:e.spacing(1,0,0,0),padding:e.spacing(2,0,0,0),borderTopWidth:"1px",borderTopStyle:"solid",borderTopColor:e.palette.divider,fontSize:e.fontSizes.smallerBody,color:e.palette.text.secondary})),En=({totalYes:e,totalNo:s,hoursBack:n,statsSectionId:a,tableSectionId:o})=>{const r=n===1?"in the last hour":`in the last ${cc(n)}`;return t.jsxs(ve,{container:!0,spacing:2,id:a,"aria-describedby":o,"aria-label":"Feature metrics summary",component:"section",children:[t.jsx(ve,{item:!0,xs:12,sm:4,children:t.jsxs(Ct,{children:[t.jsx(wt,{children:"Exposure"}),t.jsx(Tt,{children:t.jsx(rt,{value:e})}),t.jsxs(Et,{children:["Total exposure of the feature in the environment"," ",r,"."]})]})}),t.jsx(ve,{item:!0,xs:12,sm:4,children:t.jsxs(Ct,{children:[t.jsx(wt,{children:"Exposure %"}),t.jsxs(Tt,{children:[wn(e+s,e),"%"]}),t.jsxs(Et,{children:["% total exposure of the feature in the environment"," ",r,"."]})]})}),t.jsx(ve,{item:!0,xs:12,sm:4,children:t.jsxs(Ct,{children:[t.jsx(wt,{children:"Requests"}),t.jsx(Tt,{children:t.jsx(rt,{value:e+s})}),t.jsxs(Et,{children:["Total requests for the feature in the environment"," ",r,"."]})]})})]})},lc=g("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"center",margin:"1rem 0",position:"relative","&:before":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",height:2,width:"100%",backgroundColor:e.palette.divider}})),dc=g("span")(({theme:e})=>({fontSize:e.fontSizes.bodySize,textAlign:"center",padding:"0 1rem",background:e.palette.envAccordion.expanded,position:"relative",maxWidth:"80%",color:e.palette.text.primary})),uc=({children:e})=>t.jsx(lc,{children:t.jsx(dc,{children:e})}),pc=({environmentMetric:e})=>e?t.jsxs(t.Fragment,{children:[t.jsx(uc,{children:"Feature flag exposure"}),t.jsx("div",{children:t.jsx(En,{totalYes:e.yes,totalNo:e.no,hoursBack:1})})]}):null,ws=g("div")({marginLeft:"auto",display:"flex",alignItems:"center"}),Ts=g("div")(({theme:e})=>({marginRight:e.spacing(1),display:"flex",flexDirection:"column"})),Es=g("p")(({theme:e})=>({color:e.palette.primary.main,textAlign:"right",fontSize:e.fontSizes.bodySize})),Rs=g("p")(({theme:e})=>({maxWidth:"270px",marginTop:e.spacing(.5),fontSize:e.fontSizes.smallBody,textAlign:"right",[e.breakpoints.down(700)]:{display:"none"}})),gc=g(Va)(({theme:e})=>({fill:e.palette.background.elevation2,height:"75px",width:"75px",[e.breakpoints.down(500)]:{display:"none"}})),hc=g("div")(({theme:e})=>({margin:e.spacing(0,2),[e.breakpoints.down(500)]:{display:"none"}})),fc=({environmentMetric:e,disabled:s=!1})=>{const n=Na();if(!e)return null;const a=e.yes+e.no,o=wn(a,e==null?void 0:e.yes);return!e||e.yes===0&&e.no===0?t.jsxs(ws,{children:[t.jsxs(Ts,{children:[t.jsxs(Es,{style:{color:s?n.palette.text.secondary:void 0},"data-loading":!0,children:[o,"%"]}),t.jsxs(Rs,{style:{color:s?n.palette.text.secondary:n.palette.text.primary},"data-loading":!0,children:["The feature has been requested ",t.jsx("b",{children:"0 times"})," and exposed",t.jsx("b",{children:" 0 times"})," in the last hour"]})]}),t.jsx(gc,{style:{transform:"scale(1.1)"},"data-loading":!0})]}):t.jsxs(ws,{children:[t.jsxs(Ts,{children:[t.jsxs(Es,{children:[o,"%"]}),t.jsxs(Rs,{children:["The feature has been requested"," ",t.jsxs("b",{children:[t.jsx(rt,{value:a})," times"]})," ","and exposed"," ",t.jsxs("b",{children:[t.jsx(rt,{value:e.yes})," ","times"]})," ","in the last hour"]})]}),t.jsx(hc,{"data-loading":!0,children:t.jsx(qa,{percentage:o,size:"3rem"})})]})},Rt=({strategy:e})=>{const s=on(e.name);return t.jsx(de,{title:Ze(e.name)+(e.title?` - ${e.title}`:""),arrow:!0,children:t.jsx(xc,{children:t.jsx(s,{})})})},xc=g("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"center",color:e.palette.action.disabled,"& svg":{width:e.spacing(2.5),height:e.spacing(2.5)}})),As=g("ul")(()=>({all:"unset",display:"flex",alignItems:"center",alignContent:"center"})),At=g("li")(()=>({all:"unset",minWidth:30,textAlign:"center"})),yc=g("div")(({theme:e})=>({display:"flex",flexDirection:"row",alignItems:"center",gap:e.spacing(1)})),nt=5,mc=({strategies:e})=>e!=null&&e.length?e.length>nt+1?t.jsxs(As,{"aria-label":"Feature strategies",children:[e.slice(0,nt).map(s=>t.jsx(At,{children:t.jsx(Rt,{strategy:s})},s.id)),t.jsxs(Ke,{tooltip:e.slice(nt).map(s=>t.jsx(At,{children:t.jsxs(yc,{children:[t.jsx(Rt,{strategy:s})," ",Ze(s.name)+(s.title?` - ${s.title}`:"")]})},s.id)),children:["(+",e.length-nt,")"]})]}):t.jsx(As,{"aria-label":"Feature strategies",children:e.map(s=>t.jsx(At,{children:t.jsx(Rt,{strategy:s})},s.id))}):null,Rn=()=>{const{value:e,setValue:s}=Wa("global:v1",{});return{value:{...e,hiddenEnvironments:Array.from(e.hiddenEnvironments||[])},setValue:s}},jc=g("div",{shouldForwardProp:e=>e!=="enabled"})(({theme:e,enabled:s})=>({borderRadius:e.shape.borderRadiusLarge,marginBottom:e.spacing(2),backgroundColor:s?e.palette.background.paper:e.palette.envAccordion.disabled})),bc=g(Ha)({boxShadow:"none",background:"none"}),Sc=g(Ua)(({theme:e})=>({boxShadow:"none",padding:e.spacing(2,4),[e.breakpoints.down(400)]:{padding:e.spacing(1,2)}})),vc=g(Ga,{shouldForwardProp:e=>e!=="enabled"})(({theme:e})=>({padding:e.spacing(3),background:e.palette.envAccordion.expanded,borderBottomLeftRadius:e.shape.borderRadiusLarge,borderBottomRightRadius:e.shape.borderRadiusLarge,boxShadow:e.boxShadows.accordionFooter,[e.breakpoints.down("md")]:{padding:e.spacing(2,1)}})),Cc=g(sc)(({theme:e})=>({width:"100%",position:"relative",paddingBottom:e.spacing(2)})),wc=g("div",{shouldForwardProp:e=>e!=="enabled"})(({theme:e,enabled:s})=>({display:"flex",justifyContent:"center",flexDirection:"column",color:s?e.palette.text.primary:e.palette.text.secondary})),Tc=g("div")(({theme:e})=>({display:"flex",alignItems:"center",[e.breakpoints.down(560)]:{flexDirection:"column",textAlign:"center"}})),Ec=g(Ya)(({theme:e})=>({[e.breakpoints.down(560)]:{marginBottom:"0.5rem"}})),Rc=g(Nt)(({theme:e})=>({fontSize:e.fontSizes.bodySize,fontWeight:e.typography.fontWeightMedium,[e.breakpoints.down(560)]:{textAlign:"center"}})),Ac=g("div")(({theme:e})=>({display:"flex",alignItems:"center",marginTop:e.spacing(2),gap:e.spacing(2),flexWrap:"wrap",[e.breakpoints.down(560)]:{flexDirection:"column"}})),Dc=({env:e})=>{var d;const s=$("projectId"),n=$("featureId"),{metrics:a}=ii(s,n),{feature:o}=W(s,n),{value:r}=Rn(),c=li(o==null?void 0:o.environments,a).find(p=>p.environment===e.name),l=o==null?void 0:o.environments.find(p=>p.name===e.name);return t.jsx(v,{condition:!new Set(r.hiddenEnvironments).has(e.name),show:t.jsx(jc,{enabled:e.enabled,children:t.jsxs(bc,{TransitionProps:{mountOnEnter:!0},"data-testid":`${Ja}_${e.name}`,className:`environment-accordion ${e.enabled?"":"accordion-disabled"}`,children:[t.jsxs(Sc,{expandIcon:t.jsx(Ka,{titleAccess:"Toggle"}),children:[t.jsxs(wc,{"data-loading":!0,enabled:e.enabled,children:[t.jsxs(Tc,{children:[t.jsx(Ec,{enabled:e.enabled}),t.jsx("div",{children:t.jsx(Rc,{text:e.name,maxWidth:"100",maxLength:15})}),t.jsx(v,{condition:!e.enabled,show:t.jsx(Ne,{color:"neutral",sx:{ml:1},children:"Disabled"})})]}),t.jsxs(Ac,{children:[t.jsx(Pt,{label:"Add strategy",projectId:s,featureId:n,environmentId:e.name,variant:"outlined",size:"small"}),t.jsx(mc,{strategies:l==null?void 0:l.strategies})]})]}),t.jsx(fc,{environmentMetric:c,disabled:!e.enabled})]}),t.jsxs(vc,{enabled:e.enabled,children:[t.jsx(Cc,{featureEnvironment:l,isDisabled:!e.enabled,otherEnvironments:o==null?void 0:o.environments.map(({name:p})=>p).filter(p=>p!==e.name)}),t.jsx(v,{condition:(((d=l==null?void 0:l.strategies)==null?void 0:d.length)||0)>0,show:t.jsxs(t.Fragment,{children:[t.jsx(Q,{sx:{display:"flex",justifyContent:"center",py:1},children:t.jsx(Pt,{label:"Add strategy",projectId:s,featureId:n,environmentId:e.name})}),t.jsx(pc,{environmentMetric:c})]})})]})]})})})},$c=()=>{const e=$("projectId"),s=$("featureId"),{feature:n}=W(e,s);if(!n)return null;const{environments:a}=n;return t.jsx(t.Fragment,{children:a==null?void 0:a.map(o=>t.jsx(Dc,{env:o},o.name))})},kc=g(Je,{shouldForwardProp:e=>e!=="visibilityOff"})(({theme:e,visibilityOff:s})=>({marginLeft:"auto",marginRight:e.spacing(-1),color:s?e.palette.action.active:e.palette.action.focus,"&:hover":{color:e.palette.action.active}})),Fc=({environment:e,hiddenEnvironments:s,setHiddenEnvironments:n})=>{const a=()=>{n(e.name)};return t.jsx(kc,{onClick:a,visibilityOff:s.has(e.name),children:t.jsx(v,{condition:s.has(e.name),show:t.jsx(Qa,{}),elseShow:t.jsx(Za,{})})})},Ic=g("div")(({theme:e})=>({marginLeft:e.spacing(-1.5),"&:not(:last-of-type)":{marginBottom:e.spacing(2)},display:"flex",alignItems:"center"})),Pc=g("label")(()=>({display:"inline-flex",alignItems:"center",cursor:"pointer"})),_c=({environment:e,callback:s,children:n,hiddenEnvironments:a,setHiddenEnvironments:o})=>{const r=$("projectId"),i=$("featureId"),{feature:c,refetchFeature:l}=W(r,i),{isChangeRequestConfigured:d}=ie(r),p=t.jsxs(t.Fragment,{children:[" ",t.jsxs("span",{"data-loading":!0,children:[e.enabled?"enabled":"disabled"," in"]})," ",t.jsx(Nt,{text:e.name,maxWidth:"120",maxLength:15})]}),{onToggle:f,modals:y}=nr(r),m=(j,S)=>f(j,{projectId:r,featureId:i,environmentName:e.name,environmentType:e.type,hasStrategies:e.strategies.length>0,hasEnabledStrategies:e.strategies.some(u=>!u.disabled),isChangeRequestEnabled:d(e.name),onRollback:S,onSuccess:()=>{s&&s(),l()}});return t.jsxs(Ic,{children:[t.jsxs(Pc,{children:[t.jsx(ar,{featureId:c.name,projectId:r,environmentName:e.name,onToggle:m,value:e.enabled}),n??p]}),t.jsx(Fc,{environment:e,hiddenEnvironments:a,setHiddenEnvironments:o}),y]})},Oc=g("div")(({theme:e})=>({padding:e.spacing(3)})),Bc=g("div")(()=>({display:"flex",flexDirection:"column"})),Lc=g("p")(({theme:e})=>({fontSize:e.fontSizes.bodySize})),Mc=g("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,display:"flex",alignItems:"center"})),Ds=g("span")(({theme:e})=>({padding:e.spacing(0,.5),"::after":{content:'"-"'}})),zc=g(Wt)(()=>({"&:hover, &:focus":{textDecoration:"underline"}})),Vc=({feature:e,header:s,hiddenEnvironments:n,setHiddenEnvironments:a})=>{const o=e.environments.some(r=>{var i;return r.enabled&&((i=r.variants)==null?void 0:i.length)});return t.jsxs(Oc,{"data-testid":"feature-flag-status",children:[s,e.environments.map(r=>{const i=r.strategies.length===1?"1 strategy":`${r.strategies.length} strategies`,c=r.variants??[],l=c.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Ds,{}),t.jsx(de,{title:"View variants",arrow:!0,describeChild:!0,children:t.jsx(zc,{component:oe,to:`/projects/${e.project}/features/${e.name}/variants`,underline:"hover",children:c.length===1?"1 variant":`${c.length} variants`})})]}),d=r.enabled&&c.length===0&&o;return t.jsx(_c,{environment:r,hiddenEnvironments:n,setHiddenEnvironments:a,children:t.jsxs(Bc,{children:[t.jsx(Lc,{children:r.name}),t.jsxs(Mc,{children:[i,l,t.jsx(v,{condition:d,show:t.jsxs(t.Fragment,{children:[t.jsx(Ds,{}),t.jsx(or,{})]})})]})]})},r.name)})]})},An=(e,s={})=>{const n=async()=>{const d=ke(`api/admin/features/${e}/tags`);return(await fetch(d,{method:"GET"}).then(qe("Tags"))).json()},a=`api/admin/features/${e}/tags`,{data:o,error:r}=Ks(!!e,{tags:[]},a,n,s),[i,c]=x.useState(!r&&!o),l=()=>{Mt(a)};return x.useEffect(()=>{c(!r&&!o)},[o,r]),{tags:(o==null?void 0:o.tags)||[],error:r,loading:i,refetch:l}},Nc=g("section")(({theme:e})=>({"& > *":{margin:e.spacing(1,0)}})),Dt=e=>e.map(s=>({title:s.value})),$s=(e,s)=>e.map(n=>({value:n.title,type:s})),Dn=({open:e,setOpen:s})=>{const{tagTypes:n}=Xa(),a=$("featureId"),{createTag:o}=rr(),{updateFeatureTags:r,loading:i}=dt(),{tags:c,refetch:l,loading:d}=An(a),{setToastData:p}=ne(),f=n&&n.length>0?n[0]:{name:"simple",description:"Simple tag to get you started",icon:""},[y,m]=x.useState(f),j=i||d,[S,u]=x.useState(0),{trackEvent:h}=be(),[C,I]=x.useState(Dt(c.filter(T=>T.type===y.name))),{tags:_,refetch:B}=ir(y.name),k=x.useMemo(()=>Dt(_),[_]);x.useEffect(()=>{c&&y&&I(Dt(c.filter(T=>T.type===y.name)))},[JSON.stringify(c),y]);const P=()=>{s(!1),I([])};function A(T,F){const O=T.filter(M=>M.type===y.name).filter(M=>!F.find(z=>M.value===z.value&&M.type===z.type)),q=F.filter(M=>M.type===y.name).filter(M=>!T.find(z=>M.value===z.value&&M.type===z.type));return u(O.length+q.length),{added:O,removed:q}}const D=T=>T.filter(F=>!F.title.startsWith("Create")),L=async(T,F)=>{try{await r(a,{addedTags:T,removedTags:F}),await l()}catch(O){const q=Y(O);p({type:"error",title:"Failed to add tag",text:q,confetti:!1})}},Z=(T,F)=>{let O="We successfully";return T>0&&(O=O.concat(` added ${T} new tag${T>1?"s":""}`)),T>0&&F>0&&(O=O.concat(" and ")),F>0&&(O=O.concat(` removed ${F} tag${F>1?"s":""}`)),O},ee=async T=>{T.preventDefault();const F=$s(D(C),y.name),{added:O,removed:q}=A(F,c);S>0&&(await L(O,q),S>1&&h("suggest_tags",{props:{eventType:"multiple_tags_added"}}),S>0&&p({type:"success",title:`Updated tag${O.length>1?"s":""} to flag`,text:Z(O.length,q.length),confetti:!0})),u(0),I([]),s(!1)},b=(T,F)=>{F!=null&&typeof F!="string"&&(T.preventDefault(),m(F),I([]),u(0))},E=(T,F,O)=>{const q=eo(F);O==="selectOption"&&F.forEach((z,te)=>{if(typeof z!="string"&&z.inputValue&&z.inputValue!==""){const H={value:z.inputValue,type:y.name};o(H).then(()=>{h("suggest_tags",{props:{eventType:"tag_created"}}),B()}),z.title=z.inputValue,z.inputValue="",q[te]=z}});const M=$s(D(q),y.name);A(M,c),I(q)},w="add-tag-form";return t.jsx(je,{open:e,secondaryButtonText:"Cancel",primaryButtonText:"Save tags",title:"Update feature flag tags",onClick:ee,disabledPrimaryButton:j||S===0,onClose:P,formId:w,children:t.jsxs(t.Fragment,{children:[t.jsx(J,{paragraph:!0,sx:{marginBottom:T=>T.spacing(2.5)},children:"Tags allow you to group features together"}),t.jsx("form",{id:w,onSubmit:ee,children:t.jsxs(Nc,{children:[t.jsx(cr,{options:n,value:y,onChange:b}),t.jsx(lr,{options:k,existingTags:c,tagType:y,selectedOptions:C,onChange:E})]})})]})})},qc=g("div")(({theme:e})=>({display:"flex",flexDirection:"column",padding:e.spacing(3)})),Wc=g("div")(({theme:e})=>({display:"flex",gap:e.spacing(1),flexWrap:"wrap"})),Hc=g(rn)(({theme:e})=>({fontSize:e.fontSizes.smallBody})),Uc=g(ut)(({theme:e})=>({margin:e.spacing(3),borderStyle:"dashed"})),Gc=g(Fe)(({theme:e})=>({maxWidth:e.spacing(20),alignSelf:"center"})),Yc=({feature:e,header:s})=>{const{tags:n,refetch:a}=An(e.name),{deleteTagFromFeature:o}=dt(),[r,i]=x.useState(!1),[c,l]=x.useState(!1),[d,p]=x.useState(),{setToastData:f,setToastApiError:y}=ne(),{hasAccess:m}=x.useContext(Vt),j=m(Ve,e.project),S=async()=>{if(d)try{await o(e.name,d.type,d.value),a(),f({type:"success",title:"Tag deleted",text:"Successfully deleted tag"})}catch(u){y(Y(u))}};return t.jsxs(qc,{children:[s,t.jsx(Wc,{children:n.map(u=>{const h=`${u.type}:${u.value}`;return t.jsx(Hc,{label:h,deleteIcon:t.jsx(to,{titleAccess:"Remove"}),onDelete:j?()=>{l(!0),p(u)}:void 0},h)})}),t.jsx(v,{condition:j,show:t.jsxs(t.Fragment,{children:[t.jsx(v,{condition:n.length>0,show:t.jsx(Uc,{})}),t.jsx(Gc,{"data-loading":!0,variant:"outlined",startIcon:t.jsx(so,{}),onClick:()=>i(!0),children:"Add new tag"})]})}),t.jsx(Dn,{open:r,setOpen:i}),t.jsxs(je,{open:c,primaryButtonText:"Delete tag",secondaryButtonText:"Cancel",onClose:()=>{l(!1),p(void 0)},onClick:()=>{l(!1),S(),p(void 0)},title:"Delete tag?",children:["You are about to delete tag:"," ",t.jsxs("strong",{children:[d==null?void 0:d.type,":",d==null?void 0:d.value]})]})]})},Jc=g(Q)(({theme:e})=>({top:e.spacing(2),borderRadius:e.shape.borderRadiusLarge,backgroundColor:e.palette.background.paper,display:"flex",flexDirection:"column",maxWidth:"350px",minWidth:"350px",marginRight:"1rem",marginTop:"1rem",[e.breakpoints.down(1e3)]:{marginBottom:"1rem",width:"100%",maxWidth:"none",minWidth:"auto"}})),ks=g("h3")(({theme:e})=>({display:"flex",gap:e.spacing(1),alignItems:"center",fontSize:e.fontSizes.bodySize,margin:0,marginBottom:e.spacing(3),"& > :last-child":{position:"relative",top:1}})),Kc=({hiddenEnvironments:e,setHiddenEnvironments:s})=>{var i;const n=$("projectId"),a=$("featureId"),{feature:o}=W(n,a),r=((i=o.environments)==null?void 0:i.length)<=3;return t.jsxs(Jc,{as:r?no:Q,children:[t.jsx(Vc,{header:t.jsxs(ks,{"data-loading":!0,children:["Enabled in environments (",o.environments.filter(({enabled:c})=>c).length,")",t.jsx(ao,{tooltip:"When a feature is switched off in an environment, it will always return false. When switched on, it will return true or false depending on its strategies.",placement:"top"})]}),feature:o,hiddenEnvironments:e,setHiddenEnvironments:s}),t.jsx(ut,{}),t.jsx(Yc,{header:t.jsx(ks,{"data-loading":!0,children:"Tags for this feature flag"}),feature:o})]})},Qc=()=>{const{trackEvent:e}=be(),{value:s,setValue:n}=Rn(),[a,o]=x.useState(new Set(s.hiddenEnvironments));return{hiddenEnvironments:a,setHiddenEnvironments:i=>{n(c=>{const l=new Set(Array.from(c.hiddenEnvironments||[]));return l.has(i)?(l.delete(i),e("hidden_environment",{props:{eventType:"environment unhidden"}})):(l.add(i),e("hidden_environment",{props:{eventType:"environment hidden"}})),o(l),{...s,hiddenEnvironments:[...l]}})}}},Zc=g("div")(({theme:e})=>({display:"flex",width:"100%",[e.breakpoints.down(1e3)]:{flexDirection:"column"}})),Xc=g("div")(({theme:e})=>({display:"flex",flexDirection:"column",width:"calc(100% - (350px + 1rem))",[e.breakpoints.down(1e3)]:{width:"100%"}})),el=()=>{const e=Ee(),s=$("projectId"),n=$("featureId"),a=zt(s,n),{hiddenEnvironments:o,setHiddenEnvironments:r}=Qc(),i=()=>e(a);cn(n);const{setLastViewed:c}=oo();return x.useEffect(()=>{c({featureId:n,projectId:s})},[n]),t.jsxs(Zc,{children:[t.jsxs("div",{children:[t.jsx(ri,{}),t.jsx(Kc,{hiddenEnvironments:o,setHiddenEnvironments:r})]}),t.jsx(Xc,{children:t.jsx($c,{})}),t.jsxs(ln,{children:[t.jsx(Ae,{path:"strategies/create",element:t.jsx(It,{label:"Create feature strategy",onClose:i,open:!0,children:t.jsx(Mi,{})})}),t.jsx(Ae,{path:"strategies/edit",element:t.jsx(It,{label:"Edit feature strategy",onClose:i,open:!0,children:t.jsx(ro,{})})})]})]})},tl=g("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"space-between","& > div":{display:"flex",alignItems:"center"},marginTop:e.spacing(-3.5),marginBottom:e.spacing(2),backgroundColor:e.palette.background.default,paddingTop:e.spacing(2),paddingBottom:e.spacing(2),position:"sticky",top:0,zIndex:2})),sl=g(dn,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.neutral.border:e.palette.primary.main})),nl=g("span",{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.text.secondary:e.palette.text.primary,marginLeft:e.spacing(1.25),fontSize:e.fontSizes.mainHeader,fontWeight:e.fontWeight.bold})),al=g("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),ol=g(ge)(({theme:e})=>({marginBottom:e.spacing(2)})),rl=g(ge)(({theme:e})=>({marginTop:e.spacing(4)})),il=g("div")({display:"flex",flexDirection:"column"}),cl=g("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Fs=g("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),ll=g(ut)(({theme:e})=>({margin:e.spacing(4,0)})),dl=g(io)(({theme:e})=>({minWidth:e.spacing(20),width:"100%"})),ul=g("div")(({theme:e})=>({marginTop:"auto",paddingTop:e.spacing(4),display:"flex",justifyContent:"flex-end"})),pl=g(Fe)(({theme:e})=>({marginLeft:e.spacing(3)})),gl=x.memo(co),hl=({environment:e,open:s,setOpen:n,getApiPayload:a,getCrPayload:o,onConfirm:r})=>{const i=$("projectId"),c=$("featureId"),{uiConfig:l}=Qe(),{context:d}=lo(),{defaultStickiness:p,loading:f}=uo(i),{isChangeRequestConfigured:y}=ie(i),{data:m}=Se(i),{changeRequestInReviewOrApproved:j,alert:S}=go(m),u=(e==null?void 0:e.variants)||[],[h,C]=x.useState([]),[I,_]=x.useState();x.useEffect(()=>{f||C(u.length?u.map(R=>({...R,isValid:!0,new:!1,id:yt()})):[{name:"",weightType:os.VARIABLE,weight:0,overrides:[],stickiness:(h==null?void 0:h.length)>0?h[0].stickiness:p,new:!0,isValid:!1,id:yt()}])},[s,f]);const B=(R,K)=>{C(he=>rs(he.map(Re=>Re.id===K?R:Re),1e3))},k=()=>{const R=yt();C(K=>[...K,{name:"",weightType:os.VARIABLE,weight:0,overrides:[],stickiness:(K==null?void 0:K.length)>0?K[0].stickiness:p,new:!0,isValid:!1,id:R}]),_(R)};x.useEffect(()=>{if(I){const R=document.getElementById(`variant-name-input-${I}`);R==null||R.scrollIntoView({behavior:"smooth",block:"center"}),R==null||R.focus({preventScroll:!0}),_(void 0)}},[I]);const P=h.map(({new:R,isValid:K,id:he,...Re})=>Re),A=a(u,P),D=o(P),L=async R=>{R.preventDefault(),r(P)},Z=()=>w?`curl --location --request POST '${l.unleashUrl}/api/admin/projects/${i}/environments/${e==null?void 0:e.name}/change-requests' \\
|
|
@@ -7,4 +7,4 @@ import{ax as Vs,ay as Ns,az as _t,aA as _n,aB as re,aC as ct,j as t,s as g,aD as
|
|
|
7
7
|
--data-raw '${JSON.stringify(D,void 0,2)}'`:`curl --location --request PATCH '${l.unleashUrl}/api/admin/projects/${i}/features/${c}/environments/${e==null?void 0:e.name}/variants' \\
|
|
8
8
|
--header 'Authorization: INSERT_API_KEY' \\
|
|
9
9
|
--header 'Content-Type: application/json' \\
|
|
10
|
-
--data-raw '${JSON.stringify(A.patch,void 0,2)}'`,ee=h.every(({isValid:R})=>R),b=j((e==null?void 0:e.name)||""),E=b?"Add to existing change request":"Add change to draft",w=y((e==null?void 0:e.name)||""),T=x.useMemo(()=>{var R;return f?"":((R=P[0])==null?void 0:R.stickiness)||p},[f,p,JSON.stringify(P[0]??{})]),F=x.useMemo(()=>["default",...d.filter(R=>R.stickiness).map(R=>R.name)],[d]),O=F.map(R=>({key:R,label:R}));F.includes(T)||O.push({key:T,label:T});const q=async R=>{C(K=>K.map(he=>({...he,stickiness:R})))},M=R=>{q(R)},[z,te]=x.useState();x.useEffect(()=>{te(void 0),A.error&&te(A.error)},[A.error]);const H=()=>{q(p),n(!1)};return f||T===""?t.jsx(po,{}):t.jsx(It,{open:s,onClose:H,label:"",children:t.jsxs(an,{modal:!0,title:"",description:"Variants allow you to return a variant object if the feature flag is considered enabled for the current request.",documentationLink:"https://docs.getunleash.io/reference/feature-toggle-variants",documentationLinkLabel:"Feature flag variants documentation",formatApiCode:Z,loading:!s,children:[t.jsxs(tl,{children:[t.jsxs("div",{children:[t.jsx(sl,{deprecated:!(e!=null&&e.enabled)}),t.jsx(nl,{deprecated:!(e!=null&&e.enabled),children:e==null?void 0:e.name})]}),t.jsx(we,{"data-testid":"MODAL_ADD_VARIANT_BUTTON",onClick:k,variant:"outlined",permission:Oe,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"})]}),t.jsxs(al,{onSubmit:L,children:[t.jsx(v,{condition:b,show:S,elseShow:t.jsx(v,{condition:!!w,show:t.jsxs(ol,{severity:"info",children:[t.jsx("strong",{children:"Change requests"})," are enabled",e?` for ${e.name}`:"",". Your changes need to be approved before they will be live. All the changes you do now will be added into a draft that you can submit for review."]})})}),t.jsx(il,{children:h.map(R=>t.jsx(gl,{variant:R,variants:h,updateVariant:K=>B(K,R.id),removeVariant:()=>C(K=>rs(K.filter(he=>he.id!==R.id),1e3)),error:A.error},R.id))}),t.jsx(we,{onClick:k,variant:"outlined",permission:Oe,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"}),t.jsx(ll,{}),t.jsx(v,{condition:h.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(cl,{children:t.jsx("p",{children:"Stickiness"})}),t.jsxs(Fs,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t.jsx(Wt,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]}),t.jsx("div",{children:t.jsx(dl,{value:T,label:"",editable:!0,onChange:R=>M(R.target.value)})})]}),elseShow:t.jsx(Fs,{children:"This environment has no variants. Get started by adding a variant."})}),t.jsxs(rl,{severity:"error",hidden:!z,children:[t.jsx("strong",{children:"Error: "}),z]}),t.jsxs(ul,{children:[t.jsx(Fe,{"data-testid":"DIALOGUE_CONFIRM_ID",type:"submit",variant:"contained",color:"primary",disabled:!ee,children:w?E:"Save variants"}),t.jsx(pl,{onClick:H,children:"Cancel"})]})]})]})})},fl=e=>fetch(e).then(qe("ChangeRequest")).then(s=>s.json()),xl=(e,s)=>{const{data:n,error:a,mutate:o}=nn([],ke(`api/admin/projects/${e}/change-requests/scheduled?variantForFlag=${s}`),fl);return{changeRequests:n,loading:!a&&!n,refetch:o,error:a}},yl=(e,s,n)=>{const{changeRequests:a}=xl(e,s),o=a==null?void 0:a.filter(r=>r.environment===n);return o?o.map(r=>r.id):[]},ml=g("div")(({theme:e})=>({padding:e.spacing(3),borderRadius:e.shape.borderRadiusLarge,border:`1px solid ${e.palette.divider}`,"&:not(:last-child)":{marginBottom:e.spacing(3)}})),jl=g("div")({display:"flex",alignItems:"center",justifyContent:"space-between","& > div":{display:"flex",alignItems:"center"}}),bl=g(dn,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.neutral.border:e.palette.primary.main})),Sl=g("span",{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.text.secondary:e.palette.text.primary,marginLeft:e.spacing(1.25),fontWeight:e.fontWeight.bold})),vl=g("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),Cl=g("div")(({theme:e})=>({margin:e.spacing(3,0)})),wl=g("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Tl=({environment:e,searchValue:s,children:n})=>{var l;const a=$("projectId"),o=$("featureId"),r=yl(a,o,e.name),i=e.variants??[],c=((l=i[0])==null?void 0:l.stickiness)||"default";return t.jsxs(ml,{children:[t.jsxs(jl,{children:[t.jsxs("div",{children:[t.jsx(bl,{deprecated:!e.enabled}),t.jsx(Sl,{deprecated:!e.enabled,children:e.name}),t.jsx(v,{condition:r.length>0,show:t.jsx(ho,{sx:{ml:2},children:t.jsx(vn,{scheduledChangeRequestIds:r})})})]}),n]}),t.jsx(v,{condition:i.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(Cl,{children:t.jsx(fo,{variants:i,searchValue:s})}),t.jsx(v,{condition:i.length>1,show:t.jsxs(t.Fragment,{children:[t.jsxs(wl,{children:[t.jsx("p",{children:"Stickiness:"}),t.jsx(Ne,{children:c})]}),t.jsxs(vl,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t.jsx(Wt,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]})]})})]})})]})},El=g(De)(({theme:e})=>({"& span":{fontSize:e.fontSizes.smallBody}})),Rl=({environment:e,permission:s,projectId:n,environmentId:a,onCopyVariantsFrom:o,otherEnvsWithVariants:r})=>{const[i,c]=x.useState(null),l=!!i,d=e.variants??[];return t.jsx(v,{condition:r.length>0&&d.length===0,show:t.jsxs(t.Fragment,{children:[t.jsx(we,{onClick:p=>{c(p.currentTarget)},id:`copy-from-menu-${e.name}`,"aria-controls":l?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":l?"true":void 0,variant:"outlined",permission:s,projectId:n,environmentId:a,children:"Copy variants from"}),t.jsx(Xe,{anchorEl:i,open:l,onClose:()=>c(null),MenuListProps:{"aria-labelledby":`copy-from-menu-${e.name}`},children:r.map(p=>t.jsx(Ce,{onClick:()=>o(p,e),children:t.jsx(El,{children:`Copy from ${p.name}`})},p.name))})]})})},Al=({permission:e,projectId:s,environment:n,checked:a,onClick:o,...r})=>{const i=Ft(e,s,n);return t.jsxs(Ce,{disabled:!i,onClick:o,...r,children:[t.jsx(Hs,{checked:a}),n]})},Dl=g(Xe)(({theme:e})=>({"& > div > ul":{display:"flex",flexDirection:"column",justifyContent:"center","& > li":{padding:e.spacing(0,1)}}})),$l=g("div")(({theme:e})=>({margin:e.spacing(1,2)})),kl=g(Fe)(({theme:e})=>({marginTop:e.spacing(2)})),Fl=({current:e,environments:s,permission:n,projectId:a,onSubmit:o})=>{var S;const[r,i]=x.useState(null),c=!!r,[l,d]=x.useState([]),p=u=>{d(h=>[...h,u])},f=u=>{d(h=>h.filter(({name:C})=>C!==u.name))},y=u=>{l.includes(u)?f(u):p(u)},m=()=>{d([]),i(null)},j=((S=s.find(u=>u.name===e))==null?void 0:S.variants)??[];return t.jsx(v,{condition:j.length>0&&s.length>1,show:t.jsxs(t.Fragment,{children:[t.jsx(Fe,{onClick:u=>{i(u.currentTarget)},id:`push-to-menu-${e}`,"aria-controls":c?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,variant:"outlined",children:"Copy to environment"}),t.jsxs(Dl,{anchorEl:r,open:c,onClose:()=>i(null),MenuListProps:{"aria-labelledby":`push-to-menu-${e}`},children:[s.filter(u=>u.name!==e).map(u=>t.jsx(Al,{projectId:a,permission:n,environment:u.name,checked:l.includes(u),onClick:()=>y(u)},u.name)),t.jsxs($l,{children:[t.jsx(ut,{}),t.jsxs(kl,{variant:"outlined",onClick:()=>{o(l),m()},disabled:l.length===0,children:["Push to selected (",l.length,")"]})]})]})]})})},Il=g("div")(({theme:e})=>({display:"flex",gap:e.spacing(1.5)})),Pl=()=>{const{setToastData:e,setToastApiError:s}=ne(),n=lt(),a=et(n.breakpoints.down("md")),o=$("projectId"),r=$("featureId"),{feature:i,refetchFeature:c,loading:l}=W(o,r),{patchFeatureEnvironmentVariants:d,overrideVariantsInEnvironments:p}=dt(),{refetch:f}=Se(o),{addChange:y}=Te(),{isChangeRequestConfigured:m}=ie(o),[j,S]=x.useState(""),[u,h]=x.useState(),[C,I]=x.useState(!1),_=x.useMemo(()=>{var b;return((b=i==null?void 0:i.environments)==null?void 0:b.map(E=>({...E,crEnabled:m(E.name)})))||[]},[i.environments]),B=(b,E)=>jo(b,E),k=(b,E)=>{try{const w=mo(E,1e3);return{patch:B(b,w)}}catch(w){return{patch:[],error:Y(w)}}},P=b=>({feature:r,action:"patchVariant",payload:{variants:b}}),A=async(b,E)=>{if(b.crEnabled)await y(o,b.name,P(E)),f();else{const w=b.variants??[],{patch:T,error:F}=k(w,E);if(T.length===0)return;if(F){e({type:"error",title:F});return}await d(o,r,b.name,T)}c()},D=async(b,E)=>{try{const w=E.filter(({crEnabled:M})=>M),T=E.filter(({crEnabled:M})=>!M);w.length&&await Promise.all(w.map(M=>y(o,M.name,P(b)))),T.length&&await p(o,r,b,T.map(({name:M})=>M)),f(),c();const F=T.length?`Variants pushed to ${T.length===1?T[0].name:`${T.length} environments`}`:"",O=w.length?`Variants push added to ${w.length===1?`${w[0].name} draft`:`${w.length} drafts`}`:"",q=`${F}${F&&O?". ":""}${O}`;e({title:q,type:"success"})}catch(w){s(Y(w))}},L=b=>{h(b),I(!0)},Z=async b=>{if(u)try{await A(u,b),I(!1),e({title:u.crEnabled?"Variant changes added to draft":"Variants updated successfully",type:"success"})}catch(E){s(Y(E))}},ee=async(b,E)=>{try{const w=b.variants??[];await A(E,w),e({title:E.crEnabled?"Variants copy added to draft":"Variants copied successfully",type:"success"})}catch(w){s(Y(w))}};return t.jsxs(Ht,{isLoading:l,header:t.jsx(xo,{title:"Variants",actions:t.jsx(v,{condition:!a,show:t.jsx(t.Fragment,{children:t.jsx(is,{initialValue:j,onChange:S})})}),children:t.jsx(v,{condition:a,show:t.jsx(is,{initialValue:j,onChange:S})})}),children:[t.jsx(yo,{}),_.map(b=>{var w;const E=_.filter(({name:T,variants:F})=>T!==b.name&&(F==null?void 0:F.length));return t.jsx(Tl,{environment:b,searchValue:j,children:t.jsxs(Il,{children:[t.jsx(Fl,{current:b.name,environments:_,permission:Oe,projectId:o,onSubmit:T=>D(b.variants??[],T)}),t.jsx(Rl,{environment:b,permission:Oe,projectId:o,environmentId:b.name,onCopyVariantsFrom:ee,otherEnvsWithVariants:E}),t.jsx(v,{condition:!!((w=b.variants)!=null&&w.length),show:t.jsx(me,{"data-testid":"EDIT_VARIANTS_BUTTON",onClick:()=>L(b),permission:Oe,projectId:o,environmentId:b.name,tooltipProps:{title:"Edit variants"},children:t.jsx(ze,{})}),elseShow:t.jsx(we,{"data-testid":"ADD_VARIANT_BUTTON",onClick:()=>L(b),variant:"outlined",permission:Oe,projectId:o,environmentId:b.name,children:"Add variant"})})]})},b.name)}),t.jsx(hl,{environment:u,open:C,setOpen:I,getApiPayload:k,getCrPayload:P,onConfirm:Z})]})},_l=ke("api/admin/client-metrics/features"),$n=(e,s)=>{const n=ke(`api/admin/client-metrics/features/${e}/raw?hoursBack=${s}`),{data:a,error:o}=Xs(n,()=>Ol(n)),r=x.useCallback(()=>{Mt(_l).catch(console.warn)},[]);return{featureMetrics:a==null?void 0:a.data,loading:!o&&!a,refetchFeatureMetrics:r,error:o}},Ol=e=>fetch(e).then(qe("Features")).then(s=>s.json()).then(),Bl=g("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),it=48,Ll=({hoursBack:e,setHoursBack:s})=>{const{trackEvent:n}=be(),a=c=>{s(Number.parseInt(c)),n("feature-metrics",{props:{eventType:"change-period",hoursBack:c}})},{isEnterprise:o}=Qe(),r=o()?[...Is,...Ml]:Is,i=r.map(c=>Number(c.key)).includes(e)?e:it;return x.useEffect(()=>{e!==i&&s(i)},[e]),t.jsxs("div",{children:[t.jsx(Bl,{children:"Period"}),t.jsx(Us,{name:"feature-metrics-period",id:"feature-metrics-period",options:r,value:String(i),onChange:a,fullWidth:!0})]})},Is=[{key:"1",label:"Last hour"},{key:"24",label:"Last 24 hours"},{key:"48",label:"Last 48 hours"}],Ml=[{key:`${7*24}`,label:"Last 7 days"},{key:`${30*24}`,label:"Last 30 days"},{key:`${90*24}`,label:"Last 90 days"}],zl=({value:e,timeZone:s})=>{const{locationSettings:n}=Qs(),a=e?e instanceof Date?cs(e,n.locale,s):cs(Zs(e),n.locale,s):void 0;return t.jsx(ot,{lineClamp:1,children:a})};var Gt={},Vl=So;Object.defineProperty(Gt,"__esModule",{value:!0});var kn=Gt.default=void 0,Nl=Vl(bo()),ql=t,Wl=(0,Nl.default)((0,ql.jsx)("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"}),"Assessment");kn=Gt.default=Wl;const Hl=g(J)(({theme:e})=>({fontSize:e.fontSizes.smallerBody})),Ul=({row:e})=>e.original.selectedApplications&&e.original.selectedApplications.length>1?t.jsx(ot,{children:t.jsx(Ke,{tooltip:t.jsx(t.Fragment,{children:e.original.selectedApplications.map(s=>t.jsx(Hl,{children:s},s))}),children:e.original.appName})}):t.jsx(ot,{children:e.original.appName}),Gl=({metrics:e,tableSectionId:s})=>{const n=et(vo.breakpoints.down("md")),a=x.useMemo(()=>({sortBy:[{id:"timestamp"}]}),[]),{getTableProps:o,getTableBodyProps:r,headerGroups:i,rows:c,prepareRow:l,setHiddenColumns:d}=mt.useTable({initialState:a,columns:Ps,data:e,autoResetHiddenColumns:!1,disableSortRemove:!0,defaultColumn:{Cell:ot}},mt.useGlobalFilter,mt.useSortBy);return Co([{condition:n,columns:["appName","environment"]}],d,Ps),e.length===0?null:t.jsxs(wo,{...o(),rowHeight:"standard",id:s,children:[t.jsx(To,{headerGroups:i}),t.jsx(Eo,{...r(),children:c.map(p=>(l(p),t.jsx(Ro,{hover:!0,...p.getRowProps(),children:p.cells.map(f=>t.jsx(Ao,{...f.getCellProps(),children:f.render("Cell")}))})))})]})},Ps=[{id:"Icon",width:"1%",disableSortBy:!0,Cell:()=>t.jsx(Do,{icon:t.jsx(kn,{color:"disabled"})})},{Header:"Time",accessor:"timestamp",Cell:e=>t.jsx(zl,{value:e.row.original.timestamp,timeZone:e.row.original.timestamp.includes("23:59")?"UTC":void 0})},{Header:"Application",accessor:"appName",Cell:Ul},{Header:"Environment",accessor:"environment"},{id:"requested",Header:"Requested",accessor:e=>e.yes+e.no},{Header:"Exposed",accessor:"yes"}],Yl=({metrics:e,...s})=>{const n=x.useMemo(()=>e.reduce((o,r)=>o+r.yes,0),[e]),a=x.useMemo(()=>e.reduce((o,r)=>o+r.no,0),[e]);return t.jsx(En,{...s,totalYes:n,totalNo:a})},Jl=({metrics:e,hoursBack:s})=>{const n=ls(),a=ls();return e.length===0?t.jsxs(Q,{mt:6,children:[t.jsx(J,{variant:"body1",paragraph:!0,children:"We have yet to receive any metrics for this feature flag in the selected time period."}),t.jsx(J,{variant:"body1",paragraph:!0,children:"Please note that, since the SDKs send metrics on an interval, it might take some time before metrics appear."})]}):t.jsxs(x.Suspense,{fallback:null,children:[t.jsx(Q,{borderTop:1,pt:2,mt:3,borderColor:"divider",children:t.jsx(Kl,{metrics:e,hoursBack:s,statsSectionId:n})}),t.jsx(Q,{mt:4,children:t.jsx(Yl,{metrics:e,hoursBack:s,statsSectionId:n,tableSectionId:a})}),t.jsx(Q,{mt:4,children:t.jsx(Gl,{metrics:e,tableSectionId:a})})]})},Kl=en.lazy(()=>$o(()=>import("./FeatureMetricsChart-C22E7CHm.js"),[])),Ql=g("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1.5),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),Zl=g("ul")(({theme:e})=>({display:"flex",flexWrap:"wrap",gap:e.spacing(1),listStyleType:"none",padding:0,minHeight:"100%",alignItems:"center",maxHeight:"200px",overflowY:"auto"})),Xl=g("li")(({theme:e})=>({"& > [aria-pressed=true]":{backgroundColor:e.palette.background.alternative,color:e.palette.primary.contrastText},"& > [aria-pressed=true]:hover":{backgroundColor:e.palette.primary.light}})),_s=({title:e,values:s,selectedValues:n,toggleValue:a,toggleValues:o})=>{const r=l=>()=>{a(l)},i=[...s].every(l=>n.includes(l)),c=x.useMemo(()=>Array.from(s).sort((l,d)=>l.localeCompare(d)),[s]);return t.jsxs("div",{children:[t.jsx(Ql,{children:e}),t.jsxs(Zl,{children:[c.map(l=>t.jsx(Xl,{children:t.jsx(rn,{label:l,onClick:r(l),"aria-pressed":n==null?void 0:n.includes(l),sx:ko})},l)),o&&s.size>1&&t.jsx(Fe,{size:"small",onClick:o,"aria-pressed":i,children:i?"Unselect":"Select all"})]})]})},ed=e=>{const s=new Map;return e.forEach(n=>{let a=s.get(n.timestamp);if(a||(a={...n,yes:0,no:0,variants:{}},s.set(n.timestamp,a)),a.yes+=n.yes,a.no+=n.no,n.variants){a.variants=a.variants||{};for(const[o,r]of Object.entries(n.variants))a.variants[o]=(a.variants[o]||0)+r}}),Array.from(s.values()).map(n=>({...n,variants:n.variants&&Object.keys(n.variants).length===0?void 0:n.variants}))},td=()=>{const e=$("projectId"),s=$("featureId"),n=sd(e,s);cn("Metrics");const a=Array.from(n)[0],[o,r]=Fo({environment:jt(Io,a),applications:jt(Po,[]),hoursBack:jt(_o,it)}),i=nd(s,o.hoursBack||it),c=Array.from(i)[0],{environment:l,hoursBack:d}=o,p=o.applications.filter(u=>u!==null);x.useEffect(()=>{o.applications&&o.applications.length===0&&c&&r({applications:[c]})},[JSON.stringify(Array.from(i))]);const f=[...i].every(u=>p.includes(u)),{featureMetrics:y}=$n(s,d),[m,j]=x.useState(y);x.useEffect(()=>{y&&j(y)},[y]);const S=x.useMemo(()=>ed((m==null?void 0:m.filter(u=>l===u.environment).filter(u=>p.includes(u.appName)))||[]).map(u=>({...u,appName:p.length>1?"all selected":u.appName,selectedApplications:p})),[m,l,JSON.stringify(p)]);return S?t.jsxs(Ht,{children:[t.jsxs(ve,{container:!0,component:"header",spacing:2,children:[t.jsx(ve,{item:!0,xs:12,md:5,children:t.jsx(v,{condition:n.size>0,show:t.jsx(_s,{title:"Environments",values:n,selectedValues:[l],toggleValue:u=>{r({environment:u})}})})}),t.jsx(ve,{item:!0,xs:12,md:5,children:t.jsx(v,{condition:i.size>0,show:t.jsx(_s,{title:"Applications",values:i,selectedValues:p,toggleValues:()=>{r(f?{applications:[c]}:{applications:[...i]})},toggleValue:u=>{p.includes(u)?r({applications:p.filter(h=>h!==u)}):r({applications:[...p,u]})}})})}),t.jsx(ve,{item:!0,xs:12,md:2,children:t.jsx(Ll,{hoursBack:d,setHoursBack:u=>r({hoursBack:u})})})]}),t.jsx(Jl,{metrics:S,hoursBack:d})]}):null},sd=(e,s)=>{const{feature:n}=W(e,s),a=n.environments.map(o=>o.name);return new Set(a)},nd=(e,s=it)=>{const{featureMetrics:n=[]}=$n(e,s),a=n.map(o=>o.appName);return new Set(a)},ad=(e,s)=>{const n=new Set(e),a=new Set(s);return n.size!==a.size?!1:[...n].every(o=>a.has(o))},Os=g("div")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),Bs=g(ge)(({theme:e})=>({marginBottom:e.spacing(1)})),od=g(qt)({padding:0}),rd=({projectId:e,open:s,onClose:n,onClick:a,feature:o,changeRequests:r})=>{const i=$("projectId"),{project:c}=Oo(e),{isChangeRequestConfiguredInAnyEnv:l}=ie(e),d=l(),p=x.useMemo(()=>ad(o.environments.map(m=>m.name),c.environments.map(m=>m.environment)),[o,c]),f=r?r.length>0:!1,y=o.dependencies.length>0||o.children.length>0;return t.jsx(v,{condition:p&&!y&&!f&&!d,show:t.jsx(je,{open:s,onClose:n,onClick:a,title:"Confirm change project",primaryButtonText:"Change project",secondaryButtonText:"Cancel",children:t.jsxs(Os,{children:[t.jsx(Bs,{severity:"success",children:"This feature flag is compatible with the new project."}),t.jsx("p",{children:"Are you sure you want to change the project for this flag?"})]})}),elseShow:t.jsx(je,{open:s,onClick:n,title:"Confirm change project",primaryButtonText:"Close",children:t.jsxs(Os,{children:[t.jsx(Bs,{severity:"warning",children:"Cannot proceed with the move"}),t.jsx(v,{condition:y,show:t.jsxs("p",{children:[t.jsx("span",{children:"The feature flag must not have any dependencies."})," ",t.jsx("br",{}),t.jsx("span",{children:"Please remove feature dependencies first."})]})}),t.jsx(v,{condition:!p,show:t.jsx("p",{children:"In order to move a feature flag between two projects, both projects must have the exact same environments enabled."})}),t.jsx(v,{condition:f,show:t.jsxs(t.Fragment,{children:[t.jsx("p",{children:"The feature flag must not have any pending change requests. This feature flag is currently referenced in the following change requests:"}),t.jsx(od,{children:r==null?void 0:r.map(m=>t.jsx(Le,{children:t.jsxs(oe,{to:`/projects/${i}/change-requests/${m.id}`,children:["View change request"," ",m.id]})},m.id))})]})}),t.jsx(v,{condition:d,show:t.jsxs("p",{children:["You're not allowed to move the feature to project"," ",t.jsx(oe,{to:`/projects/${e}/settings/change-requests`,children:e}),". This project has change requests enabled."]})})]})})})},id=()=>{const{hasAccess:e}=x.useContext(Vt),s=$("projectId"),n=$("featureId"),{feature:a,refetchFeature:o}=W(s,n),[r,i]=x.useState(!1),{changeFeatureProject:c}=dt(),{setToastData:l,setToastApiError:d}=ne(),[p,f]=x.useState(s),{projects:y}=Bo(),m=Ee(),{changeRequests:j}=Sn(s,n),S=async()=>{try{p&&(await c(s,n,p),o(),l({title:"Project changed",type:"success"}),i(!1),m(`/projects/${p}/features/${n}/settings`,{replace:!0}))}catch(h){d(Y(h))}},u=x.useMemo(()=>y.map(h=>h.id).filter(h=>e(ds,h)),[y,e]);return u.length===0?null:t.jsxs(t.Fragment,{children:[t.jsx(Lo,{value:p,onChange:f,label:"Project",filter:h=>u.includes(h),enabled:!0}),t.jsx(we,{permission:ds,onClick:()=>i(!0),disabled:p===s,projectId:s,children:"Save"}),t.jsx(rd,{changeRequests:j,projectId:p,open:r,feature:a,onClose:()=>i(!1),onClick:S})]})},cd=g("div")({display:"flex",alignItems:"center"}),ld=g(J)(({theme:e})=>({fontSize:e.fontSizes.mainHeader})),dd=({projectId:e,featureId:s})=>{var r;const{feature:n}=W(e,s),a=Ee(),o=()=>{a(`/projects/${e}/features/${s}/edit`)};return t.jsxs(t.Fragment,{children:[t.jsxs(cd,{children:[t.jsx(ld,{children:"Feature information"}),t.jsx(me,{permission:Ve,projectId:e,"data-loading":!0,onClick:o,tooltipProps:{title:"Edit"},children:t.jsx(ze,{})})]}),t.jsxs(J,{children:["Name: ",t.jsx("strong",{children:n.name})]}),t.jsxs(J,{children:["Description:"," ",t.jsx("strong",{children:(r=n.description)!=null&&r.length?n.description:"no description"})]}),t.jsxs(J,{children:["Type: ",t.jsx("strong",{children:n.type})]}),t.jsxs(J,{children:["Impression Data:"," ",t.jsx("strong",{children:n.impressionData?"enabled":"disabled"})]})]})},at="metadata",$t="project",ud=g("div")(({theme:e})=>({width:"20%",borderRight:`1px solid ${e.palette.divider}`,padding:e.spacing(2,0),[e.breakpoints.down("md")]:{width:"35%"}})),pd=g("div")(({theme:e})=>({padding:e.spacing(4),display:"flex",flexDirection:"column",width:400,"& > *":{margin:e.spacing(1,0)}})),gd=()=>{const e=$("projectId"),s=$("featureId"),[n,a]=x.useState(at),{uiConfig:o}=Qe();return t.jsx(Ht,{header:"Settings",sx:{padding:0},children:t.jsxs(Q,{sx:{display:"flex"},children:[t.jsx(ud,{children:t.jsxs(qt,{children:[t.jsx(Le,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>a(at),selected:n===at,children:"Metadata"},0),t.jsx(Le,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>a($t),selected:n===$t,hidden:!o.flags.P,children:"Project"},1)]})}),t.jsxs(pd,{children:[t.jsx(v,{condition:n===at,show:t.jsx(dd,{projectId:e,featureId:s})}),t.jsx(v,{condition:n===$t&&o.flags.P,show:t.jsx(id,{})})]})]})})},hd=({stale:e,showActive:s=!0})=>{if(!e&&!s)return null;const n=e?"Feature flag is deprecated.":"Feature flag is active.",a=e?"Stale":"Active";return t.jsx("div",{"data-loading":!0,style:{marginLeft:"8px"},children:t.jsx(Ne,{color:e?"error":"success",title:n,children:a})})},Ls=g("strong")({wordBreak:"break-all"}),fd=()=>{const e=$("projectId"),s=$("featureId"),{archivedFeatures:n}=Mo(),a=zo(e,{name:s});return n?n.some(r=>r.name===s)?t.jsxs("p",{children:["The feature ",t.jsx(Ls,{children:s})," has been archived. You can find it on the"," ",t.jsx(oe,{to:`/projects/${e}/archive`,children:"project archive page"}),"."]}):t.jsxs("p",{children:["The feature ",t.jsx(Ls,{children:s})," does not exist. Would you like to"," ",t.jsx(oe,{to:a,children:"create it"}),"?"]}):null},xd=e=>x.createElement("svg",{fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",...e},x.createElement("path",{d:"M1 12a5 5 0 0 1 5-5h4a5 5 0 0 1 4.584 7H14a1.993 1.993 0 0 1-1.375-.547A3 3 0 0 0 10 9H6a3 3 0 1 0 0 6h2.803a6.03 6.03 0 0 0 1.822 1.961A5.033 5.033 0 0 1 10 17H6a5 5 0 0 1-5-5Z",fill:"#202021"}),x.createElement("path",{d:"M9 12c0-.711.148-1.387.416-2H10c.532 0 1.016.208 1.375.547A3 3 0 0 0 14 15h4a3 3 0 1 0 0-6h-2.803a6.03 6.03 0 0 0-1.822-1.961C13.58 7.013 13.788 7 14 7h4a5 5 0 0 1 0 10h-4a5 5 0 0 1-5-5Z",fill:"#202021"})),yd=e=>x.createElement("svg",{fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",...e},x.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M1 8a5 5 0 0 1 5-5h4a5 5 0 0 1 4.584 7H14a1.993 1.993 0 0 1-1.375-.547A3 3 0 0 0 10 5H6a3 3 0 0 0 0 6h2.803a6.03 6.03 0 0 0 1.822 1.961A5.033 5.033 0 0 1 10 13H8v3a1 1 0 0 0 1 1h1.17A3.001 3.001 0 0 1 13 15h7a3 3 0 1 1 0 6h-7a3.001 3.001 0 0 1-2.83-2H9a3 3 0 0 1-3-3v-3a5 5 0 0 1-5-5Zm8 0c0-.711.148-1.388.416-2H10c.532 0 1.016.208 1.375.547A3 3 0 0 0 14 11h4a3 3 0 1 0 0-6h-2.803a6.03 6.03 0 0 0-1.822-1.961C13.58 3.013 13.788 3 14 3h4a5 5 0 0 1 0 10h-4a5 5 0 0 1-5-5Z",fill:"#202021"})),md=g("div")(({theme:e})=>({backgroundColor:e.palette.background.paper,borderRadius:e.shape.borderRadiusLarge,marginBottom:e.spacing(2)})),jd=g("div")(({theme:e})=>({padding:e.spacing(2,4,2,2),display:"flex",justifyContent:"space-between",alignItems:"center",[e.breakpoints.down(500)]:{flexDirection:"column"}})),Ms=g("div")({display:"flex",alignItems:"center"}),zs=g("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1),marginTop:e.spacing(1),fontSize:e.fontSizes.smallBody,padding:e.spacing(.75,1.5),backgroundColor:e.palette.background.elevation2,borderRadius:`${e.shape.borderRadiusMedium}px`,width:"max-content"}));g(xd)(({theme:e})=>({width:e.fontSizes.smallBody,height:e.fontSizes.smallBody}));g(yd)(({theme:e})=>({width:e.fontSizes.smallBody,height:e.fontSizes.smallBody}));const bd=g("h1")(({theme:e})=>({fontSize:e.fontSizes.mainHeader,fontWeight:"normal",display:"flex",alignItems:"center",wordBreak:"break-all"})),Sd=g("div")({flexShrink:0,display:"flex"}),vd=g("div")(({theme:e})=>({width:"100%",backgroundColor:e.palette.divider,height:"1px"})),Cd=g("div")(({theme:e})=>({padding:e.spacing(0,4)})),wd=g(Vo)(({theme:e})=>({textTransform:"none",width:"auto",fontSize:e.fontSizes.bodySize,padding:"0 !important",[e.breakpoints.up("md")]:{minWidth:160}})),Td=g(oe)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),Ed=e=>{const s=Lt("enableLegacyVariants"),n=e.some(a=>{var o;return(o=a.variants)==null?void 0:o.length});return s||n},Rd=()=>{var b,E;const e=$("projectId"),s=$("featureId"),{favorite:n,unfavorite:a}=No(),{refetchFeature:o}=W(e,s),{setToastData:r,setToastApiError:i}=ne(),[c,l]=x.useState(!1),[d,p]=x.useState(!1),[f,y]=x.useState(!1),[m,j]=x.useState(!1),S=et("(max-width:500px)"),{feature:u,loading:h,error:C,status:I}=W(e,s),_=Ee(),{pathname:B}=qo(),k=Wo(h),P=`/projects/${e}/features/${s}`,A=Ed(u.environments),D=[{title:"Overview",path:`${P}`,name:"overview"},{title:"Metrics",path:`${P}/metrics`,name:"Metrics"},...A?[{title:"Variants",path:`${P}/variants`,name:"Variants"}]:[],{title:"Settings",path:`${P}/settings`,name:"Settings"},{title:"Event log",path:`${P}/logs`,name:"Event log"}],L=D.find(w=>w.path===B)??D[0],Z=async()=>{try{u!=null&&u.favorite?await a(e,u.name):await n(e,u.name),o()}catch{i("Something went wrong, could not update favorite")}};if(I===404)return t.jsx(fd,{});if(C!==void 0)return t.jsx("div",{ref:k});const ee=()=>{try{Zo(u.name),j(!0),setTimeout(()=>{j(!1)},3e3)}catch{r({type:"error",title:"Could not copy feature name"})}};return t.jsxs("div",{ref:k,children:[t.jsxs(md,{children:[t.jsxs(jd,{children:[t.jsxs(Ms,{children:[t.jsx(Ho,{onClick:Z,isFavorite:u==null?void 0:u.favorite}),t.jsxs("div",{children:[t.jsxs(Ms,{children:[t.jsxs(bd,{"data-loading":!0,children:[u.name," "]}),t.jsx(de,{title:m?"Copied!":"Copy name",arrow:!0,children:t.jsx(Je,{onClick:ee,style:{marginLeft:8},children:m?t.jsx(Uo,{style:{fontSize:16}}):t.jsx(Go,{style:{fontSize:16}})})}),t.jsx(v,{condition:!S,show:t.jsx(hd,{stale:u==null?void 0:u.stale})})]}),t.jsx(v,{condition:u.dependencies.length>0,show:t.jsxs(zs,{children:[t.jsx("b",{children:"Has parent: "}),t.jsx(Td,{to:`/projects/${u.project}/features/${(b=u==null?void 0:u.dependencies[0])==null?void 0:b.feature}`,children:(E=u==null?void 0:u.dependencies[0])==null?void 0:E.feature})]})}),t.jsx(v,{condition:u.children.length>0,show:t.jsxs(zs,{children:[t.jsx("b",{children:"Has children:"}),t.jsx(yn,{childFeatures:u.children,project:u.project})]})})]})]}),t.jsxs(Sd,{children:[t.jsx(me,{permission:Yo,projectId:e,"data-loading":!0,component:oe,to:`/projects/${e}/features/${s}/copy`,tooltipProps:{title:"Clone"},children:t.jsx(dr,{})}),t.jsx(me,{permission:Jo,projectId:e,tooltipProps:{title:"Archive feature flag"},"data-loading":!0,onClick:()=>p(!0),children:t.jsx(ur,{})}),t.jsx(me,{onClick:()=>y(!0),permission:Ve,projectId:e,tooltipProps:{title:"Toggle stale state"},"data-loading":!0,children:t.jsx(pr,{})}),t.jsx(me,{onClick:()=>l(!0),permission:Ve,projectId:e,tooltipProps:{title:"Add tag"},"data-loading":!0,children:t.jsx(Ko,{})})]})]}),t.jsx(vd,{}),t.jsx(Cd,{children:t.jsx(Qo,{value:L.path,indicatorColor:"primary",textColor:"primary",children:D.map(w=>t.jsx(wd,{label:w.title,value:w.path,onClick:()=>_(w.path),"data-testid":`TAB-${w.title}`},w.title))})})]}),t.jsxs(ln,{children:[t.jsx(Ae,{path:"metrics",element:t.jsx(td,{})}),t.jsx(Ae,{path:"logs",element:t.jsx(_r,{})}),t.jsx(Ae,{path:"variants",element:t.jsx(Pl,{})}),t.jsx(Ae,{path:"settings",element:t.jsx(gd,{})}),t.jsx(Ae,{path:"*",element:t.jsx(el,{})})]}),t.jsx(v,{condition:u.children.length>0,show:t.jsx(hn,{features:u.children,project:e,isOpen:d,onClose:()=>p(!1)}),elseShow:t.jsx(un,{isOpen:d,onConfirm:()=>{_(`/projects/${e}`)},onClose:()=>p(!1),projectId:e,featureIds:[s]})}),t.jsx(gr,{isStale:u.stale,isOpen:f,onClose:()=>{y(!1),o()},featureId:s,projectId:e}),t.jsx(Dn,{open:c,setOpen:l})]})},kd=Object.freeze(Object.defineProperty({__proto__:null,default:Rd},Symbol.toStringTag,{value:"Module"}));export{kd as F,cc as d};
|
|
10
|
+
--data-raw '${JSON.stringify(A.patch,void 0,2)}'`,ee=h.every(({isValid:R})=>R),b=j((e==null?void 0:e.name)||""),E=b?"Add to existing change request":"Add change to draft",w=y((e==null?void 0:e.name)||""),T=x.useMemo(()=>{var R;return f?"":((R=P[0])==null?void 0:R.stickiness)||p},[f,p,JSON.stringify(P[0]??{})]),F=x.useMemo(()=>["default",...d.filter(R=>R.stickiness).map(R=>R.name)],[d]),O=F.map(R=>({key:R,label:R}));F.includes(T)||O.push({key:T,label:T});const q=async R=>{C(K=>K.map(he=>({...he,stickiness:R})))},M=R=>{q(R)},[z,te]=x.useState();x.useEffect(()=>{te(void 0),A.error&&te(A.error)},[A.error]);const H=()=>{q(p),n(!1)};return f||T===""?t.jsx(po,{}):t.jsx(It,{open:s,onClose:H,label:"",children:t.jsxs(an,{modal:!0,title:"",description:"Variants allow you to return a variant object if the feature flag is considered enabled for the current request.",documentationLink:"https://docs.getunleash.io/reference/feature-toggle-variants",documentationLinkLabel:"Feature flag variants documentation",formatApiCode:Z,loading:!s,children:[t.jsxs(tl,{children:[t.jsxs("div",{children:[t.jsx(sl,{deprecated:!(e!=null&&e.enabled)}),t.jsx(nl,{deprecated:!(e!=null&&e.enabled),children:e==null?void 0:e.name})]}),t.jsx(we,{"data-testid":"MODAL_ADD_VARIANT_BUTTON",onClick:k,variant:"outlined",permission:Oe,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"})]}),t.jsxs(al,{onSubmit:L,children:[t.jsx(v,{condition:b,show:S,elseShow:t.jsx(v,{condition:!!w,show:t.jsxs(ol,{severity:"info",children:[t.jsx("strong",{children:"Change requests"})," are enabled",e?` for ${e.name}`:"",". Your changes need to be approved before they will be live. All the changes you do now will be added into a draft that you can submit for review."]})})}),t.jsx(il,{children:h.map(R=>t.jsx(gl,{variant:R,variants:h,updateVariant:K=>B(K,R.id),removeVariant:()=>C(K=>rs(K.filter(he=>he.id!==R.id),1e3)),error:A.error},R.id))}),t.jsx(we,{onClick:k,variant:"outlined",permission:Oe,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"}),t.jsx(ll,{}),t.jsx(v,{condition:h.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(cl,{children:t.jsx("p",{children:"Stickiness"})}),t.jsxs(Fs,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t.jsx(Wt,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]}),t.jsx("div",{children:t.jsx(dl,{value:T,label:"",editable:!0,onChange:R=>M(R.target.value)})})]}),elseShow:t.jsx(Fs,{children:"This environment has no variants. Get started by adding a variant."})}),t.jsxs(rl,{severity:"error",hidden:!z,children:[t.jsx("strong",{children:"Error: "}),z]}),t.jsxs(ul,{children:[t.jsx(Fe,{"data-testid":"DIALOGUE_CONFIRM_ID",type:"submit",variant:"contained",color:"primary",disabled:!ee,children:w?E:"Save variants"}),t.jsx(pl,{onClick:H,children:"Cancel"})]})]})]})})},fl=e=>fetch(e).then(qe("ChangeRequest")).then(s=>s.json()),xl=(e,s)=>{const{data:n,error:a,mutate:o}=nn([],ke(`api/admin/projects/${e}/change-requests/scheduled?variantForFlag=${s}`),fl);return{changeRequests:n,loading:!a&&!n,refetch:o,error:a}},yl=(e,s,n)=>{const{changeRequests:a}=xl(e,s),o=a==null?void 0:a.filter(r=>r.environment===n);return o?o.map(r=>r.id):[]},ml=g("div")(({theme:e})=>({padding:e.spacing(3),borderRadius:e.shape.borderRadiusLarge,border:`1px solid ${e.palette.divider}`,"&:not(:last-child)":{marginBottom:e.spacing(3)}})),jl=g("div")({display:"flex",alignItems:"center",justifyContent:"space-between","& > div":{display:"flex",alignItems:"center"}}),bl=g(dn,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.neutral.border:e.palette.primary.main})),Sl=g("span",{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.text.secondary:e.palette.text.primary,marginLeft:e.spacing(1.25),fontWeight:e.fontWeight.bold})),vl=g("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),Cl=g("div")(({theme:e})=>({margin:e.spacing(3,0)})),wl=g("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Tl=({environment:e,searchValue:s,children:n})=>{var l;const a=$("projectId"),o=$("featureId"),r=yl(a,o,e.name),i=e.variants??[],c=((l=i[0])==null?void 0:l.stickiness)||"default";return t.jsxs(ml,{children:[t.jsxs(jl,{children:[t.jsxs("div",{children:[t.jsx(bl,{deprecated:!e.enabled}),t.jsx(Sl,{deprecated:!e.enabled,children:e.name}),t.jsx(v,{condition:r.length>0,show:t.jsx(ho,{sx:{ml:2},children:t.jsx(vn,{scheduledChangeRequestIds:r})})})]}),n]}),t.jsx(v,{condition:i.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(Cl,{children:t.jsx(fo,{variants:i,searchValue:s})}),t.jsx(v,{condition:i.length>1,show:t.jsxs(t.Fragment,{children:[t.jsxs(wl,{children:[t.jsx("p",{children:"Stickiness:"}),t.jsx(Ne,{children:c})]}),t.jsxs(vl,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t.jsx(Wt,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]})]})})]})})]})},El=g(De)(({theme:e})=>({"& span":{fontSize:e.fontSizes.smallBody}})),Rl=({environment:e,permission:s,projectId:n,environmentId:a,onCopyVariantsFrom:o,otherEnvsWithVariants:r})=>{const[i,c]=x.useState(null),l=!!i,d=e.variants??[];return t.jsx(v,{condition:r.length>0&&d.length===0,show:t.jsxs(t.Fragment,{children:[t.jsx(we,{onClick:p=>{c(p.currentTarget)},id:`copy-from-menu-${e.name}`,"aria-controls":l?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":l?"true":void 0,variant:"outlined",permission:s,projectId:n,environmentId:a,children:"Copy variants from"}),t.jsx(Xe,{anchorEl:i,open:l,onClose:()=>c(null),MenuListProps:{"aria-labelledby":`copy-from-menu-${e.name}`},children:r.map(p=>t.jsx(Ce,{onClick:()=>o(p,e),children:t.jsx(El,{children:`Copy from ${p.name}`})},p.name))})]})})},Al=({permission:e,projectId:s,environment:n,checked:a,onClick:o,...r})=>{const i=Ft(e,s,n);return t.jsxs(Ce,{disabled:!i,onClick:o,...r,children:[t.jsx(Hs,{checked:a}),n]})},Dl=g(Xe)(({theme:e})=>({"& > div > ul":{display:"flex",flexDirection:"column",justifyContent:"center","& > li":{padding:e.spacing(0,1)}}})),$l=g("div")(({theme:e})=>({margin:e.spacing(1,2)})),kl=g(Fe)(({theme:e})=>({marginTop:e.spacing(2)})),Fl=({current:e,environments:s,permission:n,projectId:a,onSubmit:o})=>{var S;const[r,i]=x.useState(null),c=!!r,[l,d]=x.useState([]),p=u=>{d(h=>[...h,u])},f=u=>{d(h=>h.filter(({name:C})=>C!==u.name))},y=u=>{l.includes(u)?f(u):p(u)},m=()=>{d([]),i(null)},j=((S=s.find(u=>u.name===e))==null?void 0:S.variants)??[];return t.jsx(v,{condition:j.length>0&&s.length>1,show:t.jsxs(t.Fragment,{children:[t.jsx(Fe,{onClick:u=>{i(u.currentTarget)},id:`push-to-menu-${e}`,"aria-controls":c?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,variant:"outlined",children:"Copy to environment"}),t.jsxs(Dl,{anchorEl:r,open:c,onClose:()=>i(null),MenuListProps:{"aria-labelledby":`push-to-menu-${e}`},children:[s.filter(u=>u.name!==e).map(u=>t.jsx(Al,{projectId:a,permission:n,environment:u.name,checked:l.includes(u),onClick:()=>y(u)},u.name)),t.jsxs($l,{children:[t.jsx(ut,{}),t.jsxs(kl,{variant:"outlined",onClick:()=>{o(l),m()},disabled:l.length===0,children:["Push to selected (",l.length,")"]})]})]})]})})},Il=g("div")(({theme:e})=>({display:"flex",gap:e.spacing(1.5)})),Pl=()=>{const{setToastData:e,setToastApiError:s}=ne(),n=lt(),a=et(n.breakpoints.down("md")),o=$("projectId"),r=$("featureId"),{feature:i,refetchFeature:c,loading:l}=W(o,r),{patchFeatureEnvironmentVariants:d,overrideVariantsInEnvironments:p}=dt(),{refetch:f}=Se(o),{addChange:y}=Te(),{isChangeRequestConfigured:m}=ie(o),[j,S]=x.useState(""),[u,h]=x.useState(),[C,I]=x.useState(!1),_=x.useMemo(()=>{var b;return((b=i==null?void 0:i.environments)==null?void 0:b.map(E=>({...E,crEnabled:m(E.name)})))||[]},[i.environments]),B=(b,E)=>jo(b,E),k=(b,E)=>{try{const w=mo(E,1e3);return{patch:B(b,w)}}catch(w){return{patch:[],error:Y(w)}}},P=b=>({feature:r,action:"patchVariant",payload:{variants:b}}),A=async(b,E)=>{if(b.crEnabled)await y(o,b.name,P(E)),f();else{const w=b.variants??[],{patch:T,error:F}=k(w,E);if(T.length===0)return;if(F){e({type:"error",title:F});return}await d(o,r,b.name,T)}c()},D=async(b,E)=>{try{const w=E.filter(({crEnabled:M})=>M),T=E.filter(({crEnabled:M})=>!M);w.length&&await Promise.all(w.map(M=>y(o,M.name,P(b)))),T.length&&await p(o,r,b,T.map(({name:M})=>M)),f(),c();const F=T.length?`Variants pushed to ${T.length===1?T[0].name:`${T.length} environments`}`:"",O=w.length?`Variants push added to ${w.length===1?`${w[0].name} draft`:`${w.length} drafts`}`:"",q=`${F}${F&&O?". ":""}${O}`;e({title:q,type:"success"})}catch(w){s(Y(w))}},L=b=>{h(b),I(!0)},Z=async b=>{if(u)try{await A(u,b),I(!1),e({title:u.crEnabled?"Variant changes added to draft":"Variants updated successfully",type:"success"})}catch(E){s(Y(E))}},ee=async(b,E)=>{try{const w=b.variants??[];await A(E,w),e({title:E.crEnabled?"Variants copy added to draft":"Variants copied successfully",type:"success"})}catch(w){s(Y(w))}};return t.jsxs(Ht,{isLoading:l,header:t.jsx(xo,{title:"Variants",actions:t.jsx(v,{condition:!a,show:t.jsx(t.Fragment,{children:t.jsx(is,{initialValue:j,onChange:S})})}),children:t.jsx(v,{condition:a,show:t.jsx(is,{initialValue:j,onChange:S})})}),children:[t.jsx(yo,{}),_.map(b=>{var w;const E=_.filter(({name:T,variants:F})=>T!==b.name&&(F==null?void 0:F.length));return t.jsx(Tl,{environment:b,searchValue:j,children:t.jsxs(Il,{children:[t.jsx(Fl,{current:b.name,environments:_,permission:Oe,projectId:o,onSubmit:T=>D(b.variants??[],T)}),t.jsx(Rl,{environment:b,permission:Oe,projectId:o,environmentId:b.name,onCopyVariantsFrom:ee,otherEnvsWithVariants:E}),t.jsx(v,{condition:!!((w=b.variants)!=null&&w.length),show:t.jsx(me,{"data-testid":"EDIT_VARIANTS_BUTTON",onClick:()=>L(b),permission:Oe,projectId:o,environmentId:b.name,tooltipProps:{title:"Edit variants"},children:t.jsx(ze,{})}),elseShow:t.jsx(we,{"data-testid":"ADD_VARIANT_BUTTON",onClick:()=>L(b),variant:"outlined",permission:Oe,projectId:o,environmentId:b.name,children:"Add variant"})})]})},b.name)}),t.jsx(hl,{environment:u,open:C,setOpen:I,getApiPayload:k,getCrPayload:P,onConfirm:Z})]})},_l=ke("api/admin/client-metrics/features"),$n=(e,s)=>{const n=ke(`api/admin/client-metrics/features/${e}/raw?hoursBack=${s}`),{data:a,error:o}=Xs(n,()=>Ol(n)),r=x.useCallback(()=>{Mt(_l).catch(console.warn)},[]);return{featureMetrics:a==null?void 0:a.data,loading:!o&&!a,refetchFeatureMetrics:r,error:o}},Ol=e=>fetch(e).then(qe("Features")).then(s=>s.json()).then(),Bl=g("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),it=48,Ll=({hoursBack:e,setHoursBack:s})=>{const{trackEvent:n}=be(),a=c=>{s(Number.parseInt(c)),n("feature-metrics",{props:{eventType:"change-period",hoursBack:c}})},{isEnterprise:o}=Qe(),r=o()?[...Is,...Ml]:Is,i=r.map(c=>Number(c.key)).includes(e)?e:it;return x.useEffect(()=>{e!==i&&s(i)},[e]),t.jsxs("div",{children:[t.jsx(Bl,{children:"Period"}),t.jsx(Us,{name:"feature-metrics-period",id:"feature-metrics-period",options:r,value:String(i),onChange:a,fullWidth:!0})]})},Is=[{key:"1",label:"Last hour"},{key:"24",label:"Last 24 hours"},{key:"48",label:"Last 48 hours"}],Ml=[{key:`${7*24}`,label:"Last 7 days"},{key:`${30*24}`,label:"Last 30 days"},{key:`${90*24}`,label:"Last 90 days"}],zl=({value:e,timeZone:s})=>{const{locationSettings:n}=Qs(),a=e?e instanceof Date?cs(e,n.locale,s):cs(Zs(e),n.locale,s):void 0;return t.jsx(ot,{lineClamp:1,children:a})};var Gt={},Vl=So;Object.defineProperty(Gt,"__esModule",{value:!0});var kn=Gt.default=void 0,Nl=Vl(bo()),ql=t,Wl=(0,Nl.default)((0,ql.jsx)("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"}),"Assessment");kn=Gt.default=Wl;const Hl=g(J)(({theme:e})=>({fontSize:e.fontSizes.smallerBody})),Ul=({row:e})=>e.original.selectedApplications&&e.original.selectedApplications.length>1?t.jsx(ot,{children:t.jsx(Ke,{tooltip:t.jsx(t.Fragment,{children:e.original.selectedApplications.map(s=>t.jsx(Hl,{children:s},s))}),children:e.original.appName})}):t.jsx(ot,{children:e.original.appName}),Gl=({metrics:e,tableSectionId:s})=>{const n=et(vo.breakpoints.down("md")),a=x.useMemo(()=>({sortBy:[{id:"timestamp"}]}),[]),{getTableProps:o,getTableBodyProps:r,headerGroups:i,rows:c,prepareRow:l,setHiddenColumns:d}=mt.useTable({initialState:a,columns:Ps,data:e,autoResetHiddenColumns:!1,disableSortRemove:!0,defaultColumn:{Cell:ot}},mt.useGlobalFilter,mt.useSortBy);return Co([{condition:n,columns:["appName","environment"]}],d,Ps),e.length===0?null:t.jsxs(wo,{...o(),rowHeight:"standard",id:s,children:[t.jsx(To,{headerGroups:i}),t.jsx(Eo,{...r(),children:c.map(p=>(l(p),t.jsx(Ro,{hover:!0,...p.getRowProps(),children:p.cells.map(f=>t.jsx(Ao,{...f.getCellProps(),children:f.render("Cell")}))})))})]})},Ps=[{id:"Icon",width:"1%",disableSortBy:!0,Cell:()=>t.jsx(Do,{icon:t.jsx(kn,{color:"disabled"})})},{Header:"Time",accessor:"timestamp",Cell:e=>t.jsx(zl,{value:e.row.original.timestamp,timeZone:e.row.original.timestamp.includes("23:59")?"UTC":void 0})},{Header:"Application",accessor:"appName",Cell:Ul},{Header:"Environment",accessor:"environment"},{id:"requested",Header:"Requested",accessor:e=>e.yes+e.no},{Header:"Exposed",accessor:"yes"}],Yl=({metrics:e,...s})=>{const n=x.useMemo(()=>e.reduce((o,r)=>o+r.yes,0),[e]),a=x.useMemo(()=>e.reduce((o,r)=>o+r.no,0),[e]);return t.jsx(En,{...s,totalYes:n,totalNo:a})},Jl=({metrics:e,hoursBack:s})=>{const n=ls(),a=ls();return e.length===0?t.jsxs(Q,{mt:6,children:[t.jsx(J,{variant:"body1",paragraph:!0,children:"We have yet to receive any metrics for this feature flag in the selected time period."}),t.jsx(J,{variant:"body1",paragraph:!0,children:"Please note that, since the SDKs send metrics on an interval, it might take some time before metrics appear."})]}):t.jsxs(x.Suspense,{fallback:null,children:[t.jsx(Q,{borderTop:1,pt:2,mt:3,borderColor:"divider",children:t.jsx(Kl,{metrics:e,hoursBack:s,statsSectionId:n})}),t.jsx(Q,{mt:4,children:t.jsx(Yl,{metrics:e,hoursBack:s,statsSectionId:n,tableSectionId:a})}),t.jsx(Q,{mt:4,children:t.jsx(Gl,{metrics:e,tableSectionId:a})})]})},Kl=en.lazy(()=>$o(()=>import("./FeatureMetricsChart-CrJhmvRS.js"),[])),Ql=g("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1.5),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),Zl=g("ul")(({theme:e})=>({display:"flex",flexWrap:"wrap",gap:e.spacing(1),listStyleType:"none",padding:0,minHeight:"100%",alignItems:"center",maxHeight:"200px",overflowY:"auto"})),Xl=g("li")(({theme:e})=>({"& > [aria-pressed=true]":{backgroundColor:e.palette.background.alternative,color:e.palette.primary.contrastText},"& > [aria-pressed=true]:hover":{backgroundColor:e.palette.primary.light}})),_s=({title:e,values:s,selectedValues:n,toggleValue:a,toggleValues:o})=>{const r=l=>()=>{a(l)},i=[...s].every(l=>n.includes(l)),c=x.useMemo(()=>Array.from(s).sort((l,d)=>l.localeCompare(d)),[s]);return t.jsxs("div",{children:[t.jsx(Ql,{children:e}),t.jsxs(Zl,{children:[c.map(l=>t.jsx(Xl,{children:t.jsx(rn,{label:l,onClick:r(l),"aria-pressed":n==null?void 0:n.includes(l),sx:ko})},l)),o&&s.size>1&&t.jsx(Fe,{size:"small",onClick:o,"aria-pressed":i,children:i?"Unselect":"Select all"})]})]})},ed=e=>{const s=new Map;return e.forEach(n=>{let a=s.get(n.timestamp);if(a||(a={...n,yes:0,no:0,variants:{}},s.set(n.timestamp,a)),a.yes+=n.yes,a.no+=n.no,n.variants){a.variants=a.variants||{};for(const[o,r]of Object.entries(n.variants))a.variants[o]=(a.variants[o]||0)+r}}),Array.from(s.values()).map(n=>({...n,variants:n.variants&&Object.keys(n.variants).length===0?void 0:n.variants}))},td=()=>{const e=$("projectId"),s=$("featureId"),n=sd(e,s);cn("Metrics");const a=Array.from(n)[0],[o,r]=Fo({environment:jt(Io,a),applications:jt(Po,[]),hoursBack:jt(_o,it)}),i=nd(s,o.hoursBack||it),c=Array.from(i)[0],{environment:l,hoursBack:d}=o,p=o.applications.filter(u=>u!==null);x.useEffect(()=>{o.applications&&o.applications.length===0&&c&&r({applications:[c]})},[JSON.stringify(Array.from(i))]);const f=[...i].every(u=>p.includes(u)),{featureMetrics:y}=$n(s,d),[m,j]=x.useState(y);x.useEffect(()=>{y&&j(y)},[y]);const S=x.useMemo(()=>ed((m==null?void 0:m.filter(u=>l===u.environment).filter(u=>p.includes(u.appName)))||[]).map(u=>({...u,appName:p.length>1?"all selected":u.appName,selectedApplications:p})),[m,l,JSON.stringify(p)]);return S?t.jsxs(Ht,{children:[t.jsxs(ve,{container:!0,component:"header",spacing:2,children:[t.jsx(ve,{item:!0,xs:12,md:5,children:t.jsx(v,{condition:n.size>0,show:t.jsx(_s,{title:"Environments",values:n,selectedValues:[l],toggleValue:u=>{r({environment:u})}})})}),t.jsx(ve,{item:!0,xs:12,md:5,children:t.jsx(v,{condition:i.size>0,show:t.jsx(_s,{title:"Applications",values:i,selectedValues:p,toggleValues:()=>{r(f?{applications:[c]}:{applications:[...i]})},toggleValue:u=>{p.includes(u)?r({applications:p.filter(h=>h!==u)}):r({applications:[...p,u]})}})})}),t.jsx(ve,{item:!0,xs:12,md:2,children:t.jsx(Ll,{hoursBack:d,setHoursBack:u=>r({hoursBack:u})})})]}),t.jsx(Jl,{metrics:S,hoursBack:d})]}):null},sd=(e,s)=>{const{feature:n}=W(e,s),a=n.environments.map(o=>o.name);return new Set(a)},nd=(e,s=it)=>{const{featureMetrics:n=[]}=$n(e,s),a=n.map(o=>o.appName);return new Set(a)},ad=(e,s)=>{const n=new Set(e),a=new Set(s);return n.size!==a.size?!1:[...n].every(o=>a.has(o))},Os=g("div")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),Bs=g(ge)(({theme:e})=>({marginBottom:e.spacing(1)})),od=g(qt)({padding:0}),rd=({projectId:e,open:s,onClose:n,onClick:a,feature:o,changeRequests:r})=>{const i=$("projectId"),{project:c}=Oo(e),{isChangeRequestConfiguredInAnyEnv:l}=ie(e),d=l(),p=x.useMemo(()=>ad(o.environments.map(m=>m.name),c.environments.map(m=>m.environment)),[o,c]),f=r?r.length>0:!1,y=o.dependencies.length>0||o.children.length>0;return t.jsx(v,{condition:p&&!y&&!f&&!d,show:t.jsx(je,{open:s,onClose:n,onClick:a,title:"Confirm change project",primaryButtonText:"Change project",secondaryButtonText:"Cancel",children:t.jsxs(Os,{children:[t.jsx(Bs,{severity:"success",children:"This feature flag is compatible with the new project."}),t.jsx("p",{children:"Are you sure you want to change the project for this flag?"})]})}),elseShow:t.jsx(je,{open:s,onClick:n,title:"Confirm change project",primaryButtonText:"Close",children:t.jsxs(Os,{children:[t.jsx(Bs,{severity:"warning",children:"Cannot proceed with the move"}),t.jsx(v,{condition:y,show:t.jsxs("p",{children:[t.jsx("span",{children:"The feature flag must not have any dependencies."})," ",t.jsx("br",{}),t.jsx("span",{children:"Please remove feature dependencies first."})]})}),t.jsx(v,{condition:!p,show:t.jsx("p",{children:"In order to move a feature flag between two projects, both projects must have the exact same environments enabled."})}),t.jsx(v,{condition:f,show:t.jsxs(t.Fragment,{children:[t.jsx("p",{children:"The feature flag must not have any pending change requests. This feature flag is currently referenced in the following change requests:"}),t.jsx(od,{children:r==null?void 0:r.map(m=>t.jsx(Le,{children:t.jsxs(oe,{to:`/projects/${i}/change-requests/${m.id}`,children:["View change request"," ",m.id]})},m.id))})]})}),t.jsx(v,{condition:d,show:t.jsxs("p",{children:["You're not allowed to move the feature to project"," ",t.jsx(oe,{to:`/projects/${e}/settings/change-requests`,children:e}),". This project has change requests enabled."]})})]})})})},id=()=>{const{hasAccess:e}=x.useContext(Vt),s=$("projectId"),n=$("featureId"),{feature:a,refetchFeature:o}=W(s,n),[r,i]=x.useState(!1),{changeFeatureProject:c}=dt(),{setToastData:l,setToastApiError:d}=ne(),[p,f]=x.useState(s),{projects:y}=Bo(),m=Ee(),{changeRequests:j}=Sn(s,n),S=async()=>{try{p&&(await c(s,n,p),o(),l({title:"Project changed",type:"success"}),i(!1),m(`/projects/${p}/features/${n}/settings`,{replace:!0}))}catch(h){d(Y(h))}},u=x.useMemo(()=>y.map(h=>h.id).filter(h=>e(ds,h)),[y,e]);return u.length===0?null:t.jsxs(t.Fragment,{children:[t.jsx(Lo,{value:p,onChange:f,label:"Project",filter:h=>u.includes(h),enabled:!0}),t.jsx(we,{permission:ds,onClick:()=>i(!0),disabled:p===s,projectId:s,children:"Save"}),t.jsx(rd,{changeRequests:j,projectId:p,open:r,feature:a,onClose:()=>i(!1),onClick:S})]})},cd=g("div")({display:"flex",alignItems:"center"}),ld=g(J)(({theme:e})=>({fontSize:e.fontSizes.mainHeader})),dd=({projectId:e,featureId:s})=>{var r;const{feature:n}=W(e,s),a=Ee(),o=()=>{a(`/projects/${e}/features/${s}/edit`)};return t.jsxs(t.Fragment,{children:[t.jsxs(cd,{children:[t.jsx(ld,{children:"Feature information"}),t.jsx(me,{permission:Ve,projectId:e,"data-loading":!0,onClick:o,tooltipProps:{title:"Edit"},children:t.jsx(ze,{})})]}),t.jsxs(J,{children:["Name: ",t.jsx("strong",{children:n.name})]}),t.jsxs(J,{children:["Description:"," ",t.jsx("strong",{children:(r=n.description)!=null&&r.length?n.description:"no description"})]}),t.jsxs(J,{children:["Type: ",t.jsx("strong",{children:n.type})]}),t.jsxs(J,{children:["Impression Data:"," ",t.jsx("strong",{children:n.impressionData?"enabled":"disabled"})]})]})},at="metadata",$t="project",ud=g("div")(({theme:e})=>({width:"20%",borderRight:`1px solid ${e.palette.divider}`,padding:e.spacing(2,0),[e.breakpoints.down("md")]:{width:"35%"}})),pd=g("div")(({theme:e})=>({padding:e.spacing(4),display:"flex",flexDirection:"column",width:400,"& > *":{margin:e.spacing(1,0)}})),gd=()=>{const e=$("projectId"),s=$("featureId"),[n,a]=x.useState(at),{uiConfig:o}=Qe();return t.jsx(Ht,{header:"Settings",sx:{padding:0},children:t.jsxs(Q,{sx:{display:"flex"},children:[t.jsx(ud,{children:t.jsxs(qt,{children:[t.jsx(Le,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>a(at),selected:n===at,children:"Metadata"},0),t.jsx(Le,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>a($t),selected:n===$t,hidden:!o.flags.P,children:"Project"},1)]})}),t.jsxs(pd,{children:[t.jsx(v,{condition:n===at,show:t.jsx(dd,{projectId:e,featureId:s})}),t.jsx(v,{condition:n===$t&&o.flags.P,show:t.jsx(id,{})})]})]})})},hd=({stale:e,showActive:s=!0})=>{if(!e&&!s)return null;const n=e?"Feature flag is deprecated.":"Feature flag is active.",a=e?"Stale":"Active";return t.jsx("div",{"data-loading":!0,style:{marginLeft:"8px"},children:t.jsx(Ne,{color:e?"error":"success",title:n,children:a})})},Ls=g("strong")({wordBreak:"break-all"}),fd=()=>{const e=$("projectId"),s=$("featureId"),{archivedFeatures:n}=Mo(),a=zo(e,{name:s});return n?n.some(r=>r.name===s)?t.jsxs("p",{children:["The feature ",t.jsx(Ls,{children:s})," has been archived. You can find it on the"," ",t.jsx(oe,{to:`/projects/${e}/archive`,children:"project archive page"}),"."]}):t.jsxs("p",{children:["The feature ",t.jsx(Ls,{children:s})," does not exist. Would you like to"," ",t.jsx(oe,{to:a,children:"create it"}),"?"]}):null},xd=e=>x.createElement("svg",{fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",...e},x.createElement("path",{d:"M1 12a5 5 0 0 1 5-5h4a5 5 0 0 1 4.584 7H14a1.993 1.993 0 0 1-1.375-.547A3 3 0 0 0 10 9H6a3 3 0 1 0 0 6h2.803a6.03 6.03 0 0 0 1.822 1.961A5.033 5.033 0 0 1 10 17H6a5 5 0 0 1-5-5Z",fill:"#202021"}),x.createElement("path",{d:"M9 12c0-.711.148-1.387.416-2H10c.532 0 1.016.208 1.375.547A3 3 0 0 0 14 15h4a3 3 0 1 0 0-6h-2.803a6.03 6.03 0 0 0-1.822-1.961C13.58 7.013 13.788 7 14 7h4a5 5 0 0 1 0 10h-4a5 5 0 0 1-5-5Z",fill:"#202021"})),yd=e=>x.createElement("svg",{fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",...e},x.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M1 8a5 5 0 0 1 5-5h4a5 5 0 0 1 4.584 7H14a1.993 1.993 0 0 1-1.375-.547A3 3 0 0 0 10 5H6a3 3 0 0 0 0 6h2.803a6.03 6.03 0 0 0 1.822 1.961A5.033 5.033 0 0 1 10 13H8v3a1 1 0 0 0 1 1h1.17A3.001 3.001 0 0 1 13 15h7a3 3 0 1 1 0 6h-7a3.001 3.001 0 0 1-2.83-2H9a3 3 0 0 1-3-3v-3a5 5 0 0 1-5-5Zm8 0c0-.711.148-1.388.416-2H10c.532 0 1.016.208 1.375.547A3 3 0 0 0 14 11h4a3 3 0 1 0 0-6h-2.803a6.03 6.03 0 0 0-1.822-1.961C13.58 3.013 13.788 3 14 3h4a5 5 0 0 1 0 10h-4a5 5 0 0 1-5-5Z",fill:"#202021"})),md=g("div")(({theme:e})=>({backgroundColor:e.palette.background.paper,borderRadius:e.shape.borderRadiusLarge,marginBottom:e.spacing(2)})),jd=g("div")(({theme:e})=>({padding:e.spacing(2,4,2,2),display:"flex",justifyContent:"space-between",alignItems:"center",[e.breakpoints.down(500)]:{flexDirection:"column"}})),Ms=g("div")({display:"flex",alignItems:"center"}),zs=g("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1),marginTop:e.spacing(1),fontSize:e.fontSizes.smallBody,padding:e.spacing(.75,1.5),backgroundColor:e.palette.background.elevation2,borderRadius:`${e.shape.borderRadiusMedium}px`,width:"max-content"}));g(xd)(({theme:e})=>({width:e.fontSizes.smallBody,height:e.fontSizes.smallBody}));g(yd)(({theme:e})=>({width:e.fontSizes.smallBody,height:e.fontSizes.smallBody}));const bd=g("h1")(({theme:e})=>({fontSize:e.fontSizes.mainHeader,fontWeight:"normal",display:"flex",alignItems:"center",wordBreak:"break-all"})),Sd=g("div")({flexShrink:0,display:"flex"}),vd=g("div")(({theme:e})=>({width:"100%",backgroundColor:e.palette.divider,height:"1px"})),Cd=g("div")(({theme:e})=>({padding:e.spacing(0,4)})),wd=g(Vo)(({theme:e})=>({textTransform:"none",width:"auto",fontSize:e.fontSizes.bodySize,padding:"0 !important",[e.breakpoints.up("md")]:{minWidth:160}})),Td=g(oe)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),Ed=e=>{const s=Lt("enableLegacyVariants"),n=e.some(a=>{var o;return(o=a.variants)==null?void 0:o.length});return s||n},Rd=()=>{var b,E;const e=$("projectId"),s=$("featureId"),{favorite:n,unfavorite:a}=No(),{refetchFeature:o}=W(e,s),{setToastData:r,setToastApiError:i}=ne(),[c,l]=x.useState(!1),[d,p]=x.useState(!1),[f,y]=x.useState(!1),[m,j]=x.useState(!1),S=et("(max-width:500px)"),{feature:u,loading:h,error:C,status:I}=W(e,s),_=Ee(),{pathname:B}=qo(),k=Wo(h),P=`/projects/${e}/features/${s}`,A=Ed(u.environments),D=[{title:"Overview",path:`${P}`,name:"overview"},{title:"Metrics",path:`${P}/metrics`,name:"Metrics"},...A?[{title:"Variants",path:`${P}/variants`,name:"Variants"}]:[],{title:"Settings",path:`${P}/settings`,name:"Settings"},{title:"Event log",path:`${P}/logs`,name:"Event log"}],L=D.find(w=>w.path===B)??D[0],Z=async()=>{try{u!=null&&u.favorite?await a(e,u.name):await n(e,u.name),o()}catch{i("Something went wrong, could not update favorite")}};if(I===404)return t.jsx(fd,{});if(C!==void 0)return t.jsx("div",{ref:k});const ee=()=>{try{Zo(u.name),j(!0),setTimeout(()=>{j(!1)},3e3)}catch{r({type:"error",title:"Could not copy feature name"})}};return t.jsxs("div",{ref:k,children:[t.jsxs(md,{children:[t.jsxs(jd,{children:[t.jsxs(Ms,{children:[t.jsx(Ho,{onClick:Z,isFavorite:u==null?void 0:u.favorite}),t.jsxs("div",{children:[t.jsxs(Ms,{children:[t.jsxs(bd,{"data-loading":!0,children:[u.name," "]}),t.jsx(de,{title:m?"Copied!":"Copy name",arrow:!0,children:t.jsx(Je,{onClick:ee,style:{marginLeft:8},children:m?t.jsx(Uo,{style:{fontSize:16}}):t.jsx(Go,{style:{fontSize:16}})})}),t.jsx(v,{condition:!S,show:t.jsx(hd,{stale:u==null?void 0:u.stale})})]}),t.jsx(v,{condition:u.dependencies.length>0,show:t.jsxs(zs,{children:[t.jsx("b",{children:"Has parent: "}),t.jsx(Td,{to:`/projects/${u.project}/features/${(b=u==null?void 0:u.dependencies[0])==null?void 0:b.feature}`,children:(E=u==null?void 0:u.dependencies[0])==null?void 0:E.feature})]})}),t.jsx(v,{condition:u.children.length>0,show:t.jsxs(zs,{children:[t.jsx("b",{children:"Has children:"}),t.jsx(yn,{childFeatures:u.children,project:u.project})]})})]})]}),t.jsxs(Sd,{children:[t.jsx(me,{permission:Yo,projectId:e,"data-loading":!0,component:oe,to:`/projects/${e}/features/${s}/copy`,tooltipProps:{title:"Clone"},children:t.jsx(dr,{})}),t.jsx(me,{permission:Jo,projectId:e,tooltipProps:{title:"Archive feature flag"},"data-loading":!0,onClick:()=>p(!0),children:t.jsx(ur,{})}),t.jsx(me,{onClick:()=>y(!0),permission:Ve,projectId:e,tooltipProps:{title:"Toggle stale state"},"data-loading":!0,children:t.jsx(pr,{})}),t.jsx(me,{onClick:()=>l(!0),permission:Ve,projectId:e,tooltipProps:{title:"Add tag"},"data-loading":!0,children:t.jsx(Ko,{})})]})]}),t.jsx(vd,{}),t.jsx(Cd,{children:t.jsx(Qo,{value:L.path,indicatorColor:"primary",textColor:"primary",children:D.map(w=>t.jsx(wd,{label:w.title,value:w.path,onClick:()=>_(w.path),"data-testid":`TAB-${w.title}`},w.title))})})]}),t.jsxs(ln,{children:[t.jsx(Ae,{path:"metrics",element:t.jsx(td,{})}),t.jsx(Ae,{path:"logs",element:t.jsx(_r,{})}),t.jsx(Ae,{path:"variants",element:t.jsx(Pl,{})}),t.jsx(Ae,{path:"settings",element:t.jsx(gd,{})}),t.jsx(Ae,{path:"*",element:t.jsx(el,{})})]}),t.jsx(v,{condition:u.children.length>0,show:t.jsx(hn,{features:u.children,project:e,isOpen:d,onClose:()=>p(!1)}),elseShow:t.jsx(un,{isOpen:d,onConfirm:()=>{_(`/projects/${e}`)},onClose:()=>p(!1),projectId:e,featureIds:[s]})}),t.jsx(gr,{isStale:u.stale,isOpen:f,onClose:()=>{y(!1),o()},featureId:s,projectId:e}),t.jsx(Dn,{open:c,setOpen:l})]})},kd=Object.freeze(Object.defineProperty({__proto__:null,default:Rd},Symbol.toStringTag,{value:"Module"}));export{kd as F,cc as d};
|