@foxy.io/elements 1.13.0-beta.3 → 1.14.0-beta.11

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 (176) hide show
  1. package/README.md +1 -1
  2. package/dist/cdn/foxy-access-recovery-form.js +1 -1
  3. package/dist/cdn/foxy-address-card.js +1 -1
  4. package/dist/cdn/foxy-address-form.js +1 -1
  5. package/dist/cdn/foxy-applied-tax-card.js +1 -1
  6. package/dist/cdn/foxy-attribute-card.js +1 -1
  7. package/dist/cdn/foxy-attribute-form.js +1 -1
  8. package/dist/cdn/foxy-cancellation-form.js +1 -1
  9. package/dist/cdn/foxy-collection-page.js +1 -1
  10. package/dist/cdn/foxy-collection-pages.js +1 -1
  11. package/dist/cdn/foxy-custom-field-card.js +1 -1
  12. package/dist/cdn/foxy-custom-field-form.js +1 -1
  13. package/dist/cdn/foxy-customer-api.js +1 -1
  14. package/dist/cdn/foxy-customer-card.js +1 -1
  15. package/dist/cdn/foxy-customer-form.js +1 -1
  16. package/dist/cdn/foxy-customer-portal-settings.js +18 -18
  17. package/dist/cdn/foxy-customer-portal.js +18 -15
  18. package/dist/cdn/foxy-customer.js +4 -4
  19. package/dist/cdn/foxy-customers-table.js +1 -1
  20. package/dist/cdn/foxy-discount-card.js +1 -1
  21. package/dist/cdn/foxy-donation.js +1 -1
  22. package/dist/cdn/foxy-email-template-form.js +1 -0
  23. package/dist/cdn/foxy-error-entry-card.js +1 -1
  24. package/dist/cdn/foxy-form-dialog.js +1 -1
  25. package/dist/cdn/foxy-i18n.js +1 -1
  26. package/dist/cdn/foxy-items-form.js +1 -1
  27. package/dist/cdn/foxy-nucleon-element.js +1 -1
  28. package/dist/cdn/foxy-payment-card.js +1 -1
  29. package/dist/cdn/foxy-payment-method-card.js +1 -1
  30. package/dist/cdn/foxy-query-builder.js +1 -1
  31. package/dist/cdn/foxy-sign-in-form.js +1 -1
  32. package/dist/cdn/foxy-spinner.js +2 -2
  33. package/dist/cdn/foxy-subscription-card.js +1 -1
  34. package/dist/cdn/foxy-subscription-form.js +26 -9
  35. package/dist/cdn/foxy-subscriptions-table.js +1 -1
  36. package/dist/cdn/foxy-table.js +1 -1
  37. package/dist/cdn/foxy-tax-card.js +1 -1
  38. package/dist/cdn/foxy-tax-form.js +1 -1
  39. package/dist/cdn/foxy-template-config-form.js +1 -0
  40. package/dist/cdn/foxy-template-form.js +1 -0
  41. package/dist/cdn/foxy-transaction-card.js +1 -1
  42. package/dist/cdn/foxy-transactions-table.js +1 -1
  43. package/dist/cdn/foxy-user-form.js +1 -1
  44. package/dist/cdn/foxy-users-table.js +1 -1
  45. package/dist/cdn/{shared-d4dad105.js → shared-00563cb0.js} +1 -1
  46. package/dist/cdn/{shared-b0b1d248.js → shared-05956f55.js} +1 -1
  47. package/dist/cdn/{shared-91a9e922.js → shared-05b473a7.js} +4 -4
  48. package/dist/cdn/shared-07134f93.js +14 -0
  49. package/dist/cdn/shared-0ced76a0.js +358 -0
  50. package/dist/cdn/{shared-a99dea97.js → shared-1177fd2a.js} +1 -1
  51. package/dist/cdn/{shared-f4119f12.js → shared-16f72e27.js} +1 -1
  52. package/dist/cdn/shared-1761daef.js +15 -0
  53. package/dist/cdn/{shared-5fedf5e4.js → shared-200f613b.js} +2 -2
  54. package/dist/cdn/{shared-4059f633.js → shared-218ba06e.js} +1 -1
  55. package/dist/cdn/{shared-d9159fe1.js → shared-2b685624.js} +1 -1
  56. package/dist/cdn/{shared-e9920617.js → shared-34b2c1e2.js} +1 -1
  57. package/dist/cdn/shared-4168c6cd.js +1 -0
  58. package/dist/cdn/{shared-cf248335.js → shared-44cfc617.js} +1 -1
  59. package/dist/cdn/{shared-45d647e4.js → shared-46ee137f.js} +1 -1
  60. package/dist/cdn/{shared-f0199313.js → shared-593f7e2c.js} +1 -1
  61. package/dist/cdn/shared-59e44f29.js +1 -0
  62. package/dist/cdn/{shared-67157a25.js → shared-5d1314d7.js} +1 -1
  63. package/dist/cdn/{shared-cd700eac.js → shared-60126eee.js} +1 -1
  64. package/dist/cdn/{shared-17968c53.js → shared-63eaded9.js} +3 -3
  65. package/dist/cdn/shared-6b7602c7.js +1 -0
  66. package/dist/cdn/{shared-98ee7fad.js → shared-6d45a07b.js} +1 -1
  67. package/dist/cdn/shared-70631d0a.js +1 -0
  68. package/dist/cdn/{shared-f2cf6cfb.js → shared-775b37f9.js} +1 -1
  69. package/dist/cdn/shared-8730c141.js +314 -0
  70. package/dist/cdn/{shared-84fa75d9.js → shared-9221e6b2.js} +1 -1
  71. package/dist/cdn/{shared-f47647ac.js → shared-93f23978.js} +1 -1
  72. package/dist/cdn/{shared-2860a3d3.js → shared-94b0ae99.js} +2 -2
  73. package/dist/cdn/shared-a46edf4b.js +1 -0
  74. package/dist/cdn/shared-a94b7271.js +1 -0
  75. package/dist/cdn/{shared-54702b33.js → shared-b0f0e8b5.js} +1 -1
  76. package/dist/cdn/{shared-ed4ed7a5.js → shared-b710881a.js} +2 -2
  77. package/dist/cdn/{shared-3ae39e52.js → shared-bb824ab4.js} +3 -3
  78. package/dist/cdn/{shared-036a8b21.js → shared-bda600d6.js} +1 -1
  79. package/dist/cdn/{shared-b77179fd.js → shared-d3167239.js} +1 -1
  80. package/dist/cdn/shared-df573cea.js +12 -0
  81. package/dist/cdn/shared-e36452b9.js +1 -0
  82. package/dist/cdn/{shared-e5de8675.js → shared-e7f8ffe9.js} +1 -1
  83. package/dist/cdn/{shared-54c485d2.js → shared-ec861f31.js} +21 -21
  84. package/dist/cdn/{shared-e0248713.js → shared-f0a83bd6.js} +1 -1
  85. package/dist/cdn/shared-f968379d.js +264 -0
  86. package/dist/cdn/{shared-145cc9eb.js → shared-fbeb1de3.js} +1 -1
  87. package/dist/cdn/{shared-747b0842.js → shared-ff79f3f9.js} +1 -1
  88. package/dist/cdn/translations/shared/en.json +94 -1
  89. package/dist/elements/private/Checkbox/Checkbox.d.ts +3 -1
  90. package/dist/elements/private/Checkbox/Checkbox.js +45 -12
  91. package/dist/elements/private/Checkbox/Checkbox.js.map +1 -1
  92. package/dist/elements/private/Choice/Choice.js +9 -9
  93. package/dist/elements/private/Choice/Choice.js.map +1 -1
  94. package/dist/elements/private/Group/Group.js +1 -1
  95. package/dist/elements/private/Group/Group.js.map +1 -1
  96. package/dist/elements/private/I18N/I18N.js +1 -1
  97. package/dist/elements/private/I18N/I18N.js.map +1 -1
  98. package/dist/elements/public/AddressForm/AddressForm.js +8 -4
  99. package/dist/elements/public/AddressForm/AddressForm.js.map +1 -1
  100. package/dist/elements/public/AttributeForm/AttributeForm.js +8 -4
  101. package/dist/elements/public/AttributeForm/AttributeForm.js.map +1 -1
  102. package/dist/elements/public/CustomFieldForm/CustomFieldForm.js +8 -4
  103. package/dist/elements/public/CustomFieldForm/CustomFieldForm.js.map +1 -1
  104. package/dist/elements/public/CustomerForm/CustomerForm.js +8 -4
  105. package/dist/elements/public/CustomerForm/CustomerForm.js.map +1 -1
  106. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLink.d.ts +1 -0
  107. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLink.js +17 -8
  108. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLink.js.map +1 -1
  109. package/dist/elements/public/CustomerPortal/InternalCustomerPortalSubscriptions.js +11 -3
  110. package/dist/elements/public/CustomerPortal/InternalCustomerPortalSubscriptions.js.map +1 -1
  111. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.d.ts +46 -0
  112. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.js +350 -0
  113. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.js.map +1 -0
  114. package/dist/elements/public/EmailTemplateForm/index.d.ts +9 -0
  115. package/dist/elements/public/EmailTemplateForm/index.js +11 -0
  116. package/dist/elements/public/EmailTemplateForm/index.js.map +1 -0
  117. package/dist/elements/public/EmailTemplateForm/types.d.ts +17 -0
  118. package/dist/elements/public/EmailTemplateForm/types.js +2 -0
  119. package/dist/elements/public/EmailTemplateForm/types.js.map +1 -0
  120. package/dist/elements/public/ItemsForm/ItemsForm.js +2 -2
  121. package/dist/elements/public/ItemsForm/ItemsForm.js.map +1 -1
  122. package/dist/elements/public/ItemsForm/private/Picture.d.ts +1 -0
  123. package/dist/elements/public/ItemsForm/private/Picture.js +2 -0
  124. package/dist/elements/public/ItemsForm/private/Picture.js.map +1 -1
  125. package/dist/elements/public/NucleonElement/serveFromCache.js +1 -0
  126. package/dist/elements/public/NucleonElement/serveFromCache.js.map +1 -1
  127. package/dist/elements/public/SubscriptionForm/SubscriptionForm.js +12 -4
  128. package/dist/elements/public/SubscriptionForm/SubscriptionForm.js.map +1 -1
  129. package/dist/elements/public/TaxForm/TaxForm.js +8 -4
  130. package/dist/elements/public/TaxForm/TaxForm.js.map +1 -1
  131. package/dist/elements/public/TemplateConfigForm/CountriesList.d.ts +23 -0
  132. package/dist/elements/public/TemplateConfigForm/CountriesList.js +138 -0
  133. package/dist/elements/public/TemplateConfigForm/CountriesList.js.map +1 -0
  134. package/dist/elements/public/TemplateConfigForm/CountryCard.d.ts +22 -0
  135. package/dist/elements/public/TemplateConfigForm/CountryCard.js +157 -0
  136. package/dist/elements/public/TemplateConfigForm/CountryCard.js.map +1 -0
  137. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.d.ts +88 -0
  138. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js +1343 -0
  139. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js.map +1 -0
  140. package/dist/elements/public/TemplateConfigForm/defaults.d.ts +2 -0
  141. package/dist/elements/public/TemplateConfigForm/defaults.js +95 -0
  142. package/dist/elements/public/TemplateConfigForm/defaults.js.map +1 -0
  143. package/dist/elements/public/TemplateConfigForm/index.d.ts +9 -0
  144. package/dist/elements/public/TemplateConfigForm/index.js +11 -0
  145. package/dist/elements/public/TemplateConfigForm/index.js.map +1 -0
  146. package/dist/elements/public/TemplateConfigForm/types.d.ts +150 -0
  147. package/dist/elements/public/TemplateConfigForm/types.js +2 -0
  148. package/dist/elements/public/TemplateConfigForm/types.js.map +1 -0
  149. package/dist/elements/public/TemplateForm/TemplateForm.d.ts +45 -0
  150. package/dist/elements/public/TemplateForm/TemplateForm.js +343 -0
  151. package/dist/elements/public/TemplateForm/TemplateForm.js.map +1 -0
  152. package/dist/elements/public/TemplateForm/index.d.ts +9 -0
  153. package/dist/elements/public/TemplateForm/index.js +11 -0
  154. package/dist/elements/public/TemplateForm/index.js.map +1 -0
  155. package/dist/elements/public/TemplateForm/types.d.ts +17 -0
  156. package/dist/elements/public/TemplateForm/types.js +2 -0
  157. package/dist/elements/public/TemplateForm/types.js.map +1 -0
  158. package/dist/elements/public/index.d.ts +3 -0
  159. package/dist/elements/public/index.defined.d.ts +3 -0
  160. package/dist/elements/public/index.defined.js +3 -0
  161. package/dist/elements/public/index.defined.js.map +1 -1
  162. package/dist/elements/public/index.js +3 -0
  163. package/dist/elements/public/index.js.map +1 -1
  164. package/dist/mixins/themeable.js +143 -24
  165. package/dist/mixins/themeable.js.map +1 -1
  166. package/package.json +2 -7
  167. package/dist/cdn/shared-296637c5.js +0 -1
  168. package/dist/cdn/shared-4a990126.js +0 -1
  169. package/dist/cdn/shared-50744508.js +0 -15
  170. package/dist/cdn/shared-b98f88c9.js +0 -369
  171. package/dist/cdn/shared-bf09e011.js +0 -572
  172. package/dist/cdn/shared-c0161e6a.js +0 -1
  173. package/dist/cdn/shared-c1e0e11f.js +0 -1
  174. package/dist/cdn/shared-dbcffd8e.js +0 -1
  175. package/dist/cdn/shared-e21a2aac.js +0 -1
  176. package/dist/cdn/shared-e55b6bb7.js +0 -1
@@ -0,0 +1,1343 @@
1
+ import * as logos from "../PaymentMethodCard/logos.js";
2
+ import { ChoiceChangeEvent } from "../../private/events.js";
3
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
4
+ import { html } from 'lit-html';
5
+ import { Checkbox } from "../../private/Checkbox/Checkbox.js";
6
+ import { Choice } from "../../private/Choice/Choice.js";
7
+ import { ConfigurableMixin } from "../../../mixins/configurable.js";
8
+ import { CountriesList } from "./CountriesList.js";
9
+ import { Group } from "../../private/Group/Group.js";
10
+ import { NucleonElement } from "../NucleonElement/NucleonElement.js";
11
+ import { ResponsiveMixin } from "../../../mixins/responsive.js";
12
+ import { ThemeableMixin } from "../../../mixins/themeable.js";
13
+ import { TranslatableMixin } from "../../../mixins/translatable.js";
14
+ import { classMap } from "../../../utils/class-map.js";
15
+ import { getDefaultJSON } from "./defaults.js";
16
+ import { live } from 'lit-html/directives/live';
17
+ const NS = 'template-config-form';
18
+ const Base = ScopedElementsMixin(ResponsiveMixin(ConfigurableMixin(ThemeableMixin(TranslatableMixin(NucleonElement, NS)))));
19
+ /**
20
+ * Form element for creating or editing template configs (`fx:template_config`).
21
+ *
22
+ * @slot cart-type:before
23
+ * @slot cart-type:after
24
+ *
25
+ * @slot foxycomplete:before
26
+ * @slot foxycomplete:after
27
+ *
28
+ * @slot locations:before
29
+ * @slot locations:after
30
+ *
31
+ * @slot hidden-fields:before
32
+ * @slot hidden-fields:after
33
+ *
34
+ * @slot cards:before
35
+ * @slot cards:after
36
+ *
37
+ * @slot checkout-type:before
38
+ * @slot checkout-type:after
39
+ *
40
+ * @slot consent:before
41
+ * @slot consent:after
42
+ *
43
+ * @slot fields:before
44
+ * @slot fields:after
45
+ *
46
+ * @slot google-analytics:before
47
+ * @slot google-analytics:after
48
+ *
49
+ * @slot segment-io:before
50
+ * @slot segment-io:after
51
+ *
52
+ * @slot troubleshooting:before
53
+ * @slot troubleshooting:after
54
+ *
55
+ * @slot custom-config:before
56
+ * @slot custom-config:after
57
+ *
58
+ * @slot header:before
59
+ * @slot header:after
60
+ *
61
+ * @slot custom-fields:before
62
+ * @slot custom-fields:after
63
+ *
64
+ * @slot footer:before
65
+ * @slot footer:after
66
+ *
67
+ * @element foxy-template-config-form
68
+ * @since 1.14.0
69
+ */
70
+ export class TemplateConfigForm extends Base {
71
+ constructor() {
72
+ super(...arguments);
73
+ this.templates = {};
74
+ /** URI of the `fx:countries` hAPI resource. */
75
+ this.countries = '';
76
+ /** URI of the `fx:regions` hAPI resource. */
77
+ this.regions = '';
78
+ this.__addHiddenFieldInputValue = '';
79
+ }
80
+ static get scopedElements() {
81
+ return {
82
+ 'vaadin-text-field': customElements.get('vaadin-text-field'),
83
+ 'vaadin-text-area': customElements.get('vaadin-text-area'),
84
+ 'iron-icon': customElements.get('iron-icon'),
85
+ 'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),
86
+ 'foxy-spinner': customElements.get('foxy-spinner'),
87
+ 'foxy-i18n': customElements.get('foxy-i18n'),
88
+ 'x-countries-list': CountriesList,
89
+ 'x-checkbox': Checkbox,
90
+ 'x-choice': Choice,
91
+ 'x-group': Group,
92
+ };
93
+ }
94
+ static get properties() {
95
+ return {
96
+ ...super.properties,
97
+ __addHiddenFieldInputValue: { attribute: false },
98
+ countries: { type: String },
99
+ regions: { type: String },
100
+ };
101
+ }
102
+ render() {
103
+ var _a, _b;
104
+ const hidden = this.hiddenSelector;
105
+ const json = this.form.json ? JSON.parse(this.form.json) : getDefaultJSON();
106
+ return html `
107
+ <div class="relative" aria-busy=${this.in('busy')} aria-live="polite">
108
+ <div
109
+ class=${classMap({
110
+ 'space-y-l transition-opacity': true,
111
+ 'opacity-50': !this.in('idle'),
112
+ })}
113
+ >
114
+ ${hidden.matches('cart-type', true) ? '' : this.__renderCartType(json)}
115
+ ${hidden.matches('foxycomplete', true) ? '' : this.__renderFoxycomplete(json)}
116
+ ${hidden.matches('locations', true) ? '' : this.__renderLocations(json)}
117
+ ${hidden.matches('hidden-fields', true) ? '' : this.__renderHiddenFields(json)}
118
+ ${hidden.matches('cards', true) ? '' : this.__renderCards(json)}
119
+ ${hidden.matches('checkout-type', true) ? '' : this.__renderCheckoutType(json)}
120
+ ${hidden.matches('consent', true) ? '' : this.__renderConsent(json)}
121
+ ${hidden.matches('fields', true) ? '' : this.__renderFields(json)}
122
+ ${hidden.matches('google-analytics', true) ? '' : this.__renderGoogleAnalytics(json)}
123
+ ${hidden.matches('segment-io', true) ? '' : this.__renderSegmentIo(json)}
124
+ ${hidden.matches('troubleshooting', true) ? '' : this.__renderTroubleshooting(json)}
125
+ ${hidden.matches('custom-config', true) ? '' : this.__renderCustomConfig(json)}
126
+ ${hidden.matches('header', true) ? '' : this.__renderHeader(json)}
127
+ ${hidden.matches('custom-fields', true) ? '' : this.__renderCustomFields(json)}
128
+ ${hidden.matches('footer', true) ? '' : this.__renderFooter(json)}
129
+ </div>
130
+
131
+ <div
132
+ class=${classMap({
133
+ 'transition duration-500 ease-in-out absolute inset-0 flex': true,
134
+ 'opacity-0 pointer-events-none': this.in('idle'),
135
+ })}
136
+ >
137
+ <foxy-spinner
138
+ layout="vertical"
139
+ class="m-auto p-m bg-base shadow-xs rounded-t-l rounded-b-l"
140
+ state=${this.in('fail') ? 'error' : 'busy'}
141
+ lang=${this.lang}
142
+ ns="${this.ns} ${(_b = (_a = customElements.get('foxy-spinner')) === null || _a === void 0 ? void 0 : _a.defaultNS) !== null && _b !== void 0 ? _b : ''}"
143
+ >
144
+ </foxy-spinner>
145
+ </div>
146
+ </div>
147
+ `;
148
+ }
149
+ __renderCartType(json) {
150
+ const { lang, ns } = this;
151
+ const items = ['default', 'fullpage', 'custom'];
152
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('cart-type', true);
153
+ return html `
154
+ <div data-testid="cart-type">
155
+ ${this.renderTemplateOrSlot('cart-type:before')}
156
+
157
+ <x-group frame>
158
+ <foxy-i18n
159
+ class=${isDisabled ? 'text-disabled' : ''}
160
+ slot="header"
161
+ lang=${lang}
162
+ key="cart_type"
163
+ ns=${ns}
164
+ >
165
+ </foxy-i18n>
166
+
167
+ <x-choice
168
+ data-testid="cart-type-choice"
169
+ .value=${json.cart_type}
170
+ .items=${items}
171
+ ?disabled=${isDisabled}
172
+ ?readonly=${this.readonlySelector.matches('cart-type', true)}
173
+ @change=${(evt) => {
174
+ this.edit({ json: JSON.stringify({ ...json, cart_type: evt.detail }) });
175
+ }}
176
+ >
177
+ ${items.map(item => {
178
+ return html `
179
+ <div slot="${item}-label" class="grid leading-s py-s">
180
+ <foxy-i18n lang=${lang} key="cart_type_${item}" ns=${ns}></foxy-i18n>
181
+ <foxy-i18n
182
+ class="text-xs ${isDisabled ? 'text-disabled' : 'text-secondary'}"
183
+ lang=${lang}
184
+ key="cart_type_${item}_explainer"
185
+ ns=${ns}
186
+ >
187
+ </foxy-i18n>
188
+ </div>
189
+ `;
190
+ })}
191
+ </x-choice>
192
+ </x-group>
193
+
194
+ ${this.renderTemplateOrSlot('cart-type:after')}
195
+ </div>
196
+ `;
197
+ }
198
+ __renderFoxycomplete(json) {
199
+ const { lang, ns } = this;
200
+ const isDisabled = this.disabledSelector.matches('foxycomplete', true);
201
+ const isReadonly = this.readonlySelector.matches('foxycomplete', true);
202
+ const items = ['combobox', 'search', 'disabled'];
203
+ const value = json.foxycomplete.usage === 'none'
204
+ ? 'disabled'
205
+ : json.foxycomplete.show_combobox
206
+ ? 'combobox'
207
+ : 'search';
208
+ const renderFlagsCheckbox = () => html `
209
+ <x-checkbox
210
+ ?disabled=${isDisabled}
211
+ ?readonly=${isReadonly}
212
+ ?checked=${json.foxycomplete.show_flags}
213
+ @change=${(evt) => {
214
+ const newConfig = {
215
+ ...json.foxycomplete,
216
+ show_flags: evt.detail,
217
+ };
218
+ this.edit({ json: JSON.stringify({ ...json, foxycomplete: newConfig }) });
219
+ }}
220
+ >
221
+ <foxy-i18n lang=${lang} key="show_country_flags" ns=${ns}></foxy-i18n>
222
+ </x-checkbox>
223
+ `;
224
+ return html `
225
+ <div>
226
+ ${this.renderTemplateOrSlot('foxycomplete:before')}
227
+
228
+ <x-group frame>
229
+ <foxy-i18n
230
+ class=${isDisabled ? 'text-disabled' : ''}
231
+ slot="header"
232
+ lang=${lang}
233
+ key="foxycomplete"
234
+ ns=${ns}
235
+ >
236
+ </foxy-i18n>
237
+
238
+ <x-choice
239
+ .value=${value}
240
+ .items=${items}
241
+ ?disabled=${isDisabled}
242
+ ?readonly=${isReadonly}
243
+ @change=${(evt) => {
244
+ if (!(evt instanceof ChoiceChangeEvent))
245
+ return;
246
+ const newConfig = {
247
+ ...json.foxycomplete,
248
+ usage: evt.detail === 'disabled' ? 'none' : 'required',
249
+ show_combobox: evt.detail === 'combobox',
250
+ };
251
+ this.edit({ json: JSON.stringify({ ...json, foxycomplete: newConfig }) });
252
+ }}
253
+ >
254
+ ${items.map(item => {
255
+ return html `
256
+ <div slot="${item}-label" class="grid leading-s py-s">
257
+ <foxy-i18n lang=${lang} key="foxycomplete_${item}" ns=${ns}></foxy-i18n>
258
+ <foxy-i18n
259
+ class="text-xs ${isDisabled ? 'text-disabled' : 'text-secondary'}"
260
+ lang=${lang}
261
+ key="foxycomplete_${item}_explainer"
262
+ ns=${ns}
263
+ >
264
+ </foxy-i18n>
265
+ </div>
266
+ `;
267
+ })}
268
+
269
+ <div slot="combobox" class="space-y-m pb-s" ?hidden=${value !== 'combobox'}>
270
+ <div class="grid grid-cols-2 gap-m" style="max-width: 16rem">
271
+ ${['open', 'close'].map(action => {
272
+ const field = action === 'open' ? 'combobox_open' : 'combobox_close';
273
+ return html `
274
+ <vaadin-text-field
275
+ label=${this.t(`${action}_icon`)}
276
+ .value=${json.foxycomplete[field]}
277
+ ?disabled=${isDisabled}
278
+ ?readonly=${isReadonly}
279
+ @input=${(evt) => {
280
+ const target = evt.currentTarget;
281
+ const newConfig = {
282
+ ...json.foxycomplete,
283
+ [field]: target.value,
284
+ };
285
+ this.edit({ json: JSON.stringify({ ...json, foxycomplete: newConfig }) });
286
+ }}
287
+ >
288
+ </vaadin-text-field>
289
+ `;
290
+ })}
291
+ </div>
292
+
293
+ ${renderFlagsCheckbox()}
294
+ </div>
295
+
296
+ <div slot="search" class="pb-s" ?hidden=${value !== 'search'}>
297
+ ${renderFlagsCheckbox()}
298
+ </div>
299
+ </x-choice>
300
+
301
+ <div class="border-t border-contrast-10 p-m">
302
+ <x-checkbox
303
+ ?disabled=${isDisabled}
304
+ ?readonly=${isReadonly}
305
+ ?checked=${json.postal_code_lookup.usage === 'enabled'}
306
+ @change=${(evt) => {
307
+ const newConfig = {
308
+ usage: evt.detail ? 'enabled' : 'none',
309
+ };
310
+ this.edit({ json: JSON.stringify({ ...json, postal_code_lookup: newConfig }) });
311
+ }}
312
+ >
313
+ <foxy-i18n lang=${lang} key="enable_postcode_lookup" ns=${ns}></foxy-i18n>
314
+ </x-checkbox>
315
+ </div>
316
+ </x-group>
317
+
318
+ ${this.renderTemplateOrSlot('foxycomplete:after')}
319
+ </div>
320
+ `;
321
+ }
322
+ __renderLocations(json) {
323
+ const { lang, ns } = this;
324
+ const config = json.location_filtering;
325
+ const isDisabled = this.disabledSelector.matches('locations', true);
326
+ const isReadonly = this.readonlySelector.matches('locations', true);
327
+ const shippingChoice = config.shipping_filter_type === 'blacklist' ? 'block' : 'allow';
328
+ const billingChoice = config.usage === 'both'
329
+ ? 'copy'
330
+ : config.billing_filter_type === 'blacklist'
331
+ ? 'block'
332
+ : 'allow';
333
+ const normalize = () => {
334
+ if (config.usage === 'both') {
335
+ config.billing_filter_type = config.shipping_filter_type;
336
+ config.billing_filter_values = config.shipping_filter_values;
337
+ }
338
+ else {
339
+ const hasBillingFilters = Object.keys(config.billing_filter_values).length > 0;
340
+ const hasShippingFilters = Object.keys(config.shipping_filter_values).length > 0;
341
+ if (!hasBillingFilters && !hasShippingFilters) {
342
+ config.usage = 'none';
343
+ }
344
+ else if (hasBillingFilters && !hasShippingFilters) {
345
+ config.usage = 'billing';
346
+ }
347
+ else if (hasShippingFilters && !hasBillingFilters) {
348
+ config.usage = 'shipping';
349
+ }
350
+ else {
351
+ config.usage = 'independent';
352
+ }
353
+ }
354
+ };
355
+ return html `
356
+ ${this.renderTemplateOrSlot('locations:before')}
357
+
358
+ <x-group frame>
359
+ <foxy-i18n
360
+ class=${isDisabled ? 'text-disabled' : ''}
361
+ slot="header"
362
+ lang=${lang}
363
+ key="location_plural"
364
+ ns=${ns}
365
+ >
366
+ </foxy-i18n>
367
+
368
+ <div class="grid sm-grid-cols-2 bg-contrast-10" style="gap: 1px">
369
+ <x-group class="bg-base pt-m">
370
+ <foxy-i18n
371
+ class=${isDisabled ? 'text-disabled' : 'text-tertiary'}
372
+ slot="header"
373
+ lang=${lang}
374
+ key="shipping"
375
+ ns=${ns}
376
+ >
377
+ </foxy-i18n>
378
+
379
+ <x-choice
380
+ .items=${['allow', 'block']}
381
+ .value=${shippingChoice}
382
+ ?disabled=${isDisabled}
383
+ ?readonly=${isReadonly}
384
+ @change=${(evt) => {
385
+ if (config.usage !== 'both')
386
+ config.usage = 'independent';
387
+ config.shipping_filter_type = evt.detail === 'block' ? 'blacklist' : 'whitelist';
388
+ normalize();
389
+ this.edit({ json: JSON.stringify(json) });
390
+ }}
391
+ >
392
+ <foxy-i18n slot="allow-label" lang=${lang} key="allowlist" ns=${ns}></foxy-i18n>
393
+ <foxy-i18n slot="block-label" lang=${lang} key="blocklist" ns=${ns}></foxy-i18n>
394
+
395
+ <x-countries-list
396
+ countries=${JSON.stringify(config.shipping_filter_values)}
397
+ regions=${this.regions}
398
+ class="mb-m"
399
+ href=${this.countries}
400
+ slot=${shippingChoice}
401
+ lang=${lang}
402
+ ns=${ns}
403
+ ?disabled=${isDisabled}
404
+ ?readonly=${isReadonly}
405
+ @update:countries=${(evt) => {
406
+ config.shipping_filter_values = evt.currentTarget.countries;
407
+ normalize();
408
+ this.edit({ json: JSON.stringify(json) });
409
+ }}
410
+ >
411
+ </x-countries-list>
412
+ </x-choice>
413
+ </x-group>
414
+
415
+ <x-group class="bg-base pt-m">
416
+ <foxy-i18n
417
+ class=${isDisabled ? 'text-disabled' : 'text-tertiary'}
418
+ slot="header"
419
+ lang=${lang}
420
+ key="billing"
421
+ ns=${ns}
422
+ >
423
+ </foxy-i18n>
424
+
425
+ <x-choice
426
+ .items=${['allow', 'block', 'copy']}
427
+ .value=${billingChoice}
428
+ ?disabled=${isDisabled}
429
+ ?readonly=${isReadonly}
430
+ @change=${(evt) => {
431
+ if (evt.detail === 'copy') {
432
+ config.usage = 'both';
433
+ }
434
+ else {
435
+ config.usage = 'independent';
436
+ config.billing_filter_type = evt.detail === 'block' ? 'blacklist' : 'whitelist';
437
+ }
438
+ normalize();
439
+ this.edit({ json: JSON.stringify(json) });
440
+ }}
441
+ >
442
+ <foxy-i18n slot="allow-label" lang=${lang} key="allowlist" ns=${ns}></foxy-i18n>
443
+ <foxy-i18n slot="block-label" lang=${lang} key="blocklist" ns=${ns}></foxy-i18n>
444
+ <foxy-i18n slot="copy-label" lang=${lang} key="same_as_shipping" ns=${ns}></foxy-i18n>
445
+
446
+ <x-countries-list
447
+ countries=${JSON.stringify(config.billing_filter_values)}
448
+ regions=${this.regions}
449
+ class="mb-m"
450
+ href=${this.countries}
451
+ slot=${billingChoice}
452
+ lang=${lang}
453
+ ns=${ns}
454
+ ?disabled=${isDisabled}
455
+ ?readonly=${isReadonly}
456
+ ?hidden=${billingChoice === 'copy'}
457
+ @update:countries=${(evt) => {
458
+ config.billing_filter_values = evt.currentTarget.countries;
459
+ normalize();
460
+ this.edit({ json: JSON.stringify(json) });
461
+ }}
462
+ >
463
+ </x-countries-list>
464
+ </x-choice>
465
+ </x-group>
466
+ </div>
467
+ </x-group>
468
+
469
+ ${this.renderTemplateOrSlot('locations:after')}
470
+ `;
471
+ }
472
+ __renderHiddenFields(json) {
473
+ const { lang, ns } = this;
474
+ const suggestions = [];
475
+ const fields = [];
476
+ const config = json.cart_display_config;
477
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('hidden-fields', true);
478
+ const isReadonly = this.readonlySelector.matches('hidden-fields', true);
479
+ for (const key in config) {
480
+ if (!key.startsWith('show_'))
481
+ continue;
482
+ const field = key.substring(5);
483
+ suggestions.push(field);
484
+ if (config.usage === 'required' && !config[key])
485
+ fields.push(field);
486
+ }
487
+ if (config.usage === 'required') {
488
+ fields.push(...config.hidden_product_options);
489
+ }
490
+ const addField = () => {
491
+ config.usage = 'required';
492
+ if (suggestions.includes(this.__addHiddenFieldInputValue)) {
493
+ config[`show_${this.__addHiddenFieldInputValue}`] = false;
494
+ }
495
+ else if (!config.hidden_product_options.includes(this.__addHiddenFieldInputValue)) {
496
+ config.hidden_product_options.push(this.__addHiddenFieldInputValue);
497
+ }
498
+ this.edit({ json: JSON.stringify(json) });
499
+ this.__addHiddenFieldInputValue = '';
500
+ };
501
+ const radius = 'calc(var(--lumo-border-radius-l) / 1.2)';
502
+ const inputRadius = fields.length === 0 ? [radius] : ['0', '0', radius, radius];
503
+ const isAddButtonDisabled = isDisabled || !this.__addHiddenFieldInputValue;
504
+ return html `
505
+ <div data-testid="hidden-fields">
506
+ ${this.renderTemplateOrSlot('hidden-fields:before')}
507
+
508
+ <x-group frame>
509
+ <foxy-i18n
510
+ class=${isDisabled ? 'text-disabled' : ''}
511
+ slot="header"
512
+ lang=${lang}
513
+ key="hidden_fields"
514
+ ns=${ns}
515
+ >
516
+ </foxy-i18n>
517
+
518
+ <div class="divide-y divide-contrast-10" data-testid="hidden-fields-list">
519
+ ${fields.map(field => {
520
+ return html `
521
+ <div
522
+ class=${classMap({
523
+ 'h-m ml-m pr-xs flex items-center justify-between': true,
524
+ 'text-secondary': isReadonly,
525
+ 'text-disabled': isDisabled,
526
+ })}
527
+ >
528
+ ${suggestions.includes(field)
529
+ ? html `<foxy-i18n lang=${lang} key=${field} ns=${ns}></foxy-i18n>`
530
+ : html `<span>${field}</span>`}
531
+
532
+ <button
533
+ aria-label=${this.t('delete')}
534
+ class=${classMap({
535
+ 'w-xs h-xs rounded-full transition-colors': true,
536
+ 'hover-bg-error-10 hover-text-error': !isDisabled,
537
+ 'focus-outline-none focus-ring-2 ring-inset ring-error-50': !isDisabled,
538
+ 'cursor-default': isDisabled,
539
+ 'flex': !isReadonly,
540
+ 'hidden': isReadonly,
541
+ })}
542
+ ?disabled=${isDisabled}
543
+ @click=${() => {
544
+ if (typeof config[`show_${field}`] === 'boolean') {
545
+ config[`show_${field}`] = true;
546
+ }
547
+ else {
548
+ config.hidden_product_options = config.hidden_product_options.filter(option => option !== field);
549
+ }
550
+ this.edit({ json: JSON.stringify(json) });
551
+ }}
552
+ >
553
+ <iron-icon icon="icons:close" class="icon-inline text-m m-auto"></iron-icon>
554
+ </button>
555
+ </div>
556
+ `;
557
+ })}
558
+ </div>
559
+
560
+ <div
561
+ data-testid="hidden-fields-new"
562
+ style="border-radius: ${inputRadius.join(' ')}"
563
+ class=${classMap({
564
+ 'h-m flex items-center ring-inset ring-primary-50 focus-within-ring-2': true,
565
+ 'border-t border-contrast-10': fields.length > 0,
566
+ 'flex': !isReadonly,
567
+ 'hidden': isReadonly,
568
+ })}
569
+ >
570
+ <input
571
+ placeholder=${this.t('add_field')}
572
+ class="w-full bg-transparent appearance-none h-m px-m focus-outline-none"
573
+ list="hidden-fields-list"
574
+ .value=${live(this.__addHiddenFieldInputValue)}
575
+ ?disabled=${isDisabled}
576
+ ?readonly=${isReadonly}
577
+ @keydown=${(evt) => evt.key === 'Enter' && addField()}
578
+ @input=${(evt) => {
579
+ this.__addHiddenFieldInputValue = evt.currentTarget.value;
580
+ }}
581
+ />
582
+
583
+ <datalist id="hidden-fields-list">
584
+ ${suggestions
585
+ .filter(suggestion => !fields.includes(suggestion))
586
+ .map(suggestion => html `<option value=${suggestion}>${this.t(suggestion)}</option>`)}
587
+ </datalist>
588
+
589
+ <button
590
+ aria-label=${this.t('add_field')}
591
+ class=${classMap({
592
+ 'w-xs h-xs mr-xs flex-shrink-0 ring-inset ring-success-50': true,
593
+ 'flex items-center justify-center rounded-full transition-colors': true,
594
+ 'bg-contrast-5 text-disabled cursor-default': isAddButtonDisabled,
595
+ 'bg-success-10 text-success cursor-pointer': !isAddButtonDisabled,
596
+ 'hover-bg-success hover-text-success-contrast': !isAddButtonDisabled,
597
+ 'focus-outline-none focus-ring-2': !isAddButtonDisabled,
598
+ })}
599
+ ?disabled=${isAddButtonDisabled}
600
+ @click=${addField}
601
+ >
602
+ <iron-icon icon="icons:add" class="icon-inline text-m"></iron-icon>
603
+ </button>
604
+ </div>
605
+ </x-group>
606
+
607
+ ${this.renderTemplateOrSlot('hidden-fields:after')}
608
+ </div>
609
+ `;
610
+ }
611
+ __renderCards(json) {
612
+ const { lang, ns } = this;
613
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('cards', true);
614
+ const isReadonly = this.readonlySelector.matches('cards', true);
615
+ const config = json.supported_payment_cards;
616
+ let skipForSaved;
617
+ let skipForSSO;
618
+ if (json.csc_requirements === 'all_cards') {
619
+ skipForSaved = false;
620
+ skipForSSO = false;
621
+ }
622
+ else if (json.csc_requirements === 'sso_only') {
623
+ skipForSaved = true;
624
+ skipForSSO = false;
625
+ }
626
+ else {
627
+ skipForSaved = true;
628
+ skipForSSO = true;
629
+ }
630
+ const typeToName = {
631
+ amex: 'American Express',
632
+ diners: 'Diners Club',
633
+ discover: 'Discover',
634
+ jcb: 'JCB',
635
+ maestro: 'Maestro',
636
+ mastercard: 'Mastercard',
637
+ unionpay: 'UnionPay',
638
+ visa: 'Visa',
639
+ };
640
+ return html `
641
+ <div data-testid="cards">
642
+ ${this.renderTemplateOrSlot('cards:before')}
643
+
644
+ <div class="space-y-xs">
645
+ <x-group frame>
646
+ <foxy-i18n
647
+ class=${isDisabled ? 'text-disabled' : ''}
648
+ slot="header"
649
+ lang=${lang}
650
+ key="supported_cards"
651
+ ns=${ns}
652
+ >
653
+ </foxy-i18n>
654
+
655
+ <div class="flex flex-wrap m-xs p-s">
656
+ ${Object.entries(logos).map(([type, logo]) => {
657
+ if (!typeToName[type])
658
+ return;
659
+ const isChecked = config.includes(type);
660
+ return html `
661
+ <div
662
+ class=${classMap({
663
+ 'm-xs rounded': true,
664
+ 'opacity-50 cursor-default': isDisabled,
665
+ 'cursor-pointer ring-primary-50 focus-within-ring-2': !isDisabled,
666
+ })}
667
+ >
668
+ <label
669
+ class=${classMap({
670
+ 'overflow-hidden transition-colors flex rounded border': true,
671
+ 'border-primary bg-primary-10 text-primary': isChecked && !isReadonly,
672
+ 'border-contrast bg-contrast-5 text-secondary': isChecked && isReadonly,
673
+ 'hover-text-body': isChecked && !isDisabled && !isReadonly,
674
+ 'border-contrast-10': !isChecked,
675
+ 'hover-border-primary': !isChecked && !isDisabled && !isReadonly,
676
+ 'hover-text-primary': !isChecked && !isDisabled && !isReadonly,
677
+ })}
678
+ >
679
+ <div class="h-s">${logo}</div>
680
+
681
+ <div class="text-s font-medium mx-s my-auto leading-none">
682
+ ${typeToName[type]}
683
+ </div>
684
+
685
+ <input
686
+ type="checkbox"
687
+ class="sr-only"
688
+ ?disabled=${isDisabled}
689
+ ?readonly=${isReadonly}
690
+ ?checked=${isChecked}
691
+ @change=${(evt) => {
692
+ if (isReadonly)
693
+ return evt.preventDefault();
694
+ evt.stopPropagation();
695
+ if (evt.currentTarget.checked) {
696
+ config.push(type);
697
+ }
698
+ else {
699
+ config.splice(config.indexOf(type), 1);
700
+ }
701
+ this.edit({ json: JSON.stringify(json) });
702
+ }}
703
+ />
704
+ </label>
705
+ </div>
706
+ `;
707
+ })}
708
+ </div>
709
+
710
+ <div class="flex flex-wrap p-s border-t border-contrast-10">
711
+ <x-checkbox
712
+ data-testid="cards-saved-check"
713
+ class="m-s"
714
+ ?disabled=${isDisabled || json.csc_requirements === 'new_cards_only'}
715
+ ?readonly=${isReadonly}
716
+ ?checked=${skipForSaved}
717
+ @change=${(evt) => {
718
+ json.csc_requirements = evt.detail ? 'sso_only' : 'all_cards';
719
+ this.edit({ json: JSON.stringify(json) });
720
+ }}
721
+ >
722
+ <foxy-i18n class="leading-s block" lang=${lang} key="skip_csc_for_saved" ns=${ns}>
723
+ </foxy-i18n>
724
+ </x-checkbox>
725
+
726
+ <x-checkbox
727
+ data-testid="cards-sso-check"
728
+ class="m-s"
729
+ ?disabled=${isDisabled}
730
+ ?readonly=${isReadonly}
731
+ ?checked=${skipForSSO}
732
+ @change=${(evt) => {
733
+ json.csc_requirements = evt.detail
734
+ ? 'new_cards_only'
735
+ : skipForSaved
736
+ ? 'sso_only'
737
+ : 'all_cards';
738
+ this.edit({ json: JSON.stringify(json) });
739
+ }}
740
+ >
741
+ <foxy-i18n class="leading-s block" lang=${lang} key="skip_csc_for_sso" ns=${ns}>
742
+ </foxy-i18n>
743
+ </x-checkbox>
744
+ </div>
745
+ </x-group>
746
+
747
+ <foxy-i18n
748
+ class="text-xs leading-s block ${isDisabled ? 'text-disabled' : 'text-secondary'}"
749
+ lang=${lang}
750
+ key="supported_cards_disclaimer"
751
+ ns=${ns}
752
+ >
753
+ </foxy-i18n>
754
+ </div>
755
+
756
+ ${this.renderTemplateOrSlot('cards:after')}
757
+ </div>
758
+ `;
759
+ }
760
+ __renderCheckoutType(json) {
761
+ const { lang, ns } = this;
762
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('checkout-type', true);
763
+ const isReadonly = this.readonlySelector.matches('checkout-type', true);
764
+ return html `
765
+ <div data-testid="checkout-type">
766
+ ${this.renderTemplateOrSlot('checkout-type:before')}
767
+
768
+ <div class="space-y-xs">
769
+ <x-group frame>
770
+ <foxy-i18n
771
+ class=${isDisabled ? 'text-disabled' : ''}
772
+ slot="header"
773
+ lang=${lang}
774
+ key="checkout_type"
775
+ ns=${ns}
776
+ >
777
+ </foxy-i18n>
778
+
779
+ <x-choice
780
+ data-testid="checkout-type-choice"
781
+ ?disabled=${isDisabled}
782
+ ?readonly=${isReadonly}
783
+ .items=${['default_account', 'default_guest', 'guest_only', 'account_only']}
784
+ .value=${json.checkout_type}
785
+ .getText=${(item) => this.t(`checkout_type_${item}`)}
786
+ @change=${(evt) => {
787
+ json.checkout_type = evt.detail;
788
+ this.edit({ json: JSON.stringify(json) });
789
+ }}
790
+ >
791
+ </x-choice>
792
+ </x-group>
793
+
794
+ <foxy-i18n
795
+ class="text-xs leading-s block ${isDisabled ? 'text-disabled' : 'text-secondary'}"
796
+ lang=${lang}
797
+ key="checkout_type_helper_text"
798
+ ns=${ns}
799
+ >
800
+ </foxy-i18n>
801
+ </div>
802
+
803
+ ${this.renderTemplateOrSlot('checkout-type:after')}
804
+ </div>
805
+ `;
806
+ }
807
+ __renderConsent(json) {
808
+ const { lang, ns } = this;
809
+ const tosConfig = json.tos_checkbox_settings;
810
+ const mailConfig = json.newsletter_subscribe;
811
+ const sdtaConfig = json.eu_secure_data_transfer_consent;
812
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('consent', true);
813
+ const isReadonly = this.readonlySelector.matches('consent', true);
814
+ const dividerStyle = 'margin-left: calc(1.125rem + (var(--lumo-space-m) * 2))';
815
+ return html `
816
+ <div data-testid="consent">
817
+ ${this.renderTemplateOrSlot('consent:before')}
818
+
819
+ <x-group frame>
820
+ <foxy-i18n
821
+ class=${isDisabled ? 'text-disabled' : ''}
822
+ slot="header"
823
+ lang=${lang}
824
+ key="consent"
825
+ ns=${ns}
826
+ >
827
+ </foxy-i18n>
828
+
829
+ <x-checkbox
830
+ data-testid="consent-tos-check"
831
+ ?disabled=${isDisabled}
832
+ ?readonly=${isReadonly}
833
+ ?checked=${tosConfig.usage === 'required' || tosConfig.usage === 'optional'}
834
+ class="m-m"
835
+ @change=${(evt) => {
836
+ tosConfig.initial_state = evt.detail ? tosConfig.initial_state : 'unchecked';
837
+ tosConfig.is_hidden = false;
838
+ tosConfig.usage = evt.detail ? 'required' : 'none';
839
+ tosConfig.url = evt.detail ? tosConfig.url : '';
840
+ this.edit({ json: JSON.stringify(json) });
841
+ }}
842
+ >
843
+ <div class="flex flex-col">
844
+ <foxy-i18n lang=${lang} key="display_tos_link" ns=${ns}></foxy-i18n>
845
+ <foxy-i18n
846
+ class="text-xs leading-s ${isDisabled ? 'text-disabled' : 'text-secondary'}"
847
+ lang=${lang}
848
+ key="display_tos_link_explainer"
849
+ ns=${ns}
850
+ >
851
+ </foxy-i18n>
852
+ </div>
853
+
854
+ <div slot="content" ?hidden=${tosConfig.usage === 'none'}>
855
+ <vaadin-text-field
856
+ data-testid="consent-tos-field"
857
+ label=${this.t('location_url')}
858
+ class="w-full mt-m"
859
+ placeholder="https://example.com/path/to/tos"
860
+ clear-button-visible
861
+ ?disabled=${isDisabled}
862
+ ?readonly=${isReadonly}
863
+ .value=${tosConfig.url}
864
+ @input=${(evt) => {
865
+ tosConfig.url = evt.currentTarget.value;
866
+ this.edit({ json: JSON.stringify(json) });
867
+ }}
868
+ >
869
+ </vaadin-text-field>
870
+
871
+ <div class="flex flex-wrap -mx-s -mb-s mt-s">
872
+ <x-checkbox
873
+ data-testid="consent-tos-require-check"
874
+ class="m-s"
875
+ ?disabled=${isDisabled}
876
+ ?readonly=${isReadonly}
877
+ ?checked=${tosConfig.usage === 'required'}
878
+ @change=${(evt) => {
879
+ tosConfig.usage = evt.detail ? 'required' : 'optional';
880
+ this.edit({ json: JSON.stringify(json) });
881
+ }}
882
+ >
883
+ <foxy-i18n class="leading-s block" lang=${lang} key="require_consent" ns=${ns}>
884
+ </foxy-i18n>
885
+ </x-checkbox>
886
+
887
+ <x-checkbox
888
+ data-testid="consent-tos-state-check"
889
+ class="m-s"
890
+ ?disabled=${isDisabled}
891
+ ?readonly=${isReadonly}
892
+ ?checked=${tosConfig.initial_state === 'checked'}
893
+ @change=${(evt) => {
894
+ tosConfig.initial_state = evt.detail ? 'checked' : 'unchecked';
895
+ this.edit({ json: JSON.stringify(json) });
896
+ }}
897
+ >
898
+ <foxy-i18n class="leading-s block" lang=${lang} key="checked_by_default" ns=${ns}>
899
+ </foxy-i18n>
900
+ </x-checkbox>
901
+ </div>
902
+ </div>
903
+ </x-checkbox>
904
+
905
+ <div style=${dividerStyle} class="border-b border-contrast-10"></div>
906
+
907
+ <x-checkbox
908
+ data-testid="consent-mail-check"
909
+ ?disabled=${isDisabled}
910
+ ?readonly=${isReadonly}
911
+ ?checked=${mailConfig.usage === 'required'}
912
+ class="m-m"
913
+ @change=${(evt) => {
914
+ mailConfig.usage = evt.detail ? 'required' : 'none';
915
+ this.edit({ json: JSON.stringify(json) });
916
+ }}
917
+ >
918
+ <div class="flex flex-col">
919
+ <foxy-i18n lang=${lang} key="newsletter_subscribe" ns=${ns}></foxy-i18n>
920
+ <foxy-i18n
921
+ class="text-xs leading-s ${isDisabled ? 'text-disabled' : 'text-secondary'}"
922
+ lang=${lang}
923
+ key="newsletter_subscribe_explainer"
924
+ ns=${ns}
925
+ >
926
+ </foxy-i18n>
927
+ </div>
928
+ </x-checkbox>
929
+
930
+ <div style=${dividerStyle} class="border-b border-contrast-10"></div>
931
+
932
+ <x-checkbox
933
+ data-testid="consent-sdta-check"
934
+ ?disabled=${isDisabled}
935
+ ?readonly=${isReadonly}
936
+ ?checked=${sdtaConfig.usage === 'required'}
937
+ class="m-m"
938
+ @change=${(evt) => {
939
+ sdtaConfig.usage = evt.detail ? 'required' : 'none';
940
+ this.edit({ json: JSON.stringify(json) });
941
+ }}
942
+ >
943
+ <div class="flex flex-col">
944
+ <foxy-i18n lang=${lang} key="display_sdta" ns=${ns}></foxy-i18n>
945
+ <foxy-i18n
946
+ class="text-xs leading-s ${isDisabled ? 'text-disabled' : 'text-secondary'}"
947
+ lang=${lang}
948
+ key="display_sdta_explainer"
949
+ ns=${ns}
950
+ >
951
+ </foxy-i18n>
952
+ </div>
953
+ </x-checkbox>
954
+ </x-group>
955
+
956
+ ${this.renderTemplateOrSlot('consent:after')}
957
+ </div>
958
+ `;
959
+ }
960
+ __renderFields(json) {
961
+ const { lang, ns } = this;
962
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('fields', true);
963
+ const isReadonly = this.readonlySelector.matches('fields', true);
964
+ const config = json.custom_checkout_field_requirements;
965
+ const options = {
966
+ cart_controls: ['enabled', 'disabled'],
967
+ coupon_entry: ['enabled', 'disabled'],
968
+ billing_first_name: ['default', 'optional', 'required', 'hidden'],
969
+ billing_last_name: ['default', 'optional', 'required', 'hidden'],
970
+ billing_company: ['default', 'optional', 'required', 'hidden'],
971
+ billing_tax_id: ['default', 'optional', 'required', 'hidden'],
972
+ billing_phone: ['default', 'optional', 'required', 'hidden'],
973
+ billing_address1: ['default', 'optional', 'required', 'hidden'],
974
+ billing_address2: ['default', 'optional', 'required', 'hidden'],
975
+ billing_city: ['default', 'optional', 'required', 'hidden'],
976
+ billing_region: ['default', 'optional', 'required', 'hidden'],
977
+ billing_postal_code: ['default', 'optional', 'required', 'hidden'],
978
+ billing_country: ['default', 'optional', 'required', 'hidden'],
979
+ };
980
+ return html `
981
+ <div data-testid="fields">
982
+ ${this.renderTemplateOrSlot('fields:before')}
983
+
984
+ <x-group frame>
985
+ <foxy-i18n
986
+ class=${isDisabled ? 'text-disabled' : ''}
987
+ slot="header"
988
+ lang=${lang}
989
+ key="field_plural"
990
+ ns=${ns}
991
+ >
992
+ </foxy-i18n>
993
+
994
+ <div class="bg-contrast-10 grid grid-cols-1 md-grid-cols-2" style="gap: 1px">
995
+ ${Object.entries(options).map(([property, values]) => {
996
+ return html `
997
+ <label
998
+ class=${classMap({
999
+ 'flex items-center pl-m bg-base': true,
1000
+ 'text-secondary': isReadonly,
1001
+ 'text-disabled': isDisabled,
1002
+ })}
1003
+ >
1004
+ <foxy-i18n
1005
+ class="flex-1"
1006
+ lang=${lang}
1007
+ key=${property.replace('billing_', '')}
1008
+ ns=${ns}
1009
+ >
1010
+ </foxy-i18n>
1011
+
1012
+ <div
1013
+ class=${classMap({
1014
+ 'flex items-center text-right font-medium h-s px-s m-xs': isReadonly,
1015
+ 'hidden': !isReadonly,
1016
+ })}
1017
+ >
1018
+ ${this.t(values.find(value => config[property] === value))}
1019
+ </div>
1020
+
1021
+ <div
1022
+ class=${classMap({
1023
+ 'px-s m-xs flex items-center rounded leading-none': true,
1024
+ 'ring-primary-50 ring-inset focus-within-ring-2': !isDisabled,
1025
+ 'hover-text-primary': !isDisabled,
1026
+ 'cursor-pointer': !isDisabled,
1027
+ 'cursor-default': isDisabled,
1028
+ 'flex': !isReadonly,
1029
+ 'hidden': isReadonly,
1030
+ })}
1031
+ >
1032
+ <select
1033
+ data-testid="fields-${property}"
1034
+ class=${classMap({
1035
+ 'h-s mr-xs text-right appearance-none bg-transparent font-medium': true,
1036
+ 'focus-outline-none cursor-pointer': !isDisabled,
1037
+ 'cursor-default': isDisabled,
1038
+ })}
1039
+ ?disabled=${isDisabled}
1040
+ ?readonly=${isReadonly}
1041
+ @change=${(evt) => {
1042
+ const select = evt.currentTarget;
1043
+ const value = select.options[select.options.selectedIndex].value;
1044
+ config[property] = value;
1045
+ this.edit({ json: JSON.stringify(json) });
1046
+ }}
1047
+ >
1048
+ ${values.map(value => {
1049
+ return html `
1050
+ <option
1051
+ value=${value}
1052
+ ?selected=${config[property] === value}
1053
+ >
1054
+ ${this.t(value)}
1055
+ </option>
1056
+ `;
1057
+ })}
1058
+ </select>
1059
+
1060
+ <iron-icon
1061
+ class="pointer-events-none icon-inline text-xl"
1062
+ icon="icons:expand-more"
1063
+ >
1064
+ </iron-icon>
1065
+ </div>
1066
+ </label>
1067
+ `;
1068
+ })}
1069
+
1070
+ <div class="bg-base hidden md-block"></div>
1071
+ </div>
1072
+ </x-group>
1073
+
1074
+ ${this.renderTemplateOrSlot('fields:after')}
1075
+ </div>
1076
+ `;
1077
+ }
1078
+ __renderGoogleAnalytics(json) {
1079
+ const { lang, ns } = this;
1080
+ const config = json.analytics_config;
1081
+ const sioConfig = config.segment_io;
1082
+ const gaConfig = config.google_analytics;
1083
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('google-analytics', true);
1084
+ const isReadonly = this.readonlySelector.matches('google-analytics', true);
1085
+ return html `
1086
+ <div data-testid="google-analytics">
1087
+ ${this.renderTemplateOrSlot('google-analytics:before')}
1088
+
1089
+ <x-group frame>
1090
+ <span class=${isDisabled ? 'text-disabled' : ''} slot="header">Google Analytics</span>
1091
+
1092
+ <div class="p-m space-y-m">
1093
+ <vaadin-text-field
1094
+ data-testid="google-analytics-field"
1095
+ class="w-full"
1096
+ label=${this.t('ga_account_id')}
1097
+ placeholder="UA-1234567-1"
1098
+ helper-text=${this.t('ga_account_id_explainer')}
1099
+ .value=${live(gaConfig.account_id)}
1100
+ ?disabled=${isDisabled}
1101
+ ?readonly=${isReadonly}
1102
+ clear-button-visible
1103
+ @keydown=${(evt) => evt.key === 'Enter' && this.submit()}
1104
+ @input=${(evt) => {
1105
+ gaConfig.account_id = evt.currentTarget.value;
1106
+ gaConfig.usage = gaConfig.account_id ? 'required' : 'none';
1107
+ config.usage = gaConfig.account_id || sioConfig.account_id ? 'required' : 'none';
1108
+ this.edit({ json: JSON.stringify(json) });
1109
+ }}
1110
+ >
1111
+ </vaadin-text-field>
1112
+
1113
+ <x-checkbox
1114
+ data-testid="google-analytics-check"
1115
+ ?disabled=${isDisabled}
1116
+ ?readonly=${isReadonly}
1117
+ ?checked=${gaConfig.include_on_site}
1118
+ @change=${(evt) => {
1119
+ gaConfig.include_on_site = evt.detail;
1120
+ this.edit({ json: JSON.stringify(json) });
1121
+ }}
1122
+ >
1123
+ <div class="flex flex-col">
1124
+ <foxy-i18n lang=${lang} key="ga_include_on_site" ns=${ns}></foxy-i18n>
1125
+ <foxy-i18n
1126
+ class="text-xs leading-s ${isDisabled ? 'text-disabled' : 'text-secondary'}"
1127
+ lang=${lang}
1128
+ key="ga_include_on_site_explainer"
1129
+ ns=${ns}
1130
+ >
1131
+ </foxy-i18n>
1132
+ </div>
1133
+ </x-checkbox>
1134
+ </div>
1135
+ </x-group>
1136
+
1137
+ ${this.renderTemplateOrSlot('google-analytics:after')}
1138
+ </div>
1139
+ `;
1140
+ }
1141
+ __renderSegmentIo(json) {
1142
+ const config = json.analytics_config;
1143
+ const sioConfig = config.segment_io;
1144
+ const gaConfig = config.google_analytics;
1145
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('segment-io', true);
1146
+ const isReadonly = this.readonlySelector.matches('segment-io', true);
1147
+ return html `
1148
+ <div data-testid="segment-io">
1149
+ ${this.renderTemplateOrSlot('segment-io:before')}
1150
+
1151
+ <x-group frame>
1152
+ <span class=${isDisabled ? 'text-disabled' : ''} slot="header">Segment.io</span>
1153
+
1154
+ <div class="p-m">
1155
+ <vaadin-text-field
1156
+ data-testid="segment-io-field"
1157
+ class="w-full"
1158
+ label=${this.t('sio_account_id')}
1159
+ placeholder="MY-WRITE-KEY"
1160
+ helper-text=${this.t('sio_account_id_explainer')}
1161
+ .value=${live(sioConfig.account_id)}
1162
+ ?disabled=${isDisabled}
1163
+ ?readonly=${isReadonly}
1164
+ clear-button-visible
1165
+ @keydown=${(evt) => evt.key === 'Enter' && this.submit()}
1166
+ @input=${(evt) => {
1167
+ sioConfig.account_id = evt.currentTarget.value;
1168
+ sioConfig.usage = sioConfig.account_id ? 'required' : 'none';
1169
+ config.usage = gaConfig.account_id || sioConfig.account_id ? 'required' : 'none';
1170
+ this.edit({ json: JSON.stringify(json) });
1171
+ }}
1172
+ >
1173
+ </vaadin-text-field>
1174
+ </div>
1175
+ </x-group>
1176
+
1177
+ ${this.renderTemplateOrSlot('segment-io:after')}
1178
+ </div>
1179
+ `;
1180
+ }
1181
+ __renderTroubleshooting(json) {
1182
+ const { lang, ns } = this;
1183
+ const config = json.debug;
1184
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('troubleshooting', true);
1185
+ const isReadonly = this.readonlySelector.matches('troubleshooting', true);
1186
+ return html `
1187
+ <div data-testid="troubleshooting">
1188
+ ${this.renderTemplateOrSlot('troubleshooting:before')}
1189
+
1190
+ <x-group frame>
1191
+ <foxy-i18n
1192
+ class=${isDisabled ? 'text-disabled' : ''}
1193
+ slot="header"
1194
+ lang=${lang}
1195
+ key="troubleshooting"
1196
+ ns=${ns}
1197
+ >
1198
+ </foxy-i18n>
1199
+
1200
+ <div class="p-m space-y-m">
1201
+ <x-checkbox
1202
+ data-testid="troubleshooting-check"
1203
+ ?disabled=${isDisabled}
1204
+ ?readonly=${isReadonly}
1205
+ ?checked=${config.usage === 'required'}
1206
+ @change=${(evt) => {
1207
+ config.usage = evt.detail ? 'required' : 'none';
1208
+ this.edit({ json: JSON.stringify(json) });
1209
+ }}
1210
+ >
1211
+ <div class="flex flex-col">
1212
+ <foxy-i18n lang=${lang} key="troubleshooting_debug" ns=${ns}></foxy-i18n>
1213
+ <foxy-i18n
1214
+ class="text-xs leading-s ${isDisabled ? 'text-disabled' : 'text-secondary'}"
1215
+ lang=${lang}
1216
+ key="troubleshooting_debug_explainer"
1217
+ ns=${ns}
1218
+ >
1219
+ </foxy-i18n>
1220
+ </div>
1221
+ </x-checkbox>
1222
+ </div>
1223
+ </x-group>
1224
+
1225
+ ${this.renderTemplateOrSlot('troubleshooting:after')}
1226
+ </div>
1227
+ `;
1228
+ }
1229
+ __renderCustomConfig(json) {
1230
+ return html `
1231
+ <div data-testid="custom-config">
1232
+ ${this.renderTemplateOrSlot('custom-config:before')}
1233
+
1234
+ <vaadin-text-area
1235
+ data-testid="custom-config-field"
1236
+ class="w-full"
1237
+ label=${this.t('custom_config')}
1238
+ placeholder='{ "key": "value" }'
1239
+ helper-text=${this.t('custom_config_helper_text')}
1240
+ .value=${json.custom_config ? JSON.stringify(json.custom_config, null, 2) : ''}
1241
+ ?disabled=${!this.in('idle') || this.disabledSelector.matches('custom-config', true)}
1242
+ ?readonly=${this.readonlySelector.matches('custom-config', true)}
1243
+ @input=${(evt) => {
1244
+ const input = evt.currentTarget;
1245
+ try {
1246
+ json.custom_config = input.value ? JSON.parse(input.value) : '';
1247
+ this.edit({ json: JSON.stringify(json) });
1248
+ input.invalid = false;
1249
+ }
1250
+ catch (_a) {
1251
+ input.invalid = true;
1252
+ }
1253
+ }}
1254
+ >
1255
+ </vaadin-text-area>
1256
+
1257
+ ${this.renderTemplateOrSlot('custom-config:after')}
1258
+ </div>
1259
+ `;
1260
+ }
1261
+ __renderHeader(json) {
1262
+ return html `
1263
+ <div data-testid="header">
1264
+ ${this.renderTemplateOrSlot('header:before')}
1265
+
1266
+ <vaadin-text-area
1267
+ data-testid="header-field"
1268
+ class="w-full"
1269
+ label=${this.t('custom_header')}
1270
+ helper-text=${this.t('custom_header_helper_text')}
1271
+ .value=${json.custom_script_values.header}
1272
+ ?disabled=${!this.in('idle') || this.disabledSelector.matches('header', true)}
1273
+ ?readonly=${this.readonlySelector.matches('header', true)}
1274
+ @input=${(evt) => {
1275
+ const target = evt.currentTarget;
1276
+ const newConfig = {
1277
+ ...json.custom_script_values,
1278
+ header: target.value,
1279
+ };
1280
+ this.edit({ json: JSON.stringify({ ...json, custom_script_values: newConfig }) });
1281
+ }}
1282
+ >
1283
+ </vaadin-text-area>
1284
+
1285
+ ${this.renderTemplateOrSlot('header:after')}
1286
+ </div>
1287
+ `;
1288
+ }
1289
+ __renderCustomFields(json) {
1290
+ return html `
1291
+ <div data-testid="custom-fields">
1292
+ ${this.renderTemplateOrSlot('custom-fields:before')}
1293
+
1294
+ <vaadin-text-area
1295
+ data-testid="custom-fields-field"
1296
+ class="w-full"
1297
+ label=${this.t('custom_fields')}
1298
+ helper-text=${this.t('custom_fields_helper_text')}
1299
+ .value=${json.custom_script_values.checkout_fields}
1300
+ ?disabled=${!this.in('idle') || this.disabledSelector.matches('custom-fields', true)}
1301
+ ?readonly=${this.readonlySelector.matches('custom-fields', true)}
1302
+ @input=${(evt) => {
1303
+ const newValue = evt.currentTarget.value;
1304
+ json.custom_script_values.checkout_fields = newValue;
1305
+ this.edit({ json: JSON.stringify(json) });
1306
+ }}
1307
+ >
1308
+ </vaadin-text-area>
1309
+
1310
+ ${this.renderTemplateOrSlot('custom-fields:after')}
1311
+ </div>
1312
+ `;
1313
+ }
1314
+ __renderFooter(json) {
1315
+ return html `
1316
+ <div data-testid="footer">
1317
+ ${this.renderTemplateOrSlot('footer:before')}
1318
+
1319
+ <vaadin-text-area
1320
+ data-testid="footer-field"
1321
+ class="w-full"
1322
+ label=${this.t('custom_footer')}
1323
+ helper-text=${this.t('custom_footer_helper_text')}
1324
+ .value=${json.custom_script_values.footer}
1325
+ ?disabled=${!this.in('idle') || this.disabledSelector.matches('footer', true)}
1326
+ ?readonly=${this.readonlySelector.matches('footer', true)}
1327
+ @input=${(evt) => {
1328
+ const target = evt.currentTarget;
1329
+ const newConfig = {
1330
+ ...json.custom_script_values,
1331
+ footer: target.value,
1332
+ };
1333
+ this.edit({ json: JSON.stringify({ ...json, custom_script_values: newConfig }) });
1334
+ }}
1335
+ >
1336
+ </vaadin-text-area>
1337
+
1338
+ ${this.renderTemplateOrSlot('footer:after')}
1339
+ </div>
1340
+ `;
1341
+ }
1342
+ }
1343
+ //# sourceMappingURL=TemplateConfigForm.js.map