@mieweb/ui 0.6.1-dev.159 → 0.6.1-dev.165

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 (119) hide show
  1. package/dist/MedicationEditor-Bp4NLy7y.d.cts +352 -0
  2. package/dist/MedicationEditor-Bp4NLy7y.d.ts +352 -0
  3. package/dist/ag-grid.cjs +5 -5
  4. package/dist/ag-grid.js +1 -1
  5. package/dist/{chunk-H4T5T65N.cjs → chunk-2JQBPU3Y.cjs} +3 -3
  6. package/dist/{chunk-H4T5T65N.cjs.map → chunk-2JQBPU3Y.cjs.map} +1 -1
  7. package/dist/{chunk-6555OYRU.js → chunk-5BQE6BEL.js} +2 -2
  8. package/dist/{chunk-6555OYRU.js.map → chunk-5BQE6BEL.js.map} +1 -1
  9. package/dist/chunk-67CEEDAP.cjs +1605 -0
  10. package/dist/chunk-67CEEDAP.cjs.map +1 -0
  11. package/dist/{chunk-ULF4PWHW.cjs → chunk-7BARESXI.cjs} +3 -3
  12. package/dist/{chunk-ULF4PWHW.cjs.map → chunk-7BARESXI.cjs.map} +1 -1
  13. package/dist/chunk-7ZVTLTJF.js +109 -0
  14. package/dist/chunk-7ZVTLTJF.js.map +1 -0
  15. package/dist/{chunk-KX4NWZIR.cjs → chunk-CDMWZBDD.cjs} +3 -3
  16. package/dist/{chunk-KX4NWZIR.cjs.map → chunk-CDMWZBDD.cjs.map} +1 -1
  17. package/dist/chunk-DHKYGVP7.js +3 -0
  18. package/dist/{chunk-LEMY57MI.js.map → chunk-DHKYGVP7.js.map} +1 -1
  19. package/dist/{chunk-FSBFQBNE.cjs → chunk-DKGUOMBC.cjs} +2 -2
  20. package/dist/{chunk-FSBFQBNE.cjs.map → chunk-DKGUOMBC.cjs.map} +1 -1
  21. package/dist/{chunk-4FALCEJI.cjs → chunk-EL2RSQTJ.cjs} +2 -2
  22. package/dist/{chunk-4FALCEJI.cjs.map → chunk-EL2RSQTJ.cjs.map} +1 -1
  23. package/dist/{chunk-TQV5CGSA.js → chunk-ETGZ5DSA.js} +3 -3
  24. package/dist/{chunk-TQV5CGSA.js.map → chunk-ETGZ5DSA.js.map} +1 -1
  25. package/dist/{chunk-EYJDPYOP.js → chunk-FJG7KUDJ.js} +3 -3
  26. package/dist/{chunk-EYJDPYOP.js.map → chunk-FJG7KUDJ.js.map} +1 -1
  27. package/dist/{chunk-HMQ2PRTB.cjs → chunk-GBRPZGSI.cjs} +7 -7
  28. package/dist/{chunk-HMQ2PRTB.cjs.map → chunk-GBRPZGSI.cjs.map} +1 -1
  29. package/dist/{chunk-M7BLVBL4.js → chunk-GSOOPTGM.js} +3 -3
  30. package/dist/{chunk-M7BLVBL4.js.map → chunk-GSOOPTGM.js.map} +1 -1
  31. package/dist/chunk-HUXOASEB.js +1568 -0
  32. package/dist/chunk-HUXOASEB.js.map +1 -0
  33. package/dist/chunk-IQ4KQJAO.js +3 -0
  34. package/dist/{chunk-4ZU53GNR.cjs.map → chunk-IQ4KQJAO.js.map} +1 -1
  35. package/dist/{chunk-RUGWUQ47.js → chunk-NBD236EH.js} +48 -2
  36. package/dist/chunk-NBD236EH.js.map +1 -0
  37. package/dist/chunk-OF7NTZ2I.js +3 -0
  38. package/dist/chunk-OF7NTZ2I.js.map +1 -0
  39. package/dist/chunk-RHNPILZQ.cjs +4 -0
  40. package/dist/chunk-RHNPILZQ.cjs.map +1 -0
  41. package/dist/chunk-RI56YPED.cjs +201 -0
  42. package/dist/chunk-RI56YPED.cjs.map +1 -0
  43. package/dist/{chunk-DCER2QQB.js → chunk-T42BCIUA.js} +2 -2
  44. package/dist/{chunk-DCER2QQB.js.map → chunk-T42BCIUA.js.map} +1 -1
  45. package/dist/{chunk-4ZU53GNR.cjs → chunk-UTYUT5YY.cjs} +62 -2
  46. package/dist/chunk-UTYUT5YY.cjs.map +1 -0
  47. package/dist/{chunk-Q7NBJFEB.js → chunk-UVQEHZRF.js} +2 -2
  48. package/dist/{chunk-Q7NBJFEB.js.map → chunk-UVQEHZRF.js.map} +1 -1
  49. package/dist/chunk-VBWRH4UW.cjs +4 -0
  50. package/dist/chunk-VBWRH4UW.cjs.map +1 -0
  51. package/dist/{chunk-WJIANZPI.cjs → chunk-VJOVJTFP.cjs} +3 -3
  52. package/dist/chunk-VJOVJTFP.cjs.map +1 -0
  53. package/dist/{chunk-OVQKCUTZ.js → chunk-WFS6R2F5.js} +3 -3
  54. package/dist/{chunk-OVQKCUTZ.js.map → chunk-WFS6R2F5.js.map} +1 -1
  55. package/dist/chunk-Y5KEFV5O.js +192 -0
  56. package/dist/chunk-Y5KEFV5O.js.map +1 -0
  57. package/dist/{chunk-4N72FAQW.js → chunk-YBLIDESO.js} +3 -3
  58. package/dist/chunk-YBLIDESO.js.map +1 -0
  59. package/dist/chunk-YVPC65ZJ.cjs +134 -0
  60. package/dist/chunk-YVPC65ZJ.cjs.map +1 -0
  61. package/dist/{chunk-3AMNAMJA.cjs → chunk-YYDW3ZZS.cjs} +48 -2
  62. package/dist/chunk-YYDW3ZZS.cjs.map +1 -0
  63. package/dist/{chunk-3M4P2KMG.cjs → chunk-ZHBANUBI.cjs} +2 -2
  64. package/dist/{chunk-3M4P2KMG.cjs.map → chunk-ZHBANUBI.cjs.map} +1 -1
  65. package/dist/components/Badge/index.cjs +4 -3
  66. package/dist/components/Badge/index.js +2 -1
  67. package/dist/components/Card/index.cjs +16 -15
  68. package/dist/components/Card/index.js +2 -1
  69. package/dist/components/CountryCodeDropdown/index.cjs +5 -5
  70. package/dist/components/CountryCodeDropdown/index.js +2 -2
  71. package/dist/components/Dropdown/index.cjs +8 -8
  72. package/dist/components/Dropdown/index.js +2 -2
  73. package/dist/components/RichTextEditor/index.cjs +7 -7
  74. package/dist/components/RichTextEditor/index.js +4 -4
  75. package/dist/components/Skeleton/index.d.cts +1 -1
  76. package/dist/components/Skeleton/index.d.ts +1 -1
  77. package/dist/components/SuperChat/index.cjs +10 -9
  78. package/dist/components/SuperChat/index.cjs.map +1 -1
  79. package/dist/components/SuperChat/index.js +5 -4
  80. package/dist/components/SuperChat/index.js.map +1 -1
  81. package/dist/components/SuperChat/plugins/index.cjs +3 -3
  82. package/dist/components/SuperChat/plugins/index.js +2 -2
  83. package/dist/datavis.cjs +273 -5
  84. package/dist/datavis.cjs.map +1 -1
  85. package/dist/datavis.d.cts +61 -1
  86. package/dist/datavis.d.ts +61 -1
  87. package/dist/datavis.js +251 -1
  88. package/dist/datavis.js.map +1 -1
  89. package/dist/esheet.cjs +182 -0
  90. package/dist/esheet.cjs.map +1 -1
  91. package/dist/esheet.d.cts +117 -0
  92. package/dist/esheet.d.ts +117 -0
  93. package/dist/esheet.js +161 -0
  94. package/dist/esheet.js.map +1 -1
  95. package/dist/hooks/index.cjs +33 -16
  96. package/dist/hooks/index.d.cts +62 -1
  97. package/dist/hooks/index.d.ts +62 -1
  98. package/dist/hooks/index.js +3 -2
  99. package/dist/index.cjs +3923 -938
  100. package/dist/index.cjs.map +1 -1
  101. package/dist/index.d.cts +981 -2
  102. package/dist/index.d.ts +981 -2
  103. package/dist/index.js +3313 -452
  104. package/dist/index.js.map +1 -1
  105. package/dist/{nitroTableGrid-RQNSZQO4.cjs → nitroTableGrid-3J2GY6CK.cjs} +4 -4
  106. package/dist/{nitroTableGrid-RQNSZQO4.cjs.map → nitroTableGrid-3J2GY6CK.cjs.map} +1 -1
  107. package/dist/{nitroTableGrid-W6XWRFA7.js → nitroTableGrid-SIMT7635.js} +3 -3
  108. package/dist/{nitroTableGrid-W6XWRFA7.js.map → nitroTableGrid-SIMT7635.js.map} +1 -1
  109. package/dist/orderRows-BUJYgSc7.d.cts +221 -0
  110. package/dist/orderRows-BUJYgSc7.d.ts +221 -0
  111. package/dist/styles.css +1 -1
  112. package/dist/tailwind-preset.cjs +4 -4
  113. package/dist/tailwind-preset.js +1 -1
  114. package/package.json +3 -3
  115. package/dist/chunk-3AMNAMJA.cjs.map +0 -1
  116. package/dist/chunk-4N72FAQW.js.map +0 -1
  117. package/dist/chunk-LEMY57MI.js +0 -3
  118. package/dist/chunk-RUGWUQ47.js.map +0 -1
  119. package/dist/chunk-WJIANZPI.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/CountryCodeDropdown/CountryCodeDropdown.tsx"],"names":["PhoneNumberUtil","PhoneNumberFormat"],"mappings":";;;;;;;AAMA,IAAMA,gBAAAA,GAC+D,wBAC/D,eAAA,IAAkC,cAAA,CAAA,eAAA;AACxC,IAAMC,kBAAAA,GAC+D,wBAC/D,iBAAA,IAAoC,cAAA,CAAA,iBAAA;AAuC1C,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,CAAA,CAC1B,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,cAAc,MAAA,GAAU,EAAA,GAAK,EAAE,UAAA,CAAW,CAAC,CAAC,CAAC,CAAA,CAC/D,KAAK,EAAE,CAAA;AACZ;AAGA,SAAS,gBAAA,GAAkC;AACzC,EAAA,MAAM,SAAA,GAAYD,iBAAgB,WAAA,EAAY;AAC9C,EAAA,MAAM,OAAA,GAAU,UAAU,mBAAA,EAAoB;AAC9C,EAAA,MAAM,IAAA,GAAsB,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAiB;AACxD,IAAA,MAAM,WAAA,GAAc,SAAA,CAAU,uBAAA,CAAwB,IAAI,CAAA;AAC1D,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,IAAA,EAAM,kBAAkB,IAAI,CAAA;AAAA,MAC5B,QAAA,EAAU,IAAI,WAAW,CAAA,CAAA;AAAA,MACzB,IAAA,EAAM,WAAW,IAAI;AAAA,KACvB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAChD,EAAA,OAAO,IAAA;AACT;AAGA,IAAI,UAAA,GAAmC,IAAA;AACvC,SAAS,YAAA,GAA8B;AACrC,EAAA,IAAI,CAAC,UAAA,EAAY,UAAA,GAAa,gBAAA,EAAiB;AAC/C,EAAA,OAAO,UAAA;AACT;AAOA,IAAI,mBAAA,GAAgD,IAAA;AAEpD,SAAS,qBAAA,GAAkD;AACzD,EAAA,IAAI,wBAAwB,IAAA,EAAM;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GACJ,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,SAAA,EAAW,MAAA,GACrD,CAAC,GAAG,SAAA,CAAU,SAAS,CAAA,GACvB,CAAC,IAAI,CAAA;AACX,MAAA,mBAAA,GAAsB,IAAI,IAAA,CAAK,YAAA,CAAa,SAAS,EAAE,IAAA,EAAM,UAAU,CAAA;AAAA,IACzE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,mBAAA;AACT;AAMA,SAAS,kBAAkB,IAAA,EAAsB;AAC/C,EAAA,MAAM,KAAK,qBAAA,EAAsB;AACjC,EAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,EAAA,OAAO,EAAA,CAAG,EAAA,CAAG,IAAI,CAAA,IAAK,IAAA;AACxB;AAaO,SAAS,mBAAA,CACd,aACA,WAAA,EACS;AACT,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAYA,iBAAgB,WAAA,EAAY;AAC9C,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,WAAA,EAAa,WAAW,CAAA;AACvD,IAAA,OAAO,SAAA,CAAU,sBAAA,CAAuB,MAAA,EAAQ,WAAW,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AASO,SAAS,UAAA,CAAW,aAAqB,WAAA,EAA6B;AAC3E,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAYA,iBAAgB,WAAA,EAAY;AAC9C,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,WAAA,EAAa,WAAW,CAAA;AACvD,IAAA,OAAO,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQC,kBAAAA,CAAkB,IAAI,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,WAAA;AAAA,EACT;AACF;AAyBA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,SAAA,GAAY,cAAA;AAAA,EACZ,iBAAA,GAAoB,wBAAA;AAAA,EACpB,cAAc,SAAA,GAAY;AAC5B,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,KAAA,CAAA,QAAA,CAAS,SAAS,IAAI,CAAA;AACtE,EAAA,MAAM,YAAA,GAAqB,aAAuB,IAAI,CAAA;AACtD,EAAA,MAAM,cAAA,GAAuB,aAAyB,IAAI,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAgB,aAAuB,IAAI,CAAA;AACjD,EAAA,MAAM,SAAe,KAAA,CAAA,KAAA,EAAM;AAE3B,EAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,eAAe,KAAA,GAAQ,aAAA;AAG3C,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAU,eAAS,KAAK,CAAA;AAClE,EAAA,MAAM,SAAA,GAAkB,KAAA,CAAA,OAAA;AAAA,IACtB,MAAO,eAAA,GAAkB,YAAA,EAAa,GAAI,EAAC;AAAA,IAC3C,CAAC,eAAe;AAAA,GAClB;AAEA,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,MAAA,IAAU,CAAC,eAAA,EAAiB,kBAAA,CAAmB,IAAI,CAAA;AAAA,EACzD,CAAA,EAAG,CAAC,MAAA,EAAQ,eAAe,CAAC,CAAA;AAE5B,EAAA,MAAM,QAAA,GAAiB,cAAQ,MAAM;AACnC,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,OACE,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,WAAW,CAAA,IAC5C,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,IAEzC;AAEA,IAAA,OAAO;AAAA,MACL,MAAM,WAAA,IAAe,IAAA;AAAA,MACrB,IAAA,EAAM,iBAAA,CAAkB,WAAA,IAAe,IAAI,CAAA;AAAA,MAC3C,QAAA,EAAU,IAAID,gBAAAA,CAAgB,WAAA,GAAc,uBAAA,CAAwB,WAAA,IAAe,IAAI,CAAC,CAAA,CAAA;AAAA,MACxF,IAAA,EAAM,UAAA,CAAW,WAAA,IAAe,IAAI;AAAA,KACtC;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,QAAA,GAAiB,cAAQ,MAAM;AACnC,IAAA,IAAI,CAAC,QAAQ,OAAO,SAAA;AACpB,IAAA,MAAM,CAAA,GAAI,OAAO,WAAA,EAAY;AAC7B,IAAA,OAAO,SAAA,CAAU,MAAA;AAAA,MACf,CAAC,CAAA,KACC,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,CAAC,CAAA,IAC/B,EAAE,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA,IACrB,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,CAAC;AAAA,KACnC;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAGtB,EAAA,MAAM,KAAA,GAAc,kBAAY,MAAM;AACpC,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EACd,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,eAAA,CAAgB,cAAc,KAAK,CAAA;AACnC,EAAA,YAAA,CAAa,OAAO,MAAM,CAAA;AAG1B,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,qBAAA,CAAsB,MAAM,cAAA,CAAe,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,IAC7D;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,YAAA,GAAqB,kBAAY,MAAM;AAC3C,IAAA,IAAI,CAAC,QAAA,EAAU,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,YAAA,GAAqB,KAAA,CAAA,WAAA;AAAA,IACzB,CAAC,OAAA,KAAyB;AACxB,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,gBAAA,CAAiB,QAAQ,IAAI,CAAA;AAAA,MAC/B;AACA,MAAA,QAAA,GAAW,OAAO,CAAA;AAClB,MAAA,KAAA,EAAM;AAAA,IACR,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,QAAA,EAAU,KAAK;AAAA,GAChC;AAGA,EAAA,MAAM,aAAA,GAAsB,KAAA,CAAA,WAAA;AAAA,IAC1B,CAAC,CAAA,KAA2B;AAC1B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,SAAA,EAAW;AAChD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,KAAA,GACJ,QAAQ,OAAA,EAAS,gBAAA;AAAA,UACf;AAAA,SACF;AACF,QAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAEpB,QAAA,MAAM,UAAU,QAAA,CAAS,aAAA;AACzB,QAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CAAE,QAAQ,OAA4B,CAAA;AAClE,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,UAAA,IAAA,GAAO,GAAA,GAAM,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAA,IAAA,GAAO,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,MAAM,MAAA,GAAS,CAAA;AAAA,QAC5C;AACA,QAAA,KAAA,CAAM,IAAI,EAAE,KAAA,EAAM;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,cAAA,GACJ,SAAA,KAAc,YAAA,GACV,uBAAA,GACA,sBAAA;AAEN,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAU,sBAAA;AAAA,MAGV,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,WAAA,EAAU,0BAAA;AAAA,YACV,OAAA,EAAS,YAAA;AAAA,YACT,QAAA;AAAA,YACA,YAAA,EAAY,SAAA;AAAA,YACZ,eAAA,EAAc,SAAA;AAAA,YACd,eAAA,EAAe,MAAA;AAAA,YACf,eAAA,EAAe,SAAS,MAAA,GAAS,MAAA;AAAA,YACjC,SAAA,EAAW,EAAA;AAAA,cACT,sEAAA;AAAA,cACA,4CAAA;AAAA,cACA,gCAAA;AAAA,cACA,+CAAA;AAAA,cACA,iDAAA;AAAA,cACA,iDAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,WAAA,EAAU,uBAAA;AAAA,kBACV,SAAA,EAAU,wBAAA;AAAA,kBACV,aAAA,EAAY,MAAA;AAAA,kBAEX,QAAA,EAAA,QAAA,CAAS;AAAA;AAAA,eACZ;AAAA,8BACA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAA,EAAU,2BAAA,EAA6B,mBAAS,QAAA,EAAS,CAAA;AAAA,8BAC/D,GAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,WAAA,EAAU,0BAAA;AAAA,kBACV,SAAA,EAAW,EAAA;AAAA,oBACT,qEAAA;AAAA,oBACA,MAAA,IAAU;AAAA,mBACZ;AAAA,kBACA,KAAA,EAAM,4BAAA;AAAA,kBACN,OAAA,EAAQ,WAAA;AAAA,kBACR,IAAA,EAAK,cAAA;AAAA,kBACL,aAAA,EAAY,MAAA;AAAA,kBAEZ,QAAA,kBAAA,GAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,QAAA,EAAS,SAAA;AAAA,sBACT,CAAA,EAAE,wIAAA;AAAA,sBACF,QAAA,EAAS;AAAA;AAAA;AACX;AAAA;AACF;AAAA;AAAA,SACF;AAAA,QAGC,MAAA,oBACC,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,MAAA;AAAA,YACJ,IAAA,EAAK,SAAA;AAAA,YACL,WAAA,EAAU,wBAAA;AAAA,YACV,YAAA,EAAY,SAAA;AAAA,YACZ,QAAA,EAAU,EAAA;AAAA,YACV,SAAA,EAAW,aAAA;AAAA,YACX,SAAA,EAAW,EAAA;AAAA,cACT,oBAAA;AAAA,cACA,yDAAA;AAAA,cACA,6CAAA;AAAA,cACA,4CAAA;AAAA,cACA;AAAA,aACF;AAAA,YAGA,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,WAAA,EAAU,yBAAA;AAAA,kBACV,SAAA,EAAU,yDAAA;AAAA,kBAEV,QAAA,kBAAA,GAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,GAAA,EAAK,cAAA;AAAA,sBACL,IAAA,EAAK,MAAA;AAAA,sBACL,WAAA,EAAU,+BAAA;AAAA,sBACV,KAAA,EAAO,MAAA;AAAA,sBACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,sBACzC,WAAA,EAAa,iBAAA;AAAA,sBACb,YAAA,EAAW,kBAAA;AAAA,sBACX,SAAA,EAAW,EAAA;AAAA,wBACT,iEAAA;AAAA,wBACA,4DAAA;AAAA,wBACA,0EAAA;AAAA,wBACA;AAAA;AACF;AAAA;AACF;AAAA,eACF;AAAA,8BAGA,GAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,OAAA;AAAA,kBACL,WAAA,EAAU,uBAAA;AAAA,kBACV,SAAA,EAAU,8BAAA;AAAA,kBAET,QAAA,EAAA,QAAA,CAAS,MAAA,KAAW,CAAA,mBACnB,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EAAsD,QAAA,EAAA,oBAAA,EAErE,CAAA,GAEA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACZ,IAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBAEC,IAAA,EAAK,QAAA;AAAA,sBACL,IAAA,EAAK,QAAA;AAAA,sBACL,WAAA,EAAU,yBAAA;AAAA,sBACV,eAAA,EAAe,OAAA,CAAQ,IAAA,KAAS,QAAA,CAAS,IAAA;AAAA,sBACzC,OAAA,EAAS,MAAM,YAAA,CAAa,OAAO,CAAA;AAAA,sBACnC,SAAA,EAAW,EAAA;AAAA,wBACT,uEAAA;AAAA,wBACA,gCAAA;AAAA,wBACA,oBAAA;AAAA,wBACA,OAAA,CAAQ,IAAA,KAAS,QAAA,CAAS,IAAA,GACtB,iFAAA,GACA,yFAAA;AAAA,wBACJ;AAAA,uBACF;AAAA,sBAEA,QAAA,EAAA;AAAA,wCAAA,GAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,WAAA,EAAU,8BAAA;AAAA,4BACV,SAAA,EAAU,wBAAA;AAAA,4BACV,aAAA,EAAY,MAAA;AAAA,4BAEX,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,yBACX;AAAA,wCACA,GAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,WAAA,EAAU,8BAAA;AAAA,4BACV,SAAA,EAAU,iBAAA;AAAA,4BAET,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,yBACX;AAAA,wCACA,GAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,WAAA,EAAU,kCAAA;AAAA,4BACV,SAAA,EAAU,wCAAA;AAAA,4BAET,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA;AACX;AAAA,qBAAA;AAAA,oBAlCK,OAAA,CAAQ;AAAA,mBAoChB;AAAA;AAAA;AAEL;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA","file":"chunk-OVQKCUTZ.js","sourcesContent":["import * as React from 'react';\nimport * as libphonenumber from 'google-libphonenumber';\nimport { cn } from '../../utils/cn';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\nconst PhoneNumberUtil =\n (libphonenumber as unknown as { default?: typeof libphonenumber }).default\n ?.PhoneNumberUtil ?? libphonenumber.PhoneNumberUtil;\nconst PhoneNumberFormat =\n (libphonenumber as unknown as { default?: typeof libphonenumber }).default\n ?.PhoneNumberFormat ?? libphonenumber.PhoneNumberFormat;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface CountryData {\n /** ISO 3166-1 alpha-2 country code (e.g. \"US\") */\n code: string;\n /** Country name (e.g. \"United States\") */\n name: string;\n /** Dial code (e.g. \"+1\") */\n dialCode: string;\n /** Emoji flag (e.g. \"🇺🇸\") */\n flag: string;\n}\n\nexport interface CountryCodeDropdownProps {\n /** The currently selected country code (ISO alpha-2, e.g. \"US\") */\n value?: string;\n /** Called when a country is selected */\n onChange?: (country: CountryData) => void;\n /** Whether the dropdown is disabled */\n disabled?: boolean;\n /** Additional class name for the trigger button */\n className?: string;\n /** Placement of the dropdown panel */\n placement?: 'bottom-start' | 'bottom-end';\n /** Placeholder text for the search field */\n searchPlaceholder?: string;\n /** Label for accessibility — visually hidden */\n 'aria-label'?: string;\n}\n\n// =============================================================================\n// Country Data (generated from libphonenumber)\n// =============================================================================\n\n/** Convert an ISO alpha-2 code to an emoji flag. */\nfunction isoToEmoji(code: string): string {\n return [...code.toUpperCase()]\n .map((c) => String.fromCodePoint(0x1f1e6 - 65 + c.charCodeAt(0)))\n .join('');\n}\n\n/** Build the full sorted list of countries from libphonenumber. */\nfunction buildCountryList(): CountryData[] {\n const phoneUtil = PhoneNumberUtil.getInstance();\n const regions = phoneUtil.getSupportedRegions() as string[];\n const list: CountryData[] = regions.map((code: string) => {\n const callingCode = phoneUtil.getCountryCodeForRegion(code);\n return {\n code,\n name: regionDisplayName(code),\n dialCode: `+${callingCode}`,\n flag: isoToEmoji(code),\n };\n });\n list.sort((a, b) => a.name.localeCompare(b.name));\n return list;\n}\n\n/** Lazy singleton so we only build the list once. */\nlet _countries: CountryData[] | null = null;\nfunction getCountries(): CountryData[] {\n if (!_countries) _countries = buildCountryList();\n return _countries;\n}\n\n// =============================================================================\n// Region display name mapping\n// =============================================================================\n\n/** Lazy singleton for Intl.DisplayNames so we only construct it once. */\nlet _regionDisplayNames: Intl.DisplayNames | null = null;\n\nfunction getRegionDisplayNames(): Intl.DisplayNames | null {\n if (_regionDisplayNames === null) {\n try {\n const locales =\n typeof navigator !== 'undefined' && navigator.languages?.length\n ? [...navigator.languages]\n : ['en'];\n _regionDisplayNames = new Intl.DisplayNames(locales, { type: 'region' });\n } catch {\n return null;\n }\n }\n return _regionDisplayNames;\n}\n\n/**\n * Use the browser Intl API for display names where available,\n * falling back to the raw ISO code.\n */\nfunction regionDisplayName(code: string): string {\n const dn = getRegionDisplayNames();\n if (!dn) return code;\n return dn.of(code) ?? code;\n}\n\n// =============================================================================\n// Validation helper (exported for consumers)\n// =============================================================================\n\n/**\n * Validate a phone number string for a given country code using libphonenumber.\n *\n * @param phoneNumber - The phone number (digits, may include formatting)\n * @param countryCode - ISO alpha-2 code (e.g. \"US\")\n * @returns Whether the number is valid for the given region.\n */\nexport function validatePhoneNumber(\n phoneNumber: string,\n countryCode: string\n): boolean {\n try {\n const phoneUtil = PhoneNumberUtil.getInstance();\n const parsed = phoneUtil.parse(phoneNumber, countryCode);\n return phoneUtil.isValidNumberForRegion(parsed, countryCode);\n } catch {\n return false;\n }\n}\n\n/**\n * Format a phone number into E.164 international format.\n *\n * @param phoneNumber - The phone number (digits, may include formatting)\n * @param countryCode - ISO alpha-2 code (e.g. \"US\")\n * @returns The formatted number (e.g. \"+15551234567\") or the original string if parsing fails.\n */\nexport function formatE164(phoneNumber: string, countryCode: string): string {\n try {\n const phoneUtil = PhoneNumberUtil.getInstance();\n const parsed = phoneUtil.parse(phoneNumber, countryCode);\n return phoneUtil.format(parsed, PhoneNumberFormat.E164);\n } catch {\n return phoneNumber;\n }\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * A country-code selector dropdown designed to sit beside a phone number input.\n *\n * Defaults to United States (+1) with the 🇺🇸 flag. Clicking the trigger opens\n * a searchable list of all supported countries with their dial codes and flags.\n *\n * Uses Google's libphonenumber for the canonical country/code list and provides\n * a `validatePhoneNumber` helper for phone validation.\n *\n * @example\n * ```tsx\n * const [country, setCountry] = useState<CountryData>();\n *\n * <div className=\"flex gap-2\">\n * <CountryCodeDropdown value={country?.code} onChange={setCountry} />\n * <Input placeholder=\"Phone number\" />\n * </div>\n * ```\n */\nfunction CountryCodeDropdown({\n value,\n onChange,\n disabled = false,\n className,\n placement = 'bottom-start',\n searchPlaceholder = 'Search countries…',\n 'aria-label': ariaLabel = 'Select country code',\n}: CountryCodeDropdownProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [search, setSearch] = React.useState('');\n const [internalValue, setInternalValue] = React.useState(value ?? 'US');\n const containerRef = React.useRef<HTMLDivElement>(null);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLDivElement>(null);\n const menuId = React.useId();\n\n const isControlled = value !== undefined;\n const activeValue = isControlled ? value : internalValue;\n\n // Defer building the full country list until the dropdown is first opened\n const [countriesLoaded, setCountriesLoaded] = React.useState(false);\n const countries = React.useMemo(\n () => (countriesLoaded ? getCountries() : []),\n [countriesLoaded]\n );\n\n React.useEffect(() => {\n if (isOpen && !countriesLoaded) setCountriesLoaded(true);\n }, [isOpen, countriesLoaded]);\n\n const selected = React.useMemo(() => {\n if (countries.length) {\n return (\n countries.find((c) => c.code === activeValue) ??\n countries.find((c) => c.code === 'US')!\n );\n }\n // Lightweight fallback while list hasn't loaded yet\n return {\n code: activeValue ?? 'US',\n name: regionDisplayName(activeValue ?? 'US'),\n dialCode: `+${PhoneNumberUtil.getInstance().getCountryCodeForRegion(activeValue ?? 'US')}`,\n flag: isoToEmoji(activeValue ?? 'US'),\n };\n }, [activeValue, countries]);\n\n const filtered = React.useMemo(() => {\n if (!search) return countries;\n const q = search.toLowerCase();\n return countries.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.dialCode.includes(q) ||\n c.code.toLowerCase().includes(q)\n );\n }, [search, countries]);\n\n // Close helpers\n const close = React.useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n useClickOutside(containerRef, close);\n useEscapeKey(close, isOpen);\n\n // Focus search input when opening\n React.useEffect(() => {\n if (isOpen) {\n // Defer to let the DOM render\n requestAnimationFrame(() => searchInputRef.current?.focus());\n }\n }, [isOpen]);\n\n const handleToggle = React.useCallback(() => {\n if (!disabled) setIsOpen((prev) => !prev);\n }, [disabled]);\n\n const handleSelect = React.useCallback(\n (country: CountryData) => {\n if (!isControlled) {\n setInternalValue(country.code);\n }\n onChange?.(country);\n close();\n },\n [isControlled, onChange, close]\n );\n\n // Keyboard navigation inside the list\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if (!isOpen) return;\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n const items =\n listRef.current?.querySelectorAll<HTMLButtonElement>(\n '[role=\"option\"]'\n );\n if (!items?.length) return;\n\n const current = document.activeElement as HTMLElement;\n const idx = Array.from(items).indexOf(current as HTMLButtonElement);\n let next: number;\n if (e.key === 'ArrowDown') {\n next = idx < items.length - 1 ? idx + 1 : 0;\n } else {\n next = idx > 0 ? idx - 1 : items.length - 1;\n }\n items[next].focus();\n }\n },\n [isOpen]\n );\n\n const placementClass =\n placement === 'bottom-end'\n ? 'top-full right-0 mt-1'\n : 'top-full left-0 mt-1';\n\n return (\n <div\n ref={containerRef}\n data-slot=\"country-dropdown\"\n className=\"relative inline-flex\"\n >\n {/* Trigger button */}\n <button\n type=\"button\"\n data-slot=\"country-dropdown-trigger\"\n onClick={handleToggle}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? menuId : undefined}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg border px-3 py-2 text-sm',\n 'border-input bg-background text-foreground',\n 'transition-colors duration-200',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'focus:ring-ring focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n >\n <span\n data-slot=\"country-dropdown-flag\"\n className=\"text-base leading-none\"\n aria-hidden=\"true\"\n >\n {selected.flag}\n </span>\n <span data-slot=\"country-dropdown-dialcode\">{selected.dialCode}</span>\n <svg\n data-slot=\"country-dropdown-chevron\"\n className={cn(\n 'h-4 w-4 shrink-0 text-neutral-500 transition-transform duration-200',\n isOpen && 'rotate-180'\n )}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n {/* Dropdown panel */}\n {isOpen && (\n <div\n id={menuId}\n role=\"listbox\"\n data-slot=\"country-dropdown-panel\"\n aria-label={ariaLabel}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n className={cn(\n 'absolute z-50 w-72',\n 'rounded-xl border border-neutral-200 bg-white shadow-lg',\n 'dark:border-neutral-700 dark:bg-neutral-800',\n 'animate-in fade-in zoom-in-95 duration-100',\n placementClass\n )}\n >\n {/* Search input */}\n <div\n data-slot=\"country-dropdown-search\"\n className=\"border-b border-neutral-200 p-2 dark:border-neutral-700\"\n >\n <input\n ref={searchInputRef}\n type=\"text\"\n data-slot=\"country-dropdown-search-input\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={searchPlaceholder}\n aria-label=\"Search countries\"\n className={cn(\n 'w-full rounded-lg border border-neutral-200 px-3 py-1.5 text-sm',\n 'text-foreground placeholder:text-muted-foreground bg-white',\n 'focus:ring-ring focus:border-transparent focus:ring-2 focus:outline-none',\n 'dark:border-neutral-600 dark:bg-neutral-700 dark:text-neutral-100'\n )}\n />\n </div>\n\n {/* Country list */}\n <div\n ref={listRef}\n data-slot=\"country-dropdown-list\"\n className=\"max-h-60 overflow-y-auto p-1\"\n >\n {filtered.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-4 text-center text-sm\">\n No countries found\n </div>\n ) : (\n filtered.map((country) => (\n <button\n key={country.code}\n type=\"button\"\n role=\"option\"\n data-slot=\"country-dropdown-option\"\n aria-selected={country.code === selected.code}\n onClick={() => handleSelect(country)}\n className={cn(\n 'flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-sm',\n 'transition-colors duration-150',\n 'focus:outline-none',\n country.code === selected.code\n ? 'bg-neutral-100 font-medium text-neutral-900 dark:bg-neutral-700 dark:text-white'\n : 'text-neutral-700 hover:bg-neutral-50 dark:text-neutral-300 dark:hover:bg-neutral-700/50',\n 'focus:bg-neutral-100 dark:focus:bg-neutral-700'\n )}\n >\n <span\n data-slot=\"country-dropdown-option-flag\"\n className=\"text-base leading-none\"\n aria-hidden=\"true\"\n >\n {country.flag}\n </span>\n <span\n data-slot=\"country-dropdown-option-name\"\n className=\"flex-1 truncate\"\n >\n {country.name}\n </span>\n <span\n data-slot=\"country-dropdown-option-dialcode\"\n className=\"text-muted-foreground shrink-0 text-xs\"\n >\n {country.dialCode}\n </span>\n </button>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nCountryCodeDropdown.displayName = 'CountryCodeDropdown';\n\nexport { CountryCodeDropdown };\n"]}
1
+ {"version":3,"sources":["../src/components/CountryCodeDropdown/CountryCodeDropdown.tsx"],"names":["PhoneNumberUtil","PhoneNumberFormat"],"mappings":"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","file":"chunk-WFS6R2F5.js","sourcesContent":["import * as React from 'react';\nimport * as libphonenumber from 'google-libphonenumber';\nimport { cn } from '../../utils/cn';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\nconst PhoneNumberUtil =\n (libphonenumber as unknown as { default?: typeof libphonenumber }).default\n ?.PhoneNumberUtil ?? libphonenumber.PhoneNumberUtil;\nconst PhoneNumberFormat =\n (libphonenumber as unknown as { default?: typeof libphonenumber }).default\n ?.PhoneNumberFormat ?? libphonenumber.PhoneNumberFormat;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface CountryData {\n /** ISO 3166-1 alpha-2 country code (e.g. \"US\") */\n code: string;\n /** Country name (e.g. \"United States\") */\n name: string;\n /** Dial code (e.g. \"+1\") */\n dialCode: string;\n /** Emoji flag (e.g. \"🇺🇸\") */\n flag: string;\n}\n\nexport interface CountryCodeDropdownProps {\n /** The currently selected country code (ISO alpha-2, e.g. \"US\") */\n value?: string;\n /** Called when a country is selected */\n onChange?: (country: CountryData) => void;\n /** Whether the dropdown is disabled */\n disabled?: boolean;\n /** Additional class name for the trigger button */\n className?: string;\n /** Placement of the dropdown panel */\n placement?: 'bottom-start' | 'bottom-end';\n /** Placeholder text for the search field */\n searchPlaceholder?: string;\n /** Label for accessibility — visually hidden */\n 'aria-label'?: string;\n}\n\n// =============================================================================\n// Country Data (generated from libphonenumber)\n// =============================================================================\n\n/** Convert an ISO alpha-2 code to an emoji flag. */\nfunction isoToEmoji(code: string): string {\n return [...code.toUpperCase()]\n .map((c) => String.fromCodePoint(0x1f1e6 - 65 + c.charCodeAt(0)))\n .join('');\n}\n\n/** Build the full sorted list of countries from libphonenumber. */\nfunction buildCountryList(): CountryData[] {\n const phoneUtil = PhoneNumberUtil.getInstance();\n const regions = phoneUtil.getSupportedRegions() as string[];\n const list: CountryData[] = regions.map((code: string) => {\n const callingCode = phoneUtil.getCountryCodeForRegion(code);\n return {\n code,\n name: regionDisplayName(code),\n dialCode: `+${callingCode}`,\n flag: isoToEmoji(code),\n };\n });\n list.sort((a, b) => a.name.localeCompare(b.name));\n return list;\n}\n\n/** Lazy singleton so we only build the list once. */\nlet _countries: CountryData[] | null = null;\nfunction getCountries(): CountryData[] {\n if (!_countries) _countries = buildCountryList();\n return _countries;\n}\n\n// =============================================================================\n// Region display name mapping\n// =============================================================================\n\n/** Lazy singleton for Intl.DisplayNames so we only construct it once. */\nlet _regionDisplayNames: Intl.DisplayNames | null = null;\n\nfunction getRegionDisplayNames(): Intl.DisplayNames | null {\n if (_regionDisplayNames === null) {\n try {\n const locales =\n typeof navigator !== 'undefined' && navigator.languages?.length\n ? [...navigator.languages]\n : ['en'];\n _regionDisplayNames = new Intl.DisplayNames(locales, { type: 'region' });\n } catch {\n return null;\n }\n }\n return _regionDisplayNames;\n}\n\n/**\n * Use the browser Intl API for display names where available,\n * falling back to the raw ISO code.\n */\nfunction regionDisplayName(code: string): string {\n const dn = getRegionDisplayNames();\n if (!dn) return code;\n return dn.of(code) ?? code;\n}\n\n// =============================================================================\n// Validation helper (exported for consumers)\n// =============================================================================\n\n/**\n * Validate a phone number string for a given country code using libphonenumber.\n *\n * @param phoneNumber - The phone number (digits, may include formatting)\n * @param countryCode - ISO alpha-2 code (e.g. \"US\")\n * @returns Whether the number is valid for the given region.\n */\nexport function validatePhoneNumber(\n phoneNumber: string,\n countryCode: string\n): boolean {\n try {\n const phoneUtil = PhoneNumberUtil.getInstance();\n const parsed = phoneUtil.parse(phoneNumber, countryCode);\n return phoneUtil.isValidNumberForRegion(parsed, countryCode);\n } catch {\n return false;\n }\n}\n\n/**\n * Format a phone number into E.164 international format.\n *\n * @param phoneNumber - The phone number (digits, may include formatting)\n * @param countryCode - ISO alpha-2 code (e.g. \"US\")\n * @returns The formatted number (e.g. \"+15551234567\") or the original string if parsing fails.\n */\nexport function formatE164(phoneNumber: string, countryCode: string): string {\n try {\n const phoneUtil = PhoneNumberUtil.getInstance();\n const parsed = phoneUtil.parse(phoneNumber, countryCode);\n return phoneUtil.format(parsed, PhoneNumberFormat.E164);\n } catch {\n return phoneNumber;\n }\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * A country-code selector dropdown designed to sit beside a phone number input.\n *\n * Defaults to United States (+1) with the 🇺🇸 flag. Clicking the trigger opens\n * a searchable list of all supported countries with their dial codes and flags.\n *\n * Uses Google's libphonenumber for the canonical country/code list and provides\n * a `validatePhoneNumber` helper for phone validation.\n *\n * @example\n * ```tsx\n * const [country, setCountry] = useState<CountryData>();\n *\n * <div className=\"flex gap-2\">\n * <CountryCodeDropdown value={country?.code} onChange={setCountry} />\n * <Input placeholder=\"Phone number\" />\n * </div>\n * ```\n */\nfunction CountryCodeDropdown({\n value,\n onChange,\n disabled = false,\n className,\n placement = 'bottom-start',\n searchPlaceholder = 'Search countries…',\n 'aria-label': ariaLabel = 'Select country code',\n}: CountryCodeDropdownProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [search, setSearch] = React.useState('');\n const [internalValue, setInternalValue] = React.useState(value ?? 'US');\n const containerRef = React.useRef<HTMLDivElement>(null);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLDivElement>(null);\n const menuId = React.useId();\n\n const isControlled = value !== undefined;\n const activeValue = isControlled ? value : internalValue;\n\n // Defer building the full country list until the dropdown is first opened\n const [countriesLoaded, setCountriesLoaded] = React.useState(false);\n const countries = React.useMemo(\n () => (countriesLoaded ? getCountries() : []),\n [countriesLoaded]\n );\n\n React.useEffect(() => {\n if (isOpen && !countriesLoaded) setCountriesLoaded(true);\n }, [isOpen, countriesLoaded]);\n\n const selected = React.useMemo(() => {\n if (countries.length) {\n return (\n countries.find((c) => c.code === activeValue) ??\n countries.find((c) => c.code === 'US')!\n );\n }\n // Lightweight fallback while list hasn't loaded yet\n return {\n code: activeValue ?? 'US',\n name: regionDisplayName(activeValue ?? 'US'),\n dialCode: `+${PhoneNumberUtil.getInstance().getCountryCodeForRegion(activeValue ?? 'US')}`,\n flag: isoToEmoji(activeValue ?? 'US'),\n };\n }, [activeValue, countries]);\n\n const filtered = React.useMemo(() => {\n if (!search) return countries;\n const q = search.toLowerCase();\n return countries.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.dialCode.includes(q) ||\n c.code.toLowerCase().includes(q)\n );\n }, [search, countries]);\n\n // Close helpers\n const close = React.useCallback(() => {\n setIsOpen(false);\n setSearch('');\n }, []);\n\n useClickOutside(containerRef, close);\n useEscapeKey(close, isOpen);\n\n // Focus search input when opening\n React.useEffect(() => {\n if (isOpen) {\n // Defer to let the DOM render\n requestAnimationFrame(() => searchInputRef.current?.focus());\n }\n }, [isOpen]);\n\n const handleToggle = React.useCallback(() => {\n if (!disabled) setIsOpen((prev) => !prev);\n }, [disabled]);\n\n const handleSelect = React.useCallback(\n (country: CountryData) => {\n if (!isControlled) {\n setInternalValue(country.code);\n }\n onChange?.(country);\n close();\n },\n [isControlled, onChange, close]\n );\n\n // Keyboard navigation inside the list\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if (!isOpen) return;\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n const items =\n listRef.current?.querySelectorAll<HTMLButtonElement>(\n '[role=\"option\"]'\n );\n if (!items?.length) return;\n\n const current = document.activeElement as HTMLElement;\n const idx = Array.from(items).indexOf(current as HTMLButtonElement);\n let next: number;\n if (e.key === 'ArrowDown') {\n next = idx < items.length - 1 ? idx + 1 : 0;\n } else {\n next = idx > 0 ? idx - 1 : items.length - 1;\n }\n items[next].focus();\n }\n },\n [isOpen]\n );\n\n const placementClass =\n placement === 'bottom-end'\n ? 'top-full right-0 mt-1'\n : 'top-full left-0 mt-1';\n\n return (\n <div\n ref={containerRef}\n data-slot=\"country-dropdown\"\n className=\"relative inline-flex\"\n >\n {/* Trigger button */}\n <button\n type=\"button\"\n data-slot=\"country-dropdown-trigger\"\n onClick={handleToggle}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? menuId : undefined}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg border px-3 py-2 text-sm',\n 'border-input bg-background text-foreground',\n 'transition-colors duration-200',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'focus:ring-ring focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n >\n <span\n data-slot=\"country-dropdown-flag\"\n className=\"text-base leading-none\"\n aria-hidden=\"true\"\n >\n {selected.flag}\n </span>\n <span data-slot=\"country-dropdown-dialcode\">{selected.dialCode}</span>\n <svg\n data-slot=\"country-dropdown-chevron\"\n className={cn(\n 'h-4 w-4 shrink-0 text-neutral-500 transition-transform duration-200',\n isOpen && 'rotate-180'\n )}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n {/* Dropdown panel */}\n {isOpen && (\n <div\n id={menuId}\n role=\"listbox\"\n data-slot=\"country-dropdown-panel\"\n aria-label={ariaLabel}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n className={cn(\n 'absolute z-50 w-72',\n 'rounded-xl border border-neutral-200 bg-white shadow-lg',\n 'dark:border-neutral-700 dark:bg-neutral-800',\n 'animate-in fade-in zoom-in-95 duration-100',\n placementClass\n )}\n >\n {/* Search input */}\n <div\n data-slot=\"country-dropdown-search\"\n className=\"border-b border-neutral-200 p-2 dark:border-neutral-700\"\n >\n <input\n ref={searchInputRef}\n type=\"text\"\n data-slot=\"country-dropdown-search-input\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={searchPlaceholder}\n aria-label=\"Search countries\"\n className={cn(\n 'w-full rounded-lg border border-neutral-200 px-3 py-1.5 text-sm',\n 'text-foreground placeholder:text-muted-foreground bg-white',\n 'focus:ring-ring focus:border-transparent focus:ring-2 focus:outline-none',\n 'dark:border-neutral-600 dark:bg-neutral-700 dark:text-neutral-100'\n )}\n />\n </div>\n\n {/* Country list */}\n <div\n ref={listRef}\n data-slot=\"country-dropdown-list\"\n className=\"max-h-60 overflow-y-auto p-1\"\n >\n {filtered.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-4 text-center text-sm\">\n No countries found\n </div>\n ) : (\n filtered.map((country) => (\n <button\n key={country.code}\n type=\"button\"\n role=\"option\"\n data-slot=\"country-dropdown-option\"\n aria-selected={country.code === selected.code}\n onClick={() => handleSelect(country)}\n className={cn(\n 'flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-sm',\n 'transition-colors duration-150',\n 'focus:outline-none',\n country.code === selected.code\n ? 'bg-neutral-100 font-medium text-neutral-900 dark:bg-neutral-700 dark:text-white'\n : 'text-neutral-700 hover:bg-neutral-50 dark:text-neutral-300 dark:hover:bg-neutral-700/50',\n 'focus:bg-neutral-100 dark:focus:bg-neutral-700'\n )}\n >\n <span\n data-slot=\"country-dropdown-option-flag\"\n className=\"text-base leading-none\"\n aria-hidden=\"true\"\n >\n {country.flag}\n </span>\n <span\n data-slot=\"country-dropdown-option-name\"\n className=\"flex-1 truncate\"\n >\n {country.name}\n </span>\n <span\n data-slot=\"country-dropdown-option-dialcode\"\n className=\"text-muted-foreground shrink-0 text-xs\"\n >\n {country.dialCode}\n </span>\n </button>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nCountryCodeDropdown.displayName = 'CountryCodeDropdown';\n\nexport { CountryCodeDropdown };\n"]}
@@ -0,0 +1,192 @@
1
+ // src/components/HealthSurveillance/evaluate.ts
2
+ function normalizeOrders(orders) {
3
+ return (orders ?? []).map(
4
+ (o) => typeof o === "string" ? { keys: [o], after: [] } : { keys: o.alt ?? (o.key ? [o.key] : []), after: o.after ?? [] }
5
+ ).filter((s) => s.keys.length > 0);
6
+ }
7
+ function flattenOrderKeys(orders) {
8
+ return normalizeOrders(orders).flatMap((s) => s.keys);
9
+ }
10
+ function completedKeys(history) {
11
+ const done = /* @__PURE__ */ new Set();
12
+ for (const o of history.orders) {
13
+ if (o.status === "completed") done.add(o.key);
14
+ }
15
+ for (const p of history.procedures ?? []) done.add(p.key);
16
+ for (const i of history.immunizations ?? []) done.add(i.key);
17
+ return done;
18
+ }
19
+ function addMonths(iso, months) {
20
+ const [y, m, d] = iso.slice(0, 10).split("-").map(Number);
21
+ const total = m - 1 + months;
22
+ const ty = y + Math.floor(total / 12);
23
+ const tm = (total % 12 + 12) % 12;
24
+ const lastDay = new Date(Date.UTC(ty, tm + 1, 0)).getUTCDate();
25
+ return new Date(Date.UTC(ty, tm, Math.min(d, lastDay))).toISOString().slice(0, 10);
26
+ }
27
+ function isApplicable(history, program) {
28
+ if (program.sex && program.sex !== history.sex) return false;
29
+ if (program.ageMin !== void 0 && history.age < program.ageMin)
30
+ return false;
31
+ if (program.ageMax !== void 0 && history.age > program.ageMax)
32
+ return false;
33
+ return true;
34
+ }
35
+ function evaluateProgram(key, program, history, now = /* @__PURE__ */ new Date()) {
36
+ const base = { key, program, pendingKeys: [] };
37
+ if (!isApplicable(history, program)) {
38
+ return { ...base, status: "not-applicable" };
39
+ }
40
+ const satisfying = new Set(flattenOrderKeys(program.orders));
41
+ const completions = [];
42
+ for (const o of history.orders) {
43
+ if (!satisfying.has(o.key)) continue;
44
+ if (o.status === "completed") completions.push(o.date);
45
+ else base.pendingKeys.push(o.key);
46
+ }
47
+ for (const p of history.procedures ?? []) {
48
+ if (satisfying.has(p.key)) completions.push(p.date);
49
+ }
50
+ for (const i of history.immunizations ?? []) {
51
+ if (satisfying.has(i.key)) completions.push(i.date);
52
+ }
53
+ const lastCompleted = completions.sort().at(-1);
54
+ if (!lastCompleted) {
55
+ return base.pendingKeys.length > 0 ? { ...base, status: "pending" } : { ...base, status: "due" };
56
+ }
57
+ if (program.periodicityMonths === void 0) {
58
+ return { ...base, status: "satisfied", lastCompleted };
59
+ }
60
+ const dueDate = addMonths(lastCompleted, program.periodicityMonths);
61
+ if (dueDate > now.toISOString().slice(0, 10)) {
62
+ return { ...base, status: "satisfied", lastCompleted, dueDate };
63
+ }
64
+ return base.pendingKeys.length > 0 ? { ...base, status: "pending", lastCompleted, dueDate } : { ...base, status: "overdue", lastCompleted, dueDate };
65
+ }
66
+ function evaluateDue(history, programs, options) {
67
+ const enrolled = options?.enrolledKeys ? new Set(options.enrolledKeys) : null;
68
+ const now = options?.now ?? /* @__PURE__ */ new Date();
69
+ const items = [];
70
+ for (const [key, program] of Object.entries(programs)) {
71
+ if (enrolled && program.kind !== "quality" && !enrolled.has(key)) continue;
72
+ const item = evaluateProgram(key, program, history, now);
73
+ if (item.status === "not-applicable" && !options?.includeNotApplicable)
74
+ continue;
75
+ items.push(item);
76
+ }
77
+ const rank = {
78
+ overdue: 0,
79
+ due: 1,
80
+ pending: 2,
81
+ satisfied: 3,
82
+ "not-applicable": 4
83
+ };
84
+ return items.sort(
85
+ (a, b) => rank[a.status] - rank[b.status] || (a.dueDate ?? "").localeCompare(b.dueDate ?? "") || a.key.localeCompare(b.key)
86
+ );
87
+ }
88
+ function dueForOrder(orderKey, dueItems) {
89
+ return dueItems.filter(
90
+ (i) => (i.status === "due" || i.status === "overdue") && flattenOrderKeys(i.program.orders).includes(orderKey)
91
+ );
92
+ }
93
+
94
+ // src/components/HealthSurveillance/orderRows.ts
95
+ var KIND_LABEL = {
96
+ surveillance: "surveillance",
97
+ fitness: "fitness for duty",
98
+ credential: "credential",
99
+ quality: "quality measure"
100
+ };
101
+ function labelLookup(history, orderLabels) {
102
+ const m = /* @__PURE__ */ new Map();
103
+ const scan = (list) => {
104
+ for (const e of list ?? []) {
105
+ if (e.key && e.label && !m.has(e.key)) m.set(e.key, e.label);
106
+ }
107
+ };
108
+ scan(history.orders);
109
+ scan(history.observations);
110
+ scan(history.procedures);
111
+ scan(history.immunizations);
112
+ return (key) => orderLabels?.[key] ?? m.get(key) ?? key;
113
+ }
114
+ function reasonIndex(items) {
115
+ const idx = /* @__PURE__ */ new Map();
116
+ for (const item of items) {
117
+ for (const spec of normalizeOrders(item.program.orders)) {
118
+ for (const k of spec.keys) {
119
+ if (!idx.has(k)) idx.set(k, item);
120
+ }
121
+ }
122
+ }
123
+ return idx;
124
+ }
125
+ function buildChartOrderRows(history, programs, options = {}) {
126
+ const {
127
+ enrolledKeys,
128
+ now,
129
+ programLabels,
130
+ orderLabels,
131
+ includeDue = true
132
+ } = options;
133
+ const items = evaluateDue(history, programs, { enrolledKeys, now });
134
+ const byOrderKey = reasonIndex(items);
135
+ const orderLabel = labelLookup(history, orderLabels);
136
+ const programLabel = (key) => programLabels?.[key] ?? key;
137
+ const completed = completedKeys(history);
138
+ const rows = [];
139
+ const reasonFields = (item) => ({
140
+ reason: item ? programLabel(item.key) : "",
141
+ reasonKey: item?.key ?? "",
142
+ kind: item?.program.kind ? KIND_LABEL[item.program.kind] ?? item.program.kind : "",
143
+ dueDate: item?.dueDate?.slice(0, 10) ?? ""
144
+ });
145
+ for (const o of history.orders) {
146
+ rows.push({
147
+ orderKey: o.key,
148
+ order: orderLabel(o.key),
149
+ ...reasonFields(byOrderKey.get(o.key)),
150
+ status: o.status,
151
+ date: o.date.slice(0, 10),
152
+ provider: o.provider ?? "",
153
+ requisitionId: o.requisitionId ?? "",
154
+ encounterId: o.encounterId ?? "",
155
+ blockedBy: ""
156
+ });
157
+ }
158
+ if (includeDue) {
159
+ const placed = new Set(history.orders.map((o) => o.key));
160
+ for (const item of items) {
161
+ if (item.status === "satisfied" || item.status === "not-applicable")
162
+ continue;
163
+ for (const spec of normalizeOrders(item.program.orders)) {
164
+ const unmet = spec.after.filter((k) => !completed.has(k));
165
+ for (const k of spec.keys) {
166
+ if (placed.has(k)) continue;
167
+ rows.push({
168
+ orderKey: k,
169
+ order: orderLabel(k),
170
+ ...reasonFields(item),
171
+ status: unmet.length > 0 ? "blocked" : "available",
172
+ date: "",
173
+ provider: "",
174
+ requisitionId: "",
175
+ encounterId: "",
176
+ blockedBy: unmet.map(orderLabel).join(", ")
177
+ });
178
+ }
179
+ }
180
+ }
181
+ }
182
+ return rows;
183
+ }
184
+ function buildEncounterOrderRows(history, programs, encounterId, options = {}) {
185
+ return buildChartOrderRows(history, programs, options).filter(
186
+ (r) => r.encounterId === encounterId || r.status === "available" || r.status === "blocked"
187
+ );
188
+ }
189
+
190
+ export { buildChartOrderRows, buildEncounterOrderRows, completedKeys, dueForOrder, evaluateDue, evaluateProgram, isApplicable, normalizeOrders };
191
+ //# sourceMappingURL=chunk-Y5KEFV5O.js.map
192
+ //# sourceMappingURL=chunk-Y5KEFV5O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/HealthSurveillance/evaluate.ts","../src/components/HealthSurveillance/orderRows.ts"],"names":[],"mappings":";AAmCO,SAAS,gBAAgB,MAAA,EAAsC;AACpE,EAAA,OAAA,CAAQ,MAAA,IAAU,EAAC,EAChB,GAAA;AAAA,IAAI,CAAC,CAAA,KACJ,OAAO,CAAA,KAAM,QAAA,GACT,EAAE,IAAA,EAAM,CAAC,CAAC,CAAA,EAAG,KAAA,EAAO,IAAG,GACvB,EAAE,IAAA,EAAM,CAAA,CAAE,GAAA,KAAQ,CAAA,CAAE,GAAA,GAAM,CAAC,CAAA,CAAE,GAAG,CAAA,GAAI,EAAC,CAAA,EAAI,KAAA,EAAO,CAAA,CAAE,KAAA,IAAS,EAAC;AAAE,IAEnE,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AACpC;AAGO,SAAS,iBAAiB,MAAA,EAAmC;AAClE,EAAA,OAAO,gBAAgB,MAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACtD;AAIO,SAAS,cAAc,OAAA,EAAsC;AAClE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,MAAA,EAAQ;AAC9B,IAAA,IAAI,EAAE,MAAA,KAAW,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,CAAA;AAAA,EAC9C;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,UAAA,IAAc,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,CAAA;AACxD,EAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,aAAA,IAAiB,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,CAAA;AAC3D,EAAA,OAAO,IAAA;AACT;AAwCA,SAAS,SAAA,CAAU,KAAa,MAAA,EAAwB;AACtD,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,IAAI,CAAA,GAAI,MAAA;AACtB,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,EAAE,CAAA;AACpC,EAAA,MAAM,EAAA,GAAA,CAAO,KAAA,GAAQ,EAAA,GAAM,EAAA,IAAM,EAAA;AAEjC,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,UAAA,EAAW;AAC7D,EAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAC,CAAA,CACnD,aAAY,CACZ,KAAA,CAAM,GAAG,EAAE,CAAA;AAChB;AAGO,SAAS,YAAA,CACd,SACA,OAAA,EACS;AACT,EAAA,IAAI,QAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,KAAQ,OAAA,CAAQ,KAAK,OAAO,KAAA;AACvD,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,IAAa,OAAA,CAAQ,MAAM,OAAA,CAAQ,MAAA;AACxD,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,IAAa,OAAA,CAAQ,MAAM,OAAA,CAAQ,MAAA;AACxD,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,gBACd,GAAA,EACA,OAAA,EACA,SACA,GAAA,mBAAY,IAAI,MAAK,EACZ;AACT,EAAA,MAAM,OAAO,EAAE,GAAA,EAAK,OAAA,EAAS,WAAA,EAAa,EAAC,EAAc;AACzD,EAAA,IAAI,CAAC,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA,EAAG;AACnC,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,gBAAA,EAAiB;AAAA,EAC7C;AAEA,EAAA,MAAM,aAAa,IAAI,GAAA,CAAI,gBAAA,CAAiB,OAAA,CAAQ,MAAM,CAAC,CAAA;AAG3D,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,MAAA,EAAQ;AAC9B,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,EAAG;AAC5B,IAAA,IAAI,EAAE,MAAA,KAAW,WAAA,EAAa,WAAA,CAAY,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,SAChD,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA;AAAA,EAClC;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,UAAA,IAAc,EAAC,EAAG;AACxC,IAAA,IAAI,UAAA,CAAW,IAAI,CAAA,CAAE,GAAG,GAAG,WAAA,CAAY,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,EACpD;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,aAAA,IAAiB,EAAC,EAAG;AAC3C,IAAA,IAAI,UAAA,CAAW,IAAI,CAAA,CAAE,GAAG,GAAG,WAAA,CAAY,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,IAAA,EAAK,CAAE,GAAG,EAAE,CAAA;AAE9C,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,GAC7B,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAU,GAC7B,EAAE,GAAG,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,EAC/B;AAGA,EAAA,IAAI,OAAA,CAAQ,sBAAsB,MAAA,EAAW;AAC3C,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,aAAa,aAAA,EAAc;AAAA,EACvD;AAEA,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,aAAA,EAAe,OAAA,CAAQ,iBAAiB,CAAA;AAClE,EAAA,IAAI,UAAU,GAAA,CAAI,WAAA,GAAc,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG;AAC5C,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,eAAe,OAAA,EAAQ;AAAA,EAChE;AACA,EAAA,OAAO,KAAK,WAAA,CAAY,MAAA,GAAS,IAC7B,EAAE,GAAG,MAAM,MAAA,EAAQ,SAAA,EAAW,aAAA,EAAe,OAAA,KAC7C,EAAE,GAAG,MAAM,MAAA,EAAQ,SAAA,EAAW,eAAe,OAAA,EAAQ;AAC3D;AAWO,SAAS,WAAA,CACd,OAAA,EACA,QAAA,EACA,OAAA,EAKW;AACX,EAAA,MAAM,WAAW,OAAA,EAAS,YAAA,GAAe,IAAI,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA,GAAI,IAAA;AACzE,EAAA,MAAM,GAAA,GAAM,OAAA,EAAS,GAAA,oBAAO,IAAI,IAAA,EAAK;AACrC,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrD,IAAA,IAAI,QAAA,IAAY,QAAQ,IAAA,KAAS,SAAA,IAAa,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AAClE,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,GAAA,EAAK,OAAA,EAAS,SAAS,GAAG,CAAA;AACvD,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,gBAAA,IAAoB,CAAC,OAAA,EAAS,oBAAA;AAChD,MAAA;AACF,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AACA,EAAA,MAAM,IAAA,GAAkC;AAAA,IACtC,OAAA,EAAS,CAAA;AAAA,IACT,GAAA,EAAK,CAAA;AAAA,IACL,OAAA,EAAS,CAAA;AAAA,IACT,SAAA,EAAW,CAAA;AAAA,IACX,gBAAA,EAAkB;AAAA,GACpB;AACA,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACX,CAAC,GAAG,CAAA,KACF,IAAA,CAAK,EAAE,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,MAAM,CAAA,IAAA,CAC7B,EAAE,OAAA,IAAW,EAAA,EAAI,aAAA,CAAc,CAAA,CAAE,OAAA,IAAW,EAAE,KAC/C,CAAA,CAAE,GAAA,CAAI,aAAA,CAAc,CAAA,CAAE,GAAG;AAAA,GAC7B;AACF;AAOO,SAAS,WAAA,CAAY,UAAkB,QAAA,EAAgC;AAC5E,EAAA,OAAO,QAAA,CAAS,MAAA;AAAA,IACd,CAAC,CAAA,KAAA,CACE,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA,KAAW,SAAA,KACpC,gBAAA,CAAiB,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,CAAE,SAAS,QAAQ;AAAA,GACxD;AACF;;;ACrKA,IAAM,UAAA,GAAqC;AAAA,EACzC,YAAA,EAAc,cAAA;AAAA,EACd,OAAA,EAAS,kBAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAMA,SAAS,WAAA,CACP,SACA,WAAA,EACyB;AACzB,EAAA,MAAM,CAAA,uBAAQ,GAAA,EAAoB;AAClC,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAA8C;AAC1D,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,IAAQ,EAAC,EAAG;AAC1B,MAAA,IAAI,CAAA,CAAE,GAAA,IAAO,CAAA,CAAE,KAAA,IAAS,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,GAAG,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,EAAE,KAAK,CAAA;AAAA,IAC7D;AAAA,EACF,CAAA;AACA,EAAA,IAAA,CAAK,QAAQ,MAAM,CAAA;AACnB,EAAA,IAAA,CAAK,QAAQ,YAAY,CAAA;AACzB,EAAA,IAAA,CAAK,QAAQ,UAAU,CAAA;AACvB,EAAA,IAAA,CAAK,QAAQ,aAAa,CAAA;AAC1B,EAAA,OAAO,CAAC,QAAQ,WAAA,GAAc,GAAG,KAAK,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA;AACtD;AAIA,SAAS,YAAY,KAAA,EAAwC;AAC3D,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAqB;AACrC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,MAAW,IAAA,IAAQ,eAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,EAAG;AACvD,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,IAAA,EAAM;AACzB,QAAA,IAAI,CAAC,IAAI,GAAA,CAAI,CAAC,GAAG,GAAA,CAAI,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAWO,SAAS,mBAAA,CACd,OAAA,EACA,QAAA,EACA,OAAA,GAA4B,EAAC,EACjB;AACZ,EAAA,MAAM;AAAA,IACJ,YAAA;AAAA,IACA,GAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,QAAQ,WAAA,CAAY,OAAA,EAAS,UAAU,EAAE,YAAA,EAAc,KAAK,CAAA;AAClE,EAAA,MAAM,UAAA,GAAa,YAAY,KAAK,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,OAAA,EAAS,WAAW,CAAA;AACnD,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAAgB,aAAA,GAAgB,GAAG,CAAA,IAAK,GAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,cAAc,OAAO,CAAA;AAEvC,EAAA,MAAM,OAAmB,EAAC;AAE1B,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,MAAoB;AAAA,IACxC,MAAA,EAAQ,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,GAAI,EAAA;AAAA,IACxC,SAAA,EAAW,MAAM,GAAA,IAAO,EAAA;AAAA,IACxB,IAAA,EAAM,IAAA,EAAM,OAAA,CAAQ,IAAA,GACf,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,GAC/C,EAAA;AAAA,IACJ,SAAS,IAAA,EAAM,OAAA,EAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK;AAAA,GAC1C,CAAA;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,MAAA,EAAQ;AAC9B,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,UAAU,CAAA,CAAE,GAAA;AAAA,MACZ,KAAA,EAAO,UAAA,CAAW,CAAA,CAAE,GAAG,CAAA;AAAA,MACvB,GAAG,YAAA,CAAa,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,MACrC,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,MACxB,QAAA,EAAU,EAAE,QAAA,IAAY,EAAA;AAAA,MACxB,aAAA,EAAe,EAAE,aAAA,IAAiB,EAAA;AAAA,MAClC,WAAA,EAAa,EAAE,WAAA,IAAe,EAAA;AAAA,MAC9B,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,CAAC,CAAA;AACvD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,MAAA,KAAW,gBAAA;AACjD,QAAA;AACF,MAAA,KAAA,MAAW,IAAA,IAAQ,eAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,EAAG;AACvD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,MAAM,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAC,CAAA;AACxD,QAAA,KAAA,MAAW,CAAA,IAAK,KAAK,IAAA,EAAM;AACzB,UAAA,IAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG;AACnB,UAAA,IAAA,CAAK,IAAA,CAAK;AAAA,YACR,QAAA,EAAU,CAAA;AAAA,YACV,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,YACnB,GAAG,aAAa,IAAI,CAAA;AAAA,YACpB,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,WAAA;AAAA,YACvC,IAAA,EAAM,EAAA;AAAA,YACN,QAAA,EAAU,EAAA;AAAA,YACV,aAAA,EAAe,EAAA;AAAA,YACf,WAAA,EAAa,EAAA;AAAA,YACb,WAAW,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,CAAE,KAAK,IAAI;AAAA,WAC3C,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,wBACd,OAAA,EACA,QAAA,EACA,WAAA,EACA,OAAA,GAA4B,EAAC,EACjB;AACZ,EAAA,OAAO,mBAAA,CAAoB,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA,CAAE,MAAA;AAAA,IACrD,CAAC,MACC,CAAA,CAAE,WAAA,KAAgB,eAClB,CAAA,CAAE,MAAA,KAAW,WAAA,IACb,CAAA,CAAE,MAAA,KAAW;AAAA,GACjB;AACF","file":"chunk-Y5KEFV5O.js","sourcesContent":["/**\n * Due-evaluation engine — the \"knowledge\" layer of health surveillance.\n * Given a patient's history and the program metadata (programs.json from\n * mieweb/codify, or a deployment's own), decides which programs/measures are\n * due, overdue, pending, or satisfied. Pure functions, no I/O — the metadata\n * is small, so this runs on the main thread.\n */\n\nimport type { PatientHistory } from './history';\n\n/**\n * One entry in a program's order set:\n * - `\"CODETYPE|FULLCODE\"` — a plain required order\n * - `{ alt: [a, b] }` — mutually exclusive alternatives (one-of): a\n * colonoscopy OR a FIT satisfies colorectal screening\n * - `{ key, after: […] }` — depends on completed prerequisites (Gantt edge):\n * the RMO's fitness-for-duty determination needs the panel results first,\n * and a program may carry several determinations (per panel / per SEG)\n */\nexport type ProgramOrder =\n | string\n | {\n key?: string;\n alt?: string[];\n after?: string[];\n };\n\n/** Normalized order entry: alternative keys + prerequisite keys. */\nexport interface OrderSpec {\n /** Alternatives — exactly one should be ordered */\n keys: string[];\n /** Order keys that must be completed before this one can be performed */\n after: string[];\n}\n\nexport function normalizeOrders(orders?: ProgramOrder[]): OrderSpec[] {\n return (orders ?? [])\n .map((o) =>\n typeof o === 'string'\n ? { keys: [o], after: [] }\n : { keys: o.alt ?? (o.key ? [o.key] : []), after: o.after ?? [] }\n )\n .filter((s) => s.keys.length > 0);\n}\n\n/** Every key that can satisfy/appear in the program's order set. */\nexport function flattenOrderKeys(orders?: ProgramOrder[]): string[] {\n return normalizeOrders(orders).flatMap((s) => s.keys);\n}\n\n/** Keys of everything completed in the history (orders, procedures,\n * immunizations) — used to unlock dependent orders. */\nexport function completedKeys(history: PatientHistory): Set<string> {\n const done = new Set<string>();\n for (const o of history.orders) {\n if (o.status === 'completed') done.add(o.key);\n }\n for (const p of history.procedures ?? []) done.add(p.key);\n for (const i of history.immunizations ?? []) done.add(i.key);\n return done;\n}\n\n/** Program metadata — mirrors programs.json (see mieweb/codify). */\nexport interface ProgramMeta {\n kind?: 'surveillance' | 'fitness' | 'credential' | 'quality';\n /** Omitted = one-time / event-driven (satisfied forever once done) */\n periodicityMonths?: number;\n ageMin?: number;\n ageMax?: number;\n sex?: 'M' | 'F';\n /** Satisfying orders — plain keys, one-of alternatives, or dependent\n * entries (see ProgramOrder) */\n orders?: ProgramOrder[];\n}\n\nexport type ProgramsMap = Record<string, ProgramMeta>;\n\nexport type DueStatus =\n | 'due' // applicable, never satisfied (or history silent)\n | 'overdue' // applicable, last satisfied longer ago than the periodicity\n | 'pending' // a satisfying order is in flight\n | 'satisfied' // satisfied within the periodicity window (or one-time done)\n | 'not-applicable'; // age/sex gates exclude the patient\n\nexport interface DueItem {\n /** Program key, CODETYPE|FULLCODE (e.g. \"OSHA|1910.95\", \"eCQM|CMS125\") */\n key: string;\n program: ProgramMeta;\n status: DueStatus;\n /** Most recent completion date of any satisfying order */\n lastCompleted?: string;\n /** When the current/last satisfaction lapses (satisfied/overdue only) */\n dueDate?: string;\n /** Satisfying orders currently pending */\n pendingKeys: string[];\n}\n\n/** Add months to an ISO date, returning an ISO date (YYYY-MM-DD).\n * Computed in UTC (a local-time Date would shift the day in non-UTC zones)\n * with the day-of-month clamped (Jan 31 + 1 month → Feb 28/29, not Mar 2/3). */\nfunction addMonths(iso: string, months: number): string {\n const [y, m, d] = iso.slice(0, 10).split('-').map(Number);\n const total = m - 1 + months;\n const ty = y + Math.floor(total / 12);\n const tm = ((total % 12) + 12) % 12;\n // day 0 of the next month = last day of the target month\n const lastDay = new Date(Date.UTC(ty, tm + 1, 0)).getUTCDate();\n return new Date(Date.UTC(ty, tm, Math.min(d, lastDay)))\n .toISOString()\n .slice(0, 10);\n}\n\n/** Is the patient inside the program's age/sex gates? */\nexport function isApplicable(\n history: Pick<PatientHistory, 'age' | 'sex'>,\n program: ProgramMeta\n): boolean {\n if (program.sex && program.sex !== history.sex) return false;\n if (program.ageMin !== undefined && history.age < program.ageMin)\n return false;\n if (program.ageMax !== undefined && history.age > program.ageMax)\n return false;\n return true;\n}\n\n/**\n * Evaluate one program against the history.\n * `now` defaults to today; injectable for tests.\n */\nexport function evaluateProgram(\n key: string,\n program: ProgramMeta,\n history: PatientHistory,\n now: Date = new Date()\n): DueItem {\n const base = { key, program, pendingKeys: [] as string[] };\n if (!isApplicable(history, program)) {\n return { ...base, status: 'not-applicable' };\n }\n\n const satisfying = new Set(flattenOrderKeys(program.orders));\n // Completions come from finished orders, procedures and immunizations —\n // whatever the source system recorded them as.\n const completions: string[] = [];\n for (const o of history.orders) {\n if (!satisfying.has(o.key)) continue;\n if (o.status === 'completed') completions.push(o.date);\n else base.pendingKeys.push(o.key);\n }\n for (const p of history.procedures ?? []) {\n if (satisfying.has(p.key)) completions.push(p.date);\n }\n for (const i of history.immunizations ?? []) {\n if (satisfying.has(i.key)) completions.push(i.date);\n }\n\n const lastCompleted = completions.sort().at(-1);\n\n if (!lastCompleted) {\n return base.pendingKeys.length > 0\n ? { ...base, status: 'pending' }\n : { ...base, status: 'due' };\n }\n\n // One-time programs (no periodicity) stay satisfied once completed.\n if (program.periodicityMonths === undefined) {\n return { ...base, status: 'satisfied', lastCompleted };\n }\n\n const dueDate = addMonths(lastCompleted, program.periodicityMonths);\n if (dueDate > now.toISOString().slice(0, 10)) {\n return { ...base, status: 'satisfied', lastCompleted, dueDate };\n }\n return base.pendingKeys.length > 0\n ? { ...base, status: 'pending', lastCompleted, dueDate }\n : { ...base, status: 'overdue', lastCompleted, dueDate };\n}\n\n/**\n * Evaluate a set of programs against the history, most actionable first\n * (overdue → due → pending → satisfied; not-applicable omitted unless\n * `includeNotApplicable`).\n *\n * `enrolledKeys` restricts occupational programs to the patient's actual\n * enrollments (a clerk isn't due for cadmium surveillance just because the\n * program exists); quality measures apply to everyone passing their gates.\n */\nexport function evaluateDue(\n history: PatientHistory,\n programs: ProgramsMap,\n options?: {\n enrolledKeys?: string[];\n includeNotApplicable?: boolean;\n now?: Date;\n }\n): DueItem[] {\n const enrolled = options?.enrolledKeys ? new Set(options.enrolledKeys) : null;\n const now = options?.now ?? new Date();\n const items: DueItem[] = [];\n for (const [key, program] of Object.entries(programs)) {\n if (enrolled && program.kind !== 'quality' && !enrolled.has(key)) continue;\n const item = evaluateProgram(key, program, history, now);\n if (item.status === 'not-applicable' && !options?.includeNotApplicable)\n continue;\n items.push(item);\n }\n const rank: Record<DueStatus, number> = {\n overdue: 0,\n due: 1,\n pending: 2,\n satisfied: 3,\n 'not-applicable': 4,\n };\n return items.sort(\n (a, b) =>\n rank[a.status] - rank[b.status] ||\n (a.dueDate ?? '').localeCompare(b.dueDate ?? '') ||\n a.key.localeCompare(b.key)\n );\n}\n\n/**\n * Ordering-time prompt: is this order key part of a due/overdue program?\n * Returns the matching due items so the UI can badge \"due for OSHA 1910.95\"\n * or warn \"already satisfied\" while the clinician is ordering.\n */\nexport function dueForOrder(orderKey: string, dueItems: DueItem[]): DueItem[] {\n return dueItems.filter(\n (i) =>\n (i.status === 'due' || i.status === 'overdue') &&\n flattenOrderKeys(i.program.orders).includes(orderKey)\n );\n}\n","/**\n * Order-row builders — flatten the order history and the due-evaluation\n * output into grid-friendly rows (one row per encounter order) for the\n * NITRO-backed ChartOrdersGrid / EncounterOrdersGrid.\n *\n * Pure functions, no I/O. Every field is a flat string so the DataVis engine\n * can group/filter/aggregate on any of them (reason, provider, requisition,\n * status, kind, date).\n */\n\nimport {\n evaluateDue,\n normalizeOrders,\n completedKeys,\n type DueItem,\n type ProgramsMap,\n} from './evaluate';\nimport type { PatientHistory } from './history';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Per-order status — finer grained than the program-level DueStatus. */\nexport type OrderRowStatus = 'completed' | 'pending' | 'available' | 'blocked';\n\n/** One encounter order as a flat grid row. */\nexport interface OrderRow {\n /** CODETYPE|FULLCODE of the order */\n orderKey: string;\n /** Order display label */\n order: string;\n /** Reason/concern — the surveillance program or quality measure label */\n reason: string;\n /** Program key (CODETYPE|FULLCODE); '' when no program matches */\n reasonKey: string;\n /** Program kind label ('surveillance', 'quality measure', …) */\n kind: string;\n status: OrderRowStatus;\n /** Completion date (completed) or order date (pending); '' otherwise */\n date: string;\n /** Program due date, when known */\n dueDate: string;\n /** Ordering/performing provider; '' when unknown */\n provider: string;\n /** Requisition the order is bundled into; '' = unprocessed */\n requisitionId: string;\n /** Encounter the order was placed in; '' for not-yet-placed rows */\n encounterId: string;\n /** Unmet prerequisite labels, comma-joined ('' when unblocked) */\n blockedBy: string;\n}\n\nexport interface OrderRowsOptions {\n /** Occupational enrollments; quality measures apply to everyone in-gate */\n enrolledKeys?: string[];\n /** Evaluation clock (defaults to today; inject for determinism) */\n now?: Date;\n /** Display labels for program keys (falls back to the key) */\n programLabels?: Record<string, string>;\n /** Display labels for order keys (falls back to history labels, then key) */\n orderLabels?: Record<string, string>;\n /** Include not-yet-placed due-list orders as available/blocked rows\n * (default true) */\n includeDue?: boolean;\n}\n\nconst KIND_LABEL: Record<string, string> = {\n surveillance: 'surveillance',\n fitness: 'fitness for duty',\n credential: 'credential',\n quality: 'quality measure',\n};\n\n// =============================================================================\n// Internals\n// =============================================================================\n\nfunction labelLookup(\n history: PatientHistory,\n orderLabels?: Record<string, string>\n): (key: string) => string {\n const m = new Map<string, string>();\n const scan = (list?: { key?: string; label?: string }[]) => {\n for (const e of list ?? []) {\n if (e.key && e.label && !m.has(e.key)) m.set(e.key, e.label);\n }\n };\n scan(history.orders);\n scan(history.observations);\n scan(history.procedures);\n scan(history.immunizations);\n return (key) => orderLabels?.[key] ?? m.get(key) ?? key;\n}\n\n/** Map every order key to the due item whose program's order set contains it\n * (first program wins when several share an order). */\nfunction reasonIndex(items: DueItem[]): Map<string, DueItem> {\n const idx = new Map<string, DueItem>();\n for (const item of items) {\n for (const spec of normalizeOrders(item.program.orders)) {\n for (const k of spec.keys) {\n if (!idx.has(k)) idx.set(k, item);\n }\n }\n }\n return idx;\n}\n\n// =============================================================================\n// Builders\n// =============================================================================\n\n/**\n * Chart-wide rows: every past + in-flight order in the history, plus (by\n * default) the actionable due-list orders that haven't been placed yet\n * (`available`, or `blocked` while prerequisites are incomplete).\n */\nexport function buildChartOrderRows(\n history: PatientHistory,\n programs: ProgramsMap,\n options: OrderRowsOptions = {}\n): OrderRow[] {\n const {\n enrolledKeys,\n now,\n programLabels,\n orderLabels,\n includeDue = true,\n } = options;\n const items = evaluateDue(history, programs, { enrolledKeys, now });\n const byOrderKey = reasonIndex(items);\n const orderLabel = labelLookup(history, orderLabels);\n const programLabel = (key: string) => programLabels?.[key] ?? key;\n const completed = completedKeys(history);\n\n const rows: OrderRow[] = [];\n\n const reasonFields = (item?: DueItem) => ({\n reason: item ? programLabel(item.key) : '',\n reasonKey: item?.key ?? '',\n kind: item?.program.kind\n ? (KIND_LABEL[item.program.kind] ?? item.program.kind)\n : '',\n dueDate: item?.dueDate?.slice(0, 10) ?? '',\n });\n\n // 1) Every order in the history (all encounters)\n for (const o of history.orders) {\n rows.push({\n orderKey: o.key,\n order: orderLabel(o.key),\n ...reasonFields(byOrderKey.get(o.key)),\n status: o.status,\n date: o.date.slice(0, 10),\n provider: o.provider ?? '',\n requisitionId: o.requisitionId ?? '',\n encounterId: o.encounterId ?? '',\n blockedBy: '',\n });\n }\n\n // 2) Actionable due-list orders not yet placed\n if (includeDue) {\n const placed = new Set(history.orders.map((o) => o.key));\n for (const item of items) {\n if (item.status === 'satisfied' || item.status === 'not-applicable')\n continue;\n for (const spec of normalizeOrders(item.program.orders)) {\n const unmet = spec.after.filter((k) => !completed.has(k));\n for (const k of spec.keys) {\n if (placed.has(k)) continue;\n rows.push({\n orderKey: k,\n order: orderLabel(k),\n ...reasonFields(item),\n status: unmet.length > 0 ? 'blocked' : 'available',\n date: '',\n provider: '',\n requisitionId: '',\n encounterId: '',\n blockedBy: unmet.map(orderLabel).join(', '),\n });\n }\n }\n }\n }\n\n return rows;\n}\n\n/**\n * Current-encounter rows: the encounter's own orders (pending unprocessed\n * ones are the mass-operation targets) plus the actionable due-list orders\n * available to place this visit.\n */\nexport function buildEncounterOrderRows(\n history: PatientHistory,\n programs: ProgramsMap,\n encounterId: string,\n options: OrderRowsOptions = {}\n): OrderRow[] {\n return buildChartOrderRows(history, programs, options).filter(\n (r) =>\n r.encounterId === encounterId ||\n r.status === 'available' ||\n r.status === 'blocked'\n );\n}\n"]}
@@ -339,7 +339,7 @@ function DataVisNitroGraphInner({
339
339
  () => buildResolvedColumns2(columns, fallbackFields, normalizedTypeInfo),
340
340
  [columns, fallbackFields, normalizedTypeInfo]
341
341
  );
342
- return /* @__PURE__ */ jsx("div", { style: height ? { height } : void 0, children: /* @__PURE__ */ jsx(
342
+ return /* @__PURE__ */ jsx("div", { className: "wcdv-graph", style: height ? { height } : void 0, children: /* @__PURE__ */ jsx(
343
343
  GraphView,
344
344
  {
345
345
  viewData: viewState.data,
@@ -361,5 +361,5 @@ function DataVisNitroGraph(props) {
361
361
  DataVisNitroGraph.displayName = "DataVisNitroGraph";
362
362
 
363
363
  export { DataVisNitroContext, DataVisNitroGraph, DataVisNitroGrid, DataVisNitroSource };
364
- //# sourceMappingURL=chunk-4N72FAQW.js.map
365
- //# sourceMappingURL=chunk-4N72FAQW.js.map
364
+ //# sourceMappingURL=chunk-YBLIDESO.js.map
365
+ //# sourceMappingURL=chunk-YBLIDESO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/DataVisNITRO/DataVisNITRO.tsx","../src/components/DataVisNITRO/DataVisNitroGraph.tsx"],"names":["isObject","normalizeTypeInfo","normalizeFieldType","buildColumnFromField","buildResolvedColumns","buildFallbackFieldOrder","determineColumns","useView","useMemo","jsx","useContext"],"mappings":"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","file":"chunk-YBLIDESO.js","sourcesContent":["import React, { createContext, useContext, useMemo, useRef } from 'react';\nimport { ComputedView, Source } from 'datavis-ace';\n\nimport {\n DataGrid,\n determineColumns,\n getBuiltinGroupFunctions,\n buildAggregateFunctions,\n useView,\n TableRenderer,\n type DataGridProps,\n type GridTableDef,\n type ViewInstance,\n type TableRendererProps,\n type TableColumn,\n type TableFeatures,\n type ColumnFilterConfig,\n type AggregateFunction,\n type GroupFunctionDef,\n} from '@mieweb/datavis';\n\ntype TranslateFn = (key: string, ...args: unknown[]) => string;\n\ntype DataVisNitroSourceType = 'http' | 'local' | 'file';\n\ninterface HttpDataVisNitroSourceProps {\n type: 'http';\n url: string;\n children?: React.ReactNode;\n}\n\ninterface LocalDataVisNitroSourceProps {\n type: 'local';\n varName?: string;\n children?: React.ReactNode;\n}\n\ninterface FileDataVisNitroSourceProps {\n type: 'file';\n children?: React.ReactNode;\n}\n\nexport type DataVisNitroSourceProps =\n | HttpDataVisNitroSourceProps\n | LocalDataVisNitroSourceProps\n | FileDataVisNitroSourceProps;\n\ntype TrackedViewInstance = ViewInstance & {\n _dvType: DataVisNitroSourceType;\n _dvUrl: string | undefined;\n};\n\ntype DataVisTypeInfoEntry = {\n type?: string;\n displayText?: string;\n format?: string | Record<string, unknown>;\n internalType?: string;\n};\n\ntype DataVisTypeInfoMap = Record<string, DataVisTypeInfoEntry>;\n\ntype DataVisTypeInfoOrdMap = {\n keys?: () => string[];\n get?: (key: string) => DataVisTypeInfoEntry | undefined;\n};\n\nexport type DataVisNitroColumn = string | TableColumn;\n\nexport interface DataVisNitroGridProps\n extends\n Omit<DataGridProps, 'view' | 'children' | 'allColumns'>,\n Pick<\n TableRendererProps,\n | 'formatCell'\n | 'onColumnReorder'\n | 'onColumnResize'\n | 'onHeaderContextMenu'\n | 'onRowClick'\n | 'onRowDoubleClick'\n | 'onSelectionChange'\n > {\n columns?: DataVisNitroColumn[];\n allColumns?: TableColumn[];\n features?: TableFeatures;\n filterColumns?: ColumnFilterConfig[];\n aggregateFunctions?: AggregateFunction[];\n groupFunctionDefs?: GroupFunctionDef[];\n style?: React.CSSProperties;\n trans?: TranslateFn;\n}\n\nexport const DataVisNitroContext = createContext<ViewInstance | null>(null);\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction normalizeTypeInfo(typeInfo: unknown): DataVisTypeInfoMap {\n if (Array.isArray(typeInfo)) {\n return Object.fromEntries(\n typeInfo.filter(isObject).map((entry) => [entry.field, entry])\n ) as DataVisTypeInfoMap;\n }\n\n if (!isObject(typeInfo)) {\n return {};\n }\n\n const maybeOrdMap = typeInfo as DataVisTypeInfoOrdMap;\n if (\n typeof maybeOrdMap.keys === 'function' &&\n typeof maybeOrdMap.get === 'function'\n ) {\n return Object.fromEntries(\n maybeOrdMap.keys().map((field) => [field, maybeOrdMap.get?.(field) ?? {}])\n );\n }\n\n return Object.fromEntries(\n Object.entries(typeInfo).filter(([, value]) => isObject(value))\n ) as DataVisTypeInfoMap;\n}\n\nfunction normalizeFieldType(type: string | undefined): string | undefined {\n if (!type) return undefined;\n if (type === 'integer') return 'number';\n if (type === 'boolean') return 'string';\n return type;\n}\n\nfunction buildColumnFromField(\n field: string,\n typeInfo: DataVisTypeInfoMap\n): TableColumn {\n const info = typeInfo[field];\n const normalizedType = normalizeFieldType(info?.type);\n\n return {\n field,\n header: info?.displayText ?? field,\n sortable: true,\n filterable: true,\n resizable: true,\n reorderable: true,\n ...(normalizedType\n ? {\n typeInfo: {\n type: normalizedType,\n ...(info?.format !== undefined ? { format: info.format } : {}),\n ...(info?.internalType !== undefined\n ? { internalType: info.internalType }\n : {}),\n },\n }\n : {}),\n };\n}\n\nfunction mergeColumnWithTypeInfo(\n column: TableColumn,\n typeInfo: DataVisTypeInfoMap\n): TableColumn {\n const fallbackColumn = buildColumnFromField(column.field, typeInfo);\n return {\n ...fallbackColumn,\n ...column,\n header: column.header ?? fallbackColumn.header,\n typeInfo: column.typeInfo ?? fallbackColumn.typeInfo,\n };\n}\n\nfunction buildResolvedColumns(\n columns: DataVisNitroColumn[] | undefined,\n fallbackFields: string[],\n typeInfo: DataVisTypeInfoMap\n): TableColumn[] {\n if (columns && columns.length > 0) {\n return columns.map((column) => {\n if (typeof column === 'string') {\n return buildColumnFromField(column, typeInfo);\n }\n\n return mergeColumnWithTypeInfo(column, typeInfo);\n });\n }\n\n return fallbackFields.map((field) => buildColumnFromField(field, typeInfo));\n}\n\nfunction buildFallbackFieldOrder(\n typeInfo: DataVisTypeInfoMap,\n data: unknown[] | null\n): string[] {\n const rows = Array.isArray(data)\n ? data.filter((row): row is Record<string, unknown> => isObject(row))\n : null;\n\n const normalizedEntries = Object.fromEntries(\n Object.entries(typeInfo).map(([field, info]) => [\n field,\n {\n type: normalizeFieldType(info.type) ?? 'string',\n ...(info.displayText !== undefined\n ? { displayText: info.displayText }\n : {}),\n },\n ])\n );\n\n return determineColumns(null, normalizedEntries, rows);\n}\n\nfunction buildControlFields(\n columns: TableColumn[]\n): NonNullable<DataGridProps['controlFields']> {\n return columns.map((column) => ({\n field: column.field,\n displayName: column.header,\n type: column.typeInfo?.type,\n }));\n}\n\nfunction buildAggregateFields(\n columns: TableColumn[]\n): NonNullable<DataGridProps['aggregateFields']> {\n return columns.map((column) => ({\n field: column.field,\n displayName: column.header,\n }));\n}\n\nfunction mergeTableDef(\n tableDef: GridTableDef | undefined,\n features: TableFeatures | undefined\n): GridTableDef | undefined {\n if (!tableDef && !features) {\n return undefined;\n }\n\n const { rowMode, ...featureFlags } = features ?? {};\n const mergedFeatures =\n Object.keys(featureFlags).length > 0\n ? ({\n ...(tableDef?.features ?? {}),\n ...featureFlags,\n } as GridTableDef['features'])\n : undefined;\n\n return {\n ...tableDef,\n ...(rowMode !== undefined ? { rowMode } : {}),\n ...(mergedFeatures ? { features: mergedFeatures } : {}),\n };\n}\n\nfunction DataVisNitroSource(props: DataVisNitroSourceProps) {\n const { type, children } = props;\n const url = props.type === 'http' ? props.url : undefined;\n const varName = props.type === 'local' ? props.varName : undefined;\n const viewRef = useRef<TrackedViewInstance | null>(null);\n\n if (\n viewRef.current === null ||\n viewRef.current._dvType !== type ||\n viewRef.current._dvUrl !== url ||\n (viewRef.current as TrackedViewInstance & { _dvVarName?: string })\n ._dvVarName !== varName\n ) {\n const source =\n props.type === 'http'\n ? new Source({ type, url: props.url })\n : new Source(\n props.type === 'local' && props.varName\n ? { type, varName: props.varName }\n : { type }\n );\n\n viewRef.current = Object.assign(\n new ComputedView(source) as unknown as ViewInstance,\n { _dvType: type, _dvUrl: url, _dvVarName: varName }\n );\n }\n\n return (\n <DataVisNitroContext.Provider value={viewRef.current}>\n {children}\n </DataVisNitroContext.Provider>\n );\n}\n\nfunction DataVisNitroGridInner({\n computedView,\n columns,\n allColumns,\n features,\n filterColumns,\n controlFields,\n aggregateFields,\n aggregateFunctions,\n groupFunctionDefs,\n tableDef,\n formatCell,\n onColumnReorder,\n onColumnResize,\n onHeaderContextMenu,\n onRowClick,\n onRowDoubleClick,\n onSelectionChange,\n style,\n trans,\n ...dataGridProps\n}: DataVisNitroGridProps & { computedView: ViewInstance }) {\n const viewState = useView(computedView, false);\n\n const normalizedTypeInfo = useMemo(\n () =>\n normalizeTypeInfo(viewState.typeInfo ?? computedView?.typeInfo ?? null),\n [computedView, viewState.typeInfo]\n );\n\n const fallbackFields = useMemo(\n () =>\n buildFallbackFieldOrder(normalizedTypeInfo, viewState.data?.data ?? null),\n [normalizedTypeInfo, viewState.data?.data]\n );\n\n const resolvedAllColumns = useMemo(() => {\n if (allColumns && allColumns.length > 0) {\n return allColumns.map((column) =>\n mergeColumnWithTypeInfo(column, normalizedTypeInfo)\n );\n }\n\n return buildResolvedColumns(columns, fallbackFields, normalizedTypeInfo);\n }, [allColumns, columns, fallbackFields, normalizedTypeInfo]);\n\n const resolvedColumns = useMemo(() => {\n if (columns && columns.length > 0) {\n return buildResolvedColumns(\n columns,\n fallbackFields,\n normalizedTypeInfo\n ).filter((column) => column.visible !== false);\n }\n\n return resolvedAllColumns.filter((column) => column.visible !== false);\n }, [columns, fallbackFields, normalizedTypeInfo, resolvedAllColumns]);\n\n const effectiveAggregateFunctions = useMemo(\n () => aggregateFunctions ?? buildAggregateFunctions(),\n [aggregateFunctions]\n );\n\n const effectiveGroupFunctionDefs = useMemo(\n () =>\n groupFunctionDefs ??\n getBuiltinGroupFunctions(trans as TranslateFn | undefined),\n [groupFunctionDefs, trans]\n );\n\n const effectiveTableDef = useMemo(\n () => mergeTableDef(tableDef, features),\n [tableDef, features]\n );\n\n const aggFnLabels = useMemo(\n () =>\n Object.fromEntries(\n effectiveAggregateFunctions.map((fn) => [fn.name, fn.label])\n ),\n [effectiveAggregateFunctions]\n );\n\n return (\n <div style={style}>\n <DataGrid\n {...dataGridProps}\n view={computedView}\n tableDef={effectiveTableDef}\n allColumns={resolvedAllColumns}\n filterColumns={filterColumns ?? []}\n controlFields={controlFields ?? buildControlFields(resolvedAllColumns)}\n aggregateFields={\n aggregateFields ?? buildAggregateFields(resolvedAllColumns)\n }\n aggregateFunctions={effectiveAggregateFunctions}\n groupFunctionDefs={effectiveGroupFunctionDefs}\n >\n <TableRenderer\n viewData={viewState.data}\n columns={resolvedColumns}\n features={\n (effectiveTableDef?.features as TableFeatures | undefined) ??\n features\n }\n totalRows={viewState.totalRowCount ?? viewState.rowCount}\n loading={viewState.loading || !viewState.ready}\n formatCell={formatCell}\n aggFnLabels={aggFnLabels}\n onColumnReorder={onColumnReorder}\n onColumnResize={onColumnResize}\n onHeaderContextMenu={onHeaderContextMenu}\n onRowClick={onRowClick}\n onRowDoubleClick={onRowDoubleClick}\n onSelectionChange={onSelectionChange}\n />\n </DataGrid>\n </div>\n );\n}\n\nfunction DataVisNitroGrid(props: DataVisNitroGridProps) {\n const computedView = useContext(DataVisNitroContext);\n\n if (computedView === null) {\n return null;\n }\n\n return <DataVisNitroGridInner {...props} computedView={computedView} />;\n}\n\nDataVisNitroSource.displayName = 'DataVisNitroSource';\nDataVisNitroGrid.displayName = 'DataVisNitroGrid';\n\nexport { DataVisNitroGrid, DataVisNitroSource };\n","import React, { useCallback, useContext, useMemo, useState } from 'react';\n\nimport {\n GraphView,\n determineColumns,\n useView,\n type GraphConfig,\n type TableColumn,\n type ViewInstance,\n} from '@mieweb/datavis';\n\nimport { DataVisNitroContext } from './DataVisNITRO';\nimport type { DataVisNitroColumn } from './DataVisNITRO';\n\ntype DataVisTypeInfoEntry = {\n type?: string;\n displayText?: string;\n format?: string | Record<string, unknown>;\n internalType?: string;\n};\n\ntype DataVisTypeInfoMap = Record<string, DataVisTypeInfoEntry>;\n\ntype DataVisTypeInfoOrdMap = {\n keys?: () => string[];\n get?: (key: string) => DataVisTypeInfoEntry | undefined;\n};\n\nexport interface DataVisNitroGraphProps {\n /** Column definitions or field names to include in the graph. */\n columns?: DataVisNitroColumn[];\n /** Initial graph configuration (chart type, axes, etc.). */\n config?: Partial<GraphConfig>;\n /** Locale for formatting. */\n locale?: string;\n /** Additional CSS class name. */\n className?: string;\n /** CSS height for the container. */\n height?: string;\n /** Callback when the user changes graph configuration. */\n onConfigChange?: (config: GraphConfig) => void;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction normalizeTypeInfo(typeInfo: unknown): DataVisTypeInfoMap {\n if (Array.isArray(typeInfo)) {\n return Object.fromEntries(\n typeInfo.filter(isObject).map((entry) => [entry.field, entry])\n ) as DataVisTypeInfoMap;\n }\n\n if (!isObject(typeInfo)) {\n return {};\n }\n\n const maybeOrdMap = typeInfo as DataVisTypeInfoOrdMap;\n if (\n typeof maybeOrdMap.keys === 'function' &&\n typeof maybeOrdMap.get === 'function'\n ) {\n return Object.fromEntries(\n maybeOrdMap.keys().map((field) => [field, maybeOrdMap.get?.(field) ?? {}])\n );\n }\n\n return Object.fromEntries(\n Object.entries(typeInfo).filter(([, value]) => isObject(value))\n ) as DataVisTypeInfoMap;\n}\n\nfunction normalizeFieldType(type: string | undefined): string | undefined {\n if (!type) return undefined;\n if (type === 'integer') return 'number';\n if (type === 'boolean') return 'string';\n return type;\n}\n\nfunction buildColumnFromField(\n field: string,\n typeInfo: DataVisTypeInfoMap\n): TableColumn {\n const info = typeInfo[field];\n const normalizedType = normalizeFieldType(info?.type);\n\n return {\n field,\n header: info?.displayText ?? field,\n sortable: true,\n filterable: true,\n resizable: true,\n reorderable: true,\n ...(normalizedType\n ? {\n typeInfo: {\n type: normalizedType,\n ...(info?.format !== undefined ? { format: info.format } : {}),\n ...(info?.internalType !== undefined\n ? { internalType: info.internalType }\n : {}),\n },\n }\n : {}),\n };\n}\n\nfunction buildResolvedColumns(\n columns: DataVisNitroColumn[] | undefined,\n fallbackFields: string[],\n typeInfo: DataVisTypeInfoMap\n): TableColumn[] {\n if (columns && columns.length > 0) {\n return columns.map((column) => {\n if (typeof column === 'string') {\n return buildColumnFromField(column, typeInfo);\n }\n return column;\n });\n }\n\n return fallbackFields.map((field) => buildColumnFromField(field, typeInfo));\n}\n\nfunction buildFallbackFieldOrder(\n typeInfo: DataVisTypeInfoMap,\n data: unknown[] | null\n): string[] {\n const rows = Array.isArray(data)\n ? data.filter((row): row is Record<string, unknown> => isObject(row))\n : null;\n\n const normalizedEntries = Object.fromEntries(\n Object.entries(typeInfo).map(([field, info]) => [\n field,\n {\n type: normalizeFieldType(info.type) ?? 'string',\n ...(info.displayText !== undefined\n ? { displayText: info.displayText }\n : {}),\n },\n ])\n );\n\n return determineColumns(null, normalizedEntries, rows);\n}\n\nfunction DataVisNitroGraphInner({\n computedView,\n columns,\n config: initialConfig,\n locale,\n className,\n height,\n onConfigChange,\n}: DataVisNitroGraphProps & { computedView: ViewInstance }) {\n const viewState = useView(computedView);\n const [liveConfig, setLiveConfig] = useState<\n Partial<GraphConfig> | undefined\n >(initialConfig);\n\n const handleConfigChange = useCallback(\n (newConfig: GraphConfig) => {\n setLiveConfig(newConfig);\n onConfigChange?.(newConfig);\n },\n [onConfigChange]\n );\n\n const normalizedTypeInfo = useMemo(\n () =>\n normalizeTypeInfo(viewState.typeInfo ?? computedView?.typeInfo ?? null),\n [computedView, viewState.typeInfo]\n );\n\n const fallbackFields = useMemo(\n () =>\n buildFallbackFieldOrder(normalizedTypeInfo, viewState.data?.data ?? null),\n [normalizedTypeInfo, viewState.data?.data]\n );\n\n const resolvedColumns = useMemo(\n () => buildResolvedColumns(columns, fallbackFields, normalizedTypeInfo),\n [columns, fallbackFields, normalizedTypeInfo]\n );\n\n return (\n <div className=\"wcdv-graph\" style={height ? { height } : undefined}>\n <GraphView\n viewData={viewState.data}\n columns={resolvedColumns}\n config={liveConfig}\n locale={locale}\n className={className}\n onConfigChange={handleConfigChange}\n />\n </div>\n );\n}\n\nfunction DataVisNitroGraph(props: DataVisNitroGraphProps) {\n const computedView = useContext(DataVisNitroContext);\n\n if (computedView === null) {\n return null;\n }\n\n return <DataVisNitroGraphInner {...props} computedView={computedView} />;\n}\n\nDataVisNitroGraph.displayName = 'DataVisNitroGraph';\n\nexport { DataVisNitroGraph };\n"]}
@@ -0,0 +1,134 @@
1
+ 'use strict';
2
+
3
+ var React2 = require('react');
4
+
5
+ function _interopNamespace(e) {
6
+ if (e && e.__esModule) return e;
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
24
+
25
+ // src/hooks/useLiveAnnouncement.ts
26
+ function useLiveAnnouncement() {
27
+ const [message, setMessage] = React2__namespace.useState("");
28
+ const timerRef = React2__namespace.useRef(
29
+ void 0
30
+ );
31
+ const announce = React2__namespace.useCallback((next) => {
32
+ setMessage("");
33
+ if (timerRef.current !== void 0) clearTimeout(timerRef.current);
34
+ timerRef.current = setTimeout(() => setMessage(next), 50);
35
+ }, []);
36
+ React2__namespace.useEffect(
37
+ () => () => {
38
+ if (timerRef.current !== void 0) clearTimeout(timerRef.current);
39
+ },
40
+ []
41
+ );
42
+ return [message, announce];
43
+ }
44
+ function reorderIds(ids, draggedId, targetId, after) {
45
+ if (draggedId === targetId) return ids;
46
+ if (!ids.includes(draggedId)) return ids;
47
+ const without = ids.filter((i) => i !== draggedId);
48
+ const idx = without.indexOf(targetId);
49
+ if (idx === -1) return ids;
50
+ without.splice(after ? idx + 1 : idx, 0, draggedId);
51
+ return without;
52
+ }
53
+ function useDragReorder({
54
+ ids,
55
+ onReorder,
56
+ canDropOn
57
+ }) {
58
+ const [draggingId, setDraggingId] = React2__namespace.useState(null);
59
+ const draggingRef = React2__namespace.useRef(null);
60
+ const [over, setOver] = React2__namespace.useState(null);
61
+ const enabled = Boolean(onReorder);
62
+ const reset = React2__namespace.useCallback(() => {
63
+ draggingRef.current = null;
64
+ setDraggingId(null);
65
+ setOver(null);
66
+ }, []);
67
+ const rowProps = React2__namespace.useCallback(
68
+ (id) => {
69
+ if (!enabled) return {};
70
+ return {
71
+ draggable: true,
72
+ // WebKit (iPadOS Safari, incl. remote-pointer sessions) starts a text
73
+ // selection instead of a drag when the drag source contains selectable
74
+ // text — suppress selection and explicitly mark the row as the drag
75
+ // element so press-drag reliably initiates drag-and-drop.
76
+ style: {
77
+ userSelect: "none",
78
+ WebkitUserSelect: "none",
79
+ WebkitUserDrag: "element"
80
+ },
81
+ onDragStart: (e) => {
82
+ e.dataTransfer.effectAllowed = "move";
83
+ e.dataTransfer.setData("text/plain", id);
84
+ draggingRef.current = id;
85
+ setDraggingId(id);
86
+ },
87
+ onDragEnd: reset,
88
+ onDragOver: (e) => {
89
+ const dragged = draggingRef.current;
90
+ if (!dragged || dragged === id || canDropOn && !canDropOn(dragged, id)) {
91
+ setOver(null);
92
+ return;
93
+ }
94
+ e.preventDefault();
95
+ e.dataTransfer.dropEffect = "move";
96
+ const r = e.currentTarget.getBoundingClientRect();
97
+ const after = e.clientY > r.top + r.height / 2;
98
+ setOver(
99
+ (prev) => prev?.id === id && prev.after === after ? prev : { id, after }
100
+ );
101
+ },
102
+ onDragLeave: () => {
103
+ setOver((prev) => prev?.id === id ? null : prev);
104
+ },
105
+ onDrop: (e) => {
106
+ e.preventDefault();
107
+ const dragged = draggingRef.current ?? e.dataTransfer.getData("text/plain");
108
+ reset();
109
+ if (!dragged || dragged === id) return;
110
+ if (canDropOn && !canDropOn(dragged, id)) return;
111
+ const r = e.currentTarget.getBoundingClientRect();
112
+ const after = e.clientY > r.top + r.height / 2;
113
+ onReorder?.(reorderIds(ids, dragged, id, after));
114
+ }
115
+ };
116
+ },
117
+ [enabled, ids, onReorder, canDropOn, reset]
118
+ );
119
+ return { enabled, draggingId, over, rowProps };
120
+ }
121
+ function dragIndicatorClasses(drag, id) {
122
+ return [
123
+ drag.draggingId === id ? "opacity-40" : "",
124
+ drag.over?.id === id && !drag.over.after ? "shadow-[inset_0_2px_0_0_var(--color-primary-500,#3b82f6)]" : "",
125
+ drag.over?.id === id && drag.over.after ? "shadow-[inset_0_-2px_0_0_var(--color-primary-500,#3b82f6)]" : ""
126
+ ].filter(Boolean).join(" ");
127
+ }
128
+
129
+ exports.dragIndicatorClasses = dragIndicatorClasses;
130
+ exports.reorderIds = reorderIds;
131
+ exports.useDragReorder = useDragReorder;
132
+ exports.useLiveAnnouncement = useLiveAnnouncement;
133
+ //# sourceMappingURL=chunk-YVPC65ZJ.cjs.map
134
+ //# sourceMappingURL=chunk-YVPC65ZJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useLiveAnnouncement.ts","../src/hooks/useDragReorder.ts"],"names":["React","React2"],"mappings":"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","file":"chunk-YVPC65ZJ.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\n\n/**\n * State for an `aria-live` region that re-announces even when the same\n * message is emitted twice in a row. Setting identical React state bails out\n * (and identical DOM text isn't a mutation), so screen readers would stay\n * silent for repeated actions like \"moved down\" — this clears the region\n * first, then sets the message a tick later.\n *\n * @example\n * ```tsx\n * const [announcement, announce] = useLiveAnnouncement();\n * // announce('Item moved down');\n * // <div aria-live=\"polite\" className=\"sr-only\">{announcement}</div>\n * ```\n */\nexport function useLiveAnnouncement(): [string, (message: string) => void] {\n const [message, setMessage] = React.useState('');\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined\n );\n\n const announce = React.useCallback((next: string) => {\n setMessage('');\n if (timerRef.current !== undefined) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setMessage(next), 50);\n }, []);\n\n React.useEffect(\n () => () => {\n if (timerRef.current !== undefined) clearTimeout(timerRef.current);\n },\n []\n );\n\n return [message, announce];\n}\n","'use client';\n\nimport * as React from 'react';\n\n/** Insert `draggedId` before/after `targetId` in `ids`. */\nexport function reorderIds(\n ids: string[],\n draggedId: string,\n targetId: string,\n after: boolean\n): string[] {\n if (draggedId === targetId) return ids;\n // Ignore drags that originate outside this list (stale payloads would\n // otherwise be inserted as unknown ids).\n if (!ids.includes(draggedId)) return ids;\n const without = ids.filter((i) => i !== draggedId);\n const idx = without.indexOf(targetId);\n if (idx === -1) return ids;\n without.splice(after ? idx + 1 : idx, 0, draggedId);\n return without;\n}\n\nexport interface UseDragReorderOptions {\n /** Current flat order of item ids (props order) */\n ids: string[];\n /** Called with the full new id order after a drop. Omit to disable dragging. */\n onReorder?: (ids: string[]) => void;\n /** Restrict drops, e.g. to the same status group */\n canDropOn?: (draggedId: string, targetId: string) => boolean;\n}\n\nexport interface DragOverState {\n id: string;\n /** Drop indicator position relative to the hovered row */\n after: boolean;\n}\n\nexport interface UseDragReorderReturn {\n /** Whether drag reordering is active (onReorder provided) */\n enabled: boolean;\n /** Id currently being dragged, if any */\n draggingId: string | null;\n /** Row currently hovered as a drop target */\n over: DragOverState | null;\n /** Spread onto each row element (must be keyed by a stable id) */\n rowProps: (id: string) => React.HTMLAttributes<HTMLElement>;\n}\n\n/**\n * HTML5 drag-and-drop list reordering. Rows spread `rowProps(id)`; on drop the\n * hook computes the full new id order and reports it via `onReorder` — the\n * consumer persists it (e.g. on the encounter/patient object) and feeds the\n * list back in props order.\n *\n * Drag-and-drop is a pointer-only affordance: pair it with a keyboard\n * alternative (e.g. move buttons / Alt+Arrow keys) for accessibility.\n *\n * @example\n * ```tsx\n * const drag = useDragReorder({ ids: items.map((i) => i.id), onReorder });\n * // <li {...drag.rowProps(item.id)} className={cn(dragIndicatorClasses(drag, item.id))}>\n * ```\n */\nexport function useDragReorder({\n ids,\n onReorder,\n canDropOn,\n}: UseDragReorderOptions): UseDragReorderReturn {\n const [draggingId, setDraggingId] = React.useState<string | null>(null);\n // dragover can fire before the dragstart state update is visible, so the\n // authoritative dragged id lives in a ref (set synchronously)\n const draggingRef = React.useRef<string | null>(null);\n const [over, setOver] = React.useState<DragOverState | null>(null);\n const enabled = Boolean(onReorder);\n\n const reset = React.useCallback(() => {\n draggingRef.current = null;\n setDraggingId(null);\n setOver(null);\n }, []);\n\n const rowProps = React.useCallback(\n (id: string): React.HTMLAttributes<HTMLElement> => {\n if (!enabled) return {};\n return {\n draggable: true,\n // WebKit (iPadOS Safari, incl. remote-pointer sessions) starts a text\n // selection instead of a drag when the drag source contains selectable\n // text — suppress selection and explicitly mark the row as the drag\n // element so press-drag reliably initiates drag-and-drop.\n style: {\n userSelect: 'none',\n WebkitUserSelect: 'none',\n WebkitUserDrag: 'element',\n } as React.CSSProperties,\n onDragStart: (e) => {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', id);\n draggingRef.current = id;\n setDraggingId(id);\n },\n onDragEnd: reset,\n onDragOver: (e) => {\n const dragged = draggingRef.current;\n if (\n !dragged ||\n dragged === id ||\n (canDropOn && !canDropOn(dragged, id))\n ) {\n // hovering an invalid target: clear any stale indicator\n setOver(null);\n return;\n }\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n const r = e.currentTarget.getBoundingClientRect();\n const after = e.clientY > r.top + r.height / 2;\n setOver((prev) =>\n prev?.id === id && prev.after === after ? prev : { id, after }\n );\n },\n onDragLeave: () => {\n setOver((prev) => (prev?.id === id ? null : prev));\n },\n onDrop: (e) => {\n e.preventDefault();\n const dragged =\n draggingRef.current ?? e.dataTransfer.getData('text/plain');\n reset();\n if (!dragged || dragged === id) return;\n if (canDropOn && !canDropOn(dragged, id)) return;\n const r = e.currentTarget.getBoundingClientRect();\n const after = e.clientY > r.top + r.height / 2;\n onReorder?.(reorderIds(ids, dragged, id, after));\n },\n };\n },\n [enabled, ids, onReorder, canDropOn, reset]\n );\n\n return { enabled, draggingId, over, rowProps };\n}\n\n/** Tailwind classes for the drag state of a row: drop indicator + dragging dim. */\nexport function dragIndicatorClasses(\n drag: Pick<UseDragReorderReturn, 'draggingId' | 'over'>,\n id: string\n): string {\n return [\n drag.draggingId === id ? 'opacity-40' : '',\n drag.over?.id === id && !drag.over.after\n ? 'shadow-[inset_0_2px_0_0_var(--color-primary-500,#3b82f6)]'\n : '',\n drag.over?.id === id && drag.over.after\n ? 'shadow-[inset_0_-2px_0_0_var(--color-primary-500,#3b82f6)]'\n : '',\n ]\n .filter(Boolean)\n .join(' ');\n}\n"]}