@foxy.io/elements 1.27.0-beta.7 → 1.27.0-beta.8

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
@@ -16,6 +16,8 @@ import { spread } from '@open-wc/lit-helpers';
16
16
  export class FormDialog extends Dialog {
17
17
  constructor() {
18
18
  super(...arguments);
19
+ /** If true, FormDialog will automatically close after the associated form updates the resource. */
20
+ this.closeOnPatch = false;
19
21
  /** If true, FormDialog won't automatically close after the associated form deletes the resource. */
20
22
  this.keepOpenOnDelete = false;
21
23
  /** If true, FormDialog won't automatically close after the associated form creates a resource. */
@@ -44,11 +46,12 @@ export class FormDialog extends Dialog {
44
46
  return;
45
47
  const result = (_a = evt.detail) === null || _a === void 0 ? void 0 : _a.result;
46
48
  const Result = UpdateEvent.UpdateResult;
47
- if (!this.keepOpenOnPost && result === Result.ResourceCreated)
48
- this.open = false;
49
- if (!this.keepOpenOnDelete && result === Result.ResourceDeleted)
50
- this.open = false;
51
49
  const target = evt.currentTarget;
50
+ if ((!this.keepOpenOnDelete && result === Result.ResourceDeleted) ||
51
+ (!this.keepOpenOnPost && result === Result.ResourceCreated) ||
52
+ (this.closeOnPatch && result === Result.ResourceUpdated && target.errors.length === 0)) {
53
+ this.open = false;
54
+ }
52
55
  if (this.parent !== target.parent)
53
56
  this.parent = target.parent;
54
57
  if (this.href !== target.href)
@@ -70,6 +73,7 @@ export class FormDialog extends Dialog {
70
73
  props: { type: Object },
71
74
  parent: { type: String },
72
75
  related: { type: Array },
76
+ closeOnPatch: { type: Boolean, attribute: 'close-on-patch' },
73
77
  keepOpenOnPost: { type: Boolean, attribute: 'keep-open-on-post' },
74
78
  keepOpenOnDelete: { type: Boolean, attribute: 'keep-open-on-delete' },
75
79
  };
@@ -1 +1 @@
1
- {"version":3,"file":"FormDialog.js","sourceRoot":"","sources":["../../../../src/elements/public/FormDialog/FormDialog.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '../NucleonElement/API';\nimport { Dialog } from '../../private/Dialog/Dialog';\nimport { DialogHideEvent } from '../../private/Dialog/DialogHideEvent';\nimport { FetchEvent } from '../NucleonElement/FetchEvent';\nimport { FormRenderer } from './types';\nimport { InternalConfirmDialog } from '../../internal/InternalConfirmDialog/InternalConfirmDialog';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { UpdateEvent } from '../NucleonElement/UpdateEvent';\nimport { spread } from '@open-wc/lit-helpers';\n\n/**\n * Dialog wrapper for the forms made with NucleonElement.\n *\n * @fires FormDialog#show - Instance of `FormDialog.ShowEvent`. Dispatched after dialog finishes entry transition.\n * @fires FormDialog#hide - Instance of `FormDialog.HideEvent`. Dispatched after dialog finishes exit transition.\n *\n * @element foxy-form-dialog\n * @since 1.1.0\n */\nexport class FormDialog extends Dialog {\n /** @readonly */\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n href: { type: String },\n form: { type: String, noAccessor: true },\n group: { type: String },\n props: { type: Object },\n parent: { type: String },\n related: { type: Array },\n keepOpenOnPost: { type: Boolean, attribute: 'keep-open-on-post' },\n keepOpenOnDelete: { type: Boolean, attribute: 'keep-open-on-delete' },\n };\n }\n\n /** If true, FormDialog won't automatically close after the associated form deletes the resource. */\n keepOpenOnDelete = false;\n\n /** If true, FormDialog won't automatically close after the associated form creates a resource. */\n keepOpenOnPost = false;\n\n /** Optional URI list of the related resources (passed to form). */\n related: string[] = [];\n\n /** Optional URL of the collection this resource belongs to (passed to form). */\n parent = '';\n\n /** Properties to set on the form element using the `spread()` helper. */\n props: Record<string, unknown> = {};\n\n group = '';\n\n /** Optional URL of the resource to load (passed to form). */\n href = '';\n\n private __form: string | null | FormRenderer = null;\n\n private __renderForm: FormRenderer | null = null;\n\n private __handleFetch = (evt: Event) => {\n if (!(evt instanceof FetchEvent)) return;\n\n evt.stopImmediatePropagation();\n evt.preventDefault();\n evt.respondWith(new API(this).fetch(evt.request));\n };\n\n private __handleUpdate = (evt: Event) => {\n if (!(evt instanceof UpdateEvent)) return;\n\n const result = evt.detail?.result;\n const Result = UpdateEvent.UpdateResult;\n\n if (!this.keepOpenOnPost && result === Result.ResourceCreated) this.open = false;\n if (!this.keepOpenOnDelete && result === Result.ResourceDeleted) this.open = false;\n\n const target = evt.currentTarget as NucleonElement<never>;\n\n if (this.parent !== target.parent) this.parent = target.parent;\n if (this.href !== target.href) this.href = target.href;\n\n this.closable = !target.in('busy');\n this.editable =\n target.in({ idle: { template: { clean: 'valid' } } }) ||\n target.in({ idle: { template: { dirty: 'valid' } } }) ||\n target.in({ idle: { snapshot: { dirty: 'valid' } } });\n };\n\n /**\n * Form's custom element tag. Generated custom element will have the following attributes:\n *\n * - `parent` – same as `foxy-form-dialog[parent]`;\n * - `href` – same as `foxy-form-dialog[href]`;\n * - `lang` – same as `foxy-form-dialog[lang]`;\n */\n get form(): string | null | FormRenderer {\n return this.__form;\n }\n\n set form(value: string | null | FormRenderer) {\n this.__form = value;\n\n if (typeof value === 'string') {\n this.__renderForm = new Function(\n 'options',\n `return options.html\\`\n <${value}\n id=\"form\"\n ns=\"$\\{options.dialog.ns} $\\{customElements.get('${value}')?.defaultNS ?? ''}\"\n href=\\${options.dialog.href}\n lang=\\${options.dialog.lang}\n group=\\${options.dialog.group}\n parent=\\${options.dialog.parent}\n disabledcontrols=\\${options.dialog.disabledControls.toString()}\n readonlycontrols=\\${options.dialog.readonlyControls.toString()}\n hiddencontrols=\\${options.dialog.hiddenControls.toString()}\n ?disabled=\\${options.dialog.disabled}\n ?readonly=\\${options.dialog.readonly}\n ?hidden=\\${options.dialog.hidden}\n .templates=\\${options.dialog.templates}\n .related=\\${options.dialog.related}\n ...=$\\{options.spread(options.dialog.props)}\n @fetch=\\${options.handleFetch}\n @update=\\${options.handleUpdate}\n >\n </${value}>\\``\n ) as FormRenderer;\n } else {\n this.__renderForm = value;\n }\n\n this.requestUpdate();\n }\n\n /** @readonly */\n render(): TemplateResult {\n return html`\n <foxy-internal-confirm-dialog\n message=\"undo_message\"\n confirm=\"undo_confirm\"\n cancel=\"undo_cancel\"\n header=\"undo_header\"\n theme=\"error\"\n lang=${this.lang}\n ns=${this.ns}\n id=\"confirm\"\n @hide=${(evt: DialogHideEvent) => !evt.detail.cancelled && super.hide(true)}\n >\n </foxy-internal-confirm-dialog>\n\n ${super.render(() => {\n return html`${this.__renderForm?.({\n handleUpdate: this.__handleUpdate,\n handleFetch: this.__handleFetch,\n spread: spread,\n dialog: this,\n html,\n })}`;\n })}\n `;\n }\n\n async hide(cancelled = false): Promise<void> {\n if (cancelled) {\n const confirm = this.renderRoot.querySelector('#confirm') as InternalConfirmDialog;\n confirm.show();\n } else {\n return super.hide(cancelled);\n }\n }\n\n /** Submits the form. */\n async save(): Promise<void> {\n (this.renderRoot.querySelector('#form') as NucleonElement<never>).submit();\n }\n}\n"]}
1
+ {"version":3,"file":"FormDialog.js","sourceRoot":"","sources":["../../../../src/elements/public/FormDialog/FormDialog.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '../NucleonElement/API';\nimport { Dialog } from '../../private/Dialog/Dialog';\nimport { DialogHideEvent } from '../../private/Dialog/DialogHideEvent';\nimport { FetchEvent } from '../NucleonElement/FetchEvent';\nimport { FormRenderer } from './types';\nimport { InternalConfirmDialog } from '../../internal/InternalConfirmDialog/InternalConfirmDialog';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { UpdateEvent } from '../NucleonElement/UpdateEvent';\nimport { spread } from '@open-wc/lit-helpers';\n\n/**\n * Dialog wrapper for the forms made with NucleonElement.\n *\n * @fires FormDialog#show - Instance of `FormDialog.ShowEvent`. Dispatched after dialog finishes entry transition.\n * @fires FormDialog#hide - Instance of `FormDialog.HideEvent`. Dispatched after dialog finishes exit transition.\n *\n * @element foxy-form-dialog\n * @since 1.1.0\n */\nexport class FormDialog extends Dialog {\n /** @readonly */\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n href: { type: String },\n form: { type: String, noAccessor: true },\n group: { type: String },\n props: { type: Object },\n parent: { type: String },\n related: { type: Array },\n closeOnPatch: { type: Boolean, attribute: 'close-on-patch' },\n keepOpenOnPost: { type: Boolean, attribute: 'keep-open-on-post' },\n keepOpenOnDelete: { type: Boolean, attribute: 'keep-open-on-delete' },\n };\n }\n\n /** If true, FormDialog will automatically close after the associated form updates the resource. */\n closeOnPatch = false;\n\n /** If true, FormDialog won't automatically close after the associated form deletes the resource. */\n keepOpenOnDelete = false;\n\n /** If true, FormDialog won't automatically close after the associated form creates a resource. */\n keepOpenOnPost = false;\n\n /** Optional URI list of the related resources (passed to form). */\n related: string[] = [];\n\n /** Optional URL of the collection this resource belongs to (passed to form). */\n parent = '';\n\n /** Properties to set on the form element using the `spread()` helper. */\n props: Record<string, unknown> = {};\n\n group = '';\n\n /** Optional URL of the resource to load (passed to form). */\n href = '';\n\n private __form: string | null | FormRenderer = null;\n\n private __renderForm: FormRenderer | null = null;\n\n private __handleFetch = (evt: Event) => {\n if (!(evt instanceof FetchEvent)) return;\n\n evt.stopImmediatePropagation();\n evt.preventDefault();\n evt.respondWith(new API(this).fetch(evt.request));\n };\n\n private __handleUpdate = (evt: Event) => {\n if (!(evt instanceof UpdateEvent)) return;\n\n const result = evt.detail?.result;\n const Result = UpdateEvent.UpdateResult;\n const target = evt.currentTarget as NucleonElement<never>;\n\n if (\n (!this.keepOpenOnDelete && result === Result.ResourceDeleted) ||\n (!this.keepOpenOnPost && result === Result.ResourceCreated) ||\n (this.closeOnPatch && result === Result.ResourceUpdated && target.errors.length === 0)\n ) {\n this.open = false;\n }\n\n if (this.parent !== target.parent) this.parent = target.parent;\n if (this.href !== target.href) this.href = target.href;\n\n this.closable = !target.in('busy');\n this.editable =\n target.in({ idle: { template: { clean: 'valid' } } }) ||\n target.in({ idle: { template: { dirty: 'valid' } } }) ||\n target.in({ idle: { snapshot: { dirty: 'valid' } } });\n };\n\n /**\n * Form's custom element tag. Generated custom element will have the following attributes:\n *\n * - `parent` – same as `foxy-form-dialog[parent]`;\n * - `href` – same as `foxy-form-dialog[href]`;\n * - `lang` – same as `foxy-form-dialog[lang]`;\n */\n get form(): string | null | FormRenderer {\n return this.__form;\n }\n\n set form(value: string | null | FormRenderer) {\n this.__form = value;\n\n if (typeof value === 'string') {\n this.__renderForm = new Function(\n 'options',\n `return options.html\\`\n <${value}\n id=\"form\"\n ns=\"$\\{options.dialog.ns} $\\{customElements.get('${value}')?.defaultNS ?? ''}\"\n href=\\${options.dialog.href}\n lang=\\${options.dialog.lang}\n group=\\${options.dialog.group}\n parent=\\${options.dialog.parent}\n disabledcontrols=\\${options.dialog.disabledControls.toString()}\n readonlycontrols=\\${options.dialog.readonlyControls.toString()}\n hiddencontrols=\\${options.dialog.hiddenControls.toString()}\n ?disabled=\\${options.dialog.disabled}\n ?readonly=\\${options.dialog.readonly}\n ?hidden=\\${options.dialog.hidden}\n .templates=\\${options.dialog.templates}\n .related=\\${options.dialog.related}\n ...=$\\{options.spread(options.dialog.props)}\n @fetch=\\${options.handleFetch}\n @update=\\${options.handleUpdate}\n >\n </${value}>\\``\n ) as FormRenderer;\n } else {\n this.__renderForm = value;\n }\n\n this.requestUpdate();\n }\n\n /** @readonly */\n render(): TemplateResult {\n return html`\n <foxy-internal-confirm-dialog\n message=\"undo_message\"\n confirm=\"undo_confirm\"\n cancel=\"undo_cancel\"\n header=\"undo_header\"\n theme=\"error\"\n lang=${this.lang}\n ns=${this.ns}\n id=\"confirm\"\n @hide=${(evt: DialogHideEvent) => !evt.detail.cancelled && super.hide(true)}\n >\n </foxy-internal-confirm-dialog>\n\n ${super.render(() => {\n return html`${this.__renderForm?.({\n handleUpdate: this.__handleUpdate,\n handleFetch: this.__handleFetch,\n spread: spread,\n dialog: this,\n html,\n })}`;\n })}\n `;\n }\n\n async hide(cancelled = false): Promise<void> {\n if (cancelled) {\n const confirm = this.renderRoot.querySelector('#confirm') as InternalConfirmDialog;\n confirm.show();\n } else {\n return super.hide(cancelled);\n }\n }\n\n /** Submits the form. */\n async save(): Promise<void> {\n (this.renderRoot.querySelector('#form') as NucleonElement<never>).submit();\n }\n}\n"]}
@@ -353,7 +353,7 @@ export class NucleonElement extends InferrableMixin(LitElement) {
353
353
  }
354
354
  __createService() {
355
355
  this.__service.onTransition(state => {
356
- var _a, _b;
356
+ var _a, _b, _c, _d;
357
357
  if (!state.changed)
358
358
  return;
359
359
  let result = undefined;
@@ -364,6 +364,12 @@ export class NucleonElement extends InferrableMixin(LitElement) {
364
364
  else if ((_b = state.history) === null || _b === void 0 ? void 0 : _b.matches({ busy: 'creating' })) {
365
365
  result = UpdateResult.ResourceCreated;
366
366
  }
367
+ else if ((_c = state.history) === null || _c === void 0 ? void 0 : _c.matches({ busy: 'updating' })) {
368
+ result = UpdateResult.ResourceUpdated;
369
+ }
370
+ else if ((_d = state.history) === null || _d === void 0 ? void 0 : _d.matches({ busy: 'fetching' })) {
371
+ result = UpdateResult.ResourceFetched;
372
+ }
367
373
  }
368
374
  this.requestUpdate();
369
375
  this.dispatchEvent(new UpdateEvent('update', { detail: { result } }));
@@ -1 +1 @@
1
- {"version":3,"file":"NucleonElement.js","sourceRoot":"","sources":["../../../../src/elements/public/NucleonElement/NucleonElement.ts"],"names":[],"mappings":"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","sourcesContent":["import { ComputedElementProperties, HALJSONResource, NucleonMachine, NucleonV8N } from './types';\nimport { html, LitElement, PropertyDeclarations, TemplateResult } from 'lit-element';\nimport { Nucleon, Rumour } from '@foxy.io/sdk/core';\nimport { assign, interpret } from 'xstate';\n\nimport { API } from './API';\nimport { FetchEvent } from './FetchEvent';\nimport { UpdateEvent, UpdateResult } from './UpdateEvent';\nimport memoize from 'lodash-es/memoize';\nimport { serveFromCache } from './serveFromCache';\nimport { InferrableMixin } from '../../../mixins/inferrable';\nimport { internalServer } from './internalServer';\nimport { uniqueId } from 'lodash-es';\n\n/**\n * Base class for custom elements working with remote HAL+JSON resources.\n *\n * @fires NucleonElement#update - Instance of `NucleonElement.UpdateEvent`. Dispatched on an element whenever it changes its state.\n * @fires NucleonElement#fetch - Instance of `NucleonElement.API.FetchEvent`. Emitted before each API request.\n *\n * @element foxy-nucleon\n * @since 1.1.0\n */\nexport class NucleonElement<TData extends HALJSONResource> extends InferrableMixin(LitElement) {\n /**\n * Instances of this event are dispatched on an element whenever it changes its\n * state (e.g. when going from `busy` to `idle` or on `form` data change).\n * This event isn't cancelable, and it does not bubble.\n * @readonly\n */\n static readonly UpdateEvent = UpdateEvent;\n\n /**\n * Creates a tagged [Rumour](https://sdk.foxy.dev/classes/_core_index_.rumour.html)\n * instance if it doesn't exist or returns cached one otherwise. NucleonElements\n * use empty Rumour group by default.\n * @readonly\n */\n static readonly Rumour = memoize<(group: string) => Rumour>(() => new Rumour());\n\n /**\n * Universal [API](https://sdk.foxy.dev/classes/_core_index_.api.html) client\n * that dispatches cancellable `FetchEvent` on an element before each request.\n * @readonly\n */\n static readonly API = API;\n\n static get inferredProperties(): string[] {\n return [...super.inferredProperties, 'group', 'lang'];\n }\n\n /** @readonly */\n static get properties(): PropertyDeclarations {\n return {\n __state: { type: String, reflect: true, attribute: 'state' },\n virtualHost: { attribute: 'virtual-host' },\n related: { type: Array },\n parent: { type: String },\n group: { type: String, noAccessor: true },\n href: { type: String, noAccessor: true },\n lang: { type: String },\n };\n }\n\n /**\n * Array of validation functions. Each function accepts `element.form` and must return\n * either an error code string if form data fails the check or `true` otherwise.\n * Error codes are collected in `element.errors`. Empty by default.\n */\n static get v8n(): NucleonV8N<any, any> {\n return [];\n }\n\n /**\n * Optional ISO 639-1 code describing the language element content is written in.\n * Changing the `lang` attribute will update the value of this property.\n */\n lang = '';\n\n /**\n * Optional URL of the collection this element's resource belongs to.\n * Changing the `parent` attribute will update the value of this property.\n */\n parent = '';\n\n /**\n * Optional URI list of the related resources. If Rumour encounters a related\n * resource on creation or deletion, it will be reloaded from source.\n */\n related: string[] = [];\n\n /**\n * Unique identifier for the virtual host used by the element to serve internal requests.\n *\n * Currently only one endpoint is supported: `foxy://<virtualHost>/form/<path>`.\n * This endpoint supports POST, GET, PATCH and DELETE methods and functions like a hAPI server.\n *\n * For example, `GET foxy://nucleon-123/form/subscriptions/allowNextDateModification/0` on a NucleonElement\n * with `fx:customer_portal_settings` will return the first item of the `subscriptions.allowNextDateModification` array.\n */\n virtualHost: string | null = uniqueId('nucleon-');\n\n private __hrefToLoad: string | null = null;\n\n private __group = '';\n\n private __unsubscribeFromRumour: (() => void) | null = null;\n\n private __fetchEventHandler!: (evt: Event) => void;\n\n private __fetchEventQueue: FetchEvent[] = [];\n\n private readonly __service = interpret(\n (Nucleon.machine as NucleonMachine<TData>).withConfig({\n services: {\n sendDelete: () => this._sendDelete(),\n sendPatch: ({ edits }) => this._sendPatch(edits!),\n sendPost: ({ edits }) => this._sendPost(edits!),\n sendGet: () => this._sendGet(),\n },\n\n actions: {\n validate: assign<Nucleon.Context<TData, string>, Nucleon.Event<TData>>({\n errors: context => {\n const rules = (this.constructor as typeof NucleonElement).v8n;\n const form = { ...context.data, ...context.edits };\n\n return rules\n .map(validate => validate(form, this))\n .filter(v8nResult => typeof v8nResult === 'string')\n .filter((err, errIndex, errs) => errs.indexOf(err) === errIndex) as string[];\n },\n }),\n },\n })\n );\n\n constructor() {\n super();\n this.__createService();\n }\n\n /**\n * If network request returns non-2XX code, the entire error response\n * will be available via this getter.\n *\n * This property is readonly. Changing failure records via this property is\n * not guaranteed to work. NucleonElement does not provide a way to override error status.\n *\n * @since 1.4.0\n */\n get failure(): Response | null {\n return this.__service.state.context.failure;\n }\n\n /**\n * Array of validation errors returned from `NucleonElement.v8n` checks.\n *\n * This property is readonly. Adding or removing error codes via this property is\n * not guaranteed to work. NucleonElement does not provide a way to override validity status.\n */\n get errors(): string[] {\n return this.__service.state.context.errors;\n }\n\n /**\n * Resource snapshot with edits applied. Empty object if unavailable.\n *\n * This property and its value are readonly. Assignments like `element.data.foo = 'bar'`\n * are not guaranteed to work. Please use `element.edit({ foo: 'bar' })` instead.\n * If you need to replace the entire data object, consider using `element.data`.\n */\n get form(): Partial<TData> {\n const { data, edits } = this.__service.state.context;\n return { ...data, ...edits } as Partial<TData>;\n }\n\n /**\n * Resource snapshot as-is, no edits applied. Null if unavailable.\n *\n * Returned value is not reactive. Assignments like `element.data.foo = 'bar'`\n * are not guaranteed to work. Please set the property instead: `element.data = { ...element.data, foo: 'bar' }`.\n * If you're processing user input, consider using `element.form` and `element.edit()` instead.\n */\n get data(): TData | null {\n return this.__service.state.context.data;\n }\n\n set data(data: TData | null) {\n this.__destroyRumour();\n this.__hrefToLoad = null;\n this.__service.send({ type: 'SET_DATA', data });\n if (data) this.__createRumour();\n }\n\n /**\n * Rumour group. Elements in different groups will not share updates. Empty by default.\n * @example element.group = 'my-group'\n */\n get group(): string {\n return this.__group;\n }\n\n set group(value: string) {\n this.__group = value;\n this.__destroyRumour();\n this.__createRumour();\n }\n\n /**\n * Optional URL of the resource to load. Switches element to `idle.template` state if empty (default).\n * @example element.href = 'https://demo.foxycart.com/s/customer/attributes/0'\n */\n get href(): string {\n return this.form._links?.self.href ?? this.__hrefToLoad ?? '';\n }\n\n set href(value: string) {\n this.__hrefToLoad = value;\n\n if (value) {\n this.__service.send({ type: 'FETCH' });\n } else {\n this.data = null;\n }\n }\n\n /**\n * Checks if this element is in the given state.\n * @example element.in({ idle: 'snapshot' })\n */\n in<TStateValue extends Nucleon.State<TData, string>['value']>(\n stateValue: TStateValue\n ): this is this & ComputedElementProperties<TData, TStateValue> {\n return this.__service.state.matches(stateValue);\n }\n\n /**\n * Clears all edits and emits the `update` event.\n * @example element.undo()\n */\n undo(): void {\n this.__service.send({ type: 'UNDO' });\n }\n\n /**\n * Applies an edit to the local resource snapshot or its template and emits the `update` event.\n * @example element.edit({ first_name: 'Alex' })\n */\n edit(data: Partial<TData>): void {\n if (typeof data._links?.self.href === 'string') this.__hrefToLoad = null;\n this.__service.send({ type: 'EDIT', data });\n }\n\n /**\n * Submits the form, updating the resource if href isn't empty or creating it otherwise.\n * Emits multiple `update` events as element state changes. Has no effect on invalid forms.\n * @example element.submit()\n */\n submit(): void {\n this.reportValidity();\n this.__service.send({ type: 'SUBMIT' });\n }\n\n checkValidity(): boolean {\n const isTemplateDirtyValid = this.in({ idle: { template: { dirty: 'valid' } } });\n const isSnapshotDirtyValid = this.in({ idle: { snapshot: { dirty: 'valid' } } });\n const isTemplateCleanValid = this.in({ idle: { template: { clean: 'valid' } } });\n const isSnapshotCleanValid = this.in({ idle: { snapshot: { clean: 'valid' } } });\n const isTemplateValid = isTemplateCleanValid || isTemplateDirtyValid;\n const isSnapshotValid = isSnapshotCleanValid || isSnapshotDirtyValid;\n const isValid = isTemplateValid || isSnapshotValid;\n\n return isValid;\n }\n\n reportValidity(): boolean {\n const walker = this.ownerDocument.createTreeWalker(this.renderRoot, NodeFilter.SHOW_ELEMENT);\n\n do {\n type Input = Node & Record<string, () => unknown>;\n\n const node = walker.currentNode as Input;\n const methods = ['reportValidity', 'validate'];\n\n for (const method of methods) {\n if (method in node) {\n try {\n node[method]();\n break;\n } catch {\n continue;\n }\n }\n }\n } while (walker.nextNode());\n\n return this.checkValidity();\n }\n\n /**\n * Sends a DELETE request to `element.href` and clears local data on success.\n * Emits multiple update events as element state changes.\n * @example element.delete()\n */\n delete(): void {\n this.__service.send({ type: 'DELETE' });\n }\n\n /**\n * Fetches data from `element.href` in background, keeping the edits and v8n errors.\n * @example element.refresh()\n */\n refresh(): void {\n this.__service.send({ type: 'REFRESH' });\n }\n\n render(): TemplateResult {\n return html`<slot></slot>`;\n }\n\n /** @readonly */\n connectedCallback(): void {\n super.connectedCallback();\n if (this.href && !this.data) this.__service.send({ type: 'FETCH' });\n\n this.__createRumour();\n this.__createServer();\n this.__processFetchEventQueue();\n\n this.dispatchEvent(new UpdateEvent());\n }\n\n /** @readonly */\n disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.__destroyRumour();\n this.__destroyServer();\n this.__flushFetchEventQueue('parent element was disconnected');\n\n this.dispatchEvent(new UpdateEvent());\n }\n\n applyInferredProperties(context: Map<string, unknown>): void {\n super.applyInferredProperties(context);\n\n if (this.infer === null) return;\n\n this.group = (context.get('group') as string | undefined) ?? '';\n this.lang = (context.get('lang') as string | undefined) ?? '';\n }\n\n /** Sends API request. Throws an error on non-2XX response. */\n protected async _fetch<TResult = TData>(...args: Parameters<Window['fetch']>): Promise<TResult> {\n const response = await new API(this).fetch(...args);\n if (!response.ok) throw response;\n return response.json();\n }\n\n /** POSTs to `element.parent`, shares response with the Rumour group and returns parsed JSON. */\n protected async _sendPost(edits: Partial<TData>): Promise<TData> {\n this.__destroyRumour();\n let data: TData;\n\n try {\n const body = JSON.stringify(edits);\n const postData = await this._fetch(this.parent, { body, method: 'POST' });\n data = await this._fetch(postData._links.self.href);\n\n const rumour = NucleonElement.Rumour(this.group);\n const related = [...this.related, this.parent];\n rumour.share({ data, related, source: data._links.self.href });\n } finally {\n this.__createRumour();\n }\n\n return data;\n }\n\n /** GETs `element.href`, shares response with the Rumour group and returns parsed JSON. */\n protected async _sendGet(): Promise<TData> {\n this.__destroyRumour();\n let data: TData;\n\n try {\n data = await this._fetch(this.href);\n NucleonElement.Rumour(this.group).share({ data, source: this.href });\n } finally {\n this.__createRumour();\n }\n\n return data;\n }\n\n /** PATCHes `element.href`, shares response with the Rumour group and returns parsed JSON. */\n protected async _sendPatch(edits: Partial<TData>): Promise<TData> {\n this.__destroyRumour();\n let data: TData;\n\n try {\n const body = JSON.stringify(edits);\n data = await this._fetch(this.href, { body, method: 'PATCH' });\n\n const rumour = NucleonElement.Rumour(this.group);\n rumour.share({ data, source: this.href, related: this.related });\n } finally {\n this.__createRumour();\n }\n\n return data;\n }\n\n /** DELETEs `element.href`, shares response with the Rumour group and returns parsed JSON. */\n protected async _sendDelete(): Promise<null> {\n this.__destroyRumour();\n\n try {\n await this._fetch(this.href, { method: 'DELETE' });\n\n const rumour = NucleonElement.Rumour(this.group);\n const related = [...this.related, this.parent];\n rumour.share({ data: null, source: this.href, related });\n } finally {\n this.__createRumour();\n }\n\n return null;\n }\n\n // this getter is used by LitElement to set the \"state\" attribute\n private get __state(): string {\n const state = this.__service.state;\n const flags = state.toStrings().reduce((p, c) => [...p, ...c.split('.')], [] as string[]);\n return [...new Set(flags)].join(' ');\n }\n\n private __createService() {\n this.__service.onTransition(state => {\n if (!state.changed) return;\n\n let result: UpdateResult | undefined = undefined;\n\n if (state.matches('idle')) {\n if (state.history?.matches({ busy: 'deleting' })) {\n result = UpdateResult.ResourceDeleted;\n } else if (state.history?.matches({ busy: 'creating' })) {\n result = UpdateResult.ResourceCreated;\n }\n }\n\n this.requestUpdate();\n this.dispatchEvent(new UpdateEvent('update', { detail: { result } }));\n\n if (!state.matches('busy')) this.__processFetchEventQueue();\n });\n\n this.__service.onChange(() => {\n this.requestUpdate();\n this.dispatchEvent(new UpdateEvent());\n });\n\n this.__service.start();\n }\n\n private __createRumour() {\n const rumour = NucleonElement.Rumour(this.group);\n this.__unsubscribeFromRumour = rumour.track(update => this.__handleRumourUpdate(update));\n }\n\n private __destroyRumour() {\n this.__unsubscribeFromRumour?.();\n this.__unsubscribeFromRumour = null;\n }\n\n private __createServer() {\n this.__fetchEventHandler = this.__handleFetchEvent.bind(this);\n this.addEventListener('fetch', this.__fetchEventHandler);\n }\n\n private __destroyServer() {\n this.removeEventListener('fetch', this.__fetchEventHandler);\n }\n\n private __handleRumourUpdate(update: (oldData: TData) => TData | null) {\n try {\n const oldData = this.__service.state?.context.data;\n const newData = oldData ? update(oldData) : oldData;\n\n if (newData !== oldData) {\n this.data = newData;\n\n if (!newData) {\n const result = UpdateResult.ResourceDeleted;\n const event = new UpdateEvent('update', { detail: { result } });\n this.dispatchEvent(event);\n }\n }\n } catch (err) {\n if (err instanceof Rumour.UpdateError) {\n setTimeout(() => this.refresh());\n } else {\n throw err;\n }\n }\n }\n\n private __processFetchEventQueue() {\n const api = new NucleonElement.API(this);\n\n this.__fetchEventQueue.forEach(event => {\n const request = event.request;\n\n if (this.virtualHost && request.url.startsWith(`foxy://${this.virtualHost}/form/`)) {\n return event.respondWith(internalServer(request, this));\n }\n\n const cacheResponse = serveFromCache(request.url, this.data);\n const whenResponseReady = cacheResponse.ok ? cacheResponse : api.fetch(request);\n\n event.respondWith(Promise.resolve(whenResponseReady));\n\n if (cacheResponse.ok) {\n console.debug(\n `%c@foxy.io/elements::${this.localName}\\n%c200%c GET ${request.url}`,\n 'color: gray',\n `background: gray; padding: 0 .2em; border-radius: .2em; color: white;`,\n ''\n );\n }\n });\n\n this.__fetchEventQueue = [];\n }\n\n private __flushFetchEventQueue(errorMessage: string) {\n this.__fetchEventQueue.forEach(event => {\n event.respondWith(Promise.reject(new Error(errorMessage)));\n });\n\n this.__fetchEventQueue = [];\n }\n\n private __handleFetchEvent(event: Event) {\n if (!(event instanceof FetchEvent)) return;\n if (event.defaultPrevented) return;\n if (event.composedPath()[0] === this) return;\n\n const { url, method } = event.request;\n\n if (url.startsWith('foxy://')) {\n if (this.virtualHost && url.startsWith(`foxy://${this.virtualHost}/form/`)) {\n if (method !== 'GET') return event.respondWith(internalServer(event.request, this));\n } else {\n return;\n }\n }\n\n if (method === 'GET') {\n event.preventDefault();\n this.__fetchEventQueue.push(event);\n if (!this.__service.state.matches('busy')) this.__processFetchEventQueue();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"NucleonElement.js","sourceRoot":"","sources":["../../../../src/elements/public/NucleonElement/NucleonElement.ts"],"names":[],"mappings":"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","sourcesContent":["import { ComputedElementProperties, HALJSONResource, NucleonMachine, NucleonV8N } from './types';\nimport { html, LitElement, PropertyDeclarations, TemplateResult } from 'lit-element';\nimport { Nucleon, Rumour } from '@foxy.io/sdk/core';\nimport { assign, interpret } from 'xstate';\n\nimport { API } from './API';\nimport { FetchEvent } from './FetchEvent';\nimport { UpdateEvent, UpdateResult } from './UpdateEvent';\nimport memoize from 'lodash-es/memoize';\nimport { serveFromCache } from './serveFromCache';\nimport { InferrableMixin } from '../../../mixins/inferrable';\nimport { internalServer } from './internalServer';\nimport { uniqueId } from 'lodash-es';\n\n/**\n * Base class for custom elements working with remote HAL+JSON resources.\n *\n * @fires NucleonElement#update - Instance of `NucleonElement.UpdateEvent`. Dispatched on an element whenever it changes its state.\n * @fires NucleonElement#fetch - Instance of `NucleonElement.API.FetchEvent`. Emitted before each API request.\n *\n * @element foxy-nucleon\n * @since 1.1.0\n */\nexport class NucleonElement<TData extends HALJSONResource> extends InferrableMixin(LitElement) {\n /**\n * Instances of this event are dispatched on an element whenever it changes its\n * state (e.g. when going from `busy` to `idle` or on `form` data change).\n * This event isn't cancelable, and it does not bubble.\n * @readonly\n */\n static readonly UpdateEvent = UpdateEvent;\n\n /**\n * Creates a tagged [Rumour](https://sdk.foxy.dev/classes/_core_index_.rumour.html)\n * instance if it doesn't exist or returns cached one otherwise. NucleonElements\n * use empty Rumour group by default.\n * @readonly\n */\n static readonly Rumour = memoize<(group: string) => Rumour>(() => new Rumour());\n\n /**\n * Universal [API](https://sdk.foxy.dev/classes/_core_index_.api.html) client\n * that dispatches cancellable `FetchEvent` on an element before each request.\n * @readonly\n */\n static readonly API = API;\n\n static get inferredProperties(): string[] {\n return [...super.inferredProperties, 'group', 'lang'];\n }\n\n /** @readonly */\n static get properties(): PropertyDeclarations {\n return {\n __state: { type: String, reflect: true, attribute: 'state' },\n virtualHost: { attribute: 'virtual-host' },\n related: { type: Array },\n parent: { type: String },\n group: { type: String, noAccessor: true },\n href: { type: String, noAccessor: true },\n lang: { type: String },\n };\n }\n\n /**\n * Array of validation functions. Each function accepts `element.form` and must return\n * either an error code string if form data fails the check or `true` otherwise.\n * Error codes are collected in `element.errors`. Empty by default.\n */\n static get v8n(): NucleonV8N<any, any> {\n return [];\n }\n\n /**\n * Optional ISO 639-1 code describing the language element content is written in.\n * Changing the `lang` attribute will update the value of this property.\n */\n lang = '';\n\n /**\n * Optional URL of the collection this element's resource belongs to.\n * Changing the `parent` attribute will update the value of this property.\n */\n parent = '';\n\n /**\n * Optional URI list of the related resources. If Rumour encounters a related\n * resource on creation or deletion, it will be reloaded from source.\n */\n related: string[] = [];\n\n /**\n * Unique identifier for the virtual host used by the element to serve internal requests.\n *\n * Currently only one endpoint is supported: `foxy://<virtualHost>/form/<path>`.\n * This endpoint supports POST, GET, PATCH and DELETE methods and functions like a hAPI server.\n *\n * For example, `GET foxy://nucleon-123/form/subscriptions/allowNextDateModification/0` on a NucleonElement\n * with `fx:customer_portal_settings` will return the first item of the `subscriptions.allowNextDateModification` array.\n */\n virtualHost: string | null = uniqueId('nucleon-');\n\n private __hrefToLoad: string | null = null;\n\n private __group = '';\n\n private __unsubscribeFromRumour: (() => void) | null = null;\n\n private __fetchEventHandler!: (evt: Event) => void;\n\n private __fetchEventQueue: FetchEvent[] = [];\n\n private readonly __service = interpret(\n (Nucleon.machine as NucleonMachine<TData>).withConfig({\n services: {\n sendDelete: () => this._sendDelete(),\n sendPatch: ({ edits }) => this._sendPatch(edits!),\n sendPost: ({ edits }) => this._sendPost(edits!),\n sendGet: () => this._sendGet(),\n },\n\n actions: {\n validate: assign<Nucleon.Context<TData, string>, Nucleon.Event<TData>>({\n errors: context => {\n const rules = (this.constructor as typeof NucleonElement).v8n;\n const form = { ...context.data, ...context.edits };\n\n return rules\n .map(validate => validate(form, this))\n .filter(v8nResult => typeof v8nResult === 'string')\n .filter((err, errIndex, errs) => errs.indexOf(err) === errIndex) as string[];\n },\n }),\n },\n })\n );\n\n constructor() {\n super();\n this.__createService();\n }\n\n /**\n * If network request returns non-2XX code, the entire error response\n * will be available via this getter.\n *\n * This property is readonly. Changing failure records via this property is\n * not guaranteed to work. NucleonElement does not provide a way to override error status.\n *\n * @since 1.4.0\n */\n get failure(): Response | null {\n return this.__service.state.context.failure;\n }\n\n /**\n * Array of validation errors returned from `NucleonElement.v8n` checks.\n *\n * This property is readonly. Adding or removing error codes via this property is\n * not guaranteed to work. NucleonElement does not provide a way to override validity status.\n */\n get errors(): string[] {\n return this.__service.state.context.errors;\n }\n\n /**\n * Resource snapshot with edits applied. Empty object if unavailable.\n *\n * This property and its value are readonly. Assignments like `element.data.foo = 'bar'`\n * are not guaranteed to work. Please use `element.edit({ foo: 'bar' })` instead.\n * If you need to replace the entire data object, consider using `element.data`.\n */\n get form(): Partial<TData> {\n const { data, edits } = this.__service.state.context;\n return { ...data, ...edits } as Partial<TData>;\n }\n\n /**\n * Resource snapshot as-is, no edits applied. Null if unavailable.\n *\n * Returned value is not reactive. Assignments like `element.data.foo = 'bar'`\n * are not guaranteed to work. Please set the property instead: `element.data = { ...element.data, foo: 'bar' }`.\n * If you're processing user input, consider using `element.form` and `element.edit()` instead.\n */\n get data(): TData | null {\n return this.__service.state.context.data;\n }\n\n set data(data: TData | null) {\n this.__destroyRumour();\n this.__hrefToLoad = null;\n this.__service.send({ type: 'SET_DATA', data });\n if (data) this.__createRumour();\n }\n\n /**\n * Rumour group. Elements in different groups will not share updates. Empty by default.\n * @example element.group = 'my-group'\n */\n get group(): string {\n return this.__group;\n }\n\n set group(value: string) {\n this.__group = value;\n this.__destroyRumour();\n this.__createRumour();\n }\n\n /**\n * Optional URL of the resource to load. Switches element to `idle.template` state if empty (default).\n * @example element.href = 'https://demo.foxycart.com/s/customer/attributes/0'\n */\n get href(): string {\n return this.form._links?.self.href ?? this.__hrefToLoad ?? '';\n }\n\n set href(value: string) {\n this.__hrefToLoad = value;\n\n if (value) {\n this.__service.send({ type: 'FETCH' });\n } else {\n this.data = null;\n }\n }\n\n /**\n * Checks if this element is in the given state.\n * @example element.in({ idle: 'snapshot' })\n */\n in<TStateValue extends Nucleon.State<TData, string>['value']>(\n stateValue: TStateValue\n ): this is this & ComputedElementProperties<TData, TStateValue> {\n return this.__service.state.matches(stateValue);\n }\n\n /**\n * Clears all edits and emits the `update` event.\n * @example element.undo()\n */\n undo(): void {\n this.__service.send({ type: 'UNDO' });\n }\n\n /**\n * Applies an edit to the local resource snapshot or its template and emits the `update` event.\n * @example element.edit({ first_name: 'Alex' })\n */\n edit(data: Partial<TData>): void {\n if (typeof data._links?.self.href === 'string') this.__hrefToLoad = null;\n this.__service.send({ type: 'EDIT', data });\n }\n\n /**\n * Submits the form, updating the resource if href isn't empty or creating it otherwise.\n * Emits multiple `update` events as element state changes. Has no effect on invalid forms.\n * @example element.submit()\n */\n submit(): void {\n this.reportValidity();\n this.__service.send({ type: 'SUBMIT' });\n }\n\n checkValidity(): boolean {\n const isTemplateDirtyValid = this.in({ idle: { template: { dirty: 'valid' } } });\n const isSnapshotDirtyValid = this.in({ idle: { snapshot: { dirty: 'valid' } } });\n const isTemplateCleanValid = this.in({ idle: { template: { clean: 'valid' } } });\n const isSnapshotCleanValid = this.in({ idle: { snapshot: { clean: 'valid' } } });\n const isTemplateValid = isTemplateCleanValid || isTemplateDirtyValid;\n const isSnapshotValid = isSnapshotCleanValid || isSnapshotDirtyValid;\n const isValid = isTemplateValid || isSnapshotValid;\n\n return isValid;\n }\n\n reportValidity(): boolean {\n const walker = this.ownerDocument.createTreeWalker(this.renderRoot, NodeFilter.SHOW_ELEMENT);\n\n do {\n type Input = Node & Record<string, () => unknown>;\n\n const node = walker.currentNode as Input;\n const methods = ['reportValidity', 'validate'];\n\n for (const method of methods) {\n if (method in node) {\n try {\n node[method]();\n break;\n } catch {\n continue;\n }\n }\n }\n } while (walker.nextNode());\n\n return this.checkValidity();\n }\n\n /**\n * Sends a DELETE request to `element.href` and clears local data on success.\n * Emits multiple update events as element state changes.\n * @example element.delete()\n */\n delete(): void {\n this.__service.send({ type: 'DELETE' });\n }\n\n /**\n * Fetches data from `element.href` in background, keeping the edits and v8n errors.\n * @example element.refresh()\n */\n refresh(): void {\n this.__service.send({ type: 'REFRESH' });\n }\n\n render(): TemplateResult {\n return html`<slot></slot>`;\n }\n\n /** @readonly */\n connectedCallback(): void {\n super.connectedCallback();\n if (this.href && !this.data) this.__service.send({ type: 'FETCH' });\n\n this.__createRumour();\n this.__createServer();\n this.__processFetchEventQueue();\n\n this.dispatchEvent(new UpdateEvent());\n }\n\n /** @readonly */\n disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.__destroyRumour();\n this.__destroyServer();\n this.__flushFetchEventQueue('parent element was disconnected');\n\n this.dispatchEvent(new UpdateEvent());\n }\n\n applyInferredProperties(context: Map<string, unknown>): void {\n super.applyInferredProperties(context);\n\n if (this.infer === null) return;\n\n this.group = (context.get('group') as string | undefined) ?? '';\n this.lang = (context.get('lang') as string | undefined) ?? '';\n }\n\n /** Sends API request. Throws an error on non-2XX response. */\n protected async _fetch<TResult = TData>(...args: Parameters<Window['fetch']>): Promise<TResult> {\n const response = await new API(this).fetch(...args);\n if (!response.ok) throw response;\n return response.json();\n }\n\n /** POSTs to `element.parent`, shares response with the Rumour group and returns parsed JSON. */\n protected async _sendPost(edits: Partial<TData>): Promise<TData> {\n this.__destroyRumour();\n let data: TData;\n\n try {\n const body = JSON.stringify(edits);\n const postData = await this._fetch(this.parent, { body, method: 'POST' });\n data = await this._fetch(postData._links.self.href);\n\n const rumour = NucleonElement.Rumour(this.group);\n const related = [...this.related, this.parent];\n rumour.share({ data, related, source: data._links.self.href });\n } finally {\n this.__createRumour();\n }\n\n return data;\n }\n\n /** GETs `element.href`, shares response with the Rumour group and returns parsed JSON. */\n protected async _sendGet(): Promise<TData> {\n this.__destroyRumour();\n let data: TData;\n\n try {\n data = await this._fetch(this.href);\n NucleonElement.Rumour(this.group).share({ data, source: this.href });\n } finally {\n this.__createRumour();\n }\n\n return data;\n }\n\n /** PATCHes `element.href`, shares response with the Rumour group and returns parsed JSON. */\n protected async _sendPatch(edits: Partial<TData>): Promise<TData> {\n this.__destroyRumour();\n let data: TData;\n\n try {\n const body = JSON.stringify(edits);\n data = await this._fetch(this.href, { body, method: 'PATCH' });\n\n const rumour = NucleonElement.Rumour(this.group);\n rumour.share({ data, source: this.href, related: this.related });\n } finally {\n this.__createRumour();\n }\n\n return data;\n }\n\n /** DELETEs `element.href`, shares response with the Rumour group and returns parsed JSON. */\n protected async _sendDelete(): Promise<null> {\n this.__destroyRumour();\n\n try {\n await this._fetch(this.href, { method: 'DELETE' });\n\n const rumour = NucleonElement.Rumour(this.group);\n const related = [...this.related, this.parent];\n rumour.share({ data: null, source: this.href, related });\n } finally {\n this.__createRumour();\n }\n\n return null;\n }\n\n // this getter is used by LitElement to set the \"state\" attribute\n private get __state(): string {\n const state = this.__service.state;\n const flags = state.toStrings().reduce((p, c) => [...p, ...c.split('.')], [] as string[]);\n return [...new Set(flags)].join(' ');\n }\n\n private __createService() {\n this.__service.onTransition(state => {\n if (!state.changed) return;\n\n let result: UpdateResult | undefined = undefined;\n\n if (state.matches('idle')) {\n if (state.history?.matches({ busy: 'deleting' })) {\n result = UpdateResult.ResourceDeleted;\n } else if (state.history?.matches({ busy: 'creating' })) {\n result = UpdateResult.ResourceCreated;\n } else if (state.history?.matches({ busy: 'updating' })) {\n result = UpdateResult.ResourceUpdated;\n } else if (state.history?.matches({ busy: 'fetching' })) {\n result = UpdateResult.ResourceFetched;\n }\n }\n\n this.requestUpdate();\n this.dispatchEvent(new UpdateEvent('update', { detail: { result } }));\n\n if (!state.matches('busy')) this.__processFetchEventQueue();\n });\n\n this.__service.onChange(() => {\n this.requestUpdate();\n this.dispatchEvent(new UpdateEvent());\n });\n\n this.__service.start();\n }\n\n private __createRumour() {\n const rumour = NucleonElement.Rumour(this.group);\n this.__unsubscribeFromRumour = rumour.track(update => this.__handleRumourUpdate(update));\n }\n\n private __destroyRumour() {\n this.__unsubscribeFromRumour?.();\n this.__unsubscribeFromRumour = null;\n }\n\n private __createServer() {\n this.__fetchEventHandler = this.__handleFetchEvent.bind(this);\n this.addEventListener('fetch', this.__fetchEventHandler);\n }\n\n private __destroyServer() {\n this.removeEventListener('fetch', this.__fetchEventHandler);\n }\n\n private __handleRumourUpdate(update: (oldData: TData) => TData | null) {\n try {\n const oldData = this.__service.state?.context.data;\n const newData = oldData ? update(oldData) : oldData;\n\n if (newData !== oldData) {\n this.data = newData;\n\n if (!newData) {\n const result = UpdateResult.ResourceDeleted;\n const event = new UpdateEvent('update', { detail: { result } });\n this.dispatchEvent(event);\n }\n }\n } catch (err) {\n if (err instanceof Rumour.UpdateError) {\n setTimeout(() => this.refresh());\n } else {\n throw err;\n }\n }\n }\n\n private __processFetchEventQueue() {\n const api = new NucleonElement.API(this);\n\n this.__fetchEventQueue.forEach(event => {\n const request = event.request;\n\n if (this.virtualHost && request.url.startsWith(`foxy://${this.virtualHost}/form/`)) {\n return event.respondWith(internalServer(request, this));\n }\n\n const cacheResponse = serveFromCache(request.url, this.data);\n const whenResponseReady = cacheResponse.ok ? cacheResponse : api.fetch(request);\n\n event.respondWith(Promise.resolve(whenResponseReady));\n\n if (cacheResponse.ok) {\n console.debug(\n `%c@foxy.io/elements::${this.localName}\\n%c200%c GET ${request.url}`,\n 'color: gray',\n `background: gray; padding: 0 .2em; border-radius: .2em; color: white;`,\n ''\n );\n }\n });\n\n this.__fetchEventQueue = [];\n }\n\n private __flushFetchEventQueue(errorMessage: string) {\n this.__fetchEventQueue.forEach(event => {\n event.respondWith(Promise.reject(new Error(errorMessage)));\n });\n\n this.__fetchEventQueue = [];\n }\n\n private __handleFetchEvent(event: Event) {\n if (!(event instanceof FetchEvent)) return;\n if (event.defaultPrevented) return;\n if (event.composedPath()[0] === this) return;\n\n const { url, method } = event.request;\n\n if (url.startsWith('foxy://')) {\n if (this.virtualHost && url.startsWith(`foxy://${this.virtualHost}/form/`)) {\n if (method !== 'GET') return event.respondWith(internalServer(event.request, this));\n } else {\n return;\n }\n }\n\n if (method === 'GET') {\n event.preventDefault();\n this.__fetchEventQueue.push(event);\n if (!this.__service.state.matches('busy')) this.__processFetchEventQueue();\n }\n }\n}\n"]}
@@ -1,6 +1,8 @@
1
1
  export declare enum UpdateResult {
2
2
  ResourceCreated = 0,
3
- ResourceDeleted = 1
3
+ ResourceDeleted = 1,
4
+ ResourceUpdated = 2,
5
+ ResourceFetched = 3
4
6
  }
5
7
  export declare type UpdateEventDetail = {
6
8
  result?: UpdateResult;
@@ -2,6 +2,8 @@ export var UpdateResult;
2
2
  (function (UpdateResult) {
3
3
  UpdateResult[UpdateResult["ResourceCreated"] = 0] = "ResourceCreated";
4
4
  UpdateResult[UpdateResult["ResourceDeleted"] = 1] = "ResourceDeleted";
5
+ UpdateResult[UpdateResult["ResourceUpdated"] = 2] = "ResourceUpdated";
6
+ UpdateResult[UpdateResult["ResourceFetched"] = 3] = "ResourceFetched";
5
7
  })(UpdateResult || (UpdateResult = {}));
6
8
  export class UpdateEvent extends CustomEvent {
7
9
  constructor(type = 'update', eventInitDict) {
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateEvent.js","sourceRoot":"","sources":["../../../../src/elements/public/NucleonElement/UpdateEvent.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,qEAAe,CAAA;IACf,qEAAe,CAAA;AACjB,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAMD,MAAM,OAAO,WAAY,SAAQ,WAA8B;IAG7D,YAAY,IAAI,GAAG,QAAQ,EAAE,aAAkD;QAC7E,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC7B,CAAC;;AAJe,wBAAY,GAAG,YAAY,CAAC","sourcesContent":["export enum UpdateResult {\n ResourceCreated,\n ResourceDeleted,\n}\n\nexport type UpdateEventDetail = {\n result?: UpdateResult;\n};\n\nexport class UpdateEvent extends CustomEvent<UpdateEventDetail> {\n static readonly UpdateResult = UpdateResult;\n\n constructor(type = 'update', eventInitDict?: CustomEventInit<UpdateEventDetail>) {\n super(type, eventInitDict);\n }\n}\n"]}
1
+ {"version":3,"file":"UpdateEvent.js","sourceRoot":"","sources":["../../../../src/elements/public/NucleonElement/UpdateEvent.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,qEAAe,CAAA;IACf,qEAAe,CAAA;IACf,qEAAe,CAAA;IACf,qEAAe,CAAA;AACjB,CAAC,EALW,YAAY,KAAZ,YAAY,QAKvB;AAMD,MAAM,OAAO,WAAY,SAAQ,WAA8B;IAG7D,YAAY,IAAI,GAAG,QAAQ,EAAE,aAAkD;QAC7E,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC7B,CAAC;;AAJe,wBAAY,GAAG,YAAY,CAAC","sourcesContent":["export enum UpdateResult {\n ResourceCreated,\n ResourceDeleted,\n ResourceUpdated,\n ResourceFetched,\n}\n\nexport type UpdateEventDetail = {\n result?: UpdateResult;\n};\n\nexport class UpdateEvent extends CustomEvent<UpdateEventDetail> {\n static readonly UpdateResult = UpdateResult;\n\n constructor(type = 'update', eventInitDict?: CustomEventInit<UpdateEventDetail>) {\n super(type, eventInitDict);\n }\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import type { PropertyDeclarations } from 'lit-element';
2
+ import type { TemplateResult } from 'lit-html';
3
+ import { LitElement } from 'lit-element';
4
+ import { PaymentCardEmbed } from '@foxy.io/sdk/customer';
5
+ declare const Base: typeof LitElement & {
6
+ styles: import("lit-element").CSSResultArray;
7
+ } & import("lit-element").Constructor<import("../../../mixins/inferrable").InferrableMixinHost> & {
8
+ inferredProperties: string[];
9
+ } & import("lit-element").Constructor<import("../../../mixins/translatable").TranslatableMixinHost> & {
10
+ defaultNS: string;
11
+ } & import("lit-element").Constructor<import("../../../mixins/configurable").ConfigurableMixinHost>;
12
+ /**
13
+ * A secure, PCI-compliant element for collecting payment card information with
14
+ * support for Stripe, Square and embedded gateways.
15
+ *
16
+ * @fires CustomEvent - Instance of `CustomEvent` with type `submit`. Dispatched when the user submits the form (not available for Stripe).
17
+ *
18
+ * @element foxy-payment-card-embed
19
+ * @since 1.27.0
20
+ */
21
+ export declare class PaymentCardEmbedElement extends Base {
22
+ static readonly PaymentCardEmbed: typeof PaymentCardEmbed;
23
+ static get properties(): PropertyDeclarations;
24
+ /**
25
+ * Full Bank Card Embed URL, e.g. `https://embed.foxy.io/v1.html?template_set_id=123`.
26
+ *
27
+ * The following demo URLs are available:
28
+ * - `https://embed.foxy.io/v1.html?demo=default` (Default form)
29
+ * - `https://embed.foxy.io/v1.html?demo=stripe` (Stripe Card Element)
30
+ * - `https://embed.foxy.io/v1.html?demo=square` (Square Card Element)
31
+ */
32
+ url: string | null;
33
+ private __configRefreshInterval;
34
+ private __embed;
35
+ private __ready;
36
+ disconnectedCallback(): void;
37
+ connectedCallback(): void;
38
+ /** Tokenizes payment card info. Resolves with a token on success or rejects otherwise. */
39
+ tokenize(): Promise<string>;
40
+ updated(changes: Map<keyof this, unknown>): void;
41
+ render(): TemplateResult;
42
+ /** Clears form fields. */
43
+ clear(): void;
44
+ private get __config();
45
+ private __setupEmbed;
46
+ }
47
+ export {};
@@ -0,0 +1,198 @@
1
+ import { TranslatableMixin } from "../../../mixins/translatable.js";
2
+ import { ConfigurableMixin } from "../../../mixins/configurable.js";
3
+ import { LitElement, html } from 'lit-element';
4
+ import { PaymentCardEmbed } from '@foxy.io/sdk/customer';
5
+ import { InferrableMixin } from "../../../mixins/inferrable.js";
6
+ import { ThemeableMixin } from "../../../mixins/themeable.js";
7
+ import { classMap } from "../../../utils/class-map.js";
8
+ import { set } from 'lodash-es';
9
+ const NS = 'payment-card-embed';
10
+ const Base = ConfigurableMixin(TranslatableMixin(InferrableMixin(ThemeableMixin(LitElement)), NS));
11
+ /**
12
+ * A secure, PCI-compliant element for collecting payment card information with
13
+ * support for Stripe, Square and embedded gateways.
14
+ *
15
+ * @fires CustomEvent - Instance of `CustomEvent` with type `submit`. Dispatched when the user submits the form (not available for Stripe).
16
+ *
17
+ * @element foxy-payment-card-embed
18
+ * @since 1.27.0
19
+ */
20
+ export class PaymentCardEmbedElement extends Base {
21
+ constructor() {
22
+ super(...arguments);
23
+ /**
24
+ * Full Bank Card Embed URL, e.g. `https://embed.foxy.io/v1.html?template_set_id=123`.
25
+ *
26
+ * The following demo URLs are available:
27
+ * - `https://embed.foxy.io/v1.html?demo=default` (Default form)
28
+ * - `https://embed.foxy.io/v1.html?demo=stripe` (Stripe Card Element)
29
+ * - `https://embed.foxy.io/v1.html?demo=square` (Square Card Element)
30
+ */
31
+ this.url = null;
32
+ this.__configRefreshInterval = null;
33
+ this.__embed = null;
34
+ this.__ready = false;
35
+ }
36
+ static get properties() {
37
+ return {
38
+ ...super.properties,
39
+ __ready: { attribute: false },
40
+ url: {},
41
+ };
42
+ }
43
+ disconnectedCallback() {
44
+ var _a;
45
+ super.disconnectedCallback();
46
+ clearInterval((_a = this.__configRefreshInterval) !== null && _a !== void 0 ? _a : undefined);
47
+ }
48
+ connectedCallback() {
49
+ super.connectedCallback();
50
+ this.__configRefreshInterval = setInterval(() => {
51
+ var _a;
52
+ const config = this.__config;
53
+ if (config)
54
+ (_a = this.__embed) === null || _a === void 0 ? void 0 : _a.configure(config);
55
+ }, 1000);
56
+ }
57
+ /** Tokenizes payment card info. Resolves with a token on success or rejects otherwise. */
58
+ tokenize() {
59
+ var _a, _b;
60
+ return (_b = (_a = this.__embed) === null || _a === void 0 ? void 0 : _a.tokenize()) !== null && _b !== void 0 ? _b : Promise.reject();
61
+ }
62
+ updated(changes) {
63
+ super.updated(changes);
64
+ if (changes.has('hidden') || changes.has('url'))
65
+ this.__setupEmbed();
66
+ }
67
+ render() {
68
+ return html `
69
+ <div class="relative">
70
+ <div
71
+ class=${classMap({ 'transition-opacity relative': true, 'opacity-0': !this.__ready })}
72
+ id="iframe-container"
73
+ ></div>
74
+
75
+ <div
76
+ class=${classMap({
77
+ 'absolute inset-0 flex items-center justify-center': true,
78
+ 'transition-opacity pointer-events-none': true,
79
+ 'opacity-0': this.__ready,
80
+ })}
81
+ >
82
+ <foxy-spinner infer="spinner" layout="no-label"></foxy-spinner>
83
+ </div>
84
+
85
+ <div
86
+ class="hidden ml-m mr-s bg-contrast-5 text-contrast-10 h-m w-xs rounded-tr-m rounded-br-s font-lumo text-m leading-xs"
87
+ style="border-top-color: var(--lumo-primary-color); border-bottom-color: var(--lumo-primary-text-color); border-left-color: var(--lumo-primary-color-50pct); border-right-color: var(--lumo-secondary-text-color);"
88
+ id="d1"
89
+ ></div>
90
+
91
+ <div
92
+ class="hidden text-s text-disabled"
93
+ style="background-color: var(--lumo-body-text-color); border-top-color: var(--lumo-error-text-color); border-bottom-color: var(--lumo-error-color-10pct); border-left-color: var(--lumo-error-color-50pct);"
94
+ id="d2"
95
+ ></div>
96
+
97
+ <div class="hidden text-contrast-50 text-xs bg-base" id="d3"></div>
98
+ </div>
99
+ `;
100
+ }
101
+ /** Clears form fields. */
102
+ clear() {
103
+ var _a;
104
+ (_a = this.__embed) === null || _a === void 0 ? void 0 : _a.clear();
105
+ }
106
+ get __config() {
107
+ const i18nKeys = [
108
+ 'stripe.label',
109
+ 'stripe.status.idle',
110
+ 'stripe.status.busy',
111
+ 'stripe.status.fail',
112
+ 'square.label',
113
+ 'square.status.idle',
114
+ 'square.status.busy',
115
+ 'square.status.fail',
116
+ 'default.cc-number.label',
117
+ 'default.cc-number.placeholder',
118
+ 'default.cc-number.v8n_required',
119
+ 'default.cc-number.v8n_invalid',
120
+ 'default.cc-number.v8n_unsupported',
121
+ 'default.cc-exp.label',
122
+ 'default.cc-exp.placeholder',
123
+ 'default.cc-exp.v8n_required',
124
+ 'default.cc-exp.v8n_invalid',
125
+ 'default.cc-exp.v8n_expired',
126
+ 'default.cc-csc.label',
127
+ 'default.cc-csc.placeholder',
128
+ 'default.cc-csc.v8n_required',
129
+ 'default.cc-csc.v8n_invalid',
130
+ 'default.status.idle',
131
+ 'default.status.busy',
132
+ 'default.status.fail',
133
+ 'default.status.misconfigured',
134
+ ];
135
+ const d1 = this.renderRoot.querySelector('#d1');
136
+ const d2 = this.renderRoot.querySelector('#d2');
137
+ const d3 = this.renderRoot.querySelector('#d3');
138
+ if (!d1 || !d2 || !d3)
139
+ return null;
140
+ const d1Style = getComputedStyle(d1);
141
+ const d2Style = getComputedStyle(d2);
142
+ const d3Style = getComputedStyle(d3);
143
+ const style = {
144
+ '--lumo-space-m': d1Style.marginLeft,
145
+ '--lumo-space-s': d1Style.marginRight,
146
+ '--lumo-contrast-5pct': d1Style.backgroundColor,
147
+ '--lumo-contrast-10pct': d1Style.color,
148
+ '--lumo-contrast-50pct': d3Style.color,
149
+ '--lumo-size-m': d1Style.height,
150
+ '--lumo-size-xs': d1Style.width,
151
+ '--lumo-border-radius-m': d1Style.borderTopRightRadius,
152
+ '--lumo-border-radius-s': d1Style.borderBottomRightRadius,
153
+ '--lumo-font-family': d1Style.fontFamily,
154
+ '--lumo-font-size-m': d1Style.fontSize,
155
+ '--lumo-font-size-s': d2Style.fontSize,
156
+ '--lumo-font-size-xs': d3Style.fontSize,
157
+ '--lumo-primary-color': d1Style.borderTopColor,
158
+ '--lumo-primary-text-color': d1Style.borderBottomColor,
159
+ '--lumo-primary-color-50pct': d1Style.borderLeftColor,
160
+ '--lumo-secondary-text-color': d1Style.borderRightColor,
161
+ '--lumo-disabled-text-color': d2Style.color,
162
+ '--lumo-body-text-color': d2Style.backgroundColor,
163
+ '--lumo-error-text-color': d2Style.borderTopColor,
164
+ '--lumo-error-color-10pct': d2Style.borderBottomColor,
165
+ '--lumo-error-color-50pct': d2Style.borderLeftColor,
166
+ '--lumo-line-height-xs': d1Style.lineHeight,
167
+ '--lumo-base-color': d3Style.backgroundColor,
168
+ };
169
+ const translations = {};
170
+ i18nKeys.forEach(key => set(translations, key, this.t(key)));
171
+ return {
172
+ translations: translations,
173
+ disabled: this.disabled,
174
+ readonly: this.readonly,
175
+ style: style,
176
+ lang: this.lang,
177
+ };
178
+ }
179
+ __setupEmbed() {
180
+ if (this.__embed)
181
+ this.__embed.unmount();
182
+ const config = this.__config;
183
+ const root = this.renderRoot.querySelector('#iframe-container');
184
+ const url = this.url;
185
+ if (url === null || !root || !config || this.hidden) {
186
+ this.__ready = false;
187
+ this.__embed = null;
188
+ }
189
+ else {
190
+ const This = this.constructor;
191
+ this.__embed = new This.PaymentCardEmbed({ url, ...config });
192
+ this.__embed.mount(root).then(() => (this.__ready = true));
193
+ this.__embed.onsubmit = () => this.dispatchEvent(new CustomEvent('submit'));
194
+ }
195
+ }
196
+ }
197
+ PaymentCardEmbedElement.PaymentCardEmbed = PaymentCardEmbed;
198
+ //# sourceMappingURL=PaymentCardEmbedElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaymentCardEmbedElement.js","sourceRoot":"","sources":["../../../../src/elements/public/PaymentCardEmbedElement/PaymentCardEmbedElement.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PaymentCardEmbedConfig } from '@foxy.io/sdk/dist/types/customer/types';\nimport type { PropertyDeclarations } from 'lit-element';\nimport type { TemplateResult } from 'lit-html';\n\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { LitElement, html } from 'lit-element';\nimport { PaymentCardEmbed } from '@foxy.io/sdk/customer';\nimport { InferrableMixin } from '../../../mixins/inferrable';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { classMap } from '../../../utils/class-map';\nimport { set } from 'lodash-es';\n\nconst NS = 'payment-card-embed';\nconst Base = ConfigurableMixin(TranslatableMixin(InferrableMixin(ThemeableMixin(LitElement)), NS));\n\n/**\n * A secure, PCI-compliant element for collecting payment card information with\n * support for Stripe, Square and embedded gateways.\n *\n * @fires CustomEvent - Instance of `CustomEvent` with type `submit`. Dispatched when the user submits the form (not available for Stripe).\n *\n * @element foxy-payment-card-embed\n * @since 1.27.0\n */\nexport class PaymentCardEmbedElement extends Base {\n static readonly PaymentCardEmbed = PaymentCardEmbed;\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n __ready: { attribute: false },\n url: {},\n };\n }\n\n /**\n * Full Bank Card Embed URL, e.g. `https://embed.foxy.io/v1.html?template_set_id=123`.\n *\n * The following demo URLs are available:\n * - `https://embed.foxy.io/v1.html?demo=default` (Default form)\n * - `https://embed.foxy.io/v1.html?demo=stripe` (Stripe Card Element)\n * - `https://embed.foxy.io/v1.html?demo=square` (Square Card Element)\n */\n url: string | null = null;\n\n private __configRefreshInterval: NodeJS.Timeout | null = null;\n\n private __embed: PaymentCardEmbed | null = null;\n\n private __ready = false;\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n clearInterval(this.__configRefreshInterval ?? undefined);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.__configRefreshInterval = setInterval(() => {\n const config = this.__config;\n if (config) this.__embed?.configure(config);\n }, 1000);\n }\n\n /** Tokenizes payment card info. Resolves with a token on success or rejects otherwise. */\n tokenize(): Promise<string> {\n return this.__embed?.tokenize() ?? Promise.reject();\n }\n\n updated(changes: Map<keyof this, unknown>): void {\n super.updated(changes);\n if (changes.has('hidden') || changes.has('url')) this.__setupEmbed();\n }\n\n render(): TemplateResult {\n return html`\n <div class=\"relative\">\n <div\n class=${classMap({ 'transition-opacity relative': true, 'opacity-0': !this.__ready })}\n id=\"iframe-container\"\n ></div>\n\n <div\n class=${classMap({\n 'absolute inset-0 flex items-center justify-center': true,\n 'transition-opacity pointer-events-none': true,\n 'opacity-0': this.__ready,\n })}\n >\n <foxy-spinner infer=\"spinner\" layout=\"no-label\"></foxy-spinner>\n </div>\n\n <div\n class=\"hidden ml-m mr-s bg-contrast-5 text-contrast-10 h-m w-xs rounded-tr-m rounded-br-s font-lumo text-m leading-xs\"\n style=\"border-top-color: var(--lumo-primary-color); border-bottom-color: var(--lumo-primary-text-color); border-left-color: var(--lumo-primary-color-50pct); border-right-color: var(--lumo-secondary-text-color);\"\n id=\"d1\"\n ></div>\n\n <div\n class=\"hidden text-s text-disabled\"\n style=\"background-color: var(--lumo-body-text-color); border-top-color: var(--lumo-error-text-color); border-bottom-color: var(--lumo-error-color-10pct); border-left-color: var(--lumo-error-color-50pct);\"\n id=\"d2\"\n ></div>\n\n <div class=\"hidden text-contrast-50 text-xs bg-base\" id=\"d3\"></div>\n </div>\n `;\n }\n\n /** Clears form fields. */\n clear(): void {\n this.__embed?.clear();\n }\n\n private get __config(): PaymentCardEmbedConfig | null {\n type Leaves<T> = T extends Record<string, unknown>\n ? {\n [K in keyof T]: `${Exclude<K, symbol>}${Leaves<T[K]> extends never\n ? ''\n : `.${Leaves<T[K]>}`}`;\n }[keyof T]\n : never;\n\n const i18nKeys: Leaves<Required<PaymentCardEmbedConfig['translations']>>[] = [\n 'stripe.label',\n 'stripe.status.idle',\n 'stripe.status.busy',\n 'stripe.status.fail',\n 'square.label',\n 'square.status.idle',\n 'square.status.busy',\n 'square.status.fail',\n 'default.cc-number.label',\n 'default.cc-number.placeholder',\n 'default.cc-number.v8n_required',\n 'default.cc-number.v8n_invalid',\n 'default.cc-number.v8n_unsupported',\n 'default.cc-exp.label',\n 'default.cc-exp.placeholder',\n 'default.cc-exp.v8n_required',\n 'default.cc-exp.v8n_invalid',\n 'default.cc-exp.v8n_expired',\n 'default.cc-csc.label',\n 'default.cc-csc.placeholder',\n 'default.cc-csc.v8n_required',\n 'default.cc-csc.v8n_invalid',\n 'default.status.idle',\n 'default.status.busy',\n 'default.status.fail',\n 'default.status.misconfigured',\n ];\n\n const d1 = this.renderRoot.querySelector('#d1');\n const d2 = this.renderRoot.querySelector('#d2');\n const d3 = this.renderRoot.querySelector('#d3');\n\n if (!d1 || !d2 || !d3) return null;\n\n const d1Style = getComputedStyle(d1);\n const d2Style = getComputedStyle(d2);\n const d3Style = getComputedStyle(d3);\n\n const style: Record<string, string> = {\n '--lumo-space-m': d1Style.marginLeft,\n '--lumo-space-s': d1Style.marginRight,\n '--lumo-contrast-5pct': d1Style.backgroundColor,\n '--lumo-contrast-10pct': d1Style.color,\n '--lumo-contrast-50pct': d3Style.color,\n '--lumo-size-m': d1Style.height,\n '--lumo-size-xs': d1Style.width,\n '--lumo-border-radius-m': d1Style.borderTopRightRadius,\n '--lumo-border-radius-s': d1Style.borderBottomRightRadius,\n '--lumo-font-family': d1Style.fontFamily,\n '--lumo-font-size-m': d1Style.fontSize,\n '--lumo-font-size-s': d2Style.fontSize,\n '--lumo-font-size-xs': d3Style.fontSize,\n '--lumo-primary-color': d1Style.borderTopColor,\n '--lumo-primary-text-color': d1Style.borderBottomColor,\n '--lumo-primary-color-50pct': d1Style.borderLeftColor,\n '--lumo-secondary-text-color': d1Style.borderRightColor,\n '--lumo-disabled-text-color': d2Style.color,\n '--lumo-body-text-color': d2Style.backgroundColor,\n '--lumo-error-text-color': d2Style.borderTopColor,\n '--lumo-error-color-10pct': d2Style.borderBottomColor,\n '--lumo-error-color-50pct': d2Style.borderLeftColor,\n '--lumo-line-height-xs': d1Style.lineHeight,\n '--lumo-base-color': d3Style.backgroundColor,\n };\n\n const translations: PaymentCardEmbedConfig['translations'] = {};\n i18nKeys.forEach(key => set(translations, key, this.t(key)));\n\n return {\n translations: translations,\n disabled: this.disabled,\n readonly: this.readonly,\n style: style,\n lang: this.lang,\n };\n }\n\n private __setupEmbed() {\n if (this.__embed) this.__embed.unmount();\n\n const config = this.__config;\n const root = this.renderRoot.querySelector('#iframe-container');\n const url = this.url;\n\n if (url === null || !root || !config || this.hidden) {\n this.__ready = false;\n this.__embed = null;\n } else {\n const This = this.constructor as typeof PaymentCardEmbedElement;\n this.__embed = new This.PaymentCardEmbed({ url, ...config });\n this.__embed.mount(root).then(() => (this.__ready = true));\n this.__embed.onsubmit = () => this.dispatchEvent(new CustomEvent('submit'));\n }\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import '../Spinner/index';
2
+ import '../I18n/index';
3
+ import { PaymentCardEmbedElement } from './PaymentCardEmbedElement';
4
+ export { PaymentCardEmbedElement };
@@ -0,0 +1,6 @@
1
+ import "../Spinner/index.js";
2
+ import "../I18n/index.js";
3
+ import { PaymentCardEmbedElement } from "./PaymentCardEmbedElement.js";
4
+ customElements.define('foxy-payment-card-embed', PaymentCardEmbedElement);
5
+ export { PaymentCardEmbedElement };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/PaymentCardEmbedElement/index.ts"],"names":[],"mappings":"AAAA,6BAA0B;AAC1B,0BAAuB;AAEvB,OAAO,EAAE,uBAAuB,EAAE,qCAAkC;AAEpE,cAAc,CAAC,MAAM,CAAC,yBAAyB,EAAE,uBAAuB,CAAC,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,CAAC","sourcesContent":["import '../Spinner/index';\nimport '../I18n/index';\n\nimport { PaymentCardEmbedElement } from './PaymentCardEmbedElement';\n\ncustomElements.define('foxy-payment-card-embed', PaymentCardEmbedElement);\n\nexport { PaymentCardEmbedElement };\n"]}
@@ -1,6 +1,6 @@
1
- import { CSSResultArray } from 'lit-element';
2
- import { Data, Templates } from './types';
3
- import { TemplateResult } from 'lit-html';
1
+ import type { CSSResultArray, PropertyDeclarations } from 'lit-element';
2
+ import type { Data, Templates } from './types';
3
+ import type { TemplateResult } from 'lit-html';
4
4
  import { NucleonElement } from '../NucleonElement/index';
5
5
  declare const Base: typeof NucleonElement & import("lit-element").Constructor<import("../../../mixins/translatable").TranslatableMixinHost> & {
6
6
  defaultNS: string;
@@ -14,13 +14,23 @@ declare const Base: typeof NucleonElement & import("lit-element").Constructor<im
14
14
  * @slot actions:after - **new in v1.4.0**
15
15
  * @slot actions:delete:before - **new in v1.4.0**
16
16
  * @slot actions:delete:after - **new in v1.4.0**
17
+ * @slot actions:update:before - **new in v1.27.0**
18
+ * @slot actions:update:after - **new in v1.27.0**
17
19
  *
18
- * @element foxy-payment-method-form
20
+ * @element foxy-payment-method-card
19
21
  * @since 1.2.0
20
22
  */
21
23
  export declare class PaymentMethodCard extends Base<Data> {
24
+ static get properties(): PropertyDeclarations;
22
25
  static get styles(): CSSResultArray;
23
26
  templates: Templates;
27
+ /**
28
+ * Configuration URL for the Payment Card Embed. If provided,
29
+ * the card will have an option of updating payment method.
30
+ * Otherwise, only the delete option will be available.
31
+ */
32
+ embedUrl: string | null;
33
+ private readonly __renderActionsUpdate;
24
34
  private readonly __renderActionsDelete;
25
35
  private readonly __renderActions;
26
36
  render(): TemplateResult;