@foxy.io/elements 1.27.0-beta.7 → 1.27.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 (279) hide show
  1. package/dist/cdn/foxy-access-recovery-form.js +1 -1
  2. package/dist/cdn/foxy-address-card.js +5 -5
  3. package/dist/cdn/foxy-address-form.js +1 -1
  4. package/dist/cdn/foxy-admin-subscription-card.js +1 -1
  5. package/dist/cdn/foxy-api-browser.js +2 -2
  6. package/dist/cdn/foxy-applied-coupon-code-card.js +1 -1
  7. package/dist/cdn/foxy-applied-coupon-code-form.js +1 -1
  8. package/dist/cdn/foxy-applied-tax-card.js +1 -1
  9. package/dist/cdn/foxy-attribute-card.js +1 -1
  10. package/dist/cdn/foxy-attribute-form.js +1 -1
  11. package/dist/cdn/foxy-billing-address-card.js +1 -1
  12. package/dist/cdn/foxy-cancellation-form.js +1 -1
  13. package/dist/cdn/foxy-cart-card.js +1 -1
  14. package/dist/cdn/foxy-cart-form.js +1 -1
  15. package/dist/cdn/foxy-client-card.js +1 -1
  16. package/dist/cdn/foxy-client-form.js +1 -1
  17. package/dist/cdn/foxy-collection-page.js +1 -1
  18. package/dist/cdn/foxy-collection-pages.js +1 -1
  19. package/dist/cdn/foxy-copy-to-clipboard.js +1 -1
  20. package/dist/cdn/foxy-coupon-card.js +1 -1
  21. package/dist/cdn/foxy-coupon-code-card.js +1 -1
  22. package/dist/cdn/foxy-coupon-code-form.js +1 -1
  23. package/dist/cdn/foxy-coupon-codes-form.js +1 -1
  24. package/dist/cdn/foxy-coupon-detail-card.js +1 -1
  25. package/dist/cdn/foxy-coupon-form.js +1 -1
  26. package/dist/cdn/foxy-custom-field-card.js +1 -1
  27. package/dist/cdn/foxy-custom-field-form.js +1 -1
  28. package/dist/cdn/foxy-customer-api.js +1 -1
  29. package/dist/cdn/foxy-customer-card.js +1 -1
  30. package/dist/cdn/foxy-customer-form.js +1 -1
  31. package/dist/cdn/foxy-customer-portal-settings-form.js +1 -1
  32. package/dist/cdn/foxy-customer-portal-settings.js +1 -1
  33. package/dist/cdn/foxy-customer-portal.js +13 -13
  34. package/dist/cdn/foxy-customer.js +6 -6
  35. package/dist/cdn/foxy-customers-table.js +1 -1
  36. package/dist/cdn/foxy-discount-builder.js +1 -1
  37. package/dist/cdn/foxy-discount-card.js +1 -1
  38. package/dist/cdn/foxy-discount-detail-card.js +1 -1
  39. package/dist/cdn/foxy-donation.js +1 -1
  40. package/dist/cdn/foxy-downloadable-card.js +1 -1
  41. package/dist/cdn/foxy-downloadable-form.js +7 -7
  42. package/dist/cdn/foxy-email-template-card.js +1 -1
  43. package/dist/cdn/foxy-email-template-form.js +1 -1
  44. package/dist/cdn/foxy-error-entry-card.js +1 -1
  45. package/dist/cdn/foxy-filter-attribute-card.js +1 -1
  46. package/dist/cdn/foxy-filter-attribute-form.js +1 -1
  47. package/dist/cdn/foxy-form-dialog.js +1 -1
  48. package/dist/cdn/foxy-generate-codes-form.js +1 -1
  49. package/dist/cdn/foxy-gift-card-card.js +1 -1
  50. package/dist/cdn/foxy-gift-card-code-card.js +1 -1
  51. package/dist/cdn/foxy-gift-card-code-form.js +1 -1
  52. package/dist/cdn/foxy-gift-card-code-log-card.js +1 -1
  53. package/dist/cdn/foxy-gift-card-codes-form.js +1 -1
  54. package/dist/cdn/foxy-gift-card-form.js +1 -1
  55. package/dist/cdn/foxy-i18n-editor.js +2 -2
  56. package/dist/cdn/foxy-i18n.js +1 -1
  57. package/dist/cdn/foxy-integration-card.js +1 -1
  58. package/dist/cdn/foxy-integration-form.js +1 -1
  59. package/dist/cdn/foxy-item-card.js +1 -1
  60. package/dist/cdn/foxy-item-category-card.js +1 -1
  61. package/dist/cdn/foxy-item-category-form.js +1 -1
  62. package/dist/cdn/foxy-item-form.js +3 -3
  63. package/dist/cdn/foxy-item-option-card.js +1 -1
  64. package/dist/cdn/foxy-item-option-form.js +1 -1
  65. package/dist/cdn/foxy-items-form.js +1 -1
  66. package/dist/cdn/foxy-native-integration-card.js +1 -1
  67. package/dist/cdn/foxy-native-integration-form.js +1 -1
  68. package/dist/cdn/foxy-nucleon-element.js +1 -1
  69. package/dist/cdn/foxy-pagination.js +1 -1
  70. package/dist/cdn/foxy-passkey-card.js +1 -1
  71. package/dist/cdn/foxy-passkey-form.js +1 -1
  72. package/dist/cdn/foxy-payment-card-embed-element.js +1 -0
  73. package/dist/cdn/foxy-payment-card.js +1 -1
  74. package/dist/cdn/foxy-payment-method-card.js +1 -1
  75. package/dist/cdn/foxy-payments-api-fraud-protection-card.js +1 -1
  76. package/dist/cdn/foxy-payments-api-fraud-protection-form.js +1 -1
  77. package/dist/cdn/foxy-payments-api-payment-method-card.js +1 -1
  78. package/dist/cdn/foxy-payments-api-payment-method-form.js +1 -1
  79. package/dist/cdn/foxy-payments-api-payment-preset-card.js +1 -1
  80. package/dist/cdn/foxy-payments-api-payment-preset-form.js +1 -1
  81. package/dist/cdn/foxy-payments-api.js +1 -1
  82. package/dist/cdn/foxy-query-builder.js +1 -1
  83. package/dist/cdn/foxy-report-form.js +2 -2
  84. package/dist/cdn/foxy-reports-table.js +3 -3
  85. package/dist/cdn/foxy-shipment-card.js +1 -1
  86. package/dist/cdn/foxy-shipping-method-card.js +1 -1
  87. package/dist/cdn/foxy-sign-in-form.js +1 -1
  88. package/dist/cdn/foxy-spinner.js +2 -2
  89. package/dist/cdn/foxy-store-card.js +1 -1
  90. package/dist/cdn/foxy-store-form.js +1 -1
  91. package/dist/cdn/foxy-store-shipping-method-form.js +1 -1
  92. package/dist/cdn/foxy-subscription-card.js +1 -1
  93. package/dist/cdn/foxy-subscription-form.js +1 -1
  94. package/dist/cdn/foxy-subscription-settings-form.js +1 -1
  95. package/dist/cdn/foxy-subscriptions-table.js +1 -1
  96. package/dist/cdn/foxy-table.js +1 -1
  97. package/dist/cdn/foxy-tax-card.js +1 -1
  98. package/dist/cdn/foxy-tax-form.js +1 -1
  99. package/dist/cdn/foxy-template-config-form.js +1 -1
  100. package/dist/cdn/foxy-template-form.js +1 -1
  101. package/dist/cdn/foxy-template-set-card.js +1 -1
  102. package/dist/cdn/foxy-template-set-form.js +1 -1
  103. package/dist/cdn/foxy-transaction-card.js +1 -1
  104. package/dist/cdn/foxy-transaction.js +1 -1
  105. package/dist/cdn/foxy-transactions-table.js +1 -1
  106. package/dist/cdn/foxy-update-payment-method-form.js +1 -0
  107. package/dist/cdn/foxy-user-card.js +1 -1
  108. package/dist/cdn/foxy-user-form.js +1 -1
  109. package/dist/cdn/foxy-users-table.js +1 -1
  110. package/dist/cdn/foxy-webhook-card.js +1 -1
  111. package/dist/cdn/foxy-webhook-form.js +1 -1
  112. package/dist/cdn/foxy-webhook-log-card.js +1 -1
  113. package/dist/cdn/foxy-webhook-status-card.js +1 -1
  114. package/dist/cdn/{shared-684cd55a.js → shared-0062cab1.js} +1 -1
  115. package/dist/cdn/{shared-8a247f48.js → shared-036b25a3.js} +1 -1
  116. package/dist/cdn/{shared-18bfe97c.js → shared-04d8a434.js} +1 -1
  117. package/dist/cdn/{shared-07e7d118.js → shared-0aa511d0.js} +1 -1
  118. package/dist/cdn/shared-102dfbe0.js +1 -0
  119. package/dist/cdn/shared-12e531b8.js +1 -0
  120. package/dist/cdn/{shared-b2fd98e6.js → shared-15fe01fe.js} +1 -1
  121. package/dist/cdn/{shared-2314add3.js → shared-1ab8b12e.js} +1 -1
  122. package/dist/cdn/{shared-4c7a8fcc.js → shared-1d12db26.js} +1 -1
  123. package/dist/cdn/{shared-99e354b1.js → shared-25fc0ceb.js} +1 -1
  124. package/dist/cdn/shared-272e7269.js +1 -0
  125. package/dist/cdn/{shared-3cabd589.js → shared-2808f43a.js} +1 -1
  126. package/dist/cdn/{shared-be0fca15.js → shared-292585a0.js} +1 -1
  127. package/dist/cdn/shared-2e2d45c4.js +1 -0
  128. package/dist/cdn/{shared-0a9d860d.js → shared-2f2b5a28.js} +1 -1
  129. package/dist/cdn/{shared-412c19c2.js → shared-30143820.js} +1 -1
  130. package/dist/cdn/{shared-739f24fe.js → shared-328e5fdc.js} +1 -1
  131. package/dist/cdn/{shared-03673673.js → shared-337f2fe9.js} +1 -1
  132. package/dist/cdn/{shared-91c88f14.js → shared-34f4330c.js} +1 -1
  133. package/dist/cdn/{shared-482b2b86.js → shared-37391934.js} +1 -1
  134. package/dist/cdn/shared-39fc8fed.js +1 -0
  135. package/dist/cdn/{shared-b3db7611.js → shared-3c58ddf1.js} +1 -1
  136. package/dist/cdn/{shared-58951f74.js → shared-40cbbbae.js} +4 -4
  137. package/dist/cdn/{shared-018d5724.js → shared-4128d453.js} +1 -1
  138. package/dist/cdn/{shared-28be347b.js → shared-41e9ef02.js} +2 -2
  139. package/dist/cdn/{shared-0f59fd6a.js → shared-432d66f4.js} +1 -1
  140. package/dist/cdn/{shared-612ea9ed.js → shared-4885670b.js} +1 -1
  141. package/dist/cdn/{shared-fc5ace3b.js → shared-550608b8.js} +1 -1
  142. package/dist/cdn/{shared-467e5b06.js → shared-5758adbc.js} +1 -1
  143. package/dist/cdn/{shared-90cbed56.js → shared-5a18985c.js} +2 -2
  144. package/dist/cdn/{shared-8258443c.js → shared-5e9395ec.js} +1 -1
  145. package/dist/cdn/{shared-a24b2aa7.js → shared-62f3fc5a.js} +1 -1
  146. package/dist/cdn/{shared-5debeb1b.js → shared-66a515e3.js} +1 -1
  147. package/dist/cdn/shared-66d2a0d7.js +1 -0
  148. package/dist/cdn/{shared-584df8a8.js → shared-68aebcc4.js} +1 -1
  149. package/dist/cdn/{shared-1e7639e6.js → shared-6dfb57b1.js} +1 -1
  150. package/dist/cdn/{shared-b900e1b5.js → shared-739a8fe4.js} +1 -1
  151. package/dist/cdn/{shared-cdf873d4.js → shared-7535b32d.js} +1 -1
  152. package/dist/cdn/{shared-25198d9a.js → shared-7c819ebc.js} +1 -1
  153. package/dist/cdn/{shared-285f8cee.js → shared-84215d13.js} +1 -1
  154. package/dist/cdn/{shared-4affec66.js → shared-8452c492.js} +1 -1
  155. package/dist/cdn/{shared-b9ea6d85.js → shared-8540c2c7.js} +1 -1
  156. package/dist/cdn/{shared-540063aa.js → shared-8c5b4c81.js} +1 -1
  157. package/dist/cdn/{shared-6cd4e618.js → shared-8d7e2e2c.js} +1 -1
  158. package/dist/cdn/{shared-f7c60ee0.js → shared-8e59a71e.js} +1 -1
  159. package/dist/cdn/shared-8e75c372.js +1 -0
  160. package/dist/cdn/shared-90ddf541.js +1 -0
  161. package/dist/cdn/{shared-f0fcd613.js → shared-91009494.js} +1 -1
  162. package/dist/cdn/shared-9f5c636a.js +1 -0
  163. package/dist/cdn/{shared-d56a3799.js → shared-a30fcaf6.js} +1 -1
  164. package/dist/cdn/{shared-d222bd1e.js → shared-a33be18f.js} +1 -1
  165. package/dist/cdn/{shared-6b68b3b6.js → shared-a911ab73.js} +1 -1
  166. package/dist/cdn/{shared-9cfef94a.js → shared-b1c7300a.js} +1 -1
  167. package/dist/cdn/{shared-ea5fa631.js → shared-b2ce84fa.js} +1 -1
  168. package/dist/cdn/{shared-bd919e3b.js → shared-b55f1de3.js} +1 -1
  169. package/dist/cdn/{shared-d72e87ee.js → shared-b6c1aa47.js} +1 -1
  170. package/dist/cdn/{shared-bb1d162b.js → shared-b73fd633.js} +1 -1
  171. package/dist/cdn/{shared-ad11b006.js → shared-b99daf13.js} +1 -1
  172. package/dist/cdn/{shared-da2e66a4.js → shared-bac00622.js} +1 -1
  173. package/dist/cdn/{shared-2b5a3c80.js → shared-bd99107c.js} +1 -1
  174. package/dist/cdn/{shared-f4bb452b.js → shared-c0b1a51d.js} +1 -1
  175. package/dist/cdn/shared-c5106605.js +1 -0
  176. package/dist/cdn/{shared-d10d6cba.js → shared-cb732375.js} +1 -1
  177. package/dist/cdn/shared-cd96ff03.js +1 -0
  178. package/dist/cdn/{shared-55630cac.js → shared-da2a367a.js} +1 -1
  179. package/dist/cdn/{shared-122cccac.js → shared-e075ca81.js} +1 -1
  180. package/dist/cdn/{shared-7f60c1c1.js → shared-e10b5dca.js} +1 -1
  181. package/dist/cdn/{shared-0a8161e5.js → shared-e2cbc382.js} +1 -1
  182. package/dist/cdn/{shared-77258081.js → shared-e4403332.js} +1 -1
  183. package/dist/cdn/{shared-75d13e1b.js → shared-e5f6ca48.js} +1 -1
  184. package/dist/cdn/{shared-7ff78b4a.js → shared-e989e47e.js} +2 -2
  185. package/dist/cdn/{shared-6586ffd5.js → shared-ecb7a183.js} +1 -1
  186. package/dist/cdn/{shared-8b521111.js → shared-f090c63a.js} +1 -1
  187. package/dist/cdn/{shared-4c611015.js → shared-f14856e0.js} +2 -2
  188. package/dist/cdn/{shared-ee13d85c.js → shared-f2721fae.js} +3 -3
  189. package/dist/cdn/{shared-62e9c883.js → shared-f548d023.js} +1 -1
  190. package/dist/cdn/{shared-7b2bd917.js → shared-fd95cd52.js} +1 -1
  191. package/dist/cdn/translations/customer/en.json +149 -2
  192. package/dist/cdn/translations/customer-portal/README.md +4 -0
  193. package/dist/cdn/translations/customer-portal/de.json +1063 -113
  194. package/dist/cdn/translations/customer-portal/en.json +151 -5
  195. package/dist/cdn/translations/customer-portal/es.json +1072 -123
  196. package/dist/cdn/translations/customer-portal/fr.json +1084 -134
  197. package/dist/cdn/translations/customer-portal/nl.json +1085 -135
  198. package/dist/cdn/translations/customer-portal/pl.json +1092 -142
  199. package/dist/cdn/translations/customer-portal/sv.json +1173 -0
  200. package/dist/cdn/translations/customer-portal/zh-hk.json +1110 -160
  201. package/dist/cdn/translations/payment-card-embed/en.json +48 -0
  202. package/dist/cdn/translations/payment-method-card/en.json +149 -2
  203. package/dist/cdn/translations/payments-api-payment-method-form/en.json +2 -2
  204. package/dist/cdn/translations/update-payment-method-form/en.json +140 -0
  205. package/dist/elements/internal/InternalForm/InternalForm.js +2 -0
  206. package/dist/elements/internal/InternalForm/InternalForm.js.map +1 -1
  207. package/dist/elements/public/Customer/Customer.d.ts +5 -0
  208. package/dist/elements/public/Customer/Customer.js +13 -6
  209. package/dist/elements/public/Customer/Customer.js.map +1 -1
  210. package/dist/elements/public/Customer/index.d.ts +1 -0
  211. package/dist/elements/public/Customer/index.js +1 -0
  212. package/dist/elements/public/Customer/index.js.map +1 -1
  213. package/dist/elements/public/CustomerPortal/CustomerPortal.d.ts +14 -0
  214. package/dist/elements/public/CustomerPortal/CustomerPortal.js +23 -6
  215. package/dist/elements/public/CustomerPortal/CustomerPortal.js.map +1 -1
  216. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLoggedInView.d.ts +1 -0
  217. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLoggedInView.js +7 -2
  218. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLoggedInView.js.map +1 -1
  219. package/dist/elements/public/DownloadableForm/DownloadableForm.js.map +1 -1
  220. package/dist/elements/public/FormDialog/FormDialog.d.ts +2 -0
  221. package/dist/elements/public/FormDialog/FormDialog.js +8 -4
  222. package/dist/elements/public/FormDialog/FormDialog.js.map +1 -1
  223. package/dist/elements/public/NucleonElement/NucleonElement.js +7 -1
  224. package/dist/elements/public/NucleonElement/NucleonElement.js.map +1 -1
  225. package/dist/elements/public/NucleonElement/UpdateEvent.d.ts +3 -1
  226. package/dist/elements/public/NucleonElement/UpdateEvent.js +2 -0
  227. package/dist/elements/public/NucleonElement/UpdateEvent.js.map +1 -1
  228. package/dist/elements/public/PaymentCardEmbedElement/PaymentCardEmbedElement.d.ts +47 -0
  229. package/dist/elements/public/PaymentCardEmbedElement/PaymentCardEmbedElement.js +198 -0
  230. package/dist/elements/public/PaymentCardEmbedElement/PaymentCardEmbedElement.js.map +1 -0
  231. package/dist/elements/public/PaymentCardEmbedElement/index.d.ts +4 -0
  232. package/dist/elements/public/PaymentCardEmbedElement/index.js +6 -0
  233. package/dist/elements/public/PaymentCardEmbedElement/index.js.map +1 -0
  234. package/dist/elements/public/PaymentMethodCard/PaymentMethodCard.d.ts +14 -4
  235. package/dist/elements/public/PaymentMethodCard/PaymentMethodCard.js +79 -10
  236. package/dist/elements/public/PaymentMethodCard/PaymentMethodCard.js.map +1 -1
  237. package/dist/elements/public/PaymentMethodCard/index.d.ts +2 -0
  238. package/dist/elements/public/PaymentMethodCard/index.js +2 -0
  239. package/dist/elements/public/PaymentMethodCard/index.js.map +1 -1
  240. package/dist/elements/public/PaymentsApiPaymentMethodForm/PaymentsApiPaymentMethodForm.js +66 -56
  241. package/dist/elements/public/PaymentsApiPaymentMethodForm/PaymentsApiPaymentMethodForm.js.map +1 -1
  242. package/dist/elements/public/PaymentsApiPaymentPresetForm/PaymentsApiPaymentPresetForm.js +1 -0
  243. package/dist/elements/public/PaymentsApiPaymentPresetForm/PaymentsApiPaymentPresetForm.js.map +1 -1
  244. package/dist/elements/public/SubscriptionForm/SubscriptionForm.js.map +1 -1
  245. package/dist/elements/public/UpdatePaymentMethodForm/UpdatePaymentMethodForm.d.ts +37 -0
  246. package/dist/elements/public/UpdatePaymentMethodForm/UpdatePaymentMethodForm.js +142 -0
  247. package/dist/elements/public/UpdatePaymentMethodForm/UpdatePaymentMethodForm.js.map +1 -0
  248. package/dist/elements/public/UpdatePaymentMethodForm/index.d.ts +8 -0
  249. package/dist/elements/public/UpdatePaymentMethodForm/index.js +10 -0
  250. package/dist/elements/public/UpdatePaymentMethodForm/index.js.map +1 -0
  251. package/dist/elements/public/UpdatePaymentMethodForm/internal/InternalUpdatePaymentMethodFormCcTokenControl/InternalUpdatePaymentMethodFormCcTokenControl.d.ts +9 -0
  252. package/dist/elements/public/UpdatePaymentMethodForm/internal/InternalUpdatePaymentMethodFormCcTokenControl/InternalUpdatePaymentMethodFormCcTokenControl.js +46 -0
  253. package/dist/elements/public/UpdatePaymentMethodForm/internal/InternalUpdatePaymentMethodFormCcTokenControl/InternalUpdatePaymentMethodFormCcTokenControl.js.map +1 -0
  254. package/dist/elements/public/UpdatePaymentMethodForm/internal/InternalUpdatePaymentMethodFormCcTokenControl/index.d.ts +6 -0
  255. package/dist/elements/public/UpdatePaymentMethodForm/internal/InternalUpdatePaymentMethodFormCcTokenControl/index.js +8 -0
  256. package/dist/elements/public/UpdatePaymentMethodForm/internal/InternalUpdatePaymentMethodFormCcTokenControl/index.js.map +1 -0
  257. package/dist/elements/public/UpdatePaymentMethodForm/types.d.ts +13 -0
  258. package/dist/elements/public/UpdatePaymentMethodForm/types.js +2 -0
  259. package/dist/elements/public/UpdatePaymentMethodForm/types.js.map +1 -0
  260. package/dist/elements/public/index.d.ts +2 -0
  261. package/dist/elements/public/index.defined.d.ts +2 -0
  262. package/dist/elements/public/index.defined.js +2 -0
  263. package/dist/elements/public/index.defined.js.map +1 -1
  264. package/dist/elements/public/index.js +2 -0
  265. package/dist/elements/public/index.js.map +1 -1
  266. package/dist/mixins/themeable.js +45 -0
  267. package/dist/mixins/themeable.js.map +1 -1
  268. package/dist/mixins/translatable.js +89 -79
  269. package/dist/mixins/translatable.js.map +1 -1
  270. package/package.json +2 -2
  271. package/dist/cdn/shared-186e41cf.js +0 -1
  272. package/dist/cdn/shared-18918efe.js +0 -1
  273. package/dist/cdn/shared-3ab0306f.js +0 -1
  274. package/dist/cdn/shared-5875cb66.js +0 -1
  275. package/dist/cdn/shared-79d35787.js +0 -1
  276. package/dist/cdn/shared-851a7db5.js +0 -1
  277. package/dist/cdn/shared-90877857.js +0 -1
  278. package/dist/cdn/shared-fe45779e.js +0 -1
  279. package/dist/cdn/translations/customer-portal/se.json +0 -223
@@ -1,12 +1,12 @@
1
1
  import * as logos from "./logos.js";
2
- import { css } from 'lit-element';
3
- import { html } from 'lit-html';
4
- import { BooleanSelector } from '@foxy.io/sdk/core';
5
2
  import { ConfigurableMixin } from "../../../mixins/configurable.js";
3
+ import { TranslatableMixin } from "../../../mixins/translatable.js";
4
+ import { BooleanSelector } from '@foxy.io/sdk/core';
6
5
  import { NucleonElement } from "../NucleonElement/index.js";
7
6
  import { ThemeableMixin } from "../../../mixins/themeable.js";
8
- import { TranslatableMixin } from "../../../mixins/translatable.js";
9
7
  import { backgrounds } from "./backgrounds.js";
8
+ import { ifDefined } from 'lit-html/directives/if-defined';
9
+ import { css, html } from 'lit-element';
10
10
  import { classMap } from "../../../utils/class-map.js";
11
11
  const NS = 'payment-method-card';
12
12
  const Base = ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS)));
@@ -17,14 +17,71 @@ const Base = ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement,
17
17
  * @slot actions:after - **new in v1.4.0**
18
18
  * @slot actions:delete:before - **new in v1.4.0**
19
19
  * @slot actions:delete:after - **new in v1.4.0**
20
+ * @slot actions:update:before - **new in v1.27.0**
21
+ * @slot actions:update:after - **new in v1.27.0**
20
22
  *
21
- * @element foxy-payment-method-form
23
+ * @element foxy-payment-method-card
22
24
  * @since 1.2.0
23
25
  */
24
26
  export class PaymentMethodCard extends Base {
25
27
  constructor() {
26
28
  super(...arguments);
27
29
  this.templates = {};
30
+ /**
31
+ * Configuration URL for the Payment Card Embed. If provided,
32
+ * the card will have an option of updating payment method.
33
+ * Otherwise, only the delete option will be available.
34
+ */
35
+ this.embedUrl = null;
36
+ this.__renderActionsUpdate = () => {
37
+ var _a;
38
+ const hasCC = !!((_a = this.data) === null || _a === void 0 ? void 0 : _a.save_cc);
39
+ const buttonStyle = hasCC
40
+ ? '--lumo-primary-text-color: #fff; --lumo-primary-color-50pct: rgba(255, 255, 255, 0.5); --lumo-contrast-5pct: rgba(255, 255, 255, 0.05)'
41
+ : void 0;
42
+ return html `
43
+ <div class="flex">
44
+ ${this.renderTemplateOrSlot('actions:update:before')}
45
+
46
+ <foxy-form-dialog
47
+ data-testid="update-dialog"
48
+ readonlycontrols=${this.readonlySelector.zoom('actions:update:form')}
49
+ disabledcontrols=${this.disabledSelector.zoom('actions:update:form')}
50
+ hiddencontrols="status ${this.hiddenSelector.zoom('actions:update:form')}"
51
+ header=${hasCC ? 'dialog_header_update' : 'dialog_header_add'}
52
+ group=${this.group}
53
+ form="foxy-update-payment-method-form"
54
+ href=${this.href}
55
+ lang=${this.lang}
56
+ ns="${this.ns} dialog"
57
+ alert
58
+ close-on-patch
59
+ .props=${{ '.embedUrl': this.embedUrl }}
60
+ >
61
+ </foxy-form-dialog>
62
+
63
+ <vaadin-button
64
+ class=${ifDefined(hasCC ? 'px-xs rounded' : void 0)}
65
+ theme=${hasCC ? 'icon' : 'contrast small'}
66
+ style=${ifDefined(buttonStyle)}
67
+ aria-label=${this.t(hasCC ? 'update' : 'add')}
68
+ data-testid="actions:update"
69
+ ?disabled=${this.disabledSelector.matches('actions:update', true)}
70
+ @click=${(evt) => {
71
+ const button = evt.currentTarget;
72
+ const dialog = button.previousElementSibling;
73
+ dialog.show(button);
74
+ }}
75
+ >
76
+ ${hasCC
77
+ ? html `<iron-icon icon="icons:create"></iron-icon>`
78
+ : html `<foxy-i18n infer="" key="add"></foxy-i18n>`}
79
+ </vaadin-button>
80
+
81
+ ${this.renderTemplateOrSlot('actions:update:after')}
82
+ </div>
83
+ `;
84
+ };
28
85
  this.__renderActionsDelete = () => {
29
86
  return html `
30
87
  <div class="flex">
@@ -47,15 +104,24 @@ export class PaymentMethodCard extends Base {
47
104
  `;
48
105
  };
49
106
  this.__renderActions = () => {
107
+ const isUpdateHidden = this.hiddenSelector.matches('actions:update', true) || !this.embedUrl;
108
+ const isDeleteHidden = this.hiddenSelector.matches('actions:delete', true);
50
109
  return html `
51
- <div class="flex" data-testid="actions">
110
+ <div class="flex gap-s" data-testid="actions">
52
111
  ${this.renderTemplateOrSlot('actions:before')}
53
- ${this.hiddenSelector.matches('actions:delete', true) ? '' : this.__renderActionsDelete()}
112
+ ${isUpdateHidden ? '' : this.__renderActionsUpdate()}
113
+ ${isDeleteHidden ? '' : this.__renderActionsDelete()}
54
114
  ${this.renderTemplateOrSlot('actions:after')}
55
115
  </div>
56
116
  `;
57
117
  };
58
118
  }
119
+ static get properties() {
120
+ return {
121
+ ...super.properties,
122
+ embedUrl: { attribute: 'embed-url' },
123
+ };
124
+ }
59
125
  static get styles() {
60
126
  return [
61
127
  super.styles,
@@ -81,6 +147,7 @@ export class PaymentMethodCard extends Base {
81
147
  const { data, lang, ns } = this;
82
148
  if (this.in({ idle: 'template' }) || !(data === null || data === void 0 ? void 0 : data.save_cc) || !this.in('idle')) {
83
149
  const spinnerState = this.in('fail') ? 'error' : this.in('busy') ? 'busy' : 'empty';
150
+ const isUpdateHidden = this.hiddenSelector.matches('actions:update', true) || !this.embedUrl || !this.data;
84
151
  return html `
85
152
  <div
86
153
  class="ratio-card"
@@ -89,14 +156,16 @@ export class PaymentMethodCard extends Base {
89
156
  data-testid="wrapper"
90
157
  >
91
158
  <div class="h-full bg-contrast-5"></div>
92
- <div class="absolute inset-0 flex items-center justify-center">
159
+ <div class="absolute inset-0 flex flex-col gap-m items-center justify-center">
93
160
  <foxy-spinner
94
161
  data-testid="spinner"
162
+ layout="vertical"
95
163
  state=${spinnerState}
96
164
  lang=${this.lang}
97
165
  ns="${ns} ${(_b = (_a = customElements.get('foxy-spinner')) === null || _a === void 0 ? void 0 : _a.defaultNS) !== null && _b !== void 0 ? _b : ''}"
98
166
  >
99
167
  </foxy-spinner>
168
+ ${isUpdateHidden ? '' : this.__renderActionsUpdate()}
100
169
  </div>
101
170
  </div>
102
171
  `;
@@ -130,11 +199,11 @@ export class PaymentMethodCard extends Base {
130
199
  'justify-end': this.readonlyControls === BooleanSelector.True,
131
200
  })}
132
201
  >
202
+ <div class="mr-auto rounded h-m">${logo}</div>
133
203
  ${this.hiddenSelector.matches('actions', true) ? '' : this.__renderActions()}
134
- <div class="ml-auto rounded h-m">${logo}</div>
135
204
  </div>
136
205
 
137
- <div class="font-tnum leading-none flex justify-between">
206
+ <div class="font-tnum leading-none flex justify-between" style="color: white">
138
207
  <div data-testid="expiry">
139
208
  ${data.cc_exp_month && data.cc_exp_year
140
209
  ? html `
@@ -1 +1 @@
1
- {"version":3,"file":"PaymentMethodCard.js","sourceRoot":"","sources":["../../../../src/elements/public/PaymentMethodCard/PaymentMethodCard.ts"],"names":[],"mappings":"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","sourcesContent":["import * as logos from './logos';\n\nimport { CSSResultArray, css } from 'lit-element';\nimport { Data, Templates } from './types';\nimport { TemplateResult, html } from 'lit-html';\n\nimport { BooleanSelector } from '@foxy.io/sdk/core';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { DialogHideEvent } from '../../private/Dialog/DialogHideEvent';\nimport { InternalConfirmDialog } from '../../internal/InternalConfirmDialog/InternalConfirmDialog';\nimport { NucleonElement } from '../NucleonElement/index';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { backgrounds } from './backgrounds';\nimport { classMap } from '../../../utils/class-map';\n\nconst NS = 'payment-method-card';\nconst Base = ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS)));\n\n/**\n * Basic card displaying a payment method.\n *\n * @slot actions:before - **new in v1.4.0**\n * @slot actions:after - **new in v1.4.0**\n * @slot actions:delete:before - **new in v1.4.0**\n * @slot actions:delete:after - **new in v1.4.0**\n *\n * @element foxy-payment-method-form\n * @since 1.2.0\n */\nexport class PaymentMethodCard extends Base<Data> {\n static get styles(): CSSResultArray {\n return [\n super.styles,\n backgrounds,\n css`\n .ratio-card {\n padding-top: 63%;\n position: relative;\n height: 0;\n }\n\n .ratio-card > * {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n `,\n ];\n }\n\n templates: Templates = {};\n\n private readonly __renderActionsDelete = () => {\n return html`\n <div class=\"flex\">\n ${this.renderTemplateOrSlot('actions:delete:before')}\n\n <vaadin-button\n class=\"px-xs rounded\"\n theme=\"icon\"\n style=\"--lumo-primary-text-color: #fff; --lumo-primary-color-50pct: rgba(255, 255, 255, 0.5); --lumo-contrast-5pct: rgba(255, 255, 255, 0.05)\"\n aria-label=${this.t('delete').toString()}\n data-testid=\"actions:delete\"\n ?disabled=${this.disabledSelector.matches('actions:delete', true)}\n @click=${this.__handleDelete}\n >\n <iron-icon icon=\"icons:delete\"></iron-icon>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('actions:delete:after')}\n </div>\n `;\n };\n\n private readonly __renderActions = () => {\n return html`\n <div class=\"flex\" data-testid=\"actions\">\n ${this.renderTemplateOrSlot('actions:before')}\n ${this.hiddenSelector.matches('actions:delete', true) ? '' : this.__renderActionsDelete()}\n ${this.renderTemplateOrSlot('actions:after')}\n </div>\n `;\n };\n\n render(): TemplateResult {\n const { data, lang, ns } = this;\n\n if (this.in({ idle: 'template' }) || !data?.save_cc || !this.in('idle')) {\n const spinnerState = this.in('fail') ? 'error' : this.in('busy') ? 'busy' : 'empty';\n\n return html`\n <div\n class=\"ratio-card\"\n aria-live=\"polite\"\n aria-busy=${this.in('busy')}\n data-testid=\"wrapper\"\n >\n <div class=\"h-full bg-contrast-5\"></div>\n <div class=\"absolute inset-0 flex items-center justify-center\">\n <foxy-spinner\n data-testid=\"spinner\"\n state=${spinnerState}\n lang=${this.lang}\n ns=\"${ns} ${customElements.get('foxy-spinner')?.defaultNS ?? ''}\"\n >\n </foxy-spinner>\n </div>\n </div>\n `;\n }\n\n const type = data!.cc_type?.toLowerCase() ?? 'unknown';\n const logo = logos[type as keyof typeof logos] ?? logos.unknown;\n const last4Digits = data!.cc_number_masked?.substring(data!.cc_number_masked.length - 4);\n\n return html`\n <foxy-internal-confirm-dialog\n data-testid=\"confirm\"\n message=\"delete_prompt\"\n confirm=\"delete\"\n cancel=\"cancel\"\n header=\"delete\"\n theme=\"primary error\"\n lang=${lang}\n ns=${ns}\n id=\"confirm\"\n @hide=${this.__handleConfirmHide}\n >\n </foxy-internal-confirm-dialog>\n\n <div class=\"ratio-card\" data-testid=\"wrapper\" aria-busy=${this.in('busy')} aria-live=\"polite\">\n <div\n class=\"flex flex-col justify-between text-base text-m leading-m font-lumo p-m bg-unknown bg-${type}\"\n >\n <div\n class=${classMap({\n 'flex items-start': true,\n 'justify-between': this.readonlyControls === BooleanSelector.False,\n 'justify-end': this.readonlyControls === BooleanSelector.True,\n })}\n >\n ${this.hiddenSelector.matches('actions', true) ? '' : this.__renderActions()}\n <div class=\"ml-auto rounded h-m\">${logo}</div>\n </div>\n\n <div class=\"font-tnum leading-none flex justify-between\">\n <div data-testid=\"expiry\">\n ${data!.cc_exp_month && data.cc_exp_year\n ? html`\n <span class=\"sr-only\">${this.t('expires').toString()}&nbsp;</span>\n <span>${data!.cc_exp_month} / ${data!.cc_exp_year}</span>\n `\n : ''}\n </div>\n\n <div data-testid=\"number\">\n ${last4Digits\n ? html`\n <span class=\"sr-only\">${this.t('last_4_digits').toString()}&nbsp;</span>\n <span aria-hidden=\"true\">••••</span>\n <span>${last4Digits}</span>\n `\n : ''}\n </div>\n </div>\n </div>\n </div>\n `;\n }\n\n protected async _sendDelete(): Promise<null> {\n const body = JSON.stringify({ save_cc: false });\n await this._fetch(this.href, { method: 'PATCH', body });\n const rumour = NucleonElement.Rumour(this.group);\n\n rumour.share({ data: null, source: this.href, related: [this.parent] });\n return null;\n }\n\n private __handleDelete(evt: Event) {\n const confirm = this.renderRoot.querySelector('#confirm');\n (confirm as InternalConfirmDialog).show(evt.currentTarget as HTMLElement);\n }\n\n private __handleConfirmHide(evt: DialogHideEvent) {\n if (!evt.detail.cancelled) this.delete();\n }\n}\n"]}
1
+ {"version":3,"file":"PaymentMethodCard.js","sourceRoot":"","sources":["../../../../src/elements/public/PaymentMethodCard/PaymentMethodCard.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CSSResultArray, PropertyDeclarations } from 'lit-element';\nimport type { Data, Templates } from './types';\nimport type { DialogHideEvent } from '../../private/Dialog/DialogHideEvent';\nimport type { TemplateResult } from 'lit-html';\nimport type { FormDialog } from '../FormDialog/FormDialog';\n\nimport * as logos from './logos';\n\nimport { InternalConfirmDialog } from '../../internal/InternalConfirmDialog/InternalConfirmDialog';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { BooleanSelector } from '@foxy.io/sdk/core';\nimport { NucleonElement } from '../NucleonElement/index';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { backgrounds } from './backgrounds';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { css, html } from 'lit-element';\nimport { classMap } from '../../../utils/class-map';\n\nconst NS = 'payment-method-card';\nconst Base = ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS)));\n\n/**\n * Basic card displaying a payment method.\n *\n * @slot actions:before - **new in v1.4.0**\n * @slot actions:after - **new in v1.4.0**\n * @slot actions:delete:before - **new in v1.4.0**\n * @slot actions:delete:after - **new in v1.4.0**\n * @slot actions:update:before - **new in v1.27.0**\n * @slot actions:update:after - **new in v1.27.0**\n *\n * @element foxy-payment-method-card\n * @since 1.2.0\n */\nexport class PaymentMethodCard extends Base<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n embedUrl: { attribute: 'embed-url' },\n };\n }\n\n static get styles(): CSSResultArray {\n return [\n super.styles,\n backgrounds,\n css`\n .ratio-card {\n padding-top: 63%;\n position: relative;\n height: 0;\n }\n\n .ratio-card > * {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n `,\n ];\n }\n\n templates: Templates = {};\n\n /**\n * Configuration URL for the Payment Card Embed. If provided,\n * the card will have an option of updating payment method.\n * Otherwise, only the delete option will be available.\n */\n embedUrl: string | null = null;\n\n private readonly __renderActionsUpdate = () => {\n const hasCC = !!this.data?.save_cc;\n const buttonStyle = hasCC\n ? '--lumo-primary-text-color: #fff; --lumo-primary-color-50pct: rgba(255, 255, 255, 0.5); --lumo-contrast-5pct: rgba(255, 255, 255, 0.05)'\n : void 0;\n\n return html`\n <div class=\"flex\">\n ${this.renderTemplateOrSlot('actions:update:before')}\n\n <foxy-form-dialog\n data-testid=\"update-dialog\"\n readonlycontrols=${this.readonlySelector.zoom('actions:update:form')}\n disabledcontrols=${this.disabledSelector.zoom('actions:update:form')}\n hiddencontrols=\"status ${this.hiddenSelector.zoom('actions:update:form')}\"\n header=${hasCC ? 'dialog_header_update' : 'dialog_header_add'}\n group=${this.group}\n form=\"foxy-update-payment-method-form\"\n href=${this.href}\n lang=${this.lang}\n ns=\"${this.ns} dialog\"\n alert\n close-on-patch\n .props=${{ '.embedUrl': this.embedUrl }}\n >\n </foxy-form-dialog>\n\n <vaadin-button\n class=${ifDefined(hasCC ? 'px-xs rounded' : void 0)}\n theme=${hasCC ? 'icon' : 'contrast small'}\n style=${ifDefined(buttonStyle)}\n aria-label=${this.t(hasCC ? 'update' : 'add')}\n data-testid=\"actions:update\"\n ?disabled=${this.disabledSelector.matches('actions:update', true)}\n @click=${(evt: CustomEvent) => {\n const button = evt.currentTarget as HTMLElement;\n const dialog = button.previousElementSibling as FormDialog;\n dialog.show(button);\n }}\n >\n ${hasCC\n ? html`<iron-icon icon=\"icons:create\"></iron-icon>`\n : html`<foxy-i18n infer=\"\" key=\"add\"></foxy-i18n>`}\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('actions:update:after')}\n </div>\n `;\n };\n\n private readonly __renderActionsDelete = () => {\n return html`\n <div class=\"flex\">\n ${this.renderTemplateOrSlot('actions:delete:before')}\n\n <vaadin-button\n class=\"px-xs rounded\"\n theme=\"icon\"\n style=\"--lumo-primary-text-color: #fff; --lumo-primary-color-50pct: rgba(255, 255, 255, 0.5); --lumo-contrast-5pct: rgba(255, 255, 255, 0.05)\"\n aria-label=${this.t('delete').toString()}\n data-testid=\"actions:delete\"\n ?disabled=${this.disabledSelector.matches('actions:delete', true)}\n @click=${this.__handleDelete}\n >\n <iron-icon icon=\"icons:delete\"></iron-icon>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('actions:delete:after')}\n </div>\n `;\n };\n\n private readonly __renderActions = () => {\n const isUpdateHidden = this.hiddenSelector.matches('actions:update', true) || !this.embedUrl;\n const isDeleteHidden = this.hiddenSelector.matches('actions:delete', true);\n\n return html`\n <div class=\"flex gap-s\" data-testid=\"actions\">\n ${this.renderTemplateOrSlot('actions:before')}\n ${isUpdateHidden ? '' : this.__renderActionsUpdate()}\n ${isDeleteHidden ? '' : this.__renderActionsDelete()}\n ${this.renderTemplateOrSlot('actions:after')}\n </div>\n `;\n };\n\n render(): TemplateResult {\n const { data, lang, ns } = this;\n\n if (this.in({ idle: 'template' }) || !data?.save_cc || !this.in('idle')) {\n const spinnerState = this.in('fail') ? 'error' : this.in('busy') ? 'busy' : 'empty';\n const isUpdateHidden =\n this.hiddenSelector.matches('actions:update', true) || !this.embedUrl || !this.data;\n\n return html`\n <div\n class=\"ratio-card\"\n aria-live=\"polite\"\n aria-busy=${this.in('busy')}\n data-testid=\"wrapper\"\n >\n <div class=\"h-full bg-contrast-5\"></div>\n <div class=\"absolute inset-0 flex flex-col gap-m items-center justify-center\">\n <foxy-spinner\n data-testid=\"spinner\"\n layout=\"vertical\"\n state=${spinnerState}\n lang=${this.lang}\n ns=\"${ns} ${customElements.get('foxy-spinner')?.defaultNS ?? ''}\"\n >\n </foxy-spinner>\n ${isUpdateHidden ? '' : this.__renderActionsUpdate()}\n </div>\n </div>\n `;\n }\n\n const type = data!.cc_type?.toLowerCase() ?? 'unknown';\n const logo = logos[type as keyof typeof logos] ?? logos.unknown;\n const last4Digits = data!.cc_number_masked?.substring(data!.cc_number_masked.length - 4);\n\n return html`\n <foxy-internal-confirm-dialog\n data-testid=\"confirm\"\n message=\"delete_prompt\"\n confirm=\"delete\"\n cancel=\"cancel\"\n header=\"delete\"\n theme=\"primary error\"\n lang=${lang}\n ns=${ns}\n id=\"confirm\"\n @hide=${this.__handleConfirmHide}\n >\n </foxy-internal-confirm-dialog>\n\n <div class=\"ratio-card\" data-testid=\"wrapper\" aria-busy=${this.in('busy')} aria-live=\"polite\">\n <div\n class=\"flex flex-col justify-between text-base text-m leading-m font-lumo p-m bg-unknown bg-${type}\"\n >\n <div\n class=${classMap({\n 'flex items-start': true,\n 'justify-between': this.readonlyControls === BooleanSelector.False,\n 'justify-end': this.readonlyControls === BooleanSelector.True,\n })}\n >\n <div class=\"mr-auto rounded h-m\">${logo}</div>\n ${this.hiddenSelector.matches('actions', true) ? '' : this.__renderActions()}\n </div>\n\n <div class=\"font-tnum leading-none flex justify-between\" style=\"color: white\">\n <div data-testid=\"expiry\">\n ${data!.cc_exp_month && data.cc_exp_year\n ? html`\n <span class=\"sr-only\">${this.t('expires').toString()}&nbsp;</span>\n <span>${data!.cc_exp_month} / ${data!.cc_exp_year}</span>\n `\n : ''}\n </div>\n\n <div data-testid=\"number\">\n ${last4Digits\n ? html`\n <span class=\"sr-only\">${this.t('last_4_digits').toString()}&nbsp;</span>\n <span aria-hidden=\"true\">••••</span>\n <span>${last4Digits}</span>\n `\n : ''}\n </div>\n </div>\n </div>\n </div>\n `;\n }\n\n protected async _sendDelete(): Promise<null> {\n const body = JSON.stringify({ save_cc: false });\n await this._fetch(this.href, { method: 'PATCH', body });\n const rumour = NucleonElement.Rumour(this.group);\n\n rumour.share({ data: null, source: this.href, related: [this.parent] });\n return null;\n }\n\n private __handleDelete(evt: Event) {\n const confirm = this.renderRoot.querySelector('#confirm');\n (confirm as InternalConfirmDialog).show(evt.currentTarget as HTMLElement);\n }\n\n private __handleConfirmHide(evt: DialogHideEvent) {\n if (!evt.detail.cancelled) this.delete();\n }\n}\n"]}
@@ -3,6 +3,8 @@ import '@polymer/iron-icons';
3
3
  import '@vaadin/vaadin-button';
4
4
  import '../../internal/InternalConfirmDialog/index';
5
5
  import '../../internal/InternalSandbox/index';
6
+ import '../UpdatePaymentMethodForm/index';
7
+ import '../FormDialog/index';
6
8
  import '../Spinner/index';
7
9
  import '../I18n/index';
8
10
  import { PaymentMethodCard } from './PaymentMethodCard';
@@ -3,6 +3,8 @@ import '@polymer/iron-icons';
3
3
  import '@vaadin/vaadin-button';
4
4
  import "../../internal/InternalConfirmDialog/index.js";
5
5
  import "../../internal/InternalSandbox/index.js";
6
+ import "../UpdatePaymentMethodForm/index.js";
7
+ import "../FormDialog/index.js";
6
8
  import "../Spinner/index.js";
7
9
  import "../I18n/index.js";
8
10
  import { PaymentMethodCard } from "./PaymentMethodCard.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/PaymentMethodCard/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAC5B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,uBAAuB,CAAC;AAC/B,uDAAoD;AACpD,iDAA8C;AAC9C,6BAA0B;AAC1B,0BAAuB;AAEvB,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AAExD,cAAc,CAAC,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAC;AAErE,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import '@polymer/iron-icon';\nimport '@polymer/iron-icons';\nimport '@vaadin/vaadin-button';\nimport '../../internal/InternalConfirmDialog/index';\nimport '../../internal/InternalSandbox/index';\nimport '../Spinner/index';\nimport '../I18n/index';\n\nimport { PaymentMethodCard } from './PaymentMethodCard';\n\ncustomElements.define('foxy-payment-method-card', PaymentMethodCard);\n\nexport { PaymentMethodCard };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/PaymentMethodCard/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAC5B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,uBAAuB,CAAC;AAC/B,uDAAoD;AACpD,iDAA8C;AAC9C,6CAA0C;AAC1C,gCAA6B;AAC7B,6BAA0B;AAC1B,0BAAuB;AAEvB,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AAExD,cAAc,CAAC,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAC;AAErE,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import '@polymer/iron-icon';\nimport '@polymer/iron-icons';\nimport '@vaadin/vaadin-button';\nimport '../../internal/InternalConfirmDialog/index';\nimport '../../internal/InternalSandbox/index';\nimport '../UpdatePaymentMethodForm/index';\nimport '../FormDialog/index';\nimport '../Spinner/index';\nimport '../I18n/index';\n\nimport { PaymentMethodCard } from './PaymentMethodCard';\n\ncustomElements.define('foxy-payment-method-card', PaymentMethodCard);\n\nexport { PaymentMethodCard };\n"]}
@@ -137,8 +137,7 @@ export class PaymentsApiPaymentMethodForm extends Base {
137
137
  for (const field of block.fields) {
138
138
  if ('optional' in field) {
139
139
  if (!field.optional) {
140
- const path = [block.parent_id, block.id, field.id].filter(v => !!v);
141
- if (!has(additionalFields, path)) {
140
+ if (!has(additionalFields, field.id)) {
142
141
  if (field.type !== 'checkbox') {
143
142
  return 'additional-fields:v8n_invalid';
144
143
  }
@@ -161,6 +160,8 @@ export class PaymentsApiPaymentMethodForm extends Base {
161
160
  return Object.entries((_a = this.__availablePaymentMethods) !== null && _a !== void 0 ? _a : {})
162
161
  .sort((a, b) => a[0].localeCompare(b[0], 'en'))
163
162
  .reduce((groups, [type, helper]) => {
163
+ if (helper.is_deprecated)
164
+ return groups;
164
165
  const firstChar = type.charAt(0).toUpperCase();
165
166
  const isSpecialCharacter = !/\w/.test(firstChar);
166
167
  const name = isSpecialCharacter ? '#' : firstChar;
@@ -203,6 +204,29 @@ export class PaymentsApiPaymentMethodForm extends Base {
203
204
  }
204
205
  __renderPaymentMethodSelector() {
205
206
  return html `
207
+ <figure data-testid="logo" class="relative flex flex-col gap-m p-m items-center">
208
+ <img
209
+ class="relative h-xl w-xl object-cover rounded-full bg-contrast-20 flex-shrink-0 shadow-xs"
210
+ src=${PaymentsApiPaymentMethodForm.defaultImageSrc}
211
+ alt=""
212
+ />
213
+
214
+ <figcaption class="relative min-w-0 font-medium text-xl text-center">
215
+ <foxy-i18n infer="" key="select_method_title"></foxy-i18n>
216
+ </figcaption>
217
+ </figure>
218
+
219
+ <section data-testid="select-method-list" class="-mt-m">
220
+ ${this.__groupedAvailablePaymentMethods.map(({ name, items }) => {
221
+ return html `
222
+ <p class="font-medium text-tertiary py-m">${name}</p>
223
+ <ul class="grid grid-cols-2 gap-m">
224
+ ${items.map(item => html `<li>${this.__renderPaymentMethodButton(item)}</li>`)}
225
+ </ul>
226
+ `;
227
+ })}
228
+ </section>
229
+
206
230
  <foxy-nucleon
207
231
  class="hidden"
208
232
  infer=""
@@ -211,26 +235,6 @@ export class PaymentsApiPaymentMethodForm extends Base {
211
235
  @update=${() => this.requestUpdate()}
212
236
  >
213
237
  </foxy-nucleon>
214
-
215
- <foxy-i18n
216
- class="block text-xxl font-medium border-b border-contrast-10 pb-m"
217
- infer=""
218
- key="select_method_title"
219
- >
220
- </foxy-i18n>
221
-
222
- <section data-testid="select-method-list">
223
- <div class="-my-s">
224
- ${this.__groupedAvailablePaymentMethods.map(({ name, items }) => {
225
- return html `
226
- <p class="w-m text-center font-medium text-tertiary py-s">${name}</p>
227
- <ul class="grid grid-cols-1">
228
- ${items.map(item => html `<li>${this.__renderPaymentMethodButton(item)}</li>`)}
229
- </ul>
230
- `;
231
- })}
232
- </div>
233
- </section>
234
238
  `;
235
239
  }
236
240
  __renderPaymentMethodConfig(type) {
@@ -246,7 +250,18 @@ export class PaymentsApiPaymentMethodForm extends Base {
246
250
  />
247
251
 
248
252
  <figcaption class="relative min-w-0 font-medium text-xl text-center">
249
- ${(_d = (_c = this.form.helper) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : this.form.type}&ZeroWidthSpace;
253
+ <div>${(_d = (_c = this.form.helper) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : this.form.type}&ZeroWidthSpace;</div>
254
+ ${((_e = this.data) === null || _e === void 0 ? void 0 : _e.type) ? ''
255
+ : html `
256
+ <vaadin-button
257
+ data-testid="select-another-button"
258
+ theme="tertiary-inline"
259
+ class="text-m"
260
+ @click=${() => this.undo()}
261
+ >
262
+ <foxy-i18n infer="" key="select_another_button_label"></foxy-i18n>
263
+ </vaadin-button>
264
+ `}
250
265
  </figcaption>
251
266
  </figure>
252
267
 
@@ -326,7 +341,7 @@ export class PaymentsApiPaymentMethodForm extends Base {
326
341
 
327
342
  <foxy-internal-text-control infer="description"></foxy-internal-text-control>
328
343
 
329
- ${((_e = this.form.helper) === null || _e === void 0 ? void 0 : _e.supports_3d_secure) ? html `
344
+ ${((_f = this.form.helper) === null || _f === void 0 ? void 0 : _f.supports_3d_secure) ? html `
330
345
  <foxy-internal-radio-group-control
331
346
  infer="three-d-secure-toggle"
332
347
  class="-mb-s"
@@ -350,58 +365,54 @@ export class PaymentsApiPaymentMethodForm extends Base {
350
365
  : ''}
351
366
  `
352
367
  : ''}
353
- ${((_f = this.data) === null || _f === void 0 ? void 0 : _f.type) ? ''
354
- : html `
355
- <vaadin-button
356
- data-testid="select-another-button"
357
- theme="contrast"
358
- @click=${() => this.undo()}
359
- >
360
- <foxy-i18n infer="" key="select_another_button_label"></foxy-i18n>
361
- </vaadin-button>
362
- `}
363
368
  ${super.renderBody()}
364
369
  `;
365
370
  }
366
371
  __renderPaymentMethodButton({ type, helper }) {
367
372
  var _a, _b;
368
373
  const defaultSrc = PaymentsApiPaymentMethodForm.defaultImageSrc;
374
+ const src = (_b = (_a = this.getImageSrc) === null || _a === void 0 ? void 0 : _a.call(this, type)) !== null && _b !== void 0 ? _b : defaultSrc;
375
+ const onError = (evt) => (evt.currentTarget.src = defaultSrc);
369
376
  return html `
370
377
  <button
371
378
  class=${classMap({
372
- 'w-full block text-left p-s rounded -mx-s': true,
373
- 'transition-colors hover-bg-contrast-5': !helper.conflict,
379
+ 'relative w-full block text-left p-s rounded bg-contrast-5 overflow-hidden': true,
380
+ 'focus-outline-none focus-ring-2 focus-ring-primary-50': true,
381
+ 'transition-colors hover-bg-contrast-10': !helper.conflict,
374
382
  'cursor-default': !!helper.conflict,
375
383
  })}
376
384
  ?disabled=${!!helper.conflict}
385
+ title=${helper.conflict ? this.t('conflict_message', helper.conflict) : ''}
377
386
  @click=${() => this.edit({ type, helper })}
378
387
  >
379
- <figure class="flex items-center gap-m h-m">
388
+ <img
389
+ class="absolute top-0 left-0 w-1-2 h-full object-cover bg-center filter saturate-200 blur-3xl"
390
+ style="transform: translate3d(0, 0, 0)"
391
+ src=${src}
392
+ alt=""
393
+ ?hidden=${!!helper.conflict}
394
+ @error=${onError}
395
+ />
396
+
397
+ <figure class="relative flex flex-col gap-m">
380
398
  <img
381
- class="relative h-m w-m object-cover rounded-full bg-contrast-20 flex-shrink-0 shadow-xs"
382
- src=${(_b = (_a = this.getImageSrc) === null || _a === void 0 ? void 0 : _a.call(this, type)) !== null && _b !== void 0 ? _b : defaultSrc}
399
+ class=${classMap({
400
+ 'h-m w-m object-cover rounded-full bg-contrast-20 flex-shrink-0 shadow-xs': true,
401
+ 'filter grayscale': !!helper.conflict,
402
+ })}
403
+ src=${src}
383
404
  alt=""
384
- @error=${(evt) => (evt.currentTarget.src = defaultSrc)}
405
+ @error=${onError}
385
406
  />
386
407
 
387
408
  <figcaption
388
409
  class=${classMap({
389
410
  'min-w-0 flex-1 truncate leading-s': true,
390
- 'text-tertiary': !!helper.conflict,
411
+ 'text-disabled': !!helper.conflict,
391
412
  })}
392
413
  >
393
414
  <div class="font-medium">${helper.name}&ZeroWidthSpace;</div>
394
- ${helper.conflict
395
- ? html `
396
- <foxy-i18n
397
- class="block text-tertiary text-xs"
398
- infer=""
399
- key="conflict_message"
400
- .options=${helper.conflict}
401
- >
402
- </foxy-i18n>
403
- `
404
- : ''}
415
+ <div class="text-xs ${helper.conflict ? '' : 'text-secondary'}">${type}</div>
405
416
  </figcaption>
406
417
  </figure>
407
418
  </button>
@@ -410,13 +421,12 @@ export class PaymentsApiPaymentMethodForm extends Base {
410
421
  __renderBlock(block) {
411
422
  return html `${block.fields.map(field => {
412
423
  var _a, _b, _c;
413
- const path = [block.parent_id, block.id, field.id].filter(v => !!v);
414
- const scope = ['additional-fields', ...path].join('-').replace(/_/g, '-');
424
+ const scope = ['additional-fields', field.id].join('-').replace(/_/g, '-');
415
425
  const getValue = () => {
416
426
  var _a, _b;
417
427
  try {
418
428
  const config = JSON.parse((_a = this.form.additional_fields) !== null && _a !== void 0 ? _a : '{}');
419
- return (_b = get(config, path)) !== null && _b !== void 0 ? _b : config.default_value;
429
+ return (_b = get(config, field.id)) !== null && _b !== void 0 ? _b : config.default_value;
420
430
  }
421
431
  catch (_c) {
422
432
  return field.default_value;
@@ -426,7 +436,7 @@ export class PaymentsApiPaymentMethodForm extends Base {
426
436
  var _a;
427
437
  try {
428
438
  const config = JSON.parse((_a = this.form.additional_fields) !== null && _a !== void 0 ? _a : '{}');
429
- this.edit({ additional_fields: JSON.stringify(set(config, path, newValue)) });
439
+ this.edit({ additional_fields: JSON.stringify(set(config, field.id, newValue)) });
430
440
  }
431
441
  catch (_b) {
432
442
  return '';
@@ -1 +1 @@
1
- {"version":3,"file":"PaymentsApiPaymentMethodForm.js","sourceRoot":"","sources":["../../../../src/elements/public/PaymentsApiPaymentMethodForm/PaymentsApiPaymentMethodForm.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AvailablePaymentMethods } from '../PaymentsApi/api/types';\nimport type { Templates, Block, Data } from './types';\nimport type { PropertyDeclarations } from 'lit-element';\nimport type { NucleonElement } from '../NucleonElement/NucleonElement';\nimport type { TemplateResult } from 'lit-html';\nimport type { TabsElement } from '@vaadin/vaadin-tabs';\nimport type { NucleonV8N } from '../NucleonElement/types';\n\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { InternalForm } from '../../internal/InternalForm/InternalForm';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { classMap } from '../../../utils/class-map';\nimport { html } from 'lit-html';\n\nimport has from 'lodash-es/has';\nimport get from 'lodash-es/get';\nimport set from 'lodash-es/set';\n\ntype PaymentMethod = {\n helper: AvailablePaymentMethods['values'][string];\n type: string;\n};\n\nconst NS = 'payments-api-payment-method-form';\nconst Base = TranslatableMixin(InternalForm, NS);\n\n/**\n * Form element for the `fx:payment_method` resource of Payments API.\n *\n * _Payments API is a client-side virtual API layer built on top of hAPI\n * in an attempt to streamline access to stores' payment method settings\n * that is currently a bit quirky due to the legacy functionality. To use\n * this element with hAPI, wrap it into a foxy-payments-api node._\n *\n * @slot description:before\n * @slot description:after\n *\n * @slot account-id:before\n * @slot account-id:after\n *\n * @slot account-key:before\n * @slot account-key:after\n *\n * @slot third-party-key:before\n * @slot third-party-key:after\n *\n * @slot test-account-id:before\n * @slot test-account-id:after\n *\n * @slot test-account-key:before\n * @slot test-account-key:after\n *\n * @slot test-third-party-key:before\n * @slot test-third-party-key:after\n *\n * @slot additional-fields-[field-name-in-kebab-case]:before\n * @slot additional-fields-[field-name-in-kebab-case]:after\n *\n * @slot three-d-secure-toggle:before\n * @slot three-d-secure-toggle:after\n *\n * @slot three-d-secure-response:before\n * @slot three-d-secure-response:after\n *\n * @slot timestamps:before\n * @slot timestamps:after\n *\n * @slot create:before\n * @slot create:after\n *\n * @slot delete:before\n * @slot delete:after\n *\n * @element foxy-payments-api-payment-method-form\n * @since 1.21.0\n */\nexport class PaymentsApiPaymentMethodForm extends Base<Data> {\n static get defaultImageSrc(): string {\n return \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 44 44'%3E%3Cpath fill='%23fff' d='m29.3 14 14-14H32.1l-14 14h11.2Zm2.7 9.9 12-12V.7L30.62 14.1A2 2 0 0 1 32 16v7.9ZM13.31 44h11.18L44 24.5V13.3l-12 12V28a2 2 0 0 1-2 2h-2.69l-14 14Zm-1.41 0H.7l14-14h11.2l-14 14Zm14 0h11.2l6.9-6.9V25.9L25.9 44Zm12.6 0H44v-5.5L38.5 44Z'/%3E%3Cpath fill='%23fff' d='M30 28H14v-6h16v6Zm0-10v-2H14v2h16ZM0 43.3l13.4-13.4A2 2 0 0 1 12 28v-7.9L0 32.12V43.3Z'/%3E%3Cpath fill='%23fff' d='M16.7 14H14c-1.11 0-1.99.89-1.99 2v2.7L0 30.7V19.52L19.52 0H30.7l-14 14Zm1.4-14H6.92L0 6.92V18.1L18.1 0ZM5.5 0H0v5.5L5.5 0Z'/%3E%3C/svg%3E\";\n }\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n __tab: { attribute: false },\n getImageSrc: { attribute: false },\n };\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [\n ({ description: v }) => !v || v.length <= 100 || 'description:v8n_too_long',\n ({ type: v }) => !!v || 'type:v8n_required',\n\n form => {\n const blocks = form.helper?.additional_fields?.blocks ?? [];\n let additionalFields: Record<string, unknown>;\n\n try {\n additionalFields = JSON.parse(form.additional_fields ?? '{}');\n } catch {\n additionalFields = {};\n }\n\n for (const block of blocks) {\n for (const field of block.fields) {\n if ('optional' in (field as Record<string, unknown>)) {\n if (!(field as Record<string, unknown>).optional) {\n const path = [block.parent_id, block.id, field.id].filter(v => !!v);\n\n if (!has(additionalFields, path)) {\n if (field.type !== 'checkbox') {\n return 'additional-fields:v8n_invalid';\n }\n }\n }\n }\n }\n }\n\n return true;\n },\n ];\n }\n\n /** A function that returns a URL of a payment method icon based on the given type. */\n getImageSrc: ((type: string) => string) | null = null;\n\n /** Template render functions mapped to their name. */\n templates: Templates = {};\n\n private readonly __availablePaymentMethodsLoaderId = 'availablePaymentMethodsLoader';\n\n private readonly __threeDSecureResponseGetValue = () => {\n return this.form.config_3d_secure?.endsWith('require_valid_response') ? ['valid_only'] : [];\n };\n\n private readonly __threeDSecureResponseSetValue = (newValue: string[]) => {\n const postfix = newValue.includes('valid_only') ? '_require_valid_response' : '';\n\n const config = this.form.config_3d_secure;\n const type = config?.startsWith('all_cards') ? 'all_cards' : 'maestro_only';\n\n this.edit({\n config_3d_secure: `${type}${postfix}` as Data['config_3d_secure'],\n });\n };\n\n private readonly __threeDSecureResponseOptions = [\n { value: 'valid_only', label: 'option_valid_only' },\n ];\n\n private readonly __threeDSecureToggleGetValue = () => {\n const config = this.form.config_3d_secure;\n\n if (config?.startsWith('all_cards')) return 'all_cards';\n if (config?.startsWith('maestro_only')) return 'maestro_only';\n\n return 'off';\n };\n\n private readonly __threeDSecureToggleSetValue = (\n newValue: 'off' | 'all_cards' | 'maestro_only'\n ) => {\n let newFormValue = '';\n\n if (newValue === 'all_cards' || newValue === 'maestro_only') {\n if (this.form.config_3d_secure?.endsWith('require_valid_response')) {\n newFormValue = `${newValue}_require_valid_response`;\n } else {\n newFormValue = newValue;\n }\n }\n\n this.edit({ config_3d_secure: newFormValue as Data['config_3d_secure'] });\n };\n\n private readonly __threeDSecureToggleOptions = [\n { value: 'off', label: 'option_off' },\n { value: 'all_cards', label: 'option_all_cards' },\n { value: 'maestro_only', label: 'option_maestro_only' },\n ];\n\n private __tab = 0;\n\n renderBody(): TemplateResult {\n return this.form.type\n ? this.__renderPaymentMethodConfig(this.form.type)\n : this.__renderPaymentMethodSelector();\n }\n\n private get __groupedAvailablePaymentMethods() {\n return Object.entries(this.__availablePaymentMethods ?? {})\n .sort((a, b) => a[0].localeCompare(b[0], 'en'))\n .reduce((groups, [type, helper]) => {\n const firstChar = type.charAt(0).toUpperCase();\n const isSpecialCharacter = !/\\w/.test(firstChar);\n const name = isSpecialCharacter ? '#' : firstChar;\n const group = groups.find(group => group.name === name);\n\n if (group) {\n group.items.push({ type, helper });\n } else {\n groups.push({ name, items: [{ type, helper }] });\n }\n\n return groups;\n }, [] as { name: string; items: PaymentMethod[] }[]);\n }\n\n private get __availablePaymentMethodsLoader() {\n type Loader = NucleonElement<AvailablePaymentMethods>;\n return this.renderRoot.querySelector<Loader>(`#${this.__availablePaymentMethodsLoaderId}`);\n }\n\n private get __availablePaymentMethodsHref() {\n try {\n const presetIdRegex = /\\/payment_presets\\/(?<presetId>.+)\\//;\n const pathname = new URL(this.href || this.parent).pathname;\n const presetId = presetIdRegex.exec(pathname)!.groups!.presetId;\n const url = new URL(\n `/payment_presets/${presetId}/available_payment_methods`,\n this.href || this.parent\n );\n\n return url.toString();\n } catch {\n // ignore\n }\n }\n\n private get __availablePaymentMethods() {\n return this.__availablePaymentMethodsLoader?.data?.values;\n }\n\n private get __liveBlocks() {\n return this.form.helper?.additional_fields?.blocks.filter(block => block.is_live) ?? [];\n }\n\n private get __testBlocks() {\n return this.form.helper?.additional_fields?.blocks.filter(block => !block.is_live) ?? [];\n }\n\n private __renderPaymentMethodSelector() {\n return html`\n <foxy-nucleon\n class=\"hidden\"\n infer=\"\"\n href=${ifDefined(this.__availablePaymentMethodsHref)}\n id=${this.__availablePaymentMethodsLoaderId}\n @update=${() => this.requestUpdate()}\n >\n </foxy-nucleon>\n\n <foxy-i18n\n class=\"block text-xxl font-medium border-b border-contrast-10 pb-m\"\n infer=\"\"\n key=\"select_method_title\"\n >\n </foxy-i18n>\n\n <section data-testid=\"select-method-list\">\n <div class=\"-my-s\">\n ${this.__groupedAvailablePaymentMethods.map(({ name, items }) => {\n return html`\n <p class=\"w-m text-center font-medium text-tertiary py-s\">${name}</p>\n <ul class=\"grid grid-cols-1\">\n ${items.map(item => html`<li>${this.__renderPaymentMethodButton(item)}</li>`)}\n </ul>\n `;\n })}\n </div>\n </section>\n `;\n }\n\n private __renderPaymentMethodConfig(type: string) {\n const defaultSrc = PaymentsApiPaymentMethodForm.defaultImageSrc;\n\n return html`\n <figure data-testid=\"logo\" class=\"relative flex flex-col gap-m p-m items-center\">\n <img\n class=\"relative h-xl w-xl object-cover rounded-full bg-contrast-20 flex-shrink-0 shadow-xs\"\n src=${this.getImageSrc?.(type) ?? defaultSrc}\n alt=\"\"\n @error=${(evt: Event) => ((evt.currentTarget as HTMLImageElement).src = defaultSrc)}\n />\n\n <figcaption class=\"relative min-w-0 font-medium text-xl text-center\">\n ${this.form.helper?.name ?? this.form.type}&ZeroWidthSpace;\n </figcaption>\n </figure>\n\n <div class=\"rounded border border-contrast-10\">\n <vaadin-tabs\n selected=${this.__tab}\n theme=\"centered\"\n @selected-changed=${(evt: CustomEvent) => {\n const tabs = evt.currentTarget as TabsElement;\n this.__tab = tabs.selected ?? 0;\n }}\n >\n <vaadin-tab><foxy-i18n infer=\"\" key=\"tab_live\"></foxy-i18n></vaadin-tab>\n <vaadin-tab><foxy-i18n infer=\"\" key=\"tab_test\"></foxy-i18n></vaadin-tab>\n </vaadin-tabs>\n\n <div class=\"overflow-hidden\" style=\"--lumo-border-radius: var(--lumo-border-radius-s)\">\n <div\n data-testid=\"tab-content\"\n class=\"grid grid-cols-2 gap-m transition-transform transform duration-300\"\n style=${classMap({\n 'width: calc(200% + var(--lumo-space-m));': true,\n '--tw-translate-x: 0;': this.__tab === 0,\n '--tw-translate-x: calc(-50% - (var(--lumo-space-m) / 2));': this.__tab !== 0,\n })}\n >\n ${['live', 'test'].map((type, index) => {\n const prefix = index === 0 ? '' : `${type}-`;\n const blocks = index === 0 ? this.__liveBlocks : this.__testBlocks;\n\n return html`\n <div\n class=${classMap({\n 'grid grid-cols-1 gap-m p-m transition-opacity duration-300': true,\n 'opacity-100': this.__tab === index,\n 'opacity-0': this.__tab !== index,\n })}\n >\n ${this.form.helper?.id_description\n ? html`\n <foxy-internal-text-control\n placeholder=${this.t('default_additional_field_placeholder')}\n helper-text=\"\"\n label=${this.form.helper.id_description}\n infer=\"${prefix}account-id\"\n >\n </foxy-internal-text-control>\n `\n : ''}\n ${this.form.helper?.third_party_key_description\n ? html`\n <foxy-internal-text-control\n placeholder=${this.t('default_additional_field_placeholder')}\n helper-text=\"\"\n label=${this.form.helper.third_party_key_description}\n infer=\"${prefix}third-party-key\"\n >\n </foxy-internal-text-control>\n `\n : ''}\n ${this.form.helper?.key_description\n ? html`\n <foxy-internal-text-control\n placeholder=${this.t('default_additional_field_placeholder')}\n helper-text=\"\"\n label=${this.form.helper.key_description}\n infer=\"${prefix}account-key\"\n >\n </foxy-internal-text-control>\n `\n : ''}\n ${blocks.map(block => this.__renderBlock(block))}\n </div>\n `;\n })}\n </div>\n </div>\n </div>\n\n <foxy-internal-text-control infer=\"description\"></foxy-internal-text-control>\n\n ${this.form.helper?.supports_3d_secure\n ? html`\n <foxy-internal-radio-group-control\n infer=\"three-d-secure-toggle\"\n class=\"-mb-s\"\n .getValue=${this.__threeDSecureToggleGetValue}\n .setValue=${this.__threeDSecureToggleSetValue}\n .options=${this.__threeDSecureToggleOptions}\n >\n </foxy-internal-radio-group-control>\n\n ${this.form.config_3d_secure\n ? html`\n <foxy-internal-checkbox-group-control\n infer=\"three-d-secure-response\"\n class=\"-mb-s\"\n .getValue=${this.__threeDSecureResponseGetValue}\n .setValue=${this.__threeDSecureResponseSetValue}\n .options=${this.__threeDSecureResponseOptions}\n >\n </foxy-internal-checkbox-group-control>\n `\n : ''}\n `\n : ''}\n ${this.data?.type\n ? ''\n : html`\n <vaadin-button\n data-testid=\"select-another-button\"\n theme=\"contrast\"\n @click=${() => this.undo()}\n >\n <foxy-i18n infer=\"\" key=\"select_another_button_label\"></foxy-i18n>\n </vaadin-button>\n `}\n ${super.renderBody()}\n `;\n }\n\n private __renderPaymentMethodButton({ type, helper }: PaymentMethod) {\n const defaultSrc = PaymentsApiPaymentMethodForm.defaultImageSrc;\n\n return html`\n <button\n class=${classMap({\n 'w-full block text-left p-s rounded -mx-s': true,\n 'transition-colors hover-bg-contrast-5': !helper.conflict,\n 'cursor-default': !!helper.conflict,\n })}\n ?disabled=${!!helper.conflict}\n @click=${() => this.edit({ type, helper })}\n >\n <figure class=\"flex items-center gap-m h-m\">\n <img\n class=\"relative h-m w-m object-cover rounded-full bg-contrast-20 flex-shrink-0 shadow-xs\"\n src=${this.getImageSrc?.(type) ?? defaultSrc}\n alt=\"\"\n @error=${(evt: Event) => ((evt.currentTarget as HTMLImageElement).src = defaultSrc)}\n />\n\n <figcaption\n class=${classMap({\n 'min-w-0 flex-1 truncate leading-s': true,\n 'text-tertiary': !!helper.conflict,\n })}\n >\n <div class=\"font-medium\">${helper.name}&ZeroWidthSpace;</div>\n ${helper.conflict\n ? html`\n <foxy-i18n\n class=\"block text-tertiary text-xs\"\n infer=\"\"\n key=\"conflict_message\"\n .options=${helper.conflict}\n >\n </foxy-i18n>\n `\n : ''}\n </figcaption>\n </figure>\n </button>\n `;\n }\n\n private __renderBlock(block: Block) {\n return html`${block.fields.map(field => {\n const path = [block.parent_id, block.id, field.id].filter(v => !!v);\n const scope = ['additional-fields', ...path].join('-').replace(/_/g, '-');\n\n const getValue = () => {\n try {\n const config = JSON.parse(this.form.additional_fields ?? '{}');\n return get(config, path) ?? config.default_value;\n } catch {\n return field.default_value;\n }\n };\n\n const setValue = (newValue: unknown) => {\n try {\n const config = JSON.parse(this.form.additional_fields ?? '{}');\n this.edit({ additional_fields: JSON.stringify(set(config, path, newValue)) });\n } catch {\n return '';\n }\n };\n\n type Option = { name: string; value: string };\n const options = (field as { options?: Option[] }).options;\n\n return html`\n ${field.type === 'checkbox'\n ? html`\n <foxy-internal-checkbox-group-control\n helper-text=${field.description ?? ''}\n label=\"\"\n class=\"-mb-s\"\n infer=${scope}\n .options=${[{ label: field.name, value: 'checked' }]}\n .getValue=${() => (getValue() ? ['checked'] : [])}\n .setValue=${(newValue: string[]) => {\n setValue(newValue.includes('checked'));\n }}\n >\n </foxy-internal-checkbox-group-control>\n `\n : field.type === 'select'\n ? html`\n <foxy-internal-select-control\n helper-text=${field.description ?? ''}\n label=${field.name}\n infer=${scope}\n .options=${options!.map(({ name, value }) => ({ label: name, value }))}\n .getValue=${getValue}\n .setValue=${setValue}\n >\n </foxy-internal-select-control>\n `\n : html`\n <foxy-internal-text-control\n helper-text=${field.description ?? ''}\n placeholder=${field.default_value || this.t('default_additional_field_placeholder')}\n label=${field.name}\n infer=${scope}\n .getValue=${getValue}\n .setValue=${setValue}\n >\n </foxy-internal-text-control>\n `}\n `;\n })}`;\n }\n}\n"]}
1
+ {"version":3,"file":"PaymentsApiPaymentMethodForm.js","sourceRoot":"","sources":["../../../../src/elements/public/PaymentsApiPaymentMethodForm/PaymentsApiPaymentMethodForm.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AvailablePaymentMethods } from '../PaymentsApi/api/types';\nimport type { Templates, Block, Data } from './types';\nimport type { PropertyDeclarations } from 'lit-element';\nimport type { NucleonElement } from '../NucleonElement/NucleonElement';\nimport type { TemplateResult } from 'lit-html';\nimport type { TabsElement } from '@vaadin/vaadin-tabs';\nimport type { NucleonV8N } from '../NucleonElement/types';\n\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { InternalForm } from '../../internal/InternalForm/InternalForm';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { classMap } from '../../../utils/class-map';\nimport { html } from 'lit-html';\n\nimport has from 'lodash-es/has';\nimport get from 'lodash-es/get';\nimport set from 'lodash-es/set';\n\ntype PaymentMethod = {\n helper: AvailablePaymentMethods['values'][string];\n type: string;\n};\n\nconst NS = 'payments-api-payment-method-form';\nconst Base = TranslatableMixin(InternalForm, NS);\n\n/**\n * Form element for the `fx:payment_method` resource of Payments API.\n *\n * _Payments API is a client-side virtual API layer built on top of hAPI\n * in an attempt to streamline access to stores' payment method settings\n * that is currently a bit quirky due to the legacy functionality. To use\n * this element with hAPI, wrap it into a foxy-payments-api node._\n *\n * @slot description:before\n * @slot description:after\n *\n * @slot account-id:before\n * @slot account-id:after\n *\n * @slot account-key:before\n * @slot account-key:after\n *\n * @slot third-party-key:before\n * @slot third-party-key:after\n *\n * @slot test-account-id:before\n * @slot test-account-id:after\n *\n * @slot test-account-key:before\n * @slot test-account-key:after\n *\n * @slot test-third-party-key:before\n * @slot test-third-party-key:after\n *\n * @slot additional-fields-[field-name-in-kebab-case]:before\n * @slot additional-fields-[field-name-in-kebab-case]:after\n *\n * @slot three-d-secure-toggle:before\n * @slot three-d-secure-toggle:after\n *\n * @slot three-d-secure-response:before\n * @slot three-d-secure-response:after\n *\n * @slot timestamps:before\n * @slot timestamps:after\n *\n * @slot create:before\n * @slot create:after\n *\n * @slot delete:before\n * @slot delete:after\n *\n * @element foxy-payments-api-payment-method-form\n * @since 1.21.0\n */\nexport class PaymentsApiPaymentMethodForm extends Base<Data> {\n static get defaultImageSrc(): string {\n return \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 44 44'%3E%3Cpath fill='%23fff' d='m29.3 14 14-14H32.1l-14 14h11.2Zm2.7 9.9 12-12V.7L30.62 14.1A2 2 0 0 1 32 16v7.9ZM13.31 44h11.18L44 24.5V13.3l-12 12V28a2 2 0 0 1-2 2h-2.69l-14 14Zm-1.41 0H.7l14-14h11.2l-14 14Zm14 0h11.2l6.9-6.9V25.9L25.9 44Zm12.6 0H44v-5.5L38.5 44Z'/%3E%3Cpath fill='%23fff' d='M30 28H14v-6h16v6Zm0-10v-2H14v2h16ZM0 43.3l13.4-13.4A2 2 0 0 1 12 28v-7.9L0 32.12V43.3Z'/%3E%3Cpath fill='%23fff' d='M16.7 14H14c-1.11 0-1.99.89-1.99 2v2.7L0 30.7V19.52L19.52 0H30.7l-14 14Zm1.4-14H6.92L0 6.92V18.1L18.1 0ZM5.5 0H0v5.5L5.5 0Z'/%3E%3C/svg%3E\";\n }\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n __tab: { attribute: false },\n getImageSrc: { attribute: false },\n };\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [\n ({ description: v }) => !v || v.length <= 100 || 'description:v8n_too_long',\n ({ type: v }) => !!v || 'type:v8n_required',\n\n form => {\n const blocks = form.helper?.additional_fields?.blocks ?? [];\n let additionalFields: Record<string, unknown>;\n\n try {\n additionalFields = JSON.parse(form.additional_fields ?? '{}');\n } catch {\n additionalFields = {};\n }\n\n for (const block of blocks) {\n for (const field of block.fields) {\n if ('optional' in (field as Record<string, unknown>)) {\n if (!(field as Record<string, unknown>).optional) {\n if (!has(additionalFields, field.id)) {\n if (field.type !== 'checkbox') {\n return 'additional-fields:v8n_invalid';\n }\n }\n }\n }\n }\n }\n\n return true;\n },\n ];\n }\n\n /** A function that returns a URL of a payment method icon based on the given type. */\n getImageSrc: ((type: string) => string) | null = null;\n\n /** Template render functions mapped to their name. */\n templates: Templates = {};\n\n private readonly __availablePaymentMethodsLoaderId = 'availablePaymentMethodsLoader';\n\n private readonly __threeDSecureResponseGetValue = () => {\n return this.form.config_3d_secure?.endsWith('require_valid_response') ? ['valid_only'] : [];\n };\n\n private readonly __threeDSecureResponseSetValue = (newValue: string[]) => {\n const postfix = newValue.includes('valid_only') ? '_require_valid_response' : '';\n\n const config = this.form.config_3d_secure;\n const type = config?.startsWith('all_cards') ? 'all_cards' : 'maestro_only';\n\n this.edit({\n config_3d_secure: `${type}${postfix}` as Data['config_3d_secure'],\n });\n };\n\n private readonly __threeDSecureResponseOptions = [\n { value: 'valid_only', label: 'option_valid_only' },\n ];\n\n private readonly __threeDSecureToggleGetValue = () => {\n const config = this.form.config_3d_secure;\n\n if (config?.startsWith('all_cards')) return 'all_cards';\n if (config?.startsWith('maestro_only')) return 'maestro_only';\n\n return 'off';\n };\n\n private readonly __threeDSecureToggleSetValue = (\n newValue: 'off' | 'all_cards' | 'maestro_only'\n ) => {\n let newFormValue = '';\n\n if (newValue === 'all_cards' || newValue === 'maestro_only') {\n if (this.form.config_3d_secure?.endsWith('require_valid_response')) {\n newFormValue = `${newValue}_require_valid_response`;\n } else {\n newFormValue = newValue;\n }\n }\n\n this.edit({ config_3d_secure: newFormValue as Data['config_3d_secure'] });\n };\n\n private readonly __threeDSecureToggleOptions = [\n { value: 'off', label: 'option_off' },\n { value: 'all_cards', label: 'option_all_cards' },\n { value: 'maestro_only', label: 'option_maestro_only' },\n ];\n\n private __tab = 0;\n\n renderBody(): TemplateResult {\n return this.form.type\n ? this.__renderPaymentMethodConfig(this.form.type)\n : this.__renderPaymentMethodSelector();\n }\n\n private get __groupedAvailablePaymentMethods() {\n return Object.entries(this.__availablePaymentMethods ?? {})\n .sort((a, b) => a[0].localeCompare(b[0], 'en'))\n .reduce((groups, [type, helper]) => {\n if (helper.is_deprecated) return groups;\n\n const firstChar = type.charAt(0).toUpperCase();\n const isSpecialCharacter = !/\\w/.test(firstChar);\n const name = isSpecialCharacter ? '#' : firstChar;\n const group = groups.find(group => group.name === name);\n\n if (group) {\n group.items.push({ type, helper });\n } else {\n groups.push({ name, items: [{ type, helper }] });\n }\n\n return groups;\n }, [] as { name: string; items: PaymentMethod[] }[]);\n }\n\n private get __availablePaymentMethodsLoader() {\n type Loader = NucleonElement<AvailablePaymentMethods>;\n return this.renderRoot.querySelector<Loader>(`#${this.__availablePaymentMethodsLoaderId}`);\n }\n\n private get __availablePaymentMethodsHref() {\n try {\n const presetIdRegex = /\\/payment_presets\\/(?<presetId>.+)\\//;\n const pathname = new URL(this.href || this.parent).pathname;\n const presetId = presetIdRegex.exec(pathname)!.groups!.presetId;\n const url = new URL(\n `/payment_presets/${presetId}/available_payment_methods`,\n this.href || this.parent\n );\n\n return url.toString();\n } catch {\n // ignore\n }\n }\n\n private get __availablePaymentMethods() {\n return this.__availablePaymentMethodsLoader?.data?.values;\n }\n\n private get __liveBlocks() {\n return this.form.helper?.additional_fields?.blocks.filter(block => block.is_live) ?? [];\n }\n\n private get __testBlocks() {\n return this.form.helper?.additional_fields?.blocks.filter(block => !block.is_live) ?? [];\n }\n\n private __renderPaymentMethodSelector() {\n return html`\n <figure data-testid=\"logo\" class=\"relative flex flex-col gap-m p-m items-center\">\n <img\n class=\"relative h-xl w-xl object-cover rounded-full bg-contrast-20 flex-shrink-0 shadow-xs\"\n src=${PaymentsApiPaymentMethodForm.defaultImageSrc}\n alt=\"\"\n />\n\n <figcaption class=\"relative min-w-0 font-medium text-xl text-center\">\n <foxy-i18n infer=\"\" key=\"select_method_title\"></foxy-i18n>\n </figcaption>\n </figure>\n\n <section data-testid=\"select-method-list\" class=\"-mt-m\">\n ${this.__groupedAvailablePaymentMethods.map(({ name, items }) => {\n return html`\n <p class=\"font-medium text-tertiary py-m\">${name}</p>\n <ul class=\"grid grid-cols-2 gap-m\">\n ${items.map(item => html`<li>${this.__renderPaymentMethodButton(item)}</li>`)}\n </ul>\n `;\n })}\n </section>\n\n <foxy-nucleon\n class=\"hidden\"\n infer=\"\"\n href=${ifDefined(this.__availablePaymentMethodsHref)}\n id=${this.__availablePaymentMethodsLoaderId}\n @update=${() => this.requestUpdate()}\n >\n </foxy-nucleon>\n `;\n }\n\n private __renderPaymentMethodConfig(type: string) {\n const defaultSrc = PaymentsApiPaymentMethodForm.defaultImageSrc;\n\n return html`\n <figure data-testid=\"logo\" class=\"relative flex flex-col gap-m p-m items-center\">\n <img\n class=\"relative h-xl w-xl object-cover rounded-full bg-contrast-20 flex-shrink-0 shadow-xs\"\n src=${this.getImageSrc?.(type) ?? defaultSrc}\n alt=\"\"\n @error=${(evt: Event) => ((evt.currentTarget as HTMLImageElement).src = defaultSrc)}\n />\n\n <figcaption class=\"relative min-w-0 font-medium text-xl text-center\">\n <div>${this.form.helper?.name ?? this.form.type}&ZeroWidthSpace;</div>\n ${this.data?.type\n ? ''\n : html`\n <vaadin-button\n data-testid=\"select-another-button\"\n theme=\"tertiary-inline\"\n class=\"text-m\"\n @click=${() => this.undo()}\n >\n <foxy-i18n infer=\"\" key=\"select_another_button_label\"></foxy-i18n>\n </vaadin-button>\n `}\n </figcaption>\n </figure>\n\n <div class=\"rounded border border-contrast-10\">\n <vaadin-tabs\n selected=${this.__tab}\n theme=\"centered\"\n @selected-changed=${(evt: CustomEvent) => {\n const tabs = evt.currentTarget as TabsElement;\n this.__tab = tabs.selected ?? 0;\n }}\n >\n <vaadin-tab><foxy-i18n infer=\"\" key=\"tab_live\"></foxy-i18n></vaadin-tab>\n <vaadin-tab><foxy-i18n infer=\"\" key=\"tab_test\"></foxy-i18n></vaadin-tab>\n </vaadin-tabs>\n\n <div class=\"overflow-hidden\" style=\"--lumo-border-radius: var(--lumo-border-radius-s)\">\n <div\n data-testid=\"tab-content\"\n class=\"grid grid-cols-2 gap-m transition-transform transform duration-300\"\n style=${classMap({\n 'width: calc(200% + var(--lumo-space-m));': true,\n '--tw-translate-x: 0;': this.__tab === 0,\n '--tw-translate-x: calc(-50% - (var(--lumo-space-m) / 2));': this.__tab !== 0,\n })}\n >\n ${['live', 'test'].map((type, index) => {\n const prefix = index === 0 ? '' : `${type}-`;\n const blocks = index === 0 ? this.__liveBlocks : this.__testBlocks;\n\n return html`\n <div\n class=${classMap({\n 'grid grid-cols-1 gap-m p-m transition-opacity duration-300': true,\n 'opacity-100': this.__tab === index,\n 'opacity-0': this.__tab !== index,\n })}\n >\n ${this.form.helper?.id_description\n ? html`\n <foxy-internal-text-control\n placeholder=${this.t('default_additional_field_placeholder')}\n helper-text=\"\"\n label=${this.form.helper.id_description}\n infer=\"${prefix}account-id\"\n >\n </foxy-internal-text-control>\n `\n : ''}\n ${this.form.helper?.third_party_key_description\n ? html`\n <foxy-internal-text-control\n placeholder=${this.t('default_additional_field_placeholder')}\n helper-text=\"\"\n label=${this.form.helper.third_party_key_description}\n infer=\"${prefix}third-party-key\"\n >\n </foxy-internal-text-control>\n `\n : ''}\n ${this.form.helper?.key_description\n ? html`\n <foxy-internal-text-control\n placeholder=${this.t('default_additional_field_placeholder')}\n helper-text=\"\"\n label=${this.form.helper.key_description}\n infer=\"${prefix}account-key\"\n >\n </foxy-internal-text-control>\n `\n : ''}\n ${blocks.map(block => this.__renderBlock(block))}\n </div>\n `;\n })}\n </div>\n </div>\n </div>\n\n <foxy-internal-text-control infer=\"description\"></foxy-internal-text-control>\n\n ${this.form.helper?.supports_3d_secure\n ? html`\n <foxy-internal-radio-group-control\n infer=\"three-d-secure-toggle\"\n class=\"-mb-s\"\n .getValue=${this.__threeDSecureToggleGetValue}\n .setValue=${this.__threeDSecureToggleSetValue}\n .options=${this.__threeDSecureToggleOptions}\n >\n </foxy-internal-radio-group-control>\n\n ${this.form.config_3d_secure\n ? html`\n <foxy-internal-checkbox-group-control\n infer=\"three-d-secure-response\"\n class=\"-mb-s\"\n .getValue=${this.__threeDSecureResponseGetValue}\n .setValue=${this.__threeDSecureResponseSetValue}\n .options=${this.__threeDSecureResponseOptions}\n >\n </foxy-internal-checkbox-group-control>\n `\n : ''}\n `\n : ''}\n ${super.renderBody()}\n `;\n }\n\n private __renderPaymentMethodButton({ type, helper }: PaymentMethod) {\n const defaultSrc = PaymentsApiPaymentMethodForm.defaultImageSrc;\n const src = this.getImageSrc?.(type) ?? defaultSrc;\n const onError = (evt: Event) => ((evt.currentTarget as HTMLImageElement).src = defaultSrc);\n\n return html`\n <button\n class=${classMap({\n 'relative w-full block text-left p-s rounded bg-contrast-5 overflow-hidden': true,\n 'focus-outline-none focus-ring-2 focus-ring-primary-50': true,\n 'transition-colors hover-bg-contrast-10': !helper.conflict,\n 'cursor-default': !!helper.conflict,\n })}\n ?disabled=${!!helper.conflict}\n title=${helper.conflict ? this.t('conflict_message', helper.conflict) : ''}\n @click=${() => this.edit({ type, helper })}\n >\n <img\n class=\"absolute top-0 left-0 w-1-2 h-full object-cover bg-center filter saturate-200 blur-3xl\"\n style=\"transform: translate3d(0, 0, 0)\"\n src=${src}\n alt=\"\"\n ?hidden=${!!helper.conflict}\n @error=${onError}\n />\n\n <figure class=\"relative flex flex-col gap-m\">\n <img\n class=${classMap({\n 'h-m w-m object-cover rounded-full bg-contrast-20 flex-shrink-0 shadow-xs': true,\n 'filter grayscale': !!helper.conflict,\n })}\n src=${src}\n alt=\"\"\n @error=${onError}\n />\n\n <figcaption\n class=${classMap({\n 'min-w-0 flex-1 truncate leading-s': true,\n 'text-disabled': !!helper.conflict,\n })}\n >\n <div class=\"font-medium\">${helper.name}&ZeroWidthSpace;</div>\n <div class=\"text-xs ${helper.conflict ? '' : 'text-secondary'}\">${type}</div>\n </figcaption>\n </figure>\n </button>\n `;\n }\n\n private __renderBlock(block: Block) {\n return html`${block.fields.map(field => {\n const scope = ['additional-fields', field.id].join('-').replace(/_/g, '-');\n\n const getValue = () => {\n try {\n const config = JSON.parse(this.form.additional_fields ?? '{}');\n return get(config, field.id) ?? config.default_value;\n } catch {\n return field.default_value;\n }\n };\n\n const setValue = (newValue: unknown) => {\n try {\n const config = JSON.parse(this.form.additional_fields ?? '{}');\n this.edit({ additional_fields: JSON.stringify(set(config, field.id, newValue)) });\n } catch {\n return '';\n }\n };\n\n type Option = { name: string; value: string };\n const options = (field as { options?: Option[] }).options;\n\n return html`\n ${field.type === 'checkbox'\n ? html`\n <foxy-internal-checkbox-group-control\n helper-text=${field.description ?? ''}\n label=\"\"\n class=\"-mb-s\"\n infer=${scope}\n .options=${[{ label: field.name, value: 'checked' }]}\n .getValue=${() => (getValue() ? ['checked'] : [])}\n .setValue=${(newValue: string[]) => {\n setValue(newValue.includes('checked'));\n }}\n >\n </foxy-internal-checkbox-group-control>\n `\n : field.type === 'select'\n ? html`\n <foxy-internal-select-control\n helper-text=${field.description ?? ''}\n label=${field.name}\n infer=${scope}\n .options=${options!.map(({ name, value }) => ({ label: name, value }))}\n .getValue=${getValue}\n .setValue=${setValue}\n >\n </foxy-internal-select-control>\n `\n : html`\n <foxy-internal-text-control\n helper-text=${field.description ?? ''}\n placeholder=${field.default_value || this.t('default_additional_field_placeholder')}\n label=${field.name}\n infer=${scope}\n .getValue=${getValue}\n .setValue=${setValue}\n >\n </foxy-internal-text-control>\n `}\n `;\n })}`;\n }\n}\n"]}
@@ -102,6 +102,7 @@ export class PaymentsApiPaymentPresetForm extends Base {
102
102
  infer="payment-methods"
103
103
  first=${this.data._links['fx:payment_methods'].href}
104
104
  limit="5"
105
+ alert
105
106
  .item=${(ctx) => html `
106
107
  <foxy-payments-api-payment-method-card
107
108
  parent=${ctx.parent}