unleash-server 7.0.3 → 7.0.4
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/addons/slack-app-definition.js +6 -6
- package/dist/lib/addons/slack-app-definition.js.map +1 -1
- package/dist/lib/addons/slack-definition.js +2 -2
- package/dist/lib/addons/slack-definition.js.map +1 -1
- package/dist/lib/create-config.d.ts.map +1 -1
- package/dist/lib/create-config.js +3 -0
- package/dist/lib/create-config.js.map +1 -1
- package/dist/lib/db/client-instance-store.d.ts +0 -5
- package/dist/lib/db/client-instance-store.d.ts.map +1 -1
- package/dist/lib/db/client-instance-store.js +0 -21
- package/dist/lib/db/client-instance-store.js.map +1 -1
- package/dist/lib/db/event-store.d.ts +1 -1
- package/dist/lib/db/event-store.d.ts.map +1 -1
- package/dist/lib/db/event-store.js +1 -1
- package/dist/lib/db/event-store.js.map +1 -1
- package/dist/lib/db/index.js +1 -1
- package/dist/lib/db/index.js.map +1 -1
- package/dist/lib/db/transaction.d.ts +5 -1
- package/dist/lib/db/transaction.d.ts.map +1 -1
- package/dist/lib/db/transaction.js +10 -4
- package/dist/lib/db/transaction.js.map +1 -1
- package/dist/lib/db/transaction.test.d.ts +2 -0
- package/dist/lib/db/transaction.test.d.ts.map +1 -0
- package/dist/lib/db/transaction.test.js +161 -0
- package/dist/lib/db/transaction.test.js.map +1 -0
- package/dist/lib/events/index.d.ts +4 -1
- package/dist/lib/events/index.d.ts.map +1 -1
- package/dist/lib/events/index.js +2 -0
- package/dist/lib/events/index.js.map +1 -1
- package/dist/lib/features/client-feature-toggles/delta/createClientFeatureToggleDelta.js +1 -1
- package/dist/lib/features/client-feature-toggles/delta/createClientFeatureToggleDelta.js.map +1 -1
- package/dist/lib/features/events/createEventsService.js +1 -1
- package/dist/lib/features/events/createEventsService.js.map +1 -1
- package/dist/lib/features/events/event-created-by-migration.test.js +1 -1
- package/dist/lib/features/events/event-created-by-migration.test.js.map +1 -1
- package/dist/lib/features/events/event-service.d.ts.map +1 -1
- package/dist/lib/features/events/event-service.js +6 -1
- package/dist/lib/features/events/event-service.js.map +1 -1
- package/dist/lib/features/events/event-store.d.ts +3 -1
- package/dist/lib/features/events/event-store.d.ts.map +1 -1
- package/dist/lib/features/events/event-store.js +10 -3
- package/dist/lib/features/events/event-store.js.map +1 -1
- package/dist/lib/features/events/event-store.test.js +1 -1
- package/dist/lib/features/events/event-store.test.js.map +1 -1
- package/dist/lib/features/feature-lifecycle/createFeatureLifecycle.js +1 -1
- package/dist/lib/features/feature-lifecycle/createFeatureLifecycle.js.map +1 -1
- package/dist/lib/features/feature-links/feature-link-service.d.ts +2 -1
- package/dist/lib/features/feature-links/feature-link-service.d.ts.map +1 -1
- package/dist/lib/features/feature-links/feature-link-service.js +4 -1
- package/dist/lib/features/feature-links/feature-link-service.js.map +1 -1
- package/dist/lib/features/feature-links/feature-link-service.test.js +11 -0
- package/dist/lib/features/feature-links/feature-link-service.test.js.map +1 -1
- package/dist/lib/features/feature-links/feature-link.e2e.test.js +1 -7
- package/dist/lib/features/feature-links/feature-link.e2e.test.js.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-controller.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-controller.js +0 -8
- package/dist/lib/features/feature-toggle/feature-toggle-controller.js.map +1 -1
- package/dist/lib/features/instance-stats/createInstanceStatsService.js +1 -1
- package/dist/lib/features/instance-stats/createInstanceStatsService.js.map +1 -1
- package/dist/lib/features/metrics/client-metrics/metrics-service-v2.d.ts +3 -0
- 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 +14 -1
- package/dist/lib/features/metrics/client-metrics/metrics-service-v2.js.map +1 -1
- package/dist/lib/features/metrics/impact/define-impact-metrics.d.ts +7 -0
- package/dist/lib/features/metrics/impact/define-impact-metrics.d.ts.map +1 -0
- package/dist/lib/features/metrics/impact/define-impact-metrics.js +11 -0
- package/dist/lib/features/metrics/impact/define-impact-metrics.js.map +1 -0
- package/dist/lib/features/metrics/impact/impact-metrics.e2e.test.d.ts +2 -0
- package/dist/lib/features/metrics/impact/impact-metrics.e2e.test.d.ts.map +1 -0
- package/dist/lib/features/metrics/impact/impact-metrics.e2e.test.js +131 -0
- package/dist/lib/features/metrics/impact/impact-metrics.e2e.test.js.map +1 -0
- package/dist/lib/features/metrics/impact/metrics-translator.d.ts +2 -3
- package/dist/lib/features/metrics/impact/metrics-translator.d.ts.map +1 -1
- package/dist/lib/features/metrics/instance/instance-service.d.ts.map +1 -1
- package/dist/lib/features/metrics/instance/instance-service.js +6 -16
- package/dist/lib/features/metrics/instance/instance-service.js.map +1 -1
- package/dist/lib/features/metrics/instance/metrics.d.ts +2 -0
- package/dist/lib/features/metrics/instance/metrics.d.ts.map +1 -1
- package/dist/lib/features/metrics/instance/metrics.js +15 -4
- package/dist/lib/features/metrics/instance/metrics.js.map +1 -1
- package/dist/lib/features/metrics/shared/schema.d.ts +3 -0
- package/dist/lib/features/metrics/shared/schema.d.ts.map +1 -1
- package/dist/lib/features/metrics/shared/schema.js +23 -0
- package/dist/lib/features/metrics/shared/schema.js.map +1 -1
- package/dist/lib/features/personal-dashboard/createPersonalDashboardService.js +1 -1
- package/dist/lib/features/personal-dashboard/createPersonalDashboardService.js.map +1 -1
- package/dist/lib/features/private-project/privateProjectStore.d.ts.map +1 -1
- package/dist/lib/features/private-project/privateProjectStore.js +10 -0
- package/dist/lib/features/private-project/privateProjectStore.js.map +1 -1
- package/dist/lib/features/project/createProjectService.js +1 -1
- package/dist/lib/features/project/createProjectService.js.map +1 -1
- package/dist/lib/features/project-status/createProjectStatusService.js +1 -1
- package/dist/lib/features/project-status/createProjectStatusService.js.map +1 -1
- package/dist/lib/metrics.d.ts.map +1 -1
- package/dist/lib/metrics.js +2 -0
- package/dist/lib/metrics.js.map +1 -1
- package/dist/lib/middleware/request-logger.d.ts.map +1 -1
- package/dist/lib/middleware/request-logger.js +8 -0
- package/dist/lib/middleware/request-logger.js.map +1 -1
- package/dist/lib/openapi/spec/addon-type-schema.d.ts +4 -4
- package/dist/lib/openapi/spec/addon-type-schema.js +4 -4
- package/dist/lib/openapi/spec/addon-type-schema.js.map +1 -1
- package/dist/lib/openapi/spec/addons-schema.d.ts +4 -4
- package/dist/lib/openapi/spec/bulk-metrics-schema.d.ts +61 -0
- package/dist/lib/openapi/spec/bulk-metrics-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/bulk-metrics-schema.js +9 -0
- package/dist/lib/openapi/spec/bulk-metrics-schema.js.map +1 -1
- package/dist/lib/openapi/spec/event-schema.d.ts +11 -1
- package/dist/lib/openapi/spec/event-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/event-schema.js +10 -0
- package/dist/lib/openapi/spec/event-schema.js.map +1 -1
- package/dist/lib/openapi/spec/event-search-query-parameters.d.ts +18 -0
- package/dist/lib/openapi/spec/event-search-query-parameters.d.ts.map +1 -1
- package/dist/lib/openapi/spec/event-search-query-parameters.js +20 -0
- package/dist/lib/openapi/spec/event-search-query-parameters.js.map +1 -1
- package/dist/lib/openapi/spec/event-search-response-schema.d.ts +11 -1
- package/dist/lib/openapi/spec/event-search-response-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/events-schema.d.ts +11 -1
- package/dist/lib/openapi/spec/events-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/feature-events-schema.d.ts +11 -1
- package/dist/lib/openapi/spec/feature-events-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/impact-metrics-schema.d.ts +57 -0
- package/dist/lib/openapi/spec/impact-metrics-schema.d.ts.map +1 -0
- package/dist/lib/openapi/spec/impact-metrics-schema.js +55 -0
- package/dist/lib/openapi/spec/impact-metrics-schema.js.map +1 -0
- package/dist/lib/openapi/spec/index.d.ts +1 -0
- package/dist/lib/openapi/spec/index.d.ts.map +1 -1
- package/dist/lib/openapi/spec/index.js +1 -0
- package/dist/lib/openapi/spec/index.js.map +1 -1
- package/dist/lib/openapi/spec/integration-event-schema.d.ts +11 -1
- package/dist/lib/openapi/spec/integration-event-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/integration-events-schema.d.ts +22 -2
- package/dist/lib/openapi/spec/integration-events-schema.d.ts.map +1 -1
- package/dist/lib/server-impl.d.ts +1 -1
- package/dist/lib/server-impl.d.ts.map +1 -1
- package/dist/lib/server-impl.js +21 -14
- package/dist/lib/server-impl.js.map +1 -1
- package/dist/lib/services/email-service.d.ts +7 -0
- package/dist/lib/services/email-service.d.ts.map +1 -1
- package/dist/lib/services/email-service.js +35 -0
- package/dist/lib/services/email-service.js.map +1 -1
- package/dist/lib/types/experimental.d.ts +9 -1
- package/dist/lib/types/experimental.d.ts.map +1 -1
- package/dist/lib/types/experimental.js +3 -2
- package/dist/lib/types/experimental.js.map +1 -1
- package/dist/lib/types/option.d.ts +2 -0
- package/dist/lib/types/option.d.ts.map +1 -1
- package/dist/lib/types/stores/client-instance-store.d.ts +0 -5
- package/dist/lib/types/stores/client-instance-store.d.ts.map +1 -1
- package/dist/lib/types/stores/event-store.d.ts +3 -0
- package/dist/lib/types/stores/event-store.d.ts.map +1 -1
- package/dist/lib/util/flag-resolver.d.ts +2 -1
- package/dist/lib/util/flag-resolver.d.ts.map +1 -1
- package/dist/lib/util/flag-resolver.js +3 -0
- package/dist/lib/util/flag-resolver.js.map +1 -1
- package/dist/mailtemplates/requested-cr-approval/requested-cr-approval.html.mustache +39 -0
- package/dist/mailtemplates/requested-cr-approval/requested-cr-approval.plain.mustache +3 -0
- package/dist/migrations/20250618090103-create-cr-requested-approvals.d.ts +6 -0
- package/dist/migrations/20250618090103-create-cr-requested-approvals.d.ts.map +1 -0
- package/dist/migrations/20250618090103-create-cr-requested-approvals.js +19 -0
- package/dist/migrations/20250618090103-create-cr-requested-approvals.js.map +1 -0
- package/dist/migrations/20250623100820-cr-requested-approvals-add-notified-at-column.d.ts +3 -0
- package/dist/migrations/20250623100820-cr-requested-approvals-add-notified-at-column.d.ts.map +1 -0
- package/dist/migrations/20250623100820-cr-requested-approvals-add-notified-at-column.js +11 -0
- package/dist/migrations/20250623100820-cr-requested-approvals-add-notified-at-column.js.map +1 -0
- package/dist/migrations/20250630114145-add-transaction-context-to-events.d.ts +3 -0
- package/dist/migrations/20250630114145-add-transaction-context-to-events.d.ts.map +1 -0
- package/dist/migrations/20250630114145-add-transaction-context-to-events.js +16 -0
- package/dist/migrations/20250630114145-add-transaction-context-to-events.js.map +1 -0
- package/dist/migrator.d.ts +1 -0
- package/dist/migrator.d.ts.map +1 -1
- package/dist/migrator.js +17 -0
- package/dist/migrator.js.map +1 -1
- package/dist/server-dev.js +4 -0
- package/dist/server-dev.js.map +1 -1
- package/dist/test/e2e/api/admin/event-search.e2e.test.js +175 -0
- package/dist/test/e2e/api/admin/event-search.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/event-store.e2e.test.js +224 -0
- package/dist/test/e2e/stores/event-store.e2e.test.js.map +1 -1
- package/dist/test/fixtures/fake-client-instance-store.d.ts +0 -1
- package/dist/test/fixtures/fake-client-instance-store.d.ts.map +1 -1
- package/dist/test/fixtures/fake-client-instance-store.js +0 -3
- package/dist/test/fixtures/fake-client-instance-store.js.map +1 -1
- package/dist/test/fixtures/fake-impact-metrics.d.ts +15 -0
- package/dist/test/fixtures/fake-impact-metrics.d.ts.map +1 -0
- package/dist/test/fixtures/fake-impact-metrics.js +27 -0
- package/dist/test/fixtures/fake-impact-metrics.js.map +1 -0
- package/frontend/build/index.html +1 -1
- package/frontend/build/static/AdvancedPlayground-D-6uZDZr.js +3 -0
- package/frontend/build/static/BackendConnections-C-DXtgIJ.js +1 -0
- package/frontend/build/static/{CreateProject-9XUQN1SU.js → CreateProject-C8ofwZq1.js} +1 -1
- package/frontend/build/static/FeatureMetricsChart-uzxl5gXR.js +2 -0
- package/frontend/build/static/{FeatureStaleDialog-Q5amMPCM.js → FeatureStaleDialog-BKCmTzFV.js} +2 -2
- package/frontend/build/static/FeatureViewLazyExport-CobGy6XS.js +10 -0
- package/frontend/build/static/{FlagMetricsChart-d-DcBEd3.js → FlagMetricsChart-VYTYbbQS.js} +2 -2
- package/frontend/build/static/FrontendNetworkTrafficUsage-CFIzAiX3.js +1 -0
- package/frontend/build/static/{LazyAdminExport-6l0-2zFb.js → LazyAdminExport-CRoU3u-1.js} +12 -12
- package/frontend/build/static/{LazyProjectExport-CPe5in4-.js → LazyProjectExport-DwhYVXhl.js} +35 -35
- package/frontend/build/static/{LifecycleChartComponent-B2yYCoKI.js → LifecycleChartComponent-CqpS04x5.js} +2 -2
- package/frontend/build/static/{LineChartComponent-D27zBmU-.js → LineChartComponent-B4SCTZZg.js} +1 -1
- package/frontend/build/static/MarkCompletedDialogue-BKJahqUx.js +1 -0
- package/frontend/build/static/{NetworkConnectedEdges-1WVw8Eu8.js → NetworkConnectedEdges-Ki1G9nG8.js} +1 -1
- package/frontend/build/static/{NetworkOverview-CVDK-eSI.js → NetworkOverview-CDZIrvNW.js} +1 -1
- package/frontend/build/static/{NetworkPrometheusAPIWarning-DmpG0G0j.js → NetworkPrometheusAPIWarning-DPJmw0yM.js} +1 -1
- package/frontend/build/static/{NetworkTraffic-CyPjdgMv.js → NetworkTraffic-Sq_m8XpD.js} +1 -1
- package/frontend/build/static/{NetworkTrafficUsage-C8VwLm0h.js → NetworkTrafficUsage-D8jRHO10.js} +1 -1
- package/frontend/build/static/{ReactJSONEditor-DseXcTHD.js → ReactJSONEditor-BCSMMPUN.js} +32 -32
- package/frontend/build/static/RoleCell-ndjYcZ1T.js +1 -0
- package/frontend/build/static/{aggregateFeatureMetrics-COQ_COHJ.js → aggregateFeatureMetrics-CFI2n6i7.js} +1 -1
- package/frontend/build/static/{formatTickValue-D_CAvIVf.js → formatTickValue-D9avlj7O.js} +2 -2
- package/frontend/build/static/{index-CKXZ0XnY.js → index-Bj8wwcOa.js} +10 -10
- package/frontend/build/static/index-DvDCZTAu.js +538 -0
- package/frontend/build/static/useApiTokens-BZGgHseg.js +1 -0
- package/frontend/build/static/{useChartDataSelection-BfTrFKbU.js → useChartDataSelection-OwfBPL7x.js} +1 -1
- package/frontend/package.json +10 -10
- package/package.json +13 -13
- package/frontend/build/static/AdvancedPlayground-BoqY20Mb.js +0 -3
- package/frontend/build/static/BackendConnections-BspEzNo_.js +0 -1
- package/frontend/build/static/FeatureMetricsChart-LENYZ5kx.js +0 -2
- package/frontend/build/static/FeatureViewLazyExport-BU9aw-MC.js +0 -10
- package/frontend/build/static/FrontendNetworkTrafficUsage-7YK-sjpZ.js +0 -1
- package/frontend/build/static/MarkCompletedDialogue-SyWeA6AL.js +0 -1
- package/frontend/build/static/RoleCell-DJbKzxr1.js +0 -4
- package/frontend/build/static/index-Yy9_7TKN.js +0 -535
- package/frontend/build/static/useApiTokens-DE54gK5i.js +0 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{aG as fs,aH as ys,_ as jt,aI as bn,a as J,aJ as We,j as t,s as g,aK as vn,aL as we,r as x,aM as ms,b as Pe,aN as pt,aO as $e,aP as js,aQ as A,aR as W,aS as Sn,V as Z,A as Cn,m as bs,l as vs,n as Tn,o as wn,aT as Ss,u as Cs,h as q,as as ie,aU as pe,aV as ce,e as H,aW as bt,aX as te,aY as ue,B as z,T as L,C as B,aZ as kn,L as ae,D as xe,J as Rn,y as ee,a_ as vt,a$ as Dn,M as ve,b0 as De,b1 as He,b2 as Se,b3 as Ts,b4 as Ue,b5 as K,b6 as ws,b7 as zt,b8 as Ge,b9 as Fe,ba as ks,bb as Oe,bc as Te,bd as Rs,be as An,bf as Ye,bg as En,bh as Ds,bi as Ce,t as As,bj as Es,bk as Is,bl as In,v as $n,bm as Pn,bn as Fn,i as ne,bo as On,bp as _n,bq as Bn,br as zn,bs as $s,bt as le,am as Ln,bu as Mn,bv as Vn,bw as St,bx as Ct,by as Ve,bz as Nn,bA as qn,N as Ae,bB as Lt,bC as Wn,bD as Hn,bE as Un,bF as Gn,bG as _e,bH as Yn,bI as Jn,bJ as Kn,bK as Ps,bL as Qn,bM as Xn,bN as Zn,bO as ea,bP as be,bQ as ta,bR as sa,bS as na,bT as Tt,bU as aa,bV as oa,bW as ra,bX as ia,bY as ca,bZ as Fs,b_ as Os,b$ as _s,c0 as Be,O as la,a3 as da,c1 as ua,K as wt,c2 as pa,c3 as Bs,c4 as ga,c5 as ha,c6 as Je,c7 as xa,c8 as fa,c9 as zs,ca as ya,cb as kt,cc as ma,cd as Ne,ce as Ls,cf as ja,al as Ke,cg as ba,ch as Ms,ci as va,cj as Sa,ck as Ca,cl as Ta,cm as wa,cn as Qe,co as ka,cp as Vs,cq as Ra,cr as gt,cs as Ns,ct as Da,cu as Aa,cv as Ea,cw as Ia,cx as $a,cy as Pa,cz as Fa,cA as Oa,cB as Re,cC as _a,cD as Ba,a8 as za,a9 as Xe,aa as Mt,cE as La,cF as Ma,cG as Va,cH as Na,cI as qa,cJ as qs,cK as Wa,G as Ee,H as Ie,cL as Ha,cM as Ua,cN as Ga,cO as Ya,cP as Ja,cQ as Ka,cR as Ws,cS as Qa,cT as Hs,cU as Xa,cV as Za,cW as Us,cX as je,cY as ht,cZ as eo,c_ as Gs,E as Ys,c$ as to,d0 as so,f as no,d1 as ao,d2 as Ze,d3 as Vt,aF as oo,d4 as ke,d5 as Nt,d6 as ro,d7 as io,d8 as co,aC as Rt,aD as lo,ax as qt,d9 as uo,da as po,db as go,dc as Wt,ak as qe,dd as ho,ac as et,ao as xo,ae as fo,af as yo,ag as mo,ah as jo,ai as bo,aj as vo,de as he,df as So,dg as Co,dh as Ht,di as To,dj as wo,dk as tt,dl as ko,dm as Ro,dn as Do,x as Js,dp as Ao,dq as Ut,dr as Eo,ds as Io,dt as $o,d as Po,du as Fo,dv as Oo,dw as _o,dx as Bo,dy as zo,dz as Lo,dA as Mo,dB as Vo,dC as No,au as qo}from"./index-DvDCZTAu.js";import{u as Wo,a as Ho,F as Dt,M as Ks}from"./MarkCompletedDialogue-BKJahqUx.js";import{F as At,a as xt,u as Qs,b as Uo,c as Go}from"./aggregateFeatureMetrics-CFI2n6i7.js";import{u as Yo,a as Jo,T as Ko,b as Qo,c as Xo,d as Zo,F as er,C as tr,e as sr,E as nr,f as ar}from"./FeatureStaleDialog-BKCmTzFV.js";function or(e){return ys("MuiPagination",e)}fs("MuiPagination",["root","ul","outlined","text"]);const rr=["boundaryCount","componentName","count","defaultPage","disabled","hideNextButton","hidePrevButton","onChange","page","showFirstButton","showLastButton","siblingCount"];function ir(e={}){const{boundaryCount:s=1,componentName:n="usePagination",count:a=1,defaultPage:o=1,disabled:r=!1,hideNextButton:i=!1,hidePrevButton:l=!1,onChange:c,page:p,showFirstButton:u=!1,showLastButton:d=!1,siblingCount:m=1}=e,j=jt(e,rr),[h,v]=bn({controlled:p,default:o,name:n,state:"page"}),y=(R,M)=>{p||v(M),c&&c(R,M)},f=(R,M)=>{const G=M-R+1;return Array.from({length:G},(Q,C)=>R+C)},w=f(1,Math.min(s,a)),E=f(Math.max(a-s+1,s+1),a),O=Math.max(Math.min(h-m,a-s-m*2-1),s+2),_=Math.min(Math.max(h+m,s+m*2+2),E.length>0?E[0]-2:a-1),$=[...u?["first"]:[],...l?[]:["previous"],...w,...O>s+2?["start-ellipsis"]:s+1<a-s?[s+1]:[],...f(O,_),..._<a-s-1?["end-ellipsis"]:a-s>s?[a-s]:[],...E,...i?[]:["next"],...d?["last"]:[]],D=R=>{switch(R){case"first":return 1;case"previous":return h-1;case"next":return h+1;case"last":return a;default:return null}},I=$.map(R=>typeof R=="number"?{onClick:M=>{y(M,R)},type:"page",page:R,selected:R===h,disabled:r,"aria-current":R===h?"true":void 0}:{onClick:M=>{y(M,D(R))},type:R,page:D(R),selected:!1,disabled:r||R.indexOf("ellipsis")===-1&&(R==="next"||R==="last"?h>=a:h<=1)});return J({items:I},j)}function cr(e){return ys("MuiPaginationItem",e)}const se=fs("MuiPaginationItem",["root","page","sizeSmall","sizeLarge","text","textPrimary","textSecondary","outlined","outlinedPrimary","outlinedSecondary","rounded","ellipsis","firstLast","previousNext","focusVisible","disabled","selected","icon"]),Gt=We(t.jsx("path",{d:"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"}),"FirstPage"),Yt=We(t.jsx("path",{d:"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"}),"LastPage"),Jt=We(t.jsx("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"}),"NavigateBefore"),Kt=We(t.jsx("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"}),"NavigateNext"),lr=["className","color","component","components","disabled","page","selected","shape","size","slots","type","variant"],Xs=(e,s)=>{const{ownerState:n}=e;return[s.root,s[n.variant],s[`size${$e(n.size)}`],n.variant==="text"&&s[`text${$e(n.color)}`],n.variant==="outlined"&&s[`outlined${$e(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]},dr=e=>{const{classes:s,color:n,disabled:a,selected:o,size:r,shape:i,type:l,variant:c}=e,p={root:["root",`size${$e(r)}`,c,i,n!=="standard"&&`${c}${$e(n)}`,a&&"disabled",o&&"selected",{page:"page",first:"firstLast",last:"firstLast","start-ellipsis":"ellipsis","end-ellipsis":"ellipsis",previous:"previousNext",next:"previousNext"}[l]],icon:["icon"]};return js(p,cr,s)},ur=g("div",{name:"MuiPaginationItem",slot:"Root",overridesResolver:Xs})(({theme:e,ownerState:s})=>J({},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",[`&.${se.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)})),pr=g(vn,{name:"MuiPaginationItem",slot:"Root",overridesResolver:Xs})(({theme:e,ownerState:s})=>J({},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,[`&.${se.focusVisible}`]:{backgroundColor:(e.vars||e).palette.action.focus},[`&.${se.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"}},[`&.${se.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}))`:we(e.palette.action.selected,e.palette.action.selectedOpacity+e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:(e.vars||e).palette.action.selected}},[`&.${se.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.action.selectedChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.focusOpacity}))`:we(e.palette.action.selected,e.palette.action.selectedOpacity+e.palette.action.focusOpacity)},[`&.${se.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})=>J({},s.variant==="text"&&{[`&.${se.selected}`]:J({},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}},[`&.${se.focusVisible}`]:{backgroundColor:(e.vars||e).palette[s.color].dark}},{[`&.${se.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)"}`,[`&.${se.selected}`]:J({},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)`:we(e.palette[s.color].main,.5)}`,backgroundColor:e.vars?`rgba(${e.vars.palette[s.color].mainChannel} / ${e.vars.palette.action.activatedOpacity})`:we(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}))`:we(e.palette[s.color].main,e.palette.action.activatedOpacity+e.palette.action.focusOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},[`&.${se.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette[s.color].mainChannel} / calc(${e.vars.palette.action.activatedOpacity} + ${e.vars.palette.action.focusOpacity}))`:we(e.palette[s.color].main,e.palette.action.activatedOpacity+e.palette.action.focusOpacity)}},{[`&.${se.disabled}`]:{borderColor:(e.vars||e).palette.action.disabledBackground,color:(e.vars||e).palette.action.disabled}})})),gr=g("div",{name:"MuiPaginationItem",slot:"Icon",overridesResolver:(e,s)=>s.icon})(({theme:e,ownerState:s})=>J({fontSize:e.typography.pxToRem(20),margin:"0 -8px"},s.size==="small"&&{fontSize:e.typography.pxToRem(18)},s.size==="large"&&{fontSize:e.typography.pxToRem(22)})),hr=x.forwardRef(function(s,n){const a=ms({props:s,name:"MuiPaginationItem"}),{className:o,color:r="standard",component:i,components:l={},disabled:c=!1,page:p,selected:u=!1,shape:d="circular",size:m="medium",slots:j={},type:h="page",variant:v="text"}=a,y=jt(a,lr),f=J({},a,{color:r,disabled:c,selected:u,shape:d,size:m,type:h,variant:v}),w=Pe(),E=dr(f),_=(w.direction==="rtl"?{previous:j.next||l.next||Kt,next:j.previous||l.previous||Jt,last:j.first||l.first||Gt,first:j.last||l.last||Yt}:{previous:j.previous||l.previous||Jt,next:j.next||l.next||Kt,first:j.first||l.first||Gt,last:j.last||l.last||Yt})[h];return h==="start-ellipsis"||h==="end-ellipsis"?t.jsx(ur,{ref:n,ownerState:f,className:pt(E.root,o),children:"…"}):t.jsxs(pr,J({ref:n,ownerState:f,component:i,disabled:c,className:pt(E.root,o)},y,{children:[h==="page"&&p,_?t.jsx(gr,{as:_,ownerState:f,className:E.icon}):null]}))}),xr=["boundaryCount","className","color","count","defaultPage","disabled","getItemAriaLabel","hideNextButton","hidePrevButton","onChange","page","renderItem","shape","showFirstButton","showLastButton","siblingCount","size","variant"],fr=e=>{const{classes:s,variant:n}=e;return js({root:["root",n],ul:["ul"]},or,s)},yr=g("nav",{name:"MuiPagination",slot:"Root",overridesResolver:(e,s)=>{const{ownerState:n}=e;return[s.root,s[n.variant]]}})({}),mr=g("ul",{name:"MuiPagination",slot:"Ul",overridesResolver:(e,s)=>s.ul})({display:"flex",flexWrap:"wrap",alignItems:"center",padding:0,margin:0,listStyle:"none"});function jr(e,s,n){return e==="page"?`${n?"":"Go to "}page ${s}`:`Go to ${e} page`}const br=x.forwardRef(function(s,n){const a=ms({props:s,name:"MuiPagination"}),{boundaryCount:o=1,className:r,color:i="standard",count:l=1,defaultPage:c=1,disabled:p=!1,getItemAriaLabel:u=jr,hideNextButton:d=!1,hidePrevButton:m=!1,renderItem:j=I=>t.jsx(hr,J({},I)),shape:h="circular",showFirstButton:v=!1,showLastButton:y=!1,siblingCount:f=1,size:w="medium",variant:E="text"}=a,O=jt(a,xr),{items:_}=ir(J({},a,{componentName:"Pagination"})),$=J({},a,{boundaryCount:o,color:i,count:l,defaultPage:c,disabled:p,getItemAriaLabel:u,hideNextButton:d,hidePrevButton:m,renderItem:j,shape:h,showFirstButton:v,showLastButton:y,siblingCount:f,size:w,variant:E}),D=fr($);return t.jsx(yr,J({"aria-label":"pagination navigation",className:pt(D.root,r),ownerState:$,ref:n},O,{children:t.jsx(mr,{className:D.ul,ownerState:$,children:_.map((I,R)=>t.jsx("li",{children:j(J({},I,{color:i,"aria-label":u(I.type,I.page,I.selected),shape:h,size:w,variant:E}))},R))})}))}),vr=()=>{const e=A("projectId"),s=A("featureId"),{feature:n}=W(e,s);return n.name?t.jsx(Sn,{title:"Event log",feature:s}):null},Sr=()=>t.jsxs(Z,{severity:"warning",children:["Remember to update your Unleash client! Feature dependencies require new SDK versions. Read more about ",t.jsx(Cr,{}),"."]}),Cr=()=>t.jsx("a",{href:"https://docs.getunleash.io/reference/feature-toggles#feature-flag-dependencies",target:"_blank",rel:"noreferrer",children:"Client SDK support for feature dependencies"}),Tr=g(Cn)(({theme:e})=>({marginTop:e.spacing(2),marginBottom:e.spacing(1.5)})),wr=({project:e,parent:s,onSelect:n,selectedValues:a})=>{const{parentVariantOptions:o}=Wo(e,s),r=t.jsx(Tn,{fontSize:"small"}),i=t.jsx(wn,{fontSize:"small"});return t.jsx(Tr,{multiple:!0,id:"parent-variant-options",options:o,disableCloseOnSelect:!0,renderOption:(l,c,{selected:p})=>t.jsxs("li",{...l,children:[t.jsx(bs,{icon:r,checkedIcon:i,style:{marginRight:8},checked:p}),c]}),renderInput:l=>t.jsx(vs,{...l,placeholder:"Select values"}),fullWidth:!0,value:a,onChange:(l,c)=>{n(c)}})},de={key:"none (remove dependency)",label:"none (remove dependency)"},Zs=g(Ss)(({theme:e})=>({marginTop:e.spacing(2),marginBottom:e.spacing(1.5)})),kr=({onSelect:e,parentValue:s})=>t.jsx(Zs,{fullWidth:!0,options:[{key:"enabled",label:"enabled"},{key:"enabled_with_variants",label:"enabled with variants"},{key:"disabled",label:"disabled"}],value:s.status,onChange:e}),en=e=>{const{makeRequest:s,createRequest:n,errors:a,loading:o}=Cs({propagateErrors:!0}),r=async(p,u)=>{const d=n(`/api/admin/projects/${e}/features/${p}/dependencies`,{method:"POST",body:JSON.stringify(u)});await s(d.caller,d.id)},i=async(p,u)=>{const d=n(`/api/admin/projects/${e}/features/${p}/dependencies/${u}`,{method:"DELETE"});await s(d.caller,d.id)},l=async p=>{const u=n(`/api/admin/projects/${e}/features/${p}/dependencies`,{method:"DELETE"});await s(u.caller,u.id)},c=[n,s,q,e];return{addDependency:x.useCallback(r,c),removeDependency:x.useCallback(i,c),removeDependencies:x.useCallback(l,c),errors:a,loading:o}},Rr=(e,s,n,a,o)=>{const{trackEvent:r}=ie(),{addChange:i}=pe(),{refetch:l}=ce(e),{setToastData:c,setToastApiError:p}=H(),{refetchFeature:u}=W(e,s),d=bt(e)(),{isChangeRequestConfiguredInAnyEnv:m}=te(e),{addDependency:j,removeDependencies:h}=en(e),v=async y=>{if(!d){console.error("No change request environment");return}y==="addDependency"&&(await i(e,d,[{action:y,feature:s,payload:{feature:n,enabled:a.status!=="disabled",variants:a.status==="enabled_with_variants"?a.variants:[]}}]),r("dependent_features",{props:{eventType:"dependency added"}})),y==="deleteDependency"&&await i(e,d,[{action:y,feature:s,payload:void 0}]),l(),c({type:"success",text:"Change added to draft"})};return async()=>{try{if(m()){const y=n===de.key?"deleteDependency":"addDependency";await v(y),r("dependent_features",{props:{eventType:y==="addDependency"?"add dependency added to change request":"delete dependency added to change request"}})}else n===de.key?(await h(s),r("dependent_features",{props:{eventType:"dependency removed"}}),c({text:"Dependency removed",type:"success"})):(await j(s,{feature:n,enabled:a.status!=="disabled",variants:a.status==="enabled_with_variants"?a.variants:[]}),r("dependent_features",{props:{eventType:"dependency added"}}),c({text:"Dependency added",type:"success"}))}catch(y){p(q(y))}u(),o()}},Dr=({project:e,featureId:s,parent:n,onSelect:a})=>{const{parentOptions:o}=Ho(e,s),r=o?[de,...o.map(i=>({key:i,label:i}))]:[de];return t.jsx(Zs,{fullWidth:!0,options:r,value:n,onChange:a})},Ar=({project:e,featureId:s,parentDependency:n,showDependencyDialogue:a,onClose:o})=>{const[r,i]=x.useState((n==null?void 0:n.feature)||de.key),l=()=>{var f;return n?(f=n.variants)!=null&&f.length?{status:"enabled_with_variants",variants:n.variants}:n.enabled===!1?{status:"disabled"}:{status:"enabled"}:{status:"enabled"}},[c,p]=x.useState(l),u=()=>{i((n==null?void 0:n.feature)||de.key),p(l())};x.useEffect(()=>{u()},[JSON.stringify(n)]);const d=Rr(e,s,r,c,o),{isChangeRequestConfiguredInAnyEnv:m}=te(e),j=r!==de.key,h=r!==de.key&&c.status==="enabled_with_variants",v=f=>{(f==="enabled"||f==="disabled")&&p({status:f}),f==="enabled_with_variants"&&p({status:f,variants:[]})},y=f=>{p({status:"enabled_with_variants",variants:f})};return t.jsx(ue,{open:a,title:"Add parent flag dependency",onClose:o,onClick:d,primaryButtonText:m()?"Add change to draft":r===de.key?"Remove":"Add",secondaryButtonText:"Cancel",children:t.jsxs(z,{children:[t.jsx(Sr,{}),t.jsxs(z,{sx:{mt:2,mb:4},children:["Your feature will be evaluated only when the selected parent feature is"," ",t.jsx("b",{children:c.status==="disabled"?"disabled":"enabled"})," ","in the same environment."]}),t.jsxs(L,{children:["What ",t.jsx("b",{children:"feature"})," do you want to depend on?"]}),t.jsx(B,{condition:a,show:t.jsx(Dr,{project:e,featureId:s,parent:r,onSelect:f=>{p({status:"enabled"}),i(f)}})}),t.jsx(B,{condition:j,show:t.jsxs(z,{sx:{mt:2},children:[t.jsxs(L,{children:["What ",t.jsx("b",{children:"feature status"})," do you want to depend on?"]}),t.jsx(kr,{parentValue:c,onSelect:v})]})}),t.jsx(B,{condition:h,show:c.status==="enabled_with_variants"&&t.jsxs(z,{sx:{mt:2},children:[t.jsxs(L,{children:["What ",t.jsx("b",{children:"variant"})," do you want to depend on?"]}),t.jsx(wr,{parent:r,project:e,selectedValues:c.variants,onSelect:y})]})})]})})};g("div")({display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center"});g("div")(({theme:e})=>({justifyContent:"center",paddingTop:e.spacing(.75),...kn}));g("span")(({theme:e})=>({color:e.palette.text.secondary,marginRight:e.spacing(1)}));const Et=g(ae)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),Er=g(xe)(({theme:e})=>({height:e.spacing(3.5),width:e.spacing(3.5)})),Ir=g(Rn)(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,padding:e.spacing(1,1.5)})),tn=({capabilityId:e,feature:s,onEdit:n,onDelete:a})=>{const o=`${e}-${s}-actions`,r=`${o}-menu`,[i,l]=x.useState(null),c=!!i,p=d=>{l(d.currentTarget)},u=()=>{l(null)};return t.jsxs(z,{children:[t.jsx(ee,{title:"Dependency actions",arrow:!0,describeChild:!0,children:t.jsx(Er,{id:o,"aria-controls":c?r:void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,onClick:p,type:"button",children:t.jsx(vt,{})})}),t.jsx(Ir,{id:r,anchorEl:i,open:c,onClose:u,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},disableScrollLock:!0,children:t.jsxs(Dn,{"aria-labelledby":o,children:[t.jsxs(ve,{onClick:()=>{n(),u()},children:[t.jsx(De,{children:t.jsx(He,{})}),t.jsx(Se,{children:t.jsx(L,{variant:"body2",children:"Edit"})})]}),t.jsxs(ve,{onClick:()=>{a(),u()},children:[t.jsx(De,{children:t.jsx(Ts,{})}),t.jsx(Se,{children:t.jsx(L,{variant:"body2",children:"Delete"})})]})]})})]})},$r=({childFeatures:e,project:s})=>t.jsx(Ue,{tooltip:t.jsx(t.Fragment,{children:e.map(n=>t.jsx(Et,{to:`/projects/${s}/features/${n}`,children:t.jsx("div",{children:n})},`${s}-${n}`))}),children:e.length===1?"1 feature":`${e.length} features`}),Pr=({variants:e})=>e.length===1&&e[0].length<20?t.jsx("span",{children:e[0]}):t.jsx(Ue,{tooltip:t.jsx(t.Fragment,{children:e.map((s,n)=>t.jsx("div",{children:s},n))}),children:e.length===1?"1 variant":`${e.length} variants`}),Fr=g(K)(({theme:e})=>({fontSize:e.fontSizes.smallBody,lineHeight:e.typography.body1.lineHeight})),Or=(e,s)=>{const{trackEvent:n}=ie(),{addChange:a}=pe(),{refetch:o}=ce(e),{setToastData:r,setToastApiError:i}=H(),{refetchFeature:l}=W(e,s),c=bt(e)(),{isChangeRequestConfiguredInAnyEnv:p}=te(e),{removeDependencies:u}=en(e),d=async()=>{if(!c){console.error("No change request environment");return}await a(e,c,[{action:"deleteDependency",feature:s,payload:void 0}])};return async()=>{try{p()?(await d(),n("dependent_features",{props:{eventType:"delete dependency added to change request"}}),r({type:"success",text:"Change added to draft"}),await o()):(await u(s),n("dependent_features",{props:{eventType:"dependency removed"}}),r({text:"Dependency removed",type:"success"}),await l())}catch(j){i(q(j))}}},_r=({feature:e})=>{var p,u,d,m,j,h,v;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=bt(e.project)(),l=ws(e.project),c=Or(e.project,e.name);return t.jsxs(t.Fragment,{children:[a?t.jsxs(X,{children:[t.jsx(re,{children:"Dependency:"}),t.jsx("div",{children:t.jsx(Fr,{size:"small",permission:zt,projectId:e.project,variant:"text",onClick:()=>{n(!0)},children:"Add parent flag"})})]}):null,o?t.jsxs(X,{children:[t.jsx(re,{children:"Dependency:"}),t.jsxs(yt,{children:[t.jsx(Et,{to:`/projects/${e.project}/features/${(p=e.dependencies[0])==null?void 0:p.feature}`,children:t.jsx(Ge,{title:(u=e.dependencies[0])==null?void 0:u.feature,children:(d=e.dependencies[0])==null?void 0:d.feature})}),l(zt,i)?t.jsx(tn,{capabilityId:"dependency",feature:e.name,onEdit:()=>n(!0),onDelete:c}):null]})]}):null,o&&!((m=e.dependencies[0])!=null&&m.enabled)?t.jsxs(X,{children:[t.jsx(re,{children:"Dependency value:"}),t.jsx("span",{children:"disabled"})]}):null,o&&((h=(j=e.dependencies[0])==null?void 0:j.variants)!=null&&h.length)?t.jsxs(X,{children:[t.jsx(re,{children:"Dependency value:"}),t.jsx(Pr,{variants:((v=e.dependencies[0])==null?void 0:v.variants)||[]})]}):null,r?t.jsxs(X,{children:[t.jsx(re,{children:"Children:"}),t.jsx($r,{childFeatures:e.children,project:e.project})]}):null,e.project?t.jsx(Ar,{project:e.project,featureId:e.name,parentDependency:e.dependencies[0],onClose:()=>n(!1),showDependencyDialogue:s}):null]})},Br=(e,s={})=>{const n=Fe(`/api/admin/projects/${e}/dependencies`),{data:a,error:o}=ks(e,!1,n,zr,s);return{dependenciesExist:a,error:o,loading:!o&&!a}},zr=async e=>await(await fetch(e).then(Oe("Dependencies exist check"))).json(),Lr=e=>{const{dependenciesExist:s}=Br(e),{isOss:n}=Te();return!!e&&!!(!n()||s)},sn=(e,s={})=>{const n=async()=>{const p=Fe(`api/admin/features/${e}/tags`);return(await fetch(p,{method:"GET"}).then(Oe("Tags"))).json()},a=`api/admin/features/${e}/tags`,{data:o,error:r}=ks(!!e,{tags:[]},a,n,s),[i,l]=x.useState(!r&&!o),c=()=>{Rs(a)};return x.useEffect(()=>{l(!r&&!o)},[o,r]),{tags:(o==null?void 0:o.tags)||[],error:r,loading:i,refetch:c}},Mr=g("section")(({theme:e})=>({"& > *":{margin:e.spacing(1,0)}})),st=e=>e.map(s=>({title:s.value})),Qt=(e,s)=>e.map(n=>({value:n.title,type:s})),nn=({open:e,setOpen:s})=>{const{tagTypes:n}=An(),a=A("featureId"),{createTag:o}=Yo(),{updateFeatureTags:r,loading:i}=Ye(),{tags:l,refetch:c,loading:p}=sn(a),{setToastData:u}=H(),d=n&&n.length>0?n[0]:{name:"simple",description:"Simple tag to get you started",icon:""},[m,j]=x.useState(d),h=i||p,[v,y]=x.useState(0),{trackEvent:f}=ie(),[w,E]=x.useState(st(l.filter(b=>b.type===m.name))),{tags:O,refetch:_}=Jo(m.name),$=x.useMemo(()=>st(O),[O]);x.useEffect(()=>{l&&m&&E(st(l.filter(b=>b.type===m.name)))},[JSON.stringify(l),m,e]);const D=()=>{s(!1),E([])};function I(b,S){const F=b.filter(N=>N.type===m.name).filter(N=>!S.find(k=>N.value===k.value&&N.type===k.type)),V=S.filter(N=>N.type===m.name).filter(N=>!b.find(k=>N.value===k.value&&N.type===k.type));return y(F.length+V.length),{added:F,removed:V}}const R=b=>b.filter(S=>!S.title.startsWith("Create")),M=async(b,S)=>{try{await r(a,{addedTags:b,removedTags:S}),await c()}catch{u({type:"error",text:"Failed to add tag"})}},G=async b=>{b.preventDefault();const S=Qt(R(w),m.name),{added:F,removed:V}=I(S,l);v>0&&(await M(F,V),v>1&&f("suggest_tags",{props:{eventType:"multiple_tags_added"}}),v>0&&u({type:"success",text:`Updated tag${F.length>1?"s":""} to flag`})),y(0),E([]),s(!1)},Q=(b,S)=>{S!=null&&typeof S!="string"&&(b.preventDefault(),j(S),E([]),y(0))},C=(b,S,F)=>{const V=En(S);F==="selectOption"&&S.forEach((k,oe)=>{if(typeof k!="string"&&k.inputValue&&k.inputValue!==""){const ge={value:k.inputValue,type:m.name};o(ge).then(()=>{f("suggest_tags",{props:{eventType:"tag_created"}}),_()}),k.title=k.inputValue,k.inputValue="",V[oe]=k}});const N=Qt(R(V),m.name);I(N,l),E(V)},P="add-tag-form";return t.jsx(ue,{open:e,secondaryButtonText:"Cancel",primaryButtonText:"Save tags",title:"Update feature flag tags",onClick:G,disabledPrimaryButton:h||v===0,onClose:D,formId:P,children:t.jsxs(t.Fragment,{children:[t.jsx(L,{paragraph:!0,sx:{marginBottom:b=>b.spacing(2.5)},children:"Tags allow you to group features together"}),t.jsx("form",{id:P,onSubmit:G,children:t.jsxs(Mr,{children:[t.jsx(Ko,{options:n,value:m,onChange:Q}),t.jsx(Qo,{options:$,existingTags:l,tagType:m,selectedOptions:w,onChange:C})]})})]})})},Vr=g(K)(({theme:e})=>({lineHeight:e.typography.body1.lineHeight,borderRadius:e.shape.borderRadiusExtraLarge,background:e.palette.secondary.light,padding:e.spacing(.5,1),height:e.spacing(3.5)})),Nr=g(Ds)(({theme:e})=>({fontSize:e.typography.body2.fontSize})),Xt=({project:e,onClick:s})=>t.jsx(Vr,{size:"small",permission:Ce,projectId:e,variant:"text",onClick:s,startIcon:t.jsx(Nr,{}),"data-loading":!0,children:"Add tag"}),Zt=g("span")(({theme:e})=>({marginTop:e.spacing(1),color:e.palette.text.secondary,marginRight:e.spacing(1)})),qr=g("div")(({theme:e})=>({display:"flex",justifyContent:"space-between",flexWrap:"wrap",minHeight:e.spacing(4.5),fontSize:e.fontSizes.smallBody})),es=g("div")(({theme:e})=>({display:"flex",overflow:"hidden",gap:e.spacing(1),flexWrap:"wrap",marginTop:e.spacing(.75)}));g(As)(({theme:e})=>({overflowWrap:"anywhere",lineHeight:e.typography.body1.lineHeight,backgroundColor:e.palette.neutral.light,color:e.palette.text.primary,padding:e.spacing(.25),height:e.spacing(3.5)}));g("span")(({theme:e})=>({color:e.palette.text.secondary}));const Wr=({feature:e})=>{const{tags:s,refetch:n}=sn(e.name),{deleteTagFromFeature:a}=Ye(),[o,r]=x.useState(!1),[i,l]=x.useState(!1),[c,p]=x.useState(),{setToastData:u,setToastApiError:d}=H(),{hasAccess:m}=x.useContext(Es),j=m(Ce,e.project),h=()=>{r(!0)},v=async()=>{if(c)try{await a(e.name,c.type,c.value),n(),u({type:"success",text:"Tag removed"})}catch(y){d(q(y))}};return t.jsxs(t.Fragment,{children:[s.length?t.jsxs(qr,{children:[t.jsx(Zt,{children:"Tags:"}),t.jsxs(es,{children:[s.map(y=>t.jsx(Hr,{tag:y,canUpdateTags:j,onTagRemove:f=>{l(!0),p(f)}},Is(y))),j?t.jsx(Xt,{project:e.project,onClick:h}):null]})]}):t.jsxs(X,{children:[t.jsx(Zt,{children:"Tags:"}),t.jsx(es,{children:t.jsx(Xt,{project:e.project,onClick:h})})]}),t.jsx(nn,{open:o,setOpen:r}),t.jsxs(ue,{open:i,primaryButtonText:"Remove tag",secondaryButtonText:"Cancel",onClose:()=>{l(!1),p(void 0),n()},onClick:()=>{l(!1),v(),p(void 0)},title:"Remove tag",children:["You are about to remove tag:"," ",t.jsxs("strong",{children:[c==null?void 0:c.type,":",c==null?void 0:c.value]})]})]})},Hr=({tag:e,canUpdateTags:s,onTagRemove:n})=>{const a=Is(e),o=a.length>25,r=s?()=>n(e):void 0,i=t.jsx(ee,{title:"Remove tag",arrow:!0,children:t.jsx($n,{sx:{height:"20px",width:"20px"}})});return t.jsx(ee,{title:o?a:"",arrow:!0,children:t.jsx("span",{children:t.jsx(In,{tag:e,onDelete:r,deleteIcon:i})})},a)},Ur=g(Pn)(({theme:e})=>({width:e.spacing(2.5),height:e.spacing(2.5)})),Gr=g(Fn)({flexWrap:"nowrap"}),Yr=({collaborators:e})=>!e||e.length===0?null:t.jsx(Gr,{users:e,avatarLimit:9,AvatarComponent:Ur}),Jr="environment-visibility-button",ts="environment-visibility-menu",Kr=g("div")(({theme:e})=>({display:"flex",justifyContent:"center",paddingTop:e.spacing(4)})),Qr=({environments:e,hiddenEnvironments:s,onChange:n})=>{const[a,o]=x.useState(null),r=!!a,i=d=>{o(d.currentTarget)},l=()=>{o(null)},c=e.map(d=>d.name),p=new Set(c.filter(d=>!s.includes(d))),u=d=>{n(d)};return t.jsxs(Kr,{children:[t.jsx(ne,{onClick:i,endIcon:r?t.jsx(On,{}):t.jsx(_n,{}),variant:"outlined",id:Jr,"aria-controls":ts,"aria-haspopup":"true","aria-expanded":r?"true":void 0,"data-loading":!0,children:"Hide/show environments"}),t.jsx(Bn,{id:ts,open:!!a,anchorEl:a,onClose:l,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},children:t.jsx(zn,{multiselect:{selectedOptions:p},onChange:u,options:c.map(d=>({label:d,value:d})),search:{label:"Filter environments",placeholder:"Filter environments"}})})]})},an=(e,s)=>{const{makeRequest:n,createRequest:a,errors:o,loading:r}=Cs({propagateErrors:!0}),i=async u=>{const d=a(`/api/admin/projects/${e}/features/${s}/link`,{method:"POST",body:JSON.stringify(u)});await n(d.caller,d.id)},l=async(u,d)=>{const m=a(`/api/admin/projects/${e}/features/${s}/link/${u}`,{method:"PUT",body:JSON.stringify(d)});await n(m.caller,m.id)},c=async u=>{const d=a(`/api/admin/projects/${e}/features/${s}/link/${u}`,{method:"DELETE"});await n(d.caller,d.id)},p=[a,n,q,e];return{addLink:x.useCallback(i,p),editLink:x.useCallback(l,p),deleteLink:x.useCallback(c,p),errors:o,loading:r}},ss=g(vs)(({theme:e})=>({width:"100%",marginTop:e.spacing(1),marginBottom:e.spacing(1)})),on=({showDialogue:e,onClose:s,project:n,featureId:a,mode:o,link:r})=>{const[i,l]=x.useState(""),[c,p]=x.useState(""),[u,d]=x.useState(""),{addLink:m,editLink:j,loading:h}=an(n,a),{refetchFeature:v}=W(n,a),{setToastData:y,setToastApiError:f}=H(),w=o==="edit",E=w?"Edit link":"Add link",O=w?"Link updated":"Link added",{trackEvent:_}=ie();x.useEffect(()=>{w&&r?(l(r.url||""),p(r.title||""),d(r.id||"")):w||(l(""),p(""),d(""))},[w,r]);const $=async()=>{try{w?(await j(u,{url:i,title:c||null}),_("feature-links",{props:{eventType:"edit-link"}})):(await m({url:i,title:c||null}),_("feature-links",{props:{eventType:"add-link"}})),y({text:O,type:"success"}),s(),v(),p(""),l("")}catch(I){f(q(I))}},D=w?r!==null:e;return t.jsx(ue,{open:D,title:E,onClose:s,disabledPrimaryButton:i.trim()===""||h,onClick:$,primaryButtonText:"Save",secondaryButtonText:"Cancel",children:t.jsxs(z,{children:[t.jsx(ss,{label:"Link",variant:"outlined",value:i,onChange:I=>l(I.target.value)}),t.jsx(ss,{label:"Title (optional)",variant:"outlined",value:c,onChange:I=>p(I.target.value)})]})})},Xr=e=>t.jsx(on,{...e,mode:"add",link:null}),Zr=e=>t.jsx(on,{...e,mode:"edit",showDialogue:e.link!==null}),rn=g("div")(({theme:e})=>({padding:e.spacing(3),borderRadius:e.shape.borderRadiusLarge,backgroundColor:e.palette.background.paper,display:"flex",flexDirection:"column",gap:e.spacing(2),width:"350px",border:`1px solid ${e.palette.divider}`,[e.breakpoints.down("md")]:{width:"100%"},marginBottom:e.spacing(2)})),ft=g("h2")(({theme:e})=>({fontSize:e.typography.body1.fontSize,fontWeight:e.typography.fontWeightBold,marginBottom:e.spacing(.5)})),ei=g("div")({display:"flex",flexDirection:"column"}),X=g("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"space-between",minHeight:e.spacing(4.5),fontSize:e.fontSizes.smallBody})),re=g("span")(({theme:e})=>({color:e.palette.text.secondary,marginRight:e.spacing(1)})),ze=g("span")({overflowWrap:"anywhere"}),yt=g("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1)})),ti=g(De)(({theme:e})=>({minWidth:e.spacing(5)})),si=({links:e,project:s,feature:n})=>{const[a,o]=x.useState(!1),[r,i]=x.useState(null),{deleteLink:l,loading:c}=an(s,n),{setToastData:p,setToastApiError:u}=H(),{refetchFeature:d}=W(s,n),m=t.jsx(K,{size:"small",startIcon:t.jsx(Ds,{}),permission:Ce,disabled:e.length>=10,projectId:s,variant:"text",onClick:()=>o(!0),children:"Add link"}),j=()=>t.jsx(Ct,{children:e.map(y=>t.jsx(Ve,{secondaryAction:t.jsx(tn,{capabilityId:"link",feature:n,onEdit:()=>{i(y)},onDelete:async()=>{try{await l(y.id),p({text:"Link removed",type:"success"}),d()}catch(f){u(q(f))}}}),disablePadding:!0,dense:!0,children:t.jsxs(Nn,{component:"a",href:y.url,target:"_blank",rel:"noopener noreferrer",disableGutters:!0,children:[t.jsx(ti,{children:t.jsx(qn,{color:"primary"})}),t.jsx(Se,{primary:y.title,secondary:y.url,secondaryTypographyProps:{sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",display:"block"}}})]})},y.id))}),h=t.jsxs(t.Fragment,{children:[t.jsxs(ft,{children:["You can now add links"," ",t.jsx(Ae,{color:"success",sx:{ml:1},children:"New"})]}),t.jsx(X,{children:"Gather relevant links for external resources such as issue trackers, code repositories or analytics tooling"}),t.jsx("div",{children:m})]}),v=t.jsxs(t.Fragment,{children:[t.jsx(ft,{children:"Resources"}),j(),t.jsx("div",{children:m})]});return t.jsxs(t.Fragment,{children:[t.jsx(rn,{children:e.length===0?h:v}),t.jsx(Xr,{project:s,featureId:n,showDialogue:a,onClose:()=>o(!1)}),t.jsx(Zr,{project:s,featureId:n,link:r,onClose:()=>i(null)})]})},ni=({hiddenEnvironments:e,onEnvironmentVisibilityChange:s,feature:n,onChange:a})=>{var h,v,y,f;const{locationSettings:o}=$s(),r=le(),[i,l]=x.useState(!1),[c,p]=x.useState(!1),{project:u,description:d,type:m}=n,j=Lr(u);return t.jsxs(t.Fragment,{children:[t.jsx(si,{links:n.links||[],project:n.project,feature:n.name}),t.jsxs(rn,{children:[t.jsxs("div",{children:[t.jsx(ft,{children:"Flag details"}),d?t.jsx(X,{"data-loading":!0,children:t.jsx(ze,{children:t.jsx(Ge,{arrow:!0,lines:5,title:d,children:d})})}):null]}),t.jsxs(ei,{children:[t.jsxs(X,{children:[t.jsx(re,{children:"Flag type:"}),t.jsxs(ze,{"data-loading":!0,children:[Ln(m||" ")," flag"]})]}),n.lifecycle?t.jsxs(X,{"data-loading":!0,children:[t.jsx(re,{children:"Lifecycle:"}),t.jsx(Mn,{feature:n,onArchive:()=>l(!0),onComplete:()=>p(!0),onUncomplete:a})]}):null,t.jsxs(X,{children:[t.jsx(re,{children:"Created:"}),t.jsx(ze,{"data-loading":!0,children:Vn(St(n.createdAt),o.locale)})]}),n.createdBy?t.jsxs(X,{children:[t.jsx(re,{children:"Created by:"}),t.jsx(yt,{children:t.jsx(ze,{"data-loading":!0,children:(h=n.createdBy)==null?void 0:h.name})})]}):null,(v=n.collaborators)!=null&&v.users&&((y=n.collaborators)==null?void 0:y.users.length)>0?t.jsxs(X,{children:[t.jsx(re,{children:"Collaborators:"}),t.jsx(yt,{children:t.jsx(Yr,{collaborators:(f=n.collaborators)==null?void 0:f.users})})]}):null,j?t.jsx(_r,{feature:n}):null,t.jsx(Wr,{feature:n}),s?t.jsx(Qr,{environments:n.environments||[],hiddenEnvironments:e||[],onChange:s}):null]})]}),n.children.length>0?t.jsx(At,{features:n.children,project:n.project,isOpen:i,onClose:()=>l(!1)}):t.jsx(Dt,{isOpen:i,onConfirm:()=>{r(`/projects/${n.project}`)},onClose:()=>l(!1),projectId:n.project,featureIds:[n.name]}),n.project?t.jsx(Ks,{isOpen:c,setIsOpen:p,projectId:n.project,featureId:n.name,onComplete:a}):null]})},ai=e=>{var o;const{uiConfig:s}=Te(),n=((o=s.resourceLimits)==null?void 0:o.featureEnvironmentStrategies)||100,a=e>=n;return{limit:n,limitReached:a}},oi=()=>{const[e,s]=x.useState(0),n=A("projectId"),a=A("featureId"),o=Lt("environmentId"),r=Lt("strategyName"),{strategy:i,defaultStrategyFallback:l}=Xo(n,o),c=JSON.parse(Wn().get("defaultStrategy")||"false"),{segments:p}=Hn(),u=(p||[]).filter(Y=>{var me;return(me=i==null?void 0:i.segments)==null?void 0:me.includes(Y.id)}),[d,m]=x.useState({}),[j,h]=x.useState(c?u:[]),{strategyDefinition:v}=Un(r),y=Gn(),{addStrategyToFeature:f,loading:w}=_e(),{addChange:E}=pe(),{setToastData:O,setToastApiError:_}=H(),{uiConfig:$}=Te(),{unleashUrl:D}=$,I=le(),{feature:R,refetchFeature:M}=W(n,a),G=R==null?void 0:R.environments.find(Y=>Y.name===o),Q=(G==null?void 0:G.strategies.length)||0,{limit:C,limitReached:P}=ai(Q),b=x.useRef(R),{isChangeRequestConfigured:S}=te(n),{refetch:F}=ce(n),{trackEvent:V}=ie(),{data:N,staleDataNotification:k,forceRefreshCache:oe}=Yn({unleashGetter:W,params:[n,a],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},R,{afterSubmitAction:M},aa);x.useEffect(()=>{b.current.name===""&&R.name&&(oe(R),b.current=R)},[R.name]),x.useEffect(()=>{var Y;if(c){const me=i||l;((Y=me.parameters)==null?void 0:Y.groupId)===""&&a?m({...me,parameters:{...me.parameters,groupId:a}}):m(me)}else v&&m(Jn(a,v))},[a,JSON.stringify(v),JSON.stringify(i),c]);const ge=async Y=>{await f(n,a,o,Y),O({text:"Strategy created",type:"success"})},fe=async Y=>{await E(n,o,{action:"addStrategy",feature:a,payload:Y}),O({text:"Strategy added to draft",type:"success"}),F()},T=Kn(d,j),U=async()=>{V("strategyTitle",{props:{hasTitle:!!d.title,on:"create"}});try{S(o)?await fe(T):await ge(T),M(),I(Tt(n,a))}catch(Y){_(q(Y))}};return!N||!N.project?null:t.jsxs(Ps,{modal:!0,description:Qn,documentationLink:Xn,documentationLinkLabel:Zn,disablePadding:!0,formatApiCode:()=>ri(n,a,o,T,D),children:[t.jsx(ea,{projectId:n,feature:N,strategy:d,setStrategy:m,segments:j,setSegments:h,environmentId:o,onSubmit:U,loading:w,permission:be,errors:y,isChangeRequest:S(o),tab:e,setTab:s,StrategyVariants:t.jsx(ta,{strategy:d,setStrategy:m,environment:o,projectId:n,editable:!0}),Limit:t.jsx(sa,{name:"strategies in this environment",shortName:"strategies",currentValue:Q,limit:C}),disabled:P}),k]})},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}`},ri=(e,s,n,a,o)=>{if(!o)return"";const r=`${o}/api/admin/projects/${e}/features/${s}/environments/${n}/strategies`,i=JSON.stringify(a,na,2);return`curl --location --request POST '${r}' \\
|
|
2
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
|
+
--header 'Content-Type: application/json' \\
|
|
4
|
+
--data-raw '${i}'`},ns=3,ln=e=>Array.isArray(e)?e.filter(s=>s.featureId&&s.projectId):[],as=e=>ln(ia(e)||[]),ii=()=>{const e=`${ca}:unleash-lastViewedFlags`,[s,n]=x.useState(()=>as(e)),{emitEvent:a}=oa("lastViewedFlagsUpdated",x.useCallback(()=>{n(as(e))},[e]));x.useEffect(()=>{s&&(ra(e,s),a())},[JSON.stringify(s),e,a]);const o=x.useCallback(r=>{if(!r.featureId||!r.projectId||s.find(l=>l.featureId===r.featureId))return;const i=ln([...s,r]);n(i.length>ns?i.slice(-ns):i)},[JSON.stringify(s)]);return{lastViewed:s,setLastViewed:o}},ci=g("div")(({theme:e})=>({width:e.spacing(3),"& > svg":{width:e.spacing(2.25),height:e.spacing(2.25),fill:e.palette.primary.main}})),li=g(Fs)(({theme:e})=>({fontWeight:e.typography.fontWeightBold,fontSize:e.typography.caption.fontSize,display:"block",marginBottom:e.spacing(.5)})),di=g(ae)(({theme:e})=>({display:"flex",flexDirection:"column",width:"100%",maxWidth:"30rem",padding:e.spacing(1.5,2),color:"inherit",textDecoration:"inherit",lineHeight:1.25,borderWidth:"1px",borderStyle:"solid",borderColor:e.palette.divider,borderRadius:e.spacing(1),overflow:"hidden","&:hover, &:focus":{borderColor:e.palette.primary.main}})),ui=g("div")(({theme:e})=>({display:"flex",flexDirection:"row",alignItems:"center",width:"100%"})),nt=({projectId:e,featureId:s,environmentId:n,strategy:a,defaultStrategy:o,onClose:r})=>{const i=Os(a.name),l=_s(a.name),{trackEvent:c}=ie(),p=cn(e,s,n,a.name,o),u=()=>{c("strategy-add",{props:{buttonTitle:a.displayName||l}}),r()};return t.jsxs(di,{to:p,onClick:u,children:[t.jsxs(ui,{children:[t.jsx(ci,{children:t.jsx(i,{})}),t.jsx(li,{text:a.displayName||l,maxWidth:"200",maxLength:25})]}),t.jsx(Ge,{lines:1,title:a.description,arrow:!0,sx:{fontSize:d=>d.typography.caption.fontSize,width:"100%"},children:a.description})]})},pi=g("div")(({theme:e})=>({width:e.spacing(3),"& > svg":{width:e.spacing(2.25),height:e.spacing(2.25),fill:e.palette.primary.main}})),gi=g(Fs)(({theme:e})=>({fontWeight:e.typography.fontWeightBold,fontSize:e.typography.caption.fontSize,display:"block",marginBottom:e.spacing(.5)})),hi=g("div")(({theme:e})=>({width:"100%",transition:"opacity 0.2s ease-in-out"})),xi=g("div")(({theme:e})=>({position:"absolute",right:e.spacing(2),display:"flex",gap:e.spacing(1),opacity:0,transition:"opacity 0.1s ease-in-out"})),fi=g("div")(({theme:e})=>({display:"flex",flexDirection:"column",width:"100%",height:"100%",maxWidth:"30rem",padding:e.spacing(1.5,2),color:"inherit",textDecoration:"inherit",lineHeight:1.25,borderWidth:"1px",borderStyle:"solid",borderColor:e.palette.divider,borderRadius:e.spacing(1),textAlign:"left",overflow:"hidden",position:"relative","&:hover .cardContent, &:focus-within .cardContent":{opacity:.5},"&:hover .buttonContainer, &:focus-within .buttonContainer":{opacity:1}})),yi=g("div")(({theme:e})=>({display:"flex",flexDirection:"row",alignItems:"center",width:"100%"})),mi=({template:{name:e,description:s},onClick:n,onPreviewClick:a})=>{const o=Os("releasePlanTemplate"),r=l=>{l.stopPropagation(),n()},i=l=>{l.stopPropagation(),a(l)};return t.jsxs(fi,{children:[t.jsxs(hi,{className:"cardContent",children:[t.jsxs(yi,{children:[t.jsx(pi,{children:t.jsx(o,{})}),t.jsx(gi,{text:e,maxWidth:"200",maxLength:25})]}),t.jsx(Ge,{lines:1,title:s,arrow:!0,sx:{fontSize:l=>l.typography.caption.fontSize,fontWeight:l=>l.typography.fontWeightRegular,width:"100%"},children:s})]}),t.jsxs(xi,{className:"buttonContainer",children:[t.jsx(ne,{variant:"contained",size:"small",onClick:r,tabIndex:0,children:"Use"}),t.jsx(ne,{variant:"outlined",size:"small",onClick:i,children:"Preview"})]})]})},ji=g(L)(({theme:e})=>({fontSize:e.fontSizes.smallBody,padding:e.spacing(1,4),width:"100%"})),bi=g(Be)(({theme:e})=>({fontSize:e.fontSizes.smallBody,cursor:"pointer"})),vi=g(z)(()=>({width:"100%",display:"flex",flexDirection:"column"})),Si=g(z)(({theme:e})=>({width:"100%",maxHeight:"70vh",overflowY:"auto",padding:e.spacing(1,0,1,0)})),at=g(z)(({theme:e})=>({display:"grid",gridTemplateColumns:"repeat(2, 1fr)",gap:e.spacing(1.5),padding:e.spacing(0,4),marginBottom:e.spacing(3),width:"100%"})),Le=g(z)(()=>({width:"100%",minWidth:0})),Ci=g(z)(({theme:e})=>({display:"flex",justifyContent:"space-between",alignItems:"center",padding:e.spacing(4,4,2,4)})),Ti=g(L)(({theme:e})=>({fontSize:e.typography.body1.fontSize,fontWeight:e.typography.fontWeightBold,margin:0})),ot=g(z)(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(.5),padding:e.spacing(0,4,1,4),width:"100%"})),rt=g(la)(({theme:e})=>({fontSize:e.typography.body2.fontSize,color:e.palette.text.secondary})),wi=g("span")(({theme:e})=>({width:e.spacing(3),"& > svg":{fill:e.palette.primary.main,width:e.spacing(2.25),height:e.spacing(2.25)},display:"flex",alignItems:"center"})),ki=g(z)(({theme:e})=>({display:"flex",flexDirection:"column",alignItems:"flex-start",justifyContent:"flex-start",backgroundColor:e.palette.neutral.light,borderRadius:e.shape.borderRadiusMedium,padding:e.spacing(3),margin:e.spacing(0,4),width:"auto"})),Ri=g(L)(({theme:e})=>({fontSize:e.typography.caption.fontSize,fontWeight:e.typography.fontWeightBold,marginBottom:e.spacing(1),display:"flex",alignItems:"center"})),Di=g(L)(({theme:e})=>({fontSize:e.typography.caption.fontSize,color:e.palette.text.secondary})),Ai=g(Be)(({theme:e})=>({fontWeight:e.typography.fontWeightBold,cursor:"pointer","&:hover":{textDecoration:"underline"}})),Ei=({projectId:e,featureId:s,environmentId:n,onlyReleasePlans:a,onAddReleasePlan:o,onReviewReleasePlan:r,onClose:i})=>{const{strategies:l}=da(),{templates:c}=ua(),p=le(),u=!a,d=l.filter(h=>!h.deprecated&&!h.editable),m=l.filter(h=>!h.deprecated&&h.editable),j={name:"flexibleRollout",displayName:"Default strategy",description:"This is the default strategy defined for this environment in the project"};return t.jsxs(vi,{children:[t.jsxs(Ci,{children:[t.jsx(Ti,{variant:"h2",children:a?"Select template":"Select strategy"}),t.jsx(xe,{size:"small",onClick:i,edge:"end","aria-label":"close",children:t.jsx(wt,{fontSize:"small"})})]}),t.jsxs(Si,{children:[u?t.jsxs(t.Fragment,{children:[t.jsxs(ot,{children:[t.jsx(L,{color:"inherit",variant:"body2",children:"Pre-defined strategy types"}),t.jsx(ee,{title:"Select a starting setup, and customize the strategy to your need with targeting and variants",arrow:!0,children:t.jsx(rt,{})})]}),t.jsxs(at,{children:[t.jsx(Le,{children:t.jsx(nt,{projectId:e,featureId:s,environmentId:n,strategy:j,defaultStrategy:!0,onClose:i})},j.name),d.map(h=>t.jsx(Le,{children:t.jsx(nt,{projectId:e,featureId:s,environmentId:n,strategy:h,onClose:i})},h.name))]})]}):null,t.jsx(B,{condition:c.length>0,show:t.jsxs(t.Fragment,{children:[t.jsxs(ot,{children:[t.jsx(L,{color:"inherit",variant:"body2",children:"Apply a release template"}),t.jsx(ee,{title:"Use one of the pre-defined templates defined in your company for rolling out features to users",arrow:!0,children:t.jsx(rt,{})})]}),t.jsx(at,{children:c.map(h=>t.jsx(Le,{children:t.jsx(mi,{template:h,onClick:()=>o(h),onPreviewClick:()=>r(h)})},h.id))})]}),elseShow:t.jsxs(ki,{children:[t.jsxs(Ri,{children:[t.jsx(wi,{children:t.jsx(pa,{})}),"Create your own templates"]}),t.jsxs(Di,{children:["Standardize how you do rollouts and make it more efficient without having to set up the same stategies from time to time. You find it in the sidemenu under"," ",t.jsx(Ai,{onClick:()=>p("/release-templates"),children:"Configure > Release templates"})]})]})}),t.jsx(B,{condition:c.length===0&&a,show:t.jsx(t.Fragment,{children:t.jsxs(ji,{color:"textSecondary",sx:{padding:h=>h.spacing(1,2,0,2)},children:[t.jsx("p",{children:"No templates created."}),t.jsxs("p",{children:["Go to ",t.jsx(bi,{onClick:()=>p("/release-templates"),children:"Release templates"})," to get started"]})]})})}),u?t.jsx(t.Fragment,{children:t.jsx(B,{condition:m.length>0,show:t.jsxs(t.Fragment,{children:[t.jsxs(ot,{children:[t.jsx(L,{color:"inherit",variant:"body2",children:"Custom strategies"}),t.jsx(ee,{title:"Custom strategies you have defined in Unleash",arrow:!0,children:t.jsx(rt,{})})]}),t.jsx(at,{children:m.map(h=>t.jsx(Le,{children:t.jsx(nt,{projectId:e,featureId:s,environmentId:n,strategy:h,onClose:i})},h.name))})]})})}):null]})]})},Ii=g(Bs)(({theme:e})=>({"& .MuiDialog-paper":{borderRadius:e.shape.borderRadiusLarge,maxWidth:e.spacing(85)}})),$i=g(ga)(({theme:e})=>({padding:e.spacing(2,4,4)})),Pi=g(z)(({theme:e})=>({display:"flex",justifyContent:"space-between",marginBottom:e.spacing(2)})),Fi=g(z)(({theme:e})=>({display:"flex",alignItems:"center",cursor:"pointer"})),Oi=g(ha)(({theme:e})=>({marginRight:e.spacing(1),color:e.palette.primary.main,display:"flex",alignSelf:"center"})),_i=g(L)(({theme:e})=>({fontWeight:e.typography.fontWeightMedium,display:"flex",alignItems:"center",lineHeight:1})),Bi=({open:e,setOpen:s,onConfirm:n,template:a,projectId:o,featureName:r,environment:i,crProtected:l})=>{const{feature:c}=W(o,r),{releasePlans:p}=Je(o,r,i),u=p[0],d=c==null?void 0:c.environments.find(({name:v})=>v===i),m=d==null?void 0:d.enabled,j=xa(a.id,r,i),h=()=>s(!1);return t.jsxs(Ii,{open:e,onClose:h,fullWidth:!0,maxWidth:"md",children:[t.jsxs(fa,{children:[t.jsxs(Pi,{children:[t.jsxs(Fi,{onClick:h,children:[t.jsx(Oi,{}),t.jsx(_i,{variant:"body2",color:"primary",children:"Go back"})]}),t.jsx(xe,{size:"small",onClick:h,edge:"end","aria-label":"close",children:t.jsx(wt,{fontSize:"small"})})]}),u&&t.jsxs(Z,{severity:"error",sx:{mb:1},children:["This feature environment currently has"," ",t.jsx("strong",{children:u.name})," -"," ",t.jsx("strong",{children:u.milestones[0].name}),m?" running":" paused",". Adding a new release plan will replace the existing release plan."]}),t.jsx("div",{children:t.jsx(zs,{plan:j,readonly:!0})}),l&&t.jsxs(L,{sx:{mt:4},children:[t.jsx("strong",{children:"Adding"})," release template"," ",t.jsx("strong",{children:a==null?void 0:a.name})," to"," ",t.jsx("strong",{children:r})," in"," ",t.jsx("strong",{children:i}),"."]})]}),t.jsx($i,{children:t.jsx(ne,{variant:"contained",color:"primary",onClick:n,children:l?"Add suggestion to draft":"Use template"})})]})},zi=g("div")(({theme:e})=>({display:"flex",flexFlow:"row",justifyContent:"flex-end",gap:e.spacing(1)})),Li=g(K)(({theme:e})=>({minWidth:0,width:e.spacing(4.5),alignSelf:"stretch",paddingBlock:0})),os=({label:e,projectId:s,featureId:n,environmentId:a,variant:o,size:r,matchWidth:i,disableReason:l})=>{const[c,p]=x.useState(!1),[u,d]=x.useState(!1),m=le(),{trackEvent:j}=ie(),[h,v]=x.useState(),[y,f]=x.useState(!1),w=c?"FeatureStrategyMenuDialog":void 0,{setToastApiError:E,setToastData:O}=H(),{isChangeRequestConfigured:_}=te(s),{addChange:$}=pe(),{refetch:D}=ce(s),{refetch:I}=Je(s,n,a),{addReleasePlanToFeature:R}=ya(),{isOss:M}=Te(),G=kt("releasePlans"),Q=!M()&&G,C=G&&_(a),P=()=>{p(!1)},b=k=>{j("strategy-add",{props:{buttonTitle:e}}),m(N)},S=k=>{d(!1),p(!0)},F=k=>{d(!0),p(!0)},V=async k=>{try{C?(await $(s,a,{feature:n,action:"addReleasePlan",payload:{templateId:k.id}}),O({type:"success",text:"Added to draft"}),D()):(await R(n,k.id,s,a),O({type:"success",text:"Release plan added"}),I()),j("release-management",{props:{eventType:"add-plan",plan:k.name}})}catch(oe){E(q(oe))}finally{f(!1),v(void 0),P()}},N=cn(s,n,a,"flexibleRollout",!0);return t.jsxs(zi,{onClick:k=>k.stopPropagation(),children:[Q?t.jsx(K,{"data-testid":"ADD_TEMPLATE_BUTTON",permission:be,projectId:s,environmentId:a,onClick:F,"aria-labelledby":w,variant:"outlined",sx:{minWidth:i?"282px":"auto"},disabled:!!l,tooltipProps:{title:l||void 0},children:"Use template"}):null,t.jsx(K,{"data-testid":"ADD_STRATEGY_BUTTON",permission:be,projectId:s,environmentId:a,onClick:b,"aria-labelledby":w,variant:o,sx:{minWidth:i?"282px":"auto"},disabled:!!l,tooltipProps:{title:l||void 0},children:e}),t.jsx(Li,{permission:be,projectId:s,environmentId:a,onClick:S,variant:"outlined",hideLockIcon:!0,disabled:!!l,tooltipProps:{title:l||"More strategies"},children:t.jsx(vt,{})}),t.jsx(Bs,{open:c,onClose:P,maxWidth:"md",PaperProps:{sx:{borderRadius:"12px"}},children:t.jsx(Ei,{projectId:s,featureId:n,environmentId:a,onlyReleasePlans:u,onAddReleasePlan:k=>{v(k),V(k)},onReviewReleasePlan:k=>{v(k),f(!0),P()},onClose:P})}),h&&t.jsx(Bi,{open:y,setOpen:k=>{f(k),k||p(!0)},onConfirm:()=>{V(h)},template:h,projectId:s,featureName:n,environment:a,crProtected:C})]})},dn=(e,s)=>e===0?0:Math.round(s/e*100),Mi=g("div")(()=>({display:"flex",alignItems:"center",justifyContent:"center",position:"relative",margin:0})),Vi=g("div",{shouldForwardProp:e=>e!=="color"})(({theme:e,color:s})=>({position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",color:s,fontSize:e.fontSizes.smallerBody,margin:0})),Ni=({percentage:e,size:s="4rem",disabled:n=!1,children:a})=>{const o=Pe(),r={display:"block",borderRadius:"100%",transform:"rotate(-90deg)",height:s,width:s},i=100/(2*Math.PI),l=2*i,c=l*.2,p=n?o.palette.neutral.border:o.palette.primary.light;return t.jsxs(Mi,{children:[t.jsxs("svg",{viewBox:`0 0 ${l} ${l}`,style:r,"aria-hidden":!0,children:[t.jsx("circle",{r:i,cx:i,cy:i,fill:"none",stroke:o.palette.background.elevation2,strokeWidth:c}),t.jsx("circle",{r:i,cx:i,cy:i,fill:"none",stroke:p,strokeWidth:c,strokeDasharray:`${e} 100`})]}),t.jsx(Vi,{color:p,children:a})]})},qi=g("figure")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"flex-end",margin:0,padding:0})),Wi=g("figcaption")(({theme:e})=>({fontSize:e.typography.body2.fontSize,textAlign:"right",[e.breakpoints.down("xl")]:{display:"none"},display:"flex",flexDirection:"column",flexGrow:1,margin:0,padding:0,span:{textWrap:"nowrap"}})),Hi=g("div")(({theme:e})=>({marginRight:e.spacing(1),marginLeft:e.spacing(1.5),[e.breakpoints.down(500)]:{display:"none"}})),Ui=g(({className:e,...s})=>t.jsx(ee,{...s,classes:{popper:e}}))({[`& .${ma.tooltip}`]:{maxWidth:200}}),Gi=({environmentMetric:e,collapsed:s})=>{if(!e)return null;const n=e.yes+e.no,a=dn(n,e==null?void 0:e.yes),o=!e||e.yes===0&&e.no===0,r=o?t.jsxs(t.Fragment,{children:["No evaluation metrics",t.jsx("br",{}),"received in the last hour"]}):t.jsxs(t.Fragment,{children:[t.jsxs("span",{children:["The flag has been evaluated"," ",t.jsxs("b",{children:[t.jsx(Ne,{value:n})," times"]})]})," ",t.jsxs("span",{children:["and enabled"," ",t.jsxs("b",{children:[t.jsx(Ne,{value:e.yes})," times"]})," ","in the last hour"]})]});return t.jsxs(qi,{children:[s?null:t.jsx(Wi,{children:r}),t.jsx(Ui,{title:s?r:"",arrow:!0,children:t.jsx(Hi,{"data-loading":!0,children:t.jsx(Ni,{percentage:a,size:"3rem",children:o?null:`${a}%`})})})]})},Yi=g("div")(({theme:e})=>({order:-1,flex:0})),Ji=({environment:{name:e,type:s,strategies:n,enabled:a}})=>{const o=A("projectId"),r=A("featureId"),{refetchFeature:i}=W(o,r),{isChangeRequestConfigured:l}=te(o),{onToggle:c,modals:p}=Zo(o),u=(d,m)=>c(d,{projectId:o,featureId:r,environmentName:e,environmentType:s,hasStrategies:n.length>0,hasEnabledStrategies:n.some(j=>!j.disabled),isChangeRequestEnabled:l(e),onRollback:m,onSuccess:i});return t.jsxs(Yi,{onClick:d=>d.stopPropagation(),children:[t.jsx(er,{projectId:o,value:a,featureId:r,environmentName:e,onToggle:u}),p]})},Ki=(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},Qi=(e,s,n)=>{const[a,o]=x.useState([[]]),[r,i]=x.useState(0);x.useEffect(()=>{const m=Ki(e,s);o(m)},[JSON.stringify(e),s]);const l=()=>{r<a.length-1&&i(d=>d+1)},c=()=>{r>0&&i(d=>d-1)},p=()=>{i(a.length-1)},u=()=>{i(0)};return{page:a[r]||[],pages:a,nextPage:l,prevPage:c,lastPage:p,firstPage:u,setPageIndex:i,pageIndex:r}},Xi=e=>fetch(e).then(Oe("ChangeRequest")).then(s=>s.json()),un=(e,s)=>{const{data:n,error:a,mutate:o}=Ls([],Fe(`api/admin/projects/${e}/change-requests/pending/${s}`),Xi);return{changeRequests:n,loading:!a&&!n,refetch:o,error:a}},Zi=(e,s,n,a)=>{const{user:o}=ja(),{changeRequests:r}=un(e,s),i=[],l=r==null?void 0:r.filter(c=>c.environment===n);return l==null||l.forEach(c=>{const p=c==null?void 0:c.features.find(d=>d.name===s),u=p==null?void 0:p.changes.find(d=>d.action==="updateStrategy"||d.action==="deleteStrategy"?d.payload.id===a:!1);if(u){const d=c.state==="Scheduled",m=!d&&c.createdBy.id===(o==null?void 0:o.id);d&&i.push({changeRequestId:c.id,change:u,isScheduledChange:d}),m&&i.push({changeRequestId:c.id,change:u,isScheduledChange:d})}}),i},pn=({scheduledChangeRequestIds:e})=>{const s=Pe(),n=Ke(s.breakpoints.down("sm")),a=A("projectId");return n?null:t.jsx(z,{sx:{mr:1.5},children:t.jsx(Ue,{tooltip:t.jsx(t.Fragment,{children:e==null?void 0:e.map((o,r)=>t.jsxs(Et,{to:`/projects/${a}/change-requests/${o}`,children:["Change request #",o]},`${a}-${r}`))}),children:t.jsx(Ae,{color:"warning",children:"Changes Scheduled"})})})},ec=({changeAction:e,sx:s})=>{switch(e){case"updateStrategy":return t.jsx(Ae,{color:"warning",sx:s,children:"Modified in draft"});case"deleteStrategy":return t.jsx(Ae,{color:"error",sx:s,children:"Deleted in draft"});default:return null}},tc=e=>(s,n,a)=>(a.revalidateOnFocus=!1,a.revalidateIfStale=!1,a.revalidateOnReconnect=!1,e(s,n,a)),sc=ba(Ms,tc),nc=(e,s)=>{const{refetchFeature:n}=W(e,s),a=va(e,s),{data:o,error:r,mutate:i}=sc(["useFeatureImmutable",a],()=>Sa(a)),l=x.useCallback(async()=>{await i(),await n()},[i,n]);return{feature:(o==null?void 0:o.body)||Ca,refetchFeature:l,loading:!r&&!o,status:o==null?void 0:o.status,error:r}},ac=(e,s,n)=>{const{setToastData:a,setToastApiError:o}=H(),{addChange:r}=pe(),{refetch:i}=ce(e),[l,c]=x.useState({isOpen:!1}),p=x.useCallback((h,v,y)=>{c({featureName:s,environment:h,fromEnvironment:y,strategy:v,isOpen:!0})},[]),u=x.useCallback((h,v,y)=>{c({featureName:s,environment:h,fromEnvironment:y,strategies:v,isOpen:!0})},[]),d=x.useCallback(()=>{c({isOpen:!1})},[]),m=x.useCallback(async()=>{try{await r(e,l.environment,{feature:l.featureName,action:n,payload:l.strategy}),i(),c({isOpen:!1}),a({type:"success",text:"Changes added to draft"})}catch(h){o(q(h)),c({isOpen:!1})}},[r]),j=x.useCallback(async()=>{try{await Promise.all(l.strategies.map(h=>r(e,l.environment,{feature:l.featureName,action:n,payload:h}))),i(),c({isOpen:!1}),a({type:"success",text:"Changes added to draft"})}catch(h){o(q(h)),c({isOpen:!1})}},[r]);return{onChangeRequestAddStrategy:p,onChangeRequestAddStrategies:u,onChangeRequestAddStrategyClose:d,onChangeRequestAddStrategyConfirm:m,onChangeRequestAddStrategiesConfirm:j,changeRequestDialogDetails:l}},oc=({payload:e,fromEnvironment:s,environment:n})=>t.jsxs(L,{children:[t.jsxs("strong",{children:["Copy ",_s((e==null?void 0:e.name)||"")," strategy"," "]})," ","from ",s," to ",n]}),rc=({environmentId:e,environments:s,strategy:n})=>{const a=A("projectId"),o=A("featureId"),[r,i]=x.useState(null),l=!!r,{addStrategyToFeature:c}=_e(),{setToastData:p,setToastApiError:u}=H(),{refetchFeature:d}=W(a,o),{refetchFeature:m}=nc(a,o),j=()=>{i(null)},h=ws(a),{isChangeRequestConfigured:v}=te(a),{changeRequestDialogDetails:y,onChangeRequestAddStrategyClose:f,onChangeRequestAddStrategy:w,onChangeRequestAddStrategyConfirm:E}=ac(a,o,"addStrategy"),O=async D=>{const{id:I,...R}={...n,targetEnvironment:D};if(v(D)){await w(D,R,e);return}try{await c(a,o,D,n),d(),m(),p({text:`Strategy copied to ${D}`,type:"success"})}catch(M){u(q(M))}j()},_=[...s,e].some(D=>h(be,D)),$=`Copy to environment${_?"":` (Access denied, missing ${be} permission)`}`;return t.jsxs("div",{children:[t.jsx(tr,{isOpen:y.isOpen,onClose:f,environment:y==null?void 0:y.environment,onConfirm:E,messageComponent:t.jsx(oc,{fromEnvironment:y.fromEnvironment,payload:y.strategy})}),t.jsx(ee,{title:$,children:t.jsx("div",{children:t.jsx(xe,{size:"large",id:`copy-strategy-icon-menu-${n.id}`,"aria-label":$,"aria-controls":l?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":l?"true":void 0,onClick:D=>{i(D.currentTarget)},"data-testid":Ta,disabled:!_,children:t.jsx(wa,{})})})}),t.jsx(Qe,{id:"basic-menu",anchorEl:r,open:l,onClose:j,MenuListProps:{"aria-labelledby":`copy-strategy-icon-menu-${n.id}`},children:[...s,e].map(D=>{const I=h(be,D);return t.jsx(ee,{title:I?"":"You don't have access to add a strategy to this environment",children:t.jsx("div",{children:t.jsxs(ve,{onClick:()=>O(D),disabled:!I,children:[t.jsx(B,{condition:!I,show:t.jsx(De,{children:t.jsx(ka,{fontSize:"small"})})}),t.jsx(Se,{children:D===e?"Duplicate in current":`Copy to ${D}`})]})})},D)})})]})},ic=()=>t.jsx(Z,{severity:"error",children:"Removing the strategy will change which users receive access to the feature."}),cc=g("div")(({theme:e})=>({"> * + *":{marginTop:e.spacing(1)}})),lc=({changeRequests:e,projectId:s})=>e&&e.length>0?t.jsxs(Z,{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(ae,{to:`/projects/${s}/change-requests/${n}`,target:"_blank",rel:"noopener noreferrer",title:`Change request ${n}`,children:o})},n)})})]}):e===void 0?t.jsx(Z,{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,gn=({scheduledChangeRequestsForStrategy:e})=>t.jsxs(cc,{children:[t.jsx(ic,{}),t.jsx(lc,{projectId:e.projectId,changeRequests:e.changeRequests})]}),dc=({onRemove:e,onClose:s,isOpen:n,scheduledChangeRequestsForStrategy:a})=>t.jsx(ue,{title:"Are you sure you want to delete this strategy?",open:n,primaryButtonText:"Remove strategy",secondaryButtonText:"Cancel",onClick:e,onClose:s,children:t.jsx(gn,{scheduledChangeRequestsForStrategy:a})}),uc=g("div")(({theme:e})=>({marginTop:e.spacing(3),marginBottom:e.spacing(1)})),pc=({onRemove:e,onClose:s,isOpen:n,scheduledChangeRequestsForStrategy:a})=>t.jsxs(ue,{title:"Suggest changes",open:n,primaryButtonText:"Add suggestion to draft",secondaryButtonText:"Cancel",onClick:e,onClose:s,children:[t.jsx(gn,{scheduledChangeRequestsForStrategy:a}),t.jsx(uc,{children:t.jsx(L,{variant:"body2",color:"text.secondary",children:"Your suggestion:"})}),t.jsx(L,{fontWeight:"bold",children:"Remove strategy"})]}),gc=({projectId:e,featureId:s,environmentId:n,strategyId:a})=>{const{deleteStrategyFromFeature:o}=_e(),{setToastData:r,setToastApiError:i}=H(),l=le(),{refetchFeature:c}=W(e,s);return async u=>{try{u.preventDefault(),await o(e,s,n,a),r({text:"Strategy deleted",type:"success"}),c(),l(Tt(e,s))}catch(d){i(q(d))}}},hc=({projectId:e,featureId:s,environmentId:n,strategyId:a})=>{const{addChange:o}=pe(),{refetch:r}=ce(e),{setToastData:i,setToastApiError:l}=H();return async p=>{try{p.preventDefault(),await o(e,n,{action:"deleteStrategy",feature:s,payload:{id:a}}),i({text:"Changes added to draft",type:"success"}),await r()}catch(u){l(q(u))}}},xc=({projectId:e,featureId:s,environmentId:n,strategyId:a,isOpen:o,onClose:r})=>{const{isChangeRequestConfigured:i}=te(e),{changeRequests:l}=Vs(e,a),c={changeRequests:l,projectId:e},p=gc({featureId:s,projectId:e,strategyId:a,environmentId:n}),u=hc({featureId:s,projectId:e,strategyId:a,environmentId:n});return i(n)?t.jsx(pc,{isOpen:o,onClose:()=>r(),onRemove:async d=>{await u(d),r()},scheduledChangeRequestsForStrategy:c}):t.jsx(dc,{isOpen:o,onClose:()=>r(),onRemove:p,scheduledChangeRequestsForStrategy:c})},fc=({projectId:e,environmentId:s,featureId:n,strategy:a})=>{const{refetchFeature:o}=W(e,n),{setStrategyDisabledState:r}=_e(),{setToastData:i,setToastApiError:l}=H(),c=p=>async()=>{try{await r(e,n,s,a.id,!p),i({text:`Strategy ${p?"enabled":"disabled"}`,type:"success"}),o()}catch(u){l(q(u))}};return{onDisable:c(!1),onEnable:c(!0)}},yc=({projectId:e,environmentId:s,featureId:n,strategy:a})=>{const{addChange:o}=pe(),{refetch:r}=ce(e),{setToastData:i,setToastApiError:l}=H(),c=p=>async()=>{try{await o(e,s,{action:"updateStrategy",feature:n,payload:{...a,disabled:!p}}),i({text:"Changes added to draft",type:"success"}),await r()}catch(u){l(q(u))}};return{onSuggestDisable:c(!1),onSuggestEnable:c(!0)}},mc=({isOpen:e,onClose:s,...n})=>{var j;const{projectId:a,environmentId:o}=n,{isChangeRequestConfigured:r}=te(a),i=r(o),{onSuggestEnable:l,onSuggestDisable:c}=yc({...n}),{onEnable:p,onDisable:u}=fc({...n}),d=!!((j=n.strategy)!=null&&j.disabled),m=h=>{h.preventDefault(),i?d?l():c():d?p():u(),s()};return t.jsx(ue,{title:i?`Add ${d?"enable":"disable"} strategy to change request?`:`Are you sure you want to ${d?"enable":"disable"} this strategy?`,open:e,primaryButtonText:i?"Add to draft":`${d?"Enable":"Disable"} strategy`,secondaryButtonText:"Cancel",onClick:m,onClose:()=>s(),children:t.jsx(B,{condition:i,show:t.jsx(Ra,{environment:o}),elseShow:t.jsxs(Z,{severity:"error",children:[d?"Enabling":"Disabling"," the strategy will change which users receive access to the feature."]})})})},jc=({projectId:e,strategy:s,featureId:n,environmentId:a})=>{const[o,r]=x.useState(null),[i,l]=x.useState(!1),[c,p]=x.useState(!1),u=!!o,d=v=>{r(v.currentTarget)},m=v=>{r(null),v.stopPropagation()},j=gt(Ns,e,a),h=gt(Da,e,a);return t.jsxs(t.Fragment,{children:[t.jsx(z,{sx:{display:"flex",alignItems:"center",textAlign:"center"},children:t.jsx(ee,{title:"More actions",children:t.jsx(xe,{onClick:d,size:"small","aria-controls":u?"actions-menu":void 0,"aria-haspopup":"true","aria-expanded":u?"true":void 0,"data-testid":Aa,children:t.jsx(vt,{sx:{width:32,height:32}})})})}),t.jsxs(Qe,{anchorEl:o,id:"actions-menu",open:u,onClose:m,onClick:m,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},"data-testid":Ea,children:[t.jsx(ee,{title:s.disabled?"Enable strategy":"Disable strategy",arrow:!0,placement:"left",children:t.jsxs(ve,{disabled:!j,onClick:()=>l(!0),children:[t.jsx(De,{children:s.disabled?t.jsx(Ia,{}):t.jsx($a,{})}),t.jsx(Se,{children:s.disabled?"Enable":"Disable"})]})}),t.jsx(ee,{title:"Remove strategy",arrow:!0,placement:"left",children:t.jsxs(ve,{disabled:!h,onClick:()=>p(!0),"data-testid":Pa,children:[t.jsx(De,{children:t.jsx(Ts,{})}),t.jsx(Se,{children:"Remove"})]})})]}),t.jsx(mc,{isOpen:i,onClose:()=>l(!1),projectId:e,featureId:n,environmentId:a,strategy:s}),t.jsx(xc,{isOpen:c,onClose:()=>p(!1),projectId:e,featureId:n,environmentId:a,strategyId:s.id})]})},rs=({strategy:e,index:s,environmentName:n,otherEnvironments:a,isDragging:o,onDragStartRef:r,onDragOver:i,onDragEnd:l})=>{const c=A("projectId"),p=A("featureId");x.useRef(null);const u=Zi(c,p,n,e.id),{changeRequests:d}=Vs(c,e.id),m=Fa(c,p,n,e.id),j=u==null?void 0:u.find(({isScheduledChange:y})=>!y),h=Pe(),v=Ke(h.breakpoints.down("sm"));return t.jsx(Oa,{strategy:e,onDragEnd:l,onDragStartRef:r,onDragOver:i,index:s,isDragging:o,headerItemsRight:t.jsxs(t.Fragment,{children:[j&&!v?t.jsx(ec,{sx:{mr:1.5},changeAction:j.change.action}):null,d&&d.length>0&&!v?t.jsx(pn,{scheduledChangeRequestIds:(d??[]).map(y=>y.id)}):null,a&&(a==null?void 0:a.length)>0?t.jsx(rc,{environmentId:n,environments:a,strategy:e}):null,t.jsx(Re,{permission:Ns,environmentId:n,projectId:c,component:ae,to:m,tooltipProps:{title:"Edit strategy"},"data-testid":`STRATEGY_EDIT-${e.name}`,children:t.jsx(He,{})}),t.jsx(jc,{projectId:c,featureId:p,environmentId:n,strategy:e})]})})},bc=g("div")(({theme:e})=>({borderBottom:`1px solid ${e.palette.divider}`})),vc=g("div")(({theme:e})=>({padding:e.spacing(2),paddingBottom:e.spacing(0),backgroundColor:_a(e),':has(+ ol>li[data-type="release-plan"])':{backgroundColor:Ba(e)}})),Sc=({featureEnvironment:e,isDisabled:s,otherEnvironments:n})=>{const a=A("projectId"),o=A("featureId"),{setStrategiesSortOrder:r}=_e(),{addChange:i}=pe(),{isChangeRequestConfigured:l}=te(a),{refetch:c}=ce(a),{setToastData:p,setToastApiError:u}=H(),{refetchFeature:d}=W(a,o),m=kt("manyStrategiesPagination"),[j,h]=x.useState((e==null?void 0:e.strategies)||[]),{releasePlans:v}=Je(a,o,e==null?void 0:e.name),{trackEvent:y}=ie(),[f,w]=x.useState(null);x.useEffect(()=>{h((e==null?void 0:e.strategies)||[])},[e==null?void 0:e.strategies]),x.useEffect(()=>{j.length>50&&y("many-strategies")},[]);const E=20,{page:O,pages:_,setPageIndex:$,pageIndex:D}=Qi(j,E);if(!e)return null;const I=async b=>{try{await r(a,o,e.name,b),d(),p({text:"Order of strategies updated",type:"success"})}catch(S){u(q(S))}},R=async b=>{await i(a,e.name,{action:"reorderStrategy",feature:o,payload:b}),p({text:"Strategy execution order added to draft",type:"success"}),c()},M=async b=>{try{l(e.name)?await R(b):await I(b)}catch(S){u(q(S))}},G=(b,S)=>F=>{var V;w({id:j[S].id,index:S,height:((V=b.current)==null?void 0:V.offsetHeight)||0}),b!=null&&b.current&&(F.dataTransfer.effectAllowed="move",F.dataTransfer.setData("text/html",b.current.outerHTML),F.dataTransfer.setDragImage(b.current,20,20))},Q=b=>(S,F)=>V=>{if(f===null||S.current===null||f.index===F||b===f.id)return;const{top:N,bottom:k}=S.current.getBoundingClientRect(),oe=V.clientY-N<f.height,ge=k-V.clientY<f.height,fe=f.index>F;if(oe&&fe||ge&&!fe){const T=[...j],U=T.splice(f.index,1)[0];T.splice(F,0,U),h(T),w({...f,index:F})}},C=()=>{w(null),M(j.map((b,S)=>({id:b.id,sortOrder:S})))},P=j.length>=50&&m;return t.jsxs(bc,{children:[P?t.jsx(vc,{children:t.jsx(Z,{severity:"warning",children:"We noticed you're using a high number of activation strategies. To ensure a more targeted approach, consider leveraging constraints or segments."})}):null,t.jsxs(za,{children:[v.map(b=>t.jsx(Xe,{"data-type":"release-plan",children:t.jsx(zs,{plan:b,environmentIsDisabled:s})},b.id)),P?t.jsx(t.Fragment,{children:O.map((b,S)=>t.jsxs(Xe,{children:[S>0||v.length>0?t.jsx(Mt,{}):null,t.jsx(rs,{strategy:b,index:S+D*E,environmentName:e.name,otherEnvironments:n})]},b.id))}):t.jsx(t.Fragment,{children:j.map((b,S)=>t.jsxs(Xe,{children:[S>0||v.length>0?t.jsx(Mt,{}):null,t.jsx(rs,{strategy:b,index:S,environmentName:e.name,otherEnvironments:n,isDragging:(f==null?void 0:f.id)===b.id,onDragStartRef:G,onDragOver:Q(b.id),onDragEnd:C})]},b.id))})]}),P?t.jsx(br,{count:_.length,shape:"rounded",page:D+1,onChange:(b,S)=>$(S-1)}):null]})},Cc=g(Be)(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1),color:e.palette.links,fontWeight:e.typography.fontWeightMedium,textDecoration:"none",marginRight:"auto"})),Tc=()=>t.jsx(Cc,{component:"a",href:La,underline:"hover",rel:"noopener noreferrer",target:"_blank",children:"Give feedback to release templates"}),wc=g("div")(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,backgroundColor:e.palette.background.paper,border:`1px solid ${e.palette.divider}`})),kc=g(Ma)(({theme:e})=>({boxShadow:"none",background:"none",[`&:has(.${sr}:focus-visible)`]:{background:e.palette.table.headerHover}})),Rc=g(Va)(({theme:e})=>({padding:0,background:e.palette.background.elevation1,borderBottomLeftRadius:e.shape.borderRadiusLarge,borderBottomRightRadius:e.shape.borderRadiusLarge,boxShadow:e.boxShadows.accordionFooter})),Dc=g("footer")(({theme:e})=>({padding:e.spacing(2,3,3),display:"flex",flexDirection:"column",gap:e.spacing(2)})),Ac=g("div")(({theme:e})=>({width:"100%",position:"relative"})),Ec=({environment:e,metrics:s={yes:0,no:0},otherEnvironments:n=[],onToggleEnvOpen:a=()=>{}})=>{var u,d;const[o,r]=x.useState(!1),i=A("projectId"),l=A("featureId"),{isOss:c}=Te(),p=!!(e!=null&&e.enabled||e!=null&&e.strategies&&(e==null?void 0:e.strategies.length)>0||e!=null&&e.releasePlans&&(e==null?void 0:e.releasePlans.length)>0);return t.jsx(wc,{children:t.jsxs(kc,{TransitionProps:{mountOnEnter:!0,unmountOnExit:!0},"data-testid":`${Na}_${e.name}`,expanded:o&&p,onChange:()=>{const m=o?!o:p;a(m),r(m)},children:[t.jsxs(nr,{environmentMetadata:{strategyCount:((u=e.strategies)==null?void 0:u.length)??0,releasePlanCount:((d=e.releasePlans)==null?void 0:d.length)??0},environmentId:e.name,expandable:p,children:[t.jsx(Ji,{environment:e}),p?t.jsx(Gi,{environmentMetric:s}):t.jsx(os,{label:"Add strategy",projectId:i,featureId:l,environmentId:e.name,variant:"outlined",size:"small"})]}),t.jsxs(Rc,{children:[t.jsx(Ac,{children:t.jsx(Sc,{featureEnvironment:e,isDisabled:!e.enabled,otherEnvironments:n})}),t.jsxs(Dc,{children:[t.jsxs(z,{sx:{display:"flex",flexDirection:"row"},children:[t.jsx(Tc,{}),t.jsx(z,{ml:"auto",children:t.jsx(os,{label:"Add strategy",projectId:i,featureId:l,environmentId:e.name})})]}),c()&&(e==null?void 0:e.type)==="production"?t.jsx(qa,{}):null]})]})]})})},is={lastHourUsage:[],seenApplications:[]},Ic=(e,s,n={})=>{const a=async()=>{const u=Fe(`api/admin/client-metrics/features/${s}`),d=await fetch(u,{method:"GET"}).then(Oe("feature metrics"));return d.ok?d.json():is},o=`${e}_${s}_metrics`,{data:r,error:i}=Ms(o,a,{...n}),[l,c]=x.useState(!i&&!r),p=()=>{Rs(o)};return x.useEffect(()=>{c(!i&&!r)},[r,i]),{metrics:r||is,error:i,loading:l,refetch:p,FEATURE_METRICS_CACHE_KEY:o}},$c=e=>({yes:0,no:0,environment:e,timestamp:""}),Pc=(e,s)=>e.map(n=>s.lastHourUsage.find(o=>o.environment===n.name)||$c(n.name)),Fc=({environment:e,...s})=>{const n=A("projectId"),a=A("featureId"),{releasePlans:o}=Je(n,a,e==null?void 0:e.name);return t.jsx(Ec,{...s,environment:{...e,releasePlans:o}})},Oc=({hiddenEnvironments:e=[],onToggleEnvOpen:s})=>{var l;const n=A("projectId"),a=A("featureId"),{feature:o}=W(n,a),{metrics:r}=Ic(n,a),i=Pc(o==null?void 0:o.environments,r);return o?(l=o.environments)==null?void 0:l.filter(c=>!e.includes(c.name)).map(c=>{var p;return t.jsx(Fc,{onToggleEnvOpen:s,environment:c,metrics:i.find(u=>u.environment===(c==null?void 0:c.name)),otherEnvironments:((p=o.environments)==null?void 0:p.map(u=>u.name).filter(u=>u!==c.name&&!e.includes(u)))||[]},c.name)}):null},_c=()=>{const[e,s]=qs("environment-visibiilty",[]),{trackEvent:n}=ie();return{hiddenEnvironments:e,onEnvironmentVisibilityChange:o=>{e.includes(o)?(s(e.filter(r=>r!==o)),n("hidden_environment",{props:{eventType:"environment unhidden"}})):(s([...e,o]),n("hidden_environment",{props:{eventType:"environment hidden"}}))}}},Bc=g(z)(({theme:e})=>({display:"flex",flexDirection:"column",gap:e.spacing(1),maxWidth:"300px",background:"#201e42",borderRadius:e.shape.borderRadiusMedium,color:e.palette.common.white,padding:e.spacing(2),paddingRight:e.spacing(1),fontSize:e.typography.body2.fontSize})),zc=g(ne)(({theme:e})=>({color:e.palette.secondary.border,alignSelf:"start",marginLeft:e.spacing(-1)})),Lc=g(xe)(({theme:e})=>({color:e.palette.common.white,background:"none",border:"none",position:"absolute",top:e.spacing(1),right:e.spacing(1),svg:{width:e.spacing(2),height:e.spacing(2)}})),Mc=g("p")(({theme:e})=>({fontSize:e.typography.body1.fontSize,fontWeight:"bold"})),Vc=({closeProps:e})=>t.jsxs(Bc,{component:"article",children:[t.jsx(Lc,{type:"button",...e,children:t.jsx(wt,{})}),t.jsx(Mc,{children:"Decide the order evaluation"}),t.jsx("p",{children:"Strategies are evaluated in the order presented here. Drag and rearrange the strategies to get the order you prefer."}),t.jsx(zc,{type:"button","data-action":e["data-action"],onClick:e.onClick,children:"Ok, got it!"})]}),Nc=({show:e,onClose:s})=>t.jsx(Wa,{callback:({action:n})=>{n==="close"&&s()},floaterProps:{styles:{arrow:{color:"#201e42",spread:16,length:10}}},run:e,disableOverlay:!0,disableScrolling:!0,tooltipComponent:Vc,steps:[{disableBeacon:!0,offset:0,target:".strategy-drag-handle",content:t.jsx(t.Fragment,{})}]});var It={},qc=Ie;Object.defineProperty(It,"__esModule",{value:!0});var mt=It.default=void 0,Wc=qc(Ee()),Hc=t,Uc=(0,Wc.default)((0,Hc.jsx)("path",{d:"M16 11h-1V3c0-1.1-.9-2-2-2h-2c-1.1 0-2 .9-2 2v8H8c-2.76 0-5 2.24-5 5v7h18v-7c0-2.76-2.24-5-5-5zm3 10h-2v-3c0-.55-.45-1-1-1s-1 .45-1 1v3h-2v-3c0-.55-.45-1-1-1s-1 .45-1 1v3H9v-3c0-.55-.45-1-1-1s-1 .45-1 1v3H5v-5c0-1.65 1.35-3 3-3h8c1.65 0 3 1.35 3 3v5z"}),"CleaningServices");mt=It.default=Uc;const Gc="flag-reminders:v1",Yc=50,Jc=7,Kc=({days:e=Jc,maxReminders:s=Yc}={})=>{const[n,a]=qs(Gc,{});return{shouldShowReminder:i=>{const l=n[i];return!l||Ha(new Date,new Date(l))},snoozeReminder:(i,l=e)=>{const c=Ua(new Date,l).getTime();a(p=>{const u={...p,[i]:c},d=Object.entries(u);if(d.length>s){d.sort((j,h)=>j[1]-h[1]);const m=d.slice(d.length-s);return Object.fromEntries(m)}return u})}}},Qc=g(z)(({theme:e})=>({marginBottom:e.spacing(2)})),cs=g(z)(({theme:e})=>({display:"flex",gap:e.spacing(1),alignItems:"center"})),Xc=30,Zc=3,el=({feature:e,onChange:s})=>{const n=le(),{trackEvent:a}=ie(),[o,r]=x.useState(!1),[i,l]=x.useState(!1),{onUncompleteHandler:c,loading:p}=Ga({feature:e.name,project:e.project,onChange:s}),u=Ya(e),d=e.type==="release"||e.type==="experiment",m=u==null?void 0:u.enteredStageAt,j=m?Ja(new Date,St(m)):0,{shouldShowReminder:h,snoozeReminder:v}=Kc(),f=(()=>{if(!u||!d)return null;if(u.name==="live"&&j>Xc)return"complete";if(u.name==="completed"&&h(e.name)){if(Qa(u.environments))return"archive";if(j>Zc)return"removeCode"}return null})();return f?t.jsxs(Qc,{children:[f==="complete"&&t.jsxs(t.Fragment,{children:[t.jsxs(Z,{severity:"info",icon:t.jsx(Ka,{}),action:t.jsx(K,{variant:"contained",permission:Ce,size:"medium",onClick:()=>r(!0),projectId:e.project,children:"Mark completed"}),children:[t.jsx("b",{children:"Is this flag ready to be completed?"}),t.jsxs("p",{children:["This flag has been in production for"," ",t.jsxs("b",{children:[j," days"]}),". Can it be removed from the code?"]})]}),t.jsx(Ks,{isOpen:o,setIsOpen:r,projectId:e.project,featureId:e.name,onComplete:s})]}),f==="archive"&&t.jsxs(t.Fragment,{children:[t.jsxs(Z,{severity:"warning",icon:t.jsx(mt,{}),action:t.jsxs(cs,{children:[t.jsx(ne,{size:"medium",onClick:()=>{v(e.name),a("feature-lifecycle",{props:{eventType:"snoozeReminder"}})},children:"Remind me later"}),t.jsx(K,{variant:"contained",permission:Ws,size:"medium",onClick:()=>l(!0),projectId:e.project,children:"Archive flag"})]}),children:[t.jsx("b",{children:"Time to clean up technical debt?"}),t.jsx("p",{children:"We haven't observed any metrics for this flag lately. Can it be archived?"})]}),e.children.length>0?t.jsx(At,{features:e.children,project:e.project,isOpen:i,onClose:()=>l(!1)}):t.jsx(Dt,{isOpen:i,onConfirm:()=>{n(`/projects/${e.project}`)},onClose:()=>l(!1),projectId:e.project,featureIds:[e.name]})]}),f==="removeCode"&&t.jsxs(Z,{severity:"warning",icon:t.jsx(mt,{}),action:t.jsxs(cs,{children:[t.jsx(ne,{size:"medium",onClick:()=>{v(e.name),a("feature-lifecycle",{props:{eventType:"snoozeReminder"}})},children:"Remind me later"}),t.jsx(K,{variant:"outlined",permission:Ce,size:"medium",onClick:c,disabled:p,projectId:e.project,children:"Revert to production"})]}),children:[t.jsx("b",{children:"Time to remove flag from code?"}),t.jsx("p",{children:"This flag was marked as complete and ready for cleanup. We're still seeing it being used within the last 2 days. Have you removed the flag from your code?"})]})]}):null},tl=g("div")(({theme:e})=>({display:"flex",width:"100%",gap:e.spacing(2),[e.breakpoints.down("md")]:{flexDirection:"column"}})),sl=g("div")(({theme:e})=>({display:"flex",flexDirection:"column",flexGrow:1,gap:e.spacing(2)})),nl=()=>{const e=le(),s=A("projectId"),n=A("featureId"),a=Tt(s,n),{hiddenEnvironments:o,onEnvironmentVisibilityChange:r}=_c(),i=()=>e(a);Hs(n);const{setLastViewed:l}=ii();x.useEffect(()=>{l({featureId:n,projectId:s})},[n]);const{setSplashSeen:c}=Xa(),{splash:p}=Za(),[u,d]=x.useState(!1),[m,j]=x.useState(!1),{feature:h,refetchFeature:v,loading:y}=W(s,n),f="strategy-drag-tooltip",w=!(p!=null&&p[f]),E=_=>{d(!m&&w&&_)},O=()=>{j(!0),c(f)};return t.jsxs("div",{children:[t.jsx(el,{feature:h,onChange:v}),t.jsxs(tl,{children:[t.jsx("div",{children:y?null:t.jsx(ni,{hiddenEnvironments:o,onEnvironmentVisibilityChange:r,feature:h,onChange:v})}),t.jsx(sl,{children:t.jsx(Oc,{onToggleEnvOpen:E,hiddenEnvironments:o})}),t.jsxs(Us,{children:[t.jsx(je,{path:"strategies/create",element:t.jsx(ht,{label:"Create feature strategy",onClose:i,open:!0,children:t.jsx(oi,{})})}),t.jsx(je,{path:"strategies/edit",element:t.jsx(ht,{label:"Edit feature strategy",onClose:i,open:!0,children:t.jsx(eo,{})})})]})]}),t.jsx(Nc,{show:u,onClose:O})]})},al=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})),ol=g(Gs,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.neutral.border:e.palette.primary.main})),rl=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})),il=g("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),cl=g(Z)(({theme:e})=>({marginBottom:e.spacing(2)})),ll=g(Z)(({theme:e})=>({marginTop:e.spacing(4)})),dl=g("div")({display:"flex",flexDirection:"column"}),ul=g("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),ls=g("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),pl=g(Ys)(({theme:e})=>({margin:e.spacing(4,0)})),gl=g(to)(({theme:e})=>({minWidth:e.spacing(20),width:"100%"})),hl=g("div")(({theme:e})=>({marginTop:"auto",paddingTop:e.spacing(4),display:"flex",justifyContent:"flex-end"})),xl=g(ne)(({theme:e})=>({marginLeft:e.spacing(3)})),fl=x.memo(so),yl=({environment:e,open:s,setOpen:n,getApiPayload:a,getCrPayload:o,onConfirm:r})=>{const i=A("projectId"),l=A("featureId"),{uiConfig:c}=Te(),{context:p}=no(),{defaultStickiness:u,loading:d}=ao(i),{isChangeRequestConfigured:m}=te(i),{data:j}=ce(i),{changeRequestInReviewOrApproved:h,alert:v}=ro(j),y=(e==null?void 0:e.variants)||[],[f,w]=x.useState([]),[E,O]=x.useState();x.useEffect(()=>{d||w(y.length?y.map(T=>({...T,isValid:!0,new:!1,id:Ze()})):[{name:"",weightType:Vt.VARIABLE,weight:0,overrides:[],stickiness:(f==null?void 0:f.length)>0?f[0].stickiness:u,new:!0,isValid:!1,id:Ze()}])},[s,d]);const _=(T,U)=>{w(ye=>Nt(ye.map(Y=>Y.id===U?T:Y),1e3))},$=()=>{const T=Ze();w(U=>[...U,{name:"",weightType:Vt.VARIABLE,weight:0,overrides:[],stickiness:(U==null?void 0:U.length)>0?U[0].stickiness:u,new:!0,isValid:!1,id:T}]),O(T)};x.useEffect(()=>{if(E){const T=document.getElementById(`variant-name-input-${E}`);T==null||T.scrollIntoView({behavior:"smooth",block:"center"}),T==null||T.focus({preventScroll:!0}),O(void 0)}},[E]);const D=f.map(({new:T,isValid:U,id:ye,...Y})=>Y),I=a(y,D),R=o(D),M=async T=>{T.preventDefault(),r(D)},G=()=>b?`curl --location --request POST '${c.unleashUrl}/api/admin/projects/${i}/environments/${e==null?void 0:e.name}/change-requests' \\
|
|
5
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
6
|
+
--header 'Content-Type: application/json' \\
|
|
7
|
+
--data-raw '${JSON.stringify(R,void 0,2)}'`:`curl --location --request PATCH '${c.unleashUrl}/api/admin/projects/${i}/features/${l}/environments/${e==null?void 0:e.name}/variants' \\
|
|
8
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
9
|
+
--header 'Content-Type: application/json' \\
|
|
10
|
+
--data-raw '${JSON.stringify(I.patch,void 0,2)}'`,Q=f.every(({isValid:T})=>T),C=h((e==null?void 0:e.name)||""),P=C?"Add to existing change request":"Add change to draft",b=m((e==null?void 0:e.name)||""),S=x.useMemo(()=>{var T;return d?"":((T=D[0])==null?void 0:T.stickiness)||u},[d,u,JSON.stringify(D[0]??{})]),F=x.useMemo(()=>["default",...p.filter(T=>T.stickiness).map(T=>T.name)],[p]),V=F.map(T=>({key:T,label:T}));F.includes(S)||V.push({key:S,label:S});const N=async T=>{w(U=>U.map(ye=>({...ye,stickiness:T})))},k=T=>{N(T)},[oe,ge]=x.useState();x.useEffect(()=>{ge(void 0),I.error&&ge(I.error)},[I.error]);const fe=()=>{N(u),n(!1)};return d||S===""?t.jsx(oo,{}):t.jsx(ht,{open:s,onClose:fe,label:"",children:t.jsxs(Ps,{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:G,loading:!s,children:[t.jsxs(al,{children:[t.jsxs("div",{children:[t.jsx(ol,{deprecated:!(e!=null&&e.enabled)}),t.jsx(rl,{deprecated:!(e!=null&&e.enabled),children:e==null?void 0:e.name})]}),t.jsx(K,{"data-testid":"MODAL_ADD_VARIANT_BUTTON",onClick:$,variant:"outlined",permission:ke,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"})]}),t.jsxs(il,{onSubmit:M,children:[t.jsx(B,{condition:C,show:v,elseShow:t.jsx(B,{condition:!!b,show:t.jsxs(cl,{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(dl,{children:f.map(T=>t.jsx(fl,{variant:T,variants:f,updateVariant:U=>_(U,T.id),removeVariant:()=>w(U=>Nt(U.filter(ye=>ye.id!==T.id),1e3)),error:I.error},T.id))}),t.jsx(K,{onClick:$,variant:"outlined",permission:ke,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"}),t.jsx(pl,{}),t.jsx(B,{condition:f.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(ul,{children:t.jsx("p",{children:"Stickiness"})}),t.jsxs(ls,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t.jsx(Be,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]}),t.jsx("div",{children:t.jsx(gl,{value:S,label:"",editable:!0,onChange:T=>k(T.target.value)})})]}),elseShow:t.jsx(ls,{children:"This environment has no variants. Get started by adding a variant."})}),t.jsxs(ll,{severity:"error",hidden:!oe,children:[t.jsx("strong",{children:"Error: "}),oe]}),t.jsxs(hl,{children:[t.jsx(ne,{"data-testid":"DIALOGUE_CONFIRM_ID",type:"submit",variant:"contained",color:"primary",disabled:!Q,children:b?P:"Save variants"}),t.jsx(xl,{onClick:fe,children:"Cancel"})]})]})]})})},ml=e=>fetch(e).then(Oe("ChangeRequest")).then(s=>s.json()),jl=(e,s)=>{const{data:n,error:a,mutate:o}=Ls([],Fe(`api/admin/projects/${e}/change-requests/scheduled?variantForFlag=${s}`),ml);return{changeRequests:n,loading:!a&&!n,refetch:o,error:a}},bl=(e,s,n)=>{const{changeRequests:a}=jl(e,s),o=a==null?void 0:a.filter(r=>r.environment===n);return o?o.map(r=>r.id):[]},vl=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)}})),Sl=g("div")({display:"flex",alignItems:"center",justifyContent:"space-between","& > div":{display:"flex",alignItems:"center"}}),Cl=g(Gs,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.neutral.border:e.palette.primary.main})),Tl=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})),wl=g("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),kl=g("div")(({theme:e})=>({margin:e.spacing(3,0)})),Rl=g("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Dl=({environment:e,searchValue:s,children:n})=>{var c;const a=A("projectId"),o=A("featureId"),r=bl(a,o,e.name),i=e.variants??[],l=((c=i[0])==null?void 0:c.stickiness)||"default";return t.jsxs(vl,{children:[t.jsxs(Sl,{children:[t.jsxs("div",{children:[t.jsx(Cl,{deprecated:!e.enabled}),t.jsx(Tl,{deprecated:!e.enabled,children:e.name}),t.jsx(B,{condition:r.length>0,show:t.jsx(io,{sx:{ml:2},children:t.jsx(pn,{scheduledChangeRequestIds:r})})})]}),n]}),t.jsx(B,{condition:i.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(kl,{children:t.jsx(co,{variants:i,searchValue:s})}),t.jsx(B,{condition:i.length>1,show:t.jsxs(t.Fragment,{children:[t.jsxs(Rl,{children:[t.jsx("p",{children:"Stickiness:"}),t.jsx(Ae,{children:l})]}),t.jsxs(wl,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t.jsx(Be,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]})]})})]})})]})},Al=g(Se)(({theme:e})=>({"& span":{fontSize:e.fontSizes.smallBody}})),El=({environment:e,permission:s,projectId:n,environmentId:a,onCopyVariantsFrom:o,otherEnvsWithVariants:r})=>{const[i,l]=x.useState(null),c=!!i,p=e.variants??[];return t.jsx(B,{condition:r.length>0&&p.length===0,show:t.jsxs(t.Fragment,{children:[t.jsx(K,{onClick:u=>{l(u.currentTarget)},id:`copy-from-menu-${e.name}`,"aria-controls":c?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,variant:"outlined",permission:s,projectId:n,environmentId:a,children:"Copy variants from"}),t.jsx(Qe,{anchorEl:i,open:c,onClose:()=>l(null),MenuListProps:{"aria-labelledby":`copy-from-menu-${e.name}`},children:r.map(u=>t.jsx(ve,{onClick:()=>o(u,e),children:t.jsx(Al,{children:`Copy from ${u.name}`})},u.name))})]})})},Il=({permission:e,projectId:s,environment:n,checked:a,onClick:o,...r})=>{const i=gt(e,s,n);return t.jsxs(ve,{disabled:!i,onClick:o,...r,children:[t.jsx(bs,{checked:a}),n]})},$l=g(Qe)(({theme:e})=>({"& > div > ul":{display:"flex",flexDirection:"column",justifyContent:"center","& > li":{padding:e.spacing(0,1)}}})),Pl=g("div")(({theme:e})=>({margin:e.spacing(1,2)})),Fl=g(ne)(({theme:e})=>({marginTop:e.spacing(2)})),Ol=({current:e,environments:s,permission:n,projectId:a,onSubmit:o})=>{var v;const[r,i]=x.useState(null),l=!!r,[c,p]=x.useState([]),u=y=>{p(f=>[...f,y])},d=y=>{p(f=>f.filter(({name:w})=>w!==y.name))},m=y=>{c.includes(y)?d(y):u(y)},j=()=>{p([]),i(null)},h=((v=s.find(y=>y.name===e))==null?void 0:v.variants)??[];return t.jsx(B,{condition:h.length>0&&s.length>1,show:t.jsxs(t.Fragment,{children:[t.jsx(ne,{onClick:y=>{i(y.currentTarget)},id:`push-to-menu-${e}`,"aria-controls":l?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":l?"true":void 0,variant:"outlined",children:"Copy to environment"}),t.jsxs($l,{anchorEl:r,open:l,onClose:()=>i(null),MenuListProps:{"aria-labelledby":`push-to-menu-${e}`},children:[s.filter(y=>y.name!==e).map(y=>t.jsx(Il,{projectId:a,permission:n,environment:y.name,checked:c.includes(y),onClick:()=>m(y)},y.name)),t.jsxs(Pl,{children:[t.jsx(Ys,{}),t.jsxs(Fl,{variant:"outlined",onClick:()=>{o(c),j()},disabled:c.length===0,children:["Push to selected (",c.length,")"]})]})]})]})})},_l=g("div")(({theme:e})=>({display:"flex",gap:e.spacing(1.5)})),Bl=()=>{const{setToastData:e,setToastApiError:s}=H(),n=Pe(),a=Ke(n.breakpoints.down("md")),o=A("projectId"),r=A("featureId"),{feature:i,refetchFeature:l,loading:c}=W(o,r),{patchFeatureEnvironmentVariants:p,overrideVariantsInEnvironments:u}=Ye(),{refetch:d}=ce(o),{addChange:m}=pe(),{isChangeRequestConfigured:j}=te(o),[h,v]=x.useState(""),[y,f]=x.useState(),[w,E]=x.useState(!1),O=x.useMemo(()=>{var C;return((C=i==null?void 0:i.environments)==null?void 0:C.map(P=>({...P,crEnabled:j(P.name)})))||[]},[i.environments]),_=(C,P)=>go(C,P),$=(C,P)=>{try{const b=po(P,1e3);return{patch:_(C,b)}}catch(b){return{patch:[],error:q(b)}}},D=C=>({feature:r,action:"patchVariant",payload:{variants:C}}),I=async(C,P)=>{if(C.crEnabled)await m(o,C.name,D(P)),d();else{const b=C.variants??[],{patch:S,error:F}=$(b,P);if(S.length===0)return;if(F){e({type:"error",text:F});return}await p(o,r,C.name,S)}l()},R=async(C,P)=>{try{const b=P.filter(({crEnabled:k})=>k),S=P.filter(({crEnabled:k})=>!k);b.length&&await Promise.all(b.map(k=>m(o,k.name,D(C)))),S.length&&await u(o,r,C,S.map(({name:k})=>k)),d(),l();const F=S.length?`Variants pushed to ${S.length===1?S[0].name:`${S.length} environments`}`:"",V=b.length?`Variants push added to ${b.length===1?`${b[0].name} draft`:`${b.length} drafts`}`:"",N=`${F}${F&&V?". ":""}${V}`;e({text:N,type:"success"})}catch(b){s(q(b))}},M=C=>{f(C),E(!0)},G=async C=>{if(y)try{await I(y,C),E(!1),e({text:y.crEnabled?"Variant changes added to draft":"Variants updated successfully",type:"success"})}catch(P){s(q(P))}},Q=async(C,P)=>{try{const b=C.variants??[];await I(P,b),e({text:P.crEnabled?"Variants copy added to draft":"Variants copied successfully",type:"success"})}catch(b){s(q(b))}};return t.jsxs(Rt,{isLoading:c,header:t.jsx(lo,{title:"Variants",actions:t.jsx(B,{condition:!a,show:t.jsx(t.Fragment,{children:t.jsx(qt,{initialValue:h,onChange:v})})}),children:t.jsx(B,{condition:a,show:t.jsx(qt,{initialValue:h,onChange:v})})}),children:[t.jsx(uo,{}),O.map(C=>{var b;const P=O.filter(({name:S,variants:F})=>S!==C.name&&(F==null?void 0:F.length));return t.jsx(Dl,{environment:C,searchValue:h,children:t.jsxs(_l,{children:[t.jsx(Ol,{current:C.name,environments:O,permission:ke,projectId:o,onSubmit:S=>R(C.variants??[],S)}),t.jsx(El,{environment:C,permission:ke,projectId:o,environmentId:C.name,onCopyVariantsFrom:Q,otherEnvsWithVariants:P}),t.jsx(B,{condition:!!((b=C.variants)!=null&&b.length),show:t.jsx(Re,{"data-testid":"EDIT_VARIANTS_BUTTON",onClick:()=>M(C),permission:ke,projectId:o,environmentId:C.name,tooltipProps:{title:"Edit variants"},children:t.jsx(He,{})}),elseShow:t.jsx(K,{"data-testid":"ADD_VARIANT_BUTTON",onClick:()=>M(C),variant:"outlined",permission:ke,projectId:o,environmentId:C.name,children:"Add variant"})})]})},C.name)}),t.jsx(yl,{environment:y,open:w,setOpen:E,getApiPayload:$,getCrPayload:D,onConfirm:G})]})},zl=({value:e,timeZone:s})=>{const{locationSettings:n}=$s(),a=e?e instanceof Date?Wt(e,n.locale,s):Wt(St(e),n.locale,s):void 0;return t.jsx(qe,{lineClamp:1,children:a})};var $t={},Ll=Ie;Object.defineProperty($t,"__esModule",{value:!0});var hn=$t.default=void 0,Ml=Ll(Ee()),Vl=t,Nl=(0,Ml.default)((0,Vl.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");hn=$t.default=Nl;const ql=g(L)(({theme:e})=>({fontSize:e.fontSizes.smallerBody})),Wl=({row:e})=>e.original.selectedApplications&&e.original.selectedApplications.length>1?t.jsx(qe,{children:t.jsx(Ue,{tooltip:t.jsx(t.Fragment,{children:e.original.selectedApplications.map(s=>t.jsx(ql,{children:s},s))}),children:e.original.appName})}):t.jsx(qe,{children:e.original.appName}),Hl=({metrics:e,tableSectionId:s})=>{const n=Ke(ho.breakpoints.down("md")),a=x.useMemo(()=>({sortBy:[{id:"timestamp"}]}),[]),{getTableProps:o,getTableBodyProps:r,headerGroups:i,rows:l,prepareRow:c,setHiddenColumns:p}=et.useTable({initialState:a,columns:ds,data:e,autoResetHiddenColumns:!1,disableSortRemove:!0,defaultColumn:{Cell:qe}},et.useGlobalFilter,et.useSortBy);return xo([{condition:n,columns:["appName","environment"]}],p,ds),e.length===0?null:t.jsxs(fo,{...o(),rowHeight:"standard",id:s,children:[t.jsx(yo,{headerGroups:i}),t.jsx(mo,{...r(),children:l.map(u=>{c(u);const{key:d,...m}=u.getRowProps();return t.jsx(jo,{hover:!0,...m,children:u.cells.map(j=>{const{key:h,...v}=j.getCellProps();return t.jsx(bo,{...v,children:j.render("Cell")},h)})},d)})})]})},ds=[{id:"Icon",width:"1%",disableSortBy:!0,Cell:()=>t.jsx(vo,{icon:t.jsx(hn,{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:Wl},{Header:"Environment",accessor:"environment"},{id:"requested",Header:"Requested",accessor:e=>e.yes+e.no},{Header:"Exposed",accessor:"yes"}],Ul=e=>e>48?`${Math.floor(e/24)} days (UTC)`:`${e} hours (local time)`,it=g("article")(({theme:e})=>({padding:e.spacing(2),background:"transparent",borderRadius:e.spacing(2),textAlign:"center",[e.breakpoints.up("md")]:{padding:e.spacing(4)}})),ct=g("h3")(({theme:e})=>({margin:0,fontSize:e.fontSizes.bodySize,fontWeight:e.fontWeight.thin})),lt=g("p")(({theme:e})=>({fontSize:"2.25rem",fontWeight:e.fontWeight.bold,color:e.palette.primary.main})),dt=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})),Gl=({totalYes:e,totalNo:s,hoursBack:n,statsSectionId:a,tableSectionId:o})=>{const r=n===1?"in the last hour":`in the last ${Ul(n)}`;return t.jsxs(he,{container:!0,spacing:2,id:a,"aria-describedby":o,"aria-label":"Feature metrics summary",component:"section",children:[t.jsx(he,{item:!0,xs:12,sm:4,children:t.jsxs(it,{children:[t.jsx(ct,{children:"Exposure"}),t.jsx(lt,{children:t.jsx(Ne,{value:e})}),t.jsxs(dt,{children:["Total exposure of the feature in the environment"," ",r,"."]})]})}),t.jsx(he,{item:!0,xs:12,sm:4,children:t.jsxs(it,{children:[t.jsx(ct,{children:"Exposure %"}),t.jsxs(lt,{children:[dn(e+s,e),"%"]}),t.jsxs(dt,{children:["% total exposure of the feature in the environment"," ",r,"."]})]})}),t.jsx(he,{item:!0,xs:12,sm:4,children:t.jsxs(it,{children:[t.jsx(ct,{children:"Requests"}),t.jsx(lt,{children:t.jsx(Ne,{value:e+s})}),t.jsxs(dt,{children:["Total requests for the feature in the environment"," ",r,"."]})]})})]})},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(Gl,{...s,totalYes:n,totalNo:a})},Jl=({metrics:e,hoursBack:s})=>{const n=Ht(),a=Ht();return e.length===0?t.jsxs(z,{mt:6,children:[t.jsx(L,{variant:"body1",paragraph:!0,children:"We have yet to receive any metrics for this feature flag in the selected time period."}),t.jsx(L,{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(z,{borderTop:1,pt:2,mt:3,borderColor:"divider",children:t.jsx(Kl,{metrics:e,hoursBack:s,statsSectionId:n})}),t.jsx(z,{mt:4,children:t.jsx(Yl,{metrics:e,hoursBack:s,statsSectionId:n,tableSectionId:a})}),t.jsx(z,{mt:4,children:t.jsx(Hl,{metrics:e,tableSectionId:a})})]})},Kl=So.lazy(()=>Co(()=>import("./FeatureMetricsChart-uzxl5gXR.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})),Xl=g("ul")(({theme:e})=>({display:"flex",flexWrap:"wrap",gap:e.spacing(1),listStyleType:"none",padding:0,minHeight:"100%",alignItems:"center",maxHeight:"200px",overflowY:"auto"})),Zl=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}})),us=({title:e,values:s,selectedValues:n,toggleValue:a,toggleValues:o})=>{const r=c=>()=>{a(c)},i=[...s].every(c=>n.includes(c)),l=x.useMemo(()=>Array.from(s).sort((c,p)=>c.localeCompare(p)),[s]);return t.jsxs("div",{children:[t.jsx(Ql,{children:e}),t.jsxs(Xl,{children:[o&&s.size>1&&t.jsx(ne,{size:"small",onClick:o,"aria-pressed":i,children:i?"Unselect":"Select all"}),l.map(c=>t.jsx(Zl,{children:t.jsx(As,{label:c,onClick:r(c),"aria-pressed":n==null?void 0:n.includes(c),sx:To})},c))]})]})},ed=()=>{const e=A("projectId"),s=A("featureId"),n=td(e,s);Hs("Metrics");const a=Array.from(n)[0],[o,r]=wo({environment:tt(ko,a),applications:tt(Ro,[]),hoursBack:tt(Do,xt)}),i=sd(s,o.hoursBack||xt),l=Array.from(i),c=l[0],{environment:p,hoursBack:u}=o,d=o.applications.filter(f=>f!==null);x.useEffect(()=>{o.applications&&o.applications.length===0&&r({applications:l})},[JSON.stringify(l)]);const m=[...i].every(f=>d.includes(f)),{featureMetrics:j}=Qs(s,u),[h,v]=x.useState(j);x.useEffect(()=>{j&&v(j)},[j]);const y=x.useMemo(()=>Uo((h==null?void 0:h.filter(f=>p===f.environment).filter(f=>d.includes(f.appName)))||[]).map(f=>({...f,appName:d.length>1?"all selected":f.appName,selectedApplications:d})),[h,p,JSON.stringify(d)]);return y?t.jsxs(Rt,{children:[t.jsxs(he,{container:!0,component:"header",spacing:2,children:[t.jsx(he,{item:!0,xs:12,md:4,children:t.jsx(B,{condition:n.size>0,show:t.jsx(us,{title:"Environments",values:n,selectedValues:[p],toggleValue:f=>{r({environment:f})}})})}),t.jsx(he,{item:!0,xs:12,md:6,children:t.jsx(B,{condition:i.size>0,show:t.jsx(us,{title:"Applications",values:i,selectedValues:d,toggleValues:()=>{r(m?{applications:[c]}:{applications:[...i]})},toggleValue:f=>{d.includes(f)?r({applications:d.filter(w=>w!==f)}):r({applications:[...d,f]})}})})}),t.jsx(he,{item:!0,xs:12,md:2,children:t.jsx(Go,{hoursBack:u,setHoursBack:f=>r({hoursBack:f})})})]}),t.jsx(Jl,{metrics:y,hoursBack:u})]}):null},td=(e,s)=>{const{feature:n}=W(e,s),a=n.environments.map(o=>o.name);return new Set(a)},sd=(e,s=xt)=>{const{featureMetrics:n=[]}=Qs(e,s),a=n.map(o=>o.appName);return new Set(a)},nd=({enabled:e,value:s,onChange:n,filter:a,...o})=>{const{projects:r}=Js();if(!e)return null;const i=c=>({key:c.id,label:c.name,title:c.description||"",sx:{whiteSpace:"pre-line"}});let l;return a?l=r.filter(c=>a(c.id)).map(i):l=r.map(i),s&&!l.find(c=>c.key===s)&&l.push({key:s,label:s}),t.jsx(Ss,{label:"Project",options:l,value:s,onChange:n,...o})},ad=(e,s)=>{const n=new Set(e),a=new Set(s);return n.size!==a.size?!1:[...n].every(o=>a.has(o))},ps=g("div")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),gs=g(Z)(({theme:e})=>({marginBottom:e.spacing(1)})),od=g(Ct)({padding:0}),rd=({projectId:e,open:s,onClose:n,onClick:a,feature:o,changeRequests:r})=>{const i=A("projectId"),{project:l}=Ao(e),{isChangeRequestConfiguredInAnyEnv:c}=te(e),p=c(),u=x.useMemo(()=>{var j;return ad(o.environments.map(h=>h.name),((j=l.environments)==null?void 0:j.map(h=>h.environment))||[])},[o,l]),d=r?r.length>0:!1,m=o.dependencies.length>0||o.children.length>0;return t.jsx(B,{condition:u&&!m&&!d&&!p,show:t.jsx(ue,{open:s,onClose:n,onClick:a,title:"Confirm change project",primaryButtonText:"Change project",secondaryButtonText:"Cancel",children:t.jsxs(ps,{children:[t.jsx(gs,{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(ue,{open:s,onClick:n,title:"Confirm change project",primaryButtonText:"Close",children:t.jsxs(ps,{children:[t.jsx(gs,{severity:"warning",children:"Cannot proceed with the move"}),t.jsx(B,{condition:m,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(B,{condition:!u,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(B,{condition:d,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(j=>t.jsx(Ve,{children:t.jsxs(ae,{to:`/projects/${i}/change-requests/${j.id}`,children:["View change request"," ",j.id]})},j.id))})]})}),t.jsx(B,{condition:p,show:t.jsxs("p",{children:["You're not allowed to move the feature to project"," ",t.jsx(ae,{to:`/projects/${e}/settings/change-requests`,children:e}),". This project has change requests enabled."]})})]})})})},id=()=>{const{hasAccess:e}=x.useContext(Es),s=A("projectId"),n=A("featureId"),{feature:a,refetchFeature:o}=W(s,n),[r,i]=x.useState(!1),{changeFeatureProject:l}=Ye(),{setToastData:c,setToastApiError:p}=H(),[u,d]=x.useState(s),{projects:m}=Js(),j=le(),{changeRequests:h}=un(s,n),v=async()=>{try{u&&(await l(s,n,u),o(),c({text:"Project changed",type:"success"}),i(!1),j(`/projects/${u}/features/${n}/settings`,{replace:!0}))}catch(f){p(q(f))}},y=x.useMemo(()=>m.map(f=>f.id).filter(f=>e(Ut,f)),[m,e]);return y.length===0?null:t.jsxs(t.Fragment,{children:[t.jsx(nd,{value:u,onChange:d,label:"Project",filter:f=>y.includes(f),enabled:!0}),t.jsx(K,{permission:Ut,onClick:()=>i(!0),disabled:u===s,projectId:s,children:"Save"}),t.jsx(rd,{changeRequests:h,projectId:u,open:r,feature:a,onClose:()=>i(!1),onClick:v})]})},cd=g("div")({display:"flex",alignItems:"center"}),ld=g(L)(({theme:e})=>({fontSize:e.fontSizes.mainHeader})),dd=({projectId:e,featureId:s})=>{var r;const{feature:n}=W(e,s),a=le(),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(Re,{permission:Ce,projectId:e,"data-loading":!0,onClick:o,tooltipProps:{title:"Edit"},children:t.jsx(He,{})})]}),t.jsxs(L,{children:["Name: ",t.jsx("strong",{children:n.name})]}),t.jsxs(L,{children:["Description:"," ",t.jsx("strong",{children:(r=n.description)!=null&&r.length?n.description:"no description"})]}),t.jsxs(L,{children:["Type: ",t.jsx("strong",{children:n.type})]}),t.jsxs(L,{children:["Impression Data:"," ",t.jsx("strong",{children:n.impressionData?"enabled":"disabled"})]})]})},Me="metadata",ut="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=A("projectId"),s=A("featureId"),[n,a]=x.useState(Me),{uiConfig:o}=Te();return t.jsx(Rt,{header:"Settings",sx:{padding:0},children:t.jsxs(z,{sx:{display:"flex"},children:[t.jsx(ud,{children:t.jsxs(Ct,{children:[t.jsx(Ve,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>a(Me),selected:n===Me,children:"Metadata"},0),t.jsx(Ve,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>a(ut),selected:n===ut,hidden:!o.flags.P,children:"Project"},1)]})}),t.jsxs(pd,{children:[t.jsx(B,{condition:n===Me,show:t.jsx(dd,{projectId:e,featureId:s})}),t.jsx(B,{condition:n===ut&&o.flags.P,show:t.jsx(id,{})})]})]})})},hs=g("strong")({wordBreak:"break-all"}),hd=()=>{const e=A("projectId"),s=A("featureId"),{features:n}=Eo({project:`IS:${e}`,archived:"IS:true"}),a=Io(e,{name:s});return n?n.some(r=>r.name===s)?t.jsxs("p",{children:["The feature ",t.jsx(hs,{children:s})," has been archived. You can find it on the"," ",t.jsx(ae,{to:`/projects/${e}?archived=IS%3Atrue`,children:"project overview with archived flags filter"}),"."]}):t.jsxs("p",{children:["The feature ",t.jsx(hs,{children:s})," does not exist. Would you like to"," ",t.jsx(ae,{to:a,children:"create it"}),"?"]}):null};var Pt={},xd=Ie;Object.defineProperty(Pt,"__esModule",{value:!0});var xn=Pt.default=void 0,fd=xd(Ee()),yd=t,md=(0,fd.default)((0,yd.jsx)("path",{d:"m20.54 5.23-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.16.55L3.46 5.23C3.17 5.57 3 6.02 3 6.5V19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.48-.17-.93-.46-1.27zM6.24 5h11.52l.81.97H5.44l.8-.97zM5 19V8h14v11H5zm8.45-9h-2.9v3H8l4 4 4-4h-2.55z"}),"ArchiveOutlined");xn=Pt.default=md;var Ft={},jd=Ie;Object.defineProperty(Ft,"__esModule",{value:!0});var fn=Ft.default=void 0,bd=jd(Ee()),vd=t,Sd=(0,bd.default)((0,vd.jsx)("path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.2 3.2.8-1.3-4.5-2.7V7z"}),"WatchLaterOutlined");fn=Ft.default=Sd;var Ot={},Cd=Ie;Object.defineProperty(Ot,"__esModule",{value:!0});var yn=Ot.default=void 0,Td=Cd(Ee()),wd=t,kd=(0,Td.default)((0,wd.jsx)("path",{d:"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H8V4h12v12zm-7-2h2v-3h3V9h-3V6h-2v3h-3v2h3z"}),"LibraryAddOutlined");yn=Ot.default=kd;const Rd=({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,children:t.jsx(Ae,{color:e?"error":"success",title:n,children:a})})},Dd=e=>$o({key:"c",modifiers:["ctrl"],preventDefault:!1},()=>{var n;const s=(n=window.getSelection)==null?void 0:n.call(window);s&&(s.type==="None"||s.type==="Caret")&&e()});var _t={},Ad=Ie;Object.defineProperty(_t,"__esModule",{value:!0});var mn=_t.default=void 0,Ed=Ad(Ee()),Id=t,$d=(0,Ed.default)((0,Id.jsx)("path",{d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4H8c-1.1 0-1.99.9-1.99 2L6 21c0 1.1.89 2 1.99 2H19c1.1 0 2-.9 2-2V11l-6-6zM8 21V7h6v5h5v9H8z"}),"FileCopyOutlined");mn=_t.default=$d;const xs=18/8,Pd=({name:e})=>{const[s,n]=x.useState(!1),{setToastData:a}=H(),o=()=>{try{Fo(e),n(!0);const i=setTimeout(()=>{n(!1)},3e3);return()=>{clearTimeout(i)}}catch{a({type:"error",text:"Could not copy feature name"})}},r=Dd(o);return t.jsx(ee,{title:s?"Copied!":`Copy name (${r})`,arrow:!0,children:t.jsx(xe,{onClick:o,children:s?t.jsx(Po,{sx:i=>({fontSize:i.spacing(xs),color:i.palette.success.main})}):t.jsx(mn,{sx:i=>({fontSize:i.spacing(xs)})})})})},Fd=g("div")(({theme:e})=>({backgroundColor:"none",marginBottom:e.spacing(2),borderBottom:`1px solid ${e.palette.divider}`,containerType:"inline-size"})),Bt=(e,s)=>({"@container (min-width: 650px)":s,"@supports not (container-type: inline-size)":{[e.breakpoints.up("md")]:s}}),jn=g("div")(({theme:e})=>({display:"flex",flexFlow:"row wrap",alignItems:"center",columnGap:e.spacing(1.5)})),Od=g("div")(({theme:e})=>({display:"flex",alignItems:"center",columnGap:e.spacing(.5)})),_d=g(jn)(({theme:e})=>({justifyContent:"space-between",columnGap:0,flexFlow:"column nowrap",alignItems:"flex-start",...Bt(e,{alignItems:"center",flexFlow:"row nowrap"})})),Bd=g("div",{shouldForwardProp:e=>e!=="showOnNarrowScreens"})(({theme:e,showOnNarrowScreens:s})=>({display:s?"flex":"none",flexFlow:"row nowrap",alignItems:"center",...Bt(e,{display:s?"none":"flex"})})),zd=({children:e,label:s,onClick:n})=>t.jsx(No,{title:s,arrow:!0,onClick:a=>a.preventDefault(),children:t.jsx(xe,{"aria-label":s,onClick:n,children:e})}),Ld=g(Oo)({minWidth:0,maxWidth:"100%","& .MuiTabs-flexContainer":{minHeight:"unset"}}),Md=g(_o)(({theme:e})=>({textTransform:"none",width:"auto",fontSize:e.fontSizes.bodySize,padding:"0 !important",...Bt(e,{minWidth:100})}));g(ae)(()=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}}));const Vd=e=>{const s=kt("enableLegacyVariants"),n=e.some(a=>{var o;return(o=a.variants)==null?void 0:o.length});return s||n},Nd=({showOnNarrowScreens:e,feature:s,onFavorite:n,openStaleDialog:a,openDeleteDialog:o})=>t.jsxs(Bd,{showOnNarrowScreens:e,children:[t.jsx(zd,{label:"Favorite this feature flag",onClick:n,"data-loading":!0,children:s.favorite?t.jsx(Lo,{}):t.jsx(Mo,{})}),t.jsx(Re,{permission:Vo,projectId:s.project,"data-loading":!0,component:ae,to:`/projects/${s.project}/features/${s.name}/copy`,tooltipProps:{title:"Clone"},children:t.jsx(yn,{})}),t.jsx(Re,{permission:Ws,projectId:s.project,tooltipProps:{title:"Archive feature flag"},"data-loading":!0,onClick:o,children:t.jsx(xn,{})}),t.jsx(Re,{onClick:a,permission:Ce,projectId:s.project,tooltipProps:{title:"Toggle stale state"},"data-loading":!0,children:t.jsx(fn,{})})]}),qd=({feature:e})=>{const s=A("projectId"),n=A("featureId"),{favorite:a,unfavorite:o}=Bo(),{refetchFeature:r}=W(s,n),{setToastData:i,setToastApiError:l}=H(),[c,p]=x.useState(!1),[u,d]=x.useState(!1),[m,j]=x.useState(!1),h=le(),{pathname:v}=zo(),y=`/projects/${s}/features/${n}`,f=Vd(e.environments),w=[{title:"Overview",path:`${y}`,name:"overview"},{title:"Metrics",path:`${y}/metrics`,name:"Metrics"},...f?[{title:"Variants",path:`${y}/variants`,name:"Variants"}]:[],{title:"Settings",path:`${y}/settings`,name:"Settings"},{title:"Event log",path:`${y}/logs`,name:"Event log"}],E=w.find($=>$.path===v)??w[0],O=async()=>{try{e.favorite?await o(s,e.name):await a(s,e.name),r()}catch{l("Something went wrong, could not update favorite")}},_=({showOnNarrowScreens:$})=>t.jsx(Nd,{showOnNarrowScreens:$,feature:e,onFavorite:O,openStaleDialog:()=>j(!0),openDeleteDialog:()=>d(!0)});return t.jsxs(t.Fragment,{children:[t.jsxs(Fd,{children:[t.jsxs(jn,{children:[t.jsxs(Od,{children:[t.jsx(L,{variant:"h1",children:e.name}),t.jsx(Pd,{name:e.name})]}),e.stale?t.jsx(Rd,{stale:!0}):null]}),t.jsxs(_d,{children:[t.jsx(_,{showOnNarrowScreens:!0}),t.jsx(Ld,{value:E.path,indicatorColor:"primary",textColor:"primary","aria-label":"Feature flag tabs",variant:"scrollable",children:w.map($=>t.jsx(Md,{label:$.title,value:$.path,onClick:()=>h($.path),"data-testid":`TAB-${$.title}`},$.title))}),t.jsx(_,{})]})]}),e.children.length>0?t.jsx(At,{features:e.children,project:s,isOpen:u,onClose:()=>d(!1)}):t.jsx(Dt,{isOpen:u,onConfirm:()=>{h(`/projects/${s}`)},onClose:()=>d(!1),projectId:s,featureIds:[n]}),t.jsx(ar,{isStale:e.stale,isOpen:m,onClose:()=>{j(!1),r()},featureId:n,projectId:s}),t.jsx(nn,{open:c,setOpen:p})]})};g(ae)(()=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}}));const Wd=()=>{const e=A("projectId"),s=A("featureId"),{feature:n,loading:a,error:o,status:r}=W(e,s),i=qo(a);return r===404?t.jsx(hd,{}):o!==void 0?t.jsx("div",{ref:i}):t.jsxs("div",{ref:i,children:[t.jsx(qd,{feature:n}),t.jsxs(Us,{children:[t.jsx(je,{path:"metrics",element:t.jsx(ed,{})}),t.jsx(je,{path:"logs",element:t.jsx(vr,{})}),t.jsx(je,{path:"variants",element:t.jsx(Bl,{})}),t.jsx(je,{path:"settings",element:t.jsx(gd,{})}),t.jsx(je,{path:"*",element:t.jsx(nl,{})})]})]})},Jd=Object.freeze(Object.defineProperty({__proto__:null,default:Wd},Symbol.toStringTag,{value:"Module"}));export{Jd as F,Ul as d};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)},title:l=>`Time: ${t>48?w(l[0].label,a.locale,"UTC"):
|
|
1
|
+
import{dc as w,iO as F,bv as E,aR as S,r as p,j as r,B as k,iP as D,bu as A,s as g,iQ as P,iR as T,iS as I,iT as R,iU as B,iV as O,iW as L,b as y,T as N,iX as j,bs as $,aT as H}from"./index-DvDCZTAu.js";import{f as V,a as W}from"./formatTickValue-D9avlj7O.js";import{F as U,c as _,u as Y,b as G}from"./aggregateFeatureMetrics-CFI2n6i7.js";import{F as z,M as J}from"./MarkCompletedDialogue-BKJahqUx.js";const Q=e=>{const t={label:"Exposed",hoverBackgroundColor:"#A39EFF",backgroundColor:"#A39EFF",data:M(e,n=>n.yes)},a={label:"Not exposed",hoverBackgroundColor:"#D8D6FF",backgroundColor:"#D8D6FF",data:M(e,n=>n.no)};return{datasets:[t,a]}},M=(e,t)=>e.map(a=>({x:a.timestamp,y:t(a),variants:a.variants||{}})),X=(e,t)=>{if(t===0)return"";const[a,n]=e,s=Math.floor(Number(n)/t*100);return`${n} (${s}%) - ${a}`},C=e=>({plugins:{legend:{position:"top",labels:{color:e.palette.text.primary,usePointStyle:!0,pointStyle:"none",boxHeight:0,padding:15,boxPadding:5}},tooltip:{enabled:!1}},responsive:!0,maintainAspectRatio:!1,scales:{x:{stacked:!0,ticks:{display:!1},grid:{display:!1}},y:{stacked:!0,ticks:{maxTicksLimit:5,display:!1},grid:{drawBorder:!1,color:e.palette.divider}}},elements:{bar:{borderRadius:5}},interaction:{mode:"index",intersect:!1}}),q=(e,t,a)=>{var m;const{responsive:n,elements:s,interaction:c,scales:o,maintainAspectRatio:i}=C(e);return{plugins:{legend:{position:"bottom",labels:{color:e.palette.text.primary,pointStyle:"circle",usePointStyle:!0,boxHeight:6,padding:15,boxPadding:5}},annotation:{clip:!1,annotations:{}},tooltip:{backgroundColor:e.palette.background.paper,titleColor:e.palette.text.primary,bodyColor:e.palette.text.primary,bodySpacing:6,padding:{top:20,bottom:20,left:30,right:30},borderColor:"rgba(0, 0, 0, 0.05)",borderWidth:3,usePointStyle:!0,caretSize:0,boxPadding:10,callbacks:{label:l=>`${l.formattedValue} - ${l.dataset.label}`,afterLabel:l=>{const d=l.dataset.data[l.dataIndex];if(l.dataset.label!=="Exposed"||d.variants===void 0)return"";const{disabled:f,...u}=d.variants;return Object.entries(u).map(b=>X(b,d.y)).join(`
|
|
2
|
+
`)},title:l=>`Time: ${t>48?w(l[0].label,a.locale,"UTC"):F(l[0].label,a.locale)}`}}},responsive:n,maintainAspectRatio:i,scales:{x:{...o?o.x:{},ticks:{color:e.palette.text.secondary,callback(l){const d=this.getLabelForValue(Number(l));return t>48?E(d,a.locale,"UTC"):F(d,a.locale)}}},y:{...(o==null?void 0:o.y)??{},ticks:{...((m=o==null?void 0:o.y)==null?void 0:m.ticks)??{},color:e.palette.text.secondary,callback:V,display:!0}}},elements:s,interaction:c}},K=({project:e,flagName:t,onArchive:a,className:n})=>{var f;const{feature:s,refetchFeature:c}=S(e,t),o=(f=s.environments)==null?void 0:f.map(u=>({name:u.name,lastSeenAt:u.lastSeenAt,enabled:u.enabled,yes:u.yes,no:u.no})),[i,m]=p.useState(!1),[l,d]=p.useState(!1);return r.jsxs(k,{sx:{display:"flex"},className:n,children:[r.jsx(D,{sx:{pt:0,pb:0},featureLastSeen:s.lastSeenAt,environments:o}),r.jsx(A,{feature:s,onArchive:()=>m(!0),onComplete:()=>d(!0),onUncomplete:c}),s.children.length>0?r.jsx(U,{features:s.children,project:e,isOpen:i,onClose:()=>m(!1)}):r.jsx(z,{isOpen:i,onConfirm:a,onClose:()=>m(!1),projectId:e,featureIds:[t]}),s.project?r.jsx(J,{isOpen:l,setIsOpen:d,projectId:s.project,featureId:s.name,onComplete:c}):null]})},Z=[0,14,28,21,33,31,31,22,26,37,31,14,21,14,0],ee=e=>({labels:Array.from({length:15},(t,a)=>a+1),datasets:[{data:Z,backgroundColor:e.palette.divider,hoverBackgroundColor:e.palette.divider,label:""}]}),v=g("div")({width:"100%",flexGrow:1}),x=({label:e})=>{const t=y(),a=p.useMemo(()=>C(t),[t]),n=p.useMemo(()=>ee(t),[t]),s="placeholder-chart-label";return r.jsxs(r.Fragment,{children:[r.jsx(N,{id:s,children:e}),r.jsx(v,{children:r.jsx(j,{data:n,options:a,"aria-describedby":s})})]})},te=()=>{const e=y(),t=p.useMemo(()=>C(e),[e]),a=p.useMemo(()=>({labels:[],datasets:[]}),[e]);return r.jsx(v,{children:r.jsx(j,{data:a,options:t,"aria-label":"A placeholder bar chart with a single feature flag exposure metrics"})})},ae=(e,t)=>{const[a,n]=p.useState(null),{feature:s}=S(e,t),c=((s==null?void 0:s.environments)??[]).map(i=>({name:i.name,type:i.type})),o=c.find(i=>i.type==="production");return p.useEffect(()=>{o?n(o.name):c.length>0&&n(c[0].name)},[t,JSON.stringify(c)]),{environment:a,setEnvironment:n,activeEnvironments:c}},re=(e,t,a)=>{const{featureMetrics:n=[],loading:s,error:c}=Y(e,a),o=p.useMemo(()=>[...n].sort((u,b)=>u.timestamp.localeCompare(b.timestamp)),[n]),i=p.useMemo(()=>G(o==null?void 0:o.filter(u=>t===u.environment)).map(u=>({...u,appName:"all selected"})),[o,t]),m=p.useMemo(()=>Q(i),[i]),l=y(),{locationSettings:d}=$(),f=p.useMemo(()=>q(l,a,d),[l,a,d]);return{data:m,options:f,loading:s,error:c}},se=({activeEnvironments:e,environment:t,setEnvironment:a})=>r.jsx(H,{name:"feature-environments",label:"Environment",id:"feature-environments",options:e.map(n=>({key:n.name,label:n.name})),value:String(t),onChange:a}),ne=g(k)(({theme:e})=>({display:"flex",justifyContent:"flex-start",flexFlow:"row wrap",gap:e.spacing(2)})),h=g("div")(({theme:e})=>({display:"flex",flexDirection:"column",gap:e.spacing(3),alignItems:"center",height:"100%",justifyContent:"space-between"})),oe=g(K)({alignItems:"center",justifySelf:"start"}),le=g("div")(({theme:e})=>({display:"flex",justifyContent:"space-between",flexFlow:"row wrap",width:"100%",gap:e.spacing(4)})),me=e=>r.jsx(h,{children:r.jsx(x,{...e})}),ie=({flag:e,onArchive:t})=>{const[a,n]=p.useState(48),{environment:s,setEnvironment:c,activeEnvironments:o}=ae(e.project,e.name),{data:i,options:m,loading:l,error:d}=re(e.name,s,a);if(d)return r.jsx(h,{children:r.jsx(x,{label:"Couldn't fetch metrics for the current flag right now. Please try again. Report this if it doesn't resolve itself."})});const f=i.datasets[0].data.length===0;return r.jsxs(h,{children:[r.jsxs(le,{children:[r.jsx(oe,{project:e.project,flagName:e.name,onArchive:t}),r.jsxs(ne,{children:[s?r.jsx(se,{environment:s,setEnvironment:c,activeEnvironments:o}):null,r.jsx(_,{hoursBack:a,setHoursBack:n})]})]}),l?r.jsx(te,{}):f?r.jsx(x,{label:"No metrics for this feature flag in the selected environment and time period"}):r.jsx(v,{children:r.jsx(j,{data:i,options:m,"aria-label":"A bar chart with a single feature flag exposure metrics"})})]})},fe=e=>[".",".."].includes(e.flag.name)?r.jsx(h,{children:r.jsx(x,{label:`The current flag name ('${e.flag.name}') is known to cause issues due how it affects URLs. We cannot show you a chart for it.`})}):r.jsx(ie,{...e});P.register(W,T,I,R,B,O,L);export{fe as FlagMetricsChart,me as PlaceholderFlagMetricsChartWithWrapper};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cT as n,bc as l,j as e,C as c,V as s,B as d,iX as g,iQ as h,iR as u,iS as p,iT as m,iU as x,iV as f,iW as S}from"./index-DvDCZTAu.js";import{a as j}from"./formatTickValue-D9avlj7O.js";import{u as C,d as P,S as T,T as w,P as y,c as b,g as B}from"./useChartDataSelection-OwfBPL7x.js";import"./LazyAdminExport-CRoU3u-1.js";import"./RoleCell-ndjYcZ1T.js";import"./useApiTokens-BZGgHseg.js";const k=()=>{n("Network - Frontend Traffic Usage");const{isOss:a}=l(),{chartDataSelection:t,setChartDataSelection:i,options:r}=C(),{chartData:o}=P(t);return e.jsx(c,{condition:a(),show:e.jsx(s,{severity:"warning",children:"Not enabled."}),elseShow:e.jsx(e.Fragment,{children:e.jsxs(T,{children:[e.jsxs(w,{children:[e.jsx(d,{children:e.jsx(s,{severity:"info",icon:!1,children:"Frontend traffic is determined by the total SDK requests to the Frontend API"})}),e.jsx(y,{selectedPeriod:t,setPeriod:i})]}),e.jsx(g,{data:o,plugins:[b()],options:r,"aria-label":B(t)})]})})})};h.register(j,u,p,m,x,f,S);export{k as default};
|