@vendure/admin-ui-plugin 2.0.0-next.21 → 2.0.0-next.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/lib/admin-ui/165.6aeb6ecf722558ee.js.map +1 -1
  2. package/lib/admin-ui/{239.e2e63f2ccd517604.js → 239.bc59928cd01c7e91.js} +2 -2
  3. package/lib/admin-ui/{239.e2e63f2ccd517604.js.map → 239.bc59928cd01c7e91.js.map} +1 -1
  4. package/lib/admin-ui/26.6407e52b6e31b210.js +2 -0
  5. package/lib/admin-ui/26.6407e52b6e31b210.js.map +1 -0
  6. package/lib/admin-ui/{316.265d65a6a9d1b4c0.js → 316.d7ad74308299e698.js} +2 -2
  7. package/lib/admin-ui/{316.265d65a6a9d1b4c0.js.map → 316.d7ad74308299e698.js.map} +1 -1
  8. package/lib/admin-ui/{356.975f7f2d201afda5.js → 356.35ca041b6f7a6cc0.js} +2 -2
  9. package/lib/admin-ui/{356.975f7f2d201afda5.js.map → 356.35ca041b6f7a6cc0.js.map} +1 -1
  10. package/lib/admin-ui/430.827b68efffc7eada.js +65 -0
  11. package/lib/admin-ui/430.827b68efffc7eada.js.map +1 -0
  12. package/lib/admin-ui/496.e4c426e8cc0f3034.js +12 -0
  13. package/lib/admin-ui/496.e4c426e8cc0f3034.js.map +1 -0
  14. package/lib/admin-ui/625.ce0752367b2918a3.js +2 -0
  15. package/lib/admin-ui/625.ce0752367b2918a3.js.map +1 -0
  16. package/lib/admin-ui/654.d4c38af0c765576f.js +2 -0
  17. package/lib/admin-ui/654.d4c38af0c765576f.js.map +1 -0
  18. package/lib/admin-ui/i18n-messages/de.json +3 -1
  19. package/lib/admin-ui/i18n-messages/en.json +3 -1
  20. package/lib/admin-ui/index.html +1 -1
  21. package/lib/admin-ui/main.75464c18bab13b01.js +2954 -0
  22. package/lib/admin-ui/main.75464c18bab13b01.js.map +1 -0
  23. package/lib/admin-ui/runtime.2d88c9597f145c74.js +2 -0
  24. package/lib/admin-ui/{runtime.28bd5da02a9b1f7b.js.map → runtime.2d88c9597f145c74.js.map} +1 -1
  25. package/lib/admin-ui/styles/_variables.scss +1 -0
  26. package/lib/src/plugin.js +2 -1
  27. package/lib/src/plugin.js.map +1 -1
  28. package/package.json +4 -4
  29. package/lib/admin-ui/26.5cc3bfffe8943e16.js +0 -2
  30. package/lib/admin-ui/26.5cc3bfffe8943e16.js.map +0 -1
  31. package/lib/admin-ui/407.a3fde1da25c0935c.js +0 -12
  32. package/lib/admin-ui/407.a3fde1da25c0935c.js.map +0 -1
  33. package/lib/admin-ui/451.a7fd4069c4f4c687.js +0 -65
  34. package/lib/admin-ui/451.a7fd4069c4f4c687.js.map +0 -1
  35. package/lib/admin-ui/600.17470a2c90aa79d8.js +0 -2
  36. package/lib/admin-ui/600.17470a2c90aa79d8.js.map +0 -1
  37. package/lib/admin-ui/625.3c0c5821b952b58e.js +0 -2
  38. package/lib/admin-ui/625.3c0c5821b952b58e.js.map +0 -1
  39. package/lib/admin-ui/main.65109179713dd228.js +0 -2944
  40. package/lib/admin-ui/main.65109179713dd228.js.map +0 -1
  41. package/lib/admin-ui/runtime.28bd5da02a9b1f7b.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"m7BAwBQA,gBACIA,SACJA,QACAA,gBAA8BA,SAA2BA,QACzDA,gBACIA,uDAKJA,6BATIA,+DAE0BA,+BAItBA,iDAAmC,4BCC5C,QAcHC,YAAoBC,EAAwBC,GAAxBC,cAAwBA,mBAVnCA,uBAA8B,GAC7BA,qBAAkB,IAAIJ,MACtBI,uBAAoB,IAAIJ,MAIlCI,uBAAoB,IAAIC,KAAY,IAC5BD,cAAW,IAAIE,KAAyB,GACxCF,cAAW,IAAIG,IAsFvBH,sBAAoBI,IACT,EAAKJ,KAAKK,kBAAkBC,QAAQF,EAAOG,IAnFtDC,WACIR,KAAKS,oBAAsBT,KAAKU,MAAMC,SAASC,QAC3CC,KAAId,GAAOA,EAAIe,IAAI,mBACnBD,KAAId,GAAUA,GAAYA,EAAL,IACrB,OAAU,IACV,WAGJC,KAAKe,qBAAuBf,KAAKU,MAAMC,SAASC,QAC5CC,KAAId,GAAOA,EAAIe,IAAI,oBACnB,OAAIf,GAAYA,GAAiBA,EAAN,KAC3B,OAAU,OACViB,SAGJ,MAAMlB,EAAcE,KAAKiB,kBAAkBC,aAAaN,MACpD,QAAa,QACbO,MAAI,IAAMnB,KAAKoB,sBAAsB,OACrCC,KAAU,QAGdC,KAActB,KAAKS,oBAAqBT,KAAKe,qBAAsBjB,EAAaE,KAAKuB,UAChFX,QAAKY,MAAUxB,KAAKyB,WACpBC,UAAU,EAAE3B,EAAaK,EAAcuB,MACpC,MAAMC,EAAOxB,EACPyB,GAAQ9B,EAAc,GAAKK,EACjCJ,KAAK8B,kBAAkBC,KAAK,CACxBC,aACAC,OACAC,WAKhBC,cACInC,KAAKyB,SAASW,OACdpC,KAAKyB,SAASY,WAGlBjB,sBAAsBtB,GAClBE,KAAKsC,SAAS,cAAexC,GAGjCyC,wBAAwBzC,GACpBE,KAAKsC,SAAS,iBAAkBxC,GAGpC0C,UACIxC,KAAKuB,SAASa,MAAK,GAGfE,SAASxC,EAAaC,GAC1BC,KAAKyC,OAAOC,SAAS,CAAC,KAAIC,+BAAO3C,KAAKU,MAAMkC,SAASC,QAAM,EAAG/C,GAAMC,KAAU,CAC1E+C,WAAY9C,KAAKU,MACjBqC,oBAAqB,UAI7BC,iBACI,QAAIhD,KAAKiD,SACEjD,KAAKK,kBAAkB6C,SAAWlD,KAAKiD,QAAQC,OAM9DC,kBACQnD,KAAKgD,iBACLhD,KAAKoD,gBAAgBrB,KAAK,IAE1B/B,KAAKoD,gBAAgBrB,KAAK/B,KAAKiD,QAAQI,IAAIvD,GAAKA,EAAES,KAI1D+C,oBAAqBC,KAAMzD,IACnBE,KAAKK,kBAAkBmD,SAAS1D,EAAOS,IACvCP,KAAKoD,gBAAgBrB,KAAK/B,KAAKK,kBAAkBoD,OAAO1D,GAAMA,IAAOD,EAAOS,KAE5EP,KAAKoD,gBAAgBrB,KAAK,IAAI/B,KAAKK,kBAAmBP,EAAOS,4CA9F5DmD,GAAgC9D,mDAAhC8D,EAAgCC,wnBDhC7C/D,wCAQAA,4BAKIA,sCAAcG,4BAAdH,CAA4C,wCACtBG,8BADtBH,CAA4C,qCAIzBG,yBAJnBH,CAA4C,oCAKzBG,iFAEnBH,2BAA+BA,8BAAiCA,QAChEA,2BAA+BA,gCAA0CA,QACzEA,0BACAA,gCAaJA,eAjCIA,yCAAiC,gEAMjCA,kCAAiB,kDAAjBA,CAAiB,0BAAjBA,CAAiB,gDAAjBA,CAAiB,iCAAjBA,CAAiB,yEAWFA,4BAAgBA,4CAChBA,4BAAgBA,8OEpB/BA,oOAeAA,oBAAkCA,iDAASgE,WAAUhE,8BAAiCA,QACtFA,oBAAsBA,iDAASiE,QAC3BjE,8BACJA,gCAHqDA,2CACfA,yDAClCA,0HCED,QAaHC,YAAoBC,sBATpBE,yBAAgC,GAGhCA,wBAAqB,IAAIE,IAAgD,CACrE+B,KAAM,EACNC,KAAM,GACNF,WAAY,KAKhBxB,WACI,MAAMV,EAAkBE,KAAK8D,mBAAmBlD,MAC5C,OAAU,EAAGqB,OAAMC,OAAMF,gBACdhC,KAAK+D,YAAYC,SACnBC,gBAAgB7D,EAAML,EAAM4B,GAC5BuC,UAAUtC,GAAOA,EAAIuC,aAIlCnE,KAAKoE,WAAatE,EAAgBc,MAAK,OAAIb,GAAOA,EAAIsE,QACtDrE,KAAKsE,gBAAkBxE,EAAgBc,MAAK,OAAIb,GAAOA,EAAIwE,aAG/DX,SACI5D,KAAKwE,cAGTX,MACI7D,KAAKwE,YAAYxE,KAAKyE,4DAjCjBC,GAAiC9E,uCAAjC8E,EAAiCf,kVDpB9C/D,gCAIAA,4CAKIA,6CAAqBG,8BAArBH,CAAqD,iGAIzDA,QAEAA,wCAVIA,kDAA8B,0CAA9BA,CAA8B,gBAA9BA,CAA8B,mLEJ9BA,gBAAmEA,SAAkBA,6BAAlBA,oDACnEA,gBAAoEA,SAAiBA,6BAAjBA,oDADpEA,yBACAA,uDADOA,sEACAA,yHAUPA,oBAAkCA,iDAASgE,WAAUhE,8BAAiCA,QACtFA,oBAEIA,iDAAS+E,SAIT/E,8BACJA,gCARqDA,2CAIjDA,wEAGAA,oDCTD,QAMHC,YAAoBC,yBAHpBE,wBAAuE,GAKvEQ,WACIR,KAAK4E,YAAY1D,aAAaQ,UAAU,IAAM1B,KAAK6E,eAAeC,gBAGtElB,SACI5D,KAAKwE,cAGTG,OACI3E,KAAKwE,YAAYxE,KAAK4E,oDAjBjBG,GAA4BnF,uCAA5BmF,EAA4BpB,6SDVzC/D,gCAKAA,8BAMAA,uCALIA,0CAAyB,0CAAzBA,CAAyB,gSEHjBA,mBAAsDA,SAA0BA,mCAA1BA,6DAItDA,uBACIA,uBACAA,8BACJA,eADIA,+FAEJA,uBACIA,uBACAA,8BACJA,eADIA,gHAWRA,SACIA,qBAAoCA,kDAASoF,gBACzCpF,8BACJA,QACAA,wBAAc,eAENA,8BACAA,uBACJA,QACAA,6BAAmB,gBAKXA,kDAASqF,gCAETrF,gCACJA,QACAA,sBAIIA,kDAASsF,+BAETtF,gCACJA,QACAA,mBACAA,sBAGIA,kDAASuF,WAGTvF,wBACAA,gCACJA,YAGZA,iCApCQA,iDAIIA,iDAOIA,+CAGAA,gFAKAA,8CAGAA,+EAUAA,gFA1DxBA,iBAAuD,UAAvDA,CAAuD,WAG3CA,yBACAA,SACJA,QACAA,iBACIA,6BAIAA,6BAIJA,UAEJA,iBAAwB,WAEhBA,oCACJA,UAEJA,mBACIA,+BACAA,qCAuCJA,yCA5DmCA,qCAC3BA,sCAGiCA,2CAIAA,0CAQVA,4BAIVA,2BACFA,mCCAhB,QAYHC,YAAoBC,EAAoCC,GAApCC,oBAAoCA,sBAT/CA,wBAAuE,GAGvEA,eAAW,EACVA,0BAAuB,IAAIJ,MAC3BI,yBAAsB,IAAIJ,MAC1BI,mBAAgB,IAAIJ,MACtBI,+BAA4B,IAAIE,KAAyB,GAIjEM,WACwBR,KAAK4E,YAAY9D,IAAI,eAGxBsE,OACbpF,KAAKqF,0BACAzE,MACG,OAAOb,GAASA,IAChB,QAAK,IAER2B,UAAU,KACP1B,KAAKgF,gBAKrBM,YAAYxF,GACiB,MAArBE,KAAKuF,cAAmD,MAA3BvF,KAAKwF,oBAClCxF,KAAKqF,0BAA0BjD,MAAK,GAI5CqD,eAAe3F,GACX,IAAKE,KAAKwF,mBACN,MAAO,GAEX,MAAMzF,EAAQC,KAAKwF,mBAAmBE,KAAKtF,GAAKA,EAAEuF,OAAS7F,GAC3D,OAAOC,EAAQA,EAAM6F,KAAO,GAGhCV,6BACIlF,KAAK6F,oBAAoB9D,KAAK/B,KAAK4E,YAAYQ,MAAM7E,IACrDP,KAAK4E,YAAYkB,cAGrBb,8BACIjF,KAAK+F,qBAAqBhE,KAAK/B,KAAK4E,YAAYQ,MAAM7E,IACtDP,KAAK4E,YAAYkB,cAGrBX,SACInF,KAAKgG,cAAcjE,KAAK/B,KAAK4E,YAAYQ,MAAM7E,IAC/CP,KAAK4E,YAAYkB,cAGrBd,cACIhF,KAAKiG,aACAC,cAAcnB,EAA8B,CACzCoB,OAAQ,CACJvB,YAAa5E,KAAK4E,YAClBW,aAAcvF,KAAKuF,aACnBC,mBAAoBxF,KAAKwF,oBAE7BY,KAAM,KACNC,UAAU,IAEb3E,UAAU,KACP1B,KAAK6E,eAAeC,wDAvEvBwB,GAAoB1G,oDAApB0G,EAAoB3C,gjCDxBjC/D,8BAAmBA,+bEAnB,MAAQ2G,YAAUC,+BAKX,kBACP,WAAsBC,OAAYC,GAClC3G,GAAuB,SAAS2G,OAChC,SAPO,eACP,qCAMWC,CAAcD,IACd,QAAO,SACV,QAAQ3G,MAAa6G,MAAI,wFCT7BhH,yIAcIA,kBAAoDA,kEAASgC,KAAchC,kBAAEA,QAC7EA,sBAAgCA,SAAeA,+BAArCA,iCAAsBA,kDAGhCA,sBAAgCA,SAAeA,6BAArCA,wBAAsBA,uGAMpCA,oBAAkCA,iDAASgE,WAAUhE,8BAAiCA,QACtFA,oBAAsBA,iDAASiE,QAC3BjE,8BACJA,gCAHqDA,2CACfA,sDAClCA,uHCjBD,QAKHC,YAAoBC,sBAFpBE,sBAA6B,GAI7BQ,WACIR,KAAK6G,QAAU7G,KAAK+D,YAAYC,SAC3B8C,uBACA5C,UAAUpE,GAAOA,EAAIiH,eAAe1C,OAG7CT,SACI5D,KAAKwE,cAGTX,MACI7D,KAAKwE,YAAYxE,KAAKgH,yDAlBjBC,GAAkCrH,uCAAlCqH,EAAkCtD,8dDV/C/D,gCAIAA,uBAMIA,iFAIAA,gCAIAA,gCAGJA,QAGAA,wCAnBIA,6CAAyB,YAAzBA,CAAyB,cAAzBA,CAAyB,6BAAzBA,CAAyB,eAAzBA,CAAyB,+JEJzBA,SACIA,sBACAA,8BACJA,eADIA,+EAEJA,SACIA,sBACAA,8BACJA,eADIA,oFAPRA,oBACIA,iCAIAA,iCAIJA,8BARmBA,2EAIAA,kGAKnBA,oBAAqCA,8BAAkCA,eAAlCA,6CCD9B,+CAAMsH,8BAA4BvD,yODTzC/D,6BAUAA,oCAVWA,4DAUAA,kXEyBJ,QASHC,YACYC,EACAC,GADAC,gCACAA,oCAPFA,iBAAc,IAAIJ,MAU5BY,WACI,MAAMV,EAAgBE,KAAKmH,6BAA6BC,aACpDpH,KAAKqH,MAAMC,MAGTvH,EAAUC,KAAKuH,yBAAyBC,wBAAwB1H,GAChEM,EAAeJ,KAAKyH,UAAUC,gBAAgB3H,GACpDK,EAAauH,SAASN,MAAQrH,KAAKqH,MACnCjH,EAAauH,SAAS3D,SAAWhE,KAAKgE,SACtChE,KAAK2H,SAAWvH,EAAauH,SAC7B3H,KAAK4H,aAAexH,EAGxB+B,oBACqB,QAAjBrC,OAAK8H,oBAAY,SAAEC,iDA5BdC,GAAiClI,oDAAjCkI,EAAiCnE,0FAKC/D,kVAlB/BA,gCAORA,sCAAeG,uBAEfH,sBACJA,cATIA,wDAA8C,sEAA9CA,CAA8C,8BAA9CA,CAA8C,uDAA9CA,CAA8C,0CAA9CA,CAA8C,6KCrBlDA,gCAA8F,UAA9FA,CAA8F,gBAE5EA,mEAA4CA,QACtDA,oBAAqDA,iDAASmI,sBAC1DnI,8BACJA,oCAHUA,iCACwBA,mCAC9BA,8FAKRA,8CAKIA,yFACHA,oDAJGA,6BAAqB,UAArBA,CAAqB,+CAkBTA,SACIA,8BACJA,eADIA,qJAGAA,gMARRA,SACIA,kBACIA,8BACJA,QACAA,kCAGAA,4CAMJA,oDAXQA,0EAEWA,kDAAwC,sCAcvDA,SACIA,8BACJA,eADIA,4GAGAA,gMARRA,SACIA,kBACIA,8BACJA,QACAA,kCAGAA,4CAMJA,oDAXQA,wEAEWA,kDAAwC,yCAU3DA,SACIA,kBACIA,8BACAA,oCACIA,8BACJA,UAERA,yCALQA,8EAEqBA,0GAI7BA,SACIA,8BAIJA,yCAJIA,sIAKJA,SACIA,8BAIJA,yCAJIA,0IAKJA,SACIA,8BACAA,kBAAkB,YACcA,SAAwBA,UAE5DA,yCAJIA,+EAEgCA,0DAGpCA,SACIA,8BACAA,kBAAkB,YACcA,SAAwBA,QACpDA,oCACIA,8BACJA,UAERA,yCAPIA,+EAEgCA,+BAEPA,gEAI7BA,SACIA,8BACAA,kBAA4BA,SAAwBA,QACxDA,yCAFIA,+EAC4BA,uDAEhCA,SACIA,8BACJA,eADIA,wGAEJA,SACIA,8BACJA,eADIA,gHAEJA,SACIA,8BACJA,eADIA,kHAEJA,SACIA,kBACIA,8BACAA,oCAA0B,8CAC+CA,SAEnEA,QACFA,oDAAqEA,UAEnEA,YAGdA,yCAVQA,sFAEsBA,gEAAmDA,uCAGnDA,gEAAmDA,kEAMjFA,SACIA,kBACIA,8BACAA,oCAA0B,8CAC+CA,SAEnEA,QACFA,oDAAqEA,UAEnEA,YAGdA,yCAVQA,qFAEsBA,gEAAmDA,uCAGnDA,gEAAmDA,iFAMjFA,SACIA,kBAAkB,YAEVA,SACJA,QACAA,kBACAA,wBAAc,eAENA,uBACJA,QACAA,gCAA8C,eAItCA,oEAASA,EAAToI,MAASC,+CAGTrI,wBACAA,gCACJA,QACAA,mBACAA,sBAGIA,oEAASA,EAAToI,MAASE,+CAGTtI,wBACAA,gCACJA,cAIhBA,2CA9BYA,oCAYQA,yDAGAA,kDAOAA,yDAGAA,gFAUhBA,oCACIA,8BACJA,yCADqBA,0DALzBA,SACIA,kBACIA,8BACJA,QACAA,8CAGJA,yCALQA,0CAEuBA,yDApJvCA,iCAOIA,YACIA,kCAcAA,kCAcAA,kCAQAA,kCAMAA,kCAMAA,kCAMAA,kCASAA,kCAIAA,mCAGAA,mCAGAA,mCAGAA,qCAaAA,qCAaAA,qCAkCAA,mCAQJA,QACJA,kDAxJIA,yCAAqC,iCAArCA,CAAqC,wBAArCA,CAAqC,oBAArCA,CAAqC,4BAMvBA,kCACKA,0DAcAA,wDAcAA,8DAQAA,8DAMAA,kEAMAA,+DAMAA,+DASAA,+DAIAA,gEAGAA,wEAGAA,uEAGAA,sEAaAA,qEAaAA,+EAvH/BA,SACIA,oDAOAA,6CA4JJA,uDAlKSA,oDAAsC,eCI5C,QAUHC,YAAoBC,uCAPVE,aAAU,IAAIJ,MACdI,gBAAa,IAAIJ,MACjBI,gBAAa,IAAIJ,MAC3BI,UAAO,GACPA,eAAW,EACFA,UAAOmI,MAIhBC,mBAAmBtI,GACf,QAASE,KAAKmH,6BAA6BC,aAAatH,GAG5DuI,eAAevI,GACX,OAAQA,EAAMwH,WACLa,6BACAA,0CACAA,uCACD,MAAO,eACNA,0BACD,MAAO,aACNA,kCACD,MAAO,gBAEP,MAAO,WAInBG,gBAAgBxI,GACZ,OAAQA,EAAMwH,WACLa,0BACD,MAAO,YACNA,wBACD,MAAO,CAAC,cAAe,iBACtBA,oBACD,MAAO,YACNA,mCACAA,kCACD,MAAO,SAInBI,WAAWzI,GACP,OAAQA,EAAMwH,WACLa,+BACAA,wBACD,OAAO,UAEP,OAAO,GAInBK,QAAQ1I,GACJ,MAAQ2I,iBAAkB3I,EAC1B,OAAIC,EACO,GAAGA,EAAc2I,aAAa3I,EAAc4I,WAE5C,GAAG3I,KAAKgE,SAAS0E,aAAa1I,KAAKgE,SAAS2E,WAI3DZ,oBACI/H,KAAK4I,QAAQ7G,KAAK,CAAE8G,KAAM7I,KAAK6I,OAC/B7I,KAAK6I,KAAO,0CAlEPC,GAAwBlJ,uCAAxBkJ,EAAwBnF,4mCDhBrC/D,cAAIA,8BAA6CA,QACjDA,iBACIA,uCAQAA,iCAqKAA,gCACJA,eAhLIA,uDAE0DA,oDAQ1BA,oCAqKZA,owBE1KZA,wCAKIA,iDACJA,6BAHIA,qCAEAA,qHAORA,qBAGIA,iDAASmJ,WAGTnJ,8BACJA,gCAHIA,sFAEAA,6FAGAA,qBAGIA,kDAAS+E,SAGT/E,8BACJA,iCAHIA,sFAEAA,0EANJA,iCACKA,kEA2CbA,kDACIA,oBACJA,cAFgBA,+HAIhBA,sBAAkE,WACvDA,8BAAwCA,QAC/CA,uCAKJA,8BANWA,kDAGHA,8CAA6B,iGAcjCA,uBAIIA,+DAAaA,EAAboI,OAAagB,qBACZpJ,SAAgBA,oCAHjBA,wBAGCA,kDANTA,SACIA,8BAOJA,mCAN0BA,oDAQtBA,6IAGAA,qBAEIA,kDAASqJ,eAGTrJ,uBACAA,8BACJA,cADIA,+FArBZA,kBAAgE,cAC3BA,8BAA4CA,QAC7EA,kCASAA,4CAGAA,eACIA,4BAQJA,0CAtBiCA,sDAClBA,gCAAqB,cAgB3BA,iJAWLA,+BASIA,wDAAuBA,EAAvBoI,OAAuBkB,+BAAvBtJ,CAA0D,mDAClCA,EADkCoI,OAClCmB,gCADxBvJ,CAA0D,4CAEzCA,EAFyCoI,OAEzCoB,mEACpBxJ,+CAVGA,0DACAA,6DAAkD,0DAAlDA,CAAkD,4DAAlDA,CAAkD,gBAAlDA,CAAkD,qCAAlDA,CAAkD,wHAUtDA,qBAAkCA,kDAASyJ,eACvCzJ,uBACAA,8BACJA,cADIA,uIAoBIA,iBAAiBA,SAAgBA,QACjCA,iBAAiBA,SAAiBA,QAClCA,iBAAiBA,mCAA6DA,QAC9EA,iBAAiBA,+BAA4CA,QAC7DA,kBACIA,0DAKJA,6BAViBA,uBACAA,wBACAA,yDACAA,gDAITA,mDAAmC,sEA7C3DA,kBAA+C,WAA/CA,CAA+C,QAEnCA,8BAAsCA,QAC1CA,uCAaAA,4BAIJA,QACAA,kBAA0B,QAClBA,+BAAmCA,QACvCA,8BAMIA,+DAAsB0J,yBAAtB1J,CAAmD,iDACrC2J,mFAEd3J,0BAAeA,gCAA+BA,QAC9CA,0BAAeA,gCAA+BA,QAC9CA,0BAAeA,gCAA+BA,QAC9CA,0BAAeA,gCAAqCA,QACpDA,0BACAA,iCAaJA,oCAhDIA,iDAEwBA,qDAY8BA,oDAMtDA,+CAEAA,+CAAyB,+BAAzBA,CAAyB,yCAAzBA,CAAyB,kCAAzBA,CAAyB,4DAQVA,2CACAA,2CACAA,2CACAA,2FAkB3BA,kBAA+C,WAA/CA,CAA+C,6BAKnCA,oDAAWmI,sBAAXnI,CAAqC,iDACvBqI,eADdrI,CAAqC,iDAEvBsI,kDACjBtI,oCALGA,gDAA4B,kCCzHjC,gBACKuI,MAmBRtI,YACIC,EACAC,EACAK,EACQuB,EACAC,EACEC,EACF2H,EACAC,GAERC,MAAM5J,EAAOC,EAAQK,EAAqByB,GANlC7B,sBACAA,mBACEA,mBACFA,oBACAA,2BAjBZA,kBAAe,IAAIG,IAGnBH,0BAAuB,IAAI2J,IAC3B3J,6BAAyB,EACzBA,mBAAgB,GAChBA,uBAAoB,EACZA,uBAAoB,IAAIG,IAc5BH,KAAKuF,aAAevF,KAAK4J,qBAAqB,YAC9C5J,KAAK6J,oBAAsB7J,KAAK4J,qBAAqB,WACrD5J,KAAK8J,WAAa9J,KAAK+J,YAAYC,MAAM,CACrChG,SAAUhE,KAAK+J,YAAYC,MAAM,CAC7BC,MAAO,GACPvB,UAAW,CAAC,GAAIzI,eAChB0I,SAAU,CAAC,GAAI1I,eACfiK,YAAa,GACbC,aAAc,CAAC,GAAI,CAAClK,cAAqBA,aACzCmK,SAAU,GACV7E,aAAcvF,KAAK+J,YAAYC,MAC3BhK,KAAKuF,aAAa8E,OAAO,CAACC,EAAMC,IAAU5H,+BAAM2H,GAAI,EAAGC,EAAM3E,MAAO,KAAO,OAGnF4E,UAAW,IAAIvK,KAAU,MAIjCO,WACIR,KAAKyK,OACLzK,KAAK0K,oBAAsB1K,KAAK+D,YAAY4G,SACvCC,wBACAC,UAAU9K,GAAUA,EAAO+K,UAAUzG,OACrCzD,QAAKmK,MAAY,IAEtB,MAAMjL,EAAuBE,KAAKgL,QAAQpK,KAAKqK,GAAMjL,KAAKkL,oBAC1DlL,KAAKmL,QAAUrL,EAAqBc,MAAK,OAAIb,GAAYA,EAASqL,OAAO/G,QACzErE,KAAKqL,aAAerL,KAAKgL,QAAQpK,MAAK,OAAIb,GAAYA,EAASqL,OAAO7G,aACtEvE,KAAKsL,SAAWtL,KAAKuL,aAAa3K,MAC9B,OAAU,SACV4K,KAAU,IACCxL,KAAK+D,YAAYC,SACnByH,mBAAmBzL,KAAKO,GAAI,CACzBmL,KAAM,CACFC,UAAWxD,cAGlBjE,UAAUnE,IAAO,MAAC,OAAa,QAAbK,IAAK4D,gBAAQ,eAAE4H,QAAQvH,UAK1DlC,cACInC,KAAK6H,UACL7H,KAAKkL,kBAAkB7I,WAG3BwJ,yBAEI,OAAO7L,KADgB8J,WAAWhJ,IAAI,CAAC,cACtBgL,SAGrB5C,2BAA2BpJ,GACvBE,KAAK+L,wBAA0BjM,EAC/BE,KAAKgM,wBAAyB,EAGlC7C,4BAA4BrJ,GACxBE,KAAKiM,yBAA2BnM,EAChCE,KAAKgM,wBAAyB,EAGlC5C,oBAAoBtJ,GACZE,KAAKkM,qBAAqBC,IAAIrM,GAC9BE,KAAKkM,qBAAqB/G,OAAOrF,GAEjCE,KAAKkM,qBAAqBrI,IAAI/D,GAItCuJ,aACI,MAAMvJ,EAAmBE,KAAK8J,WAAWhJ,IAAI,aACvCf,EAAaC,KAAK+J,YAAYC,MAAM,CACtCoC,SAAU,GACVC,QAAS,GACTC,YAAa,CAAC,GAAIrM,eAClBsM,YAAa,GACbC,KAAM,GACNC,SAAU,GACVC,WAAY,GACZC,YAAa,CAAC,GAAI1M,eAClBiK,YAAa,GACb0C,wBAAwB,EACxBC,uBAAuB,IAE3B,GAAI7M,KAAK6J,oBAAoB3G,OAAQ,CACjC,MAAM9C,EAAoBJ,KAAK+J,YAAYC,MAAM,IACjD,UAAWrI,KAAY3B,KAAK6J,oBACxBzJ,EAAkB0M,WAAWnL,EAASiE,KAAM,IAAI3F,KAAY,KAEhEF,EAAW+M,WAAW,eAAgB1M,GAE1CN,EAAiBiN,KAAKhN,GAG1BuJ,qBAAqBxJ,GACjBE,KAAKgN,eAAiBlN,EACtBE,KAAKiN,kBAGT1D,oBAAoBzJ,GAChBE,KAAKkN,mBAAqBpN,EAC1BE,KAAKiN,kBAGTlE,eACI,MAAMhJ,EAAeC,KAAK8J,WAAWhJ,IAAI,YACzC,IAAKf,EACD,OAEJ,MAAMK,EAAYL,EAAaqF,MACzBzD,EAA+C,QAAhC7B,IAAagB,IAAI,uBAAe,eAAEsE,MACjDxD,EAAgC,CAClCqI,MAAO7J,EAAU6J,MACjBE,aAAc/J,EAAU+J,aACxBzB,UAAWtI,EAAUsI,UACrBC,SAAUvI,EAAUuI,SACpBuB,YAAa9J,EAAU8J,YACvB3E,gBAEJvF,KAAK+D,YAAYC,SACZmJ,eAAevL,EAAUxB,EAAUgK,UACnC1I,UAAU,EAAGyL,qBACV,OAAQtL,EAAeuL,gBACd,WACDpN,KAAKqN,oBAAoBC,SAAQ,OAAE,gCAAiC,CAChEC,OAAQ,aAER1L,EAAesI,eAAiB/J,EAAUgK,UAC1CpK,KAAKqN,oBAAoBG,OAAO,CAC5BC,WAASC,KAAE,oCACXC,gBAAiB,CAAExD,aAAc/J,EAAU+J,cAC3C7C,KAAM,OACNsG,SAAU,MAGlB5N,KAAK8J,WAAW+D,iBAChB7N,KAAKgM,wBAAyB,EAC9BhM,KAAK6E,eAAeC,eACpB9E,KAAKyC,OAAOC,SAAS,CAAC,MAAOb,EAAetB,IAAK,CAAEuC,WAAY9C,KAAKU,QACpE,UACC,4BACDV,KAAKqN,oBAAoBS,MAAMjM,EAAe4L,YAKlE9I,OACI3E,KAAKgL,QACApK,QACGmN,MAAK,IACL,QAAS,EAAGxN,eACR,MAAMH,EAOF,GACEuB,EAAe3B,KAAK8J,WAAWhJ,IAAI,YACzC,GAAIa,GAAgBA,EAAaqM,MAAO,CACpC,MAAMnM,EAAYF,EAAayD,MACzBoE,EAA+C,QAAhCzJ,IAAae,IAAI,uBAAe,eAAEsE,MACjDqE,EAAgC,CAClClJ,KACA0J,MAAOpI,EAAUoI,MACjBE,aAActI,EAAUsI,aACxBzB,UAAW7G,EAAU6G,UACrBC,SAAU9G,EAAU8G,SACpBuB,YAAarI,EAAUqI,YACvB3E,gBAEJnF,EAAe2M,KACX/M,KAAK+D,YAAYC,SACZiK,eAAexE,GACf7I,MAAK,OAAI0J,GAAOA,EAAI2D,kBAGjC,MAAMrM,EAAmB5B,KAAK8J,WAAWhJ,IAAI,aAC7C,GAAKc,GAAoBA,EAAiBoM,OAAUhO,KAAKgM,uBACrD,UAAWnK,KAAkBD,EAAiBkK,SAC1C,GAAIjK,EAAemM,OAAShO,KAAKgM,uBAAwB,CACrD,MAAMxC,EAAU3H,EAAeuD,MACzBqE,EAA4B,CAC9B2C,SAAU5C,EAAQ4C,SAClBC,QAAS7C,EAAQ6C,QACjBC,YAAa9C,EAAQ8C,YACrBC,YAAa/C,EAAQ+C,YACrBC,KAAMhD,EAAQgD,KACdC,SAAUjD,EAAQiD,SAClBC,WAAYlD,EAAQkD,WACpBC,YAAanD,EAAQmD,YACrBzC,YAAaV,EAAQU,YACrB0C,uBAAwB5M,KAAKiM,2BAA6BzC,EAAQjJ,GAClEsM,sBAAuB7M,KAAK+L,0BAA4BvC,EAAQjJ,GAChEgF,aAAciE,EAAQjE,cAErBiE,EAAQjJ,GAOTP,KAASkM,qBAAqBC,IAAI3C,EAAQjJ,IACtCH,EAAe2M,KACX/M,KAAK+D,YAAYC,SACZkK,sBAAsB1E,EAAQjJ,IAC9BK,QAAKC,KAAIyJ,GAAOA,EAAI4D,yBAG7B9N,EAAe2M,KACX/M,KAAK+D,YAAYC,SACZmK,sBAAqBxL,+BACf8G,GAAK,CACRlJ,GAAIiJ,EAAQjJ,MAEfK,QAAKC,KAAIyJ,GAAOA,EAAI6D,yBAnBjC/N,EAAe2M,KACX/M,KAAK+D,YAAYC,SACZoK,sBAAsBtO,EAAI2J,GAC1B7I,MAAK,OAAI0J,GAAOA,EAAI8D,yBAuB7C,SAAOC,MAASjO,MAGvBsB,UACG5B,IACI,IAAIC,GAAW,EACf,UAAWK,KAAUN,EACjB,OAAQM,EAAOgN,gBACN,eACA,cACA,UACIrN,IACDC,KAAKqN,oBAAoBC,SAAQ,OAAE,gCAAiC,CAChEC,OAAQ,aAEZxN,GAAW,EACXC,KAAK8J,WAAW+D,iBAChB7N,KAAKgM,wBAAyB,EAC9BhM,KAAK6E,eAAeC,eACpB9E,KAAKuL,aAAanJ,OAClBpC,KAAK+D,YAAYC,SAASsK,YAAYtO,KAAKO,IAAIgO,QAAQ7M,aAE3D,UACC,4BACD1B,KAAKqN,oBAAoBS,MAAM1N,EAAOqN,WAKtD3N,IACIE,KAAKqN,oBAAoBS,OAAM,OAAE,8BAA+B,CAC5DP,OAAQ,eAM5BtE,aACIjJ,KAAKiG,aACAC,cAAce,EAAoC,CAC/Cb,KAAM,OAETxF,QACG4K,KAAU1L,GAAaA,KAAW8G,MAAK9G,GAAY0O,MACnD,QAAU1O,GAAWE,KAAK+D,YAAYC,SAASyK,oBAAoB3O,EAAS,CAACE,KAAKO,OAErFmB,UAAU,CACPU,KAAMtC,IACFE,KAAKqN,oBAAoBC,SAAQ,OAAE,2CAA4C,CAC3EoB,cAAe,EACfC,UAAW7O,EAAI2O,oBAAoB7I,QAG3CvD,SAAU,KACNrC,KAAK+D,YAAYC,SAASsK,YAAYtO,KAAKO,GAAI,CAAE2B,KAAM,IAAKqM,QAAQ7M,YACpE1B,KAAKuL,aAAanJ,UAKlC4G,gBAAgBlJ,GACZE,KAAKiG,aACA2I,OAAO,CACJ3E,SAAOyD,KAAE,+CACTmB,QAAS,CACL,CAAEvH,KAAM,YAAawH,SAAOpB,KAAE,kBAC9B,CAAEpG,KAAM,SAAUwH,OAAO,OAAE,iBAAkBC,aAAa,MAGjEnO,MACG,OAAUb,GACNA,EACMC,KAAK+D,YAAYC,SAASgL,yBAAyBlP,EAAMS,GAAI,CAACP,KAAKO,KACnEiO,MAEV,OAAU,IAAMxO,KAAK+D,YAAYC,SAASsK,YAAYtO,KAAKO,GAAI,CAAE2B,KAAM,IAAKqM,UAE/E7M,UAAU3B,IACPC,KAAKqN,oBAAoBC,SAAQ,OAAE,gDAAiD,CAChFoB,cAAe,EACfC,UAAW7O,EAAM8F,OAErB5F,KAAKuL,aAAanJ,SAI9B2F,mBAAoBc,SAChB7I,KAAK+D,YAAYC,SAAS+D,kBAAkB/H,KAAKO,GAAIT,GAAM4B,UAAU,KACjE1B,KAAKuL,aAAanJ,OAClBpC,KAAKqN,oBAAoBC,SAAQ,OAAE,gCAAiC,CAChEC,OAAQ,WAKpBtF,WAAWnI,GACPE,KAAKiG,aACAC,cAAciC,MAAyB,CACpC9B,UAAU,EACVF,OAAQ,CACJ8I,wBAAwB,EACxBpG,KAAM/I,EAAMoP,KAAKrG,QAGxBjI,QACG4K,KAAUzL,GACFA,EACOC,KAAK+D,YAAYC,SAASmL,mBAAmB,CAChDC,OAAQtP,EAAMS,GACdsI,KAAM9I,EAAO8I,OAGV2F,MAIlB9M,UAAU3B,IACPC,KAAKuL,aAAanJ,OAClBpC,KAAKqN,oBAAoBC,SAAQ,OAAE,gCAAiC,CAChEC,OAAQ,WAKxBrF,WAAWpI,GACP,OAAOE,KAAKiG,aACP2I,OAAO,CACJ3E,SAAOyD,KAAE,8BACT2B,KAAMvP,EAAMoP,KAAKrG,KACjBgG,QAAS,CACL,CAAEvH,KAAM,YAAawH,SAAOpB,KAAE,kBAC9B,CAAEpG,KAAM,SAAUwH,OAAO,OAAE,iBAAkBC,aAAa,MAGjEnO,MAAK,OAAUb,GAAQA,EAAMC,KAAK+D,YAAYC,SAASsL,mBAAmBxP,EAAMS,IAAMiO,MACtF9M,UAAU,KACP1B,KAAKuL,aAAanJ,OAClBpC,KAAKqN,oBAAoBC,SAAQ,OAAE,gCAAiC,CAChEC,OAAQ,WAKdgC,cAAczP,SACpB,MAAMM,EAAgBJ,KAAK8J,WAAWhJ,IAAI,YAW1C,GAVIV,GACAA,EAAcoP,WAAW,CACrBvF,MAAOnK,EAAOmK,MACdvB,UAAW5I,EAAO4I,UAClBC,SAAU7I,EAAO6I,SACjBuB,YAAapK,EAAOoK,YACpBC,aAAcrK,EAAOqK,eAIzBrK,EAAO0K,UAAW,CAClB,MAAM7I,EAAiB,IAAI1B,KAAU,IACrC,UAAW2B,KAAW9B,EAAO0K,UAAW,CACpC,MAAM3I,EAA4BD,GAA1B2D,gBAAY1D,EAAK4H,KAAIgG,SAAvB,kBACAnF,EAAetK,KAAK+J,YAAYC,MAAKrH,+BACpC8G,GAAI,CACPkD,YAAa/K,EAAQ8N,QAAQ/J,QAUjC,GARAhE,EAAeoL,KAAKzC,GAChB1I,EAAQgL,yBACR5M,KAAKiM,yBAA2BrK,EAAQrB,IAExCqB,EAAQiL,wBACR7M,KAAK+L,wBAA0BnK,EAAQrB,IAGvCP,KAAK6J,oBAAoB3G,OAAQ,CACjC,MAAMqH,EAAoBvK,KAAK+J,YAAYC,MAAM,IACjD,UAAW2F,MAAY3P,KAAK6J,oBAAqB,CAC7C,MAAM+F,GAAMD,GAAS/J,KACfiK,GAAqC,QAA7B9P,EAAC6B,EAAgB2D,oBAAY,eAAGqK,IACxCE,GAAU,IAAI7P,KAAY4P,IAChCtF,EAAkBuC,WAAW8C,GAAKE,IAEtCxF,EAAawC,WAAW,eAAgBvC,IAGhDvK,KAAK8J,WAAWiG,WAAW,YAAapO,GAGxC3B,KAAKuF,aAAarC,QAClBlD,KAAKgQ,yBACDhQ,KAAKuF,aACLvF,KAAK8J,WAAWhJ,IAAI,CAAC,WAAY,iBACjChB,GAGRE,KAAK6E,eAAeC,eAMhBmI,kBACJjN,KAAK+D,YAAYC,SACZsK,YAAYtO,KAAKO,GAAI,CAClB2B,KAAMlC,KAAKgN,cACX/K,MAAOjC,KAAKkN,kBAAoB,GAAKlN,KAAKgN,cAC1CtB,KAAM,CAAEuE,cAAe9H,cAE1BoG,QAAQ3N,MACL,OAAId,GAAQA,EAAKkE,aACjBkM,KAAOC,wBAEVzO,UAAU5B,GAAUE,KAAKkL,kBAAkB9I,KAAKtC,4BCngBzDF,gBAAuBA,8BAAkDA,eAAlDA,oFACvBA,gBAAwBA,8BAAkDA,eAAlDA,uFADxBA,yBACAA,+CADOA,yBACAA,8DAWPA,qBAAkE,WACvDA,8BAAwCA,QAC/CA,sCAKJA,8BANWA,kDAGHA,8CAA6B,4EAQjCA,gBAAuBA,8BAAkDA,eAAlDA,oFACvBA,gBAAwBA,8BAAkDA,eAAlDA,sGAH5BA,oBAAkCA,iDAASgE,WAAUhE,8BAAiCA,QACtFA,qBAAsBA,iDAAS+E,SAC3B/E,yBACAA,yBACJA,gCAJqDA,2CACdA,yCAC5BA,kCACAA,0EDwBFwQ,GAAuBxQ,+HAAvBwQ,EAAuBzM,69EDlDpC/D,0BAAgB,gBAAhBA,CAAgB,WAGJA,8CACAA,wDACAA,0CAOJA,UAGJA,wBACIA,mCACAA,8CAQAA,4CAUJA,UAGJA,mBAA4D,+DAEpDA,oBACJA,QACAA,sEAKIA,qBACJA,QACAA,sEAKIA,qBACJA,QACAA,sEAKIA,qBACJA,QACAA,sEAKIA,qBACJA,QACAA,uDAIAA,8BAQAA,gDAKJA,QAEAA,4CA0BAA,8CAqDAA,4EArK6BA,+CACUA,iDAGtBA,2FAYJA,6CAAsB,cAmBhBA,yDACCA,sDAAsC,yCAIlDA,2DAA2C,yCAO3CA,0DAA0C,yCAO1CA,8DAA8C,yCAO9CA,6DAA6C,yCAMyBA,6CAInCA,6CAUnCA,oCAAmB,2BAKNA,sEA0BCA,8CAqDAA,+bGxJf,QAMHC,YAAoBC,EAAkDC,GAAlDC,2BAAkDA,mBAClEA,KAAKuF,aAAevF,KAAKqQ,oBAAoBC,mBAAmB,iBAGpE9P,iBAOI,GANAR,KAAKuQ,KAAOvQ,KAAK+J,YAAYC,MAAM,CAC/BpE,KAAM,CAAC5F,KAAKgK,MAAMpE,KAAM3F,eACxBsF,aAAcvF,KAAK+J,YAAYC,MAC3BhK,KAAKuF,aAAa8E,OAAO,CAACtK,EAAMK,IAAUuC,+BAAM5C,GAAI,EAAGK,EAAMwF,MAAO,KAAO,OAG/E5F,KAAKuF,aAAarC,OAAQ,CAC1B,MAAMnD,EAAoBC,KAAKuQ,KAAKzP,IAAI,gBAExC,UAAWV,KAAYJ,KAAKuF,aAAc,CACtC,MAAM5D,EAAMvB,EAASwF,KACfhE,EAA+B,QAAvB9B,OAAKkK,MAAMzE,oBAAY,eAAG5D,GAClCE,EAAU9B,EAAkBe,IAAIa,GAClCE,GACAA,EAAQ2N,WAAW5N,KAMnCgC,SACI5D,KAAKwE,cAGTG,OACI3E,KAAKwE,YAAYxE,KAAKuQ,KAAKnL,8CApCtBoL,GAAkC5Q,mDAAlC4Q,EAAkC7M,8fDhB/C/D,gCAIAA,kBAAyB,2CAEjBA,4CAMJA,QACAA,4BAQJA,QACAA,uCAlBMA,mCACcA,iDAKRA,mDAG+BA,2PEDnCA,oBAA0EA,iDAASmJ,WAC/EnJ,uBACAA,8BACJA,cADIA,0LAgBIA,iBACIA,8BACJA,QACAA,iBAA0E,iBACrCA,SAAgBA,UAErDA,iBAA0E,UAMlEA,uBACAA,8BACJA,UAEJA,kBAA2E,gBACnCA,8DAAS6Q,YACzC7Q,wBACAA,gCACJA,UAEJA,kBAAqE,kBAArEA,CAAqE,gBAGzDA,gCACAA,wBACJA,QACAA,iCAA8C,gBAItCA,sDAASA,EAAToI,MAAS7C,yCAGTvF,wBACAA,gCACJA,+CArCkBA,uCACTA,2BAESA,gDAChBA,iCAAuBA,uBAEPA,gDAGtBA,4DAIAA,kEAGuBA,gDAGvBA,mDAGJA,gDAGQA,sDAQIA,+DAGAA,4EASxBA,oJAGAA,SACIA,kBAAkB,YACgBA,0BAAoDA,QAClFA,kBACAA,qBAA2CA,iDAAS8Q,iBAChD9Q,uBACJA,UAEJA,kBAAsB,iBAAtBA,CAAsB,gBAQVA,gCACAA,wBACJA,QACAA,iCAA8C,gBAItCA,gEAASiC,uEAITjC,wBACAA,gCACJA,YAGRA,sBAAyCA,8DAASqJ,gBAC9CrJ,gCACJA,UAEJA,8CAKIA,oFAAgD,gDAC3BA,EAD2BoI,MAC3BlE,iEACxBlE,QACLA,yCA1CsCA,+DAYtBA,4DAEAA,sGASIA,+DAGAA,kEAKRA,2FAIJA,kDAA4B,gBAA5BA,CAA4B,0CAA5BA,CAA4B,4CC7ErC,gBACKuI,MAsBRtI,YACYC,EACAC,EACAK,EACDuB,EACGC,GAEV8H,MAAM9H,EAAQD,GANN3B,mBACAA,2BACAA,oBACDA,aACGA,cArBdA,gBAAa,IAAIC,KAAY,IAQ7BD,yBAAgC,GAChCA,wBAAqB,IAAIE,IAAgD,CACrE+B,KAAM,EACNC,KAAM,EACNF,WAAY,KAERhC,gCAA6B,IAAIE,SAAsB,GAU3DwJ,MAAMiH,WACF,IAAI9O,IACA7B,KAAK+D,YAAYC,SAAS8C,wBAAwBjF,GAAM+O,yBAC5D/O,GAAQA,EAAKkF,eACb,CAAClF,EAAM2H,KAAU,CACbqH,QAAS,CACL5O,OACAC,OACAuB,OAAQ,CACJmC,KAAM,CAAEkL,SAAU9Q,KAAK+Q,WAAW3L,YAOtD5E,WACIkJ,MAAMlJ,WACNR,KAAK+Q,WAAW7P,aACXN,QACGsP,KAAO9P,GAAS,EAAIA,EAAM8C,QAA2B,IAAjB9C,EAAM8C,WAC1C8N,MAAa,QACbxP,MAAUxB,KAAKyB,WAElBC,UAAU,IAAM1B,KAAKwC,WAC1B,MAAM1C,EAAiBE,KAAKU,MAAMC,SAASC,MACvC,OAAIR,GAAMA,EAAGU,IAAI,gBACjBE,SACA,QAAI,IAAOhB,KAAKyE,oBAAsB,KAE1CzE,KAAKiR,aAAejR,KAAKkR,OAAOtQ,QAAKC,KAAIT,GAA4B,IAAlBA,EAAO8C,SAC1DlD,KAAKmR,cAAe,OAAcnR,KAAKkR,OAAQpR,GAAgBc,MAC3D,OAAI,EAAER,EAAQuB,MACV,GAAIA,EACA,OAAOvB,EAAOsF,KAAK9D,GAAKA,EAAErB,KAAOoB,QAGzCR,MAAIf,GAAQJ,KAAKoR,cAAmB,MAAHhR,OAAG,EAAHA,EAAKG,KAE1C,MAAMR,GAAiB,OACnBC,KAAKmR,aACLnR,KAAK8D,mBACL9D,KAAKqR,4BACPzQ,MACE,OAAU,EAAER,GAAe6B,OAAMC,OAAMF,iBAC/B5B,EACOJ,KAAK+D,YAAYC,SACnBsN,8BAA8BlR,EAAYG,GAAI,CAC3C0B,OACAC,OACAuB,OAAQ,CACJ0G,aAAc,CACV2G,SAAUjP,MAIrBqC,UAAUsF,IAAM,MAAC,OAAiB,QAAjBC,IAAI8H,qBAAa,eAAEpN,eAElCqN,YAAG,KAKtBxR,KAAKyR,SAAW1R,EAAea,MAAK,OAAIR,IAAM,MAAC,OAAU,QAAVuB,EAAG,MAAHvB,OAAG,EAAHA,EAAKiE,aAAK,QAAI,MAC7DrE,KAAK0R,cAAgB3R,EAAea,MAAK,OAAIR,IAAM,MAAC,OAAe,QAAfuB,EAAG,MAAHvB,OAAG,EAAHA,EAAKmE,kBAAU,QAAI,KAG3EwE,SACI/I,KAAKiG,aACAC,cAAcsK,EAAoC,CAAErK,OAAQ,CAAE6D,MAAO,CAAEpE,KAAM,OAC7EhF,QACG4K,KAAU1L,GACNA,EACME,KAAK+D,YAAYC,SAAS2N,oBAAmBhP,+BAAM7C,GAAM,CAAE8R,YAAa,MACxEpD,MAGb9M,UACG,KACI1B,KAAKwC,UACLxC,KAAKqN,oBAAoBC,SAAQ,OAAE,gCAAiC,CAChEC,OAAQ,mBAGhBzN,IACIE,KAAKqN,oBAAoBS,OAAM,OAAE,8BAA+B,CAC5DP,OAAQ,oBAM5BpI,OAAOrF,GACHE,KAAKiG,aACA2I,OAAO,CACJ3E,SAAOyD,KAAE,0CACTmB,QAAS,CACL,CAAEvH,KAAM,YAAawH,SAAOpB,KAAE,kBAC9B,CAAEpG,KAAM,SAAUwH,OAAO,OAAE,iBAAkBC,aAAa,MAGjEnO,MACG,OAAUb,GACNA,EAAWC,KAAK+D,YAAYC,SAAS6N,oBAAoB/R,GAAW0O,MAGxE,OAAUzO,GACFA,EAAO8R,oBAAoBC,SAAW3J,cAE/BnI,KAAK+D,YAAYC,SACnB8C,uBACA+D,UAAU,KAAO,CAAEkH,cAAc,QAE/BP,OAAG,CAAEO,aAAchS,EAAO8R,oBAAoBpE,YAIhE/L,UACG3B,IACuC,iBAAxBA,EAAOgS,aACd/R,KAAKqN,oBAAoBS,MAAM/N,EAAOgS,eAEtC/R,KAAKwC,UACLxC,KAAKqN,oBAAoBC,SAAQ,OAAE,gCAAiC,CAChEC,OAAQ,oBAIpBxN,IACIC,KAAKqN,oBAAoBS,OAAM,OAAE,8BAA+B,CAC5DP,OAAQ,oBAM5BkD,OAAO3Q,GACHE,KAAKiG,aACAC,cAAcsK,EAAoC,CAAErK,OAAQ,CAAE6D,WAC9DpJ,QACG4K,KAAUzL,GACNA,EACMC,KAAK+D,YAAYC,SAASgO,oBAAmBrP,eAAGpC,GAAIT,EAAMS,IAAOR,IACjEyO,MAGb9M,UACG,KACI1B,KAAKwC,UACLxC,KAAKqN,oBAAoBC,SAAQ,OAAE,gCAAiC,CAChEC,OAAQ,mBAGhBxN,IACIC,KAAKqN,oBAAoBS,OAAM,OAAE,8BAA+B,CAC5DP,OAAQ,oBAM5BmD,eACI,MAAM5Q,EAAM6C,iBAAQ3C,KAAKU,MAAMkC,SAASC,eACjC/C,EAAOmS,SACdjS,KAAKyC,OAAOC,SAAS,CAAC,KAAM5C,GAAS,CAAEgD,WAAY9C,KAAKU,MAAOqC,oBAAqB,aAGxFkG,WAAWnJ,GACPE,KAAKiG,aACAC,cAAcxB,EAAmC,CAC9CyB,OAAQ,CACJ6D,QACAtJ,MAAOV,KAAKU,OAEhB0F,KAAM,KACN8L,cAAe,QAElBtR,QACG4K,KAAUzL,GACNA,EACMC,KAAK+D,YAAYC,SACZyK,oBAAoB3O,EAAMS,GAAIR,GAC9Ba,MAAK,QAAMb,IAChByO,MAGb9M,UAAU,CACPU,KAAMrC,IACFC,KAAKqN,oBAAoBC,SAAQ,OAAE,2CAA4C,CAC3EoB,cAAe3O,EAAOmD,OACtByL,UAAW7O,EAAM8F,OAErB5F,KAAKqR,2BAA2BjP,OAChCpC,KAAKyE,oBAAsB,MAK3CuE,gBACIlJ,EACAC,GAEAC,KAAK+D,YAAYC,SAASgL,yBAAyBlP,EAAMS,GAAIR,GAAa2B,UAAU,CAChFW,SAAU,KACNrC,KAAKqN,oBAAoBC,SAAQ,OAAE,gDAAiD,CAChFoB,cAAe3O,EAAYmD,OAC3ByL,UAAW7O,EAAM8F,OAErB5F,KAAKqR,2BAA2BjP,OAChCpC,KAAKyE,oBAAsB,6CAhP9B0N,GAA0BvS,yFAA1BuS,EAA0BxO,s5CDtCvC/D,0BAAgB,iBAERA,wCAOJA,QACAA,wBACIA,kCACAA,2BAIJA,UAEJA,iBAA2B,UAA3BA,CAA2B,sBAQfA,sCAAcG,oBAAdH,CAAoC,wCACdG,iHAEtBH,iCA2CJA,UAEJA,4CAGAA,oCACIA,sDA6CJA,iBAtHQA,2CAA0B,2DAOGA,yDAS7BA,uDACAA,qCAAwB,4CAAxBA,CAAwB,wCAAxBA,CAAwB,2CAuDLA,uDACRA,64CElEfA,eACIA,sBACAA,8BACJA,eAH2BA,gCAEvBA,iJAmBJA,gBACIA,SACJA,QACAA,gBAA8BA,SAA2BA,QACzDA,gBACIA,uCACJA,QACAA,gBACIA,wDAKJA,QACAA,cAAI,kBAAJA,CAAI,gBAGQA,gCACAA,wBACJA,QACAA,iCAA8C,gBAItCA,8DAASwS,8CAITxS,wBACAA,gCACJA,qCA7BRA,+DAE0BA,+BAECA,6BAKvBA,kDAAmC,4BAO/BA,sDAQIA,0DAIAA,sDCxCjB,gBACKuI,MAIRtI,YACYC,EACRC,EACAK,EACQuB,EACAC,GAER8H,MAAM3J,EAAQK,GANNJ,mBAGAA,oBACAA,2BANZA,gBAAa,IAAIC,KAAY,IASzByJ,MAAMiH,WACF,IAAI9O,IAAgB7B,KAAK+D,YAAYC,SAASC,mBAAmBpC,GAAM+O,yBACvE/O,GAAQA,EAAKsC,UACb,CAACtC,EAAM2H,KAAU,CACbqH,QAAS,CACL5O,OACAC,OACAuB,OAAQ,CACJ0G,aAAc,CACV2G,SAAU9Q,KAAK+Q,WAAW3L,OAE9BuD,SAAU,CACNmI,SAAU9Q,KAAK+Q,WAAW3L,OAE9BsH,WAAY,CACRoE,SAAU9Q,KAAK+Q,WAAW3L,QAGlCiN,eAAgBlK,SAChBuD,KAAM,CACFC,UAAW2G,gBAO/B9R,WACIkJ,MAAMlJ,WACNR,KAAK+Q,WAAW7P,aACXN,QACGsP,KAAOpQ,GAAS,EAAIA,EAAMoD,QAA2B,IAAjBpD,EAAMoD,WAC1C8N,MAAa,QACbxP,MAAUxB,KAAKyB,WAElBC,UAAU,IAAM1B,KAAKwC,WAG9B4P,eAAetS,GACX,OAAOE,KAAKiG,aACP2I,OAAO,CACJ3E,SAAOyD,KAAE,mCACT2B,KAAM,GAAGvP,EAAS4I,aAAa5I,EAAS6I,WACxCkG,QAAS,CACL,CAAEvH,KAAM,YAAawH,SAAOpB,KAAE,kBAC9B,CAAEpG,KAAM,SAAUwH,OAAO,OAAE,iBAAkBC,aAAa,MAGjEnO,MAAK,OAAUb,GAAQA,EAAMC,KAAK+D,YAAYC,SAASoO,eAAetS,EAASS,IAAMiO,MACrF9M,UACG,KACI1B,KAAKqN,oBAAoBC,SAAQ,OAAE,gCAAiC,CAChEC,OAAQ,aAEZvN,KAAKwC,WAETzC,IACIC,KAAKqN,oBAAoBS,OAAM,OAAE,8BAA+B,CAC5DP,OAAQ,sDAvEnBgF,GAAqB3S,yFAArB2S,EAAqB5O,oxBDtBlC/D,0BAAgB,iBAERA,wCAOJA,QACAA,wBACIA,kCACAA,sBAIJA,UAGJA,4BAKIA,sCAAcG,oBAAdH,CAAoC,wCACdG,6FAEtBH,4BAA+BA,gCAAiCA,QAChEA,4BAA+BA,gCAA0CA,QACzEA,0BAAeA,gCAA0CA,QACzDA,0BAA+B,oBAE/BA,iCAoCJA,eA/DYA,2CAA0B,sFAO0BA,oDAQ5DA,6CAAwB,2CAAxBA,CAAwB,wCAAxBA,CAAwB,2CAOTA,4BAAgBA,6CAChBA,4BAAgBA,sDAChBA,+PEtBZ,gBAA+BuI,MAClCtI,YAAYC,EAAgBC,GACxB2J,MACI5J,EACA,CACIsN,WAAY,WACZ7M,GAAI,GACJoL,UAAW,GACX6G,UAAW,GACXvI,MAAO,GACPvB,UAAW,GACXC,SAAU,GACVwB,aAAc,GACdD,YAAa,KACbM,UAAW,KACXiI,KAAM,MAEVrS,GACIL,EAAYiE,SACPsK,YAAYlO,EAAI,CAAE8B,KAAM,GAAIwJ,KAAM,CAAEuE,cAAe9H,cACnDjE,UAAUvC,GAAQA,EAAKqC,kDApB/B0O,GAAgB9S,qDAAhB8S,EAAgBC,QAAhBD,EAAgB,qBAFb,SCST,MAAME,GAA0B,CACnC,CACIC,KAAM,YACNC,UAAWP,EACXQ,UAAW,GACX7D,KAAM,CACF8D,cAAYtF,KAAE,0BAGtB,CACImF,KAAM,gBACNC,UAAW1C,EACX6C,WAAS9K,OAAkBuK,GAC3BQ,cAAe,CAAC/K,OAChB+G,KAAM,CACF8D,WAAYG,KAGpB,CACIN,KAAM,SACNC,UAAWX,EACXjD,KAAM,CACF8D,cAAYtF,KAAE,iCAKnB,YAA4BhH,EAAW5G,GAC1C,SAAOqI,OAAmC,CACtCoF,OAAQ7G,EAAK6G,OACbhN,GAAIT,EAAOS,GACX6S,cAAe,uBACf5K,QAASzI,GAAY,GAAGA,EAAS2I,aAAa3I,EAAS4I,WACvDjI,MAAO,cCXR,+CAAM2S,4DAjBA,CAAClL,MAAcmL,cAAsBV","names":["e","constructor","o","t","this","l","E","K","n","selectedMemberIds","indexOf","id","ngOnInit","membersCurrentPage$","route","paramMap","pipe","p","get","membersItemsPerPage$","ee","filterTermControl","valueChanges","oe","setContentsPageNumber","k","z","refresh$","se","destroy$","subscribe","r","a","c","fetchParamsChange","emit","filterTerm","skip","take","ngOnDestroy","next","complete","setParam","setContentsItemsPerPage","refresh","router","navigate","Object","snapshot","params","relativeTo","queryParamsHandling","areAllSelected","members","length","toggleSelectAll","selectionChange","map","toggleSelectMember","item","includes","filter","A","selectors","cancel","add","fetchGroupMembers$","dataService","customer","getCustomerList","mapStream","customers","customers$","items","customersTotal$","totalItems","resolveWith","selectedCustomerIds","S","save","addressForm","changeDetector","markForCheck","L","editAddress","setAsDefaultShippingAddress","setAsDefaultBillingAddress","delete","value","dataDependenciesPopulated","ngOnChanges","customFields","availableCountries","getCountryName","find","code","name","setAsDefaultBilling","markAsDirty","setAsDefaultShipping","deleteAddress","modalService","fromComponent","locals","size","closable","I","isArray","Array","ue","s","He","me","groups$","getCustomerGroupList","customerGroups","selectedGroupIds","J","Z","historyEntryComponentService","getComponent","entry","type","componentFactoryResolver","resolveComponentFactory","portalRef","createComponent","instance","componentRef","destroy","F","addNoteToCustomer","oxw","updateNote","deleteNote","d","hasCustomComponent","getDisplayType","getTimelineIcon","isFeatured","getName","administrator","firstName","lastName","addNote","note","O","create","removeFromGroup","addToGroup","setDefaultBillingAddressId","setDefaultShippingAddressId","toggleDeleteAddress","addAddress","setOrderItemsPerPage","setOrderCurrentPage","u","h","super","Set","getCustomFieldConfig","addressCustomFields","detailForm","formBuilder","group","title","phoneNumber","emailAddress","password","reduce","f","W","addresses","init","availableCountries$","settings","getAvailableCountries","mapSingle","countries","ke","entity$","Re","orderListUpdates$","orders$","orders","ordersCount$","history$","fetchHistory","g","getCustomerHistory","sort","createdAt","history","getAddressFormControls","controls","defaultBillingAddressId","addressDefaultsUpdated","defaultShippingAddressId","addressesToDeleteIds","has","fullName","company","streetLine1","streetLine2","city","province","postalCode","countryCode","defaultShippingAddress","defaultBillingAddress","addControl","push","ordersPerPage","fetchOrdersList","currentOrdersPage","createCustomer","__typename","notificationService","success","entity","notify","message","m","translationVars","duration","markAsPristine","error","de","dirty","updateCustomer","deleteCustomerAddress","updateCustomerAddress","createCustomerAddress","qe","getCustomer","single$","y","addCustomersToGroup","customerCount","groupName","dialog","buttons","label","returnValue","removeCustomersFromGroup","displayPrivacyControls","data","updateCustomerNote","noteId","body","deleteCustomerNote","setFormValues","patchValue","Ee","country","Do","xe","No","Uo","setControl","setCustomFieldFormValues","orderPlacedAt","H","Qe","P","serverConfigService","getCustomFieldsFor","form","T","update","closeMembers","setQueryFn","refetchOnChannelChange","options","contains","searchTerm","te","listIsEmpty$","items$","activeGroup$","activeGroupId","refreshActiveGroupMembers$","getCustomerGroupWithCustomers","customerGroup","Ce","members$","membersTotal$","createCustomerGroup","customerIds","deleteCustomerGroup","result","errorMessage","updateCustomerGroup","contents","verticalAlign","w","deleteCustomer","filterOperator","xo","M","updatedAt","user","D","factory","ve","path","component","pathMatch","breadcrumb","resolve","canDeactivate","ye","breadcrumbKey","G","C"],"sources":["./src/lib/customer/src/components/customer-group-member-list/customer-group-member-list.component.html","./src/lib/customer/src/components/customer-group-member-list/customer-group-member-list.component.ts","./src/lib/customer/src/components/add-customer-to-group-dialog/add-customer-to-group-dialog.component.html","./src/lib/customer/src/components/add-customer-to-group-dialog/add-customer-to-group-dialog.component.ts","./src/lib/customer/src/components/address-detail-dialog/address-detail-dialog.component.html","./src/lib/customer/src/components/address-detail-dialog/address-detail-dialog.component.ts","./src/lib/customer/src/components/address-card/address-card.component.html","./src/lib/customer/src/components/address-card/address-card.component.ts","./node_modules/@angular-devkit/build-angular/src/babel/webpack-loader.js","./src/lib/customer/src/components/select-customer-group-dialog/select-customer-group-dialog.component.html","./src/lib/customer/src/components/select-customer-group-dialog/select-customer-group-dialog.component.ts","./src/lib/customer/src/components/customer-status-label/customer-status-label.component.html","./src/lib/customer/src/components/customer-status-label/customer-status-label.component.ts","./src/lib/customer/src/components/customer-history/customer-history-entry-host.component.ts","./src/lib/customer/src/components/customer-history/customer-history.component.html","./src/lib/customer/src/components/customer-history/customer-history.component.ts","./src/lib/customer/src/components/customer-detail/customer-detail.component.html","./src/lib/customer/src/components/customer-detail/customer-detail.component.ts","./src/lib/customer/src/components/customer-group-detail-dialog/customer-group-detail-dialog.component.html","./src/lib/customer/src/components/customer-group-detail-dialog/customer-group-detail-dialog.component.ts","./src/lib/customer/src/components/customer-group-list/customer-group-list.component.html","./src/lib/customer/src/components/customer-group-list/customer-group-list.component.ts","./src/lib/customer/src/components/customer-list/customer-list.component.html","./src/lib/customer/src/components/customer-list/customer-list.component.ts","./src/lib/customer/src/providers/routing/customer-resolver.ts","./src/lib/customer/src/customer.routes.ts","./src/lib/customer/src/customer.module.ts"],"sourcesContent":["<input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"filterTermControl\"\r\n [placeholder]=\"'customer.search-customers-by-email' | translate\"\r\n class=\"search-input\"\r\n/>\r\n\r\n<vdr-data-table\r\n [items]=\"members\"\r\n [itemsPerPage]=\"membersItemsPerPage$ | async\"\r\n [totalItems]=\"totalItems\"\r\n [currentPage]=\"membersCurrentPage$ | async\"\r\n (pageChange)=\"setContentsPageNumber($event)\"\r\n (itemsPerPageChange)=\"setContentsItemsPerPage($event)\"\r\n [allSelected]=\"areAllSelected()\"\r\n [isRowSelectedFn]=\"('UpdateCustomerGroup' | hasPermission) && isMemberSelected\"\r\n (rowSelectChange)=\"toggleSelectMember($event)\"\r\n (allSelectChange)=\"toggleSelectAll()\"\r\n>\r\n <vdr-dt-column [expand]=\"true\">{{ 'customer.name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column [expand]=\"true\">{{ 'customer.email-address' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-customer=\"item\">\r\n <td class=\"left align-middle\">\r\n {{ customer.title }} {{ customer.firstName }} {{ customer.lastName }}\r\n </td>\r\n <td class=\"left align-middle\">{{ customer.emailAddress }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['/customer', 'customers', customer.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Customer, DataService } from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map, startWith, takeUntil, tap } from 'rxjs/operators';\r\n\r\nexport interface CustomerGroupMemberFetchParams {\r\n skip: number;\r\n take: number;\r\n filterTerm: string;\r\n}\r\n\r\ntype CustomerGroupMember = Pick<\r\n Customer,\r\n 'id' | 'createdAt' | 'updatedAt' | 'title' | 'firstName' | 'lastName' | 'emailAddress'\r\n>;\r\n\r\n@Component({\r\n selector: 'vdr-customer-group-member-list',\r\n templateUrl: './customer-group-member-list.component.html',\r\n styleUrls: ['./customer-group-member-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerGroupMemberListComponent implements OnInit, OnDestroy {\r\n @Input() members: CustomerGroupMember[];\r\n @Input() totalItems: number;\r\n @Input() route: ActivatedRoute;\r\n @Input() selectedMemberIds: string[] = [];\r\n @Output() selectionChange = new EventEmitter<string[]>();\r\n @Output() fetchParamsChange = new EventEmitter<CustomerGroupMemberFetchParams>();\r\n\r\n membersItemsPerPage$: Observable<number>;\r\n membersCurrentPage$: Observable<number>;\r\n filterTermControl = new FormControl('');\r\n private refresh$ = new BehaviorSubject<boolean>(true);\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(private router: Router, private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n this.membersCurrentPage$ = this.route.paramMap.pipe(\r\n map(qpm => qpm.get('membersPage')),\r\n map(page => (!page ? 1 : +page)),\r\n startWith(1),\r\n distinctUntilChanged(),\r\n );\r\n\r\n this.membersItemsPerPage$ = this.route.paramMap.pipe(\r\n map(qpm => qpm.get('membersPerPage')),\r\n map(perPage => (!perPage ? 10 : +perPage)),\r\n startWith(10),\r\n distinctUntilChanged(),\r\n );\r\n\r\n const filterTerm$ = this.filterTermControl.valueChanges.pipe(\r\n debounceTime(250),\r\n tap(() => this.setContentsPageNumber(1)),\r\n startWith(''),\r\n );\r\n\r\n combineLatest(this.membersCurrentPage$, this.membersItemsPerPage$, filterTerm$, this.refresh$)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(([currentPage, itemsPerPage, filterTerm]) => {\r\n const take = itemsPerPage;\r\n const skip = (currentPage - 1) * itemsPerPage;\r\n this.fetchParamsChange.emit({\r\n filterTerm,\r\n skip,\r\n take,\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n setContentsPageNumber(page: number) {\r\n this.setParam('membersPage', page);\r\n }\r\n\r\n setContentsItemsPerPage(perPage: number) {\r\n this.setParam('membersPerPage', perPage);\r\n }\r\n\r\n refresh() {\r\n this.refresh$.next(true);\r\n }\r\n\r\n private setParam(key: string, value: any) {\r\n this.router.navigate(['./', { ...this.route.snapshot.params, [key]: value }], {\r\n relativeTo: this.route,\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n\r\n areAllSelected(): boolean {\r\n if (this.members) {\r\n return this.selectedMemberIds.length === this.members.length;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n toggleSelectAll() {\r\n if (this.areAllSelected()) {\r\n this.selectionChange.emit([]);\r\n } else {\r\n this.selectionChange.emit(this.members.map(v => v.id));\r\n }\r\n }\r\n\r\n toggleSelectMember({ item: member }: { item: { id: string } }) {\r\n if (this.selectedMemberIds.includes(member.id)) {\r\n this.selectionChange.emit(this.selectedMemberIds.filter(id => id !== member.id));\r\n } else {\r\n this.selectionChange.emit([...this.selectedMemberIds, member.id]);\r\n }\r\n }\r\n\r\n isMemberSelected = (member: { id: string }): boolean => {\r\n return -1 < this.selectedMemberIds.indexOf(member.id);\r\n };\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'customer.add-customers-to-group-with-name' | translate: {groupName: group.name} }}\r\n</ng-template>\r\n\r\n<vdr-customer-group-member-list\r\n [members]=\"customers$ | async\"\r\n [totalItems]=\"customersTotal$ | async\"\r\n [route]=\"route\"\r\n [selectedMemberIds]=\"selectedCustomerIds\"\r\n (fetchParamsChange)=\"fetchGroupMembers$.next($event)\"\r\n (selectionChange)=\"selectedCustomerIds = $event\"\r\n>\r\n\r\n</vdr-customer-group-member-list>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"add()\" [disabled]=\"!selectedCustomerIds.length\" class=\"btn btn-primary\">\r\n {{ 'customer.add-customers-to-group-with-count' | translate: {count: selectedCustomerIds.length} }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport {\r\n DataService,\r\n Dialog,\r\n GetCustomerGroupsQuery,\r\n GetCustomerListQuery,\r\n ItemOf,\r\n} from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\nimport { CustomerGroupMemberFetchParams } from '../customer-group-member-list/customer-group-member-list.component';\r\n\r\n@Component({\r\n selector: 'vdr-add-customer-to-group-dialog',\r\n templateUrl: './add-customer-to-group-dialog.component.html',\r\n styleUrls: ['./add-customer-to-group-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AddCustomerToGroupDialogComponent implements Dialog<string[]>, OnInit {\r\n resolveWith: (result?: string[]) => void;\r\n group: ItemOf<GetCustomerGroupsQuery, 'customerGroups'>;\r\n route: ActivatedRoute;\r\n selectedCustomerIds: string[] = [];\r\n customers$: Observable<GetCustomerListQuery['customers']['items']>;\r\n customersTotal$: Observable<number>;\r\n fetchGroupMembers$ = new BehaviorSubject<CustomerGroupMemberFetchParams>({\r\n skip: 0,\r\n take: 10,\r\n filterTerm: '',\r\n });\r\n\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n const customerResult$ = this.fetchGroupMembers$.pipe(\r\n switchMap(({ skip, take, filterTerm }) => {\r\n return this.dataService.customer\r\n .getCustomerList(take, skip, filterTerm)\r\n .mapStream(res => res.customers);\r\n }),\r\n );\r\n\r\n this.customers$ = customerResult$.pipe(map(res => res.items));\r\n this.customersTotal$ = customerResult$.pipe(map(res => res.totalItems));\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n add() {\r\n this.resolveWith(this.selectedCustomerIds);\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n <span *ngIf=\"addressForm.get('streetLine1')?.value as streetLine1\">{{ streetLine1 }},</span>\r\n <span *ngIf=\"addressForm.get('countryCode')?.value as countryCode\"> {{ countryCode }}</span>\r\n</ng-template>\r\n\r\n<vdr-address-form\r\n [formGroup]=\"addressForm\"\r\n [availableCountries]=\"availableCountries\"\r\n [customFields]=\"customFields\"\r\n></vdr-address-form>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button\r\n type=\"submit\"\r\n (click)=\"save()\"\r\n [disabled]=\"!addressForm.valid || !addressForm.touched\"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { CustomFieldConfig, Dialog, GetAvailableCountriesQuery } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-address-detail-dialog',\r\n templateUrl: './address-detail-dialog.component.html',\r\n styleUrls: ['./address-detail-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AddressDetailDialogComponent implements Dialog<FormGroup>, OnInit {\r\n addressForm: FormGroup;\r\n customFields: CustomFieldConfig;\r\n availableCountries: GetAvailableCountriesQuery['countries']['items'] = [];\r\n resolveWith: (result?: FormGroup) => void;\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngOnInit() {\r\n this.addressForm.valueChanges.subscribe(() => this.changeDetector.markForCheck());\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n save() {\r\n this.resolveWith(this.addressForm);\r\n }\r\n}\r\n","<div class=\"card\" *ngIf=\"addressForm.value as address\">\r\n <div class=\"card-header\">\r\n <div class=\"address-title\">\r\n <span class=\"street-line\" *ngIf=\"address.streetLine1\">{{ address.streetLine1 }},</span>\r\n {{ address.countryCode }}\r\n </div>\r\n <div class=\"default-controls\">\r\n <vdr-chip class=\"is-default p8\" *ngIf=\"isDefaultShipping\">\r\n <clr-icon shape=\"truck\"></clr-icon>\r\n {{ 'customer.default-shipping-address' | translate }}\r\n </vdr-chip>\r\n <vdr-chip class=\"is-default p8\" *ngIf=\"isDefaultBilling\">\r\n <clr-icon shape=\"credit-card\"></clr-icon>\r\n {{ 'customer.default-billing-address' | translate }}\r\n </vdr-chip>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"card-text\">\r\n <vdr-formatted-address [address]=\"address\"></vdr-formatted-address>\r\n </div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <vdr-entity-info [entity]=\"address\"></vdr-entity-info>\r\n <ng-container *ngIf=\"editable\">\r\n <button class=\"btn btn-sm btn-link\" (click)=\"editAddress()\">\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-sm btn-link\" vdrDropdownTrigger>\r\n {{ 'common.more' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu>\r\n <button\r\n vdrDropdownItem\r\n class=\"button\"\r\n [disabled]=\"isDefaultShipping\"\r\n (click)=\"setAsDefaultShippingAddress()\"\r\n >\r\n {{ 'customer.set-as-default-shipping-address' | translate }}\r\n </button>\r\n <button\r\n vdrDropdownItem\r\n class=\"button\"\r\n [disabled]=\"isDefaultBilling\"\r\n (click)=\"setAsDefaultBillingAddress()\"\r\n >\r\n {{ 'customer.set-as-default-billing-address' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"delete()\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </ng-container>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { CustomFieldConfig, GetAvailableCountriesQuery, ModalService } from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { filter, take } from 'rxjs/operators';\r\n\r\nimport { AddressDetailDialogComponent } from '../address-detail-dialog/address-detail-dialog.component';\r\n\r\n@Component({\r\n selector: 'vdr-address-card',\r\n templateUrl: './address-card.component.html',\r\n styleUrls: ['./address-card.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AddressCardComponent implements OnInit, OnChanges {\r\n @Input() addressForm: FormGroup;\r\n @Input() customFields: CustomFieldConfig;\r\n @Input() availableCountries: GetAvailableCountriesQuery['countries']['items'] = [];\r\n @Input() isDefaultBilling: string;\r\n @Input() isDefaultShipping: string;\r\n @Input() editable = true;\r\n @Output() setAsDefaultShipping = new EventEmitter<string>();\r\n @Output() setAsDefaultBilling = new EventEmitter<string>();\r\n @Output() deleteAddress = new EventEmitter<string>();\r\n private dataDependenciesPopulated = new BehaviorSubject<boolean>(false);\r\n\r\n constructor(private modalService: ModalService, private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {\r\n const streetLine1 = this.addressForm.get('streetLine1') as FormControl;\r\n // Make the address dialog display automatically if there is no address line\r\n // as is the case when adding a new address.\r\n if (!streetLine1.value) {\r\n this.dataDependenciesPopulated\r\n .pipe(\r\n filter(value => value),\r\n take(1),\r\n )\r\n .subscribe(() => {\r\n this.editAddress();\r\n });\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.customFields != null && this.availableCountries != null) {\r\n this.dataDependenciesPopulated.next(true);\r\n }\r\n }\r\n\r\n getCountryName(countryCode: string) {\r\n if (!this.availableCountries) {\r\n return '';\r\n }\r\n const match = this.availableCountries.find(c => c.code === countryCode);\r\n return match ? match.name : '';\r\n }\r\n\r\n setAsDefaultBillingAddress() {\r\n this.setAsDefaultBilling.emit(this.addressForm.value.id);\r\n this.addressForm.markAsDirty();\r\n }\r\n\r\n setAsDefaultShippingAddress() {\r\n this.setAsDefaultShipping.emit(this.addressForm.value.id);\r\n this.addressForm.markAsDirty();\r\n }\r\n\r\n delete() {\r\n this.deleteAddress.emit(this.addressForm.value.id);\r\n this.addressForm.markAsDirty();\r\n }\r\n\r\n editAddress() {\r\n this.modalService\r\n .fromComponent(AddressDetailDialogComponent, {\r\n locals: {\r\n addressForm: this.addressForm,\r\n customFields: this.customFields,\r\n availableCountries: this.availableCountries,\r\n },\r\n size: 'md',\r\n closable: true,\r\n })\r\n .subscribe(() => {\r\n this.changeDetector.markForCheck();\r\n });\r\n }\r\n}\r\n","import { operate } from '../util/lift';\nimport { argsOrArgArray } from '../util/argsOrArgArray';\nimport { mergeAll } from './mergeAll';\nimport { popNumber, popScheduler } from '../util/args';\nimport { from } from '../observable/from';\nexport function merge(...args) {\n const scheduler = popScheduler(args);\n const concurrent = popNumber(args, Infinity);\n args = argsOrArgArray(args);\n return operate((source, subscriber) => {\n mergeAll(concurrent)(from([source, ...args], scheduler)).subscribe(subscriber);\n });\n}\n","<ng-template vdrDialogTitle>\r\n {{ 'customer.add-customer-to-group' | translate }}\r\n</ng-template>\r\n\r\n<ng-select\r\n [items]=\"groups$ | async\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n bindValue=\"id\"\r\n [(ngModel)]=\"selectedGroupIds\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span aria-hidden=\"true\" class=\"ng-value-icon left\" (click)=\"clear(item)\"> × </span>\r\n <vdr-chip [colorFrom]=\"item.id\">{{ item.name }}</vdr-chip>\r\n </ng-template>\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <vdr-chip [colorFrom]=\"item.id\">{{ item.name }}</vdr-chip>\r\n </ng-template>\r\n</ng-select>\r\n\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"add()\" [disabled]=\"!selectedGroupIds.length\" class=\"btn btn-primary\">\r\n {{ 'customer.add-customer-to-groups-with-count' | translate: {count: selectedGroupIds.length} }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { DataService, Dialog, GetCustomerGroupsQuery, ItemOf } from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vdr-select-customer-group-dialog',\r\n templateUrl: './select-customer-group-dialog.component.html',\r\n styleUrls: ['./select-customer-group-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SelectCustomerGroupDialogComponent implements Dialog<string[]>, OnInit {\r\n resolveWith: (result?: string[]) => void;\r\n groups$: Observable<Array<ItemOf<GetCustomerGroupsQuery, 'customerGroups'>>>;\r\n selectedGroupIds: string[] = [];\r\n\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n this.groups$ = this.dataService.customer\r\n .getCustomerGroupList()\r\n .mapStream(res => res.customerGroups.items);\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n add() {\r\n this.resolveWith(this.selectedGroupIds);\r\n }\r\n}\r\n","<vdr-chip *ngIf=\"customer.user?.id\">\r\n <ng-container *ngIf=\"customer.user?.verified\">\r\n <clr-icon shape=\"check-circle\" class=\"verified-user-icon\"></clr-icon>\r\n {{ 'customer.verified' | translate }}\r\n </ng-container>\r\n <ng-container *ngIf=\"!customer.user?.verified\">\r\n <clr-icon shape=\"check-circle\" class=\"registered-user-icon\"></clr-icon>\r\n {{ 'customer.registered' | translate }}\r\n </ng-container>\r\n</vdr-chip>\r\n<vdr-chip *ngIf=\"!customer.user?.id\">{{ 'customer.guest' | translate }}</vdr-chip>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { CustomerFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-customer-status-label',\r\n templateUrl: './customer-status-label.component.html',\r\n styleUrls: ['./customer-status-label.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerStatusLabelComponent {\r\n @Input() customer: CustomerFragment;\r\n}\r\n","import {\r\n Component,\r\n ComponentFactoryResolver,\r\n ComponentRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n Type,\r\n ViewChild,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport {\r\n CustomerFragment,\r\n CustomerHistoryEntryComponent,\r\n HistoryEntryComponentService,\r\n TimelineHistoryEntry,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-customer-history-entry-host',\r\n template: ` <vdr-timeline-entry\r\n [displayType]=\"instance.getDisplayType(entry)\"\r\n [iconShape]=\"instance.getIconShape && instance.getIconShape(entry)\"\r\n [createdAt]=\"entry.createdAt\"\r\n [name]=\"instance.getName && instance.getName(entry)\"\r\n [featured]=\"instance.isFeatured(entry)\"\r\n [collapsed]=\"!expanded && !instance.isFeatured(entry)\"\r\n (expandClick)=\"expandClick.emit()\"\r\n >\r\n <div #portal></div>\r\n </vdr-timeline-entry>`,\r\n exportAs: 'historyEntry',\r\n})\r\nexport class CustomerHistoryEntryHostComponent implements OnInit, OnDestroy {\r\n @Input() entry: TimelineHistoryEntry;\r\n @Input() customer: CustomerFragment;\r\n @Input() expanded: boolean;\r\n @Output() expandClick = new EventEmitter<void>();\r\n @ViewChild('portal', { static: true, read: ViewContainerRef }) portalRef: ViewContainerRef;\r\n instance: CustomerHistoryEntryComponent;\r\n private componentRef: ComponentRef<CustomerHistoryEntryComponent>;\r\n\r\n constructor(\r\n private componentFactoryResolver: ComponentFactoryResolver,\r\n private historyEntryComponentService: HistoryEntryComponentService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n const componentType = this.historyEntryComponentService.getComponent(\r\n this.entry.type,\r\n ) as Type<CustomerHistoryEntryComponent>;\r\n\r\n const factory = this.componentFactoryResolver.resolveComponentFactory(componentType);\r\n const componentRef = this.portalRef.createComponent(factory);\r\n componentRef.instance.entry = this.entry;\r\n componentRef.instance.customer = this.customer;\r\n this.instance = componentRef.instance;\r\n this.componentRef = componentRef;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.componentRef?.destroy();\r\n }\r\n}\r\n","<h4>{{ 'customer.customer-history' | translate }}</h4>\r\n<div class=\"entry-list\">\r\n <vdr-timeline-entry iconShape=\"note\" displayType=\"muted\" *vdrIfPermissions=\"'UpdateCustomer'\">\r\n <div class=\"note-entry\">\r\n <textarea [(ngModel)]=\"note\" name=\"note\" class=\"note\"></textarea>\r\n <button class=\"btn btn-secondary\" [disabled]=\"!note\" (click)=\"addNoteToCustomer()\">\r\n {{ 'order.add-note' | translate }}\r\n </button>\r\n </div>\r\n </vdr-timeline-entry>\r\n <ng-container *ngFor=\"let entry of history\">\r\n <vdr-customer-history-entry-host\r\n *ngIf=\"hasCustomComponent(entry.type); else defaultComponents\"\r\n [customer]=\"customer\"\r\n [entry]=\"entry\"\r\n [expanded]=\"expanded\"\r\n (expandClick)=\"expanded = !expanded\"\r\n ></vdr-customer-history-entry-host>\r\n <ng-template #defaultComponents>\r\n <vdr-timeline-entry\r\n [displayType]=\"getDisplayType(entry)\"\r\n [iconShape]=\"getTimelineIcon(entry)\"\r\n [createdAt]=\"entry.createdAt\"\r\n [name]=\"getName(entry)\"\r\n [featured]=\"isFeatured(entry)\"\r\n >\r\n <ng-container [ngSwitch]=\"entry.type\">\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_REGISTERED\">\r\n <div class=\"title\">\r\n {{ 'customer.history-customer-registered' | translate }}\r\n </div>\r\n <ng-container *ngIf=\"entry.data.strategy === 'native'; else namedStrategy\">\r\n {{ 'customer.history-using-native-auth-strategy' | translate }}\r\n </ng-container>\r\n <ng-template #namedStrategy>\r\n {{\r\n 'customer.history-using-external-auth-strategy'\r\n | translate: { strategy: entry.data.strategy }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_VERIFIED\">\r\n <div class=\"title\">\r\n {{ 'customer.history-customer-verified' | translate }}\r\n </div>\r\n <ng-container *ngIf=\"entry.data.strategy === 'native'; else namedStrategy\">\r\n {{ 'customer.history-using-native-auth-strategy' | translate }}\r\n </ng-container>\r\n <ng-template #namedStrategy>\r\n {{\r\n 'customer.history-using-external-auth-strategy'\r\n | translate: { strategy: entry.data.strategy }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_DETAIL_UPDATED\">\r\n <div class=\"flex\">\r\n {{ 'customer.history-customer-detail-updated' | translate }}\r\n <vdr-history-entry-detail>\r\n <vdr-object-tree [value]=\"entry.data.input\"></vdr-object-tree>\r\n </vdr-history-entry-detail>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_ADDED_TO_GROUP\">\r\n {{\r\n 'customer.history-customer-added-to-group'\r\n | translate: { groupName: entry.data.groupName }\r\n }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_REMOVED_FROM_GROUP\">\r\n {{\r\n 'customer.history-customer-removed-from-group'\r\n | translate: { groupName: entry.data.groupName }\r\n }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_ADDRESS_CREATED\">\r\n {{ 'customer.history-customer-address-created' | translate }}\r\n <div class=\"flex\">\r\n <div class=\"address-string\">{{ entry.data.address }}</div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_ADDRESS_UPDATED\">\r\n {{ 'customer.history-customer-address-updated' | translate }}\r\n <div class=\"flex\">\r\n <div class=\"address-string\">{{ entry.data.address }}</div>\r\n <vdr-history-entry-detail>\r\n <vdr-object-tree [value]=\"entry.data.input\"></vdr-object-tree>\r\n </vdr-history-entry-detail>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_ADDRESS_DELETED\">\r\n {{ 'customer.history-customer-address-deleted' | translate }}\r\n <div class=\"address-string\">{{ entry.data.address }}</div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_PASSWORD_UPDATED\">\r\n {{ 'customer.history-customer-password-updated' | translate }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_PASSWORD_RESET_REQUESTED\">\r\n {{ 'customer.history-customer-password-reset-requested' | translate }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_PASSWORD_RESET_VERIFIED\">\r\n {{ 'customer.history-customer-password-reset-verified' | translate }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_EMAIL_UPDATE_REQUESTED\">\r\n <div class=\"flex\">\r\n {{ 'customer.history-customer-email-update-requested' | translate }}\r\n <vdr-history-entry-detail>\r\n <vdr-labeled-data [label]=\"'customer.old-email-address' | translate\">{{\r\n entry.data.oldEmailAddress\r\n }}</vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'customer.new-email-address' | translate\">{{\r\n entry.data.newEmailAddress\r\n }}</vdr-labeled-data>\r\n </vdr-history-entry-detail>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_EMAIL_UPDATE_VERIFIED\">\r\n <div class=\"flex\">\r\n {{ 'customer.history-customer-email-update-verified' | translate }}\r\n <vdr-history-entry-detail>\r\n <vdr-labeled-data [label]=\"'customer.old-email-address' | translate\">{{\r\n entry.data.oldEmailAddress\r\n }}</vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'customer.new-email-address' | translate\">{{\r\n entry.data.newEmailAddress\r\n }}</vdr-labeled-data>\r\n </vdr-history-entry-detail>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.CUSTOMER_NOTE\">\r\n <div class=\"flex\">\r\n <div class=\"note-text\">\r\n {{ entry.data.note }}\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"updateNote.emit(entry)\"\r\n [disabled]=\"!('UpdateCustomer' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"deleteNote.emit(entry)\"\r\n [disabled]=\"!('UpdateCustomer' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <div class=\"title\">\r\n {{ entry.type | translate }}\r\n </div>\r\n <vdr-history-entry-detail *ngIf=\"entry.data\">\r\n <vdr-object-tree [value]=\"entry.data\"></vdr-object-tree>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n </ng-container>\r\n </vdr-timeline-entry>\r\n </ng-template>\r\n </ng-container>\r\n <vdr-timeline-entry [isLast]=\"true\"></vdr-timeline-entry>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport {\r\n CustomerFragment,\r\n GetCustomerHistoryQuery,\r\n HistoryEntryComponentService,\r\n HistoryEntryType,\r\n TimelineDisplayType,\r\n TimelineHistoryEntry,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-customer-history',\r\n templateUrl: './customer-history.component.html',\r\n styleUrls: ['./customer-history.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerHistoryComponent {\r\n @Input() customer: CustomerFragment;\r\n @Input() history: TimelineHistoryEntry[];\r\n @Output() addNote = new EventEmitter<{ note: string }>();\r\n @Output() updateNote = new EventEmitter<TimelineHistoryEntry>();\r\n @Output() deleteNote = new EventEmitter<TimelineHistoryEntry>();\r\n note = '';\r\n expanded = false;\r\n readonly type = HistoryEntryType;\r\n\r\n constructor(private historyEntryComponentService: HistoryEntryComponentService) {}\r\n\r\n hasCustomComponent(type: string): boolean {\r\n return !!this.historyEntryComponentService.getComponent(type);\r\n }\r\n\r\n getDisplayType(entry: TimelineHistoryEntry): TimelineDisplayType {\r\n switch (entry.type) {\r\n case HistoryEntryType.CUSTOMER_VERIFIED:\r\n case HistoryEntryType.CUSTOMER_EMAIL_UPDATE_VERIFIED:\r\n case HistoryEntryType.CUSTOMER_PASSWORD_RESET_VERIFIED:\r\n return 'success';\r\n case HistoryEntryType.CUSTOMER_REGISTERED:\r\n return 'muted';\r\n case HistoryEntryType.CUSTOMER_REMOVED_FROM_GROUP:\r\n return 'error';\r\n default:\r\n return 'default';\r\n }\r\n }\r\n\r\n getTimelineIcon(entry: TimelineHistoryEntry): string | [string, string] | undefined {\r\n switch (entry.type) {\r\n case HistoryEntryType.CUSTOMER_REGISTERED:\r\n return 'user';\r\n case HistoryEntryType.CUSTOMER_VERIFIED:\r\n return ['assign-user', 'is-solid'];\r\n case HistoryEntryType.CUSTOMER_NOTE:\r\n return 'note';\r\n case HistoryEntryType.CUSTOMER_ADDED_TO_GROUP:\r\n case HistoryEntryType.CUSTOMER_REMOVED_FROM_GROUP:\r\n return 'users';\r\n }\r\n }\r\n\r\n isFeatured(entry: TimelineHistoryEntry): boolean {\r\n switch (entry.type) {\r\n case HistoryEntryType.CUSTOMER_REGISTERED:\r\n case HistoryEntryType.CUSTOMER_VERIFIED:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n getName(entry: TimelineHistoryEntry): string {\r\n const { administrator } = entry;\r\n if (administrator) {\r\n return `${administrator.firstName} ${administrator.lastName}`;\r\n } else {\r\n return `${this.customer.firstName} ${this.customer.lastName}`;\r\n }\r\n }\r\n\r\n addNoteToCustomer() {\r\n this.addNote.emit({ note: this.note });\r\n this.note = '';\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"flex clr-align-items-center\">\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-customer-status-label [customer]=\"entity$ | async\"></vdr-customer-status-label>\r\n <div\r\n class=\"last-login\"\r\n *ngIf=\"(entity$ | async)?.user?.lastLogin as lastLogin\"\r\n [title]=\"lastLogin | localeDate: 'medium'\"\r\n >\r\n {{ 'customer.last-login' | translate }}: {{ lastLogin | timeAgo }}\r\n </div>\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"customer-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"!(addressDefaultsUpdated || (detailForm.valid && detailForm.dirty))\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"'UpdateCustomer'\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!(addressDefaultsUpdated || (detailForm.valid && detailForm.dirty))\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm.get('customer')\">\r\n <vdr-form-field [label]=\"'customer.title' | translate\" for=\"title\" [readOnlyToggle]=\"!(isNew$ | async)\">\r\n <input id=\"title\" type=\"text\" formControlName=\"title\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.first-name' | translate\"\r\n for=\"firstName\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"firstName\" type=\"text\" formControlName=\"firstName\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.last-name' | translate\"\r\n for=\"lastName\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"lastName\" type=\"text\" formControlName=\"lastName\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.email-address' | translate\"\r\n for=\"emailAddress\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"emailAddress\" type=\"text\" formControlName=\"emailAddress\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'customer.phone-number' | translate\"\r\n for=\"phoneNumber\"\r\n [readOnlyToggle]=\"!(isNew$ | async)\"\r\n >\r\n <input id=\"phoneNumber\" type=\"text\" formControlName=\"phoneNumber\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'customer.password' | translate\" for=\"password\" *ngIf=\"isNew$ | async\">\r\n <input id=\"password\" type=\"password\" formControlName=\"password\" />\r\n </vdr-form-field>\r\n\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Customer\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get(['customer', 'customFields'])\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n <vdr-custom-detail-component-host\r\n locationId=\"customer-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n</form>\r\n\r\n<div class=\"groups\" *ngIf=\"(entity$ | async)?.groups as groups\">\r\n <label class=\"clr-control-label\">{{ 'customer.customer-groups' | translate }}</label>\r\n <ng-container *ngIf=\"groups.length; else noGroups\">\r\n <vdr-chip\r\n *ngFor=\"let group of groups\"\r\n [colorFrom]=\"group.id\"\r\n icon=\"times\"\r\n (iconClick)=\"removeFromGroup(group)\"\r\n >{{ group.name }}</vdr-chip\r\n >\r\n </ng-container>\r\n <ng-template #noGroups>\r\n {{ 'customer.not-a-member-of-any-groups' | translate }}\r\n </ng-template>\r\n <div>\r\n <button\r\n class=\"btn btn-sm btn-secondary\"\r\n (click)=\"addToGroup()\"\r\n *vdrIfPermissions=\"'UpdateCustomerGroup'\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.add-customer-to-group' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class=\"clr-row\" *ngIf=\"!(isNew$ | async)\">\r\n <div class=\"clr-col-md-4\">\r\n <h3>{{ 'customer.addresses' | translate }}</h3>\r\n <vdr-address-card\r\n *ngFor=\"let addressForm of getAddressFormControls()\"\r\n [class.to-delete]=\"addressesToDeleteIds.has(addressForm.value.id)\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [isDefaultBilling]=\"defaultBillingAddressId === addressForm.value.id\"\r\n [isDefaultShipping]=\"defaultShippingAddressId === addressForm.value.id\"\r\n [addressForm]=\"addressForm\"\r\n [customFields]=\"addressCustomFields\"\r\n [editable]=\"(['UpdateCustomer'] | hasPermission) && !addressesToDeleteIds.has(addressForm.value.id)\"\r\n (setAsDefaultBilling)=\"setDefaultBillingAddressId($event)\"\r\n (setAsDefaultShipping)=\"setDefaultShippingAddressId($event)\"\r\n (deleteAddress)=\"toggleDeleteAddress($event)\"\r\n ></vdr-address-card>\r\n <button class=\"btn btn-secondary\" (click)=\"addAddress()\" *vdrIfPermissions=\"'UpdateCustomer'\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.create-new-address' | translate }}\r\n </button>\r\n </div>\r\n <div class=\"clr-col-md-8\">\r\n <h3>{{ 'customer.orders' | translate }}</h3>\r\n <vdr-data-table\r\n [items]=\"orders$ | async\"\r\n [itemsPerPage]=\"ordersPerPage\"\r\n [totalItems]=\"ordersCount$ | async\"\r\n [currentPage]=\"currentOrdersPage\"\r\n [emptyStateLabel]=\"'customer.no-orders-placed' | translate\"\r\n (itemsPerPageChange)=\"setOrderItemsPerPage($event)\"\r\n (pageChange)=\"setOrderCurrentPage($event)\"\r\n >\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.state' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.total' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.updated-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left\">{{ order.code }}</td>\r\n <td class=\"left\">{{ order.state }}</td>\r\n <td class=\"left\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left\">{{ order.updatedAt | localeDate: 'medium' }}</td>\r\n <td class=\"right\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"['/orders/', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n </vdr-data-table>\r\n </div>\r\n</div>\r\n<div class=\"clr-row\" *ngIf=\"!(isNew$ | async)\">\r\n <div class=\"clr-col-md-6\">\r\n <vdr-customer-history\r\n [customer]=\"entity$ | async\"\r\n [history]=\"history$ | async\"\r\n (addNote)=\"addNoteToCustomer($event)\"\r\n (updateNote)=\"updateNote($event)\"\r\n (deleteNote)=\"deleteNote($event)\"\r\n ></vdr-customer-history>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseDetailComponent,\r\n CreateAddressInput,\r\n CreateCustomerAddressMutation,\r\n CreateCustomerInput,\r\n Customer,\r\n CustomFieldConfig,\r\n DataService,\r\n DeleteCustomerAddressMutation,\r\n EditNoteDialogComponent,\r\n GetAvailableCountriesQuery,\r\n GetCustomerHistoryQuery,\r\n GetCustomerQuery,\r\n TimelineHistoryEntry,\r\n ModalService,\r\n NotificationService,\r\n ServerConfigService,\r\n SortOrder,\r\n UpdateCustomerAddressMutation,\r\n UpdateCustomerInput,\r\n UpdateCustomerMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { assertNever, notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { EMPTY, forkJoin, from, Observable, Subject } from 'rxjs';\r\nimport {\r\n concatMap,\r\n filter,\r\n map,\r\n merge,\r\n mergeMap,\r\n shareReplay,\r\n startWith,\r\n switchMap,\r\n take,\r\n} from 'rxjs/operators';\r\n\r\nimport { SelectCustomerGroupDialogComponent } from '../select-customer-group-dialog/select-customer-group-dialog.component';\r\n\r\ntype CustomerWithOrders = NonNullable<GetCustomerQuery['customer']>;\r\n\r\n@Component({\r\n selector: 'vdr-customer-detail',\r\n templateUrl: './customer-detail.component.html',\r\n styleUrls: ['./customer-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerDetailComponent\r\n extends BaseDetailComponent<CustomerWithOrders>\r\n implements OnInit, OnDestroy\r\n{\r\n detailForm: FormGroup;\r\n customFields: CustomFieldConfig[];\r\n addressCustomFields: CustomFieldConfig[];\r\n availableCountries$: Observable<GetAvailableCountriesQuery['countries']['items']>;\r\n orders$: Observable<NonNullable<GetCustomerQuery['customer']>['orders']['items']>;\r\n ordersCount$: Observable<number>;\r\n history$: Observable<NonNullable<GetCustomerHistoryQuery['customer']>['history']['items'] | undefined>;\r\n fetchHistory = new Subject<void>();\r\n defaultShippingAddressId: string;\r\n defaultBillingAddressId: string;\r\n addressesToDeleteIds = new Set<string>();\r\n addressDefaultsUpdated = false;\r\n ordersPerPage = 10;\r\n currentOrdersPage = 1;\r\n private orderListUpdates$ = new Subject<CustomerWithOrders>();\r\n\r\n constructor(\r\n route: ActivatedRoute,\r\n router: Router,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n private formBuilder: FormBuilder,\r\n protected dataService: DataService,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n\r\n this.customFields = this.getCustomFieldConfig('Customer');\r\n this.addressCustomFields = this.getCustomFieldConfig('Address');\r\n this.detailForm = this.formBuilder.group({\r\n customer: this.formBuilder.group({\r\n title: '',\r\n firstName: ['', Validators.required],\r\n lastName: ['', Validators.required],\r\n phoneNumber: '',\r\n emailAddress: ['', [Validators.required, Validators.email]],\r\n password: '',\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n }),\r\n addresses: new FormArray([]),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.availableCountries$ = this.dataService.settings\r\n .getAvailableCountries()\r\n .mapSingle(result => result.countries.items)\r\n .pipe(shareReplay(1));\r\n\r\n const customerWithUpdates$ = this.entity$.pipe(merge(this.orderListUpdates$));\r\n this.orders$ = customerWithUpdates$.pipe(map(customer => customer.orders.items));\r\n this.ordersCount$ = this.entity$.pipe(map(customer => customer.orders.totalItems));\r\n this.history$ = this.fetchHistory.pipe(\r\n startWith(null),\r\n switchMap(() => {\r\n return this.dataService.customer\r\n .getCustomerHistory(this.id, {\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n })\r\n .mapStream(data => data.customer?.history.items);\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n this.orderListUpdates$.complete();\r\n }\r\n\r\n getAddressFormControls(): FormControl[] {\r\n const formArray = this.detailForm.get(['addresses']) as FormArray;\r\n return formArray.controls as FormControl[];\r\n }\r\n\r\n setDefaultBillingAddressId(id: string) {\r\n this.defaultBillingAddressId = id;\r\n this.addressDefaultsUpdated = true;\r\n }\r\n\r\n setDefaultShippingAddressId(id: string) {\r\n this.defaultShippingAddressId = id;\r\n this.addressDefaultsUpdated = true;\r\n }\r\n\r\n toggleDeleteAddress(id: string) {\r\n if (this.addressesToDeleteIds.has(id)) {\r\n this.addressesToDeleteIds.delete(id);\r\n } else {\r\n this.addressesToDeleteIds.add(id);\r\n }\r\n }\r\n\r\n addAddress() {\r\n const addressFormArray = this.detailForm.get('addresses') as FormArray;\r\n const newAddress = this.formBuilder.group({\r\n fullName: '',\r\n company: '',\r\n streetLine1: ['', Validators.required],\r\n streetLine2: '',\r\n city: '',\r\n province: '',\r\n postalCode: '',\r\n countryCode: ['', Validators.required],\r\n phoneNumber: '',\r\n defaultShippingAddress: false,\r\n defaultBillingAddress: false,\r\n });\r\n if (this.addressCustomFields.length) {\r\n const customFieldsGroup = this.formBuilder.group({});\r\n for (const fieldDef of this.addressCustomFields) {\r\n customFieldsGroup.addControl(fieldDef.name, new FormControl(''));\r\n }\r\n newAddress.addControl('customFields', customFieldsGroup);\r\n }\r\n addressFormArray.push(newAddress);\r\n }\r\n\r\n setOrderItemsPerPage(itemsPerPage: number) {\r\n this.ordersPerPage = +itemsPerPage;\r\n this.fetchOrdersList();\r\n }\r\n\r\n setOrderCurrentPage(page: number) {\r\n this.currentOrdersPage = +page;\r\n this.fetchOrdersList();\r\n }\r\n\r\n create() {\r\n const customerForm = this.detailForm.get('customer');\r\n if (!customerForm) {\r\n return;\r\n }\r\n const formValue = customerForm.value;\r\n const customFields = customerForm.get('customFields')?.value;\r\n const customer: CreateCustomerInput = {\r\n title: formValue.title,\r\n emailAddress: formValue.emailAddress,\r\n firstName: formValue.firstName,\r\n lastName: formValue.lastName,\r\n phoneNumber: formValue.phoneNumber,\r\n customFields,\r\n };\r\n this.dataService.customer\r\n .createCustomer(customer, formValue.password)\r\n .subscribe(({ createCustomer }) => {\r\n switch (createCustomer.__typename) {\r\n case 'Customer':\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Customer',\r\n });\r\n if (createCustomer.emailAddress && !formValue.password) {\r\n this.notificationService.notify({\r\n message: _('customer.email-verification-sent'),\r\n translationVars: { emailAddress: formValue.emailAddress },\r\n type: 'info',\r\n duration: 10000,\r\n });\r\n }\r\n this.detailForm.markAsPristine();\r\n this.addressDefaultsUpdated = false;\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', createCustomer.id], { relativeTo: this.route });\r\n break;\r\n case 'EmailAddressConflictError':\r\n this.notificationService.error(createCustomer.message);\r\n }\r\n });\r\n }\r\n\r\n save() {\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n mergeMap(({ id }) => {\r\n const saveOperations: Array<\r\n Observable<\r\n | UpdateCustomerMutation['updateCustomer']\r\n | CreateCustomerAddressMutation['createCustomerAddress']\r\n | UpdateCustomerAddressMutation['updateCustomerAddress']\r\n | DeleteCustomerAddressMutation['deleteCustomerAddress']\r\n >\r\n > = [];\r\n const customerForm = this.detailForm.get('customer');\r\n if (customerForm && customerForm.dirty) {\r\n const formValue = customerForm.value;\r\n const customFields = customerForm.get('customFields')?.value;\r\n const customer: UpdateCustomerInput = {\r\n id,\r\n title: formValue.title,\r\n emailAddress: formValue.emailAddress,\r\n firstName: formValue.firstName,\r\n lastName: formValue.lastName,\r\n phoneNumber: formValue.phoneNumber,\r\n customFields,\r\n };\r\n saveOperations.push(\r\n this.dataService.customer\r\n .updateCustomer(customer)\r\n .pipe(map(res => res.updateCustomer)),\r\n );\r\n }\r\n const addressFormArray = this.detailForm.get('addresses') as FormArray;\r\n if ((addressFormArray && addressFormArray.dirty) || this.addressDefaultsUpdated) {\r\n for (const addressControl of addressFormArray.controls) {\r\n if (addressControl.dirty || this.addressDefaultsUpdated) {\r\n const address = addressControl.value;\r\n const input: CreateAddressInput = {\r\n fullName: address.fullName,\r\n company: address.company,\r\n streetLine1: address.streetLine1,\r\n streetLine2: address.streetLine2,\r\n city: address.city,\r\n province: address.province,\r\n postalCode: address.postalCode,\r\n countryCode: address.countryCode,\r\n phoneNumber: address.phoneNumber,\r\n defaultShippingAddress: this.defaultShippingAddressId === address.id,\r\n defaultBillingAddress: this.defaultBillingAddressId === address.id,\r\n customFields: address.customFields,\r\n };\r\n if (!address.id) {\r\n saveOperations.push(\r\n this.dataService.customer\r\n .createCustomerAddress(id, input)\r\n .pipe(map(res => res.createCustomerAddress)),\r\n );\r\n } else {\r\n if (this.addressesToDeleteIds.has(address.id)) {\r\n saveOperations.push(\r\n this.dataService.customer\r\n .deleteCustomerAddress(address.id)\r\n .pipe(map(res => res.deleteCustomerAddress)),\r\n );\r\n } else {\r\n saveOperations.push(\r\n this.dataService.customer\r\n .updateCustomerAddress({\r\n ...input,\r\n id: address.id,\r\n })\r\n .pipe(map(res => res.updateCustomerAddress)),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return forkJoin(saveOperations);\r\n }),\r\n )\r\n .subscribe(\r\n data => {\r\n let notified = false;\r\n for (const result of data) {\r\n switch (result.__typename) {\r\n case 'Customer':\r\n case 'Address':\r\n case 'Success':\r\n if (!notified) {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Customer',\r\n });\r\n notified = true;\r\n this.detailForm.markAsPristine();\r\n this.addressDefaultsUpdated = false;\r\n this.changeDetector.markForCheck();\r\n this.fetchHistory.next();\r\n this.dataService.customer.getCustomer(this.id).single$.subscribe();\r\n }\r\n break;\r\n case 'EmailAddressConflictError':\r\n this.notificationService.error(result.message);\r\n break;\r\n }\r\n }\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Customer',\r\n });\r\n },\r\n );\r\n }\r\n\r\n addToGroup() {\r\n this.modalService\r\n .fromComponent(SelectCustomerGroupDialogComponent, {\r\n size: 'md',\r\n })\r\n .pipe(\r\n switchMap(groupIds => (groupIds ? from(groupIds) : EMPTY)),\r\n concatMap(groupId => this.dataService.customer.addCustomersToGroup(groupId, [this.id])),\r\n )\r\n .subscribe({\r\n next: res => {\r\n this.notificationService.success(_(`customer.add-customers-to-group-success`), {\r\n customerCount: 1,\r\n groupName: res.addCustomersToGroup.name,\r\n });\r\n },\r\n complete: () => {\r\n this.dataService.customer.getCustomer(this.id, { take: 0 }).single$.subscribe();\r\n this.fetchHistory.next();\r\n },\r\n });\r\n }\r\n\r\n removeFromGroup(group: NonNullable<GetCustomerQuery['customer']>['groups'][number]) {\r\n this.modalService\r\n .dialog({\r\n title: _('customer.confirm-remove-customer-from-group'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response\r\n ? this.dataService.customer.removeCustomersFromGroup(group.id, [this.id])\r\n : EMPTY,\r\n ),\r\n switchMap(() => this.dataService.customer.getCustomer(this.id, { take: 0 }).single$),\r\n )\r\n .subscribe(result => {\r\n this.notificationService.success(_(`customer.remove-customers-from-group-success`), {\r\n customerCount: 1,\r\n groupName: group.name,\r\n });\r\n this.fetchHistory.next();\r\n });\r\n }\r\n\r\n addNoteToCustomer({ note }: { note: string }) {\r\n this.dataService.customer.addNoteToCustomer(this.id, note).subscribe(() => {\r\n this.fetchHistory.next();\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Note',\r\n });\r\n });\r\n }\r\n\r\n updateNote(entry: TimelineHistoryEntry) {\r\n this.modalService\r\n .fromComponent(EditNoteDialogComponent, {\r\n closable: true,\r\n locals: {\r\n displayPrivacyControls: false,\r\n note: entry.data.note,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.customer.updateCustomerNote({\r\n noteId: entry.id,\r\n note: result.note,\r\n });\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n this.fetchHistory.next();\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Note',\r\n });\r\n });\r\n }\r\n\r\n deleteNote(entry: TimelineHistoryEntry) {\r\n return this.modalService\r\n .dialog({\r\n title: _('common.confirm-delete-note'),\r\n body: entry.data.note,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(switchMap(res => (res ? this.dataService.customer.deleteCustomerNote(entry.id) : EMPTY)))\r\n .subscribe(() => {\r\n this.fetchHistory.next();\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Note',\r\n });\r\n });\r\n }\r\n\r\n protected setFormValues(entity: CustomerWithOrders): void {\r\n const customerGroup = this.detailForm.get('customer');\r\n if (customerGroup) {\r\n customerGroup.patchValue({\r\n title: entity.title,\r\n firstName: entity.firstName,\r\n lastName: entity.lastName,\r\n phoneNumber: entity.phoneNumber,\r\n emailAddress: entity.emailAddress,\r\n });\r\n }\r\n\r\n if (entity.addresses) {\r\n const addressesArray = new FormArray([]);\r\n for (const address of entity.addresses) {\r\n const { customFields, ...rest } = address as any;\r\n const addressGroup = this.formBuilder.group({\r\n ...rest,\r\n countryCode: address.country.code,\r\n });\r\n addressesArray.push(addressGroup);\r\n if (address.defaultShippingAddress) {\r\n this.defaultShippingAddressId = address.id;\r\n }\r\n if (address.defaultBillingAddress) {\r\n this.defaultBillingAddressId = address.id;\r\n }\r\n\r\n if (this.addressCustomFields.length) {\r\n const customFieldsGroup = this.formBuilder.group({});\r\n for (const fieldDef of this.addressCustomFields) {\r\n const key = fieldDef.name;\r\n const value = (address as any).customFields?.[key];\r\n const control = new FormControl(value);\r\n customFieldsGroup.addControl(key, control);\r\n }\r\n addressGroup.addControl('customFields', customFieldsGroup);\r\n }\r\n }\r\n this.detailForm.setControl('addresses', addressesArray);\r\n }\r\n\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['customer', 'customFields']),\r\n entity,\r\n );\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n /**\r\n * Refetch the customer with the current order list settings.\r\n */\r\n private fetchOrdersList() {\r\n this.dataService.customer\r\n .getCustomer(this.id, {\r\n take: this.ordersPerPage,\r\n skip: (this.currentOrdersPage - 1) * this.ordersPerPage,\r\n sort: { orderPlacedAt: SortOrder.DESC },\r\n })\r\n .single$.pipe(\r\n map(data => data.customer),\r\n filter(notNullOrUndefined),\r\n )\r\n .subscribe(result => this.orderListUpdates$.next(result));\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n <span *ngIf=\"group.id\">{{ 'customer.update-customer-group' | translate }}</span>\r\n <span *ngIf=\"!group.id\">{{ 'customer.create-customer-group' | translate }}</span>\r\n</ng-template>\r\n<form [formGroup]=\"form\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(['CreateCustomerGroup', 'UpdateCustomerGroup'] | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <section formGroupName=\"customFields\" *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"CustomerGroup\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"form.get('customFields')\"\r\n ></vdr-tabbed-custom-fields>\r\n </section>\r\n</form>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"save()\" [disabled]=\"!form.valid\" class=\"btn btn-primary\">\r\n <span *ngIf=\"group.id\">{{ 'customer.update-customer-group' | translate }}</span>\r\n <span *ngIf=\"!group.id\">{{ 'customer.create-customer-group' | translate }}</span>\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport {\r\n CreateCustomerGroupInput,\r\n CustomFieldConfig,\r\n Dialog,\r\n ServerConfigService,\r\n UpdateCustomerGroupInput,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-customer-group-detail-dialog',\r\n templateUrl: './customer-group-detail-dialog.component.html',\r\n styleUrls: ['./customer-group-detail-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerGroupDetailDialogComponent implements Dialog<CreateCustomerGroupInput>, OnInit {\r\n group: { id?: string; name: string; customFields?: { [name: string]: any } };\r\n resolveWith: (result?: CreateCustomerGroupInput) => void;\r\n customFields: CustomFieldConfig[];\r\n form: FormGroup;\r\n\r\n constructor(private serverConfigService: ServerConfigService, private formBuilder: FormBuilder) {\r\n this.customFields = this.serverConfigService.getCustomFieldsFor('CustomerGroup');\r\n }\r\n\r\n ngOnInit() {\r\n this.form = this.formBuilder.group({\r\n name: [this.group.name, Validators.required],\r\n customFields: this.formBuilder.group(\r\n this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\r\n ),\r\n });\r\n if (this.customFields.length) {\r\n const customFieldsGroup = this.form.get('customFields') as FormGroup;\r\n\r\n for (const fieldDef of this.customFields) {\r\n const key = fieldDef.name;\r\n const value = this.group.customFields?.[key];\r\n const control = customFieldsGroup.get(key);\r\n if (control) {\r\n control.patchValue(value);\r\n }\r\n }\r\n }\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n save() {\r\n this.resolveWith(this.form.value);\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <input\r\n type=\"text\"\r\n name=\"emailSearchTerm\"\r\n [formControl]=\"searchTerm\"\r\n [placeholder]=\"'customer.search-by-group-name' | translate\"\r\n class=\"search-input\"\r\n />\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"customer-group-list\"></vdr-action-bar-items>\r\n <button class=\"btn btn-primary\" *vdrIfPermissions=\"'CreateCustomerGroup'\" (click)=\"create()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.create-new-customer-group' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n<div class=\"group-wrapper\">\r\n <div class=\"group-list\">\r\n <vdr-data-table\r\n [class.expanded]=\"activeGroup$ | async\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n >\r\n <ng-template let-group=\"item\">\r\n <td class=\"left align-middle\" [class.active]=\"group.id === activeGroupId\">\r\n <vdr-entity-info [entity]=\"group\"></vdr-entity-info>\r\n </td>\r\n <td class=\"left align-middle\" [class.active]=\"group.id === activeGroupId\">\r\n <vdr-chip [colorFrom]=\"group.id\">{{ group.name }}</vdr-chip>\r\n </td>\r\n <td class=\"left align-middle\" [class.active]=\"group.id === activeGroupId\">\r\n <a\r\n class=\"btn btn-link btn-sm\"\r\n [routerLink]=\"['./', { contents: group.id }]\"\r\n queryParamsHandling=\"preserve\"\r\n >\r\n <clr-icon shape=\"view-list\"></clr-icon>\r\n {{ 'customer.view-group-members' | translate }}\r\n </a>\r\n </td>\r\n <td class=\"right align-middle\" [class.active]=\"group.id === activeGroupId\">\r\n <button class=\"btn btn-link btn-sm\" (click)=\"update(group)\">\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n </td>\r\n <td [class.active]=\"group.id === activeGroupId\" class=\"align-middle\">\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger>\r\n {{ 'common.actions' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"delete(group.id)\"\r\n [disabled]=\"!('DeleteCustomerGroup' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </ng-template>\r\n </vdr-data-table>\r\n </div>\r\n <ng-template #emptyPlaceholder>\r\n <vdr-empty-placeholder></vdr-empty-placeholder>\r\n </ng-template>\r\n <div class=\"group-members\" [class.expanded]=\"activeGroup$ | async\">\r\n <ng-container *ngIf=\"activeGroup$ | async as activeGroup\">\r\n <div class=\"flex\">\r\n <div class=\"header-title-row\">{{ activeGroup.name }} ({{ membersTotal$ | async }})</div>\r\n <div class=\"flex-spacer\"></div>\r\n <button type=\"button\" class=\"close-button\" (click)=\"closeMembers()\">\r\n <clr-icon shape=\"close\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"controls\">\r\n <vdr-dropdown>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-secondary btn-sm\"\r\n vdrDropdownTrigger\r\n [disabled]=\"selectedCustomerIds.length === 0\"\r\n >\r\n {{ 'common.with-selected' | translate: { count: selectedCustomerIds.length } }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"removeFromGroup(activeGroup, selectedCustomerIds)\"\r\n vdrDropdownItem\r\n [disabled]=\"!('UpdateCustomerGroup' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'customer.remove-from-group' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n <button class=\"btn btn-secondary btn-sm\" (click)=\"addToGroup(activeGroup)\">\r\n {{ 'customer.add-customers-to-group' | translate: { groupName: activeGroup.name } }}\r\n </button>\r\n </div>\r\n <vdr-customer-group-member-list\r\n [members]=\"members$ | async\"\r\n [route]=\"route\"\r\n [totalItems]=\"membersTotal$ | async\"\r\n [selectedMemberIds]=\"selectedCustomerIds\"\r\n (selectionChange)=\"selectedCustomerIds = $event\"\r\n (fetchParamsChange)=\"fetchGroupMembers$.next($event)\"\r\n ></vdr-customer-group-member-list>\r\n </ng-container>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseListComponent,\r\n DataService,\r\n DeletionResult,\r\n GetCustomerGroupsQuery,\r\n GetCustomerGroupWithCustomersQuery,\r\n ItemOf,\r\n LogicalOperator,\r\n ModalService,\r\n NotificationService,\r\n SortOrder,\r\n} from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, combineLatest, EMPTY, Observable, of } from 'rxjs';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n mapTo,\r\n switchMap,\r\n takeUntil,\r\n tap,\r\n} from 'rxjs/operators';\r\n\r\nimport { AddCustomerToGroupDialogComponent } from '../add-customer-to-group-dialog/add-customer-to-group-dialog.component';\r\nimport { CustomerGroupDetailDialogComponent } from '../customer-group-detail-dialog/customer-group-detail-dialog.component';\r\nimport { CustomerGroupMemberFetchParams } from '../customer-group-member-list/customer-group-member-list.component';\r\n\r\n@Component({\r\n selector: 'vdr-customer-group-list',\r\n templateUrl: './customer-group-list.component.html',\r\n styleUrls: ['./customer-group-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomerGroupListComponent\r\n extends BaseListComponent<\r\n GetCustomerGroupsQuery,\r\n GetCustomerGroupsQuery['customerGroups']['items'][number]\r\n >\r\n implements OnInit\r\n{\r\n searchTerm = new FormControl('');\r\n activeGroup$: Observable<ItemOf<GetCustomerGroupsQuery, 'customerGroups'> | undefined>;\r\n activeGroupId: string | undefined;\r\n listIsEmpty$: Observable<boolean>;\r\n members$: Observable<\r\n NonNullable<GetCustomerGroupWithCustomersQuery['customerGroup']>['customers']['items']\r\n >;\r\n membersTotal$: Observable<number>;\r\n selectedCustomerIds: string[] = [];\r\n fetchGroupMembers$ = new BehaviorSubject<CustomerGroupMemberFetchParams>({\r\n skip: 0,\r\n take: 0,\r\n filterTerm: '',\r\n });\r\n private refreshActiveGroupMembers$ = new BehaviorSubject<void>(undefined);\r\n\r\n constructor(\r\n private dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n public route: ActivatedRoute,\r\n protected router: Router,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) =>\r\n this.dataService.customer.getCustomerGroupList(...args).refetchOnChannelChange(),\r\n data => data.customerGroups,\r\n (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: { contains: this.searchTerm.value },\r\n },\r\n },\r\n }),\r\n );\r\n }\r\n\r\n ngOnInit(): void {\r\n super.ngOnInit();\r\n this.searchTerm.valueChanges\r\n .pipe(\r\n filter(value => 2 < value.length || value.length === 0),\r\n debounceTime(250),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(() => this.refresh());\r\n const activeGroupId$ = this.route.paramMap.pipe(\r\n map(pm => pm.get('contents')),\r\n distinctUntilChanged(),\r\n tap(() => (this.selectedCustomerIds = [])),\r\n );\r\n this.listIsEmpty$ = this.items$.pipe(map(groups => groups.length === 0));\r\n this.activeGroup$ = combineLatest(this.items$, activeGroupId$).pipe(\r\n map(([groups, activeGroupId]) => {\r\n if (activeGroupId) {\r\n return groups.find(g => g.id === activeGroupId);\r\n }\r\n }),\r\n tap(val => (this.activeGroupId = val?.id)),\r\n );\r\n const membersResult$ = combineLatest(\r\n this.activeGroup$,\r\n this.fetchGroupMembers$,\r\n this.refreshActiveGroupMembers$,\r\n ).pipe(\r\n switchMap(([activeGroup, { skip, take, filterTerm }]) => {\r\n if (activeGroup) {\r\n return this.dataService.customer\r\n .getCustomerGroupWithCustomers(activeGroup.id, {\r\n skip,\r\n take,\r\n filter: {\r\n emailAddress: {\r\n contains: filterTerm,\r\n },\r\n },\r\n })\r\n .mapStream(res => res.customerGroup?.customers);\r\n } else {\r\n return of(undefined);\r\n }\r\n }),\r\n );\r\n\r\n this.members$ = membersResult$.pipe(map(res => res?.items ?? []));\r\n this.membersTotal$ = membersResult$.pipe(map(res => res?.totalItems ?? 0));\r\n }\r\n\r\n create() {\r\n this.modalService\r\n .fromComponent(CustomerGroupDetailDialogComponent, { locals: { group: { name: '' } } })\r\n .pipe(\r\n switchMap(result =>\r\n result\r\n ? this.dataService.customer.createCustomerGroup({ ...result, customerIds: [] })\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.refresh();\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'CustomerGroup',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'CustomerGroup',\r\n });\r\n },\r\n );\r\n }\r\n\r\n delete(groupId: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('customer.confirm-delete-customer-group'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response ? this.dataService.customer.deleteCustomerGroup(groupId) : EMPTY,\r\n ),\r\n\r\n switchMap(result => {\r\n if (result.deleteCustomerGroup.result === DeletionResult.DELETED) {\r\n // refresh list\r\n return this.dataService.customer\r\n .getCustomerGroupList()\r\n .mapSingle(() => ({ errorMessage: false }));\r\n } else {\r\n return of({ errorMessage: result.deleteCustomerGroup.message });\r\n }\r\n }),\r\n )\r\n .subscribe(\r\n result => {\r\n if (typeof result.errorMessage === 'string') {\r\n this.notificationService.error(result.errorMessage);\r\n } else {\r\n this.refresh();\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'CustomerGroup',\r\n });\r\n }\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'CustomerGroup',\r\n });\r\n },\r\n );\r\n }\r\n\r\n update(group: ItemOf<GetCustomerGroupsQuery, 'customerGroups'>) {\r\n this.modalService\r\n .fromComponent(CustomerGroupDetailDialogComponent, { locals: { group } })\r\n .pipe(\r\n switchMap(result =>\r\n result\r\n ? this.dataService.customer.updateCustomerGroup({ id: group.id, ...result })\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.refresh();\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'CustomerGroup',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'CustomerGroup',\r\n });\r\n },\r\n );\r\n }\r\n\r\n closeMembers() {\r\n const params = { ...this.route.snapshot.params };\r\n delete params.contents;\r\n this.router.navigate(['./', params], { relativeTo: this.route, queryParamsHandling: 'preserve' });\r\n }\r\n\r\n addToGroup(group: NonNullable<GetCustomerGroupWithCustomersQuery['customerGroup']>) {\r\n this.modalService\r\n .fromComponent(AddCustomerToGroupDialogComponent, {\r\n locals: {\r\n group,\r\n route: this.route,\r\n },\r\n size: 'md',\r\n verticalAlign: 'top',\r\n })\r\n .pipe(\r\n switchMap(customerIds =>\r\n customerIds\r\n ? this.dataService.customer\r\n .addCustomersToGroup(group.id, customerIds)\r\n .pipe(mapTo(customerIds))\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe({\r\n next: result => {\r\n this.notificationService.success(_(`customer.add-customers-to-group-success`), {\r\n customerCount: result.length,\r\n groupName: group.name,\r\n });\r\n this.refreshActiveGroupMembers$.next();\r\n this.selectedCustomerIds = [];\r\n },\r\n });\r\n }\r\n\r\n removeFromGroup(\r\n group: NonNullable<GetCustomerGroupWithCustomersQuery['customerGroup']>,\r\n customerIds: string[],\r\n ) {\r\n this.dataService.customer.removeCustomersFromGroup(group.id, customerIds).subscribe({\r\n complete: () => {\r\n this.notificationService.success(_(`customer.remove-customers-from-group-success`), {\r\n customerCount: customerIds.length,\r\n groupName: group.name,\r\n });\r\n this.refreshActiveGroupMembers$.next();\r\n this.selectedCustomerIds = [];\r\n },\r\n });\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <input\r\n type=\"text\"\r\n name=\"emailSearchTerm\"\r\n [formControl]=\"searchTerm\"\r\n [placeholder]=\"'customer.search-customers-by-email-last-name-postal-code' | translate\"\r\n class=\"search-input\"\r\n />\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"customer-list\"></vdr-action-bar-items>\r\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"'CreateCustomer'\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'customer.create-new-customer' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-dt-column [expand]=\"true\">{{ 'customer.name' | translate }}</vdr-dt-column>\r\n <vdr-dt-column [expand]=\"true\">{{ 'customer.email-address' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'customer.customer-type' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-customer=\"item\">\r\n <td class=\"left align-middle\">\r\n {{ customer.title }} {{ customer.firstName }} {{ customer.lastName }}\r\n </td>\r\n <td class=\"left align-middle\">{{ customer.emailAddress }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-status-label [customer]=\"customer\"></vdr-customer-status-label>\r\n </td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"edit\"\r\n [label]=\"'common.edit' | translate\"\r\n [linkTo]=\"['./', customer.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n <td>\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"btn btn-link btn-sm\" vdrDropdownTrigger>\r\n {{ 'common.actions' | translate }}\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteCustomer(customer)\"\r\n [disabled]=\"!('DeleteCustomer' | hasPermission)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BaseListComponent,\r\n DataService,\r\n GetCustomerListQuery,\r\n ItemOf,\r\n LogicalOperator,\r\n ModalService,\r\n NotificationService,\r\n} from '@vendure/admin-ui/core';\r\nimport { SortOrder } from '@vendure/common/lib/generated-shop-types';\r\nimport { EMPTY } from 'rxjs';\r\nimport { debounceTime, filter, switchMap, takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-customer-list',\r\n templateUrl: './customer-list.component.html',\r\n styleUrls: ['./customer-list.component.scss'],\r\n})\r\nexport class CustomerListComponent\r\n extends BaseListComponent<GetCustomerListQuery, ItemOf<GetCustomerListQuery, 'customers'>>\r\n implements OnInit\r\n{\r\n searchTerm = new FormControl('');\r\n constructor(\r\n private dataService: DataService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) => this.dataService.customer.getCustomerList(...args).refetchOnChannelChange(),\r\n data => data.customers,\r\n (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n emailAddress: {\r\n contains: this.searchTerm.value,\r\n },\r\n lastName: {\r\n contains: this.searchTerm.value,\r\n },\r\n postalCode: {\r\n contains: this.searchTerm.value,\r\n },\r\n },\r\n filterOperator: LogicalOperator.OR,\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n },\r\n }),\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.searchTerm.valueChanges\r\n .pipe(\r\n filter(value => 2 < value.length || value.length === 0),\r\n debounceTime(250),\r\n takeUntil(this.destroy$),\r\n )\r\n .subscribe(() => this.refresh());\r\n }\r\n\r\n deleteCustomer(customer: ItemOf<GetCustomerListQuery, 'customers'>) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-customer'),\r\n body: `${customer.firstName} ${customer.lastName}`,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(switchMap(res => (res ? this.dataService.customer.deleteCustomer(customer.id) : EMPTY)))\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Customer',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Customer',\r\n });\r\n },\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, CustomerFragment, DataService, SortOrder } from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CustomerResolver extends BaseEntityResolver<CustomerFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Customer',\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n title: '',\r\n firstName: '',\r\n lastName: '',\r\n emailAddress: '',\r\n phoneNumber: null,\r\n addresses: null,\r\n user: null,\r\n },\r\n id =>\r\n dataService.customer\r\n .getCustomer(id, { take: 10, sort: { orderPlacedAt: SortOrder.DESC } })\r\n .mapStream(data => data.customer),\r\n );\r\n }\r\n}\r\n","import { Route } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CanDeactivateDetailGuard,\r\n createResolveData,\r\n CustomerFragment,\r\n detailBreadcrumb,\r\n} from '@vendure/admin-ui/core';\r\n\r\nimport { CustomerDetailComponent } from './components/customer-detail/customer-detail.component';\r\nimport { CustomerGroupListComponent } from './components/customer-group-list/customer-group-list.component';\r\nimport { CustomerListComponent } from './components/customer-list/customer-list.component';\r\nimport { CustomerResolver } from './providers/routing/customer-resolver';\r\n\r\nexport const customerRoutes: Route[] = [\r\n {\r\n path: 'customers',\r\n component: CustomerListComponent,\r\n pathMatch: '',\r\n data: {\r\n breadcrumb: _('breadcrumb.customers'),\r\n },\r\n },\r\n {\r\n path: 'customers/:id',\r\n component: CustomerDetailComponent,\r\n resolve: createResolveData(CustomerResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: customerBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'groups',\r\n component: CustomerGroupListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.customer-groups'),\r\n },\r\n },\r\n];\r\n\r\nexport function customerBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<CustomerFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.customers',\r\n getName: customer => `${customer.firstName} ${customer.lastName}`,\r\n route: 'customers',\r\n });\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { SharedModule } from '@vendure/admin-ui/core';\r\n\r\nimport { AddCustomerToGroupDialogComponent } from './components/add-customer-to-group-dialog/add-customer-to-group-dialog.component';\r\nimport { AddressCardComponent } from './components/address-card/address-card.component';\r\nimport { AddressDetailDialogComponent } from './components/address-detail-dialog/address-detail-dialog.component';\r\nimport { CustomerDetailComponent } from './components/customer-detail/customer-detail.component';\r\nimport { CustomerGroupDetailDialogComponent } from './components/customer-group-detail-dialog/customer-group-detail-dialog.component';\r\nimport { CustomerGroupListComponent } from './components/customer-group-list/customer-group-list.component';\r\nimport { CustomerGroupMemberListComponent } from './components/customer-group-member-list/customer-group-member-list.component';\r\nimport { CustomerHistoryEntryHostComponent } from './components/customer-history/customer-history-entry-host.component';\r\nimport { CustomerHistoryComponent } from './components/customer-history/customer-history.component';\r\nimport { CustomerListComponent } from './components/customer-list/customer-list.component';\r\nimport { CustomerStatusLabelComponent } from './components/customer-status-label/customer-status-label.component';\r\nimport { SelectCustomerGroupDialogComponent } from './components/select-customer-group-dialog/select-customer-group-dialog.component';\r\nimport { customerRoutes } from './customer.routes';\r\n\r\n@NgModule({\r\n imports: [SharedModule, RouterModule.forChild(customerRoutes)],\r\n declarations: [\r\n CustomerListComponent,\r\n CustomerDetailComponent,\r\n CustomerStatusLabelComponent,\r\n AddressCardComponent,\r\n CustomerGroupListComponent,\r\n CustomerGroupDetailDialogComponent,\r\n AddCustomerToGroupDialogComponent,\r\n CustomerGroupMemberListComponent,\r\n SelectCustomerGroupDialogComponent,\r\n CustomerHistoryComponent,\r\n AddressDetailDialogComponent,\r\n CustomerHistoryEntryHostComponent,\r\n ],\r\n exports: [AddressCardComponent],\r\n})\r\nexport class CustomerModule {}\r\n"],"sourceRoot":"webpack:///","file":"654.d4c38af0c765576f.js"}
@@ -289,7 +289,9 @@
289
289
  "username": "Benutzername",
290
290
  "view-next-month": "Nächsten Monat anzeigen",
291
291
  "view-previous-month": "Vorherigen Monat anzeigen",
292
- "with-selected": "Auswahl..."
292
+ "with-selected": "Auswahl...",
293
+ "login-title": "Anmelden bei Vendure",
294
+ "login-image-title": "Hallo! Willkommen zurück. Schön, dich zu sehen."
293
295
  },
294
296
  "customer": {
295
297
  "add-customer-to-group": "Kunde zu Gruppe hinzufügen",
@@ -289,7 +289,9 @@
289
289
  "username": "Username",
290
290
  "view-next-month": "View next month",
291
291
  "view-previous-month": "View previous month",
292
- "with-selected": "With {count} selected..."
292
+ "with-selected": "With {count} selected...",
293
+ "login-title": "Log in to Vendure",
294
+ "login-image-title": "Hi! Welcome back. Good to see you."
293
295
  },
294
296
  "customer": {
295
297
  "add-customer-to-group": "Add customer to group",
@@ -10,5 +10,5 @@
10
10
  <link rel="stylesheet" href="styles.88d3f0120bfc894a.css"></head>
11
11
  <body>
12
12
  <vdr-root></vdr-root>
13
- <script src="runtime.28bd5da02a9b1f7b.js" type="module"></script><script src="polyfills.77a1e873e59e4556.js" type="module"></script><script src="main.65109179713dd228.js" type="module"></script></body>
13
+ <script src="runtime.2d88c9597f145c74.js" type="module"></script><script src="polyfills.77a1e873e59e4556.js" type="module"></script><script src="main.75464c18bab13b01.js" type="module"></script></body>
14
14
  </html>