@justifi/webcomponents 4.7.5 → 4.8.0

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 (298) hide show
  1. package/dist/cjs/Business-540a6feb.js +67 -0
  2. package/dist/cjs/BusinessFormEventTypes-863f48e9.js +42 -0
  3. package/dist/cjs/{Payout-7821eb61.js → Payout-44b49b2d.js} +2 -1
  4. package/dist/cjs/additional-questions-details_5.cjs.entry.js +5 -5
  5. package/dist/cjs/{business-form-schema-a2b87e77.js → business-form-schema-37e5381d.js} +17 -17
  6. package/dist/cjs/{form-control-datepart_2.cjs.entry.js → form-control-datepart_3.cjs.entry.js} +46 -3
  7. package/dist/cjs/form-control-monetary.cjs.entry.js +1 -1
  8. package/dist/cjs/{form-control-number_3.cjs.entry.js → form-control-select_2.cjs.entry.js} +1 -44
  9. package/dist/cjs/form-input-masks-e3bf2614.js +9 -0
  10. package/dist/cjs/{index-4286ac32.js → index-55950669.js} +31 -1
  11. package/dist/cjs/{index.esm-c08c2adc.js → index.esm-d25bd7bf.js} +0 -259
  12. package/dist/cjs/{justifi-additional-questions_6.cjs.entry.js → justifi-additional-questions_5.cjs.entry.js} +10 -280
  13. package/dist/cjs/justifi-bank-account-form.cjs.entry.js +1 -1
  14. package/dist/cjs/justifi-billing-form_2.cjs.entry.js +2 -2
  15. package/dist/cjs/justifi-business-details.cjs.entry.js +6 -6
  16. package/dist/cjs/justifi-business-form-stepped.cjs.entry.js +56 -49
  17. package/dist/cjs/justifi-business-form.cjs.entry.js +43 -36
  18. package/dist/cjs/justifi-business-list.cjs.entry.js +4 -51
  19. package/dist/cjs/justifi-business-owners.cjs.entry.js +78 -0
  20. package/dist/cjs/justifi-card-form.cjs.entry.js +1 -1
  21. package/dist/cjs/justifi-details.cjs.entry.js +2 -2
  22. package/dist/cjs/justifi-gross-payment-chart.cjs.entry.js +3 -3
  23. package/dist/cjs/justifi-payment-balance-transactions.cjs.entry.js +2 -2
  24. package/dist/cjs/justifi-payment-details.cjs.entry.js +44 -43
  25. package/dist/cjs/justifi-payment-form.cjs.entry.js +2 -2
  26. package/dist/cjs/justifi-payment-method-form.cjs.entry.js +7 -5
  27. package/dist/cjs/justifi-payments-list.cjs.entry.js +47 -91
  28. package/dist/cjs/justifi-payout-details.cjs.entry.js +48 -46
  29. package/dist/cjs/justifi-payouts-list.cjs.entry.js +47 -113
  30. package/dist/cjs/justifi-proceeds-list.cjs.entry.js +2 -2
  31. package/dist/cjs/justifi-refund-form.cjs.entry.js +3 -3
  32. package/dist/cjs/justifi-subaccount-details.cjs.entry.js +3 -3
  33. package/dist/cjs/justifi-subaccounts-list.cjs.entry.js +4 -4
  34. package/dist/cjs/justifi-table_2.cjs.entry.js +33 -30
  35. package/dist/cjs/loader.cjs.js +2 -2
  36. package/dist/cjs/payment-details-core.cjs.entry.js +52 -0
  37. package/dist/cjs/payment.service-605896dc.js +20 -0
  38. package/dist/cjs/payments-list-core.cjs.entry.js +98 -0
  39. package/dist/cjs/payout-details-core.cjs.entry.js +52 -0
  40. package/dist/cjs/payout.service-b39f2739.js +21 -0
  41. package/dist/cjs/payouts-list-core.cjs.entry.js +121 -0
  42. package/dist/cjs/select-input_2.cjs.entry.js +1 -1
  43. package/dist/cjs/subaccount-account-details_4.cjs.entry.js +2 -2
  44. package/dist/cjs/subaccount-bank-details.cjs.entry.js +2 -2
  45. package/dist/cjs/subaccount-terms-details.cjs.entry.js +2 -2
  46. package/dist/cjs/{utils-a2ee48ca.js → utils-d126d17c.js} +5 -5
  47. package/dist/cjs/utils-f5d82f21.js +10 -0
  48. package/dist/cjs/webcomponents.cjs.js +2 -2
  49. package/dist/collection/api/Business.js +18 -3
  50. package/dist/collection/api/Payment.js +2 -1
  51. package/dist/collection/api/mockData/MockPayments.js +25 -0
  52. package/dist/collection/api/services/payment.service.js +13 -0
  53. package/dist/collection/api/services/payout.service.js +14 -0
  54. package/dist/collection/api/services/utils.js +6 -0
  55. package/dist/collection/collection-manifest.json +4 -0
  56. package/dist/collection/components/business-details/additional-questions-details/additional-questions-details.js +8 -8
  57. package/dist/collection/components/business-details/business-details.js +3 -3
  58. package/dist/collection/components/business-form/BusinessFormEventTypes.js +6 -0
  59. package/dist/collection/components/business-form/business-address/business-address-form-schema.js +1 -1
  60. package/dist/collection/components/business-form/business-form-schema.js +16 -16
  61. package/dist/collection/components/business-form/business-form-stepped.js +99 -57
  62. package/dist/collection/components/business-form/business-form.css +95 -0
  63. package/dist/collection/components/business-form/business-form.js +92 -32
  64. package/dist/collection/components/business-form/business-generic-info/business-generic-info.js +7 -3
  65. package/dist/collection/components/business-form/business-owners/business-owners.js +6 -21
  66. package/dist/collection/components/business-form/business-representative/business-representative.js +1 -1
  67. package/dist/collection/components/business-form/helpers.js +21 -20
  68. package/dist/collection/components/business-form/legal-address-form/legal-address-form-schema.js +1 -1
  69. package/dist/collection/components/business-form/legal-address-form/legal-address-form.js +1 -2
  70. package/dist/collection/components/business-form/test/business-form.spec.js +5 -14
  71. package/dist/collection/components/details/utils.js +2 -2
  72. package/dist/collection/components/form/utils.js +2 -0
  73. package/dist/collection/components/pagination-menu/test/pagination-menu.spec.js +87 -0
  74. package/dist/collection/components/payment-details/get-payment-details.js +17 -0
  75. package/dist/collection/components/payment-details/payment-details-core.js +86 -0
  76. package/dist/collection/components/payment-details/payment-details.js +27 -52
  77. package/dist/collection/components/payment-details/test/get-payment-details.spec.js +64 -0
  78. package/dist/collection/components/payment-details/test/payment-details-core.spec.js +47 -0
  79. package/dist/collection/components/payment-details/test/payment-details.spec.js +31 -0
  80. package/dist/collection/components/payments-list/get-payments.js +20 -0
  81. package/dist/collection/components/payments-list/payments-list-core.js +158 -0
  82. package/dist/collection/components/payments-list/payments-list.js +27 -127
  83. package/dist/collection/components/payments-list/test/get-payments.spec.js +70 -0
  84. package/dist/collection/components/payments-list/test/payments-list-core.spec.js +100 -0
  85. package/dist/collection/components/payments-list/test/payments-list.spec.js +17 -21
  86. package/dist/collection/components/payout-details/get-payout-details.js +20 -0
  87. package/dist/collection/components/payout-details/payout-details-core.js +86 -0
  88. package/dist/collection/components/payout-details/payout-details.js +27 -78
  89. package/dist/collection/components/payout-details/test/get-payout-details.spec.js +55 -0
  90. package/dist/collection/components/payout-details/test/payout-details-core.spec.js +72 -0
  91. package/dist/collection/components/payout-details/test/payout-details.spec.js +13 -0
  92. package/dist/collection/components/payouts-list/get-payouts.js +20 -0
  93. package/dist/collection/components/payouts-list/payouts-list-core.js +181 -0
  94. package/dist/collection/components/payouts-list/payouts-list.js +26 -148
  95. package/dist/collection/components/payouts-list/test/get-payouts.spec.js +64 -0
  96. package/dist/collection/components/payouts-list/test/payouts-list-core.spec.js +105 -0
  97. package/dist/collection/components/payouts-list/test/payouts-list.spec.js +29 -0
  98. package/dist/collection/components/subaccounts-list/subaccounts-list.js +2 -2
  99. package/dist/collection/components/table/table.js +22 -29
  100. package/dist/collection/components/table/test/table.spec.js +47 -13
  101. package/dist/collection/components/table/utils.js +4 -0
  102. package/dist/collection/utils/{phone-masks.js → form-input-masks.js} +1 -0
  103. package/dist/docs.json +486 -317
  104. package/dist/esm/Business-1f5e9f6b.js +64 -0
  105. package/dist/esm/BusinessFormEventTypes-989960ba.js +39 -0
  106. package/dist/esm/{Payout-c42e3877.js → Payout-dc5f009c.js} +2 -1
  107. package/dist/esm/{SubAccount-b3ce8720.js → SubAccount-bd59f646.js} +1 -1
  108. package/dist/esm/additional-questions-details_5.entry.js +6 -6
  109. package/dist/esm/{business-form-schema-997c585c.js → business-form-schema-f8f554d1.js} +17 -17
  110. package/dist/esm/{form-control-datepart_2.entry.js → form-control-datepart_3.entry.js} +46 -4
  111. package/dist/esm/form-control-monetary.entry.js +1 -1
  112. package/dist/esm/{form-control-number_3.entry.js → form-control-select_2.entry.js} +2 -44
  113. package/dist/esm/form-input-masks-a8187c77.js +6 -0
  114. package/dist/esm/{index-ff8194f9.js → index-62b8aa8a.js} +31 -1
  115. package/dist/esm/{index.esm-8ae36d07.js → index.esm-22b47398.js} +1 -258
  116. package/dist/esm/{justifi-additional-questions_6.entry.js → justifi-additional-questions_5.entry.js} +10 -279
  117. package/dist/esm/justifi-bank-account-form.entry.js +1 -1
  118. package/dist/esm/justifi-billing-form_2.entry.js +2 -2
  119. package/dist/esm/justifi-business-details.entry.js +6 -6
  120. package/dist/esm/justifi-business-form-stepped.entry.js +56 -49
  121. package/dist/esm/justifi-business-form.entry.js +43 -36
  122. package/dist/esm/justifi-business-list.entry.js +4 -51
  123. package/dist/{module/business-owners.js → esm/justifi-business-owners.entry.js} +13 -55
  124. package/dist/esm/justifi-card-form.entry.js +1 -1
  125. package/dist/esm/justifi-details.entry.js +2 -2
  126. package/dist/esm/justifi-gross-payment-chart.entry.js +4 -4
  127. package/dist/esm/justifi-payment-balance-transactions.entry.js +3 -3
  128. package/dist/esm/justifi-payment-details.entry.js +44 -43
  129. package/dist/esm/justifi-payment-form.entry.js +3 -3
  130. package/dist/esm/justifi-payment-method-form.entry.js +7 -5
  131. package/dist/esm/justifi-payments-list.entry.js +47 -91
  132. package/dist/esm/justifi-payout-details.entry.js +48 -46
  133. package/dist/esm/justifi-payouts-list.entry.js +47 -113
  134. package/dist/esm/justifi-proceeds-list.entry.js +3 -3
  135. package/dist/esm/justifi-refund-form.entry.js +3 -3
  136. package/dist/esm/justifi-subaccount-details.entry.js +5 -5
  137. package/dist/esm/justifi-subaccounts-list.entry.js +6 -6
  138. package/dist/esm/justifi-table_2.entry.js +33 -30
  139. package/dist/esm/loader.js +3 -3
  140. package/dist/esm/payment-details-core.entry.js +48 -0
  141. package/dist/esm/payment.service-bea02ccf.js +18 -0
  142. package/dist/esm/payments-list-core.entry.js +94 -0
  143. package/dist/{webcomponents/p-b2dc938f.entry.js → esm/payout-details-core.entry.js} +48 -1
  144. package/dist/esm/payout.service-92e56814.js +19 -0
  145. package/dist/esm/payouts-list-core.entry.js +117 -0
  146. package/dist/esm/select-input_2.entry.js +1 -1
  147. package/dist/esm/subaccount-account-details_4.entry.js +3 -3
  148. package/dist/esm/subaccount-bank-details.entry.js +2 -2
  149. package/dist/esm/subaccount-terms-details.entry.js +2 -2
  150. package/dist/esm/utils-546ca6aa.js +8 -0
  151. package/dist/esm/{utils-7c6bd149.js → utils-576874df.js} +5 -5
  152. package/dist/esm/{utils-26c7dd12.js → utils-dd428dba.js} +1 -1
  153. package/dist/esm/webcomponents.js +3 -3
  154. package/dist/module/Business.js +64 -0
  155. package/dist/module/BusinessFormEventTypes.js +39 -0
  156. package/dist/module/Payout.js +2 -1
  157. package/dist/module/additional-questions-details2.js +4 -4
  158. package/dist/module/business-generic-info.js +25 -27
  159. package/dist/module/business-representative.js +1 -1
  160. package/dist/module/form-input-masks.js +6 -0
  161. package/dist/module/index.esm.js +1 -258
  162. package/dist/module/justifi-business-details.js +3 -3
  163. package/dist/module/justifi-business-form-stepped.js +74 -72
  164. package/dist/module/justifi-business-form.js +62 -58
  165. package/dist/module/justifi-business-list.js +1 -48
  166. package/dist/module/justifi-business-owners.js +115 -1
  167. package/dist/module/justifi-payment-details.js +52 -48
  168. package/dist/module/justifi-payments-list.js +58 -102
  169. package/dist/module/justifi-payout-details.js +57 -52
  170. package/dist/module/justifi-payouts-list.js +59 -125
  171. package/dist/module/justifi-refund-form.js +1 -1
  172. package/dist/module/justifi-subaccounts-list.js +2 -2
  173. package/dist/module/legal-address-form.js +1 -202
  174. package/dist/module/payment-details-core.d.ts +11 -0
  175. package/dist/module/payment-details-core.js +6 -0
  176. package/dist/module/payment-details-core2.js +76 -0
  177. package/dist/module/payment-method-form.js +6 -4
  178. package/dist/module/payment.service.js +18 -0
  179. package/dist/module/payments-list-core.d.ts +11 -0
  180. package/dist/module/payments-list-core.js +6 -0
  181. package/dist/module/payments-list-core2.js +131 -0
  182. package/dist/module/payout-details-core.d.ts +11 -0
  183. package/dist/module/payout-details-core.js +6 -0
  184. package/dist/module/payout-details-core2.js +76 -0
  185. package/dist/module/payout.service.js +19 -0
  186. package/dist/module/payouts-list-core.d.ts +11 -0
  187. package/dist/module/payouts-list-core.js +6 -0
  188. package/dist/module/payouts-list-core2.js +153 -0
  189. package/dist/module/table.js +33 -30
  190. package/dist/module/utils.js +4 -4
  191. package/dist/module/utils3.js +8 -0
  192. package/dist/types/api/Business.d.ts +60 -37
  193. package/dist/types/api/Payment.d.ts +33 -1
  194. package/dist/types/api/services/payment.service.d.ts +9 -0
  195. package/dist/types/api/services/payout.service.d.ts +9 -0
  196. package/dist/types/api/services/utils.d.ts +1 -0
  197. package/dist/types/components/business-details/additional-questions-details/additional-questions-details.d.ts +2 -2
  198. package/dist/types/components/business-details/business-details.d.ts +2 -2
  199. package/dist/types/components/business-form/BusinessFormEventTypes.d.ts +5 -0
  200. package/dist/types/components/business-form/business-form-schema.d.ts +1 -19
  201. package/dist/types/components/business-form/business-form-stepped.d.ts +22 -4
  202. package/dist/types/components/business-form/business-form.d.ts +15 -1
  203. package/dist/types/components/business-form/business-generic-info/business-generic-info.d.ts +2 -0
  204. package/dist/types/components/business-form/business-owners/business-owners.d.ts +1 -1
  205. package/dist/types/components/business-form/helpers.d.ts +1 -1
  206. package/dist/types/components/details/utils.d.ts +4 -3
  207. package/dist/types/components/form/utils.d.ts +1 -0
  208. package/dist/types/components/payment-details/get-payment-details.d.ts +8 -0
  209. package/dist/types/components/payment-details/payment-details-core.d.ts +11 -0
  210. package/dist/types/components/payment-details/payment-details.d.ts +6 -6
  211. package/dist/types/components/payment-method-form/payment-method-responses.d.ts +10 -2
  212. package/dist/types/components/payments-list/get-payments.d.ts +9 -0
  213. package/dist/types/components/payments-list/payments-list-core.d.ts +17 -0
  214. package/dist/types/components/payments-list/payments-list.d.ts +4 -12
  215. package/dist/types/components/payout-details/get-payout-details.d.ts +8 -0
  216. package/dist/types/components/payout-details/payout-details-core.d.ts +11 -0
  217. package/dist/types/components/payout-details/payout-details.d.ts +5 -31
  218. package/dist/types/components/payouts-list/get-payouts.d.ts +9 -0
  219. package/dist/types/components/payouts-list/payouts-list-core.d.ts +18 -0
  220. package/dist/types/components/payouts-list/payouts-list.d.ts +4 -13
  221. package/dist/types/components/table/table.d.ts +3 -4
  222. package/dist/types/components/table/utils.d.ts +3 -0
  223. package/dist/types/components.d.ts +138 -138
  224. package/dist/types/utils/form-input-masks.d.ts +6 -0
  225. package/dist/webcomponents/p-081cf5f6.entry.js +1 -0
  226. package/dist/webcomponents/{p-04817850.entry.js → p-0a0cf2e6.entry.js} +1 -1
  227. package/dist/webcomponents/p-0b9146cd.entry.js +1 -0
  228. package/dist/webcomponents/p-112acd3c.entry.js +1 -0
  229. package/dist/webcomponents/p-1555e6b1.js +1 -0
  230. package/dist/webcomponents/{p-377303af.entry.js → p-16f41fd0.entry.js} +1 -1
  231. package/dist/webcomponents/p-17715325.js +1 -0
  232. package/dist/webcomponents/p-19c5ddf1.entry.js +1 -0
  233. package/dist/webcomponents/p-1b6ff0d3.entry.js +1 -0
  234. package/dist/webcomponents/p-1cb65d15.entry.js +1 -0
  235. package/dist/webcomponents/{p-8302a5e2.entry.js → p-2e318b6a.entry.js} +1 -1
  236. package/dist/webcomponents/p-34de1c5d.entry.js +1 -0
  237. package/dist/webcomponents/p-36618b59.entry.js +1 -0
  238. package/dist/webcomponents/p-3a4d4869.entry.js +1 -0
  239. package/dist/webcomponents/p-3cb0b96d.js +1 -0
  240. package/dist/webcomponents/p-4ba2c711.entry.js +1 -0
  241. package/dist/webcomponents/p-4c01df65.entry.js +1 -0
  242. package/dist/webcomponents/p-4f14df36.js +2 -0
  243. package/dist/webcomponents/p-4fa27a28.entry.js +1 -0
  244. package/dist/webcomponents/{p-3bef762a.js → p-50730e69.js} +1 -1
  245. package/dist/webcomponents/{p-d84cd3a5.entry.js → p-57aab065.entry.js} +1 -1
  246. package/dist/webcomponents/p-57e592ac.entry.js +1 -0
  247. package/dist/webcomponents/p-5e142186.entry.js +1 -0
  248. package/dist/webcomponents/{p-57efe345.entry.js → p-5f8b9f64.entry.js} +1 -1
  249. package/dist/webcomponents/p-663bfe87.js +1 -0
  250. package/dist/webcomponents/p-6ab67031.entry.js +1 -0
  251. package/dist/webcomponents/p-6ed680e9.js +1 -0
  252. package/dist/webcomponents/{p-cf656598.entry.js → p-731cb109.entry.js} +1 -1
  253. package/dist/webcomponents/{p-c8916484.entry.js → p-7c0f91fa.entry.js} +1 -1
  254. package/dist/webcomponents/{p-0f5206f0.entry.js → p-7dd83492.entry.js} +1 -1
  255. package/dist/webcomponents/p-810b72b5.js +1 -0
  256. package/dist/webcomponents/p-876c7257.entry.js +1 -0
  257. package/dist/webcomponents/p-88027949.js +1 -0
  258. package/dist/webcomponents/{p-dd4e8fa1.entry.js → p-896a9ddb.entry.js} +1 -1
  259. package/dist/webcomponents/{p-22c2a11e.entry.js → p-8a90b976.entry.js} +1 -1
  260. package/dist/webcomponents/p-9b99370e.js +1 -0
  261. package/dist/webcomponents/p-9cb3ff78.entry.js +1 -0
  262. package/dist/webcomponents/p-ade12f56.js +1 -0
  263. package/dist/webcomponents/{p-0a351e24.entry.js → p-b5aba473.entry.js} +1 -1
  264. package/dist/webcomponents/p-b8a8b551.js +1 -0
  265. package/dist/webcomponents/{p-439a79c7.entry.js → p-bd099662.entry.js} +1 -1
  266. package/dist/webcomponents/{p-cb5352a3.entry.js → p-c0f882ce.entry.js} +1 -1
  267. package/dist/webcomponents/p-d66a6057.entry.js +1 -0
  268. package/dist/webcomponents/{p-650eb614.entry.js → p-d71ce1cd.entry.js} +1 -1
  269. package/dist/webcomponents/{p-33e74da7.entry.js → p-ec4f27e7.entry.js} +1 -1
  270. package/dist/webcomponents/{p-9a6e4749.js → p-f0c535ed.js} +1 -1
  271. package/dist/webcomponents/{p-0ad353cc.entry.js → p-f7a3fd12.entry.js} +1 -1
  272. package/dist/webcomponents/{p-68427454.entry.js → p-f9183f12.entry.js} +1 -1
  273. package/dist/webcomponents/webcomponents.esm.js +1 -1
  274. package/package.json +6 -4
  275. package/readme.md +1 -1
  276. package/dist/cjs/helpers-b254d050.js +0 -26
  277. package/dist/esm/helpers-d8a6a0f1.js +0 -24
  278. package/dist/module/helpers.js +0 -24
  279. package/dist/module/phone-masks.js +0 -5
  280. package/dist/types/utils/phone-masks.d.ts +0 -3
  281. package/dist/webcomponents/p-173fb8ef.entry.js +0 -1
  282. package/dist/webcomponents/p-1e2a98bf.js +0 -1
  283. package/dist/webcomponents/p-210677e3.js +0 -1
  284. package/dist/webcomponents/p-2cab231e.entry.js +0 -1
  285. package/dist/webcomponents/p-2ea68b03.entry.js +0 -1
  286. package/dist/webcomponents/p-34430db2.entry.js +0 -1
  287. package/dist/webcomponents/p-42bc8e53.entry.js +0 -1
  288. package/dist/webcomponents/p-59ecc2d7.entry.js +0 -1
  289. package/dist/webcomponents/p-71679a41.js +0 -1
  290. package/dist/webcomponents/p-78baff54.js +0 -1
  291. package/dist/webcomponents/p-7d922421.entry.js +0 -1
  292. package/dist/webcomponents/p-862f38cc.entry.js +0 -1
  293. package/dist/webcomponents/p-bedada09.js +0 -1
  294. package/dist/webcomponents/p-c8099443.entry.js +0 -1
  295. package/dist/webcomponents/p-da00d9bf.js +0 -2
  296. package/dist/webcomponents/p-df8f6a0f.entry.js +0 -1
  297. package/dist/webcomponents/p-e8f41c84.entry.js +0 -1
  298. package/dist/webcomponents/p-e9589e45.entry.js +0 -1
@@ -1,8 +1,8 @@
1
1
  import { Host, h } from "@stencil/core";
2
- import { Api, Payout, PayoutStatuses, PayoutStatusesSafeNames, pagingDefaults } from "../../api";
3
- import { formatCurrency, formatDate, formatTime } from "../../utils/utils";
4
- import { config } from "../../../config";
5
2
  import { tableExportedParts } from "../table/exported-parts";
3
+ import { PayoutService } from "../../api/services/payout.service";
4
+ import { makeGetPayouts } from "./get-payouts";
5
+ import { ErrorState } from "../details/utils";
6
6
  /**
7
7
  * @exportedPart table-head: Table head
8
8
  * @exportedPart table-head-row: Head row
@@ -24,129 +24,37 @@ import { tableExportedParts } from "../table/exported-parts";
24
24
  */
25
25
  export class PayoutsList {
26
26
  constructor() {
27
- this.mapStatusToBadge = (status) => {
28
- switch (status) {
29
- case PayoutStatuses.scheduled:
30
- return `<span class="badge bg-primary" title='Batched and scheduled to be transferred'>${PayoutStatusesSafeNames[status]}</span>`;
31
- case PayoutStatuses.in_transit:
32
- return `<span class="badge bg-primary" title='Transfer to your bank account has been initiated'>${PayoutStatusesSafeNames[status]}</span>`;
33
- case PayoutStatuses.failed:
34
- return `<span class="badge bg-danger" title='Transfer to your bank account failed'>${PayoutStatusesSafeNames[status]}</span>`;
35
- case PayoutStatuses.canceled:
36
- return `<span class="badge bg-danger" title='Transfer to your bank account failed'>${PayoutStatusesSafeNames[status]}</span>`;
37
- case PayoutStatuses.forwarded:
38
- return `<span class="badge bg-secondary" title='This payout initially failed; the funds have been forwarded to your next successful payout'>${PayoutStatusesSafeNames[status]}</span>`;
39
- case PayoutStatuses.paid:
40
- return `<span class="badge bg-success" title='Successfully deposited into your bank account'>${PayoutStatusesSafeNames[status]}</span>`;
41
- }
42
- };
43
- this.handleClickPrevious = (beforeCursor) => {
44
- const newParams = Object.assign({}, this.params);
45
- delete newParams.after_cursor;
46
- this.params = (Object.assign(Object.assign({}, newParams), { before_cursor: beforeCursor }));
47
- };
48
- this.handleClickNext = (afterCursor) => {
49
- const newParams = Object.assign({}, this.params);
50
- delete newParams.before_cursor;
51
- this.params = (Object.assign(Object.assign({}, newParams), { after_cursor: afterCursor }));
52
- };
53
27
  this.accountId = undefined;
54
28
  this.authToken = undefined;
55
- this.payouts = [];
56
- this.loading = true;
57
- this.errorMessage = undefined;
58
- this.paging = pagingDefaults;
59
- this.params = undefined;
29
+ this.getPayouts = undefined;
30
+ this.errorMessage = null;
60
31
  }
61
- updateOnPropChange() {
62
- this.fetchData();
32
+ componentWillLoad() {
33
+ this.initializeGetPayouts();
63
34
  }
64
- connectedCallback() {
65
- this.fetchData();
35
+ propChanged() {
36
+ this.initializeGetPayouts();
66
37
  }
67
- async fetchData() {
68
- var _a;
69
- if (!this.accountId || !this.authToken) {
70
- this.errorMessage = "Can not fetch any data without an AccountID and an AuthToken";
71
- this.loading = false;
72
- return;
73
- }
74
- this.loading = true;
75
- try {
76
- const api = Api(this.authToken, config.proxyApiOrigin);
77
- const endpoint = `account/${this.accountId}/payouts`;
78
- const response = await api.get(endpoint, this.params);
79
- if (!response.error) {
80
- this.paging = Object.assign(Object.assign({}, this.paging), response.page_info);
81
- const data = (_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.map(dataItem => new Payout(dataItem));
82
- this.payouts = data;
83
- }
84
- else {
85
- const responseError = typeof response.error === 'string' ? response.error : response.error.message;
86
- console.error(`Error fetching payouts: ${responseError}`);
87
- this.errorMessage = 'No results';
88
- }
38
+ initializeGetPayouts() {
39
+ if (this.accountId && this.authToken) {
40
+ this.getPayouts = makeGetPayouts({
41
+ id: this.accountId,
42
+ authToken: this.authToken,
43
+ service: new PayoutService(),
44
+ });
89
45
  }
90
- catch (error) {
91
- console.error(`Error fetching payouts: ${error}`);
92
- this.errorMessage = 'No results';
93
- }
94
- finally {
95
- this.loading = false;
46
+ else {
47
+ this.errorMessage = 'Account ID and Auth Token are required';
96
48
  }
97
49
  }
98
50
  render() {
99
- return (h(Host, { exportedparts: tableExportedParts }, h("justifi-table", { rowClickHandler: (e) => {
100
- const clickedPayoutID = e.target.closest('tr').dataset.rowEntityId;
101
- if (!clickedPayoutID) {
102
- return;
103
- }
104
- this.rowClicked.emit(this.payouts.find((payout) => payout.id === clickedPayoutID));
105
- }, columnData: [
106
- ['Paid Out On', 'The date each transaction occurred'],
107
- ['Type', 'The type of each transaction'],
108
- ['Account', 'The ID of the account associated with each payout'],
109
- ['Paid Out To', 'The bank account to which each payout was transferred'],
110
- ['Payments', 'Sum of payments in each payout'],
111
- ['Refunds', 'Sum of refunds in each payout'],
112
- ['Fees', 'Sum of fees in each payout'],
113
- ['Other', 'Sum of less common transactions in each payout (disputes, ACH returns, fee refunds, and forwarded balances due to failed payouts)'],
114
- ['Payout Amount', 'The net sum of all transactions in each payout. This is the amount you\'ll see reflected on your bank statement'],
115
- ['Status', 'The real-time status of each payout']
116
- ], entityId: this.payouts.map((payout) => payout.id), rowData: this.payouts.map((payout) => ([
117
- {
118
- type: 'head',
119
- value: `
120
- <div>${formatDate(payout.created_at)}</div>
121
- <div>${formatTime(payout.created_at)}</div>
122
- `,
123
- },
124
- payout.payout_type,
125
- payout.account_id,
126
- `${payout.bank_account.full_name} ${payout.bank_account.account_number_last4}`,
127
- formatCurrency(payout.payments_total),
128
- formatCurrency(payout.refunds_total),
129
- formatCurrency(payout.fees_total),
130
- formatCurrency(payout.other_total),
131
- formatCurrency(payout.amount),
132
- {
133
- type: 'inner',
134
- value: this.mapStatusToBadge(payout.status)
135
- }
136
- ])), loading: this.loading, "error-message": this.errorMessage, params: this.params, paging: Object.assign(Object.assign({}, this.paging), { handleClickNext: this.handleClickNext, handleClickPrevious: this.handleClickPrevious }) })));
51
+ if (this.errorMessage) {
52
+ return ErrorState(this.errorMessage);
53
+ }
54
+ return (h(Host, { exportedparts: tableExportedParts }, h("payouts-list-core", { getPayouts: this.getPayouts })));
137
55
  }
138
56
  static get is() { return "justifi-payouts-list"; }
139
57
  static get encapsulation() { return "shadow"; }
140
- static get originalStyleUrls() {
141
- return {
142
- "$": ["payouts-list.scss"]
143
- };
144
- }
145
- static get styleUrls() {
146
- return {
147
- "$": ["payouts-list.css"]
148
- };
149
- }
150
58
  static get properties() {
151
59
  return {
152
60
  "accountId": {
@@ -187,47 +95,17 @@ export class PayoutsList {
187
95
  }
188
96
  static get states() {
189
97
  return {
190
- "payouts": {},
191
- "loading": {},
192
- "errorMessage": {},
193
- "paging": {},
194
- "params": {}
98
+ "getPayouts": {},
99
+ "errorMessage": {}
195
100
  };
196
101
  }
197
- static get events() {
198
- return [{
199
- "method": "rowClicked",
200
- "name": "payout-row-clicked",
201
- "bubbles": true,
202
- "cancelable": true,
203
- "composed": true,
204
- "docs": {
205
- "tags": [],
206
- "text": ""
207
- },
208
- "complexType": {
209
- "original": "Payout",
210
- "resolved": "Payout",
211
- "references": {
212
- "Payout": {
213
- "location": "import",
214
- "path": "../../api",
215
- "id": "src/api/index.ts::Payout"
216
- }
217
- }
218
- }
219
- }];
220
- }
221
102
  static get watchers() {
222
103
  return [{
223
104
  "propName": "accountId",
224
- "methodName": "updateOnPropChange"
105
+ "methodName": "propChanged"
225
106
  }, {
226
107
  "propName": "authToken",
227
- "methodName": "updateOnPropChange"
228
- }, {
229
- "propName": "params",
230
- "methodName": "updateOnPropChange"
108
+ "methodName": "propChanged"
231
109
  }];
232
110
  }
233
111
  }
@@ -0,0 +1,64 @@
1
+ import { Payout } from "../../../api";
2
+ import { PayoutService } from "../../../api/services/payout.service";
3
+ import { makeGetPayouts } from "../get-payouts";
4
+ import mockResponse from "../../../api/mockData/mockPayoutsSuccess.json";
5
+ describe('makeGetPayouts', () => {
6
+ const mockId = '123';
7
+ const mockAuthToken = 'token';
8
+ const mockParams = { limit: 10, page: 1 };
9
+ let mockServiceInstance;
10
+ beforeEach(() => {
11
+ jest.clearAllMocks();
12
+ // Create a new instance of the mocked PayoutService
13
+ mockServiceInstance = new PayoutService();
14
+ // Explicitly mock fetchPayouts as a jest mock function
15
+ mockServiceInstance.fetchPayouts = jest.fn();
16
+ });
17
+ it('should call onSuccess with payouts and pagingInfo on successful fetch', async () => {
18
+ const onSuccess = jest.fn();
19
+ const onError = jest.fn();
20
+ // Mock fetchPayouts to resolve with mockResponse
21
+ mockServiceInstance.fetchPayouts.mockResolvedValue(mockResponse);
22
+ const getPayouts = makeGetPayouts({
23
+ id: mockId,
24
+ authToken: mockAuthToken,
25
+ service: mockServiceInstance,
26
+ });
27
+ await getPayouts({ params: mockParams, onSuccess, onError });
28
+ expect(onSuccess).toHaveBeenCalledWith({
29
+ payouts: expect.arrayContaining([expect.any(Payout), expect.any(Payout)]),
30
+ pagingInfo: mockResponse.page_info,
31
+ });
32
+ expect(onError).not.toHaveBeenCalled();
33
+ });
34
+ it('should call onError with an error message on API failure', async () => {
35
+ const mockError = new Error('Error fetching payouts');
36
+ const onSuccess = jest.fn();
37
+ const onError = jest.fn();
38
+ // Mock fetchPayouts to reject with mockError
39
+ mockServiceInstance.fetchPayouts.mockRejectedValue(mockError);
40
+ const getPayouts = makeGetPayouts({
41
+ id: mockId,
42
+ authToken: mockAuthToken,
43
+ service: mockServiceInstance,
44
+ });
45
+ await getPayouts({ params: mockParams, onSuccess, onError });
46
+ expect(onError).toHaveBeenCalledWith('Error fetching payouts');
47
+ expect(onSuccess).not.toHaveBeenCalled();
48
+ });
49
+ it('should call onError with an error message on API failure', async () => {
50
+ const mockError = new Error('Error fetching payouts');
51
+ const onSuccess = jest.fn();
52
+ const onError = jest.fn();
53
+ // Mock fetchPayouts to reject with mockError
54
+ mockServiceInstance.fetchPayouts.mockRejectedValue(mockError);
55
+ const getPayouts = makeGetPayouts({
56
+ id: mockId,
57
+ authToken: mockAuthToken,
58
+ service: mockServiceInstance,
59
+ });
60
+ await getPayouts({ params: mockParams, onSuccess, onError });
61
+ expect(onError).toHaveBeenCalledWith('Error fetching payouts');
62
+ expect(onSuccess).not.toHaveBeenCalled();
63
+ });
64
+ });
@@ -0,0 +1,105 @@
1
+ import { newSpecPage } from "@stencil/core/testing";
2
+ import { Table } from "../../table/table";
3
+ import { PaginationMenu } from "../../pagination-menu/pagination-menu";
4
+ import { PayoutsListCore } from "../payouts-list-core";
5
+ import mockSuccessResponse from "../../../api/mockData/mockPayoutsSuccess.json";
6
+ import { makeGetPayouts } from "../get-payouts";
7
+ const mockPayoutsResponse = mockSuccessResponse;
8
+ describe('payouts-list-core', () => {
9
+ it('renders properly', async () => {
10
+ const mockPayoutService = {
11
+ fetchPayouts: jest.fn().mockResolvedValue(mockPayoutsResponse),
12
+ };
13
+ const page = await newSpecPage({
14
+ components: [PayoutsListCore, Table, PaginationMenu],
15
+ html: `
16
+ <payouts-list-core></payouts-list-core>
17
+ `,
18
+ });
19
+ page.rootInstance.componentWillLoad = () => { };
20
+ page.rootInstance.getPayouts = makeGetPayouts({
21
+ id: '123',
22
+ authToken: '123',
23
+ service: mockPayoutService
24
+ });
25
+ page.rootInstance.fetchData();
26
+ await page.waitForChanges();
27
+ const justifiTable = page.root.querySelector('justifi-table');
28
+ const shadowRoot = justifiTable.shadowRoot;
29
+ const rows = shadowRoot.querySelectorAll('[data-test-id="table-row"]');
30
+ expect(rows.length).toBe(4);
31
+ expect(page.root).toMatchSnapshot();
32
+ });
33
+ it('displays an error state on failed data fetch', async () => {
34
+ const mockPayoutService = {
35
+ fetchPayouts: jest.fn().mockRejectedValue(new Error('Fetch error'))
36
+ };
37
+ const getPayouts = makeGetPayouts({
38
+ id: 'some-id',
39
+ authToken: 'some-auth-token',
40
+ service: mockPayoutService
41
+ });
42
+ const page = await newSpecPage({
43
+ components: [PayoutsListCore, Table, PaginationMenu],
44
+ html: '<payouts-list-core></payouts-list-core>',
45
+ });
46
+ page.rootInstance.componentWillLoad = () => { };
47
+ page.rootInstance.getPayouts = getPayouts;
48
+ page.rootInstance.fetchData();
49
+ await page.waitForChanges();
50
+ const justifiTable = page.root.querySelector('justifi-table');
51
+ const shadowRoot = justifiTable.shadowRoot;
52
+ const error = shadowRoot.querySelector('[data-test-id="table-error-state"]');
53
+ expect(error).toBeTruthy();
54
+ expect(page.root).toMatchSnapshot();
55
+ });
56
+ it('emits payout-row-clicked event on row click', async () => {
57
+ const mockPayoutService = {
58
+ fetchPayouts: jest.fn().mockResolvedValue(mockPayoutsResponse),
59
+ };
60
+ const page = await newSpecPage({
61
+ components: [PayoutsListCore, Table, PaginationMenu],
62
+ html: '<payouts-list-core></payouts-list-core>',
63
+ });
64
+ page.rootInstance.componentWillLoad = () => { };
65
+ page.rootInstance.getPayouts = makeGetPayouts({
66
+ id: '123',
67
+ authToken: '123',
68
+ service: mockPayoutService
69
+ });
70
+ page.rootInstance.fetchData();
71
+ await page.waitForChanges();
72
+ const rowClickedHandler = jest.fn();
73
+ page.win.addEventListener('payout-row-clicked', rowClickedHandler);
74
+ const justifiTable = page.root.querySelector('justifi-table');
75
+ const shadowRoot = justifiTable.shadowRoot;
76
+ const rows = shadowRoot.querySelectorAll('[data-test-id="table-row"]');
77
+ if (rows.length > 0) {
78
+ rows[0].click();
79
+ await page.waitForChanges();
80
+ }
81
+ });
82
+ it('updates params and refetches data on pagination interaction', async () => {
83
+ const mockPayoutService = {
84
+ fetchPayouts: jest.fn().mockResolvedValue(mockPayoutsResponse),
85
+ };
86
+ const page = await newSpecPage({
87
+ components: [PayoutsListCore, Table, PaginationMenu],
88
+ html: `<payouts-list-core></payouts-list-core>`,
89
+ });
90
+ page.rootInstance.componentWillLoad = () => { };
91
+ page.rootInstance.getPayouts = makeGetPayouts({
92
+ id: '123',
93
+ authToken: '123',
94
+ service: mockPayoutService
95
+ });
96
+ page.rootInstance.fetchData();
97
+ await page.waitForChanges();
98
+ page.rootInstance.handleClickNext('nextCursor');
99
+ await page.waitForChanges();
100
+ // The mock function should be called 3 times: once for the initial load, twice for when mockGetPayouts is set and later after the pagination interaction
101
+ expect(mockPayoutService.fetchPayouts).toHaveBeenCalledTimes(3);
102
+ const updatedParams = page.rootInstance.params;
103
+ expect(updatedParams.after_cursor).toBe('nextCursor');
104
+ });
105
+ });
@@ -0,0 +1,29 @@
1
+ import { newSpecPage } from "@stencil/core/testing";
2
+ import { PayoutsList } from "../payouts-list";
3
+ import { PayoutsListCore } from "../payouts-list-core";
4
+ describe('payouts-list', () => {
5
+ it('renders an error message when accountId and authToken are not provided', async () => {
6
+ const page = await newSpecPage({
7
+ components: [PayoutsList, PayoutsListCore],
8
+ html: '<justifi-payouts-list></justifi-payouts-list>',
9
+ });
10
+ await page.waitForChanges();
11
+ expect(page.root).toMatchSnapshot();
12
+ });
13
+ it('renders an error message when accountId is not provided', async () => {
14
+ const page = await newSpecPage({
15
+ components: [PayoutsList, PayoutsListCore],
16
+ html: '<justifi-payouts-list auth-token="abc"></justifi-payouts-list>',
17
+ });
18
+ await page.waitForChanges();
19
+ expect(page.root).toMatchSnapshot();
20
+ });
21
+ it('renders an error message when authToken is not provided', async () => {
22
+ const page = await newSpecPage({
23
+ components: [PayoutsList, PayoutsListCore],
24
+ html: '<justifi-payouts-list account-id="abc"></justifi-payouts-list>',
25
+ });
26
+ await page.waitForChanges();
27
+ expect(page.root).toMatchSnapshot();
28
+ });
29
+ });
@@ -67,8 +67,8 @@ export class SubaccountsList {
67
67
  {
68
68
  type: 'head',
69
69
  value: `
70
- <div>${subaccount.dateString}</div>
71
- <div>${subaccount.timeString}</div>
70
+ <div class='fw-bold'>${subaccount.dateString}</div>
71
+ <div class='fw-bold'>${subaccount.timeString}</div>
72
72
  `,
73
73
  },
74
74
  subaccount.name,
@@ -1,20 +1,9 @@
1
1
  import { Host, h } from "@stencil/core";
2
2
  import { ExtendedPagingDefaults } from "../../api/Pagination";
3
3
  import { tableExportedParts } from "./exported-parts";
4
+ import { EmptyState, ErrorState, LoadingState } from "./utils";
4
5
  export class Table {
5
6
  constructor() {
6
- this.emptyState = () => {
7
- var _a;
8
- return (h("tr", null, h("td", { class: "empty-state", part: "empty-state", colSpan: (_a = this.columnData) === null || _a === void 0 ? void 0 : _a.length, style: { textAlign: 'center' } }, "No results")));
9
- };
10
- this.errorState = () => {
11
- var _a;
12
- return (h("tr", null, h("td", { class: "error-state", part: "error-state", colSpan: (_a = this.columnData) === null || _a === void 0 ? void 0 : _a.length, style: { textAlign: 'center' } }, "An unexpected error occurred: ", this.errorMessage)));
13
- };
14
- this.loadingState = () => {
15
- var _a;
16
- return (h("tr", null, h("td", { class: "loading-state", part: "loading-state-cell", colSpan: (_a = this.columnData) === null || _a === void 0 ? void 0 : _a.length, style: { textAlign: 'center' } }, h("div", { part: "loading-state-spinner", class: "spinner-border", role: "status" }, h("span", { class: "visually-hidden" }, "Loading...")))));
17
- };
18
7
  this.loading = true;
19
8
  this.errorMessage = '';
20
9
  this.rowData = [];
@@ -24,25 +13,29 @@ export class Table {
24
13
  this.entityId = undefined;
25
14
  this.rowClickHandler = undefined;
26
15
  }
27
- showEmptyState() {
28
- return this.rowData ? this.rowData.length < 1 : true;
16
+ get showEmptyState() {
17
+ return !this.loading && !this.errorMessage && this.rowData.length < 1;
18
+ }
19
+ get showErrorState() {
20
+ return !this.loading && !!this.errorMessage;
21
+ }
22
+ get showRowData() {
23
+ return !this.showEmptyState && !this.showErrorState;
29
24
  }
30
25
  render() {
31
- var _a, _b, _c;
32
- return (h(Host, { exportparts: tableExportedParts }, this.columnData ?
33
- h("div", { class: "table-wrapper" }, h("table", { class: "table table-hover" }, h("thead", { class: "table-head sticky-top", part: "table-head" }, h("tr", { class: "table-light text-nowrap", part: 'table-head-row' }, (_a = this.columnData) === null || _a === void 0 ? void 0 : _a.map((column) => h("th", { part: "table-head-cell", scope: "col", title: Array.isArray(column) ? column[1] : '' }, !Array.isArray(column) ? column : column[0])))), h("tbody", { class: "table-body", part: 'table-body' }, this.loading ? this.loadingState() :
34
- this.errorMessage ? this.errorState() :
35
- this.showEmptyState() ? this.emptyState() :
36
- (_b = this.rowData) === null || _b === void 0 ? void 0 : _b.map((data, index) => {
37
- return (h("tr", { "data-row-entity-id": this.entityId[index], onClick: e => this.rowClickHandler ? this.rowClickHandler(e) : null, part: `table-row${index % 2 ? ' table-row-even' : ' table-row-odd'}` }, data.map((dataEntry) => {
38
- return (!(dataEntry === null || dataEntry === void 0 ? void 0 : dataEntry.type)
39
- ? h("td", { part: "table-cell" }, dataEntry)
40
- : h("th", { scope: "row", part: "table-cell" }, h("td", { part: "table-cell", innerHTML: dataEntry.value })));
41
- })));
42
- })), this.paging &&
43
- h("tfoot", { class: "sticky-bottom" }, h("tr", { class: "table-light align-middle" }, h("td", { part: "pagination-bar", colSpan: (_c = this.columnData) === null || _c === void 0 ? void 0 : _c.length }, h("pagination-menu", { paging: this.paging, params: this.params }))))))
44
- :
45
- h("div", { "data-test-id": "empty-error-state" }, "Column data is required")));
26
+ var _a, _b;
27
+ return (h(Host, { exportparts: tableExportedParts }, h("div", { class: "table-wrapper" }, h("table", { class: "table table-hover" }, h("thead", { class: "table-head sticky-top", part: "table-head" }, h("tr", { class: "table-light text-nowrap", part: 'table-head-row' }, (_a = this.columnData) === null || _a === void 0 ? void 0 : _a.map((column) => h("th", { part: "table-head-cell", scope: "col", title: Array.isArray(column) ? column[1] : '' }, !Array.isArray(column) ? column : column[0])))), h("tbody", { class: "table-body", part: 'table-body' }, this.loading && LoadingState(this.columnData.length), this.showEmptyState && EmptyState(this.columnData.length), this.showErrorState && ErrorState(this.columnData.length, this.errorMessage), this.showRowData && (this.rowData.map((data, index) => {
28
+ return (h("tr", { "data-test-id": "table-row", "data-row-entity-id": this.entityId[index], onClick: e => this.rowClickHandler ? this.rowClickHandler(e) : null, part: `table-row ${index % 2 ? 'table-row-even' : 'table-row-odd'}` }, data.map((dataEntry) => {
29
+ let nestedHtml = dataEntry === null || dataEntry === void 0 ? void 0 : dataEntry.type;
30
+ if (nestedHtml) {
31
+ return (h("td", { part: "table-cell", innerHTML: dataEntry.value }));
32
+ }
33
+ else {
34
+ return (h("td", { part: "table-cell" }, dataEntry));
35
+ }
36
+ })));
37
+ }))), this.paging &&
38
+ h("tfoot", { class: "sticky-bottom" }, h("tr", { class: "table-light align-middle" }, h("td", { part: "pagination-bar", colSpan: (_b = this.columnData) === null || _b === void 0 ? void 0 : _b.length }, h("pagination-menu", { paging: this.paging, params: this.params }))))))));
46
39
  }
47
40
  static get is() { return "justifi-table"; }
48
41
  static get encapsulation() { return "shadow"; }
@@ -2,21 +2,29 @@ import { h } from "@stencil/core";
2
2
  import { newSpecPage } from "@stencil/core/testing";
3
3
  import { Table } from "../table";
4
4
  describe('justifi-table', () => {
5
- it('does not render properly without columnData', async () => {
5
+ it('enters loading state when loading is true', async () => {
6
6
  const page = await newSpecPage({
7
7
  components: [Table],
8
- html: `<justifi-table></justifi-table>`,
8
+ template: () => h("justifi-table", { columnData: ['test', 'test'], loading: true })
9
9
  });
10
- const error = page.root.shadowRoot.querySelector('[data-test-id="empty-error-state"]');
11
- expect(error).toBeTruthy();
10
+ const loading = page.root.shadowRoot.querySelector('.loading-state');
11
+ expect(loading).toBeTruthy();
12
+ const loadingSpinner = page.root.shadowRoot.querySelector('.spinner-border');
13
+ expect(loadingSpinner).toBeTruthy();
14
+ const error = await page.root.shadowRoot.querySelector('.error-state');
15
+ expect(error).toBeNull();
12
16
  });
13
- it('stops loading', async () => {
17
+ it('renders the empty state when no data is passed', async () => {
14
18
  const page = await newSpecPage({
15
19
  components: [Table],
16
20
  template: () => h("justifi-table", { columnData: ['test', 'test'], loading: false })
17
21
  });
18
- const loading = page.root.shadowRoot.querySelector('.loading-state');
19
- expect(loading).toBeNull();
22
+ const empty = page.root.shadowRoot.querySelector('.empty-state');
23
+ expect(empty).toBeTruthy();
24
+ const emptyStateMessage = empty.innerHTML;
25
+ expect(emptyStateMessage).toBe('No results');
26
+ const error = await page.root.shadowRoot.querySelector('.error-state');
27
+ expect(error).toBeNull();
20
28
  });
21
29
  it('renders the state and displays error message passed', async () => {
22
30
  const ERROR_TEXT = 'error-123';
@@ -24,18 +32,20 @@ describe('justifi-table', () => {
24
32
  components: [Table],
25
33
  template: () => h("justifi-table", { columnData: ['test', 'test'], loading: false, errorMessage: ERROR_TEXT })
26
34
  });
35
+ const loading = page.root.shadowRoot.querySelector('.loading-state');
36
+ expect(loading).toBeNull();
27
37
  const error = page.root.shadowRoot.querySelector('.error-state');
28
- expect(error).not.toBeNull();
38
+ expect(error).toBeTruthy();
29
39
  const errorText = error.innerHTML;
30
40
  expect(errorText).toBe(`An unexpected error occurred: ${ERROR_TEXT}`);
31
41
  });
32
42
  it('renders the pagination bar when pagination is passed', async () => {
33
43
  const PAG = {
34
- amount: 25,
44
+ amount: 50,
35
45
  start_cursor: '',
36
46
  end_cursor: '',
37
47
  has_previous: false,
38
- has_next: false,
48
+ has_next: true,
39
49
  handleClickNext: () => { },
40
50
  handleClickPrevious: () => { }
41
51
  };
@@ -43,8 +53,8 @@ describe('justifi-table', () => {
43
53
  components: [Table],
44
54
  template: () => h("justifi-table", { columnData: ['test', 'test'], loading: false, paging: PAG })
45
55
  });
46
- const error = page.root.shadowRoot.querySelector('[part="pagination-bar"]');
47
- expect(error).not.toBeNull();
56
+ const paginationBar = page.root.shadowRoot.querySelector('[part="pagination-bar"]');
57
+ expect(paginationBar).toBeTruthy();
48
58
  });
49
59
  it('has an ID for each row', async () => {
50
60
  const page = await newSpecPage({
@@ -52,7 +62,31 @@ describe('justifi-table', () => {
52
62
  template: () => h("justifi-table", { entityId: ['123'], rowData: [['test']], columnData: ['test', 'test'], loading: false })
53
63
  });
54
64
  const row = page.root.shadowRoot.querySelector('[data-row-entity-id]');
55
- expect(row).not.toBeNull();
65
+ expect(row).toBeTruthy();
56
66
  expect(row.dataset.rowEntityId).toBe('123');
67
+ const loading = page.root.shadowRoot.querySelector('.loading-state');
68
+ expect(loading).toBeNull();
69
+ const empty = page.root.shadowRoot.querySelector('.empty-state');
70
+ expect(empty).toBeNull();
71
+ const error = await page.root.shadowRoot.querySelector('.error-state');
72
+ expect(error).toBeNull();
73
+ });
74
+ it('renders rows and columns based on columnData and rowData', async () => {
75
+ const columnData = ['Name', 'Age'];
76
+ const rowData = [['John Doe', 30], ['Jane Doe', 25]];
77
+ const entityId = ['id1', 'id2']; // Corresponding entity IDs for each row
78
+ const page = await newSpecPage({
79
+ components: [Table],
80
+ template: () => (h("justifi-table", { columnData: columnData, rowData: rowData, entityId: entityId, loading: false })),
81
+ });
82
+ const rows = page.root.shadowRoot.querySelectorAll('[data-test-id="table-row"]');
83
+ expect(rows.length).toBe(rowData.length);
84
+ rows.forEach((row, index) => {
85
+ const cells = row.querySelectorAll('td');
86
+ expect(cells.length).toBe(columnData.length);
87
+ cells.forEach((cell, cellIndex) => {
88
+ expect(cell.textContent).toBe(String(rowData[index][cellIndex]));
89
+ });
90
+ });
57
91
  });
58
92
  });
@@ -0,0 +1,4 @@
1
+ import { h } from "@stencil/core";
2
+ export const LoadingState = (columnSpan) => (h("tr", null, h("td", { class: "loading-state", part: "loading-state-cell", colSpan: columnSpan, style: { textAlign: 'center' } }, h("div", { part: "loading-state-spinner", class: "spinner-border", role: "status" }, h("span", { class: "visually-hidden" }, "Loading...")))));
3
+ export const EmptyState = (columnSpan) => (h("tr", null, h("td", { class: "empty-state", part: "empty-state", colSpan: columnSpan, style: { textAlign: 'center' } }, "No results")));
4
+ export const ErrorState = (columnSpan, errorMessage) => (h("tr", null, h("td", { class: "error-state", part: "error-state", colSpan: columnSpan, "data-test-id": "table-error-state", style: { textAlign: 'center' } }, "An unexpected error occurred: ", errorMessage)));
@@ -1,3 +1,4 @@
1
1
  export const PHONE_MASKS = {
2
2
  US: '(000) 000-0000',
3
3
  };
4
+ export const TAX_ID_MASKS = { US: '00-000000000' };