@vendure/admin-ui-plugin 2.0.0-next.12 → 2.0.0-next.13

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 (26) hide show
  1. package/lib/admin-ui/{239.68785500c3346bfc.js → 239.ca7af610928bd44b.js} +2 -2
  2. package/lib/admin-ui/{239.68785500c3346bfc.js.map → 239.ca7af610928bd44b.js.map} +1 -1
  3. package/lib/admin-ui/{26.f714c21768111b4f.js → 26.762a61e2d3e37e33.js} +2 -2
  4. package/lib/admin-ui/{26.f714c21768111b4f.js.map → 26.762a61e2d3e37e33.js.map} +1 -1
  5. package/lib/admin-ui/{316.f5c3548835a302f3.js → 316.fbaa08dea0a8bad5.js} +2 -2
  6. package/lib/admin-ui/{316.f5c3548835a302f3.js.map → 316.fbaa08dea0a8bad5.js.map} +1 -1
  7. package/lib/admin-ui/{356.d5ab46db919a9f0b.js → 356.0ff226e8c9164ae6.js} +2 -2
  8. package/lib/admin-ui/{356.d5ab46db919a9f0b.js.map → 356.0ff226e8c9164ae6.js.map} +1 -1
  9. package/lib/admin-ui/3rdpartylicenses.txt +23 -0
  10. package/lib/admin-ui/{504.1e0ba4990f5d7f56.js → 504.40693d5cedca9d79.js} +2 -2
  11. package/lib/admin-ui/{504.1e0ba4990f5d7f56.js.map → 504.40693d5cedca9d79.js.map} +1 -1
  12. package/lib/admin-ui/{600.33754aa49984ab73.js → 600.fa2fa923a1a62838.js} +2 -2
  13. package/lib/admin-ui/{600.33754aa49984ab73.js.map → 600.fa2fa923a1a62838.js.map} +1 -1
  14. package/lib/admin-ui/{625.00b1380b31501047.js → 625.ed9ce3bf64237de8.js} +2 -2
  15. package/lib/admin-ui/{625.00b1380b31501047.js.map → 625.ed9ce3bf64237de8.js.map} +1 -1
  16. package/lib/admin-ui/{849.a5b2f52c180a376b.js → 849.21d37348d17a9559.js} +2 -2
  17. package/lib/admin-ui/{849.a5b2f52c180a376b.js.map → 849.21d37348d17a9559.js.map} +1 -1
  18. package/lib/admin-ui/index.html +1 -1
  19. package/lib/admin-ui/main.5b576260330cb630.js +2777 -0
  20. package/lib/admin-ui/main.5b576260330cb630.js.map +1 -0
  21. package/lib/admin-ui/runtime.6ba91bceea486bae.js +2 -0
  22. package/lib/admin-ui/{runtime.c3853db7e86bc9e7.js.map → runtime.6ba91bceea486bae.js.map} +1 -1
  23. package/package.json +4 -4
  24. package/lib/admin-ui/main.ecd7bd3b4c1715b7.js +0 -2777
  25. package/lib/admin-ui/main.ecd7bd3b4c1715b7.js.map +0 -1
  26. package/lib/admin-ui/runtime.c3853db7e86bc9e7.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"mappings":"41CAA4BA,4HAiBxBA,oBAAkCA,iDAASC,WAAUD,8BAAiCA,QACtFA,oBAAsBA,iDAASE,WAC3BF,wDACJA,gCAHqDA,2CACYA,2DAC7DA,4GCDD,QAWHG,YAAoBC,sBALpBC,UAAO,IAAIC,KAAU,CACjBC,OAAQ,IAAID,KAAY,GAAIA,eAC5BE,cAAe,IAAIF,KAAY,GAAIA,iBAKvCG,WACIJ,KAAKK,gBAAkBL,KAAKM,YAAYC,SACnCC,kBAAkB,KAClBC,UAAUV,GAAQA,EAAKW,eAAeC,OAG/Cd,SACI,MAAME,EAAYC,KAAKY,KAAKC,MAC5Bb,KAAKc,YAAY,CACbZ,OAAQH,EAAUG,OAClBC,cAAeJ,EAAUI,gBAIjCP,SACII,KAAKc,qDA5BAC,GAA+BpB,uCAA/BoB,EAA+BC,6eDlB5CrB,gCACAA,kBAAyB,2CAEjBA,wCAQJA,QACAA,iDACIA,mBACJA,UAEJA,wCAfMA,mCACcA,0DAERA,qDAAiC,aAQzBA,yREZQA,oHA+BRA,oBAEIA,6GAAqC,4CAC5BsB,uBAHbtB,oDAEIA,wCAAqC,uBAArCA,CAAqC,4CAOfA,qFAzBlCA,iBAKC,WAEOA,0CACJA,QACAA,iBAA8BA,SAA8BA,QAC5DA,iBAA6BA,SAA6BA,QAC1DA,iBAAkCA,SAAmBA,QACrDA,kBACIA,qCACJA,QACAA,kBACIA,4BASAA,6CACJA,0DAvBAA,iCAA+B,+BAItBA,+DAEqBA,sCACDA,qCACKA,2BAE9BA,6EAIKA,qDAA0C,wDAc3DA,SACIA,6BAAmB,cAKXA,wEAAuB,mDAENuB,iBANrBvB,QAQAA,iBAAOA,8BAA6CA,UAExDA,6BAAmB,cAKXA,wEAAuB,mDAENuB,iBANrBvB,QAQAA,iBAAOA,+BAAgDA,UAE/DA,gCAlBYA,2BAAc,uBAKXA,uDAMHA,2BAAe,uBAKZA,mFAuBfA,SACIA,8BACJA,eADIA,yFAEJA,SACIA,8BACJA,eADIA,kGAXRA,qBAAkCA,iDAASC,WAAUD,8BAAiCA,QACtFA,qBAEIA,iDAASwB,WAITxB,iCAGAA,iCAGJA,gCAbqDA,2CAIjDA,4EAGeA,uCAGAA,uCC5EhB,QAeHG,YAAoBC,4BAbpBC,gBAAY,EAGZA,oBAA+C,GAC/CA,aAAsD,QAAlCoB,cAAeC,2BAAmB,QAAI,IACtDC,KAAE,2CACFA,KAAE,sCAQFtB,KAAKuB,QAAUvB,KAAKuB,QAAQC,IAAIC,GAAKzB,KAAK0B,YAAYC,UAAUF,IALhEG,qBACA,OAAOC,OAAOC,OAAO9B,KAAK+B,gBAAgBC,OAAO,CAACjC,EAAKqB,IAAMrB,EAAMqB,EAAG,GAO1EhB,WACIJ,KAAK+B,eAAiB/B,KAAKiC,MAAMC,MAAMF,OAAO,CAACjC,EAAQqB,IACnDS,+BAAY9B,GAAM,EAAGqB,EAAKe,IAAKf,EAAKgB,WACrC,IAGPlB,eACI,GAAIlB,KAAKqC,UACL,UAAWtC,KAAQC,KAAKiC,MAAMC,MAC1BlC,KAAK+B,eAAehC,EAAKoC,IAAMpC,EAAKqC,cAGxC,UAAWrC,KAAQC,KAAKiC,MAAMC,MAC1BlC,KAAK+B,eAAehC,EAAKoC,IAAM,EAK3ClB,2BACI,UAAYG,EAAQK,KAAaI,OAAOS,QAAQtC,KAAK+B,gBAAiB,CAClE,MAAMQ,EAAmE,QAAjDxC,OAAKkC,MAAMC,MAAMM,KAAKC,GAAQA,EAAKN,KAAOf,UAAO,eAAEgB,SAC3E,GAAIG,GAAmBd,EAAWc,EAC9B,OAKRvC,KAAKqC,WAAY,EAGrBlB,SACInB,KAAKc,YAAY,CACb4B,QAAS1C,KAAKiC,MAAME,GACpBD,MAAOlC,KAAK2C,gBACZC,OAAQ5C,KAAK4C,OACbC,eAAgB7C,KAAKqC,YAI7BzC,SACII,KAAKc,cAGD6B,gBACJ,IAAI3C,KAAKiC,MAAMa,OAGf,OAAOjB,OAAOS,QAAQtC,KAAK+B,gBACtBP,IAAI,EAAEzB,EAAaqB,MAAe,CAC/B2B,cACAX,cAEHY,OAAOjD,GAAK,EAAIA,EAAEqC,iDAvElBa,GAA0BtD,uCAA1BsD,EAA0BjC,g9BDjBvCrB,gCAEAA,iBAAiC,UAAjCA,CAAiC,YAAjCA,CAAiC,UAAjCA,CAAiC,QAKbA,cACAA,cAAIA,8BAAsCA,QAC1CA,eAAIA,gCAAqCA,QACzCA,eAAIA,gCAAkCA,QACtCA,eAAIA,gCAAoCA,QACxCA,eAAIA,gCAAgCA,YAG5CA,0BA4BJA,UAEJA,kBACIA,oCAwBAA,oBAAiCA,gCAA6CA,QAC9EA,wBAMIA,sDACHA,YAITA,wCA1EwBA,iDACAA,iDACAA,8CACAA,gDACAA,4CAISA,wCA8BVA,2CAwBkBA,yDAE7BA,kCAAiB,YAAjBA,CAAiB,u0CExEDA,sGAqBRA,0EAAgCA,+FAOhCA,oBAGIA,iIAHJA,oDAEIA,+CAA4C,qDAA5CA,CAA4C,oEAfxDA,gBAIC,WAEOA,yBACJA,QACAA,iBAA8BA,SAA8BA,QAC5DA,iBAA6BA,SAA6BA,QAC1DA,iBAAkCA,SAA+BA,QACjEA,iBAAkCA,UAAqCA,QACvEA,kBACIA,4BAQJA,8CAlBAA,6CAGUA,uCAEoBA,sCACDA,qCACKA,yCACAA,6CAGzBA,+FA0BrBA,qBAAkCA,iDAASC,WAAUD,8BAAiCA,QACtFA,qBAAsBA,iDAASwB,WAC3BxB,8BACJA,gCAHqDA,2CACZA,0CACrCA,+DCpCD,QAUHG,YAAoBC,EAAkCqB,GAAlCpB,mBAAkCA,sBANtDA,+BAA4B,IAAIC,KAChCD,2BAAqF,GAOrFI,WACIJ,KAAKM,YAAYC,SAAS2C,oBAAoBC,QAAQC,UAAU,EAAGC,qBAC/DrD,KAAKsD,sBAAwBtD,KAAKiC,MAAMC,MAAMF,OAAO,CAACZ,EAAQK,KAC1D,MAAMc,EAAevC,KAAKuD,oBAAoB9B,EAAM1B,EAAeyD,gBACnE,sCACOpC,GAAM,EACRK,EAAKU,IAAK,CAAEsB,eAAcC,IAAKnB,MAErC,IACHvC,KAAK2D,eAAeC,iBAGxB5D,KAAKM,YAAYuD,eACZC,8BACArD,UAAUV,GAAQA,EAAKgE,qBACvBX,UAAUrD,IACPC,KAAKgE,sBACDjE,EAASyC,KACLpB,IAAI,QAAC,SAAE6C,QAAoD,QAA3C1B,EAA2B,QAA3Bd,OAAKQ,MAAMiC,cAAc,UAAE,eAAEL,sBAAc,eAAEM,2BAC5DpE,EAAS,GAClBC,KAAKoE,oBAAqB,SAAiCpE,KAAKgE,uBAChEhE,KAAKqE,0BAA0BC,WAAWtE,KAAKoE,oBAC/CpE,KAAK2D,eAAeC,iBAIhCL,oBAAoBxD,EAA4CqB,GAC5D,MAAQoC,iBAAgBe,eAAgBxE,EAAKyE,eACvC/B,EACFhB,IAAmBgD,cAAqBrD,EAAuBK,IAAmBgD,WAEhFC,EAAmB1E,KAAK2E,oBAAoB5E,GAClD,OAAO0C,EAAyBmC,KAAKC,IAAIH,EAAkBnC,GAAemC,EAG9EC,oBAAoB5E,WAChB,MAAMwC,EAK8C,QAJhDd,EAAiB,QAAjBL,IAAK0D,oBAAY,eACXtD,IAAIiB,GAAKA,EAAEsC,SACZC,OACAhC,OAAOP,GAAOA,EAAIwC,UAAU9C,KAAOpC,EAAKoC,IACxCH,OAAO,CAACS,EAAKiC,IAAQjC,EAAMiC,EAAItC,SAAU,UAAE,QAAI,EACxD,OAAOrC,EAAKqC,SAAWG,EAG3B2C,YACI,MAAMnF,EAAa8B,OAAOC,OAAO9B,KAAKsD,uBAAuBtB,OACzD,CAACP,GAASgC,kBAAmBhC,EAAQc,EACrC,GAOJ,SAJIkC,OACIzE,KAAKgE,sBACLhE,KAAKqE,0BAA0BxD,QAC9Bb,KAAKqE,0BAA0Bc,OAClB,EAAIpF,EAG9BoB,SACI,MAAMpB,EAAQ8B,OAAOS,QAAQtC,KAAKsD,uBAAuB9B,IAAI,EAAEJ,GAAeqC,oBAAqB,CAC/FV,cACAX,SAAUX,KAEdzB,KAAKc,YAAY,CACboB,QACAkD,SAAS,SACLpF,KAAKoE,mBACLpE,KAAKqE,0BAA0BxD,SAK3CjB,SACII,KAAKc,qDArFAuE,GAA2B1F,oDAA3B0F,EAA2BrE,mxBDrBxCrB,gCAEAA,iBAAiC,UAAjCA,CAAiC,YAAjCA,CAAiC,UAAjCA,CAAiC,QAKbA,cACAA,cAAIA,8BAAsCA,QAC1CA,eAAIA,gCAAqCA,QACzCA,eAAIA,gCAAqCA,QACzCA,eAAIA,gCAAyCA,QAC7CA,eAAIA,gCAAiCA,YAG7CA,yBAuBJA,UAEJA,kBACIA,oCACAA,eAAIA,gCAAyCA,QAC7CA,UACAA,mBAAQA,qCAAyDA,QACjEA,qCAMJA,UAGJA,wCA9CwBA,iDACAA,iDACAA,iDACAA,qDACAA,6CAISA,wCAyBFA,kDACnBA,qDACJA,wJACQA,mEAEJA,8DAA6C,iCAA7CA,CAA6C,0CAA7CA,CAA6C,wlCE7CrDA,sBCOG,QAGC2F,oBACA,OAAQtF,KAAKuF,WACJ,cACA,UACD,MAAO,cACN,YACD,MAAO,cACN,YACD,MAAO,gDAXVC,8BAA8BxE,4MDR3CrB,2CACIA,6BACAA,wDACJA,eAHUA,gDAA2C,6BACjBA,6CAChCA,uNEAIA,gBAAmD,WACzBA,SAAmBA,QACzCA,sBACAA,SACJA,kCAJ+BA,sBACLA,2BAEtBA,gCCGL,+CAAM8F,8BAAuBzE,2NDRpCrB,iBAAwB,QAEhBA,uBAKJA,iBALyBA,khBEI7BA,mDACIA,SACJA,8BAFoDA,gDAChDA,uGAMAA,+EAEIA,qBAAiB,aAAjBA,CAAiB,gBAAjBA,CAAiB,2EAHzBA,SACIA,6CAOJA,4CANSA,2DCHF,QAOHG,YAAoBC,8BAHpBC,uBAAyC,GACzCA,0BAAuB,IAAIC,KAAU,IAIrCG,WACIJ,KAAK0F,kBAAoB1F,KAAK2F,oBAAoBC,mBAAmB,eAGzEC,YAAY9F,GACRC,KAAK8F,6BAGLC,kBACA,OAAO/F,KAAKiC,MAAM6C,cAAgB9E,KAAKiC,MAAM6C,aAAatC,KAAKzC,GAAKA,EAAEoC,KAAOnC,KAAKgG,eAGlFrF,oBACA,OAQM,QAPFS,EAAgB,QAAhBrB,OAAKgG,mBAAW,eAAEhB,QAAQvD,IAAIC,YAC1B,MAAO,CACHwE,KACoF,QAAhFxD,EAA2D,QAA3DF,OAAKN,MAAMC,MAAMM,KAAKkC,GAAQA,EAAKvC,KAAOV,EAAIwD,UAAU9C,WAAG,eAAEqC,eAAeyB,YAAI,QAChF,GACJ7D,SAAUX,EAAIW,mBAEpB,QAAI,GAId0D,6BACI,MAAM/F,EAAgBC,KAAK+F,YAAoBG,aAC/C,UAAW9E,KAAYpB,KAAK2F,oBAAoBC,mBAAmB,eAC/D5F,KAAKmG,qBAAqBC,WAAWhF,EAAS6E,KAAM,IAAIhG,KAAYF,EAAaqB,EAAS6E,QAIlGI,oBAAoBtG,GAChB,OAAOuG,MAAMC,QAAQxG,OAAgByG,YAASzG,0CA1CzC0G,GAA0B9G,uCAA1B8G,EAA0BzF,8WDXvCrB,mDACIA,+BACJA,QACAA,mDACIA,SACJA,QACAA,qCAGAA,mDACIA,mCACJA,QACAA,yCAZkBA,8CACdA,+FAEcA,+DACdA,uEAEeA,2EAGDA,qDACQA,gCAEYA,yMEJ9BA,yDAEIA,iEAAiC,iGAKrCA,SACIA,qBAAuCA,sDAASA,EAAT+G,OAASC,0BAC5ChH,6EACJA,QACJA,+BAFQA,gIAeQA,SACIA,uBACAA,6EACJA,wCADIA,2HAGAA,uBACAA,6IAbZA,SACIA,qBAIIA,2DAASA,EAAT+G,OAASC,0BAEThH,mCAIAA,4CAIJA,QACJA,+CATuBA,uCAAiC,yCAlBpEA,iBACIA,kCAKAA,wBAAc,eAENA,uBACJA,QACAA,gCACIA,kCAiBJA,kCA3BWA,8CAU6BA,+CChB7C,QANPG,cAScE,qBAAkB,IAAIL,MAEhCiH,2BACI,IAAK5G,KAAK+F,YACN,OAEJ,MAAQc,cAAe7G,KAAK+F,YACtBtE,EAAuBc,GACzBnB,EAAW0F,SAASvE,GAAeA,EAAcnB,EAAW,GAChE,OAAwB,QAAhBrB,OAAKgG,mBAAW,eAAER,WACjB,UACD,OAAO9D,EAAoB,eAC1B,UACD,OAAOA,EAAoB,qBAE3B,OAAOL,EAAWoB,KAAKD,GAAW,cAANA,IAIxCwE,kBACI,IAAK/G,KAAK+F,YACN,MAAO,GAEX,MAAMhG,EAAYC,KAAK4G,qBACvB,OAAO5G,KAAK+F,YAAYc,WAAW7D,OAAO5B,GAAKA,IAAMrB,0BClCrDJ,4CACAA,6CAKAA,8CAOAA,oBACIA,8BACJA,eADIA,uGDPCqH,8BAAwBhG,suBDTrCrB,iBAAkB,UAAlBA,CAAkB,SAELA,8BAAqCA,QAC1CA,iBACIA,yCACJA,UAEJA,iBACIA,2CAKJA,QACAA,wBA+BJA,eA3CaA,+CAE4BA,qEAK5BA,uCAKiBA,6bEItBA,oBACIA,8BAGJA,+BAHIA,yIAIJA,oBACIA,8BACJA,eADIA,4FAcAA,oDAIIA,SACJA,wCAHIA,gDAEAA,oHAhBRA,kBAAkE,YAE1DA,mDAGJA,QACAA,oDACIA,+BACJA,QACAA,qDACIA,UACJA,QACAA,uCAMJA,kCAhBQA,uIAIcA,wDACdA,qEAEcA,gEACdA,6CAGCA,6EAvCjBA,0BAAyG,cAEjGA,6BACAA,6BAKAA,6BAKJA,QACAA,+BACIA,0BAGAA,0BAKAA,0BAGAA,0BAmBJA,gCA3CeA,oDAENA,uDAKAA,oDAM2BA,oDAGAA,uDAKAA,oDAGiBA,0CCblD,QANPG,cASIE,oBAAiB,EAEjBA,kBAGK,GAEL6F,YAAY9F,GACJC,KAAKiH,OACLjH,KAAKkH,eAAiBlH,KAAKmH,kBAAkBnH,KAAKiH,MAClDjH,KAAKoH,kBAAoBpH,KAAKqH,qBAAqBrH,KAAKkH,eAAgBlH,KAAKiH,KAAKtG,MAAM2G,QACxFtH,KAAK8E,aAAe9E,KAAKuH,gBAAgBvH,KAAKiH,OAO9CE,kBAAkBpH,WACtB,OAKK,QAJD0B,EAAiB,QAAjBL,IAAK0D,oBAAY,eAAE9C,OACf,CAACO,EAAKE,KAAe,QACjB,UAA0E,QAAnE+E,EAAyD,QAAzD9C,IAAYK,QAAQvC,KAAKiF,GAAKA,EAAExC,UAAU9C,KAAOpC,EAAKoC,WAAG,eAAEC,gBAAQ,QAAI,IAClF,UACH,QAAI,EAILiF,qBAAqBtH,EAAwBqB,GACjD,OAAIrB,IAAmBqB,EACZ,OAEP,EAAIrB,GAAkBA,EAAiBqB,EAChC,UAEJ,OAGHmG,gBACJxH,WAEA,OAOM,QANF0B,EAAiB,QAAjBL,IAAK0D,oBAAY,eAAEtD,IAAIe,UACnB,MAAMmC,EAAcnC,EAAYwC,QAAQvC,KAAKgF,GAAKA,EAAEvC,UAAU9C,KAAOpC,EAAKoC,IAC1E,MAAO,CACHuF,MAA4B,QAArBjF,EAAW,MAAXiC,OAAW,EAAXA,EAAatC,gBAAQ,QAAI,EAChC2D,wBAEN,QAAI,0CAnDL4B,8BAAwB3G,k1BDbrCrB,uCAA4CA,unBEA5CA,uCACIA,sBACJA,8BAFiCA,mFCS1B,QAIHiI,2BACI,MAAMnG,EAID,QAHDL,EAAa,QAAbrB,OAAK8H,gBAAQ,eAAE7F,OACX,CAACO,EAAKE,IAAY,IAAIF,KAAQE,EAAQqF,SACtC,WACH,QAAI,GACT,OAAO9H,KAAKiH,KAAKtG,MAAMqC,OAAOT,IAC1B,GAAmB,OAAfA,EAAEwF,WAAsBxF,EAAEyF,UAC1B,OAAO,EAEX,GAAIzF,EAAEwF,SAAU,CACZ,MAAMtF,EAAShB,EAAQe,KAAKkC,GAAKA,EAAEvC,KAAOI,EAAEwF,UAC5C,MAAsB,YAAZ,MAANtF,OAAM,EAANA,EAAQ8C,OAMhB,OAAO,IACR+B,kCC/BX3H,mDAA+EA,SAE7EA,8BAF0CA,uCAAmCA,+DAG/EA,mDACIA,mCACmFA,kDAFnBA,6CAChEA,2LAGJA,mDACIA,kCACJA,8BAFiDA,8CACvBA,qEAE1BA,mDACIA,kCACJA,8BAFmDA,gDACzBA,mFDHbsI,8BAAoBjH,0MDTjCrB,8BAAOA,6JGSA,SANPG,cASYE,gBAAa,IAAIkI,IACjBlI,kBAAe,IAAIkI,IAE3BrC,cACI,MAAQsC,QAAOC,WAAYpI,KAAKqI,mBAChCrI,KAAKsI,WAAavI,EAClBC,KAAKuI,aAAenH,EAGxBoH,aAAazI,GACT,OAAOC,KAAKiC,MAAMwG,WAAWjG,KAAKpB,GAAKA,EAAEe,KAAOpC,GAGpD2I,gBACI,MAAO,IAAI1I,KAAKsI,WAAWhG,WAAWd,IAAI,EAAEzB,EAAMqB,MACvC,CAAE6E,KAAMlG,EAAKyE,eAAeyB,KAAM7D,SAAUhB,KAI3DuH,kBACI,MAAO,IAAI3I,KAAKuI,aAAajG,WAAWd,IAAI,EAAEzB,EAAMqB,MACzC,CAAE6E,KAAMlG,EAAKyE,eAAeyB,KAAM7D,SAAUhB,KAInDiH,2BACJ,MAAM5G,EAAQ,IAAIyG,IACZ3F,EAAU,IAAI2F,IACpB,UAAWzF,KAASzC,KAAK4I,aAAaC,YAAc,GAAI,CACpD,MAAMnE,EAAS1E,KAAK8I,oBAAoBrG,EAAMN,IAC9C,GAAIuC,EAAQ,CACR,MAAQuC,OAAM8B,QAASrE,EACvB,GAAI+C,EAAKO,UAAW,CAChB,MAAMgB,EAAyB,QAAjBjJ,IAAQkJ,IAAIzB,UAAK,QAAI,EACnCjF,EAAQ2G,IAAI1B,EAAMwB,EAAQ,OACvB,CACH,MAAMA,EAAuB,QAAf5H,IAAM6H,IAAIzB,UAAK,QAAI,EACjC/F,EAAMyH,IAAI1B,EAAMwB,EAAQ,KAIpC,MAAO,CAAEb,QAAOC,WAGZU,oBAAoB/I,GACxB,UAAWqB,KAAQpB,KAAKiC,MAAMC,MAAO,CACjC,MAAMT,EAAOL,EAAKT,MAAM6B,KAAKD,GAAKA,EAAEJ,KAAOpC,GAC3C,GAAI0B,EACA,MAAO,CAAEwF,OAAM8B,iDAnDlBI,iCAA2BnI,8ODTxCrB,mDAAoDA,SAAqBA,QACzEA,qCAGAA,qCAIAA,qCAGAA,4CAXkBA,sCAAkCA,kCACjCA,2CAGqBA,oDAIrBA,gDAGAA,yLEKXA,oBAAyCA,4DAAoB,IACzDA,uBACAA,8BACJA,cADIA,2FAEJA,qBAEIA,kDAASyJ,kBAITzJ,uBACAA,8BACJA,iCAJIA,wEAGAA,6FAEJA,oBAEIA,kDAAS0J,kBAGT1J,uBACAA,8BACJA,cADIA,8EAnCZA,iBAAoD,WAE5CA,8BACJA,QACAA,iBAAwB,WAEhBA,sCAOJA,UAEJA,iBACIA,2BAIAA,2BASAA,4BAQJA,gCAnCIA,2DAGyCA,sCAGjCA,oDAAmC,0CAAnCA,CAAmC,uBAAnCA,CAAmC,cAQyBA,mCAO/DA,kCASAA,mCCrBN,SAMHG,YAAoBC,EAAkCqB,GAAlCpB,mBAAkCA,oBAL7CA,wBAA0C,GAC1CA,uBAA6C,GAC5CA,iBAAc,IAAIL,MAE5BK,eAAW,EAGXI,WACIJ,KAAKsJ,gBAAkBtJ,KAAKuJ,YAAYC,MAAM,IAC9C,UAAWzJ,KAASC,KAAKyJ,mBACrBzJ,KAAKsJ,gBAAgBlD,WACjBrG,EAAMkG,KACNjG,KAAKuJ,YAAYG,QAAQ1J,KAAK2J,kBAAkB5J,EAAMkG,QAKlEmD,gBACIpJ,KAAK4J,YAAYC,KAAK7J,KAAKsJ,gBAAgBzI,OAC3Cb,KAAKsJ,gBAAgBQ,iBACrB9J,KAAK+J,UAAW,EAGpBV,gBACQrJ,KAAKsJ,gBAAgBU,MACrBhK,KAAKiK,aACAC,OAAO,CACJC,SAAO7I,KAAE,0BACT8I,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOhJ,KAAE,wBAC9B,CAAE+I,KAAM,SAAUC,OAAO,OAAE,0BAA2BC,aAAa,MAG1EnH,UAAUrD,IACHA,IACAC,KAAKsJ,gBAAgBkB,QACrBxK,KAAKsJ,gBAAgBQ,iBACrB9J,KAAK+J,UAAW,KAI5B/J,KAAK+J,UAAW,0CA1CfU,IAA8B9K,oDAA9B8K,GAA8BzJ,ksBDX3CrB,+BAAmBA,sdEAZ,MAAM+K,GAAc,6BCOvB/K,iBACIA,iBACM,gBAENA,iBACIA,wDACJA,gCADIA,gECOL,QAWHG,YAAoBC,qBAPpBC,aAAU,IAAI2K,MAAyB,GACvC3K,mBAAgB,IAAI2K,MAAyB,GAC7C3K,oBAAgB,EAGhBA,oBAAiB,YAIjB6F,YAAY9F,GACRC,KAAK4K,gBAAkB5K,KAAK6K,KAAKC,GAAGtI,KAAMpB,GAAiB,cAAXA,EAAE6E,MAC9ClG,EAAQ+C,QACR9C,KAAK+K,QAAQC,KAAKhL,KAAK8C,QAI/BmI,OAAOlL,EAA2B,eACjBC,KAAKkL,WAAWC,cAAcC,wBAA3C,MACM3I,EACkF,QAApFhB,EAAoD,QAApDL,OAAK8J,WAAWC,cAAcE,cAAc,gBAAQ,eAAED,wBAAwBE,cAAM,QAAI,EAC5F,MAAO,CACHtC,EAAG,GACHuC,EAAGvL,KAAKwL,MAAQd,IAA0B,WAAX3K,EAAsB0C,EAAa,IAI1EgJ,WACI,MAAM1L,EAAMC,KAAKiL,SACjB,MAAO,CACH,SAAUlL,EAAIwL,EACd,UAAWxL,EAAIiJ,0CAlCd0C,GAAyB/L,uCAAzB+L,EAAyB1K,2UDnBtCrB,kCACIA,kCAIIA,wDACJA,QACAA,wBAQJA,eAfiDA,qCAAvBA,8BAGlBA,2DAEAA,4DAE4BA,q6CEK7B,SAMHS,WACIJ,KAAK+K,QAAU/K,KAAK2L,KAAKZ,QACpBa,eACAC,QAAKC,MAAK/L,GAAWC,KAAK8K,GAAGiB,cAAcf,KAAKjL,KAGzD0L,WACI,MAAM1L,EAAYC,KAAK2L,KAAKH,MAAQxL,KAAK8K,GAAGU,MAAQ,OAAS,KACvDpK,EAAWpB,KAAK2L,KAAKV,OAAqB,SAAdlL,EAAuB,SAAW,OAC9D0B,EAASzB,KAAK8K,GAAGG,OAAqB,SAAdlL,EAAuB,MAAQ,UACvDwC,EAAKqC,KAAKoH,IAAI5K,EAAS4H,EAAIvH,EAAOuH,GAClCvG,EAAKmC,KAAKoH,IAAI5K,EAASmK,EAAI9J,EAAO8J,GAClC7G,EAASE,KAAKqH,KAAKrH,WAAM,GAAIA,WAAM,IACzC,sBACI,SAAUxD,EAASmK,EACnB,UAAWnK,EAAS4H,GAAmB,SAAdjJ,EAAuB,GAAK,IAAmB,GAAbC,KAAKwL,MAChE,YAAa9G,EACb,WAAY,GACM,OAAd3E,EACE,CACImM,UAAW,kBACX,mBAAoB,OAExB,8CCzClBvM,SACIA,oCAIIA,gEAAcA,EAAd+G,MAAcyF,qBAAdxM,CAAsC,gDACxByM,gCACjBzM,QACLA,wDANQA,yBAAc,UAAdA,CAAc,wEAOtBA,SACIA,oCACJA,kCAD4BA,8BAAkB,UAAlBA,CAAkB,yDDEjC0M,iCAAyBrL,4MEZtCrB,kCAMIA,sBACJA,eAHIA,qCADAA,8BAFAA,oCAAiC,8nBC0B9B,SAUHG,YAAoBC,yBAPpBC,qBAAkB,IAAI2K,UAAoC,GAE1D3K,WAAqB,GACrBA,WAAkG,GAO9FsM,kBACA,OAAOtM,KAAKuM,MAAMjF,OAASoD,GAG/BtK,WACIJ,KAAKwM,gBAAgBxB,KAAKhL,KAAKyM,cAC/BzM,KAAK0M,aAAe1M,KAAKwM,gBAAgBX,QAAKc,MAAa,MAG/D9G,YAAY9F,GACRC,KAAK4M,gBAGTC,kBACIC,WAAW,IAAM9M,KAAK+M,iBAG1BZ,YAAYpM,GACRC,KAAKwM,gBAAgBxB,KAAKjL,GAG9BqM,aACIpM,KAAKwM,gBAAgBxB,KAAKhL,KAAKyM,cAGnCO,WAAWjN,GACP,GAAIC,KAAKiN,eACL,OAAOjN,KAAKiN,eAAezK,KAAMpB,GAAMA,EAAEyJ,KAAK5E,OAASlG,GAIvD6M,wBACJ,MAAMnL,EAAe,IAAIyG,IACzB,UAAW3F,KAASvC,KAAKkN,OACrBzL,EAAayH,IAAI3G,EAAM0D,KAAM,CACzBA,KAAM1D,EAAM0D,KACZ6E,GAAI,KAIZ,UAAYvI,EAAME,KAAchB,EAAaa,UAAW,CACpD,MAAMoC,EAAsD,QAA5CtD,EAAwC,QAAxCrB,OAAKmN,OAAO1K,KAAMgF,GAAMA,EAAEvB,OAAS1D,UAAK,eAAEuI,UAAE,QAAI,GAChE,UAAWtD,KAAU9C,EAAS,CAC1B,MAAM+C,EAAahG,EAAawH,IAAIzB,GAChCC,GACAhF,EAAUqI,GAAGqC,KAAK1F,IAI9BzH,KAAKuM,MAAQ,IAAI9K,EAAaK,UAAUkB,OAAQT,GAAiB,cAAXA,EAAE0D,MAGpD8G,gBACJ,UAAWhN,KAAQC,KAAKuM,MAAO,CAC3B,MAAMnL,EAAUpB,KAAKgN,WAAWjN,EAAKkG,MACrC,IAAIxE,EAAQ,EACZ,UAAWc,KAAMxC,EAAK+K,GAAI,CACtB,MAAMrI,EAAQzC,KAAKgN,WAAWzK,EAAG0D,MAC7B7E,GAAWqB,GAASrB,IAAYqB,IAChCzC,KAAKoN,MAAMD,KAAK,CACZrC,GAAIrI,EACJkJ,KAAMvK,EACNoK,UAEJ/J,MAIZzB,KAAKoN,MAAQ,IAAIpN,KAAKoN,OACtBpN,KAAK2D,eAAeC,uCC7GAjE,yHD2Bf0N,IAA0B1N,wCAA1B0N,GAA0BrM,6EAQrB0K,EAAyB,qWFnC3C/L,iCASAA,wCATgCA,yBASDA,gPIOxB,SAGHG,YAAoBC,8BADpBC,YAA8B,GAG9BI,WACIJ,KAAKkN,OAASlN,KAAK2F,oBAAoB2H,gEANlCC,IAAgC5N,wCAAhC4N,GAAgCvM,sJDhB7CrB,gCAEAA,4CAAyBA,kCAAiB,uIEFdA,gHAwCQA,kBACIA,SACAA,kBACIA,+CAKJA,mEAPAA,sCAEIA,8HARhBA,wBAAuC,WAAvCA,CAAuC,eAEHA,uBAAkCA,UAElEA,6BACIA,yBAUJA,qCAVqDA,uDAN7DA,SACIA,kCAiBJA,6BAjBmBA,0EAqBvBA,oBAEIA,sHAA8C,uEAIrC8C,+CANb9C,oDAEIA,iDAA8C,4DAS9CA,oBAKIA,oHALJA,oDAIIA,sDAAmD,mFAOvDA,oBAKIA,oHALJA,oDAIIA,sDAAmD,oEAhEnEA,iBAAwD,WAEhDA,0CACJA,QACAA,iBAA8BA,SAA8BA,QAC5DA,iBAA6BA,SAA6BA,QAC1DA,iBACIA,SACAA,gCACJA,QACAA,kBACIA,qCACJA,QACAA,kBAAkC,aAE1BA,qCACAA,mCAmBJA,UAEJA,kBACIA,4BAQJA,QACAA,kBAAyB,aAEjBA,4BAOJA,UAEJA,kBAAyB,aAEjBA,4BAOJA,gDAjEKA,+DAEqBA,sCACDA,qCAEzBA,mCACkBA,yBAAa,6BAG/BA,6EAIIA,qFACeA,mCAuBdA,yDAYIA,yDAWAA,oFA6BTA,qBAKIA,mCAEJA,4CALIA,mBAAmB,gCAGnBA,gKAgCRA,kBACIA,4EAQJA,8BARIA,4LASJA,kBACIA,8BACJA,eADIA,kIAUZA,SACIA,wDAIJA,+BAJIA,gJAMAA,qIATRA,qBAAkCA,iDAASC,WAAUD,8BAAiCA,QACtFA,qBAAsBA,iDAASwB,WAC3BxB,kCAMAA,4CAGJA,2CAXqDA,2CACZA,0CACtBA,uCAAqB,eCjJrC,SAgBHG,YAAoBC,4BARpBC,oBAAsD,GACtDA,qBAAiB,EACjBA,gBAAa,EACbA,aAA4C,QAAlCoB,cAAeC,2BAAmB,QAAI,IAC5CC,KAAE,2CACFA,KAAE,sCAIFtB,KAAKuB,QAAUvB,KAAKuB,QAAQC,IAAIC,GAAKzB,KAAK0B,YAAYC,UAAUF,IAGhE+L,kBAMA,OAAOxN,KALgBiC,MAAMC,MAAMF,OAAO,CAACZ,EAAOK,KAC9C,MAAMc,EAAUvC,KAAK+B,eAAeN,EAAKU,IACnCM,EAAeF,EAAQkL,QAAUlL,EAAQH,UAAa,EAC5D,OAAOhB,EAAQK,EAAKiM,yBAA2BjL,GAChD,IACiBzC,KAAK2N,eAAiB3N,KAAKiC,MAAM2L,gBAAkB,GAAK5N,KAAK6N,WAGjFC,2BACA,OAAO9N,KAAK+N,gBACPvM,IAAIzB,GACoBA,EAAQiO,QACA,aACzBjO,EAAQ+H,QAAQ9E,OAAOT,GAAiB,WAAZA,EAAEgD,OAG9B,UAIPvD,OAAO,CAACjC,EAAKqB,IAAWrB,EAAMqB,EAAQ,GAG/C6M,6BAA6BlO,WACzB,MAAMwC,EAID,QAHDd,EAAmB,QAAnBL,OAAKa,MAAM4F,gBAAQ,eAAE7F,OACjB,CAAC0C,EAAK8C,IAAY,IAAI9C,KAAQ8C,EAAQM,SACtC,WACH,QAAI,GAYT,OAAO,EAVY/H,EAAKY,MAAMqC,OAAO0B,IACjC,GAAIA,EAAEsD,UACF,OAAO,EAEX,GAAkB,MAAdtD,EAAEqD,SACF,OAAO,EAEX,MAAMP,EAASjF,EAAQC,KAAKiF,GAAKA,EAAEtF,KAAOuC,EAAEqD,UAC5C,MAAyB,YAAZ,MAANP,OAAM,EAANA,EAAQjC,SAEG+B,OAG1BlH,WACIJ,KAAK+B,eAAiB/B,KAAKiC,MAAMC,MAAMF,OAAO,CAACjC,EAAQqB,IACnDS,+BACO9B,GAAM,EACRqB,EAAKe,IAAK,CACPC,SAAU,EACVqL,QAAQ,EACR7N,QAAQ,KAGjB,IACHI,KAAK+N,iBAAmB/N,KAAKiC,MAAM4F,UAAY,IAAI7E,OAAOjD,GAAiB,YAAZA,EAAEwF,OAC7DvF,KAAK+N,gBAAgBzG,SACrBtH,KAAKkO,gBAAkBlO,KAAK+N,gBAAgB,IAIpDI,mBAAmBpO,GACQ,KAAf,MAAJA,OAAI,EAAJA,EAAMqC,YACNrC,EAAKH,QAAS,EACdG,EAAK0N,QAAS,GAItBW,cAII,OAHevM,OAAOC,OAAO9B,KAAK+B,gBAAgBC,OAAO,CAACZ,EAAaK,IAC5DL,GAAgB,EAAIK,EAAKW,UAAYX,EAAKgM,QAClD,GAIPY,eAII,OAHexM,OAAOC,OAAO9B,KAAK+B,gBAAgBC,OAAO,CAACZ,EAAcK,IAC7DL,GAAiB,EAAIK,EAAKW,UAAYX,EAAK7B,QACnD,GAIPsF,YACI,OAAIlF,KAAKoO,iBAEDpO,KAAKkO,iBACLlO,KAAK4C,QACL,EAAI5C,KAAKwN,aACTxN,KAAKwN,aAAexN,KAAK8N,wBAEtB9N,KAAKqO,kBACHrO,KAAK4C,OAKtBzB,SACI,MAAMpB,EAAUC,KAAKkO,gBACrB,GAAInO,EAAS,CACT,MAAMqB,EAAcpB,KAAKsO,kBAAkB/L,GAAQA,EAAKkL,QAClDhM,EAAczB,KAAKsO,kBAAkB/L,GAAQA,EAAK3C,QAExDI,KAAKc,YAAY,CACb2M,OAAQ,CACJvL,MAAOd,EACPwB,OAAQ5C,KAAK4C,OACb2L,SAAUvO,KAAK2N,eAAiB3N,KAAKiC,MAAM2L,gBAAkB,EAC7DC,WAAY7N,KAAK6N,WACjBW,UAAWzO,EAAQoC,IAEvBvC,OAAQ,CACJsC,MAAOT,EACPiB,QAAS1C,KAAKiC,MAAME,GACpBS,OAAQ5C,KAAK4C,OACbC,eAAgB7C,KAAK2N,mBAMrC/N,SACII,KAAKc,cAGDwN,kBAAkBvO,GACtB,OAAO8B,OAAOS,QAAQtC,KAAK+B,gBACtBiB,OAAO,EAAE5B,EAAaK,KAAU,EAAIA,EAAKW,UAAYrC,EAAS0B,IAC9DD,IAAI,EAAEJ,EAAaK,MAAW,CAC3BsB,cACAX,SAAUX,EAAKW,oCC3KHzC,qHAUxBA,oBAAkCA,iDAASC,WAAUD,8BAAiCA,QACtFA,oBAAsBA,iDAASE,WAC3BF,8BACJA,gCAHqDA,2CACZA,4CACrCA,iGDUK8O,IAA0B9O,wCAA1B8O,GAA0BzN,gvDDtBvCrB,gCAEAA,iBAA4B,UAA5BA,CAA4B,YAA5BA,CAA4B,UAA5BA,CAA4B,QAKRA,cACAA,cAAIA,8BAAsCA,QAC1CA,eAAIA,gCAAqCA,QACzCA,eAAIA,gCAAkCA,QACtCA,eAAIA,gCAAoCA,QACxCA,eAAIA,gCAA6CA,QACjDA,eAAIA,gCAAkCA,QACtCA,eAAIA,gCAAgCA,QACpCA,eAAIA,gCAAgCA,YAG5CA,0BAsEJA,UAEJA,kBAAkF,SAAlFA,CAAkF,cAEzCA,gCAAoDA,QACrFA,wBAQIA,4EACHA,UAGLA,gBAAK,0BAALA,CAAK,YAEUA,gCAA2CA,QAClDA,qBAAiCA,+DAC7BA,4BAQJA,UAGJA,iCAAsB,eACiBA,8DAAnCA,QACAA,kBACIA,2DAGJA,UAEJA,gCAAqB,YACVA,gCAA2CA,QAClDA,kCAIIA,0DACHA,UAELA,mBAAsD,aAE9CA,2DAEJA,QACAA,mBACIA,2DAEJA,QACAA,2BAUAA,0BAGJA,cAKZA,yCA5JwBA,iDACAA,iDACAA,8CACAA,gDACAA,yDACAA,8CACAA,4CACAA,4CAGSA,wCAwEGA,4DAESA,gEAE7BA,+DAA8C,kBAA9CA,CAA8C,uEAA9CA,CAA8C,YAA9CA,CAA8C,oBAavCA,uDAC0BA,4CAA6B,6BAElCA,4CAWOA,2CAA4B,6BAE3DA,6HAMGA,uDAGHA,4CAA2B,oCAA3BA,CAA2B,wBAKfA,4CAEZA,4HAIAA,+GAG6BA,6EAUEA,6wDGnJ5C,SANPG,cAQIE,mBAAgB,GAGhBH,SACIG,KAAKc,YAAYd,KAAKG,eAG1BP,SACII,KAAKc,sDAVA4N,iCAA2B1N,oUDTxCrB,gCACAA,eACIA,8BACJA,QACAA,+BAAqB,WACVA,8BAAwCA,QAC/CA,mBAAqCA,6DAArCA,UAGJA,uCAPIA,0GAGOA,kDAC8BA,6UENbA,qGAIpBA,oBACIA,wDACJA,kCAFyCA,iBACrCA,0FAKRA,oBAA0CA,kDAASC,WAC/CD,8BACJA,cADIA,mIADJA,2BAGAA,oBAAsBA,iDAASwB,WAC3BxB,6EACJA,gCALuBA,4BAG0CA,4CAC7DA,mHCLD,SANPG,cAQIE,gBAAuB,GACvBA,aAAU,GAEVA,mBAAgB,GAEhBmB,SACQnB,KAAK2O,eACL3O,KAAKc,YAAYd,KAAK2O,eAI9B/O,SACII,KAAKc,sDAdA8N,iCAA+B5N,2aDT5CrB,gCACAA,aAAGA,8BAAyBA,QAC5BA,gCAAsB,cACaA,6DAC3BA,2BAGJA,UAEJA,wCARGA,qCAEgCA,0CACDA,kKEc3B,QACHG,YACYC,EACAqB,EACAK,EACAc,GAHAvC,mBACAA,oBACAA,2BACAA,mBAOZ6O,8BAA8B9O,EAAiBqB,GAC3C,OAAOpB,KAAK8O,qBAAqB/O,GAAS8L,MACtC,OAAUpK,IACN,MAAMc,EAA0B,CAC5BG,UACAmE,aACAkI,QAAS/O,KAAK0B,YAAYC,WACtB,OAAE,mDACF,CAAE4D,UAENyJ,aAAa,EACbC,MAAO,IAEX,OAAIxN,EACOzB,KAAKkP,yBAAyBnP,EAAS0B,GAAOoK,QACjDsD,MAAW1M,GAAOzC,KAAKoP,0BAA0B7M,KAG9CvC,KAAKoP,0BAA0B7M,MAStD6M,0BAA0BrP,GAOtB,OAAOC,KAAKiK,aACPoF,cAAcT,GAAiC,CAC5CU,OAAQ,CACJzI,WAAY9G,EAAQ8G,WACpBmI,YAAajP,EAAQiP,YACrBD,QAAShP,EAAQgP,SAErBQ,UAAU,EACVC,KAAM,OAET3D,MACG,OAAUzK,IACN,GAAIA,EACA,OAAOpB,KAAKkP,yBAAyBnP,EAAQ2C,QAAStB,GAEtD,GAAKrB,EAAQiP,YAGT,OAAOS,IAFP,MAAM,IAAIC,MAAM,qCC7ErC,eACP,OAAW,QAAO,QAClB,MAEAjN,EADAF,KAEA,aACAd,iBAAwCkO,MAAwBvO,oBAChEqB,IACAA,MAAkCmN,KAClCC,gBAAgD,QAAwBzO,oBAExEqB,GACAA,aAGAF,IACAd,gBACAA,OACAc,KACAmC,MAGAA,MD6DgBoL,CAAU1O,GAAUA,EAAOyK,QAAKkE,MAAM,MAAO,QAAKhQ,EAAQkP,UAQ9DH,qBAAqB/O,GACzB,OAAOC,KAAKM,YAAY2B,MACnB+N,gBAAgBjQ,EAAS,CACtBiD,OAAQ,CACJqH,KAAM,CACF4F,GAAIxL,+BAGZyL,KAAM,CACFC,UAAW1L,cAGlBhE,UAAUW,GAAUA,EAAOa,OAC3B4J,MACG,OAAIzK,IACA,MAAMK,EAAa,MAANL,OAAM,EAANA,EAAQgP,QAAQzP,MAAM6B,KAAKD,GAAmB,cAAdA,EAAE8N,KAAKvF,IACpD,GAAIrJ,EACA,OAAOA,EAAK4O,KAAK1E,QAQ7BuD,yBAAyBnP,EAAiBqB,GAC9C,OAAOpB,KAAKM,YAAY2B,MAAMqO,kBAAkBvQ,EAASqB,GAAOyK,MAC5D,OAAI,EAAG0E,6BACH,OAA8B,MAAtB9O,OAAsB,EAAtBA,EAAwB+O,gBACvB,QACD,OAA6B,MAAtB/O,OAAsB,EAAtBA,EAAwB8D,UAC9B,4BACD,WAAKkL,oBAAoBC,MAA4B,MAAtBjP,OAAsB,EAAtBA,EAAwBkP,iBACjD,IAAIjB,MAA4B,MAAtBjO,OAAsB,EAAtBA,EAAwBkP,4DA7GnDC,GAAsBjR,gFAAtBiR,EAAsBC,QAAtBD,EAAsB,qBAFnB,kFEDIjR,0EAAgCA,gFA2BpBA,kBAA+D,UACSA,SAElEA,QACFA,kBACIA,mCACAA,sCACIA,mCACJA,iDAPsBA,mDAA0CA,8BAIhEA,wEACuBA,qDACnBA,6FAZpBA,wBAAuC,YAE/BA,8BACJA,QACAA,6BACIA,2BAWJA,qCAdIA,8DAGiDA,uDAN7DA,SACIA,kCAkBJA,6BAlBmBA,2DAyBXA,kBACIA,uCAMJA,kCALQA,6BAAgB,cAAhBA,CAAgB,uBAAhBA,CAAgB,gEALpCA,cAAgC,UAAhCA,CAAgC,YAGpBA,yBAQJA,uCARgDA,uDAJ5DA,SACIA,wBAcJA,6BAdSA,2DA/CbA,SACIA,iBAAkE,WAE1DA,yBACJA,QACAA,iBAA8BA,SAA8BA,QAC5DA,iBAA6BA,SAA6BA,QAC1DA,iBACIA,oCACAA,wCACIA,qCACJA,UAEJA,kBACIA,UACAA,gCAA+E,8BAEnFA,QACAA,kBACIA,qCACAA,wCACIA,qCACJA,QAEAA,mCAoBJA,UAEJA,mCAgBJA,4CA7D2BA,8CAETA,uCAEoBA,sCACDA,qCAEzBA,6EACuBA,uDACnBA,sEAIJA,mCACkBA,yBAAa,6BACTA,yBAAa,4BAGnCA,6EACuBA,uDACnBA,sEAGWA,6CAsBRA,8EAiBnBA,iBAAiE,WACdA,SAA2BA,QAC1EA,iBAA6BA,SAAmBA,QAChDA,iBACAA,iBACIA,mCACAA,uCACIA,qCACJA,gDAP2CA,8BAClBA,sBAGzBA,uEACuBA,sDACnBA,6FAQJA,oBAA4EA,SAE1EA,6BAF0EA,6CAHhFA,iBAA+D,UAA/DA,CAA+D,UAEdA,SAA0BA,QACvEA,8BAGJA,QACAA,gBACIA,mCACAA,sCACIA,qCACJA,sDATGA,mDAA0CA,8BAClCA,+DAKXA,wEACuBA,qDACnBA,8FAXZA,SACIA,0BAcJA,kCAdkCA,yCC7EnC,QANPG,cASIE,mCAA+B,EAC/BA,yBAEI,GAEA8Q,mCACA,OAAO9Q,KAAK+Q,6BAA+B/Q,KAAKgR,sBAAwB,GAGxEC,iBACA,OAAQjR,KAAK+Q,8BAAgC,EAAI/Q,KAAKgR,sBAAsB1J,OAGhFlH,WACIJ,KAAK+Q,6BAA+B/Q,KAAKgR,sBAAsB1J,OAAS,EACxEtH,KAAKkR,sBAGTC,8BACInR,KAAK+Q,8BAAgC/Q,KAAK+Q,6BAG9CK,iBAAiBrR,GACb,OAAOA,EAAKsR,UAAUrO,OAAO5B,GAAKA,EAAEiJ,OAAS5F,iBAGzCyM,sBACJ,UAAWnR,KAAQC,KAAKiC,MAAMC,MAAO,CACjC,MAAMd,EAAY,IAAInB,KAAU,IAC1BwB,EAASzB,KAAKgR,sBACfxP,IAAIe,IACD,MAAME,EAAS1C,EAAamG,aAAa3D,EAAO0D,MAChD,SAAUG,WAAW7D,EAAO0D,KAAM,IAAIhG,KAAYwC,IAC3C,CACH6O,SACAC,YACA1Q,WAGPmC,OAAOT,KACGvC,KAAK+Q,8BAAqD,MAAfxO,EAAM1B,OAEhEb,KAAKwR,oBAAoBzR,EAAKoC,IAAMV,GAI5CgQ,iBAAiB1R,GAEb,MAAO,CAAC,aAAc,aADXA,EAAU2R,iBAAiBC,MAAM,KAAK,IAIrDC,2BACI7R,EACAqB,GAEA,MAAMK,EAAKL,EAAoBsQ,iBAAiBC,MAAM,KAAK,GACrDpP,EAAYxC,EAAM8R,WAAWrP,KAAKC,GAAKA,EAAEN,KAAOV,GACtD,GAAIc,EACA,OAAOA,EAAUuP,iBAAc,EAIvCC,iBAAiBhS,GACb,OAAIA,EAAMmE,cAAcoD,OACbvH,EAAMmE,cAAc1C,IAAIJ,GAAgBA,EAAayC,eAAeoC,MAAM+L,KAAK,MAE/E,0CArENC,8BAAmBjR,0uCDVhCrB,mBAAiC,UAAjCA,CAAiC,QAGrBA,cACAA,cAAIA,8BAAsCA,QAC1CA,cAAIA,8BAAqCA,QACzCA,eAAIA,gCAAoCA,QACxCA,eAAIA,gCAAkCA,QACtCA,eAAIA,gCAA+BA,YAG3CA,kBACIA,oCA+DAA,0BAWAA,kCAgBAA,iBAAsB,WACgBA,gCAAmCA,QACrEA,iBACAA,iBACIA,qCACAA,wCACIA,qCACJA,YAGRA,iBAAqB,WACiBA,gCAAkCA,QACpEA,iBAA6BA,UAA6BA,QAC1DA,iBACAA,iBACIA,qCACAA,wCACIA,qCACJA,YAGRA,kBAAkB,WACoBA,gCAA+BA,QACjEA,iBACAA,iBACIA,qCACAA,wCACIA,qCACJA,uBA9HAA,iDACAA,gDACAA,gDACAA,8CACAA,2CAIuBA,wCA+DaA,6CAWTA,4CAiBGA,+CAG9BA,kFACuBA,uDACnBA,2EAK0BA,8CACLA,4CAGzBA,kFACuBA,uDACnBA,2EAK0BA,2CAG9BA,+EACuBA,uDACnBA,4lEE3HpBA,mDACIA,SACJA,8BAF+CA,gDAC3CA,2EAEJA,mDACIA,SACJA,8BAFgDA,iDAC5CA,kDCDG,+CAAMuS,8BAAsBlR,8LDTnCrB,mDACIA,SACJA,QACAA,mDACIA,mCACJA,QACAA,qCAGAA,qCAGAA,oDACIA,8BACJA,eAdkBA,iDACdA,0CAEcA,mDACdA,qEAEeA,8CAGAA,+CAGDA,8DACGA,+JECTA,mBACIA,8BACJA,eADIA,uGAEJA,mBACIA,8BACJA,eADIA,4FAgBAA,kBACIA,8BACJA,eADIA,2FAEJA,kBACIA,8BACJA,eADIA,0IAGAA,uLARRA,SACIA,yBAGAA,yBAGAA,iCAMJA,wCAZwBA,+CAGAA,+CAGPA,gGAcTA,uBAA6DA,8BAE3DA,eAF2DA,gFAG7DA,uBAA4DA,8BAE1DA,eAF0DA,uFANhEA,SACIA,8BACAA,kBAAQA,mCAAmEA,QAC3EA,8BAGAA,8BAGAA,oCACIA,sCAIJA,QACJA,wCAdIA,0EACQA,8DACuBA,mCAGFA,oCAKrBA,gCAAe,6CAf/BA,SACIA,kBACIA,8BACJA,QACAA,oCAgBJA,kDAlBQA,kEAEWA,2FAuBXA,oCACIA,iCAIJA,wCAHQA,4BAAmB,gEAP/BA,SACIA,kBACIA,8BACJA,QACAA,8BACAA,8CAMJA,yDATQA,mEAEJA,8GAC2BA,qHAQ3BA,wPAdRA,SACIA,kCAYAA,4CAWJA,mDAvBmBA,6CAAmC,yCAwBtDA,SACIA,8BAIJA,wCAJIA,kJAOAA,oCAAoE,8CAE5DA,SACJA,QACAA,oDACIA,mCACJA,QACAA,oDACIA,SACJA,oDARkBA,+DACdA,sCAEcA,oDACQA,0BAERA,+DACdA,kHAVZA,SACIA,8BACAA,gDAWJA,kDAZIA,0GAC2BA,yEAc3BA,oCACIA,qCAIJA,wCAHQA,qCAAgC,4CAJ5CA,SACIA,8BACAA,8CAMJA,kDAPIA,uEAC2BA,sEAQ3BA,SACIA,kBACIA,8BACJA,QACAA,8BACJA,yDAHQA,yEAEJA,2IAEJA,SACIA,kBACIA,8BACJA,QACAA,8BACJA,yDAHQA,uEAEJA,2IAEJA,SACIA,8BAIJA,yCAJIA,uIAKJA,oCACIA,qCAIJA,wCAHQA,qCAAgC,4CArB5CA,SACIA,kCAMAA,kCAMAA,kCAMAA,8CAMJA,kDAxBmBA,+CAMAA,6CAMAA,sEAMYA,mEAUnBA,mBAA4DA,8BAE1DA,eAF0DA,mEAG5DA,mBAA8DA,8BAE5DA,eAF4DA,sFAN1EA,SACIA,kBAAkB,YAEVA,0BAGAA,0BAGAA,SACJA,QACAA,kBACAA,wBAAc,eAENA,uBACJA,QACAA,iCAA8C,gBAItCA,mEAASA,EAAT+G,MAASyL,+CAGTxS,wBACAA,gCACJA,QACAA,mBACAA,sBAGIA,mEAASA,EAAT+G,MAAS0L,+CAGTzS,wBACAA,gCACJA,cAIhBA,0CApCmBA,kCAGAA,mCAGPA,oCAYQA,sDAGAA,kDAOAA,uDAGAA,0IAMpBA,SACIA,8BACAA,oBAAU,UACiEA,SAErEA,UAEVA,wCANIA,wEAEOA,4DAAoEA,6DAK/EA,SACIA,8BACAA,oBACK,aAAoCA,SAA2BA,UAExEA,wCAJIA,wEAEyCA,4EAjLrDA,iCAQIA,wFAEAA,YACIA,kCAcAA,kCAqBAA,kCAyBAA,kCAMAA,kCAcAA,kCASAA,kCA0BAA,oCAwCAA,mCAQAA,mCAMJA,QACJA,8CAnLIA,yCAAqC,iCAArCA,CAAqC,wBAArCA,CAAqC,oBAArCA,CAAqC,2BAArCA,CAAqC,2CAQvBA,kCACKA,6DAcAA,qDAqBAA,+DAyBAA,8DAMAA,yDAcAA,wDASAA,mEA0BAA,iDAwCAA,2DAQAA,4DCnLpB,SANPG,cAScE,aAAU,IAAIL,MACdK,gBAAa,IAAIL,MACjBK,gBAAa,IAAIL,MAC3BK,UAAO,GACPA,oBAAgB,EAChBA,eAAW,EACFA,UAAOyE,MAEhB4N,eAAetS,GACX,GAAIA,EAAMsK,OAAS5F,6BAAyC,CACxD,GAAsB,cAAlB1E,EAAMsQ,KAAKvF,GACX,MAAO,UAEX,GAAsB,cAAlB/K,EAAMsQ,KAAKvF,GACX,MAAO,QAGf,OAAI/K,EAAMsK,OAAS5F,oCACO,cAAlB1E,EAAMsQ,KAAKvF,GACJ,UAGX/K,EAAMsK,OAAS5F,iCACO,aAAlB1E,EAAMsQ,KAAKvF,IAAuC,cAAlB/K,EAAMsQ,KAAKvF,KAI/C/K,EAAMsK,OAAS5F,yBACR,QAEP1E,EAAMsK,OAAS5F,8BACR,UAEJ,UAGX6N,gBAAgBvS,GACZ,GAAIA,EAAMsK,OAAS5F,6BAAyC,CACxD,GAAsB,cAAlB1E,EAAMsQ,KAAKvF,GACX,MAAO,CAAC,mBAAoB,YAEhC,GAAsB,cAAlB/K,EAAMsQ,KAAKvF,GACX,MAAO,MAGf,OAAI/K,EAAMsK,OAAS5F,gCACO,YAAlB1E,EAAMsQ,KAAKvF,GACJ,cAGX/K,EAAMsK,OAAS5F,iBACR,OAEP1E,EAAMsK,OAAS5F,qBACR,SAEP1E,EAAMsK,OAAS5F,oCACO,YAAlB1E,EAAMsQ,KAAKvF,IAGO,cAAlB/K,EAAMsQ,KAAKvF,QAJnB,EAKe,QAKnByH,WAAWxS,GACP,OAAQA,EAAMsK,WACL5F,6BACD,MACsB,cAAlB1E,EAAMsQ,KAAKvF,IACO,cAAlB/K,EAAMsQ,KAAKvF,IACO,YAAlB/K,EAAMsQ,KAAKvF,GAAO,KAGrBrG,+BACD,MAAyB,YAAlB1E,EAAMsQ,KAAKvF,IAAsC,cAAlB/K,EAAMsQ,KAAKvF,GAAO,KACvDrG,mCACD,MAAyB,cAAlB1E,EAAMsQ,KAAKvF,IAAwC,YAAlB/K,EAAMsQ,KAAKvF,GAAO,KACzDrG,sBACAA,qBACD,OAAO,UAEP,OAAO,GAInB+N,eACIzS,GAEA,IACKA,EAAMsK,OAAS5F,yBACZ1E,EAAMsK,OAAS5F,qCACnBzE,KAAKiC,MAAM6C,aAEX,OAAO9E,KAAKiC,MAAM6C,aAAatC,KAAKpB,GAAKA,EAAEe,KAAOpC,EAAMsQ,KAAKrK,eAIrEyM,WAAW1S,GACP,GAAIA,EAAMsK,OAAS5F,gCAA6CzE,KAAKiC,MAAM4F,SACvE,OAAO7H,KAAKiC,MAAM4F,SAASrF,KAAKpB,GAAKA,EAAEe,KAAOpC,EAAMsQ,KAAK7B,WAIjEkE,kBAAkB3S,GACd,MAAMqB,EAAU,IAAI8G,IACdzG,EAA6B1B,EAAMsQ,KAAKsC,aAC9C,UAAWpQ,KAAQvC,KAAKiC,MAAMC,MAC1B,UAAWO,KAAQF,EAAK5B,MACpB,GAAIc,EAAiBqF,SAASrE,EAAKN,IAAK,CACpC,MAAMuC,EAAQtD,EAAQ6H,IAAI1G,EAAKiC,eAAeyB,MACjC,MAATvB,EACAtD,EAAQ8H,IAAI3G,EAAKiC,eAAeyB,KAAMvB,EAAQ,GAE9CtD,EAAQ8H,IAAI3G,EAAKiC,eAAeyB,KAAM,GAKtD,OAAOK,MAAMqF,KAAKvK,EAAQkB,WAAWd,IAAI,EAAEe,EAAME,MAAe,CAAEwD,OAAM7D,cAG5EwQ,gBAAgB7S,GACZ,OAAOC,KAAKiC,MAAM4Q,cAAcrQ,KAAKpB,GAAKA,EAAEe,KAAOpC,GAGvD+S,QAAQ/S,GACJ,MAAQgT,iBAAkBhT,EAC1B,GAAIqB,EACA,MAAO,GAAGA,EAAc4R,aAAa5R,EAAc6R,WAChD,CACH,MAAMxR,EAAWzB,KAAKiC,MAAMiR,SAC5B,GAAIzR,EACA,MAAO,GAAGA,EAASuR,aAAavR,EAASwR,WAGjD,MAAO,GAGXE,iBACInT,KAAKoT,QAAQvJ,KAAK,CAAEwJ,KAAMrT,KAAKqT,KAAMC,UAAWtT,KAAKuT,gBACrDvT,KAAKqT,KAAO,GACZrT,KAAKuT,eAAgB,0CAlJhBC,iCAAqBxS,omDDjBlCrB,cAAIA,8BAAuCA,QAC3CA,iBAAoD,yBAApDA,CAAoD,UAApDA,CAAoD,gBAG9BA,oDAA4CA,QACtDA,oBAAqDA,gCAASyB,qBAC1DzB,8BACJA,UAEJA,kBAA+B,0BAA/BA,CAA+B,cAEYA,6DAAnCA,QACAA,kBAAOA,gCAAyCA,UAEpDA,0BAGAA,0BAGJA,UAEJA,0CAsLAA,kCAAoF,aAE5EA,gCACJA,mBA/MJA,kDACoBA,sCACqCA,8BAEvCA,iCACwBA,mCAC9BA,sDAKmCA,0CAC5BA,qDAEJA,uCAGAA,wCAMOA,oCAqLFA,4BAAe,8BAAfA,CAAe,eAE3BA,g1CE7MRA,sBCOG,SAGC2F,oBACA,OAAQtF,KAAKuF,WACJ,aACD,MAAO,cACN,UACD,MAAO,cACN,eACA,YACD,MAAO,gCClBnB5F,6DDOS8T,iCAA0BzS,wMDRvCrB,2CACIA,6BACAA,wDACJA,eAHUA,gDAA2C,6BACjBA,2CAChCA,sKGMG,SAGC2F,oBACA,OAAQtF,KAAKuF,WACJ,UACD,MAAO,cACN,UACD,MAAO,cACN,SACD,MAAO,oCCdX5F,SAA4CA,SAA4BA,8BAA5BA,0EAuB5CA,oDACIA,SACJA,wCAFkBA,iDACdA,mEAEJA,oDACIA,SACJA,wCAFkBA,gDACdA,4DAEJA,oDACIA,8BACJA,wCAFkBA,kDACGA,6EAGzBA,kBAA4D,eACjBA,mEAASA,EAAT+G,MAASgN,uBAC5C/T,8BACJA,gBADIA,oFA1BZA,SACIA,iBACIA,sBACAA,8BACAA,kBAAiC,8BAErCA,QACAA,iBAAwB,8CAEhBA,iCACJA,QACAA,sDACIA,qCACJA,QACAA,uCAGAA,uCAGAA,uCAGJA,QACAA,yBAKJA,4CA1BQA,6DAEwBA,gCAGNA,wDACdA,0DAEcA,0DACdA,4DAE4DA,uCAGDA,gCAGEA,8CAI3CA,qFAO1BA,qBAGIA,0DAAS4C,kCAET5C,8BACJA,cADIA,kGDzCCgU,iCAAyB3S,uMDRtCrB,2CACIA,6BACAA,wDACJA,eAHUA,gDAA2C,6BACjBA,2CAChCA,sOE6DoBA,SACIA,uBACAA,6EAIJA,wCAJIA,2HAMAA,uBACAA,yIAhBZA,SACIA,qBAIIA,sEAAS+E,6DAET/E,mCAOAA,4CAIJA,QACJA,+CAZuBA,uCAAiC,yCApBpEA,kBACIA,4BAOAA,wBAAc,eAENA,uBACJA,QACAA,gCACIA,iCAoBJA,kCA9BCA,gEAUuCA,+CC7C7C,SANPG,cAScE,mBAAgB,IAAIL,MACpBK,4BAAyB,IAAIL,MAC7BK,kBAAe,IAAIL,MAE7BiU,kBAAkB7T,GACd,QAASA,GAAU8B,OAAOgS,KAAK9T,EAAO+T,UAAUxM,OAAS,EAG7DP,kBACI,OAAK/G,KAAK+T,QAGH/T,KAAK+T,QAAQlN,WAAW7D,OAAOjD,GAAW,YAANA,GAAyB,UAANA,GAFnD,6CCNXJ,qBAMIA,sEAASqU,sBAETrU,wDAEJA,+CAFIA,wKAGJA,qBAOIA,yCAASA,EAAT+G,OAAS4J,kBAAkB,gCAE3B3Q,8BACJA,cADIA,gHAUIA,SACIA,qBAAkDA,kDAASsU,0BACvDtU,uBACAA,8BACJA,QACAA,kBACJA,cAHQA,gFAYJA,SACIA,8BACJA,eADIA,2FAGAA,4HAZRA,qBAKIA,sEAASuU,oBAETvU,uBACAA,kCAGAA,4CAGJA,0DANmBA,oDAAsC,sDDpD5DwU,iCAAyBnT,+6BDXtCrB,iBAAkB,UAAlBA,CAAkB,SAGNA,8BACAA,iCACJA,QACAA,iBACIA,qCACJA,UAEJA,iBACIA,gCACJA,QACAA,oCA8BAA,yBAoCJA,eA5EYA,mDACeA,+CAGUA,wCAITA,oCAAmB,+BAEVA,4CA8BPA,0gBE8BVA,qBAKIA,2DAASA,EAAT+G,OAAS4J,uBAET3Q,uBACAA,6EAIJA,oCAJIA,8HAVRA,SACIA,kBACAA,8CAaJA,+BAZ8BA,6FA1E9CA,0BAAiD,gBAAjDA,CAAiD,WAGrCA,8CACAA,mCAA6C,cAGrCA,iDAASyU,0CAGTzU,sBACJA,cAKZA,wBACIA,mCACAA,4BAWAA,4BAWAA,qBAAgCA,iDAAS0U,iBACrC1U,gCACJA,QACAA,yBAAc,eAENA,wBACJA,QACAA,iCACIA,kCAOAA,6BAgBAA,oDAgBAA,mBACAA,sBAAkDA,8DAASyP,+BACvDzP,wBACAA,gCACJA,uDAxFaA,+CACMA,gCAIfA,gEAYPA,iKAWAA,8GASoDA,mDACrDA,2DAOmBA,0DAWVA,0DAYUA,0EAmBXA,qGAyBAA,cAAyC,QACjCA,SAAqBA,QACzBA,cAAIA,4BAAiCA,QACrCA,cAAIA,mCAAsDA,QAC1DA,cAAIA,qCAAuDA,mDAHvDA,8BACAA,yCACAA,oDACAA,8EAgCJA,cACIA,8BACJA,eADIA,oFAGJA,cACIA,8BACJA,eADIA,qGAOZA,qCAIIA,kDAAiBA,EAAjB+G,OAAiB4N,kBAAjB3U,CAAuC,qDACbA,EADa+G,OACb6N,2BAD1B5U,CAAuC,2CAEvBA,EAFuB+G,OAEvBgN,kBACnB/T,oDALGA,qCAAmC,wCAH3CA,SACIA,4CAQJA,mCAP4BA,+EAQ5BA,SACIA,mCAGIA,sEAAmBA,EAAnB+G,OAAmB8N,gCACtB7U,QACLA,mDAJQA,gCAA2B,qDA7E/CA,eAAsC,WAAtCA,CAAsC,YAG1BA,8BAIAA,cAAIA,8BAAqCA,QACzCA,oBAAqB,UAArBA,CAAqB,OAArBA,CAAqB,SAGLA,gCAAsCA,QAC1CA,eAAIA,gCAAkCA,QACtCA,eAAIA,gCAAkCA,QACtCA,eAAIA,gCAAmCA,YAG/CA,kBACIA,2BAMJA,UAGJA,gDAMAA,iCAGIA,oDAAWyT,YAAXzT,CAA2B,iDACbwS,eADdxS,CAA2B,iDAEbyS,kCACjBzS,UAELA,mBAAsC,sCAI9BA,wDAAe8U,wBAClB9U,QACDA,mBAAkB,aAEVA,gCACJA,QACAA,mBAAwB,aAEhBA,kCACAA,wBAGAA,qCACAA,wBAGAA,qCACJA,YAGRA,kCAUAA,mCAOJA,6CA9EQA,0BAAe,iDAGfA,gDAIYA,kDACAA,8CACAA,8CACAA,+CAIYA,uCAWxBA,oCAAmB,2BAKnBA,0BAAe,mCASfA,oDAAmC,oCAM/BA,sDAIwBA,sCACfA,wEAGkBA,4CAClBA,uEAGkBA,2CAIpBA,qDAUuBA,0CC9H3C,iBACK8E,MAuBR3E,YACIC,EACAqB,EACAK,EACQc,EACEE,EACFiC,EACA8C,EACAC,GAERiN,MAAMtT,EAAOrB,EAAQ0B,EAAqBgB,GANlCzC,sBACEA,mBACFA,2BACAA,oBACAA,8BA5BZA,gBAAa,IAAIC,KAAU,IAG3BD,kBAAe,IAAI4P,KAGF5P,mBAAgB,CAC7B,cACA,mBACA,oBACA,iBACA,mBACA,UACA,qBACA,YACA,YACA,YACA,8BAgBJI,WACIJ,KAAK2U,OACL3U,KAAK4U,QAAQ/I,MAAK,QAAK,IAAIzI,UAAUrD,IACb,cAAhBA,EAAMwF,OACNvF,KAAK6U,OAAOC,SAAS,CAAC,KAAM,UAAW,CAAEC,WAAY/U,KAAKgV,UAGlEhV,KAAKkG,aAAelG,KAAKiV,qBAAqB,SAC9CjV,KAAKgR,sBAAwBhR,KAAKiV,qBAAqB,aACvDjV,KAAKkV,SAAWlV,KAAKmV,aAAatJ,MAC9B,QAAU,SACVuJ,KAAU,IACCpV,KAAKM,YAAY2B,MACnB+N,gBAAgBhQ,KAAKmC,GAAI,CACtB+N,KAAM,CACFC,UAAW1L,cAGlB4Q,UAAUtV,IAAO,MAAC,OAAU,QAAVqB,IAAKa,aAAK,eAAEmO,QAAQzP,UAGnDX,KAAKsV,YAActV,KAAK4U,QAAQ/I,QAC5B0J,KAAIxV,GACyBC,KAAKwV,cAAc1O,SAAS/G,EAAMwF,OAGrDxF,EAAM8G,WAAW7D,OAAOvB,IAAMzB,KAAKwV,cAAc1O,SAASrF,IAD1D1B,EAAM8G,aAMxB4O,cACIzV,KAAK0V,UAGTtB,mBACIpU,KAAK4U,QACA/I,MACG,QAAK,MACLuJ,KAAUrV,GACNC,KAAKiK,aAAaoF,cAAc9B,GAAkC,CAC9DgC,UAAU,EACVD,OAAQ,CACJqG,YAAa5V,EAAMwF,WAKlCnC,YAGTkN,kBAAkBvQ,GACdC,KAAKM,YAAY2B,MAAMqO,kBAAkBtQ,KAAKmC,GAAIpC,GAAOqD,UAAU,EAAGmN,6BAClE,OAA8B,MAAtBnP,OAAsB,EAAtBA,EAAwBoP,gBACvB,QACDxQ,KAAKyQ,oBAAoBmF,WAAQtU,KAAE,uCAAwC,CAAEiE,UAC7EvF,KAAKmV,aAAanK,OAClB,UACC,4BACDhL,KAAKyQ,oBAAoBC,MAAMtP,EAAuBuP,oBAKtEvB,0BAA0BrP,GACtBC,KAAK6V,uBACAzG,0BAA0B,CACvB1M,QAAS3C,EAAMoC,GACf0E,WAAY9G,EAAM8G,WAClBmI,aAAa,EACbD,WAASzN,KAAE,8CACX2N,MAAO,IAEV7L,YAGT6Q,wBACIjU,KAAKM,YAAY2B,MACZqO,kBAAkBtQ,KAAKmC,GAAI,aAC3BiB,UAAU,EAAGmN,6BACV,OAA8B,MAAtBxQ,OAAsB,EAAtBA,EAAwByQ,gBACvB,QACDxQ,KAAK6U,OAAOC,SAAS,CAAC,YAAa,CAAEC,WAAY/U,KAAKgV,QACtD,UACC,4BACDhV,KAAKyQ,oBAAoBC,MAAM3Q,EAAuB4Q,oBAK1E8D,mBAAmB1U,GACfC,KAAKM,YAAY2B,MACZ6T,wBAAwB,CACrB3T,GAAInC,KAAKmC,GACT+D,aAAcnG,IAEjBqD,UAAU,KACPpD,KAAKyQ,oBAAoBmF,SAAQ,OAAE,gCAAiC,CAAEG,OAAQ,YAI1FC,qBAAqBjW,GACjB,OAAKA,EAGE8B,OAAOC,OAAO/B,GAChBiD,OAAO5B,GAAe,iBAARA,GACd4B,OAAO5B,KAAUA,GAJX,GAOfkT,cAAcvU,GACVC,KAAKM,YAAY2B,MAAMqS,cAAcvU,EAAQoC,IAAIiB,UAAU,EAAGkR,oBAC1D,OAAQlT,EAAcoP,gBACb,UAC2B,YAAxBpP,EAAcmE,MACdvF,KAAKyQ,oBAAoBmF,WAAQtU,KAAE,iCAEnCtB,KAAKyQ,oBAAoBC,OAAM,OAAE,+BAErC1Q,KAAKM,YAAY2B,MAAMgU,SAASjW,KAAKmC,IAAIgB,QAAQC,YACjDpD,KAAKmV,aAAanK,OAClB,UACC,gCACA,kCACA,qBACDhL,KAAKyQ,oBAAoBC,MAAMtP,EAAc2N,YAK7DwF,wBAAyBR,UAASxO,UAChB,cAAVnE,EACApB,KAAKM,YAAY2B,MAAMiU,cAAcnW,EAAQoC,IAAIiB,UAAU,EAAG8S,oBAC1D,OAAQzU,EAAc+O,gBACb,UACDxQ,KAAKyQ,oBAAoBmF,SAAQ,OAAE,+CAAgD,CAC/ErQ,UAEJvF,KAAKM,YAAY2B,MAAMgU,SAASjW,KAAKmC,IAAIgB,QAAQC,YACjDpD,KAAKmV,aAAanK,OAClB,UACC,8BACDhL,KAAKyQ,oBAAoBC,MAAMjP,EAAckP,iBAC7C,UACC,qBACD3Q,KAAKyQ,oBAAoBC,MAAMjP,EAAc0U,wBAKzDnW,KAAKM,YAAY2B,MACZmU,yBAAyBrW,EAAQoC,GAAIf,GACrCgC,UAAU,EAAGgT,+BACV,OAAQ3U,EAAyB+O,gBACxB,UACDxQ,KAAKyQ,oBAAoBmF,SACrB,OAAE,+CACF,CACIrQ,UAGRvF,KAAKM,YAAY2B,MAAMgU,SAASjW,KAAKmC,IAAIgB,QAAQC,YACjDpD,KAAKmV,aAAanK,OAClB,UACC,8BACDhL,KAAKyQ,oBAAoBC,MAAMjP,EAAyBsN,YAOhFsH,kBAAkBtW,SACd,MAAM0B,GAA+E,QAAlBL,IAAM0D,oBAAY,QAAI,IAAI9C,OACzF,CAACS,EAAKiC,IAAgB,IAAIjC,KAAQiC,EAAYK,SAC9C,IAEJ,IAAIxC,GAAoB,EACxB,UAAWE,KAAQ1C,EAAMmC,MAIjBT,EAFCuB,OAAOwE,GAAOA,EAAIvC,UAAU9C,KAAOM,EAAKN,IACxCH,OAAO,CAACwF,EAAKC,IAAQD,EAAMC,EAAIrF,SAAU,GACpBK,EAAKL,WAC3BG,GAAoB,GAG5B,OACKA,IACAvC,KAAKsW,0BAA0BvW,IACS,IAAzCC,KAAKuW,yBAAyBxW,KAC7BA,EAAM8G,WAAWC,SAAS,YACvB/G,EAAM8G,WAAWC,SAAS,qBAC1B/G,EAAM8G,WAAWC,SAAS,cAItCwP,0BAA0BvW,GACtB,OAAO,EAAIA,EAAM8S,cAAc7P,OAAO5B,IAAMA,EAAEoV,WAAWlP,OAG7DmP,iCAAiC1W,GAC7B,SAAOyG,WACHzG,EAAM8S,cAAc7P,OAAO5B,IAAMA,EAAEoV,WACnC,eAIRD,yBAAyBxW,aACrB,MAAM0C,EAAkB+E,GACR,cAAZA,EAAEjC,OAAqC,aAAZiC,EAAEjC,OAAoC,UAAZiC,EAAEjC,MAE3D,IAAIb,EAAgB,EACpB,UAAW8C,KAAiD,QAAtC/F,EAAc,QAAdL,IAAMyG,gBAAQ,eAAE7E,OAAOP,UAAe,QAAI,GAAI,CAChE,MAAMgF,EAA2D,QAAjDlF,IAAQuF,QAAQ9E,OAAO0T,GAAiB,WAAZA,EAAEnR,cAAmB,QAAI,GAC/DyD,GAAe,aAAQvB,EAAoC,SACjE/C,GAAiB8C,EAAQwG,OAAShF,EAEtC,OAAOjJ,EAAM4W,aAAejS,EAGhCsP,iBAAiBjU,GACb,MAAMqB,EAAarB,EAAMwF,MACzBvF,KAAKiK,aACAoF,cAActO,EAAiC,CAC5CwO,UAAU,EACVD,OAAQ,CACJsH,kBAAmB5W,KAAKuW,yBAAyBxW,GACjD8W,aAAc9W,EAAM8W,gBAG3BhL,QACGuJ,KAAU3T,GACFA,EACOzB,KAAKM,YAAY2B,MAAM6U,wBAAwB,CAClDpU,QAAS1C,KAAKmC,GACdhC,cAAesB,EAAOtB,cACtBD,OAAQuB,EAAOvB,OACf4T,SAAUrS,EAAOqS,UAAY,KAG1BrE,MAGf,OAAU,EAAGqH,8BACT,OAAQrV,EAAwB+O,gBACvB,QAED,OADAxQ,KAAKyQ,oBAAoBmF,WAAQtU,KAAE,uCAChB,+BAAfF,EACOpB,KAAK6V,uBAAuBhH,8BAC/B9O,EAAMoC,GACNpC,EAAM8G,YAGH7G,KAAKM,YAAY2B,MACnBqO,kBAAkBtQ,KAAKmC,GAAI,kBAC3B0J,QAAKkL,MAAM,uBAEnB,0BACD,YAAKtG,oBAAoBC,MAAMjP,EAAwBsN,SAChDU,YAEP,OAAOA,QAItBrM,UAAU3B,IACHA,GACAzB,KAAKgX,aAAa,CAAEC,aAKpC5C,eACIrU,KAAK4U,QACA/I,MACG,QAAK,MACLuJ,KAAUrV,GACCC,KAAKiK,aAAaoF,cAAchK,EAA6B,CAChEmK,KAAM,KACNF,OAAQ,CACJrN,aAIZ,OAAUlC,GACFA,EACOC,KAAKM,YAAY2B,MAAMiV,kBAAkBnX,MAEzCoX,WAAG,KAGlB,OAAUpX,GAAUC,KAAKgX,aAAajX,GAAQ8L,MAAK,QAAM9L,MAE5DqD,UAAUrD,IACP,GAAIA,EAAQ,CACR,MAAQqX,yBAA0BrX,EAClC,OAAQqB,EAAsBoP,gBACrB,cACDxQ,KAAKyQ,oBAAoBmF,WAAQtU,KAAE,qCACnC,UACC,mCACA,mCACA,iCACA,iCACDtB,KAAKyQ,oBAAoBC,MAAMtP,EAAsB2N,SACrD,UACC,kCACD/O,KAAKyQ,oBAAoBC,MAAMtP,EAAsBuP,iBACrD,UACC,yBACD3Q,KAAKyQ,oBAAoBC,MAAMtP,EAAsBiW,yBACrD,gBACC,EACDrX,KAAKyQ,oBAAoBC,MAAM4G,KAAKC,UAAUnW,IAC9C,iBAEAoF,eAAYpF,OAMpCoT,sBAAsBzU,EAAYqB,GAC9BpB,KAAKM,YAAY2B,MACZuV,6BAA6BzX,EAAIqB,GACjCyK,QAAKuJ,KAAU3T,GAAUzB,KAAKgX,aAAavV,KAC3C2B,UAAU,KACPpD,KAAKyQ,oBAAoBmF,WAAQtU,KAAE,6CAI/C4S,eAAenU,GACX,MAAMqB,EAAepB,KAAKyX,wBAAwB1X,GAC9B,sBAAhBA,EAAMwF,QAAkD,IAAjBxF,EAAM+C,QAAoB1B,EAGjEpB,KAAK0X,YAAY3X,GAFjBC,KAAK2X,YAAY5X,GAMzB2T,aAAa3T,GACTC,KAAKiK,aACAoF,cAAcX,GAA6B,CACxCc,KAAM,KACNF,OAAQ,CACJ7B,YAGP5B,QACGuJ,KAAUhU,GACFA,EACOpB,KAAKM,YAAY2B,MAAMyR,aAC1B,CACIvT,gBACAgC,GAAIpC,EAAOoC,IAEfnC,KAAKmC,KAGF,aAAG,KAKrBiB,UAAUhC,IACHA,GACApB,KAAKyQ,oBAAoBmF,WAAQtU,KAAE,kCAKnD8R,QAAQrT,GACJ,MAAQsT,OAAMC,YAAavT,EAC3BC,KAAKM,YAAY2B,MACZkR,eAAe,CACZhR,GAAInC,KAAKmC,GACTkR,OACAC,aAEHzH,QAAKuJ,KAAU7S,GAAUvC,KAAKgX,aAAazU,KAC3Ca,UAAUb,IACPvC,KAAKyQ,oBAAoBmF,SAAQ,OAAE,gCAAiC,CAChEG,OAAQ,WAKxB5D,WAAWpS,GACPC,KAAKiK,aACAoF,cAAc5K,MAAyB,CACpC8K,UAAU,EACVD,OAAQ,CACJsI,wBAAwB,EACxBvE,KAAMtT,EAAMsQ,KAAKgD,KACjBE,eAAgBxT,EAAMuT,YAG7BzH,QACGuJ,KAAUhU,GACFA,EACOpB,KAAKM,YAAY2B,MAAM4V,gBAAgB,CAC1CC,OAAQ/X,EAAMoC,GACdmR,UAAWlS,EAAO2W,UAClB1E,KAAMjS,EAAOiS,OAGV5D,MAIlBrM,UAAUhC,IACPpB,KAAKmV,aAAanK,OAClBhL,KAAKyQ,oBAAoBmF,SAAQ,OAAE,gCAAiC,CAChEG,OAAQ,WAKxB3D,WAAWrS,GACP,OAAOC,KAAKiK,aACPC,OAAO,CACJC,SAAO7I,KAAE,8BACT0W,KAAMjY,EAAMsQ,KAAKgD,KACjBjJ,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOhJ,KAAE,kBAC9B,CAAE+I,KAAM,SAAUC,OAAO,OAAE,iBAAkBC,aAAa,MAGjEsB,MAAK,OAAUzK,GAAQA,EAAMpB,KAAKM,YAAY2B,MAAMgW,gBAAgBlY,EAAMoC,IAAMsN,MAChFrM,UAAU,KACPpD,KAAKmV,aAAanK,OAClBhL,KAAKyQ,oBAAoBmF,SAAQ,OAAE,gCAAiC,CAChEG,OAAQ,WAKxB0B,wBAAwB1X,SACpB,SAAuB,QAAdqB,IAAMyG,gBAAQ,eAAErF,KAAKf,GAAiB,YAAZA,EAAE8D,QAGjCoS,YAAY5X,GAChBC,KAAKiK,aACAoF,cAAcpM,EAA4B,CACvCuM,KAAM,KACNF,OAAQ,CACJrN,WAGP4J,QACGuJ,KAAUhU,GACFA,EACOpB,KAAKM,YAAY2B,MAAM0V,YAAYvW,IAEnC,aAAG,OAGlBgU,KAAUhU,GAAUpB,KAAKgX,aAAa5V,KAEzCgC,UAAUhC,IACHA,GACApB,KAAKyQ,oBAAoBmF,WAAQtU,KAAE,oCAK3CoW,YAAY3X,GAChBC,KAAKiK,aACAoF,cAAcZ,GAA4B,CACvCe,KAAM,KACNF,OAAQ,CACJrN,WAGP4J,MACG,OAAUzK,UACN,OAAKA,GAIiB,QAAlBK,IAAM7B,OAAOsC,aAAK,eAAEoF,QACbtH,KAAKM,YAAY2B,MAAM0V,YAAYvW,EAAMxB,QAAQiM,MACpD,OAAItJ,IACA,MAAME,EAASF,EAAIoV,YACnB,OAAQlV,EAAO+N,gBACN,QACD,YAAKwG,aAAavU,GAAQW,YAC1BpD,KAAKyQ,oBAAoBmF,SAAQ,OAAE,kCAC5BxU,MACN,6BACA,4BACA,yBACA,gCACA,+BAED,YADApB,KAAKyQ,oBAAoBC,MAAMjO,EAAOsM,aAM/C,CAAC3N,MAvBD+V,WAAG,MA0BlB,OAAU/V,GACDA,EAGDA,EAAMqM,OAAOvL,MAAMoF,OACZtH,KAAKM,YAAY2B,MACnByV,YAAYtW,EAAMqM,QAClB5B,MAAK,OAAIpK,GAAOA,EAAIiW,cAElB,MAAC,IAPD,aAAG,KAWrBtU,UAAUhC,IACP,GAAIA,EACA,OAAQA,EAAOoP,gBACN,SACDxQ,KAAKgX,aAAa5V,GAAQgC,YACL,WAAjBhC,EAAOmE,MACPvF,KAAKyQ,oBAAoBC,SAAMpP,KAAE,8BAEjCtB,KAAKyQ,oBAAoBmF,WAAQtU,KAAE,+BAEvC,UACC,2BACA,2BACA,gCACA,4BACA,6BACDtB,KAAKyQ,oBAAoBC,MAAMtP,EAAO2N,YAOtDiI,aAAajX,GAEjB,OADAC,KAAKmV,aAAanK,OACdjL,EACOC,KAAKM,YAAY2B,MAAMgU,SAASjW,KAAKmC,IAAIgB,WAEzCgU,WAAG,GAIRe,cAAcnY,4CAzkBfoY,IAAoBxY,6HAApBwY,GAAoBnX,m/CD9CjCrB,sDAiGAA,kDAjGiBA,mCAiGXA,wYE9FMyY,uECHgBzY,8GAWpBA,oBAIIA,mCAEJA,6CAJIA,mBAEAA,mIARZA,eAAiC,yBAAjCA,CAAiC,WAEtBA,8BAA2CA,QAClDA,oBAAiCA,8EAC7BA,2BAOJA,UAEAA,mBAAiCA,8BAAoDA,QACrFA,uBAAUA,yEAAgEA,kCAZnEA,qDAC0BA,4CAELA,2CAQKA,8DACvBA,iFAGVA,qBAAkCA,iDAASC,WAAUD,8BAAiCA,QACtFA,qBAAsBA,iDAASE,WAC3BF,8BACJA,gCAHqDA,2CACZA,mEACrCA,sDDvBIkQ,QAAmB,KAC3BA,qBACAA,yBACAA,uCACAA,uBA6BG,SAWCwI,sBACA,OAAOrY,KAAKiC,MAAM0U,aAAe3W,KAAKsY,qBAG1ClY,WACIJ,KAAKuY,WAAavY,KAAKwY,iBAAiBnF,MAAQ,GAGpDzT,SACII,KAAKc,YAAY,CACbmW,OAAQmB,EAAoBK,SAIpC5Y,SACQ,EAAIG,KAAKqY,gBACTrY,KAAKc,YAAY,CACbmW,OAAQmB,EAAoBM,UAE7B1Y,KAASqY,gBAAkB,EAC9BrY,KAAKc,YAAY,CACbmW,OAAQmB,EAAoBO,OAE5BC,gBAAiB5Y,KAAKkO,gBAAiB/L,GACvCoW,WAAYvY,KAAKuY,aAGrBvY,KAAKc,YAAY,CACbmW,OAAQmB,EAAoBS,yDAvC/BC,iCAAgC9X,ogBCpC7CrB,gCACAA,6BAEAA,gBACIA,8BACAA,kBAAQA,mCAA0DA,UAEtEA,yBAgBAA,uCAtBiBA,gCAAe,iDAG5BA,0EACQA,kEAENA,4QCPNA,0BAAiD,gBAAjDA,CAAiD,WAGrCA,8CACAA,mCACJA,UAGJA,wBAAc,cACwBA,8DAASoZ,4BACvCpZ,8BACJA,6CARqBA,8CACMA,gCAMvBA,uFAgBYA,cAAyCA,8BAAwCA,eAAxCA,6EAYrCA,0EAEIA,gHAyBJA,SACIA,uCAMJA,8DALQA,gCAA2B,4EAA3BA,CAA2B,yCAHvCA,iBACIA,kCAQJA,+BAR0CA,4FAlC9CA,iBAKC,WAEOA,yBAIJA,QACAA,iBAA8BA,SAA8BA,QAC5DA,iBAA6BA,SAA6BA,QAC1DA,iBACIA,mCACAA,yCACIA,qCACJA,UAEJA,kBAAkC,eAK1BA,4DAASA,EAAT+G,OAASsS,uCAJbrZ,QAMAA,gCAA+E,8BAKnFA,QACAA,yBAUAA,kBACIA,qCACAA,yCACIA,qCACJA,iEA5CJA,qCAA0C,gCAKjCA,uCAIqBA,sCACDA,qCAEzBA,sEACuBA,uDACnBA,gEAOAA,mCAGcA,yBAAa,uBAE3BA,yBAAa,sBAIhBA,sDAWDA,uEACuBA,uDACnBA,2FASJA,0EAEIA,+EAuBJA,SACIA,uCAMJA,8DALQA,gCAA2B,0EAA3BA,CAA2B,yCAHvCA,iBACIA,kCAQJA,+BAR0CA,4FA9B9CA,iBAGC,WAEOA,yBAIJA,QACAA,iBAA8BA,SAAkCA,QAChEA,iBAA6BA,SAAmBA,QAChDA,iBACIA,mCACAA,yCACIA,qCACJA,UAEJA,kBAAkC,eAK1BA,4DAASA,EAAT+G,OAASuS,4CAJbtZ,QAMAA,sBAA4BA,uDAASA,EAAT+G,OAASwS,qBACjCvZ,wBACJA,UAEJA,yBAUAA,kBACIA,+BAIAA,yCACIA,+BAIJA,iEA3CKA,sCAIqBA,qCACDA,sBAEzBA,kEACuBA,uDACnBA,4DAOAA,mCAOHA,sDAWDA,kFAIuBA,uDACnBA,kGAYRA,wCALJA,iBAAiE,WACdA,SAA2BA,QAC1EA,iBAA6BA,SAAmBA,QAChDA,iBAA8B,QAE9BA,uBACAA,iBACIA,oCACAA,yCACIA,qCACJA,+DAT2CA,8BAClBA,sBAGxBA,sDAEDA,kEACuBA,sDACnBA,mFAiBRA,wCAEIA,SACIA,mCACAA,uCACIA,mCACJA,QACJA,6CAJIA,iEACuBA,qDACnBA,oGAlBhBA,iBAGC,WAEOA,SACAA,qBAA4BA,uDAASA,EAAT+G,OAASyS,qBACjCxZ,uBACJA,UAEJA,iBAA6BA,SAAmBA,QAChDA,iBAA8B,QAE9BA,uBACAA,kBACIA,mCAMJA,iDAhBIA,sCAKyBA,sBAGxBA,sDAEcA,sEAYnBA,wCAmBIA,+DAEIA,kEAHRA,kBACIA,yBAKAA,eAAK,eACmBA,SAA+CA,QACnEA,iBAAOA,SAAgCA,QACvCA,eACIA,mCAIJA,kDAZCA,6DAKmBA,4DACbA,6CAEHA,8HAOZA,SACIA,uCAOJA,6CANQA,qDAAoC,gBAApCA,CAAoC,kDAApCA,CAAoC,wDAtBhDA,iCAAsC,qCACQA,wFAC1CA,QACAA,0BAiBAA,kCASAA,qBAGIA,0DAAS4C,6CAET5C,8BACJA,mCAhCMA,gDAiBgCA,kDAWlCA,wFAGAA,wFAqBIA,oBAAUA,SAAeA,QAAYA,8BAA3BA,uBAA2BA,mEAfjDA,iCAAsC,mCAc9BA,iCAGJA,iCAfIA,2DAAuC,YAAvCA,CAAuC,cAAvCA,CAAuC,kBAAvCA,CAAuC,kBAAvCA,CAAuC,+BAAvCA,CAAuC,mHAqB/CA,iCAAsC,aACAA,2DAAU4C,wCACxC5C,kDACKA,oBACHA,QACFA,kDACKA,oBACHA,QACFA,kDACKA,kCAKJA,QACDA,oDAMKA,qBAKHA,QACFA,oDACKA,iCACIA,qBAK+BA,UAExCA,oDACKA,qBACHA,QACFA,sBAQIA,gCACJA,2DA/CEA,4CACcA,yDAGAA,wDAGAA,mDAERA,8CAMJA,wIAWYA,sDASAA,6DAKZA,wIAMAA,sFAOZA,iCACIA,gDAKJA,+BAJQA,kDAAiC,sDAAjCA,CAAiC,iEAQzCA,iCACIA,gDAKJA,+BAJQA,iDAAgC,sDAAhCA,CAAgC,uGAepCA,cACIA,8BAIJA,+BAJIA,sLAKJA,cACIA,8BAIJA,+BAJIA,yMAKJA,cACIA,8BAIJA,+BAJIA,4LAKJA,cACIA,8BACJA,eADIA,0GAEJA,cACIA,8BACJA,eADIA,2HAnV5BA,eAAsC,UAAtCA,CAAsC,UAAtCA,CAAsC,YAAtCA,CAAsC,UAAtCA,CAAsC,QAMdA,cACAA,cAAIA,8BAAsCA,QAC1CA,eAAIA,gCAAqCA,QACzCA,eAAIA,gCAAoCA,QACxCA,eAAIA,gCAAkCA,QACtCA,wBACAA,eAAIA,gCAA+BA,YAG3CA,kBACIA,0BAkDAA,0BAoDAA,2BAaAA,0BAuBAA,kBAAqB,YACiBA,gCAAkCA,QACpEA,kBAA6BA,UAAkDA,QAC/EA,kBACAA,wBACAA,kBACIA,qCACAA,yCACIA,qCACJA,gBAMhBA,kBAAgBA,gCAAuCA,QACvDA,0BAAe,yBAAfA,CAAe,0BAEcA,gCAA2CA,QAChEA,4CAqCJA,QACAA,gCAAqB,0BACIA,gCAA0CA,QAC/DA,4CAmBJA,QAEAA,gCAAqB,0BACIA,gCAAuCA,QAC5DA,8CAmDJA,QACAA,gCAAqB,0BACIA,gCAA+CA,QACpEA,4CAOJA,QACAA,gCAAqB,0BACIA,gCAA8CA,QACnEA,4CAOJA,YAGRA,mBAAsC,YAAtCA,CAAsC,aAG1BA,gCACJA,QACAA,mBAAwB,SAEhBA,wBAMAA,wBAMAA,wBAMAA,wBAGAA,wBAGJA,UAEJA,mBAAwB,eACaA,gCAA8BA,QAC/DA,wBAAUA,mEAAoDA,QAC9DA,oCAA+B,eACQA,kFAAnCA,QACAA,kBAAOA,gCAA2DA,YAG1EA,mBAAyB,gBAIjBA,8DAASyZ,sBAETzZ,gCACJA,mDA/VQA,iDACAA,iDACAA,gDACAA,8CACCA,sDACDA,2CAKaA,kCAkDKA,uCAAe,0CAmDGA,uCAelBA,wDAsBYA,8CACLA,8HAExBA,sDAEDA,sEACuBA,uDACnBA,+DAOJA,mDAGaA,uDAwCAA,sDAuBAA,mDAsDAA,2DAUAA,0DAcrBA,kEAISA,iGAMAA,iHAMAA,qGAMAA,mDAGAA,kDAMwBA,0CACvBA,iCAE6BA,gDAC5BA,uEAMPA,kDAGAA,8DCpTjB,iBACK8E,MAgCR3E,YACIC,EACAqB,EACAK,EACQc,EACEE,EACFiC,EACA8C,EACAC,GAERiN,MAAMtT,EAAOrB,EAAQ0B,EAAqBgB,GANlCzC,sBACEA,mBACFA,2BACAA,oBACAA,8BAnCZA,sBAAmB,IAAI4P,KAEvB5P,gBAAa,IAAIC,KAAU,IAC3BD,wBAAqB,IAAIC,KAMzBD,sBAAoC,CAChCqZ,QAAQ,EACR3W,QAAS,GACT4W,SAAU,GACVC,iBAAkB,GAClB9Q,WAAY,GACZ4K,KAAM,GACNmG,sBAAuB,GACvBC,qBAAsB,IAK1BzZ,UAAO,GACPA,0BAAsB,EAEdA,mBAAgB,IAAIkI,IAexBwR,iBACA,MAAM3Z,EAAuBqB,GACJ,gBAArBA,EAAMoP,WAA+BpP,EAAMP,MAAQ,EACvD,OAAQb,KAAKwY,iBAAiBc,UAAY,IACrC9X,IAAIJ,IACD,MAAMK,EAAczB,KAAK2Z,cAAc1Q,IAAI7H,EAAIwY,kBAC/C,GAAInY,EACA,sCACOA,GAAW,CACdoY,MAAO9Z,EAAoB0B,EAAYoY,OACvCC,aAAc/Z,EAAoB0B,EAAYqY,cAC9C1X,SAAUhB,EAAIgB,aAIzBY,OAAOwD,sBAGhBpG,WACIJ,KAAK2U,OACL3U,KAAK+Z,oBAAsB/Z,KAAKiV,qBAAqB,WACrDjV,KAAKwY,iBAAiB9V,QAAU1C,KAAKgV,MAAMgF,SAASC,SAAShR,IAAI,MACjEjJ,KAAKgR,sBAAwBhR,KAAKiV,qBAAqB,aACvDjV,KAAK4U,QAAQ/I,MAAK,QAAU7L,KAAKka,WAAW9W,UAAUrD,mDAC9CA,EAAMoa,YAAY7S,QAClBtH,KAAKoa,mBAAmBC,SAASta,EAAMoa,aAE3Cna,KAAKsa,cAAgB,IAAIra,KAAU,CAC/Bsa,YAAa,IAAIta,KAAY,GAAIA,eACjCua,IAAK,IAAIva,KAAY,IACrB4Z,MAAO,IAAI5Z,KAAY,EAAGA,eAC1Bwa,iBAAkB,IAAIxa,MAAY,GAClCya,QAAS,IAAIza,KAAY,GACzB0a,eAAgB,IAAI1a,KAAY,MAE/BD,KAAK4a,sBACN5a,KAAK4a,oBAAsB,IAAI3a,KAAU,CACrC4a,SAAU,IAAI5a,KAAiC,QAArBmB,IAAM0Z,uBAAe,eAAED,UACjDE,QAAS,IAAI9a,KAAiC,QAArBwB,IAAMqZ,uBAAe,eAAEC,SAChDC,YAAa,IAAI/a,KAAiC,QAArBsC,IAAMuY,uBAAe,eAAEE,aACpDC,YAAa,IAAIhb,KAAiC,QAArBwC,IAAMqY,uBAAe,eAAEG,aACpDC,KAAM,IAAIjb,KAAiC,QAArByE,IAAMoW,uBAAe,eAAEI,MAC7CC,SAAU,IAAIlb,KAAiC,QAArBuH,IAAMsT,uBAAe,eAAEK,UACjDC,WAAY,IAAInb,KAAiC,QAArBwH,IAAMqT,uBAAe,eAAEM,YACnDC,YAAa,IAAIpb,KAAiC,QAArB+I,IAAM8R,uBAAe,eAAEO,aACpDC,YAAa,IAAIrb,KAAiC,QAArByW,IAAMoE,uBAAe,eAAEQ,eAExDtb,KAAKub,gCAAgCvb,KAAK4a,oBAAqB7a,EAAM+a,kBAEpE9a,KAAKwb,qBACNxb,KAAKwb,mBAAqB,IAAIvb,KAAU,CACpC4a,SAAU,IAAI5a,KAAgC,QAApBwb,IAAMC,sBAAc,eAAEb,UAChDE,QAAS,IAAI9a,KAAgC,QAApB0b,IAAMD,sBAAc,eAAEX,SAC/CC,YAAa,IAAI/a,KAAgC,QAApB2b,KAAMF,sBAAc,iBAAEV,aACnDC,YAAa,IAAIhb,KAAgC,QAApB4b,KAAMH,sBAAc,iBAAET,aACnDC,KAAM,IAAIjb,KAAgC,QAApB6b,KAAMJ,sBAAc,iBAAER,MAC5CC,SAAU,IAAIlb,KAAgC,QAApB8b,KAAML,sBAAc,iBAAEP,UAChDC,WAAY,IAAInb,KAAgC,QAApB+b,KAAMN,sBAAc,iBAAEN,YAClDC,YAAa,IAAIpb,KAAgC,QAApBgc,KAAMP,sBAAc,iBAAEL,aACnDC,YAAa,IAAIrb,KAAgC,QAApBic,KAAMR,sBAAc,iBAAEJ,eAEvDtb,KAAKub,gCAAgCvb,KAAKwb,mBAAoBzb,EAAM2b,iBAExE1b,KAAKmc,+BAAiC,IAAIlc,KAAU,IACpD,UAAWmc,MAAQrc,EAAMmC,MAAO,CAC5B,MAAMma,GAAY,IAAIpc,KAAU,IAChC,UAAagG,WAAUjG,KAAKgR,sBACxBqL,GAAUjW,WAAWkW,GAAM,IAAIrc,KAAamc,GAAalW,aAAaoW,MAE1ED,GAAUE,aAAa1Q,MAAK,QAAU7L,KAAKka,WAAW9W,UAAUkZ,KAC5D,IAAIE,GAAYxc,KAAKwY,iBAAiBe,iBAAiB/W,KACnDia,IAAKA,GAAE1Z,cAAgBqZ,GAAKja,IAE3Bqa,KACDA,GAAY,CACRzZ,YAAaqZ,GAAKja,GAClBC,SAAUga,GAAKha,UAEnBpC,KAAKwY,iBAAiBe,iBAAiBpM,KAAKqP,KAE5Cxc,KAAKgR,sBAAsB1J,SAC3BkV,GAAUtW,aAAeoW,MAGjCtc,KAAKmc,+BAA+BhP,KAAKkP,OAGjDrc,KAAK0c,yBAAwBC,MACzB3c,KAAK4c,iBAAiB/Q,MAClB,aACAuJ,KACIrV,GACIC,KAAKM,YAAYuc,UAAUC,cAAc,GAAI,EAAG,CAC5ChL,WAAY,CAAEiL,SAAUhd,KACzBoD,UAEX,OAAI,EAAG0O,gBAEH9R,EAAWY,MAAMa,IAAIJ,IAAM,CAAE6C,KAAM7C,EAAE0Q,WAAakL,cAAe5b,EAAE6E,UAEvE,QAAU,MAGlBjG,KAAKid,6BAA+B,IAAIhd,KAAU,IAClDD,KAAKkd,wBAA0B,IAAIjd,KAAU,IAC7C,UAAWF,KAAeC,KAAKgR,sBAC3BhR,KAAKkd,wBAAwB9W,WAAWrG,EAAYkG,KAAM,IAAIhG,MAElED,KAAKmd,oBAAsBnd,KAAKM,YAAYC,SACvC6c,wBACA3c,UAAUV,GAAUA,EAAOsd,UAAU1c,OACrCkL,QAAKyR,MAAY,IACtBtd,KAAKM,YAAY2B,MACZ+N,gBAAgBhQ,KAAKmC,GAAI,CACtBob,KAAM,EACNrN,KAAM,CACFC,UAAW1L,YAEfzB,OAAQ,CAAEqH,KAAM,CAAE4F,GAAIxL,iCAEzBtB,QAAQC,UAAU,EAAGnB,YAClBjC,KAAKwd,cAAqB,MAALzd,OAAK,EAALA,EAAOqQ,QAAQzP,MAAM,GAAG0P,KAAK1E,OAI9D8J,cACIzV,KAAK0V,UAGTqD,uBAAuBhZ,GACnBC,KAAK6V,uBACAhH,8BAA8B9O,EAAMoC,GAAIpC,EAAM8G,YAC9CzD,UAAUhC,IACPpB,KAAK6U,OAAOC,SAAS,CAAC,MAAO,CAAEC,WAAY/U,KAAKgV,UAI5DyI,oBACI,MAAQnE,WAAUC,mBAAkB9Q,cAAezI,KAAKwY,iBACxD,SACc,MAARzY,OAAQ,EAARA,EAAUuH,YACA,MAAV7F,OAAU,EAAVA,EAAY6F,YACI,MAAhBlG,OAAgB,EAAhBA,EAAkBkG,SACnBtH,KAAK4a,oBAAoB5Q,OAAShK,KAAK4a,oBAAoBzV,OAC3DnF,KAAKwb,mBAAmBxR,OAAShK,KAAKwb,mBAAmBrW,OAC1DnF,KAAKoa,mBAAmBpQ,MAIhC0T,eAAe3d,SACX,SAA+C,QAAtCqB,OAAKoX,iBAAiBe,wBAAgB,eAAE/W,KAC7Cf,GAAKA,EAAEsB,cAAgBhD,EAAKoC,IAAMV,EAAEW,WAAarC,EAAKqC,WAI9D4W,mBAAmBjZ,EAA4CqB,GAC3D,MAAQmY,oBAAqBvZ,KAAKwY,iBAClC,IAAIjW,EAAsB,MAAhBd,OAAgB,EAAhBA,EAAkBe,KAAKC,GAAKA,EAAEM,cAAgBhD,EAAKoC,IACzDI,IAAQnB,IAAarB,EAAKqC,WAGV,MAAhBX,KAAkBkc,OAAuB,MAAhBlc,OAAgB,EAAhBA,EAAkBmc,QAAQrb,GAAM,IAExDA,IACDA,EAAM,CAAEQ,YAAahD,EAAKoC,GAAIC,UAAWhB,GACzB,MAAhBK,KAAkB0L,KAAK5K,IAE3BA,EAAIH,UAAYhB,EAGpB6X,wBAAwBlZ,EAAiBqB,SACrC,MAAMmB,EAAoC,QAA9Bd,OAAK+W,iBAAiBc,gBAAQ,eAAE9W,KAAKC,GAAKA,EAAEmX,mBAAqB7Z,EAAK6Z,kBAC9ErX,IACAA,EAAIH,UAAYhB,GAIxByc,wBAAwB9d,EAAeqB,GACnC,OAAOA,EAAKwY,iBAGhBkE,qBAAqB/d,GACjB,MACS,iBADK,MAANA,OAAM,EAANA,EAAQ+Z,aAAatJ,YAEdzQ,EAAO+Z,aAAajZ,MAEpB,EAInBkd,eAAehe,WACX,IAAKA,EACD,OAEJ,MAAMwC,EAAevC,KAAKgR,sBAAsB1J,OAC1CtH,KAAKkd,wBAAwBrc,WAC7B,EACN,IAAI4B,EAAoC,QAA9BrB,OAAKoX,iBAAiBc,gBAAQ,eAAE9W,KAAKkC,GAC3C1E,KAAKge,qBAAqBtZ,EAAG3E,EAAQwC,IAWzC,GATKE,EAODA,EAAIL,YANJK,EAAM,CAAEmX,iBAAkB7Z,EAAO6Z,iBAAkBxX,SAAU,GACzDG,IACAE,EAAIyD,aAAe3D,GAEO,QAA9Bd,OAAK+W,iBAAiBc,gBAAQ,SAAEnM,KAAK1K,IAIrCF,EAAc,CACd,MAAMmC,EAAY,IAAIzE,KAAU,IAChC,UAAYuH,EAAKC,KAAU5F,OAAOS,QAAQC,GACtCmC,EAAU0B,WAAWoB,EAAK,IAAIvH,KAAYwH,IAE9CzH,KAAKid,6BAA6B9P,KAAKzI,GACvCA,EAAU6X,aAAa1Q,MAAK,QAAU7L,KAAKka,WAAW9W,UAAUoE,IACxD/E,IACAA,EAAIyD,aAAesB,KAI/BxH,KAAKkd,wBAAwB1S,MAAM,IACnCxK,KAAKie,4BAAyB,EAC9Bje,KAAK2Z,cAAczQ,IAAInJ,EAAO6Z,iBAAkB7Z,GAG5Cie,qBACJje,EACAqB,EACAK,GAEA,OACI1B,EAAI6Z,mBAAqBxY,EAAOwY,kBAChCtC,KAAKC,UAAUxX,EAAImG,gBAAkBoR,KAAKC,UAAU9V,GAI5DyX,gBAAgBnZ,GACZC,KAAKwY,iBAAiBc,SAASqE,OAAO5d,EAAO,IACzC,EAAKA,GACLC,KAAKid,6BAA6BiB,SAASne,GAInDoe,mBAAmBpe,GACf,MAAMqB,EAAerB,EAAU0a,iBACzB1a,EAAU8Z,MACVjV,KAAKwZ,MAAMre,EAAU8Z,QAAU,KAAO9Z,EAAU2a,SAAW,IAAM,MAIvE,MAAO,CACHb,MAJU9Z,EAAU0a,iBAClB7V,KAAKwZ,MAAMre,EAAU8Z,QAAU,KAAO9Z,EAAU2a,SAAW,IAAM,MACjE3a,EAAU8Z,MAGZC,gBAIRuE,aAAate,SACuB,QAAhCqB,OAAKoX,iBAAiB/P,kBAAU,SAAE0E,KAAKpN,GACvCC,KAAKsa,cAAc9P,MAAM,CACrBqP,MAAO,EACPY,kBAAkB,EAClBC,QAAS,IAIjBvB,gBAAgBpZ,SACoB,QAAhCqB,OAAKoX,iBAAiB/P,kBAAU,SAAEkV,OAAO5d,EAAO,GAGpDqZ,iBAAiBrZ,SACb,MAAM0B,EAAKI,2DACJ7B,KAAKwY,kBACJxY,KAAKwb,mBAAmBxR,MAAQ,CAAEyP,qBAAsBzZ,KAAKwb,mBAAmB3a,OAAU,IAC1Fb,KAAK4a,oBAAoB5Q,MACvB,CAAEwP,sBAAuBxZ,KAAK4a,oBAAoB/Z,OAClD,IAAG,CACTwY,QAAQ,EACRc,YAAana,KAAKoa,mBAAmBpQ,MAAQhK,KAAKoa,mBAAmBvZ,WAAQ,EAC7EwS,KAAe,QAATjS,OAAKiS,YAAI,QAAI,GACnBiL,QAAS,CACLC,oBAAqBve,KAAKue,uBAG5Bhc,EAAuBxC,EAAM4W,aACnC3W,KAAKM,YAAY2B,MACZuc,YAAY/c,GACZoK,MACG,OAAU,EAAG2S,kBACT,OAAQ/b,EAAY+N,gBACX,QACD,OAAOxQ,KAAKiK,aAAaoF,cAAcyJ,GAAkC,CACrEtJ,KAAM,KACND,UAAU,EACVD,OAAQ,CACJgJ,uBACArW,MAAOQ,EACPuO,sBAAuBhR,KAAKgR,sBAC5BwH,iBAAkB/W,SAGzB,6BACA,4BACA,8BACA,sBACA,kCACA,gCACA,kCACA,2BACA,6BACA,yBACD,YAAKgP,oBAAoBC,MAAMjO,EAAYsM,YACpCoI,OAAG,QAET,eACA,EACD,SAAOA,OAAG,cAEV3Q,eAAY/D,OAGxB,OAAUA,IACN,IAAKA,GAAUA,EAAOwU,SAAWmB,SAE7B,OAAOpY,KAAKM,YAAY2B,MAAMgU,SAASjW,KAAKmC,IAAI1B,UAAU,KAAM,GAC7D,CAEH,MAAMiE,EAAW7C,+BACVJ,GAAK,CACR4X,QAAQ,IAEZ,OAAI5W,EAAOwU,SAAWmB,WAClB1T,EAAY+I,OAAS,CACjBe,UAAW/L,EAAOmW,gBAClBhW,OAAQH,EAAO8V,aAGhBvY,KAAKM,YAAY2B,MAAMuc,YAAY9Z,GAAamH,MACnD,OAAU,EAAG2S,kBACT,GAA+B,UAA3BhX,EAAYgJ,WAAwB,CACpC,MACMxH,EACF,EAFexB,EAAYmP,aAAepU,EAEzB,6BAA+BvC,KAAKwd,cAEzD,OAAOxd,KAAKM,YAAY2B,MACnBqO,kBAAkBvQ,EAAMoC,GAAI6G,GAC5B6C,QAAKkL,OAAM,IAEhB,YAAKtG,oBAAoBC,MAAOlJ,EAA4BuH,SACrDU,WAO9BrM,UAAUX,IACHA,GACAzC,KAAK6U,OAAOC,SAAS,CAAC,OAAQ,CAAEC,WAAY/U,KAAKgV,UAKzDuG,gCACJxb,EACAqB,SAEA,GAAIA,GAAWpB,KAAK+Z,oBAAoBzS,OAAQ,CAC5C,MAAM/E,EAA+B,IAAItC,KAAU,IACnD,UAAWwC,KAAkBzC,KAAK+Z,oBAAqB,CACnD,MAAMrV,EAAOjC,EAAewD,KACtBuB,EAAqC,QAA7B/F,EAACL,EAAgB8E,oBAAY,eAAGxB,GAC9CnC,EAA6B6D,WAAW1B,EAAM,IAAIzE,KAAYuH,IAElEzH,EAAgBqG,WAAW,eAAgB7D,IAIzC2V,cAAcnY,EAA6BqB,4CAxa5Cqd,IAAoB9e,6HAApB8e,GAAoBzd,wwFDhEjCrB,qDAeAA,kDAfiBA,mCAeXA,kvEEXUA,qBAIIA,2DAASA,EAAT+G,OAASgY,6BAET/e,8BACJA,mDAJIA,gCAGAA,qFAPRA,kBACIA,4BAQAA,qBAGIA,iDAAS+e,mBAAmB,YAE5B/e,8BACAA,uBACJA,2CAbuBA,0CAQnBA,2CAGAA,oFAyB+CA,sJAEvCA,mBAA8BA,wDAAuCA,QACrEA,mBAAkCA,kEAAS8C,KAAgC9C,gBAACA,+BAD9CA,uJAgDlDA,iBAA8BA,SAAgBA,QAC9CA,iBACIA,iCACJA,QACAA,iBACIA,oCACJA,QACAA,iBAA8BA,mCAA6DA,QAC3FA,iBAA8BA,8BAA+BA,QAC7DA,kBAA8BA,iCAAgDA,QAC9EA,kBAA8BA,UAA6BA,QAC3DA,kBACIA,0DAKJA,uCAjB8BA,uBAENA,sCAGGA,gCAEGA,yDACAA,yCACAA,sDACAA,sCAItBA,mDAAmC,qECtE5C,iBACK8E,MA6CR3E,YACYC,EACAqB,EACAK,EACRc,EACAE,GAEAiS,MAAMnS,EAAQE,GANNzC,2BACAA,mBACAA,2BA7CZA,mBAAgB,IAAIC,KAAY,IAChCD,4BAAyB,IAAIC,KAAY,IACzCD,2BAAwB,IAAIC,KAAY,IAExCD,iBAAcA,KAAK2F,oBAAoB2H,wBAAwB9L,IAAIgG,GAAQA,EAAKvB,MAChFjG,mBAAgC,CAC5B,CACIiG,KAAM,OACNqE,SAAOhJ,KAAE,4BACTgQ,OAAQ,CACJxO,QAAQ,EACRoK,OAAQlN,KAAK2e,YAAY3b,OACrBwE,GAAW,cAANA,GAA2B,cAANA,GAA2B,YAANA,KAI3D,CACIvB,KAAM,UACNqE,SAAOhJ,KAAE,+BACTgQ,OAAQ,CACJxO,QAAQ,EACRoK,OAAQ,CAAC,aAGjB,CACIjH,KAAM,YACNqE,SAAOhJ,KAAE,iCACTgQ,OAAQ,CACJxO,QAAQ,EACRoK,OAAQ,CAAC,YAAa,eAG9B,CACIjH,KAAM,SACNqE,SAAOhJ,KAAE,8BACTgQ,OAAQ,CACJxO,QAAQ,KAchB4R,MAAMkK,WAEF,CAACpX,EAAMC,IAASzH,KAAKM,YAAY2B,MAAM4c,UAAU,CAAEtB,OAAMuB,SAAQC,yBACjEvX,GAAQA,EAAKwX,OAEb,CAACxX,EAAMC,IACHzH,KAAKif,mBACDzX,EACAC,EACAzH,KAAKkf,cAAcre,MACnBb,KAAKgV,MAAMgF,SAASmF,cAAclW,IAAI,WAAa,SAG/D,MAAMvE,EAAc1E,KAAKof,oBAAoBnW,IAAI,8BAC7CvE,GACA1E,KAAKqf,cAAc3a,EAAa,CAAE4a,YAAY,IAItDlf,iBACIsU,MAAMtU,WACNJ,KAAKuf,cAAgBvf,KAAKgV,MAAMmK,cAActT,QAC1C0J,KAAIhT,GAAOA,EAAI0G,IAAI,WAAa,WAChCuW,SAEJ,MAAMpe,KAAeqe,MAAMzf,KAAKkf,cAAc3C,cAAc1Q,MACxD,QAAOtJ,GAAS,EAAIA,EAAM+E,QAA2B,IAAjB/E,EAAM+E,WAC1CqF,MAAa,OAEjB,QAAMvL,EAAcpB,KAAKgV,MAAMmK,eAC1BtT,MAAK,QAAU7L,KAAKka,WACpB9W,UAAUb,IACPvC,KAAK0f,YAGb,MAAMje,EAAgBzB,KAAKgV,MAAMgF,SAASmF,cAC1Cnf,KAAK2f,iBAAmB,IAAI1f,KAAU,CAClCiN,OAAQ,IAAIjN,KAA0C,QAA9BF,IAAc6f,OAAO,iBAAS,QAAI,IAC1DC,cAAe,IAAI5f,KAAYwB,EAAcwH,IAAI,kBACjD6W,YAAa,IAAI7f,KAAYwB,EAAcwH,IAAI,kBAIvDyV,mBAAmB3e,SACf,MAAM0B,EAA8E,QAA1DL,OAAKge,oBAAoBnW,IAAI,qCAA6B,QAAI,GAElFxG,EAAyB,WAAf1C,EAA0B0B,EADf,CAAEyL,YAAQ,EAAW2S,mBAAe,EAAWC,iBAAa,GAEvF9f,KAAKqf,cAAaxd,eAEVmB,OAAQjD,EACRggB,KAAM,GACHtd,GAEP,CAAE6c,YAAY,IAItBU,qBACI,MAAMjgB,EAAYC,KAAK2f,iBAAiB9e,MAClCO,EAAgB,CAClB8L,OAAQnN,EAAUmN,OAClB2S,cAAe9f,EAAU8f,cACzBC,YAAa/f,EAAU+f,aAE3B9f,KAAKqf,cAAaxd,eACdmB,OAAQ,UACL5B,IAEPpB,KAAK2f,iBAAiB7V,iBACtB9J,KAAKof,oBAAoBlW,IAAI,6BAA8B9H,GAGvD6d,mBAEJlf,EACAqB,EACAK,EACAc,SAEA,MAAMmC,EAAe1E,KAAKigB,cAAczd,KAAKwG,GAAKA,EAAE/C,OAAS1D,GAE7D,IAAIiF,EAAc,GACdC,EAAkChD,UACtC,GAAIC,EACkC,MAA9BA,EAAa4M,OAAOxO,SACpB0E,EAAO1E,OAAS,CACZmN,GAAIvL,EAAa4M,OAAOxO,SAG5B4B,EAAa4M,OAAOpE,SACpB1F,EAAOjC,MAAQ,CACX2a,GAAIxb,EAAa4M,OAAOpE,iBAGF,WAAvB3K,EAAiC,CACxC,MAAMyG,EAAchJ,KAAKgV,MAAMgF,SAASmF,cAClCzI,EAAqC,QAA5BjU,IAAYmd,OAAO,iBAAS,QAAI,GACzCnE,EAAgBzS,EAAYC,IAAI,iBAChC0S,EAAc3S,EAAYC,IAAI,eAChCyN,EAAOpP,SACPE,EAAOjC,MAAQ,CACX2a,GAAIxJ,IAGZ+E,GAAqBE,EACjBnU,EAAO2Y,cAAgB,CACnBC,QAAS,CACLC,MAAO5E,EACP6E,IAAK3E,IAGNF,EACPjU,EAAO2Y,cAAgB,CACnBI,MAAO9E,GAEJE,IACPnU,EAAO2Y,cAAgB,CACnBK,OAAQ7E,IAIpB,OAAIla,IACA+F,EAAS,CACLiZ,iBAAkB,CACd1D,SAAUtb,GAEdtB,cAAe,CACX4c,SAAUtb,GAEdwC,KAAM,CACF8Y,SAAUtb,IAGlBgG,EAAiBhD,UAEd,CACH6Z,QAAS,CACLQ,OACAvB,OACAva,OAAMnB,iBACQ,MAAN2F,IAAU,IAElB0I,KAAM,CACFwQ,UAAWjc,YAEfkc,mBAKZ5O,iBAAiBhS,GACb,OAAIA,EAAMmE,cAAcoD,OACbvH,EAAMmE,cAAc1C,IAAIJ,GAAgBA,EAAayC,eAAeoC,MAAM+L,KAAK,MAE/E,2CAhNN4O,IAAkBjhB,0FAAlBihB,GAAkB5f,gkCDpC/BrB,0BAAgB,gBAAhBA,CAAgB,WAGJA,yCAkBAA,wCAOJA,QACAA,kCACIA,kBAAqC,WAArCA,CAAqC,wCAYzBA,iCACAA,iCAIJA,QACAA,qBAGIA,gCAASyB,yBAETzB,gCACAA,wBACJA,UAEJA,mBAAkB,SAAlBA,CAAkB,YAEHA,gCAAyCA,QAChDA,mCACJA,QACAA,gBAAK,YACMA,gCAAuCA,QAC9CA,mCACJA,gBAKhBA,yBACIA,oCACJA,UAGJA,8BAKIA,sCAAcyB,oBAAdzB,CAAoC,wCACdyB,+FAEtBzB,0BAAeA,gCAA+BA,QAC9CA,0BAAeA,gCAAkCA,QACjDA,0BAAeA,gCAA+BA,QAC9CA,0BAAeA,gCAA+BA,QAC9CA,0BAAeA,gCAAqCA,QACpDA,0BAAeA,gCAAmCA,QAClDA,0BAAeA,gCAAkCA,QACjDA,0BACAA,iCAoBJA,eA5GwDA,mDAqBxCA,8CAA6B,2DAKTA,kEAClBA,+CAGMA,sCAAqB,YAArBA,CAAqB,cAArBA,CAAqB,8CAArBA,CAAqB,eAArBA,CAAqB,iBAiBrBA,uDAGAA,2DAMOA,qDAIAA,mDAa3BA,8CAAwB,4CAAxBA,CAAwB,wCAAxBA,CAAwB,2CAOTA,2CACAA,8CACAA,2CACAA,2CACAA,iDACAA,+CACAA,ogCE/EZ,gBAA4B8E,MAC/B3E,YAAYC,EAAgBqB,GACxBsT,MACI3U,EACA,CACIyQ,WAAY,QACZrO,GAAI,GACJ8B,KAAM,GACNkM,UAAW,GACXuQ,UAAW,GACXG,MAAO,GAEXpf,GAAML,EAAYa,MAAMgU,SAASxU,GAAI4T,UAAU9S,GAAQA,EAAKN,+CAZ3D6e,GAAanhB,qDAAbmhB,EAAajQ,QAAbiQ,EAAa,qBAFV,SCQT,MAAMC,GAAuB,CAChC,CACIC,KAAM,GACNC,UAAWL,GACXvQ,KAAM,CACF6Q,cAAY5f,KAAE,uBAGtB,CACI0f,KAAM,MACNC,UAAW9I,GACXgJ,WAAS1c,OAAkBqc,GAC3BM,cAAe,CAAC3c,OAChB4L,KAAM,CACF6Q,WAAYG,KAGpB,CACIL,KAAM,aACNC,UAAWxC,GACX0C,WAAS1c,OAAkBqc,GAE3BzQ,KAAM,CACF6Q,WAAYI,MAKjB,YAAyBzR,EAAW9P,GACvC,SAAO0E,OAAsC,CACzCsR,OAAQlG,EAAKkG,OACb5T,GAAIpC,EAAOoC,GACXof,cAAe,oBACfzO,QAAS1R,GAASA,EAAM6C,KACxB+Q,MAAO,KAIR,YAAkCnF,EAAW9P,GAChD,OAAOshB,GAAgBxR,EAAM9P,GAAQ8L,MACjC,OAAKzK,IACD,MAAMK,EAAsBL,EAAYogB,QACxC,SAAoB,GAAGC,KAAK,GAAK,MACjChgB,EAAoB,GAAGggB,KAAK,GAAK,YAC1BhgB,EAAoBigB,OAAO,CAAEpX,OAAO,OAAE,wBAAyBmX,KAAM,CAAC,SCOlF,iDAAME,gEAhCA,CAACld,MAAc8G,cAAsBwV","names":["e","cancel","submit","constructor","n","this","a","method","transactionId","ngOnInit","paymentMethods$","dataService","settings","getPaymentMethods","mapSingle","paymentMethods","items","form","value","resolveWith","V","selectors","checkIfAllSelected","radioChanged","select","t","cancellationReasons","_","reasons","map","o","i18nService","translate","selectionCount","Object","values","lineQuantities","reduce","order","lines","id","quantity","cancelAll","entries","i","find","l","orderId","getLineInputs","reason","cancelShipping","active","orderLineId","filter","B","getGlobalSettings","single$","subscribe","globalSettings","fulfillmentQuantities","getFulfillableCount","trackInventory","fulfillCount","max","changeDetector","markForCheck","shippingMethod","getShippingMethodOperations","fulfillmentHandlers","fulfillmentHandlerDef","code","shippingLines","fulfillmentHandlerCode","fulfillmentHandler","fulfillmentHandlerControl","patchValue","stockOnHand","productVariant","u","c","getUnfulfilledCount","Math","min","fulfillments","summary","flat","orderLine","canSubmit","valid","handler","W","chipColorType","state","X","L","customFieldConfig","serverConfigService","getCustomFieldsFor","ngOnChanges","buildCustomFieldsFormGroup","fulfillment","fulfillmentId","name","customFields","customFieldFormGroup","addControl","customFieldIsObject","Array","isArray","U","Q","oxw","transitionState","nextSuggestedState","nextStates","includes","nextOtherStates","z","line","fulfilledCount","getDeliveredCount","fulfillmentStatus","getFulfillmentStatus","length","getFulfillments","d","g","count","Y","getRefundedCount","payments","refunds","refundId","cancelled","I","Map","added","removed","getModifiedLines","addedItems","removedItems","getSurcharge","surcharges","getAddedItems","getRemovedItems","modification","orderItems","getOrderLineAndItem","item","x","get","set","ee","onUpdateClick","onCancelClick","customFieldForm","formBuilder","group","customFieldsConfig","control","customFieldValues","updateClick","emit","markAsPristine","editable","dirty","modalService","dialog","title","buttons","type","label","returnValue","reset","te","qe","Ie","isCancellable","node","to","active$","next","getPos","elementRef","nativeElement","getBoundingClientRect","querySelector","height","y","index","getStyle","R","from","asObservable","pipe","rn","activeTarget$","abs","sqrt","transform","onMouseOver","onMouseOut","ne","outerHeight","nodes","setActiveState$","initialState","activeState$","Ve","populateNodes","ngAfterViewInit","setTimeout","populateEdges","getNodeFor","nodeComponents","states","push","edges","re","getOrderProcessStates","oe","refundTotal","refund","proratedUnitPriceWithTax","refundShipping","shippingWithTax","adjustment","settledPaymentsTotal","settledPayments","amount","lineCanBeRefundedOrCancelled","selectedPayment","handleZeroQuantity","isRefunding","isCancelling","getOrderLineInput","shipping","paymentId","ie","le","selectedState","ae","transitionToPreModifyingState","getPreModifyingState","message","cancellable","retry","transitionToStateOrThrow","Ln","manuallyTransitionToState","fromComponent","locals","closable","size","j","Error","We","Ae","r","qn","Fn","getOrderHistory","eq","sort","createdAt","history","data","transitionToState","transitionOrderToState","__typename","notificationService","error","transitionError","w","factory","visibleOrderLineCustomFields","orderLineCustomFieldsVisible","orderLineCustomFields","showElided","getLineCustomFields","toggleOrderLineCustomFields","getLineDiscounts","discounts","config","formGroup","customFieldsForLine","getPromotionLink","adjustmentSource","split","getCouponCodeForAdjustment","promotions","couponCode","getShippingNames","join","H","$","updateNote","deleteNote","getDisplayType","getTimelineIcon","isFeatured","getFulfillment","getPayment","getCancelledItems","orderItemIds","getModification","modifications","getName","administrator","firstName","lastName","customer","addNoteToOrder","addNote","note","isPublic","noteIsPrivate","ce","de","settleRefund","se","refundHasMetadata","keys","metadata","payment","addManualPayment","transitionToModifying","cancelOrRefund","ue","openStateDiagram","fulfillOrder","settlePayment","transitionPaymentState","transitionFulfillment","updateCustomFields","super","init","entity$","router","navigate","relativeTo","route","getCustomFieldConfig","history$","fetchHistory","h","mapStream","nextStates$","F","defaultStates","ngOnDestroy","destroy","activeState","success","orderTransitionService","updateOrderCustomFields","entity","getOrderAddressLines","getOrder","cancelPayment","paymentErrorMessage","transitionPaymentToState","canAddFulfillment","hasUnsettledModifications","outstandingPaymentAmount","isSettled","getOutstandingModificationAmount","P","totalWithTax","outstandingAmount","currencyCode","addManualPaymentToOrder","Le","refetchOrder","result","createFulfillment","q","addFulfillmentToOrder","fulfillmentHandlerError","JSON","stringify","transitionFulfillmentToState","orderHasSettledPayments","refundOrder","cancelOrder","displayPrivacyControls","updateOrderNote","noteId","isPrivate","body","deleteOrderNote","setFormValues","pe","b","priceDifference","originalTotalWithTax","refundNote","modifyOrderInput","Cancel","Payment","Refund","refundPaymentId","PriceUnchanged","me","transitionToPriorState","updateLineQuantity","updateAddedItemQuantity","removeAddedItem","removeSurcharge","previewAndModify","dryRun","addItems","adjustOrderLines","updateShippingAddress","updateBillingAddress","addedLines","addedVariants","productVariantId","price","priceWithTax","addressCustomFields","snapshot","paramMap","destroy$","couponCodes","couponCodesControl","setValue","surchargeForm","description","sku","priceIncludesTax","taxRate","taxDescription","shippingAddressForm","fullName","shippingAddress","company","streetLine1","streetLine2","city","province","postalCode","countryCode","phoneNumber","addAddressCustomFieldsFormGroup","billingAddressForm","S","billingAddress","N","Pe","Se","Ne","Je","Ue","Qe","De","orderLineCustomFieldsFormArray","Ze","ke","Oe","valueChanges","be","si","availableCouponCodes$","so","couponCodeInput$","promotion","getPromotions","contains","promotionName","addItemCustomFieldsFormArray","addItemCustomFieldsForm","availableCountries$","getAvailableCountries","countries","uo","take","previousState","canPreviewChanges","isLineModified","splice","indexOf","trackByProductVariantId","getSelectedItemPrice","addItemToOrder","isMatchingAddItemRow","addItemSelectedVariant","removeAt","getSurchargePrices","round","addSurcharge","options","recalculateShipping","modifyOrder","_e","selectFilterPreset","orderStates","setQueryFn","getOrders","skip","refetchOnChannelChange","orders","createQueryOptions","searchControl","queryParamMap","localStorageService","setQueryParam","replaceUrl","activePreset$","nt","ot","refresh","customFilterForm","getAll","placedAtStart","placedAtEnd","page","applyCustomFilters","filterPresets","in","orderPlacedAt","between","start","end","after","before","customerLastName","updatedAt","filterOperator","ge","total","M","it","path","component","breadcrumb","resolve","canDeactivate","Me","lt","breadcrumbKey","slice","link","concat","fe"],"sources":["./src/lib/order/src/components/add-manual-payment-dialog/add-manual-payment-dialog.component.html","./src/lib/order/src/components/add-manual-payment-dialog/add-manual-payment-dialog.component.ts","./src/lib/order/src/components/cancel-order-dialog/cancel-order-dialog.component.html","./src/lib/order/src/components/cancel-order-dialog/cancel-order-dialog.component.ts","./src/lib/order/src/components/fulfill-order-dialog/fulfill-order-dialog.component.html","./src/lib/order/src/components/fulfill-order-dialog/fulfill-order-dialog.component.ts","./src/lib/order/src/components/fulfillment-state-label/fulfillment-state-label.component.html","./src/lib/order/src/components/fulfillment-state-label/fulfillment-state-label.component.ts","./src/lib/order/src/components/simple-item-list/simple-item-list.component.html","./src/lib/order/src/components/simple-item-list/simple-item-list.component.ts","./src/lib/order/src/components/fulfillment-detail/fulfillment-detail.component.html","./src/lib/order/src/components/fulfillment-detail/fulfillment-detail.component.ts","./src/lib/order/src/components/fulfillment-card/fulfillment-card.component.html","./src/lib/order/src/components/fulfillment-card/fulfillment-card.component.ts","./src/lib/order/src/components/line-fulfillment/line-fulfillment.component.html","./src/lib/order/src/components/line-fulfillment/line-fulfillment.component.ts","./src/lib/order/src/components/line-refunds/line-refunds.component.html","./src/lib/order/src/components/line-refunds/line-refunds.component.ts","./src/lib/order/src/components/modification-detail/modification-detail.component.html","./src/lib/order/src/components/modification-detail/modification-detail.component.ts","./src/lib/order/src/components/order-custom-fields-card/order-custom-fields-card.component.html","./src/lib/order/src/components/order-custom-fields-card/order-custom-fields-card.component.ts","./src/lib/order/src/components/order-process-graph/constants.ts","./src/lib/order/src/components/order-process-graph/order-process-node.component.html","./src/lib/order/src/components/order-process-graph/order-process-node.component.ts","./src/lib/order/src/components/order-process-graph/order-process-edge.component.ts","./src/lib/order/src/components/order-process-graph/order-process-graph.component.html","./src/lib/order/src/components/order-process-graph/order-process-edge.component.html","./src/lib/order/src/components/order-process-graph/order-process-graph.component.ts","./src/lib/order/src/components/order-process-graph-dialog/order-process-graph-dialog.component.html","./src/lib/order/src/components/order-process-graph-dialog/order-process-graph-dialog.component.ts","./src/lib/order/src/components/refund-order-dialog/refund-order-dialog.component.html","./src/lib/order/src/components/refund-order-dialog/refund-order-dialog.component.ts","./src/lib/order/src/components/settle-refund-dialog/settle-refund-dialog.component.html","./src/lib/order/src/components/settle-refund-dialog/settle-refund-dialog.component.ts","./src/lib/order/src/components/order-state-select-dialog/order-state-select-dialog.component.html","./src/lib/order/src/components/order-state-select-dialog/order-state-select-dialog.component.ts","./src/lib/order/src/providers/order-transition.service.ts","./node_modules/@angular-devkit/build-angular/src/babel/webpack-loader.js","./src/lib/order/src/components/order-table/order-table.component.html","./src/lib/order/src/components/order-table/order-table.component.ts","./src/lib/order/src/components/payment-detail/payment-detail.component.html","./src/lib/order/src/components/payment-detail/payment-detail.component.ts","./src/lib/order/src/components/order-history/order-history.component.html","./src/lib/order/src/components/order-history/order-history.component.ts","./src/lib/order/src/components/payment-state-label/payment-state-label.component.html","./src/lib/order/src/components/payment-state-label/payment-state-label.component.ts","./src/lib/order/src/components/refund-state-label/refund-state-label.component.html","./src/lib/order/src/components/refund-state-label/refund-state-label.component.ts","./src/lib/order/src/components/order-payment-card/order-payment-card.component.html","./src/lib/order/src/components/order-payment-card/order-payment-card.component.ts","./src/lib/order/src/components/order-detail/order-detail.component.html","./src/lib/order/src/components/order-detail/order-detail.component.ts","./src/lib/order/src/components/order-edits-preview-dialog/order-edits-preview-dialog.component.ts","./src/lib/order/src/components/order-edits-preview-dialog/order-edits-preview-dialog.component.html","./src/lib/order/src/components/order-editor/order-editor.component.html","./src/lib/order/src/components/order-editor/order-editor.component.ts","./src/lib/order/src/components/order-list/order-list.component.html","./src/lib/order/src/components/order-list/order-list.component.ts","./src/lib/order/src/providers/routing/order-resolver.ts","./src/lib/order/src/order.routes.ts","./src/lib/order/src/order.module.ts"],"sourcesContent":["<ng-template vdrDialogTitle>{{ 'order.add-payment-to-order' | translate }}</ng-template>\r\n<form [formGroup]=\"form\">\r\n <vdr-form-field [label]=\"'order.payment-method' | translate\" for=\"method\">\r\n <ng-select\r\n [items]=\"paymentMethods$ | async\"\r\n bindLabel=\"code\"\r\n autofocus\r\n bindValue=\"code\"\r\n [addTag]=\"true\"\r\n formControlName=\"method\"\r\n ></ng-select>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'order.transaction-id' | translate\" for=\"transactionId\">\r\n <input id=\"transactionId\" type=\"text\" formControlName=\"transactionId\" />\r\n </vdr-form-field>\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)=\"submit()\" class=\"btn btn-primary\" [disabled]=\"form.invalid || form.pristine\">\r\n {{ 'order.add-payment' | translate }} ({{ outstandingAmount | localeCurrency: currencyCode }})\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport {\r\n CurrencyCode,\r\n DataService,\r\n Dialog,\r\n GetPaymentMethodListQuery,\r\n ItemOf,\r\n ManualPaymentInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vdr-add-manual-payment-dialog',\r\n templateUrl: './add-manual-payment-dialog.component.html',\r\n styleUrls: ['./add-manual-payment-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AddManualPaymentDialogComponent implements OnInit, Dialog<Omit<ManualPaymentInput, 'orderId'>> {\r\n // populated by ModalService call\r\n outstandingAmount: number;\r\n currencyCode: CurrencyCode;\r\n\r\n resolveWith: (result?: Omit<ManualPaymentInput, 'orderId'>) => void;\r\n form = new FormGroup({\r\n method: new FormControl('', Validators.required),\r\n transactionId: new FormControl('', Validators.required),\r\n });\r\n paymentMethods$: Observable<Array<ItemOf<GetPaymentMethodListQuery, 'paymentMethods'>>>;\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit(): void {\r\n this.paymentMethods$ = this.dataService.settings\r\n .getPaymentMethods(999)\r\n .mapSingle(data => data.paymentMethods.items);\r\n }\r\n\r\n submit() {\r\n const formValue = this.form.value;\r\n this.resolveWith({\r\n method: formValue.method,\r\n transactionId: formValue.transactionId,\r\n });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.cancel-order' | translate }}</ng-template>\r\n\r\n<div class=\"fulfillment-wrapper\">\r\n <div class=\"order-lines\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.cancel' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tr\r\n *ngFor=\"let line of order.lines\"\r\n class=\"order-line\"\r\n [class.is-disabled]=\"cancelAll\"\r\n [class.is-cancelled]=\"line.quantity === 0\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img [src]=\"line.featuredAsset | assetPreview: 'tiny'\" />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle quantity\">{{ line.quantity }}</td>\r\n <td class=\"align-middle quantity\">\r\n {{ line.unitPriceWithTax | localeCurrency: order.currencyCode }}\r\n </td>\r\n <td class=\"align-middle fulfil\">\r\n <input\r\n *ngIf=\"line.quantity > 0 && !order.active; else nonEditable\"\r\n [(ngModel)]=\"lineQuantities[line.id]\"\r\n (input)=\"checkIfAllSelected()\"\r\n [disabled]=\"cancelAll\"\r\n type=\"number\"\r\n [max]=\"line.quantity\"\r\n min=\"0\"\r\n />\r\n <ng-template #nonEditable>{{ line.quantity }}</ng-template>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n <div class=\"cancellation-details\">\r\n <ng-container *ngIf=\"order.active !== true\">\r\n <clr-radio-wrapper>\r\n <input\r\n type=\"radio\"\r\n clrRadio\r\n [value]=\"true\"\r\n [(ngModel)]=\"cancelAll\"\r\n name=\"options\"\r\n (ngModelChange)=\"radioChanged()\"\r\n />\r\n <label>{{ 'order.cancel-entire-order' | translate }}</label>\r\n </clr-radio-wrapper>\r\n <clr-radio-wrapper>\r\n <input\r\n type=\"radio\"\r\n clrRadio\r\n [value]=\"false\"\r\n [(ngModel)]=\"cancelAll\"\r\n name=\"options\"\r\n (ngModelChange)=\"radioChanged()\"\r\n />\r\n <label>{{ 'order.cancel-specified-items' | translate }}</label>\r\n </clr-radio-wrapper>\r\n </ng-container>\r\n <label class=\"clr-control-label\">{{ 'order.cancellation-reason' | translate }}</label>\r\n <ng-select\r\n [items]=\"reasons\"\r\n bindLabel=\"name\"\r\n autofocus\r\n bindValue=\"id\"\r\n [addTag]=\"true\"\r\n [(ngModel)]=\"reason\"\r\n ></ng-select>\r\n </div>\r\n</div>\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)=\"select()\"\r\n [disabled]=\"!reason || (!order.active && selectionCount === 0)\"\r\n class=\"btn btn-primary\"\r\n >\r\n <ng-container *ngIf=\"!order.active\">\r\n {{ 'order.cancel-selected-items' | translate }}\r\n </ng-container>\r\n <ng-container *ngIf=\"order.active\">\r\n {{ 'order.cancel-order' | translate }}\r\n </ng-container>\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CancelOrderInput,\r\n Dialog,\r\n getAppConfig,\r\n I18nService,\r\n OrderDetailFragment,\r\n OrderLineInput,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-cancel-order-dialog',\r\n templateUrl: './cancel-order-dialog.component.html',\r\n styleUrls: ['./cancel-order-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CancelOrderDialogComponent implements OnInit, Dialog<CancelOrderInput> {\r\n order: OrderDetailFragment;\r\n cancelAll = true;\r\n resolveWith: (result?: CancelOrderInput) => void;\r\n reason: string;\r\n lineQuantities: { [lineId: string]: number } = {};\r\n reasons: string[] = getAppConfig().cancellationReasons ?? [\r\n _('order.cancel-reason-customer-request'),\r\n _('order.cancel-reason-not-available'),\r\n ];\r\n\r\n get selectionCount(): number {\r\n return Object.values(this.lineQuantities).reduce((sum, n) => sum + n, 0);\r\n }\r\n\r\n constructor(private i18nService: I18nService) {\r\n this.reasons = this.reasons.map(r => this.i18nService.translate(r));\r\n }\r\n\r\n ngOnInit() {\r\n this.lineQuantities = this.order.lines.reduce((result, line) => {\r\n return { ...result, [line.id]: line.quantity };\r\n }, {});\r\n }\r\n\r\n radioChanged() {\r\n if (this.cancelAll) {\r\n for (const line of this.order.lines) {\r\n this.lineQuantities[line.id] = line.quantity;\r\n }\r\n } else {\r\n for (const line of this.order.lines) {\r\n this.lineQuantities[line.id] = 0;\r\n }\r\n }\r\n }\r\n\r\n checkIfAllSelected() {\r\n for (const [lineId, quantity] of Object.entries(this.lineQuantities)) {\r\n const quantityInOrder = this.order.lines.find(line => line.id === lineId)?.quantity;\r\n if (quantityInOrder && quantity < quantityInOrder) {\r\n return;\r\n }\r\n }\r\n // If we got here, all of the selected quantities are equal to the order\r\n // line quantities, i.e. everything is selected.\r\n this.cancelAll = true;\r\n }\r\n\r\n select() {\r\n this.resolveWith({\r\n orderId: this.order.id,\r\n lines: this.getLineInputs(),\r\n reason: this.reason,\r\n cancelShipping: this.cancelAll,\r\n });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n private getLineInputs(): OrderLineInput[] | undefined {\r\n if (this.order.active) {\r\n return;\r\n }\r\n return Object.entries(this.lineQuantities)\r\n .map(([orderLineId, quantity]) => ({\r\n orderLineId,\r\n quantity,\r\n }))\r\n .filter(l => 0 < l.quantity);\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.fulfill-order' | translate }}</ng-template>\r\n\r\n<div class=\"fulfillment-wrapper\">\r\n <div class=\"order-table\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.unfulfilled' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th>{{ 'order.fulfill' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tr\r\n *ngFor=\"let line of order.lines\"\r\n class=\"order-line\"\r\n [class.ignore]=\"getUnfulfilledCount(line) === 0\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img *ngIf=\"line.featuredAsset\" [src]=\"line.featuredAsset | assetPreview: 'tiny'\" />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle quantity\">{{ getUnfulfilledCount(line) }}</td>\r\n <td class=\"align-middle quantity\">{{ line.productVariant.stockOnHand }}</td>\r\n <td class=\"align-middle fulfil\">\r\n <input\r\n *ngIf=\"fulfillmentQuantities[line.id]\"\r\n [disabled]=\"getUnfulfilledCount(line) === 0\"\r\n [(ngModel)]=\"fulfillmentQuantities[line.id].fulfillCount\"\r\n type=\"number\"\r\n [max]=\"fulfillmentQuantities[line.id].max\"\r\n min=\"0\"\r\n />\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n <div class=\"shipping-details\">\r\n <vdr-formatted-address [address]=\"order.shippingAddress\"></vdr-formatted-address>\r\n <h6>{{ 'order.shipping-method' | translate }}</h6>\r\n {{ order.shippingLines[0]?.shippingMethod?.name }}\r\n <strong>{{ order.shipping | localeCurrency: order.currencyCode }}</strong>\r\n <vdr-configurable-input\r\n [operationDefinition]=\"fulfillmentHandlerDef\"\r\n [operation]=\"fulfillmentHandler\"\r\n [formControl]=\"fulfillmentHandlerControl\"\r\n [removable]=\"false\"\r\n ></vdr-configurable-input>\r\n </div>\r\n</div>\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)=\"select()\" [disabled]=\"!canSubmit()\" class=\"btn btn-primary\">\r\n {{ 'order.create-fulfillment' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport {\r\n configurableDefinitionToInstance,\r\n ConfigurableOperation,\r\n ConfigurableOperationDefinition,\r\n configurableOperationValueIsValid,\r\n DataService,\r\n Dialog,\r\n FulfillOrderInput,\r\n GlobalFlag,\r\n OrderDetailFragment,\r\n toConfigurableOperationInput,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-fulfill-order-dialog',\r\n templateUrl: './fulfill-order-dialog.component.html',\r\n styleUrls: ['./fulfill-order-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FulfillOrderDialogComponent implements Dialog<FulfillOrderInput>, OnInit {\r\n resolveWith: (result?: FulfillOrderInput) => void;\r\n fulfillmentHandlerDef: ConfigurableOperationDefinition;\r\n fulfillmentHandler: ConfigurableOperation;\r\n fulfillmentHandlerControl = new FormControl();\r\n fulfillmentQuantities: { [lineId: string]: { fulfillCount: number; max: number } } = {};\r\n\r\n // Provided by modalService.fromComponent() call\r\n order: OrderDetailFragment;\r\n\r\n constructor(private dataService: DataService, private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {\r\n this.dataService.settings.getGlobalSettings().single$.subscribe(({ globalSettings }) => {\r\n this.fulfillmentQuantities = this.order.lines.reduce((result, line) => {\r\n const fulfillCount = this.getFulfillableCount(line, globalSettings.trackInventory);\r\n return {\r\n ...result,\r\n [line.id]: { fulfillCount, max: fulfillCount },\r\n };\r\n }, {});\r\n this.changeDetector.markForCheck();\r\n });\r\n\r\n this.dataService.shippingMethod\r\n .getShippingMethodOperations()\r\n .mapSingle(data => data.fulfillmentHandlers)\r\n .subscribe(handlers => {\r\n this.fulfillmentHandlerDef =\r\n handlers.find(\r\n h => h.code === this.order.shippingLines[0]?.shippingMethod?.fulfillmentHandlerCode,\r\n ) || handlers[0];\r\n this.fulfillmentHandler = configurableDefinitionToInstance(this.fulfillmentHandlerDef);\r\n this.fulfillmentHandlerControl.patchValue(this.fulfillmentHandler);\r\n this.changeDetector.markForCheck();\r\n });\r\n }\r\n\r\n getFulfillableCount(line: OrderDetailFragment['lines'][number], globalTrackInventory: boolean): number {\r\n const { trackInventory, stockOnHand } = line.productVariant;\r\n const effectiveTracInventory =\r\n trackInventory === GlobalFlag.INHERIT ? globalTrackInventory : trackInventory === GlobalFlag.TRUE;\r\n\r\n const unfulfilledCount = this.getUnfulfilledCount(line);\r\n return effectiveTracInventory ? Math.min(unfulfilledCount, stockOnHand) : unfulfilledCount;\r\n }\r\n\r\n getUnfulfilledCount(line: OrderDetailFragment['lines'][number]): number {\r\n const fulfilled =\r\n line.fulfillments\r\n ?.map(f => f.summary)\r\n .flat()\r\n .filter(row => row.orderLine.id === line.id)\r\n .reduce((sum, row) => sum + row.quantity, 0) ?? 0;\r\n return line.quantity - fulfilled;\r\n }\r\n\r\n canSubmit(): boolean {\r\n const totalCount = Object.values(this.fulfillmentQuantities).reduce(\r\n (total, { fulfillCount }) => total + fulfillCount,\r\n 0,\r\n );\r\n const formIsValid =\r\n configurableOperationValueIsValid(\r\n this.fulfillmentHandlerDef,\r\n this.fulfillmentHandlerControl.value,\r\n ) && this.fulfillmentHandlerControl.valid;\r\n return formIsValid && 0 < totalCount;\r\n }\r\n\r\n select() {\r\n const lines = Object.entries(this.fulfillmentQuantities).map(([orderLineId, { fulfillCount }]) => ({\r\n orderLineId,\r\n quantity: fulfillCount,\r\n }));\r\n this.resolveWith({\r\n lines,\r\n handler: toConfigurableOperationInput(\r\n this.fulfillmentHandler,\r\n this.fulfillmentHandlerControl.value,\r\n ),\r\n });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<vdr-chip [title]=\"'order.payment-state' | translate\" [colorType]=\"chipColorType\">\r\n <clr-icon shape=\"check-circle\" *ngIf=\"state === 'Delivered'\"></clr-icon>\r\n {{ state | stateI18nToken | translate }}\r\n</vdr-chip>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'vdr-fulfillment-state-label',\r\n templateUrl: './fulfillment-state-label.component.html',\r\n styleUrls: ['./fulfillment-state-label.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FulfillmentStateLabelComponent {\r\n @Input() state: string;\r\n\r\n get chipColorType() {\r\n switch (this.state) {\r\n case 'Pending':\r\n case 'Shipped':\r\n return 'warning';\r\n case 'Delivered':\r\n return 'success';\r\n case 'Cancelled':\r\n return 'error';\r\n }\r\n }\r\n}\r\n","<div class=\"items-list\">\r\n <ul>\r\n <li *ngFor=\"let item of items\" [title]=\"item.name\">\r\n <div class=\"quantity\">{{ item.quantity }}</div>\r\n <clr-icon shape=\"times\" size=\"12\"></clr-icon>\r\n {{ item.name }}\r\n </li>\r\n </ul>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'vdr-simple-item-list',\r\n templateUrl: './simple-item-list.component.html',\r\n styleUrls: ['./simple-item-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SimpleItemListComponent {\r\n @Input() items: Array<{ name: string; quantity: number }>;\r\n}\r\n","<vdr-labeled-data [label]=\"'common.created-at' | translate\">\r\n {{ fulfillment?.createdAt | localeDate: 'medium' }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data [label]=\"'order.fulfillment-method' | translate\">\r\n {{ fulfillment?.method }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data *ngIf=\"fulfillment?.trackingCode\" [label]=\"'order.tracking-code' | translate\">\r\n {{ fulfillment?.trackingCode }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data [label]=\"'order.contents' | translate\">\r\n <vdr-simple-item-list [items]=\"items\"></vdr-simple-item-list>\r\n</vdr-labeled-data>\r\n<ng-container *ngFor=\"let customField of customFieldConfig\">\r\n <vdr-custom-field-control\r\n *ngIf=\"customFieldFormGroup.get(customField.name)\"\r\n [readonly]=\"true\"\r\n [compact]=\"true\"\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"customFieldFormGroup\"\r\n ></vdr-custom-field-control>\r\n</ng-container>\r\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { CustomFieldConfig, OrderDetailFragment, ServerConfigService } from '@vendure/admin-ui/core';\r\nimport { isObject } from '@vendure/common/lib/shared-utils';\r\n\r\n@Component({\r\n selector: 'vdr-fulfillment-detail',\r\n templateUrl: './fulfillment-detail.component.html',\r\n styleUrls: ['./fulfillment-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FulfillmentDetailComponent implements OnInit, OnChanges {\r\n @Input() fulfillmentId: string;\r\n @Input() order: OrderDetailFragment;\r\n\r\n customFieldConfig: CustomFieldConfig[] = [];\r\n customFieldFormGroup = new FormGroup({});\r\n\r\n constructor(private serverConfigService: ServerConfigService) {}\r\n\r\n ngOnInit() {\r\n this.customFieldConfig = this.serverConfigService.getCustomFieldsFor('Fulfillment');\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.buildCustomFieldsFormGroup();\r\n }\r\n\r\n get fulfillment(): NonNullable<OrderDetailFragment['fulfillments']>[number] | undefined | null {\r\n return this.order.fulfillments && this.order.fulfillments.find(f => f.id === this.fulfillmentId);\r\n }\r\n\r\n get items(): Array<{ name: string; quantity: number }> {\r\n return (\r\n this.fulfillment?.summary.map(row => {\r\n return {\r\n name:\r\n this.order.lines.find(line => line.id === row.orderLine.id)?.productVariant.name ??\r\n '',\r\n quantity: row.quantity,\r\n };\r\n }) ?? []\r\n );\r\n }\r\n\r\n buildCustomFieldsFormGroup() {\r\n const customFields = (this.fulfillment as any).customFields;\r\n for (const fieldDef of this.serverConfigService.getCustomFieldsFor('Fulfillment')) {\r\n this.customFieldFormGroup.addControl(fieldDef.name, new FormControl(customFields[fieldDef.name]));\r\n }\r\n }\r\n\r\n customFieldIsObject(customField: unknown) {\r\n return Array.isArray(customField) || isObject(customField);\r\n }\r\n}\r\n","<div class=\"card\">\r\n <div class=\"card-header fulfillment-header\">\r\n <div>{{ 'order.fulfillment' | translate }}</div>\r\n <div class=\"fulfillment-state\">\r\n <vdr-fulfillment-state-label [state]=\"fulfillment?.state\"></vdr-fulfillment-state-label>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-fulfillment-detail\r\n *ngIf=\"!!fulfillment\"\r\n [fulfillmentId]=\"fulfillment?.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </div>\r\n <div class=\"card-footer\" *ngIf=\"fulfillment?.nextStates.length\">\r\n <ng-container *ngIf=\"nextSuggestedState() as suggestedState\">\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"transitionState.emit(suggestedState)\">\r\n {{ 'order.set-fulfillment-state' | translate: { state: (suggestedState | stateI18nToken | translate) } }}\r\n </button>\r\n </ng-container>\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 <ng-container *ngFor=\"let nextState of nextOtherStates()\">\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n (click)=\"transitionState.emit(nextState)\"\r\n >\r\n <ng-container *ngIf=\"nextState !== 'Cancelled'; else cancel\">\r\n <clr-icon shape=\"step-forward-2\"></clr-icon>\r\n {{ 'order.transition-to-state' | translate: { state: (nextState | stateI18nToken | translate) } }}\r\n </ng-container>\r\n <ng-template #cancel>\r\n <clr-icon shape=\"error-standard\" class=\"is-error\"></clr-icon>\r\n {{ 'order.cancel-fulfillment' | translate }}\r\n </ng-template>\r\n </button>\r\n </ng-container>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FulfillmentFragment, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-fulfillment-card',\r\n templateUrl: './fulfillment-card.component.html',\r\n styleUrls: ['./fulfillment-card.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FulfillmentCardComponent {\r\n @Input() fulfillment: FulfillmentFragment | undefined;\r\n @Input() order: OrderDetailFragment;\r\n @Output() transitionState = new EventEmitter<string>();\r\n\r\n nextSuggestedState(): string | undefined {\r\n if (!this.fulfillment) {\r\n return;\r\n }\r\n const { nextStates } = this.fulfillment;\r\n const namedStateOrDefault = (targetState: string) =>\r\n nextStates.includes(targetState) ? targetState : nextStates[0];\r\n switch (this.fulfillment?.state) {\r\n case 'Pending':\r\n return namedStateOrDefault('Shipped');\r\n case 'Shipped':\r\n return namedStateOrDefault('Delivered');\r\n default:\r\n return nextStates.find(s => s !== 'Cancelled');\r\n }\r\n }\r\n\r\n nextOtherStates(): string[] {\r\n if (!this.fulfillment) {\r\n return [];\r\n }\r\n const suggested = this.nextSuggestedState();\r\n return this.fulfillment.nextStates.filter(s => s !== suggested);\r\n }\r\n}\r\n","<vdr-dropdown class=\"search-settings-menu\" *ngIf=\"fulfilledCount || orderState === 'PartiallyDelivered'\">\r\n <button type=\"button\" class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon *ngIf=\"fulfillmentStatus === 'full'\" class=\"item-fulfilled\" shape=\"check-circle\"></clr-icon>\r\n <clr-icon\r\n *ngIf=\"fulfillmentStatus === 'partial'\"\r\n class=\"item-partially-fulfilled\"\r\n shape=\"check-circle\"\r\n ></clr-icon>\r\n <clr-icon\r\n *ngIf=\"fulfillmentStatus === 'none'\"\r\n class=\"item-not-fulfilled\"\r\n shape=\"exclamation-circle\"\r\n ></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <label class=\"dropdown-header\" *ngIf=\"fulfillmentStatus === 'full'\">\r\n {{ 'order.line-fulfillment-all' | translate }}\r\n </label>\r\n <label class=\"dropdown-header\" *ngIf=\"fulfillmentStatus === 'partial'\">\r\n {{\r\n 'order.line-fulfillment-partial' | translate: { total: line.quantity, count: fulfilledCount }\r\n }}\r\n </label>\r\n <label class=\"dropdown-header\" *ngIf=\"fulfillmentStatus === 'none'\">\r\n {{ 'order.line-fulfillment-none' | translate }}\r\n </label>\r\n <div class=\"fulfillment-detail\" *ngFor=\"let item of fulfillments\">\r\n <div class=\"fulfillment-title\">\r\n {{ 'order.fulfillment' | translate }} #{{ item.fulfillment.id }} ({{\r\n 'order.item-count' | translate: { count: item.count }\r\n }})\r\n </div>\r\n <vdr-labeled-data [label]=\"'common.created-at' | translate\">\r\n {{ item.fulfillment.createdAt | localeDate: 'medium' }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.fulfillment-method' | translate\">\r\n {{ item.fulfillment.method }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data\r\n *ngIf=\"item.fulfillment.trackingCode\"\r\n [label]=\"'order.tracking-code' | translate\"\r\n >\r\n {{ item.fulfillment.trackingCode }}\r\n </vdr-labeled-data>\r\n </div>\r\n </vdr-dropdown-menu>\r\n</vdr-dropdown>\r\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { OrderDetailFragment } from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\n\r\nexport type FulfillmentStatus = 'full' | 'partial' | 'none';\r\ntype Fulfillment = NonNullable<OrderDetailFragment['fulfillments']>[number];\r\n\r\n@Component({\r\n selector: 'vdr-line-fulfillment',\r\n templateUrl: './line-fulfillment.component.html',\r\n styleUrls: ['./line-fulfillment.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class LineFulfillmentComponent implements OnChanges {\r\n @Input() line: OrderDetailFragment['lines'][number];\r\n @Input() orderState: string;\r\n fulfilledCount = 0;\r\n fulfillmentStatus: FulfillmentStatus;\r\n fulfillments: Array<{\r\n count: number;\r\n fulfillment: Fulfillment;\r\n }> = [];\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.line) {\r\n this.fulfilledCount = this.getDeliveredCount(this.line);\r\n this.fulfillmentStatus = this.getFulfillmentStatus(this.fulfilledCount, this.line.items.length);\r\n this.fulfillments = this.getFulfillments(this.line);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the number of items in an OrderLine which are fulfilled.\r\n */\r\n private getDeliveredCount(line: OrderDetailFragment['lines'][number]): number {\r\n return (\r\n line.fulfillments?.reduce(\r\n (sum, fulfillment) =>\r\n sum + (fulfillment.summary.find(s => s.orderLine.id === line.id)?.quantity ?? 0),\r\n 0,\r\n ) ?? 0\r\n );\r\n }\r\n\r\n private getFulfillmentStatus(fulfilledCount: number, lineQuantity: number): FulfillmentStatus {\r\n if (fulfilledCount === lineQuantity) {\r\n return 'full';\r\n }\r\n if (0 < fulfilledCount && fulfilledCount < lineQuantity) {\r\n return 'partial';\r\n }\r\n return 'none';\r\n }\r\n\r\n private getFulfillments(\r\n line: OrderDetailFragment['lines'][number],\r\n ): Array<{ count: number; fulfillment: NonNullable<OrderDetailFragment['fulfillments']>[number] }> {\r\n return (\r\n line.fulfillments?.map(fulfillment => {\r\n const summaryLine = fulfillment.summary.find(s => s.orderLine.id === line.id);\r\n return {\r\n count: summaryLine?.quantity ?? 0,\r\n fulfillment,\r\n };\r\n }) ?? []\r\n );\r\n }\r\n}\r\n","<span *ngIf=\"getRefundedCount()\" [title]=\"'order.refunded-count' | translate: { count: getRefundedCount() }\">\r\n <clr-icon shape=\"redo\" class=\"is-solid\" dir=\"down\"></clr-icon>\r\n</span>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-line-refunds',\r\n templateUrl: './line-refunds.component.html',\r\n styleUrls: ['./line-refunds.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class LineRefundsComponent {\r\n @Input() line: OrderDetailFragment['lines'][number];\r\n @Input() payments: OrderDetailFragment['payments'];\r\n\r\n getRefundedCount(): number {\r\n const refunds =\r\n this.payments?.reduce(\r\n (all, payment) => [...all, ...payment.refunds],\r\n [] as NonNullable<OrderDetailFragment['payments']>[number]['refunds'],\r\n ) ?? [];\r\n return this.line.items.filter(i => {\r\n if (i.refundId === null && !i.cancelled) {\r\n return false;\r\n }\r\n if (i.refundId) {\r\n const refund = refunds.find(r => r.id === i.refundId);\r\n if (refund?.state === 'Failed') {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }).length;\r\n }\r\n}\r\n","<vdr-labeled-data [label]=\"'common.ID' | translate\">{{ modification.id }}</vdr-labeled-data>\r\n<vdr-labeled-data *ngIf=\"modification.note\" [label]=\"'order.note' | translate\">{{\r\n modification.note\r\n}}</vdr-labeled-data>\r\n<vdr-labeled-data *ngFor=\"let surcharge of modification.surcharges\" [label]=\"'order.surcharges' | translate\">\r\n {{ getSurcharge(surcharge.id)?.description }}\r\n {{ getSurcharge(surcharge.id)?.priceWithTax | localeCurrency: order.currencyCode }}</vdr-labeled-data\r\n>\r\n<vdr-labeled-data *ngIf=\"getAddedItems().length\" [label]=\"'order.added-items' | translate\">\r\n <vdr-simple-item-list [items]=\"getAddedItems()\"></vdr-simple-item-list>\r\n</vdr-labeled-data>\r\n<vdr-labeled-data *ngIf=\"getRemovedItems().length\" [label]=\"'order.removed-items' | translate\">\r\n <vdr-simple-item-list [items]=\"getRemovedItems()\"></vdr-simple-item-list>\r\n</vdr-labeled-data>\r\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit } from '@angular/core';\r\nimport { OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-modification-detail',\r\n templateUrl: './modification-detail.component.html',\r\n styleUrls: ['./modification-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ModificationDetailComponent implements OnChanges {\r\n @Input() order: OrderDetailFragment;\r\n @Input() modification: OrderDetailFragment['modifications'][number];\r\n private addedItems = new Map<OrderDetailFragment['lines'][number], number>();\r\n private removedItems = new Map<OrderDetailFragment['lines'][number], number>();\r\n\r\n ngOnChanges(): void {\r\n const { added, removed } = this.getModifiedLines();\r\n this.addedItems = added;\r\n this.removedItems = removed;\r\n }\r\n\r\n getSurcharge(id: string) {\r\n return this.order.surcharges.find(m => m.id === id);\r\n }\r\n\r\n getAddedItems() {\r\n return [...this.addedItems.entries()].map(([line, count]) => {\r\n return { name: line.productVariant.name, quantity: count };\r\n });\r\n }\r\n\r\n getRemovedItems() {\r\n return [...this.removedItems.entries()].map(([line, count]) => {\r\n return { name: line.productVariant.name, quantity: count };\r\n });\r\n }\r\n\r\n private getModifiedLines() {\r\n const added = new Map<OrderDetailFragment['lines'][number], number>();\r\n const removed = new Map<OrderDetailFragment['lines'][number], number>();\r\n for (const _item of this.modification.orderItems || []) {\r\n const result = this.getOrderLineAndItem(_item.id);\r\n if (result) {\r\n const { line, item } = result;\r\n if (item.cancelled) {\r\n const count = removed.get(line) ?? 0;\r\n removed.set(line, count + 1);\r\n } else {\r\n const count = added.get(line) ?? 0;\r\n added.set(line, count + 1);\r\n }\r\n }\r\n }\r\n return { added, removed };\r\n }\r\n\r\n private getOrderLineAndItem(itemId: string) {\r\n for (const line of this.order.lines) {\r\n const item = line.items.find(i => i.id === itemId);\r\n if (item) {\r\n return { line, item };\r\n }\r\n }\r\n }\r\n}\r\n","<div class=\"card\" *ngIf=\"customFieldsConfig.length\">\r\n <div class=\"card-header\">\r\n {{ 'common.custom-fields' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"card-text custom-field-form\" [class.editable]=\"editable\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Order\"\r\n [customFields]=\"customFieldsConfig\"\r\n [customFieldsFormGroup]=\"customFieldForm\"\r\n [readonly]=\"!editable\"\r\n [compact]=\"true\"\r\n ></vdr-tabbed-custom-fields>\r\n </div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <button class=\"btn btn-sm btn-secondary\" (click)=\"editable = true\" *ngIf=\"!editable\">\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-primary\"\r\n (click)=\"onUpdateClick()\"\r\n *ngIf=\"editable\"\r\n [disabled]=\"customFieldForm.pristine || customFieldForm.invalid\"\r\n >\r\n <clr-icon shape=\"check\"></clr-icon>\r\n {{ 'common.update' | translate }}\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-secondary\"\r\n (click)=\"onCancelClick()\"\r\n *ngIf=\"editable\"\r\n >\r\n <clr-icon shape=\"times\"></clr-icon>\r\n {{ 'common.cancel' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport { CustomFieldConfig, ModalService } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-order-custom-fields-card',\r\n templateUrl: './order-custom-fields-card.component.html',\r\n styleUrls: ['./order-custom-fields-card.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderCustomFieldsCardComponent implements OnInit {\r\n @Input() customFieldsConfig: CustomFieldConfig[] = [];\r\n @Input() customFieldValues: { [name: string]: any } = {};\r\n @Output() updateClick = new EventEmitter<any>();\r\n customFieldForm: FormGroup;\r\n editable = false;\r\n constructor(private formBuilder: FormBuilder, private modalService: ModalService) {}\r\n\r\n ngOnInit() {\r\n this.customFieldForm = this.formBuilder.group({});\r\n for (const field of this.customFieldsConfig) {\r\n this.customFieldForm.addControl(\r\n field.name,\r\n this.formBuilder.control(this.customFieldValues[field.name]),\r\n );\r\n }\r\n }\r\n\r\n onUpdateClick() {\r\n this.updateClick.emit(this.customFieldForm.value);\r\n this.customFieldForm.markAsPristine();\r\n this.editable = false;\r\n }\r\n\r\n onCancelClick() {\r\n if (this.customFieldForm.dirty) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-cancel'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.keep-editing') },\r\n { type: 'danger', label: _('common.discard-changes'), returnValue: true },\r\n ],\r\n })\r\n .subscribe(result => {\r\n if (result) {\r\n this.customFieldForm.reset();\r\n this.customFieldForm.markAsPristine();\r\n this.editable = false;\r\n }\r\n });\r\n } else {\r\n this.editable = false;\r\n }\r\n }\r\n}\r\n","export const NODE_HEIGHT = 72;\r\n","<div class=\"node-wrapper\" [ngStyle]=\"getStyle()\" [class.active]=\"active$ | async\">\r\n <div\r\n class=\"node\"\r\n [class.active-target]=\"activeTarget$ | async\"\r\n >\r\n {{ node.name | stateI18nToken | translate }}\r\n </div>\r\n <div class=\"cancelled-wrapper\" *ngIf=\"isCancellable\">\r\n <div class=\"cancelled-edge\">\r\n </div>\r\n <clr-icon shape=\"dot-circle\"></clr-icon>\r\n <div class=\"cancelled-node\">\r\n {{ cancelledState | stateI18nToken | translate }}\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nimport { NODE_HEIGHT } from './constants';\r\nimport { StateNode } from './types';\r\n\r\n@Component({\r\n selector: 'vdr-order-process-node',\r\n templateUrl: './order-process-node.component.html',\r\n styleUrls: ['./order-process-node.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderProcessNodeComponent implements OnChanges {\r\n @Input() node: StateNode;\r\n @Input() index: number;\r\n @Input() active: boolean;\r\n active$ = new BehaviorSubject<boolean>(false);\r\n activeTarget$ = new BehaviorSubject<boolean>(false);\r\n isCancellable = false;\r\n // We use a class field here to prevent the\r\n // i18n extractor from extracting a \"Cancelled\" key\r\n cancelledState = 'Cancelled';\r\n\r\n constructor(private elementRef: ElementRef<HTMLDivElement>) {}\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.isCancellable = !!this.node.to.find((s) => s.name === 'Cancelled');\r\n if (changes.active) {\r\n this.active$.next(this.active);\r\n }\r\n }\r\n\r\n getPos(origin: 'top' | 'bottom' = 'top'): { x: number; y: number } {\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const nodeHeight =\r\n this.elementRef.nativeElement.querySelector('.node')?.getBoundingClientRect().height ?? 0;\r\n return {\r\n x: 10,\r\n y: this.index * NODE_HEIGHT + (origin === 'bottom' ? nodeHeight : 0),\r\n };\r\n }\r\n\r\n getStyle() {\r\n const pos = this.getPos();\r\n return {\r\n 'top.px': pos.y,\r\n 'left.px': pos.x,\r\n };\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\n\r\nimport { OrderProcessNodeComponent } from './order-process-node.component';\r\n\r\n@Component({\r\n selector: 'vdr-order-process-edge',\r\n templateUrl: './order-process-edge.component.html',\r\n styleUrls: ['./order-process-edge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderProcessEdgeComponent implements OnInit {\r\n @Input() from: OrderProcessNodeComponent;\r\n @Input() to: OrderProcessNodeComponent;\r\n @Input() index: number;\r\n active$: Observable<boolean>;\r\n\r\n ngOnInit() {\r\n this.active$ = this.from.active$\r\n .asObservable()\r\n .pipe(tap((active) => this.to.activeTarget$.next(active)));\r\n }\r\n\r\n getStyle() {\r\n const direction = this.from.index < this.to.index ? 'down' : 'up';\r\n const startPos = this.from.getPos(direction === 'down' ? 'bottom' : 'top');\r\n const endPos = this.to.getPos(direction === 'down' ? 'top' : 'bottom');\r\n const dX = Math.abs(startPos.x - endPos.x);\r\n const dY = Math.abs(startPos.y - endPos.y);\r\n const length = Math.sqrt(dX ** 2 + dY ** 2);\r\n return {\r\n 'top.px': startPos.y,\r\n 'left.px': startPos.x + (direction === 'down' ? 10 : 40) + this.index * 12,\r\n 'height.px': length,\r\n 'width.px': 1,\r\n ...(direction === 'up'\r\n ? {\r\n transform: 'rotateZ(180deg)',\r\n 'transform-origin': 'top',\r\n }\r\n : {}),\r\n };\r\n }\r\n}\r\n","<ng-container *ngFor=\"let state of nodes; let i = index\">\r\n <vdr-order-process-node\r\n [node]=\"state\"\r\n [index]=\"i\"\r\n [active]=\"(activeState$ | async) === state.name\"\r\n (mouseenter)=\"onMouseOver(state.name)\"\r\n (mouseleave)=\"onMouseOut()\"\r\n ></vdr-order-process-node>\r\n</ng-container>\r\n<ng-container *ngFor=\"let edge of edges\">\r\n <vdr-order-process-edge [from]=\"edge.from\" [to]=\"edge.to\" [index]=\"edge.index\"></vdr-order-process-edge>\r\n</ng-container>\r\n","<div\r\n [attr.data-from]=\"from.node.name\"\r\n [attr.data-to]=\"to.node.name\"\r\n [ngStyle]=\"getStyle()\"\r\n [class.active]=\"active$ | async\"\r\n class=\"edge\">\r\n <clr-icon shape=\"arrow\" flip=\"vertical\" class=\"arrow\"></clr-icon>\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n QueryList,\r\n SimpleChanges,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport { OrderProcessState } from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\n\r\nimport { NODE_HEIGHT } from './constants';\r\nimport { OrderProcessNodeComponent } from './order-process-node.component';\r\nimport { StateNode } from './types';\r\n\r\n@Component({\r\n selector: 'vdr-order-process-graph',\r\n templateUrl: './order-process-graph.component.html',\r\n styleUrls: ['./order-process-graph.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderProcessGraphComponent implements OnInit, OnChanges, AfterViewInit {\r\n @Input() states: OrderProcessState[];\r\n @Input() initialState?: string;\r\n setActiveState$ = new BehaviorSubject<string | undefined>(undefined);\r\n activeState$: Observable<string | undefined>;\r\n nodes: StateNode[] = [];\r\n edges: Array<{ from: OrderProcessNodeComponent; to: OrderProcessNodeComponent; index: number }> = [];\r\n\r\n @ViewChildren(OrderProcessNodeComponent) nodeComponents: QueryList<OrderProcessNodeComponent>;\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n @HostBinding('style.height.px')\r\n get outerHeight(): number {\r\n return this.nodes.length * NODE_HEIGHT;\r\n }\r\n\r\n ngOnInit() {\r\n this.setActiveState$.next(this.initialState);\r\n this.activeState$ = this.setActiveState$.pipe(debounceTime(150));\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.populateNodes();\r\n }\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => this.populateEdges());\r\n }\r\n\r\n onMouseOver(stateName: string) {\r\n this.setActiveState$.next(stateName);\r\n }\r\n\r\n onMouseOut() {\r\n this.setActiveState$.next(this.initialState);\r\n }\r\n\r\n getNodeFor(state: string): OrderProcessNodeComponent | undefined {\r\n if (this.nodeComponents) {\r\n return this.nodeComponents.find((n) => n.node.name === state);\r\n }\r\n }\r\n\r\n private populateNodes() {\r\n const stateNodeMap = new Map<string, StateNode>();\r\n for (const state of this.states) {\r\n stateNodeMap.set(state.name, {\r\n name: state.name,\r\n to: [],\r\n });\r\n }\r\n\r\n for (const [name, stateNode] of stateNodeMap.entries()) {\r\n const targets = this.states.find((s) => s.name === name)?.to ?? [];\r\n for (const target of targets) {\r\n const targetNode = stateNodeMap.get(target);\r\n if (targetNode) {\r\n stateNode.to.push(targetNode);\r\n }\r\n }\r\n }\r\n this.nodes = [...stateNodeMap.values()].filter((n) => n.name !== 'Cancelled');\r\n }\r\n\r\n private populateEdges() {\r\n for (const node of this.nodes) {\r\n const nodeCmp = this.getNodeFor(node.name);\r\n let index = 0;\r\n for (const to of node.to) {\r\n const toCmp = this.getNodeFor(to.name);\r\n if (nodeCmp && toCmp && nodeCmp !== toCmp) {\r\n this.edges.push({\r\n to: toCmp,\r\n from: nodeCmp,\r\n index,\r\n });\r\n index++;\r\n }\r\n }\r\n }\r\n this.edges = [...this.edges];\r\n this.changeDetector.markForCheck();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.order-state-diagram' | translate }}</ng-template>\r\n\r\n<vdr-order-process-graph [states]=\"states\" [initialState]=\"activeState\"></vdr-order-process-graph>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport {\r\n CancelOrderInput,\r\n DataService,\r\n Dialog,\r\n OrderProcessState,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vdr-order-process-graph-dialog',\r\n templateUrl: './order-process-graph-dialog.component.html',\r\n styleUrls: ['./order-process-graph-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderProcessGraphDialogComponent implements OnInit, Dialog<void> {\r\n activeState: string;\r\n states: OrderProcessState[] = [];\r\n constructor(private serverConfigService: ServerConfigService) {}\r\n\r\n ngOnInit(): void {\r\n this.states = this.serverConfigService.getOrderProcessStates();\r\n }\r\n\r\n resolveWith: (result: void | undefined) => void;\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.refund-and-cancel-order' | translate }}</ng-template>\r\n\r\n<div class=\"refund-wrapper\">\r\n <div class=\"order-table\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.prorated-unit-price' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th>{{ 'order.refund' | translate }}</th>\r\n <th>{{ 'order.cancel' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let line of order.lines\" class=\"order-line\">\r\n <td class=\"align-middle thumb\">\r\n <img [src]=\"line.featuredAsset | assetPreview: 'tiny'\" />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle quantity\">\r\n {{ line.quantity }}\r\n <vdr-line-refunds [line]=\"line\" [payments]=\"order.payments\"></vdr-line-refunds>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n {{ line.unitPriceWithTax | localeCurrency: order.currencyCode }}\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <div class=\"prorated-wrapper\">\r\n {{ line.proratedUnitPriceWithTax | localeCurrency: order.currencyCode }}\r\n <ng-container *ngIf=\"line.discounts as discounts\">\r\n <vdr-dropdown *ngIf=\"discounts.length\">\r\n <div class=\"promotions-label\" vdrDropdownTrigger>\r\n <button class=\"icon-button\"><clr-icon shape=\"info\"></clr-icon></button>\r\n </div>\r\n <vdr-dropdown-menu>\r\n <div class=\"line-promotion\" *ngFor=\"let discount of discounts\">\r\n {{ discount.description }}\r\n <div class=\"promotion-amount\">\r\n {{\r\n discount.amount / 100 / line.quantity\r\n | number: '1.0-2'\r\n | currency: order.currencyCode\r\n }}\r\n </div>\r\n </div>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </ng-container>\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity-col\">\r\n <input\r\n *ngIf=\"lineCanBeRefundedOrCancelled(line)\"\r\n [(ngModel)]=\"lineQuantities[line.id].quantity\"\r\n type=\"number\"\r\n [max]=\"line.quantity\"\r\n min=\"0\"\r\n (input)=\"handleZeroQuantity(lineQuantities[line.id])\"\r\n />\r\n </td>\r\n <td class=\"align-middle\">\r\n <div class=\"cancel-checkbox-wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n *ngIf=\"lineCanBeRefundedOrCancelled(line)\"\r\n clrCheckbox\r\n [disabled]=\"0 === lineQuantities[line.id].quantity\"\r\n [(ngModel)]=\"lineQuantities[line.id].refund\"\r\n />\r\n </div>\r\n </td>\r\n <td class=\"align-middle\">\r\n <div class=\"cancel-checkbox-wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n *ngIf=\"lineCanBeRefundedOrCancelled(line)\"\r\n clrCheckbox\r\n [disabled]=\"0 === lineQuantities[line.id].quantity\"\r\n [(ngModel)]=\"lineQuantities[line.id].cancel\"\r\n />\r\n </div>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n <div class=\"refund-details mt4\" [class.faded]=\"!isRefunding() && !isCancelling()\">\r\n <div>\r\n <label class=\"clr-control-label\">{{ 'order.refund-cancellation-reason' | translate }}</label>\r\n <ng-select\r\n [disabled]=\"!isRefunding() && !isCancelling()\"\r\n [items]=\"reasons\"\r\n bindLabel=\"name\"\r\n autofocus\r\n [placeholder]=\"'order.refund-cancellation-reason-required' | translate\"\r\n bindValue=\"id\"\r\n [addTag]=\"true\"\r\n [(ngModel)]=\"reason\"\r\n ></ng-select>\r\n </div>\r\n\r\n <div>\r\n <clr-select-container>\r\n <label>{{ 'order.payment-to-refund' | translate }}</label>\r\n <select clrSelect name=\"options\" [(ngModel)]=\"selectedPayment\" [disabled]=\"!isRefunding()\">\r\n <option\r\n *ngFor=\"let payment of settledPayments\"\r\n [ngValue]=\"payment\"\r\n [disabled]=\"payment.state !== 'Settled'\"\r\n >\r\n #{{ payment.id }} {{ payment.method }}:\r\n {{ payment.amount | localeCurrency: order.currencyCode }}\r\n </option>\r\n </select>\r\n </clr-select-container>\r\n\r\n <clr-checkbox-wrapper>\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"refundShipping\" [disabled]=\"!isRefunding()\" />\r\n <label>\r\n {{ 'order.refund-shipping' | translate }} ({{\r\n order.shippingWithTax | localeCurrency: order.currencyCode\r\n }})\r\n </label>\r\n </clr-checkbox-wrapper>\r\n <clr-input-container>\r\n <label>{{ 'order.refund-adjustment' | translate }}</label>\r\n <vdr-currency-input\r\n clrInput\r\n [disabled]=\"!isRefunding()\"\r\n [currencyCode]=\"order.currencyCode\"\r\n [(ngModel)]=\"adjustment\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <div class=\"totals\" [class.disabled]=\"!isRefunding()\">\r\n <div class=\"order-total\">\r\n {{ 'order.payment-amount' | translate }}:\r\n {{ selectedPayment.amount | localeCurrency: order.currencyCode }}\r\n </div>\r\n <div class=\"refund-total\">\r\n {{ 'order.refund-total' | translate }}:\r\n {{ refundTotal | localeCurrency: order.currencyCode }}\r\n </div>\r\n <div class=\"refund-total-error\" *ngIf=\"refundTotal < 0 || settledPaymentsTotal < refundTotal\">\r\n {{\r\n 'order.refund-total-error'\r\n | translate\r\n : {\r\n min: 0 | currency: order.currencyCode,\r\n max: settledPaymentsTotal | localeCurrency: order.currencyCode\r\n }\r\n }}\r\n </div>\r\n <div class=\"refund-total-warning\" *ngIf=\"selectedPayment.amount < refundTotal\">\r\n {{ 'order.refund-total-warning' | translate }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\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)=\"select()\" [disabled]=\"!canSubmit()\" class=\"btn btn-primary\">\r\n <ng-container *ngIf=\"isRefunding(); else cancelling\">\r\n {{\r\n 'order.refund-with-amount'\r\n | translate: { amount: refundTotal | localeCurrency: order.currencyCode }\r\n }}\r\n </ng-container>\r\n <ng-template #cancelling>\r\n {{ 'order.cancel-selected-items' | translate }}\r\n </ng-template>\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CancelOrderInput,\r\n Dialog,\r\n getAppConfig,\r\n I18nService,\r\n OrderDetailFragment,\r\n OrderLineInput,\r\n RefundOrderInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { summate } from '@vendure/common/lib/shared-utils';\r\n\r\ntype SelectionLine = { quantity: number; refund: boolean; cancel: boolean };\r\ntype Payment = NonNullable<OrderDetailFragment['payments']>[number];\r\n\r\n@Component({\r\n selector: 'vdr-refund-order-dialog',\r\n templateUrl: './refund-order-dialog.component.html',\r\n styleUrls: ['./refund-order-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RefundOrderDialogComponent\r\n implements OnInit, Dialog<{ cancel: CancelOrderInput; refund: RefundOrderInput }>\r\n{\r\n order: OrderDetailFragment;\r\n resolveWith: (result?: { cancel: CancelOrderInput; refund: RefundOrderInput }) => void;\r\n reason: string;\r\n settledPayments: Payment[];\r\n selectedPayment: Payment;\r\n lineQuantities: { [lineId: string]: SelectionLine } = {};\r\n refundShipping = false;\r\n adjustment = 0;\r\n reasons = getAppConfig().cancellationReasons ?? [\r\n _('order.refund-reason-customer-request'),\r\n _('order.refund-reason-not-available'),\r\n ];\r\n\r\n constructor(private i18nService: I18nService) {\r\n this.reasons = this.reasons.map(r => this.i18nService.translate(r));\r\n }\r\n\r\n get refundTotal(): number {\r\n const itemTotal = this.order.lines.reduce((total, line) => {\r\n const lineRef = this.lineQuantities[line.id];\r\n const refundCount = (lineRef.refund && lineRef.quantity) || 0;\r\n return total + line.proratedUnitPriceWithTax * refundCount;\r\n }, 0);\r\n return itemTotal + (this.refundShipping ? this.order.shippingWithTax : 0) + this.adjustment;\r\n }\r\n\r\n get settledPaymentsTotal(): number {\r\n return this.settledPayments\r\n .map(payment => {\r\n const paymentTotal = payment.amount;\r\n const alreadyRefundedTotal = summate(\r\n payment.refunds.filter(r => r.state !== 'Failed') as Array<\r\n Required<Payment['refunds'][number]>\r\n >,\r\n 'total',\r\n );\r\n return paymentTotal - alreadyRefundedTotal;\r\n })\r\n .reduce((sum, amount) => sum + amount, 0);\r\n }\r\n\r\n lineCanBeRefundedOrCancelled(line: OrderDetailFragment['lines'][number]): boolean {\r\n const refunds =\r\n this.order.payments?.reduce(\r\n (all, payment) => [...all, ...payment.refunds],\r\n [] as Payment['refunds'],\r\n ) ?? [];\r\n\r\n const refundable = line.items.filter(i => {\r\n if (i.cancelled) {\r\n return false;\r\n }\r\n if (i.refundId == null) {\r\n return true;\r\n }\r\n const refund = refunds.find(r => r.id === i.refundId);\r\n return refund?.state === 'Failed';\r\n });\r\n return 0 < refundable.length;\r\n }\r\n\r\n ngOnInit() {\r\n this.lineQuantities = this.order.lines.reduce((result, line) => {\r\n return {\r\n ...result,\r\n [line.id]: {\r\n quantity: 0,\r\n refund: false,\r\n cancel: false,\r\n },\r\n };\r\n }, {});\r\n this.settledPayments = (this.order.payments || []).filter(p => p.state === 'Settled');\r\n if (this.settledPayments.length) {\r\n this.selectedPayment = this.settledPayments[0];\r\n }\r\n }\r\n\r\n handleZeroQuantity(line?: SelectionLine) {\r\n if (line?.quantity === 0) {\r\n line.cancel = false;\r\n line.refund = false;\r\n }\r\n }\r\n\r\n isRefunding(): boolean {\r\n const result = Object.values(this.lineQuantities).reduce((isRefunding, line) => {\r\n return isRefunding || (0 < line.quantity && line.refund);\r\n }, false);\r\n return result;\r\n }\r\n\r\n isCancelling(): boolean {\r\n const result = Object.values(this.lineQuantities).reduce((isCancelling, line) => {\r\n return isCancelling || (0 < line.quantity && line.cancel);\r\n }, false);\r\n return result;\r\n }\r\n\r\n canSubmit(): boolean {\r\n if (this.isRefunding()) {\r\n return !!(\r\n this.selectedPayment &&\r\n this.reason &&\r\n 0 < this.refundTotal &&\r\n this.refundTotal <= this.settledPaymentsTotal\r\n );\r\n } else if (this.isCancelling()) {\r\n return !!this.reason;\r\n }\r\n return false;\r\n }\r\n\r\n select() {\r\n const payment = this.selectedPayment;\r\n if (payment) {\r\n const refundLines = this.getOrderLineInput(line => line.refund);\r\n const cancelLines = this.getOrderLineInput(line => line.cancel);\r\n\r\n this.resolveWith({\r\n refund: {\r\n lines: refundLines,\r\n reason: this.reason,\r\n shipping: this.refundShipping ? this.order.shippingWithTax : 0,\r\n adjustment: this.adjustment,\r\n paymentId: payment.id,\r\n },\r\n cancel: {\r\n lines: cancelLines,\r\n orderId: this.order.id,\r\n reason: this.reason,\r\n cancelShipping: this.refundShipping,\r\n },\r\n });\r\n }\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n private getOrderLineInput(filterFn: (line: SelectionLine) => boolean): OrderLineInput[] {\r\n return Object.entries(this.lineQuantities)\r\n .filter(([orderLineId, line]) => 0 < line.quantity && filterFn(line))\r\n .map(([orderLineId, line]) => ({\r\n orderLineId,\r\n quantity: line.quantity,\r\n }));\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.settle-refund' | translate }}</ng-template>\r\n<p class=\"instruction\">\r\n {{ 'order.settle-refund-manual-instructions' | translate: { method: refund.method } }}\r\n</p>\r\n<clr-input-container>\r\n <label>{{ 'order.transaction-id' | translate }}</label>\r\n <input clrInput name=\"transactionId\" [(ngModel)]=\"transactionId\" />\r\n</clr-input-container>\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)=\"submit()\" [disabled]=\"!transactionId\" class=\"btn btn-primary\">\r\n {{ 'order.settle-refund' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { Dialog, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-settle-refund-dialog',\r\n templateUrl: './settle-refund-dialog.component.html',\r\n styleUrls: ['./settle-refund-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SettleRefundDialogComponent implements Dialog<string> {\r\n resolveWith: (result?: string) => void;\r\n transactionId = '';\r\n refund: NonNullable<OrderDetailFragment['payments']>[number]['refunds'][number];\r\n\r\n submit() {\r\n this.resolveWith(this.transactionId);\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.select-state' | translate }}</ng-template>\r\n<p>{{ message | translate }}</p>\r\n<clr-select-container>\r\n <select clrSelect name=\"state\" [(ngModel)]=\"selectedState\">\r\n <option *ngFor=\"let state of nextStates\" [value]=\"state\">\r\n {{ state | stateI18nToken | translate }}\r\n </option>\r\n </select>\r\n</clr-select-container>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"submit\" *ngIf=\"cancellable\" (click)=\"cancel()\" class=\"btn btn-secondary\">\r\n {{ 'common.cancel' | translate }}\r\n </button>\r\n <button type=\"submit\" (click)=\"select()\" class=\"btn btn-primary\" [disabled]=\"!selectedState\">\r\n {{ 'order.transition-to-state' | translate: { state: (selectedState | stateI18nToken | translate) } }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { Dialog } from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-order-state-select-dialog',\n templateUrl: './order-state-select-dialog.component.html',\n styleUrls: ['./order-state-select-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OrderStateSelectDialogComponent implements Dialog<string> {\n resolveWith: (result?: string) => void;\n nextStates: string[] = [];\n message = '';\n cancellable: boolean;\n selectedState = '';\n\n select() {\n if (this.selectedState) {\n this.resolveWith(this.selectedState);\n }\n }\n\n cancel() {\n this.resolveWith();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataService,\n HistoryEntryType,\n I18nService,\n ModalService,\n NotificationService,\n SortOrder,\n} from '@vendure/admin-ui/core';\nimport { EMPTY } from 'rxjs';\nimport { catchError, delay, map, retryWhen, switchMap, take } from 'rxjs/operators';\n\nimport { OrderStateSelectDialogComponent } from '../components/order-state-select-dialog/order-state-select-dialog.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class OrderTransitionService {\n constructor(\n private dataService: DataService,\n private modalService: ModalService,\n private notificationService: NotificationService,\n private i18nService: I18nService,\n ) {}\n\n /**\n * Attempts to transition the Order to the last state it was in before it was transitioned\n * to the \"Modifying\" state. If this fails, a manual prompt is used.\n */\n transitionToPreModifyingState(orderId: string, nextStates: string[]) {\n return this.getPreModifyingState(orderId).pipe(\n switchMap(state => {\n const manualTransitionOptions = {\n orderId,\n nextStates,\n message: this.i18nService.translate(\n _('order.unable-to-transition-to-state-try-another'),\n { state },\n ),\n cancellable: false,\n retry: 10,\n };\n if (state) {\n return this.transitionToStateOrThrow(orderId, state).pipe(\n catchError(err => this.manuallyTransitionToState(manualTransitionOptions)),\n );\n } else {\n return this.manuallyTransitionToState(manualTransitionOptions);\n }\n }),\n );\n }\n\n /**\n * Displays a modal for manually selecting the next state.\n */\n manuallyTransitionToState(options: {\n orderId: string;\n nextStates: string[];\n message: string;\n cancellable: boolean;\n retry: number;\n }) {\n return this.modalService\n .fromComponent(OrderStateSelectDialogComponent, {\n locals: {\n nextStates: options.nextStates,\n cancellable: options.cancellable,\n message: options.message,\n },\n closable: false,\n size: 'md',\n })\n .pipe(\n switchMap(result => {\n if (result) {\n return this.transitionToStateOrThrow(options.orderId, result);\n } else {\n if (!options.cancellable) {\n throw new Error(`An order state must be selected`);\n } else {\n return EMPTY;\n }\n }\n }),\n retryWhen(errors => errors.pipe(delay(2000), take(options.retry))),\n );\n }\n\n /**\n * Attempts to get the last state the Order was in before it was transitioned\n * to the \"Modifying\" state.\n */\n private getPreModifyingState(orderId: string) {\n return this.dataService.order\n .getOrderHistory(orderId, {\n filter: {\n type: {\n eq: HistoryEntryType.ORDER_STATE_TRANSITION,\n },\n },\n sort: {\n createdAt: SortOrder.DESC,\n },\n })\n .mapSingle(result => result.order)\n .pipe(\n map(result => {\n const item = result?.history.items.find(i => i.data.to === 'Modifying');\n if (item) {\n return item.data.from as string;\n } else {\n return;\n }\n }),\n );\n }\n\n private transitionToStateOrThrow(orderId: string, state: string) {\n return this.dataService.order.transitionToState(orderId, state).pipe(\n map(({ transitionOrderToState }) => {\n switch (transitionOrderToState?.__typename) {\n case 'Order':\n return transitionOrderToState?.state;\n case 'OrderStateTransitionError':\n this.notificationService.error(transitionOrderToState?.transitionError);\n throw new Error(transitionOrderToState?.transitionError);\n }\n }),\n );\n }\n}\n","import { Subject } from '../Subject';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function retryWhen(notifier) {\n return operate((source, subscriber) => {\n let innerSub;\n let syncResub = false;\n let errors$;\n const subscribeForRetryWhen = () => {\n innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, (err) => {\n if (!errors$) {\n errors$ = new Subject();\n notifier(errors$).subscribe(createOperatorSubscriber(subscriber, () => innerSub ? subscribeForRetryWhen() : (syncResub = true)));\n }\n if (errors$) {\n errors$.next(err);\n }\n }));\n if (syncResub) {\n innerSub.unsubscribe();\n innerSub = null;\n syncResub = false;\n subscribeForRetryWhen();\n }\n };\n subscribeForRetryWhen();\n });\n}\n","<table class=\"order-table table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th>{{ 'order.total' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let line of order.lines\">\r\n <tr class=\"order-line\" [class.is-cancelled]=\"line.quantity === 0\">\r\n <td class=\"align-middle thumb\">\r\n <img *ngIf=\"line.featuredAsset\" [src]=\"line.featuredAsset | assetPreview: 'tiny'\" />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ line.unitPriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.unitPrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n {{ line.quantity }}\r\n <vdr-line-refunds [line]=\"line\" [payments]=\"order.payments\"></vdr-line-refunds>\r\n <vdr-line-fulfillment [line]=\"line\" [orderState]=\"order.state\"></vdr-line-fulfillment>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{ line.linePriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.linePrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n\r\n <ng-container *ngIf=\"getLineDiscounts(line) as discounts\">\r\n <vdr-dropdown *ngIf=\"discounts.length\">\r\n <div class=\"promotions-label\" vdrDropdownTrigger>\r\n {{ 'order.promotions-applied' | translate }}\r\n </div>\r\n <vdr-dropdown-menu>\r\n <div class=\"line-promotion\" *ngFor=\"let discount of discounts\">\r\n <a class=\"promotion-name\" [routerLink]=\"getPromotionLink(discount)\">{{\r\n discount.description\r\n }}</a>\r\n <div class=\"promotion-amount\">\r\n {{ discount.amountWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ discount.amount | localeCurrency: order.currencyCode }}\r\n </div>\r\n </div>\r\n </div>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <ng-container *ngIf=\"customFieldsForLine[line.id] as customFields\">\r\n <tr *ngIf=\"customFields.length\">\r\n <td colspan=\"6\" class=\"custom-fields-row\">\r\n <div class=\"order-line-custom-fields\">\r\n <div class=\"custom-field\" *ngFor=\"let field of customFields\">\r\n <vdr-custom-field-control\r\n [compact]=\"true\"\r\n [readonly]=\"true\"\r\n [customField]=\"field.config\"\r\n [customFieldsFormGroup]=\"field.formGroup\"\r\n ></vdr-custom-field-control>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n <tr class=\"surcharge\" *ngFor=\"let surcharge of order.surcharges\">\r\n <td class=\"align-middle name left\" colspan=\"2\">{{ surcharge.description }}</td>\r\n <td class=\"align-middle sku\">{{ surcharge.sku }}</td>\r\n <td class=\"align-middle\" colspan=\"2\"></td>\r\n <td class=\"align-middle total\">\r\n {{ surcharge.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ surcharge.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <ng-container *ngFor=\"let discount of order.discounts\">\r\n <tr class=\"order-adjustment\" *ngIf=\"discount.type !== 'OTHER'\">\r\n <td colspan=\"5\" class=\"left clr-align-middle\">\r\n <a [routerLink]=\"getPromotionLink(discount)\">{{ discount.description }}</a>\r\n <vdr-chip *ngIf=\"getCouponCodeForAdjustment(order, discount) as couponCode\">{{\r\n couponCode\r\n }}</vdr-chip>\r\n </td>\r\n <td class=\"clr-align-middle\">\r\n {{ discount.amountWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ discount.amount | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr class=\"sub-total\">\r\n <td class=\"left clr-align-middle\">{{ 'order.sub-total' | translate }}</td>\r\n <td colspan=\"4\"></td>\r\n <td class=\"clr-align-middle\">\r\n {{ order.subTotalWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ order.subTotal | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr class=\"shipping\">\r\n <td class=\"left clr-align-middle\">{{ 'order.shipping' | translate }}</td>\r\n <td class=\"clr-align-middle\">{{ getShippingNames(order) }}</td>\r\n <td colspan=\"3\"></td>\r\n <td class=\"clr-align-middle\">\r\n {{ order.shippingWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ order.shipping | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr class=\"total\">\r\n <td class=\"left clr-align-middle\">{{ 'order.total' | translate }}</td>\r\n <td colspan=\"4\"></td>\r\n <td class=\"clr-align-middle\">\r\n {{ order.totalWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ order.total | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { AdjustmentType, CustomFieldConfig, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-order-table',\r\n templateUrl: './order-table.component.html',\r\n styleUrls: ['./order-table.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderTableComponent implements OnInit {\r\n @Input() order: OrderDetailFragment;\r\n @Input() orderLineCustomFields: CustomFieldConfig[];\r\n orderLineCustomFieldsVisible = false;\r\n customFieldsForLine: {\r\n [lineId: string]: Array<{ config: CustomFieldConfig; formGroup: FormGroup; value: any }>;\r\n } = {};\r\n\r\n get visibleOrderLineCustomFields(): CustomFieldConfig[] {\r\n return this.orderLineCustomFieldsVisible ? this.orderLineCustomFields : [];\r\n }\r\n\r\n get showElided(): boolean {\r\n return !this.orderLineCustomFieldsVisible && 0 < this.orderLineCustomFields.length;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.orderLineCustomFieldsVisible = this.orderLineCustomFields.length < 2;\r\n this.getLineCustomFields();\r\n }\r\n\r\n toggleOrderLineCustomFields() {\r\n this.orderLineCustomFieldsVisible = !this.orderLineCustomFieldsVisible;\r\n }\r\n\r\n getLineDiscounts(line: OrderDetailFragment['lines'][number]) {\r\n return line.discounts.filter(a => a.type === AdjustmentType.PROMOTION);\r\n }\r\n\r\n private getLineCustomFields() {\r\n for (const line of this.order.lines) {\r\n const formGroup = new FormGroup({});\r\n const result = this.orderLineCustomFields\r\n .map(config => {\r\n const value = (line as any).customFields[config.name];\r\n formGroup.addControl(config.name, new FormControl(value));\r\n return {\r\n config,\r\n formGroup,\r\n value,\r\n };\r\n })\r\n .filter(field => {\r\n return this.orderLineCustomFieldsVisible ? true : field.value != null;\r\n });\r\n this.customFieldsForLine[line.id] = result;\r\n }\r\n }\r\n\r\n getPromotionLink(promotion: OrderDetailFragment['discounts'][number]): any[] {\r\n const id = promotion.adjustmentSource.split(':')[1];\r\n return ['/marketing', 'promotions', id];\r\n }\r\n\r\n getCouponCodeForAdjustment(\r\n order: OrderDetailFragment,\r\n promotionAdjustment: OrderDetailFragment['discounts'][number],\r\n ): string | undefined {\r\n const id = promotionAdjustment.adjustmentSource.split(':')[1];\r\n const promotion = order.promotions.find(p => p.id === id);\r\n if (promotion) {\r\n return promotion.couponCode || undefined;\r\n }\r\n }\r\n\r\n getShippingNames(order: OrderDetailFragment) {\r\n if (order.shippingLines.length) {\r\n return order.shippingLines.map(shippingLine => shippingLine.shippingMethod.name).join(', ');\r\n } else {\r\n return '';\r\n }\r\n }\r\n}\r\n","<vdr-labeled-data [label]=\"'order.payment-method' | translate\">\r\n {{ payment.method }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data [label]=\"'order.amount' | translate\">\r\n {{ payment.amount | localeCurrency: currencyCode }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data *ngIf=\"payment.errorMessage\" [label]=\"'order.error-message' | translate\">\r\n {{ payment.errorMessage }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data *ngIf=\"payment.transactionId\" [label]=\"'order.transaction-id' | translate\">\r\n {{ payment.transactionId }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data [label]=\"'order.payment-metadata' | translate\">\r\n <vdr-object-tree [value]=\"payment.metadata\"></vdr-object-tree>\r\n</vdr-labeled-data>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { CurrencyCode, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-payment-detail',\r\n templateUrl: './payment-detail.component.html',\r\n styleUrls: ['./payment-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class PaymentDetailComponent {\r\n @Input() payment: NonNullable<OrderDetailFragment['payments']>[number];\r\n @Input() currencyCode: CurrencyCode;\r\n}\r\n","<h4>{{ 'order.order-history' | translate }}</h4>\r\n<div class=\"entry-list\" [class.expanded]=\"expanded\">\r\n <vdr-timeline-entry iconShape=\"note\" displayType=\"muted\" [featured]=\"true\">\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)=\"addNoteToOrder()\">\r\n {{ 'common.add-note' | translate }}\r\n </button>\r\n </div>\r\n <div class=\"visibility-select\">\r\n <clr-checkbox-wrapper>\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"noteIsPrivate\" />\r\n <label>{{ 'order.note-is-private' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n <span *ngIf=\"noteIsPrivate\" class=\"private\">\r\n {{ 'order.note-only-visible-to-administrators' | translate }}\r\n </span>\r\n <span *ngIf=\"!noteIsPrivate\" class=\"public\">\r\n {{ 'order.note-visible-to-customer' | translate }}\r\n </span>\r\n </div>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry\r\n *ngFor=\"let entry of history\"\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 [collapsed]=\"!expanded && !isFeatured(entry)\"\r\n (expandClick)=\"expanded = !expanded\"\r\n >\r\n <ng-container [ngSwitch]=\"entry.type\">\r\n <ng-container *ngSwitchCase=\"type.ORDER_STATE_TRANSITION\">\r\n <div class=\"title\" *ngIf=\"entry.data.to === 'Delivered'\">\r\n {{ 'order.history-order-fulfilled' | translate }}\r\n </div>\r\n <div class=\"title\" *ngIf=\"entry.data.to === 'Cancelled'\">\r\n {{ 'order.history-order-cancelled' | translate }}\r\n </div>\r\n <ng-template [ngIf]=\"entry.data.to !== 'Cancelled' && entry.data.to !== 'Delivered'\">\r\n {{\r\n 'order.history-order-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_MODIFIED\">\r\n <div class=\"title\">\r\n {{ 'order.history-order-modified' | translate }}\r\n </div>\r\n <ng-container *ngIf=\"getModification(entry.data.modificationId) as modification\">\r\n {{ 'order.modify-order-price-difference' | translate }}:\r\n <strong>{{ modification.priceChange | localeCurrency: order.currencyCode }}</strong>\r\n <vdr-chip colorType=\"success\" *ngIf=\"modification.isSettled\">{{\r\n 'order.modification-settled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip colorType=\"error\" *ngIf=\"!modification.isSettled\">{{\r\n 'order.modification-not-settled' | translate\r\n }}</vdr-chip>\r\n <vdr-history-entry-detail>\r\n <vdr-modification-detail\r\n [order]=\"order\"\r\n [modification]=\"modification\"\r\n ></vdr-modification-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_PAYMENT_TRANSITION\">\r\n <ng-container *ngIf=\"entry.data.to === 'Settled'; else regularPaymentTransition\">\r\n <div class=\"title\">\r\n {{ 'order.history-payment-settled' | translate }}\r\n </div>\r\n {{ 'order.transaction-id' | translate }}: {{ getPayment(entry)?.transactionId }}\r\n <vdr-history-entry-detail *ngIf=\"getPayment(entry) as payment\">\r\n <vdr-payment-detail\r\n [payment]=\"payment\"\r\n [currencyCode]=\"order.currencyCode\"\r\n ></vdr-payment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-template #regularPaymentTransition>\r\n {{\r\n 'order.history-payment-transition'\r\n | translate\r\n : {\r\n from: entry.data.from,\r\n to: entry.data.to,\r\n id: getPayment(entry)?.transactionId\r\n }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_REFUND_TRANSITION\">\r\n {{\r\n 'order.history-refund-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to, id: entry.data.refundId }\r\n }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_CANCELLATION\">\r\n {{ 'order.history-items-cancelled' | translate: { count: entry.data.orderItemIds.length } }}\r\n <vdr-history-entry-detail *ngIf=\"getCancelledItems(entry) as items\">\r\n <vdr-labeled-data [label]=\"'order.cancellation-reason' | translate\">\r\n {{ entry.data.reason }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.contents' | translate\">\r\n <vdr-simple-item-list [items]=\"items\"></vdr-simple-item-list>\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.shipping-cancelled' | translate\">\r\n {{ entry.data.shippingCancelled }}\r\n </vdr-labeled-data>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_FULFILLMENT\">\r\n {{ 'order.history-fulfillment-created' | translate }}\r\n <vdr-history-entry-detail *ngIf=\"getFulfillment(entry) as fulfillment\">\r\n <vdr-fulfillment-detail\r\n [fulfillmentId]=\"fulfillment.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_FULFILLMENT_TRANSITION\">\r\n <ng-container *ngIf=\"entry.data.to === 'Delivered'\">\r\n <div class=\"title\">\r\n {{ 'order.history-fulfillment-delivered' | translate }}\r\n </div>\r\n {{ 'order.tracking-code' | translate }}: {{ getFulfillment(entry)?.trackingCode }}\r\n </ng-container>\r\n <ng-container *ngIf=\"entry.data.to === 'Shipped'\">\r\n <div class=\"title\">\r\n {{ 'order.history-fulfillment-shipped' | translate }}\r\n </div>\r\n {{ 'order.tracking-code' | translate }}: {{ getFulfillment(entry)?.trackingCode }}\r\n </ng-container>\r\n <ng-container *ngIf=\"entry.data.to !== 'Delivered' && entry.data.to !== 'Shipped'\">\r\n {{\r\n 'order.history-fulfillment-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to }\r\n }}\r\n </ng-container>\r\n <vdr-history-entry-detail *ngIf=\"getFulfillment(entry) as fulfillment\">\r\n <vdr-fulfillment-detail\r\n [fulfillmentId]=\"fulfillment.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_NOTE\">\r\n <div class=\"flex\">\r\n <div class=\"note-text\">\r\n <span *ngIf=\"entry.isPublic\" class=\"note-visibility public\">{{\r\n 'common.public' | translate\r\n }}</span>\r\n <span *ngIf=\"!entry.isPublic\" class=\"note-visibility private\">{{\r\n 'common.private' | translate\r\n }}</span>\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]=\"!('UpdateOrder' | 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]=\"!('UpdateOrder' | 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 *ngSwitchCase=\"type.ORDER_COUPON_APPLIED\">\r\n {{ 'order.history-coupon-code-applied' | translate }}:\r\n <vdr-chip>\r\n <a [routerLink]=\"['/marketing', 'promotions', entry.data.promotionId]\">{{\r\n entry.data.couponCode\r\n }}</a>\r\n </vdr-chip>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_COUPON_REMOVED\">\r\n {{ 'order.history-coupon-code-removed' | translate }}:\r\n <vdr-chip\r\n ><span class=\"cancelled-coupon-code\">{{ entry.data.couponCode }}</span></vdr-chip\r\n >\r\n </ng-container>\r\n </ng-container>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry [isLast]=\"true\" [createdAt]=\"order.createdAt\" [featured]=\"true\">\r\n <div class=\"title\">\r\n {{ 'order.history-order-created' | translate }}\r\n </div>\r\n </vdr-timeline-entry>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport {\r\n GetOrderHistoryQuery,\r\n HistoryEntry,\r\n HistoryEntryType,\r\n OrderDetailFragment,\r\n TimelineDisplayType,\r\n} from '@vendure/admin-ui/core';\r\n\r\ntype OrderHistoryItem = NonNullable<GetOrderHistoryQuery['order']>['history']['items'][number];\r\n\r\n@Component({\r\n selector: 'vdr-order-history',\r\n templateUrl: './order-history.component.html',\r\n styleUrls: ['./order-history.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderHistoryComponent {\r\n @Input() order: OrderDetailFragment;\r\n @Input() history: OrderHistoryItem[];\r\n @Output() addNote = new EventEmitter<{ note: string; isPublic: boolean }>();\r\n @Output() updateNote = new EventEmitter<HistoryEntry>();\r\n @Output() deleteNote = new EventEmitter<HistoryEntry>();\r\n note = '';\r\n noteIsPrivate = true;\r\n expanded = false;\r\n readonly type = HistoryEntryType;\r\n\r\n getDisplayType(entry: OrderHistoryItem): TimelineDisplayType {\r\n if (entry.type === HistoryEntryType.ORDER_STATE_TRANSITION) {\r\n if (entry.data.to === 'Delivered') {\r\n return 'success';\r\n }\r\n if (entry.data.to === 'Cancelled') {\r\n return 'error';\r\n }\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_FULFILLMENT_TRANSITION) {\r\n if (entry.data.to === 'Delivered') {\r\n return 'success';\r\n }\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_PAYMENT_TRANSITION) {\r\n if (entry.data.to === 'Declined' || entry.data.to === 'Cancelled') {\r\n return 'error';\r\n }\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_CANCELLATION) {\r\n return 'error';\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_REFUND_TRANSITION) {\r\n return 'warning';\r\n }\r\n return 'default';\r\n }\r\n\r\n getTimelineIcon(entry: OrderHistoryItem) {\r\n if (entry.type === HistoryEntryType.ORDER_STATE_TRANSITION) {\r\n if (entry.data.to === 'Delivered') {\r\n return ['success-standard', 'is-solid'];\r\n }\r\n if (entry.data.to === 'Cancelled') {\r\n return 'ban';\r\n }\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_PAYMENT_TRANSITION) {\r\n if (entry.data.to === 'Settled') {\r\n return 'credit-card';\r\n }\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_NOTE) {\r\n return 'note';\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_MODIFIED) {\r\n return 'pencil';\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_FULFILLMENT_TRANSITION) {\r\n if (entry.data.to === 'Shipped') {\r\n return 'truck';\r\n }\r\n if (entry.data.to === 'Delivered') {\r\n return 'truck';\r\n }\r\n }\r\n }\r\n\r\n isFeatured(entry: OrderHistoryItem): boolean {\r\n switch (entry.type) {\r\n case HistoryEntryType.ORDER_STATE_TRANSITION: {\r\n return (\r\n entry.data.to === 'Delivered' ||\r\n entry.data.to === 'Cancelled' ||\r\n entry.data.to === 'Settled'\r\n );\r\n }\r\n case HistoryEntryType.ORDER_PAYMENT_TRANSITION:\r\n return entry.data.to === 'Settled' || entry.data.to === 'Cancelled';\r\n case HistoryEntryType.ORDER_FULFILLMENT_TRANSITION:\r\n return entry.data.to === 'Delivered' || entry.data.to === 'Shipped';\r\n case HistoryEntryType.ORDER_NOTE:\r\n case HistoryEntryType.ORDER_MODIFIED:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n getFulfillment(\r\n entry: OrderHistoryItem,\r\n ): NonNullable<OrderDetailFragment['fulfillments']>[number] | undefined {\r\n if (\r\n (entry.type === HistoryEntryType.ORDER_FULFILLMENT ||\r\n entry.type === HistoryEntryType.ORDER_FULFILLMENT_TRANSITION) &&\r\n this.order.fulfillments\r\n ) {\r\n return this.order.fulfillments.find(f => f.id === entry.data.fulfillmentId);\r\n }\r\n }\r\n\r\n getPayment(entry: OrderHistoryItem): NonNullable<OrderDetailFragment['payments']>[number] | undefined {\r\n if (entry.type === HistoryEntryType.ORDER_PAYMENT_TRANSITION && this.order.payments) {\r\n return this.order.payments.find(p => p.id === entry.data.paymentId);\r\n }\r\n }\r\n\r\n getCancelledItems(entry: OrderHistoryItem): Array<{ name: string; quantity: number }> {\r\n const itemMap = new Map<string, number>();\r\n const cancelledItemIds: string[] = entry.data.orderItemIds;\r\n for (const line of this.order.lines) {\r\n for (const item of line.items) {\r\n if (cancelledItemIds.includes(item.id)) {\r\n const count = itemMap.get(line.productVariant.name);\r\n if (count != null) {\r\n itemMap.set(line.productVariant.name, count + 1);\r\n } else {\r\n itemMap.set(line.productVariant.name, 1);\r\n }\r\n }\r\n }\r\n }\r\n return Array.from(itemMap.entries()).map(([name, quantity]) => ({ name, quantity }));\r\n }\r\n\r\n getModification(id: string) {\r\n return this.order.modifications.find(m => m.id === id);\r\n }\r\n\r\n getName(entry: OrderHistoryItem): string {\r\n const { administrator } = entry;\r\n if (administrator) {\r\n return `${administrator.firstName} ${administrator.lastName}`;\r\n } else {\r\n const customer = this.order.customer;\r\n if (customer) {\r\n return `${customer.firstName} ${customer.lastName}`;\r\n }\r\n }\r\n return '';\r\n }\r\n\r\n addNoteToOrder() {\r\n this.addNote.emit({ note: this.note, isPublic: !this.noteIsPrivate });\r\n this.note = '';\r\n this.noteIsPrivate = true;\r\n }\r\n}\r\n","<vdr-chip [title]=\"'order.payment-state' | translate\" [colorType]=\"chipColorType\">\r\n <clr-icon shape=\"check-circle\" *ngIf=\"state === 'Settled'\"></clr-icon>\r\n {{ state | stateI18nToken | translate }}\r\n</vdr-chip>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'vdr-payment-state-label',\r\n templateUrl: './payment-state-label.component.html',\r\n styleUrls: ['./payment-state-label.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class PaymentStateLabelComponent {\r\n @Input() state: string;\r\n\r\n get chipColorType() {\r\n switch (this.state) {\r\n case 'Authorized':\r\n return 'warning';\r\n case 'Settled':\r\n return 'success';\r\n case 'Declined':\r\n case 'Cancelled':\r\n return 'error';\r\n }\r\n }\r\n}\r\n","<vdr-chip [title]=\"'order.payment-state' | translate\" [colorType]=\"chipColorType\">\r\n <clr-icon shape=\"check-circle\" *ngIf=\"state === 'Settled'\"></clr-icon>\r\n {{ state | stateI18nToken | translate }}\r\n</vdr-chip>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'vdr-refund-state-label',\r\n templateUrl: './refund-state-label.component.html',\r\n styleUrls: ['./refund-state-label.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RefundStateLabelComponent {\r\n @Input() state: string;\r\n\r\n get chipColorType() {\r\n switch (this.state) {\r\n case 'Pending':\r\n return 'warning';\r\n case 'Settled':\r\n return 'success';\r\n case 'Failed':\r\n return 'error';\r\n }\r\n }\r\n}\r\n","<div class=\"card\">\r\n <div class=\"card-header payment-header\">\r\n <div>\r\n {{ 'order.payment' | translate }}\r\n <ng-container *ngIf=\"payment.transactionId\">#{{ payment.transactionId }}</ng-container>\r\n </div>\r\n <div class=\"payment-state\">\r\n <vdr-payment-state-label [state]=\"payment.state\"></vdr-payment-state-label>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-payment-detail [payment]=\"payment\" [currencyCode]=\"currencyCode\"></vdr-payment-detail>\r\n </div>\r\n <ng-container *ngFor=\"let refund of payment.refunds\">\r\n <div class=\"card-header payment-header\">\r\n <clr-icon shape=\"redo\" class=\"refund-icon\" dir=\"down\"></clr-icon>\r\n {{ 'order.refund' | translate }} #{{ refund.id }}\r\n <div class=\"clr-flex-fill\"></div>\r\n <vdr-refund-state-label [state]=\"refund.state\"></vdr-refund-state-label>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-labeled-data [label]=\"'common.created-at' | translate\">\r\n {{ refund.createdAt | localeDate: 'medium' }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-total' | translate\">\r\n {{ refund.total | localeCurrency: currencyCode }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.transaction-id' | translate\" *ngIf=\"refund.transactionId\">\r\n {{ refund.transactionId }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-reason' | translate\" *ngIf=\"refund.reason\">\r\n {{ refund.reason }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-metadata' | translate\" *ngIf=\"refundHasMetadata(refund)\">\r\n <vdr-object-tree [value]=\"refund.metadata\"></vdr-object-tree>\r\n </vdr-labeled-data>\r\n </div>\r\n <div class=\"card-footer\" *ngIf=\"refund.state === 'Pending'\">\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"settleRefund.emit(refund)\">\r\n {{ 'order.settle-refund' | translate }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer\" *ngIf=\"payment.nextStates.length\">\r\n <button\r\n class=\"btn btn-sm btn-primary\"\r\n *ngIf=\"payment.nextStates.includes('Settled')\"\r\n (click)=\"settlePayment.emit(payment)\"\r\n >\r\n {{ 'order.settle-payment' | translate }}\r\n </button>\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 <ng-container *ngFor=\"let nextState of nextOtherStates()\">\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n (click)=\"transitionPaymentState.emit({ payment: payment, state: nextState })\"\r\n >\r\n <ng-container *ngIf=\"nextState !== 'Cancelled'; else cancel\">\r\n <clr-icon shape=\"step-forward-2\"></clr-icon>\r\n {{\r\n 'order.transition-to-state'\r\n | translate: { state: (nextState | stateI18nToken | translate) }\r\n }}\r\n </ng-container>\r\n <ng-template #cancel>\r\n <clr-icon shape=\"error-standard\" class=\"is-error\"></clr-icon>\r\n {{ 'order.cancel-payment' | translate }}\r\n </ng-template>\r\n </button>\r\n </ng-container>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CurrencyCode, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\ntype Payment = NonNullable<OrderDetailFragment['payments']>[number];\r\n\r\n@Component({\r\n selector: 'vdr-order-payment-card',\r\n templateUrl: './order-payment-card.component.html',\r\n styleUrls: ['./order-payment-card.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderPaymentCardComponent {\r\n @Input() payment: Payment;\r\n @Input() currencyCode: CurrencyCode;\r\n @Output() settlePayment = new EventEmitter<Payment>();\r\n @Output() transitionPaymentState = new EventEmitter<{ payment: Payment; state: string }>();\r\n @Output() settleRefund = new EventEmitter<Payment['refunds'][number]>();\r\n\r\n refundHasMetadata(refund?: Payment['refunds'][number]): boolean {\r\n return !!refund && Object.keys(refund.metadata).length > 0;\r\n }\r\n\r\n nextOtherStates(): string[] {\r\n if (!this.payment) {\r\n return [];\r\n }\r\n return this.payment.nextStates.filter(s => s !== 'Settled' && s !== 'Error');\r\n }\r\n}\r\n","<vdr-action-bar *ngIf=\"entity$ | async as order\">\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-order-state-label [state]=\"order.state\">\r\n <button\r\n class=\"icon-button\"\r\n (click)=\"openStateDiagram()\"\r\n [title]=\"'order.order-state-diagram' | translate\"\r\n >\r\n <clr-icon shape=\"list\"></clr-icon>\r\n </button>\r\n </vdr-order-state-label>\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"\r\n (order.state === 'ArrangingPayment' || order.state === 'ArrangingAdditionalPayment') &&\r\n (hasUnsettledModifications(order) || 0 < outstandingPaymentAmount(order))\r\n \"\r\n (click)=\"addManualPayment(order)\"\r\n >\r\n {{ 'order.add-payment-to-order' | translate }}\r\n ({{ outstandingPaymentAmount(order) | localeCurrency: order.currencyCode }})\r\n </button>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"\r\n order.active === false &&\r\n order.state !== 'ArrangingAdditionalPayment' &&\r\n 0 < outstandingPaymentAmount(order)\r\n \"\r\n (click)=\"transitionToState('ArrangingAdditionalPayment')\"\r\n >\r\n {{ 'order.arrange-additional-payment' | translate }}\r\n </button>\r\n <button class=\"btn btn-primary\" (click)=\"fulfillOrder()\" [disabled]=\"!canAddFulfillment(order)\">\r\n {{ 'order.fulfill-order' | translate }}\r\n </button>\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 <ng-container *ngIf=\"order.nextStates.includes('Modifying')\">\r\n <button type=\"button\" class=\"btn\" vdrDropdownItem (click)=\"transitionToModifying()\">\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'order.modify-order' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n </ng-container>\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n *ngIf=\"order.nextStates.includes('Cancelled')\"\r\n (click)=\"cancelOrRefund(order)\"\r\n >\r\n <clr-icon shape=\"error-standard\" class=\"is-error\"></clr-icon>\r\n <ng-container *ngIf=\"orderHasSettledPayments(order); else cancelOnly\">\r\n {{ 'order.refund-and-cancel-order' | translate }}\r\n </ng-container>\r\n <ng-template #cancelOnly>\r\n {{ 'order.cancel-order' | translate }}\r\n </ng-template>\r\n </button>\r\n\r\n <ng-container *ngIf=\"(nextStates$ | async)?.length\">\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n *ngFor=\"let nextState of nextStates$ | async\"\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n (click)=\"transitionToState(nextState)\"\r\n >\r\n <clr-icon shape=\"step-forward-2\"></clr-icon>\r\n {{\r\n 'order.transition-to-state'\r\n | translate: { state: (nextState | stateI18nToken | translate) }\r\n }}\r\n </button>\r\n </ng-container>\r\n <div class=\"dropdown-divider\"></div>\r\n <button type=\"button\" class=\"btn\" vdrDropdownItem (click)=\"manuallyTransitionToState(order)\">\r\n <clr-icon shape=\"step-forward-2\" class=\"is-warning\"></clr-icon>\r\n {{ 'order.manually-transition-to-state' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngIf=\"entity$ | async as order\">\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-lg-8\">\r\n <vdr-order-table\r\n [order]=\"order\"\r\n [orderLineCustomFields]=\"orderLineCustomFields\"\r\n ></vdr-order-table>\r\n <h4>{{ 'order.tax-summary' | translate }}</h4>\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.description' | translate }}</th>\r\n <th>{{ 'order.tax-rate' | translate }}</th>\r\n <th>{{ 'order.tax-base' | translate }}</th>\r\n <th>{{ 'order.tax-total' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of order.taxSummary\">\r\n <td>{{ row.description }}</td>\r\n <td>{{ row.taxRate / 100 | percent }}</td>\r\n <td>{{ row.taxBase | localeCurrency: order.currencyCode }}</td>\r\n <td>{{ row.taxTotal | localeCurrency: order.currencyCode }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <vdr-custom-detail-component-host\r\n locationId=\"order-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n\r\n <vdr-order-history\r\n [order]=\"order\"\r\n [history]=\"history$ | async\"\r\n (addNote)=\"addNote($event)\"\r\n (updateNote)=\"updateNote($event)\"\r\n (deleteNote)=\"deleteNote($event)\"\r\n ></vdr-order-history>\r\n </div>\r\n <div class=\"clr-col-lg-4 order-cards\">\r\n <vdr-order-custom-fields-card\r\n [customFieldsConfig]=\"customFields\"\r\n [customFieldValues]=\"order.customFields\"\r\n (updateClick)=\"updateCustomFields($event)\"\r\n ></vdr-order-custom-fields-card>\r\n <div class=\"card\">\r\n <div class=\"card-header\">\r\n {{ 'order.customer' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"card-text\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n <h6 *ngIf=\"getOrderAddressLines(order.shippingAddress).length\">\r\n {{ 'order.shipping-address' | translate }}\r\n </h6>\r\n <vdr-formatted-address [address]=\"order.shippingAddress\"></vdr-formatted-address>\r\n <h6 *ngIf=\"getOrderAddressLines(order.billingAddress).length\">\r\n {{ 'order.billing-address' | translate }}\r\n </h6>\r\n <vdr-formatted-address [address]=\"order.billingAddress\"></vdr-formatted-address>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"order.payments && order.payments.length\">\r\n <vdr-order-payment-card\r\n *ngFor=\"let payment of order.payments\"\r\n [currencyCode]=\"order.currencyCode\"\r\n [payment]=\"payment\"\r\n (settlePayment)=\"settlePayment($event)\"\r\n (transitionPaymentState)=\"transitionPaymentState($event)\"\r\n (settleRefund)=\"settleRefund($event)\"\r\n ></vdr-order-payment-card>\r\n </ng-container>\r\n <ng-container *ngFor=\"let fulfillment of order.fulfillments\">\r\n <vdr-fulfillment-card\r\n [fulfillment]=\"fulfillment\"\r\n [order]=\"order\"\r\n (transitionState)=\"transitionFulfillment(fulfillment.id, $event)\"\r\n ></vdr-fulfillment-card>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormGroup } 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 CancelOrderMutation,\r\n CustomFieldConfig,\r\n DataService,\r\n EditNoteDialogComponent,\r\n FulfillmentFragment,\r\n FulfillmentLineSummary,\r\n GetOrderHistoryQuery,\r\n GetOrderQuery,\r\n HistoryEntry,\r\n ModalService,\r\n NotificationService,\r\n Order,\r\n OrderDetailFragment,\r\n OrderLineFragment,\r\n Refund,\r\n RefundOrderMutation,\r\n ServerConfigService,\r\n SortOrder,\r\n} from '@vendure/admin-ui/core';\r\nimport { pick } from '@vendure/common/lib/pick';\r\nimport { assertNever, summate } from '@vendure/common/lib/shared-utils';\r\nimport { EMPTY, merge, Observable, of, Subject } from 'rxjs';\r\nimport { map, mapTo, startWith, switchMap, take } from 'rxjs/operators';\r\n\r\nimport { OrderTransitionService } from '../../providers/order-transition.service';\r\nimport { AddManualPaymentDialogComponent } from '../add-manual-payment-dialog/add-manual-payment-dialog.component';\r\nimport { CancelOrderDialogComponent } from '../cancel-order-dialog/cancel-order-dialog.component';\r\nimport { FulfillOrderDialogComponent } from '../fulfill-order-dialog/fulfill-order-dialog.component';\r\nimport { OrderProcessGraphDialogComponent } from '../order-process-graph-dialog/order-process-graph-dialog.component';\r\nimport { RefundOrderDialogComponent } from '../refund-order-dialog/refund-order-dialog.component';\r\nimport { SettleRefundDialogComponent } from '../settle-refund-dialog/settle-refund-dialog.component';\r\n\r\ntype Payment = NonNullable<OrderDetailFragment['payments']>[number];\r\n\r\n@Component({\r\n selector: 'vdr-order-detail',\r\n templateUrl: './order-detail.component.html',\r\n styleUrls: ['./order-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderDetailComponent\r\n extends BaseDetailComponent<OrderDetailFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n detailForm = new FormGroup({});\r\n history$: Observable<NonNullable<GetOrderHistoryQuery['order']>['history']['items'] | undefined>;\r\n nextStates$: Observable<string[]>;\r\n fetchHistory = new Subject<void>();\r\n customFields: CustomFieldConfig[];\r\n orderLineCustomFields: CustomFieldConfig[];\r\n private readonly defaultStates = [\r\n 'AddingItems',\r\n 'ArrangingPayment',\r\n 'PaymentAuthorized',\r\n 'PaymentSettled',\r\n 'PartiallyShipped',\r\n 'Shipped',\r\n 'PartiallyDelivered',\r\n 'Delivered',\r\n 'Cancelled',\r\n 'Modifying',\r\n 'ArrangingAdditionalPayment',\r\n ];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private orderTransitionService: OrderTransitionService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.entity$.pipe(take(1)).subscribe(order => {\r\n if (order.state === 'Modifying') {\r\n this.router.navigate(['./', 'modify'], { relativeTo: this.route });\r\n }\r\n });\r\n this.customFields = this.getCustomFieldConfig('Order');\r\n this.orderLineCustomFields = this.getCustomFieldConfig('OrderLine');\r\n this.history$ = this.fetchHistory.pipe(\r\n startWith(null),\r\n switchMap(() => {\r\n return this.dataService.order\r\n .getOrderHistory(this.id, {\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n })\r\n .mapStream(data => data.order?.history.items);\r\n }),\r\n );\r\n this.nextStates$ = this.entity$.pipe(\r\n map(order => {\r\n const isInCustomState = !this.defaultStates.includes(order.state);\r\n return isInCustomState\r\n ? order.nextStates\r\n : order.nextStates.filter(s => !this.defaultStates.includes(s));\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n openStateDiagram() {\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n switchMap(order =>\r\n this.modalService.fromComponent(OrderProcessGraphDialogComponent, {\r\n closable: true,\r\n locals: {\r\n activeState: order.state,\r\n },\r\n }),\r\n ),\r\n )\r\n .subscribe();\r\n }\r\n\r\n transitionToState(state: string) {\r\n this.dataService.order.transitionToState(this.id, state).subscribe(({ transitionOrderToState }) => {\r\n switch (transitionOrderToState?.__typename) {\r\n case 'Order':\r\n this.notificationService.success(_('order.transitioned-to-state-success'), { state });\r\n this.fetchHistory.next();\r\n break;\r\n case 'OrderStateTransitionError':\r\n this.notificationService.error(transitionOrderToState.transitionError);\r\n }\r\n });\r\n }\r\n\r\n manuallyTransitionToState(order: OrderDetailFragment) {\r\n this.orderTransitionService\r\n .manuallyTransitionToState({\r\n orderId: order.id,\r\n nextStates: order.nextStates,\r\n cancellable: true,\r\n message: _('order.manually-transition-to-state-message'),\r\n retry: 0,\r\n })\r\n .subscribe();\r\n }\r\n\r\n transitionToModifying() {\r\n this.dataService.order\r\n .transitionToState(this.id, 'Modifying')\r\n .subscribe(({ transitionOrderToState }) => {\r\n switch (transitionOrderToState?.__typename) {\r\n case 'Order':\r\n this.router.navigate(['./modify'], { relativeTo: this.route });\r\n break;\r\n case 'OrderStateTransitionError':\r\n this.notificationService.error(transitionOrderToState.transitionError);\r\n }\r\n });\r\n }\r\n\r\n updateCustomFields(customFieldsValue: any) {\r\n this.dataService.order\r\n .updateOrderCustomFields({\r\n id: this.id,\r\n customFields: customFieldsValue,\r\n })\r\n .subscribe(() => {\r\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Order' });\r\n });\r\n }\r\n\r\n getOrderAddressLines(orderAddress?: { [key: string]: string }): string[] {\r\n if (!orderAddress) {\r\n return [];\r\n }\r\n return Object.values(orderAddress)\r\n .filter(val => val !== 'OrderAddress')\r\n .filter(line => !!line);\r\n }\r\n\r\n settlePayment(payment: Payment) {\r\n this.dataService.order.settlePayment(payment.id).subscribe(({ settlePayment }) => {\r\n switch (settlePayment.__typename) {\r\n case 'Payment':\r\n if (settlePayment.state === 'Settled') {\r\n this.notificationService.success(_('order.settle-payment-success'));\r\n } else {\r\n this.notificationService.error(_('order.settle-payment-error'));\r\n }\r\n this.dataService.order.getOrder(this.id).single$.subscribe();\r\n this.fetchHistory.next();\r\n break;\r\n case 'OrderStateTransitionError':\r\n case 'PaymentStateTransitionError':\r\n case 'SettlePaymentError':\r\n this.notificationService.error(settlePayment.message);\r\n }\r\n });\r\n }\r\n\r\n transitionPaymentState({ payment, state }: { payment: Payment; state: string }) {\r\n if (state === 'Cancelled') {\r\n this.dataService.order.cancelPayment(payment.id).subscribe(({ cancelPayment }) => {\r\n switch (cancelPayment.__typename) {\r\n case 'Payment':\r\n this.notificationService.success(_('order.transitioned-payment-to-state-success'), {\r\n state,\r\n });\r\n this.dataService.order.getOrder(this.id).single$.subscribe();\r\n this.fetchHistory.next();\r\n break;\r\n case 'PaymentStateTransitionError':\r\n this.notificationService.error(cancelPayment.transitionError);\r\n break;\r\n case 'CancelPaymentError':\r\n this.notificationService.error(cancelPayment.paymentErrorMessage);\r\n break;\r\n }\r\n });\r\n } else {\r\n this.dataService.order\r\n .transitionPaymentToState(payment.id, state)\r\n .subscribe(({ transitionPaymentToState }) => {\r\n switch (transitionPaymentToState.__typename) {\r\n case 'Payment':\r\n this.notificationService.success(\r\n _('order.transitioned-payment-to-state-success'),\r\n {\r\n state,\r\n },\r\n );\r\n this.dataService.order.getOrder(this.id).single$.subscribe();\r\n this.fetchHistory.next();\r\n break;\r\n case 'PaymentStateTransitionError':\r\n this.notificationService.error(transitionPaymentToState.message);\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n\r\n canAddFulfillment(order: OrderDetailFragment): boolean {\r\n const allFulfillmentSummaryRows: FulfillmentFragment['summary'] = (order.fulfillments ?? []).reduce(\r\n (all, fulfillment) => [...all, ...fulfillment.summary],\r\n [] as FulfillmentFragment['summary'],\r\n );\r\n let allItemsFulfilled = true;\r\n for (const line of order.lines) {\r\n const totalFulfilledCount = allFulfillmentSummaryRows\r\n .filter(row => row.orderLine.id === line.id)\r\n .reduce((sum, row) => sum + row.quantity, 0);\r\n if (totalFulfilledCount < line.quantity) {\r\n allItemsFulfilled = false;\r\n }\r\n }\r\n return (\r\n !allItemsFulfilled &&\r\n !this.hasUnsettledModifications(order) &&\r\n this.outstandingPaymentAmount(order) === 0 &&\r\n (order.nextStates.includes('Shipped') ||\r\n order.nextStates.includes('PartiallyShipped') ||\r\n order.nextStates.includes('Delivered'))\r\n );\r\n }\r\n\r\n hasUnsettledModifications(order: OrderDetailFragment): boolean {\r\n return 0 < order.modifications.filter(m => !m.isSettled).length;\r\n }\r\n\r\n getOutstandingModificationAmount(order: OrderDetailFragment): number {\r\n return summate(\r\n order.modifications.filter(m => !m.isSettled),\r\n 'priceChange',\r\n );\r\n }\r\n\r\n outstandingPaymentAmount(order: OrderDetailFragment): number {\r\n const paymentIsValid = (p: Payment): boolean =>\r\n p.state !== 'Cancelled' && p.state !== 'Declined' && p.state !== 'Error';\r\n\r\n let amountCovered = 0;\r\n for (const payment of order.payments?.filter(paymentIsValid) ?? []) {\r\n const refunds = payment.refunds.filter(r => r.state !== 'Failed') ?? [];\r\n const refundsTotal = summate(refunds as Array<Required<Refund>>, 'total');\r\n amountCovered += payment.amount - refundsTotal;\r\n }\r\n return order.totalWithTax - amountCovered;\r\n }\r\n\r\n addManualPayment(order: OrderDetailFragment) {\r\n const priorState = order.state;\r\n this.modalService\r\n .fromComponent(AddManualPaymentDialogComponent, {\r\n closable: true,\r\n locals: {\r\n outstandingAmount: this.outstandingPaymentAmount(order),\r\n currencyCode: order.currencyCode,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.order.addManualPaymentToOrder({\r\n orderId: this.id,\r\n transactionId: result.transactionId,\r\n method: result.method,\r\n metadata: result.metadata || {},\r\n });\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n switchMap(({ addManualPaymentToOrder }) => {\r\n switch (addManualPaymentToOrder.__typename) {\r\n case 'Order':\r\n this.notificationService.success(_('order.add-payment-to-order-success'));\r\n if (priorState === 'ArrangingAdditionalPayment') {\r\n return this.orderTransitionService.transitionToPreModifyingState(\r\n order.id,\r\n order.nextStates,\r\n );\r\n } else {\r\n return this.dataService.order\r\n .transitionToState(this.id, 'PaymentSettled')\r\n .pipe(mapTo('PaymentSettled'));\r\n }\r\n case 'ManualPaymentStateError':\r\n this.notificationService.error(addManualPaymentToOrder.message);\r\n return EMPTY;\r\n default:\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n this.refetchOrder({ result });\r\n }\r\n });\r\n }\r\n\r\n fulfillOrder() {\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n switchMap(order => {\r\n return this.modalService.fromComponent(FulfillOrderDialogComponent, {\r\n size: 'xl',\r\n locals: {\r\n order,\r\n },\r\n });\r\n }),\r\n switchMap(input => {\r\n if (input) {\r\n return this.dataService.order.createFulfillment(input);\r\n } else {\r\n return of(undefined);\r\n }\r\n }),\r\n switchMap(result => this.refetchOrder(result).pipe(mapTo(result))),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n const { addFulfillmentToOrder } = result;\r\n switch (addFulfillmentToOrder.__typename) {\r\n case 'Fulfillment':\r\n this.notificationService.success(_('order.create-fulfillment-success'));\r\n break;\r\n case 'EmptyOrderLineSelectionError':\r\n case 'InsufficientStockOnHandError':\r\n case 'ItemsAlreadyFulfilledError':\r\n case 'InvalidFulfillmentHandlerError':\r\n this.notificationService.error(addFulfillmentToOrder.message);\r\n break;\r\n case 'FulfillmentStateTransitionError':\r\n this.notificationService.error(addFulfillmentToOrder.transitionError);\r\n break;\r\n case 'CreateFulfillmentError':\r\n this.notificationService.error(addFulfillmentToOrder.fulfillmentHandlerError);\r\n break;\r\n case undefined:\r\n this.notificationService.error(JSON.stringify(addFulfillmentToOrder));\r\n break;\r\n default:\r\n assertNever(addFulfillmentToOrder);\r\n }\r\n }\r\n });\r\n }\r\n\r\n transitionFulfillment(id: string, state: string) {\r\n this.dataService.order\r\n .transitionFulfillmentToState(id, state)\r\n .pipe(switchMap(result => this.refetchOrder(result)))\r\n .subscribe(() => {\r\n this.notificationService.success(_('order.successfully-updated-fulfillment'));\r\n });\r\n }\r\n\r\n cancelOrRefund(order: OrderDetailFragment) {\r\n const isRefundable = this.orderHasSettledPayments(order);\r\n if (order.state === 'PaymentAuthorized' || order.active === true || !isRefundable) {\r\n this.cancelOrder(order);\r\n } else {\r\n this.refundOrder(order);\r\n }\r\n }\r\n\r\n settleRefund(refund: Payment['refunds'][number]) {\r\n this.modalService\r\n .fromComponent(SettleRefundDialogComponent, {\r\n size: 'md',\r\n locals: {\r\n refund,\r\n },\r\n })\r\n .pipe(\r\n switchMap(transactionId => {\r\n if (transactionId) {\r\n return this.dataService.order.settleRefund(\r\n {\r\n transactionId,\r\n id: refund.id,\r\n },\r\n this.id,\r\n );\r\n } else {\r\n return of(undefined);\r\n }\r\n }),\r\n // switchMap(result => this.refetchOrder(result)),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n this.notificationService.success(_('order.settle-refund-success'));\r\n }\r\n });\r\n }\r\n\r\n addNote(event: { note: string; isPublic: boolean }) {\r\n const { note, isPublic } = event;\r\n this.dataService.order\r\n .addNoteToOrder({\r\n id: this.id,\r\n note,\r\n isPublic,\r\n })\r\n .pipe(switchMap(result => this.refetchOrder(result)))\r\n .subscribe(result => {\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: HistoryEntry) {\r\n this.modalService\r\n .fromComponent(EditNoteDialogComponent, {\r\n closable: true,\r\n locals: {\r\n displayPrivacyControls: true,\r\n note: entry.data.note,\r\n noteIsPrivate: !entry.isPublic,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.order.updateOrderNote({\r\n noteId: entry.id,\r\n isPublic: !result.isPrivate,\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: HistoryEntry) {\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.order.deleteOrderNote(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 orderHasSettledPayments(order: OrderDetailFragment): boolean {\r\n return !!order.payments?.find(p => p.state === 'Settled');\r\n }\r\n\r\n private cancelOrder(order: OrderDetailFragment) {\r\n this.modalService\r\n .fromComponent(CancelOrderDialogComponent, {\r\n size: 'xl',\r\n locals: {\r\n order,\r\n },\r\n })\r\n .pipe(\r\n switchMap(input => {\r\n if (input) {\r\n return this.dataService.order.cancelOrder(input);\r\n } else {\r\n return of(undefined);\r\n }\r\n }),\r\n switchMap(result => this.refetchOrder(result)),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n this.notificationService.success(_('order.cancelled-order-success'));\r\n }\r\n });\r\n }\r\n\r\n private refundOrder(order: OrderDetailFragment) {\r\n this.modalService\r\n .fromComponent(RefundOrderDialogComponent, {\r\n size: 'xl',\r\n locals: {\r\n order,\r\n },\r\n })\r\n .pipe(\r\n switchMap(input => {\r\n if (!input) {\r\n return of(undefined);\r\n }\r\n\r\n if (input.cancel.lines?.length) {\r\n return this.dataService.order.cancelOrder(input.cancel).pipe(\r\n map(res => {\r\n const result = res.cancelOrder;\r\n switch (result.__typename) {\r\n case 'Order':\r\n this.refetchOrder(result).subscribe();\r\n this.notificationService.success(_('order.cancelled-order-success'));\r\n return input;\r\n case 'CancelActiveOrderError':\r\n case 'QuantityTooGreatError':\r\n case 'MultipleOrderError':\r\n case 'OrderStateTransitionError':\r\n case 'EmptyOrderLineSelectionError':\r\n this.notificationService.error(result.message);\r\n return undefined;\r\n }\r\n }),\r\n );\r\n } else {\r\n return [input];\r\n }\r\n }),\r\n switchMap(input => {\r\n if (!input) {\r\n return of(undefined);\r\n }\r\n if (input.refund.lines.length) {\r\n return this.dataService.order\r\n .refundOrder(input.refund)\r\n .pipe(map(res => res.refundOrder));\r\n } else {\r\n return [undefined];\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n switch (result.__typename) {\r\n case 'Refund':\r\n this.refetchOrder(result).subscribe();\r\n if (result.state === 'Failed') {\r\n this.notificationService.error(_('order.refund-order-failed'));\r\n } else {\r\n this.notificationService.success(_('order.refund-order-success'));\r\n }\r\n break;\r\n case 'AlreadyRefundedError':\r\n case 'NothingToRefundError':\r\n case 'PaymentOrderMismatchError':\r\n case 'RefundOrderStateError':\r\n case 'RefundStateTransitionError':\r\n this.notificationService.error(result.message);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n private refetchOrder(result: object | undefined): Observable<GetOrderQuery | undefined> {\r\n this.fetchHistory.next();\r\n if (result) {\r\n return this.dataService.order.getOrder(this.id).single$;\r\n } else {\r\n return of(undefined);\r\n }\r\n }\r\n\r\n protected setFormValues(entity: OrderDetailFragment): void {\r\n // empty\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { CustomFieldConfig, Dialog, ModifyOrderInput, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\nexport enum OrderEditResultType {\r\n Refund,\r\n Payment,\r\n PriceUnchanged,\r\n Cancel,\r\n}\r\n\r\ninterface OrderEditsRefundResult {\r\n result: OrderEditResultType.Refund;\r\n refundPaymentId: string;\r\n refundNote?: string;\r\n}\r\ninterface OrderEditsPaymentResult {\r\n result: OrderEditResultType.Payment;\r\n}\r\ninterface OrderEditsPriceUnchangedResult {\r\n result: OrderEditResultType.PriceUnchanged;\r\n}\r\ninterface OrderEditsCancelResult {\r\n result: OrderEditResultType.Cancel;\r\n}\r\ntype OrderEditResult =\r\n | OrderEditsRefundResult\r\n | OrderEditsPaymentResult\r\n | OrderEditsPriceUnchangedResult\r\n | OrderEditsCancelResult;\r\n\r\n@Component({\r\n selector: 'vdr-order-edits-preview-dialog',\r\n templateUrl: './order-edits-preview-dialog.component.html',\r\n styleUrls: ['./order-edits-preview-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderEditsPreviewDialogComponent implements OnInit, Dialog<OrderEditResult> {\r\n // Passed in via the modalService\r\n order: OrderDetailFragment;\r\n originalTotalWithTax: number;\r\n orderLineCustomFields: CustomFieldConfig[];\r\n modifyOrderInput: ModifyOrderInput;\r\n\r\n selectedPayment?: NonNullable<OrderDetailFragment['payments']>[number];\r\n refundNote: string;\r\n resolveWith: (result?: OrderEditResult) => void;\r\n\r\n get priceDifference(): number {\r\n return this.order.totalWithTax - this.originalTotalWithTax;\r\n }\r\n\r\n ngOnInit() {\r\n this.refundNote = this.modifyOrderInput.note || '';\r\n }\r\n\r\n cancel() {\r\n this.resolveWith({\r\n result: OrderEditResultType.Cancel,\r\n });\r\n }\r\n\r\n submit() {\r\n if (0 < this.priceDifference) {\r\n this.resolveWith({\r\n result: OrderEditResultType.Payment,\r\n });\r\n } else if (this.priceDifference < 0) {\r\n this.resolveWith({\r\n result: OrderEditResultType.Refund,\r\n // tslint:disable-next-line:no-non-null-assertion\r\n refundPaymentId: this.selectedPayment!.id,\r\n refundNote: this.refundNote,\r\n });\r\n } else {\r\n this.resolveWith({\r\n result: OrderEditResultType.PriceUnchanged,\r\n });\r\n }\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.confirm-modifications' | translate }}</ng-template>\r\n<vdr-order-table [order]=\"order\" [orderLineCustomFields]=\"orderLineCustomFields\"></vdr-order-table>\r\n\r\n<h4 class=\"h4\">\r\n {{ 'order.modify-order-price-difference' | translate }}:\r\n <strong>{{ priceDifference | localeCurrency: order.currencyCode }}</strong>\r\n</h4>\r\n<div *ngIf=\"priceDifference < 0\">\r\n<clr-select-container>\r\n <label>{{ 'order.payment-to-refund' | translate }}</label>\r\n <select clrSelect name=\"options\" [(ngModel)]=\"selectedPayment\">\r\n <option\r\n *ngFor=\"let payment of order.payments\"\r\n [ngValue]=\"payment\"\r\n >\r\n #{{ payment.id }} {{ payment.method }}:\r\n {{ payment.amount | localeCurrency: order.currencyCode }}\r\n </option>\r\n </select>\r\n</clr-select-container>\r\n <label class=\"clr-control-label\">{{ 'order.refund-cancellation-reason' | translate }}</label>\r\n <textarea [(ngModel)]=\"refundNote\" name=\"refundNote\" clrTextarea required></textarea>\r\n</div>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"submit()\" [disabled]=\"priceDifference < 0 && !selectedPayment\" class=\"btn btn-primary\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>\r\n","<vdr-action-bar *ngIf=\"entity$ | async as order\">\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-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <button class=\"btn btn-secondary\" (click)=\"transitionToPriorState(order)\">\r\n {{ 'order.cancel-modification' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngIf=\"entity$ | async as order\">\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-lg-8\">\r\n <table class=\"order-table table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th *ngIf=\"orderLineCustomFields.length\">{{ 'common.custom-fields' | translate }}</th>\r\n <th>{{ 'order.total' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"let line of order.lines; let i = index\"\r\n class=\"order-line\"\r\n [class.is-cancelled]=\"line.quantity === 0\"\r\n [class.modified]=\"isLineModified(line)\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img\r\n *ngIf=\"line.featuredAsset\"\r\n [src]=\"line.featuredAsset | assetPreview: 'tiny'\"\r\n />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ line.unitPriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.unitPrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n [value]=\"line.quantity\"\r\n (input)=\"updateLineQuantity(line, $event.target.value)\"\r\n />\r\n <vdr-line-refunds [line]=\"line\" [payments]=\"order.payments\"></vdr-line-refunds>\r\n <vdr-line-fulfillment\r\n [line]=\"line\"\r\n [orderState]=\"order.state\"\r\n ></vdr-line-fulfillment>\r\n </td>\r\n <td *ngIf=\"orderLineCustomFields.length\" class=\"order-line-custom-field align-middle\">\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"orderLineCustomFieldsFormArray.get([i])\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{ line.linePriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.linePrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr\r\n *ngFor=\"let addedLine of addedLines; trackBy: trackByProductVariantId; let i = index\"\r\n class=\"modified\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img\r\n *ngIf=\"addedLine.productAsset\"\r\n [src]=\"addedLine.productAsset | assetPreview: 'tiny'\"\r\n />\r\n </td>\r\n <td class=\"align-middle name\">{{ addedLine.productVariantName }}</td>\r\n <td class=\"align-middle sku\">{{ addedLine.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ addedLine.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ addedLine.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n [value]=\"addedLine.quantity\"\r\n (input)=\"updateAddedItemQuantity(addedLine, $event.target.value)\"\r\n />\r\n <button class=\"icon-button\" (click)=\"removeAddedItem(i)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </td>\r\n <td *ngIf=\"orderLineCustomFields.length\" class=\"order-line-custom-field align-middle\">\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"addItemCustomFieldsFormArray.get([i])\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{\r\n (addedLine.priceWithTax * addedLine.quantity) / 100\r\n | currency: order.currencyCode\r\n }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{\r\n (addedLine.price * addedLine.quantity) / 100\r\n | currency: order.currencyCode\r\n }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr class=\"surcharge\" *ngFor=\"let surcharge of order.surcharges\">\r\n <td class=\"align-middle name left\" colspan=\"2\">{{ surcharge.description }}</td>\r\n <td class=\"align-middle sku\">{{ surcharge.sku }}</td>\r\n <td class=\"align-middle\"></td>\r\n <td></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"align-middle total\">\r\n {{ surcharge.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ surcharge.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr\r\n class=\"surcharge modified\"\r\n *ngFor=\"let surcharge of modifyOrderInput.surcharges; let i = index\"\r\n >\r\n <td class=\"align-middle name left\" colspan=\"2\">\r\n {{ surcharge.description }}\r\n <button class=\"icon-button\" (click)=\"removeSurcharge(i)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </td>\r\n <td class=\"align-middle sku\">{{ surcharge.sku }}</td>\r\n <td class=\"align-middle\"></td>\r\n <td></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"align-middle total\">\r\n <ng-container *ngIf=\"getSurchargePrices(surcharge) as surchargePrice\">\r\n {{ surchargePrice.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ surchargePrice.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr class=\"shipping\">\r\n <td class=\"left clr-align-middle\">{{ 'order.shipping' | translate }}</td>\r\n <td class=\"clr-align-middle\">{{ order.shippingLines[0]?.shippingMethod?.name }}</td>\r\n <td colspan=\"3\"></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"clr-align-middle\">\r\n {{ order.shippingWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ order.shipping | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <h4 class=\"mb2\">{{ 'order.modifications' | translate }}</h4>\r\n <clr-accordion>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.add-item-to-order' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-product-variant-selector class=\"mb4\" (productSelected)=\"addItemSelectedVariant = $event\">\r\n </vdr-product-variant-selector>\r\n <div *ngIf=\"addItemSelectedVariant\" class=\"flex mb4\">\r\n <img\r\n *ngIf=\"addItemSelectedVariant.productAsset as asset\"\r\n [src]=\"asset | assetPreview: 'tiny'\"\r\n class=\"mr4\"\r\n />\r\n <div>\r\n <strong class=\"mr4\">{{ addItemSelectedVariant.productVariantName }}</strong>\r\n <small>{{ addItemSelectedVariant.sku }}</small>\r\n <div>\r\n {{\r\n getSelectedItemPrice(addItemSelectedVariant)\r\n | localeCurrency: order.currencyCode\r\n }}\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [readonly]=\"!addItemSelectedVariant\"\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"addItemCustomFieldsForm\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"!addItemSelectedVariant || addItemCustomFieldsForm.invalid\"\r\n (click)=\"addItemToOrder(addItemSelectedVariant)\"\r\n >\r\n {{ 'order.add-item-to-order' | translate }}\r\n </button>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.set-coupon-codes' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <ng-select\r\n [items]=\"availableCouponCodes$ | async\"\r\n appendTo=\"body\"\r\n bindLabel=\"code\"\r\n bindValue=\"code\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n [hideSelected]=\"true\"\r\n [minTermLength]=\"2\"\r\n typeToSearchText=\"\"\r\n [typeahead]=\"couponCodeInput$\"\r\n [formControl]=\"couponCodesControl\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <vdr-chip>{{ item.code }}</vdr-chip> {{ item.promotionName }}\r\n </ng-template>\r\n </ng-select>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.add-surcharge' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <form [formGroup]=\"surchargeForm\" (submit)=\"addSurcharge(surchargeForm.value)\">\r\n <vdr-form-field [label]=\"'common.description' | translate\" for=\"description\"\r\n ><input id=\"description\" type=\"text\" formControlName=\"description\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.product-sku' | translate\" for=\"sku\"\r\n ><input id=\"sku\" type=\"text\" formControlName=\"sku\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'common.price' | translate\" for=\"price\"\r\n ><vdr-currency-input\r\n [currencyCode]=\"order.currencyCode\"\r\n id=\"price\"\r\n formControlName=\"price\"\r\n ></vdr-currency-input\r\n ></vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"\r\n 'catalog.price-includes-tax-at'\r\n | translate: { rate: surchargeForm.get('taxRate')?.value }\r\n \"\r\n for=\"priceIncludesTax\"\r\n ><input\r\n id=\"priceIncludesTax\"\r\n type=\"checkbox\"\r\n clrCheckbox\r\n formControlName=\"priceIncludesTax\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.tax-rate' | translate\" for=\"taxRate\"\r\n ><vdr-affixed-input suffix=\"%\"\r\n ><input\r\n id=\"taxRate\"\r\n type=\"number\"\r\n min=\"0\"\r\n max=\"100\"\r\n formControlName=\"taxRate\" /></vdr-affixed-input\r\n ></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.tax-description' | translate\" for=\"taxDescription\"\r\n ><input id=\"taxDescription\" type=\"text\" formControlName=\"taxDescription\"\r\n /></vdr-form-field>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"\r\n surchargeForm.invalid ||\r\n surchargeForm.pristine ||\r\n surchargeForm.get('price')?.value === 0\r\n \"\r\n >\r\n {{ 'order.add-surcharge' | translate }}\r\n </button>\r\n </form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.edit-shipping-address' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-address-form\r\n [formGroup]=\"shippingAddressForm\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [customFields]=\"addressCustomFields\"\r\n ></vdr-address-form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.edit-billing-address' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-address-form\r\n [formGroup]=\"billingAddressForm\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [customFields]=\"addressCustomFields\"\r\n ></vdr-address-form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n </clr-accordion>\r\n </div>\r\n <div class=\"clr-col-lg-4 order-cards\">\r\n <div class=\"card\">\r\n <div class=\"card-header\">\r\n {{ 'order.modification-summary' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <ul>\r\n <li *ngIf=\"modifyOrderInput.addItems?.length\">\r\n {{\r\n 'order.modification-adding-items'\r\n | translate: { count: modifyOrderInput.addItems?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"modifyOrderInput.adjustOrderLines?.length\">\r\n {{\r\n 'order.modification-adjusting-lines'\r\n | translate: { count: modifyOrderInput.adjustOrderLines?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"modifyOrderInput.surcharges?.length\">\r\n {{\r\n 'order.modification-adding-surcharges'\r\n | translate: { count: modifyOrderInput.surcharges?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"shippingAddressForm.dirty\">\r\n {{ 'order.modification-updating-shipping-address' | translate }}\r\n </li>\r\n <li *ngIf=\"billingAddressForm.dirty\">\r\n {{ 'order.modification-updating-billing-address' | translate }}\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"card-block\">\r\n <label class=\"clr-control-label\">{{ 'order.note' | translate }}</label>\r\n <textarea [(ngModel)]=\"note\" name=\"note\" clrTextarea required></textarea>\r\n <clr-checkbox-wrapper class=\"\">\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"recalculateShipping\" />\r\n <label>{{ 'order.modification-recalculate-shipping' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n <div class=\"card-footer\">\r\n <button\r\n class=\"btn btn-primary\"\r\n [disabled]=\"!canPreviewChanges()\"\r\n (click)=\"previewAndModify(order)\"\r\n >\r\n {{ 'order.preview-changes' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport {\r\n AddItemInput,\r\n AdjustOrderLineInput,\r\n BaseDetailComponent,\r\n CustomFieldConfig,\r\n DataService,\r\n ErrorResult,\r\n GetAvailableCountriesQuery,\r\n HistoryEntryType,\r\n LanguageCode,\r\n ModalService,\r\n ModifyOrderInput,\r\n NotificationService,\r\n OrderAddressFragment,\r\n OrderDetailFragment,\r\n ProductSelectorSearchQuery,\r\n ServerConfigService,\r\n SortOrder,\r\n SurchargeInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { assertNever, notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { concat, EMPTY, Observable, of, Subject } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n map,\r\n mapTo,\r\n shareReplay,\r\n startWith,\r\n switchMap,\r\n takeUntil,\r\n} from 'rxjs/operators';\r\n\r\nimport { OrderTransitionService } from '../../providers/order-transition.service';\r\nimport {\r\n OrderEditResultType,\r\n OrderEditsPreviewDialogComponent,\r\n} from '../order-edits-preview-dialog/order-edits-preview-dialog.component';\r\n\r\ntype ProductSelectorItem = ProductSelectorSearchQuery['search']['items'][number];\r\n\r\ninterface AddedLine {\r\n productVariantId: string;\r\n productAsset?: ProductSelectorItem['productAsset'] | null;\r\n productVariantName: string;\r\n sku: string;\r\n priceWithTax: number;\r\n price: number;\r\n quantity: number;\r\n}\r\n\r\ntype ModifyOrderData = Omit<ModifyOrderInput, 'addItems' | 'adjustOrderLines'> & {\r\n addItems: Array<AddItemInput & { customFields?: any }>;\r\n adjustOrderLines: Array<AdjustOrderLineInput & { customFields?: any }>;\r\n};\r\n\r\n@Component({\r\n selector: 'vdr-order-editor',\r\n templateUrl: './order-editor.component.html',\r\n styleUrls: ['./order-editor.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderEditorComponent\r\n extends BaseDetailComponent<OrderDetailFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n availableCountries$: Observable<GetAvailableCountriesQuery['countries']['items']>;\r\n availableCouponCodes$: Observable<Array<{ code: string; promotionName: string }>>;\r\n couponCodeInput$ = new Subject<string>();\r\n addressCustomFields: CustomFieldConfig[];\r\n detailForm = new FormGroup({});\r\n couponCodesControl = new FormControl();\r\n orderLineCustomFieldsFormArray: FormArray;\r\n addItemCustomFieldsFormArray: FormArray;\r\n addItemCustomFieldsForm: FormGroup;\r\n addItemSelectedVariant: ProductSelectorItem | undefined;\r\n orderLineCustomFields: CustomFieldConfig[];\r\n modifyOrderInput: ModifyOrderData = {\r\n dryRun: true,\r\n orderId: '',\r\n addItems: [],\r\n adjustOrderLines: [],\r\n surcharges: [],\r\n note: '',\r\n updateShippingAddress: {},\r\n updateBillingAddress: {},\r\n };\r\n surchargeForm: FormGroup;\r\n shippingAddressForm: FormGroup;\r\n billingAddressForm: FormGroup;\r\n note = '';\r\n recalculateShipping = true;\r\n previousState: string;\r\n private addedVariants = new Map<string, ProductSelectorItem>();\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private orderTransitionService: OrderTransitionService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n }\r\n\r\n get addedLines(): AddedLine[] {\r\n const getSinglePriceValue = (price: ProductSelectorItem['price']) =>\r\n price.__typename === 'SinglePrice' ? price.value : 0;\r\n return (this.modifyOrderInput.addItems || [])\r\n .map(row => {\r\n const variantInfo = this.addedVariants.get(row.productVariantId);\r\n if (variantInfo) {\r\n return {\r\n ...variantInfo,\r\n price: getSinglePriceValue(variantInfo.price),\r\n priceWithTax: getSinglePriceValue(variantInfo.priceWithTax),\r\n quantity: row.quantity,\r\n };\r\n }\r\n })\r\n .filter(notNullOrUndefined);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.init();\r\n this.addressCustomFields = this.getCustomFieldConfig('Address');\r\n this.modifyOrderInput.orderId = this.route.snapshot.paramMap.get('id') as string;\r\n this.orderLineCustomFields = this.getCustomFieldConfig('OrderLine');\r\n this.entity$.pipe(takeUntil(this.destroy$)).subscribe(order => {\r\n if (order.couponCodes.length) {\r\n this.couponCodesControl.setValue(order.couponCodes);\r\n }\r\n this.surchargeForm = new FormGroup({\r\n description: new FormControl('', Validators.required),\r\n sku: new FormControl(''),\r\n price: new FormControl(0, Validators.required),\r\n priceIncludesTax: new FormControl(true),\r\n taxRate: new FormControl(0),\r\n taxDescription: new FormControl(''),\r\n });\r\n if (!this.shippingAddressForm) {\r\n this.shippingAddressForm = new FormGroup({\r\n fullName: new FormControl(order.shippingAddress?.fullName),\r\n company: new FormControl(order.shippingAddress?.company),\r\n streetLine1: new FormControl(order.shippingAddress?.streetLine1),\r\n streetLine2: new FormControl(order.shippingAddress?.streetLine2),\r\n city: new FormControl(order.shippingAddress?.city),\r\n province: new FormControl(order.shippingAddress?.province),\r\n postalCode: new FormControl(order.shippingAddress?.postalCode),\r\n countryCode: new FormControl(order.shippingAddress?.countryCode),\r\n phoneNumber: new FormControl(order.shippingAddress?.phoneNumber),\r\n });\r\n this.addAddressCustomFieldsFormGroup(this.shippingAddressForm, order.shippingAddress);\r\n }\r\n if (!this.billingAddressForm) {\r\n this.billingAddressForm = new FormGroup({\r\n fullName: new FormControl(order.billingAddress?.fullName),\r\n company: new FormControl(order.billingAddress?.company),\r\n streetLine1: new FormControl(order.billingAddress?.streetLine1),\r\n streetLine2: new FormControl(order.billingAddress?.streetLine2),\r\n city: new FormControl(order.billingAddress?.city),\r\n province: new FormControl(order.billingAddress?.province),\r\n postalCode: new FormControl(order.billingAddress?.postalCode),\r\n countryCode: new FormControl(order.billingAddress?.countryCode),\r\n phoneNumber: new FormControl(order.billingAddress?.phoneNumber),\r\n });\r\n this.addAddressCustomFieldsFormGroup(this.billingAddressForm, order.billingAddress);\r\n }\r\n this.orderLineCustomFieldsFormArray = new FormArray([]);\r\n for (const line of order.lines) {\r\n const formGroup = new FormGroup({});\r\n for (const { name } of this.orderLineCustomFields) {\r\n formGroup.addControl(name, new FormControl((line as any).customFields[name]));\r\n }\r\n formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {\r\n let modifyRow = this.modifyOrderInput.adjustOrderLines.find(\r\n l => l.orderLineId === line.id,\r\n );\r\n if (!modifyRow) {\r\n modifyRow = {\r\n orderLineId: line.id,\r\n quantity: line.quantity,\r\n };\r\n this.modifyOrderInput.adjustOrderLines.push(modifyRow);\r\n }\r\n if (this.orderLineCustomFields.length) {\r\n modifyRow.customFields = value;\r\n }\r\n });\r\n this.orderLineCustomFieldsFormArray.push(formGroup);\r\n }\r\n });\r\n this.availableCouponCodes$ = concat(\r\n this.couponCodeInput$.pipe(\r\n distinctUntilChanged(),\r\n switchMap(\r\n term =>\r\n this.dataService.promotion.getPromotions(10, 0, {\r\n couponCode: { contains: term },\r\n }).single$,\r\n ),\r\n map(({ promotions }) =>\r\n // tslint:disable-next-line:no-non-null-assertion\r\n promotions.items.map(p => ({ code: p.couponCode!, promotionName: p.name })),\r\n ),\r\n startWith([]),\r\n ),\r\n );\r\n this.addItemCustomFieldsFormArray = new FormArray([]);\r\n this.addItemCustomFieldsForm = new FormGroup({});\r\n for (const customField of this.orderLineCustomFields) {\r\n this.addItemCustomFieldsForm.addControl(customField.name, new FormControl());\r\n }\r\n this.availableCountries$ = this.dataService.settings\r\n .getAvailableCountries()\r\n .mapSingle(result => result.countries.items)\r\n .pipe(shareReplay(1));\r\n this.dataService.order\r\n .getOrderHistory(this.id, {\r\n take: 1,\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n filter: { type: { eq: HistoryEntryType.ORDER_STATE_TRANSITION } },\r\n })\r\n .single$.subscribe(({ order }) => {\r\n this.previousState = order?.history.items[0].data.from;\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\r\n }\r\n\r\n transitionToPriorState(order: OrderDetailFragment) {\r\n this.orderTransitionService\r\n .transitionToPreModifyingState(order.id, order.nextStates)\r\n .subscribe(result => {\r\n this.router.navigate(['..'], { relativeTo: this.route });\r\n });\r\n }\r\n\r\n canPreviewChanges(): boolean {\r\n const { addItems, adjustOrderLines, surcharges } = this.modifyOrderInput;\r\n return (\r\n !!addItems?.length ||\r\n !!surcharges?.length ||\r\n !!adjustOrderLines?.length ||\r\n (this.shippingAddressForm.dirty && this.shippingAddressForm.valid) ||\r\n (this.billingAddressForm.dirty && this.billingAddressForm.valid) ||\r\n this.couponCodesControl.dirty\r\n );\r\n }\r\n\r\n isLineModified(line: OrderDetailFragment['lines'][number]): boolean {\r\n return !!this.modifyOrderInput.adjustOrderLines?.find(\r\n l => l.orderLineId === line.id && l.quantity !== line.quantity,\r\n );\r\n }\r\n\r\n updateLineQuantity(line: OrderDetailFragment['lines'][number], quantity: string) {\r\n const { adjustOrderLines } = this.modifyOrderInput;\r\n let row = adjustOrderLines?.find(l => l.orderLineId === line.id);\r\n if (row && +quantity === line.quantity) {\r\n // Remove the modification if the quantity is the same as\r\n // the original order\r\n adjustOrderLines?.splice(adjustOrderLines?.indexOf(row), 1);\r\n }\r\n if (!row) {\r\n row = { orderLineId: line.id, quantity: +quantity };\r\n adjustOrderLines?.push(row);\r\n }\r\n row.quantity = +quantity;\r\n }\r\n\r\n updateAddedItemQuantity(item: AddedLine, quantity: string) {\r\n const row = this.modifyOrderInput.addItems?.find(l => l.productVariantId === item.productVariantId);\r\n if (row) {\r\n row.quantity = +quantity;\r\n }\r\n }\r\n\r\n trackByProductVariantId(index: number, item: AddedLine) {\r\n return item.productVariantId;\r\n }\r\n\r\n getSelectedItemPrice(result: ProductSelectorItem | undefined): number {\r\n switch (result?.priceWithTax.__typename) {\r\n case 'SinglePrice':\r\n return result.priceWithTax.value;\r\n default:\r\n return 0;\r\n }\r\n }\r\n\r\n addItemToOrder(result: ProductSelectorItem | undefined) {\r\n if (!result) {\r\n return;\r\n }\r\n const customFields = this.orderLineCustomFields.length\r\n ? this.addItemCustomFieldsForm.value\r\n : undefined;\r\n let row = this.modifyOrderInput.addItems?.find(l =>\r\n this.isMatchingAddItemRow(l, result, customFields),\r\n );\r\n if (!row) {\r\n row = { productVariantId: result.productVariantId, quantity: 1 };\r\n if (customFields) {\r\n row.customFields = customFields;\r\n }\r\n this.modifyOrderInput.addItems?.push(row);\r\n } else {\r\n row.quantity++;\r\n }\r\n if (customFields) {\r\n const formGroup = new FormGroup({});\r\n for (const [key, value] of Object.entries(customFields)) {\r\n formGroup.addControl(key, new FormControl(value));\r\n }\r\n this.addItemCustomFieldsFormArray.push(formGroup);\r\n formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {\r\n if (row) {\r\n row.customFields = value;\r\n }\r\n });\r\n }\r\n this.addItemCustomFieldsForm.reset({});\r\n this.addItemSelectedVariant = undefined;\r\n this.addedVariants.set(result.productVariantId, result);\r\n }\r\n\r\n private isMatchingAddItemRow(\r\n row: ModifyOrderData['addItems'][number],\r\n result: ProductSelectorItem,\r\n customFields: any,\r\n ): boolean {\r\n return (\r\n row.productVariantId === result.productVariantId &&\r\n JSON.stringify(row.customFields) === JSON.stringify(customFields)\r\n );\r\n }\r\n\r\n removeAddedItem(index: number) {\r\n this.modifyOrderInput.addItems.splice(index, 1);\r\n if (-1 < index) {\r\n this.addItemCustomFieldsFormArray.removeAt(index);\r\n }\r\n }\r\n\r\n getSurchargePrices(surcharge: SurchargeInput) {\r\n const priceWithTax = surcharge.priceIncludesTax\r\n ? surcharge.price\r\n : Math.round(surcharge.price * ((100 + (surcharge.taxRate || 0)) / 100));\r\n const price = surcharge.priceIncludesTax\r\n ? Math.round(surcharge.price / ((100 + (surcharge.taxRate || 0)) / 100))\r\n : surcharge.price;\r\n return {\r\n price,\r\n priceWithTax,\r\n };\r\n }\r\n\r\n addSurcharge(value: any) {\r\n this.modifyOrderInput.surcharges?.push(value);\r\n this.surchargeForm.reset({\r\n price: 0,\r\n priceIncludesTax: true,\r\n taxRate: 0,\r\n });\r\n }\r\n\r\n removeSurcharge(index: number) {\r\n this.modifyOrderInput.surcharges?.splice(index, 1);\r\n }\r\n\r\n previewAndModify(order: OrderDetailFragment) {\r\n const input: ModifyOrderInput = {\r\n ...this.modifyOrderInput,\r\n ...(this.billingAddressForm.dirty ? { updateBillingAddress: this.billingAddressForm.value } : {}),\r\n ...(this.shippingAddressForm.dirty\r\n ? { updateShippingAddress: this.shippingAddressForm.value }\r\n : {}),\r\n dryRun: true,\r\n couponCodes: this.couponCodesControl.dirty ? this.couponCodesControl.value : undefined,\r\n note: this.note ?? '',\r\n options: {\r\n recalculateShipping: this.recalculateShipping,\r\n },\r\n };\r\n const originalTotalWithTax = order.totalWithTax;\r\n this.dataService.order\r\n .modifyOrder(input)\r\n .pipe(\r\n switchMap(({ modifyOrder }) => {\r\n switch (modifyOrder.__typename) {\r\n case 'Order':\r\n return this.modalService.fromComponent(OrderEditsPreviewDialogComponent, {\r\n size: 'xl',\r\n closable: false,\r\n locals: {\r\n originalTotalWithTax,\r\n order: modifyOrder,\r\n orderLineCustomFields: this.orderLineCustomFields,\r\n modifyOrderInput: input,\r\n },\r\n });\r\n case 'InsufficientStockError':\r\n case 'NegativeQuantityError':\r\n case 'NoChangesSpecifiedError':\r\n case 'OrderLimitError':\r\n case 'OrderModificationStateError':\r\n case 'PaymentMethodMissingError':\r\n case 'RefundPaymentIdMissingError':\r\n case 'CouponCodeLimitError':\r\n case 'CouponCodeExpiredError':\r\n case 'CouponCodeInvalidError': {\r\n this.notificationService.error(modifyOrder.message);\r\n return of(false as const);\r\n }\r\n case null:\r\n case undefined:\r\n return of(false as const);\r\n default:\r\n assertNever(modifyOrder);\r\n }\r\n }),\r\n switchMap(result => {\r\n if (!result || result.result === OrderEditResultType.Cancel) {\r\n // re-fetch so that the preview values get overwritten in the cache.\r\n return this.dataService.order.getOrder(this.id).mapSingle(() => false);\r\n } else {\r\n // Do the modification\r\n const wetRunInput = {\r\n ...input,\r\n dryRun: false,\r\n };\r\n if (result.result === OrderEditResultType.Refund) {\r\n wetRunInput.refund = {\r\n paymentId: result.refundPaymentId,\r\n reason: result.refundNote,\r\n };\r\n }\r\n return this.dataService.order.modifyOrder(wetRunInput).pipe(\r\n switchMap(({ modifyOrder }) => {\r\n if (modifyOrder.__typename === 'Order') {\r\n const priceDelta = modifyOrder.totalWithTax - originalTotalWithTax;\r\n const nextState =\r\n 0 < priceDelta ? 'ArrangingAdditionalPayment' : this.previousState;\r\n\r\n return this.dataService.order\r\n .transitionToState(order.id, nextState)\r\n .pipe(mapTo(true));\r\n } else {\r\n this.notificationService.error((modifyOrder as ErrorResult).message);\r\n return EMPTY;\r\n }\r\n }),\r\n );\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n this.router.navigate(['../'], { relativeTo: this.route });\r\n }\r\n });\r\n }\r\n\r\n private addAddressCustomFieldsFormGroup(\r\n parentFormGroup: FormGroup,\r\n address?: OrderAddressFragment | null,\r\n ) {\r\n if (address && this.addressCustomFields.length) {\r\n const addressCustomFieldsFormGroup = new FormGroup({});\r\n for (const customFieldDef of this.addressCustomFields) {\r\n const name = customFieldDef.name;\r\n const value = (address as any).customFields?.[name];\r\n addressCustomFieldsFormGroup.addControl(name, new FormControl(value));\r\n }\r\n parentFormGroup.addControl('customFields', addressCustomFieldsFormGroup);\r\n }\r\n }\r\n\r\n protected setFormValues(entity: OrderDetailFragment, languageCode: LanguageCode): void {\r\n /* not used */\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"search-form\">\r\n <div class=\"btn-group btn-outline-primary\" *ngIf=\"activePreset$ | async as activePreset\">\r\n <button\r\n class=\"btn\"\r\n *ngFor=\"let preset of filterPresets\"\r\n [class.btn-primary]=\"activePreset === preset.name\"\r\n (click)=\"selectFilterPreset(preset.name)\"\r\n >\r\n {{ preset.label | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n [class.btn-primary]=\"activePreset === 'custom'\"\r\n (click)=\"selectFilterPreset('custom')\"\r\n >\r\n {{ 'order.filter-custom' | translate }}\r\n <clr-icon shape=\"angle down\"></clr-icon>\r\n </button>\r\n </div>\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchControl\"\r\n [placeholder]=\"'order.search-by-order-filters' | translate\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n <div class=\"custom-filters\" [class.expanded]=\"(activePreset$ | async) === 'custom'\">\r\n <form [formGroup]=\"customFilterForm\">\r\n <div class=\"flex align-center\">\r\n <ng-select\r\n [items]=\"orderStates\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n formControlName=\"states\"\r\n [placeholder]=\"'state.all-orders' | translate\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">{{ item | stateI18nToken | translate }}</ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\"> {{ item | stateI18nToken | translate }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">×</span>\r\n </ng-template>\r\n </ng-select>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"customFilterForm.pristine\"\r\n (click)=\"applyCustomFilters()\"\r\n >\r\n {{ 'order.apply-filters' | translate }}\r\n <clr-icon shape=\"filter\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex\">\r\n <div>\r\n <label>{{ 'order.placed-at-start' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtStart\"></vdr-datetime-picker>\r\n </div>\r\n <div>\r\n <label>{{ 'order.placed-at-end' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtEnd\"></vdr-datetime-picker>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-list\"></vdr-action-bar-items>\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>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.customer' | 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>{{ 'order.placed-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.shipping' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">{{ order.code }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.updatedAt | timeAgo }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | localeDate: 'medium' }}</td>\r\n <td class=\"left align-middle\">{{ getShippingNames(order) }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"order.state === 'Modifying' ? ['./', order.id, 'modify'] : ['./', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup } 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 GetOrderListQuery,\r\n ItemOf,\r\n LocalStorageService,\r\n LogicalOperator,\r\n OrderListOptions,\r\n ServerConfigService,\r\n SortOrder,\r\n} from '@vendure/admin-ui/core';\r\nimport { Order } from '@vendure/common/lib/generated-types';\r\nimport { merge, Observable } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, filter, map, takeUntil } from 'rxjs/operators';\r\n\r\ninterface OrderFilterConfig {\r\n active?: boolean;\r\n states?: string[];\r\n}\r\n\r\ninterface FilterPreset {\r\n name: string;\r\n label: string;\r\n config: OrderFilterConfig;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-order-list',\r\n templateUrl: './order-list.component.html',\r\n styleUrls: ['./order-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderListComponent\r\n extends BaseListComponent<GetOrderListQuery, ItemOf<GetOrderListQuery, 'orders'>>\r\n implements OnInit\r\n{\r\n searchControl = new FormControl('');\r\n searchOrderCodeControl = new FormControl('');\r\n searchLastNameControl = new FormControl('');\r\n customFilterForm: FormGroup;\r\n orderStates = this.serverConfigService.getOrderProcessStates().map(item => item.name);\r\n filterPresets: FilterPreset[] = [\r\n {\r\n name: 'open',\r\n label: _('order.filter-preset-open'),\r\n config: {\r\n active: false,\r\n states: this.orderStates.filter(\r\n s => s !== 'Delivered' && s !== 'Cancelled' && s !== 'Shipped',\r\n ),\r\n },\r\n },\r\n {\r\n name: 'shipped',\r\n label: _('order.filter-preset-shipped'),\r\n config: {\r\n active: false,\r\n states: ['Shipped'],\r\n },\r\n },\r\n {\r\n name: 'completed',\r\n label: _('order.filter-preset-completed'),\r\n config: {\r\n active: false,\r\n states: ['Delivered', 'Cancelled'],\r\n },\r\n },\r\n {\r\n name: 'active',\r\n label: _('order.filter-preset-active'),\r\n config: {\r\n active: true,\r\n },\r\n },\r\n ];\r\n activePreset$: Observable<string>;\r\n\r\n constructor(\r\n private serverConfigService: ServerConfigService,\r\n private dataService: DataService,\r\n private localStorageService: LocalStorageService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n // tslint:disable-next-line:no-shadowed-variable\r\n (take, skip) => this.dataService.order.getOrders({ take, skip }).refetchOnChannelChange(),\r\n data => data.orders,\r\n // tslint:disable-next-line:no-shadowed-variable\r\n (skip, take) =>\r\n this.createQueryOptions(\r\n skip,\r\n take,\r\n this.searchControl.value,\r\n this.route.snapshot.queryParamMap.get('filter') || 'open',\r\n ),\r\n );\r\n const lastFilters = this.localStorageService.get('orderListLastCustomFilters');\r\n if (lastFilters) {\r\n this.setQueryParam(lastFilters, { replaceUrl: true });\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.activePreset$ = this.route.queryParamMap.pipe(\r\n map(qpm => qpm.get('filter') || 'open'),\r\n distinctUntilChanged(),\r\n );\r\n const searchTerms$ = merge(this.searchControl.valueChanges).pipe(\r\n filter(value => 2 < value.length || value.length === 0),\r\n debounceTime(250),\r\n );\r\n merge(searchTerms$, this.route.queryParamMap)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(val => {\r\n this.refresh();\r\n });\r\n\r\n const queryParamMap = this.route.snapshot.queryParamMap;\r\n this.customFilterForm = new FormGroup({\r\n states: new FormControl(queryParamMap.getAll('states') ?? []),\r\n placedAtStart: new FormControl(queryParamMap.get('placedAtStart')),\r\n placedAtEnd: new FormControl(queryParamMap.get('placedAtEnd')),\r\n });\r\n }\r\n\r\n selectFilterPreset(presetName: string) {\r\n const lastCustomFilters = this.localStorageService.get('orderListLastCustomFilters') ?? {};\r\n const emptyCustomFilters = { states: undefined, placedAtStart: undefined, placedAtEnd: undefined };\r\n const filters = presetName === 'custom' ? lastCustomFilters : emptyCustomFilters;\r\n this.setQueryParam(\r\n {\r\n filter: presetName,\r\n page: 1,\r\n ...filters,\r\n },\r\n { replaceUrl: true },\r\n );\r\n }\r\n\r\n applyCustomFilters() {\r\n const formValue = this.customFilterForm.value;\r\n const customFilters = {\r\n states: formValue.states,\r\n placedAtStart: formValue.placedAtStart,\r\n placedAtEnd: formValue.placedAtEnd,\r\n };\r\n this.setQueryParam({\r\n filter: 'custom',\r\n ...customFilters,\r\n });\r\n this.customFilterForm.markAsPristine();\r\n this.localStorageService.set('orderListLastCustomFilters', customFilters);\r\n }\r\n\r\n private createQueryOptions(\r\n // tslint:disable-next-line:no-shadowed-variable\r\n skip: number,\r\n take: number,\r\n searchTerm: string,\r\n activeFilterPreset?: string,\r\n ): { options: OrderListOptions } {\r\n const filterConfig = this.filterPresets.find(p => p.name === activeFilterPreset);\r\n // tslint:disable-next-line:no-shadowed-variable\r\n let filter: any = {};\r\n let filterOperator: LogicalOperator = LogicalOperator.AND;\r\n if (filterConfig) {\r\n if (filterConfig.config.active != null) {\r\n filter.active = {\r\n eq: filterConfig.config.active,\r\n };\r\n }\r\n if (filterConfig.config.states) {\r\n filter.state = {\r\n in: filterConfig.config.states,\r\n };\r\n }\r\n } else if (activeFilterPreset === 'custom') {\r\n const queryParams = this.route.snapshot.queryParamMap;\r\n const states = queryParams.getAll('states') ?? [];\r\n const placedAtStart = queryParams.get('placedAtStart');\r\n const placedAtEnd = queryParams.get('placedAtEnd');\r\n if (states.length) {\r\n filter.state = {\r\n in: states,\r\n };\r\n }\r\n if (placedAtStart && placedAtEnd) {\r\n filter.orderPlacedAt = {\r\n between: {\r\n start: placedAtStart,\r\n end: placedAtEnd,\r\n },\r\n };\r\n } else if (placedAtStart) {\r\n filter.orderPlacedAt = {\r\n after: placedAtStart,\r\n };\r\n } else if (placedAtEnd) {\r\n filter.orderPlacedAt = {\r\n before: placedAtEnd,\r\n };\r\n }\r\n }\r\n if (searchTerm) {\r\n filter = {\r\n customerLastName: {\r\n contains: searchTerm,\r\n },\r\n transactionId: {\r\n contains: searchTerm,\r\n },\r\n code: {\r\n contains: searchTerm,\r\n },\r\n };\r\n filterOperator = LogicalOperator.OR;\r\n }\r\n return {\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n ...(filter ?? {}),\r\n },\r\n sort: {\r\n updatedAt: SortOrder.DESC,\r\n },\r\n filterOperator,\r\n },\r\n };\r\n }\r\n\r\n getShippingNames(order: Order) {\r\n if (order.shippingLines.length) {\r\n return order.shippingLines.map(shippingLine => shippingLine.shippingMethod.name).join(', ');\r\n } else {\r\n return '';\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, DataService, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Resolves the id from the path into a Customer entity.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class OrderResolver extends BaseEntityResolver<OrderDetailFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Order',\r\n id: '',\r\n code: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n total: 0,\r\n } as any,\r\n id => dataService.order.getOrder(id).mapStream(data => data.order),\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 BreadcrumbLabelLinkPair,\r\n CanDeactivateDetailGuard,\r\n createResolveData,\r\n detailBreadcrumb,\r\n OrderDetailFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { OrderDetailComponent } from './components/order-detail/order-detail.component';\r\nimport { OrderEditorComponent } from './components/order-editor/order-editor.component';\r\nimport { OrderListComponent } from './components/order-list/order-list.component';\r\nimport { OrderResolver } from './providers/routing/order-resolver';\r\n\r\nexport const orderRoutes: Route[] = [\r\n {\r\n path: '',\r\n component: OrderListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.orders'),\r\n },\r\n },\r\n {\r\n path: ':id',\r\n component: OrderDetailComponent,\r\n resolve: createResolveData(OrderResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: orderBreadcrumb,\r\n },\r\n },\r\n {\r\n path: ':id/modify',\r\n component: OrderEditorComponent,\r\n resolve: createResolveData(OrderResolver),\r\n // canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: modifyingOrderBreadcrumb,\r\n },\r\n },\r\n];\r\n\r\nexport function orderBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<OrderDetailFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.orders',\r\n getName: order => order.code,\r\n route: '',\r\n });\r\n}\r\n\r\nexport function modifyingOrderBreadcrumb(data: any, params: any) {\r\n return orderBreadcrumb(data, params).pipe(\r\n map((breadcrumbs: BreadcrumbLabelLinkPair[]) => {\r\n const modifiedBreadcrumbs = breadcrumbs.slice();\r\n modifiedBreadcrumbs[0].link[0] = '../';\r\n modifiedBreadcrumbs[1].link[0] = '../orders';\r\n return modifiedBreadcrumbs.concat({ label: _('breadcrumb.modifying'), link: [''] });\r\n }) as any,\r\n );\r\n}\r\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from '@vendure/admin-ui/core';\n\nimport { AddManualPaymentDialogComponent } from './components/add-manual-payment-dialog/add-manual-payment-dialog.component';\nimport { CancelOrderDialogComponent } from './components/cancel-order-dialog/cancel-order-dialog.component';\nimport { FulfillOrderDialogComponent } from './components/fulfill-order-dialog/fulfill-order-dialog.component';\nimport { FulfillmentCardComponent } from './components/fulfillment-card/fulfillment-card.component';\nimport { FulfillmentDetailComponent } from './components/fulfillment-detail/fulfillment-detail.component';\nimport { FulfillmentStateLabelComponent } from './components/fulfillment-state-label/fulfillment-state-label.component';\nimport { LineFulfillmentComponent } from './components/line-fulfillment/line-fulfillment.component';\nimport { LineRefundsComponent } from './components/line-refunds/line-refunds.component';\nimport { ModificationDetailComponent } from './components/modification-detail/modification-detail.component';\nimport { OrderCustomFieldsCardComponent } from './components/order-custom-fields-card/order-custom-fields-card.component';\nimport { OrderDetailComponent } from './components/order-detail/order-detail.component';\nimport { OrderEditorComponent } from './components/order-editor/order-editor.component';\nimport { OrderEditsPreviewDialogComponent } from './components/order-edits-preview-dialog/order-edits-preview-dialog.component';\nimport { OrderHistoryComponent } from './components/order-history/order-history.component';\nimport { OrderListComponent } from './components/order-list/order-list.component';\nimport { OrderPaymentCardComponent } from './components/order-payment-card/order-payment-card.component';\nimport { OrderProcessGraphDialogComponent } from './components/order-process-graph-dialog/order-process-graph-dialog.component';\nimport { OrderProcessEdgeComponent } from './components/order-process-graph/order-process-edge.component';\nimport { OrderProcessGraphComponent } from './components/order-process-graph/order-process-graph.component';\nimport { OrderProcessNodeComponent } from './components/order-process-graph/order-process-node.component';\nimport { OrderStateSelectDialogComponent } from './components/order-state-select-dialog/order-state-select-dialog.component';\nimport { OrderTableComponent } from './components/order-table/order-table.component';\nimport { PaymentDetailComponent } from './components/payment-detail/payment-detail.component';\nimport { PaymentStateLabelComponent } from './components/payment-state-label/payment-state-label.component';\nimport { RefundOrderDialogComponent } from './components/refund-order-dialog/refund-order-dialog.component';\nimport { RefundStateLabelComponent } from './components/refund-state-label/refund-state-label.component';\nimport { SettleRefundDialogComponent } from './components/settle-refund-dialog/settle-refund-dialog.component';\nimport { SimpleItemListComponent } from './components/simple-item-list/simple-item-list.component';\nimport { orderRoutes } from './order.routes';\n\n@NgModule({\n imports: [SharedModule, RouterModule.forChild(orderRoutes)],\n declarations: [\n OrderListComponent,\n OrderDetailComponent,\n FulfillOrderDialogComponent,\n LineFulfillmentComponent,\n RefundOrderDialogComponent,\n CancelOrderDialogComponent,\n PaymentStateLabelComponent,\n LineRefundsComponent,\n OrderPaymentCardComponent,\n RefundStateLabelComponent,\n SettleRefundDialogComponent,\n OrderHistoryComponent,\n FulfillmentDetailComponent,\n PaymentDetailComponent,\n SimpleItemListComponent,\n OrderCustomFieldsCardComponent,\n OrderProcessGraphComponent,\n OrderProcessNodeComponent,\n OrderProcessEdgeComponent,\n OrderProcessGraphDialogComponent,\n FulfillmentStateLabelComponent,\n FulfillmentCardComponent,\n OrderEditorComponent,\n OrderTableComponent,\n OrderEditsPreviewDialogComponent,\n ModificationDetailComponent,\n AddManualPaymentDialogComponent,\n OrderStateSelectDialogComponent,\n ],\n})\nexport class OrderModule {}\n"],"sourceRoot":"webpack:///","file":"849.a5b2f52c180a376b.js"}
1
+ {"version":3,"mappings":"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","names":["e","cancel","submit","constructor","n","this","a","method","transactionId","ngOnInit","paymentMethods$","dataService","settings","getPaymentMethods","mapSingle","paymentMethods","items","form","value","resolveWith","V","selectors","checkIfAllSelected","radioChanged","select","t","cancellationReasons","_","reasons","map","o","i18nService","translate","selectionCount","Object","values","lineQuantities","reduce","order","lines","id","quantity","cancelAll","entries","i","find","l","orderId","getLineInputs","reason","cancelShipping","active","orderLineId","filter","B","getGlobalSettings","single$","subscribe","globalSettings","fulfillmentQuantities","getFulfillableCount","trackInventory","fulfillCount","max","changeDetector","markForCheck","shippingMethod","getShippingMethodOperations","fulfillmentHandlers","fulfillmentHandlerDef","code","shippingLines","fulfillmentHandlerCode","fulfillmentHandler","fulfillmentHandlerControl","patchValue","stockOnHand","productVariant","u","c","getUnfulfilledCount","Math","min","fulfillments","summary","flat","orderLine","canSubmit","valid","handler","W","chipColorType","state","X","L","customFieldConfig","serverConfigService","getCustomFieldsFor","ngOnChanges","buildCustomFieldsFormGroup","fulfillment","fulfillmentId","name","customFields","customFieldFormGroup","addControl","customFieldIsObject","Array","isArray","U","Q","oxw","transitionState","nextSuggestedState","nextStates","includes","nextOtherStates","z","line","fulfilledCount","getDeliveredCount","fulfillmentStatus","getFulfillmentStatus","length","getFulfillments","d","g","count","Y","getRefundedCount","payments","refunds","refundId","cancelled","I","Map","added","removed","getModifiedLines","addedItems","removedItems","getSurcharge","surcharges","getAddedItems","getRemovedItems","modification","orderItems","getOrderLineAndItem","item","x","get","set","ee","onUpdateClick","onCancelClick","customFieldForm","formBuilder","group","customFieldsConfig","control","customFieldValues","updateClick","emit","markAsPristine","editable","dirty","modalService","dialog","title","buttons","type","label","returnValue","reset","te","qe","Ie","isCancellable","node","to","active$","next","getPos","elementRef","nativeElement","getBoundingClientRect","querySelector","height","y","index","getStyle","R","from","asObservable","pipe","rn","activeTarget$","abs","sqrt","transform","onMouseOver","onMouseOut","ne","outerHeight","nodes","setActiveState$","initialState","activeState$","Ve","populateNodes","ngAfterViewInit","setTimeout","populateEdges","getNodeFor","nodeComponents","states","push","edges","re","getOrderProcessStates","oe","refundTotal","refund","proratedUnitPriceWithTax","refundShipping","shippingWithTax","adjustment","settledPaymentsTotal","settledPayments","amount","lineCanBeRefundedOrCancelled","selectedPayment","handleZeroQuantity","isRefunding","isCancelling","getOrderLineInput","shipping","paymentId","ie","le","selectedState","ae","transitionToPreModifyingState","getPreModifyingState","message","cancellable","retry","transitionToStateOrThrow","Ln","manuallyTransitionToState","fromComponent","locals","closable","size","j","Error","We","Ae","r","qn","Fn","getOrderHistory","eq","sort","createdAt","history","data","transitionToState","transitionOrderToState","__typename","notificationService","error","transitionError","w","factory","visibleOrderLineCustomFields","orderLineCustomFieldsVisible","orderLineCustomFields","showElided","getLineCustomFields","toggleOrderLineCustomFields","getLineDiscounts","discounts","config","formGroup","customFieldsForLine","getPromotionLink","adjustmentSource","split","getCouponCodeForAdjustment","promotions","couponCode","getShippingNames","join","H","$","updateNote","deleteNote","getDisplayType","getTimelineIcon","isFeatured","getFulfillment","getPayment","getCancelledItems","orderItemIds","getModification","modifications","getName","administrator","firstName","lastName","customer","addNoteToOrder","addNote","note","isPublic","noteIsPrivate","ce","de","settleRefund","se","refundHasMetadata","keys","metadata","payment","addManualPayment","transitionToModifying","cancelOrRefund","ue","openStateDiagram","fulfillOrder","settlePayment","transitionPaymentState","transitionFulfillment","updateCustomFields","super","init","entity$","router","navigate","relativeTo","route","getCustomFieldConfig","history$","fetchHistory","h","mapStream","nextStates$","F","defaultStates","ngOnDestroy","destroy","activeState","success","orderTransitionService","updateOrderCustomFields","entity","getOrderAddressLines","getOrder","cancelPayment","paymentErrorMessage","transitionPaymentToState","canAddFulfillment","hasUnsettledModifications","outstandingPaymentAmount","isSettled","getOutstandingModificationAmount","P","totalWithTax","outstandingAmount","currencyCode","addManualPaymentToOrder","Le","refetchOrder","result","createFulfillment","q","addFulfillmentToOrder","fulfillmentHandlerError","JSON","stringify","transitionFulfillmentToState","orderHasSettledPayments","refundOrder","cancelOrder","displayPrivacyControls","updateOrderNote","noteId","isPrivate","body","deleteOrderNote","setFormValues","pe","b","priceDifference","originalTotalWithTax","refundNote","modifyOrderInput","Cancel","Payment","Refund","refundPaymentId","PriceUnchanged","me","transitionToPriorState","updateLineQuantity","updateAddedItemQuantity","removeAddedItem","removeSurcharge","previewAndModify","dryRun","addItems","adjustOrderLines","updateShippingAddress","updateBillingAddress","addedLines","addedVariants","productVariantId","price","priceWithTax","addressCustomFields","snapshot","paramMap","destroy$","couponCodes","couponCodesControl","setValue","surchargeForm","description","sku","priceIncludesTax","taxRate","taxDescription","shippingAddressForm","fullName","shippingAddress","company","streetLine1","streetLine2","city","province","postalCode","countryCode","phoneNumber","addAddressCustomFieldsFormGroup","billingAddressForm","S","billingAddress","N","Pe","Se","Ne","Je","Ue","Qe","De","orderLineCustomFieldsFormArray","Ze","ke","Oe","valueChanges","be","si","availableCouponCodes$","so","couponCodeInput$","promotion","getPromotions","contains","promotionName","addItemCustomFieldsFormArray","addItemCustomFieldsForm","availableCountries$","getAvailableCountries","countries","uo","take","previousState","canPreviewChanges","isLineModified","splice","indexOf","trackByProductVariantId","getSelectedItemPrice","addItemToOrder","isMatchingAddItemRow","addItemSelectedVariant","removeAt","getSurchargePrices","round","addSurcharge","options","recalculateShipping","modifyOrder","_e","selectFilterPreset","orderStates","setQueryFn","getOrders","skip","refetchOnChannelChange","orders","createQueryOptions","searchControl","queryParamMap","localStorageService","setQueryParam","replaceUrl","activePreset$","nt","ot","refresh","customFilterForm","getAll","placedAtStart","placedAtEnd","page","applyCustomFilters","filterPresets","in","orderPlacedAt","between","start","end","after","before","customerLastName","updatedAt","filterOperator","ge","total","M","it","path","component","breadcrumb","resolve","canDeactivate","Me","lt","breadcrumbKey","slice","link","concat","fe"],"sources":["./src/lib/order/src/components/add-manual-payment-dialog/add-manual-payment-dialog.component.html","./src/lib/order/src/components/add-manual-payment-dialog/add-manual-payment-dialog.component.ts","./src/lib/order/src/components/cancel-order-dialog/cancel-order-dialog.component.html","./src/lib/order/src/components/cancel-order-dialog/cancel-order-dialog.component.ts","./src/lib/order/src/components/fulfill-order-dialog/fulfill-order-dialog.component.html","./src/lib/order/src/components/fulfill-order-dialog/fulfill-order-dialog.component.ts","./src/lib/order/src/components/fulfillment-state-label/fulfillment-state-label.component.html","./src/lib/order/src/components/fulfillment-state-label/fulfillment-state-label.component.ts","./src/lib/order/src/components/simple-item-list/simple-item-list.component.html","./src/lib/order/src/components/simple-item-list/simple-item-list.component.ts","./src/lib/order/src/components/fulfillment-detail/fulfillment-detail.component.html","./src/lib/order/src/components/fulfillment-detail/fulfillment-detail.component.ts","./src/lib/order/src/components/fulfillment-card/fulfillment-card.component.html","./src/lib/order/src/components/fulfillment-card/fulfillment-card.component.ts","./src/lib/order/src/components/line-fulfillment/line-fulfillment.component.html","./src/lib/order/src/components/line-fulfillment/line-fulfillment.component.ts","./src/lib/order/src/components/line-refunds/line-refunds.component.html","./src/lib/order/src/components/line-refunds/line-refunds.component.ts","./src/lib/order/src/components/modification-detail/modification-detail.component.html","./src/lib/order/src/components/modification-detail/modification-detail.component.ts","./src/lib/order/src/components/order-custom-fields-card/order-custom-fields-card.component.html","./src/lib/order/src/components/order-custom-fields-card/order-custom-fields-card.component.ts","./src/lib/order/src/components/order-process-graph/constants.ts","./src/lib/order/src/components/order-process-graph/order-process-node.component.html","./src/lib/order/src/components/order-process-graph/order-process-node.component.ts","./src/lib/order/src/components/order-process-graph/order-process-edge.component.ts","./src/lib/order/src/components/order-process-graph/order-process-graph.component.html","./src/lib/order/src/components/order-process-graph/order-process-edge.component.html","./src/lib/order/src/components/order-process-graph/order-process-graph.component.ts","./src/lib/order/src/components/order-process-graph-dialog/order-process-graph-dialog.component.html","./src/lib/order/src/components/order-process-graph-dialog/order-process-graph-dialog.component.ts","./src/lib/order/src/components/refund-order-dialog/refund-order-dialog.component.html","./src/lib/order/src/components/refund-order-dialog/refund-order-dialog.component.ts","./src/lib/order/src/components/settle-refund-dialog/settle-refund-dialog.component.html","./src/lib/order/src/components/settle-refund-dialog/settle-refund-dialog.component.ts","./src/lib/order/src/components/order-state-select-dialog/order-state-select-dialog.component.html","./src/lib/order/src/components/order-state-select-dialog/order-state-select-dialog.component.ts","./src/lib/order/src/providers/order-transition.service.ts","./node_modules/@angular-devkit/build-angular/src/babel/webpack-loader.js","./src/lib/order/src/components/order-table/order-table.component.html","./src/lib/order/src/components/order-table/order-table.component.ts","./src/lib/order/src/components/payment-detail/payment-detail.component.html","./src/lib/order/src/components/payment-detail/payment-detail.component.ts","./src/lib/order/src/components/order-history/order-history.component.html","./src/lib/order/src/components/order-history/order-history.component.ts","./src/lib/order/src/components/payment-state-label/payment-state-label.component.html","./src/lib/order/src/components/payment-state-label/payment-state-label.component.ts","./src/lib/order/src/components/refund-state-label/refund-state-label.component.html","./src/lib/order/src/components/refund-state-label/refund-state-label.component.ts","./src/lib/order/src/components/order-payment-card/order-payment-card.component.html","./src/lib/order/src/components/order-payment-card/order-payment-card.component.ts","./src/lib/order/src/components/order-detail/order-detail.component.html","./src/lib/order/src/components/order-detail/order-detail.component.ts","./src/lib/order/src/components/order-edits-preview-dialog/order-edits-preview-dialog.component.ts","./src/lib/order/src/components/order-edits-preview-dialog/order-edits-preview-dialog.component.html","./src/lib/order/src/components/order-editor/order-editor.component.html","./src/lib/order/src/components/order-editor/order-editor.component.ts","./src/lib/order/src/components/order-list/order-list.component.html","./src/lib/order/src/components/order-list/order-list.component.ts","./src/lib/order/src/providers/routing/order-resolver.ts","./src/lib/order/src/order.routes.ts","./src/lib/order/src/order.module.ts"],"sourcesContent":["<ng-template vdrDialogTitle>{{ 'order.add-payment-to-order' | translate }}</ng-template>\r\n<form [formGroup]=\"form\">\r\n <vdr-form-field [label]=\"'order.payment-method' | translate\" for=\"method\">\r\n <ng-select\r\n [items]=\"paymentMethods$ | async\"\r\n bindLabel=\"code\"\r\n autofocus\r\n bindValue=\"code\"\r\n [addTag]=\"true\"\r\n formControlName=\"method\"\r\n ></ng-select>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'order.transaction-id' | translate\" for=\"transactionId\">\r\n <input id=\"transactionId\" type=\"text\" formControlName=\"transactionId\" />\r\n </vdr-form-field>\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)=\"submit()\" class=\"btn btn-primary\" [disabled]=\"form.invalid || form.pristine\">\r\n {{ 'order.add-payment' | translate }} ({{ outstandingAmount | localeCurrency: currencyCode }})\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport {\r\n CurrencyCode,\r\n DataService,\r\n Dialog,\r\n GetPaymentMethodListQuery,\r\n ItemOf,\r\n ManualPaymentInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vdr-add-manual-payment-dialog',\r\n templateUrl: './add-manual-payment-dialog.component.html',\r\n styleUrls: ['./add-manual-payment-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AddManualPaymentDialogComponent implements OnInit, Dialog<Omit<ManualPaymentInput, 'orderId'>> {\r\n // populated by ModalService call\r\n outstandingAmount: number;\r\n currencyCode: CurrencyCode;\r\n\r\n resolveWith: (result?: Omit<ManualPaymentInput, 'orderId'>) => void;\r\n form = new FormGroup({\r\n method: new FormControl('', Validators.required),\r\n transactionId: new FormControl('', Validators.required),\r\n });\r\n paymentMethods$: Observable<Array<ItemOf<GetPaymentMethodListQuery, 'paymentMethods'>>>;\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit(): void {\r\n this.paymentMethods$ = this.dataService.settings\r\n .getPaymentMethods(999)\r\n .mapSingle(data => data.paymentMethods.items);\r\n }\r\n\r\n submit() {\r\n const formValue = this.form.value;\r\n this.resolveWith({\r\n method: formValue.method,\r\n transactionId: formValue.transactionId,\r\n });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.cancel-order' | translate }}</ng-template>\r\n\r\n<div class=\"fulfillment-wrapper\">\r\n <div class=\"order-lines\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.cancel' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tr\r\n *ngFor=\"let line of order.lines\"\r\n class=\"order-line\"\r\n [class.is-disabled]=\"cancelAll\"\r\n [class.is-cancelled]=\"line.quantity === 0\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img [src]=\"line.featuredAsset | assetPreview: 'tiny'\" />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle quantity\">{{ line.quantity }}</td>\r\n <td class=\"align-middle quantity\">\r\n {{ line.unitPriceWithTax | localeCurrency: order.currencyCode }}\r\n </td>\r\n <td class=\"align-middle fulfil\">\r\n <input\r\n *ngIf=\"line.quantity > 0 && !order.active; else nonEditable\"\r\n [(ngModel)]=\"lineQuantities[line.id]\"\r\n (input)=\"checkIfAllSelected()\"\r\n [disabled]=\"cancelAll\"\r\n type=\"number\"\r\n [max]=\"line.quantity\"\r\n min=\"0\"\r\n />\r\n <ng-template #nonEditable>{{ line.quantity }}</ng-template>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n <div class=\"cancellation-details\">\r\n <ng-container *ngIf=\"order.active !== true\">\r\n <clr-radio-wrapper>\r\n <input\r\n type=\"radio\"\r\n clrRadio\r\n [value]=\"true\"\r\n [(ngModel)]=\"cancelAll\"\r\n name=\"options\"\r\n (ngModelChange)=\"radioChanged()\"\r\n />\r\n <label>{{ 'order.cancel-entire-order' | translate }}</label>\r\n </clr-radio-wrapper>\r\n <clr-radio-wrapper>\r\n <input\r\n type=\"radio\"\r\n clrRadio\r\n [value]=\"false\"\r\n [(ngModel)]=\"cancelAll\"\r\n name=\"options\"\r\n (ngModelChange)=\"radioChanged()\"\r\n />\r\n <label>{{ 'order.cancel-specified-items' | translate }}</label>\r\n </clr-radio-wrapper>\r\n </ng-container>\r\n <label class=\"clr-control-label\">{{ 'order.cancellation-reason' | translate }}</label>\r\n <ng-select\r\n [items]=\"reasons\"\r\n bindLabel=\"name\"\r\n autofocus\r\n bindValue=\"id\"\r\n [addTag]=\"true\"\r\n [(ngModel)]=\"reason\"\r\n ></ng-select>\r\n </div>\r\n</div>\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)=\"select()\"\r\n [disabled]=\"!reason || (!order.active && selectionCount === 0)\"\r\n class=\"btn btn-primary\"\r\n >\r\n <ng-container *ngIf=\"!order.active\">\r\n {{ 'order.cancel-selected-items' | translate }}\r\n </ng-container>\r\n <ng-container *ngIf=\"order.active\">\r\n {{ 'order.cancel-order' | translate }}\r\n </ng-container>\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CancelOrderInput,\r\n Dialog,\r\n getAppConfig,\r\n I18nService,\r\n OrderDetailFragment,\r\n OrderLineInput,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-cancel-order-dialog',\r\n templateUrl: './cancel-order-dialog.component.html',\r\n styleUrls: ['./cancel-order-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CancelOrderDialogComponent implements OnInit, Dialog<CancelOrderInput> {\r\n order: OrderDetailFragment;\r\n cancelAll = true;\r\n resolveWith: (result?: CancelOrderInput) => void;\r\n reason: string;\r\n lineQuantities: { [lineId: string]: number } = {};\r\n reasons: string[] = getAppConfig().cancellationReasons ?? [\r\n _('order.cancel-reason-customer-request'),\r\n _('order.cancel-reason-not-available'),\r\n ];\r\n\r\n get selectionCount(): number {\r\n return Object.values(this.lineQuantities).reduce((sum, n) => sum + n, 0);\r\n }\r\n\r\n constructor(private i18nService: I18nService) {\r\n this.reasons = this.reasons.map(r => this.i18nService.translate(r));\r\n }\r\n\r\n ngOnInit() {\r\n this.lineQuantities = this.order.lines.reduce((result, line) => {\r\n return { ...result, [line.id]: line.quantity };\r\n }, {});\r\n }\r\n\r\n radioChanged() {\r\n if (this.cancelAll) {\r\n for (const line of this.order.lines) {\r\n this.lineQuantities[line.id] = line.quantity;\r\n }\r\n } else {\r\n for (const line of this.order.lines) {\r\n this.lineQuantities[line.id] = 0;\r\n }\r\n }\r\n }\r\n\r\n checkIfAllSelected() {\r\n for (const [lineId, quantity] of Object.entries(this.lineQuantities)) {\r\n const quantityInOrder = this.order.lines.find(line => line.id === lineId)?.quantity;\r\n if (quantityInOrder && quantity < quantityInOrder) {\r\n return;\r\n }\r\n }\r\n // If we got here, all of the selected quantities are equal to the order\r\n // line quantities, i.e. everything is selected.\r\n this.cancelAll = true;\r\n }\r\n\r\n select() {\r\n this.resolveWith({\r\n orderId: this.order.id,\r\n lines: this.getLineInputs(),\r\n reason: this.reason,\r\n cancelShipping: this.cancelAll,\r\n });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n private getLineInputs(): OrderLineInput[] | undefined {\r\n if (this.order.active) {\r\n return;\r\n }\r\n return Object.entries(this.lineQuantities)\r\n .map(([orderLineId, quantity]) => ({\r\n orderLineId,\r\n quantity,\r\n }))\r\n .filter(l => 0 < l.quantity);\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.fulfill-order' | translate }}</ng-template>\r\n\r\n<div class=\"fulfillment-wrapper\">\r\n <div class=\"order-table\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.unfulfilled' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th>{{ 'order.fulfill' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tr\r\n *ngFor=\"let line of order.lines\"\r\n class=\"order-line\"\r\n [class.ignore]=\"getUnfulfilledCount(line) === 0\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img *ngIf=\"line.featuredAsset\" [src]=\"line.featuredAsset | assetPreview: 'tiny'\" />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle quantity\">{{ getUnfulfilledCount(line) }}</td>\r\n <td class=\"align-middle quantity\">{{ line.productVariant.stockOnHand }}</td>\r\n <td class=\"align-middle fulfil\">\r\n <input\r\n *ngIf=\"fulfillmentQuantities[line.id]\"\r\n [disabled]=\"getUnfulfilledCount(line) === 0\"\r\n [(ngModel)]=\"fulfillmentQuantities[line.id].fulfillCount\"\r\n type=\"number\"\r\n [max]=\"fulfillmentQuantities[line.id].max\"\r\n min=\"0\"\r\n />\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n <div class=\"shipping-details\">\r\n <vdr-formatted-address [address]=\"order.shippingAddress\"></vdr-formatted-address>\r\n <h6>{{ 'order.shipping-method' | translate }}</h6>\r\n {{ order.shippingLines[0]?.shippingMethod?.name }}\r\n <strong>{{ order.shipping | localeCurrency: order.currencyCode }}</strong>\r\n <vdr-configurable-input\r\n [operationDefinition]=\"fulfillmentHandlerDef\"\r\n [operation]=\"fulfillmentHandler\"\r\n [formControl]=\"fulfillmentHandlerControl\"\r\n [removable]=\"false\"\r\n ></vdr-configurable-input>\r\n </div>\r\n</div>\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)=\"select()\" [disabled]=\"!canSubmit()\" class=\"btn btn-primary\">\r\n {{ 'order.create-fulfillment' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport {\r\n configurableDefinitionToInstance,\r\n ConfigurableOperation,\r\n ConfigurableOperationDefinition,\r\n configurableOperationValueIsValid,\r\n DataService,\r\n Dialog,\r\n FulfillOrderInput,\r\n GlobalFlag,\r\n OrderDetailFragment,\r\n toConfigurableOperationInput,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-fulfill-order-dialog',\r\n templateUrl: './fulfill-order-dialog.component.html',\r\n styleUrls: ['./fulfill-order-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FulfillOrderDialogComponent implements Dialog<FulfillOrderInput>, OnInit {\r\n resolveWith: (result?: FulfillOrderInput) => void;\r\n fulfillmentHandlerDef: ConfigurableOperationDefinition;\r\n fulfillmentHandler: ConfigurableOperation;\r\n fulfillmentHandlerControl = new FormControl();\r\n fulfillmentQuantities: { [lineId: string]: { fulfillCount: number; max: number } } = {};\r\n\r\n // Provided by modalService.fromComponent() call\r\n order: OrderDetailFragment;\r\n\r\n constructor(private dataService: DataService, private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {\r\n this.dataService.settings.getGlobalSettings().single$.subscribe(({ globalSettings }) => {\r\n this.fulfillmentQuantities = this.order.lines.reduce((result, line) => {\r\n const fulfillCount = this.getFulfillableCount(line, globalSettings.trackInventory);\r\n return {\r\n ...result,\r\n [line.id]: { fulfillCount, max: fulfillCount },\r\n };\r\n }, {});\r\n this.changeDetector.markForCheck();\r\n });\r\n\r\n this.dataService.shippingMethod\r\n .getShippingMethodOperations()\r\n .mapSingle(data => data.fulfillmentHandlers)\r\n .subscribe(handlers => {\r\n this.fulfillmentHandlerDef =\r\n handlers.find(\r\n h => h.code === this.order.shippingLines[0]?.shippingMethod?.fulfillmentHandlerCode,\r\n ) || handlers[0];\r\n this.fulfillmentHandler = configurableDefinitionToInstance(this.fulfillmentHandlerDef);\r\n this.fulfillmentHandlerControl.patchValue(this.fulfillmentHandler);\r\n this.changeDetector.markForCheck();\r\n });\r\n }\r\n\r\n getFulfillableCount(line: OrderDetailFragment['lines'][number], globalTrackInventory: boolean): number {\r\n const { trackInventory, stockOnHand } = line.productVariant;\r\n const effectiveTracInventory =\r\n trackInventory === GlobalFlag.INHERIT ? globalTrackInventory : trackInventory === GlobalFlag.TRUE;\r\n\r\n const unfulfilledCount = this.getUnfulfilledCount(line);\r\n return effectiveTracInventory ? Math.min(unfulfilledCount, stockOnHand) : unfulfilledCount;\r\n }\r\n\r\n getUnfulfilledCount(line: OrderDetailFragment['lines'][number]): number {\r\n const fulfilled =\r\n line.fulfillments\r\n ?.map(f => f.summary)\r\n .flat()\r\n .filter(row => row.orderLine.id === line.id)\r\n .reduce((sum, row) => sum + row.quantity, 0) ?? 0;\r\n return line.quantity - fulfilled;\r\n }\r\n\r\n canSubmit(): boolean {\r\n const totalCount = Object.values(this.fulfillmentQuantities).reduce(\r\n (total, { fulfillCount }) => total + fulfillCount,\r\n 0,\r\n );\r\n const formIsValid =\r\n configurableOperationValueIsValid(\r\n this.fulfillmentHandlerDef,\r\n this.fulfillmentHandlerControl.value,\r\n ) && this.fulfillmentHandlerControl.valid;\r\n return formIsValid && 0 < totalCount;\r\n }\r\n\r\n select() {\r\n const lines = Object.entries(this.fulfillmentQuantities).map(([orderLineId, { fulfillCount }]) => ({\r\n orderLineId,\r\n quantity: fulfillCount,\r\n }));\r\n this.resolveWith({\r\n lines,\r\n handler: toConfigurableOperationInput(\r\n this.fulfillmentHandler,\r\n this.fulfillmentHandlerControl.value,\r\n ),\r\n });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<vdr-chip [title]=\"'order.payment-state' | translate\" [colorType]=\"chipColorType\">\r\n <clr-icon shape=\"check-circle\" *ngIf=\"state === 'Delivered'\"></clr-icon>\r\n {{ state | stateI18nToken | translate }}\r\n</vdr-chip>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'vdr-fulfillment-state-label',\r\n templateUrl: './fulfillment-state-label.component.html',\r\n styleUrls: ['./fulfillment-state-label.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FulfillmentStateLabelComponent {\r\n @Input() state: string;\r\n\r\n get chipColorType() {\r\n switch (this.state) {\r\n case 'Pending':\r\n case 'Shipped':\r\n return 'warning';\r\n case 'Delivered':\r\n return 'success';\r\n case 'Cancelled':\r\n return 'error';\r\n }\r\n }\r\n}\r\n","<div class=\"items-list\">\r\n <ul>\r\n <li *ngFor=\"let item of items\" [title]=\"item.name\">\r\n <div class=\"quantity\">{{ item.quantity }}</div>\r\n <clr-icon shape=\"times\" size=\"12\"></clr-icon>\r\n {{ item.name }}\r\n </li>\r\n </ul>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'vdr-simple-item-list',\r\n templateUrl: './simple-item-list.component.html',\r\n styleUrls: ['./simple-item-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SimpleItemListComponent {\r\n @Input() items: Array<{ name: string; quantity: number }>;\r\n}\r\n","<vdr-labeled-data [label]=\"'common.created-at' | translate\">\r\n {{ fulfillment?.createdAt | localeDate: 'medium' }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data [label]=\"'order.fulfillment-method' | translate\">\r\n {{ fulfillment?.method }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data *ngIf=\"fulfillment?.trackingCode\" [label]=\"'order.tracking-code' | translate\">\r\n {{ fulfillment?.trackingCode }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data [label]=\"'order.contents' | translate\">\r\n <vdr-simple-item-list [items]=\"items\"></vdr-simple-item-list>\r\n</vdr-labeled-data>\r\n<ng-container *ngFor=\"let customField of customFieldConfig\">\r\n <vdr-custom-field-control\r\n *ngIf=\"customFieldFormGroup.get(customField.name)\"\r\n [readonly]=\"true\"\r\n [compact]=\"true\"\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"customFieldFormGroup\"\r\n ></vdr-custom-field-control>\r\n</ng-container>\r\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { CustomFieldConfig, OrderDetailFragment, ServerConfigService } from '@vendure/admin-ui/core';\r\nimport { isObject } from '@vendure/common/lib/shared-utils';\r\n\r\n@Component({\r\n selector: 'vdr-fulfillment-detail',\r\n templateUrl: './fulfillment-detail.component.html',\r\n styleUrls: ['./fulfillment-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FulfillmentDetailComponent implements OnInit, OnChanges {\r\n @Input() fulfillmentId: string;\r\n @Input() order: OrderDetailFragment;\r\n\r\n customFieldConfig: CustomFieldConfig[] = [];\r\n customFieldFormGroup = new FormGroup({});\r\n\r\n constructor(private serverConfigService: ServerConfigService) {}\r\n\r\n ngOnInit() {\r\n this.customFieldConfig = this.serverConfigService.getCustomFieldsFor('Fulfillment');\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.buildCustomFieldsFormGroup();\r\n }\r\n\r\n get fulfillment(): NonNullable<OrderDetailFragment['fulfillments']>[number] | undefined | null {\r\n return this.order.fulfillments && this.order.fulfillments.find(f => f.id === this.fulfillmentId);\r\n }\r\n\r\n get items(): Array<{ name: string; quantity: number }> {\r\n return (\r\n this.fulfillment?.summary.map(row => {\r\n return {\r\n name:\r\n this.order.lines.find(line => line.id === row.orderLine.id)?.productVariant.name ??\r\n '',\r\n quantity: row.quantity,\r\n };\r\n }) ?? []\r\n );\r\n }\r\n\r\n buildCustomFieldsFormGroup() {\r\n const customFields = (this.fulfillment as any).customFields;\r\n for (const fieldDef of this.serverConfigService.getCustomFieldsFor('Fulfillment')) {\r\n this.customFieldFormGroup.addControl(fieldDef.name, new FormControl(customFields[fieldDef.name]));\r\n }\r\n }\r\n\r\n customFieldIsObject(customField: unknown) {\r\n return Array.isArray(customField) || isObject(customField);\r\n }\r\n}\r\n","<div class=\"card\">\r\n <div class=\"card-header fulfillment-header\">\r\n <div>{{ 'order.fulfillment' | translate }}</div>\r\n <div class=\"fulfillment-state\">\r\n <vdr-fulfillment-state-label [state]=\"fulfillment?.state\"></vdr-fulfillment-state-label>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-fulfillment-detail\r\n *ngIf=\"!!fulfillment\"\r\n [fulfillmentId]=\"fulfillment?.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </div>\r\n <div class=\"card-footer\" *ngIf=\"fulfillment?.nextStates.length\">\r\n <ng-container *ngIf=\"nextSuggestedState() as suggestedState\">\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"transitionState.emit(suggestedState)\">\r\n {{ 'order.set-fulfillment-state' | translate: { state: (suggestedState | stateI18nToken | translate) } }}\r\n </button>\r\n </ng-container>\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 <ng-container *ngFor=\"let nextState of nextOtherStates()\">\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n (click)=\"transitionState.emit(nextState)\"\r\n >\r\n <ng-container *ngIf=\"nextState !== 'Cancelled'; else cancel\">\r\n <clr-icon shape=\"step-forward-2\"></clr-icon>\r\n {{ 'order.transition-to-state' | translate: { state: (nextState | stateI18nToken | translate) } }}\r\n </ng-container>\r\n <ng-template #cancel>\r\n <clr-icon shape=\"error-standard\" class=\"is-error\"></clr-icon>\r\n {{ 'order.cancel-fulfillment' | translate }}\r\n </ng-template>\r\n </button>\r\n </ng-container>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FulfillmentFragment, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-fulfillment-card',\r\n templateUrl: './fulfillment-card.component.html',\r\n styleUrls: ['./fulfillment-card.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FulfillmentCardComponent {\r\n @Input() fulfillment: FulfillmentFragment | undefined;\r\n @Input() order: OrderDetailFragment;\r\n @Output() transitionState = new EventEmitter<string>();\r\n\r\n nextSuggestedState(): string | undefined {\r\n if (!this.fulfillment) {\r\n return;\r\n }\r\n const { nextStates } = this.fulfillment;\r\n const namedStateOrDefault = (targetState: string) =>\r\n nextStates.includes(targetState) ? targetState : nextStates[0];\r\n switch (this.fulfillment?.state) {\r\n case 'Pending':\r\n return namedStateOrDefault('Shipped');\r\n case 'Shipped':\r\n return namedStateOrDefault('Delivered');\r\n default:\r\n return nextStates.find(s => s !== 'Cancelled');\r\n }\r\n }\r\n\r\n nextOtherStates(): string[] {\r\n if (!this.fulfillment) {\r\n return [];\r\n }\r\n const suggested = this.nextSuggestedState();\r\n return this.fulfillment.nextStates.filter(s => s !== suggested);\r\n }\r\n}\r\n","<vdr-dropdown class=\"search-settings-menu\" *ngIf=\"fulfilledCount || orderState === 'PartiallyDelivered'\">\r\n <button type=\"button\" class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon *ngIf=\"fulfillmentStatus === 'full'\" class=\"item-fulfilled\" shape=\"check-circle\"></clr-icon>\r\n <clr-icon\r\n *ngIf=\"fulfillmentStatus === 'partial'\"\r\n class=\"item-partially-fulfilled\"\r\n shape=\"check-circle\"\r\n ></clr-icon>\r\n <clr-icon\r\n *ngIf=\"fulfillmentStatus === 'none'\"\r\n class=\"item-not-fulfilled\"\r\n shape=\"exclamation-circle\"\r\n ></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <label class=\"dropdown-header\" *ngIf=\"fulfillmentStatus === 'full'\">\r\n {{ 'order.line-fulfillment-all' | translate }}\r\n </label>\r\n <label class=\"dropdown-header\" *ngIf=\"fulfillmentStatus === 'partial'\">\r\n {{\r\n 'order.line-fulfillment-partial' | translate: { total: line.quantity, count: fulfilledCount }\r\n }}\r\n </label>\r\n <label class=\"dropdown-header\" *ngIf=\"fulfillmentStatus === 'none'\">\r\n {{ 'order.line-fulfillment-none' | translate }}\r\n </label>\r\n <div class=\"fulfillment-detail\" *ngFor=\"let item of fulfillments\">\r\n <div class=\"fulfillment-title\">\r\n {{ 'order.fulfillment' | translate }} #{{ item.fulfillment.id }} ({{\r\n 'order.item-count' | translate: { count: item.count }\r\n }})\r\n </div>\r\n <vdr-labeled-data [label]=\"'common.created-at' | translate\">\r\n {{ item.fulfillment.createdAt | localeDate: 'medium' }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.fulfillment-method' | translate\">\r\n {{ item.fulfillment.method }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data\r\n *ngIf=\"item.fulfillment.trackingCode\"\r\n [label]=\"'order.tracking-code' | translate\"\r\n >\r\n {{ item.fulfillment.trackingCode }}\r\n </vdr-labeled-data>\r\n </div>\r\n </vdr-dropdown-menu>\r\n</vdr-dropdown>\r\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { OrderDetailFragment } from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\n\r\nexport type FulfillmentStatus = 'full' | 'partial' | 'none';\r\ntype Fulfillment = NonNullable<OrderDetailFragment['fulfillments']>[number];\r\n\r\n@Component({\r\n selector: 'vdr-line-fulfillment',\r\n templateUrl: './line-fulfillment.component.html',\r\n styleUrls: ['./line-fulfillment.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class LineFulfillmentComponent implements OnChanges {\r\n @Input() line: OrderDetailFragment['lines'][number];\r\n @Input() orderState: string;\r\n fulfilledCount = 0;\r\n fulfillmentStatus: FulfillmentStatus;\r\n fulfillments: Array<{\r\n count: number;\r\n fulfillment: Fulfillment;\r\n }> = [];\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.line) {\r\n this.fulfilledCount = this.getDeliveredCount(this.line);\r\n this.fulfillmentStatus = this.getFulfillmentStatus(this.fulfilledCount, this.line.items.length);\r\n this.fulfillments = this.getFulfillments(this.line);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the number of items in an OrderLine which are fulfilled.\r\n */\r\n private getDeliveredCount(line: OrderDetailFragment['lines'][number]): number {\r\n return (\r\n line.fulfillments?.reduce(\r\n (sum, fulfillment) =>\r\n sum + (fulfillment.summary.find(s => s.orderLine.id === line.id)?.quantity ?? 0),\r\n 0,\r\n ) ?? 0\r\n );\r\n }\r\n\r\n private getFulfillmentStatus(fulfilledCount: number, lineQuantity: number): FulfillmentStatus {\r\n if (fulfilledCount === lineQuantity) {\r\n return 'full';\r\n }\r\n if (0 < fulfilledCount && fulfilledCount < lineQuantity) {\r\n return 'partial';\r\n }\r\n return 'none';\r\n }\r\n\r\n private getFulfillments(\r\n line: OrderDetailFragment['lines'][number],\r\n ): Array<{ count: number; fulfillment: NonNullable<OrderDetailFragment['fulfillments']>[number] }> {\r\n return (\r\n line.fulfillments?.map(fulfillment => {\r\n const summaryLine = fulfillment.summary.find(s => s.orderLine.id === line.id);\r\n return {\r\n count: summaryLine?.quantity ?? 0,\r\n fulfillment,\r\n };\r\n }) ?? []\r\n );\r\n }\r\n}\r\n","<span *ngIf=\"getRefundedCount()\" [title]=\"'order.refunded-count' | translate: { count: getRefundedCount() }\">\r\n <clr-icon shape=\"redo\" class=\"is-solid\" dir=\"down\"></clr-icon>\r\n</span>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-line-refunds',\r\n templateUrl: './line-refunds.component.html',\r\n styleUrls: ['./line-refunds.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class LineRefundsComponent {\r\n @Input() line: OrderDetailFragment['lines'][number];\r\n @Input() payments: OrderDetailFragment['payments'];\r\n\r\n getRefundedCount(): number {\r\n const refunds =\r\n this.payments?.reduce(\r\n (all, payment) => [...all, ...payment.refunds],\r\n [] as NonNullable<OrderDetailFragment['payments']>[number]['refunds'],\r\n ) ?? [];\r\n return this.line.items.filter(i => {\r\n if (i.refundId === null && !i.cancelled) {\r\n return false;\r\n }\r\n if (i.refundId) {\r\n const refund = refunds.find(r => r.id === i.refundId);\r\n if (refund?.state === 'Failed') {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }).length;\r\n }\r\n}\r\n","<vdr-labeled-data [label]=\"'common.ID' | translate\">{{ modification.id }}</vdr-labeled-data>\r\n<vdr-labeled-data *ngIf=\"modification.note\" [label]=\"'order.note' | translate\">{{\r\n modification.note\r\n}}</vdr-labeled-data>\r\n<vdr-labeled-data *ngFor=\"let surcharge of modification.surcharges\" [label]=\"'order.surcharges' | translate\">\r\n {{ getSurcharge(surcharge.id)?.description }}\r\n {{ getSurcharge(surcharge.id)?.priceWithTax | localeCurrency: order.currencyCode }}</vdr-labeled-data\r\n>\r\n<vdr-labeled-data *ngIf=\"getAddedItems().length\" [label]=\"'order.added-items' | translate\">\r\n <vdr-simple-item-list [items]=\"getAddedItems()\"></vdr-simple-item-list>\r\n</vdr-labeled-data>\r\n<vdr-labeled-data *ngIf=\"getRemovedItems().length\" [label]=\"'order.removed-items' | translate\">\r\n <vdr-simple-item-list [items]=\"getRemovedItems()\"></vdr-simple-item-list>\r\n</vdr-labeled-data>\r\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit } from '@angular/core';\r\nimport { OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-modification-detail',\r\n templateUrl: './modification-detail.component.html',\r\n styleUrls: ['./modification-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ModificationDetailComponent implements OnChanges {\r\n @Input() order: OrderDetailFragment;\r\n @Input() modification: OrderDetailFragment['modifications'][number];\r\n private addedItems = new Map<OrderDetailFragment['lines'][number], number>();\r\n private removedItems = new Map<OrderDetailFragment['lines'][number], number>();\r\n\r\n ngOnChanges(): void {\r\n const { added, removed } = this.getModifiedLines();\r\n this.addedItems = added;\r\n this.removedItems = removed;\r\n }\r\n\r\n getSurcharge(id: string) {\r\n return this.order.surcharges.find(m => m.id === id);\r\n }\r\n\r\n getAddedItems() {\r\n return [...this.addedItems.entries()].map(([line, count]) => {\r\n return { name: line.productVariant.name, quantity: count };\r\n });\r\n }\r\n\r\n getRemovedItems() {\r\n return [...this.removedItems.entries()].map(([line, count]) => {\r\n return { name: line.productVariant.name, quantity: count };\r\n });\r\n }\r\n\r\n private getModifiedLines() {\r\n const added = new Map<OrderDetailFragment['lines'][number], number>();\r\n const removed = new Map<OrderDetailFragment['lines'][number], number>();\r\n for (const _item of this.modification.orderItems || []) {\r\n const result = this.getOrderLineAndItem(_item.id);\r\n if (result) {\r\n const { line, item } = result;\r\n if (item.cancelled) {\r\n const count = removed.get(line) ?? 0;\r\n removed.set(line, count + 1);\r\n } else {\r\n const count = added.get(line) ?? 0;\r\n added.set(line, count + 1);\r\n }\r\n }\r\n }\r\n return { added, removed };\r\n }\r\n\r\n private getOrderLineAndItem(itemId: string) {\r\n for (const line of this.order.lines) {\r\n const item = line.items.find(i => i.id === itemId);\r\n if (item) {\r\n return { line, item };\r\n }\r\n }\r\n }\r\n}\r\n","<div class=\"card\" *ngIf=\"customFieldsConfig.length\">\r\n <div class=\"card-header\">\r\n {{ 'common.custom-fields' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"card-text custom-field-form\" [class.editable]=\"editable\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Order\"\r\n [customFields]=\"customFieldsConfig\"\r\n [customFieldsFormGroup]=\"customFieldForm\"\r\n [readonly]=\"!editable\"\r\n [compact]=\"true\"\r\n ></vdr-tabbed-custom-fields>\r\n </div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <button class=\"btn btn-sm btn-secondary\" (click)=\"editable = true\" *ngIf=\"!editable\">\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-primary\"\r\n (click)=\"onUpdateClick()\"\r\n *ngIf=\"editable\"\r\n [disabled]=\"customFieldForm.pristine || customFieldForm.invalid\"\r\n >\r\n <clr-icon shape=\"check\"></clr-icon>\r\n {{ 'common.update' | translate }}\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-secondary\"\r\n (click)=\"onCancelClick()\"\r\n *ngIf=\"editable\"\r\n >\r\n <clr-icon shape=\"times\"></clr-icon>\r\n {{ 'common.cancel' | translate }}\r\n </button>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport { CustomFieldConfig, ModalService } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-order-custom-fields-card',\r\n templateUrl: './order-custom-fields-card.component.html',\r\n styleUrls: ['./order-custom-fields-card.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderCustomFieldsCardComponent implements OnInit {\r\n @Input() customFieldsConfig: CustomFieldConfig[] = [];\r\n @Input() customFieldValues: { [name: string]: any } = {};\r\n @Output() updateClick = new EventEmitter<any>();\r\n customFieldForm: FormGroup;\r\n editable = false;\r\n constructor(private formBuilder: FormBuilder, private modalService: ModalService) {}\r\n\r\n ngOnInit() {\r\n this.customFieldForm = this.formBuilder.group({});\r\n for (const field of this.customFieldsConfig) {\r\n this.customFieldForm.addControl(\r\n field.name,\r\n this.formBuilder.control(this.customFieldValues[field.name]),\r\n );\r\n }\r\n }\r\n\r\n onUpdateClick() {\r\n this.updateClick.emit(this.customFieldForm.value);\r\n this.customFieldForm.markAsPristine();\r\n this.editable = false;\r\n }\r\n\r\n onCancelClick() {\r\n if (this.customFieldForm.dirty) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-cancel'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.keep-editing') },\r\n { type: 'danger', label: _('common.discard-changes'), returnValue: true },\r\n ],\r\n })\r\n .subscribe(result => {\r\n if (result) {\r\n this.customFieldForm.reset();\r\n this.customFieldForm.markAsPristine();\r\n this.editable = false;\r\n }\r\n });\r\n } else {\r\n this.editable = false;\r\n }\r\n }\r\n}\r\n","export const NODE_HEIGHT = 72;\r\n","<div class=\"node-wrapper\" [ngStyle]=\"getStyle()\" [class.active]=\"active$ | async\">\r\n <div\r\n class=\"node\"\r\n [class.active-target]=\"activeTarget$ | async\"\r\n >\r\n {{ node.name | stateI18nToken | translate }}\r\n </div>\r\n <div class=\"cancelled-wrapper\" *ngIf=\"isCancellable\">\r\n <div class=\"cancelled-edge\">\r\n </div>\r\n <clr-icon shape=\"dot-circle\"></clr-icon>\r\n <div class=\"cancelled-node\">\r\n {{ cancelledState | stateI18nToken | translate }}\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nimport { NODE_HEIGHT } from './constants';\r\nimport { StateNode } from './types';\r\n\r\n@Component({\r\n selector: 'vdr-order-process-node',\r\n templateUrl: './order-process-node.component.html',\r\n styleUrls: ['./order-process-node.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderProcessNodeComponent implements OnChanges {\r\n @Input() node: StateNode;\r\n @Input() index: number;\r\n @Input() active: boolean;\r\n active$ = new BehaviorSubject<boolean>(false);\r\n activeTarget$ = new BehaviorSubject<boolean>(false);\r\n isCancellable = false;\r\n // We use a class field here to prevent the\r\n // i18n extractor from extracting a \"Cancelled\" key\r\n cancelledState = 'Cancelled';\r\n\r\n constructor(private elementRef: ElementRef<HTMLDivElement>) {}\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.isCancellable = !!this.node.to.find((s) => s.name === 'Cancelled');\r\n if (changes.active) {\r\n this.active$.next(this.active);\r\n }\r\n }\r\n\r\n getPos(origin: 'top' | 'bottom' = 'top'): { x: number; y: number } {\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const nodeHeight =\r\n this.elementRef.nativeElement.querySelector('.node')?.getBoundingClientRect().height ?? 0;\r\n return {\r\n x: 10,\r\n y: this.index * NODE_HEIGHT + (origin === 'bottom' ? nodeHeight : 0),\r\n };\r\n }\r\n\r\n getStyle() {\r\n const pos = this.getPos();\r\n return {\r\n 'top.px': pos.y,\r\n 'left.px': pos.x,\r\n };\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\n\r\nimport { OrderProcessNodeComponent } from './order-process-node.component';\r\n\r\n@Component({\r\n selector: 'vdr-order-process-edge',\r\n templateUrl: './order-process-edge.component.html',\r\n styleUrls: ['./order-process-edge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderProcessEdgeComponent implements OnInit {\r\n @Input() from: OrderProcessNodeComponent;\r\n @Input() to: OrderProcessNodeComponent;\r\n @Input() index: number;\r\n active$: Observable<boolean>;\r\n\r\n ngOnInit() {\r\n this.active$ = this.from.active$\r\n .asObservable()\r\n .pipe(tap((active) => this.to.activeTarget$.next(active)));\r\n }\r\n\r\n getStyle() {\r\n const direction = this.from.index < this.to.index ? 'down' : 'up';\r\n const startPos = this.from.getPos(direction === 'down' ? 'bottom' : 'top');\r\n const endPos = this.to.getPos(direction === 'down' ? 'top' : 'bottom');\r\n const dX = Math.abs(startPos.x - endPos.x);\r\n const dY = Math.abs(startPos.y - endPos.y);\r\n const length = Math.sqrt(dX ** 2 + dY ** 2);\r\n return {\r\n 'top.px': startPos.y,\r\n 'left.px': startPos.x + (direction === 'down' ? 10 : 40) + this.index * 12,\r\n 'height.px': length,\r\n 'width.px': 1,\r\n ...(direction === 'up'\r\n ? {\r\n transform: 'rotateZ(180deg)',\r\n 'transform-origin': 'top',\r\n }\r\n : {}),\r\n };\r\n }\r\n}\r\n","<ng-container *ngFor=\"let state of nodes; let i = index\">\r\n <vdr-order-process-node\r\n [node]=\"state\"\r\n [index]=\"i\"\r\n [active]=\"(activeState$ | async) === state.name\"\r\n (mouseenter)=\"onMouseOver(state.name)\"\r\n (mouseleave)=\"onMouseOut()\"\r\n ></vdr-order-process-node>\r\n</ng-container>\r\n<ng-container *ngFor=\"let edge of edges\">\r\n <vdr-order-process-edge [from]=\"edge.from\" [to]=\"edge.to\" [index]=\"edge.index\"></vdr-order-process-edge>\r\n</ng-container>\r\n","<div\r\n [attr.data-from]=\"from.node.name\"\r\n [attr.data-to]=\"to.node.name\"\r\n [ngStyle]=\"getStyle()\"\r\n [class.active]=\"active$ | async\"\r\n class=\"edge\">\r\n <clr-icon shape=\"arrow\" flip=\"vertical\" class=\"arrow\"></clr-icon>\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n QueryList,\r\n SimpleChanges,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport { OrderProcessState } from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\n\r\nimport { NODE_HEIGHT } from './constants';\r\nimport { OrderProcessNodeComponent } from './order-process-node.component';\r\nimport { StateNode } from './types';\r\n\r\n@Component({\r\n selector: 'vdr-order-process-graph',\r\n templateUrl: './order-process-graph.component.html',\r\n styleUrls: ['./order-process-graph.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderProcessGraphComponent implements OnInit, OnChanges, AfterViewInit {\r\n @Input() states: OrderProcessState[];\r\n @Input() initialState?: string;\r\n setActiveState$ = new BehaviorSubject<string | undefined>(undefined);\r\n activeState$: Observable<string | undefined>;\r\n nodes: StateNode[] = [];\r\n edges: Array<{ from: OrderProcessNodeComponent; to: OrderProcessNodeComponent; index: number }> = [];\r\n\r\n @ViewChildren(OrderProcessNodeComponent) nodeComponents: QueryList<OrderProcessNodeComponent>;\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n @HostBinding('style.height.px')\r\n get outerHeight(): number {\r\n return this.nodes.length * NODE_HEIGHT;\r\n }\r\n\r\n ngOnInit() {\r\n this.setActiveState$.next(this.initialState);\r\n this.activeState$ = this.setActiveState$.pipe(debounceTime(150));\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.populateNodes();\r\n }\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => this.populateEdges());\r\n }\r\n\r\n onMouseOver(stateName: string) {\r\n this.setActiveState$.next(stateName);\r\n }\r\n\r\n onMouseOut() {\r\n this.setActiveState$.next(this.initialState);\r\n }\r\n\r\n getNodeFor(state: string): OrderProcessNodeComponent | undefined {\r\n if (this.nodeComponents) {\r\n return this.nodeComponents.find((n) => n.node.name === state);\r\n }\r\n }\r\n\r\n private populateNodes() {\r\n const stateNodeMap = new Map<string, StateNode>();\r\n for (const state of this.states) {\r\n stateNodeMap.set(state.name, {\r\n name: state.name,\r\n to: [],\r\n });\r\n }\r\n\r\n for (const [name, stateNode] of stateNodeMap.entries()) {\r\n const targets = this.states.find((s) => s.name === name)?.to ?? [];\r\n for (const target of targets) {\r\n const targetNode = stateNodeMap.get(target);\r\n if (targetNode) {\r\n stateNode.to.push(targetNode);\r\n }\r\n }\r\n }\r\n this.nodes = [...stateNodeMap.values()].filter((n) => n.name !== 'Cancelled');\r\n }\r\n\r\n private populateEdges() {\r\n for (const node of this.nodes) {\r\n const nodeCmp = this.getNodeFor(node.name);\r\n let index = 0;\r\n for (const to of node.to) {\r\n const toCmp = this.getNodeFor(to.name);\r\n if (nodeCmp && toCmp && nodeCmp !== toCmp) {\r\n this.edges.push({\r\n to: toCmp,\r\n from: nodeCmp,\r\n index,\r\n });\r\n index++;\r\n }\r\n }\r\n }\r\n this.edges = [...this.edges];\r\n this.changeDetector.markForCheck();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.order-state-diagram' | translate }}</ng-template>\r\n\r\n<vdr-order-process-graph [states]=\"states\" [initialState]=\"activeState\"></vdr-order-process-graph>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport {\r\n CancelOrderInput,\r\n DataService,\r\n Dialog,\r\n OrderProcessState,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vdr-order-process-graph-dialog',\r\n templateUrl: './order-process-graph-dialog.component.html',\r\n styleUrls: ['./order-process-graph-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderProcessGraphDialogComponent implements OnInit, Dialog<void> {\r\n activeState: string;\r\n states: OrderProcessState[] = [];\r\n constructor(private serverConfigService: ServerConfigService) {}\r\n\r\n ngOnInit(): void {\r\n this.states = this.serverConfigService.getOrderProcessStates();\r\n }\r\n\r\n resolveWith: (result: void | undefined) => void;\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.refund-and-cancel-order' | translate }}</ng-template>\r\n\r\n<div class=\"refund-wrapper\">\r\n <div class=\"order-table\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.prorated-unit-price' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th>{{ 'order.refund' | translate }}</th>\r\n <th>{{ 'order.cancel' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let line of order.lines\" class=\"order-line\">\r\n <td class=\"align-middle thumb\">\r\n <img [src]=\"line.featuredAsset | assetPreview: 'tiny'\" />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle quantity\">\r\n {{ line.quantity }}\r\n <vdr-line-refunds [line]=\"line\" [payments]=\"order.payments\"></vdr-line-refunds>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n {{ line.unitPriceWithTax | localeCurrency: order.currencyCode }}\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <div class=\"prorated-wrapper\">\r\n {{ line.proratedUnitPriceWithTax | localeCurrency: order.currencyCode }}\r\n <ng-container *ngIf=\"line.discounts as discounts\">\r\n <vdr-dropdown *ngIf=\"discounts.length\">\r\n <div class=\"promotions-label\" vdrDropdownTrigger>\r\n <button class=\"icon-button\"><clr-icon shape=\"info\"></clr-icon></button>\r\n </div>\r\n <vdr-dropdown-menu>\r\n <div class=\"line-promotion\" *ngFor=\"let discount of discounts\">\r\n {{ discount.description }}\r\n <div class=\"promotion-amount\">\r\n {{\r\n discount.amount / 100 / line.quantity\r\n | number: '1.0-2'\r\n | currency: order.currencyCode\r\n }}\r\n </div>\r\n </div>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </ng-container>\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity-col\">\r\n <input\r\n *ngIf=\"lineCanBeRefundedOrCancelled(line)\"\r\n [(ngModel)]=\"lineQuantities[line.id].quantity\"\r\n type=\"number\"\r\n [max]=\"line.quantity\"\r\n min=\"0\"\r\n (input)=\"handleZeroQuantity(lineQuantities[line.id])\"\r\n />\r\n </td>\r\n <td class=\"align-middle\">\r\n <div class=\"cancel-checkbox-wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n *ngIf=\"lineCanBeRefundedOrCancelled(line)\"\r\n clrCheckbox\r\n [disabled]=\"0 === lineQuantities[line.id].quantity\"\r\n [(ngModel)]=\"lineQuantities[line.id].refund\"\r\n />\r\n </div>\r\n </td>\r\n <td class=\"align-middle\">\r\n <div class=\"cancel-checkbox-wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n *ngIf=\"lineCanBeRefundedOrCancelled(line)\"\r\n clrCheckbox\r\n [disabled]=\"0 === lineQuantities[line.id].quantity\"\r\n [(ngModel)]=\"lineQuantities[line.id].cancel\"\r\n />\r\n </div>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n <div class=\"refund-details mt4\" [class.faded]=\"!isRefunding() && !isCancelling()\">\r\n <div>\r\n <label class=\"clr-control-label\">{{ 'order.refund-cancellation-reason' | translate }}</label>\r\n <ng-select\r\n [disabled]=\"!isRefunding() && !isCancelling()\"\r\n [items]=\"reasons\"\r\n bindLabel=\"name\"\r\n autofocus\r\n [placeholder]=\"'order.refund-cancellation-reason-required' | translate\"\r\n bindValue=\"id\"\r\n [addTag]=\"true\"\r\n [(ngModel)]=\"reason\"\r\n ></ng-select>\r\n </div>\r\n\r\n <div>\r\n <clr-select-container>\r\n <label>{{ 'order.payment-to-refund' | translate }}</label>\r\n <select clrSelect name=\"options\" [(ngModel)]=\"selectedPayment\" [disabled]=\"!isRefunding()\">\r\n <option\r\n *ngFor=\"let payment of settledPayments\"\r\n [ngValue]=\"payment\"\r\n [disabled]=\"payment.state !== 'Settled'\"\r\n >\r\n #{{ payment.id }} {{ payment.method }}:\r\n {{ payment.amount | localeCurrency: order.currencyCode }}\r\n </option>\r\n </select>\r\n </clr-select-container>\r\n\r\n <clr-checkbox-wrapper>\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"refundShipping\" [disabled]=\"!isRefunding()\" />\r\n <label>\r\n {{ 'order.refund-shipping' | translate }} ({{\r\n order.shippingWithTax | localeCurrency: order.currencyCode\r\n }})\r\n </label>\r\n </clr-checkbox-wrapper>\r\n <clr-input-container>\r\n <label>{{ 'order.refund-adjustment' | translate }}</label>\r\n <vdr-currency-input\r\n clrInput\r\n [disabled]=\"!isRefunding()\"\r\n [currencyCode]=\"order.currencyCode\"\r\n [(ngModel)]=\"adjustment\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <div class=\"totals\" [class.disabled]=\"!isRefunding()\">\r\n <div class=\"order-total\">\r\n {{ 'order.payment-amount' | translate }}:\r\n {{ selectedPayment.amount | localeCurrency: order.currencyCode }}\r\n </div>\r\n <div class=\"refund-total\">\r\n {{ 'order.refund-total' | translate }}:\r\n {{ refundTotal | localeCurrency: order.currencyCode }}\r\n </div>\r\n <div class=\"refund-total-error\" *ngIf=\"refundTotal < 0 || settledPaymentsTotal < refundTotal\">\r\n {{\r\n 'order.refund-total-error'\r\n | translate\r\n : {\r\n min: 0 | currency: order.currencyCode,\r\n max: settledPaymentsTotal | localeCurrency: order.currencyCode\r\n }\r\n }}\r\n </div>\r\n <div class=\"refund-total-warning\" *ngIf=\"selectedPayment.amount < refundTotal\">\r\n {{ 'order.refund-total-warning' | translate }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\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)=\"select()\" [disabled]=\"!canSubmit()\" class=\"btn btn-primary\">\r\n <ng-container *ngIf=\"isRefunding(); else cancelling\">\r\n {{\r\n 'order.refund-with-amount'\r\n | translate: { amount: refundTotal | localeCurrency: order.currencyCode }\r\n }}\r\n </ng-container>\r\n <ng-template #cancelling>\r\n {{ 'order.cancel-selected-items' | translate }}\r\n </ng-template>\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CancelOrderInput,\r\n Dialog,\r\n getAppConfig,\r\n I18nService,\r\n OrderDetailFragment,\r\n OrderLineInput,\r\n RefundOrderInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { summate } from '@vendure/common/lib/shared-utils';\r\n\r\ntype SelectionLine = { quantity: number; refund: boolean; cancel: boolean };\r\ntype Payment = NonNullable<OrderDetailFragment['payments']>[number];\r\n\r\n@Component({\r\n selector: 'vdr-refund-order-dialog',\r\n templateUrl: './refund-order-dialog.component.html',\r\n styleUrls: ['./refund-order-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RefundOrderDialogComponent\r\n implements OnInit, Dialog<{ cancel: CancelOrderInput; refund: RefundOrderInput }>\r\n{\r\n order: OrderDetailFragment;\r\n resolveWith: (result?: { cancel: CancelOrderInput; refund: RefundOrderInput }) => void;\r\n reason: string;\r\n settledPayments: Payment[];\r\n selectedPayment: Payment;\r\n lineQuantities: { [lineId: string]: SelectionLine } = {};\r\n refundShipping = false;\r\n adjustment = 0;\r\n reasons = getAppConfig().cancellationReasons ?? [\r\n _('order.refund-reason-customer-request'),\r\n _('order.refund-reason-not-available'),\r\n ];\r\n\r\n constructor(private i18nService: I18nService) {\r\n this.reasons = this.reasons.map(r => this.i18nService.translate(r));\r\n }\r\n\r\n get refundTotal(): number {\r\n const itemTotal = this.order.lines.reduce((total, line) => {\r\n const lineRef = this.lineQuantities[line.id];\r\n const refundCount = (lineRef.refund && lineRef.quantity) || 0;\r\n return total + line.proratedUnitPriceWithTax * refundCount;\r\n }, 0);\r\n return itemTotal + (this.refundShipping ? this.order.shippingWithTax : 0) + this.adjustment;\r\n }\r\n\r\n get settledPaymentsTotal(): number {\r\n return this.settledPayments\r\n .map(payment => {\r\n const paymentTotal = payment.amount;\r\n const alreadyRefundedTotal = summate(\r\n payment.refunds.filter(r => r.state !== 'Failed') as Array<\r\n Required<Payment['refunds'][number]>\r\n >,\r\n 'total',\r\n );\r\n return paymentTotal - alreadyRefundedTotal;\r\n })\r\n .reduce((sum, amount) => sum + amount, 0);\r\n }\r\n\r\n lineCanBeRefundedOrCancelled(line: OrderDetailFragment['lines'][number]): boolean {\r\n const refunds =\r\n this.order.payments?.reduce(\r\n (all, payment) => [...all, ...payment.refunds],\r\n [] as Payment['refunds'],\r\n ) ?? [];\r\n\r\n const refundable = line.items.filter(i => {\r\n if (i.cancelled) {\r\n return false;\r\n }\r\n if (i.refundId == null) {\r\n return true;\r\n }\r\n const refund = refunds.find(r => r.id === i.refundId);\r\n return refund?.state === 'Failed';\r\n });\r\n return 0 < refundable.length;\r\n }\r\n\r\n ngOnInit() {\r\n this.lineQuantities = this.order.lines.reduce((result, line) => {\r\n return {\r\n ...result,\r\n [line.id]: {\r\n quantity: 0,\r\n refund: false,\r\n cancel: false,\r\n },\r\n };\r\n }, {});\r\n this.settledPayments = (this.order.payments || []).filter(p => p.state === 'Settled');\r\n if (this.settledPayments.length) {\r\n this.selectedPayment = this.settledPayments[0];\r\n }\r\n }\r\n\r\n handleZeroQuantity(line?: SelectionLine) {\r\n if (line?.quantity === 0) {\r\n line.cancel = false;\r\n line.refund = false;\r\n }\r\n }\r\n\r\n isRefunding(): boolean {\r\n const result = Object.values(this.lineQuantities).reduce((isRefunding, line) => {\r\n return isRefunding || (0 < line.quantity && line.refund);\r\n }, false);\r\n return result;\r\n }\r\n\r\n isCancelling(): boolean {\r\n const result = Object.values(this.lineQuantities).reduce((isCancelling, line) => {\r\n return isCancelling || (0 < line.quantity && line.cancel);\r\n }, false);\r\n return result;\r\n }\r\n\r\n canSubmit(): boolean {\r\n if (this.isRefunding()) {\r\n return !!(\r\n this.selectedPayment &&\r\n this.reason &&\r\n 0 < this.refundTotal &&\r\n this.refundTotal <= this.settledPaymentsTotal\r\n );\r\n } else if (this.isCancelling()) {\r\n return !!this.reason;\r\n }\r\n return false;\r\n }\r\n\r\n select() {\r\n const payment = this.selectedPayment;\r\n if (payment) {\r\n const refundLines = this.getOrderLineInput(line => line.refund);\r\n const cancelLines = this.getOrderLineInput(line => line.cancel);\r\n\r\n this.resolveWith({\r\n refund: {\r\n lines: refundLines,\r\n reason: this.reason,\r\n shipping: this.refundShipping ? this.order.shippingWithTax : 0,\r\n adjustment: this.adjustment,\r\n paymentId: payment.id,\r\n },\r\n cancel: {\r\n lines: cancelLines,\r\n orderId: this.order.id,\r\n reason: this.reason,\r\n cancelShipping: this.refundShipping,\r\n },\r\n });\r\n }\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n private getOrderLineInput(filterFn: (line: SelectionLine) => boolean): OrderLineInput[] {\r\n return Object.entries(this.lineQuantities)\r\n .filter(([orderLineId, line]) => 0 < line.quantity && filterFn(line))\r\n .map(([orderLineId, line]) => ({\r\n orderLineId,\r\n quantity: line.quantity,\r\n }));\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.settle-refund' | translate }}</ng-template>\r\n<p class=\"instruction\">\r\n {{ 'order.settle-refund-manual-instructions' | translate: { method: refund.method } }}\r\n</p>\r\n<clr-input-container>\r\n <label>{{ 'order.transaction-id' | translate }}</label>\r\n <input clrInput name=\"transactionId\" [(ngModel)]=\"transactionId\" />\r\n</clr-input-container>\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)=\"submit()\" [disabled]=\"!transactionId\" class=\"btn btn-primary\">\r\n {{ 'order.settle-refund' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { Dialog, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-settle-refund-dialog',\r\n templateUrl: './settle-refund-dialog.component.html',\r\n styleUrls: ['./settle-refund-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SettleRefundDialogComponent implements Dialog<string> {\r\n resolveWith: (result?: string) => void;\r\n transactionId = '';\r\n refund: NonNullable<OrderDetailFragment['payments']>[number]['refunds'][number];\r\n\r\n submit() {\r\n this.resolveWith(this.transactionId);\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.select-state' | translate }}</ng-template>\r\n<p>{{ message | translate }}</p>\r\n<clr-select-container>\r\n <select clrSelect name=\"state\" [(ngModel)]=\"selectedState\">\r\n <option *ngFor=\"let state of nextStates\" [value]=\"state\">\r\n {{ state | stateI18nToken | translate }}\r\n </option>\r\n </select>\r\n</clr-select-container>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"submit\" *ngIf=\"cancellable\" (click)=\"cancel()\" class=\"btn btn-secondary\">\r\n {{ 'common.cancel' | translate }}\r\n </button>\r\n <button type=\"submit\" (click)=\"select()\" class=\"btn btn-primary\" [disabled]=\"!selectedState\">\r\n {{ 'order.transition-to-state' | translate: { state: (selectedState | stateI18nToken | translate) } }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { Dialog } from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-order-state-select-dialog',\n templateUrl: './order-state-select-dialog.component.html',\n styleUrls: ['./order-state-select-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OrderStateSelectDialogComponent implements Dialog<string> {\n resolveWith: (result?: string) => void;\n nextStates: string[] = [];\n message = '';\n cancellable: boolean;\n selectedState = '';\n\n select() {\n if (this.selectedState) {\n this.resolveWith(this.selectedState);\n }\n }\n\n cancel() {\n this.resolveWith();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n DataService,\n HistoryEntryType,\n I18nService,\n ModalService,\n NotificationService,\n SortOrder,\n} from '@vendure/admin-ui/core';\nimport { EMPTY } from 'rxjs';\nimport { catchError, delay, map, retryWhen, switchMap, take } from 'rxjs/operators';\n\nimport { OrderStateSelectDialogComponent } from '../components/order-state-select-dialog/order-state-select-dialog.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class OrderTransitionService {\n constructor(\n private dataService: DataService,\n private modalService: ModalService,\n private notificationService: NotificationService,\n private i18nService: I18nService,\n ) {}\n\n /**\n * Attempts to transition the Order to the last state it was in before it was transitioned\n * to the \"Modifying\" state. If this fails, a manual prompt is used.\n */\n transitionToPreModifyingState(orderId: string, nextStates: string[]) {\n return this.getPreModifyingState(orderId).pipe(\n switchMap(state => {\n const manualTransitionOptions = {\n orderId,\n nextStates,\n message: this.i18nService.translate(\n _('order.unable-to-transition-to-state-try-another'),\n { state },\n ),\n cancellable: false,\n retry: 10,\n };\n if (state) {\n return this.transitionToStateOrThrow(orderId, state).pipe(\n catchError(err => this.manuallyTransitionToState(manualTransitionOptions)),\n );\n } else {\n return this.manuallyTransitionToState(manualTransitionOptions);\n }\n }),\n );\n }\n\n /**\n * Displays a modal for manually selecting the next state.\n */\n manuallyTransitionToState(options: {\n orderId: string;\n nextStates: string[];\n message: string;\n cancellable: boolean;\n retry: number;\n }) {\n return this.modalService\n .fromComponent(OrderStateSelectDialogComponent, {\n locals: {\n nextStates: options.nextStates,\n cancellable: options.cancellable,\n message: options.message,\n },\n closable: false,\n size: 'md',\n })\n .pipe(\n switchMap(result => {\n if (result) {\n return this.transitionToStateOrThrow(options.orderId, result);\n } else {\n if (!options.cancellable) {\n throw new Error(`An order state must be selected`);\n } else {\n return EMPTY;\n }\n }\n }),\n retryWhen(errors => errors.pipe(delay(2000), take(options.retry))),\n );\n }\n\n /**\n * Attempts to get the last state the Order was in before it was transitioned\n * to the \"Modifying\" state.\n */\n private getPreModifyingState(orderId: string) {\n return this.dataService.order\n .getOrderHistory(orderId, {\n filter: {\n type: {\n eq: HistoryEntryType.ORDER_STATE_TRANSITION,\n },\n },\n sort: {\n createdAt: SortOrder.DESC,\n },\n })\n .mapSingle(result => result.order)\n .pipe(\n map(result => {\n const item = result?.history.items.find(i => i.data.to === 'Modifying');\n if (item) {\n return item.data.from as string;\n } else {\n return;\n }\n }),\n );\n }\n\n private transitionToStateOrThrow(orderId: string, state: string) {\n return this.dataService.order.transitionToState(orderId, state).pipe(\n map(({ transitionOrderToState }) => {\n switch (transitionOrderToState?.__typename) {\n case 'Order':\n return transitionOrderToState?.state;\n case 'OrderStateTransitionError':\n this.notificationService.error(transitionOrderToState?.transitionError);\n throw new Error(transitionOrderToState?.transitionError);\n }\n }),\n );\n }\n}\n","import { Subject } from '../Subject';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function retryWhen(notifier) {\n return operate((source, subscriber) => {\n let innerSub;\n let syncResub = false;\n let errors$;\n const subscribeForRetryWhen = () => {\n innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, (err) => {\n if (!errors$) {\n errors$ = new Subject();\n notifier(errors$).subscribe(createOperatorSubscriber(subscriber, () => innerSub ? subscribeForRetryWhen() : (syncResub = true)));\n }\n if (errors$) {\n errors$.next(err);\n }\n }));\n if (syncResub) {\n innerSub.unsubscribe();\n innerSub = null;\n syncResub = false;\n subscribeForRetryWhen();\n }\n };\n subscribeForRetryWhen();\n });\n}\n","<table class=\"order-table table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th>{{ 'order.total' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let line of order.lines\">\r\n <tr class=\"order-line\" [class.is-cancelled]=\"line.quantity === 0\">\r\n <td class=\"align-middle thumb\">\r\n <img *ngIf=\"line.featuredAsset\" [src]=\"line.featuredAsset | assetPreview: 'tiny'\" />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ line.unitPriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.unitPrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n {{ line.quantity }}\r\n <vdr-line-refunds [line]=\"line\" [payments]=\"order.payments\"></vdr-line-refunds>\r\n <vdr-line-fulfillment [line]=\"line\" [orderState]=\"order.state\"></vdr-line-fulfillment>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{ line.linePriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.linePrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n\r\n <ng-container *ngIf=\"getLineDiscounts(line) as discounts\">\r\n <vdr-dropdown *ngIf=\"discounts.length\">\r\n <div class=\"promotions-label\" vdrDropdownTrigger>\r\n {{ 'order.promotions-applied' | translate }}\r\n </div>\r\n <vdr-dropdown-menu>\r\n <div class=\"line-promotion\" *ngFor=\"let discount of discounts\">\r\n <a class=\"promotion-name\" [routerLink]=\"getPromotionLink(discount)\">{{\r\n discount.description\r\n }}</a>\r\n <div class=\"promotion-amount\">\r\n {{ discount.amountWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ discount.amount | localeCurrency: order.currencyCode }}\r\n </div>\r\n </div>\r\n </div>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <ng-container *ngIf=\"customFieldsForLine[line.id] as customFields\">\r\n <tr *ngIf=\"customFields.length\">\r\n <td colspan=\"6\" class=\"custom-fields-row\">\r\n <div class=\"order-line-custom-fields\">\r\n <div class=\"custom-field\" *ngFor=\"let field of customFields\">\r\n <vdr-custom-field-control\r\n [compact]=\"true\"\r\n [readonly]=\"true\"\r\n [customField]=\"field.config\"\r\n [customFieldsFormGroup]=\"field.formGroup\"\r\n ></vdr-custom-field-control>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n <tr class=\"surcharge\" *ngFor=\"let surcharge of order.surcharges\">\r\n <td class=\"align-middle name left\" colspan=\"2\">{{ surcharge.description }}</td>\r\n <td class=\"align-middle sku\">{{ surcharge.sku }}</td>\r\n <td class=\"align-middle\" colspan=\"2\"></td>\r\n <td class=\"align-middle total\">\r\n {{ surcharge.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ surcharge.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <ng-container *ngFor=\"let discount of order.discounts\">\r\n <tr class=\"order-adjustment\" *ngIf=\"discount.type !== 'OTHER'\">\r\n <td colspan=\"5\" class=\"left clr-align-middle\">\r\n <a [routerLink]=\"getPromotionLink(discount)\">{{ discount.description }}</a>\r\n <vdr-chip *ngIf=\"getCouponCodeForAdjustment(order, discount) as couponCode\">{{\r\n couponCode\r\n }}</vdr-chip>\r\n </td>\r\n <td class=\"clr-align-middle\">\r\n {{ discount.amountWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ discount.amount | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr class=\"sub-total\">\r\n <td class=\"left clr-align-middle\">{{ 'order.sub-total' | translate }}</td>\r\n <td colspan=\"4\"></td>\r\n <td class=\"clr-align-middle\">\r\n {{ order.subTotalWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ order.subTotal | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr class=\"shipping\">\r\n <td class=\"left clr-align-middle\">{{ 'order.shipping' | translate }}</td>\r\n <td class=\"clr-align-middle\">{{ getShippingNames(order) }}</td>\r\n <td colspan=\"3\"></td>\r\n <td class=\"clr-align-middle\">\r\n {{ order.shippingWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ order.shipping | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr class=\"total\">\r\n <td class=\"left clr-align-middle\">{{ 'order.total' | translate }}</td>\r\n <td colspan=\"4\"></td>\r\n <td class=\"clr-align-middle\">\r\n {{ order.totalWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ order.total | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { AdjustmentType, CustomFieldConfig, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-order-table',\r\n templateUrl: './order-table.component.html',\r\n styleUrls: ['./order-table.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderTableComponent implements OnInit {\r\n @Input() order: OrderDetailFragment;\r\n @Input() orderLineCustomFields: CustomFieldConfig[];\r\n orderLineCustomFieldsVisible = false;\r\n customFieldsForLine: {\r\n [lineId: string]: Array<{ config: CustomFieldConfig; formGroup: FormGroup; value: any }>;\r\n } = {};\r\n\r\n get visibleOrderLineCustomFields(): CustomFieldConfig[] {\r\n return this.orderLineCustomFieldsVisible ? this.orderLineCustomFields : [];\r\n }\r\n\r\n get showElided(): boolean {\r\n return !this.orderLineCustomFieldsVisible && 0 < this.orderLineCustomFields.length;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.orderLineCustomFieldsVisible = this.orderLineCustomFields.length < 2;\r\n this.getLineCustomFields();\r\n }\r\n\r\n toggleOrderLineCustomFields() {\r\n this.orderLineCustomFieldsVisible = !this.orderLineCustomFieldsVisible;\r\n }\r\n\r\n getLineDiscounts(line: OrderDetailFragment['lines'][number]) {\r\n return line.discounts.filter(a => a.type === AdjustmentType.PROMOTION);\r\n }\r\n\r\n private getLineCustomFields() {\r\n for (const line of this.order.lines) {\r\n const formGroup = new FormGroup({});\r\n const result = this.orderLineCustomFields\r\n .map(config => {\r\n const value = (line as any).customFields[config.name];\r\n formGroup.addControl(config.name, new FormControl(value));\r\n return {\r\n config,\r\n formGroup,\r\n value,\r\n };\r\n })\r\n .filter(field => {\r\n return this.orderLineCustomFieldsVisible ? true : field.value != null;\r\n });\r\n this.customFieldsForLine[line.id] = result;\r\n }\r\n }\r\n\r\n getPromotionLink(promotion: OrderDetailFragment['discounts'][number]): any[] {\r\n const id = promotion.adjustmentSource.split(':')[1];\r\n return ['/marketing', 'promotions', id];\r\n }\r\n\r\n getCouponCodeForAdjustment(\r\n order: OrderDetailFragment,\r\n promotionAdjustment: OrderDetailFragment['discounts'][number],\r\n ): string | undefined {\r\n const id = promotionAdjustment.adjustmentSource.split(':')[1];\r\n const promotion = order.promotions.find(p => p.id === id);\r\n if (promotion) {\r\n return promotion.couponCode || undefined;\r\n }\r\n }\r\n\r\n getShippingNames(order: OrderDetailFragment) {\r\n if (order.shippingLines.length) {\r\n return order.shippingLines.map(shippingLine => shippingLine.shippingMethod.name).join(', ');\r\n } else {\r\n return '';\r\n }\r\n }\r\n}\r\n","<vdr-labeled-data [label]=\"'order.payment-method' | translate\">\r\n {{ payment.method }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data [label]=\"'order.amount' | translate\">\r\n {{ payment.amount | localeCurrency: currencyCode }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data *ngIf=\"payment.errorMessage\" [label]=\"'order.error-message' | translate\">\r\n {{ payment.errorMessage }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data *ngIf=\"payment.transactionId\" [label]=\"'order.transaction-id' | translate\">\r\n {{ payment.transactionId }}\r\n</vdr-labeled-data>\r\n<vdr-labeled-data [label]=\"'order.payment-metadata' | translate\">\r\n <vdr-object-tree [value]=\"payment.metadata\"></vdr-object-tree>\r\n</vdr-labeled-data>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { CurrencyCode, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-payment-detail',\r\n templateUrl: './payment-detail.component.html',\r\n styleUrls: ['./payment-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class PaymentDetailComponent {\r\n @Input() payment: NonNullable<OrderDetailFragment['payments']>[number];\r\n @Input() currencyCode: CurrencyCode;\r\n}\r\n","<h4>{{ 'order.order-history' | translate }}</h4>\r\n<div class=\"entry-list\" [class.expanded]=\"expanded\">\r\n <vdr-timeline-entry iconShape=\"note\" displayType=\"muted\" [featured]=\"true\">\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)=\"addNoteToOrder()\">\r\n {{ 'common.add-note' | translate }}\r\n </button>\r\n </div>\r\n <div class=\"visibility-select\">\r\n <clr-checkbox-wrapper>\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"noteIsPrivate\" />\r\n <label>{{ 'order.note-is-private' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n <span *ngIf=\"noteIsPrivate\" class=\"private\">\r\n {{ 'order.note-only-visible-to-administrators' | translate }}\r\n </span>\r\n <span *ngIf=\"!noteIsPrivate\" class=\"public\">\r\n {{ 'order.note-visible-to-customer' | translate }}\r\n </span>\r\n </div>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry\r\n *ngFor=\"let entry of history\"\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 [collapsed]=\"!expanded && !isFeatured(entry)\"\r\n (expandClick)=\"expanded = !expanded\"\r\n >\r\n <ng-container [ngSwitch]=\"entry.type\">\r\n <ng-container *ngSwitchCase=\"type.ORDER_STATE_TRANSITION\">\r\n <div class=\"title\" *ngIf=\"entry.data.to === 'Delivered'\">\r\n {{ 'order.history-order-fulfilled' | translate }}\r\n </div>\r\n <div class=\"title\" *ngIf=\"entry.data.to === 'Cancelled'\">\r\n {{ 'order.history-order-cancelled' | translate }}\r\n </div>\r\n <ng-template [ngIf]=\"entry.data.to !== 'Cancelled' && entry.data.to !== 'Delivered'\">\r\n {{\r\n 'order.history-order-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_MODIFIED\">\r\n <div class=\"title\">\r\n {{ 'order.history-order-modified' | translate }}\r\n </div>\r\n <ng-container *ngIf=\"getModification(entry.data.modificationId) as modification\">\r\n {{ 'order.modify-order-price-difference' | translate }}:\r\n <strong>{{ modification.priceChange | localeCurrency: order.currencyCode }}</strong>\r\n <vdr-chip colorType=\"success\" *ngIf=\"modification.isSettled\">{{\r\n 'order.modification-settled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip colorType=\"error\" *ngIf=\"!modification.isSettled\">{{\r\n 'order.modification-not-settled' | translate\r\n }}</vdr-chip>\r\n <vdr-history-entry-detail>\r\n <vdr-modification-detail\r\n [order]=\"order\"\r\n [modification]=\"modification\"\r\n ></vdr-modification-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_PAYMENT_TRANSITION\">\r\n <ng-container *ngIf=\"entry.data.to === 'Settled'; else regularPaymentTransition\">\r\n <div class=\"title\">\r\n {{ 'order.history-payment-settled' | translate }}\r\n </div>\r\n {{ 'order.transaction-id' | translate }}: {{ getPayment(entry)?.transactionId }}\r\n <vdr-history-entry-detail *ngIf=\"getPayment(entry) as payment\">\r\n <vdr-payment-detail\r\n [payment]=\"payment\"\r\n [currencyCode]=\"order.currencyCode\"\r\n ></vdr-payment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-template #regularPaymentTransition>\r\n {{\r\n 'order.history-payment-transition'\r\n | translate\r\n : {\r\n from: entry.data.from,\r\n to: entry.data.to,\r\n id: getPayment(entry)?.transactionId\r\n }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_REFUND_TRANSITION\">\r\n {{\r\n 'order.history-refund-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to, id: entry.data.refundId }\r\n }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_CANCELLATION\">\r\n {{ 'order.history-items-cancelled' | translate: { count: entry.data.orderItemIds.length } }}\r\n <vdr-history-entry-detail *ngIf=\"getCancelledItems(entry) as items\">\r\n <vdr-labeled-data [label]=\"'order.cancellation-reason' | translate\">\r\n {{ entry.data.reason }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.contents' | translate\">\r\n <vdr-simple-item-list [items]=\"items\"></vdr-simple-item-list>\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.shipping-cancelled' | translate\">\r\n {{ entry.data.shippingCancelled }}\r\n </vdr-labeled-data>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_FULFILLMENT\">\r\n {{ 'order.history-fulfillment-created' | translate }}\r\n <vdr-history-entry-detail *ngIf=\"getFulfillment(entry) as fulfillment\">\r\n <vdr-fulfillment-detail\r\n [fulfillmentId]=\"fulfillment.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_FULFILLMENT_TRANSITION\">\r\n <ng-container *ngIf=\"entry.data.to === 'Delivered'\">\r\n <div class=\"title\">\r\n {{ 'order.history-fulfillment-delivered' | translate }}\r\n </div>\r\n {{ 'order.tracking-code' | translate }}: {{ getFulfillment(entry)?.trackingCode }}\r\n </ng-container>\r\n <ng-container *ngIf=\"entry.data.to === 'Shipped'\">\r\n <div class=\"title\">\r\n {{ 'order.history-fulfillment-shipped' | translate }}\r\n </div>\r\n {{ 'order.tracking-code' | translate }}: {{ getFulfillment(entry)?.trackingCode }}\r\n </ng-container>\r\n <ng-container *ngIf=\"entry.data.to !== 'Delivered' && entry.data.to !== 'Shipped'\">\r\n {{\r\n 'order.history-fulfillment-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to }\r\n }}\r\n </ng-container>\r\n <vdr-history-entry-detail *ngIf=\"getFulfillment(entry) as fulfillment\">\r\n <vdr-fulfillment-detail\r\n [fulfillmentId]=\"fulfillment.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_NOTE\">\r\n <div class=\"flex\">\r\n <div class=\"note-text\">\r\n <span *ngIf=\"entry.isPublic\" class=\"note-visibility public\">{{\r\n 'common.public' | translate\r\n }}</span>\r\n <span *ngIf=\"!entry.isPublic\" class=\"note-visibility private\">{{\r\n 'common.private' | translate\r\n }}</span>\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]=\"!('UpdateOrder' | 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]=\"!('UpdateOrder' | 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 *ngSwitchCase=\"type.ORDER_COUPON_APPLIED\">\r\n {{ 'order.history-coupon-code-applied' | translate }}:\r\n <vdr-chip>\r\n <a [routerLink]=\"['/marketing', 'promotions', entry.data.promotionId]\">{{\r\n entry.data.couponCode\r\n }}</a>\r\n </vdr-chip>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_COUPON_REMOVED\">\r\n {{ 'order.history-coupon-code-removed' | translate }}:\r\n <vdr-chip\r\n ><span class=\"cancelled-coupon-code\">{{ entry.data.couponCode }}</span></vdr-chip\r\n >\r\n </ng-container>\r\n </ng-container>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry [isLast]=\"true\" [createdAt]=\"order.createdAt\" [featured]=\"true\">\r\n <div class=\"title\">\r\n {{ 'order.history-order-created' | translate }}\r\n </div>\r\n </vdr-timeline-entry>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport {\r\n GetOrderHistoryQuery,\r\n HistoryEntry,\r\n HistoryEntryType,\r\n OrderDetailFragment,\r\n TimelineDisplayType,\r\n} from '@vendure/admin-ui/core';\r\n\r\ntype OrderHistoryItem = NonNullable<GetOrderHistoryQuery['order']>['history']['items'][number];\r\n\r\n@Component({\r\n selector: 'vdr-order-history',\r\n templateUrl: './order-history.component.html',\r\n styleUrls: ['./order-history.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderHistoryComponent {\r\n @Input() order: OrderDetailFragment;\r\n @Input() history: OrderHistoryItem[];\r\n @Output() addNote = new EventEmitter<{ note: string; isPublic: boolean }>();\r\n @Output() updateNote = new EventEmitter<HistoryEntry>();\r\n @Output() deleteNote = new EventEmitter<HistoryEntry>();\r\n note = '';\r\n noteIsPrivate = true;\r\n expanded = false;\r\n readonly type = HistoryEntryType;\r\n\r\n getDisplayType(entry: OrderHistoryItem): TimelineDisplayType {\r\n if (entry.type === HistoryEntryType.ORDER_STATE_TRANSITION) {\r\n if (entry.data.to === 'Delivered') {\r\n return 'success';\r\n }\r\n if (entry.data.to === 'Cancelled') {\r\n return 'error';\r\n }\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_FULFILLMENT_TRANSITION) {\r\n if (entry.data.to === 'Delivered') {\r\n return 'success';\r\n }\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_PAYMENT_TRANSITION) {\r\n if (entry.data.to === 'Declined' || entry.data.to === 'Cancelled') {\r\n return 'error';\r\n }\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_CANCELLATION) {\r\n return 'error';\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_REFUND_TRANSITION) {\r\n return 'warning';\r\n }\r\n return 'default';\r\n }\r\n\r\n getTimelineIcon(entry: OrderHistoryItem) {\r\n if (entry.type === HistoryEntryType.ORDER_STATE_TRANSITION) {\r\n if (entry.data.to === 'Delivered') {\r\n return ['success-standard', 'is-solid'];\r\n }\r\n if (entry.data.to === 'Cancelled') {\r\n return 'ban';\r\n }\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_PAYMENT_TRANSITION) {\r\n if (entry.data.to === 'Settled') {\r\n return 'credit-card';\r\n }\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_NOTE) {\r\n return 'note';\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_MODIFIED) {\r\n return 'pencil';\r\n }\r\n if (entry.type === HistoryEntryType.ORDER_FULFILLMENT_TRANSITION) {\r\n if (entry.data.to === 'Shipped') {\r\n return 'truck';\r\n }\r\n if (entry.data.to === 'Delivered') {\r\n return 'truck';\r\n }\r\n }\r\n }\r\n\r\n isFeatured(entry: OrderHistoryItem): boolean {\r\n switch (entry.type) {\r\n case HistoryEntryType.ORDER_STATE_TRANSITION: {\r\n return (\r\n entry.data.to === 'Delivered' ||\r\n entry.data.to === 'Cancelled' ||\r\n entry.data.to === 'Settled'\r\n );\r\n }\r\n case HistoryEntryType.ORDER_PAYMENT_TRANSITION:\r\n return entry.data.to === 'Settled' || entry.data.to === 'Cancelled';\r\n case HistoryEntryType.ORDER_FULFILLMENT_TRANSITION:\r\n return entry.data.to === 'Delivered' || entry.data.to === 'Shipped';\r\n case HistoryEntryType.ORDER_NOTE:\r\n case HistoryEntryType.ORDER_MODIFIED:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n getFulfillment(\r\n entry: OrderHistoryItem,\r\n ): NonNullable<OrderDetailFragment['fulfillments']>[number] | undefined {\r\n if (\r\n (entry.type === HistoryEntryType.ORDER_FULFILLMENT ||\r\n entry.type === HistoryEntryType.ORDER_FULFILLMENT_TRANSITION) &&\r\n this.order.fulfillments\r\n ) {\r\n return this.order.fulfillments.find(f => f.id === entry.data.fulfillmentId);\r\n }\r\n }\r\n\r\n getPayment(entry: OrderHistoryItem): NonNullable<OrderDetailFragment['payments']>[number] | undefined {\r\n if (entry.type === HistoryEntryType.ORDER_PAYMENT_TRANSITION && this.order.payments) {\r\n return this.order.payments.find(p => p.id === entry.data.paymentId);\r\n }\r\n }\r\n\r\n getCancelledItems(entry: OrderHistoryItem): Array<{ name: string; quantity: number }> {\r\n const itemMap = new Map<string, number>();\r\n const cancelledItemIds: string[] = entry.data.orderItemIds;\r\n for (const line of this.order.lines) {\r\n for (const item of line.items) {\r\n if (cancelledItemIds.includes(item.id)) {\r\n const count = itemMap.get(line.productVariant.name);\r\n if (count != null) {\r\n itemMap.set(line.productVariant.name, count + 1);\r\n } else {\r\n itemMap.set(line.productVariant.name, 1);\r\n }\r\n }\r\n }\r\n }\r\n return Array.from(itemMap.entries()).map(([name, quantity]) => ({ name, quantity }));\r\n }\r\n\r\n getModification(id: string) {\r\n return this.order.modifications.find(m => m.id === id);\r\n }\r\n\r\n getName(entry: OrderHistoryItem): string {\r\n const { administrator } = entry;\r\n if (administrator) {\r\n return `${administrator.firstName} ${administrator.lastName}`;\r\n } else {\r\n const customer = this.order.customer;\r\n if (customer) {\r\n return `${customer.firstName} ${customer.lastName}`;\r\n }\r\n }\r\n return '';\r\n }\r\n\r\n addNoteToOrder() {\r\n this.addNote.emit({ note: this.note, isPublic: !this.noteIsPrivate });\r\n this.note = '';\r\n this.noteIsPrivate = true;\r\n }\r\n}\r\n","<vdr-chip [title]=\"'order.payment-state' | translate\" [colorType]=\"chipColorType\">\r\n <clr-icon shape=\"check-circle\" *ngIf=\"state === 'Settled'\"></clr-icon>\r\n {{ state | stateI18nToken | translate }}\r\n</vdr-chip>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'vdr-payment-state-label',\r\n templateUrl: './payment-state-label.component.html',\r\n styleUrls: ['./payment-state-label.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class PaymentStateLabelComponent {\r\n @Input() state: string;\r\n\r\n get chipColorType() {\r\n switch (this.state) {\r\n case 'Authorized':\r\n return 'warning';\r\n case 'Settled':\r\n return 'success';\r\n case 'Declined':\r\n case 'Cancelled':\r\n return 'error';\r\n }\r\n }\r\n}\r\n","<vdr-chip [title]=\"'order.payment-state' | translate\" [colorType]=\"chipColorType\">\r\n <clr-icon shape=\"check-circle\" *ngIf=\"state === 'Settled'\"></clr-icon>\r\n {{ state | stateI18nToken | translate }}\r\n</vdr-chip>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'vdr-refund-state-label',\r\n templateUrl: './refund-state-label.component.html',\r\n styleUrls: ['./refund-state-label.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RefundStateLabelComponent {\r\n @Input() state: string;\r\n\r\n get chipColorType() {\r\n switch (this.state) {\r\n case 'Pending':\r\n return 'warning';\r\n case 'Settled':\r\n return 'success';\r\n case 'Failed':\r\n return 'error';\r\n }\r\n }\r\n}\r\n","<div class=\"card\">\r\n <div class=\"card-header payment-header\">\r\n <div>\r\n {{ 'order.payment' | translate }}\r\n <ng-container *ngIf=\"payment.transactionId\">#{{ payment.transactionId }}</ng-container>\r\n </div>\r\n <div class=\"payment-state\">\r\n <vdr-payment-state-label [state]=\"payment.state\"></vdr-payment-state-label>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-payment-detail [payment]=\"payment\" [currencyCode]=\"currencyCode\"></vdr-payment-detail>\r\n </div>\r\n <ng-container *ngFor=\"let refund of payment.refunds\">\r\n <div class=\"card-header payment-header\">\r\n <clr-icon shape=\"redo\" class=\"refund-icon\" dir=\"down\"></clr-icon>\r\n {{ 'order.refund' | translate }} #{{ refund.id }}\r\n <div class=\"clr-flex-fill\"></div>\r\n <vdr-refund-state-label [state]=\"refund.state\"></vdr-refund-state-label>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-labeled-data [label]=\"'common.created-at' | translate\">\r\n {{ refund.createdAt | localeDate: 'medium' }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-total' | translate\">\r\n {{ refund.total | localeCurrency: currencyCode }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.transaction-id' | translate\" *ngIf=\"refund.transactionId\">\r\n {{ refund.transactionId }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-reason' | translate\" *ngIf=\"refund.reason\">\r\n {{ refund.reason }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-metadata' | translate\" *ngIf=\"refundHasMetadata(refund)\">\r\n <vdr-object-tree [value]=\"refund.metadata\"></vdr-object-tree>\r\n </vdr-labeled-data>\r\n </div>\r\n <div class=\"card-footer\" *ngIf=\"refund.state === 'Pending'\">\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"settleRefund.emit(refund)\">\r\n {{ 'order.settle-refund' | translate }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer\" *ngIf=\"payment.nextStates.length\">\r\n <button\r\n class=\"btn btn-sm btn-primary\"\r\n *ngIf=\"payment.nextStates.includes('Settled')\"\r\n (click)=\"settlePayment.emit(payment)\"\r\n >\r\n {{ 'order.settle-payment' | translate }}\r\n </button>\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 <ng-container *ngFor=\"let nextState of nextOtherStates()\">\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n (click)=\"transitionPaymentState.emit({ payment: payment, state: nextState })\"\r\n >\r\n <ng-container *ngIf=\"nextState !== 'Cancelled'; else cancel\">\r\n <clr-icon shape=\"step-forward-2\"></clr-icon>\r\n {{\r\n 'order.transition-to-state'\r\n | translate: { state: (nextState | stateI18nToken | translate) }\r\n }}\r\n </ng-container>\r\n <ng-template #cancel>\r\n <clr-icon shape=\"error-standard\" class=\"is-error\"></clr-icon>\r\n {{ 'order.cancel-payment' | translate }}\r\n </ng-template>\r\n </button>\r\n </ng-container>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CurrencyCode, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\ntype Payment = NonNullable<OrderDetailFragment['payments']>[number];\r\n\r\n@Component({\r\n selector: 'vdr-order-payment-card',\r\n templateUrl: './order-payment-card.component.html',\r\n styleUrls: ['./order-payment-card.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderPaymentCardComponent {\r\n @Input() payment: Payment;\r\n @Input() currencyCode: CurrencyCode;\r\n @Output() settlePayment = new EventEmitter<Payment>();\r\n @Output() transitionPaymentState = new EventEmitter<{ payment: Payment; state: string }>();\r\n @Output() settleRefund = new EventEmitter<Payment['refunds'][number]>();\r\n\r\n refundHasMetadata(refund?: Payment['refunds'][number]): boolean {\r\n return !!refund && Object.keys(refund.metadata).length > 0;\r\n }\r\n\r\n nextOtherStates(): string[] {\r\n if (!this.payment) {\r\n return [];\r\n }\r\n return this.payment.nextStates.filter(s => s !== 'Settled' && s !== 'Error');\r\n }\r\n}\r\n","<vdr-action-bar *ngIf=\"entity$ | async as order\">\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-order-state-label [state]=\"order.state\">\r\n <button\r\n class=\"icon-button\"\r\n (click)=\"openStateDiagram()\"\r\n [title]=\"'order.order-state-diagram' | translate\"\r\n >\r\n <clr-icon shape=\"list\"></clr-icon>\r\n </button>\r\n </vdr-order-state-label>\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"\r\n (order.state === 'ArrangingPayment' || order.state === 'ArrangingAdditionalPayment') &&\r\n (hasUnsettledModifications(order) || 0 < outstandingPaymentAmount(order))\r\n \"\r\n (click)=\"addManualPayment(order)\"\r\n >\r\n {{ 'order.add-payment-to-order' | translate }}\r\n ({{ outstandingPaymentAmount(order) | localeCurrency: order.currencyCode }})\r\n </button>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"\r\n order.active === false &&\r\n order.state !== 'ArrangingAdditionalPayment' &&\r\n 0 < outstandingPaymentAmount(order)\r\n \"\r\n (click)=\"transitionToState('ArrangingAdditionalPayment')\"\r\n >\r\n {{ 'order.arrange-additional-payment' | translate }}\r\n </button>\r\n <button class=\"btn btn-primary\" (click)=\"fulfillOrder()\" [disabled]=\"!canAddFulfillment(order)\">\r\n {{ 'order.fulfill-order' | translate }}\r\n </button>\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 <ng-container *ngIf=\"order.nextStates.includes('Modifying')\">\r\n <button type=\"button\" class=\"btn\" vdrDropdownItem (click)=\"transitionToModifying()\">\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'order.modify-order' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n </ng-container>\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n *ngIf=\"order.nextStates.includes('Cancelled')\"\r\n (click)=\"cancelOrRefund(order)\"\r\n >\r\n <clr-icon shape=\"error-standard\" class=\"is-error\"></clr-icon>\r\n <ng-container *ngIf=\"orderHasSettledPayments(order); else cancelOnly\">\r\n {{ 'order.refund-and-cancel-order' | translate }}\r\n </ng-container>\r\n <ng-template #cancelOnly>\r\n {{ 'order.cancel-order' | translate }}\r\n </ng-template>\r\n </button>\r\n\r\n <ng-container *ngIf=\"(nextStates$ | async)?.length\">\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n *ngFor=\"let nextState of nextStates$ | async\"\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n (click)=\"transitionToState(nextState)\"\r\n >\r\n <clr-icon shape=\"step-forward-2\"></clr-icon>\r\n {{\r\n 'order.transition-to-state'\r\n | translate: { state: (nextState | stateI18nToken | translate) }\r\n }}\r\n </button>\r\n </ng-container>\r\n <div class=\"dropdown-divider\"></div>\r\n <button type=\"button\" class=\"btn\" vdrDropdownItem (click)=\"manuallyTransitionToState(order)\">\r\n <clr-icon shape=\"step-forward-2\" class=\"is-warning\"></clr-icon>\r\n {{ 'order.manually-transition-to-state' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngIf=\"entity$ | async as order\">\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-lg-8\">\r\n <vdr-order-table\r\n [order]=\"order\"\r\n [orderLineCustomFields]=\"orderLineCustomFields\"\r\n ></vdr-order-table>\r\n <h4>{{ 'order.tax-summary' | translate }}</h4>\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.description' | translate }}</th>\r\n <th>{{ 'order.tax-rate' | translate }}</th>\r\n <th>{{ 'order.tax-base' | translate }}</th>\r\n <th>{{ 'order.tax-total' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of order.taxSummary\">\r\n <td>{{ row.description }}</td>\r\n <td>{{ row.taxRate / 100 | percent }}</td>\r\n <td>{{ row.taxBase | localeCurrency: order.currencyCode }}</td>\r\n <td>{{ row.taxTotal | localeCurrency: order.currencyCode }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <vdr-custom-detail-component-host\r\n locationId=\"order-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n\r\n <vdr-order-history\r\n [order]=\"order\"\r\n [history]=\"history$ | async\"\r\n (addNote)=\"addNote($event)\"\r\n (updateNote)=\"updateNote($event)\"\r\n (deleteNote)=\"deleteNote($event)\"\r\n ></vdr-order-history>\r\n </div>\r\n <div class=\"clr-col-lg-4 order-cards\">\r\n <vdr-order-custom-fields-card\r\n [customFieldsConfig]=\"customFields\"\r\n [customFieldValues]=\"order.customFields\"\r\n (updateClick)=\"updateCustomFields($event)\"\r\n ></vdr-order-custom-fields-card>\r\n <div class=\"card\">\r\n <div class=\"card-header\">\r\n {{ 'order.customer' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <div class=\"card-text\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n <h6 *ngIf=\"getOrderAddressLines(order.shippingAddress).length\">\r\n {{ 'order.shipping-address' | translate }}\r\n </h6>\r\n <vdr-formatted-address [address]=\"order.shippingAddress\"></vdr-formatted-address>\r\n <h6 *ngIf=\"getOrderAddressLines(order.billingAddress).length\">\r\n {{ 'order.billing-address' | translate }}\r\n </h6>\r\n <vdr-formatted-address [address]=\"order.billingAddress\"></vdr-formatted-address>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"order.payments && order.payments.length\">\r\n <vdr-order-payment-card\r\n *ngFor=\"let payment of order.payments\"\r\n [currencyCode]=\"order.currencyCode\"\r\n [payment]=\"payment\"\r\n (settlePayment)=\"settlePayment($event)\"\r\n (transitionPaymentState)=\"transitionPaymentState($event)\"\r\n (settleRefund)=\"settleRefund($event)\"\r\n ></vdr-order-payment-card>\r\n </ng-container>\r\n <ng-container *ngFor=\"let fulfillment of order.fulfillments\">\r\n <vdr-fulfillment-card\r\n [fulfillment]=\"fulfillment\"\r\n [order]=\"order\"\r\n (transitionState)=\"transitionFulfillment(fulfillment.id, $event)\"\r\n ></vdr-fulfillment-card>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormGroup } 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 CancelOrderMutation,\r\n CustomFieldConfig,\r\n DataService,\r\n EditNoteDialogComponent,\r\n FulfillmentFragment,\r\n FulfillmentLineSummary,\r\n GetOrderHistoryQuery,\r\n GetOrderQuery,\r\n HistoryEntry,\r\n ModalService,\r\n NotificationService,\r\n Order,\r\n OrderDetailFragment,\r\n OrderLineFragment,\r\n Refund,\r\n RefundOrderMutation,\r\n ServerConfigService,\r\n SortOrder,\r\n} from '@vendure/admin-ui/core';\r\nimport { pick } from '@vendure/common/lib/pick';\r\nimport { assertNever, summate } from '@vendure/common/lib/shared-utils';\r\nimport { EMPTY, merge, Observable, of, Subject } from 'rxjs';\r\nimport { map, mapTo, startWith, switchMap, take } from 'rxjs/operators';\r\n\r\nimport { OrderTransitionService } from '../../providers/order-transition.service';\r\nimport { AddManualPaymentDialogComponent } from '../add-manual-payment-dialog/add-manual-payment-dialog.component';\r\nimport { CancelOrderDialogComponent } from '../cancel-order-dialog/cancel-order-dialog.component';\r\nimport { FulfillOrderDialogComponent } from '../fulfill-order-dialog/fulfill-order-dialog.component';\r\nimport { OrderProcessGraphDialogComponent } from '../order-process-graph-dialog/order-process-graph-dialog.component';\r\nimport { RefundOrderDialogComponent } from '../refund-order-dialog/refund-order-dialog.component';\r\nimport { SettleRefundDialogComponent } from '../settle-refund-dialog/settle-refund-dialog.component';\r\n\r\ntype Payment = NonNullable<OrderDetailFragment['payments']>[number];\r\n\r\n@Component({\r\n selector: 'vdr-order-detail',\r\n templateUrl: './order-detail.component.html',\r\n styleUrls: ['./order-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderDetailComponent\r\n extends BaseDetailComponent<OrderDetailFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n detailForm = new FormGroup({});\r\n history$: Observable<NonNullable<GetOrderHistoryQuery['order']>['history']['items'] | undefined>;\r\n nextStates$: Observable<string[]>;\r\n fetchHistory = new Subject<void>();\r\n customFields: CustomFieldConfig[];\r\n orderLineCustomFields: CustomFieldConfig[];\r\n private readonly defaultStates = [\r\n 'AddingItems',\r\n 'ArrangingPayment',\r\n 'PaymentAuthorized',\r\n 'PaymentSettled',\r\n 'PartiallyShipped',\r\n 'Shipped',\r\n 'PartiallyDelivered',\r\n 'Delivered',\r\n 'Cancelled',\r\n 'Modifying',\r\n 'ArrangingAdditionalPayment',\r\n ];\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private orderTransitionService: OrderTransitionService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.entity$.pipe(take(1)).subscribe(order => {\r\n if (order.state === 'Modifying') {\r\n this.router.navigate(['./', 'modify'], { relativeTo: this.route });\r\n }\r\n });\r\n this.customFields = this.getCustomFieldConfig('Order');\r\n this.orderLineCustomFields = this.getCustomFieldConfig('OrderLine');\r\n this.history$ = this.fetchHistory.pipe(\r\n startWith(null),\r\n switchMap(() => {\r\n return this.dataService.order\r\n .getOrderHistory(this.id, {\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n })\r\n .mapStream(data => data.order?.history.items);\r\n }),\r\n );\r\n this.nextStates$ = this.entity$.pipe(\r\n map(order => {\r\n const isInCustomState = !this.defaultStates.includes(order.state);\r\n return isInCustomState\r\n ? order.nextStates\r\n : order.nextStates.filter(s => !this.defaultStates.includes(s));\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n openStateDiagram() {\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n switchMap(order =>\r\n this.modalService.fromComponent(OrderProcessGraphDialogComponent, {\r\n closable: true,\r\n locals: {\r\n activeState: order.state,\r\n },\r\n }),\r\n ),\r\n )\r\n .subscribe();\r\n }\r\n\r\n transitionToState(state: string) {\r\n this.dataService.order.transitionToState(this.id, state).subscribe(({ transitionOrderToState }) => {\r\n switch (transitionOrderToState?.__typename) {\r\n case 'Order':\r\n this.notificationService.success(_('order.transitioned-to-state-success'), { state });\r\n this.fetchHistory.next();\r\n break;\r\n case 'OrderStateTransitionError':\r\n this.notificationService.error(transitionOrderToState.transitionError);\r\n }\r\n });\r\n }\r\n\r\n manuallyTransitionToState(order: OrderDetailFragment) {\r\n this.orderTransitionService\r\n .manuallyTransitionToState({\r\n orderId: order.id,\r\n nextStates: order.nextStates,\r\n cancellable: true,\r\n message: _('order.manually-transition-to-state-message'),\r\n retry: 0,\r\n })\r\n .subscribe();\r\n }\r\n\r\n transitionToModifying() {\r\n this.dataService.order\r\n .transitionToState(this.id, 'Modifying')\r\n .subscribe(({ transitionOrderToState }) => {\r\n switch (transitionOrderToState?.__typename) {\r\n case 'Order':\r\n this.router.navigate(['./modify'], { relativeTo: this.route });\r\n break;\r\n case 'OrderStateTransitionError':\r\n this.notificationService.error(transitionOrderToState.transitionError);\r\n }\r\n });\r\n }\r\n\r\n updateCustomFields(customFieldsValue: any) {\r\n this.dataService.order\r\n .updateOrderCustomFields({\r\n id: this.id,\r\n customFields: customFieldsValue,\r\n })\r\n .subscribe(() => {\r\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Order' });\r\n });\r\n }\r\n\r\n getOrderAddressLines(orderAddress?: { [key: string]: string }): string[] {\r\n if (!orderAddress) {\r\n return [];\r\n }\r\n return Object.values(orderAddress)\r\n .filter(val => val !== 'OrderAddress')\r\n .filter(line => !!line);\r\n }\r\n\r\n settlePayment(payment: Payment) {\r\n this.dataService.order.settlePayment(payment.id).subscribe(({ settlePayment }) => {\r\n switch (settlePayment.__typename) {\r\n case 'Payment':\r\n if (settlePayment.state === 'Settled') {\r\n this.notificationService.success(_('order.settle-payment-success'));\r\n } else {\r\n this.notificationService.error(_('order.settle-payment-error'));\r\n }\r\n this.dataService.order.getOrder(this.id).single$.subscribe();\r\n this.fetchHistory.next();\r\n break;\r\n case 'OrderStateTransitionError':\r\n case 'PaymentStateTransitionError':\r\n case 'SettlePaymentError':\r\n this.notificationService.error(settlePayment.message);\r\n }\r\n });\r\n }\r\n\r\n transitionPaymentState({ payment, state }: { payment: Payment; state: string }) {\r\n if (state === 'Cancelled') {\r\n this.dataService.order.cancelPayment(payment.id).subscribe(({ cancelPayment }) => {\r\n switch (cancelPayment.__typename) {\r\n case 'Payment':\r\n this.notificationService.success(_('order.transitioned-payment-to-state-success'), {\r\n state,\r\n });\r\n this.dataService.order.getOrder(this.id).single$.subscribe();\r\n this.fetchHistory.next();\r\n break;\r\n case 'PaymentStateTransitionError':\r\n this.notificationService.error(cancelPayment.transitionError);\r\n break;\r\n case 'CancelPaymentError':\r\n this.notificationService.error(cancelPayment.paymentErrorMessage);\r\n break;\r\n }\r\n });\r\n } else {\r\n this.dataService.order\r\n .transitionPaymentToState(payment.id, state)\r\n .subscribe(({ transitionPaymentToState }) => {\r\n switch (transitionPaymentToState.__typename) {\r\n case 'Payment':\r\n this.notificationService.success(\r\n _('order.transitioned-payment-to-state-success'),\r\n {\r\n state,\r\n },\r\n );\r\n this.dataService.order.getOrder(this.id).single$.subscribe();\r\n this.fetchHistory.next();\r\n break;\r\n case 'PaymentStateTransitionError':\r\n this.notificationService.error(transitionPaymentToState.message);\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n\r\n canAddFulfillment(order: OrderDetailFragment): boolean {\r\n const allFulfillmentSummaryRows: FulfillmentFragment['summary'] = (order.fulfillments ?? []).reduce(\r\n (all, fulfillment) => [...all, ...fulfillment.summary],\r\n [] as FulfillmentFragment['summary'],\r\n );\r\n let allItemsFulfilled = true;\r\n for (const line of order.lines) {\r\n const totalFulfilledCount = allFulfillmentSummaryRows\r\n .filter(row => row.orderLine.id === line.id)\r\n .reduce((sum, row) => sum + row.quantity, 0);\r\n if (totalFulfilledCount < line.quantity) {\r\n allItemsFulfilled = false;\r\n }\r\n }\r\n return (\r\n !allItemsFulfilled &&\r\n !this.hasUnsettledModifications(order) &&\r\n this.outstandingPaymentAmount(order) === 0 &&\r\n (order.nextStates.includes('Shipped') ||\r\n order.nextStates.includes('PartiallyShipped') ||\r\n order.nextStates.includes('Delivered'))\r\n );\r\n }\r\n\r\n hasUnsettledModifications(order: OrderDetailFragment): boolean {\r\n return 0 < order.modifications.filter(m => !m.isSettled).length;\r\n }\r\n\r\n getOutstandingModificationAmount(order: OrderDetailFragment): number {\r\n return summate(\r\n order.modifications.filter(m => !m.isSettled),\r\n 'priceChange',\r\n );\r\n }\r\n\r\n outstandingPaymentAmount(order: OrderDetailFragment): number {\r\n const paymentIsValid = (p: Payment): boolean =>\r\n p.state !== 'Cancelled' && p.state !== 'Declined' && p.state !== 'Error';\r\n\r\n let amountCovered = 0;\r\n for (const payment of order.payments?.filter(paymentIsValid) ?? []) {\r\n const refunds = payment.refunds.filter(r => r.state !== 'Failed') ?? [];\r\n const refundsTotal = summate(refunds as Array<Required<Refund>>, 'total');\r\n amountCovered += payment.amount - refundsTotal;\r\n }\r\n return order.totalWithTax - amountCovered;\r\n }\r\n\r\n addManualPayment(order: OrderDetailFragment) {\r\n const priorState = order.state;\r\n this.modalService\r\n .fromComponent(AddManualPaymentDialogComponent, {\r\n closable: true,\r\n locals: {\r\n outstandingAmount: this.outstandingPaymentAmount(order),\r\n currencyCode: order.currencyCode,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.order.addManualPaymentToOrder({\r\n orderId: this.id,\r\n transactionId: result.transactionId,\r\n method: result.method,\r\n metadata: result.metadata || {},\r\n });\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n switchMap(({ addManualPaymentToOrder }) => {\r\n switch (addManualPaymentToOrder.__typename) {\r\n case 'Order':\r\n this.notificationService.success(_('order.add-payment-to-order-success'));\r\n if (priorState === 'ArrangingAdditionalPayment') {\r\n return this.orderTransitionService.transitionToPreModifyingState(\r\n order.id,\r\n order.nextStates,\r\n );\r\n } else {\r\n return this.dataService.order\r\n .transitionToState(this.id, 'PaymentSettled')\r\n .pipe(mapTo('PaymentSettled'));\r\n }\r\n case 'ManualPaymentStateError':\r\n this.notificationService.error(addManualPaymentToOrder.message);\r\n return EMPTY;\r\n default:\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n this.refetchOrder({ result });\r\n }\r\n });\r\n }\r\n\r\n fulfillOrder() {\r\n this.entity$\r\n .pipe(\r\n take(1),\r\n switchMap(order => {\r\n return this.modalService.fromComponent(FulfillOrderDialogComponent, {\r\n size: 'xl',\r\n locals: {\r\n order,\r\n },\r\n });\r\n }),\r\n switchMap(input => {\r\n if (input) {\r\n return this.dataService.order.createFulfillment(input);\r\n } else {\r\n return of(undefined);\r\n }\r\n }),\r\n switchMap(result => this.refetchOrder(result).pipe(mapTo(result))),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n const { addFulfillmentToOrder } = result;\r\n switch (addFulfillmentToOrder.__typename) {\r\n case 'Fulfillment':\r\n this.notificationService.success(_('order.create-fulfillment-success'));\r\n break;\r\n case 'EmptyOrderLineSelectionError':\r\n case 'InsufficientStockOnHandError':\r\n case 'ItemsAlreadyFulfilledError':\r\n case 'InvalidFulfillmentHandlerError':\r\n this.notificationService.error(addFulfillmentToOrder.message);\r\n break;\r\n case 'FulfillmentStateTransitionError':\r\n this.notificationService.error(addFulfillmentToOrder.transitionError);\r\n break;\r\n case 'CreateFulfillmentError':\r\n this.notificationService.error(addFulfillmentToOrder.fulfillmentHandlerError);\r\n break;\r\n case undefined:\r\n this.notificationService.error(JSON.stringify(addFulfillmentToOrder));\r\n break;\r\n default:\r\n assertNever(addFulfillmentToOrder);\r\n }\r\n }\r\n });\r\n }\r\n\r\n transitionFulfillment(id: string, state: string) {\r\n this.dataService.order\r\n .transitionFulfillmentToState(id, state)\r\n .pipe(switchMap(result => this.refetchOrder(result)))\r\n .subscribe(() => {\r\n this.notificationService.success(_('order.successfully-updated-fulfillment'));\r\n });\r\n }\r\n\r\n cancelOrRefund(order: OrderDetailFragment) {\r\n const isRefundable = this.orderHasSettledPayments(order);\r\n if (order.state === 'PaymentAuthorized' || order.active === true || !isRefundable) {\r\n this.cancelOrder(order);\r\n } else {\r\n this.refundOrder(order);\r\n }\r\n }\r\n\r\n settleRefund(refund: Payment['refunds'][number]) {\r\n this.modalService\r\n .fromComponent(SettleRefundDialogComponent, {\r\n size: 'md',\r\n locals: {\r\n refund,\r\n },\r\n })\r\n .pipe(\r\n switchMap(transactionId => {\r\n if (transactionId) {\r\n return this.dataService.order.settleRefund(\r\n {\r\n transactionId,\r\n id: refund.id,\r\n },\r\n this.id,\r\n );\r\n } else {\r\n return of(undefined);\r\n }\r\n }),\r\n // switchMap(result => this.refetchOrder(result)),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n this.notificationService.success(_('order.settle-refund-success'));\r\n }\r\n });\r\n }\r\n\r\n addNote(event: { note: string; isPublic: boolean }) {\r\n const { note, isPublic } = event;\r\n this.dataService.order\r\n .addNoteToOrder({\r\n id: this.id,\r\n note,\r\n isPublic,\r\n })\r\n .pipe(switchMap(result => this.refetchOrder(result)))\r\n .subscribe(result => {\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: HistoryEntry) {\r\n this.modalService\r\n .fromComponent(EditNoteDialogComponent, {\r\n closable: true,\r\n locals: {\r\n displayPrivacyControls: true,\r\n note: entry.data.note,\r\n noteIsPrivate: !entry.isPublic,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.order.updateOrderNote({\r\n noteId: entry.id,\r\n isPublic: !result.isPrivate,\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: HistoryEntry) {\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.order.deleteOrderNote(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 orderHasSettledPayments(order: OrderDetailFragment): boolean {\r\n return !!order.payments?.find(p => p.state === 'Settled');\r\n }\r\n\r\n private cancelOrder(order: OrderDetailFragment) {\r\n this.modalService\r\n .fromComponent(CancelOrderDialogComponent, {\r\n size: 'xl',\r\n locals: {\r\n order,\r\n },\r\n })\r\n .pipe(\r\n switchMap(input => {\r\n if (input) {\r\n return this.dataService.order.cancelOrder(input);\r\n } else {\r\n return of(undefined);\r\n }\r\n }),\r\n switchMap(result => this.refetchOrder(result)),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n this.notificationService.success(_('order.cancelled-order-success'));\r\n }\r\n });\r\n }\r\n\r\n private refundOrder(order: OrderDetailFragment) {\r\n this.modalService\r\n .fromComponent(RefundOrderDialogComponent, {\r\n size: 'xl',\r\n locals: {\r\n order,\r\n },\r\n })\r\n .pipe(\r\n switchMap(input => {\r\n if (!input) {\r\n return of(undefined);\r\n }\r\n\r\n if (input.cancel.lines?.length) {\r\n return this.dataService.order.cancelOrder(input.cancel).pipe(\r\n map(res => {\r\n const result = res.cancelOrder;\r\n switch (result.__typename) {\r\n case 'Order':\r\n this.refetchOrder(result).subscribe();\r\n this.notificationService.success(_('order.cancelled-order-success'));\r\n return input;\r\n case 'CancelActiveOrderError':\r\n case 'QuantityTooGreatError':\r\n case 'MultipleOrderError':\r\n case 'OrderStateTransitionError':\r\n case 'EmptyOrderLineSelectionError':\r\n this.notificationService.error(result.message);\r\n return undefined;\r\n }\r\n }),\r\n );\r\n } else {\r\n return [input];\r\n }\r\n }),\r\n switchMap(input => {\r\n if (!input) {\r\n return of(undefined);\r\n }\r\n if (input.refund.lines.length) {\r\n return this.dataService.order\r\n .refundOrder(input.refund)\r\n .pipe(map(res => res.refundOrder));\r\n } else {\r\n return [undefined];\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n switch (result.__typename) {\r\n case 'Refund':\r\n this.refetchOrder(result).subscribe();\r\n if (result.state === 'Failed') {\r\n this.notificationService.error(_('order.refund-order-failed'));\r\n } else {\r\n this.notificationService.success(_('order.refund-order-success'));\r\n }\r\n break;\r\n case 'AlreadyRefundedError':\r\n case 'NothingToRefundError':\r\n case 'PaymentOrderMismatchError':\r\n case 'RefundOrderStateError':\r\n case 'RefundStateTransitionError':\r\n this.notificationService.error(result.message);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n private refetchOrder(result: object | undefined): Observable<GetOrderQuery | undefined> {\r\n this.fetchHistory.next();\r\n if (result) {\r\n return this.dataService.order.getOrder(this.id).single$;\r\n } else {\r\n return of(undefined);\r\n }\r\n }\r\n\r\n protected setFormValues(entity: OrderDetailFragment): void {\r\n // empty\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { CustomFieldConfig, Dialog, ModifyOrderInput, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\nexport enum OrderEditResultType {\r\n Refund,\r\n Payment,\r\n PriceUnchanged,\r\n Cancel,\r\n}\r\n\r\ninterface OrderEditsRefundResult {\r\n result: OrderEditResultType.Refund;\r\n refundPaymentId: string;\r\n refundNote?: string;\r\n}\r\ninterface OrderEditsPaymentResult {\r\n result: OrderEditResultType.Payment;\r\n}\r\ninterface OrderEditsPriceUnchangedResult {\r\n result: OrderEditResultType.PriceUnchanged;\r\n}\r\ninterface OrderEditsCancelResult {\r\n result: OrderEditResultType.Cancel;\r\n}\r\ntype OrderEditResult =\r\n | OrderEditsRefundResult\r\n | OrderEditsPaymentResult\r\n | OrderEditsPriceUnchangedResult\r\n | OrderEditsCancelResult;\r\n\r\n@Component({\r\n selector: 'vdr-order-edits-preview-dialog',\r\n templateUrl: './order-edits-preview-dialog.component.html',\r\n styleUrls: ['./order-edits-preview-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderEditsPreviewDialogComponent implements OnInit, Dialog<OrderEditResult> {\r\n // Passed in via the modalService\r\n order: OrderDetailFragment;\r\n originalTotalWithTax: number;\r\n orderLineCustomFields: CustomFieldConfig[];\r\n modifyOrderInput: ModifyOrderInput;\r\n\r\n selectedPayment?: NonNullable<OrderDetailFragment['payments']>[number];\r\n refundNote: string;\r\n resolveWith: (result?: OrderEditResult) => void;\r\n\r\n get priceDifference(): number {\r\n return this.order.totalWithTax - this.originalTotalWithTax;\r\n }\r\n\r\n ngOnInit() {\r\n this.refundNote = this.modifyOrderInput.note || '';\r\n }\r\n\r\n cancel() {\r\n this.resolveWith({\r\n result: OrderEditResultType.Cancel,\r\n });\r\n }\r\n\r\n submit() {\r\n if (0 < this.priceDifference) {\r\n this.resolveWith({\r\n result: OrderEditResultType.Payment,\r\n });\r\n } else if (this.priceDifference < 0) {\r\n this.resolveWith({\r\n result: OrderEditResultType.Refund,\r\n // tslint:disable-next-line:no-non-null-assertion\r\n refundPaymentId: this.selectedPayment!.id,\r\n refundNote: this.refundNote,\r\n });\r\n } else {\r\n this.resolveWith({\r\n result: OrderEditResultType.PriceUnchanged,\r\n });\r\n }\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'order.confirm-modifications' | translate }}</ng-template>\r\n<vdr-order-table [order]=\"order\" [orderLineCustomFields]=\"orderLineCustomFields\"></vdr-order-table>\r\n\r\n<h4 class=\"h4\">\r\n {{ 'order.modify-order-price-difference' | translate }}:\r\n <strong>{{ priceDifference | localeCurrency: order.currencyCode }}</strong>\r\n</h4>\r\n<div *ngIf=\"priceDifference < 0\">\r\n<clr-select-container>\r\n <label>{{ 'order.payment-to-refund' | translate }}</label>\r\n <select clrSelect name=\"options\" [(ngModel)]=\"selectedPayment\">\r\n <option\r\n *ngFor=\"let payment of order.payments\"\r\n [ngValue]=\"payment\"\r\n >\r\n #{{ payment.id }} {{ payment.method }}:\r\n {{ payment.amount | localeCurrency: order.currencyCode }}\r\n </option>\r\n </select>\r\n</clr-select-container>\r\n <label class=\"clr-control-label\">{{ 'order.refund-cancellation-reason' | translate }}</label>\r\n <textarea [(ngModel)]=\"refundNote\" name=\"refundNote\" clrTextarea required></textarea>\r\n</div>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"submit()\" [disabled]=\"priceDifference < 0 && !selectedPayment\" class=\"btn btn-primary\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>\r\n","<vdr-action-bar *ngIf=\"entity$ | async as order\">\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-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <button class=\"btn btn-secondary\" (click)=\"transitionToPriorState(order)\">\r\n {{ 'order.cancel-modification' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngIf=\"entity$ | async as order\">\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-lg-8\">\r\n <table class=\"order-table table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th *ngIf=\"orderLineCustomFields.length\">{{ 'common.custom-fields' | translate }}</th>\r\n <th>{{ 'order.total' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"let line of order.lines; let i = index\"\r\n class=\"order-line\"\r\n [class.is-cancelled]=\"line.quantity === 0\"\r\n [class.modified]=\"isLineModified(line)\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img\r\n *ngIf=\"line.featuredAsset\"\r\n [src]=\"line.featuredAsset | assetPreview: 'tiny'\"\r\n />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ line.unitPriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.unitPrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n [value]=\"line.quantity\"\r\n (input)=\"updateLineQuantity(line, $event.target.value)\"\r\n />\r\n <vdr-line-refunds [line]=\"line\" [payments]=\"order.payments\"></vdr-line-refunds>\r\n <vdr-line-fulfillment\r\n [line]=\"line\"\r\n [orderState]=\"order.state\"\r\n ></vdr-line-fulfillment>\r\n </td>\r\n <td *ngIf=\"orderLineCustomFields.length\" class=\"order-line-custom-field align-middle\">\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"orderLineCustomFieldsFormArray.get([i])\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{ line.linePriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.linePrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr\r\n *ngFor=\"let addedLine of addedLines; trackBy: trackByProductVariantId; let i = index\"\r\n class=\"modified\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img\r\n *ngIf=\"addedLine.productAsset\"\r\n [src]=\"addedLine.productAsset | assetPreview: 'tiny'\"\r\n />\r\n </td>\r\n <td class=\"align-middle name\">{{ addedLine.productVariantName }}</td>\r\n <td class=\"align-middle sku\">{{ addedLine.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ addedLine.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ addedLine.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n [value]=\"addedLine.quantity\"\r\n (input)=\"updateAddedItemQuantity(addedLine, $event.target.value)\"\r\n />\r\n <button class=\"icon-button\" (click)=\"removeAddedItem(i)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </td>\r\n <td *ngIf=\"orderLineCustomFields.length\" class=\"order-line-custom-field align-middle\">\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"addItemCustomFieldsFormArray.get([i])\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{\r\n (addedLine.priceWithTax * addedLine.quantity) / 100\r\n | currency: order.currencyCode\r\n }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{\r\n (addedLine.price * addedLine.quantity) / 100\r\n | currency: order.currencyCode\r\n }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr class=\"surcharge\" *ngFor=\"let surcharge of order.surcharges\">\r\n <td class=\"align-middle name left\" colspan=\"2\">{{ surcharge.description }}</td>\r\n <td class=\"align-middle sku\">{{ surcharge.sku }}</td>\r\n <td class=\"align-middle\"></td>\r\n <td></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"align-middle total\">\r\n {{ surcharge.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ surcharge.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr\r\n class=\"surcharge modified\"\r\n *ngFor=\"let surcharge of modifyOrderInput.surcharges; let i = index\"\r\n >\r\n <td class=\"align-middle name left\" colspan=\"2\">\r\n {{ surcharge.description }}\r\n <button class=\"icon-button\" (click)=\"removeSurcharge(i)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </td>\r\n <td class=\"align-middle sku\">{{ surcharge.sku }}</td>\r\n <td class=\"align-middle\"></td>\r\n <td></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"align-middle total\">\r\n <ng-container *ngIf=\"getSurchargePrices(surcharge) as surchargePrice\">\r\n {{ surchargePrice.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ surchargePrice.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr class=\"shipping\">\r\n <td class=\"left clr-align-middle\">{{ 'order.shipping' | translate }}</td>\r\n <td class=\"clr-align-middle\">{{ order.shippingLines[0]?.shippingMethod?.name }}</td>\r\n <td colspan=\"3\"></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"clr-align-middle\">\r\n {{ order.shippingWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ order.shipping | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <h4 class=\"mb2\">{{ 'order.modifications' | translate }}</h4>\r\n <clr-accordion>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.add-item-to-order' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-product-variant-selector class=\"mb4\" (productSelected)=\"addItemSelectedVariant = $event\">\r\n </vdr-product-variant-selector>\r\n <div *ngIf=\"addItemSelectedVariant\" class=\"flex mb4\">\r\n <img\r\n *ngIf=\"addItemSelectedVariant.productAsset as asset\"\r\n [src]=\"asset | assetPreview: 'tiny'\"\r\n class=\"mr4\"\r\n />\r\n <div>\r\n <strong class=\"mr4\">{{ addItemSelectedVariant.productVariantName }}</strong>\r\n <small>{{ addItemSelectedVariant.sku }}</small>\r\n <div>\r\n {{\r\n getSelectedItemPrice(addItemSelectedVariant)\r\n | localeCurrency: order.currencyCode\r\n }}\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [readonly]=\"!addItemSelectedVariant\"\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"addItemCustomFieldsForm\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"!addItemSelectedVariant || addItemCustomFieldsForm.invalid\"\r\n (click)=\"addItemToOrder(addItemSelectedVariant)\"\r\n >\r\n {{ 'order.add-item-to-order' | translate }}\r\n </button>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.set-coupon-codes' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <ng-select\r\n [items]=\"availableCouponCodes$ | async\"\r\n appendTo=\"body\"\r\n bindLabel=\"code\"\r\n bindValue=\"code\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n [hideSelected]=\"true\"\r\n [minTermLength]=\"2\"\r\n typeToSearchText=\"\"\r\n [typeahead]=\"couponCodeInput$\"\r\n [formControl]=\"couponCodesControl\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <vdr-chip>{{ item.code }}</vdr-chip> {{ item.promotionName }}\r\n </ng-template>\r\n </ng-select>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.add-surcharge' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <form [formGroup]=\"surchargeForm\" (submit)=\"addSurcharge(surchargeForm.value)\">\r\n <vdr-form-field [label]=\"'common.description' | translate\" for=\"description\"\r\n ><input id=\"description\" type=\"text\" formControlName=\"description\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.product-sku' | translate\" for=\"sku\"\r\n ><input id=\"sku\" type=\"text\" formControlName=\"sku\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'common.price' | translate\" for=\"price\"\r\n ><vdr-currency-input\r\n [currencyCode]=\"order.currencyCode\"\r\n id=\"price\"\r\n formControlName=\"price\"\r\n ></vdr-currency-input\r\n ></vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"\r\n 'catalog.price-includes-tax-at'\r\n | translate: { rate: surchargeForm.get('taxRate')?.value }\r\n \"\r\n for=\"priceIncludesTax\"\r\n ><input\r\n id=\"priceIncludesTax\"\r\n type=\"checkbox\"\r\n clrCheckbox\r\n formControlName=\"priceIncludesTax\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.tax-rate' | translate\" for=\"taxRate\"\r\n ><vdr-affixed-input suffix=\"%\"\r\n ><input\r\n id=\"taxRate\"\r\n type=\"number\"\r\n min=\"0\"\r\n max=\"100\"\r\n formControlName=\"taxRate\" /></vdr-affixed-input\r\n ></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.tax-description' | translate\" for=\"taxDescription\"\r\n ><input id=\"taxDescription\" type=\"text\" formControlName=\"taxDescription\"\r\n /></vdr-form-field>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"\r\n surchargeForm.invalid ||\r\n surchargeForm.pristine ||\r\n surchargeForm.get('price')?.value === 0\r\n \"\r\n >\r\n {{ 'order.add-surcharge' | translate }}\r\n </button>\r\n </form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.edit-shipping-address' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-address-form\r\n [formGroup]=\"shippingAddressForm\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [customFields]=\"addressCustomFields\"\r\n ></vdr-address-form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.edit-billing-address' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-address-form\r\n [formGroup]=\"billingAddressForm\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [customFields]=\"addressCustomFields\"\r\n ></vdr-address-form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n </clr-accordion>\r\n </div>\r\n <div class=\"clr-col-lg-4 order-cards\">\r\n <div class=\"card\">\r\n <div class=\"card-header\">\r\n {{ 'order.modification-summary' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <ul>\r\n <li *ngIf=\"modifyOrderInput.addItems?.length\">\r\n {{\r\n 'order.modification-adding-items'\r\n | translate: { count: modifyOrderInput.addItems?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"modifyOrderInput.adjustOrderLines?.length\">\r\n {{\r\n 'order.modification-adjusting-lines'\r\n | translate: { count: modifyOrderInput.adjustOrderLines?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"modifyOrderInput.surcharges?.length\">\r\n {{\r\n 'order.modification-adding-surcharges'\r\n | translate: { count: modifyOrderInput.surcharges?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"shippingAddressForm.dirty\">\r\n {{ 'order.modification-updating-shipping-address' | translate }}\r\n </li>\r\n <li *ngIf=\"billingAddressForm.dirty\">\r\n {{ 'order.modification-updating-billing-address' | translate }}\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"card-block\">\r\n <label class=\"clr-control-label\">{{ 'order.note' | translate }}</label>\r\n <textarea [(ngModel)]=\"note\" name=\"note\" clrTextarea required></textarea>\r\n <clr-checkbox-wrapper class=\"\">\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"recalculateShipping\" />\r\n <label>{{ 'order.modification-recalculate-shipping' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n <div class=\"card-footer\">\r\n <button\r\n class=\"btn btn-primary\"\r\n [disabled]=\"!canPreviewChanges()\"\r\n (click)=\"previewAndModify(order)\"\r\n >\r\n {{ 'order.preview-changes' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport {\r\n AddItemInput,\r\n AdjustOrderLineInput,\r\n BaseDetailComponent,\r\n CustomFieldConfig,\r\n DataService,\r\n ErrorResult,\r\n GetAvailableCountriesQuery,\r\n HistoryEntryType,\r\n LanguageCode,\r\n ModalService,\r\n ModifyOrderInput,\r\n NotificationService,\r\n OrderAddressFragment,\r\n OrderDetailFragment,\r\n ProductSelectorSearchQuery,\r\n ServerConfigService,\r\n SortOrder,\r\n SurchargeInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { assertNever, notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { concat, EMPTY, Observable, of, Subject } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n map,\r\n mapTo,\r\n shareReplay,\r\n startWith,\r\n switchMap,\r\n takeUntil,\r\n} from 'rxjs/operators';\r\n\r\nimport { OrderTransitionService } from '../../providers/order-transition.service';\r\nimport {\r\n OrderEditResultType,\r\n OrderEditsPreviewDialogComponent,\r\n} from '../order-edits-preview-dialog/order-edits-preview-dialog.component';\r\n\r\ntype ProductSelectorItem = ProductSelectorSearchQuery['search']['items'][number];\r\n\r\ninterface AddedLine {\r\n productVariantId: string;\r\n productAsset?: ProductSelectorItem['productAsset'] | null;\r\n productVariantName: string;\r\n sku: string;\r\n priceWithTax: number;\r\n price: number;\r\n quantity: number;\r\n}\r\n\r\ntype ModifyOrderData = Omit<ModifyOrderInput, 'addItems' | 'adjustOrderLines'> & {\r\n addItems: Array<AddItemInput & { customFields?: any }>;\r\n adjustOrderLines: Array<AdjustOrderLineInput & { customFields?: any }>;\r\n};\r\n\r\n@Component({\r\n selector: 'vdr-order-editor',\r\n templateUrl: './order-editor.component.html',\r\n styleUrls: ['./order-editor.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderEditorComponent\r\n extends BaseDetailComponent<OrderDetailFragment>\r\n implements OnInit, OnDestroy\r\n{\r\n availableCountries$: Observable<GetAvailableCountriesQuery['countries']['items']>;\r\n availableCouponCodes$: Observable<Array<{ code: string; promotionName: string }>>;\r\n couponCodeInput$ = new Subject<string>();\r\n addressCustomFields: CustomFieldConfig[];\r\n detailForm = new FormGroup({});\r\n couponCodesControl = new FormControl();\r\n orderLineCustomFieldsFormArray: FormArray;\r\n addItemCustomFieldsFormArray: FormArray;\r\n addItemCustomFieldsForm: FormGroup;\r\n addItemSelectedVariant: ProductSelectorItem | undefined;\r\n orderLineCustomFields: CustomFieldConfig[];\r\n modifyOrderInput: ModifyOrderData = {\r\n dryRun: true,\r\n orderId: '',\r\n addItems: [],\r\n adjustOrderLines: [],\r\n surcharges: [],\r\n note: '',\r\n updateShippingAddress: {},\r\n updateBillingAddress: {},\r\n };\r\n surchargeForm: FormGroup;\r\n shippingAddressForm: FormGroup;\r\n billingAddressForm: FormGroup;\r\n note = '';\r\n recalculateShipping = true;\r\n previousState: string;\r\n private addedVariants = new Map<string, ProductSelectorItem>();\r\n\r\n constructor(\r\n router: Router,\r\n route: ActivatedRoute,\r\n serverConfigService: ServerConfigService,\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private orderTransitionService: OrderTransitionService,\r\n ) {\r\n super(route, router, serverConfigService, dataService);\r\n }\r\n\r\n get addedLines(): AddedLine[] {\r\n const getSinglePriceValue = (price: ProductSelectorItem['price']) =>\r\n price.__typename === 'SinglePrice' ? price.value : 0;\r\n return (this.modifyOrderInput.addItems || [])\r\n .map(row => {\r\n const variantInfo = this.addedVariants.get(row.productVariantId);\r\n if (variantInfo) {\r\n return {\r\n ...variantInfo,\r\n price: getSinglePriceValue(variantInfo.price),\r\n priceWithTax: getSinglePriceValue(variantInfo.priceWithTax),\r\n quantity: row.quantity,\r\n };\r\n }\r\n })\r\n .filter(notNullOrUndefined);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.init();\r\n this.addressCustomFields = this.getCustomFieldConfig('Address');\r\n this.modifyOrderInput.orderId = this.route.snapshot.paramMap.get('id') as string;\r\n this.orderLineCustomFields = this.getCustomFieldConfig('OrderLine');\r\n this.entity$.pipe(takeUntil(this.destroy$)).subscribe(order => {\r\n if (order.couponCodes.length) {\r\n this.couponCodesControl.setValue(order.couponCodes);\r\n }\r\n this.surchargeForm = new FormGroup({\r\n description: new FormControl('', Validators.required),\r\n sku: new FormControl(''),\r\n price: new FormControl(0, Validators.required),\r\n priceIncludesTax: new FormControl(true),\r\n taxRate: new FormControl(0),\r\n taxDescription: new FormControl(''),\r\n });\r\n if (!this.shippingAddressForm) {\r\n this.shippingAddressForm = new FormGroup({\r\n fullName: new FormControl(order.shippingAddress?.fullName),\r\n company: new FormControl(order.shippingAddress?.company),\r\n streetLine1: new FormControl(order.shippingAddress?.streetLine1),\r\n streetLine2: new FormControl(order.shippingAddress?.streetLine2),\r\n city: new FormControl(order.shippingAddress?.city),\r\n province: new FormControl(order.shippingAddress?.province),\r\n postalCode: new FormControl(order.shippingAddress?.postalCode),\r\n countryCode: new FormControl(order.shippingAddress?.countryCode),\r\n phoneNumber: new FormControl(order.shippingAddress?.phoneNumber),\r\n });\r\n this.addAddressCustomFieldsFormGroup(this.shippingAddressForm, order.shippingAddress);\r\n }\r\n if (!this.billingAddressForm) {\r\n this.billingAddressForm = new FormGroup({\r\n fullName: new FormControl(order.billingAddress?.fullName),\r\n company: new FormControl(order.billingAddress?.company),\r\n streetLine1: new FormControl(order.billingAddress?.streetLine1),\r\n streetLine2: new FormControl(order.billingAddress?.streetLine2),\r\n city: new FormControl(order.billingAddress?.city),\r\n province: new FormControl(order.billingAddress?.province),\r\n postalCode: new FormControl(order.billingAddress?.postalCode),\r\n countryCode: new FormControl(order.billingAddress?.countryCode),\r\n phoneNumber: new FormControl(order.billingAddress?.phoneNumber),\r\n });\r\n this.addAddressCustomFieldsFormGroup(this.billingAddressForm, order.billingAddress);\r\n }\r\n this.orderLineCustomFieldsFormArray = new FormArray([]);\r\n for (const line of order.lines) {\r\n const formGroup = new FormGroup({});\r\n for (const { name } of this.orderLineCustomFields) {\r\n formGroup.addControl(name, new FormControl((line as any).customFields[name]));\r\n }\r\n formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {\r\n let modifyRow = this.modifyOrderInput.adjustOrderLines.find(\r\n l => l.orderLineId === line.id,\r\n );\r\n if (!modifyRow) {\r\n modifyRow = {\r\n orderLineId: line.id,\r\n quantity: line.quantity,\r\n };\r\n this.modifyOrderInput.adjustOrderLines.push(modifyRow);\r\n }\r\n if (this.orderLineCustomFields.length) {\r\n modifyRow.customFields = value;\r\n }\r\n });\r\n this.orderLineCustomFieldsFormArray.push(formGroup);\r\n }\r\n });\r\n this.availableCouponCodes$ = concat(\r\n this.couponCodeInput$.pipe(\r\n distinctUntilChanged(),\r\n switchMap(\r\n term =>\r\n this.dataService.promotion.getPromotions(10, 0, {\r\n couponCode: { contains: term },\r\n }).single$,\r\n ),\r\n map(({ promotions }) =>\r\n // tslint:disable-next-line:no-non-null-assertion\r\n promotions.items.map(p => ({ code: p.couponCode!, promotionName: p.name })),\r\n ),\r\n startWith([]),\r\n ),\r\n );\r\n this.addItemCustomFieldsFormArray = new FormArray([]);\r\n this.addItemCustomFieldsForm = new FormGroup({});\r\n for (const customField of this.orderLineCustomFields) {\r\n this.addItemCustomFieldsForm.addControl(customField.name, new FormControl());\r\n }\r\n this.availableCountries$ = this.dataService.settings\r\n .getAvailableCountries()\r\n .mapSingle(result => result.countries.items)\r\n .pipe(shareReplay(1));\r\n this.dataService.order\r\n .getOrderHistory(this.id, {\r\n take: 1,\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n filter: { type: { eq: HistoryEntryType.ORDER_STATE_TRANSITION } },\r\n })\r\n .single$.subscribe(({ order }) => {\r\n this.previousState = order?.history.items[0].data.from;\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\r\n }\r\n\r\n transitionToPriorState(order: OrderDetailFragment) {\r\n this.orderTransitionService\r\n .transitionToPreModifyingState(order.id, order.nextStates)\r\n .subscribe(result => {\r\n this.router.navigate(['..'], { relativeTo: this.route });\r\n });\r\n }\r\n\r\n canPreviewChanges(): boolean {\r\n const { addItems, adjustOrderLines, surcharges } = this.modifyOrderInput;\r\n return (\r\n !!addItems?.length ||\r\n !!surcharges?.length ||\r\n !!adjustOrderLines?.length ||\r\n (this.shippingAddressForm.dirty && this.shippingAddressForm.valid) ||\r\n (this.billingAddressForm.dirty && this.billingAddressForm.valid) ||\r\n this.couponCodesControl.dirty\r\n );\r\n }\r\n\r\n isLineModified(line: OrderDetailFragment['lines'][number]): boolean {\r\n return !!this.modifyOrderInput.adjustOrderLines?.find(\r\n l => l.orderLineId === line.id && l.quantity !== line.quantity,\r\n );\r\n }\r\n\r\n updateLineQuantity(line: OrderDetailFragment['lines'][number], quantity: string) {\r\n const { adjustOrderLines } = this.modifyOrderInput;\r\n let row = adjustOrderLines?.find(l => l.orderLineId === line.id);\r\n if (row && +quantity === line.quantity) {\r\n // Remove the modification if the quantity is the same as\r\n // the original order\r\n adjustOrderLines?.splice(adjustOrderLines?.indexOf(row), 1);\r\n }\r\n if (!row) {\r\n row = { orderLineId: line.id, quantity: +quantity };\r\n adjustOrderLines?.push(row);\r\n }\r\n row.quantity = +quantity;\r\n }\r\n\r\n updateAddedItemQuantity(item: AddedLine, quantity: string) {\r\n const row = this.modifyOrderInput.addItems?.find(l => l.productVariantId === item.productVariantId);\r\n if (row) {\r\n row.quantity = +quantity;\r\n }\r\n }\r\n\r\n trackByProductVariantId(index: number, item: AddedLine) {\r\n return item.productVariantId;\r\n }\r\n\r\n getSelectedItemPrice(result: ProductSelectorItem | undefined): number {\r\n switch (result?.priceWithTax.__typename) {\r\n case 'SinglePrice':\r\n return result.priceWithTax.value;\r\n default:\r\n return 0;\r\n }\r\n }\r\n\r\n addItemToOrder(result: ProductSelectorItem | undefined) {\r\n if (!result) {\r\n return;\r\n }\r\n const customFields = this.orderLineCustomFields.length\r\n ? this.addItemCustomFieldsForm.value\r\n : undefined;\r\n let row = this.modifyOrderInput.addItems?.find(l =>\r\n this.isMatchingAddItemRow(l, result, customFields),\r\n );\r\n if (!row) {\r\n row = { productVariantId: result.productVariantId, quantity: 1 };\r\n if (customFields) {\r\n row.customFields = customFields;\r\n }\r\n this.modifyOrderInput.addItems?.push(row);\r\n } else {\r\n row.quantity++;\r\n }\r\n if (customFields) {\r\n const formGroup = new FormGroup({});\r\n for (const [key, value] of Object.entries(customFields)) {\r\n formGroup.addControl(key, new FormControl(value));\r\n }\r\n this.addItemCustomFieldsFormArray.push(formGroup);\r\n formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {\r\n if (row) {\r\n row.customFields = value;\r\n }\r\n });\r\n }\r\n this.addItemCustomFieldsForm.reset({});\r\n this.addItemSelectedVariant = undefined;\r\n this.addedVariants.set(result.productVariantId, result);\r\n }\r\n\r\n private isMatchingAddItemRow(\r\n row: ModifyOrderData['addItems'][number],\r\n result: ProductSelectorItem,\r\n customFields: any,\r\n ): boolean {\r\n return (\r\n row.productVariantId === result.productVariantId &&\r\n JSON.stringify(row.customFields) === JSON.stringify(customFields)\r\n );\r\n }\r\n\r\n removeAddedItem(index: number) {\r\n this.modifyOrderInput.addItems.splice(index, 1);\r\n if (-1 < index) {\r\n this.addItemCustomFieldsFormArray.removeAt(index);\r\n }\r\n }\r\n\r\n getSurchargePrices(surcharge: SurchargeInput) {\r\n const priceWithTax = surcharge.priceIncludesTax\r\n ? surcharge.price\r\n : Math.round(surcharge.price * ((100 + (surcharge.taxRate || 0)) / 100));\r\n const price = surcharge.priceIncludesTax\r\n ? Math.round(surcharge.price / ((100 + (surcharge.taxRate || 0)) / 100))\r\n : surcharge.price;\r\n return {\r\n price,\r\n priceWithTax,\r\n };\r\n }\r\n\r\n addSurcharge(value: any) {\r\n this.modifyOrderInput.surcharges?.push(value);\r\n this.surchargeForm.reset({\r\n price: 0,\r\n priceIncludesTax: true,\r\n taxRate: 0,\r\n });\r\n }\r\n\r\n removeSurcharge(index: number) {\r\n this.modifyOrderInput.surcharges?.splice(index, 1);\r\n }\r\n\r\n previewAndModify(order: OrderDetailFragment) {\r\n const input: ModifyOrderInput = {\r\n ...this.modifyOrderInput,\r\n ...(this.billingAddressForm.dirty ? { updateBillingAddress: this.billingAddressForm.value } : {}),\r\n ...(this.shippingAddressForm.dirty\r\n ? { updateShippingAddress: this.shippingAddressForm.value }\r\n : {}),\r\n dryRun: true,\r\n couponCodes: this.couponCodesControl.dirty ? this.couponCodesControl.value : undefined,\r\n note: this.note ?? '',\r\n options: {\r\n recalculateShipping: this.recalculateShipping,\r\n },\r\n };\r\n const originalTotalWithTax = order.totalWithTax;\r\n this.dataService.order\r\n .modifyOrder(input)\r\n .pipe(\r\n switchMap(({ modifyOrder }) => {\r\n switch (modifyOrder.__typename) {\r\n case 'Order':\r\n return this.modalService.fromComponent(OrderEditsPreviewDialogComponent, {\r\n size: 'xl',\r\n closable: false,\r\n locals: {\r\n originalTotalWithTax,\r\n order: modifyOrder,\r\n orderLineCustomFields: this.orderLineCustomFields,\r\n modifyOrderInput: input,\r\n },\r\n });\r\n case 'InsufficientStockError':\r\n case 'NegativeQuantityError':\r\n case 'NoChangesSpecifiedError':\r\n case 'OrderLimitError':\r\n case 'OrderModificationStateError':\r\n case 'PaymentMethodMissingError':\r\n case 'RefundPaymentIdMissingError':\r\n case 'CouponCodeLimitError':\r\n case 'CouponCodeExpiredError':\r\n case 'CouponCodeInvalidError': {\r\n this.notificationService.error(modifyOrder.message);\r\n return of(false as const);\r\n }\r\n case null:\r\n case undefined:\r\n return of(false as const);\r\n default:\r\n assertNever(modifyOrder);\r\n }\r\n }),\r\n switchMap(result => {\r\n if (!result || result.result === OrderEditResultType.Cancel) {\r\n // re-fetch so that the preview values get overwritten in the cache.\r\n return this.dataService.order.getOrder(this.id).mapSingle(() => false);\r\n } else {\r\n // Do the modification\r\n const wetRunInput = {\r\n ...input,\r\n dryRun: false,\r\n };\r\n if (result.result === OrderEditResultType.Refund) {\r\n wetRunInput.refund = {\r\n paymentId: result.refundPaymentId,\r\n reason: result.refundNote,\r\n };\r\n }\r\n return this.dataService.order.modifyOrder(wetRunInput).pipe(\r\n switchMap(({ modifyOrder }) => {\r\n if (modifyOrder.__typename === 'Order') {\r\n const priceDelta = modifyOrder.totalWithTax - originalTotalWithTax;\r\n const nextState =\r\n 0 < priceDelta ? 'ArrangingAdditionalPayment' : this.previousState;\r\n\r\n return this.dataService.order\r\n .transitionToState(order.id, nextState)\r\n .pipe(mapTo(true));\r\n } else {\r\n this.notificationService.error((modifyOrder as ErrorResult).message);\r\n return EMPTY;\r\n }\r\n }),\r\n );\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n if (result) {\r\n this.router.navigate(['../'], { relativeTo: this.route });\r\n }\r\n });\r\n }\r\n\r\n private addAddressCustomFieldsFormGroup(\r\n parentFormGroup: FormGroup,\r\n address?: OrderAddressFragment | null,\r\n ) {\r\n if (address && this.addressCustomFields.length) {\r\n const addressCustomFieldsFormGroup = new FormGroup({});\r\n for (const customFieldDef of this.addressCustomFields) {\r\n const name = customFieldDef.name;\r\n const value = (address as any).customFields?.[name];\r\n addressCustomFieldsFormGroup.addControl(name, new FormControl(value));\r\n }\r\n parentFormGroup.addControl('customFields', addressCustomFieldsFormGroup);\r\n }\r\n }\r\n\r\n protected setFormValues(entity: OrderDetailFragment, languageCode: LanguageCode): void {\r\n /* not used */\r\n }\r\n}\r\n","<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"search-form\">\r\n <div class=\"btn-group btn-outline-primary\" *ngIf=\"activePreset$ | async as activePreset\">\r\n <button\r\n class=\"btn\"\r\n *ngFor=\"let preset of filterPresets\"\r\n [class.btn-primary]=\"activePreset === preset.name\"\r\n (click)=\"selectFilterPreset(preset.name)\"\r\n >\r\n {{ preset.label | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n [class.btn-primary]=\"activePreset === 'custom'\"\r\n (click)=\"selectFilterPreset('custom')\"\r\n >\r\n {{ 'order.filter-custom' | translate }}\r\n <clr-icon shape=\"angle down\"></clr-icon>\r\n </button>\r\n </div>\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchControl\"\r\n [placeholder]=\"'order.search-by-order-filters' | translate\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n <div class=\"custom-filters\" [class.expanded]=\"(activePreset$ | async) === 'custom'\">\r\n <form [formGroup]=\"customFilterForm\">\r\n <div class=\"flex align-center\">\r\n <ng-select\r\n [items]=\"orderStates\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n formControlName=\"states\"\r\n [placeholder]=\"'state.all-orders' | translate\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">{{ item | stateI18nToken | translate }}</ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\"> {{ item | stateI18nToken | translate }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">×</span>\r\n </ng-template>\r\n </ng-select>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"customFilterForm.pristine\"\r\n (click)=\"applyCustomFilters()\"\r\n >\r\n {{ 'order.apply-filters' | translate }}\r\n <clr-icon shape=\"filter\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex\">\r\n <div>\r\n <label>{{ 'order.placed-at-start' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtStart\"></vdr-datetime-picker>\r\n </div>\r\n <div>\r\n <label>{{ 'order.placed-at-end' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtEnd\"></vdr-datetime-picker>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-list\"></vdr-action-bar-items>\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>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.customer' | 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>{{ 'order.placed-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.shipping' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">{{ order.code }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.updatedAt | timeAgo }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | localeDate: 'medium' }}</td>\r\n <td class=\"left align-middle\">{{ getShippingNames(order) }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"order.state === 'Modifying' ? ['./', order.id, 'modify'] : ['./', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup } 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 GetOrderListQuery,\r\n ItemOf,\r\n LocalStorageService,\r\n LogicalOperator,\r\n OrderListOptions,\r\n ServerConfigService,\r\n SortOrder,\r\n} from '@vendure/admin-ui/core';\r\nimport { Order } from '@vendure/common/lib/generated-types';\r\nimport { merge, Observable } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, filter, map, takeUntil } from 'rxjs/operators';\r\n\r\ninterface OrderFilterConfig {\r\n active?: boolean;\r\n states?: string[];\r\n}\r\n\r\ninterface FilterPreset {\r\n name: string;\r\n label: string;\r\n config: OrderFilterConfig;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-order-list',\r\n templateUrl: './order-list.component.html',\r\n styleUrls: ['./order-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class OrderListComponent\r\n extends BaseListComponent<GetOrderListQuery, ItemOf<GetOrderListQuery, 'orders'>>\r\n implements OnInit\r\n{\r\n searchControl = new FormControl('');\r\n searchOrderCodeControl = new FormControl('');\r\n searchLastNameControl = new FormControl('');\r\n customFilterForm: FormGroup;\r\n orderStates = this.serverConfigService.getOrderProcessStates().map(item => item.name);\r\n filterPresets: FilterPreset[] = [\r\n {\r\n name: 'open',\r\n label: _('order.filter-preset-open'),\r\n config: {\r\n active: false,\r\n states: this.orderStates.filter(\r\n s => s !== 'Delivered' && s !== 'Cancelled' && s !== 'Shipped',\r\n ),\r\n },\r\n },\r\n {\r\n name: 'shipped',\r\n label: _('order.filter-preset-shipped'),\r\n config: {\r\n active: false,\r\n states: ['Shipped'],\r\n },\r\n },\r\n {\r\n name: 'completed',\r\n label: _('order.filter-preset-completed'),\r\n config: {\r\n active: false,\r\n states: ['Delivered', 'Cancelled'],\r\n },\r\n },\r\n {\r\n name: 'active',\r\n label: _('order.filter-preset-active'),\r\n config: {\r\n active: true,\r\n },\r\n },\r\n ];\r\n activePreset$: Observable<string>;\r\n\r\n constructor(\r\n private serverConfigService: ServerConfigService,\r\n private dataService: DataService,\r\n private localStorageService: LocalStorageService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n // tslint:disable-next-line:no-shadowed-variable\r\n (take, skip) => this.dataService.order.getOrders({ take, skip }).refetchOnChannelChange(),\r\n data => data.orders,\r\n // tslint:disable-next-line:no-shadowed-variable\r\n (skip, take) =>\r\n this.createQueryOptions(\r\n skip,\r\n take,\r\n this.searchControl.value,\r\n this.route.snapshot.queryParamMap.get('filter') || 'open',\r\n ),\r\n );\r\n const lastFilters = this.localStorageService.get('orderListLastCustomFilters');\r\n if (lastFilters) {\r\n this.setQueryParam(lastFilters, { replaceUrl: true });\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.activePreset$ = this.route.queryParamMap.pipe(\r\n map(qpm => qpm.get('filter') || 'open'),\r\n distinctUntilChanged(),\r\n );\r\n const searchTerms$ = merge(this.searchControl.valueChanges).pipe(\r\n filter(value => 2 < value.length || value.length === 0),\r\n debounceTime(250),\r\n );\r\n merge(searchTerms$, this.route.queryParamMap)\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(val => {\r\n this.refresh();\r\n });\r\n\r\n const queryParamMap = this.route.snapshot.queryParamMap;\r\n this.customFilterForm = new FormGroup({\r\n states: new FormControl(queryParamMap.getAll('states') ?? []),\r\n placedAtStart: new FormControl(queryParamMap.get('placedAtStart')),\r\n placedAtEnd: new FormControl(queryParamMap.get('placedAtEnd')),\r\n });\r\n }\r\n\r\n selectFilterPreset(presetName: string) {\r\n const lastCustomFilters = this.localStorageService.get('orderListLastCustomFilters') ?? {};\r\n const emptyCustomFilters = { states: undefined, placedAtStart: undefined, placedAtEnd: undefined };\r\n const filters = presetName === 'custom' ? lastCustomFilters : emptyCustomFilters;\r\n this.setQueryParam(\r\n {\r\n filter: presetName,\r\n page: 1,\r\n ...filters,\r\n },\r\n { replaceUrl: true },\r\n );\r\n }\r\n\r\n applyCustomFilters() {\r\n const formValue = this.customFilterForm.value;\r\n const customFilters = {\r\n states: formValue.states,\r\n placedAtStart: formValue.placedAtStart,\r\n placedAtEnd: formValue.placedAtEnd,\r\n };\r\n this.setQueryParam({\r\n filter: 'custom',\r\n ...customFilters,\r\n });\r\n this.customFilterForm.markAsPristine();\r\n this.localStorageService.set('orderListLastCustomFilters', customFilters);\r\n }\r\n\r\n private createQueryOptions(\r\n // tslint:disable-next-line:no-shadowed-variable\r\n skip: number,\r\n take: number,\r\n searchTerm: string,\r\n activeFilterPreset?: string,\r\n ): { options: OrderListOptions } {\r\n const filterConfig = this.filterPresets.find(p => p.name === activeFilterPreset);\r\n // tslint:disable-next-line:no-shadowed-variable\r\n let filter: any = {};\r\n let filterOperator: LogicalOperator = LogicalOperator.AND;\r\n if (filterConfig) {\r\n if (filterConfig.config.active != null) {\r\n filter.active = {\r\n eq: filterConfig.config.active,\r\n };\r\n }\r\n if (filterConfig.config.states) {\r\n filter.state = {\r\n in: filterConfig.config.states,\r\n };\r\n }\r\n } else if (activeFilterPreset === 'custom') {\r\n const queryParams = this.route.snapshot.queryParamMap;\r\n const states = queryParams.getAll('states') ?? [];\r\n const placedAtStart = queryParams.get('placedAtStart');\r\n const placedAtEnd = queryParams.get('placedAtEnd');\r\n if (states.length) {\r\n filter.state = {\r\n in: states,\r\n };\r\n }\r\n if (placedAtStart && placedAtEnd) {\r\n filter.orderPlacedAt = {\r\n between: {\r\n start: placedAtStart,\r\n end: placedAtEnd,\r\n },\r\n };\r\n } else if (placedAtStart) {\r\n filter.orderPlacedAt = {\r\n after: placedAtStart,\r\n };\r\n } else if (placedAtEnd) {\r\n filter.orderPlacedAt = {\r\n before: placedAtEnd,\r\n };\r\n }\r\n }\r\n if (searchTerm) {\r\n filter = {\r\n customerLastName: {\r\n contains: searchTerm,\r\n },\r\n transactionId: {\r\n contains: searchTerm,\r\n },\r\n code: {\r\n contains: searchTerm,\r\n },\r\n };\r\n filterOperator = LogicalOperator.OR;\r\n }\r\n return {\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n ...(filter ?? {}),\r\n },\r\n sort: {\r\n updatedAt: SortOrder.DESC,\r\n },\r\n filterOperator,\r\n },\r\n };\r\n }\r\n\r\n getShippingNames(order: Order) {\r\n if (order.shippingLines.length) {\r\n return order.shippingLines.map(shippingLine => shippingLine.shippingMethod.name).join(', ');\r\n } else {\r\n return '';\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, DataService, OrderDetailFragment } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Resolves the id from the path into a Customer entity.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class OrderResolver extends BaseEntityResolver<OrderDetailFragment> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Order',\r\n id: '',\r\n code: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n total: 0,\r\n } as any,\r\n id => dataService.order.getOrder(id).mapStream(data => data.order),\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 BreadcrumbLabelLinkPair,\r\n CanDeactivateDetailGuard,\r\n createResolveData,\r\n detailBreadcrumb,\r\n OrderDetailFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { OrderDetailComponent } from './components/order-detail/order-detail.component';\r\nimport { OrderEditorComponent } from './components/order-editor/order-editor.component';\r\nimport { OrderListComponent } from './components/order-list/order-list.component';\r\nimport { OrderResolver } from './providers/routing/order-resolver';\r\n\r\nexport const orderRoutes: Route[] = [\r\n {\r\n path: '',\r\n component: OrderListComponent,\r\n data: {\r\n breadcrumb: _('breadcrumb.orders'),\r\n },\r\n },\r\n {\r\n path: ':id',\r\n component: OrderDetailComponent,\r\n resolve: createResolveData(OrderResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: orderBreadcrumb,\r\n },\r\n },\r\n {\r\n path: ':id/modify',\r\n component: OrderEditorComponent,\r\n resolve: createResolveData(OrderResolver),\r\n // canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: modifyingOrderBreadcrumb,\r\n },\r\n },\r\n];\r\n\r\nexport function orderBreadcrumb(data: any, params: any) {\r\n return detailBreadcrumb<OrderDetailFragment>({\r\n entity: data.entity,\r\n id: params.id,\r\n breadcrumbKey: 'breadcrumb.orders',\r\n getName: order => order.code,\r\n route: '',\r\n });\r\n}\r\n\r\nexport function modifyingOrderBreadcrumb(data: any, params: any) {\r\n return orderBreadcrumb(data, params).pipe(\r\n map((breadcrumbs: BreadcrumbLabelLinkPair[]) => {\r\n const modifiedBreadcrumbs = breadcrumbs.slice();\r\n modifiedBreadcrumbs[0].link[0] = '../';\r\n modifiedBreadcrumbs[1].link[0] = '../orders';\r\n return modifiedBreadcrumbs.concat({ label: _('breadcrumb.modifying'), link: [''] });\r\n }) as any,\r\n );\r\n}\r\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from '@vendure/admin-ui/core';\n\nimport { AddManualPaymentDialogComponent } from './components/add-manual-payment-dialog/add-manual-payment-dialog.component';\nimport { CancelOrderDialogComponent } from './components/cancel-order-dialog/cancel-order-dialog.component';\nimport { FulfillOrderDialogComponent } from './components/fulfill-order-dialog/fulfill-order-dialog.component';\nimport { FulfillmentCardComponent } from './components/fulfillment-card/fulfillment-card.component';\nimport { FulfillmentDetailComponent } from './components/fulfillment-detail/fulfillment-detail.component';\nimport { FulfillmentStateLabelComponent } from './components/fulfillment-state-label/fulfillment-state-label.component';\nimport { LineFulfillmentComponent } from './components/line-fulfillment/line-fulfillment.component';\nimport { LineRefundsComponent } from './components/line-refunds/line-refunds.component';\nimport { ModificationDetailComponent } from './components/modification-detail/modification-detail.component';\nimport { OrderCustomFieldsCardComponent } from './components/order-custom-fields-card/order-custom-fields-card.component';\nimport { OrderDetailComponent } from './components/order-detail/order-detail.component';\nimport { OrderEditorComponent } from './components/order-editor/order-editor.component';\nimport { OrderEditsPreviewDialogComponent } from './components/order-edits-preview-dialog/order-edits-preview-dialog.component';\nimport { OrderHistoryComponent } from './components/order-history/order-history.component';\nimport { OrderListComponent } from './components/order-list/order-list.component';\nimport { OrderPaymentCardComponent } from './components/order-payment-card/order-payment-card.component';\nimport { OrderProcessGraphDialogComponent } from './components/order-process-graph-dialog/order-process-graph-dialog.component';\nimport { OrderProcessEdgeComponent } from './components/order-process-graph/order-process-edge.component';\nimport { OrderProcessGraphComponent } from './components/order-process-graph/order-process-graph.component';\nimport { OrderProcessNodeComponent } from './components/order-process-graph/order-process-node.component';\nimport { OrderStateSelectDialogComponent } from './components/order-state-select-dialog/order-state-select-dialog.component';\nimport { OrderTableComponent } from './components/order-table/order-table.component';\nimport { PaymentDetailComponent } from './components/payment-detail/payment-detail.component';\nimport { PaymentStateLabelComponent } from './components/payment-state-label/payment-state-label.component';\nimport { RefundOrderDialogComponent } from './components/refund-order-dialog/refund-order-dialog.component';\nimport { RefundStateLabelComponent } from './components/refund-state-label/refund-state-label.component';\nimport { SettleRefundDialogComponent } from './components/settle-refund-dialog/settle-refund-dialog.component';\nimport { SimpleItemListComponent } from './components/simple-item-list/simple-item-list.component';\nimport { orderRoutes } from './order.routes';\n\n@NgModule({\n imports: [SharedModule, RouterModule.forChild(orderRoutes)],\n declarations: [\n OrderListComponent,\n OrderDetailComponent,\n FulfillOrderDialogComponent,\n LineFulfillmentComponent,\n RefundOrderDialogComponent,\n CancelOrderDialogComponent,\n PaymentStateLabelComponent,\n LineRefundsComponent,\n OrderPaymentCardComponent,\n RefundStateLabelComponent,\n SettleRefundDialogComponent,\n OrderHistoryComponent,\n FulfillmentDetailComponent,\n PaymentDetailComponent,\n SimpleItemListComponent,\n OrderCustomFieldsCardComponent,\n OrderProcessGraphComponent,\n OrderProcessNodeComponent,\n OrderProcessEdgeComponent,\n OrderProcessGraphDialogComponent,\n FulfillmentStateLabelComponent,\n FulfillmentCardComponent,\n OrderEditorComponent,\n OrderTableComponent,\n OrderEditsPreviewDialogComponent,\n ModificationDetailComponent,\n AddManualPaymentDialogComponent,\n OrderStateSelectDialogComponent,\n ],\n})\nexport class OrderModule {}\n"],"sourceRoot":"webpack:///","file":"849.21d37348d17a9559.js"}