@foxy.io/elements 1.14.0-beta.1 → 1.14.0-beta.5

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 (156) 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 +10 -10
  17. package/dist/cdn/foxy-customer-portal.js +2 -2
  18. package/dist/cdn/foxy-customer.js +1 -1
  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 +14 -0
  40. package/dist/cdn/foxy-template-form.js +1 -1
  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-0ced76a0.js +358 -0
  47. package/dist/cdn/{shared-151ca103.js → shared-10bdb6b9.js} +1 -1
  48. package/dist/cdn/{shared-99f45065.js → shared-1469c1c4.js} +1 -1
  49. package/dist/cdn/shared-166c44ae.js +264 -0
  50. package/dist/cdn/{shared-f4119f12.js → shared-16f72e27.js} +1 -1
  51. package/dist/cdn/shared-1761daef.js +15 -0
  52. package/dist/cdn/{shared-e057788f.js → shared-1b7e65e4.js} +1 -1
  53. package/dist/cdn/{shared-5fedf5e4.js → shared-200f613b.js} +2 -2
  54. package/dist/cdn/{shared-6783c996.js → shared-2174bcd4.js} +1 -1
  55. package/dist/cdn/{shared-4059f633.js → shared-218ba06e.js} +1 -1
  56. package/dist/cdn/{shared-e9920617.js → shared-34b2c1e2.js} +1 -1
  57. package/dist/cdn/shared-396320f9.js +314 -0
  58. package/dist/cdn/{shared-566252ac.js → shared-3d868b17.js} +1 -1
  59. package/dist/cdn/{shared-cf248335.js → shared-44cfc617.js} +1 -1
  60. package/dist/cdn/{shared-45d647e4.js → shared-46ee137f.js} +1 -1
  61. package/dist/cdn/shared-4a52d9b5.js +1 -0
  62. package/dist/cdn/{shared-f0199313.js → shared-593f7e2c.js} +1 -1
  63. package/dist/cdn/shared-59e44f29.js +1 -0
  64. package/dist/cdn/{shared-cd700eac.js → shared-60126eee.js} +1 -1
  65. package/dist/cdn/{shared-dbbe03f9.js → shared-614e1a4e.js} +1 -1
  66. package/dist/cdn/{shared-17968c53.js → shared-63eaded9.js} +3 -3
  67. package/dist/cdn/shared-6b7602c7.js +1 -0
  68. package/dist/cdn/{shared-98ee7fad.js → shared-6d45a07b.js} +1 -1
  69. package/dist/cdn/shared-75ce6e43.js +1 -0
  70. package/dist/cdn/shared-782bf922.js +1 -0
  71. package/dist/cdn/{shared-5d286626.js → shared-7a39a41f.js} +1 -1
  72. package/dist/cdn/{shared-35415106.js → shared-87190eae.js} +1 -1
  73. package/dist/cdn/{shared-84fa75d9.js → shared-9221e6b2.js} +1 -1
  74. package/dist/cdn/{shared-2860a3d3.js → shared-94b0ae99.js} +2 -2
  75. package/dist/cdn/shared-9d779f46.js +1 -0
  76. package/dist/cdn/shared-a46edf4b.js +1 -0
  77. package/dist/cdn/{shared-54702b33.js → shared-b0f0e8b5.js} +1 -1
  78. package/dist/cdn/{shared-ed4ed7a5.js → shared-b710881a.js} +2 -2
  79. package/dist/cdn/{shared-3ae39e52.js → shared-bb824ab4.js} +3 -3
  80. package/dist/cdn/shared-d94ffc2b.js +1 -0
  81. package/dist/cdn/shared-df573cea.js +12 -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-f2a4fd27.js → shared-fb90e05c.js} +1 -1
  86. package/dist/cdn/{shared-747b0842.js → shared-ff79f3f9.js} +1 -1
  87. package/dist/cdn/translations/shared/en.json +56 -3
  88. package/dist/elements/private/Choice/Choice.js +3 -3
  89. package/dist/elements/private/Choice/Choice.js.map +1 -1
  90. package/dist/elements/private/Group/Group.js +1 -1
  91. package/dist/elements/private/Group/Group.js.map +1 -1
  92. package/dist/elements/private/I18N/I18N.js +1 -1
  93. package/dist/elements/private/I18N/I18N.js.map +1 -1
  94. package/dist/elements/public/AddressForm/AddressForm.js +8 -4
  95. package/dist/elements/public/AddressForm/AddressForm.js.map +1 -1
  96. package/dist/elements/public/AttributeForm/AttributeForm.js +8 -4
  97. package/dist/elements/public/AttributeForm/AttributeForm.js.map +1 -1
  98. package/dist/elements/public/CustomFieldForm/CustomFieldForm.js +8 -4
  99. package/dist/elements/public/CustomFieldForm/CustomFieldForm.js.map +1 -1
  100. package/dist/elements/public/CustomerForm/CustomerForm.js +8 -4
  101. package/dist/elements/public/CustomerForm/CustomerForm.js.map +1 -1
  102. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.d.ts +24 -0
  103. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.js +311 -0
  104. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.js.map +1 -0
  105. package/dist/elements/public/EmailTemplateForm/index.d.ts +9 -0
  106. package/dist/elements/public/EmailTemplateForm/index.js +11 -0
  107. package/dist/elements/public/EmailTemplateForm/index.js.map +1 -0
  108. package/dist/elements/public/EmailTemplateForm/types.d.ts +3 -0
  109. package/dist/elements/public/EmailTemplateForm/types.js +2 -0
  110. package/dist/elements/public/EmailTemplateForm/types.js.map +1 -0
  111. package/dist/elements/public/ItemsForm/ItemsForm.js +2 -2
  112. package/dist/elements/public/ItemsForm/ItemsForm.js.map +1 -1
  113. package/dist/elements/public/NucleonElement/serveFromCache.js +1 -0
  114. package/dist/elements/public/NucleonElement/serveFromCache.js.map +1 -1
  115. package/dist/elements/public/TaxForm/TaxForm.js +8 -4
  116. package/dist/elements/public/TaxForm/TaxForm.js.map +1 -1
  117. package/dist/elements/public/TemplateConfigForm/CountriesList.d.ts +23 -0
  118. package/dist/elements/public/TemplateConfigForm/CountriesList.js +129 -0
  119. package/dist/elements/public/TemplateConfigForm/CountriesList.js.map +1 -0
  120. package/dist/elements/public/TemplateConfigForm/CountryCard.d.ts +20 -0
  121. package/dist/elements/public/TemplateConfigForm/CountryCard.js +125 -0
  122. package/dist/elements/public/TemplateConfigForm/CountryCard.js.map +1 -0
  123. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.d.ts +29 -0
  124. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js +700 -0
  125. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js.map +1 -0
  126. package/dist/elements/public/TemplateConfigForm/defaults.d.ts +2 -0
  127. package/dist/elements/public/TemplateConfigForm/defaults.js +95 -0
  128. package/dist/elements/public/TemplateConfigForm/defaults.js.map +1 -0
  129. package/dist/elements/public/TemplateConfigForm/index.d.ts +9 -0
  130. package/dist/elements/public/TemplateConfigForm/index.js +11 -0
  131. package/dist/elements/public/TemplateConfigForm/index.js.map +1 -0
  132. package/dist/elements/public/TemplateConfigForm/types.d.ts +116 -0
  133. package/dist/elements/public/TemplateConfigForm/types.js +2 -0
  134. package/dist/elements/public/TemplateConfigForm/types.js.map +1 -0
  135. package/dist/elements/public/TemplateForm/TemplateForm.js +10 -6
  136. package/dist/elements/public/TemplateForm/TemplateForm.js.map +1 -1
  137. package/dist/elements/public/index.d.ts +2 -0
  138. package/dist/elements/public/index.defined.d.ts +2 -0
  139. package/dist/elements/public/index.defined.js +2 -0
  140. package/dist/elements/public/index.defined.js.map +1 -1
  141. package/dist/elements/public/index.js +2 -0
  142. package/dist/elements/public/index.js.map +1 -1
  143. package/dist/mixins/themeable.js +86 -12
  144. package/dist/mixins/themeable.js.map +1 -1
  145. package/package.json +2 -7
  146. package/dist/cdn/shared-35502e88.js +0 -1
  147. package/dist/cdn/shared-50744508.js +0 -15
  148. package/dist/cdn/shared-5388f705.js +0 -1
  149. package/dist/cdn/shared-7f588649.js +0 -1
  150. package/dist/cdn/shared-9467cb31.js +0 -572
  151. package/dist/cdn/shared-b98f88c9.js +0 -369
  152. package/dist/cdn/shared-c0161e6a.js +0 -1
  153. package/dist/cdn/shared-dbcffd8e.js +0 -1
  154. package/dist/cdn/shared-e21a2aac.js +0 -1
  155. package/dist/cdn/shared-ebbef842.js +0 -1
  156. package/dist/cdn/shared-fd5b81be.js +0 -1
@@ -0,0 +1,700 @@
1
+ import { ChoiceChangeEvent } from "../../private/events.js";
2
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
3
+ import { html } from 'lit-html';
4
+ import { Checkbox } from "../../private/Checkbox/Checkbox.js";
5
+ import { Choice } from "../../private/Choice/Choice.js";
6
+ import { ConfigurableMixin } from "../../../mixins/configurable.js";
7
+ import { CountriesList } from "./CountriesList.js";
8
+ import { Group } from "../../private/Group/Group.js";
9
+ import { NucleonElement } from "../NucleonElement/NucleonElement.js";
10
+ import { ResponsiveMixin } from "../../../mixins/responsive.js";
11
+ import { ThemeableMixin } from "../../../mixins/themeable.js";
12
+ import { TranslatableMixin } from "../../../mixins/translatable.js";
13
+ import { classMap } from "../../../utils/class-map.js";
14
+ import { getDefaultJSON } from "./defaults.js";
15
+ import { live } from 'lit-html/directives/live';
16
+ const NS = 'template-config-form';
17
+ const Base = ScopedElementsMixin(ResponsiveMixin(ConfigurableMixin(ThemeableMixin(TranslatableMixin(NucleonElement, NS)))));
18
+ export class TemplateConfigForm extends Base {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.countries = '';
22
+ this.regions = '';
23
+ this.__addHiddenFieldInputValue = '';
24
+ }
25
+ static get scopedElements() {
26
+ return {
27
+ 'vaadin-text-field': customElements.get('vaadin-text-field'),
28
+ 'vaadin-text-area': customElements.get('vaadin-text-area'),
29
+ 'iron-icon': customElements.get('iron-icon'),
30
+ 'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),
31
+ 'foxy-spinner': customElements.get('foxy-spinner'),
32
+ 'foxy-i18n': customElements.get('foxy-i18n'),
33
+ 'x-countries-list': CountriesList,
34
+ 'x-checkbox': Checkbox,
35
+ 'x-choice': Choice,
36
+ 'x-group': Group,
37
+ };
38
+ }
39
+ static get properties() {
40
+ return {
41
+ ...super.properties,
42
+ __addHiddenFieldInputValue: { attribute: false },
43
+ countries: { type: String },
44
+ regions: { type: String },
45
+ };
46
+ }
47
+ render() {
48
+ var _a, _b;
49
+ const hidden = this.hiddenControls;
50
+ const json = this.form.json ? JSON.parse(this.form.json) : getDefaultJSON();
51
+ return html `
52
+ <div class="relative" aria-busy=${this.in('busy')} aria-live="polite">
53
+ <div
54
+ class=${classMap({
55
+ 'space-y-l transition-opacity': true,
56
+ 'opacity-50': !this.in('idle'),
57
+ })}
58
+ >
59
+ ${hidden.matches('cart-type', true) ? '' : this.__renderCartType(json)}
60
+ ${hidden.matches('foxycomplete', true) ? '' : this.__renderFoxycomplete(json)}
61
+ ${hidden.matches('locations', true) ? '' : this.__renderLocations(json)}
62
+ ${hidden.matches('hidden-fields', true) ? '' : this.__renderHiddenFields(json)}
63
+ ${hidden.matches('google-analytics', true) ? '' : this.__renderGoogleAnalytics(json)}
64
+ ${hidden.matches('segment-io', true) ? '' : this.__renderSegmentIo(json)}
65
+ ${hidden.matches('troubleshooting', true) ? '' : this.__renderTroubleshooting(json)}
66
+ ${hidden.matches('custom-config', true) ? '' : this.__renderCustomConfig(json)}
67
+ ${hidden.matches('header', true) ? '' : this.__renderHeader(json)}
68
+ ${hidden.matches('footer', true) ? '' : this.__renderFooter(json)}
69
+ </div>
70
+
71
+ <div
72
+ class=${classMap({
73
+ 'transition duration-500 ease-in-out absolute inset-0 flex': true,
74
+ 'opacity-0 pointer-events-none': this.in('idle'),
75
+ })}
76
+ >
77
+ <foxy-spinner
78
+ layout="vertical"
79
+ class="m-auto p-m bg-base shadow-xs rounded-t-l rounded-b-l"
80
+ state=${this.in('fail') ? 'error' : 'busy'}
81
+ lang=${this.lang}
82
+ ns="${this.ns} ${(_b = (_a = customElements.get('foxy-spinner')) === null || _a === void 0 ? void 0 : _a.defaultNS) !== null && _b !== void 0 ? _b : ''}"
83
+ >
84
+ </foxy-spinner>
85
+ </div>
86
+ </div>
87
+ `;
88
+ }
89
+ __renderCartType(json) {
90
+ const { lang, ns } = this;
91
+ const items = ['default', 'fullpage', 'custom'];
92
+ return html `
93
+ <div>
94
+ ${this.renderTemplateOrSlot('cart-type:before')}
95
+
96
+ <x-group frame>
97
+ <foxy-i18n slot="header" lang=${lang} key="cart_type" ns=${ns}></foxy-i18n>
98
+
99
+ <x-choice
100
+ .value=${json.cart_type}
101
+ .items=${items}
102
+ ?disabled=${this.disabledSelector.matches('cart-type', true)}
103
+ ?readonly=${this.readonlySelector.matches('cart-type', true)}
104
+ @change=${(evt) => {
105
+ this.edit({ json: JSON.stringify({ ...json, cart_type: evt.detail }) });
106
+ }}
107
+ >
108
+ ${items.map(item => {
109
+ return html `
110
+ <div slot="${item}-label" class="grid leading-s py-s">
111
+ <foxy-i18n lang=${lang} key="cart_type_${item}" ns=${ns}></foxy-i18n>
112
+ <foxy-i18n
113
+ class="text-secondary text-xs"
114
+ lang=${lang}
115
+ key="cart_type_${item}_explainer"
116
+ ns=${ns}
117
+ >
118
+ </foxy-i18n>
119
+ </div>
120
+ `;
121
+ })}
122
+ </x-choice>
123
+ </x-group>
124
+
125
+ ${this.renderTemplateOrSlot('cart-type:after')}
126
+ </div>
127
+ `;
128
+ }
129
+ __renderFoxycomplete(json) {
130
+ const { lang, ns } = this;
131
+ const isDisabled = this.disabledSelector.matches('foxycomplete', true);
132
+ const isReadonly = this.readonlySelector.matches('foxycomplete', true);
133
+ const items = ['combobox', 'search', 'disabled'];
134
+ const value = json.foxycomplete.usage === 'none'
135
+ ? 'disabled'
136
+ : json.foxycomplete.show_combobox
137
+ ? 'combobox'
138
+ : 'search';
139
+ const renderFlagsCheckbox = () => html `
140
+ <x-checkbox
141
+ ?disabled=${isDisabled}
142
+ ?readonly=${isReadonly}
143
+ ?checked=${json.foxycomplete.show_flags}
144
+ @change=${(evt) => {
145
+ const newConfig = {
146
+ ...json.foxycomplete,
147
+ show_flags: evt.detail,
148
+ };
149
+ this.edit({ json: JSON.stringify({ ...json, foxycomplete: newConfig }) });
150
+ }}
151
+ >
152
+ <foxy-i18n lang=${lang} key="show_country_flags" ns=${ns}></foxy-i18n>
153
+ </x-checkbox>
154
+ `;
155
+ return html `
156
+ <div>
157
+ ${this.renderTemplateOrSlot('foxycomplete:before')}
158
+
159
+ <x-group frame>
160
+ <foxy-i18n slot="header" lang=${lang} key="foxycomplete" ns=${ns}></foxy-i18n>
161
+
162
+ <x-choice
163
+ .value=${value}
164
+ .items=${items}
165
+ ?disabled=${isDisabled}
166
+ ?readonly=${isReadonly}
167
+ @change=${(evt) => {
168
+ if (!(evt instanceof ChoiceChangeEvent))
169
+ return;
170
+ const newConfig = {
171
+ ...json.foxycomplete,
172
+ usage: evt.detail === 'disabled' ? 'none' : 'required',
173
+ show_combobox: evt.detail === 'combobox',
174
+ };
175
+ this.edit({ json: JSON.stringify({ ...json, foxycomplete: newConfig }) });
176
+ }}
177
+ >
178
+ ${items.map(item => {
179
+ return html `
180
+ <div slot="${item}-label" class="grid leading-s py-s">
181
+ <foxy-i18n lang=${lang} key="foxycomplete_${item}" ns=${ns}></foxy-i18n>
182
+ <foxy-i18n
183
+ class="text-secondary text-xs"
184
+ lang=${lang}
185
+ key="foxycomplete_${item}_explainer"
186
+ ns=${ns}
187
+ >
188
+ </foxy-i18n>
189
+ </div>
190
+ `;
191
+ })}
192
+
193
+ <div slot="combobox" class="space-y-m pb-s" ?hidden=${value !== 'combobox'}>
194
+ <div class="grid grid-cols-2 gap-m" style="max-width: 16rem">
195
+ ${['open', 'close'].map(action => {
196
+ const field = action === 'open' ? 'combobox_open' : 'combobox_close';
197
+ return html `
198
+ <vaadin-text-field
199
+ label=${this.t(`${action}_icon`)}
200
+ .value=${json.foxycomplete[field]}
201
+ ?disabled=${isDisabled}
202
+ ?readonly=${isReadonly}
203
+ @input=${(evt) => {
204
+ const target = evt.currentTarget;
205
+ const newConfig = {
206
+ ...json.foxycomplete,
207
+ [field]: target.value,
208
+ };
209
+ this.edit({ json: JSON.stringify({ ...json, foxycomplete: newConfig }) });
210
+ }}
211
+ >
212
+ </vaadin-text-field>
213
+ `;
214
+ })}
215
+ </div>
216
+
217
+ ${renderFlagsCheckbox()}
218
+ </div>
219
+
220
+ <div slot="search" class="pb-s" ?hidden=${value !== 'search'}>
221
+ ${renderFlagsCheckbox()}
222
+ </div>
223
+ </x-choice>
224
+
225
+ <div class="border-t border-contrast-10 p-m">
226
+ <x-checkbox
227
+ ?disabled=${isDisabled}
228
+ ?readonly=${isReadonly}
229
+ ?checked=${json.postal_code_lookup.usage === 'enabled'}
230
+ @change=${(evt) => {
231
+ const newConfig = {
232
+ usage: evt.detail ? 'enabled' : 'none',
233
+ };
234
+ this.edit({ json: JSON.stringify({ ...json, postal_code_lookup: newConfig }) });
235
+ }}
236
+ >
237
+ <foxy-i18n lang=${lang} key="enable_postcode_lookup" ns=${ns}></foxy-i18n>
238
+ </x-checkbox>
239
+ </div>
240
+ </x-group>
241
+
242
+ ${this.renderTemplateOrSlot('foxycomplete:after')}
243
+ </div>
244
+ `;
245
+ }
246
+ __renderLocations(json) {
247
+ const { lang, ns } = this;
248
+ const config = json.location_filtering;
249
+ const shippingChoice = config.shipping_filter_type === 'blacklist' ? 'block' : 'allow';
250
+ const billingChoice = config.usage === 'both'
251
+ ? 'copy'
252
+ : config.billing_filter_type === 'blacklist'
253
+ ? 'block'
254
+ : 'allow';
255
+ const normalize = () => {
256
+ if (config.usage === 'both') {
257
+ config.billing_filter_type = config.shipping_filter_type;
258
+ config.billing_filter_values = config.shipping_filter_values;
259
+ }
260
+ else {
261
+ const hasBillingFilters = Object.keys(config.billing_filter_values).length > 0;
262
+ const hasShippingFilters = Object.keys(config.shipping_filter_values).length > 0;
263
+ if (!hasBillingFilters && !hasShippingFilters) {
264
+ config.usage = 'none';
265
+ }
266
+ else if (hasBillingFilters && !hasShippingFilters) {
267
+ config.usage = 'billing';
268
+ }
269
+ else if (hasShippingFilters && !hasBillingFilters) {
270
+ config.usage = 'shipping';
271
+ }
272
+ else {
273
+ config.usage = 'independent';
274
+ }
275
+ }
276
+ };
277
+ return html `
278
+ ${this.renderTemplateOrSlot('locations:before')}
279
+
280
+ <x-group frame>
281
+ <foxy-i18n slot="header" lang=${lang} key="location_plural" ns=${ns}></foxy-i18n>
282
+
283
+ <div class="grid sm-grid-cols-2 bg-contrast-10" style="gap: 1px">
284
+ <x-group class="bg-base pt-m">
285
+ <foxy-i18n class="text-tertiary" slot="header" lang=${lang} key="shipping" ns=${ns}>
286
+ </foxy-i18n>
287
+
288
+ <x-choice
289
+ .items=${['allow', 'block']}
290
+ .value=${shippingChoice}
291
+ @change=${(evt) => {
292
+ if (config.usage !== 'both')
293
+ config.usage = 'independent';
294
+ config.shipping_filter_type = evt.detail === 'block' ? 'blacklist' : 'whitelist';
295
+ normalize();
296
+ this.edit({ json: JSON.stringify(json) });
297
+ }}
298
+ >
299
+ <foxy-i18n slot="allow-label" lang=${lang} key="allowlist" ns=${ns}></foxy-i18n>
300
+ <foxy-i18n slot="block-label" lang=${lang} key="blocklist" ns=${ns}></foxy-i18n>
301
+
302
+ <x-countries-list
303
+ countries=${JSON.stringify(config.shipping_filter_values)}
304
+ regions=${this.regions}
305
+ class="mb-m"
306
+ href=${this.countries}
307
+ slot=${shippingChoice}
308
+ lang=${lang}
309
+ ns=${ns}
310
+ ?disabled=${this.disabledSelector.matches('locations', true)}
311
+ ?readonly=${this.readonlySelector.matches('locations', true)}
312
+ @update:countries=${(evt) => {
313
+ config.shipping_filter_values = evt.currentTarget.countries;
314
+ normalize();
315
+ this.edit({ json: JSON.stringify(json) });
316
+ }}
317
+ >
318
+ </x-countries-list>
319
+ </x-choice>
320
+ </x-group>
321
+
322
+ <x-group class="bg-base pt-m">
323
+ <foxy-i18n class="text-tertiary" slot="header" lang=${lang} key="billing" ns=${ns}>
324
+ </foxy-i18n>
325
+
326
+ <x-choice
327
+ .items=${['allow', 'block', 'copy']}
328
+ .value=${billingChoice}
329
+ @change=${(evt) => {
330
+ if (evt.detail === 'copy') {
331
+ config.usage = 'both';
332
+ }
333
+ else {
334
+ config.usage = 'independent';
335
+ config.billing_filter_type = evt.detail === 'block' ? 'blacklist' : 'whitelist';
336
+ }
337
+ normalize();
338
+ this.edit({ json: JSON.stringify(json) });
339
+ }}
340
+ >
341
+ <foxy-i18n slot="allow-label" lang=${lang} key="allowlist" ns=${ns}></foxy-i18n>
342
+ <foxy-i18n slot="block-label" lang=${lang} key="blocklist" ns=${ns}></foxy-i18n>
343
+ <foxy-i18n slot="copy-label" lang=${lang} key="same_as_shipping" ns=${ns}></foxy-i18n>
344
+
345
+ <x-countries-list
346
+ countries=${JSON.stringify(config.billing_filter_values)}
347
+ regions=${this.regions}
348
+ class="mb-m"
349
+ href=${this.countries}
350
+ slot=${billingChoice}
351
+ lang=${lang}
352
+ ns=${ns}
353
+ ?disabled=${this.disabledSelector.matches('locations', true)}
354
+ ?readonly=${this.readonlySelector.matches('locations', true)}
355
+ ?hidden=${billingChoice === 'copy'}
356
+ @update:countries=${(evt) => {
357
+ config.billing_filter_values = evt.currentTarget.countries;
358
+ normalize();
359
+ this.edit({ json: JSON.stringify(json) });
360
+ }}
361
+ >
362
+ </x-countries-list>
363
+ </x-choice>
364
+ </x-group>
365
+ </div>
366
+ </x-group>
367
+
368
+ ${this.renderTemplateOrSlot('locations:after')}
369
+ `;
370
+ }
371
+ __renderHiddenFields(json) {
372
+ const { lang, ns } = this;
373
+ const suggestions = [];
374
+ const fields = [];
375
+ const config = json.cart_display_config;
376
+ for (const key in config) {
377
+ if (!key.startsWith('show_'))
378
+ continue;
379
+ const field = key.substring(5);
380
+ suggestions.push(field);
381
+ if (config.usage === 'required' && !config[key])
382
+ fields.push(field);
383
+ }
384
+ if (config.usage === 'required') {
385
+ fields.push(...config.hidden_product_options);
386
+ }
387
+ const addField = () => {
388
+ config.usage = 'required';
389
+ if (suggestions.includes(this.__addHiddenFieldInputValue)) {
390
+ config[`show_${this.__addHiddenFieldInputValue}`] = false;
391
+ }
392
+ else if (!config.hidden_product_options.includes(this.__addHiddenFieldInputValue)) {
393
+ config.hidden_product_options.push(this.__addHiddenFieldInputValue);
394
+ }
395
+ this.edit({ json: JSON.stringify(json) });
396
+ this.__addHiddenFieldInputValue = '';
397
+ };
398
+ const radius = 'calc(var(--lumo-border-radius-l) / 1.2)';
399
+ const inputRadius = fields.length === 0 ? [radius] : ['0', '0', radius, radius];
400
+ return html `
401
+ <div>
402
+ ${this.renderTemplateOrSlot('hidden-fields:before')}
403
+
404
+ <x-group frame>
405
+ <foxy-i18n slot="header" lang=${lang} key="hidden_fields" ns=${ns}></foxy-i18n>
406
+
407
+ <div class="divide-y divide-contrast-10">
408
+ ${fields.map(field => html `
409
+ <div class="h-m ml-m pr-xs flex items-center justify-between">
410
+ ${suggestions.includes(field)
411
+ ? html `<foxy-i18n lang=${lang} key=${field} ns=${ns}></foxy-i18n>`
412
+ : html `<span>${field}</span>`}
413
+
414
+ <button
415
+ class="flex w-xs h-xs items-center justify-center rounded-full transition-colors hover-bg-error-10 hover-text-error focus-outline-none focus-ring-2 focus-ring-inset focus-ring-error-50"
416
+ @click=${() => {
417
+ if (typeof config[`show_${field}`] === 'boolean') {
418
+ config[`show_${field}`] = true;
419
+ }
420
+ else {
421
+ config.hidden_product_options = config.hidden_product_options.filter(option => option !== field);
422
+ }
423
+ this.edit({ json: JSON.stringify(json) });
424
+ }}
425
+ >
426
+ <iron-icon icon="icons:close" class="icon-inline text-m"></iron-icon>
427
+ </button>
428
+ </div>
429
+ `)}
430
+ </div>
431
+
432
+ <div
433
+ style="border-radius: ${inputRadius.join(' ')}"
434
+ class=${classMap({
435
+ 'h-m flex items-center ring-inset ring-primary-50 focus-within-ring-2': true,
436
+ 'border-t border-contrast-10': fields.length > 0,
437
+ })}
438
+ >
439
+ <input
440
+ placeholder=${this.t('add_field')}
441
+ class="w-full bg-transparent appearance-none h-m px-m focus-outline-none"
442
+ list="hidden-fields-list"
443
+ .value=${live(this.__addHiddenFieldInputValue)}
444
+ @keydown=${(evt) => evt.key === 'Enter' && addField()}
445
+ @input=${(evt) => {
446
+ this.__addHiddenFieldInputValue = evt.currentTarget.value;
447
+ }}
448
+ />
449
+
450
+ <datalist id="hidden-fields-list">
451
+ ${suggestions
452
+ .filter(suggestion => !fields.includes(suggestion))
453
+ .map(suggestion => html `<option value=${suggestion}>${this.t(suggestion)}</option>`)}
454
+ </datalist>
455
+
456
+ <button
457
+ aria-label=${this.t('add_field')}
458
+ class=${classMap({
459
+ 'w-xs h-xs mr-xs flex-shrink-0 ring-inset ring-success-50': true,
460
+ 'flex items-center justify-center rounded-full transition-colors': true,
461
+ 'bg-contrast-5 text-disabled cursor-default': !this.__addHiddenFieldInputValue,
462
+ 'bg-success-10 text-success cursor-pointer': !!this.__addHiddenFieldInputValue,
463
+ 'hover-bg-success hover-text-success-contrast': !!this.__addHiddenFieldInputValue,
464
+ 'focus-outline-none focus-ring-2': !!this.__addHiddenFieldInputValue,
465
+ })}
466
+ ?disabled=${!this.__addHiddenFieldInputValue}
467
+ @click=${addField}
468
+ >
469
+ <iron-icon icon="icons:add" class="icon-inline text-m"></iron-icon>
470
+ </button>
471
+ </div>
472
+ </x-group>
473
+
474
+ ${this.renderTemplateOrSlot('hidden-fields:after')}
475
+ </div>
476
+ `;
477
+ }
478
+ __renderGoogleAnalytics(json) {
479
+ const { lang, ns } = this;
480
+ const config = json.analytics_config;
481
+ const sioConfig = config.segment_io;
482
+ const gaConfig = config.google_analytics;
483
+ const isDisabled = this.disabledSelector.matches('google-analytics', true);
484
+ const isReadonly = this.readonlySelector.matches('google-analytics', true);
485
+ return html `
486
+ <div>
487
+ ${this.renderTemplateOrSlot('google-analytics:before')}
488
+
489
+ <x-group frame>
490
+ <span slot="header">Google Analytics</span>
491
+
492
+ <div class="p-m space-y-m">
493
+ <vaadin-text-field
494
+ class="w-full"
495
+ label=${this.t('ga_account_id')}
496
+ placeholder="UA-1234567-1"
497
+ helper-text=${this.t('ga_account_id_explainer')}
498
+ .value=${live(gaConfig.account_id)}
499
+ ?disabled=${isDisabled}
500
+ ?readonly=${isReadonly}
501
+ clear-button-visible
502
+ @keydown=${(evt) => evt.key === 'Enter' && this.submit()}
503
+ @input=${(evt) => {
504
+ gaConfig.account_id = evt.currentTarget.value;
505
+ gaConfig.usage = gaConfig.account_id ? 'required' : 'none';
506
+ config.usage = gaConfig.account_id || sioConfig.account_id ? 'required' : 'none';
507
+ }}
508
+ >
509
+ </vaadin-text-field>
510
+
511
+ <x-checkbox
512
+ ?disabled=${isDisabled}
513
+ ?readonly=${isReadonly}
514
+ ?checked=${gaConfig.include_on_site}
515
+ @change=${(evt) => {
516
+ gaConfig.include_on_site = evt.detail;
517
+ this.edit({ json: JSON.stringify(json) });
518
+ }}
519
+ >
520
+ <div class="flex flex-col">
521
+ <foxy-i18n lang=${lang} key="ga_include_on_site" ns=${ns}></foxy-i18n>
522
+ <foxy-i18n
523
+ class="text-xs leading-s text-secondary"
524
+ lang=${lang}
525
+ key="ga_include_on_site_explainer"
526
+ ns=${ns}
527
+ >
528
+ </foxy-i18n>
529
+ </div>
530
+ </x-checkbox>
531
+ </div>
532
+ </x-group>
533
+
534
+ ${this.renderTemplateOrSlot('google-analytics:after')}
535
+ </div>
536
+ `;
537
+ }
538
+ __renderSegmentIo(json) {
539
+ const config = json.analytics_config;
540
+ const sioConfig = config.segment_io;
541
+ const gaConfig = config.google_analytics;
542
+ const isDisabled = this.disabledSelector.matches('segment-io', true);
543
+ const isReadonly = this.readonlySelector.matches('segment-io', true);
544
+ return html `
545
+ <div>
546
+ ${this.renderTemplateOrSlot('segment-io:before')}
547
+
548
+ <x-group frame>
549
+ <span slot="header">Segment.io</span>
550
+
551
+ <div class="p-m">
552
+ <vaadin-text-field
553
+ class="w-full"
554
+ label=${this.t('sio_account_id')}
555
+ placeholder="MY-WRITE-KEY"
556
+ helper-text=${this.t('sio_account_id_explainer')}
557
+ .value=${live(sioConfig.account_id)}
558
+ ?disabled=${isDisabled}
559
+ ?readonly=${isReadonly}
560
+ clear-button-visible
561
+ @keydown=${(evt) => evt.key === 'Enter' && this.submit()}
562
+ @input=${(evt) => {
563
+ sioConfig.account_id = evt.currentTarget.value;
564
+ sioConfig.usage = sioConfig.account_id ? 'required' : 'none';
565
+ config.usage = gaConfig.account_id || sioConfig.account_id ? 'required' : 'none';
566
+ }}
567
+ >
568
+ </vaadin-text-field>
569
+ </div>
570
+ </x-group>
571
+
572
+ ${this.renderTemplateOrSlot('segment-io:after')}
573
+ </div>
574
+ `;
575
+ }
576
+ __renderTroubleshooting(json) {
577
+ const { lang, ns } = this;
578
+ const config = json.debug;
579
+ return html `
580
+ <div>
581
+ ${this.renderTemplateOrSlot('troubleshooting:before')}
582
+
583
+ <x-group frame>
584
+ <foxy-i18n slot="header" lang=${lang} key="troubleshooting" ns=${ns}></foxy-i18n>
585
+
586
+ <div class="p-m space-y-m">
587
+ <x-checkbox
588
+ ?disabled=${this.disabledSelector.matches('troubleshooting', true)}
589
+ ?readonly=${this.readonlySelector.matches('troubleshooting', true)}
590
+ ?checked=${config.usage === 'required'}
591
+ @change=${(evt) => {
592
+ config.usage = evt.detail ? 'required' : 'none';
593
+ this.edit({ json: JSON.stringify(json) });
594
+ }}
595
+ >
596
+ <div class="flex flex-col">
597
+ <foxy-i18n lang=${lang} key="troubleshooting_debug" ns=${ns}></foxy-i18n>
598
+ <foxy-i18n
599
+ class="text-xs leading-s text-secondary"
600
+ lang=${lang}
601
+ key="troubleshooting_debug_explainer"
602
+ ns=${ns}
603
+ >
604
+ </foxy-i18n>
605
+ </div>
606
+ </x-checkbox>
607
+ </div>
608
+ </x-group>
609
+
610
+ ${this.renderTemplateOrSlot('troubleshooting:after')}
611
+ </div>
612
+ `;
613
+ }
614
+ __renderCustomConfig(json) {
615
+ return html `
616
+ <div>
617
+ ${this.renderTemplateOrSlot('custom-config:before')}
618
+
619
+ <vaadin-text-area
620
+ class="w-full"
621
+ label=${this.t('custom_config')}
622
+ placeholder='{ "key": "value" }'
623
+ helper-text=${this.t('custom_config_helper_text')}
624
+ .value=${json.custom_config ? JSON.stringify(json.custom_config, null, 2) : ''}
625
+ ?disabled=${this.disabledSelector.matches('custom-config', true)}
626
+ ?readonly=${this.readonlySelector.matches('custom-config', true)}
627
+ @input=${(evt) => {
628
+ const input = evt.currentTarget;
629
+ try {
630
+ json.custom_config = input.value ? JSON.parse(input.value) : '';
631
+ this.edit({ json: JSON.stringify(json) });
632
+ input.invalid = false;
633
+ }
634
+ catch (_a) {
635
+ input.invalid = true;
636
+ }
637
+ }}
638
+ >
639
+ </vaadin-text-area>
640
+
641
+ ${this.renderTemplateOrSlot('custom-config:after')}
642
+ </div>
643
+ `;
644
+ }
645
+ __renderHeader(json) {
646
+ return html `
647
+ <div>
648
+ ${this.renderTemplateOrSlot('header:before')}
649
+
650
+ <vaadin-text-area
651
+ class="w-full"
652
+ label=${this.t('custom_header')}
653
+ helper-text=${this.t('custom_header_helper_text')}
654
+ .value=${json.custom_script_values.header}
655
+ ?disabled=${this.disabledSelector.matches('header', true)}
656
+ ?readonly=${this.readonlySelector.matches('header', true)}
657
+ @input=${(evt) => {
658
+ const target = evt.currentTarget;
659
+ const newConfig = {
660
+ ...json.custom_script_values,
661
+ header: target.value,
662
+ };
663
+ this.edit({ json: JSON.stringify({ ...json, custom_script_values: newConfig }) });
664
+ }}
665
+ >
666
+ </vaadin-text-area>
667
+
668
+ ${this.renderTemplateOrSlot('header:after')}
669
+ </div>
670
+ `;
671
+ }
672
+ __renderFooter(json) {
673
+ return html `
674
+ <div>
675
+ ${this.renderTemplateOrSlot('footer:before')}
676
+
677
+ <vaadin-text-area
678
+ class="w-full"
679
+ label=${this.t('custom_footer')}
680
+ helper-text=${this.t('custom_footer_helper_text')}
681
+ .value=${json.custom_script_values.footer}
682
+ ?disabled=${this.disabledSelector.matches('footer', true)}
683
+ ?readonly=${this.readonlySelector.matches('footer', true)}
684
+ @input=${(evt) => {
685
+ const target = evt.currentTarget;
686
+ const newConfig = {
687
+ ...json.custom_script_values,
688
+ footer: target.value,
689
+ };
690
+ this.edit({ json: JSON.stringify({ ...json, custom_script_values: newConfig }) });
691
+ }}
692
+ >
693
+ </vaadin-text-area>
694
+
695
+ ${this.renderTemplateOrSlot('footer:after')}
696
+ </div>
697
+ `;
698
+ }
699
+ }
700
+ //# sourceMappingURL=TemplateConfigForm.js.map