@foxy.io/elements 1.13.0-beta.2 → 1.14.0-beta.10

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 (170) 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 +1 -1
  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-145cc9eb.js → shared-00070cc4.js} +1 -1
  46. package/dist/cdn/{shared-d4dad105.js → shared-00563cb0.js} +1 -1
  47. package/dist/cdn/shared-007c4e34.js +1 -0
  48. package/dist/cdn/shared-07134f93.js +14 -0
  49. package/dist/cdn/shared-0ced76a0.js +358 -0
  50. package/dist/cdn/shared-0f9809ab.js +1 -0
  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-31d03530.js +264 -0
  56. package/dist/cdn/{shared-e9920617.js → shared-34b2c1e2.js} +1 -1
  57. package/dist/cdn/{shared-cf248335.js → shared-44cfc617.js} +1 -1
  58. package/dist/cdn/{shared-45d647e4.js → shared-46ee137f.js} +1 -1
  59. package/dist/cdn/{shared-b0b1d248.js → shared-4ba926ca.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-f47647ac.js → shared-5d94bacb.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-91a9e922.js → shared-7007dedb.js} +4 -4
  68. package/dist/cdn/{shared-84fa75d9.js → shared-9221e6b2.js} +1 -1
  69. package/dist/cdn/{shared-2860a3d3.js → shared-94b0ae99.js} +2 -2
  70. package/dist/cdn/shared-a3d2c48e.js +314 -0
  71. package/dist/cdn/shared-a46edf4b.js +1 -0
  72. package/dist/cdn/{shared-54702b33.js → shared-b0f0e8b5.js} +1 -1
  73. package/dist/cdn/{shared-b77179fd.js → shared-b24377bf.js} +1 -1
  74. package/dist/cdn/{shared-ed4ed7a5.js → shared-b710881a.js} +2 -2
  75. package/dist/cdn/{shared-3ae39e52.js → shared-bb824ab4.js} +3 -3
  76. package/dist/cdn/{shared-d9159fe1.js → shared-c5ae5d33.js} +1 -1
  77. package/dist/cdn/{shared-f2cf6cfb.js → shared-ca7c3b9a.js} +1 -1
  78. package/dist/cdn/shared-d01035c5.js +1 -0
  79. package/dist/cdn/{shared-67157a25.js → shared-d05c93a5.js} +1 -1
  80. package/dist/cdn/{shared-a99dea97.js → shared-da787055.js} +1 -1
  81. package/dist/cdn/{shared-036a8b21.js → shared-daf6b763.js} +1 -1
  82. package/dist/cdn/shared-df573cea.js +12 -0
  83. package/dist/cdn/{shared-e5de8675.js → shared-e7f8ffe9.js} +1 -1
  84. package/dist/cdn/{shared-54c485d2.js → shared-ec861f31.js} +21 -21
  85. package/dist/cdn/{shared-e0248713.js → shared-f0a83bd6.js} +1 -1
  86. package/dist/cdn/shared-fe8a7aa2.js +1 -0
  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/EmailTemplateForm/EmailTemplateForm.d.ts +46 -0
  107. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.js +350 -0
  108. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.js.map +1 -0
  109. package/dist/elements/public/EmailTemplateForm/index.d.ts +9 -0
  110. package/dist/elements/public/EmailTemplateForm/index.js +11 -0
  111. package/dist/elements/public/EmailTemplateForm/index.js.map +1 -0
  112. package/dist/elements/public/EmailTemplateForm/types.d.ts +17 -0
  113. package/dist/elements/public/EmailTemplateForm/types.js +2 -0
  114. package/dist/elements/public/EmailTemplateForm/types.js.map +1 -0
  115. package/dist/elements/public/ItemsForm/ItemsForm.js +2 -2
  116. package/dist/elements/public/ItemsForm/ItemsForm.js.map +1 -1
  117. package/dist/elements/public/NucleonElement/serveFromCache.js +1 -0
  118. package/dist/elements/public/NucleonElement/serveFromCache.js.map +1 -1
  119. package/dist/elements/public/TaxForm/TaxForm.d.ts +2 -0
  120. package/dist/elements/public/TaxForm/TaxForm.js +45 -12
  121. package/dist/elements/public/TaxForm/TaxForm.js.map +1 -1
  122. package/dist/elements/public/TaxForm/index.d.ts +1 -0
  123. package/dist/elements/public/TaxForm/index.js +1 -0
  124. package/dist/elements/public/TaxForm/index.js.map +1 -1
  125. package/dist/elements/public/TemplateConfigForm/CountriesList.d.ts +23 -0
  126. package/dist/elements/public/TemplateConfigForm/CountriesList.js +138 -0
  127. package/dist/elements/public/TemplateConfigForm/CountriesList.js.map +1 -0
  128. package/dist/elements/public/TemplateConfigForm/CountryCard.d.ts +22 -0
  129. package/dist/elements/public/TemplateConfigForm/CountryCard.js +157 -0
  130. package/dist/elements/public/TemplateConfigForm/CountryCard.js.map +1 -0
  131. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.d.ts +88 -0
  132. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js +1336 -0
  133. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js.map +1 -0
  134. package/dist/elements/public/TemplateConfigForm/defaults.d.ts +2 -0
  135. package/dist/elements/public/TemplateConfigForm/defaults.js +95 -0
  136. package/dist/elements/public/TemplateConfigForm/defaults.js.map +1 -0
  137. package/dist/elements/public/TemplateConfigForm/index.d.ts +9 -0
  138. package/dist/elements/public/TemplateConfigForm/index.js +11 -0
  139. package/dist/elements/public/TemplateConfigForm/index.js.map +1 -0
  140. package/dist/elements/public/TemplateConfigForm/types.d.ts +150 -0
  141. package/dist/elements/public/TemplateConfigForm/types.js +2 -0
  142. package/dist/elements/public/TemplateConfigForm/types.js.map +1 -0
  143. package/dist/elements/public/TemplateForm/TemplateForm.d.ts +45 -0
  144. package/dist/elements/public/TemplateForm/TemplateForm.js +343 -0
  145. package/dist/elements/public/TemplateForm/TemplateForm.js.map +1 -0
  146. package/dist/elements/public/TemplateForm/index.d.ts +9 -0
  147. package/dist/elements/public/TemplateForm/index.js +11 -0
  148. package/dist/elements/public/TemplateForm/index.js.map +1 -0
  149. package/dist/elements/public/TemplateForm/types.d.ts +17 -0
  150. package/dist/elements/public/TemplateForm/types.js +2 -0
  151. package/dist/elements/public/TemplateForm/types.js.map +1 -0
  152. package/dist/elements/public/index.d.ts +3 -0
  153. package/dist/elements/public/index.defined.d.ts +3 -0
  154. package/dist/elements/public/index.defined.js +3 -0
  155. package/dist/elements/public/index.defined.js.map +1 -1
  156. package/dist/elements/public/index.js +3 -0
  157. package/dist/elements/public/index.js.map +1 -1
  158. package/dist/mixins/themeable.js +133 -16
  159. package/dist/mixins/themeable.js.map +1 -1
  160. package/package.json +2 -7
  161. package/dist/cdn/shared-296637c5.js +0 -1
  162. package/dist/cdn/shared-4a990126.js +0 -1
  163. package/dist/cdn/shared-50744508.js +0 -15
  164. package/dist/cdn/shared-b98f88c9.js +0 -369
  165. package/dist/cdn/shared-bf09e011.js +0 -572
  166. package/dist/cdn/shared-c0161e6a.js +0 -1
  167. package/dist/cdn/shared-c1e0e11f.js +0 -1
  168. package/dist/cdn/shared-dbcffd8e.js +0 -1
  169. package/dist/cdn/shared-e21a2aac.js +0 -1
  170. package/dist/cdn/shared-e55b6bb7.js +0 -1
@@ -0,0 +1,1336 @@
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.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
+ return html `
504
+ <div>
505
+ ${this.renderTemplateOrSlot('hidden-fields:before')}
506
+
507
+ <x-group frame>
508
+ <foxy-i18n
509
+ class=${isDisabled ? 'text-disabled' : ''}
510
+ slot="header"
511
+ lang=${lang}
512
+ key="hidden_fields"
513
+ ns=${ns}
514
+ >
515
+ </foxy-i18n>
516
+
517
+ <div class="divide-y divide-contrast-10">
518
+ ${fields.map(field => {
519
+ return html `
520
+ <div
521
+ class=${classMap({
522
+ 'h-m ml-m pr-xs flex items-center justify-between': true,
523
+ 'text-secondary': isReadonly,
524
+ 'text-disabled': isDisabled,
525
+ })}
526
+ >
527
+ ${suggestions.includes(field)
528
+ ? html `<foxy-i18n lang=${lang} key=${field} ns=${ns}></foxy-i18n>`
529
+ : html `<span>${field}</span>`}
530
+
531
+ <button
532
+ class=${classMap({
533
+ 'w-xs h-xs rounded-full transition-colors': true,
534
+ 'hover-bg-error-10 hover-text-error': !isDisabled,
535
+ 'focus-outline-none focus-ring-2 ring-inset ring-error-50': !isDisabled,
536
+ 'cursor-default': isDisabled,
537
+ 'flex': !isReadonly,
538
+ 'hidden': isReadonly,
539
+ })}
540
+ ?disabled=${isDisabled}
541
+ @click=${() => {
542
+ if (typeof config[`show_${field}`] === 'boolean') {
543
+ config[`show_${field}`] = true;
544
+ }
545
+ else {
546
+ config.hidden_product_options = config.hidden_product_options.filter(option => option !== field);
547
+ }
548
+ this.edit({ json: JSON.stringify(json) });
549
+ }}
550
+ >
551
+ <iron-icon icon="icons:close" class="icon-inline text-m m-auto"></iron-icon>
552
+ </button>
553
+ </div>
554
+ `;
555
+ })}
556
+ </div>
557
+
558
+ <div
559
+ style="border-radius: ${inputRadius.join(' ')}"
560
+ class=${classMap({
561
+ 'h-m flex items-center ring-inset ring-primary-50 focus-within-ring-2': true,
562
+ 'border-t border-contrast-10': fields.length > 0,
563
+ 'flex': !isReadonly,
564
+ 'hidden': isReadonly,
565
+ })}
566
+ >
567
+ <input
568
+ placeholder=${this.t('add_field')}
569
+ class="w-full bg-transparent appearance-none h-m px-m focus-outline-none"
570
+ list="hidden-fields-list"
571
+ .value=${live(this.__addHiddenFieldInputValue)}
572
+ ?disabled=${isDisabled}
573
+ @keydown=${(evt) => evt.key === 'Enter' && addField()}
574
+ @input=${(evt) => {
575
+ this.__addHiddenFieldInputValue = evt.currentTarget.value;
576
+ }}
577
+ />
578
+
579
+ <datalist id="hidden-fields-list">
580
+ ${suggestions
581
+ .filter(suggestion => !fields.includes(suggestion))
582
+ .map(suggestion => html `<option value=${suggestion}>${this.t(suggestion)}</option>`)}
583
+ </datalist>
584
+
585
+ <button
586
+ aria-label=${this.t('add_field')}
587
+ class=${classMap({
588
+ 'w-xs h-xs mr-xs flex-shrink-0 ring-inset ring-success-50': true,
589
+ 'flex items-center justify-center rounded-full transition-colors': true,
590
+ 'bg-contrast-5 text-disabled cursor-default': !this.__addHiddenFieldInputValue,
591
+ 'bg-success-10 text-success cursor-pointer': !!this.__addHiddenFieldInputValue,
592
+ 'hover-bg-success hover-text-success-contrast': !!this.__addHiddenFieldInputValue,
593
+ 'focus-outline-none focus-ring-2': !!this.__addHiddenFieldInputValue,
594
+ })}
595
+ ?disabled=${!this.__addHiddenFieldInputValue}
596
+ @click=${addField}
597
+ >
598
+ <iron-icon icon="icons:add" class="icon-inline text-m"></iron-icon>
599
+ </button>
600
+ </div>
601
+ </x-group>
602
+
603
+ ${this.renderTemplateOrSlot('hidden-fields:after')}
604
+ </div>
605
+ `;
606
+ }
607
+ __renderCards(json) {
608
+ const { lang, ns } = this;
609
+ const isDisabled = this.disabledSelector.matches('cards', true);
610
+ const isReadonly = this.readonlySelector.matches('cards', true);
611
+ const config = json.supported_payment_cards;
612
+ let skipForSaved;
613
+ let skipForSSO;
614
+ if (json.csc_requirements === 'all_cards') {
615
+ skipForSaved = false;
616
+ skipForSSO = false;
617
+ }
618
+ else if (json.csc_requirements === 'sso_only') {
619
+ skipForSaved = true;
620
+ skipForSSO = false;
621
+ }
622
+ else {
623
+ skipForSaved = true;
624
+ skipForSSO = true;
625
+ }
626
+ const typeToName = {
627
+ amex: 'American Express',
628
+ diners: 'Diners Club',
629
+ discover: 'Discover',
630
+ jcb: 'JCB',
631
+ maestro: 'Maestro',
632
+ mastercard: 'Mastercard',
633
+ unionpay: 'UnionPay',
634
+ visa: 'Visa',
635
+ };
636
+ return html `
637
+ <div>
638
+ ${this.renderTemplateOrSlot('cards:before')}
639
+
640
+ <div class="space-y-xs">
641
+ <x-group frame>
642
+ <foxy-i18n
643
+ class=${isDisabled ? 'text-disabled' : ''}
644
+ slot="header"
645
+ lang=${lang}
646
+ key="supported_cards"
647
+ ns=${ns}
648
+ >
649
+ </foxy-i18n>
650
+
651
+ <div class="flex flex-wrap m-xs p-s">
652
+ ${Object.entries(logos).map(([type, logo]) => {
653
+ if (!typeToName[type])
654
+ return;
655
+ const isChecked = config.includes(type);
656
+ return html `
657
+ <div
658
+ class=${classMap({
659
+ 'm-xs rounded': true,
660
+ 'opacity-50 cursor-default': isDisabled,
661
+ 'cursor-pointer ring-primary-50 focus-within-ring-2': !isDisabled,
662
+ })}
663
+ >
664
+ <label
665
+ class=${classMap({
666
+ 'overflow-hidden transition-colors flex rounded border': true,
667
+ 'border-primary bg-primary-10 text-primary': isChecked && !isReadonly,
668
+ 'border-contrast bg-contrast-5 text-secondary': isChecked && isReadonly,
669
+ 'hover-text-body': isChecked && !isDisabled && !isReadonly,
670
+ 'border-contrast-10': !isChecked,
671
+ 'hover-border-primary': !isChecked && !isDisabled && !isReadonly,
672
+ 'hover-text-primary': !isChecked && !isDisabled && !isReadonly,
673
+ })}
674
+ >
675
+ <div class="h-s">${logo}</div>
676
+
677
+ <div class="text-s font-medium mx-s my-auto leading-none">
678
+ ${typeToName[type]}
679
+ </div>
680
+
681
+ <input
682
+ type="checkbox"
683
+ class="sr-only"
684
+ ?disabled=${isDisabled}
685
+ ?checked=${isChecked}
686
+ @change=${(evt) => {
687
+ if (isReadonly)
688
+ return evt.preventDefault();
689
+ evt.stopPropagation();
690
+ if (isChecked) {
691
+ config.splice(config.indexOf(type), 1);
692
+ }
693
+ else {
694
+ config.push(type);
695
+ }
696
+ this.edit({ json: JSON.stringify(json) });
697
+ }}
698
+ />
699
+ </label>
700
+ </div>
701
+ `;
702
+ })}
703
+ </div>
704
+
705
+ <div class="flex flex-wrap p-s border-t border-contrast-10">
706
+ <x-checkbox
707
+ class="m-s"
708
+ ?disabled=${isDisabled || json.csc_requirements === 'new_cards_only'}
709
+ ?readonly=${isReadonly}
710
+ ?checked=${skipForSaved}
711
+ @change=${(evt) => {
712
+ json.csc_requirements = evt.detail ? 'sso_only' : 'all_cards';
713
+ this.edit({ json: JSON.stringify(json) });
714
+ }}
715
+ >
716
+ <foxy-i18n class="leading-s block" lang=${lang} key="skip_csc_for_saved" ns=${ns}>
717
+ </foxy-i18n>
718
+ </x-checkbox>
719
+
720
+ <x-checkbox
721
+ class="m-s"
722
+ ?disabled=${isDisabled}
723
+ ?readonly=${isReadonly}
724
+ ?checked=${skipForSSO}
725
+ @change=${(evt) => {
726
+ json.csc_requirements = evt.detail
727
+ ? 'new_cards_only'
728
+ : skipForSaved
729
+ ? 'sso_only'
730
+ : 'all_cards';
731
+ this.edit({ json: JSON.stringify(json) });
732
+ }}
733
+ >
734
+ <foxy-i18n class="leading-s block" lang=${lang} key="skip_csc_for_sso" ns=${ns}>
735
+ </foxy-i18n>
736
+ </x-checkbox>
737
+ </div>
738
+ </x-group>
739
+
740
+ <foxy-i18n
741
+ class="text-xs leading-s block ${isDisabled ? 'text-disabled' : 'text-secondary'}"
742
+ lang=${lang}
743
+ key="supported_cards_disclaimer"
744
+ ns=${ns}
745
+ >
746
+ </foxy-i18n>
747
+ </div>
748
+
749
+ ${this.renderTemplateOrSlot('cards:after')}
750
+ </div>
751
+ `;
752
+ }
753
+ __renderCheckoutType(json) {
754
+ const { lang, ns } = this;
755
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('checkout-type', true);
756
+ const isReadonly = this.readonlySelector.matches('checkout-type', true);
757
+ return html `
758
+ <div data-testid="checkout-type">
759
+ ${this.renderTemplateOrSlot('checkout-type:before')}
760
+
761
+ <div class="space-y-xs">
762
+ <x-group frame>
763
+ <foxy-i18n
764
+ class=${isDisabled ? 'text-disabled' : ''}
765
+ slot="header"
766
+ lang=${lang}
767
+ key="checkout_type"
768
+ ns=${ns}
769
+ >
770
+ </foxy-i18n>
771
+
772
+ <x-choice
773
+ data-testid="checkout-type-choice"
774
+ ?disabled=${isDisabled}
775
+ ?readonly=${isReadonly}
776
+ .items=${['default_account', 'default_guest', 'guest_only', 'account_only']}
777
+ .value=${json.checkout_type}
778
+ .getText=${(item) => this.t(`checkout_type_${item}`)}
779
+ @change=${(evt) => {
780
+ json.checkout_type = evt.detail;
781
+ this.edit({ json: JSON.stringify(json) });
782
+ }}
783
+ >
784
+ </x-choice>
785
+ </x-group>
786
+
787
+ <foxy-i18n
788
+ class="text-xs leading-s block ${isDisabled ? 'text-disabled' : 'text-secondary'}"
789
+ lang=${lang}
790
+ key="checkout_type_helper_text"
791
+ ns=${ns}
792
+ >
793
+ </foxy-i18n>
794
+ </div>
795
+
796
+ ${this.renderTemplateOrSlot('checkout-type:after')}
797
+ </div>
798
+ `;
799
+ }
800
+ __renderConsent(json) {
801
+ const { lang, ns } = this;
802
+ const tosConfig = json.tos_checkbox_settings;
803
+ const mailConfig = json.newsletter_subscribe;
804
+ const sdtaConfig = json.eu_secure_data_transfer_consent;
805
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('consent', true);
806
+ const isReadonly = this.readonlySelector.matches('consent', true);
807
+ const dividerStyle = 'margin-left: calc(1.125rem + (var(--lumo-space-m) * 2))';
808
+ return html `
809
+ <div data-testid="consent">
810
+ ${this.renderTemplateOrSlot('consent:before')}
811
+
812
+ <x-group frame>
813
+ <foxy-i18n
814
+ class=${isDisabled ? 'text-disabled' : ''}
815
+ slot="header"
816
+ lang=${lang}
817
+ key="consent"
818
+ ns=${ns}
819
+ >
820
+ </foxy-i18n>
821
+
822
+ <x-checkbox
823
+ data-testid="consent-tos-check"
824
+ ?disabled=${isDisabled}
825
+ ?readonly=${isReadonly}
826
+ ?checked=${tosConfig.usage === 'required' || tosConfig.usage === 'optional'}
827
+ class="m-m"
828
+ @change=${(evt) => {
829
+ tosConfig.initial_state = evt.detail ? tosConfig.initial_state : 'unchecked';
830
+ tosConfig.is_hidden = false;
831
+ tosConfig.usage = evt.detail ? 'required' : 'none';
832
+ tosConfig.url = evt.detail ? tosConfig.url : '';
833
+ this.edit({ json: JSON.stringify(json) });
834
+ }}
835
+ >
836
+ <div class="flex flex-col">
837
+ <foxy-i18n lang=${lang} key="display_tos_link" ns=${ns}></foxy-i18n>
838
+ <foxy-i18n
839
+ class="text-xs leading-s ${isDisabled ? 'text-disabled' : 'text-secondary'}"
840
+ lang=${lang}
841
+ key="display_tos_link_explainer"
842
+ ns=${ns}
843
+ >
844
+ </foxy-i18n>
845
+ </div>
846
+
847
+ <div slot="content" ?hidden=${tosConfig.usage === 'none'}>
848
+ <vaadin-text-field
849
+ data-testid="consent-tos-field"
850
+ label=${this.t('location_url')}
851
+ class="w-full mt-m"
852
+ placeholder="https://example.com/path/to/tos"
853
+ clear-button-visible
854
+ ?disabled=${isDisabled}
855
+ ?readonly=${isReadonly}
856
+ .value=${tosConfig.url}
857
+ @input=${(evt) => {
858
+ tosConfig.url = evt.currentTarget.value;
859
+ this.edit({ json: JSON.stringify(json) });
860
+ }}
861
+ >
862
+ </vaadin-text-field>
863
+
864
+ <div class="flex flex-wrap -mx-s -mb-s mt-s">
865
+ <x-checkbox
866
+ data-testid="consent-tos-require-check"
867
+ class="m-s"
868
+ ?disabled=${isDisabled}
869
+ ?readonly=${isReadonly}
870
+ ?checked=${tosConfig.usage === 'required'}
871
+ @change=${(evt) => {
872
+ tosConfig.usage = evt.detail ? 'required' : 'optional';
873
+ this.edit({ json: JSON.stringify(json) });
874
+ }}
875
+ >
876
+ <foxy-i18n class="leading-s block" lang=${lang} key="require_consent" ns=${ns}>
877
+ </foxy-i18n>
878
+ </x-checkbox>
879
+
880
+ <x-checkbox
881
+ data-testid="consent-tos-state-check"
882
+ class="m-s"
883
+ ?disabled=${isDisabled}
884
+ ?readonly=${isReadonly}
885
+ ?checked=${tosConfig.initial_state === 'checked'}
886
+ @change=${(evt) => {
887
+ tosConfig.initial_state = evt.detail ? 'checked' : 'unchecked';
888
+ this.edit({ json: JSON.stringify(json) });
889
+ }}
890
+ >
891
+ <foxy-i18n class="leading-s block" lang=${lang} key="checked_by_default" ns=${ns}>
892
+ </foxy-i18n>
893
+ </x-checkbox>
894
+ </div>
895
+ </div>
896
+ </x-checkbox>
897
+
898
+ <div style=${dividerStyle} class="border-b border-contrast-10"></div>
899
+
900
+ <x-checkbox
901
+ data-testid="consent-mail-check"
902
+ ?disabled=${isDisabled}
903
+ ?readonly=${isReadonly}
904
+ ?checked=${mailConfig.usage === 'required'}
905
+ class="m-m"
906
+ @change=${(evt) => {
907
+ mailConfig.usage = evt.detail ? 'required' : 'none';
908
+ this.edit({ json: JSON.stringify(json) });
909
+ }}
910
+ >
911
+ <div class="flex flex-col">
912
+ <foxy-i18n lang=${lang} key="newsletter_subscribe" ns=${ns}></foxy-i18n>
913
+ <foxy-i18n
914
+ class="text-xs leading-s ${isDisabled ? 'text-disabled' : 'text-secondary'}"
915
+ lang=${lang}
916
+ key="newsletter_subscribe_explainer"
917
+ ns=${ns}
918
+ >
919
+ </foxy-i18n>
920
+ </div>
921
+ </x-checkbox>
922
+
923
+ <div style=${dividerStyle} class="border-b border-contrast-10"></div>
924
+
925
+ <x-checkbox
926
+ data-testid="consent-sdta-check"
927
+ ?disabled=${isDisabled}
928
+ ?readonly=${isReadonly}
929
+ ?checked=${sdtaConfig.usage === 'required'}
930
+ class="m-m"
931
+ @change=${(evt) => {
932
+ sdtaConfig.usage = evt.detail ? 'required' : 'none';
933
+ this.edit({ json: JSON.stringify(json) });
934
+ }}
935
+ >
936
+ <div class="flex flex-col">
937
+ <foxy-i18n lang=${lang} key="display_sdta" ns=${ns}></foxy-i18n>
938
+ <foxy-i18n
939
+ class="text-xs leading-s ${isDisabled ? 'text-disabled' : 'text-secondary'}"
940
+ lang=${lang}
941
+ key="display_sdta_explainer"
942
+ ns=${ns}
943
+ >
944
+ </foxy-i18n>
945
+ </div>
946
+ </x-checkbox>
947
+ </x-group>
948
+
949
+ ${this.renderTemplateOrSlot('consent:after')}
950
+ </div>
951
+ `;
952
+ }
953
+ __renderFields(json) {
954
+ const { lang, ns } = this;
955
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('fields', true);
956
+ const isReadonly = this.readonlySelector.matches('fields', true);
957
+ const config = json.custom_checkout_field_requirements;
958
+ const options = {
959
+ cart_controls: ['enabled', 'disabled'],
960
+ coupon_entry: ['enabled', 'disabled'],
961
+ billing_first_name: ['default', 'optional', 'required', 'hidden'],
962
+ billing_last_name: ['default', 'optional', 'required', 'hidden'],
963
+ billing_company: ['default', 'optional', 'required', 'hidden'],
964
+ billing_tax_id: ['default', 'optional', 'required', 'hidden'],
965
+ billing_phone: ['default', 'optional', 'required', 'hidden'],
966
+ billing_address1: ['default', 'optional', 'required', 'hidden'],
967
+ billing_address2: ['default', 'optional', 'required', 'hidden'],
968
+ billing_city: ['default', 'optional', 'required', 'hidden'],
969
+ billing_region: ['default', 'optional', 'required', 'hidden'],
970
+ billing_postal_code: ['default', 'optional', 'required', 'hidden'],
971
+ billing_country: ['default', 'optional', 'required', 'hidden'],
972
+ };
973
+ return html `
974
+ <div data-testid="fields">
975
+ ${this.renderTemplateOrSlot('fields:before')}
976
+
977
+ <x-group frame>
978
+ <foxy-i18n
979
+ class=${isDisabled ? 'text-disabled' : ''}
980
+ slot="header"
981
+ lang=${lang}
982
+ key="field_plural"
983
+ ns=${ns}
984
+ >
985
+ </foxy-i18n>
986
+
987
+ <div class="bg-contrast-10 grid grid-cols-1 md-grid-cols-2" style="gap: 1px">
988
+ ${Object.entries(options).map(([property, values]) => {
989
+ return html `
990
+ <label
991
+ class=${classMap({
992
+ 'flex items-center pl-m bg-base': true,
993
+ 'text-secondary': isReadonly,
994
+ 'text-disabled': isDisabled,
995
+ })}
996
+ >
997
+ <foxy-i18n
998
+ class="flex-1"
999
+ lang=${lang}
1000
+ key=${property.replace('billing_', '')}
1001
+ ns=${ns}
1002
+ >
1003
+ </foxy-i18n>
1004
+
1005
+ <div
1006
+ class=${classMap({
1007
+ 'flex items-center text-right font-medium h-s px-s m-xs': isReadonly,
1008
+ 'hidden': !isReadonly,
1009
+ })}
1010
+ >
1011
+ ${this.t(values.find(value => config[property] === value))}
1012
+ </div>
1013
+
1014
+ <div
1015
+ class=${classMap({
1016
+ 'px-s m-xs flex items-center rounded leading-none': true,
1017
+ 'ring-primary-50 ring-inset focus-within-ring-2': !isDisabled,
1018
+ 'hover-text-primary': !isDisabled,
1019
+ 'cursor-pointer': !isDisabled,
1020
+ 'cursor-default': isDisabled,
1021
+ 'flex': !isReadonly,
1022
+ 'hidden': isReadonly,
1023
+ })}
1024
+ >
1025
+ <select
1026
+ data-testid="fields-${property}"
1027
+ class=${classMap({
1028
+ 'h-s mr-xs text-right appearance-none bg-transparent font-medium': true,
1029
+ 'focus-outline-none cursor-pointer': !isDisabled,
1030
+ 'cursor-default': isDisabled,
1031
+ })}
1032
+ ?disabled=${isDisabled}
1033
+ ?readonly=${isReadonly}
1034
+ @change=${(evt) => {
1035
+ const select = evt.currentTarget;
1036
+ const value = select.options[select.options.selectedIndex].value;
1037
+ config[property] = value;
1038
+ this.edit({ json: JSON.stringify(json) });
1039
+ }}
1040
+ >
1041
+ ${values.map(value => {
1042
+ return html `
1043
+ <option
1044
+ value=${value}
1045
+ ?selected=${config[property] === value}
1046
+ >
1047
+ ${this.t(value)}
1048
+ </option>
1049
+ `;
1050
+ })}
1051
+ </select>
1052
+
1053
+ <iron-icon
1054
+ class="pointer-events-none icon-inline text-xl"
1055
+ icon="icons:expand-more"
1056
+ >
1057
+ </iron-icon>
1058
+ </div>
1059
+ </label>
1060
+ `;
1061
+ })}
1062
+
1063
+ <div class="bg-base hidden md-block"></div>
1064
+ </div>
1065
+ </x-group>
1066
+
1067
+ ${this.renderTemplateOrSlot('fields:after')}
1068
+ </div>
1069
+ `;
1070
+ }
1071
+ __renderGoogleAnalytics(json) {
1072
+ const { lang, ns } = this;
1073
+ const config = json.analytics_config;
1074
+ const sioConfig = config.segment_io;
1075
+ const gaConfig = config.google_analytics;
1076
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('google-analytics', true);
1077
+ const isReadonly = this.readonlySelector.matches('google-analytics', true);
1078
+ return html `
1079
+ <div data-testid="google-analytics">
1080
+ ${this.renderTemplateOrSlot('google-analytics:before')}
1081
+
1082
+ <x-group frame>
1083
+ <span class=${isDisabled ? 'text-disabled' : ''} slot="header">Google Analytics</span>
1084
+
1085
+ <div class="p-m space-y-m">
1086
+ <vaadin-text-field
1087
+ data-testid="google-analytics-field"
1088
+ class="w-full"
1089
+ label=${this.t('ga_account_id')}
1090
+ placeholder="UA-1234567-1"
1091
+ helper-text=${this.t('ga_account_id_explainer')}
1092
+ .value=${live(gaConfig.account_id)}
1093
+ ?disabled=${isDisabled}
1094
+ ?readonly=${isReadonly}
1095
+ clear-button-visible
1096
+ @keydown=${(evt) => evt.key === 'Enter' && this.submit()}
1097
+ @input=${(evt) => {
1098
+ gaConfig.account_id = evt.currentTarget.value;
1099
+ gaConfig.usage = gaConfig.account_id ? 'required' : 'none';
1100
+ config.usage = gaConfig.account_id || sioConfig.account_id ? 'required' : 'none';
1101
+ this.edit({ json: JSON.stringify(json) });
1102
+ }}
1103
+ >
1104
+ </vaadin-text-field>
1105
+
1106
+ <x-checkbox
1107
+ data-testid="google-analytics-check"
1108
+ ?disabled=${isDisabled}
1109
+ ?readonly=${isReadonly}
1110
+ ?checked=${gaConfig.include_on_site}
1111
+ @change=${(evt) => {
1112
+ gaConfig.include_on_site = evt.detail;
1113
+ this.edit({ json: JSON.stringify(json) });
1114
+ }}
1115
+ >
1116
+ <div class="flex flex-col">
1117
+ <foxy-i18n lang=${lang} key="ga_include_on_site" ns=${ns}></foxy-i18n>
1118
+ <foxy-i18n
1119
+ class="text-xs leading-s ${isDisabled ? 'text-disabled' : 'text-secondary'}"
1120
+ lang=${lang}
1121
+ key="ga_include_on_site_explainer"
1122
+ ns=${ns}
1123
+ >
1124
+ </foxy-i18n>
1125
+ </div>
1126
+ </x-checkbox>
1127
+ </div>
1128
+ </x-group>
1129
+
1130
+ ${this.renderTemplateOrSlot('google-analytics:after')}
1131
+ </div>
1132
+ `;
1133
+ }
1134
+ __renderSegmentIo(json) {
1135
+ const config = json.analytics_config;
1136
+ const sioConfig = config.segment_io;
1137
+ const gaConfig = config.google_analytics;
1138
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('segment-io', true);
1139
+ const isReadonly = this.readonlySelector.matches('segment-io', true);
1140
+ return html `
1141
+ <div data-testid="segment-io">
1142
+ ${this.renderTemplateOrSlot('segment-io:before')}
1143
+
1144
+ <x-group frame>
1145
+ <span class=${isDisabled ? 'text-disabled' : ''} slot="header">Segment.io</span>
1146
+
1147
+ <div class="p-m">
1148
+ <vaadin-text-field
1149
+ data-testid="segment-io-field"
1150
+ class="w-full"
1151
+ label=${this.t('sio_account_id')}
1152
+ placeholder="MY-WRITE-KEY"
1153
+ helper-text=${this.t('sio_account_id_explainer')}
1154
+ .value=${live(sioConfig.account_id)}
1155
+ ?disabled=${isDisabled}
1156
+ ?readonly=${isReadonly}
1157
+ clear-button-visible
1158
+ @keydown=${(evt) => evt.key === 'Enter' && this.submit()}
1159
+ @input=${(evt) => {
1160
+ sioConfig.account_id = evt.currentTarget.value;
1161
+ sioConfig.usage = sioConfig.account_id ? 'required' : 'none';
1162
+ config.usage = gaConfig.account_id || sioConfig.account_id ? 'required' : 'none';
1163
+ this.edit({ json: JSON.stringify(json) });
1164
+ }}
1165
+ >
1166
+ </vaadin-text-field>
1167
+ </div>
1168
+ </x-group>
1169
+
1170
+ ${this.renderTemplateOrSlot('segment-io:after')}
1171
+ </div>
1172
+ `;
1173
+ }
1174
+ __renderTroubleshooting(json) {
1175
+ const { lang, ns } = this;
1176
+ const config = json.debug;
1177
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches('troubleshooting', true);
1178
+ const isReadonly = this.readonlySelector.matches('troubleshooting', true);
1179
+ return html `
1180
+ <div data-testid="troubleshooting">
1181
+ ${this.renderTemplateOrSlot('troubleshooting:before')}
1182
+
1183
+ <x-group frame>
1184
+ <foxy-i18n
1185
+ class=${isDisabled ? 'text-disabled' : ''}
1186
+ slot="header"
1187
+ lang=${lang}
1188
+ key="troubleshooting"
1189
+ ns=${ns}
1190
+ >
1191
+ </foxy-i18n>
1192
+
1193
+ <div class="p-m space-y-m">
1194
+ <x-checkbox
1195
+ data-testid="troubleshooting-check"
1196
+ ?disabled=${isDisabled}
1197
+ ?readonly=${isReadonly}
1198
+ ?checked=${config.usage === 'required'}
1199
+ @change=${(evt) => {
1200
+ config.usage = evt.detail ? 'required' : 'none';
1201
+ this.edit({ json: JSON.stringify(json) });
1202
+ }}
1203
+ >
1204
+ <div class="flex flex-col">
1205
+ <foxy-i18n lang=${lang} key="troubleshooting_debug" ns=${ns}></foxy-i18n>
1206
+ <foxy-i18n
1207
+ class="text-xs leading-s ${isDisabled ? 'text-disabled' : 'text-secondary'}"
1208
+ lang=${lang}
1209
+ key="troubleshooting_debug_explainer"
1210
+ ns=${ns}
1211
+ >
1212
+ </foxy-i18n>
1213
+ </div>
1214
+ </x-checkbox>
1215
+ </div>
1216
+ </x-group>
1217
+
1218
+ ${this.renderTemplateOrSlot('troubleshooting:after')}
1219
+ </div>
1220
+ `;
1221
+ }
1222
+ __renderCustomConfig(json) {
1223
+ return html `
1224
+ <div data-testid="custom-config">
1225
+ ${this.renderTemplateOrSlot('custom-config:before')}
1226
+
1227
+ <vaadin-text-area
1228
+ data-testid="custom-config-field"
1229
+ class="w-full"
1230
+ label=${this.t('custom_config')}
1231
+ placeholder='{ "key": "value" }'
1232
+ helper-text=${this.t('custom_config_helper_text')}
1233
+ .value=${json.custom_config ? JSON.stringify(json.custom_config, null, 2) : ''}
1234
+ ?disabled=${!this.in('idle') || this.disabledSelector.matches('custom-config', true)}
1235
+ ?readonly=${this.readonlySelector.matches('custom-config', true)}
1236
+ @input=${(evt) => {
1237
+ const input = evt.currentTarget;
1238
+ try {
1239
+ json.custom_config = input.value ? JSON.parse(input.value) : '';
1240
+ this.edit({ json: JSON.stringify(json) });
1241
+ input.invalid = false;
1242
+ }
1243
+ catch (_a) {
1244
+ input.invalid = true;
1245
+ }
1246
+ }}
1247
+ >
1248
+ </vaadin-text-area>
1249
+
1250
+ ${this.renderTemplateOrSlot('custom-config:after')}
1251
+ </div>
1252
+ `;
1253
+ }
1254
+ __renderHeader(json) {
1255
+ return html `
1256
+ <div data-testid="header">
1257
+ ${this.renderTemplateOrSlot('header:before')}
1258
+
1259
+ <vaadin-text-area
1260
+ data-testid="header-field"
1261
+ class="w-full"
1262
+ label=${this.t('custom_header')}
1263
+ helper-text=${this.t('custom_header_helper_text')}
1264
+ .value=${json.custom_script_values.header}
1265
+ ?disabled=${!this.in('idle') || this.disabledSelector.matches('header', true)}
1266
+ ?readonly=${this.readonlySelector.matches('header', true)}
1267
+ @input=${(evt) => {
1268
+ const target = evt.currentTarget;
1269
+ const newConfig = {
1270
+ ...json.custom_script_values,
1271
+ header: target.value,
1272
+ };
1273
+ this.edit({ json: JSON.stringify({ ...json, custom_script_values: newConfig }) });
1274
+ }}
1275
+ >
1276
+ </vaadin-text-area>
1277
+
1278
+ ${this.renderTemplateOrSlot('header:after')}
1279
+ </div>
1280
+ `;
1281
+ }
1282
+ __renderCustomFields(json) {
1283
+ return html `
1284
+ <div data-testid="custom-fields">
1285
+ ${this.renderTemplateOrSlot('custom-fields:before')}
1286
+
1287
+ <vaadin-text-area
1288
+ data-testid="custom-fields-field"
1289
+ class="w-full"
1290
+ label=${this.t('custom_fields')}
1291
+ helper-text=${this.t('custom_fields_helper_text')}
1292
+ .value=${json.custom_script_values.checkout_fields}
1293
+ ?disabled=${!this.in('idle') || this.disabledSelector.matches('custom-fields', true)}
1294
+ ?readonly=${this.readonlySelector.matches('custom-fields', true)}
1295
+ @input=${(evt) => {
1296
+ const newValue = evt.currentTarget.value;
1297
+ json.custom_script_values.checkout_fields = newValue;
1298
+ this.edit({ json: JSON.stringify(json) });
1299
+ }}
1300
+ >
1301
+ </vaadin-text-area>
1302
+
1303
+ ${this.renderTemplateOrSlot('custom-fields:after')}
1304
+ </div>
1305
+ `;
1306
+ }
1307
+ __renderFooter(json) {
1308
+ return html `
1309
+ <div data-testid="footer">
1310
+ ${this.renderTemplateOrSlot('footer:before')}
1311
+
1312
+ <vaadin-text-area
1313
+ data-testid="footer-field"
1314
+ class="w-full"
1315
+ label=${this.t('custom_footer')}
1316
+ helper-text=${this.t('custom_footer_helper_text')}
1317
+ .value=${json.custom_script_values.footer}
1318
+ ?disabled=${!this.in('idle') || this.disabledSelector.matches('footer', true)}
1319
+ ?readonly=${this.readonlySelector.matches('footer', true)}
1320
+ @input=${(evt) => {
1321
+ const target = evt.currentTarget;
1322
+ const newConfig = {
1323
+ ...json.custom_script_values,
1324
+ footer: target.value,
1325
+ };
1326
+ this.edit({ json: JSON.stringify({ ...json, custom_script_values: newConfig }) });
1327
+ }}
1328
+ >
1329
+ </vaadin-text-area>
1330
+
1331
+ ${this.renderTemplateOrSlot('footer:after')}
1332
+ </div>
1333
+ `;
1334
+ }
1335
+ }
1336
+ //# sourceMappingURL=TemplateConfigForm.js.map