1 |
- {"version":3,"file":"AlertRuleListIndex.9cec8b2b3fa934d35f27.js","mappings":"8JAKO,SAASA,EAAcC,GAC5B,MAAMC,GAAWC,EAAAA,EAAAA,eAEXC,GAAcC,EAAAA,EAAAA,QAAOJ,GAC3BG,EAAYE,QAAUL,GACtBM,EAAAA,EAAAA,YAAU,IACD,KACLL,GAASM,EAAAA,EAAAA,GAAc,CAAEP,cAAeG,EAAYE,aAErD,CAACJ,M,oLCNC,SAASO,EAAT,GAA2E,IAAlD,UAAEC,GAAgD,EAChF,OACE,SAAC,EAAAC,MAAD,CAAOC,MAAM,kBAAkBC,QAAM,EAACH,UAAWA,EAAWI,gBAAiBJ,EAA7E,gBACE,UAAC,EAAAK,cAAD,CAAeC,QAAQ,KAAvB,WACE,gBAAKC,IAAI,iCAAiCC,IAAI,gCAC9C,4KAIA,oG,uBCHR,MA8CA,EA9CsB,IAA4C,IAA3C,KAAEC,EAAF,OAAQC,EAAR,cAAgBC,GAA2B,EAChE,MAAMC,EAAW,GAAEH,EAAKI,iBAAiBJ,EAAKK,oBACxCC,GAAaC,EAAAA,EAAAA,cAChBC,IACC,SAAC,IAAD,CAEEC,mBAAmB,yBACnBC,gBAAiBF,EACjBG,YAAa,CAACV,IAHTO,IAMT,CAACP,IAGH,OACE,UAAC,EAAAW,KAAD,YACE,SAAC,EAAAA,KAAA,QAAD,UAAeN,EAAWN,EAAKa,SAC/B,SAAC,EAAAD,KAAA,OAAD,WACE,SAAC,EAAAE,KAAD,CAAMC,KAAK,KAAKF,KAAMb,EAAKgB,UAAuBC,UAAY,yBAAwBjB,EAAKkB,kBAE7F,UAAC,EAAAN,KAAA,KAAD,YACE,6BACE,kBAAiBK,UAAY,GAAEjB,EAAKkB,aAApC,UACGZ,EAAWN,EAAKmB,WAAY,MADrB,QADZ,OAIOnB,EAAKoB,WAJF,SAMTpB,EAAKqB,KAAOf,EAAWN,EAAKqB,MAAQ,SAEvC,UAAC,EAAAT,KAAA,QAAD,YACE,SAAC,EAAAU,OAAD,CAEEC,QAAQ,YACRC,KAAqB,WAAfxB,EAAKyB,MAAqB,OAAS,QACzCC,QAASxB,EAJX,SAMkB,WAAfF,EAAKyB,MAAqB,SAAW,SALlC,SAON,SAAC,EAAAE,WAAD,CAAuBJ,QAAQ,YAAYK,KAAMzB,EAASqB,KAAK,MAA/D,uBAAgB,e,MChDjB,MAEDK,EAA4B,IAAM,IAAN,GAChC,UAAC,EAAAC,MAAD,CAAOC,SAAS,UAAUtC,MAAM,6CAAhC,WACE,oJAGE,kBAHF,0EAMA,+BACM,KACJ,cAAGmC,KAAK,wFAAR,8CAEK,IAJP,0CAKgD,KAC9C,cAAGA,KAAK,4EAAR,4DANF,W,yBCZG,MAAMI,EAAkBP,GAA2BA,EAAMQ,YAEnDC,EAAqBT,IAChC,MAAMU,EAAQ,IAAIC,OAAOX,EAAMY,WAAWJ,YAAa,KAEvD,OAAOR,EAAMY,WAAWC,MAAMC,QAAQC,GAC7BL,EAAMM,KAAKD,EAAK3B,OAASsB,EAAMM,KAAKD,EAAKrB,YAAcgB,EAAMM,KAAKD,EAAKnB,S,oICsBlF,MAAMqB,EAAqB,CACzBC,mBADyB,KAEzBC,eAFyB,KAGzBC,qBAAoBA,EAAAA,IAGhBC,GAAYC,EAAAA,EAAAA,UAflB,SAAyBtB,GACvB,MAAO,CACLuB,UAAUC,EAAAA,EAAAA,GAAYxB,EAAMyB,SAAU,cACtCb,WAAYH,EAAkBT,GAC9BxB,OAAQ+B,EAAeP,EAAMY,YAC7Bc,UAAW1B,EAAMY,WAAWc,aAUWT,GAMpC,MAAMU,UAAiCC,EAAAA,cAAqB,wDAClD,CACb,CAAEC,MAAO,MAAOC,MAAO,OACvB,CAAED,MAAO,KAAMC,MAAO,MACtB,CAAED,MAAO,SAAUC,MAAO,UAC1B,CAAED,MAAO,WAAYC,MAAO,YAC5B,CAAED,MAAO,UAAWC,MAAO,WAC3B,CAAED,MAAO,SAAUC,MAAO,UAC1B,CAAED,MAAO,UAAWC,MAAO,aARoC,+BA6BzCC,IACtBC,EAAAA,gBAAAA,QAAwB,CAAEhC,MAAO+B,EAAOD,WA9BuB,sBAiCnD,KACZG,EAAAA,EAAAA,QAAkB,IAAIC,EAAAA,GAAoB,CAAEC,UAAWtE,QAlCQ,8BAqC1CiE,IACrBM,KAAKC,MAAMlB,eAAeW,MAtCqC,wBAyChDvD,IACf6D,KAAKC,MAAMjB,qBAAqB7C,EAAK+D,GAAI,CAAEC,OAAuB,WAAfhE,EAAKyB,WA1CO,iCA6CxC,IAAsD,IAArD,KAAEjB,EAAF,MAAQ+C,GAA6C,EAC7E,OACE,mBAAoBA,MAAOA,EAA3B,SACG/C,GADU+C,MApCjBU,oBACEJ,KAAKK,aAGPC,mBAAmBC,GACbA,EAAUC,YAAY5C,QAAUoC,KAAKC,MAAMO,YAAY5C,OACzDoC,KAAKK,aAIO,yBACRL,KAAKC,MAAMnB,mBAAmB,CAAElB,MAAOoC,KAAKS,mBAGpDA,iBAAyB,MACvB,iBAAOT,KAAKC,MAAMO,YAAY5C,aAA9B,QAAuC,MA2BzC8C,SACE,MAAM,SAAEvB,EAAF,WAAYX,EAAZ,OAAwBpC,EAAxB,UAAgCkD,GAAcU,KAAKC,MAEzD,OACE,SAACU,EAAA,EAAD,CAAMxB,SAAUA,EAAhB,UACE,UAACwB,EAAA,WAAD,CAAerB,UAAWA,EAA1B,WACE,iBAAKlC,UAAU,kBAAf,WACE,gBAAKA,UAAU,wBAAf,UACE,SAAC,EAAAwD,YAAD,CAAaC,YAAY,gBAAgBnB,MAAOtD,EAAQ0E,SAAUd,KAAKe,yBAEzE,iBAAK3D,UAAU,UAAf,iBACE,kBAAOA,UAAU,gBAAgB4D,QAAQ,qBAAzC,sBAIA,gBAAK5D,UAAU,WAAf,UACE,SAAC,EAAA6D,OAAD,CACEC,QAAS,qBACTC,QAASnB,KAAKoB,aACdN,SAAUd,KAAKqB,qBACf3B,MAAOM,KAAKS,wBAdpB,OAkBE,gBAAKrD,UAAU,6BACdkE,EAAAA,OAAAA,yBAAA,OACC,SAAC,EAAAxD,WAAD,CAAYJ,QAAQ,UAAUK,KAAK,kBAAnC,6BAIF,SAAC,EAAAN,OAAD,CAAQC,QAAQ,YAAYG,QAASmC,KAAKuB,YAA1C,oCAzBJ,OA6BE,SAACvD,EAAD,MACA,SAAC,EAAAjC,cAAD,CAAeC,QAAQ,OAAvB,SACGwC,EAAWgD,KAAKrF,IAEb,SAAC,EAAD,CACEA,KAAMA,EAENC,OAAQA,EACRC,cAAe,IAAM2D,KAAK3D,cAAcF,IAFnCA,EAAK+D,cAa5B,QAAejB,EAAUM,I,uIC7IlB,SAAST,EAAmBqC,GACjC,OAAOM,MAAAA,IACLvG,GAASwG,EAAAA,EAAAA,OACT,MAAMC,QAA8BC,EAAAA,EAAAA,iBAAgBC,IAAI,cAAeV,GACvEjG,GAAS4G,EAAAA,EAAAA,IAAiBH,KAIvB,SAAS3C,EAAqBkB,EAAYiB,GAC/C,OAAOM,MAAAA,UACCG,EAAAA,EAAAA,iBAAgBG,KAAM,eAAc7B,UAAYiB,GAEtDjG,EAAS4D,EAAmB,CAAElB,OADVgC,EAAAA,gBAAAA,kBAAkChC,OAAS,OACdoE,eAI9C,SAASC,EAA0BC,GACxC,OAAOT,MAAAA,IACL,UACQG,EAAAA,EAAAA,iBAAgBG,KAAM,2BAA2BG,GACvDhH,GAASiH,EAAAA,EAAAA,KAAUC,EAAAA,EAAAA,IAA0B,0BAC7CxC,EAAAA,gBAAAA,KAAqB,2BACrB,MAAOyC,GACPnH,GAASiH,EAAAA,EAAAA,KAAUG,EAAAA,EAAAA,IAAwBD,EAAMH,KAAKG,WAKrD,SAASE,EAA0BL,GACxC,OAAOT,MAAAA,IACL,UACQG,EAAAA,EAAAA,iBAAgBY,IAAK,4BAA2BN,EAAKhC,KAAMgC,GACjEhH,GAASiH,EAAAA,EAAAA,KAAUC,EAAAA,EAAAA,IAA0B,0BAC7C,MAAOC,GACPnH,GAASiH,EAAAA,EAAAA,KAAUG,EAAAA,EAAAA,IAAwBD,EAAMH,KAAKG,WAKrD,SAASI,EAAwBP,GACtC,OAAOT,MAAOvG,EAAUwH,KACtB,MAAMC,EAAUD,IAAWE,oBAAoBA,0BACzChB,EAAAA,EAAAA,iBAAgBG,KAAK,gCAArB,eAAwD7B,GAAIyC,EAAQzC,IAAOgC,KAI9E,SAASW,IACd,OAAOpB,MAAAA,IACL,MAEMqB,SAFsClB,EAAAA,EAAAA,iBAAgBC,IAAK,yBAExBkB,MAAK,CAACC,EAAIC,IAC7CD,EAAGhG,KAAOiG,EAAGjG,KACR,GAED,IAGV9B,GAASgI,EAAAA,EAAAA,IAAwBJ,KAI9B,SAASK,EAAwBjD,GACtC,OAAOuB,MAAAA,UACCvG,EAAS2H,KACf,MAAMD,QAA4BhB,EAAAA,EAAAA,iBAAgBC,IAAK,4BAA2B3B,KAClFhF,GAASkI,EAAAA,EAAAA,GAA0BR,O,gLCjEhC,MAAMS,EAAoB,KAC/B,MAAM,sBAAEC,EAAF,oBAAyBC,IAAwBC,EAAAA,EAAAA,KAEvD,OAAIF,GAAyBC,EAC3B,OACE,SAACE,EAAA,EAAD,CACE7H,MAAM,0CACN8H,WAAW,OACXC,WAAY,eACZC,YAAY,iBACZC,OAAO,oEACPC,WAAW,4BACXC,gBAAgB,aAChBC,aAAa,YAInB,OAAO,SAAC,EAAAC,iBAAD,CAAkBC,QAAQ,sBAAsBC,qBAAqB,uB,oECXvE,SAASC,IACd,MAAOC,EAAUC,IAAeC,EAAAA,EAAAA,WAAS,IAClCC,EAAQC,IAAaC,EAAAA,EAAAA,GAAgB,sCAAsC,GAC5EC,GAA2BC,EAAAA,EAAAA,IAA4BhH,GAAUA,EAAMiH,cACvEC,GAAmBF,EAAAA,EAAAA,IAA4BhH,GAAUA,EAAMmH,YAC/DC,GAAoBJ,EAAAA,EAAAA,IAA4BhH,GAAUA,EAAMqH,aAChEC,GAASC,EAAAA,EAAAA,YAAWC,GAEpBC,GAASC,EAAAA,EAAAA,UAAQ,KAAqB,QAC1C,MAAOC,EAAwBC,EAAmBC,GAAsB,CACtEd,EACAG,EACAE,GACAxD,KAAKkE,IACLC,EAAAA,EAAAA,MAAsBC,QACpB,CAACC,EAAQC,KAAe,MACtB,MAAMzD,EAAK,UAAGqD,EAASI,EAAW9I,aAAvB,aAAG,EAA2BqF,MACzC,OAAIqD,EAASI,EAAW9I,OAASqF,KAAU0D,EAAAA,EAAAA,IAA4BL,EAASI,EAAW9I,OAClF,IAAI6I,EAAQ,CAAEC,WAAAA,EAAYzD,MAAAA,IAE5BwD,IAET,MAGEG,EAAgB,UAAGlB,EAAiBmB,EAAAA,WAApB,aAAG,EAA6C5D,MAChE6D,EAAiB,UAAGlB,EAAkBiB,EAAAA,WAArB,aAAG,EAA8C5D,MAElEwD,EAAwB,GAoC9B,OAlCIG,GACFH,EAAOM,MAAK,uEAAuCH,EAAiB9B,SAAW,qBAE7EgC,GACFL,EAAOM,MAAK,wEAAwCD,EAAkBhC,SAAW,qBAGnFqB,EAAuBa,SAAQ,IAA2B,IAA1B,WAAEN,EAAF,MAAczD,GAAY,EACxDwD,EAAOM,MACL,mFACmD,KACjD,cAAGpI,KAAO,oBAAmB+H,EAAWO,MAAxC,SAAgDP,EAAW9I,OAF7D,KAEyEqF,EAAM6B,SAAW,wBAK9FsB,EAAkBY,SAAQ,QAAC,WAAEN,EAAF,MAAczD,GAAf,SACxBwD,EAAOM,MACL,oEACkC,cAAGpI,KAAO,oBAAmB+H,EAAWO,MAAxC,SAAgDP,EAAW9I,OAD7F,IACwG,IACrGqF,EAAM6B,SAAW,wBAKxBuB,EAAmBW,SAAQ,QAAC,WAAEN,EAAF,MAAczD,GAAf,SACzBwD,EAAOM,MACL,qEACmC,cAAGpI,KAAO,oBAAmB+H,EAAWO,MAAxC,SAAgDP,EAAW9I,OAD9F,IACyG,IACtGqF,EAAM6B,SAAW,wBAKjB2B,IACN,CAAClB,EAA0BG,EAAkBE,IAEhD,OACE,kCACKK,EAAOiB,QAAU9B,IAClB,SAAC+B,EAAD,CAAoBC,MAAOnB,EAAOiB,OAAQzI,QAAS,IAAM4G,GAAWD,IAAYA,QAE/Ea,EAAOiB,SAAW9B,IACnB,UAAC,EAAAvG,MAAD,CACE,cAAY,2BACZrC,MAAM,uBACNsC,SAAS,QACTuI,SAAU,IAAMhC,GAAU,GAJ5B,UAMGJ,GAAYgB,EAAO7D,KAAI,CAAC7C,EAAM+H,KAAQ,yBAAgB/H,GAAN+H,MAC/CrC,IACA,iCACE,yBAAMgB,EAAO,KACZA,EAAOiB,QAAU,IAChB,UAAC,EAAA7I,OAAD,CACEL,UAAW8H,EAAOyB,WAClBC,KAAK,OACLjJ,KAAK,cACLT,KAAK,KACLW,QAAS,IAAMyG,GAAY,GAL7B,UAOGe,EAAOiB,OAAS,EAPnB,SAO4BO,GAAAA,CAAU,QAASxB,EAAOiB,OAAS,eAgB/E,MAAMC,EAA4C,IAAwB,IAAvB,MAAEC,EAAF,QAAS3I,GAAc,EACxE,MAAMqH,GAASC,EAAAA,EAAAA,YAAWC,GAE1B,OACE,gBAAKhI,UAAW8H,EAAO4B,WAAvB,UACE,SAAC,EAAAC,QAAD,CAASC,QAAQ,kBAAkBC,UAAU,SAA7C,UACE,SAAC,EAAAxJ,OAAD,CAAQmJ,KAAK,OAAOlJ,QAAQ,cAAcC,KAAK,uBAAuBE,QAASA,EAA/E,SACG2I,EAAQ,GAAI,gCAAGA,EAAH,cAAsB,iDAOvCpB,EAAa8B,IAAD,CAChBP,WAAYQ,EAAAA,GAAI;;IAGhBL,WAAYK,EAAAA,GAAI;;;4IChHX,SAASC,EAAoBnH,GAAkC,QACpE,MAAM,UAAEoH,EAAF,MAAaC,EAAb,QAAoBC,GAAYtH,EAChCiF,GAASC,EAAAA,EAAAA,YAAWC,GACpBlK,GAAWC,EAAAA,EAAAA,gBACX,QAAEqM,EAAF,MAAWnF,EAAX,WAAkBoF,GAAlB,WACJ7C,EAAAA,EAAAA,IAA4BhH,GAAUA,EAAM8J,sCADxC,QACyEC,EAAAA,GAEzEC,GAAgBtC,EAAAA,EAAAA,UACpB,iBAAmB,CACjBuC,cAAeR,EAAUrK,KACzB8K,UAAWR,EAAMtK,KACjB+K,cAAa,UAAET,EAAMU,gBAAR,QAAoB,MAEnC,CAACX,EAAWC,KAId/L,EAAAA,EAAAA,YAAU,MACJkM,GAAeD,GAAYnF,GAC7BkF,MAED,CAACE,EAAYD,EAASD,EAASlF,KAElCrH,EAAAA,EAAAA,IAAY4C,GAAUA,EAAMqK,gBAAgBP,+BAe5C,OACE,SAAC,EAAA/L,MAAD,CACEyB,UAAW8H,EAAOgD,MAClBrM,QAAQ,EACRD,MAAM,+BACNF,UAAW6L,EACXzL,gBAAiByL,EALnB,UAOE,SAAC,EAAAY,KAAD,CAAMP,cAAeA,EAAeQ,SArBtBC,IAChBnN,GACEoN,EAAAA,EAAAA,IAAmC,CACjCC,iBAAiBC,EAAAA,EAAAA,IAAmBnB,EAAUoB,aAC9CX,UAAWR,EAAMtK,KACjB0L,aAAcL,EAAOP,UACrBD,cAAeR,EAAUrK,KACzB2L,iBAAkBN,EAAOR,cACzBE,cAAeM,EAAON,oBAAiBa,MAazC,SACG,kBAAC,SAAEC,EAAF,OAAYxD,EAAQyD,WAAW,QAAEC,IAAlC,SACC,iCACE,SAAC,EAAAC,MAAD,CAAOvJ,MAAM,YAAYwJ,UAAW5D,EAAOwC,cAAexF,MAAK,UAAEgD,EAAOwC,qBAAT,aAAE,EAAsB3D,QAAvF,UACE,SAAC,EAAAgF,MAAD,eACEhJ,GAAG,iBACC2I,EAAS,gBAAiB,CAC5BM,SAAU,qCAIhB,SAAC,EAAAH,MAAD,CAAOvJ,MAAM,aAAawJ,UAAW5D,EAAOyC,UAAWzF,MAAK,UAAEgD,EAAOyC,iBAAT,aAAE,EAAkB5D,QAAhF,UACE,SAAC,EAAAgF,MAAD,eACEhJ,GAAG,aACC2I,EAAS,YAAa,CACxBM,SAAU,sCAIhB,SAAC,EAAAH,MAAD,CACEvJ,MAAM,iCACNwJ,UAAW5D,EAAO0C,cAClB1F,MAAK,UAAEgD,EAAO0C,qBAAT,aAAE,EAAsB7D,QAH/B,UAKE,SAAC,EAAAgF,MAAD,eACEhJ,GAAG,gBACHW,YAAY,MACRgI,EAAS,gBAAiB,CAC5BO,QAASC,EAAAA,UAKf,UAAC,EAAA1N,MAAA,UAAD,kBACE,SAAC,EAAA8B,OAAD,CAAQC,QAAQ,YAAY4L,KAAK,SAASC,SAAU/B,EAAS3J,QAAS0J,EAASX,KAAK,UAApF,qBAGA,SAAC,EAAAnJ,OAAD,CAAQ6L,KAAK,SAASC,UAAWR,GAAWvB,EAA5C,SACGA,EAAU,YAAc,yBAtC0BgC,KAAKC,UAAU7B,MAgDlF,MAAMxC,EAAY,KAAM,CACtB8C,MAAOf,EAAAA,GAAI;;qBC9GN,MAAMuC,EAA8B,IAA0B,IAAzB,SAAEC,EAAF,OAAYC,GAAa,EACnE,MAAM1E,GAASC,EAAAA,EAAAA,YAAWC,GAE1B,OAAO,iBAAMhI,UAAW8H,EAAO0E,GAAxB,SAAkCD,GAAYC,KAGjDxE,EAAa8B,IAAD,CAChB,CAAC2C,EAAAA,GAAAA,UAAiC1C,EAAAA,GAAI;aAC3BD,EAAM4C,OAAOC,QAAQpN;IAEhC,CAACkN,EAAAA,GAAAA,SAAgC1C,EAAAA,GAAI;aAC1BD,EAAM4C,OAAOE,QAAQrN;IAEhC,CAACkN,EAAAA,GAAAA,QAA+B1C,EAAAA,GAAI;aACzBD,EAAM4C,OAAOzH,MAAM1F;IAE9BsN,QAAS9C,EAAAA,GAAI;aACFD,EAAM4C,OAAOnN,KAAKuN;cCZ/B,MAAMC,EAAa,CACjBC,MAAO,EACPC,UAAW,EACX,CAACR,EAAAA,GAAAA,QAA+B,EAChC,CAACA,EAAAA,GAAAA,SAAgC,EACjC,CAACA,EAAAA,GAAAA,UAAiC,EAClCxH,MAAO,GAGIiI,EAAuB,IAAwD,IAAvD,aAAEC,EAAF,cAAgBC,EAAhB,MAA+BlD,EAA/B,WAAsCmD,GAAiB,EAC1F,MAAMC,GAAapF,EAAAA,EAAAA,UAAQ,KACzB,MAAMqF,EAAQ,OAAH,UAAQR,GACbS,EAAYzO,IAAuB,QACnCA,EAAK0O,WAAYC,EAAAA,EAAAA,IAAe3O,EAAK0O,YACvCF,EAAMxO,EAAK0O,SAASjN,QAAU,GAEF,SAA1B,UAAAzB,EAAK0O,gBAAL,eAAeE,SAA8C,WAA1B,UAAA5O,EAAK0O,gBAAL,eAAeE,UACpDJ,EAAMtI,OAAS,IAGdlG,EAAK0O,WAAYG,EAAAA,EAAAA,IAAgB7O,EAAK0O,WACtC1O,EAAK8O,YAAaC,EAAAA,EAAAA,IAAqB/O,EAAK8O,cAE7CN,EAAMN,WAAa,GAErBM,EAAMP,OAAS,GAQjB,OANI9C,GACFA,EAAM3F,MAAMyE,QAAQwE,GAElBH,GACFA,EAAWrE,SAASiB,GAAcA,EAAU8D,OAAO/E,SAASkB,GAAUA,EAAM3F,MAAMyE,QAAQwE,OAErFD,IACN,CAACrD,EAAOmD,IAELW,EAAqC,GAqC3C,OApCIV,EAAWb,EAAAA,GAAAA,SACbuB,EAAgBjF,MACd,UAACuD,EAAD,CAA+BE,OAAQC,EAAAA,GAAAA,OAAvC,UACGa,EAAWb,EAAAA,GAAAA,QADd,YAAsB,WAKtBa,EAAWrI,OACb+I,EAAgBjF,MACd,UAACuD,EAAD,CAA+BE,OAAQC,EAAAA,GAAAA,OAAvC,UACGa,EAAWrI,MADd,YAAsB,WAKtBqI,EAAWb,EAAAA,GAAAA,UACbuB,EAAgBjF,MACd,UAACuD,EAAD,CAAgCE,OAAQC,EAAAA,GAAAA,QAAxC,UACGa,EAAWb,EAAAA,GAAAA,SADd,aAAsB,YAKtBU,GAAgBG,EAAWb,EAAAA,GAAAA,WAC7BuB,EAAgBjF,MACd,UAACuD,EAAD,CAAiCE,OAAO,UAAxC,UACGc,EAAWb,EAAAA,GAAAA,UADd,YAAsB,aAKtBW,GAAiBE,EAAWL,WAC9Be,EAAgBjF,MACd,UAACuD,EAAD,CAAkCE,OAAO,UAAzC,UACGc,EAAWL,UADd,eAAsB,eAOxB,4BACE,4BACGK,EAAWN,MADd,IACsBvD,GAAAA,CAAU,OAAQ6D,EAAWN,YAEhDgB,EAAgB9E,SACjB,uCACE,kCACC8E,EAAgBxF,QACf,CAACyF,EAAMC,EAAM5E,IACX2E,EAAK/E,OACD,CACE+E,GACA,SAAC,EAAAE,SAAD,iBACE,mCADa7E,GAGf4E,GAEF,CAACA,IACP,W,uBC9EL,MAAME,EAAwBC,EAAAA,MAAW,IAAqC,UAApC,MAAEnE,EAAF,UAASD,EAAT,UAAoBqE,GAAgB,EACnF,MAAM,YAAEjD,GAAgBpB,EAClBnM,GAAWC,EAAAA,EAAAA,eACX+J,GAASC,EAAAA,EAAAA,YAAWC,IAEnBuG,EAAgBC,IAAqBrH,EAAAA,EAAAA,WAAS,IAC9CsH,EAAiBC,IAAsBvH,EAAAA,EAAAA,WAAS,IAChDwH,EAAaC,IAAkBzH,EAAAA,EAAAA,WAAUmH,IAE1C,aAAEO,IAAiBzI,EAAAA,EAAAA,MAEzBjI,EAAAA,EAAAA,YAAU,KACRyQ,GAAgBN,KACf,CAACA,IAEJ,MAAM,SAAEQ,EAAF,iBAAYC,IAAqBC,EAAAA,EAAAA,KACjCnB,EAAS,UAAG3D,EAAM3F,MAAM,UAAf,aAAG,EAAgBsJ,UAC5BoB,EAAapB,IAAaqB,EAAAA,EAAAA,IAAmBrB,IAAcA,EAAUsB,cAAcC,oBAAkB5D,GACrG,OAAE6D,IAAWC,EAAAA,EAAAA,GAAUL,GAGvBM,EACJT,EAASzD,IAAgB0D,EAAiB1D,KAAiBnB,EAAM3F,MAAMiL,MAAMzQ,KAAWA,EAAK8O,YACzF4B,GAAcC,EAAAA,EAAAA,IAAqBxF,GAOnCyF,EAAiC,GAGvC,GAAIJ,EACFI,EAAY5G,KAAZ,OACE,UAAC,EAAA6G,gBAAD,YACE,SAAC,EAAAC,QAAD,IADF,aAAqB,sBAKlB,GAAIxE,IAAgBxC,EAAAA,IACzB,GAAIoG,EAAW,CACb,MAAMa,EAAW,iBAAgBb,KAAac,EAAAA,EAAAA,cAAkB9F,EAAUrK,QACtEyP,MAAAA,GAAAA,EAAQW,SACVL,EAAY5G,MACV,SAACkH,EAAAC,EAAD,CACE,aAAW,cAEX3P,KAAK,MACL4P,QAAQ,cACRC,GAAIN,EAAU,YACdO,OAAO,WAJH,SAQNhB,MAAAA,GAAAA,EAAQiB,UACVX,EAAY5G,MACV,SAACkH,EAAAC,EAAD,CACE,aAAW,qBAEX3P,KAAK,OACL4P,QAAQ,qBACRC,GAAIN,EAAU,eACdO,OAAO,WAJH,uBASHxB,EAAaxD,EAAYzL,OAASkP,EAASzD,KAC/CoE,GACHE,EAAY5G,MACV,SAACkH,EAAAC,EAAD,CACE,aAAW,kBACX,cAAY,aAEZ3P,KAAK,MACL4P,QAAQ,kBACR1P,QAAS,IAAM+N,GAAkB,IAH7B,SAQVmB,EAAY5G,MACV,SAACkH,EAAAC,EAAD,CACE,aAAW,oBACX,cAAY,eAEZ3P,KAAK,YACL4P,QAAQ,oBACR1P,QAAS,IAAMiO,GAAmB,IAH9B,kBASV,MACMhE,EAD6B,YAAfR,EAAMtK,MAExB,SAAC2Q,EAAA,EAAD,CAActG,UAAWA,EAAUrK,QAEnC,SAAC2Q,EAAA,EAAD,CAActG,UAAWA,EAAUrK,KAAMsK,MAAOA,EAAMtK,OAGxD,OACE,iBAAKI,UAAW8H,EAAO0I,QAAS,cAAY,aAA5C,WACE,iBAAKxQ,UAAW8H,EAAO2I,OAAQ,cAAY,oBAA3C,WACE,SAACC,EAAA,EAAD,CACE1Q,UAAW8H,EAAO6I,eAClBhC,YAAaA,EACbiC,SAAUhC,EACV,cAAY,2BAEd,SAAC,EAAA/O,KAAD,CAAMD,KAAM+O,EAAc,SAAW,iBACpCkC,EAAAA,EAAAA,IAAmBxF,KAClB,SAAC,EAAA1B,QAAD,CAASC,QAASyB,EAAYzL,KAAMiK,UAAU,MAA9C,UACE,gBACE/K,IAAKuM,EAAYyF,KAAKlR,KACtBI,UAAW8H,EAAOiJ,eAClBlS,IAAKwM,EAAYyF,KAAK1Q,KAAK4Q,MAAMC,WAIvC,gBAAIjR,UAAW8H,EAAOoJ,QAAtB,UACGzB,IAAW,OAAI,SAAC,EAAA0B,MAAD,CAAOC,MAAM,SAAS7R,KAAK,gBAD7C,IAC8DmL,MAE9D,gBAAK1K,UAAW8H,EAAOuJ,UACvB,gBAAKrR,UAAW8H,EAAOwJ,YAAvB,UACE,SAACpE,EAAD,CAAWC,cAAc,EAAOjD,MAAOA,QAEtCyF,EAAYzG,SACb,iCACE,gBAAKlJ,UAAW8H,EAAOyJ,iBAAvB,gBACA,gBAAKvR,UAAW8H,EAAO6H,YAAvB,SAAqCA,WAIzChB,IACA,SAAC6C,EAAA,EAAD,CAAYC,mBAAmB,EAAMzR,UAAW8H,EAAO4J,WAAYC,gBAAgB,EAAMpN,MAAO2F,EAAM3F,QAEvGgK,IACC,SAACvE,EAAD,CAAqBE,MAAOA,EAAOD,UAAWA,EAAWE,QAAS,IAAMqE,GAAkB,MAE5F,SAAC,EAAAoD,aAAD,CACEnT,OAAQgQ,EACRjQ,MAAM,eACNqT,MACE,0FAEE,mBAFF,OAGO3H,EAAM3F,MAAM2E,OAHnB,UAGkCO,GAAAA,CAAU,OAAQS,EAAM3F,MAAM2E,QAHhE,2BAIE,mBAJF,iDAQF4I,UAhIc,KAClBhU,GAASiU,EAAAA,EAAAA,IAAuB9H,EAAWC,IAC3CwE,GAAmB,IA+HfpQ,UAAW,IAAMoQ,GAAmB,GACpCsD,YAAY,iBAMpB5D,EAAW6D,YAAc,aAElB,MAAMjK,EAAa8B,IAAD,CACvB0G,QAASzG,EAAAA,GAAI;;oBAEKD,EAAMlL,QAAQ;;IAGhC6R,OAAQ1G,EAAAA,GAAI;;;;eAICD,EAAMlL,QAAQ,MAAMkL,EAAMlL,QAAQ,MAAMkL,EAAMlL,QAAQ;wBAC7CkL,EAAM4C,OAAOwF,WAAWpF;;IAG9CwE,YAAavH,EAAAA,GAAI;;;;;MAKbD,EAAMqI,YAAYC,KAAK;;;sBAGPtI,EAAMlL,QAAQ;;IAGlCsS,QAASnH,EAAAA,GAAI;mBACID,EAAMlL,QAAQ;;IAG/ByS,OAAQtH,EAAAA,GAAI;;IAGZ4G,eAAgB5G,EAAAA,GAAI;;;mBAGHD,EAAMlL,QAAQ;sBACXkL,EAAMlL,QAAQ;;;;;IAMlCmS,eAAgBhH,EAAAA,GAAI;aACTD,EAAMlL,QAAQ;cACbkL,EAAMlL,QAAQ;mBACTkL,EAAMlL,QAAQ;IAE/ByT,iBAAkBtI,EAAAA,GAAI;;aAEXD,EAAM4C,OAAOnN,KAAK4M;IAE7BoF,iBAAkBxH,EAAAA,GAAI;gBACRD,EAAMlL,QAAQ;IAE5B+Q,YAAa5F,EAAAA,GAAI;;qBAEED,EAAMlL,QAAQ;;IAGjC8S,WAAY3H,EAAAA,GAAI;kBACAD,EAAMlL,QAAQ;sBC3OzB,MAAM0T,GAAwB,IAA+B,IAA9B,WAAEjF,EAAF,UAAciB,GAAgB,EAClE,MAAMxG,GAASC,EAAAA,EAAAA,YAAWC,IAEpBuK,GAAY/K,EAAAA,EAAAA,IAA4BhH,GAAUA,EAAMiH,cACxDlD,GAAQiD,EAAAA,EAAAA,IAA4BhH,GAAUA,EAAMmH,YACpD6K,GAAmBtK,EAAAA,EAAAA,SAAQK,EAAAA,GAAqB,IAEhDkK,GAAqBvK,EAAAA,EAAAA,UACzB,IAAMsK,EAAiBlR,QAAQoR,IAAD,eAAQ,UAAAnO,EAAMmO,EAAG9S,aAAT,eAAgBwK,WAAhB,UAA2BmI,EAAUG,EAAG9S,aAAxC,aAA2B,EAAoBwK,aACrF,CAAC7F,EAAOgO,EAAWC,IAGrB,OACE,qBAASxS,UAAW8H,EAAO0I,QAA3B,WACE,iBAAKxQ,UAAW8H,EAAO6K,cAAvB,mBACE,mDACCF,EAAmBvJ,QAClB,SAAC,EAAA0J,mBAAD,CACE5S,UAAW8H,EAAO+K,OAClBtT,KAAO,sBAAqBkT,EAAmBvJ,UAAUO,GAAAA,CAAU,SAAUgJ,EAAmBvJ,YAHnG,SAMC,uBAIHmE,EAAWjJ,KAAK6F,IACf,MAAM,OAAE8D,EAAF,YAAU1C,GAAgBpB,EAChC,OAAO8D,EAAO3J,KAAK8F,IACjB,SAACkE,EAAD,CACElE,MAAOA,EAEPD,UAAWA,EACXqE,UAAWA,GAFL,IAAElD,EAAAA,EAAAA,IAAmBC,MAAgBzL,QAAQsK,EAAMtK,aAMvC,KAAvByN,MAAAA,OAAA,EAAAA,EAAYnE,WAAkBsJ,EAAiBtJ,SAA/C,SAAyD,8CACxDsJ,EAAiBtJ,SAAlB,SAA4B,2FAK7BlB,GAAa8B,IAAD,CAChB+I,OAAQ9I,EAAAA,GAAI;;IAGZ4I,cAAe5I,EAAAA,GAAI;;;IAInByG,QAASzG,EAAAA,GAAI;qBACMD,EAAMgJ,GAAGlU,QAAQmU;+BClD/B,MAAMC,GAA0B,IAA+B,IAA9B,WAAE3F,EAAF,UAAciB,GAAgB,EACpE,MAAMxG,GAASmL,EAAAA,EAAAA,WAAUjL,KAClB5E,IAAe8P,EAAAA,EAAAA,MAEhB,QAAE9I,IAAY5C,EAAAA,EAAAA,IACjBhH,GAAUA,EAAMmH,UAAUkB,EAAAA,KAA8B0B,EAAAA,KAIrD4I,EAD2C,YAAxB/P,EAAW,KACQiK,GAAa+F,EAAAA,GAAAA,IAA2B/F,GAEpF,OACE,qBAASrN,UAAW8H,EAAO0I,QAA3B,WACE,iBAAKxQ,UAAW8H,EAAO6K,cAAvB,mBACE,qCACCvI,GAAU,SAAC,EAAAwI,mBAAD,CAAoB5S,UAAW8H,EAAO+K,OAAQtT,KAAK,eAAtD,SAAwE,uBAGjF4T,MAAAA,OANH,EAMGA,EAAkB/O,KAAK6F,GACtBA,EAAU8D,OAAO3J,KAAK8F,IACpB,SAACkE,EAAD,CACElE,MAAOA,EAEPD,UAAWA,EACXqE,UAAWA,GAFL,GAAErE,EAAUrK,QAAQsK,EAAMtK,YAMR,KAA7BuT,MAAAA,OAAA,EAAAA,EAAkBjK,UAAlB,SAAkC,iDAKnClB,GAAa8B,IAAD,CAChB+I,OAAQ9I,EAAAA,GAAI;;IAGZ4I,cAAe5I,EAAAA,GAAI;;;IAInByG,QAASzG,EAAAA,GAAI;qBACMD,EAAMlL,QAAQmU;sBC3C5B,MAAMM,GAAkC,IAAgD,IAA/C,MAAE9O,EAAF,MAAS/D,EAAT,iBAAgB8S,GAAmB,GAAY,EAC7F,MAAOC,EAAWC,IAAgBrM,EAAAA,EAAAA,UAASmM,GACrCxL,GAASC,EAAAA,EAAAA,YAAWC,IAC1B,OACE,iCACE,gBAAIhI,UAAW8H,EAAO2I,OAAtB,WACE,SAACC,EAAA,EAAD,CACE1Q,UAAW8H,EAAO6I,eAClB7Q,KAAK,MACL6O,YAAa4E,EACb3C,SAAU,IAAM4C,GAAcD,MAE/BE,EAAAA,EAAAA,IAAqBjT,GAPxB,KAOkC+D,EAAM2E,OAPxC,QASEqK,IAAa,SAAC/B,EAAA,EAAD,CAAYxR,UAAW8H,EAAO4J,WAAYnN,MAAOA,EAAOmP,iBAAiB,QAKxF1L,GAAa8B,IAAD,CAChB6G,eAAgB5G,EAAAA,GAAI;;IAGpB0G,OAAQ1G,EAAAA,GAAI;kBACID,EAAMlL,QAAQ;IAE9B8S,WAAY3H,EAAAA,GAAI;kBACAD,EAAMlL,QAAQ;6DChChC,MAAM+U,GAAiC,CACrC,CACEpT,KAAM,UACN8B,MAAO,OACPC,MAAO,QAET,CACE/B,KAAM,SACN8B,MAAO,UACPC,MAAO,WAET,CACE/B,KAAM,aACN8B,MAAO,QACPC,MAAO,UAILsR,GAAqC,CACzC,CACEvR,MAAO,SACPC,MAAOuR,EAAAA,GAAAA,UAET,CACExR,MAAO,aACPC,MAAOuR,EAAAA,GAAAA,YA2IL7L,GAAa8B,IACV,CACLgK,UAAW/J,EAAAA,GAAI;;;wBAGKD,EAAMlL,QAAQmV;uBACfjK,EAAMlL,QAAQmV;MAEjCC,WAAYjK,EAAAA,GAAI;;;MAIhBkK,QAASlK,EAAAA,GAAI;;;;;;MAObmK,aAAcnK,EAAAA,GAAI;;MAGlBoK,SAAUpK,EAAAA,GAAI;kBACAD,EAAMlL,QAAQmV;MAE5BK,YAAarK,EAAAA,GAAI;oBACDD,EAAMlL,QAAQmV;QAKlC,GAtKoB,KAAM,MACxB,MAAO3Q,EAAaiR,IAAkBnB,EAAAA,EAAAA,MAE/BoB,EAAWC,IAAgBpN,EAAAA,EAAAA,UAAiBqN,KAAKC,MAAsB,IAAhBD,KAAKE,WAC7DC,EAAiB,cAAaL,IAC9BM,EAAkB,eAAcN,KAEhC,WAAE5L,EAAF,WAAcmM,EAAd,YAA0BC,EAA1B,SAAuCC,IAAaC,EAAAA,GAAAA,IAAwB5R,GAE5E0E,GAASmL,EAAAA,EAAAA,WAAUjL,IACnBiN,EAAeC,OAAOC,QAAQ1I,EAAAA,IAAuBrI,KAAI,QAAEgR,EAAK9S,GAAP,QAAmB,CAChFD,OAAOoR,EAAAA,EAAAA,IAAqBnR,GAC5BA,MAAAA,MAWI+S,GAA0BC,EAAAA,GAAAA,WAAUC,IACxC,MAAMlF,EAASkF,EAAElF,OACjBgE,EAAe,CAAES,YAAazE,EAAO/N,OAAS,SAC7C,KAwBGkT,EAAa,KAAH,IAAG,SAAC,EAAA3V,KAAD,CAAMD,KAAM,YAC/B,OACE,iBAAKI,UAAW8H,EAAOgM,UAAvB,WACE,SAAC,EAAAlI,MAAD,CAAO5L,UAAW8H,EAAOkM,WAAY3R,MAAM,wBAA3C,UACE,SAAC,GAAAoT,iBAAD,CAEEC,UAAQ,EACRC,WAAS,EACTlS,YAAY,mBACZvF,QAASwK,EACThF,SA7CwBkS,IAC9BvB,EAAe,CAAE3L,WAAYkN,EAAgBhW,QA6CvCiW,QA1CgB,KACtBxB,EAAe,CAAE3L,WAAY,SAmClBiM,MAST,iBAAK3U,WAAW8V,EAAAA,EAAAA,IAAGhO,EAAOmM,QAASnM,EAAOoM,cAA1C,WACE,iBAAKlU,UAAW8H,EAAOmM,QAAvB,WACE,SAAC,EAAArI,MAAD,CACE5L,UAAW8H,EAAOqM,SAClB9R,MAAK,SACH,SAAC,EAAA0T,MAAD,WACE,UAAC,GAAAC,MAAD,CAAOC,IAAK,GAAZ,WACE,+CACA,SAAC,EAAAtM,QAAD,CACEC,SACE,gFAEE,0BAAQ,wDAJd,UAQE,SAAC,EAAA/J,KAAD,CAAMD,KAAK,cAAcE,KAAK,eAdxC,UAoBE,SAAC,EAAAgM,MAAD,CAEE9L,UAAW8H,EAAOkM,WAClBkC,OAAQV,EACR9R,SAAU2R,EACVc,aAAcrB,EACdrR,YAAY,SACZ,cAAY,sBANPmR,MAST,iBAAK5U,UAAW8H,EAAOqM,SAAvB,mBACE,SAAC,EAAA4B,MAAD,sBACA,SAAC,EAAAK,iBAAD,CAAkBrS,QAASkR,EAAc3S,MAAOuS,EAAYnR,SAtEtCpB,IAC9B+R,EAAe,CAAEQ,WAAYvS,WAuEvB,iBAAKtC,UAAW8H,EAAOqM,SAAvB,mBACE,SAAC,EAAA4B,MAAD,0BACA,SAAC,EAAAK,iBAAD,CACErS,QAAS6P,GACTtR,MAAOyS,EACPrR,SArEkBqR,IAC5BV,EAAe,CAAEU,SAAAA,WAuEX,iBAAK/U,UAAW8H,EAAOqM,SAAvB,mBACE,SAAC,EAAA4B,MAAD,wBACA,SAAC,EAAAK,iBAAD,CACErS,QAAS4P,GACTrR,MAAO+T,OAAM,UAACjT,EAAW,YAAZ,QAAwBuQ,GAAY,GAAGrR,OACpDoB,SAjFc4S,IACxBjC,EAAe,CAAEiC,KAAAA,cAoFX5N,GAAcmM,GAAcC,GAAeC,KAC3C,gBAAK/U,UAAW8H,EAAOmM,QAAvB,UACE,SAAC,EAAA5T,OAAD,CACEL,UAAW8H,EAAOsM,YAClBmC,WAAW,EACXhW,KAAK,QACLD,QAAQ,YACRG,QApFoB,KAC9B4T,EAAe,CACbQ,WAAY,KACZC,YAAa,KACbpM,WAAY,KACZqM,SAAU,OAEZyB,YAAW,IAAMjC,EAAaD,EAAY,IAAI,MAwEtC,oC,gBCtJL,MAiBDmC,GAAoBC,GACjB,CAACC,EAAuC1M,KAC7C,MAAM8D,EAAS9D,EAAU8D,OAAOvF,OAAOoO,GAAaF,GAAU,IAS9D,OAPI3I,EAAO7E,QACTyN,EAAa5N,KAAb,iBACKkB,EADL,CAEE8D,OAAAA,KAIG4I,GAKLC,GAAgBF,GACb,CAACG,EAA+B3M,KACrC,MAAM3F,EAAQ2F,EAAM3F,MAAMjD,QAAQvC,IAAS,MACzC,GAAI2X,EAAQ3B,UAAY2B,EAAQ3B,YAAR,UAAqBhW,EAAK0O,gBAA1B,aAAqB,EAAevB,MAC1D,OAAO,EAET,GAAIwK,EAAQhO,aAAcwG,EAAAA,EAAAA,IAAmBnQ,EAAK8O,aAAeiJ,GAAqB/X,EAAK8O,UAAW6I,GACpG,OAAO,EAGT,GAAIA,EAAQ5B,YAAa,OACvB,MAAMiC,EAAwBL,EAAQ5B,YAAYkC,oBAC5CC,EAA2B,UAAGlY,EAAKa,YAAR,aAAG,EAAWoX,oBAAoBE,SAASH,GACtEI,GAAWC,EAAAA,GAAAA,IAAcV,EAAQ5B,aAEjCuC,GAAyBC,EAAAA,GAAAA,IAAoBvY,EAAKwY,OAAQJ,GAC1DK,EACJzY,EAAK0O,UACL1O,EAAK0O,SAASvB,OAAS2H,EAAAA,GAAAA,UACvB9U,EAAK0O,SAASgK,QACd1Y,EAAK0O,SAASgK,OAAOC,MAAMC,IAAUL,EAAAA,GAAAA,IAAoBK,EAAMJ,OAAQJ,KAEzE,KAAMF,GAA+BI,GAA0BG,GAC7D,OAAO,EAGX,UACEd,EAAQ7B,YACN9V,EAAK0O,WAAYC,EAAAA,EAAAA,IAAe3O,EAAK0O,WAAa1O,EAAK0O,SAASjN,QAAUkW,EAAQ7B,eAaxF,OANItQ,EAAM2E,QACR2N,EAAS9N,KAAT,iBACKmB,EADL,CAEE3F,MAAAA,KAGGsS,GAILC,GAAuB,CAACjJ,EAAgCvM,KACvDA,EAAOoH,cAIHmF,EAAUsB,cAAcrK,KAAK0K,MAAMoI,IAC1C,IAAKA,EAAMC,cACT,OAAO,EAET,MAAMnF,GAAKoF,EAAAA,GAAAA,oBAAmBC,oBAAoBH,EAAMC,eACxD,OAAOnF,MAAAA,OAAA,EAAAA,EAAI9S,QAAS0B,EAAOoH,c,yBC3E/B,MAAMsP,GAAQ,CACZjK,OCV0C,IAA+B,IAA9B,WAAEV,EAAF,UAAciB,GAAgB,EACzE,MAAO2J,EAAmBC,IAAmBhQ,EAAAA,EAAAA,UAAQ,KACnD,MAAMiQ,EAAS9K,EACZjJ,KAAK6F,GAAD,iBACAA,EADA,CAEH8D,OAAQ9D,EAAU8D,OAAOpI,MAAK,CAACyS,EAAGC,IAAMD,EAAExY,KAAK0Y,cAAcD,EAAEzY,YAEhE+F,MAAK,CAACyS,EAAGC,IAAMD,EAAExY,KAAK0Y,cAAcD,EAAEzY,QACzC,MAAO,CACLuY,EAAO7W,QAAQiX,IAAOC,EAAAA,EAAAA,IAAqBD,EAAGlN,eAC9C8M,EAAO7W,QAAQiX,IAAO1H,EAAAA,EAAAA,IAAmB0H,EAAGlN,kBAE7C,CAACgC,IAEJ,OACE,iCACE,SAACoL,EAAA,EAAD,CAAWC,QAAS,CAACC,EAAAA,GAAAA,kBAArB,UACE,SAAC3F,GAAD,CAAc3F,WAAY4K,EAAmB3J,UAAWA,OAE1D,SAACmK,EAAA,EAAD,CAAWC,QAAS,CAACC,EAAAA,GAAAA,0BAArB,UACE,SAACrG,GAAD,CAAYjF,WAAY6K,EAAiB5J,UAAWA,UDT1D9N,MET0C,IAAoB,IAAnB,WAAE6M,GAAiB,EAC9D,MAAMqJ,GAAU1B,EAAAA,GAAAA,KAAwB9B,EAAAA,EAAAA,KAAiB,IAEnD0F,GAAe1Q,EAAAA,EAAAA,UAAQ,KAC3B,MAAMO,EAAuB,CAC3B,CAACgE,EAAAA,GAAAA,QAA+B,GAChC,CAACA,EAAAA,GAAAA,UAAiC,GAClC,CAACA,EAAAA,GAAAA,SAAgC,IAenC,OAZAY,EAAWrE,SAASiB,GAClBA,EAAU8D,OAAO/E,SAASkB,GACxBA,EAAM3F,MAAMyE,SAASjK,IACfA,EAAK0O,WAAYC,EAAAA,EAAAA,IAAe3O,EAAK0O,WACvChF,EAAO1J,EAAK0O,SAASjN,OAAOuI,KAAKhK,UAMzCmW,OAAOjK,OAAOxC,GAAQO,SAASzE,GAAUA,EAAMoB,MAAK,CAACyS,EAAGC,IAAMD,EAAExY,KAAK0Y,cAAcD,EAAEzY,UAE9E6I,IACN,CAAC4E,IACJ,OACE,kCACKqJ,EAAQ7B,YAAc6B,EAAQ7B,aAAepI,EAAAA,GAAAA,UAC9C,SAAC4G,GAAD,CAAsB7S,MAAOiM,EAAAA,GAAAA,OAA8BlI,MAAOqU,EAAanM,EAAAA,GAAAA,YAE9EiK,EAAQ7B,YAAc6B,EAAQ7B,aAAepI,EAAAA,GAAAA,WAC9C,SAAC4G,GAAD,CACE7S,MAAOiM,EAAAA,GAAAA,QACPlI,MAAOqU,EAAanM,EAAAA,GAAAA,aAGrBiK,EAAQ7B,YAAc6B,EAAQ7B,aAAepI,EAAAA,GAAAA,YAC9C,SAAC4G,GAAD,CACEC,iBAAkBoD,EAAQ7B,aAAepI,EAAAA,GAAAA,SACzCjM,MAAOiM,EAAAA,GAAAA,SACPlI,MAAOqU,EAAanM,EAAAA,GAAAA,iBF3BxBoM,IAAWC,EAAAA,EAAAA,oBACf,KACE,MAAMhb,GAAWC,EAAAA,EAAAA,eACX+J,GAASC,EAAAA,EAAAA,YAAWC,IACpB+Q,GAAuB7Q,EAAAA,EAAAA,SAAQ8Q,EAAAA,GAAwB,IACvDC,GAAWC,EAAAA,EAAAA,OACV5K,EAAW6K,IAAgBhS,EAAAA,EAAAA,WAAS,IAEpC/D,IAAe8P,EAAAA,EAAAA,KAChBwD,GAAU1B,EAAAA,GAAAA,IAAwB5R,GAClCgW,EAAgBlE,OAAOjK,OAAOyL,GAASgB,MAAMpW,QAAsBkK,IAAXlK,KAExD,sBAAE4E,EAAF,oBAAyBC,IAAwBC,EAAAA,EAAAA,KAEjDkQ,EAAO0B,GAAM5U,EAAW,MACzBA,EAAW,KACZ,SAEEiW,EAAgBrB,GAAM1B,IAG5BnY,EAAAA,EAAAA,YAAU,KACRL,GAASwb,EAAAA,EAAAA,OACT,MAAM1O,EAAW2O,aAAY,IAAMzb,GAASwb,EAAAA,EAAAA,QAAoCE,GAAAA,IAChF,MAAO,KACLC,cAAc7O,MAEf,CAAC9M,IAEJ,MAAM4J,GAAmBF,EAAAA,EAAAA,IAA4BhH,GAAUA,EAAMmH,YAC/DC,GAAoBJ,EAAAA,EAAAA,IAA4BhH,GAAUA,EAAMqH,aAEhEwC,EAAa0O,EAAqBrB,MACrC9X,IAAD,eAAU,UAAA8H,EAAiB9H,UAAjB,eAAwByK,cAAxB,UAAsCzC,EAAkBhI,UAAxD,aAAsC,EAAyByK,eAErED,EAAU2O,EAAqBrB,MAClC9X,IAAD,eAAU,UAAA8H,EAAiB9H,UAAjB,eAAwBwK,WAAxB,UAAmCxC,EAAkBhI,UAArD,aAAmC,EAAyBwK,YAElEsP,EAAcX,EAAqBrB,MACtC9X,IAAD,qBACG,UAAA8H,EAAiB9H,UAAjB,mBAAwB6I,cAAxB,eAAgCS,WAAU,UAACxB,EAAiB9H,UAAlB,OAAC,EAAwBqF,QACnEiQ,OAAOyE,MAAK,UAAA/R,EAAkBhI,UAAlB,eAAyB6I,SAAU,IAAIS,UAAU,UAACtB,EAAkBhI,UAAnB,OAAC,EAAyBqF,UAGtF2U,EAAqBvP,IAAeD,IAAYsP,EAGhDG,EDjEuBxM,CAAAA,IAC/B,MAAOjK,IAAe8P,EAAAA,EAAAA,KAChBwD,GAAU1B,EAAAA,GAAAA,IAAwB5R,GAExC,OAAO8E,EAAAA,EAAAA,UAAQ,IACcmF,EAGxB/L,QAAO,QAAC,YAAE+J,GAAH,SACNqL,EAAQhO,cAAcmI,EAAAA,EAAAA,IAAmBxF,IAAeA,EAAYzL,OAAS8W,EAAQhO,cAGtFF,OAAOiO,GAAiBC,GAAU,KAEpC,CAACrJ,EAAYqJ,KCmDaoD,EADAC,EAAAA,GAAAA,OAE3B,OACE,UAACC,EAAA,EAAD,CAAqBC,OAAO,aAAa/X,UAAWkI,IAAYsP,EAAhE,mBACE,SAAC1S,EAAD,MACE4S,IACA,yCACE,SAAC,GAAD,MACA,gBAAK5Z,UAAW8H,EAAOoS,SACvB,iBAAKla,UAAW8H,EAAOqS,iBAAvB,WACE,iBAAKna,UAAW8H,EAAOsS,eAAvB,UACY,WAAT9D,GAAqB8C,IACpB,SAAC,EAAA/Y,OAAD,CACEL,UAAW8H,EAAOuS,gBAClB9Z,KAAM+N,EAAY,kBAAoB,oBACtChO,QAAQ,YACRG,QAAS,IAAM0Y,GAAc7K,GAJ/B,SAMGA,EAAY,eAAiB,gBAGlC,SAACpB,EAAD,CAAWC,cAAc,EAAMC,eAAe,EAAMC,WAAYwM,QAEhE3T,GAAyBC,KACzB,SAAC,EAAAzF,WAAD,CACEC,KAAM2Z,EAAAA,QAAAA,UAAkB,eAAgB,CAAEC,SAAUtB,EAASuB,SAAWvB,EAASja,SACjFuB,KAAK,OAFP,kCAUPqZ,IAAkB,SAAI,SAAC3T,EAAD,MACtByT,IAAe,SAACL,EAAD,CAAe/K,UAAWA,EAAWjB,WAAYwM,SAIvE,CAAEY,MAAO,SAGLzS,GAAa8B,IAAD,CAChBoQ,MAAOnQ,EAAAA,GAAI;;;qBAGQD,EAAMlL,QAAQ;+BACJkL,EAAM4C,OAAOgO,OAAOC;IAEjDR,iBAAkBpQ,EAAAA,GAAI;qBACHD,EAAMlL,QAAQ;;;IAIjCwb,eAAgBrQ,EAAAA,GAAI;;;;IAKpBsQ,gBAAiBtQ,EAAAA,GAAI;oBACHD,EAAMlL,QAAQ;MAIlC,O,yFGhIO,MAAMob,EAAiC,IAAqC,IAApC,SAAEzN,EAAF,OAAY0N,EAAZ,UAAoB/X,GAAgB,EACjF,MAAMH,GAAWC,EAAAA,EAAAA,IACf4Y,EAAAA,EAAAA,cAAapa,GAAsBA,EAAMyB,WACzCgY,GAGF,OACE,SAAC,IAAD,CAAMlY,SAAUA,EAAhB,UACE,SAAC,aAAD,CAAeG,UAAWA,EAA1B,SAAsCqK,Q,oECVrC,MAAMkM,EAAuB,IAA4C,IAA3C,QAAEC,EAAF,SAAWnM,EAAX,SAAqBsO,GAAW,GAAW,EAC9E,OAAInC,EAAQhB,MAAMoD,GAAWC,EAAAA,GAAAA,UAAqBD,EAAQD,MACjD,8BAAGtO,IAEH,O,4HCHJ,MAAMyO,EAA6B,IAGA,IAHmB,sBAC3DC,GAEwC,EADrCpY,E,oIACqC,MACxC,MAAMiF,GAASC,EAAAA,EAAAA,YAAWC,GAC1B,OACE,SAAC,IAAD,eACEiT,sBACEA,EACI,CAAC1Z,EAAM2Z,EAAO7Z,KACZ,kCACK6Z,IAAU7Z,EAAM6H,OAAS,KAAM,gBAAKlJ,WAAW8V,EAAAA,EAAAA,IAAGhO,EAAOqT,iBAAkBrT,EAAOsT,aACpFH,EAAsB1Z,EAAM2Z,EAAO7Z,WAGxCmK,EAEN6P,mBAAoB,KAClB,gBAAKrb,UAAW8H,EAAOwT,SAAvB,UACE,gBAAKtb,WAAW8V,EAAAA,EAAAA,IAAGhO,EAAOyT,gBAAiBzT,EAAOsT,eAGtDI,iBAAkB,CAACC,EAAGP,EAAO7Z,KAC3B,iBAAKrB,UAAW8H,EAAOwT,SAAvB,WACE,gBAAKtb,WAAW8V,EAAAA,EAAAA,IAAGhO,EAAO4T,aAAc5T,EAAOsT,eAC5CF,IAAU7Z,EAAM6H,OAAS,KAAM,gBAAKlJ,WAAW8V,EAAAA,EAAAA,IAAGhO,EAAO6T,gBAAiB7T,EAAOsT,iBAGpFvY,KAKGmF,EAAa8B,IAAD,CACvBwR,SAAUvR,EAAAA,GAAI;;;IAIdqR,UAAWrR,EAAAA,GAAI;;6BAEYD,EAAM4C,OAAOgO,OAAOC;;;MAG3C7Q,EAAMqI,YAAYC,KAAK;;;IAI3BsJ,aAAc3R,EAAAA,GAAI;;+BAEWD,EAAM4C,OAAOgO,OAAOC;;;IAIjDgB,gBAAiB5R,EAAAA,GAAI;;;IAIrBoR,iBAAkBpR,EAAAA,GAAI;;;;IAKtBwR,gBAAiBxR,EAAAA,GAAI;;;6EChEvB,MAAMwG,EAAsC,IAA0B,IAAzB,UAAEtG,EAAF,MAAaC,GAAY,EACpE,OAAKA,GAKH,gCACGD,EADH,WACc,SAAC,EAAApK,KAAD,CAAMD,KAAK,iBADzB,IAC2CsK,MALpC,8BAAGD,M,qJCKP,MAAMgG,EAAwB,IAS/B,IATgC,QACpCE,EADoC,KAEpC5P,EAFoC,GAGpC6P,EAHoC,OAIpCC,EAJoC,QAKpC5P,EALoC,UAMpCT,EANoC,iBAOpC4b,EAAmB,OAEf,EADDC,E,oIACC,MACJ,MAAMC,EAA+B,iBAAZ3L,EAAuBA,OAAU3E,EAE1D,OACE,SAAC,EAAA7B,QAAD,CAASC,QAASuG,EAAStG,UAAW+R,EAAtC,SACGxL,GACC,SAAC,EAAA1P,WAAD,eACEJ,QAAQ,YACRkJ,KAAK,OACLjJ,KAAMA,EACNI,KAAMyP,EACNtQ,KAAK,KACLuQ,OAAQA,GACJwL,EAPN,CAQE,aAAYC,MAGd,SAAC,EAAAzb,OAAD,eACEL,UAAWA,EACXM,QAAQ,YACRkJ,KAAK,OACL1J,KAAK,KACLS,KAAMA,EACN2L,KAAK,SACLzL,QAASA,GACLob,EARN,CASE,aAAYC,S,mNC/Bf,MAAMC,EAAyB,IAAc,IAAb,KAAEhd,GAAW,EAClD,MAAM+I,GAASC,EAAAA,EAAAA,YAAWC,IAExBiC,WAAW,YAAEoB,IACXtM,EAEEid,EAAc9G,OAAOC,QAAQpW,EAAKid,aAAa1a,QAAO,QAAEma,EAAGnZ,GAAL,UAAkBA,EAAM2Z,UAEpF,OACE,4BACE,SAACC,EAAA,EAAD,CAA0Bnd,KAAMA,EAAMsM,YAAaA,KACnD,iBAAKrL,UAAW8H,EAAO0I,QAAvB,WACE,iBAAKxQ,UAAW8H,EAAOqU,SAAvB,YACKpd,EAAKwY,UAAYrC,OAAOyE,KAAK5a,EAAKwY,QAAQrO,SAC3C,SAACkT,EAAA,EAAD,CAAc/Z,MAAM,SAASga,YAAY,EAAzC,UACE,SAACC,EAAA,EAAD,CAAa/E,OAAQxY,EAAKwY,YAG9B,SAACgF,EAAA,EAAD,CAAuBlR,YAAaA,EAAatM,KAAMA,EAAMid,YAAaA,KAC1E,SAACQ,EAAA,EAAD,CAAwBR,YAAaA,QAEvC,gBAAKhc,UAAW8H,EAAO2U,UAAvB,UACE,SAACC,EAAA,EAAD,CAAwBrR,YAAaA,EAAatM,KAAMA,UAG5D,SAAC4d,EAAA,EAAD,CAA8B5d,KAAMA,QAK7BiJ,EAAa8B,IAAD,CACvB0G,QAASzG,EAAAA,GAAI;;;;MAITD,EAAMqI,YAAYC,KAAK;;;IAI3B+J,SAAUpS,EAAAA,GAAI;;IAGd0S,UAAW1S,EAAAA,GAAI;MACXD,EAAMqI,YAAYyK,GAAG;;;;gCClCpB,MAAMpL,EAAwB,IAO/B,IAPgC,MACpCjN,EADoC,UAEpCvE,EAFoC,eAGpC2R,GAAiB,EAHmB,aAIpCkL,EAAe,kBAJqB,gBAKpCnJ,GAAkB,EALkB,kBAMpCjC,GAAoB,GAChB,EACJ,MAAM3J,GAASC,EAAAA,EAAAA,YAAWC,GAEpB8U,GAAehH,EAAAA,EAAAA,IAAGhO,EAAO0I,QAASxQ,EAAW,CAAE,CAAC8H,EAAOiV,eAAgBpL,IAEvEtQ,GAAQ6G,EAAAA,EAAAA,UAAQ,KACpB,MAAM8U,EAAqB,GAC3B,OAAOzY,EAAMH,KAAI,CAACrF,EAAMke,KAAY,MAClC,IAAI7H,EAAMhJ,KAAKC,UAAU,WAACtN,EAAK0O,gBAAN,aAAC,EAAevB,KAAMnN,EAAKwY,OAAQxY,EAAK6Y,MAAO7Y,EAAKa,KAAMb,EAAKid,cAKxF,OAJIgB,EAAS9F,SAAS9B,KACpBA,GAAQ,IAAG6H,KAEbD,EAASjU,KAAKqM,GACP,CACLtS,GAAIsS,EACJtQ,KAAM/F,QAGT,CAACwF,IAEE2Y,EAoCR,SAAoBzL,EAA4BiC,GAC9C,MAAM,SAAE5E,EAAF,iBAAYC,IAAqBC,EAAAA,EAAAA,KAEvC,OAAO9G,EAAAA,EAAAA,UAAQ,KACb,MAAMgV,EAAkC,CACtC,CACEpa,GAAI,QACJT,MAAO,QAEP8a,WAAY,IAAoB,IAAjBrY,KAAM/F,GAAW,EAC9B,MAAM,UAAEkL,GAAclL,GAChB,YAAEsM,GAAgBpB,GAClB,SAAEwD,EAAF,UAAYI,GAAc9O,EAC1BwQ,MAAgBT,EAASzD,IAAgB0D,EAAiB1D,IAAgBoC,IAAaI,GACvFuP,MAAgBtO,EAASzD,IAAgB0D,EAAiB1D,IAAgBwC,IAAcJ,GAC9F,OAAO,SAAC4P,EAAA,EAAD,CAAWte,KAAMA,EAAMwQ,WAAYA,EAAY6N,WAAYA,KAEpEtd,KAAM,SAER,CACEgD,GAAI,OACJT,MAAO,OAEP8a,WAAY,QAAGrY,KAAM/F,GAAT,SAAoBA,EAAKa,MACrCE,KAAM,GAER,CACEgD,GAAI,SACJT,MAAO,SAEP8a,WAAY,QAAGrY,MAAM,SAAE2I,IAAX,SAA6BA,GAAW,SAAC6P,EAAA,EAAD,CAAYve,KAAM0O,IAAe,MACrF3N,KAAM,SAgCV,OA7BI2R,GACFyL,EAAQnU,KAAK,CACXjG,GAAI,UACJT,MAAO,UAEP8a,WAAY,cAAGrY,KAAM/F,GAAT,mBAAoBA,EAAKid,YAAYuB,EAAAA,GAAAA,gBAArC,QAA4D,IACxEzd,KAAM,IAGN4T,GACFwJ,EAAQnU,KAAK,CACXjG,GAAI,QACJT,MAAO,QAEP8a,WAAY,IAAoB,IAAjBrY,KAAM/F,GAAW,EAC9B,MAAM,UAAEkL,EAAF,MAAaC,GAAUnL,EAS7B,MAPmC,YAAfmL,EAAMtK,MAExB,SAAC2Q,EAAA,EAAD,CAActG,UAAWA,EAAUrK,QAEnC,SAAC2Q,EAAA,EAAD,CAActG,UAAWA,EAAUrK,KAAMsK,MAAOA,EAAMtK,QAK1DE,KAAM,IAGHod,IACN,CAACpO,EAAUC,EAAkB0C,EAAmBiC,IApGnC8J,CAAW/L,EAAmBiC,GAE9C,IAAKnP,EAAM2E,OACT,OAAO,gBAAKlJ,WAAW8V,EAAAA,EAAAA,IAAGgH,EAAchV,EAAO+U,cAAxC,SAAwDA,IAGjE,MAAMY,EAAiB9L,EAAiBqJ,EAAAA,EAA6B0C,EAAAA,EAErE,OACE,gBAAK1d,UAAW8c,EAAc,cAAY,cAA1C,UACE,SAACW,EAAD,CACEE,KAAMT,EACNU,cAAc,EACdvc,MAAOA,EACP4Z,sBAAuB,QAAGnW,KAAM/F,GAAT,SAAoB,SAACgd,EAAD,CAAahd,KAAMA,UAMzDiJ,EAAa8B,IAAD,CACvBiT,cAAehT,EAAAA,GAAI;MACfD,EAAMqI,YAAYyK,GAAG;;;IAIzBC,aAAc9S,EAAAA,GAAI;eACLD,EAAMlL,QAAQ;IAE3B4R,QAASzG,EAAAA,GAAI;;wBAESD,EAAM4C,OAAOwF,WAAWpF;qBAC3BhD,EAAM+T,MAAMC;6EC/E1B,SAAS9O,IACd,MAAMnH,GAAaL,EAAAA,EAAAA,IAA4BhH,GAAUA,EAAMqH,aAoB/D,MAAO,CAAEiH,UAlBQxP,EAAAA,EAAAA,cACd+L,IAAsC,MACrC,MAAMF,EAAyC,iBAAhBE,EAA2BA,EAAcA,EAAYzL,KACpF,OAAOuL,IAAoBtC,EAAAA,MAA8B,UAAChB,EAAWsD,UAAZ,QAAC,EAA6B1C,UAEzF,CAACZ,IAagBkH,kBAVMzP,EAAAA,EAAAA,cACtB+L,IAA6B,MAC5B,MAAMF,GAAkBC,EAAAA,EAAAA,IAAmBC,GACrC5C,EAAM,UAAGZ,EAAWsD,UAAd,aAAG,EAA6B1C,OAE5C,OAAOsV,QAAQtV,KAEjB,CAACZ,O,2DCvBE,SAASzB,IACd,OAAO8B,EAAAA,EAAAA,UAAQ,KAAM8V,EAAAA,EAAAA,OAAkB","sources":["webpack://grafana/./public/app/core/hooks/useCleanup.ts","webpack://grafana/./public/app/features/alerting/AlertHowToModal.tsx","webpack://grafana/./public/app/features/alerting/AlertRuleItem.tsx","webpack://grafana/./public/app/features/alerting/components/DeprecationNotice.tsx","webpack://grafana/./public/app/features/alerting/state/selectors.ts","webpack://grafana/./public/app/features/alerting/AlertRuleList.tsx","webpack://grafana/./public/app/features/alerting/state/actions.ts","webpack://grafana/./public/app/features/alerting/unified/components/rules/NoRulesCTA.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleListErrors.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/EditCloudGroupModal.tsx","webpack://grafana/./public/app/features/alerting/unified/components/StateColoredText.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleStats.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RulesGroup.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/CloudRules.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/GrafanaRules.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleListStateSection.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RulesFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useFilteredRules.ts","webpack://grafana/./public/app/features/alerting/unified/RuleList.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleListGroupView.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleListStateView.tsx","webpack://grafana/./public/app/features/alerting/unified/components/AlertingPageWrapper.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Authorize.tsx","webpack://grafana/./public/app/features/alerting/unified/components/DynamicTableWithGuidelines.tsx","webpack://grafana/./public/app/features/alerting/unified/components/RuleLocation.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/ActionIcon.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetails.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RulesTable.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useHasRuler.ts","webpack://grafana/./public/app/features/alerting/unified/utils/accessControlHooks.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { cleanUpAction, StateSelector } from '../actions/cleanUp';\n\nexport function useCleanup<T>(stateSelector: StateSelector<T>) {\n const dispatch = useDispatch();\n //bit of a hack to unburden user from having to wrap stateSelcetor in a useCallback. Otherwise cleanup would happen on every render\n const selectorRef = useRef(stateSelector);\n selectorRef.current = stateSelector;\n useEffect(() => {\n return () => {\n dispatch(cleanUpAction({ stateSelector: selectorRef.current }));\n };\n }, [dispatch]);\n}\n","import React from 'react';\n\nimport { Modal, VerticalGroup } from '@grafana/ui';\n\nexport interface AlertHowToModalProps {\n onDismiss: () => void;\n}\n\nexport function AlertHowToModal({ onDismiss }: AlertHowToModalProps): JSX.Element {\n return (\n <Modal title=\"Adding an Alert\" isOpen onDismiss={onDismiss} onClickBackdrop={onDismiss}>\n <VerticalGroup spacing=\"sm\">\n <img src=\"public/img/alert_howto_new.png\" alt=\"link to how to alert image\" />\n <p>\n Alerts are added and configured in the Alert tab of any dashboard graph panel, letting you build and visualize\n an alert using existing queries.\n </p>\n <p>Remember to save the dashboard to persist your alert rule changes.</p>\n </VerticalGroup>\n </Modal>\n );\n}\n","import React, { useCallback } from 'react';\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\n\nimport { Icon, IconName, Button, LinkButton, Card } from '@grafana/ui';\n\nimport { AlertRule } from '../../types';\n\nexport interface Props {\n rule: AlertRule;\n search: string;\n onTogglePause: () => void;\n}\n\nconst AlertRuleItem = ({ rule, search, onTogglePause }: Props) => {\n const ruleUrl = `${rule.url}?editPanel=${rule.panelId}&tab=alert`;\n const renderText = useCallback(\n (text) => (\n <Highlighter\n key={text}\n highlightClassName=\"highlight-search-match\"\n textToHighlight={text}\n searchWords={[search]}\n />\n ),\n [search]\n );\n\n return (\n <Card>\n <Card.Heading>{renderText(rule.name)}</Card.Heading>\n <Card.Figure>\n <Icon size=\"xl\" name={rule.stateIcon as IconName} className={`alert-rule-item__icon ${rule.stateClass}`} />\n </Card.Figure>\n <Card.Meta>\n <span key=\"state\">\n <span key=\"text\" className={`${rule.stateClass}`}>\n {renderText(rule.stateText)}{' '}\n </span>\n for {rule.stateAge}\n </span>\n {rule.info ? renderText(rule.info) : null}\n </Card.Meta>\n <Card.Actions>\n <Button\n key=\"play\"\n variant=\"secondary\"\n icon={rule.state === 'paused' ? 'play' : 'pause'}\n onClick={onTogglePause}\n >\n {rule.state === 'paused' ? 'Resume' : 'Pause'}\n </Button>\n <LinkButton key=\"edit\" variant=\"secondary\" href={ruleUrl} icon=\"cog\">\n Edit alert\n </LinkButton>\n </Card.Actions>\n </Card>\n );\n};\n\nexport default AlertRuleItem;\n","import React, { FC } from 'react';\n\nimport { Alert } from '@grafana/ui';\n\nexport const LOCAL_STORAGE_KEY = 'grafana.legacyalerting.unifiedalertingpromo';\n\nconst DeprecationNotice: FC<{}> = () => (\n <Alert severity=\"warning\" title=\"Grafana legacy alerting is going away soon\">\n <p>\n You are using Grafana legacy alerting, it has been deprecated and will be removed in the next major version of\n Grafana.\n <br />\n We encourage you to upgrade to the new Grafana alerting experience.\n </p>\n <p>\n See{' '}\n <a href=\"https://grafana.com/docs/grafana/latest/alerting/unified-alerting/difference-old-new/\">\n What’s New with Grafana alerting\n </a>{' '}\n to learn more about what‘s new or learn{' '}\n <a href=\"https://grafana.com/docs/grafana/latest/alerting/unified-alerting/opt-in/\">\n how to enable the new Grafana alerting feature\n </a>\n .\n </p>\n </Alert>\n);\n\nexport { DeprecationNotice };\n","import { AlertRule, AlertRulesState, NotificationChannelState, StoreState } from 'app/types';\n\nexport const getSearchQuery = (state: AlertRulesState) => state.searchQuery;\n\nexport const getAlertRuleItems = (state: StoreState): AlertRule[] => {\n const regex = new RegExp(state.alertRules.searchQuery, 'i');\n\n return state.alertRules.items.filter((item) => {\n return regex.test(item.name) || regex.test(item.stateText) || regex.test(item.info!);\n });\n};\n\nexport const getNotificationChannel = (state: NotificationChannelState, channelId: number) => {\n if (state.notificationChannel.id === channelId) {\n return state.notificationChannel;\n }\n\n return null;\n};\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { SelectableValue } from '@grafana/data';\nimport { config, locationService } from '@grafana/runtime';\nimport { Button, FilterInput, LinkButton, Select, VerticalGroup } from '@grafana/ui';\nimport appEvents from 'app/core/app_events';\nimport Page from 'app/core/components/Page/Page';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { AlertRule, StoreState } from 'app/types';\n\nimport { ShowModalReactEvent } from '../../types/events';\n\nimport { AlertHowToModal } from './AlertHowToModal';\nimport AlertRuleItem from './AlertRuleItem';\nimport { DeprecationNotice } from './components/DeprecationNotice';\nimport { getAlertRulesAsync, togglePauseAlertRule } from './state/actions';\nimport { setSearchQuery } from './state/reducers';\nimport { getAlertRuleItems, getSearchQuery } from './state/selectors';\n\nfunction mapStateToProps(state: StoreState) {\n return {\n navModel: getNavModel(state.navIndex, 'alert-list'),\n alertRules: getAlertRuleItems(state),\n search: getSearchQuery(state.alertRules),\n isLoading: state.alertRules.isLoading,\n };\n}\n\nconst mapDispatchToProps = {\n getAlertRulesAsync,\n setSearchQuery,\n togglePauseAlertRule,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ninterface OwnProps extends GrafanaRouteComponentProps<{}, { state: string }> {}\n\nexport type Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport class AlertRuleListUnconnected extends PureComponent<Props> {\n stateFilters = [\n { label: 'All', value: 'all' },\n { label: 'OK', value: 'ok' },\n { label: 'Not OK', value: 'not_ok' },\n { label: 'Alerting', value: 'alerting' },\n { label: 'No data', value: 'no_data' },\n { label: 'Paused', value: 'paused' },\n { label: 'Pending', value: 'pending' },\n ];\n\n componentDidMount() {\n this.fetchRules();\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.queryParams.state !== this.props.queryParams.state) {\n this.fetchRules();\n }\n }\n\n async fetchRules() {\n await this.props.getAlertRulesAsync({ state: this.getStateFilter() });\n }\n\n getStateFilter(): string {\n return this.props.queryParams.state ?? 'all';\n }\n\n onStateFilterChanged = (option: SelectableValue) => {\n locationService.partial({ state: option.value });\n };\n\n onOpenHowTo = () => {\n appEvents.publish(new ShowModalReactEvent({ component: AlertHowToModal }));\n };\n\n onSearchQueryChange = (value: string) => {\n this.props.setSearchQuery(value);\n };\n\n onTogglePause = (rule: AlertRule) => {\n this.props.togglePauseAlertRule(rule.id, { paused: rule.state !== 'paused' });\n };\n\n alertStateFilterOption = ({ text, value }: { text: string; value: string }) => {\n return (\n <option key={value} value={value}>\n {text}\n </option>\n );\n };\n\n render() {\n const { navModel, alertRules, search, isLoading } = this.props;\n\n return (\n <Page navModel={navModel}>\n <Page.Contents isLoading={isLoading}>\n <div className=\"page-action-bar\">\n <div className=\"gf-form gf-form--grow\">\n <FilterInput placeholder=\"Search alerts\" value={search} onChange={this.onSearchQueryChange} />\n </div>\n <div className=\"gf-form\">\n <label className=\"gf-form-label\" htmlFor=\"alert-state-filter\">\n States\n </label>\n\n <div className=\"width-13\">\n <Select\n inputId={'alert-state-filter'}\n options={this.stateFilters}\n onChange={this.onStateFilterChanged}\n value={this.getStateFilter()}\n />\n </div>\n </div>\n <div className=\"page-action-bar__spacer\" />\n {config.unifiedAlertingEnabled && (\n <LinkButton variant=\"primary\" href=\"alerting/ng/new\">\n Add NG Alert\n </LinkButton>\n )}\n <Button variant=\"secondary\" onClick={this.onOpenHowTo}>\n How to add an alert\n </Button>\n </div>\n <DeprecationNotice />\n <VerticalGroup spacing=\"none\">\n {alertRules.map((rule) => {\n return (\n <AlertRuleItem\n rule={rule as AlertRule}\n key={rule.id}\n search={search}\n onTogglePause={() => this.onTogglePause(rule as AlertRule)}\n />\n );\n })}\n </VerticalGroup>\n </Page.Contents>\n </Page>\n );\n }\n}\n\nexport default connector(AlertRuleListUnconnected);\n","import { getBackendSrv, locationService } from '@grafana/runtime';\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification, createSuccessNotification } from 'app/core/copy/appNotification';\nimport { AlertRuleDTO, NotifierDTO, ThunkResult } from 'app/types';\n\nimport { loadAlertRules, loadedAlertRules, notificationChannelLoaded, setNotificationChannels } from './reducers';\n\nexport function getAlertRulesAsync(options: { state: string }): ThunkResult<void> {\n return async (dispatch) => {\n dispatch(loadAlertRules());\n const rules: AlertRuleDTO[] = await getBackendSrv().get('/api/alerts', options);\n dispatch(loadedAlertRules(rules));\n };\n}\n\nexport function togglePauseAlertRule(id: number, options: { paused: boolean }): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().post(`/api/alerts/${id}/pause`, options);\n const stateFilter = locationService.getSearchObject().state || 'all';\n dispatch(getAlertRulesAsync({ state: stateFilter.toString() }));\n };\n}\n\nexport function createNotificationChannel(data: any): ThunkResult<Promise<void>> {\n return async (dispatch) => {\n try {\n await getBackendSrv().post(`/api/alert-notifications`, data);\n dispatch(notifyApp(createSuccessNotification('Notification created')));\n locationService.push('/alerting/notifications');\n } catch (error) {\n dispatch(notifyApp(createErrorNotification(error.data.error)));\n }\n };\n}\n\nexport function updateNotificationChannel(data: any): ThunkResult<void> {\n return async (dispatch) => {\n try {\n await getBackendSrv().put(`/api/alert-notifications/${data.id}`, data);\n dispatch(notifyApp(createSuccessNotification('Notification updated')));\n } catch (error) {\n dispatch(notifyApp(createErrorNotification(error.data.error)));\n }\n };\n}\n\nexport function testNotificationChannel(data: any): ThunkResult<void> {\n return async (dispatch, getState) => {\n const channel = getState().notificationChannel.notificationChannel;\n await getBackendSrv().post('/api/alert-notifications/test', { id: channel.id, ...data });\n };\n}\n\nexport function loadNotificationTypes(): ThunkResult<void> {\n return async (dispatch) => {\n const alertNotifiers: NotifierDTO[] = await getBackendSrv().get(`/api/alert-notifiers`);\n\n const notificationTypes = alertNotifiers.sort((o1, o2) => {\n if (o1.name > o2.name) {\n return 1;\n }\n return -1;\n });\n\n dispatch(setNotificationChannels(notificationTypes));\n };\n}\n\nexport function loadNotificationChannel(id: number): ThunkResult<void> {\n return async (dispatch) => {\n await dispatch(loadNotificationTypes());\n const notificationChannel = await getBackendSrv().get(`/api/alert-notifications/${id}`);\n dispatch(notificationChannelLoaded(notificationChannel));\n };\n}\n","import React, { FC } from 'react';\n\nimport { CallToActionCard } from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\n\nimport { useRulesAccess } from '../../utils/accessControlHooks';\n\nexport const NoRulesSplash: FC = () => {\n const { canCreateGrafanaRules, canCreateCloudRules } = useRulesAccess();\n\n if (canCreateGrafanaRules || canCreateCloudRules) {\n return (\n <EmptyListCTA\n title=\"You haven`t created any alert rules yet\"\n buttonIcon=\"bell\"\n buttonLink={'alerting/new'}\n buttonTitle=\"New alert rule\"\n proTip=\"you can also create alert rules from existing panels and queries.\"\n proTipLink=\"https://grafana.com/docs/\"\n proTipLinkTitle=\"Learn more\"\n proTipTarget=\"_blank\"\n />\n );\n }\n return <CallToActionCard message=\"No rules exist yet.\" callToActionElement={<div />} />;\n};\n","import { css } from '@emotion/css';\nimport { SerializedError } from '@reduxjs/toolkit';\nimport pluralize from 'pluralize';\nimport React, { useMemo, ReactElement, useState, FC } from 'react';\nimport { useLocalStorage } from 'react-use';\n\nimport { DataSourceInstanceSettings, GrafanaTheme2 } from '@grafana/data';\nimport { Alert, Button, Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { useUnifiedAlertingSelector } from '../../hooks/useUnifiedAlertingSelector';\nimport { getRulesDataSources, GRAFANA_RULES_SOURCE_NAME } from '../../utils/datasource';\nimport { isRulerNotSupportedResponse } from '../../utils/rules';\n\nexport function RuleListErrors(): ReactElement {\n const [expanded, setExpanded] = useState(false);\n const [closed, setClosed] = useLocalStorage('grafana.unifiedalerting.hideErrors', false);\n const dataSourceConfigRequests = useUnifiedAlertingSelector((state) => state.dataSources);\n const promRuleRequests = useUnifiedAlertingSelector((state) => state.promRules);\n const rulerRuleRequests = useUnifiedAlertingSelector((state) => state.rulerRules);\n const styles = useStyles2(getStyles);\n\n const errors = useMemo((): JSX.Element[] => {\n const [dataSourceConfigErrors, promRequestErrors, rulerRequestErrors] = [\n dataSourceConfigRequests,\n promRuleRequests,\n rulerRuleRequests,\n ].map((requests) =>\n getRulesDataSources().reduce<Array<{ error: SerializedError; dataSource: DataSourceInstanceSettings }>>(\n (result, dataSource) => {\n const error = requests[dataSource.name]?.error;\n if (requests[dataSource.name] && error && !isRulerNotSupportedResponse(requests[dataSource.name])) {\n return [...result, { dataSource, error }];\n }\n return result;\n },\n []\n )\n );\n const grafanaPromError = promRuleRequests[GRAFANA_RULES_SOURCE_NAME]?.error;\n const grafanaRulerError = rulerRuleRequests[GRAFANA_RULES_SOURCE_NAME]?.error;\n\n const result: JSX.Element[] = [];\n\n if (grafanaPromError) {\n result.push(<>Failed to load Grafana rules state: {grafanaPromError.message || 'Unknown error.'}</>);\n }\n if (grafanaRulerError) {\n result.push(<>Failed to load Grafana rules config: {grafanaRulerError.message || 'Unknown error.'}</>);\n }\n\n dataSourceConfigErrors.forEach(({ dataSource, error }) => {\n result.push(\n <>\n Failed to load the data source configuration for{' '}\n <a href={`datasources/edit/${dataSource.uid}`}>{dataSource.name}</a>: {error.message || 'Unknown error.'}\n </>\n );\n });\n\n promRequestErrors.forEach(({ dataSource, error }) =>\n result.push(\n <>\n Failed to load rules state from <a href={`datasources/edit/${dataSource.uid}`}>{dataSource.name}</a>:{' '}\n {error.message || 'Unknown error.'}\n </>\n )\n );\n\n rulerRequestErrors.forEach(({ dataSource, error }) =>\n result.push(\n <>\n Failed to load rules config from <a href={`datasources/edit/${dataSource.uid}`}>{dataSource.name}</a>:{' '}\n {error.message || 'Unknown error.'}\n </>\n )\n );\n\n return result;\n }, [dataSourceConfigRequests, promRuleRequests, rulerRuleRequests]);\n\n return (\n <>\n {!!errors.length && closed && (\n <ErrorSummaryButton count={errors.length} onClick={() => setClosed((closed) => !closed)} />\n )}\n {!!errors.length && !closed && (\n <Alert\n data-testid=\"cloud-rulessource-errors\"\n title=\"Errors loading rules\"\n severity=\"error\"\n onRemove={() => setClosed(true)}\n >\n {expanded && errors.map((item, idx) => <div key={idx}>{item}</div>)}\n {!expanded && (\n <>\n <div>{errors[0]}</div>\n {errors.length >= 2 && (\n <Button\n className={styles.moreButton}\n fill=\"text\"\n icon=\"angle-right\"\n size=\"sm\"\n onClick={() => setExpanded(true)}\n >\n {errors.length - 1} more {pluralize('error', errors.length - 1)}\n </Button>\n )}\n </>\n )}\n </Alert>\n )}\n </>\n );\n}\n\ninterface ErrorSummaryProps {\n count: number;\n onClick: () => void;\n}\n\nconst ErrorSummaryButton: FC<ErrorSummaryProps> = ({ count, onClick }) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.floatRight}>\n <Tooltip content=\"Show all errors\" placement=\"bottom\">\n <Button fill=\"text\" variant=\"destructive\" icon=\"exclamation-triangle\" onClick={onClick}>\n {count > 1 ? <>{count} errors</> : <>1 error</>}\n </Button>\n </Tooltip>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n moreButton: css`\n padding: 0;\n `,\n floatRight: css`\n display: flex;\n justify-content: flex-end;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { useEffect, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Modal, Button, Form, Field, Input, useStyles2 } from '@grafana/ui';\nimport { useCleanup } from 'app/core/hooks/useCleanup';\nimport { CombinedRuleGroup, CombinedRuleNamespace } from 'app/types/unified-alerting';\n\nimport { useUnifiedAlertingSelector } from '../../hooks/useUnifiedAlertingSelector';\nimport { updateLotexNamespaceAndGroupAction } from '../../state/actions';\nimport { getRulesSourceName } from '../../utils/datasource';\nimport { initialAsyncRequestState } from '../../utils/redux';\nimport { durationValidationPattern } from '../../utils/time';\n\ninterface Props {\n namespace: CombinedRuleNamespace;\n group: CombinedRuleGroup;\n onClose: () => void;\n}\n\ninterface FormValues {\n namespaceName: string;\n groupName: string;\n groupInterval: string;\n}\n\nexport function EditCloudGroupModal(props: Props): React.ReactElement {\n const { namespace, group, onClose } = props;\n const styles = useStyles2(getStyles);\n const dispatch = useDispatch();\n const { loading, error, dispatched } =\n useUnifiedAlertingSelector((state) => state.updateLotexNamespaceAndGroup) ?? initialAsyncRequestState;\n\n const defaultValues = useMemo(\n (): FormValues => ({\n namespaceName: namespace.name,\n groupName: group.name,\n groupInterval: group.interval ?? '',\n }),\n [namespace, group]\n );\n\n // close modal if successfully saved\n useEffect(() => {\n if (dispatched && !loading && !error) {\n onClose();\n }\n }, [dispatched, loading, onClose, error]);\n\n useCleanup((state) => state.unifiedAlerting.updateLotexNamespaceAndGroup);\n\n const onSubmit = (values: FormValues) => {\n dispatch(\n updateLotexNamespaceAndGroupAction({\n rulesSourceName: getRulesSourceName(namespace.rulesSource),\n groupName: group.name,\n newGroupName: values.groupName,\n namespaceName: namespace.name,\n newNamespaceName: values.namespaceName,\n groupInterval: values.groupInterval || undefined,\n })\n );\n };\n\n return (\n <Modal\n className={styles.modal}\n isOpen={true}\n title=\"Edit namespace or rule group\"\n onDismiss={onClose}\n onClickBackdrop={onClose}\n >\n <Form defaultValues={defaultValues} onSubmit={onSubmit} key={JSON.stringify(defaultValues)}>\n {({ register, errors, formState: { isDirty } }) => (\n <>\n <Field label=\"Namespace\" invalid={!!errors.namespaceName} error={errors.namespaceName?.message}>\n <Input\n id=\"namespaceName\"\n {...register('namespaceName', {\n required: 'Namespace name is required.',\n })}\n />\n </Field>\n <Field label=\"Rule group\" invalid={!!errors.groupName} error={errors.groupName?.message}>\n <Input\n id=\"groupName\"\n {...register('groupName', {\n required: 'Rule group name is required.',\n })}\n />\n </Field>\n <Field\n label=\"Rule group evaluation interval\"\n invalid={!!errors.groupInterval}\n error={errors.groupInterval?.message}\n >\n <Input\n id=\"groupInterval\"\n placeholder=\"1m\"\n {...register('groupInterval', {\n pattern: durationValidationPattern,\n })}\n />\n </Field>\n\n <Modal.ButtonRow>\n <Button variant=\"secondary\" type=\"button\" disabled={loading} onClick={onClose} fill=\"outline\">\n Close\n </Button>\n <Button type=\"submit\" disabled={!isDirty || loading}>\n {loading ? 'Saving...' : 'Save changes'}\n </Button>\n </Modal.ButtonRow>\n </>\n )}\n </Form>\n </Modal>\n );\n}\n\nconst getStyles = () => ({\n modal: css`\n max-width: 560px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\ntype Props = {\n status: PromAlertingRuleState | 'neutral';\n};\n\nexport const StateColoredText: FC<Props> = ({ children, status }) => {\n const styles = useStyles2(getStyles);\n\n return <span className={styles[status]}>{children || status}</span>;\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n [PromAlertingRuleState.Inactive]: css`\n color: ${theme.colors.success.text};\n `,\n [PromAlertingRuleState.Pending]: css`\n color: ${theme.colors.warning.text};\n `,\n [PromAlertingRuleState.Firing]: css`\n color: ${theme.colors.error.text};\n `,\n neutral: css`\n color: ${theme.colors.text.secondary};\n `,\n});\n","import pluralize from 'pluralize';\nimport React, { FC, Fragment, useMemo } from 'react';\n\nimport { CombinedRule, CombinedRuleGroup, CombinedRuleNamespace } from 'app/types/unified-alerting';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { isAlertingRule, isRecordingRule, isRecordingRulerRule } from '../../utils/rules';\nimport { StateColoredText } from '../StateColoredText';\n\ninterface Props {\n showInactive?: boolean;\n showRecording?: boolean;\n group?: CombinedRuleGroup;\n namespaces?: CombinedRuleNamespace[];\n}\n\nconst emptyStats = {\n total: 0,\n recording: 0,\n [PromAlertingRuleState.Firing]: 0,\n [PromAlertingRuleState.Pending]: 0,\n [PromAlertingRuleState.Inactive]: 0,\n error: 0,\n} as const;\n\nexport const RuleStats: FC<Props> = ({ showInactive, showRecording, group, namespaces }) => {\n const calculated = useMemo(() => {\n const stats = { ...emptyStats };\n const calcRule = (rule: CombinedRule) => {\n if (rule.promRule && isAlertingRule(rule.promRule)) {\n stats[rule.promRule.state] += 1;\n }\n if (rule.promRule?.health === 'err' || rule.promRule?.health === 'error') {\n stats.error += 1;\n }\n if (\n (rule.promRule && isRecordingRule(rule.promRule)) ||\n (rule.rulerRule && isRecordingRulerRule(rule.rulerRule))\n ) {\n stats.recording += 1;\n }\n stats.total += 1;\n };\n if (group) {\n group.rules.forEach(calcRule);\n }\n if (namespaces) {\n namespaces.forEach((namespace) => namespace.groups.forEach((group) => group.rules.forEach(calcRule)));\n }\n return stats;\n }, [group, namespaces]);\n\n const statsComponents: React.ReactNode[] = [];\n if (calculated[PromAlertingRuleState.Firing]) {\n statsComponents.push(\n <StateColoredText key=\"firing\" status={PromAlertingRuleState.Firing}>\n {calculated[PromAlertingRuleState.Firing]} firing\n </StateColoredText>\n );\n }\n if (calculated.error) {\n statsComponents.push(\n <StateColoredText key=\"errors\" status={PromAlertingRuleState.Firing}>\n {calculated.error} errors\n </StateColoredText>\n );\n }\n if (calculated[PromAlertingRuleState.Pending]) {\n statsComponents.push(\n <StateColoredText key=\"pending\" status={PromAlertingRuleState.Pending}>\n {calculated[PromAlertingRuleState.Pending]} pending\n </StateColoredText>\n );\n }\n if (showInactive && calculated[PromAlertingRuleState.Inactive]) {\n statsComponents.push(\n <StateColoredText key=\"inactive\" status=\"neutral\">\n {calculated[PromAlertingRuleState.Inactive]} normal\n </StateColoredText>\n );\n }\n if (showRecording && calculated.recording) {\n statsComponents.push(\n <StateColoredText key=\"recording\" status=\"neutral\">\n {calculated.recording} recording\n </StateColoredText>\n );\n }\n\n return (\n <div>\n <span>\n {calculated.total} {pluralize('rule', calculated.total)}\n </span>\n {!!statsComponents.length && (\n <>\n <span>: </span>\n {statsComponents.reduce<React.ReactNode[]>(\n (prev, curr, idx) =>\n prev.length\n ? [\n prev,\n <Fragment key={idx}>\n <span>, </span>\n </Fragment>,\n curr,\n ]\n : [curr],\n []\n )}\n </>\n )}\n </div>\n );\n};\n","import { css } from '@emotion/css';\nimport pluralize from 'pluralize';\nimport React, { FC, useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Badge, ConfirmModal, HorizontalGroup, Icon, Spinner, Tooltip, useStyles2 } from '@grafana/ui';\nimport kbn from 'app/core/utils/kbn';\nimport { CombinedRuleGroup, CombinedRuleNamespace } from 'app/types/unified-alerting';\n\nimport { useFolder } from '../../hooks/useFolder';\nimport { useHasRuler } from '../../hooks/useHasRuler';\nimport { deleteRulesGroupAction } from '../../state/actions';\nimport { useRulesAccess } from '../../utils/accessControlHooks';\nimport { GRAFANA_RULES_SOURCE_NAME, isCloudRulesSource } from '../../utils/datasource';\nimport { isFederatedRuleGroup, isGrafanaRulerRule } from '../../utils/rules';\nimport { CollapseToggle } from '../CollapseToggle';\nimport { RuleLocation } from '../RuleLocation';\n\nimport { ActionIcon } from './ActionIcon';\nimport { EditCloudGroupModal } from './EditCloudGroupModal';\nimport { RuleStats } from './RuleStats';\nimport { RulesTable } from './RulesTable';\n\ninterface Props {\n namespace: CombinedRuleNamespace;\n group: CombinedRuleGroup;\n expandAll: boolean;\n}\n\nexport const RulesGroup: FC<Props> = React.memo(({ group, namespace, expandAll }) => {\n const { rulesSource } = namespace;\n const dispatch = useDispatch();\n const styles = useStyles2(getStyles);\n\n const [isEditingGroup, setIsEditingGroup] = useState(false);\n const [isDeletingGroup, setIsDeletingGroup] = useState(false);\n const [isCollapsed, setIsCollapsed] = useState(!expandAll);\n\n const { canEditRules } = useRulesAccess();\n\n useEffect(() => {\n setIsCollapsed(!expandAll);\n }, [expandAll]);\n\n const { hasRuler, rulerRulesLoaded } = useHasRuler();\n const rulerRule = group.rules[0]?.rulerRule;\n const folderUID = (rulerRule && isGrafanaRulerRule(rulerRule) && rulerRule.grafana_alert.namespace_uid) || undefined;\n const { folder } = useFolder(folderUID);\n\n // group \"is deleting\" if rules source has ruler, but this group has no rules that are in ruler\n const isDeleting =\n hasRuler(rulesSource) && rulerRulesLoaded(rulesSource) && !group.rules.find((rule) => !!rule.rulerRule);\n const isFederated = isFederatedRuleGroup(group);\n\n const deleteGroup = () => {\n dispatch(deleteRulesGroupAction(namespace, group));\n setIsDeletingGroup(false);\n };\n\n const actionIcons: React.ReactNode[] = [];\n\n // for grafana, link to folder views\n if (isDeleting) {\n actionIcons.push(\n <HorizontalGroup key=\"is-deleting\">\n <Spinner />\n deleting\n </HorizontalGroup>\n );\n } else if (rulesSource === GRAFANA_RULES_SOURCE_NAME) {\n if (folderUID) {\n const baseUrl = `/dashboards/f/${folderUID}/${kbn.slugifyForUrl(namespace.name)}`;\n if (folder?.canSave) {\n actionIcons.push(\n <ActionIcon\n aria-label=\"edit folder\"\n key=\"edit\"\n icon=\"pen\"\n tooltip=\"edit folder\"\n to={baseUrl + '/settings'}\n target=\"__blank\"\n />\n );\n }\n if (folder?.canAdmin) {\n actionIcons.push(\n <ActionIcon\n aria-label=\"manage permissions\"\n key=\"manage-perms\"\n icon=\"lock\"\n tooltip=\"manage permissions\"\n to={baseUrl + '/permissions'}\n target=\"__blank\"\n />\n );\n }\n }\n } else if (canEditRules(rulesSource.name) && hasRuler(rulesSource)) {\n if (!isFederated) {\n actionIcons.push(\n <ActionIcon\n aria-label=\"edit rule group\"\n data-testid=\"edit-group\"\n key=\"edit\"\n icon=\"pen\"\n tooltip=\"edit rule group\"\n onClick={() => setIsEditingGroup(true)}\n />\n );\n }\n\n actionIcons.push(\n <ActionIcon\n aria-label=\"delete rule group\"\n data-testid=\"delete-group\"\n key=\"delete-group\"\n icon=\"trash-alt\"\n tooltip=\"delete rule group\"\n onClick={() => setIsDeletingGroup(true)}\n />\n );\n }\n\n // ungrouped rules are rules that are in the \"default\" group name\n const isUngrouped = group.name === 'default';\n const groupName = isUngrouped ? (\n <RuleLocation namespace={namespace.name} />\n ) : (\n <RuleLocation namespace={namespace.name} group={group.name} />\n );\n\n return (\n <div className={styles.wrapper} data-testid=\"rule-group\">\n <div className={styles.header} data-testid=\"rule-group-header\">\n <CollapseToggle\n className={styles.collapseToggle}\n isCollapsed={isCollapsed}\n onToggle={setIsCollapsed}\n data-testid=\"group-collapse-toggle\"\n />\n <Icon name={isCollapsed ? 'folder' : 'folder-open'} />\n {isCloudRulesSource(rulesSource) && (\n <Tooltip content={rulesSource.name} placement=\"top\">\n <img\n alt={rulesSource.meta.name}\n className={styles.dataSourceIcon}\n src={rulesSource.meta.info.logos.small}\n />\n </Tooltip>\n )}\n <h6 className={styles.heading}>\n {isFederated && <Badge color=\"purple\" text=\"Federated\" />} {groupName}\n </h6>\n <div className={styles.spacer} />\n <div className={styles.headerStats}>\n <RuleStats showInactive={false} group={group} />\n </div>\n {!!actionIcons.length && (\n <>\n <div className={styles.actionsSeparator}>|</div>\n <div className={styles.actionIcons}>{actionIcons}</div>\n </>\n )}\n </div>\n {!isCollapsed && (\n <RulesTable showSummaryColumn={true} className={styles.rulesTable} showGuidelines={true} rules={group.rules} />\n )}\n {isEditingGroup && (\n <EditCloudGroupModal group={group} namespace={namespace} onClose={() => setIsEditingGroup(false)} />\n )}\n <ConfirmModal\n isOpen={isDeletingGroup}\n title=\"Delete group\"\n body={\n <div>\n Deleting this group will permanently remove the group\n <br />\n and {group.rules.length} alert {pluralize('rule', group.rules.length)} belonging to it.\n <br />\n Are you sure you want to delete this group?\n </div>\n }\n onConfirm={deleteGroup}\n onDismiss={() => setIsDeletingGroup(false)}\n confirmText=\"Delete\"\n />\n </div>\n );\n});\n\nRulesGroup.displayName = 'RulesGroup';\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n & + & {\n margin-top: ${theme.spacing(2)};\n }\n `,\n header: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: ${theme.spacing(1)} ${theme.spacing(1)} ${theme.spacing(1)} 0;\n background-color: ${theme.colors.background.secondary};\n flex-wrap: wrap;\n `,\n headerStats: css`\n span {\n vertical-align: middle;\n }\n\n ${theme.breakpoints.down('sm')} {\n order: 2;\n width: 100%;\n padding-left: ${theme.spacing(1)};\n }\n `,\n heading: css`\n margin-left: ${theme.spacing(1)};\n margin-bottom: 0;\n `,\n spacer: css`\n flex: 1;\n `,\n collapseToggle: css`\n background: none;\n border: none;\n margin-top: -${theme.spacing(1)};\n margin-bottom: -${theme.spacing(1)};\n\n svg {\n margin-bottom: 0;\n }\n `,\n dataSourceIcon: css`\n width: ${theme.spacing(2)};\n height: ${theme.spacing(2)};\n margin-left: ${theme.spacing(2)};\n `,\n dataSourceOrigin: css`\n margin-right: 1em;\n color: ${theme.colors.text.disabled};\n `,\n actionsSeparator: css`\n margin: 0 ${theme.spacing(2)};\n `,\n actionIcons: css`\n & > * + * {\n margin-left: ${theme.spacing(0.5)};\n }\n `,\n rulesTable: css`\n margin-top: ${theme.spacing(3)};\n `,\n});\n","import { css } from '@emotion/css';\nimport pluralize from 'pluralize';\nimport React, { FC, useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { LoadingPlaceholder, useStyles2 } from '@grafana/ui';\nimport { CombinedRuleNamespace } from 'app/types/unified-alerting';\n\nimport { useUnifiedAlertingSelector } from '../../hooks/useUnifiedAlertingSelector';\nimport { getRulesDataSources, getRulesSourceName } from '../../utils/datasource';\n\nimport { RulesGroup } from './RulesGroup';\n\ninterface Props {\n namespaces: CombinedRuleNamespace[];\n expandAll: boolean;\n}\n\nexport const CloudRules: FC<Props> = ({ namespaces, expandAll }) => {\n const styles = useStyles2(getStyles);\n\n const dsConfigs = useUnifiedAlertingSelector((state) => state.dataSources);\n const rules = useUnifiedAlertingSelector((state) => state.promRules);\n const rulesDataSources = useMemo(getRulesDataSources, []);\n\n const dataSourcesLoading = useMemo(\n () => rulesDataSources.filter((ds) => rules[ds.name]?.loading || dsConfigs[ds.name]?.loading),\n [rules, dsConfigs, rulesDataSources]\n );\n\n return (\n <section className={styles.wrapper}>\n <div className={styles.sectionHeader}>\n <h5>Mimir / Cortex / Loki</h5>\n {dataSourcesLoading.length ? (\n <LoadingPlaceholder\n className={styles.loader}\n text={`Loading rules from ${dataSourcesLoading.length} ${pluralize('source', dataSourcesLoading.length)}`}\n />\n ) : (\n <div />\n )}\n </div>\n\n {namespaces.map((namespace) => {\n const { groups, rulesSource } = namespace;\n return groups.map((group) => (\n <RulesGroup\n group={group}\n key={`${getRulesSourceName(rulesSource)}-${name}-${group.name}`}\n namespace={namespace}\n expandAll={expandAll}\n />\n ));\n })}\n {namespaces?.length === 0 && !!rulesDataSources.length && <p>No rules found.</p>}\n {!rulesDataSources.length && <p>There are no Prometheus or Loki datas sources configured.</p>}\n </section>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n loader: css`\n margin-bottom: 0;\n `,\n sectionHeader: css`\n display: flex;\n justify-content: space-between;\n `,\n wrapper: css`\n margin-bottom: ${theme.v1.spacing.xl};\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { LoadingPlaceholder, useStyles } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { CombinedRuleNamespace } from 'app/types/unified-alerting';\n\nimport { flattenGrafanaManagedRules } from '../../hooks/useCombinedRuleNamespaces';\nimport { useUnifiedAlertingSelector } from '../../hooks/useUnifiedAlertingSelector';\nimport { GRAFANA_RULES_SOURCE_NAME } from '../../utils/datasource';\nimport { initialAsyncRequestState } from '../../utils/redux';\n\nimport { RulesGroup } from './RulesGroup';\n\ninterface Props {\n namespaces: CombinedRuleNamespace[];\n expandAll: boolean;\n}\n\nexport const GrafanaRules: FC<Props> = ({ namespaces, expandAll }) => {\n const styles = useStyles(getStyles);\n const [queryParams] = useQueryParams();\n\n const { loading } = useUnifiedAlertingSelector(\n (state) => state.promRules[GRAFANA_RULES_SOURCE_NAME] || initialAsyncRequestState\n );\n\n const wantsGroupedView = queryParams['view'] === 'grouped';\n const namespacesFormat = wantsGroupedView ? namespaces : flattenGrafanaManagedRules(namespaces);\n\n return (\n <section className={styles.wrapper}>\n <div className={styles.sectionHeader}>\n <h5>Grafana</h5>\n {loading ? <LoadingPlaceholder className={styles.loader} text=\"Loading...\" /> : <div />}\n </div>\n\n {namespacesFormat?.map((namespace) =>\n namespace.groups.map((group) => (\n <RulesGroup\n group={group}\n key={`${namespace.name}-${group.name}`}\n namespace={namespace}\n expandAll={expandAll}\n />\n ))\n )}\n {namespacesFormat?.length === 0 && <p>No rules found.</p>}\n </section>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n loader: css`\n margin-bottom: 0;\n `,\n sectionHeader: css`\n display: flex;\n justify-content: space-between;\n `,\n wrapper: css`\n margin-bottom: ${theme.spacing.xl};\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { CombinedRule } from 'app/types/unified-alerting';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { alertStateToReadable } from '../../utils/rules';\nimport { CollapseToggle } from '../CollapseToggle';\n\nimport { RulesTable } from './RulesTable';\n\ninterface Props {\n rules: CombinedRule[];\n state: PromAlertingRuleState;\n defaultCollapsed?: boolean;\n}\n\nexport const RuleListStateSection: FC<Props> = ({ rules, state, defaultCollapsed = false }) => {\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n const styles = useStyles2(getStyles);\n return (\n <>\n <h4 className={styles.header}>\n <CollapseToggle\n className={styles.collapseToggle}\n size=\"xxl\"\n isCollapsed={collapsed}\n onToggle={() => setCollapsed(!collapsed)}\n />\n {alertStateToReadable(state)} ({rules.length})\n </h4>\n {!collapsed && <RulesTable className={styles.rulesTable} rules={rules} showGroupColumn={true} />}\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n collapseToggle: css`\n vertical-align: middle;\n `,\n header: css`\n margin-top: ${theme.spacing(2)};\n `,\n rulesTable: css`\n margin-top: ${theme.spacing(3)};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport React, { FormEvent, useState } from 'react';\n\nimport { DataSourceInstanceSettings, GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { DataSourcePicker } from '@grafana/runtime';\nimport { Button, Field, Icon, Input, Label, RadioButtonGroup, Tooltip, useStyles } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { PromAlertingRuleState, PromRuleType } from 'app/types/unified-alerting-dto';\n\nimport { getFiltersFromUrlParams } from '../../utils/misc';\nimport { alertStateToReadable } from '../../utils/rules';\n\nconst ViewOptions: SelectableValue[] = [\n {\n icon: 'list-ul',\n label: 'List',\n value: 'list',\n },\n {\n icon: 'folder',\n label: 'Grouped',\n value: 'grouped',\n },\n {\n icon: 'heart-rate',\n label: 'State',\n value: 'state',\n },\n];\n\nconst RuleTypeOptions: SelectableValue[] = [\n {\n label: 'Alert ',\n value: PromRuleType.Alerting,\n },\n {\n label: 'Recording ',\n value: PromRuleType.Recording,\n },\n];\n\nconst RulesFilter = () => {\n const [queryParams, setQueryParams] = useQueryParams();\n // This key is used to force a rerender on the inputs when the filters are cleared\n const [filterKey, setFilterKey] = useState<number>(Math.floor(Math.random() * 100));\n const dataSourceKey = `dataSource-${filterKey}`;\n const queryStringKey = `queryString-${filterKey}`;\n\n const { dataSource, alertState, queryString, ruleType } = getFiltersFromUrlParams(queryParams);\n\n const styles = useStyles(getStyles);\n const stateOptions = Object.entries(PromAlertingRuleState).map(([key, value]) => ({\n label: alertStateToReadable(value),\n value,\n }));\n\n const handleDataSourceChange = (dataSourceValue: DataSourceInstanceSettings) => {\n setQueryParams({ dataSource: dataSourceValue.name });\n };\n\n const clearDataSource = () => {\n setQueryParams({ dataSource: null });\n };\n\n const handleQueryStringChange = debounce((e: FormEvent<HTMLInputElement>) => {\n const target = e.target as HTMLInputElement;\n setQueryParams({ queryString: target.value || null });\n }, 600);\n\n const handleAlertStateChange = (value: string) => {\n setQueryParams({ alertState: value });\n };\n\n const handleViewChange = (view: string) => {\n setQueryParams({ view });\n };\n\n const handleRuleTypeChange = (ruleType: PromRuleType) => {\n setQueryParams({ ruleType });\n };\n\n const handleClearFiltersClick = () => {\n setQueryParams({\n alertState: null,\n queryString: null,\n dataSource: null,\n ruleType: null,\n });\n setTimeout(() => setFilterKey(filterKey + 1), 100);\n };\n\n const searchIcon = <Icon name={'search'} />;\n return (\n <div className={styles.container}>\n <Field className={styles.inputWidth} label=\"Search by data source\">\n <DataSourcePicker\n key={dataSourceKey}\n alerting\n noDefault\n placeholder=\"All data sources\"\n current={dataSource}\n onChange={handleDataSourceChange}\n onClear={clearDataSource}\n />\n </Field>\n <div className={cx(styles.flexRow, styles.spaceBetween)}>\n <div className={styles.flexRow}>\n <Field\n className={styles.rowChild}\n label={\n <Label>\n <Stack gap={0.5}>\n <span>Search by label</span>\n <Tooltip\n content={\n <div>\n Filter rules and alerts using label querying, ex:\n <code>{`{severity=\"critical\", instance=~\"cluster-us-.+\"}`}</code>\n </div>\n }\n >\n <Icon name=\"info-circle\" size=\"sm\" />\n </Tooltip>\n </Stack>\n </Label>\n }\n >\n <Input\n key={queryStringKey}\n className={styles.inputWidth}\n prefix={searchIcon}\n onChange={handleQueryStringChange}\n defaultValue={queryString}\n placeholder=\"Search\"\n data-testid=\"search-query-input\"\n />\n </Field>\n <div className={styles.rowChild}>\n <Label>State</Label>\n <RadioButtonGroup options={stateOptions} value={alertState} onChange={handleAlertStateChange} />\n </div>\n <div className={styles.rowChild}>\n <Label>Rule type</Label>\n <RadioButtonGroup\n options={RuleTypeOptions}\n value={ruleType as PromRuleType}\n onChange={handleRuleTypeChange}\n />\n </div>\n <div className={styles.rowChild}>\n <Label>View as</Label>\n <RadioButtonGroup\n options={ViewOptions}\n value={String(queryParams['view'] ?? ViewOptions[0].value)}\n onChange={handleViewChange}\n />\n </div>\n </div>\n {(dataSource || alertState || queryString || ruleType) && (\n <div className={styles.flexRow}>\n <Button\n className={styles.clearButton}\n fullWidth={false}\n icon=\"times\"\n variant=\"secondary\"\n onClick={handleClearFiltersClick}\n >\n Clear filters\n </Button>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => {\n return {\n container: css`\n display: flex;\n flex-direction: column;\n padding-bottom: ${theme.spacing.sm};\n margin-bottom: ${theme.spacing.sm};\n `,\n inputWidth: css`\n width: 340px;\n flex-grow: 0;\n `,\n flexRow: css`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n width: 100%;\n flex-wrap: wrap;\n `,\n spaceBetween: css`\n justify-content: space-between;\n `,\n rowChild: css`\n margin: 0 ${theme.spacing.sm} 0 0;\n `,\n clearButton: css`\n margin-top: ${theme.spacing.sm};\n `,\n };\n};\n\nexport default RulesFilter;\n","import { useMemo } from 'react';\n\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { CombinedRuleGroup, CombinedRuleNamespace, FilterState } from 'app/types/unified-alerting';\nimport { PromRuleType, RulerGrafanaRuleDTO } from 'app/types/unified-alerting-dto';\n\nimport { labelsMatchMatchers, parseMatchers } from '../utils/alertmanager';\nimport { isCloudRulesSource } from '../utils/datasource';\nimport { getFiltersFromUrlParams } from '../utils/misc';\nimport { isAlertingRule, isGrafanaRulerRule } from '../utils/rules';\n\nexport const useFilteredRules = (namespaces: CombinedRuleNamespace[]) => {\n const [queryParams] = useQueryParams();\n const filters = getFiltersFromUrlParams(queryParams);\n\n return useMemo(() => {\n const filteredNamespaces = namespaces\n // Filter by data source\n // TODO: filter by multiple data sources for grafana-managed alerts\n .filter(({ rulesSource }) =>\n filters.dataSource && isCloudRulesSource(rulesSource) ? rulesSource.name === filters.dataSource : true\n )\n // If a namespace and group have rules that match the rules filters then keep them.\n .reduce(reduceNamespaces(filters), [] as CombinedRuleNamespace[]);\n return filteredNamespaces;\n }, [namespaces, filters]);\n};\n\nconst reduceNamespaces = (filters: FilterState) => {\n return (namespaceAcc: CombinedRuleNamespace[], namespace: CombinedRuleNamespace) => {\n const groups = namespace.groups.reduce(reduceGroups(filters), [] as CombinedRuleGroup[]);\n\n if (groups.length) {\n namespaceAcc.push({\n ...namespace,\n groups,\n });\n }\n\n return namespaceAcc;\n };\n};\n\n// Reduces groups to only groups that have rules matching the filters\nconst reduceGroups = (filters: FilterState) => {\n return (groupAcc: CombinedRuleGroup[], group: CombinedRuleGroup) => {\n const rules = group.rules.filter((rule) => {\n if (filters.ruleType && filters.ruleType !== rule.promRule?.type) {\n return false;\n }\n if (filters.dataSource && isGrafanaRulerRule(rule.rulerRule) && !isQueryingDataSource(rule.rulerRule, filters)) {\n return false;\n }\n // Query strings can match alert name, label keys, and label values\n if (filters.queryString) {\n const normalizedQueryString = filters.queryString.toLocaleLowerCase();\n const doesNameContainsQueryString = rule.name?.toLocaleLowerCase().includes(normalizedQueryString);\n const matchers = parseMatchers(filters.queryString);\n\n const doRuleLabelsMatchQuery = labelsMatchMatchers(rule.labels, matchers);\n const doAlertsContainMatchingLabels =\n rule.promRule &&\n rule.promRule.type === PromRuleType.Alerting &&\n rule.promRule.alerts &&\n rule.promRule.alerts.some((alert) => labelsMatchMatchers(alert.labels, matchers));\n\n if (!(doesNameContainsQueryString || doRuleLabelsMatchQuery || doAlertsContainMatchingLabels)) {\n return false;\n }\n }\n if (\n filters.alertState &&\n !(rule.promRule && isAlertingRule(rule.promRule) && rule.promRule.state === filters.alertState)\n ) {\n return false;\n }\n return true;\n });\n // Add rules to the group that match the rule list filters\n if (rules.length) {\n groupAcc.push({\n ...group,\n rules,\n });\n }\n return groupAcc;\n };\n};\n\nconst isQueryingDataSource = (rulerRule: RulerGrafanaRuleDTO, filter: FilterState): boolean => {\n if (!filter.dataSource) {\n return true;\n }\n\n return !!rulerRule.grafana_alert.data.find((query) => {\n if (!query.datasourceUid) {\n return false;\n }\n const ds = getDataSourceSrv().getInstanceSettings(query.datasourceUid);\n return ds?.name === filter.dataSource;\n });\n};\n","import { css } from '@emotion/css';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { GrafanaTheme2, urlUtil } from '@grafana/data';\nimport { Button, LinkButton, useStyles2, withErrorBoundary } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\n\nimport { AlertingPageWrapper } from './components/AlertingPageWrapper';\nimport { NoRulesSplash } from './components/rules/NoRulesCTA';\nimport { RuleListErrors } from './components/rules/RuleListErrors';\nimport { RuleListGroupView } from './components/rules/RuleListGroupView';\nimport { RuleListStateView } from './components/rules/RuleListStateView';\nimport { RuleStats } from './components/rules/RuleStats';\nimport RulesFilter from './components/rules/RulesFilter';\nimport { useCombinedRuleNamespaces } from './hooks/useCombinedRuleNamespaces';\nimport { useFilteredRules } from './hooks/useFilteredRules';\nimport { useUnifiedAlertingSelector } from './hooks/useUnifiedAlertingSelector';\nimport { fetchAllPromAndRulerRulesAction } from './state/actions';\nimport { useRulesAccess } from './utils/accessControlHooks';\nimport { RULE_LIST_POLL_INTERVAL_MS } from './utils/constants';\nimport { getAllRulesSourceNames } from './utils/datasource';\nimport { getFiltersFromUrlParams } from './utils/misc';\n\nconst VIEWS = {\n groups: RuleListGroupView,\n state: RuleListStateView,\n};\n\nconst RuleList = withErrorBoundary(\n () => {\n const dispatch = useDispatch();\n const styles = useStyles2(getStyles);\n const rulesDataSourceNames = useMemo(getAllRulesSourceNames, []);\n const location = useLocation();\n const [expandAll, setExpandAll] = useState(false);\n\n const [queryParams] = useQueryParams();\n const filters = getFiltersFromUrlParams(queryParams);\n const filtersActive = Object.values(filters).some((filter) => filter !== undefined);\n\n const { canCreateGrafanaRules, canCreateCloudRules } = useRulesAccess();\n\n const view = VIEWS[queryParams['view'] as keyof typeof VIEWS]\n ? (queryParams['view'] as keyof typeof VIEWS)\n : 'groups';\n\n const ViewComponent = VIEWS[view];\n\n // fetch rules, then poll every RULE_LIST_POLL_INTERVAL_MS\n useEffect(() => {\n dispatch(fetchAllPromAndRulerRulesAction());\n const interval = setInterval(() => dispatch(fetchAllPromAndRulerRulesAction()), RULE_LIST_POLL_INTERVAL_MS);\n return () => {\n clearInterval(interval);\n };\n }, [dispatch]);\n\n const promRuleRequests = useUnifiedAlertingSelector((state) => state.promRules);\n const rulerRuleRequests = useUnifiedAlertingSelector((state) => state.rulerRules);\n\n const dispatched = rulesDataSourceNames.some(\n (name) => promRuleRequests[name]?.dispatched || rulerRuleRequests[name]?.dispatched\n );\n const loading = rulesDataSourceNames.some(\n (name) => promRuleRequests[name]?.loading || rulerRuleRequests[name]?.loading\n );\n const haveResults = rulesDataSourceNames.some(\n (name) =>\n (promRuleRequests[name]?.result?.length && !promRuleRequests[name]?.error) ||\n (Object.keys(rulerRuleRequests[name]?.result || {}).length && !rulerRuleRequests[name]?.error)\n );\n\n const showNewAlertSplash = dispatched && !loading && !haveResults;\n\n const combinedNamespaces = useCombinedRuleNamespaces();\n const filteredNamespaces = useFilteredRules(combinedNamespaces);\n return (\n <AlertingPageWrapper pageId=\"alert-list\" isLoading={loading && !haveResults}>\n <RuleListErrors />\n {!showNewAlertSplash && (\n <>\n <RulesFilter />\n <div className={styles.break} />\n <div className={styles.buttonsContainer}>\n <div className={styles.statsContainer}>\n {view === 'groups' && filtersActive && (\n <Button\n className={styles.expandAllButton}\n icon={expandAll ? 'angle-double-up' : 'angle-double-down'}\n variant=\"secondary\"\n onClick={() => setExpandAll(!expandAll)}\n >\n {expandAll ? 'Collapse all' : 'Expand all'}\n </Button>\n )}\n <RuleStats showInactive={true} showRecording={true} namespaces={filteredNamespaces} />\n </div>\n {(canCreateGrafanaRules || canCreateCloudRules) && (\n <LinkButton\n href={urlUtil.renderUrl('alerting/new', { returnTo: location.pathname + location.search })}\n icon=\"plus\"\n >\n New alert rule\n </LinkButton>\n )}\n </div>\n </>\n )}\n {showNewAlertSplash && <NoRulesSplash />}\n {haveResults && <ViewComponent expandAll={expandAll} namespaces={filteredNamespaces} />}\n </AlertingPageWrapper>\n );\n },\n { style: 'page' }\n);\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n break: css`\n width: 100%;\n height: 0;\n margin-bottom: ${theme.spacing(2)};\n border-bottom: solid 1px ${theme.colors.border.medium};\n `,\n buttonsContainer: css`\n margin-bottom: ${theme.spacing(2)};\n display: flex;\n justify-content: space-between;\n `,\n statsContainer: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n `,\n expandAllButton: css`\n margin-right: ${theme.spacing(1)};\n `,\n});\n\nexport default RuleList;\n","import React, { FC, useMemo } from 'react';\n\nimport { AccessControlAction } from 'app/types';\nimport { CombinedRuleNamespace } from 'app/types/unified-alerting';\n\nimport { isCloudRulesSource, isGrafanaRulesSource } from '../../utils/datasource';\nimport { Authorize } from '../Authorize';\n\nimport { CloudRules } from './CloudRules';\nimport { GrafanaRules } from './GrafanaRules';\n\ninterface Props {\n namespaces: CombinedRuleNamespace[];\n expandAll: boolean;\n}\n\nexport const RuleListGroupView: FC<Props> = ({ namespaces, expandAll }) => {\n const [grafanaNamespaces, cloudNamespaces] = useMemo(() => {\n const sorted = namespaces\n .map((namespace) => ({\n ...namespace,\n groups: namespace.groups.sort((a, b) => a.name.localeCompare(b.name)),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n return [\n sorted.filter((ns) => isGrafanaRulesSource(ns.rulesSource)),\n sorted.filter((ns) => isCloudRulesSource(ns.rulesSource)),\n ];\n }, [namespaces]);\n\n return (\n <>\n <Authorize actions={[AccessControlAction.AlertingRuleRead]}>\n <GrafanaRules namespaces={grafanaNamespaces} expandAll={expandAll} />\n </Authorize>\n <Authorize actions={[AccessControlAction.AlertingRuleExternalRead]}>\n <CloudRules namespaces={cloudNamespaces} expandAll={expandAll} />\n </Authorize>\n </>\n );\n};\n","import React, { FC, useMemo } from 'react';\n\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { CombinedRule, CombinedRuleNamespace } from 'app/types/unified-alerting';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { getFiltersFromUrlParams } from '../../utils/misc';\nimport { isAlertingRule } from '../../utils/rules';\n\nimport { RuleListStateSection } from './RuleListStateSection';\n\ninterface Props {\n namespaces: CombinedRuleNamespace[];\n expandAll?: boolean;\n}\n\ntype GroupedRules = Record<PromAlertingRuleState, CombinedRule[]>;\n\nexport const RuleListStateView: FC<Props> = ({ namespaces }) => {\n const filters = getFiltersFromUrlParams(useQueryParams()[0]);\n\n const groupedRules = useMemo(() => {\n const result: GroupedRules = {\n [PromAlertingRuleState.Firing]: [],\n [PromAlertingRuleState.Inactive]: [],\n [PromAlertingRuleState.Pending]: [],\n };\n\n namespaces.forEach((namespace) =>\n namespace.groups.forEach((group) =>\n group.rules.forEach((rule) => {\n if (rule.promRule && isAlertingRule(rule.promRule)) {\n result[rule.promRule.state].push(rule);\n }\n })\n )\n );\n\n Object.values(result).forEach((rules) => rules.sort((a, b) => a.name.localeCompare(b.name)));\n\n return result;\n }, [namespaces]);\n return (\n <>\n {(!filters.alertState || filters.alertState === PromAlertingRuleState.Firing) && (\n <RuleListStateSection state={PromAlertingRuleState.Firing} rules={groupedRules[PromAlertingRuleState.Firing]} />\n )}\n {(!filters.alertState || filters.alertState === PromAlertingRuleState.Pending) && (\n <RuleListStateSection\n state={PromAlertingRuleState.Pending}\n rules={groupedRules[PromAlertingRuleState.Pending]}\n />\n )}\n {(!filters.alertState || filters.alertState === PromAlertingRuleState.Inactive) && (\n <RuleListStateSection\n defaultCollapsed={filters.alertState !== PromAlertingRuleState.Inactive}\n state={PromAlertingRuleState.Inactive}\n rules={groupedRules[PromAlertingRuleState.Inactive]}\n />\n )}\n </>\n );\n};\n","import React, { FC } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport Page from 'app/core/components/Page/Page';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { StoreState } from 'app/types/store';\n\ninterface Props {\n pageId: string;\n isLoading?: boolean;\n}\n\nexport const AlertingPageWrapper: FC<Props> = ({ children, pageId, isLoading }) => {\n const navModel = getNavModel(\n useSelector((state: StoreState) => state.navIndex),\n pageId\n );\n\n return (\n <Page navModel={navModel}>\n <Page.Contents isLoading={isLoading}>{children}</Page.Contents>\n </Page>\n );\n};\n","import React, { FC } from 'react';\n\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction } from 'app/types';\n\ntype Props = {\n actions: AccessControlAction[];\n fallback?: boolean;\n};\n\nexport const Authorize: FC<Props> = ({ actions, children, fallback = true }) => {\n if (actions.some((action) => contextSrv.hasAccess(action, fallback))) {\n return <>{children}</>;\n } else {\n return null;\n }\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { DynamicTable, DynamicTableProps } from './DynamicTable';\n\nexport type DynamicTableWithGuidelinesProps<T> = Omit<DynamicTableProps<T>, 'renderPrefixHeader, renderPrefixCell'>;\n\n// DynamicTable, but renders visual guidelines on the left, for larger screen widths\nexport const DynamicTableWithGuidelines = <T extends object>({\n renderExpandedContent,\n ...props\n}: DynamicTableWithGuidelinesProps<T>) => {\n const styles = useStyles2(getStyles);\n return (\n <DynamicTable\n renderExpandedContent={\n renderExpandedContent\n ? (item, index, items) => (\n <>\n {!(index === items.length - 1) && <div className={cx(styles.contentGuideline, styles.guideline)} />}\n {renderExpandedContent(item, index, items)}\n </>\n )\n : undefined\n }\n renderPrefixHeader={() => (\n <div className={styles.relative}>\n <div className={cx(styles.headerGuideline, styles.guideline)} />\n </div>\n )}\n renderPrefixCell={(_, index, items) => (\n <div className={styles.relative}>\n <div className={cx(styles.topGuideline, styles.guideline)} />\n {!(index === items.length - 1) && <div className={cx(styles.bottomGuideline, styles.guideline)} />}\n </div>\n )}\n {...props}\n />\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n relative: css`\n position: relative;\n height: 100%;\n `,\n guideline: css`\n left: -19px;\n border-left: 1px solid ${theme.colors.border.medium};\n position: absolute;\n\n ${theme.breakpoints.down('md')} {\n display: none;\n }\n `,\n topGuideline: css`\n width: 18px;\n border-bottom: 1px solid ${theme.colors.border.medium};\n top: 0;\n bottom: 50%;\n `,\n bottomGuideline: css`\n top: 50%;\n bottom: 0;\n `,\n contentGuideline: css`\n top: 0;\n bottom: 0;\n left: -49px !important;\n `,\n headerGuideline: css`\n top: -25px;\n bottom: 0;\n `,\n});\n","import React, { FC } from 'react';\n\nimport { Icon } from '@grafana/ui';\n\ninterface RuleLocationProps {\n namespace: string;\n group?: string;\n}\n\nconst RuleLocation: FC<RuleLocationProps> = ({ namespace, group }) => {\n if (!group) {\n return <>{namespace}</>;\n }\n\n return (\n <>\n {namespace} <Icon name=\"angle-right\" /> {group}\n </>\n );\n};\n\nexport { RuleLocation };\n","import React, { FC } from 'react';\n\nimport { IconName, Tooltip, LinkButton, Button } from '@grafana/ui';\nimport { PopoverContent, TooltipPlacement } from '@grafana/ui/src/components/Tooltip';\n\ninterface Props {\n tooltip: PopoverContent;\n icon: IconName;\n className?: string;\n tooltipPlacement?: TooltipPlacement;\n to?: string;\n target?: string;\n onClick?: () => void;\n 'data-testid'?: string;\n}\n\nexport const ActionIcon: FC<Props> = ({\n tooltip,\n icon,\n to,\n target,\n onClick,\n className,\n tooltipPlacement = 'top',\n ...rest\n}) => {\n const ariaLabel = typeof tooltip === 'string' ? tooltip : undefined;\n\n return (\n <Tooltip content={tooltip} placement={tooltipPlacement}>\n {to ? (\n <LinkButton\n variant=\"secondary\"\n fill=\"text\"\n icon={icon}\n href={to}\n size=\"sm\"\n target={target}\n {...rest}\n aria-label={ariaLabel}\n />\n ) : (\n <Button\n className={className}\n variant=\"secondary\"\n fill=\"text\"\n size=\"sm\"\n icon={icon}\n type=\"button\"\n onClick={onClick}\n {...rest}\n aria-label={ariaLabel}\n />\n )}\n </Tooltip>\n );\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { CombinedRule } from 'app/types/unified-alerting';\n\nimport { AlertLabels } from '../AlertLabels';\nimport { DetailsField } from '../DetailsField';\n\nimport { RuleDetailsActionButtons } from './RuleDetailsActionButtons';\nimport { RuleDetailsAnnotations } from './RuleDetailsAnnotations';\nimport { RuleDetailsDataSources } from './RuleDetailsDataSources';\nimport { RuleDetailsExpression } from './RuleDetailsExpression';\nimport { RuleDetailsMatchingInstances } from './RuleDetailsMatchingInstances';\n\ninterface Props {\n rule: CombinedRule;\n}\n\nexport const RuleDetails: FC<Props> = ({ rule }) => {\n const styles = useStyles2(getStyles);\n const {\n namespace: { rulesSource },\n } = rule;\n\n const annotations = Object.entries(rule.annotations).filter(([_, value]) => !!value.trim());\n\n return (\n <div>\n <RuleDetailsActionButtons rule={rule} rulesSource={rulesSource} />\n <div className={styles.wrapper}>\n <div className={styles.leftSide}>\n {!!rule.labels && !!Object.keys(rule.labels).length && (\n <DetailsField label=\"Labels\" horizontal={true}>\n <AlertLabels labels={rule.labels} />\n </DetailsField>\n )}\n <RuleDetailsExpression rulesSource={rulesSource} rule={rule} annotations={annotations} />\n <RuleDetailsAnnotations annotations={annotations} />\n </div>\n <div className={styles.rightSide}>\n <RuleDetailsDataSources rulesSource={rulesSource} rule={rule} />\n </div>\n </div>\n <RuleDetailsMatchingInstances rule={rule} />\n </div>\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n display: flex;\n flex-direction: row;\n\n ${theme.breakpoints.down('md')} {\n flex-direction: column;\n }\n `,\n leftSide: css`\n flex: 1;\n `,\n rightSide: css`\n ${theme.breakpoints.up('md')} {\n padding-left: 90px;\n width: 300px;\n }\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { CombinedRule } from 'app/types/unified-alerting';\n\nimport { useHasRuler } from '../../hooks/useHasRuler';\nimport { Annotation } from '../../utils/constants';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\nimport { DynamicTableWithGuidelines } from '../DynamicTableWithGuidelines';\nimport { RuleLocation } from '../RuleLocation';\n\nimport { RuleDetails } from './RuleDetails';\nimport { RuleHealth } from './RuleHealth';\nimport { RuleState } from './RuleState';\n\ntype RuleTableColumnProps = DynamicTableColumnProps<CombinedRule>;\ntype RuleTableItemProps = DynamicTableItemProps<CombinedRule>;\n\ninterface Props {\n rules: CombinedRule[];\n showGuidelines?: boolean;\n showGroupColumn?: boolean;\n showSummaryColumn?: boolean;\n emptyMessage?: string;\n className?: string;\n}\n\nexport const RulesTable: FC<Props> = ({\n rules,\n className,\n showGuidelines = false,\n emptyMessage = 'No rules found.',\n showGroupColumn = false,\n showSummaryColumn = false,\n}) => {\n const styles = useStyles2(getStyles);\n\n const wrapperClass = cx(styles.wrapper, className, { [styles.wrapperMargin]: showGuidelines });\n\n const items = useMemo((): RuleTableItemProps[] => {\n const seenKeys: string[] = [];\n return rules.map((rule, ruleIdx) => {\n let key = JSON.stringify([rule.promRule?.type, rule.labels, rule.query, rule.name, rule.annotations]);\n if (seenKeys.includes(key)) {\n key += `-${ruleIdx}`;\n }\n seenKeys.push(key);\n return {\n id: key,\n data: rule,\n };\n });\n }, [rules]);\n\n const columns = useColumns(showSummaryColumn, showGroupColumn);\n\n if (!rules.length) {\n return <div className={cx(wrapperClass, styles.emptyMessage)}>{emptyMessage}</div>;\n }\n\n const TableComponent = showGuidelines ? DynamicTableWithGuidelines : DynamicTable;\n\n return (\n <div className={wrapperClass} data-testid=\"rules-table\">\n <TableComponent\n cols={columns}\n isExpandable={true}\n items={items}\n renderExpandedContent={({ data: rule }) => <RuleDetails rule={rule} />}\n />\n </div>\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n wrapperMargin: css`\n ${theme.breakpoints.up('md')} {\n margin-left: 36px;\n }\n `,\n emptyMessage: css`\n padding: ${theme.spacing(1)};\n `,\n wrapper: css`\n width: auto;\n background-color: ${theme.colors.background.secondary};\n border-radius: ${theme.shape.borderRadius()};\n `,\n});\n\nfunction useColumns(showSummaryColumn: boolean, showGroupColumn: boolean) {\n const { hasRuler, rulerRulesLoaded } = useHasRuler();\n\n return useMemo((): RuleTableColumnProps[] => {\n const columns: RuleTableColumnProps[] = [\n {\n id: 'state',\n label: 'State',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: rule }) => {\n const { namespace } = rule;\n const { rulesSource } = namespace;\n const { promRule, rulerRule } = rule;\n const isDeleting = !!(hasRuler(rulesSource) && rulerRulesLoaded(rulesSource) && promRule && !rulerRule);\n const isCreating = !!(hasRuler(rulesSource) && rulerRulesLoaded(rulesSource) && rulerRule && !promRule);\n return <RuleState rule={rule} isDeleting={isDeleting} isCreating={isCreating} />;\n },\n size: '165px',\n },\n {\n id: 'name',\n label: 'Name',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: rule }) => rule.name,\n size: 5,\n },\n {\n id: 'health',\n label: 'Health',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: { promRule } }) => (promRule ? <RuleHealth rule={promRule} /> : null),\n size: '75px',\n },\n ];\n if (showSummaryColumn) {\n columns.push({\n id: 'summary',\n label: 'Summary',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: rule }) => rule.annotations[Annotation.summary] ?? '',\n size: 5,\n });\n }\n if (showGroupColumn) {\n columns.push({\n id: 'group',\n label: 'Group',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: rule }) => {\n const { namespace, group } = rule;\n // ungrouped rules are rules that are in the \"default\" group name\n const isUngrouped = group.name === 'default';\n const groupName = isUngrouped ? (\n <RuleLocation namespace={namespace.name} />\n ) : (\n <RuleLocation namespace={namespace.name} group={group.name} />\n );\n\n return groupName;\n },\n size: 5,\n });\n }\n return columns;\n }, [hasRuler, rulerRulesLoaded, showSummaryColumn, showGroupColumn]);\n}\n","import { useCallback } from 'react';\n\nimport { RulesSource } from 'app/types/unified-alerting';\n\nimport { getRulesSourceName, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\n// datasource has ruler if it's grafana managed or if we're able to load rules from it\nexport function useHasRuler() {\n const rulerRules = useUnifiedAlertingSelector((state) => state.rulerRules);\n\n const hasRuler = useCallback(\n (rulesSource: string | RulesSource) => {\n const rulesSourceName = typeof rulesSource === 'string' ? rulesSource : rulesSource.name;\n return rulesSourceName === GRAFANA_RULES_SOURCE_NAME || !!rulerRules[rulesSourceName]?.result;\n },\n [rulerRules]\n );\n\n const rulerRulesLoaded = useCallback(\n (rulesSource: RulesSource) => {\n const rulesSourceName = getRulesSourceName(rulesSource);\n const result = rulerRules[rulesSourceName]?.result;\n\n return Boolean(result);\n },\n [rulerRules]\n );\n\n return { hasRuler, rulerRulesLoaded };\n}\n","import { useMemo } from 'react';\n\nimport { getRulesAccess } from './access-control';\n\nexport function useRulesAccess() {\n return useMemo(() => getRulesAccess(), []);\n}\n"],"names":["useCleanup","stateSelector","dispatch","useDispatch","selectorRef","useRef","current","useEffect","cleanUpAction","AlertHowToModal","onDismiss","Modal","title","isOpen","onClickBackdrop","VerticalGroup","spacing","src","alt","rule","search","onTogglePause","ruleUrl","url","panelId","renderText","useCallback","text","highlightClassName","textToHighlight","searchWords","Card","name","Icon","size","stateIcon","className","stateClass","stateText","stateAge","info","Button","variant","icon","state","onClick","LinkButton","href","DeprecationNotice","Alert","severity","getSearchQuery","searchQuery","getAlertRuleItems","regex","RegExp","alertRules","items","filter","item","test","mapDispatchToProps","getAlertRulesAsync","setSearchQuery","togglePauseAlertRule","connector","connect","navModel","getNavModel","navIndex","isLoading","AlertRuleListUnconnected","PureComponent","label","value","option","locationService","appEvents","ShowModalReactEvent","component","this","props","id","paused","componentDidMount","fetchRules","componentDidUpdate","prevProps","queryParams","getStateFilter","render","Page","FilterInput","placeholder","onChange","onSearchQueryChange","htmlFor","Select","inputId","options","stateFilters","onStateFilterChanged","config","onOpenHowTo","map","async","loadAlertRules","rules","getBackendSrv","get","loadedAlertRules","post","toString","createNotificationChannel","data","notifyApp","createSuccessNotification","error","createErrorNotification","updateNotificationChannel","put","testNotificationChannel","getState","channel","notificationChannel","loadNotificationTypes","notificationTypes","sort","o1","o2","setNotificationChannels","loadNotificationChannel","notificationChannelLoaded","NoRulesSplash","canCreateGrafanaRules","canCreateCloudRules","useRulesAccess","EmptyListCTA","buttonIcon","buttonLink","buttonTitle","proTip","proTipLink","proTipLinkTitle","proTipTarget","CallToActionCard","message","callToActionElement","RuleListErrors","expanded","setExpanded","useState","closed","setClosed","useLocalStorage","dataSourceConfigRequests","useUnifiedAlertingSelector","dataSources","promRuleRequests","promRules","rulerRuleRequests","rulerRules","styles","useStyles2","getStyles","errors","useMemo","dataSourceConfigErrors","promRequestErrors","rulerRequestErrors","requests","getRulesDataSources","reduce","result","dataSource","isRulerNotSupportedResponse","grafanaPromError","GRAFANA_RULES_SOURCE_NAME","grafanaRulerError","push","forEach","uid","length","ErrorSummaryButton","count","onRemove","idx","moreButton","fill","pluralize","floatRight","Tooltip","content","placement","theme","css","EditCloudGroupModal","namespace","group","onClose","loading","dispatched","updateLotexNamespaceAndGroup","initialAsyncRequestState","defaultValues","namespaceName","groupName","groupInterval","interval","unifiedAlerting","modal","Form","onSubmit","values","updateLotexNamespaceAndGroupAction","rulesSourceName","getRulesSourceName","rulesSource","newGroupName","newNamespaceName","undefined","register","formState","isDirty","Field","invalid","Input","required","pattern","durationValidationPattern","type","disabled","JSON","stringify","StateColoredText","children","status","PromAlertingRuleState","colors","success","warning","neutral","secondary","emptyStats","total","recording","RuleStats","showInactive","showRecording","namespaces","calculated","stats","calcRule","promRule","isAlertingRule","health","isRecordingRule","rulerRule","isRecordingRulerRule","groups","statsComponents","prev","curr","Fragment","RulesGroup","React","expandAll","isEditingGroup","setIsEditingGroup","isDeletingGroup","setIsDeletingGroup","isCollapsed","setIsCollapsed","canEditRules","hasRuler","rulerRulesLoaded","useHasRuler","folderUID","isGrafanaRulerRule","grafana_alert","namespace_uid","folder","useFolder","isDeleting","find","isFederated","isFederatedRuleGroup","actionIcons","HorizontalGroup","Spinner","baseUrl","kbn","canSave","ActionIcon","A","tooltip","to","target","canAdmin","RuleLocation","wrapper","header","CollapseToggle","collapseToggle","onToggle","isCloudRulesSource","meta","dataSourceIcon","logos","small","heading","Badge","color","spacer","headerStats","actionsSeparator","RulesTable","showSummaryColumn","rulesTable","showGuidelines","ConfirmModal","body","onConfirm","deleteRulesGroupAction","confirmText","displayName","background","breakpoints","down","dataSourceOrigin","CloudRules","dsConfigs","rulesDataSources","dataSourcesLoading","ds","sectionHeader","LoadingPlaceholder","loader","v1","xl","GrafanaRules","useStyles","useQueryParams","namespacesFormat","flattenGrafanaManagedRules","RuleListStateSection","defaultCollapsed","collapsed","setCollapsed","alertStateToReadable","showGroupColumn","ViewOptions","RuleTypeOptions","PromRuleType","container","sm","inputWidth","flexRow","spaceBetween","rowChild","clearButton","setQueryParams","filterKey","setFilterKey","Math","floor","random","dataSourceKey","queryStringKey","alertState","queryString","ruleType","getFiltersFromUrlParams","stateOptions","Object","entries","key","handleQueryStringChange","debounce","e","searchIcon","DataSourcePicker","alerting","noDefault","dataSourceValue","onClear","cx","Label","Stack","gap","prefix","defaultValue","RadioButtonGroup","String","view","fullWidth","setTimeout","reduceNamespaces","filters","namespaceAcc","reduceGroups","groupAcc","isQueryingDataSource","normalizedQueryString","toLocaleLowerCase","doesNameContainsQueryString","includes","matchers","parseMatchers","doRuleLabelsMatchQuery","labelsMatchMatchers","labels","doAlertsContainMatchingLabels","alerts","some","alert","query","datasourceUid","getDataSourceSrv","getInstanceSettings","VIEWS","grafanaNamespaces","cloudNamespaces","sorted","a","b","localeCompare","ns","isGrafanaRulesSource","Authorize","actions","AccessControlAction","groupedRules","RuleList","withErrorBoundary","rulesDataSourceNames","getAllRulesSourceNames","location","useLocation","setExpandAll","filtersActive","ViewComponent","fetchAllPromAndRulerRulesAction","setInterval","RULE_LIST_POLL_INTERVAL_MS","clearInterval","haveResults","keys","showNewAlertSplash","filteredNamespaces","useFilteredRules","useCombinedRuleNamespaces","AlertingPageWrapper","pageId","break","buttonsContainer","statsContainer","expandAllButton","urlUtil","returnTo","pathname","style","border","medium","useSelector","fallback","action","contextSrv","DynamicTableWithGuidelines","renderExpandedContent","index","contentGuideline","guideline","renderPrefixHeader","relative","headerGuideline","renderPrefixCell","_","topGuideline","bottomGuideline","tooltipPlacement","rest","ariaLabel","RuleDetails","annotations","trim","RuleDetailsActionButtons","leftSide","DetailsField","horizontal","AlertLabels","RuleDetailsExpression","RuleDetailsAnnotations","rightSide","RuleDetailsDataSources","RuleDetailsMatchingInstances","up","emptyMessage","wrapperClass","wrapperMargin","seenKeys","ruleIdx","columns","renderCell","isCreating","RuleState","RuleHealth","Annotation","useColumns","TableComponent","DynamicTable","cols","isExpandable","shape","borderRadius","Boolean","getRulesAccess"],"sourceRoot":""}
|