@foxy.io/elements 1.24.0-beta.5 → 1.24.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 (275) hide show
  1. package/dist/cdn/foxy-access-recovery-form.js +1 -1
  2. package/dist/cdn/foxy-address-card.js +2 -2
  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 +1 -1
  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-cancellation-form.js +1 -1
  12. package/dist/cdn/foxy-cart-card.js +1 -1
  13. package/dist/cdn/foxy-cart-form.js +1 -1
  14. package/dist/cdn/foxy-client-card.js +1 -1
  15. package/dist/cdn/foxy-client-form.js +1 -1
  16. package/dist/cdn/foxy-collection-page.js +1 -1
  17. package/dist/cdn/foxy-collection-pages.js +1 -1
  18. package/dist/cdn/foxy-copy-to-clipboard.js +1 -1
  19. package/dist/cdn/foxy-coupon-card.js +1 -1
  20. package/dist/cdn/foxy-coupon-code-form.js +1 -1
  21. package/dist/cdn/foxy-coupon-codes-form.js +1 -1
  22. package/dist/cdn/foxy-coupon-detail-card.js +1 -1
  23. package/dist/cdn/foxy-coupon-form.js +1 -1
  24. package/dist/cdn/foxy-custom-field-card.js +1 -1
  25. package/dist/cdn/foxy-custom-field-form.js +1 -1
  26. package/dist/cdn/foxy-customer-api.js +1 -1
  27. package/dist/cdn/foxy-customer-card.js +1 -1
  28. package/dist/cdn/foxy-customer-form.js +1 -1
  29. package/dist/cdn/foxy-customer-portal-settings.js +1 -1
  30. package/dist/cdn/foxy-customer-portal.js +13 -31
  31. package/dist/cdn/foxy-customer.js +7 -7
  32. package/dist/cdn/foxy-customers-table.js +1 -1
  33. package/dist/cdn/foxy-discount-builder.js +1 -1
  34. package/dist/cdn/foxy-discount-card.js +1 -1
  35. package/dist/cdn/foxy-discount-detail-card.js +1 -1
  36. package/dist/cdn/foxy-donation.js +1 -1
  37. package/dist/cdn/foxy-downloadable-card.js +1 -1
  38. package/dist/cdn/foxy-downloadable-form.js +1 -1
  39. package/dist/cdn/foxy-email-template-card.js +1 -1
  40. package/dist/cdn/foxy-email-template-form.js +1 -1
  41. package/dist/cdn/foxy-error-entry-card.js +1 -1
  42. package/dist/cdn/foxy-filter-attribute-card.js +1 -1
  43. package/dist/cdn/foxy-filter-attribute-form.js +1 -1
  44. package/dist/cdn/foxy-form-dialog.js +1 -1
  45. package/dist/cdn/foxy-generate-codes-form.js +1 -1
  46. package/dist/cdn/foxy-gift-card-card.js +1 -1
  47. package/dist/cdn/foxy-gift-card-code-form.js +1 -1
  48. package/dist/cdn/foxy-gift-card-code-log-card.js +1 -1
  49. package/dist/cdn/foxy-gift-card-codes-form.js +1 -1
  50. package/dist/cdn/foxy-gift-card-form.js +1 -1
  51. package/dist/cdn/foxy-i18n-editor.js +2 -2
  52. package/dist/cdn/foxy-i18n.js +1 -1
  53. package/dist/cdn/foxy-integration-card.js +1 -1
  54. package/dist/cdn/foxy-integration-form.js +1 -1
  55. package/dist/cdn/foxy-item-card.js +1 -1
  56. package/dist/cdn/foxy-item-category-card.js +1 -1
  57. package/dist/cdn/foxy-item-category-form.js +1 -1
  58. package/dist/cdn/foxy-item-form.js +1 -1
  59. package/dist/cdn/foxy-item-option-card.js +1 -1
  60. package/dist/cdn/foxy-item-option-form.js +1 -1
  61. package/dist/cdn/foxy-items-form.js +1 -1
  62. package/dist/cdn/foxy-nucleon-element.js +1 -1
  63. package/dist/cdn/foxy-pagination.js +1 -1
  64. package/dist/cdn/foxy-passkey-card.js +1 -1
  65. package/dist/cdn/foxy-passkey-form.js +1 -1
  66. package/dist/cdn/foxy-payment-card.js +1 -1
  67. package/dist/cdn/foxy-payment-method-card.js +1 -1
  68. package/dist/cdn/foxy-payments-api-fraud-protection-card.js +1 -1
  69. package/dist/cdn/foxy-payments-api-fraud-protection-form.js +1 -1
  70. package/dist/cdn/foxy-payments-api-payment-method-card.js +1 -1
  71. package/dist/cdn/foxy-payments-api-payment-method-form.js +1 -1
  72. package/dist/cdn/foxy-payments-api-payment-preset-card.js +1 -1
  73. package/dist/cdn/foxy-payments-api-payment-preset-form.js +1 -1
  74. package/dist/cdn/foxy-payments-api.js +1 -1
  75. package/dist/cdn/foxy-query-builder.js +1 -1
  76. package/dist/cdn/foxy-report-form.js +1 -1
  77. package/dist/cdn/foxy-reports-table.js +5 -5
  78. package/dist/cdn/foxy-shipment-card.js +2 -2
  79. package/dist/cdn/foxy-shipping-method-card.js +1 -1
  80. package/dist/cdn/foxy-sign-in-form.js +1 -1
  81. package/dist/cdn/foxy-spinner.js +2 -2
  82. package/dist/cdn/foxy-store-card.js +1 -1
  83. package/dist/cdn/foxy-store-form.js +1 -1
  84. package/dist/cdn/foxy-store-shipping-method-form.js +1 -1
  85. package/dist/cdn/foxy-subscription-card.js +1 -1
  86. package/dist/cdn/foxy-subscription-form.js +3 -3
  87. package/dist/cdn/foxy-subscription-settings-form.js +1 -1
  88. package/dist/cdn/foxy-subscriptions-table.js +1 -1
  89. package/dist/cdn/foxy-table.js +1 -1
  90. package/dist/cdn/foxy-tax-card.js +1 -1
  91. package/dist/cdn/foxy-tax-form.js +1 -1
  92. package/dist/cdn/foxy-template-config-form.js +1 -1
  93. package/dist/cdn/foxy-template-form.js +1 -1
  94. package/dist/cdn/foxy-template-set-card.js +1 -1
  95. package/dist/cdn/foxy-template-set-form.js +1 -1
  96. package/dist/cdn/foxy-transaction-card.js +1 -1
  97. package/dist/cdn/foxy-transaction.js +1 -1
  98. package/dist/cdn/foxy-transactions-table.js +7 -7
  99. package/dist/cdn/foxy-user-card.js +1 -1
  100. package/dist/cdn/foxy-user-form.js +1 -1
  101. package/dist/cdn/foxy-users-table.js +1 -1
  102. package/dist/cdn/foxy-webhook-card.js +1 -1
  103. package/dist/cdn/foxy-webhook-form.js +1 -1
  104. package/dist/cdn/foxy-webhook-log-card.js +1 -1
  105. package/dist/cdn/foxy-webhook-status-card.js +1 -1
  106. package/dist/cdn/{shared-a96a2154.js → shared-099c1f57.js} +1 -1
  107. package/dist/cdn/{shared-8465a37a.js → shared-0c0ee663.js} +1 -1
  108. package/dist/cdn/shared-1196b6a7.js +1 -0
  109. package/dist/cdn/{shared-7680d300.js → shared-13fbea95.js} +1 -1
  110. package/dist/cdn/{shared-7ead930c.js → shared-27d21f4a.js} +1 -1
  111. package/dist/cdn/shared-2edcd981.js +1 -0
  112. package/dist/cdn/{shared-421e46e9.js → shared-31d8e3b8.js} +1 -1
  113. package/dist/cdn/shared-35728235.js +1 -0
  114. package/dist/cdn/{shared-a88c5cf1.js → shared-3b709ddc.js} +2 -2
  115. package/dist/cdn/shared-3bcc07cd.js +1 -0
  116. package/dist/cdn/{shared-13cc4ed4.js → shared-3c2414d4.js} +1 -1
  117. package/dist/cdn/{shared-2fa6a5a0.js → shared-3f04e4cc.js} +1 -1
  118. package/dist/cdn/{shared-6273b7e1.js → shared-406ce9ad.js} +1 -1
  119. package/dist/cdn/{shared-6b3be508.js → shared-4b20fc75.js} +1 -1
  120. package/dist/cdn/{shared-0dabe195.js → shared-4c2e9064.js} +1 -1
  121. package/dist/cdn/{shared-9765be8f.js → shared-5103c1b4.js} +1 -1
  122. package/dist/cdn/{shared-c97f7178.js → shared-5784c088.js} +1 -1
  123. package/dist/cdn/shared-584174ff.js +1 -0
  124. package/dist/cdn/{shared-125d1a00.js → shared-59fc6288.js} +1 -1
  125. package/dist/cdn/{shared-527abf31.js → shared-5a889c45.js} +1 -1
  126. package/dist/cdn/{shared-1fd59009.js → shared-5cf7b194.js} +1 -1
  127. package/dist/cdn/{shared-5616a12f.js → shared-5db85492.js} +1 -1
  128. package/dist/cdn/{shared-619bcf83.js → shared-601f27b1.js} +1 -1
  129. package/dist/cdn/{shared-c758220c.js → shared-621b3283.js} +1 -1
  130. package/dist/cdn/shared-630a0ff2.js +1 -0
  131. package/dist/cdn/{shared-8134d8a7.js → shared-6daeb197.js} +1 -1
  132. package/dist/cdn/{shared-72a13fda.js → shared-7723f756.js} +1 -1
  133. package/dist/cdn/{shared-90be9ac7.js → shared-773e7177.js} +1 -1
  134. package/dist/cdn/{shared-8128b5e3.js → shared-799dc083.js} +1 -1
  135. package/dist/cdn/{shared-4966b3e4.js → shared-7a455b15.js} +1 -1
  136. package/dist/cdn/{shared-0689b25a.js → shared-7abbc95c.js} +4 -4
  137. package/dist/cdn/{shared-7d4e0011.js → shared-7fab31ac.js} +1 -1
  138. package/dist/cdn/{shared-e640e9fa.js → shared-800ee6c0.js} +1 -1
  139. package/dist/cdn/shared-8a9c64b2.js +1 -0
  140. package/dist/cdn/{shared-fa5f0117.js → shared-8f922de8.js} +1 -1
  141. package/dist/cdn/{shared-9bdd5400.js → shared-9048eeb2.js} +1 -1
  142. package/dist/cdn/{shared-31a891e8.js → shared-9954ee26.js} +3 -3
  143. package/dist/cdn/{shared-8fbab85c.js → shared-9aa72495.js} +1 -1
  144. package/dist/cdn/shared-9b12aeac.js +1 -0
  145. package/dist/cdn/{shared-7bf6e728.js → shared-9b486845.js} +1 -1
  146. package/dist/cdn/{shared-403af08d.js → shared-ad80244a.js} +1 -1
  147. package/dist/cdn/{shared-6dffe67d.js → shared-b446c140.js} +1 -1
  148. package/dist/cdn/{shared-fc77174e.js → shared-b7556b77.js} +1 -1
  149. package/dist/cdn/{shared-eb232194.js → shared-b87d1af0.js} +1 -1
  150. package/dist/cdn/{shared-91eb066c.js → shared-ba93be6b.js} +1 -1
  151. package/dist/cdn/{shared-017ab35f.js → shared-baeef007.js} +1 -1
  152. package/dist/cdn/{shared-db06114b.js → shared-bee111d6.js} +1 -1
  153. package/dist/cdn/{shared-aa569a99.js → shared-c76ef8d8.js} +1 -1
  154. package/dist/cdn/{shared-3164d0c3.js → shared-c839e147.js} +1 -1
  155. package/dist/cdn/{shared-639dda4b.js → shared-d1f5de89.js} +1 -1
  156. package/dist/cdn/{shared-897ab5e6.js → shared-d90dbae7.js} +1 -1
  157. package/dist/cdn/{shared-42adf053.js → shared-ddac7722.js} +2 -2
  158. package/dist/cdn/{shared-ad0256d0.js → shared-de3dae6c.js} +1 -1
  159. package/dist/cdn/shared-e006e82c.js +1 -0
  160. package/dist/cdn/shared-e2e2ca6a.js +1 -0
  161. package/dist/cdn/{shared-a7475f62.js → shared-e5239bec.js} +1 -1
  162. package/dist/cdn/{shared-8528906b.js → shared-e8a51c60.js} +1 -1
  163. package/dist/cdn/{shared-aa22ee61.js → shared-e8a85228.js} +1 -1
  164. package/dist/cdn/{shared-4bd1efd7.js → shared-eb8a0fdf.js} +1 -1
  165. package/dist/cdn/{shared-c541c9e9.js → shared-ef7f2d07.js} +1 -1
  166. package/dist/cdn/{shared-e5786b8b.js → shared-efaf8d49.js} +1 -1
  167. package/dist/cdn/{shared-15fe0f50.js → shared-f0a9f3c2.js} +1 -1
  168. package/dist/cdn/{shared-19c9fe00.js → shared-f21e5761.js} +1 -1
  169. package/dist/cdn/shared-f241722a.js +1 -0
  170. package/dist/cdn/{shared-4a0298cb.js → shared-f29acc38.js} +1 -1
  171. package/dist/cdn/{shared-848813a4.js → shared-f29d410a.js} +1 -1
  172. package/dist/cdn/{shared-f4822b9e.js → shared-f5bbb1e0.js} +1 -1
  173. package/dist/cdn/{shared-57922341.js → shared-fcfbfbdb.js} +1 -1
  174. package/dist/cdn/{shared-bf2113a4.js → shared-fd40a40c.js} +1 -1
  175. package/dist/cdn/{shared-763a6797.js → shared-fd96bcd1.js} +1 -1
  176. package/dist/cdn/{shared-a134d313.js → shared-ff7fd5fa.js} +1 -1
  177. package/dist/cdn/{shared-6b0498b2.js → shared-fff03a45.js} +3 -3
  178. package/dist/cdn/translations/customer/en.json +76 -15
  179. package/dist/cdn/translations/customer-form/en.json +84 -15
  180. package/dist/cdn/translations/customer-portal/en.json +115 -31
  181. package/dist/cdn/translations/customer-portal-settings/en.json +9 -0
  182. package/dist/cdn/translations/transaction/en.json +79 -15
  183. package/dist/elements/internal/InternalForm/InternalForm.d.ts +10 -0
  184. package/dist/elements/internal/InternalForm/InternalForm.js +48 -1
  185. package/dist/elements/internal/InternalForm/InternalForm.js.map +1 -1
  186. package/dist/elements/internal/InternalForm/index.d.ts +1 -0
  187. package/dist/elements/internal/InternalForm/index.js +1 -0
  188. package/dist/elements/internal/InternalForm/index.js.map +1 -1
  189. package/dist/elements/internal/InternalForm/types.d.ts +4 -0
  190. package/dist/elements/internal/InternalForm/types.js +2 -0
  191. package/dist/elements/internal/InternalForm/types.js.map +1 -0
  192. package/dist/elements/internal/InternalPasswordControl/InternalPasswordControl.d.ts +5 -1
  193. package/dist/elements/internal/InternalPasswordControl/InternalPasswordControl.js +36 -1
  194. package/dist/elements/internal/InternalPasswordControl/InternalPasswordControl.js.map +1 -1
  195. package/dist/elements/internal/InternalPasswordControl/generateRandomPassword.d.ts +1 -0
  196. package/dist/elements/internal/InternalPasswordControl/generateRandomPassword.js +11 -0
  197. package/dist/elements/internal/InternalPasswordControl/generateRandomPassword.js.map +1 -0
  198. package/dist/elements/public/Customer/Customer.d.ts +5 -2
  199. package/dist/elements/public/Customer/Customer.js +10 -0
  200. package/dist/elements/public/Customer/Customer.js.map +1 -1
  201. package/dist/elements/public/Customer/types.d.ts +1 -0
  202. package/dist/elements/public/Customer/types.js.map +1 -1
  203. package/dist/elements/public/CustomerApi/CustomerApi.d.ts +33 -2
  204. package/dist/elements/public/CustomerApi/CustomerApi.js +62 -11
  205. package/dist/elements/public/CustomerApi/CustomerApi.js.map +1 -1
  206. package/dist/elements/public/CustomerForm/CustomerForm.d.ts +47 -15
  207. package/dist/elements/public/CustomerForm/CustomerForm.js +259 -155
  208. package/dist/elements/public/CustomerForm/CustomerForm.js.map +1 -1
  209. package/dist/elements/public/CustomerForm/index.d.ts +6 -6
  210. package/dist/elements/public/CustomerForm/index.js +6 -6
  211. package/dist/elements/public/CustomerForm/index.js.map +1 -1
  212. package/dist/elements/public/CustomerForm/internal/InternalCustomerFormLegalNoticeControl/InternalCustomerFormLegalNoticeControl.d.ts +5 -0
  213. package/dist/elements/public/CustomerForm/internal/InternalCustomerFormLegalNoticeControl/InternalCustomerFormLegalNoticeControl.js +23 -0
  214. package/dist/elements/public/CustomerForm/internal/InternalCustomerFormLegalNoticeControl/InternalCustomerFormLegalNoticeControl.js.map +1 -0
  215. package/dist/elements/public/CustomerForm/internal/InternalCustomerFormLegalNoticeControl/index.d.ts +4 -0
  216. package/dist/elements/public/CustomerForm/internal/InternalCustomerFormLegalNoticeControl/index.js +6 -0
  217. package/dist/elements/public/CustomerForm/internal/InternalCustomerFormLegalNoticeControl/index.js.map +1 -0
  218. package/dist/elements/public/CustomerForm/types.d.ts +27 -7
  219. package/dist/elements/public/CustomerForm/types.js.map +1 -1
  220. package/dist/elements/public/CustomerPortal/CustomerPortal.js +12 -15
  221. package/dist/elements/public/CustomerPortal/CustomerPortal.js.map +1 -1
  222. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLoggedInView.d.ts +8 -11
  223. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLoggedInView.js +9 -33
  224. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLoggedInView.js.map +1 -1
  225. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLoggedOutView.d.ts +14 -10
  226. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLoggedOutView.js +152 -16
  227. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLoggedOutView.js.map +1 -1
  228. package/dist/elements/public/CustomerPortal/index.d.ts +2 -0
  229. package/dist/elements/public/CustomerPortal/index.js +2 -2
  230. package/dist/elements/public/CustomerPortal/index.js.map +1 -1
  231. package/dist/elements/public/CustomerPortalSettings/CustomerPortalSettings.js +14 -0
  232. package/dist/elements/public/CustomerPortalSettings/CustomerPortalSettings.js.map +1 -1
  233. package/dist/elements/public/CustomerPortalSettings/machine.js +10 -0
  234. package/dist/elements/public/CustomerPortalSettings/machine.js.map +1 -1
  235. package/dist/elements/public/CustomerPortalSettings/private/SignUp/SignUp.d.ts +14 -0
  236. package/dist/elements/public/CustomerPortalSettings/private/SignUp/SignUp.js +132 -0
  237. package/dist/elements/public/CustomerPortalSettings/private/SignUp/SignUp.js.map +1 -0
  238. package/dist/elements/public/CustomerPortalSettings/private/SignUp/SignUpChangeEvent.d.ts +4 -0
  239. package/dist/elements/public/CustomerPortalSettings/private/SignUp/SignUpChangeEvent.js +6 -0
  240. package/dist/elements/public/CustomerPortalSettings/private/SignUp/SignUpChangeEvent.js.map +1 -0
  241. package/dist/elements/public/CustomerPortalSettings/types.d.ts +4 -0
  242. package/dist/elements/public/CustomerPortalSettings/types.js.map +1 -1
  243. package/dist/elements/public/FilterAttributeCard/FilterAttributeCard.js +1 -1
  244. package/dist/elements/public/FilterAttributeCard/FilterAttributeCard.js.map +1 -1
  245. package/dist/elements/public/FormDialog/FormDialog.d.ts +2 -0
  246. package/dist/elements/public/FormDialog/FormDialog.js +6 -0
  247. package/dist/elements/public/FormDialog/FormDialog.js.map +1 -1
  248. package/dist/elements/public/FormDialog/types.d.ts +3 -1
  249. package/dist/elements/public/FormDialog/types.js.map +1 -1
  250. package/dist/elements/public/NucleonElement/NucleonElement.d.ts +1 -1
  251. package/dist/elements/public/NucleonElement/NucleonElement.js +1 -1
  252. package/dist/elements/public/NucleonElement/NucleonElement.js.map +1 -1
  253. package/dist/elements/public/NucleonElement/types.d.ts +1 -1
  254. package/dist/elements/public/NucleonElement/types.js.map +1 -1
  255. package/dist/mixins/themeable.js +16 -0
  256. package/dist/mixins/themeable.js.map +1 -1
  257. package/dist/types/hapi.d.ts +14 -0
  258. package/dist/types/hapi.js.map +1 -1
  259. package/dist/utils/parse-duration.js +2 -2
  260. package/dist/utils/parse-duration.js.map +1 -1
  261. package/package.json +4 -2
  262. package/dist/cdn/shared-1b2e0709.js +0 -1
  263. package/dist/cdn/shared-1e43b4db.js +0 -1
  264. package/dist/cdn/shared-46f3f71c.js +0 -1
  265. package/dist/cdn/shared-53532131.js +0 -1
  266. package/dist/cdn/shared-79d01877.js +0 -1
  267. package/dist/cdn/shared-7e887e5b.js +0 -1
  268. package/dist/cdn/shared-a6517170.js +0 -1
  269. package/dist/cdn/shared-b334c8b6.js +0 -1
  270. package/dist/cdn/shared-bbbb8894.js +0 -1
  271. package/dist/cdn/shared-d2222c8d.js +0 -1
  272. package/dist/cdn/shared-fec6fd04.js +0 -1
  273. package/dist/elements/public/CustomerPortal/InternalCustomerPortalChangePassword.d.ts +0 -29
  274. package/dist/elements/public/CustomerPortal/InternalCustomerPortalChangePassword.js +0 -169
  275. package/dist/elements/public/CustomerPortal/InternalCustomerPortalChangePassword.js.map +0 -1
@@ -1,5 +1,7 @@
1
+ import type { PropertyDeclarations } from 'lit-element';
1
2
  import type { HALJSONResource } from '../../public/NucleonElement/types';
2
3
  import type { TemplateResult } from 'lit-html';
4
+ import type { Status } from './types';
3
5
  import { NucleonElement } from '../../public/NucleonElement/NucleonElement';
4
6
  declare const Base: typeof NucleonElement & {
5
7
  styles: import("lit-element").CSSResultArray;
@@ -12,6 +14,11 @@ declare const Base: typeof NucleonElement & {
12
14
  * @since 1.17.0
13
15
  */
14
16
  export declare class InternalForm<TData extends HALJSONResource> extends Base<TData> {
17
+ /** Validation errors with this prefix will show up at the top of the form. */
18
+ static generalErrorPrefix: string;
19
+ static get properties(): PropertyDeclarations;
20
+ /** Status message to render at the top of the form. If `null`, the message is hidden. */
21
+ status: null | Status;
15
22
  /**
16
23
  * Renders form body. This is the method you should implement in your forms
17
24
  * instead of `.render()`. If you'd like to keep the submit button and the timestamps,
@@ -23,5 +30,8 @@ export declare class InternalForm<TData extends HALJSONResource> extends Base<TD
23
30
  * instead of this method in your form to keep the spinner and the common layout features.
24
31
  */
25
32
  render(): TemplateResult;
33
+ private get __generalErrors();
34
+ private __renderGeneralError;
35
+ private __renderStatus;
26
36
  }
27
37
  export {};
@@ -12,6 +12,17 @@ const Base = ConfigurableMixin(ThemeableMixin(NucleonElement));
12
12
  * @since 1.17.0
13
13
  */
14
14
  export class InternalForm extends Base {
15
+ constructor() {
16
+ super(...arguments);
17
+ /** Status message to render at the top of the form. If `null`, the message is hidden. */
18
+ this.status = null;
19
+ }
20
+ static get properties() {
21
+ return {
22
+ ...super.properties,
23
+ status: { type: Object },
24
+ };
25
+ }
15
26
  /**
16
27
  * Renders form body. This is the method you should implement in your forms
17
28
  * instead of `.render()`. If you'd like to keep the submit button and the timestamps,
@@ -40,7 +51,8 @@ export class InternalForm extends Base {
40
51
  'opacity-0 pointer-events-none': isSpinnerVisible,
41
52
  })}
42
53
  >
43
- ${this.renderBody()}
54
+ ${this.__generalErrors.map(err => this.__renderGeneralError(err))}
55
+ ${this.status ? this.__renderStatus(this.status) : ''} ${this.renderBody()}
44
56
  </div>
45
57
 
46
58
  <div
@@ -61,5 +73,40 @@ export class InternalForm extends Base {
61
73
  </div>
62
74
  `;
63
75
  }
76
+ get __generalErrors() {
77
+ const prefix = this.constructor.generalErrorPrefix;
78
+ return this.errors.filter(v => v.startsWith(prefix));
79
+ }
80
+ __renderGeneralError(err) {
81
+ return html `
82
+ <foxy-i18n
83
+ class="leading-xs text-body rounded bg-error-10 block"
84
+ style="padding: calc(0.625em + (var(--lumo-border-radius) / 4) - 1px)"
85
+ infer="error"
86
+ key=${err.replace('error:', '')}
87
+ >
88
+ </foxy-i18n>
89
+ `;
90
+ }
91
+ __renderStatus({ key, options }) {
92
+ return html `
93
+ <p
94
+ data-testid="status"
95
+ class="leading-xs text-body rounded bg-success-10 flex items-start gap-m"
96
+ style="padding: calc(0.625em + (var(--lumo-border-radius) / 4) - 1px)"
97
+ >
98
+ <foxy-i18n class="flex-1" infer="status" key=${key} .options=${options}></foxy-i18n>
99
+ <vaadin-button
100
+ class="flex-shrink-0"
101
+ theme="success tertiary-inline"
102
+ @click=${() => (this.status = null)}
103
+ >
104
+ <foxy-i18n class="flex-1" infer="status" key="close"></foxy-i18n>
105
+ </vaadin-button>
106
+ </p>
107
+ `;
108
+ }
64
109
  }
110
+ /** Validation errors with this prefix will show up at the top of the form. */
111
+ InternalForm.generalErrorPrefix = 'error:';
65
112
  //# sourceMappingURL=InternalForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InternalForm.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalForm/InternalForm.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AACjE,OAAO,EAAE,cAAc,EAAE,qCAAkC;AAC3D,OAAO,EAAE,cAAc,EAAE,sDAAmD;AAC5E,OAAO,EAAE,QAAQ,EAAE,oCAAiC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,MAAM,IAAI,GAAG,iBAAiB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,OAAO,YAA4C,SAAQ,IAAW;IAC1E;;;;OAIG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,IAAI;YACd,CAAC,CAAC,IAAI,CAAA;;;SAGH;YACH,CAAC,CAAC,IAAI,CAAA,8EAA8E,CAAC;IACzF,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5F,OAAO,IAAI,CAAA;uBACQ,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;;kBAEpB,QAAQ,CAAC;YACf,wBAAwB,EAAE,IAAI;YAC9B,oBAAoB,EAAE,IAAI;YAC1B,+BAA+B,EAAE,gBAAgB;SAClD,CAAC;;YAEA,IAAI,CAAC,UAAU,EAAE;;;;;kBAKX,QAAQ,CAAC;YACf,0CAA0C,EAAE,IAAI;YAChD,+BAA+B,EAAE,CAAC,gBAAgB;SACnD,CAAC;;;qBAGS,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;;oBAE1C,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;;;;;;KAMjD,CAAC;IACJ,CAAC;CACF","sourcesContent":["import type { HALJSONResource } from '../../public/NucleonElement/types';\nimport type { TemplateResult } from 'lit-html';\n\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { NucleonElement } from '../../public/NucleonElement/NucleonElement';\nimport { classMap } from '../../../utils/class-map';\nimport { html } from 'lit-html';\n\nconst Base = ConfigurableMixin(ThemeableMixin(NucleonElement));\n\n/**\n * An internal base class for any nucleon-powered form. Renders create/delete\n * buttons and timestamps by default, displays a spinner in non-idle states.\n *\n * @element foxy-internal-form\n * @since 1.17.0\n */\nexport class InternalForm<TData extends HALJSONResource> extends Base<TData> {\n /**\n * Renders form body. This is the method you should implement in your forms\n * instead of `.render()`. If you'd like to keep the submit button and the timestamps,\n * don't forget to add `super.renderBody()` to your template.\n */\n renderBody(): TemplateResult {\n return this.data\n ? html`\n <foxy-internal-timestamps-control infer=\"timestamps\"></foxy-internal-timestamps-control>\n <foxy-internal-delete-control infer=\"delete\"></foxy-internal-delete-control>\n `\n : html`<foxy-internal-create-control infer=\"create\"></foxy-internal-create-control>`;\n }\n\n /**\n * Renders the entire form. You should probably implement `.renderBody()`\n * instead of this method in your form to keep the spinner and the common layout features.\n */\n render(): TemplateResult {\n const isSpinnerVisible = !this.in('idle') && (!this.in({ busy: 'fetching' }) || !this.data);\n\n return html`\n <div aria-busy=${this.in('busy')} aria-live=\"polite\" class=\"relative\">\n <div\n class=${classMap({\n 'grid grid-cols-1 gap-m': true,\n 'transition-opacity': true,\n 'opacity-0 pointer-events-none': isSpinnerVisible,\n })}\n >\n ${this.renderBody()}\n </div>\n\n <div\n data-testid=\"spinner\"\n class=${classMap({\n 'transition-opacity absolute inset-0 flex': true,\n 'opacity-0 pointer-events-none': !isSpinnerVisible,\n })}\n >\n <foxy-spinner\n layout=${this.in('fail') ? 'vertical' : 'no-label'}\n class=\"m-auto\"\n state=${this.in('fail') ? 'error' : 'busy'}\n infer=\"spinner\"\n >\n </foxy-spinner>\n </div>\n </div>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"InternalForm.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalForm/InternalForm.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AACjE,OAAO,EAAE,cAAc,EAAE,qCAAkC;AAC3D,OAAO,EAAE,cAAc,EAAE,sDAAmD;AAC5E,OAAO,EAAE,QAAQ,EAAE,oCAAiC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,MAAM,IAAI,GAAG,iBAAiB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,OAAO,YAA4C,SAAQ,IAAW;IAA5E;;QAWE,yFAAyF;QACzF,WAAM,GAAkB,IAAI,CAAC;IA0F/B,CAAC;IAlGC,MAAM,KAAK,UAAU;QACnB,OAAO;YACL,GAAG,KAAK,CAAC,UAAU;YACnB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SACzB,CAAC;IACJ,CAAC;IAKD;;;;OAIG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,IAAI;YACd,CAAC,CAAC,IAAI,CAAA;;;SAGH;YACH,CAAC,CAAC,IAAI,CAAA,8EAA8E,CAAC;IACzF,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5F,OAAO,IAAI,CAAA;uBACQ,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;;kBAEpB,QAAQ,CAAC;YACf,wBAAwB,EAAE,IAAI;YAC9B,oBAAoB,EAAE,IAAI;YAC1B,+BAA+B,EAAE,gBAAgB;SAClD,CAAC;;YAEA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;;;;;kBAKlE,QAAQ,CAAC;YACf,0CAA0C,EAAE,IAAI;YAChD,+BAA+B,EAAE,CAAC,gBAAgB;SACnD,CAAC;;;qBAGS,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;;oBAE1C,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;;;;;;KAMjD,CAAC;IACJ,CAAC;IAED,IAAY,eAAe;QACzB,MAAM,MAAM,GAAI,IAAI,CAAC,WAAmC,CAAC,kBAAkB,CAAC;QAC5E,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IAEO,oBAAoB,CAAC,GAAW;QACtC,OAAO,IAAI,CAAA;;;;;cAKD,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;;;KAGlC,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,EAAE,GAAG,EAAE,OAAO,EAAU;QAC7C,OAAO,IAAI,CAAA;;;;;;uDAMwC,GAAG,aAAa,OAAO;;;;mBAI3D,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;;;;;KAKxC,CAAC;IACJ,CAAC;;AApGD,8EAA8E;AACvE,+BAAkB,GAAG,QAAQ,CAAC","sourcesContent":["import type { PropertyDeclarations } from 'lit-element';\nimport type { HALJSONResource } from '../../public/NucleonElement/types';\nimport type { TemplateResult } from 'lit-html';\nimport type { Status } from './types';\n\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { NucleonElement } from '../../public/NucleonElement/NucleonElement';\nimport { classMap } from '../../../utils/class-map';\nimport { html } from 'lit-html';\n\nconst Base = ConfigurableMixin(ThemeableMixin(NucleonElement));\n\n/**\n * An internal base class for any nucleon-powered form. Renders create/delete\n * buttons and timestamps by default, displays a spinner in non-idle states.\n *\n * @element foxy-internal-form\n * @since 1.17.0\n */\nexport class InternalForm<TData extends HALJSONResource> extends Base<TData> {\n /** Validation errors with this prefix will show up at the top of the form. */\n static generalErrorPrefix = 'error:';\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n status: { type: Object },\n };\n }\n\n /** Status message to render at the top of the form. If `null`, the message is hidden. */\n status: null | Status = null;\n\n /**\n * Renders form body. This is the method you should implement in your forms\n * instead of `.render()`. If you'd like to keep the submit button and the timestamps,\n * don't forget to add `super.renderBody()` to your template.\n */\n renderBody(): TemplateResult {\n return this.data\n ? html`\n <foxy-internal-timestamps-control infer=\"timestamps\"></foxy-internal-timestamps-control>\n <foxy-internal-delete-control infer=\"delete\"></foxy-internal-delete-control>\n `\n : html`<foxy-internal-create-control infer=\"create\"></foxy-internal-create-control>`;\n }\n\n /**\n * Renders the entire form. You should probably implement `.renderBody()`\n * instead of this method in your form to keep the spinner and the common layout features.\n */\n render(): TemplateResult {\n const isSpinnerVisible = !this.in('idle') && (!this.in({ busy: 'fetching' }) || !this.data);\n\n return html`\n <div aria-busy=${this.in('busy')} aria-live=\"polite\" class=\"relative\">\n <div\n class=${classMap({\n 'grid grid-cols-1 gap-m': true,\n 'transition-opacity': true,\n 'opacity-0 pointer-events-none': isSpinnerVisible,\n })}\n >\n ${this.__generalErrors.map(err => this.__renderGeneralError(err))}\n ${this.status ? this.__renderStatus(this.status) : ''} ${this.renderBody()}\n </div>\n\n <div\n data-testid=\"spinner\"\n class=${classMap({\n 'transition-opacity absolute inset-0 flex': true,\n 'opacity-0 pointer-events-none': !isSpinnerVisible,\n })}\n >\n <foxy-spinner\n layout=${this.in('fail') ? 'vertical' : 'no-label'}\n class=\"m-auto\"\n state=${this.in('fail') ? 'error' : 'busy'}\n infer=\"spinner\"\n >\n </foxy-spinner>\n </div>\n </div>\n `;\n }\n\n private get __generalErrors() {\n const prefix = (this.constructor as typeof InternalForm).generalErrorPrefix;\n return this.errors.filter(v => v.startsWith(prefix));\n }\n\n private __renderGeneralError(err: string) {\n return html`\n <foxy-i18n\n class=\"leading-xs text-body rounded bg-error-10 block\"\n style=\"padding: calc(0.625em + (var(--lumo-border-radius) / 4) - 1px)\"\n infer=\"error\"\n key=${err.replace('error:', '')}\n >\n </foxy-i18n>\n `;\n }\n\n private __renderStatus({ key, options }: Status) {\n return html`\n <p\n data-testid=\"status\"\n class=\"leading-xs text-body rounded bg-success-10 flex items-start gap-m\"\n style=\"padding: calc(0.625em + (var(--lumo-border-radius) / 4) - 1px)\"\n >\n <foxy-i18n class=\"flex-1\" infer=\"status\" key=${key} .options=${options}></foxy-i18n>\n <vaadin-button\n class=\"flex-shrink-0\"\n theme=\"success tertiary-inline\"\n @click=${() => (this.status = null)}\n >\n <foxy-i18n class=\"flex-1\" infer=\"status\" key=\"close\"></foxy-i18n>\n </vaadin-button>\n </p>\n `;\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import '@vaadin/vaadin-button';
1
2
  import '../InternalTimestampsControl/index';
2
3
  import '../InternalCreateControl/index';
3
4
  import '../InternalDeleteControl/index';
@@ -1,3 +1,4 @@
1
+ import '@vaadin/vaadin-button';
1
2
  import "../InternalTimestampsControl/index.js";
2
3
  import "../InternalCreateControl/index.js";
3
4
  import "../InternalDeleteControl/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalForm/index.ts"],"names":[],"mappings":"AAAA,+CAA4C;AAC5C,2CAAwC;AACxC,2CAAwC;AAExC,uCAAoC;AAEpC,OAAO,EAAE,YAAY,EAAE,0BAAuB;AAE9C,cAAc,CAAC,MAAM,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import '../InternalTimestampsControl/index';\nimport '../InternalCreateControl/index';\nimport '../InternalDeleteControl/index';\n\nimport '../../public/Spinner/index';\n\nimport { InternalForm } from './InternalForm';\n\ncustomElements.define('foxy-internal-form', InternalForm);\n\nexport { InternalForm };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalForm/index.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,CAAC;AAE/B,+CAA4C;AAC5C,2CAAwC;AACxC,2CAAwC;AAExC,uCAAoC;AAEpC,OAAO,EAAE,YAAY,EAAE,0BAAuB;AAE9C,cAAc,CAAC,MAAM,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import '@vaadin/vaadin-button';\n\nimport '../InternalTimestampsControl/index';\nimport '../InternalCreateControl/index';\nimport '../InternalDeleteControl/index';\n\nimport '../../public/Spinner/index';\n\nimport { InternalForm } from './InternalForm';\n\ncustomElements.define('foxy-internal-form', InternalForm);\n\nexport { InternalForm };\n"]}
@@ -0,0 +1,4 @@
1
+ export declare type Status = {
2
+ key: string;
3
+ options?: unknown;
4
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalForm/types.ts"],"names":[],"mappings":"","sourcesContent":["export type Status = { key: string; options?: unknown };\n"]}
@@ -1,4 +1,4 @@
1
- import type { TemplateResult } from 'lit-element';
1
+ import type { PropertyDeclarations, TemplateResult } from 'lit-element';
2
2
  import { InternalEditableControl } from '../InternalEditableControl/InternalEditableControl';
3
3
  /**
4
4
  * Internal control displaying a basic password box.
@@ -7,7 +7,11 @@ import { InternalEditableControl } from '../InternalEditableControl/InternalEdit
7
7
  * @element foxy-internal-password-field-control
8
8
  */
9
9
  export declare class InternalPasswordControl extends InternalEditableControl {
10
+ static get properties(): PropertyDeclarations;
11
+ /** If true, renders the password generator button. */
12
+ showGenerator: boolean;
10
13
  renderControl(): TemplateResult;
11
14
  protected get _value(): string;
12
15
  protected set _value(newValue: string);
16
+ private __renderGenerator;
13
17
  }
@@ -1,6 +1,8 @@
1
1
  import { InternalEditableControl } from "../InternalEditableControl/InternalEditableControl.js";
2
+ import { generateRandomPassword } from "./generateRandomPassword.js";
2
3
  import { ifDefined } from 'lit-html/directives/if-defined';
3
- import { html } from 'lit-element';
4
+ import { html, svg } from 'lit-element';
5
+ import { classMap } from "../../../utils/class-map.js";
4
6
  /**
5
7
  * Internal control displaying a basic password box.
6
8
  *
@@ -8,6 +10,17 @@ import { html } from 'lit-element';
8
10
  * @element foxy-internal-password-field-control
9
11
  */
10
12
  export class InternalPasswordControl extends InternalEditableControl {
13
+ constructor() {
14
+ super(...arguments);
15
+ /** If true, renders the password generator button. */
16
+ this.showGenerator = false;
17
+ }
18
+ static get properties() {
19
+ return {
20
+ ...super.properties,
21
+ showGenerator: { type: Boolean, attribute: 'show-generator' },
22
+ };
23
+ }
11
24
  renderControl() {
12
25
  return html `
13
26
  <vaadin-password-field
@@ -26,6 +39,7 @@ export class InternalPasswordControl extends InternalEditableControl {
26
39
  this._value = area.value;
27
40
  }}
28
41
  >
42
+ ${this.showGenerator ? this.__renderGenerator() : ''}
29
43
  </vaadin-password-field>
30
44
  `;
31
45
  }
@@ -36,5 +50,26 @@ export class InternalPasswordControl extends InternalEditableControl {
36
50
  set _value(newValue) {
37
51
  super._value = newValue;
38
52
  }
53
+ __renderGenerator() {
54
+ return html `
55
+ <div
56
+ data-testid="generator"
57
+ class=${classMap({
58
+ 'w-s h-s flex items-center justify-center cursor-default transition-colors': true,
59
+ 'text-contrast-60 hover-text-contrast-80': !this.disabled && !this.readonly,
60
+ 'text-contrast-20': this.disabled || this.readonly,
61
+ })}
62
+ slot="suffix"
63
+ @click=${() => {
64
+ this._value = generateRandomPassword();
65
+ const field = this.renderRoot.querySelector('vaadin-password-field');
66
+ // @ts-expect-error: this is a private method but it's ok since the version is fixed
67
+ field === null || field === void 0 ? void 0 : field._setPasswordVisible(true);
68
+ }}
69
+ >
70
+ ${svg `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" style="width: 1.15em; height: 1.15em"><path d="M15.98 1.804a1 1 0 00-1.96 0l-.24 1.192a1 1 0 01-.784.785l-1.192.238a1 1 0 000 1.962l1.192.238a1 1 0 01.785.785l.238 1.192a1 1 0 001.962 0l.238-1.192a1 1 0 01.785-.785l1.192-.238a1 1 0 000-1.962l-1.192-.238a1 1 0 01-.785-.785l-.238-1.192zM6.949 5.684a1 1 0 00-1.898 0l-.683 2.051a1 1 0 01-.633.633l-2.051.683a1 1 0 000 1.898l2.051.684a1 1 0 01.633.632l.683 2.051a1 1 0 001.898 0l.683-2.051a1 1 0 01.633-.633l2.051-.683a1 1 0 000-1.898l-2.051-.683a1 1 0 01-.633-.633L6.95 5.684zM13.949 13.684a1 1 0 00-1.898 0l-.184.551a1 1 0 01-.632.633l-.551.183a1 1 0 000 1.898l.551.183a1 1 0 01.633.633l.183.551a1 1 0 001.898 0l.184-.551a1 1 0 01.632-.633l.551-.183a1 1 0 000-1.898l-.551-.184a1 1 0 01-.633-.632l-.183-.551z" /></svg>`}
71
+ </div>
72
+ `;
73
+ }
39
74
  }
40
75
  //# sourceMappingURL=InternalPasswordControl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InternalPasswordControl.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalPasswordControl/InternalPasswordControl.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,8DAA2D;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,OAAO,uBAAwB,SAAQ,uBAAuB;IAClE,aAAa;QACX,OAAO,IAAI,CAAA;;wBAES,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;sBAC/B,IAAI,CAAC,UAAU;sBACf,IAAI,CAAC,WAAW;gBACtB,IAAI,CAAC,KAAK;;oBAEN,IAAI,CAAC,QAAQ;oBACb,IAAI,CAAC,QAAQ;yBACR,IAAI,CAAC,cAAc;iBAC3B,IAAI,CAAC,MAAM;mBACT,CAAC,GAAkB,EAAE,EAAE,WAAC,OAAA,GAAG,CAAC,GAAG,KAAK,OAAO,WAAI,IAAI,CAAC,OAAO,0CAAE,MAAM,GAAE,CAAA,EAAA;iBACvE,CAAC,GAAgB,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,aAAqC,CAAC;YACvD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,CAAC;;;KAGJ,CAAC;IACJ,CAAC;IAED,IAAc,MAAM;;QAClB,aAAQ,KAAK,CAAC,MAA6B,mCAAI,EAAE,CAAC;IACpD,CAAC;IAED,IAAc,MAAM,CAAC,QAAgB;QACnC,KAAK,CAAC,MAAM,GAAG,QAA+B,CAAC;IACjD,CAAC;CACF","sourcesContent":["import type { PasswordFieldElement } from '@vaadin/vaadin-text-field/vaadin-password-field';\nimport type { TemplateResult } from 'lit-element';\n\nimport { InternalEditableControl } from '../InternalEditableControl/InternalEditableControl';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { html } from 'lit-element';\n\n/**\n * Internal control displaying a basic password box.\n *\n * @since 1.17.0\n * @element foxy-internal-password-field-control\n */\nexport class InternalPasswordControl extends InternalEditableControl {\n renderControl(): TemplateResult {\n return html`\n <vaadin-password-field\n error-message=${ifDefined(this._errorMessage)}\n helper-text=${this.helperText}\n placeholder=${this.placeholder}\n label=${this.label}\n class=\"w-full\"\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n .checkValidity=${this._checkValidity}\n .value=${this._value}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && this.nucleon?.submit()}\n @input=${(evt: CustomEvent) => {\n const area = evt.currentTarget as PasswordFieldElement;\n this._value = area.value;\n }}\n >\n </vaadin-password-field>\n `;\n }\n\n protected get _value(): string {\n return (super._value as string | undefined) ?? '';\n }\n\n protected set _value(newValue: string) {\n super._value = newValue as unknown | undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"InternalPasswordControl.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalPasswordControl/InternalPasswordControl.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,8DAA2D;AAC7F,OAAO,EAAE,sBAAsB,EAAE,oCAAiC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,oCAAiC;AAEpD;;;;;GAKG;AACH,MAAM,OAAO,uBAAwB,SAAQ,uBAAuB;IAApE;;QAQE,sDAAsD;QACtD,kBAAa,GAAG,KAAK,CAAC;IAsDxB,CAAC;IA9DC,MAAM,KAAK,UAAU;QACnB,OAAO;YACL,GAAG,KAAK,CAAC,UAAU;YACnB,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE;SAC9D,CAAC;IACJ,CAAC;IAKD,aAAa;QACX,OAAO,IAAI,CAAA;;wBAES,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;sBAC/B,IAAI,CAAC,UAAU;sBACf,IAAI,CAAC,WAAW;gBACtB,IAAI,CAAC,KAAK;;oBAEN,IAAI,CAAC,QAAQ;oBACb,IAAI,CAAC,QAAQ;yBACR,IAAI,CAAC,cAAc;iBAC3B,IAAI,CAAC,MAAM;mBACT,CAAC,GAAkB,EAAE,EAAE,WAAC,OAAA,GAAG,CAAC,GAAG,KAAK,OAAO,WAAI,IAAI,CAAC,OAAO,0CAAE,MAAM,GAAE,CAAA,EAAA;iBACvE,CAAC,GAAgB,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,aAAqC,CAAC;YACvD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,CAAC;;UAEC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE;;KAEvD,CAAC;IACJ,CAAC;IAED,IAAc,MAAM;;QAClB,aAAQ,KAAK,CAAC,MAA6B,mCAAI,EAAE,CAAC;IACpD,CAAC;IAED,IAAc,MAAM,CAAC,QAAgB;QACnC,KAAK,CAAC,MAAM,GAAG,QAA+B,CAAC;IACjD,CAAC;IAEO,iBAAiB;QACvB,OAAO,IAAI,CAAA;;;gBAGC,QAAQ,CAAC;YACf,2EAA2E,EAAE,IAAI;YACjF,yCAAyC,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ;YAC3E,kBAAkB,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;SACnD,CAAC;;iBAEO,GAAG,EAAE;YACZ,IAAI,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;YACrE,oFAAoF;YACpF,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,mBAAmB,CAAC,IAAI,EAAE;QACnC,CAAC;;UAEC,GAAG,CAAA,g1BAAg1B;;KAEx1B,CAAC;IACJ,CAAC;CACF","sourcesContent":["import type { PropertyDeclarations, TemplateResult } from 'lit-element';\nimport type { PasswordFieldElement } from '@vaadin/vaadin-text-field/vaadin-password-field';\n\nimport { InternalEditableControl } from '../InternalEditableControl/InternalEditableControl';\nimport { generateRandomPassword } from './generateRandomPassword';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { html, svg } from 'lit-element';\nimport { classMap } from '../../../utils/class-map';\n\n/**\n * Internal control displaying a basic password box.\n *\n * @since 1.17.0\n * @element foxy-internal-password-field-control\n */\nexport class InternalPasswordControl extends InternalEditableControl {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n showGenerator: { type: Boolean, attribute: 'show-generator' },\n };\n }\n\n /** If true, renders the password generator button. */\n showGenerator = false;\n\n renderControl(): TemplateResult {\n return html`\n <vaadin-password-field\n error-message=${ifDefined(this._errorMessage)}\n helper-text=${this.helperText}\n placeholder=${this.placeholder}\n label=${this.label}\n class=\"w-full\"\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n .checkValidity=${this._checkValidity}\n .value=${this._value}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && this.nucleon?.submit()}\n @input=${(evt: CustomEvent) => {\n const area = evt.currentTarget as PasswordFieldElement;\n this._value = area.value;\n }}\n >\n ${this.showGenerator ? this.__renderGenerator() : ''}\n </vaadin-password-field>\n `;\n }\n\n protected get _value(): string {\n return (super._value as string | undefined) ?? '';\n }\n\n protected set _value(newValue: string) {\n super._value = newValue as unknown | undefined;\n }\n\n private __renderGenerator(): TemplateResult {\n return html`\n <div\n data-testid=\"generator\"\n class=${classMap({\n 'w-s h-s flex items-center justify-center cursor-default transition-colors': true,\n 'text-contrast-60 hover-text-contrast-80': !this.disabled && !this.readonly,\n 'text-contrast-20': this.disabled || this.readonly,\n })}\n slot=\"suffix\"\n @click=${() => {\n this._value = generateRandomPassword();\n const field = this.renderRoot.querySelector('vaadin-password-field');\n // @ts-expect-error: this is a private method but it's ok since the version is fixed\n field?._setPasswordVisible(true);\n }}\n >\n ${svg`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" style=\"width: 1.15em; height: 1.15em\"><path d=\"M15.98 1.804a1 1 0 00-1.96 0l-.24 1.192a1 1 0 01-.784.785l-1.192.238a1 1 0 000 1.962l1.192.238a1 1 0 01.785.785l.238 1.192a1 1 0 001.962 0l.238-1.192a1 1 0 01.785-.785l1.192-.238a1 1 0 000-1.962l-1.192-.238a1 1 0 01-.785-.785l-.238-1.192zM6.949 5.684a1 1 0 00-1.898 0l-.683 2.051a1 1 0 01-.633.633l-2.051.683a1 1 0 000 1.898l2.051.684a1 1 0 01.633.632l.683 2.051a1 1 0 001.898 0l.683-2.051a1 1 0 01.633-.633l2.051-.683a1 1 0 000-1.898l-2.051-.683a1 1 0 01-.633-.633L6.95 5.684zM13.949 13.684a1 1 0 00-1.898 0l-.184.551a1 1 0 01-.632.633l-.551.183a1 1 0 000 1.898l.551.183a1 1 0 01.633.633l.183.551a1 1 0 001.898 0l.184-.551a1 1 0 01.632-.633l.551-.183a1 1 0 000-1.898l-.551-.184a1 1 0 01-.633-.632l-.183-.551z\" /></svg>`}\n </div>\n `;\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function generateRandomPassword(): string;
@@ -0,0 +1,11 @@
1
+ export function generateRandomPassword() {
2
+ const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
3
+ let result = '';
4
+ for (let i = 0; i < 18; i++) {
5
+ if (i > 0 && i % 6 === 0)
6
+ result += '-';
7
+ result += charset[Math.floor(Math.random() * charset.length)];
8
+ }
9
+ return result;
10
+ }
11
+ //# sourceMappingURL=generateRandomPassword.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateRandomPassword.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalPasswordControl/generateRandomPassword.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,gEAAgE,CAAC;IACjF,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,GAAG,CAAC;QACxC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;KAC/D;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["export function generateRandomPassword(): string {\n const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n\n for (let i = 0; i < 18; i++) {\n if (i > 0 && i % 6 === 0) result += '-';\n result += charset[Math.floor(Math.random() * charset.length)];\n }\n\n return result;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { Data, Templates } from './types';
2
- import { CSSResultArray, TemplateResult } from 'lit-element';
1
+ import { Data, Settings, Templates } from './types';
2
+ import { CSSResultArray, TemplateResult, PropertyDeclarations } from 'lit-element';
3
3
  import { ScopedElementsMap } from '@open-wc/scoped-elements';
4
4
  import { NucleonElement } from '../NucleonElement/NucleonElement';
5
5
  declare const Base: typeof NucleonElement & import("lit-element").Constructor<import("../../../mixins/translatable").TranslatableMixinHost> & {
@@ -51,8 +51,11 @@ declare const Base: typeof NucleonElement & import("lit-element").Constructor<im
51
51
  */
52
52
  export declare class Customer extends Base<Data> {
53
53
  static get scopedElements(): ScopedElementsMap;
54
+ static get properties(): PropertyDeclarations;
54
55
  static get styles(): CSSResultArray;
55
56
  templates: Templates;
57
+ /** Customer Portal settings for use in Customer mode. */
58
+ settings: Settings | null;
56
59
  private readonly __renderHeaderActionsEdit;
57
60
  private readonly __renderHeaderActions;
58
61
  private readonly __renderHeader;
@@ -59,6 +59,8 @@ export class Customer extends Base {
59
59
  constructor() {
60
60
  super(...arguments);
61
61
  this.templates = {};
62
+ /** Customer Portal settings for use in Customer mode. */
63
+ this.settings = null;
62
64
  // #region header
63
65
  this.__renderHeaderActionsEdit = () => {
64
66
  const { readonlySelector, disabledSelector, hiddenSelector } = this;
@@ -84,6 +86,7 @@ export class Customer extends Base {
84
86
  disabledcontrols=${disabledSelector.zoom(formId).toString()}
85
87
  hiddencontrols=${hiddenSelector.zoom(formId).toString()}
86
88
  .templates=${this.getNestedTemplates('header:actions:edit:form')}
89
+ .props=${{ '.settings': this.settings }}
87
90
  >
88
91
  </foxy-form-dialog>
89
92
 
@@ -620,6 +623,7 @@ export class Customer extends Base {
620
623
  ns=${this.ns}
621
624
  id="subscriptions-form"
622
625
  .templates=${this.getNestedTemplates(formId)}
626
+ .props=${{ '.settings': this.settings }}
623
627
  >
624
628
  </foxy-form-dialog>
625
629
 
@@ -684,6 +688,12 @@ export class Customer extends Base {
684
688
  'x-tabs': Tabs,
685
689
  };
686
690
  }
691
+ static get properties() {
692
+ return {
693
+ ...super.properties,
694
+ settings: { type: Object },
695
+ };
696
+ }
687
697
  static get styles() {
688
698
  return [super.styles, styles];
689
699
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Customer.js","sourceRoot":"","sources":["../../../../src/elements/public/Customer/Customer.ts"],"names":[],"mappings":"AACA,OAAO,EAAkC,IAAI,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAqB,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAKlF,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AAGjE,OAAO,EAAE,KAAK,EAAE,+BAA4B;AAE5C,OAAO,EAAE,cAAc,EAAE,4CAAyC;AAElE,OAAO,EAAE,QAAQ,EAAE,2CAAwC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,oDAAiD;AAC9E,OAAO,EAAE,IAAI,EAAE,mCAAgC;AAC/C,OAAO,EAAE,cAAc,EAAE,qCAAkC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AACjE,OAAO,EAAE,QAAQ,EAAE,oCAAiC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAElC,MAAM,EAAE,GAAG,UAAU,CAAC;AACtB,MAAM,IAAI,GAAG,mBAAmB,CAC9B,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,CACzE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,MAAM,OAAO,QAAS,SAAQ,IAAU;IAAxC;;QAyBE,cAAS,GAAc,EAAE,CAAC;QAE1B,iBAAiB;QAEA,8BAAyB,GAAG,GAAG,EAAE;YAChD,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;YAEpE,MAAM,QAAQ,GAAG,qBAAqB,CAAC;YACvC,MAAM,MAAM,GAAG,0BAA0B,CAAC;YAC1C,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/C,MAAM,oBAAoB,GAAG,CAAC,QAAQ,IAAI,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAEnF,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,oBAAoB,CAAC,4BAA4B,CAAC;;;;;iBAK9C,IAAI,CAAC,MAAM;gBACZ,IAAI,CAAC,KAAK;eACX,IAAI,CAAC,IAAI;;eAET,IAAI,CAAC,IAAI;aACX,IAAI,CAAC,EAAE;aACP,QAAQ;2BACM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;2BACxC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;yBAC1C,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;qBAC1C,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,CAAC;;;;;;qBAMnD,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;;;oBAG5B,oBAAoB;iBACvB,CAAC,GAAU,EAAE,EAAE;gBACtB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,QAAQ,EAAE,CAAe,CAAC;gBAC3E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAA4B,CAAC,CAAC;YAChD,CAAC;;;;;QAKD,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,CAAC;KACzD,CAAC;QACJ,CAAC,CAAC;QAEe,0BAAqB,GAAG,GAAG,EAAE;YAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAElE,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,oBAAoB,CAAC,uBAAuB,CAAC;UAClD,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,EAAE;UAC5E,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC;;KAEtD,CAAC;QACJ,CAAC,CAAC;QAEe,mBAAc,GAAG,GAAG,EAAE;YACrC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAElE,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC;;;;;;;YAOtC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;gBAC7B,CAAC,CAAC,IAAI,CAAA,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACtD,CAAC,CAAC,IAAI,CAAA,sCAAsC,OAAO,sBAAsB;;;UAG3E,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE;;;QAGzF,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;KAC5C,CAAC;QACJ,CAAC,CAAC;QAEF,aAAa;QAEb,oBAAoB;QAEH,mCAA8B,GAAG,GAAG,EAAE;;YACrD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;YAEhC,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACzE,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACzE,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAErE,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,CAAC,QAAQ,IAAI,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAEzE,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,oBAAoB,CAAC,iCAAiC,CAAC;;;;qBAI/C,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;;;oBAG5B,UAAU;iBACb,CAAC,GAAU,EAAE,EAAE;gBACtB,IAAI,IAAI,KAAK,IAAI;oBAAE,OAAO;gBAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,MAA2B,CAAC;gBAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,iBAA+B,CAAC;gBACtD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;;;6BAGoB,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;6BAC/C,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;2BACjD,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;;mBAErD,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,CAAC,uBAAuB,EAAE,IAAI,mCAAI,EAAE;;kBAEjD,IAAI,CAAC,KAAK;;iBAEX,IAAI;eACN,EAAE;;uBAEM,IAAI,CAAC,kBAAkB,CAAC,+BAA+B,CAAC;;;;;;;QAOvE,IAAI,CAAC,oBAAoB,CAAC,gCAAgC,CAAC;KAC9D,CAAC;QACJ,CAAC,CAAC;QAEe,6BAAwB,GAAG,GAAG,EAAE;YAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAErE,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,oBAAoB,CAAC,0BAA0B,CAAC;UACrD,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,8BAA8B,EAAE;UACnF,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,CAAC;;KAEzD,CAAC;QACJ,CAAC,CAAC;QAEe,8BAAyB,GAAkC,GAAG,CAAC,EAAE;;YAChF,MAAM,WAAW,GAAG,CAAC,GAAU,EAAE,EAAE;gBACjC,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;oBAAE,OAAO;gBAE9B,MAAM,MAAM,GAAG,GAAG,CAAC,MAA2B,CAAC;gBAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAgC,CAAC;gBAChE,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAe,CAAC;gBAEtE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,QAAQ,CAAC;gBAC7B,gEAAgE,EAAE,IAAI;gBACtE,2BAA2B,EAAE,IAAI;gBACjC,kEAAkE,EAAE,GAAG,CAAC,IAAI,KAAK,IAAI;aACtF,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;YAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;YAE9E,OAAO,IAAI,CAAA;;;gBAGC,aAAa;oBACT,CAAC,GAAG,CAAC,IAAI,IAAI,UAAU,IAAI,UAAU;iBACxC,WAAW;;;2BAGD,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE;mBACrC,GAAG,CAAC,MAAM;;kBAEX,GAAG,CAAC,KAAK;iBACV,GAAG,CAAC,IAAI;iBACR,GAAG,CAAC,IAAI;gBACT,GAAG,CAAC,EAAE,IAAI,YAAA,cAAc,CAAC,GAAG,CAAC,mBAAmB,CAAC,0CAAE,SAAS,mCAAI,EAAE;uBAC3D,GAAG,CAAC,SAAS;;;;KAI/B,CAAC;QACJ,CAAC,CAAC;QAEe,8BAAyB,GAAoC,GAAG,CAAC,EAAE;YAClF,OAAO,GAAG,CAAC,IAAI,CAAA;;yBAEM,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE;;gBAEtC,GAAG,CAAC,KAAK;eACV,GAAG,CAAC,IAAI;eACR,GAAG,CAAC,IAAI;aACV,GAAG,CAAC,EAAE;gBACH,IAAI,CAAC,yBAAyB;qBACzB,GAAG,CAAC,SAAS;;;KAG7B,CAAC;QACJ,CAAC,CAAC;QAEe,0BAAqB,GAAG,GAAG,EAAE;;YAC5C,MAAM,MAAM,GAAG,qBAAqB,CAAC;YACrC,MAAM,MAAM,GAAG,qBAAqB,CAAC;YAErC,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,oBAAoB,CAAC,uBAAuB,CAAC;;;2BAG/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;2BAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;yBAC/C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;;iBAEnD,YAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,CAAC,uBAAuB,EAAE,IAAI,mCAAI,EAAE;;gBAEtD,IAAI,CAAC,KAAK;;eAEX,IAAI,CAAC,IAAI;aACX,IAAI,CAAC,EAAE;;qBAEC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;;;;;yBAK3B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;;gBAEpD,YAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,CAAC,uBAAuB,EAAE,IAAI,mCAAI,EAAE;;gBAErD,IAAI,CAAC,KAAK;eACX,IAAI,CAAC,IAAI;aACX,IAAI,CAAC,EAAE;gBACJ,IAAI,CAAC,yBAAyB;qBACzB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;;;;QAI5C,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC;KACpD,CAAC;QACJ,CAAC,CAAC;QAEe,sBAAiB,GAAG,GAAG,EAAE;YACxC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;YAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAE7D,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC;;;;;4BAKzB,EAAE,SAAS,IAAI;;;YAG/B,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE;;;UAGhF,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE;;;QAG1E,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;KAC/C,CAAC;QACJ,CAAC,CAAC;QAEF,aAAa;QAEb,0BAA0B;QAET,+BAA0B,GAAG,GAAG,EAAE;;YACjD,MAAM,MAAM,GAAG,2BAA2B,CAAC;YAE3C,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,oBAAoB,CAAC,6BAA6B,CAAC;;;6BAGrC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;6BAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;2BAC/C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;wBAC9C,MAAM;kBACZ,IAAI,CAAC,KAAK;;iBAEX,YAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,CAAC,2BAA2B,EAAE,IAAI,mCAAI,EAAE;iBACzD,IAAI,CAAC,IAAI;gBACV,IAAI,CAAC,EAAE,IAAI,YAAA,cAAc,CAAC,GAAG,CAAC,0BAA0B,CAAC,0CAAE,SAAS,mCAAI,EAAE;uBACnE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;;;;UAI5C,IAAI,CAAC,oBAAoB,CAAC,4BAA4B,CAAC;;KAE5D,CAAC;QACJ,CAAC,CAAC;QAEe,2BAAsB,GAAG,GAAG,EAAE;YAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAEnE,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC;;;;;;mBAMxC,IAAI,CAAC,IAAI;;iBAEX,IAAI,CAAC,EAAE;;;;;UAKd,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,EAAE;;;QAG/E,IAAI,CAAC,oBAAoB,CAAC,uBAAuB,CAAC;KACrD,CAAC;QACJ,CAAC,CAAC;QAEF,aAAa;QAEb,qBAAqB;QAEJ,oCAA+B,GAAG,GAAG,EAAE;;YACtD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;YAEhC,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC1E,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC1E,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,CAAC,QAAQ,IAAI,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAEzE,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,oBAAoB,CAAC,kCAAkC,CAAC;;;;qBAIhD,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;;;oBAG5B,UAAU;iBACb,CAAC,GAAU,EAAE,EAAE;gBACtB,IAAI,IAAI,KAAK,IAAI;oBAAE,OAAO;gBAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,MAA2B,CAAC;gBAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,iBAA+B,CAAC;gBACtD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;;;6BAGoB,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;6BAC/C,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;2BACjD,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;;mBAErD,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,CAAC,eAAe,EAAE,IAAI,mCAAI,EAAE;;kBAEzC,IAAI,CAAC,KAAK;;iBAEX,IAAI;eACN,EAAE;uBACM,IAAI,CAAC,kBAAkB,CAAC,gCAAgC,CAAC;;;;;;;QAOxE,IAAI,CAAC,oBAAoB,CAAC,iCAAiC,CAAC;KAC/D,CAAC;QACJ,CAAC,CAAC;QAEe,8BAAyB,GAAG,GAAG,EAAE;YAChD,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAEtE,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,CAAC;UACtD,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,+BAA+B,EAAE;UACpF,IAAI,CAAC,oBAAoB,CAAC,0BAA0B,CAAC;;KAE1D,CAAC;QACJ,CAAC,CAAC;QAEe,+BAA0B,GAA4B,GAAG,CAAC,EAAE;;YAC3E,MAAM,WAAW,GAAG,CAAC,GAAU,EAAE,EAAE;gBACjC,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;oBAAE,OAAO;gBAE9B,MAAM,MAAM,GAAG,GAAG,CAAC,MAA2B,CAAC;gBAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAgC,CAAC;gBAChE,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAe,CAAC;gBAEvE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,QAAQ,CAAC;gBAC7B,0FAA0F,EACxF,IAAI;gBACN,kEAAkE,EAAE,GAAG,CAAC,IAAI,KAAK,IAAI;aACtF,CAAC,CAAC;YAEH,OAAO,GAAG,CAAC,IAAI,CAAA;;;gBAGH,aAAa;oBACT,GAAG,CAAC,IAAI,KAAK,IAAI;iBACpB,WAAW;;;2BAGD,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE;mBACrC,GAAG,CAAC,MAAM;kBACX,GAAG,CAAC,KAAK;;iBAEV,GAAG,CAAC,IAAI;iBACR,GAAG,CAAC,IAAI;gBACT,GAAG,CAAC,EAAE,IAAI,YAAA,cAAc,CAAC,GAAG,CAAC,qBAAqB,CAAC,0CAAE,SAAS,mCAAI,EAAE;uBAC7D,GAAG,CAAC,SAAS;;;;KAI/B,CAAC;QACJ,CAAC,CAAC;QAEe,+BAA0B,GAA6B,GAAG,CAAC,EAAE;YAC5E,OAAO,IAAI,CAAA;;yBAEU,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE;;gBAEtC,GAAG,CAAC,KAAK;eACV,GAAG,CAAC,IAAI;eACR,GAAG,CAAC,IAAI;aACV,GAAG,CAAC,EAAE;gBACH,IAAI,CAAC,0BAA0B;qBAC1B,GAAG,CAAC,SAAS;;;KAG7B,CAAC;QACJ,CAAC,CAAC;QAEe,2BAAsB,GAAG,GAAG,EAAE;;YAC7C,MAAM,MAAM,GAAG,sBAAsB,CAAC;YACtC,MAAM,MAAM,GAAG,sBAAsB,CAAC;YAEtC,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC;;;2BAGhC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;2BAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;yBAC/C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;;;iBAGnD,YAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,CAAC,eAAe,EAAE,IAAI,mCAAI,EAAE;;gBAE9C,IAAI,CAAC,KAAK;;eAEX,IAAI,CAAC,IAAI;aACX,IAAI,CAAC,EAAE;;qBAEC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;;;;;yBAK3B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;;gBAEpD,YAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,CAAC,eAAe,EAAE,IAAI,mCAAI,EAAE;;gBAE7C,IAAI,CAAC,KAAK;eACX,IAAI,CAAC,IAAI;aACX,IAAI,CAAC,EAAE;gBACJ,IAAI,CAAC,0BAA0B;qBAC1B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;;;;QAI5C,IAAI,CAAC,oBAAoB,CAAC,uBAAuB,CAAC;KACrD,CAAC;QACJ,CAAC,CAAC;QAEe,uBAAkB,GAAG,GAAG,EAAE;YACzC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;YAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE9D,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC;;;;;4BAK1B,EAAE,SAAS,IAAI;;;YAG/B,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,EAAE;;;UAGjF,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE;;;QAG3E,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC;KAChD,CAAC;QACJ,CAAC,CAAC;QAEF,aAAa;QAEb,uBAAuB;QAEN,yBAAoB,GAAG,GAAG,EAAE;YAC3C,IAAI,gBAAgB,GAAG,EAAE,CAAC;YAE1B,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE;gBACjC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC1E,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAClD,gBAAgB,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;aAC/C;YAED,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC;;;;;;kBAMtC,gBAAgB;;kBAEhB,IAAI,CAAC,KAAK;;iBAEX,IAAI,CAAC,IAAI;eACX,IAAI,CAAC,EAAE;uBACC,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC;;;;;QAK5D,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC;KAClD,CAAC;QACJ,CAAC,CAAC;QAEF,aAAa;QAEb,wBAAwB;QAEP,gCAA2B,GAA4B;YACtE,kBAAkB,CAAC,WAAW;YAC9B,kBAAkB,CAAC,aAAa;YAChC,kBAAkB,CAAC,YAAY;YAC/B;gBACE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAA;;;;mBAIvB,CAAC,GAAU,EAAE,EAAE;oBACtB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,CAAe,CAAC;oBAChF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAuB,CAAC;oBAE3C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;oBAC5D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpB,CAAC;;2CAEgC,IAAI,oBAAoB,IAAI,CAAC,EAAE;;OAEnE;aACF;SACF,CAAC;QAEe,8BAAyB,GAAgC,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE;YAC7F,OAAO,IAAI,CAAA;;;gBAGC,GAAG,CAAC,KAAK;eACV,GAAG,CAAC,IAAI;eACR,GAAG,CAAC,IAAI;cACT,GAAG,CAAC,EAAE;mBACD,IAAI,CAAC,2BAA2B;qBAC9B,GAAG,CAAC,SAAS;;;KAG7B,CAAC;QACJ,CAAC,CAAC;QAEe,0BAAqB,GAAG,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAG,oBAAoB,CAAC;YACpC,IAAI,iBAAiB,GAAG,EAAE,CAAC;YAE3B,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE;gBACjC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC5E,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;gBACxE,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC;aACjD;YAED,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC;;;6BAG9B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;6BAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;2BAC/C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;wBAC9C,MAAM;;kBAEZ,IAAI,CAAC,KAAK;;iBAEX,IAAI,CAAC,IAAI;eACX,IAAI,CAAC,EAAE;;uBAEC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;;;;;;;;oBAQlC,iBAAiB;;oBAEjB,IAAI,CAAC,KAAK;mBACX,IAAI,CAAC,IAAI;iBACX,IAAI,CAAC,EAAE;oBACJ,IAAI,CAAC,yBAAyB;yBACzB,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,CAAC;;;;;UAK7D,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC;;KAErD,CAAC;QACJ,CAAC,CAAC;QAEF,aAAa;QAEb,eAAe;QAEE,iBAAY,GAAG,CAAC,IAAW,EAAE,EAAE;YAC9C,OAAO,IAAI,CAAA;;uBAEQ,IAAI,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAClE,IAAI,CAAC,GAAG,CACR,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAA;;;4BAGJ,KAAK;uBACV,IAAI,CAAC,IAAI;sBACV,GAAG,CAAC,KAAK;qBACV,IAAI,CAAC,EAAE;;;;iCAIK,KAAK,KAAK,GAAG,CAAC,OAAO;aACzC,CACF;;;KAGN,CAAC;QACJ,CAAC,CAAC;IAqDJ,CAAC;IAtuBC,MAAM,KAAK,cAAc;QACvB,OAAO;YACL,0BAA0B,EAAE,cAAc,CAAC,GAAG,CAAC,0BAA0B,CAAC;YAC1E,yBAAyB,EAAE,cAAc,CAAC,GAAG,CAAC,yBAAyB,CAAC;YACxE,uBAAuB,EAAE,cAAc,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACpE,uBAAuB,EAAE,cAAc,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACpE,qBAAqB,EAAE,cAAc,CAAC,GAAG,CAAC,qBAAqB,CAAC;YAChE,mBAAmB,EAAE,cAAc,CAAC,GAAG,CAAC,mBAAmB,CAAC;YAC5D,kBAAkB,EAAE,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC;YAC1D,eAAe,EAAE,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;YACpD,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;YAClD,YAAY,EAAE,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YAC9C,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC;YAC5C,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC;YAC5C,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;IA6pBD,aAAa;IAEb,MAAM;;QACJ,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAU,EAAE,CAAC;QAEvB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE;YACjD,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;SAClF;QAED,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE;YAClD,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;SACpF;QAED,OAAO,IAAI,CAAA;8DAC+C,MAAM;;kBAElD,QAAQ,CAAC;YACf,gDAAgD,EAAE,IAAI;YACtD,YAAY,EAAE,CAAC,QAAQ;SACxB,CAAC;;YAEA,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE;YACnE,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC1E,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACzE,cAAc,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACpF,cAAc,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC3E,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;;;;;kBAK1C,QAAQ,CAAC;YACf,2DAA2D,EAAE,IAAI;YACjE,+BAA+B,EAAE,QAAQ;SAC1C,CAAC;;;;;oBAKQ,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;mBACtD,IAAI;kBACL,EAAE,IAAI,YAAA,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,0CAAE,SAAS,mCAAI,EAAE;;;;;KAKtE,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { Attributes, CustomerAddresses, Data, Tab, Templates } from './types';\nimport { CSSResultArray, TemplateResult, html } from 'lit-element';\nimport { ScopedElementsMap, ScopedElementsMixin } from '@open-wc/scoped-elements';\n\nimport { Data as Attribute } from '../AttributeCard/types';\nimport { ButtonElement } from '@vaadin/vaadin-button';\nimport { Column } from '../Table/types';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { Data as CustomerAddress } from '../AddressCard/types';\nimport { FormDialog } from '../FormDialog/FormDialog';\nimport { Group } from '../../private/index';\nimport { ItemRenderer } from '../CollectionPage/types';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { PageRenderer } from '../CollectionPages/types';\nimport { Skeleton } from '../../private/Skeleton/Skeleton';\nimport { Data as Subscriptions } from '../SubscriptionsTable/types';\nimport { SubscriptionsTable } from '../SubscriptionsTable/SubscriptionsTable';\nimport { Tabs } from '../../private/Tabs/Tabs';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { classMap } from '../../../utils/class-map';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { styles } from './styles';\n\nconst NS = 'customer';\nconst Base = ScopedElementsMixin(\n ConfigurableMixin(ThemeableMixin(TranslatableMixin(NucleonElement, NS)))\n);\n\n/**\n * All-in-one element for customer management.\n *\n * @slot header:before - **new in v1.4.0**\n * @slot header:after - **new in v1.4.0**\n * @slot header:actions:before - **new in v1.4.0**\n * @slot header:actions:after - **new in v1.4.0**\n * @slot header:actions:edit:before - **new in v1.4.0**\n * @slot header:actions:edit:after - **new in v1.4.0**\n *\n * @slot addresses:before - **new in v1.4.0**\n * @slot addresses:after - **new in v1.4.0**\n * @slot addresses:actions:before - **new in v1.4.0**\n * @slot addresses:actions:after - **new in v1.4.0**\n * @slot addresses:actions:create:before - **new in v1.4.0**\n * @slot addresses:actions:create:after - **new in v1.4.0**\n * @slot addresses:list:before - **new in v1.4.0**\n * @slot addresses:list:after - **new in v1.4.0**\n *\n * @slot payment-methods:before - **new in v1.4.0**\n * @slot payment-methods:after - **new in v1.4.0**\n * @slot payment-methods:list:before - **new in v1.4.0**\n * @slot payment-methods:list:after - **new in v1.4.0**\n *\n * @slot attributes:before - **new in v1.4.0**\n * @slot attributes:after - **new in v1.4.0**\n * @slot attributes:actions:before - **new in v1.4.0**\n * @slot attributes:actions:after - **new in v1.4.0**\n * @slot attributes:actions:create:before - **new in v1.4.0**\n * @slot attributes:actions:create:after - **new in v1.4.0**\n * @slot attributes:list:before - **new in v1.4.0**\n * @slot attributes:list:after - **new in v1.4.0**\n *\n * @slot transactions:before - **new in v1.4.0**\n * @slot transactions:after - **new in v1.4.0**\n *\n * @slot subscriptions:before - **new in v1.4.0**\n * @slot subscriptions:after - **new in v1.4.0**\n *\n * @element foxy-customer\n * @since 1.2.0\n */\nexport class Customer extends Base<Data> {\n static get scopedElements(): ScopedElementsMap {\n return {\n 'foxy-payment-method-card': customElements.get('foxy-payment-method-card'),\n 'foxy-transactions-table': customElements.get('foxy-transactions-table'),\n 'foxy-collection-pages': customElements.get('foxy-collection-pages'),\n 'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),\n 'foxy-attribute-card': customElements.get('foxy-attribute-card'),\n 'foxy-address-card': customElements.get('foxy-address-card'),\n 'foxy-form-dialog': customElements.get('foxy-form-dialog'),\n 'vaadin-button': customElements.get('vaadin-button'),\n 'foxy-spinner': customElements.get('foxy-spinner'),\n 'foxy-table': customElements.get('foxy-table'),\n 'x-skeleton': Skeleton,\n 'iron-icon': customElements.get('iron-icon'),\n 'foxy-i18n': customElements.get('foxy-i18n'),\n 'x-group': Group,\n 'x-tabs': Tabs,\n };\n }\n\n static get styles(): CSSResultArray {\n return [super.styles, styles];\n }\n\n templates: Templates = {};\n\n // #region header\n\n private readonly __renderHeaderActionsEdit = () => {\n const { readonlySelector, disabledSelector, hiddenSelector } = this;\n\n const actionId = 'header:actions:edit';\n const formId = 'header:actions:edit:form';\n const dialogId = 'customer-dialog';\n\n const isLoaded = this.in({ idle: 'snapshot' });\n const isEditActionDisabled = !isLoaded || disabledSelector.matches(actionId, true);\n\n return html`\n ${this.renderTemplateOrSlot('header:actions:edit:before')}\n\n <foxy-form-dialog\n data-testid=\"header:actions:edit:form\"\n header=\"update\"\n parent=${this.parent}\n group=${this.group}\n href=${this.href}\n form=\"foxy-customer-form\"\n lang=${this.lang}\n ns=${this.ns}\n id=${dialogId}\n readonlycontrols=${readonlySelector.zoom(formId).toString()}\n disabledcontrols=${disabledSelector.zoom(formId).toString()}\n hiddencontrols=${hiddenSelector.zoom(formId).toString()}\n .templates=${this.getNestedTemplates('header:actions:edit:form')}\n >\n </foxy-form-dialog>\n\n <vaadin-button\n data-testid=\"header:actions:edit\"\n aria-label=${this.t('update').toString()}\n class=\"px-xs rounded-full\"\n theme=\"icon\"\n ?disabled=${isEditActionDisabled}\n @click=${(evt: Event) => {\n const dialog = this.renderRoot.querySelector(`#${dialogId}`) as FormDialog;\n dialog.show(evt.currentTarget as HTMLElement);\n }}\n >\n <iron-icon icon=\"editor:mode-edit\"></iron-icon>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('header:actions:edit:after')}\n `;\n };\n\n private readonly __renderHeaderActions = () => {\n const hiddenSelector = this.hiddenSelector.zoom('header:actions');\n\n return html`\n <div class=\"flex\" data-testid=\"header:actions\">\n ${this.renderTemplateOrSlot('header:actions:before')}\n ${hiddenSelector.matches('edit', true) ? '' : this.__renderHeaderActionsEdit()}\n ${this.renderTemplateOrSlot('header:actions:after')}\n </div>\n `;\n };\n\n private readonly __renderHeader = () => {\n const variant = ifDefined(this.in('busy') ? undefined : 'static');\n\n return html`\n ${this.renderTemplateOrSlot('header:before')}\n\n <header\n class=\"flex items-center justify-between space-x-m pb-s border-b border-contrast-10\"\n data-testid=\"header\"\n >\n <h1 class=\"text-xxl font-medium truncate min-w-0 flex-1\">\n ${this.in({ idle: 'snapshot' })\n ? html`${this.data.first_name} ${this.data.last_name}`\n : html`<x-skeleton class=\"w-full\" variant=${variant}>&nbsp;</x-skeleton>`}\n </h1>\n\n ${this.hiddenSelector.matches('header:actions', true) ? '' : this.__renderHeaderActions()}\n </header>\n\n ${this.renderTemplateOrSlot('header:after')}\n `;\n };\n\n // #endregion\n\n // #region addresses\n\n private readonly __renderAddressesActionsCreate = () => {\n const { data, lang, ns } = this;\n\n const disabledSelector = this.disabledSelector.zoom('addresses:actions');\n const readonlySelector = this.readonlySelector.zoom('addresses:actions');\n const hiddenSelector = this.hiddenSelector.zoom('addresses:actions');\n\n const isLoaded = this.in({ idle: 'snapshot' });\n const isDisabled = !isLoaded || disabledSelector.matches('create', true);\n\n return html`\n ${this.renderTemplateOrSlot('addresses:actions:create:before')}\n\n <vaadin-button\n data-testid=\"addresses:actions:create\"\n aria-label=${this.t('create').toString()}\n class=\"px-xs rounded-full\"\n theme=\"small icon\"\n ?disabled=${isDisabled}\n @click=${(evt: Event) => {\n if (data === null) return;\n const button = evt.target as HTMLButtonElement;\n const dialog = button.firstElementChild as FormDialog;\n dialog.show(button);\n }}\n >\n <foxy-form-dialog\n readonlycontrols=${readonlySelector.zoom('create:form').toString()}\n disabledcontrols=${disabledSelector.zoom('create:form').toString()}\n hiddencontrols=${hiddenSelector.zoom('create:form').toString()}\n data-testid=\"addresses:actions:create:form\"\n parent=${data?._links['fx:customer_addresses'].href ?? ''}\n header=\"create\"\n group=${this.group}\n form=\"foxy-address-form\"\n lang=${lang}\n ns=${ns}\n id=\"address-dialog\"\n .templates=${this.getNestedTemplates('addresses:actions:create:form')}\n >\n </foxy-form-dialog>\n\n <iron-icon slot=\"suffix\" icon=\"icons:add\"></iron-icon>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('addresses:actions:create:after')}\n `;\n };\n\n private readonly __renderAddressesActions = () => {\n const hiddenSelector = this.hiddenSelector.zoom('addresses:actions');\n\n return html`\n <div data-testid=\"addresses:actions\">\n ${this.renderTemplateOrSlot('addresses:actions:before')}\n ${hiddenSelector.matches('create', true) ? '' : this.__renderAddressesActionsCreate()}\n ${this.renderTemplateOrSlot('addresses:actions:after')}\n </div>\n `;\n };\n\n private readonly __renderAddressesListCard: ItemRenderer<CustomerAddress> = ctx => {\n const handleClick = (evt: Event) => {\n if (ctx.data === null) return;\n\n const button = evt.target as HTMLButtonElement;\n const root = button.getRootNode() as Element | DocumentFragment;\n const form = root.querySelector('#addresses-list-form') as FormDialog;\n\n form.href = ctx.data._links.self.href;\n form.show(button);\n };\n\n const computedClass = classMap({\n 'snap-start text-left p-m rounded-t-l rounded-b-l flex-shrink-0': true,\n 'border border-contrast-10': true,\n 'hover-border-contrast-30 focus-outline-none focus-border-primary': ctx.data !== null,\n });\n\n const isReadonly = this.readonlySelector.matches('addresses:list:card', true);\n const isDisabled = this.disabledSelector.matches('addresses:list:card', true);\n\n return html`\n <button\n data-testclass=\"addresses:list:card\"\n class=${computedClass}\n ?disabled=${!ctx.data || isReadonly || isDisabled}\n @click=${handleClick}\n >\n <foxy-address-card\n hiddencontrols=${ctx.hiddenControls.toString()}\n parent=${ctx.parent}\n class=\"w-tile\"\n group=${ctx.group}\n lang=${ctx.lang}\n href=${ctx.href}\n ns=\"${ctx.ns} ${customElements.get('foxy-address-card')?.defaultNS ?? ''}\"\n .templates=${ctx.templates}\n >\n </foxy-address-card>\n </button>\n `;\n };\n\n private readonly __renderAddressesListPage: PageRenderer<CustomerAddresses> = ctx => {\n return ctx.html`\n <foxy-collection-page\n hiddencontrols=${ctx.hiddenControls.toString()}\n class=\"space-x-m flex\"\n group=${ctx.group}\n lang=${ctx.lang}\n href=${ctx.href}\n ns=${ctx.ns}\n .item=${this.__renderAddressesListCard}\n .templates=${ctx.templates}\n >\n </foxy-collection-page>\n `;\n };\n\n private readonly __renderAddressesList = () => {\n const formId = 'addresses:list:form';\n const cardId = 'addresses:list:card';\n\n return html`\n ${this.renderTemplateOrSlot('addresses:list:before')}\n\n <foxy-form-dialog\n readonlycontrols=${this.readonlySelector.zoom(formId).toString()}\n disabledcontrols=${this.disabledSelector.zoom(formId).toString()}\n hiddencontrols=${this.hiddenSelector.zoom(formId).toString()}\n data-testid=\"addresses:list:form\"\n parent=${this.data?._links['fx:customer_addresses'].href ?? ''}\n header=\"update\"\n group=${this.group}\n form=\"foxy-address-form\"\n lang=${this.lang}\n ns=${this.ns}\n id=\"addresses-list-form\"\n .templates=${this.getNestedTemplates(formId)}\n >\n </foxy-form-dialog>\n\n <foxy-collection-pages\n hiddencontrols=${this.hiddenSelector.zoom(cardId).toString()}\n data-testid=\"addresses:list\"\n first=${this.data?._links['fx:customer_addresses'].href ?? ''}\n class=\"snap-x-mandatory flex items-center space-x-m overflow-auto\"\n group=${this.group}\n lang=${this.lang}\n ns=${this.ns}\n .page=${this.__renderAddressesListPage}\n .templates=${this.getNestedTemplates(cardId)}\n >\n </foxy-collection-pages>\n\n ${this.renderTemplateOrSlot('addresses:list:after')}\n `;\n };\n\n private readonly __renderAddresses = () => {\n const { lang, ns } = this;\n const hiddenSelector = this.hiddenSelector.zoom('addresses');\n\n return html`\n ${this.renderTemplateOrSlot('addresses:before')}\n\n <section class=\"pt-m\" data-testid=\"addresses\">\n <header class=\"space-x-m flex items-center mb-s\">\n <h2 class=\"text-l font-medium\">\n <foxy-i18n ns=${ns} lang=${lang} key=\"address_plural\"></foxy-i18n>\n </h2>\n\n ${hiddenSelector.matches('actions', true) ? '' : this.__renderAddressesActions()}\n </header>\n\n ${hiddenSelector.matches('list', true) ? '' : this.__renderAddressesList()}\n </section>\n\n ${this.renderTemplateOrSlot('addresses:after')}\n `;\n };\n\n // #endregion\n\n // #region payment-methods\n\n private readonly __renderPaymentMethodsList = () => {\n const cardId = 'payment-methods:list:card';\n\n return html`\n <div data-testid=\"payment-methods:list\">\n ${this.renderTemplateOrSlot('payment-methods:list:before')}\n\n <foxy-payment-method-card\n readonlycontrols=${this.readonlySelector.zoom(cardId).toString()}\n disabledcontrols=${this.disabledSelector.zoom(cardId).toString()}\n hiddencontrols=${this.hiddenSelector.zoom(cardId).toString()}\n data-testid=${cardId}\n group=${this.group}\n class=\"w-payment-method-card border-radius-overflow-fix rounded-t-l rounded-b-l overflow-hidden\"\n href=${this.data?._links['fx:default_payment_method'].href ?? ''}\n lang=${this.lang}\n ns=\"${this.ns} ${customElements.get('foxy-payment-method-card')?.defaultNS ?? ''}\"\n .templates=${this.getNestedTemplates(cardId)}\n >\n </foxy-payment-method-card>\n\n ${this.renderTemplateOrSlot('payment-methods:list:after')}\n </div>\n `;\n };\n\n private readonly __renderPaymentMethods = () => {\n const hiddenSelector = this.hiddenSelector.zoom('payment-methods');\n\n return html`\n ${this.renderTemplateOrSlot('payment-methods:before')}\n\n <div class=\"pt-m\" data-testid=\"payment-methods\">\n <h2 class=\"text-l font-medium mb-s\">\n <foxy-i18n\n data-testclass=\"i18n\"\n lang=${this.lang}\n key=\"payment_method_plural\"\n ns=${this.ns}\n >\n </foxy-i18n>\n </h2>\n\n ${hiddenSelector.matches('list', true) ? '' : this.__renderPaymentMethodsList()}\n </div>\n\n ${this.renderTemplateOrSlot('payment-methods:after')}\n `;\n };\n\n // #endregion\n\n // #region attributes\n\n private readonly __renderAttributesActionsCreate = () => {\n const { data, lang, ns } = this;\n\n const disabledSelector = this.disabledSelector.zoom('attributes:actions');\n const readonlySelector = this.readonlySelector.zoom('attributes:actions');\n const hiddenSelector = this.hiddenSelector.zoom('attributes:actions');\n\n const isLoaded = this.in({ idle: 'snapshot' });\n const isDisabled = !isLoaded || disabledSelector.matches('create', true);\n\n return html`\n ${this.renderTemplateOrSlot('attributes:actions:create:before')}\n\n <vaadin-button\n data-testid=\"attributes:actions:create\"\n aria-label=${this.t('create').toString()}\n class=\"px-xs rounded-full\"\n theme=\"small icon\"\n ?disabled=${isDisabled}\n @click=${(evt: Event) => {\n if (data === null) return;\n const button = evt.target as HTMLButtonElement;\n const dialog = button.firstElementChild as FormDialog;\n dialog.show(button);\n }}\n >\n <foxy-form-dialog\n readonlycontrols=${readonlySelector.zoom('create:form').toString()}\n disabledcontrols=${disabledSelector.zoom('create:form').toString()}\n hiddencontrols=${hiddenSelector.zoom('create:form').toString()}\n data-testid=\"attributes:actions:create:form\"\n parent=${data?._links['fx:attributes'].href ?? ''}\n header=\"create\"\n group=${this.group}\n form=\"foxy-attribute-form\"\n lang=${lang}\n ns=${ns}\n .templates=${this.getNestedTemplates('attributes:actions:create:form')}\n >\n </foxy-form-dialog>\n\n <iron-icon slot=\"suffix\" icon=\"icons:add\"></iron-icon>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('attributes:actions:create:after')}\n `;\n };\n\n private readonly __renderAttributesActions = () => {\n const hiddenSelector = this.hiddenSelector.zoom('attributes:actions');\n\n return html`\n <div data-testid=\"attributes:actions\">\n ${this.renderTemplateOrSlot('attributes:actions:before')}\n ${hiddenSelector.matches('create', true) ? '' : this.__renderAttributesActionsCreate()}\n ${this.renderTemplateOrSlot('attributes:actions:after')}\n </div>\n `;\n };\n\n private readonly __renderAttributesListCard: ItemRenderer<Attribute> = ctx => {\n const handleClick = (evt: Event) => {\n if (ctx.data === null) return;\n\n const button = evt.target as HTMLButtonElement;\n const root = button.getRootNode() as Element | DocumentFragment;\n const form = root.querySelector('#attributes-list-form') as FormDialog;\n\n form.href = ctx.data._links.self.href;\n form.show(button);\n };\n\n const computedClass = classMap({\n 'snap-start text-left p-m rounded-t-l rounded-b-l flex-shrink-0 border border-contrast-10':\n true,\n 'hover-border-contrast-30 focus-outline-none focus-border-primary': ctx.data !== null,\n });\n\n return ctx.html`\n <button \n data-testclass=\"attributes:list:card\"\n class=${computedClass}\n ?disabled=${ctx.data === null}\n @click=${handleClick}\n >\n <foxy-attribute-card\n hiddencontrols=${ctx.hiddenControls.toString()}\n parent=${ctx.parent}\n group=${ctx.group}\n class=\"w-tile\"\n lang=${ctx.lang}\n href=${ctx.href}\n ns=\"${ctx.ns} ${customElements.get('foxy-attribute-card')?.defaultNS ?? ''}\"\n .templates=${ctx.templates}\n >\n </foxy-attribute-card>\n </button>\n `;\n };\n\n private readonly __renderAttributesListPage: PageRenderer<Attributes> = ctx => {\n return html`\n <foxy-collection-page\n hiddencontrols=${ctx.hiddenControls.toString()}\n class=\"space-x-m flex\"\n group=${ctx.group}\n lang=${ctx.lang}\n href=${ctx.href}\n ns=${ctx.ns}\n .item=${this.__renderAttributesListCard}\n .templates=${ctx.templates}\n >\n </foxy-collection-page>\n `;\n };\n\n private readonly __renderAttributesList = () => {\n const formId = 'attributes:list:form';\n const cardId = 'attributes:list:card';\n\n return html`\n ${this.renderTemplateOrSlot('attributes:list:before')}\n\n <foxy-form-dialog\n readonlycontrols=${this.readonlySelector.zoom(formId).toString()}\n disabledcontrols=${this.disabledSelector.zoom(formId).toString()}\n hiddencontrols=${this.hiddenSelector.zoom(formId).toString()}\n data-testclass=\"i18n\"\n data-testid=\"attributes:list:form\"\n parent=${this.data?._links['fx:attributes'].href ?? ''}\n header=\"update\"\n group=${this.group}\n form=\"foxy-attribute-form\"\n lang=${this.lang}\n ns=${this.ns}\n id=\"attributes-list-form\"\n .templates=${this.getNestedTemplates(formId)}\n >\n </foxy-form-dialog>\n\n <foxy-collection-pages\n hiddencontrols=${this.hiddenControls.zoom(cardId).toString()}\n data-testid=\"attributes:list\"\n first=${this.data?._links['fx:attributes'].href ?? ''}\n class=\"snap-x-mandatory flex items-center space-x-m overflow-auto\"\n group=${this.group}\n lang=${this.lang}\n ns=${this.ns}\n .page=${this.__renderAttributesListPage}\n .templates=${this.getNestedTemplates(cardId)}\n >\n </foxy-collection-pages>\n\n ${this.renderTemplateOrSlot('attributes:list:after')}\n `;\n };\n\n private readonly __renderAttributes = () => {\n const { lang, ns } = this;\n const hiddenSelector = this.hiddenSelector.zoom('attributes');\n\n return html`\n ${this.renderTemplateOrSlot('attributes:before')}\n\n <section class=\"pt-m\" data-testid=\"attributes\">\n <header class=\"space-x-m flex items-center mb-s\">\n <h2 class=\"text-l font-medium\">\n <foxy-i18n ns=${ns} lang=${lang} key=\"attribute_plural\"></foxy-i18n>\n </h2>\n\n ${hiddenSelector.matches('actions', true) ? '' : this.__renderAttributesActions()}\n </header>\n\n ${hiddenSelector.matches('list', true) ? '' : this.__renderAttributesList()}\n </section>\n\n ${this.renderTemplateOrSlot('attributes:after')}\n `;\n };\n\n // #endregion\n\n // #region transactions\n\n private readonly __renderTransactions = () => {\n let transactionsLink = '';\n\n if (this.in({ idle: 'snapshot' })) {\n const transactionsURL = new URL(this.data._links['fx:transactions'].href);\n transactionsURL.searchParams.set('zoom', 'items');\n transactionsLink = transactionsURL.toString();\n }\n\n return html`\n ${this.renderTemplateOrSlot('transactions:before')}\n\n <x-group frame>\n <foxy-collection-pages\n data-testid=\"transactions\"\n spinner=\"foxy-spinner\"\n first=${transactionsLink}\n class=\"divide-y divide-contrast-10 block mx-m\"\n group=${this.group}\n page=\"foxy-transactions-table\"\n lang=${this.lang}\n ns=${this.ns}\n .templates=${this.getNestedTemplates('transactions:table')}\n >\n </foxy-collection-pages>\n </x-group>\n\n ${this.renderTemplateOrSlot('transactions:after')}\n `;\n };\n\n // #endregion\n\n // #region subscriptions\n\n private readonly __subscriptionsTableColumns: Column<Subscriptions>[] = [\n SubscriptionsTable.priceColumn,\n SubscriptionsTable.summaryColumn,\n SubscriptionsTable.statusColumn,\n {\n cell: ({ html, lang, data }) => html`\n <vaadin-button\n data-testclass=\"edit\"\n theme=\"small tertiary-inline\"\n @click=${(evt: Event) => {\n const link = new URL(data._links.self.href);\n const form = this.renderRoot.querySelector('#subscriptions-form') as FormDialog;\n const button = evt.target as ButtonElement;\n\n link.searchParams.set('zoom', 'transaction_template:items');\n form.href = link.toString();\n form.show(button);\n }}\n >\n <foxy-i18n class=\"text-m\" lang=${lang} key=\"update\" ns=${this.ns}></foxy-i18n>\n </vaadin-button>\n `,\n },\n ];\n\n private readonly __renderSubscriptionsPage: PageRenderer<Subscriptions> = ({ html, ...ctx }) => {\n return html`\n <foxy-table\n data-testclass=\"subscriptions:pages:table\"\n group=${ctx.group}\n href=${ctx.href}\n lang=${ctx.lang}\n ns=\"${ctx.ns} subscriptions-table\"\n .columns=${this.__subscriptionsTableColumns}\n .templates=${ctx.templates}\n >\n </foxy-table>\n `;\n };\n\n private readonly __renderSubscriptions = () => {\n const formId = 'subscriptions:form';\n let subscriptionsLink = '';\n\n if (this.in({ idle: 'snapshot' })) {\n const subscriptionsURL = new URL(this.data._links['fx:subscriptions'].href);\n subscriptionsURL.searchParams.set('zoom', 'transaction_template:items');\n subscriptionsLink = subscriptionsURL.toString();\n }\n\n return html`\n <div data-testid=\"subscriptions\">\n ${this.renderTemplateOrSlot('subscriptions:before')}\n\n <foxy-form-dialog\n readonlycontrols=${this.readonlySelector.zoom(formId).toString()}\n disabledcontrols=${this.disabledSelector.zoom(formId).toString()}\n hiddencontrols=${this.hiddenSelector.zoom(formId).toString()}\n data-testid=${formId}\n header=\"update\"\n group=${this.group}\n form=\"foxy-subscription-form\"\n lang=${this.lang}\n ns=${this.ns}\n id=\"subscriptions-form\"\n .templates=${this.getNestedTemplates(formId)}\n >\n </foxy-form-dialog>\n\n <x-group frame>\n <foxy-collection-pages\n data-testid=\"subscriptions:pages\"\n spinner=\"foxy-spinner\"\n first=${subscriptionsLink}\n class=\"divide-y divide-contrast-10 block mx-m\"\n group=${this.group}\n lang=${this.lang}\n ns=${this.ns}\n .page=${this.__renderSubscriptionsPage}\n .templates=${this.getNestedTemplates('subscriptions:table')}\n >\n </foxy-collection-pages>\n </x-group>\n\n ${this.renderTemplateOrSlot('subscriptions:after')}\n </div>\n `;\n };\n\n // #endregion\n\n // #region tabs\n\n private readonly __renderTabs = (tabs: Tab[]) => {\n return html`\n <div class=\"pt-m\">\n <x-tabs size=${tabs.length} ?disabled=${!this.in({ idle: 'snapshot' })}>\n ${tabs.map(\n (tab, index) => html`\n <foxy-i18n\n data-testclass=\"i18n\"\n slot=\"tab-${index}\"\n lang=${this.lang}\n key=${tab.title}\n ns=${this.ns}\n >\n </foxy-i18n>\n\n <div slot=\"panel-${index}\">${tab.content}</div>\n `\n )}\n </x-tabs>\n </div>\n `;\n };\n\n // #endregion\n\n render(): TemplateResult {\n const { hiddenSelector, lang, ns } = this;\n const isLoaded = this.in({ idle: 'snapshot' });\n const isBusy = this.in('busy');\n const tabs: Tab[] = [];\n\n if (!hiddenSelector.matches('transactions', true)) {\n tabs.push({ title: 'transaction_plural', content: this.__renderTransactions() });\n }\n\n if (!hiddenSelector.matches('subscriptions', true)) {\n tabs.push({ title: 'subscription_plural', content: this.__renderSubscriptions() });\n }\n\n return html`\n <div class=\"relative\" data-testid=\"wrapper\" aria-busy=${isBusy} aria-live=\"polite\">\n <div\n class=${classMap({\n 'font-lumo text-body text-m leading-m space-y-s': true,\n 'opacity-50': !isLoaded,\n })}\n >\n ${hiddenSelector.matches('header', true) ? '' : this.__renderHeader()}\n ${hiddenSelector.matches('default', true) ? '' : this.renderTemplateOrSlot()}\n ${hiddenSelector.matches('addresses', true) ? '' : this.__renderAddresses()}\n ${hiddenSelector.matches('payment-methods', true) ? '' : this.__renderPaymentMethods()}\n ${hiddenSelector.matches('attributes', true) ? '' : this.__renderAttributes()}\n ${tabs.length === 0 ? '' : this.__renderTabs(tabs)}\n </div>\n\n <div\n data-testid=\"spinner\"\n class=${classMap({\n 'transition duration-500 ease-in-out absolute inset-0 flex': true,\n 'opacity-0 pointer-events-none': isLoaded,\n })}\n >\n <foxy-spinner\n layout=\"vertical\"\n class=\"m-auto p-m bg-base shadow-xs rounded-t-l rounded-b-l\"\n state=${this.in('fail') ? 'error' : isBusy ? 'busy' : 'empty'}\n lang=${lang}\n ns=\"${ns} ${customElements.get('foxy-spinner')?.defaultNS ?? ''}\"\n >\n </foxy-spinner>\n </div>\n </div>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"Customer.js","sourceRoot":"","sources":["../../../../src/elements/public/Customer/Customer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Attributes, CustomerAddresses, Data, Settings, Tab, Templates } from './types';\nimport { CSSResultArray, TemplateResult, html, PropertyDeclarations } from 'lit-element';\nimport { ScopedElementsMap, ScopedElementsMixin } from '@open-wc/scoped-elements';\n\nimport { Data as Attribute } from '../AttributeCard/types';\nimport { ButtonElement } from '@vaadin/vaadin-button';\nimport { Column } from '../Table/types';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { Data as CustomerAddress } from '../AddressCard/types';\nimport { FormDialog } from '../FormDialog/FormDialog';\nimport { Group } from '../../private/index';\nimport { ItemRenderer } from '../CollectionPage/types';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { PageRenderer } from '../CollectionPages/types';\nimport { Skeleton } from '../../private/Skeleton/Skeleton';\nimport { Data as Subscriptions } from '../SubscriptionsTable/types';\nimport { SubscriptionsTable } from '../SubscriptionsTable/SubscriptionsTable';\nimport { Tabs } from '../../private/Tabs/Tabs';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { classMap } from '../../../utils/class-map';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { styles } from './styles';\n\nconst NS = 'customer';\nconst Base = ScopedElementsMixin(\n ConfigurableMixin(ThemeableMixin(TranslatableMixin(NucleonElement, NS)))\n);\n\n/**\n * All-in-one element for customer management.\n *\n * @slot header:before - **new in v1.4.0**\n * @slot header:after - **new in v1.4.0**\n * @slot header:actions:before - **new in v1.4.0**\n * @slot header:actions:after - **new in v1.4.0**\n * @slot header:actions:edit:before - **new in v1.4.0**\n * @slot header:actions:edit:after - **new in v1.4.0**\n *\n * @slot addresses:before - **new in v1.4.0**\n * @slot addresses:after - **new in v1.4.0**\n * @slot addresses:actions:before - **new in v1.4.0**\n * @slot addresses:actions:after - **new in v1.4.0**\n * @slot addresses:actions:create:before - **new in v1.4.0**\n * @slot addresses:actions:create:after - **new in v1.4.0**\n * @slot addresses:list:before - **new in v1.4.0**\n * @slot addresses:list:after - **new in v1.4.0**\n *\n * @slot payment-methods:before - **new in v1.4.0**\n * @slot payment-methods:after - **new in v1.4.0**\n * @slot payment-methods:list:before - **new in v1.4.0**\n * @slot payment-methods:list:after - **new in v1.4.0**\n *\n * @slot attributes:before - **new in v1.4.0**\n * @slot attributes:after - **new in v1.4.0**\n * @slot attributes:actions:before - **new in v1.4.0**\n * @slot attributes:actions:after - **new in v1.4.0**\n * @slot attributes:actions:create:before - **new in v1.4.0**\n * @slot attributes:actions:create:after - **new in v1.4.0**\n * @slot attributes:list:before - **new in v1.4.0**\n * @slot attributes:list:after - **new in v1.4.0**\n *\n * @slot transactions:before - **new in v1.4.0**\n * @slot transactions:after - **new in v1.4.0**\n *\n * @slot subscriptions:before - **new in v1.4.0**\n * @slot subscriptions:after - **new in v1.4.0**\n *\n * @element foxy-customer\n * @since 1.2.0\n */\nexport class Customer extends Base<Data> {\n static get scopedElements(): ScopedElementsMap {\n return {\n 'foxy-payment-method-card': customElements.get('foxy-payment-method-card'),\n 'foxy-transactions-table': customElements.get('foxy-transactions-table'),\n 'foxy-collection-pages': customElements.get('foxy-collection-pages'),\n 'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),\n 'foxy-attribute-card': customElements.get('foxy-attribute-card'),\n 'foxy-address-card': customElements.get('foxy-address-card'),\n 'foxy-form-dialog': customElements.get('foxy-form-dialog'),\n 'vaadin-button': customElements.get('vaadin-button'),\n 'foxy-spinner': customElements.get('foxy-spinner'),\n 'foxy-table': customElements.get('foxy-table'),\n 'x-skeleton': Skeleton,\n 'iron-icon': customElements.get('iron-icon'),\n 'foxy-i18n': customElements.get('foxy-i18n'),\n 'x-group': Group,\n 'x-tabs': Tabs,\n };\n }\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n settings: { type: Object },\n };\n }\n\n static get styles(): CSSResultArray {\n return [super.styles, styles];\n }\n\n templates: Templates = {};\n\n /** Customer Portal settings for use in Customer mode. */\n settings: Settings | null = null;\n\n // #region header\n\n private readonly __renderHeaderActionsEdit = () => {\n const { readonlySelector, disabledSelector, hiddenSelector } = this;\n\n const actionId = 'header:actions:edit';\n const formId = 'header:actions:edit:form';\n const dialogId = 'customer-dialog';\n\n const isLoaded = this.in({ idle: 'snapshot' });\n const isEditActionDisabled = !isLoaded || disabledSelector.matches(actionId, true);\n\n return html`\n ${this.renderTemplateOrSlot('header:actions:edit:before')}\n\n <foxy-form-dialog\n data-testid=\"header:actions:edit:form\"\n header=\"update\"\n parent=${this.parent}\n group=${this.group}\n href=${this.href}\n form=\"foxy-customer-form\"\n lang=${this.lang}\n ns=${this.ns}\n id=${dialogId}\n readonlycontrols=${readonlySelector.zoom(formId).toString()}\n disabledcontrols=${disabledSelector.zoom(formId).toString()}\n hiddencontrols=${hiddenSelector.zoom(formId).toString()}\n .templates=${this.getNestedTemplates('header:actions:edit:form')}\n .props=${{ '.settings': this.settings }}\n >\n </foxy-form-dialog>\n\n <vaadin-button\n data-testid=\"header:actions:edit\"\n aria-label=${this.t('update').toString()}\n class=\"px-xs rounded-full\"\n theme=\"icon\"\n ?disabled=${isEditActionDisabled}\n @click=${(evt: Event) => {\n const dialog = this.renderRoot.querySelector(`#${dialogId}`) as FormDialog;\n dialog.show(evt.currentTarget as HTMLElement);\n }}\n >\n <iron-icon icon=\"editor:mode-edit\"></iron-icon>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('header:actions:edit:after')}\n `;\n };\n\n private readonly __renderHeaderActions = () => {\n const hiddenSelector = this.hiddenSelector.zoom('header:actions');\n\n return html`\n <div class=\"flex\" data-testid=\"header:actions\">\n ${this.renderTemplateOrSlot('header:actions:before')}\n ${hiddenSelector.matches('edit', true) ? '' : this.__renderHeaderActionsEdit()}\n ${this.renderTemplateOrSlot('header:actions:after')}\n </div>\n `;\n };\n\n private readonly __renderHeader = () => {\n const variant = ifDefined(this.in('busy') ? undefined : 'static');\n\n return html`\n ${this.renderTemplateOrSlot('header:before')}\n\n <header\n class=\"flex items-center justify-between space-x-m pb-s border-b border-contrast-10\"\n data-testid=\"header\"\n >\n <h1 class=\"text-xxl font-medium truncate min-w-0 flex-1\">\n ${this.in({ idle: 'snapshot' })\n ? html`${this.data.first_name} ${this.data.last_name}`\n : html`<x-skeleton class=\"w-full\" variant=${variant}>&nbsp;</x-skeleton>`}\n </h1>\n\n ${this.hiddenSelector.matches('header:actions', true) ? '' : this.__renderHeaderActions()}\n </header>\n\n ${this.renderTemplateOrSlot('header:after')}\n `;\n };\n\n // #endregion\n\n // #region addresses\n\n private readonly __renderAddressesActionsCreate = () => {\n const { data, lang, ns } = this;\n\n const disabledSelector = this.disabledSelector.zoom('addresses:actions');\n const readonlySelector = this.readonlySelector.zoom('addresses:actions');\n const hiddenSelector = this.hiddenSelector.zoom('addresses:actions');\n\n const isLoaded = this.in({ idle: 'snapshot' });\n const isDisabled = !isLoaded || disabledSelector.matches('create', true);\n\n return html`\n ${this.renderTemplateOrSlot('addresses:actions:create:before')}\n\n <vaadin-button\n data-testid=\"addresses:actions:create\"\n aria-label=${this.t('create').toString()}\n class=\"px-xs rounded-full\"\n theme=\"small icon\"\n ?disabled=${isDisabled}\n @click=${(evt: Event) => {\n if (data === null) return;\n const button = evt.target as HTMLButtonElement;\n const dialog = button.firstElementChild as FormDialog;\n dialog.show(button);\n }}\n >\n <foxy-form-dialog\n readonlycontrols=${readonlySelector.zoom('create:form').toString()}\n disabledcontrols=${disabledSelector.zoom('create:form').toString()}\n hiddencontrols=${hiddenSelector.zoom('create:form').toString()}\n data-testid=\"addresses:actions:create:form\"\n parent=${data?._links['fx:customer_addresses'].href ?? ''}\n header=\"create\"\n group=${this.group}\n form=\"foxy-address-form\"\n lang=${lang}\n ns=${ns}\n id=\"address-dialog\"\n .templates=${this.getNestedTemplates('addresses:actions:create:form')}\n >\n </foxy-form-dialog>\n\n <iron-icon slot=\"suffix\" icon=\"icons:add\"></iron-icon>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('addresses:actions:create:after')}\n `;\n };\n\n private readonly __renderAddressesActions = () => {\n const hiddenSelector = this.hiddenSelector.zoom('addresses:actions');\n\n return html`\n <div data-testid=\"addresses:actions\">\n ${this.renderTemplateOrSlot('addresses:actions:before')}\n ${hiddenSelector.matches('create', true) ? '' : this.__renderAddressesActionsCreate()}\n ${this.renderTemplateOrSlot('addresses:actions:after')}\n </div>\n `;\n };\n\n private readonly __renderAddressesListCard: ItemRenderer<CustomerAddress> = ctx => {\n const handleClick = (evt: Event) => {\n if (ctx.data === null) return;\n\n const button = evt.target as HTMLButtonElement;\n const root = button.getRootNode() as Element | DocumentFragment;\n const form = root.querySelector('#addresses-list-form') as FormDialog;\n\n form.href = ctx.data._links.self.href;\n form.show(button);\n };\n\n const computedClass = classMap({\n 'snap-start text-left p-m rounded-t-l rounded-b-l flex-shrink-0': true,\n 'border border-contrast-10': true,\n 'hover-border-contrast-30 focus-outline-none focus-border-primary': ctx.data !== null,\n });\n\n const isReadonly = this.readonlySelector.matches('addresses:list:card', true);\n const isDisabled = this.disabledSelector.matches('addresses:list:card', true);\n\n return html`\n <button\n data-testclass=\"addresses:list:card\"\n class=${computedClass}\n ?disabled=${!ctx.data || isReadonly || isDisabled}\n @click=${handleClick}\n >\n <foxy-address-card\n hiddencontrols=${ctx.hiddenControls.toString()}\n parent=${ctx.parent}\n class=\"w-tile\"\n group=${ctx.group}\n lang=${ctx.lang}\n href=${ctx.href}\n ns=\"${ctx.ns} ${customElements.get('foxy-address-card')?.defaultNS ?? ''}\"\n .templates=${ctx.templates}\n >\n </foxy-address-card>\n </button>\n `;\n };\n\n private readonly __renderAddressesListPage: PageRenderer<CustomerAddresses> = ctx => {\n return ctx.html`\n <foxy-collection-page\n hiddencontrols=${ctx.hiddenControls.toString()}\n class=\"space-x-m flex\"\n group=${ctx.group}\n lang=${ctx.lang}\n href=${ctx.href}\n ns=${ctx.ns}\n .item=${this.__renderAddressesListCard}\n .templates=${ctx.templates}\n >\n </foxy-collection-page>\n `;\n };\n\n private readonly __renderAddressesList = () => {\n const formId = 'addresses:list:form';\n const cardId = 'addresses:list:card';\n\n return html`\n ${this.renderTemplateOrSlot('addresses:list:before')}\n\n <foxy-form-dialog\n readonlycontrols=${this.readonlySelector.zoom(formId).toString()}\n disabledcontrols=${this.disabledSelector.zoom(formId).toString()}\n hiddencontrols=${this.hiddenSelector.zoom(formId).toString()}\n data-testid=\"addresses:list:form\"\n parent=${this.data?._links['fx:customer_addresses'].href ?? ''}\n header=\"update\"\n group=${this.group}\n form=\"foxy-address-form\"\n lang=${this.lang}\n ns=${this.ns}\n id=\"addresses-list-form\"\n .templates=${this.getNestedTemplates(formId)}\n >\n </foxy-form-dialog>\n\n <foxy-collection-pages\n hiddencontrols=${this.hiddenSelector.zoom(cardId).toString()}\n data-testid=\"addresses:list\"\n first=${this.data?._links['fx:customer_addresses'].href ?? ''}\n class=\"snap-x-mandatory flex items-center space-x-m overflow-auto\"\n group=${this.group}\n lang=${this.lang}\n ns=${this.ns}\n .page=${this.__renderAddressesListPage}\n .templates=${this.getNestedTemplates(cardId)}\n >\n </foxy-collection-pages>\n\n ${this.renderTemplateOrSlot('addresses:list:after')}\n `;\n };\n\n private readonly __renderAddresses = () => {\n const { lang, ns } = this;\n const hiddenSelector = this.hiddenSelector.zoom('addresses');\n\n return html`\n ${this.renderTemplateOrSlot('addresses:before')}\n\n <section class=\"pt-m\" data-testid=\"addresses\">\n <header class=\"space-x-m flex items-center mb-s\">\n <h2 class=\"text-l font-medium\">\n <foxy-i18n ns=${ns} lang=${lang} key=\"address_plural\"></foxy-i18n>\n </h2>\n\n ${hiddenSelector.matches('actions', true) ? '' : this.__renderAddressesActions()}\n </header>\n\n ${hiddenSelector.matches('list', true) ? '' : this.__renderAddressesList()}\n </section>\n\n ${this.renderTemplateOrSlot('addresses:after')}\n `;\n };\n\n // #endregion\n\n // #region payment-methods\n\n private readonly __renderPaymentMethodsList = () => {\n const cardId = 'payment-methods:list:card';\n\n return html`\n <div data-testid=\"payment-methods:list\">\n ${this.renderTemplateOrSlot('payment-methods:list:before')}\n\n <foxy-payment-method-card\n readonlycontrols=${this.readonlySelector.zoom(cardId).toString()}\n disabledcontrols=${this.disabledSelector.zoom(cardId).toString()}\n hiddencontrols=${this.hiddenSelector.zoom(cardId).toString()}\n data-testid=${cardId}\n group=${this.group}\n class=\"w-payment-method-card border-radius-overflow-fix rounded-t-l rounded-b-l overflow-hidden\"\n href=${this.data?._links['fx:default_payment_method'].href ?? ''}\n lang=${this.lang}\n ns=\"${this.ns} ${customElements.get('foxy-payment-method-card')?.defaultNS ?? ''}\"\n .templates=${this.getNestedTemplates(cardId)}\n >\n </foxy-payment-method-card>\n\n ${this.renderTemplateOrSlot('payment-methods:list:after')}\n </div>\n `;\n };\n\n private readonly __renderPaymentMethods = () => {\n const hiddenSelector = this.hiddenSelector.zoom('payment-methods');\n\n return html`\n ${this.renderTemplateOrSlot('payment-methods:before')}\n\n <div class=\"pt-m\" data-testid=\"payment-methods\">\n <h2 class=\"text-l font-medium mb-s\">\n <foxy-i18n\n data-testclass=\"i18n\"\n lang=${this.lang}\n key=\"payment_method_plural\"\n ns=${this.ns}\n >\n </foxy-i18n>\n </h2>\n\n ${hiddenSelector.matches('list', true) ? '' : this.__renderPaymentMethodsList()}\n </div>\n\n ${this.renderTemplateOrSlot('payment-methods:after')}\n `;\n };\n\n // #endregion\n\n // #region attributes\n\n private readonly __renderAttributesActionsCreate = () => {\n const { data, lang, ns } = this;\n\n const disabledSelector = this.disabledSelector.zoom('attributes:actions');\n const readonlySelector = this.readonlySelector.zoom('attributes:actions');\n const hiddenSelector = this.hiddenSelector.zoom('attributes:actions');\n\n const isLoaded = this.in({ idle: 'snapshot' });\n const isDisabled = !isLoaded || disabledSelector.matches('create', true);\n\n return html`\n ${this.renderTemplateOrSlot('attributes:actions:create:before')}\n\n <vaadin-button\n data-testid=\"attributes:actions:create\"\n aria-label=${this.t('create').toString()}\n class=\"px-xs rounded-full\"\n theme=\"small icon\"\n ?disabled=${isDisabled}\n @click=${(evt: Event) => {\n if (data === null) return;\n const button = evt.target as HTMLButtonElement;\n const dialog = button.firstElementChild as FormDialog;\n dialog.show(button);\n }}\n >\n <foxy-form-dialog\n readonlycontrols=${readonlySelector.zoom('create:form').toString()}\n disabledcontrols=${disabledSelector.zoom('create:form').toString()}\n hiddencontrols=${hiddenSelector.zoom('create:form').toString()}\n data-testid=\"attributes:actions:create:form\"\n parent=${data?._links['fx:attributes'].href ?? ''}\n header=\"create\"\n group=${this.group}\n form=\"foxy-attribute-form\"\n lang=${lang}\n ns=${ns}\n .templates=${this.getNestedTemplates('attributes:actions:create:form')}\n >\n </foxy-form-dialog>\n\n <iron-icon slot=\"suffix\" icon=\"icons:add\"></iron-icon>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('attributes:actions:create:after')}\n `;\n };\n\n private readonly __renderAttributesActions = () => {\n const hiddenSelector = this.hiddenSelector.zoom('attributes:actions');\n\n return html`\n <div data-testid=\"attributes:actions\">\n ${this.renderTemplateOrSlot('attributes:actions:before')}\n ${hiddenSelector.matches('create', true) ? '' : this.__renderAttributesActionsCreate()}\n ${this.renderTemplateOrSlot('attributes:actions:after')}\n </div>\n `;\n };\n\n private readonly __renderAttributesListCard: ItemRenderer<Attribute> = ctx => {\n const handleClick = (evt: Event) => {\n if (ctx.data === null) return;\n\n const button = evt.target as HTMLButtonElement;\n const root = button.getRootNode() as Element | DocumentFragment;\n const form = root.querySelector('#attributes-list-form') as FormDialog;\n\n form.href = ctx.data._links.self.href;\n form.show(button);\n };\n\n const computedClass = classMap({\n 'snap-start text-left p-m rounded-t-l rounded-b-l flex-shrink-0 border border-contrast-10':\n true,\n 'hover-border-contrast-30 focus-outline-none focus-border-primary': ctx.data !== null,\n });\n\n return ctx.html`\n <button \n data-testclass=\"attributes:list:card\"\n class=${computedClass}\n ?disabled=${ctx.data === null}\n @click=${handleClick}\n >\n <foxy-attribute-card\n hiddencontrols=${ctx.hiddenControls.toString()}\n parent=${ctx.parent}\n group=${ctx.group}\n class=\"w-tile\"\n lang=${ctx.lang}\n href=${ctx.href}\n ns=\"${ctx.ns} ${customElements.get('foxy-attribute-card')?.defaultNS ?? ''}\"\n .templates=${ctx.templates}\n >\n </foxy-attribute-card>\n </button>\n `;\n };\n\n private readonly __renderAttributesListPage: PageRenderer<Attributes> = ctx => {\n return html`\n <foxy-collection-page\n hiddencontrols=${ctx.hiddenControls.toString()}\n class=\"space-x-m flex\"\n group=${ctx.group}\n lang=${ctx.lang}\n href=${ctx.href}\n ns=${ctx.ns}\n .item=${this.__renderAttributesListCard}\n .templates=${ctx.templates}\n >\n </foxy-collection-page>\n `;\n };\n\n private readonly __renderAttributesList = () => {\n const formId = 'attributes:list:form';\n const cardId = 'attributes:list:card';\n\n return html`\n ${this.renderTemplateOrSlot('attributes:list:before')}\n\n <foxy-form-dialog\n readonlycontrols=${this.readonlySelector.zoom(formId).toString()}\n disabledcontrols=${this.disabledSelector.zoom(formId).toString()}\n hiddencontrols=${this.hiddenSelector.zoom(formId).toString()}\n data-testclass=\"i18n\"\n data-testid=\"attributes:list:form\"\n parent=${this.data?._links['fx:attributes'].href ?? ''}\n header=\"update\"\n group=${this.group}\n form=\"foxy-attribute-form\"\n lang=${this.lang}\n ns=${this.ns}\n id=\"attributes-list-form\"\n .templates=${this.getNestedTemplates(formId)}\n >\n </foxy-form-dialog>\n\n <foxy-collection-pages\n hiddencontrols=${this.hiddenControls.zoom(cardId).toString()}\n data-testid=\"attributes:list\"\n first=${this.data?._links['fx:attributes'].href ?? ''}\n class=\"snap-x-mandatory flex items-center space-x-m overflow-auto\"\n group=${this.group}\n lang=${this.lang}\n ns=${this.ns}\n .page=${this.__renderAttributesListPage}\n .templates=${this.getNestedTemplates(cardId)}\n >\n </foxy-collection-pages>\n\n ${this.renderTemplateOrSlot('attributes:list:after')}\n `;\n };\n\n private readonly __renderAttributes = () => {\n const { lang, ns } = this;\n const hiddenSelector = this.hiddenSelector.zoom('attributes');\n\n return html`\n ${this.renderTemplateOrSlot('attributes:before')}\n\n <section class=\"pt-m\" data-testid=\"attributes\">\n <header class=\"space-x-m flex items-center mb-s\">\n <h2 class=\"text-l font-medium\">\n <foxy-i18n ns=${ns} lang=${lang} key=\"attribute_plural\"></foxy-i18n>\n </h2>\n\n ${hiddenSelector.matches('actions', true) ? '' : this.__renderAttributesActions()}\n </header>\n\n ${hiddenSelector.matches('list', true) ? '' : this.__renderAttributesList()}\n </section>\n\n ${this.renderTemplateOrSlot('attributes:after')}\n `;\n };\n\n // #endregion\n\n // #region transactions\n\n private readonly __renderTransactions = () => {\n let transactionsLink = '';\n\n if (this.in({ idle: 'snapshot' })) {\n const transactionsURL = new URL(this.data._links['fx:transactions'].href);\n transactionsURL.searchParams.set('zoom', 'items');\n transactionsLink = transactionsURL.toString();\n }\n\n return html`\n ${this.renderTemplateOrSlot('transactions:before')}\n\n <x-group frame>\n <foxy-collection-pages\n data-testid=\"transactions\"\n spinner=\"foxy-spinner\"\n first=${transactionsLink}\n class=\"divide-y divide-contrast-10 block mx-m\"\n group=${this.group}\n page=\"foxy-transactions-table\"\n lang=${this.lang}\n ns=${this.ns}\n .templates=${this.getNestedTemplates('transactions:table')}\n >\n </foxy-collection-pages>\n </x-group>\n\n ${this.renderTemplateOrSlot('transactions:after')}\n `;\n };\n\n // #endregion\n\n // #region subscriptions\n\n private readonly __subscriptionsTableColumns: Column<Subscriptions>[] = [\n SubscriptionsTable.priceColumn,\n SubscriptionsTable.summaryColumn,\n SubscriptionsTable.statusColumn,\n {\n cell: ({ html, lang, data }) => html`\n <vaadin-button\n data-testclass=\"edit\"\n theme=\"small tertiary-inline\"\n @click=${(evt: Event) => {\n const link = new URL(data._links.self.href);\n const form = this.renderRoot.querySelector('#subscriptions-form') as FormDialog;\n const button = evt.target as ButtonElement;\n\n link.searchParams.set('zoom', 'transaction_template:items');\n form.href = link.toString();\n form.show(button);\n }}\n >\n <foxy-i18n class=\"text-m\" lang=${lang} key=\"update\" ns=${this.ns}></foxy-i18n>\n </vaadin-button>\n `,\n },\n ];\n\n private readonly __renderSubscriptionsPage: PageRenderer<Subscriptions> = ({ html, ...ctx }) => {\n return html`\n <foxy-table\n data-testclass=\"subscriptions:pages:table\"\n group=${ctx.group}\n href=${ctx.href}\n lang=${ctx.lang}\n ns=\"${ctx.ns} subscriptions-table\"\n .columns=${this.__subscriptionsTableColumns}\n .templates=${ctx.templates}\n >\n </foxy-table>\n `;\n };\n\n private readonly __renderSubscriptions = () => {\n const formId = 'subscriptions:form';\n let subscriptionsLink = '';\n\n if (this.in({ idle: 'snapshot' })) {\n const subscriptionsURL = new URL(this.data._links['fx:subscriptions'].href);\n subscriptionsURL.searchParams.set('zoom', 'transaction_template:items');\n subscriptionsLink = subscriptionsURL.toString();\n }\n\n return html`\n <div data-testid=\"subscriptions\">\n ${this.renderTemplateOrSlot('subscriptions:before')}\n\n <foxy-form-dialog\n readonlycontrols=${this.readonlySelector.zoom(formId).toString()}\n disabledcontrols=${this.disabledSelector.zoom(formId).toString()}\n hiddencontrols=${this.hiddenSelector.zoom(formId).toString()}\n data-testid=${formId}\n header=\"update\"\n group=${this.group}\n form=\"foxy-subscription-form\"\n lang=${this.lang}\n ns=${this.ns}\n id=\"subscriptions-form\"\n .templates=${this.getNestedTemplates(formId)}\n .props=${{ '.settings': this.settings }}\n >\n </foxy-form-dialog>\n\n <x-group frame>\n <foxy-collection-pages\n data-testid=\"subscriptions:pages\"\n spinner=\"foxy-spinner\"\n first=${subscriptionsLink}\n class=\"divide-y divide-contrast-10 block mx-m\"\n group=${this.group}\n lang=${this.lang}\n ns=${this.ns}\n .page=${this.__renderSubscriptionsPage}\n .templates=${this.getNestedTemplates('subscriptions:table')}\n >\n </foxy-collection-pages>\n </x-group>\n\n ${this.renderTemplateOrSlot('subscriptions:after')}\n </div>\n `;\n };\n\n // #endregion\n\n // #region tabs\n\n private readonly __renderTabs = (tabs: Tab[]) => {\n return html`\n <div class=\"pt-m\">\n <x-tabs size=${tabs.length} ?disabled=${!this.in({ idle: 'snapshot' })}>\n ${tabs.map(\n (tab, index) => html`\n <foxy-i18n\n data-testclass=\"i18n\"\n slot=\"tab-${index}\"\n lang=${this.lang}\n key=${tab.title}\n ns=${this.ns}\n >\n </foxy-i18n>\n\n <div slot=\"panel-${index}\">${tab.content}</div>\n `\n )}\n </x-tabs>\n </div>\n `;\n };\n\n // #endregion\n\n render(): TemplateResult {\n const { hiddenSelector, lang, ns } = this;\n const isLoaded = this.in({ idle: 'snapshot' });\n const isBusy = this.in('busy');\n const tabs: Tab[] = [];\n\n if (!hiddenSelector.matches('transactions', true)) {\n tabs.push({ title: 'transaction_plural', content: this.__renderTransactions() });\n }\n\n if (!hiddenSelector.matches('subscriptions', true)) {\n tabs.push({ title: 'subscription_plural', content: this.__renderSubscriptions() });\n }\n\n return html`\n <div class=\"relative\" data-testid=\"wrapper\" aria-busy=${isBusy} aria-live=\"polite\">\n <div\n class=${classMap({\n 'font-lumo text-body text-m leading-m space-y-s': true,\n 'opacity-50': !isLoaded,\n })}\n >\n ${hiddenSelector.matches('header', true) ? '' : this.__renderHeader()}\n ${hiddenSelector.matches('default', true) ? '' : this.renderTemplateOrSlot()}\n ${hiddenSelector.matches('addresses', true) ? '' : this.__renderAddresses()}\n ${hiddenSelector.matches('payment-methods', true) ? '' : this.__renderPaymentMethods()}\n ${hiddenSelector.matches('attributes', true) ? '' : this.__renderAttributes()}\n ${tabs.length === 0 ? '' : this.__renderTabs(tabs)}\n </div>\n\n <div\n data-testid=\"spinner\"\n class=${classMap({\n 'transition duration-500 ease-in-out absolute inset-0 flex': true,\n 'opacity-0 pointer-events-none': isLoaded,\n })}\n >\n <foxy-spinner\n layout=\"vertical\"\n class=\"m-auto p-m bg-base shadow-xs rounded-t-l rounded-b-l\"\n state=${this.in('fail') ? 'error' : isBusy ? 'busy' : 'empty'}\n lang=${lang}\n ns=\"${ns} ${customElements.get('foxy-spinner')?.defaultNS ?? ''}\"\n >\n </foxy-spinner>\n </div>\n </div>\n `;\n }\n}\n"]}
@@ -14,6 +14,7 @@ import { TemplateResult } from 'lit-html';
14
14
  import { Templates as TransactionsTableTemplates } from '../TransactionsTable/types';
15
15
  export declare type CustomerAddresses = Resource<Rels.CustomerAddresses>;
16
16
  export declare type Attributes = Resource<Rels.Attributes>;
17
+ export declare type Settings = Resource<Rels.CustomerPortalSettings>;
17
18
  export declare type Data = Resource<Graph>;
18
19
  export declare type Tab = {
19
20
  title: string;