@foxy.io/elements 1.23.0-beta.1 → 1.23.0-beta.3

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 (195) hide show
  1. package/dist/cdn/foxy-access-recovery-form.js +1 -1
  2. package/dist/cdn/foxy-address-card.js +1 -1
  3. package/dist/cdn/foxy-address-form.js +1 -1
  4. package/dist/cdn/foxy-admin-subscription-card.js +1 -1
  5. package/dist/cdn/foxy-api-browser.js +2 -3
  6. package/dist/cdn/foxy-applied-coupon-code-card.js +1 -1
  7. package/dist/cdn/foxy-applied-coupon-code-form.js +1 -1
  8. package/dist/cdn/foxy-applied-tax-card.js +1 -1
  9. package/dist/cdn/foxy-attribute-card.js +1 -1
  10. package/dist/cdn/foxy-attribute-form.js +1 -1
  11. package/dist/cdn/foxy-cancellation-form.js +1 -1
  12. package/dist/cdn/foxy-cart-card.js +1 -1
  13. package/dist/cdn/foxy-cart-form.js +1 -1
  14. package/dist/cdn/foxy-collection-page.js +1 -1
  15. package/dist/cdn/foxy-collection-pages.js +1 -1
  16. package/dist/cdn/foxy-copy-to-clipboard.js +1 -1
  17. package/dist/cdn/foxy-coupon-card.js +1 -1
  18. package/dist/cdn/foxy-coupon-code-form.js +1 -1
  19. package/dist/cdn/foxy-coupon-codes-form.js +1 -1
  20. package/dist/cdn/foxy-coupon-detail-card.js +1 -1
  21. package/dist/cdn/foxy-coupon-form.js +1 -1
  22. package/dist/cdn/foxy-custom-field-card.js +1 -1
  23. package/dist/cdn/foxy-custom-field-form.js +1 -1
  24. package/dist/cdn/foxy-customer-card.js +1 -1
  25. package/dist/cdn/foxy-customer-form.js +1 -1
  26. package/dist/cdn/foxy-customer-portal-settings.js +1 -1
  27. package/dist/cdn/foxy-customer-portal.js +1 -1
  28. package/dist/cdn/foxy-customer.js +1 -1
  29. package/dist/cdn/foxy-customers-table.js +1 -1
  30. package/dist/cdn/foxy-discount-builder.js +1 -1
  31. package/dist/cdn/foxy-discount-card.js +1 -1
  32. package/dist/cdn/foxy-discount-detail-card.js +1 -1
  33. package/dist/cdn/foxy-donation.js +1 -1
  34. package/dist/cdn/foxy-downloadable-card.js +1 -1
  35. package/dist/cdn/foxy-downloadable-form.js +1 -1
  36. package/dist/cdn/foxy-email-template-card.js +1 -1
  37. package/dist/cdn/foxy-email-template-form.js +1 -1
  38. package/dist/cdn/foxy-error-entry-card.js +1 -1
  39. package/dist/cdn/foxy-form-dialog.js +1 -1
  40. package/dist/cdn/foxy-generate-codes-form.js +1 -1
  41. package/dist/cdn/foxy-gift-card-card.js +1 -1
  42. package/dist/cdn/foxy-gift-card-code-form.js +1 -1
  43. package/dist/cdn/foxy-gift-card-code-log-card.js +1 -1
  44. package/dist/cdn/foxy-gift-card-codes-form.js +1 -1
  45. package/dist/cdn/foxy-gift-card-form.js +1 -1
  46. package/dist/cdn/foxy-i18n-editor.js +2 -2
  47. package/dist/cdn/foxy-i18n.js +1 -1
  48. package/dist/cdn/foxy-integration-card.js +1 -1
  49. package/dist/cdn/foxy-integration-form.js +1 -1
  50. package/dist/cdn/foxy-item-card.js +1 -1
  51. package/dist/cdn/foxy-item-category-card.js +1 -1
  52. package/dist/cdn/foxy-item-category-form.js +1 -1
  53. package/dist/cdn/foxy-item-form.js +1 -1
  54. package/dist/cdn/foxy-item-option-card.js +1 -1
  55. package/dist/cdn/foxy-item-option-form.js +1 -1
  56. package/dist/cdn/foxy-items-form.js +1 -1
  57. package/dist/cdn/foxy-pagination.js +1 -1
  58. package/dist/cdn/foxy-payment-card.js +1 -1
  59. package/dist/cdn/foxy-payment-method-card.js +1 -1
  60. package/dist/cdn/foxy-payments-api-fraud-protection-card.js +1 -1
  61. package/dist/cdn/foxy-payments-api-fraud-protection-form.js +1 -1
  62. package/dist/cdn/foxy-payments-api-payment-method-card.js +1 -1
  63. package/dist/cdn/foxy-payments-api-payment-method-form.js +1 -1
  64. package/dist/cdn/foxy-payments-api-payment-preset-card.js +1 -1
  65. package/dist/cdn/foxy-payments-api-payment-preset-form.js +1 -1
  66. package/dist/cdn/foxy-payments-api.js +1 -1
  67. package/dist/cdn/foxy-query-builder.js +1 -1
  68. package/dist/cdn/foxy-report-form.js +1 -1
  69. package/dist/cdn/foxy-reports-table.js +1 -1
  70. package/dist/cdn/foxy-shipment-card.js +1 -1
  71. package/dist/cdn/foxy-shipping-method-card.js +1 -1
  72. package/dist/cdn/foxy-sign-in-form.js +1 -1
  73. package/dist/cdn/foxy-spinner.js +1 -1
  74. package/dist/cdn/foxy-store-card.js +1 -1
  75. package/dist/cdn/foxy-store-form.js +1 -1
  76. package/dist/cdn/foxy-store-shipping-method-form.js +1 -1
  77. package/dist/cdn/foxy-subscription-card.js +1 -1
  78. package/dist/cdn/foxy-subscription-form.js +3 -3
  79. package/dist/cdn/foxy-subscription-settings-form.js +1 -1
  80. package/dist/cdn/foxy-subscriptions-table.js +1 -1
  81. package/dist/cdn/foxy-table.js +1 -1
  82. package/dist/cdn/foxy-tax-card.js +1 -1
  83. package/dist/cdn/foxy-tax-form.js +1 -1
  84. package/dist/cdn/foxy-template-config-form.js +1 -1
  85. package/dist/cdn/foxy-template-form.js +1 -1
  86. package/dist/cdn/foxy-template-set-card.js +1 -1
  87. package/dist/cdn/foxy-template-set-form.js +1 -1
  88. package/dist/cdn/foxy-transaction-card.js +1 -1
  89. package/dist/cdn/foxy-transaction.js +1 -1
  90. package/dist/cdn/foxy-transactions-table.js +1 -1
  91. package/dist/cdn/foxy-user-card.js +1 -1
  92. package/dist/cdn/foxy-user-form.js +1 -1
  93. package/dist/cdn/foxy-users-table.js +1 -1
  94. package/dist/cdn/foxy-webhook-card.js +1 -1
  95. package/dist/cdn/foxy-webhook-form.js +1 -1
  96. package/dist/cdn/foxy-webhook-log-card.js +1 -1
  97. package/dist/cdn/foxy-webhook-status-card.js +1 -1
  98. package/dist/cdn/{shared-5570ac69.js → shared-03b39ec4.js} +1 -1
  99. package/dist/cdn/{shared-df1816e8.js → shared-0543c6e0.js} +1 -1
  100. package/dist/cdn/{shared-14bb06d4.js → shared-068480a3.js} +1 -1
  101. package/dist/cdn/{shared-049d80d0.js → shared-08ff9a8d.js} +1 -1
  102. package/dist/cdn/{shared-b39fce1b.js → shared-0c02b4ee.js} +1 -1
  103. package/dist/cdn/{shared-3d6f0788.js → shared-0dc1d012.js} +1 -1
  104. package/dist/cdn/{shared-04634a6f.js → shared-16b542bc.js} +1 -1
  105. package/dist/cdn/{shared-0dd25feb.js → shared-1e5292a1.js} +1 -1
  106. package/dist/cdn/{shared-faad86eb.js → shared-23923638.js} +1 -1
  107. package/dist/cdn/{shared-bed220d3.js → shared-29aa4bca.js} +1 -1
  108. package/dist/cdn/{shared-a7347e96.js → shared-380db651.js} +1 -1
  109. package/dist/cdn/{shared-7fd77eed.js → shared-39761436.js} +1 -1
  110. package/dist/cdn/{shared-07e32de2.js → shared-3a252ccd.js} +1 -1
  111. package/dist/cdn/{shared-491c9063.js → shared-3a82d3f5.js} +1 -1
  112. package/dist/cdn/{shared-bb226a47.js → shared-43520428.js} +1 -1
  113. package/dist/cdn/shared-49d978e1.js +1 -0
  114. package/dist/cdn/{shared-ac05532a.js → shared-4abfda9b.js} +1 -1
  115. package/dist/cdn/{shared-98eec370.js → shared-4c9f96ec.js} +1 -1
  116. package/dist/cdn/{shared-40638f2c.js → shared-4db2c7b1.js} +4 -4
  117. package/dist/cdn/{shared-f19f05e1.js → shared-53fee01f.js} +1 -1
  118. package/dist/cdn/{shared-50908853.js → shared-5dd31b4e.js} +1 -1
  119. package/dist/cdn/{shared-cf65fcc7.js → shared-61a510d8.js} +1 -1
  120. package/dist/cdn/{shared-0237bfae.js → shared-6b53ef85.js} +2 -2
  121. package/dist/cdn/{shared-163e5fdb.js → shared-6bfa699d.js} +1 -1
  122. package/dist/cdn/{shared-ab69c97b.js → shared-6eb7dc77.js} +1 -1
  123. package/dist/cdn/{shared-4494ebfa.js → shared-6f465111.js} +1 -1
  124. package/dist/cdn/{shared-ec3332b9.js → shared-6fb923d5.js} +1 -1
  125. package/dist/cdn/{shared-f0c8a5bd.js → shared-7a290f36.js} +1 -1
  126. package/dist/cdn/{shared-394c2425.js → shared-7bf46d6d.js} +1 -1
  127. package/dist/cdn/{shared-c7954521.js → shared-7c5754a4.js} +1 -1
  128. package/dist/cdn/{shared-f23627ae.js → shared-8349938a.js} +1 -1
  129. package/dist/cdn/{shared-af7cde22.js → shared-85bc54a6.js} +1 -1
  130. package/dist/cdn/{shared-d1c45954.js → shared-86768244.js} +1 -1
  131. package/dist/cdn/{shared-a959c0d9.js → shared-8b73191b.js} +1 -1
  132. package/dist/cdn/{shared-726c0b56.js → shared-9048c076.js} +1 -1
  133. package/dist/cdn/{shared-539cde4d.js → shared-939fc890.js} +1 -1
  134. package/dist/cdn/{shared-80792dc8.js → shared-9e60ef60.js} +1 -1
  135. package/dist/cdn/{shared-bbb8ec69.js → shared-a6518411.js} +1 -1
  136. package/dist/cdn/{shared-ffd03d7b.js → shared-ad396f3c.js} +1 -1
  137. package/dist/cdn/{shared-64f2d6de.js → shared-aeec3cab.js} +1 -1
  138. package/dist/cdn/{shared-00b50abf.js → shared-b88e35b7.js} +1 -1
  139. package/dist/cdn/{shared-bdd5c908.js → shared-b95ef318.js} +1 -1
  140. package/dist/cdn/{shared-d2384b7b.js → shared-bb009254.js} +1 -1
  141. package/dist/cdn/{shared-694297c2.js → shared-bd81cc08.js} +1 -1
  142. package/dist/cdn/{shared-8ac00abe.js → shared-c3c67413.js} +1 -1
  143. package/dist/cdn/{shared-27d23dfd.js → shared-c40d85dc.js} +1 -1
  144. package/dist/cdn/{shared-313a39ef.js → shared-ca58ef47.js} +1 -1
  145. package/dist/cdn/{shared-025cab8b.js → shared-cb6f2388.js} +1 -1
  146. package/dist/cdn/{shared-520be2e9.js → shared-cd096e97.js} +1 -1
  147. package/dist/cdn/{shared-1e55acbb.js → shared-d493355a.js} +1 -1
  148. package/dist/cdn/{shared-797b6161.js → shared-dcbaa1c5.js} +1 -1
  149. package/dist/cdn/{shared-acda8da2.js → shared-e28f16db.js} +1 -1
  150. package/dist/cdn/{shared-77a700fe.js → shared-e5c19ea3.js} +1 -1
  151. package/dist/cdn/shared-e6066f46.js +2 -0
  152. package/dist/cdn/{shared-e7ce4e47.js → shared-eb4b4597.js} +1 -1
  153. package/dist/cdn/{shared-b34bef61.js → shared-ee13d1a6.js} +1 -1
  154. package/dist/cdn/{shared-7c761c65.js → shared-f3f5e87e.js} +1 -1
  155. package/dist/cdn/{shared-3206f265.js → shared-fbfb0943.js} +1 -1
  156. package/dist/cdn/translations/api-browser/en.json +4 -0
  157. package/dist/cdn/translations/email-template-form/en.json +9 -7
  158. package/dist/cdn/translations/template-form/en.json +9 -7
  159. package/dist/elements/internal/InternalSourceControl/InternalSourceControl.d.ts +18 -0
  160. package/dist/elements/internal/InternalSourceControl/InternalSourceControl.js +160 -0
  161. package/dist/elements/internal/InternalSourceControl/InternalSourceControl.js.map +1 -0
  162. package/dist/elements/internal/InternalSourceControl/index.d.ts +3 -0
  163. package/dist/elements/internal/InternalSourceControl/index.js +5 -0
  164. package/dist/elements/internal/InternalSourceControl/index.js.map +1 -0
  165. package/dist/elements/public/ApiBrowser/internal/InternalApiBrowserResourceForm/InternalApiBrowserResourceForm.d.ts +0 -2
  166. package/dist/elements/public/ApiBrowser/internal/InternalApiBrowserResourceForm/InternalApiBrowserResourceForm.js +27 -43
  167. package/dist/elements/public/ApiBrowser/internal/InternalApiBrowserResourceForm/InternalApiBrowserResourceForm.js.map +1 -1
  168. package/dist/elements/public/ApiBrowser/internal/InternalApiBrowserResourceForm/index.d.ts +1 -0
  169. package/dist/elements/public/ApiBrowser/internal/InternalApiBrowserResourceForm/index.js +1 -0
  170. package/dist/elements/public/ApiBrowser/internal/InternalApiBrowserResourceForm/index.js.map +1 -1
  171. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.d.ts +9 -7
  172. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.js +66 -60
  173. package/dist/elements/public/EmailTemplateForm/EmailTemplateForm.js.map +1 -1
  174. package/dist/elements/public/EmailTemplateForm/index.d.ts +1 -1
  175. package/dist/elements/public/EmailTemplateForm/index.js +1 -1
  176. package/dist/elements/public/EmailTemplateForm/index.js.map +1 -1
  177. package/dist/elements/public/PaymentsApi/PaymentsApi.d.ts +53 -7
  178. package/dist/elements/public/PaymentsApi/PaymentsApi.js +75 -12
  179. package/dist/elements/public/PaymentsApi/PaymentsApi.js.map +1 -1
  180. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.d.ts +0 -4
  181. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js +66 -118
  182. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js.map +1 -1
  183. package/dist/elements/public/TemplateConfigForm/index.d.ts +1 -1
  184. package/dist/elements/public/TemplateConfigForm/index.js +1 -1
  185. package/dist/elements/public/TemplateConfigForm/index.js.map +1 -1
  186. package/dist/elements/public/TemplateForm/TemplateForm.d.ts +4 -3
  187. package/dist/elements/public/TemplateForm/TemplateForm.js +49 -50
  188. package/dist/elements/public/TemplateForm/TemplateForm.js.map +1 -1
  189. package/dist/elements/public/TemplateForm/index.d.ts +1 -1
  190. package/dist/elements/public/TemplateForm/index.js +1 -1
  191. package/dist/elements/public/TemplateForm/index.js.map +1 -1
  192. package/dist/mixins/themeable.js +14 -4
  193. package/dist/mixins/themeable.js.map +1 -1
  194. package/package.json +1 -1
  195. package/dist/cdn/shared-44594184.js +0 -1
@@ -1,13 +1,13 @@
1
- import { css, html } from 'lit-element';
2
1
  import { Choice, Group, PropertyTable } from "../../private/index.js";
3
2
  import { ScopedElementsMixin } from '@open-wc/scoped-elements';
4
3
  import { ChoiceChangeEvent } from "../../private/events.js";
5
4
  import { ConfigurableMixin } from "../../../mixins/configurable.js";
6
- import { NucleonElement } from "../NucleonElement/NucleonElement.js";
7
- import { ThemeableMixin } from "../../../mixins/themeable.js";
8
5
  import { TranslatableMixin } from "../../../mixins/translatable.js";
9
- import { classMap } from "../../../utils/class-map.js";
6
+ import { ThemeableMixin } from "../../../mixins/themeable.js";
7
+ import { NucleonElement } from "../NucleonElement/NucleonElement.js";
10
8
  import { ifDefined } from 'lit-html/directives/if-defined';
9
+ import { classMap } from "../../../utils/class-map.js";
10
+ import { html } from 'lit-element';
11
11
  const NS = 'email-template-form';
12
12
  const Base = ScopedElementsMixin(ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS))));
13
13
  /**
@@ -38,8 +38,6 @@ export class EmailTemplateForm extends Base {
38
38
  constructor() {
39
39
  super(...arguments);
40
40
  this.templates = {};
41
- this.__cacheState = 'idle';
42
- this.__contentChoice = 'default';
43
41
  this.__templateLanguageOptions = [
44
42
  { label: 'Nunjucks', value: 'nunjucks' },
45
43
  { label: 'Handlebars', value: 'handlebars' },
@@ -47,6 +45,9 @@ export class EmailTemplateForm extends Base {
47
45
  { label: 'Twig', value: 'twig' },
48
46
  { label: 'EJS', value: 'ejs' },
49
47
  ];
48
+ this.__textContentChoice = 'default';
49
+ this.__htmlContentChoice = 'default';
50
+ this.__cacheState = 'idle';
50
51
  }
51
52
  static get properties() {
52
53
  return {
@@ -55,25 +56,16 @@ export class EmailTemplateForm extends Base {
55
56
  __contentChoice: { attribute: false },
56
57
  };
57
58
  }
58
- static get styles() {
59
- return [
60
- ...super.styles,
61
- css `#cached-content::part(input-field){
62
- max-height:15em;
63
- }
64
- `,
65
- ];
66
- }
67
59
  static get scopedElements() {
68
60
  return {
69
61
  'foxy-internal-select-control': customElements.get('foxy-internal-select-control'),
70
62
  'foxy-internal-confirm-dialog': customElements.get('foxy-internal-confirm-dialog'),
63
+ 'foxy-internal-source-control': customElements.get('foxy-internal-source-control'),
71
64
  'foxy-internal-text-control': customElements.get('foxy-internal-text-control'),
72
65
  'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),
73
66
  'foxy-spinner': customElements.get('foxy-spinner'),
74
67
  'foxy-i18n': customElements.get('foxy-i18n'),
75
68
  'vaadin-text-field': customElements.get('vaadin-text-field'),
76
- 'vaadin-text-area': customElements.get('vaadin-text-area'),
77
69
  'vaadin-button': customElements.get('vaadin-button'),
78
70
  'x-property-table': PropertyTable,
79
71
  'x-choice': Choice,
@@ -127,6 +119,26 @@ export class EmailTemplateForm extends Base {
127
119
  </div>
128
120
  `;
129
121
  }
122
+ async _sendPost(edits) {
123
+ const data = await super._sendPost(edits);
124
+ if (!data.content_html_url && !data.content_text_url)
125
+ return data;
126
+ this.__cacheState = 'busy';
127
+ const url = data._links['fx:cache'].href;
128
+ const response = await new EmailTemplateForm.API(this).fetch(url, { method: 'POST' });
129
+ this.__cacheState = response.ok ? 'idle' : 'fail';
130
+ return await this._fetch(data._links.self.href);
131
+ }
132
+ async _sendPatch(edits) {
133
+ const data = await super._sendPatch(edits);
134
+ if (!data.content_html_url && !data.content_text_url)
135
+ return data;
136
+ this.__cacheState = 'busy';
137
+ const url = data._links['fx:cache'].href;
138
+ const response = await new EmailTemplateForm.API(this).fetch(url, { method: 'POST' });
139
+ this.__cacheState = response.ok ? 'idle' : 'fail';
140
+ return await this._fetch(data._links.self.href);
141
+ }
130
142
  __renderDescription() {
131
143
  var _a, _b;
132
144
  const scope = 'description';
@@ -153,28 +165,25 @@ export class EmailTemplateForm extends Base {
153
165
  `;
154
166
  }
155
167
  __renderContent() {
168
+ const variants = ['text', 'html'];
156
169
  return html `
157
170
  <div data-testid="content">
158
- ${this.renderTemplateOrSlot('content:before')}
159
-
160
- <div class="space-y-l">
161
- ${this.__renderContentVariant('content_text_url', 'content_text', 'text_template')}
162
- ${this.__renderContentVariant('content_html_url', 'content_html', 'html_template')}
163
- </div>
164
-
165
- ${this.renderTemplateOrSlot('content:after')}
171
+ <div class="space-y-l">${variants.map(v => this.__renderContentVariant(v))}</div>
166
172
  </div>
167
173
  `;
168
174
  }
169
- __renderContentVariant(urlPath, textPath, header) {
170
- var _a;
175
+ __renderContentVariant(variant) {
176
+ var _a, _b;
177
+ const urlPath = variant === 'text' ? 'content_text_url' : 'content_html_url';
178
+ const textPath = variant === 'text' ? 'content_text' : 'content_html';
179
+ const header = variant === 'text' ? 'text_template' : 'html_template';
180
+ const urlValue = this.form[urlPath];
181
+ const textValue = this.form[textPath];
182
+ const contentChoiceKey = variant === 'text' ? '__textContentChoice' : '__htmlContentChoice';
183
+ const contentChoice = urlValue ? 'url' : textValue ? 'clipboard' : this[contentChoiceKey];
171
184
  const isDisabled = !this.in('idle') || this.disabledSelector.matches('content', true);
172
185
  const isReadonly = this.readonlySelector.matches('content', true);
173
- const contentChoice = this.form[urlPath]
174
- ? 'url'
175
- : this.form[textPath]
176
- ? 'clipboard'
177
- : this.__contentChoice;
186
+ const isSyncProhibited = isReadonly || !((_a = this.data) === null || _a === void 0 ? void 0 : _a[urlPath]) || urlValue !== this.data[urlPath];
178
187
  return html `
179
188
  <x-group frame>
180
189
  <foxy-i18n
@@ -195,7 +204,7 @@ export class EmailTemplateForm extends Base {
195
204
  @change=${(evt) => {
196
205
  if (evt instanceof ChoiceChangeEvent) {
197
206
  this.edit({ [textPath]: '', [urlPath]: '' });
198
- this.__contentChoice = evt.detail;
207
+ this[contentChoiceKey] = evt.detail;
199
208
  }
200
209
  }}
201
210
  >
@@ -204,28 +213,23 @@ export class EmailTemplateForm extends Base {
204
213
  <div slot="${value}-label" class="py-s leading-s">
205
214
  <foxy-i18n class="block" lang=${this.lang} key="template_${value}" ns=${this.ns}>
206
215
  </foxy-i18n>
207
-
208
- <foxy-i18n
209
- class="block text-s opacity-70"
210
- lang=${this.lang}
211
- key="template_${value}_explainer"
212
- ns=${this.ns}
213
- >
214
- </foxy-i18n>
215
216
  </div>
216
217
  `;
217
218
  })}
218
219
 
219
220
  <div
220
221
  style="--lumo-border-radius: var(--lumo-border-radius-s)"
222
+ class="mb-m"
221
223
  slot="url"
222
224
  ?hidden=${contentChoice !== 'url'}
223
225
  >
224
- <div class="flex items-center mt-0 mb-m">
226
+ <div class="flex items-end mt-0">
225
227
  <vaadin-text-field
226
228
  data-testid="${textPath.replace('_', '-')}-url"
229
+ placeholder="https://example.com/my-template"
230
+ label=${this.t('url')}
231
+ class="flex-1 min-w-0"
227
232
  value=${ifDefined(this.form[urlPath])}
228
- class="mr-s flex-grow"
229
233
  ?readonly=${isReadonly}
230
234
  ?disabled=${isDisabled}
231
235
  @keydown=${(evt) => evt.key === 'Enter' && this.submit()}
@@ -238,9 +242,9 @@ export class EmailTemplateForm extends Base {
238
242
 
239
243
  <vaadin-button
240
244
  data-testid="${textPath.replace('_', '-')}-cache"
241
- class="relative"
245
+ class="relative flex-shrink-0 ml-s"
242
246
  ?disabled=${isDisabled || this.__cacheState === 'busy'}
243
- ?hidden=${isReadonly || this.form[urlPath] !== ((_a = this.data) === null || _a === void 0 ? void 0 : _a[urlPath])}
247
+ ?hidden=${isSyncProhibited}
244
248
  @click=${this.__cache}
245
249
  >
246
250
  <foxy-i18n
@@ -271,27 +275,28 @@ export class EmailTemplateForm extends Base {
271
275
  </div>
272
276
  </vaadin-button>
273
277
  </div>
278
+
279
+ <foxy-internal-source-control
280
+ placeholder=${this.t('url_source_placeholder')}
281
+ property=${textPath}
282
+ label=${this.t('url_source_label')}
283
+ infer="content"
284
+ class="mt-m${((_b = this.data) === null || _b === void 0 ? void 0 : _b[textPath]) ? '' : ' hidden'}"
285
+ style="--lumo-border-radius: var(--lumo-border-radius-s)"
286
+ >
287
+ </foxy-internal-source-control>
274
288
  </div>
275
289
 
276
- <div
290
+ <foxy-internal-source-control
291
+ placeholder=${this.t('clipboard_source_placeholder')}
292
+ property=${textPath}
293
+ label=${this.t('clipboard_source_label')}
294
+ infer="content"
295
+ class="mb-m${contentChoice === 'clipboard' ? '' : ' hidden'}"
277
296
  style="--lumo-border-radius: var(--lumo-border-radius-s)"
278
297
  slot="clipboard"
279
- ?hidden=${contentChoice !== 'clipboard'}
280
298
  >
281
- <vaadin-text-area
282
- data-testid="${textPath.replace('_', '-')}-clipboard"
283
- id="cached-content"
284
- class="w-full mb-m"
285
- ?readonly=${isReadonly}
286
- ?disabled=${isDisabled}
287
- .value=${this.form[textPath]}
288
- @input=${(evt) => {
289
- const value = evt.currentTarget.value;
290
- this.edit({ [textPath]: value, [urlPath]: '' });
291
- }}
292
- >
293
- </vaadin-text-area>
294
- </div>
299
+ </foxy-internal-source-control>
295
300
  </x-choice>
296
301
  </x-group>
297
302
  `;
@@ -376,6 +381,7 @@ export class EmailTemplateForm extends Base {
376
381
  const url = (_b = (_a = this.data) === null || _a === void 0 ? void 0 : _a._links['fx:cache'].href) !== null && _b !== void 0 ? _b : '';
377
382
  const response = await new EmailTemplateForm.API(this).fetch(url, { method: 'POST' });
378
383
  this.__cacheState = response.ok ? 'idle' : 'fail';
384
+ this.refresh();
379
385
  }
380
386
  catch (_c) {
381
387
  this.__cacheState = 'fail';
@@ -1 +1 @@
1
- {"version":3,"file":"EmailTemplateForm.js","sourceRoot":"","sources":["../../../../src/elements/public/EmailTemplateForm/EmailTemplateForm.ts"],"names":[],"mappings":"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","sourcesContent":["import { CSSResultArray, PropertyDeclarations, TemplateResult, css, html } from 'lit-element';\nimport { Choice, Group, PropertyTable } from '../../private/index';\nimport { Data, Templates } from './types';\nimport { ScopedElementsMap, ScopedElementsMixin } from '@open-wc/scoped-elements';\n\nimport { ChoiceChangeEvent } from '../../private/events';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { DialogHideEvent } from '../../private/Dialog/DialogHideEvent';\nimport { InternalConfirmDialog } from '../../internal/InternalConfirmDialog/InternalConfirmDialog';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { TextAreaElement } from '@vaadin/vaadin-text-field/vaadin-text-area';\nimport { TextFieldElement } from '@vaadin/vaadin-text-field';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { classMap } from '../../../utils/class-map';\nimport { ifDefined } from 'lit-html/directives/if-defined';\n\nconst NS = 'email-template-form';\nconst Base = ScopedElementsMixin(\n ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS)))\n);\n\n/**\n * Form element for creating or editing email templates (`fx:email_template`).\n *\n * @slot description:before\n * @slot description:after\n *\n * @slot template-language:before\n * @slot template-language:after\n *\n * @slot content:before\n * @slot content:after\n *\n * @slot timestamps:before\n * @slot timestamps:after\n *\n * @slot create:before\n * @slot create:after\n *\n * @slot delete:before\n * @slot delete:after\n *\n * @element foxy-email-template-form\n * @since 1.14.0\n */\nexport class EmailTemplateForm extends Base<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n __cacheState: { attribute: false },\n __contentChoice: { attribute: false },\n };\n }\n\n static get styles(): CSSResultArray {\n return [\n ...super.styles,\n css`\n #cached-content::part(input-field) {\n max-height: 15em;\n }\n `,\n ];\n }\n\n static get scopedElements(): ScopedElementsMap {\n return {\n 'foxy-internal-select-control': customElements.get('foxy-internal-select-control'),\n 'foxy-internal-confirm-dialog': customElements.get('foxy-internal-confirm-dialog'),\n 'foxy-internal-text-control': customElements.get('foxy-internal-text-control'),\n 'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),\n 'foxy-spinner': customElements.get('foxy-spinner'),\n 'foxy-i18n': customElements.get('foxy-i18n'),\n 'vaadin-text-field': customElements.get('vaadin-text-field'),\n 'vaadin-text-area': customElements.get('vaadin-text-area'),\n 'vaadin-button': customElements.get('vaadin-button'),\n 'x-property-table': PropertyTable,\n 'x-choice': Choice,\n 'x-group': Group,\n };\n }\n\n templates: Templates = {};\n\n private __cacheState: 'idle' | 'busy' | 'fail' = 'idle';\n\n private __contentChoice: 'default' | 'url' | 'clipboard' = 'default';\n\n private __templateLanguageOptions = [\n { label: 'Nunjucks', value: 'nunjucks' },\n { label: 'Handlebars', value: 'handlebars' },\n { label: 'Pug', value: 'pug' },\n { label: 'Twig', value: 'twig' },\n { label: 'EJS', value: 'ejs' },\n ];\n\n render(): TemplateResult {\n const { hiddenSelector, href, lang, ns } = this;\n const action = href ? 'delete' : 'create';\n const isBusy = this.in('busy');\n const isFail = this.in('fail');\n\n return html`\n <div class=\"space-y-m\">\n ${hiddenSelector.matches('description', true) ? '' : this.__renderDescription()}\n\n <foxy-internal-text-control infer=\"subject\"></foxy-internal-text-control>\n\n ${this.data?.description === 'Email Receipt Template'\n ? ''\n : html`\n <foxy-internal-select-control\n infer=\"template-language\"\n .options=${this.__templateLanguageOptions}\n >\n </foxy-internal-select-control>\n `}\n\n <!-- -->\n\n ${hiddenSelector.matches('content', true) ? '' : this.__renderContent()}\n ${hiddenSelector.matches('timestamps', true) || !href ? '' : this.__renderTimestamps()}\n ${hiddenSelector.matches(action) ? '' : this.__renderAction(action)}\n\n <div\n data-testid=\"spinner\"\n class=${classMap({\n 'transition duration-500 ease-in-out absolute inset-0 flex': true,\n 'opacity-0 pointer-events-none': !isBusy && !isFail,\n })}\n >\n <foxy-spinner\n layout=\"vertical\"\n class=\"m-auto p-m bg-base shadow-xs rounded-t-l rounded-b-l\"\n state=${isFail ? 'error' : isBusy ? 'busy' : 'empty'}\n lang=${lang}\n ns=\"${ns} ${customElements.get('foxy-spinner')?.defaultNS ?? ''}\"\n >\n </foxy-spinner>\n </div>\n </div>\n `;\n }\n\n private __renderDescription() {\n const scope = 'description';\n\n return html`\n <div>\n ${this.renderTemplateOrSlot(`${scope}:before`)}\n\n <vaadin-text-field\n data-testid=${scope}\n class=\"w-full mb-s\"\n label=${this.t(scope)}\n ?disabled=${!this.in('idle') || this.disabledSelector.matches(scope)}\n ?readonly=${this.readonlySelector.matches(scope)}\n .value=${this.form?.description ?? ''}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && this.submit()}\n @input=${(evt: CustomEvent) => {\n this.edit({ description: (evt.currentTarget as TextFieldElement).value });\n }}\n >\n </vaadin-text-field>\n\n ${this.renderTemplateOrSlot(`${scope}:after`)}\n </div>\n `;\n }\n\n private __renderContent() {\n return html`\n <div data-testid=\"content\">\n ${this.renderTemplateOrSlot('content:before')}\n\n <div class=\"space-y-l\">\n ${this.__renderContentVariant('content_text_url', 'content_text', 'text_template')}\n ${this.__renderContentVariant('content_html_url', 'content_html', 'html_template')}\n </div>\n\n ${this.renderTemplateOrSlot('content:after')}\n </div>\n `;\n }\n\n private __renderContentVariant(\n urlPath: 'content_text_url' | 'content_html_url',\n textPath: 'content_text' | 'content_html',\n header: string\n ) {\n const isDisabled = !this.in('idle') || this.disabledSelector.matches('content', true);\n const isReadonly = this.readonlySelector.matches('content', true);\n const contentChoice = this.form[urlPath]\n ? 'url'\n : this.form[textPath]\n ? 'clipboard'\n : this.__contentChoice;\n\n return html`\n <x-group frame>\n <foxy-i18n\n class=${classMap({ 'transition-colors': true, 'text-disabled': isDisabled })}\n lang=${this.lang}\n slot=\"header\"\n key=${header}\n ns=${this.ns}\n >\n </foxy-i18n>\n\n <x-choice\n data-testid=\"${textPath.replace('_', '-')}-type\"\n .value=${contentChoice}\n .items=${['default', 'url', 'clipboard']}\n ?readonly=${isReadonly}\n ?disabled=${isDisabled}\n @change=${(evt: Event) => {\n if (evt instanceof ChoiceChangeEvent) {\n this.edit({ [textPath]: '', [urlPath]: '' });\n this.__contentChoice = evt.detail as 'url' | 'clipboard' | 'default';\n }\n }}\n >\n ${['default', 'url', 'clipboard'].map(value => {\n return html`\n <div slot=\"${value}-label\" class=\"py-s leading-s\">\n <foxy-i18n class=\"block\" lang=${this.lang} key=\"template_${value}\" ns=${this.ns}>\n </foxy-i18n>\n\n <foxy-i18n\n class=\"block text-s opacity-70\"\n lang=${this.lang}\n key=\"template_${value}_explainer\"\n ns=${this.ns}\n >\n </foxy-i18n>\n </div>\n `;\n })}\n\n <div\n style=\"--lumo-border-radius: var(--lumo-border-radius-s)\"\n slot=\"url\"\n ?hidden=${contentChoice !== 'url'}\n >\n <div class=\"flex items-center mt-0 mb-m\">\n <vaadin-text-field\n data-testid=\"${textPath.replace('_', '-')}-url\"\n value=${ifDefined(this.form[urlPath])}\n class=\"mr-s flex-grow\"\n ?readonly=${isReadonly}\n ?disabled=${isDisabled}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && this.submit()}\n @input=${(evt: CustomEvent) => {\n const value = (evt.currentTarget as TextFieldElement).value;\n this.edit({ [textPath]: '', [urlPath]: value });\n }}\n >\n </vaadin-text-field>\n\n <vaadin-button\n data-testid=\"${textPath.replace('_', '-')}-cache\"\n class=\"relative\"\n ?disabled=${isDisabled || this.__cacheState === 'busy'}\n ?hidden=${isReadonly || this.form[urlPath] !== this.data?.[urlPath]}\n @click=${this.__cache}\n >\n <foxy-i18n\n class=${classMap({\n 'relative transition-opacity': true,\n 'opacity-0': this.__cacheState !== 'idle',\n })}\n lang=${this.lang}\n key=\"cache\"\n ns=${this.ns}\n >\n </foxy-i18n>\n\n <div\n class=${classMap({\n 'absolute inset-0 flex transition-opacity': true,\n 'opacity-0': this.__cacheState === 'idle',\n })}\n >\n <foxy-spinner\n layout=\"no-label\"\n class=\"m-auto\"\n state=${this.__cacheState === 'fail' ? 'error' : 'busy'}\n lang=${this.lang}\n ns=${this.ns}\n >\n </foxy-spinner>\n </div>\n </vaadin-button>\n </div>\n </div>\n\n <div\n style=\"--lumo-border-radius: var(--lumo-border-radius-s)\"\n slot=\"clipboard\"\n ?hidden=${contentChoice !== 'clipboard'}\n >\n <vaadin-text-area\n data-testid=\"${textPath.replace('_', '-')}-clipboard\"\n id=\"cached-content\"\n class=\"w-full mb-m\"\n ?readonly=${isReadonly}\n ?disabled=${isDisabled}\n .value=${this.form[textPath]}\n @input=${(evt: CustomEvent) => {\n const value = (evt.currentTarget as TextAreaElement).value;\n this.edit({ [textPath]: value, [urlPath]: '' });\n }}\n >\n </vaadin-text-area>\n </div>\n </x-choice>\n </x-group>\n `;\n }\n\n private __renderTimestamps() {\n const scope = 'timestamps';\n\n return html`\n <div>\n ${this.renderTemplateOrSlot(`${scope}:before`)}\n\n <x-property-table\n data-testid=\"timestamps\"\n .items=${(['date_modified', 'date_created'] as const).map(field => ({\n name: this.t(field),\n value: this.data?.[field]\n ? this.t('date', { value: new Date(this.data[field] as string) })\n : '',\n }))}\n >\n </x-property-table>\n\n ${this.renderTemplateOrSlot(`${scope}:after`)}\n </div>\n `;\n }\n\n private __renderAction(action: string) {\n const { disabledSelector, href, lang, ns } = this;\n\n const isTemplateValid = this.in({ idle: { template: { dirty: 'valid' } } });\n const isSnapshotValid = this.in({ idle: { snapshot: { dirty: 'valid' } } });\n const isDisabled = !this.in('idle') || disabledSelector.matches(action, true);\n const isValid = isTemplateValid || isSnapshotValid;\n\n const handleClick = (evt: Event) => {\n if (action === 'delete') {\n const confirm = this.renderRoot.querySelector('#confirm');\n (confirm as InternalConfirmDialog).show(evt.currentTarget as HTMLElement);\n } else {\n this.submit();\n }\n };\n\n return html`\n <div>\n ${this.renderTemplateOrSlot(`${action}:before`)}\n\n <foxy-internal-confirm-dialog\n message=\"delete_prompt\"\n confirm=\"delete\"\n cancel=\"cancel\"\n header=\"delete\"\n theme=\"primary error\"\n lang=${lang}\n ns=${ns}\n id=\"confirm\"\n data-testid=\"confirm\"\n @hide=${(evt: DialogHideEvent) => {\n if (!evt.detail.cancelled) this.delete();\n }}\n >\n </foxy-internal-confirm-dialog>\n\n <vaadin-button\n class=\"w-full\"\n theme=${this.in('idle') ? (href ? 'error' : 'primary success') : ''}\n data-testid=${action}\n ?disabled=${(this.in({ idle: 'template' }) && !isValid) || isDisabled}\n @click=${handleClick}\n >\n <foxy-i18n ns=${ns} key=${action} lang=${lang}></foxy-i18n>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot(`${action}:after`)}\n </div>\n `;\n }\n\n private async __cache(): Promise<void> {\n this.__cacheState = 'busy';\n\n try {\n const url = this.data?._links['fx:cache'].href ?? '';\n const response = await new EmailTemplateForm.API(this).fetch(url, { method: 'POST' });\n\n this.__cacheState = response.ok ? 'idle' : 'fail';\n } catch {\n this.__cacheState = 'fail';\n }\n }\n}\n"]}
1
+ {"version":3,"file":"EmailTemplateForm.js","sourceRoot":"","sources":["../../../../src/elements/public/EmailTemplateForm/EmailTemplateForm.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PropertyDeclarations, TemplateResult } from 'lit-element';\nimport type { InternalConfirmDialog } from '../../internal/InternalConfirmDialog/InternalConfirmDialog';\nimport type { ScopedElementsMap } from '@open-wc/scoped-elements';\nimport type { TextFieldElement } from '@vaadin/vaadin-text-field';\nimport type { Data, Templates } from './types';\n\nimport { Choice, Group, PropertyTable } from '../../private/index';\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements';\nimport { ChoiceChangeEvent } from '../../private/events';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { DialogHideEvent } from '../../private/Dialog/DialogHideEvent';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { classMap } from '../../../utils/class-map';\nimport { html } from 'lit-element';\n\nconst NS = 'email-template-form';\nconst Base = ScopedElementsMixin(\n ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS)))\n);\n\n/**\n * Form element for creating or editing email templates (`fx:email_template`).\n *\n * @slot description:before\n * @slot description:after\n *\n * @slot template-language:before\n * @slot template-language:after\n *\n * @slot content:before\n * @slot content:after\n *\n * @slot timestamps:before\n * @slot timestamps:after\n *\n * @slot create:before\n * @slot create:after\n *\n * @slot delete:before\n * @slot delete:after\n *\n * @element foxy-email-template-form\n * @since 1.14.0\n */\nexport class EmailTemplateForm extends Base<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n __cacheState: { attribute: false },\n __contentChoice: { attribute: false },\n };\n }\n\n static get scopedElements(): ScopedElementsMap {\n return {\n 'foxy-internal-select-control': customElements.get('foxy-internal-select-control'),\n 'foxy-internal-confirm-dialog': customElements.get('foxy-internal-confirm-dialog'),\n 'foxy-internal-source-control': customElements.get('foxy-internal-source-control'),\n 'foxy-internal-text-control': customElements.get('foxy-internal-text-control'),\n 'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),\n 'foxy-spinner': customElements.get('foxy-spinner'),\n 'foxy-i18n': customElements.get('foxy-i18n'),\n 'vaadin-text-field': customElements.get('vaadin-text-field'),\n 'vaadin-button': customElements.get('vaadin-button'),\n 'x-property-table': PropertyTable,\n 'x-choice': Choice,\n 'x-group': Group,\n };\n }\n\n templates: Templates = {};\n\n private __templateLanguageOptions = [\n { label: 'Nunjucks', value: 'nunjucks' },\n { label: 'Handlebars', value: 'handlebars' },\n { label: 'Pug', value: 'pug' },\n { label: 'Twig', value: 'twig' },\n { label: 'EJS', value: 'ejs' },\n ];\n\n private __textContentChoice: 'default' | 'url' | 'clipboard' = 'default';\n\n private __htmlContentChoice: 'default' | 'url' | 'clipboard' = 'default';\n\n private __cacheState: 'idle' | 'busy' | 'fail' = 'idle';\n\n render(): TemplateResult {\n const { hiddenSelector, href, lang, ns } = this;\n const action = href ? 'delete' : 'create';\n const isBusy = this.in('busy');\n const isFail = this.in('fail');\n\n return html`\n <div class=\"space-y-m\">\n ${hiddenSelector.matches('description', true) ? '' : this.__renderDescription()}\n\n <foxy-internal-text-control infer=\"subject\"></foxy-internal-text-control>\n\n ${this.data?.description === 'Email Receipt Template'\n ? ''\n : html`\n <foxy-internal-select-control\n infer=\"template-language\"\n .options=${this.__templateLanguageOptions}\n >\n </foxy-internal-select-control>\n `}\n\n <!-- -->\n\n ${hiddenSelector.matches('content', true) ? '' : this.__renderContent()}\n ${hiddenSelector.matches('timestamps', true) || !href ? '' : this.__renderTimestamps()}\n ${hiddenSelector.matches(action) ? '' : this.__renderAction(action)}\n\n <div\n data-testid=\"spinner\"\n class=${classMap({\n 'transition duration-500 ease-in-out absolute inset-0 flex': true,\n 'opacity-0 pointer-events-none': !isBusy && !isFail,\n })}\n >\n <foxy-spinner\n layout=\"vertical\"\n class=\"m-auto p-m bg-base shadow-xs rounded-t-l rounded-b-l\"\n state=${isFail ? 'error' : isBusy ? 'busy' : 'empty'}\n lang=${lang}\n ns=\"${ns} ${customElements.get('foxy-spinner')?.defaultNS ?? ''}\"\n >\n </foxy-spinner>\n </div>\n </div>\n `;\n }\n\n protected async _sendPost(edits: Partial<Data>): Promise<Data> {\n const data = await super._sendPost(edits);\n if (!data.content_html_url && !data.content_text_url) return data;\n\n this.__cacheState = 'busy';\n const url = data._links['fx:cache'].href;\n const response = await new EmailTemplateForm.API(this).fetch(url, { method: 'POST' });\n this.__cacheState = response.ok ? 'idle' : 'fail';\n\n return await this._fetch(data._links.self.href);\n }\n\n protected async _sendPatch(edits: Partial<Data>): Promise<Data> {\n const data = await super._sendPatch(edits);\n if (!data.content_html_url && !data.content_text_url) return data;\n\n this.__cacheState = 'busy';\n const url = data._links['fx:cache'].href;\n const response = await new EmailTemplateForm.API(this).fetch(url, { method: 'POST' });\n this.__cacheState = response.ok ? 'idle' : 'fail';\n\n return await this._fetch(data._links.self.href);\n }\n\n private __renderDescription() {\n const scope = 'description';\n\n return html`\n <div>\n ${this.renderTemplateOrSlot(`${scope}:before`)}\n\n <vaadin-text-field\n data-testid=${scope}\n class=\"w-full mb-s\"\n label=${this.t(scope)}\n ?disabled=${!this.in('idle') || this.disabledSelector.matches(scope)}\n ?readonly=${this.readonlySelector.matches(scope)}\n .value=${this.form?.description ?? ''}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && this.submit()}\n @input=${(evt: CustomEvent) => {\n this.edit({ description: (evt.currentTarget as TextFieldElement).value });\n }}\n >\n </vaadin-text-field>\n\n ${this.renderTemplateOrSlot(`${scope}:after`)}\n </div>\n `;\n }\n\n private __renderContent() {\n const variants = ['text', 'html'] as const;\n return html`\n <div data-testid=\"content\">\n <div class=\"space-y-l\">${variants.map(v => this.__renderContentVariant(v))}</div>\n </div>\n `;\n }\n\n private __renderContentVariant(variant: 'text' | 'html') {\n const urlPath = variant === 'text' ? 'content_text_url' : 'content_html_url';\n const textPath = variant === 'text' ? 'content_text' : 'content_html';\n const header = variant === 'text' ? 'text_template' : 'html_template';\n const urlValue = this.form[urlPath];\n const textValue = this.form[textPath];\n const contentChoiceKey = variant === 'text' ? '__textContentChoice' : '__htmlContentChoice';\n const contentChoice = urlValue ? 'url' : textValue ? 'clipboard' : this[contentChoiceKey];\n\n const isDisabled = !this.in('idle') || this.disabledSelector.matches('content', true);\n const isReadonly = this.readonlySelector.matches('content', true);\n const isSyncProhibited = isReadonly || !this.data?.[urlPath] || urlValue !== this.data[urlPath];\n\n return html`\n <x-group frame>\n <foxy-i18n\n class=${classMap({ 'transition-colors': true, 'text-disabled': isDisabled })}\n lang=${this.lang}\n slot=\"header\"\n key=${header}\n ns=${this.ns}\n >\n </foxy-i18n>\n\n <x-choice\n data-testid=\"${textPath.replace('_', '-')}-type\"\n .value=${contentChoice}\n .items=${['default', 'url', 'clipboard']}\n ?readonly=${isReadonly}\n ?disabled=${isDisabled}\n @change=${(evt: Event) => {\n if (evt instanceof ChoiceChangeEvent) {\n this.edit({ [textPath]: '', [urlPath]: '' });\n this[contentChoiceKey] = evt.detail as 'url' | 'clipboard' | 'default';\n }\n }}\n >\n ${['default', 'url', 'clipboard'].map(value => {\n return html`\n <div slot=\"${value}-label\" class=\"py-s leading-s\">\n <foxy-i18n class=\"block\" lang=${this.lang} key=\"template_${value}\" ns=${this.ns}>\n </foxy-i18n>\n </div>\n `;\n })}\n\n <div\n style=\"--lumo-border-radius: var(--lumo-border-radius-s)\"\n class=\"mb-m\"\n slot=\"url\"\n ?hidden=${contentChoice !== 'url'}\n >\n <div class=\"flex items-end mt-0\">\n <vaadin-text-field\n data-testid=\"${textPath.replace('_', '-')}-url\"\n placeholder=\"https://example.com/my-template\"\n label=${this.t('url')}\n class=\"flex-1 min-w-0\"\n value=${ifDefined(this.form[urlPath])}\n ?readonly=${isReadonly}\n ?disabled=${isDisabled}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && this.submit()}\n @input=${(evt: CustomEvent) => {\n const value = (evt.currentTarget as TextFieldElement).value;\n this.edit({ [textPath]: '', [urlPath]: value });\n }}\n >\n </vaadin-text-field>\n\n <vaadin-button\n data-testid=\"${textPath.replace('_', '-')}-cache\"\n class=\"relative flex-shrink-0 ml-s\"\n ?disabled=${isDisabled || this.__cacheState === 'busy'}\n ?hidden=${isSyncProhibited}\n @click=${this.__cache}\n >\n <foxy-i18n\n class=${classMap({\n 'relative transition-opacity': true,\n 'opacity-0': this.__cacheState !== 'idle',\n })}\n lang=${this.lang}\n key=\"cache\"\n ns=${this.ns}\n >\n </foxy-i18n>\n\n <div\n class=${classMap({\n 'absolute inset-0 flex transition-opacity': true,\n 'opacity-0': this.__cacheState === 'idle',\n })}\n >\n <foxy-spinner\n layout=\"no-label\"\n class=\"m-auto\"\n state=${this.__cacheState === 'fail' ? 'error' : 'busy'}\n lang=${this.lang}\n ns=${this.ns}\n >\n </foxy-spinner>\n </div>\n </vaadin-button>\n </div>\n\n <foxy-internal-source-control\n placeholder=${this.t('url_source_placeholder')}\n property=${textPath}\n label=${this.t('url_source_label')}\n infer=\"content\"\n class=\"mt-m${this.data?.[textPath] ? '' : ' hidden'}\"\n style=\"--lumo-border-radius: var(--lumo-border-radius-s)\"\n >\n </foxy-internal-source-control>\n </div>\n\n <foxy-internal-source-control\n placeholder=${this.t('clipboard_source_placeholder')}\n property=${textPath}\n label=${this.t('clipboard_source_label')}\n infer=\"content\"\n class=\"mb-m${contentChoice === 'clipboard' ? '' : ' hidden'}\"\n style=\"--lumo-border-radius: var(--lumo-border-radius-s)\"\n slot=\"clipboard\"\n >\n </foxy-internal-source-control>\n </x-choice>\n </x-group>\n `;\n }\n\n private __renderTimestamps() {\n const scope = 'timestamps';\n\n return html`\n <div>\n ${this.renderTemplateOrSlot(`${scope}:before`)}\n\n <x-property-table\n data-testid=\"timestamps\"\n .items=${(['date_modified', 'date_created'] as const).map(field => ({\n name: this.t(field),\n value: this.data?.[field]\n ? this.t('date', { value: new Date(this.data[field] as string) })\n : '',\n }))}\n >\n </x-property-table>\n\n ${this.renderTemplateOrSlot(`${scope}:after`)}\n </div>\n `;\n }\n\n private __renderAction(action: string) {\n const { disabledSelector, href, lang, ns } = this;\n\n const isTemplateValid = this.in({ idle: { template: { dirty: 'valid' } } });\n const isSnapshotValid = this.in({ idle: { snapshot: { dirty: 'valid' } } });\n const isDisabled = !this.in('idle') || disabledSelector.matches(action, true);\n const isValid = isTemplateValid || isSnapshotValid;\n\n const handleClick = (evt: Event) => {\n if (action === 'delete') {\n const confirm = this.renderRoot.querySelector('#confirm');\n (confirm as InternalConfirmDialog).show(evt.currentTarget as HTMLElement);\n } else {\n this.submit();\n }\n };\n\n return html`\n <div>\n ${this.renderTemplateOrSlot(`${action}:before`)}\n\n <foxy-internal-confirm-dialog\n message=\"delete_prompt\"\n confirm=\"delete\"\n cancel=\"cancel\"\n header=\"delete\"\n theme=\"primary error\"\n lang=${lang}\n ns=${ns}\n id=\"confirm\"\n data-testid=\"confirm\"\n @hide=${(evt: DialogHideEvent) => {\n if (!evt.detail.cancelled) this.delete();\n }}\n >\n </foxy-internal-confirm-dialog>\n\n <vaadin-button\n class=\"w-full\"\n theme=${this.in('idle') ? (href ? 'error' : 'primary success') : ''}\n data-testid=${action}\n ?disabled=${(this.in({ idle: 'template' }) && !isValid) || isDisabled}\n @click=${handleClick}\n >\n <foxy-i18n ns=${ns} key=${action} lang=${lang}></foxy-i18n>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot(`${action}:after`)}\n </div>\n `;\n }\n\n private async __cache(): Promise<void> {\n this.__cacheState = 'busy';\n\n try {\n const url = this.data?._links['fx:cache'].href ?? '';\n const response = await new EmailTemplateForm.API(this).fetch(url, { method: 'POST' });\n this.__cacheState = response.ok ? 'idle' : 'fail';\n this.refresh();\n } catch {\n this.__cacheState = 'fail';\n }\n }\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  import '@vaadin/vaadin-text-field/vaadin-text-field';
2
- import '@vaadin/vaadin-text-field/vaadin-text-area';
3
2
  import '@vaadin/vaadin-button';
4
3
  import '../../internal/InternalSelectControl/index';
5
4
  import '../../internal/InternalConfirmDialog/index';
5
+ import '../../internal/InternalSourceControl/index';
6
6
  import '../../internal/InternalTextControl/index';
7
7
  import '../../internal/InternalSandbox/index';
8
8
  import '../Spinner/index';
@@ -1,8 +1,8 @@
1
1
  import '@vaadin/vaadin-text-field/vaadin-text-field';
2
- import '@vaadin/vaadin-text-field/vaadin-text-area';
3
2
  import '@vaadin/vaadin-button';
4
3
  import "../../internal/InternalSelectControl/index.js";
5
4
  import "../../internal/InternalConfirmDialog/index.js";
5
+ import "../../internal/InternalSourceControl/index.js";
6
6
  import "../../internal/InternalTextControl/index.js";
7
7
  import "../../internal/InternalSandbox/index.js";
8
8
  import "../Spinner/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/EmailTemplateForm/index.ts"],"names":[],"mappings":"AAAA,OAAO,6CAA6C,CAAC;AACrD,OAAO,4CAA4C,CAAC;AACpD,OAAO,uBAAuB,CAAC;AAE/B,uDAAoD;AACpD,uDAAoD;AACpD,qDAAkD;AAClD,iDAA8C;AAE9C,6BAA0B;AAC1B,0BAAuB;AAEvB,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AAExD,cAAc,CAAC,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAC;AAErE,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import '@vaadin/vaadin-text-field/vaadin-text-field';\nimport '@vaadin/vaadin-text-field/vaadin-text-area';\nimport '@vaadin/vaadin-button';\n\nimport '../../internal/InternalSelectControl/index';\nimport '../../internal/InternalConfirmDialog/index';\nimport '../../internal/InternalTextControl/index';\nimport '../../internal/InternalSandbox/index';\n\nimport '../Spinner/index';\nimport '../I18n/index';\n\nimport { EmailTemplateForm } from './EmailTemplateForm';\n\ncustomElements.define('foxy-email-template-form', EmailTemplateForm);\n\nexport { EmailTemplateForm };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/EmailTemplateForm/index.ts"],"names":[],"mappings":"AAAA,OAAO,6CAA6C,CAAC;AACrD,OAAO,uBAAuB,CAAC;AAE/B,uDAAoD;AACpD,uDAAoD;AACpD,uDAAoD;AACpD,qDAAkD;AAClD,iDAA8C;AAE9C,6BAA0B;AAC1B,0BAAuB;AAEvB,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AAExD,cAAc,CAAC,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAC;AAErE,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import '@vaadin/vaadin-text-field/vaadin-text-field';\nimport '@vaadin/vaadin-button';\n\nimport '../../internal/InternalSelectControl/index';\nimport '../../internal/InternalConfirmDialog/index';\nimport '../../internal/InternalSourceControl/index';\nimport '../../internal/InternalTextControl/index';\nimport '../../internal/InternalSandbox/index';\n\nimport '../Spinner/index';\nimport '../I18n/index';\n\nimport { EmailTemplateForm } from './EmailTemplateForm';\n\ncustomElements.define('foxy-email-template-form', EmailTemplateForm);\n\nexport { EmailTemplateForm };\n"]}
@@ -14,19 +14,65 @@ import { LitElement } from 'lit-element';
14
14
  */
15
15
  export declare class PaymentsApi extends LitElement {
16
16
  static get properties(): PropertyDeclarations;
17
- /** URL of the `fx:payment_method_set_hosted_payment_gateways` collection. */
17
+ /**
18
+ * Base URL of the `fx:payment_method_set_hosted_payment_gateway` resource (without ID).
19
+ * @example https://api.foxy.io/payment_method_set_hosted_payment_gateways/
20
+ */
21
+ paymentMethodSetHostedPaymentGatewayBaseUrl: string | null;
22
+ /**
23
+ * URL of the `fx:payment_method_set_hosted_payment_gateways` collection.
24
+ * @example https://api.foxy.io/stores/0/payment_method_set_hosted_payment_gateways
25
+ */
18
26
  paymentMethodSetHostedPaymentGatewaysUrl: string | null;
19
- /** URL of the `fx:hosted_payment_gateways` property helper. */
27
+ /**
28
+ * URL of the `fx:hosted_payment_gateways` property helper.
29
+ * @example https://api.foxy.io/property_helpers/hosted_payment_gateways
30
+ */
20
31
  hostedPaymentGatewaysHelperUrl: string | null;
21
- /** URL of the `fx:hosted_payment_gateways` collection. */
32
+ /**
33
+ * Base URL of the `fx:hosted_payment_gateway` resource (without ID).
34
+ * @example https://api.foxy.io/hosted_payment_gateways/
35
+ */
36
+ hostedPaymentGatewayBaseUrl: string | null;
37
+ /**
38
+ * URL of the `fx:hosted_payment_gateways` collection.
39
+ * @example https://api.foxy.io/stores/0/hosted_payment_gateways
40
+ */
22
41
  hostedPaymentGatewaysUrl: string | null;
23
- /** URL of the `fx:payment_gateways` property helper. */
42
+ /**
43
+ * URL of the `fx:payment_gateways` property helper.
44
+ * @example https://api.foxy.io/property_helpers/payment_gateways
45
+ */
24
46
  paymentGatewaysHelperUrl: string | null;
25
- /** URL of the `fx:payment_method_sets` collection. */
47
+ /**
48
+ * Base URL of the `fx:payment_method_set` resource (without ID).
49
+ * @example https://api.foxy.io/payment_method_sets/
50
+ */
51
+ paymentMethodSetBaseUrl: string | null;
52
+ /**
53
+ * URL of the `fx:payment_method_sets` collection.
54
+ * @example https://api.foxy.io/stores/0/payment_method_sets
55
+ */
26
56
  paymentMethodSetsUrl: string | null;
27
- /** URL of the `fx:fraud_protections` collection. */
57
+ /**
58
+ * Base URL of the `fx:fraud_protection` resource (without ID).
59
+ * @example https://api.foxy.io/fraud_protections/
60
+ */
61
+ fraudProtectionBaseUrl: string | null;
62
+ /**
63
+ * URL of the `fx:fraud_protections` collection.
64
+ * @example https://api.foxy.io/stores/0/fraud_protections
65
+ */
28
66
  fraudProtectionsUrl: string | null;
29
- /** URL of the `fx:payment_gateways` collection. */
67
+ /**
68
+ * Base URL of the `fx:payment_gateway` resource (without ID).
69
+ * @example https://api.foxy.io/payment_gateways/
70
+ */
71
+ paymentGatewayBaseUrl: string | null;
72
+ /**
73
+ * URL of the `fx:payment_gateways` collection.
74
+ * @example https://api.foxy.io/stores/0/payment_gateways
75
+ */
30
76
  paymentGatewaysUrl: string | null;
31
77
  private readonly __api;
32
78
  private readonly __fetch;
@@ -17,19 +17,65 @@ import { API } from "../NucleonElement/API.js";
17
17
  export class PaymentsApi extends LitElement {
18
18
  constructor() {
19
19
  super(...arguments);
20
- /** URL of the `fx:payment_method_set_hosted_payment_gateways` collection. */
20
+ /**
21
+ * Base URL of the `fx:payment_method_set_hosted_payment_gateway` resource (without ID).
22
+ * @example https://api.foxy.io/payment_method_set_hosted_payment_gateways/
23
+ */
24
+ this.paymentMethodSetHostedPaymentGatewayBaseUrl = null;
25
+ /**
26
+ * URL of the `fx:payment_method_set_hosted_payment_gateways` collection.
27
+ * @example https://api.foxy.io/stores/0/payment_method_set_hosted_payment_gateways
28
+ */
21
29
  this.paymentMethodSetHostedPaymentGatewaysUrl = null;
22
- /** URL of the `fx:hosted_payment_gateways` property helper. */
30
+ /**
31
+ * URL of the `fx:hosted_payment_gateways` property helper.
32
+ * @example https://api.foxy.io/property_helpers/hosted_payment_gateways
33
+ */
23
34
  this.hostedPaymentGatewaysHelperUrl = null;
24
- /** URL of the `fx:hosted_payment_gateways` collection. */
35
+ /**
36
+ * Base URL of the `fx:hosted_payment_gateway` resource (without ID).
37
+ * @example https://api.foxy.io/hosted_payment_gateways/
38
+ */
39
+ this.hostedPaymentGatewayBaseUrl = null;
40
+ /**
41
+ * URL of the `fx:hosted_payment_gateways` collection.
42
+ * @example https://api.foxy.io/stores/0/hosted_payment_gateways
43
+ */
25
44
  this.hostedPaymentGatewaysUrl = null;
26
- /** URL of the `fx:payment_gateways` property helper. */
45
+ /**
46
+ * URL of the `fx:payment_gateways` property helper.
47
+ * @example https://api.foxy.io/property_helpers/payment_gateways
48
+ */
27
49
  this.paymentGatewaysHelperUrl = null;
28
- /** URL of the `fx:payment_method_sets` collection. */
50
+ /**
51
+ * Base URL of the `fx:payment_method_set` resource (without ID).
52
+ * @example https://api.foxy.io/payment_method_sets/
53
+ */
54
+ this.paymentMethodSetBaseUrl = null;
55
+ /**
56
+ * URL of the `fx:payment_method_sets` collection.
57
+ * @example https://api.foxy.io/stores/0/payment_method_sets
58
+ */
29
59
  this.paymentMethodSetsUrl = null;
30
- /** URL of the `fx:fraud_protections` collection. */
60
+ /**
61
+ * Base URL of the `fx:fraud_protection` resource (without ID).
62
+ * @example https://api.foxy.io/fraud_protections/
63
+ */
64
+ this.fraudProtectionBaseUrl = null;
65
+ /**
66
+ * URL of the `fx:fraud_protections` collection.
67
+ * @example https://api.foxy.io/stores/0/fraud_protections
68
+ */
31
69
  this.fraudProtectionsUrl = null;
32
- /** URL of the `fx:payment_gateways` collection. */
70
+ /**
71
+ * Base URL of the `fx:payment_gateway` resource (without ID).
72
+ * @example https://api.foxy.io/payment_gateways/
73
+ */
74
+ this.paymentGatewayBaseUrl = null;
75
+ /**
76
+ * URL of the `fx:payment_gateways` collection.
77
+ * @example https://api.foxy.io/stores/0/payment_gateways
78
+ */
33
79
  this.paymentGatewaysUrl = null;
34
80
  this.__api = new API(this);
35
81
  this.__fetch = this.__api.fetch.bind(this.__api);
@@ -40,21 +86,31 @@ export class PaymentsApi extends LitElement {
40
86
  return;
41
87
  if (evt.defaultPrevented)
42
88
  return;
43
- const { paymentMethodSetHostedPaymentGatewaysUrl, hostedPaymentGatewaysHelperUrl, paymentGatewaysHelperUrl, hostedPaymentGatewaysUrl, paymentMethodSetsUrl, fraudProtectionsUrl, paymentGatewaysUrl, } = this;
89
+ const { paymentMethodSetHostedPaymentGatewaysUrl, paymentMethodSetHostedPaymentGatewayBaseUrl = paymentMethodSetHostedPaymentGatewaysUrl, hostedPaymentGatewaysHelperUrl, paymentGatewaysHelperUrl, hostedPaymentGatewaysUrl, hostedPaymentGatewayBaseUrl = hostedPaymentGatewaysUrl, paymentMethodSetsUrl, paymentMethodSetBaseUrl = paymentMethodSetsUrl, fraudProtectionsUrl, fraudProtectionBaseUrl = fraudProtectionsUrl, paymentGatewaysUrl, paymentGatewayBaseUrl = paymentGatewaysUrl, } = this;
44
90
  if (paymentMethodSetHostedPaymentGatewaysUrl === null)
45
91
  return;
92
+ if (paymentMethodSetHostedPaymentGatewayBaseUrl === null)
93
+ return;
46
94
  if (hostedPaymentGatewaysHelperUrl === null)
47
95
  return;
48
96
  if (paymentGatewaysHelperUrl === null)
49
97
  return;
50
98
  if (hostedPaymentGatewaysUrl === null)
51
99
  return;
100
+ if (hostedPaymentGatewayBaseUrl === null)
101
+ return;
52
102
  if (paymentMethodSetsUrl === null)
53
103
  return;
104
+ if (paymentMethodSetBaseUrl === null)
105
+ return;
54
106
  if (fraudProtectionsUrl === null)
55
107
  return;
108
+ if (fraudProtectionBaseUrl === null)
109
+ return;
56
110
  if (paymentGatewaysUrl === null)
57
111
  return;
112
+ if (paymentGatewayBaseUrl === null)
113
+ return;
58
114
  const createGetter = (link) => (id) => {
59
115
  const url = new URL(link);
60
116
  if (!url.pathname.endsWith('/'))
@@ -70,10 +126,10 @@ export class PaymentsApi extends LitElement {
70
126
  fraudProtectionsUrl,
71
127
  paymentGatewaysUrl,
72
128
  getPaymentMethodSetHostedPaymentGatewayUrl: createGetter(paymentMethodSetHostedPaymentGatewaysUrl),
73
- getHostedPaymentGatewayUrl: createGetter(hostedPaymentGatewaysUrl),
74
- getPaymentMethodSetUrl: createGetter(paymentMethodSetsUrl),
75
- getFraudProtectionUrl: createGetter(fraudProtectionsUrl),
76
- getPaymentGatewayUrl: createGetter(paymentGatewaysUrl),
129
+ getHostedPaymentGatewayUrl: createGetter(hostedPaymentGatewayBaseUrl),
130
+ getPaymentMethodSetUrl: createGetter(paymentMethodSetBaseUrl),
131
+ getFraudProtectionUrl: createGetter(fraudProtectionBaseUrl),
132
+ getPaymentGatewayUrl: createGetter(paymentGatewayBaseUrl),
77
133
  request: evt.request,
78
134
  fetch: this.__fetch,
79
135
  });
@@ -85,14 +141,21 @@ export class PaymentsApi extends LitElement {
85
141
  }
86
142
  static get properties() {
87
143
  return {
144
+ paymentMethodSetHostedPaymentGatewayBaseUrl: {
145
+ attribute: 'payment-method-set-hosted-payment-gateway-base-url',
146
+ },
88
147
  paymentMethodSetHostedPaymentGatewaysUrl: {
89
148
  attribute: 'payment-method-set-hosted-payment-gateways-url',
90
149
  },
91
150
  hostedPaymentGatewaysHelperUrl: { attribute: 'hosted-payment-gateways-helper-url' },
151
+ hostedPaymentGatewayBaseUrl: { attribute: 'hosted-payment-gateway-base-url' },
92
152
  hostedPaymentGatewaysUrl: { attribute: 'hosted-payment-gateways-url' },
93
153
  paymentGatewaysHelperUrl: { attribute: 'payment-gateways-helper-url' },
154
+ paymentMethodSetBaseUrl: { attribute: 'payment-method-set-base-url' },
94
155
  paymentMethodSetsUrl: { attribute: 'payment-method-sets-url' },
156
+ fraudProtectionBaseUrl: { attribute: 'fraud-protection-base-url' },
95
157
  fraudProtectionsUrl: { attribute: 'fraud-protections-url' },
158
+ paymentGatewayBaseUrl: { attribute: 'payment-gateway-base-url' },
96
159
  paymentGatewaysUrl: { attribute: 'payment-gateways-url' },
97
160
  };
98
161
  }