@foxy.io/elements 1.15.0-beta.3 → 1.15.0-beta.6

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 (181) hide show
  1. package/dist/cdn/foxy-access-recovery-form.js +1 -1
  2. package/dist/cdn/foxy-address-card.js +2 -2
  3. package/dist/cdn/foxy-address-form.js +1 -1
  4. package/dist/cdn/foxy-applied-tax-card.js +1 -1
  5. package/dist/cdn/foxy-attribute-card.js +1 -1
  6. package/dist/cdn/foxy-attribute-form.js +1 -1
  7. package/dist/cdn/foxy-cancellation-form.js +1 -1
  8. package/dist/cdn/foxy-collection-page.js +1 -1
  9. package/dist/cdn/foxy-collection-pages.js +1 -1
  10. package/dist/cdn/foxy-coupon-card.js +1 -1
  11. package/dist/cdn/foxy-coupon-code-form.js +1 -1
  12. package/dist/cdn/foxy-coupon-codes-form.js +1 -1
  13. package/dist/cdn/foxy-coupon-form.js +1 -1
  14. package/dist/cdn/foxy-custom-field-card.js +1 -1
  15. package/dist/cdn/foxy-custom-field-form.js +1 -1
  16. package/dist/cdn/foxy-customer-api.js +1 -1
  17. package/dist/cdn/foxy-customer-card.js +1 -1
  18. package/dist/cdn/foxy-customer-form.js +1 -1
  19. package/dist/cdn/foxy-customer-portal-settings.js +1 -169
  20. package/dist/cdn/foxy-customer-portal.js +2 -2
  21. package/dist/cdn/foxy-customer.js +1 -1
  22. package/dist/cdn/foxy-customers-table.js +1 -1
  23. package/dist/cdn/foxy-discount-card.js +1 -1
  24. package/dist/cdn/foxy-donation.js +1 -1
  25. package/dist/cdn/foxy-email-template-form.js +1 -1
  26. package/dist/cdn/foxy-error-entry-card.js +1 -1
  27. package/dist/cdn/foxy-form-dialog.js +1 -1
  28. package/dist/cdn/foxy-generate-codes-form.js +1 -1
  29. package/dist/cdn/foxy-gift-card-card.js +1 -0
  30. package/dist/cdn/foxy-gift-card-code-form.js +1 -0
  31. package/dist/cdn/foxy-gift-card-codes-form.js +1 -0
  32. package/dist/cdn/foxy-gift-card-form.js +1 -0
  33. package/dist/cdn/foxy-i18n.js +1 -1
  34. package/dist/cdn/foxy-items-form.js +1 -1
  35. package/dist/cdn/foxy-nucleon-element.js +1 -1
  36. package/dist/cdn/foxy-pagination.js +1 -1
  37. package/dist/cdn/foxy-payment-card.js +1 -1
  38. package/dist/cdn/foxy-payment-method-card.js +1 -1
  39. package/dist/cdn/foxy-query-builder.js +1 -1
  40. package/dist/cdn/foxy-sign-in-form.js +1 -1
  41. package/dist/cdn/foxy-spinner.js +2 -2
  42. package/dist/cdn/foxy-subscription-card.js +1 -1
  43. package/dist/cdn/foxy-subscription-form.js +1 -1
  44. package/dist/cdn/foxy-subscriptions-table.js +1 -1
  45. package/dist/cdn/foxy-table.js +1 -1
  46. package/dist/cdn/foxy-tax-card.js +1 -1
  47. package/dist/cdn/foxy-tax-form.js +1 -1
  48. package/dist/cdn/foxy-template-config-form.js +1 -1
  49. package/dist/cdn/foxy-template-form.js +1 -1
  50. package/dist/cdn/foxy-transaction-card.js +1 -1
  51. package/dist/cdn/foxy-transactions-table.js +1 -1
  52. package/dist/cdn/foxy-user-form.js +1 -1
  53. package/dist/cdn/foxy-users-table.js +1 -1
  54. package/dist/cdn/{shared-9af7b5f0.js → shared-02945b27.js} +1 -1
  55. package/dist/cdn/{shared-a8d96c23.js → shared-06e64d75.js} +1 -1
  56. package/dist/cdn/{shared-b03b6d72.js → shared-07049bfe.js} +1 -1
  57. package/dist/cdn/{shared-ccea5a33.js → shared-08c63028.js} +1 -1
  58. package/dist/cdn/shared-09069d7c.js +1 -0
  59. package/dist/cdn/shared-11708514.js +1 -0
  60. package/dist/cdn/{shared-a11160e7.js → shared-20b9ce70.js} +1 -1
  61. package/dist/cdn/{shared-d3831f99.js → shared-21419f10.js} +1 -1
  62. package/dist/cdn/shared-25e67340.js +302 -0
  63. package/dist/cdn/{shared-423a4840.js → shared-39e3ae67.js} +1 -1
  64. package/dist/cdn/shared-3be96355.js +1 -0
  65. package/dist/cdn/{shared-51b5e223.js → shared-40b5267a.js} +1 -1
  66. package/dist/cdn/{shared-fb403e1f.js → shared-448781f9.js} +1 -1
  67. package/dist/cdn/{shared-8f7a66c4.js → shared-4dc6d228.js} +1 -1
  68. package/dist/cdn/shared-5272c758.js +1 -0
  69. package/dist/cdn/{shared-c1dadefe.js → shared-5535f38f.js} +1 -1
  70. package/dist/cdn/shared-66633ff7.js +1 -0
  71. package/dist/cdn/{shared-30131f76.js → shared-756034e4.js} +1 -1
  72. package/dist/cdn/shared-7f0a9790.js +1 -0
  73. package/dist/cdn/{shared-6b7602c7.js → shared-805d18a2.js} +1 -1
  74. package/dist/cdn/shared-940a4826.js +1 -0
  75. package/dist/cdn/{shared-b2330475.js → shared-a23cf7c8.js} +1 -1
  76. package/dist/cdn/{shared-0bda8ecb.js → shared-a7095b6a.js} +1 -1
  77. package/dist/cdn/{shared-a4e6ecb0.js → shared-b9f18aaa.js} +1 -1
  78. package/dist/cdn/{shared-51e28c83.js → shared-df730f90.js} +1 -1
  79. package/dist/cdn/{shared-4038cb18.js → shared-e209cb55.js} +1 -1
  80. package/dist/cdn/{shared-cd3c902e.js → shared-e68b9c83.js} +1 -1
  81. package/dist/cdn/{shared-ff149b55.js → shared-ffb27563.js} +1 -1
  82. package/dist/cdn/translations/shared/en.json +180 -0
  83. package/dist/elements/private/EditableList/EditableList.js +1 -0
  84. package/dist/elements/private/EditableList/EditableList.js.map +1 -1
  85. package/dist/elements/private/FrequencyInput/FrequencyInput.d.ts +2 -1
  86. package/dist/elements/private/FrequencyInput/FrequencyInput.js +3 -1
  87. package/dist/elements/private/FrequencyInput/FrequencyInput.js.map +1 -1
  88. package/dist/elements/public/CollectionPage/CollectionPage.js +3 -1
  89. package/dist/elements/public/CollectionPage/CollectionPage.js.map +1 -1
  90. package/dist/elements/public/CollectionPage/types.d.ts +2 -0
  91. package/dist/elements/public/CollectionPage/types.js.map +1 -1
  92. package/dist/elements/public/CouponCard/CouponCard.js +5 -5
  93. package/dist/elements/public/CouponCard/CouponCard.js.map +1 -1
  94. package/dist/elements/public/CouponCodesForm/CouponCodesForm.d.ts +2 -0
  95. package/dist/elements/public/CouponCodesForm/CouponCodesForm.js +7 -1
  96. package/dist/elements/public/CouponCodesForm/CouponCodesForm.js.map +1 -1
  97. package/dist/elements/public/CouponCodesForm/types.d.ts +3 -2
  98. package/dist/elements/public/CouponCodesForm/types.js.map +1 -1
  99. package/dist/elements/public/CouponForm/CouponForm.js +3 -3
  100. package/dist/elements/public/CouponForm/CouponForm.js.map +1 -1
  101. package/dist/elements/public/GenerateCodesForm/GenerateCodesForm.d.ts +4 -0
  102. package/dist/elements/public/GenerateCodesForm/GenerateCodesForm.js +32 -0
  103. package/dist/elements/public/GenerateCodesForm/GenerateCodesForm.js.map +1 -1
  104. package/dist/elements/public/GiftCardCard/GiftCardCard.d.ts +26 -0
  105. package/dist/elements/public/GiftCardCard/GiftCardCard.js +95 -0
  106. package/dist/elements/public/GiftCardCard/GiftCardCard.js.map +1 -0
  107. package/dist/elements/public/GiftCardCard/index.d.ts +5 -0
  108. package/dist/elements/public/GiftCardCard/index.js +7 -0
  109. package/dist/elements/public/GiftCardCard/index.js.map +1 -0
  110. package/dist/elements/public/GiftCardCard/types.d.ts +11 -0
  111. package/dist/elements/public/GiftCardCard/types.js +2 -0
  112. package/dist/elements/public/GiftCardCard/types.js.map +1 -0
  113. package/dist/elements/public/GiftCardCodeForm/GiftCardCodeForm.d.ts +55 -0
  114. package/dist/elements/public/GiftCardCodeForm/GiftCardCodeForm.js +292 -0
  115. package/dist/elements/public/GiftCardCodeForm/GiftCardCodeForm.js.map +1 -0
  116. package/dist/elements/public/GiftCardCodeForm/index.d.ts +10 -0
  117. package/dist/elements/public/GiftCardCodeForm/index.js +12 -0
  118. package/dist/elements/public/GiftCardCodeForm/index.js.map +1 -0
  119. package/dist/elements/public/GiftCardCodeForm/types.d.ts +19 -0
  120. package/dist/elements/public/GiftCardCodeForm/types.js +2 -0
  121. package/dist/elements/public/GiftCardCodeForm/types.js.map +1 -0
  122. package/dist/elements/public/GiftCardCodesForm/GiftCardCodesForm.d.ts +37 -0
  123. package/dist/elements/public/GiftCardCodesForm/GiftCardCodesForm.js +259 -0
  124. package/dist/elements/public/GiftCardCodesForm/GiftCardCodesForm.js.map +1 -0
  125. package/dist/elements/public/GiftCardCodesForm/index.d.ts +9 -0
  126. package/dist/elements/public/GiftCardCodesForm/index.js +13 -0
  127. package/dist/elements/public/GiftCardCodesForm/index.js.map +1 -0
  128. package/dist/elements/public/GiftCardCodesForm/internal/InternalGiftCardCodesFormListItem.d.ts +19 -0
  129. package/dist/elements/public/GiftCardCodesForm/internal/InternalGiftCardCodesFormListItem.js +48 -0
  130. package/dist/elements/public/GiftCardCodesForm/internal/InternalGiftCardCodesFormListItem.js.map +1 -0
  131. package/dist/elements/public/GiftCardCodesForm/types.d.ts +17 -0
  132. package/dist/elements/public/GiftCardCodesForm/types.js +2 -0
  133. package/dist/elements/public/GiftCardCodesForm/types.js.map +1 -0
  134. package/dist/elements/public/GiftCardForm/GiftCardForm.d.ts +67 -0
  135. package/dist/elements/public/GiftCardForm/GiftCardForm.js +666 -0
  136. package/dist/elements/public/GiftCardForm/GiftCardForm.js.map +1 -0
  137. package/dist/elements/public/GiftCardForm/currencies.d.ts +1 -0
  138. package/dist/elements/public/GiftCardForm/currencies.js +173 -0
  139. package/dist/elements/public/GiftCardForm/currencies.js.map +1 -0
  140. package/dist/elements/public/GiftCardForm/index.d.ts +18 -0
  141. package/dist/elements/public/GiftCardForm/index.js +20 -0
  142. package/dist/elements/public/GiftCardForm/index.js.map +1 -0
  143. package/dist/elements/public/GiftCardForm/private/CategoryRestrictionsPage.d.ts +20 -0
  144. package/dist/elements/public/GiftCardForm/private/CategoryRestrictionsPage.js +99 -0
  145. package/dist/elements/public/GiftCardForm/private/CategoryRestrictionsPage.js.map +1 -0
  146. package/dist/elements/public/GiftCardForm/private/CategoryRestrictionsPageItem.d.ts +20 -0
  147. package/dist/elements/public/GiftCardForm/private/CategoryRestrictionsPageItem.js +52 -0
  148. package/dist/elements/public/GiftCardForm/private/CategoryRestrictionsPageItem.js.map +1 -0
  149. package/dist/elements/public/GiftCardForm/private/CategoryRestrictionsPageItemContent.d.ts +20 -0
  150. package/dist/elements/public/GiftCardForm/private/CategoryRestrictionsPageItemContent.js +53 -0
  151. package/dist/elements/public/GiftCardForm/private/CategoryRestrictionsPageItemContent.js.map +1 -0
  152. package/dist/elements/public/GiftCardForm/types.d.ts +28 -0
  153. package/dist/elements/public/GiftCardForm/types.js +2 -0
  154. package/dist/elements/public/GiftCardForm/types.js.map +1 -0
  155. package/dist/elements/public/I18n/format/index.js +2 -0
  156. package/dist/elements/public/I18n/format/index.js.map +1 -1
  157. package/dist/elements/public/I18n/format/relative.d.ts +6 -0
  158. package/dist/elements/public/I18n/format/relative.js +15 -0
  159. package/dist/elements/public/I18n/format/relative.js.map +1 -0
  160. package/dist/elements/public/NucleonElement/NucleonElement.js +4 -4
  161. package/dist/elements/public/NucleonElement/NucleonElement.js.map +1 -1
  162. package/dist/elements/public/index.d.ts +4 -0
  163. package/dist/elements/public/index.defined.d.ts +4 -0
  164. package/dist/elements/public/index.defined.js +4 -0
  165. package/dist/elements/public/index.defined.js.map +1 -1
  166. package/dist/elements/public/index.js +4 -0
  167. package/dist/elements/public/index.js.map +1 -1
  168. package/dist/mixins/themeable.js +12 -0
  169. package/dist/mixins/themeable.js.map +1 -1
  170. package/dist/utils/parse-duration.d.ts +1 -1
  171. package/dist/utils/parse-duration.js +7 -3
  172. package/dist/utils/parse-duration.js.map +1 -1
  173. package/package.json +2 -2
  174. package/dist/cdn/shared-0fcdd1c4.js +0 -1
  175. package/dist/cdn/shared-4fa5f144.js +0 -1
  176. package/dist/cdn/shared-710ed658.js +0 -134
  177. package/dist/cdn/shared-800a5471.js +0 -1
  178. package/dist/cdn/shared-87ca7818.js +0 -1
  179. package/dist/cdn/shared-c6a4b2d6.js +0 -1
  180. package/dist/cdn/shared-d9a260f0.js +0 -1
  181. package/dist/cdn/shared-f875a4f8.js +0 -1
@@ -0,0 +1,666 @@
1
+ import { Type } from "../QueryBuilder/types.js";
2
+ import { html } from 'lit-element';
3
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
4
+ import { CategoryRestrictionsPage } from "./private/CategoryRestrictionsPage.js";
5
+ import { ConfigurableMixin } from "../../../mixins/configurable.js";
6
+ import { EditableList } from "../../private/EditableList/EditableList.js";
7
+ import { FrequencyInput } from "../../private/FrequencyInput/FrequencyInput.js";
8
+ import { Group } from "../../private/Group/Group.js";
9
+ import { NucleonElement } from "../NucleonElement/NucleonElement.js";
10
+ import { PropertyTable } from "../../private/PropertyTable/PropertyTable.js";
11
+ import { ResponsiveMixin } from "../../../mixins/responsive.js";
12
+ import { ThemeableMixin } from "../../../mixins/themeable.js";
13
+ import { TranslatableMixin } from "../../../mixins/translatable.js";
14
+ import { classMap } from "../../../utils/class-map.js";
15
+ import { currencies } from "./currencies.js";
16
+ import { ifDefined } from 'lit-html/directives/if-defined';
17
+ const NS = 'gift-card-form';
18
+ const Base = ScopedElementsMixin(ThemeableMixin(ConfigurableMixin(ResponsiveMixin(TranslatableMixin(NucleonElement, NS)))));
19
+ /**
20
+ * Form element for creating or editing gift cards (`fx:gift_card`).
21
+ *
22
+ * @slot name:before
23
+ * @slot name:after
24
+ *
25
+ * @slot currency:before
26
+ * @slot currency:after
27
+ *
28
+ * @slot expires:before
29
+ * @slot expires:after
30
+ *
31
+ * @slot codes:before
32
+ * @slot codes:after
33
+ *
34
+ * @slot product-restrictions:before
35
+ * @slot product-restrictions:after
36
+ *
37
+ * @slot category-restrictions:before
38
+ * @slot category-restrictions:after
39
+ *
40
+ * @slot timestamps:before
41
+ * @slot timestamps:after
42
+ *
43
+ * @slot delete:before
44
+ * @slot delete:after
45
+ *
46
+ * @slot create:before
47
+ * @slot create:after
48
+ *
49
+ * @element foxy-gift-card-form
50
+ * @since 1.15.0
51
+ */
52
+ export class GiftCardForm extends Base {
53
+ constructor() {
54
+ super(...arguments);
55
+ this.__codesTableColumns = [
56
+ {
57
+ header: ctx => html `<foxy-i18n lang=${ctx.lang} key="code" ns=${ctx.ns}></foxy-i18n>`,
58
+ cell: ctx => html `
59
+ <vaadin-button
60
+ theme="tertiary contrast"
61
+ class="p-0"
62
+ @click=${(evt) => {
63
+ const dialog = this.renderRoot.querySelector('#code-dialog');
64
+ const button = evt.currentTarget;
65
+ dialog.href = ctx.data._links.self.href;
66
+ dialog.show(button);
67
+ }}
68
+ >
69
+ <span class="font-tnum">${ctx.data.code}</span>
70
+ </vaadin-button>
71
+ `,
72
+ },
73
+ {
74
+ header: ctx => html `<foxy-i18n lang=${ctx.lang} key="date_created" ns=${ctx.ns}></foxy-i18n>`,
75
+ cell: ctx => html `
76
+ <foxy-i18n
77
+ options=${JSON.stringify({ value: ctx.data.date_created })}
78
+ class="text-tertiary"
79
+ lang=${ctx.lang}
80
+ key="date"
81
+ ns=${ctx.ns}
82
+ >
83
+ </foxy-i18n>
84
+ `,
85
+ },
86
+ {
87
+ hideBelow: 'sm',
88
+ header: c => html `<foxy-i18n lang=${c.lang} key="end_date" ns=${c.ns}></foxy-i18n>`,
89
+ cell: ctx => html `
90
+ <foxy-i18n
91
+ options=${JSON.stringify({ value: ctx.data.end_date })}
92
+ class="text-tertiary"
93
+ lang=${ctx.lang}
94
+ key="date"
95
+ ns=${ctx.ns}
96
+ >
97
+ </foxy-i18n>
98
+ `,
99
+ },
100
+ {
101
+ header: c => html `<foxy-i18n lang=${c.lang} key="current_balance" ns=${c.ns}></foxy-i18n>`,
102
+ cell: ctx => {
103
+ var _a;
104
+ return html `
105
+ <foxy-i18n
106
+ options=${JSON.stringify({
107
+ amount: `${ctx.data.current_balance} ${(_a = this.data) === null || _a === void 0 ? void 0 : _a.currency_code}`,
108
+ currencyDisplay: this.__currencyDisplay,
109
+ })}
110
+ lang=${ctx.lang}
111
+ key="price"
112
+ ns=${ctx.ns}
113
+ >
114
+ </foxy-i18n>
115
+ `;
116
+ },
117
+ },
118
+ ];
119
+ this.__codesTableQuery = null;
120
+ this.__currencyDisplay = '';
121
+ this.__itemCategories = '';
122
+ }
123
+ static get scopedElements() {
124
+ return {
125
+ 'vaadin-text-field': customElements.get('vaadin-text-field'),
126
+ 'vaadin-combo-box': customElements.get('vaadin-combo-box'),
127
+ 'vaadin-button': customElements.get('vaadin-button'),
128
+ 'iron-icon': customElements.get('iron-icon'),
129
+ 'foxy-internal-confirm-dialog': customElements.get('foxy-internal-confirm-dialog'),
130
+ 'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),
131
+ 'foxy-query-builder': customElements.get('foxy-query-builder'),
132
+ 'foxy-form-dialog': customElements.get('foxy-form-dialog'),
133
+ 'foxy-pagination': customElements.get('foxy-pagination'),
134
+ 'foxy-spinner': customElements.get('foxy-spinner'),
135
+ 'foxy-table': customElements.get('foxy-table'),
136
+ 'foxy-i18n': customElements.get('foxy-i18n'),
137
+ 'x-category-restrictions-page': CategoryRestrictionsPage,
138
+ 'x-frequency-input': FrequencyInput,
139
+ 'x-property-table': PropertyTable,
140
+ 'x-editable-list': EditableList,
141
+ 'x-group': Group,
142
+ };
143
+ }
144
+ static get properties() {
145
+ return {
146
+ ...super.properties,
147
+ __codesTableQuery: { attribute: false },
148
+ __itemCategories: { attribute: false },
149
+ };
150
+ }
151
+ static get v8n() {
152
+ return [
153
+ ({ name: v }) => !!v || 'name_required',
154
+ ({ name: v }) => !v || v.length <= 50 || 'name_too_long',
155
+ ];
156
+ }
157
+ render() {
158
+ var _a, _b;
159
+ const hidden = this.hiddenSelector;
160
+ const isNameHidden = hidden.matches('name', true);
161
+ const isCurrencyHidden = hidden.matches('currency', true);
162
+ const isExpiresHidden = hidden.matches('expires', true);
163
+ return html `
164
+ <div class="relative space-y-l">
165
+ ${isNameHidden && isCurrencyHidden && isExpiresHidden
166
+ ? ''
167
+ : html `
168
+ <div class="grid grid-cols-1 sm-grid-cols-3 md-grid-cols-4 gap-m">
169
+ ${isNameHidden ? '' : html `<div class="md-col-span-2">${this.__renderName()}</div>`}
170
+ ${isCurrencyHidden ? '' : this.__renderCurrency()}
171
+ ${isExpiresHidden ? '' : this.__renderExpires()}
172
+ </div>
173
+ `}
174
+ ${hidden.matches('codes', true) || !this.data ? '' : this.__renderCodes()}
175
+ ${hidden.matches('product-restrictions', true) ? '' : this.__renderProductRestrictions()}
176
+ ${hidden.matches('category-restrictions', true) || !this.data
177
+ ? ''
178
+ : this.__renderCategoryRestrictions()}
179
+ ${hidden.matches('timestamps', true) ? '' : this.__renderTimestamps()}
180
+ ${hidden.matches('create', true) || !!this.data ? '' : this.__renderCreate()}
181
+ ${hidden.matches('delete', true) || !this.data ? '' : this.__renderDelete()}
182
+
183
+ <div
184
+ data-testid="spinner"
185
+ class=${classMap({
186
+ 'transition duration-500 ease-in-out absolute inset-0 flex': true,
187
+ 'opacity-0 pointer-events-none': !this.in('busy') && !this.in('fail'),
188
+ })}
189
+ >
190
+ <foxy-spinner
191
+ layout="vertical"
192
+ class="m-auto p-m bg-base shadow-xs rounded-t-l rounded-b-l"
193
+ state=${this.in('fail') ? 'error' : this.in('busy') ? 'busy' : 'empty'}
194
+ lang=${this.lang}
195
+ ns="${this.ns} ${(_b = (_a = customElements.get('foxy-spinner')) === null || _a === void 0 ? void 0 : _a.defaultNS) !== null && _b !== void 0 ? _b : ''}"
196
+ >
197
+ </foxy-spinner>
198
+ </div>
199
+ </div>
200
+ `;
201
+ }
202
+ async _sendGet() {
203
+ const giftCard = await super._sendGet();
204
+ const store = await super._fetch(giftCard._links['fx:store'].href);
205
+ const categoriesURL = new URL(store._links['fx:item_categories'].href);
206
+ categoriesURL.searchParams.set('limit', '5');
207
+ this.__currencyDisplay = store.use_international_currency_symbol ? 'code' : 'symbol';
208
+ this.__itemCategories = categoriesURL.toString();
209
+ return giftCard;
210
+ }
211
+ __getErrorMessage(prefix) {
212
+ const error = this.errors.find(err => err.startsWith(prefix));
213
+ return error ? this.t(error.replace(prefix, 'v8n')).toString() : '';
214
+ }
215
+ __getValidator(prefix) {
216
+ return () => !this.errors.some(err => err.startsWith(prefix));
217
+ }
218
+ __renderName() {
219
+ var _a;
220
+ return html `
221
+ <div>
222
+ ${this.renderTemplateOrSlot('name:before')}
223
+
224
+ <vaadin-text-field
225
+ error-message=${this.__getErrorMessage('name')}
226
+ helper-text=${this.t('gift_card_name_helper_text')}
227
+ data-testid="name"
228
+ class="w-full"
229
+ label=${this.t('name')}
230
+ .checkValidity=${this.__getValidator('name')}
231
+ .value=${(_a = this.form.name) !== null && _a !== void 0 ? _a : ''}
232
+ ?disabled=${this.in('busy') || this.disabledSelector.matches('name', true)}
233
+ ?readonly=${this.readonlySelector.matches('name', true)}
234
+ required
235
+ @keydown=${(evt) => evt.key === 'Enter' && this.submit()}
236
+ @input=${(evt) => {
237
+ const newName = evt.currentTarget.value;
238
+ this.edit({ name: newName });
239
+ }}
240
+ >
241
+ </vaadin-text-field>
242
+
243
+ ${this.renderTemplateOrSlot('name:after')}
244
+ </div>
245
+ `;
246
+ }
247
+ __renderCurrency() {
248
+ var _a, _b;
249
+ return html `
250
+ <div>
251
+ ${this.renderTemplateOrSlot('currency:before')}
252
+
253
+ <vaadin-combo-box
254
+ item-label-path="label"
255
+ item-value-path="value"
256
+ item-id-path="value"
257
+ class="w-full"
258
+ label=${this.t('currency')}
259
+ ?disabled=${!this.in('idle') || this.disabledSelector.matches('currency', true)}
260
+ ?readonly=${this.readonlySelector.matches('currency', true)}
261
+ .value=${(_b = (_a = this.form.currency_code) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== null && _b !== void 0 ? _b : ''}
262
+ .items=${currencies.map(code => ({
263
+ label: `${this.t(`currency_${code}`)} (${code.toUpperCase()})`,
264
+ value: code,
265
+ }))}
266
+ @change=${(evt) => {
267
+ const comboBox = evt.currentTarget;
268
+ this.edit({ currency_code: comboBox.value });
269
+ }}
270
+ >
271
+ </vaadin-combo-box>
272
+
273
+ ${this.renderTemplateOrSlot('currency:after')}
274
+ </div>
275
+ `;
276
+ }
277
+ __renderExpires() {
278
+ var _a;
279
+ return html `
280
+ <div>
281
+ ${this.renderTemplateOrSlot('expires:before')}
282
+
283
+ <x-frequency-input
284
+ class="w-full"
285
+ label=${this.t('expires_after')}
286
+ placeholder=${this.t('select')}
287
+ ?disabled=${!this.in('idle') || this.disabledSelector.matches('expires', true)}
288
+ ?readonly=${this.readonlySelector.matches('expires', true)}
289
+ .value=${(_a = this.form.expires_after) !== null && _a !== void 0 ? _a : ''}
290
+ @change=${(evt) => {
291
+ const input = evt.currentTarget;
292
+ this.edit({ expires_after: input.value });
293
+ }}
294
+ >
295
+ </x-frequency-input>
296
+
297
+ ${this.renderTemplateOrSlot('expires:after')}
298
+ </div>
299
+ `;
300
+ }
301
+ __renderCodes() {
302
+ var _a;
303
+ const { disabledSelector, group, data, lang, ns } = this;
304
+ const isDisabled = !this.in('idle') || disabledSelector.matches('codes', true);
305
+ const filters = this.__codesTableQuery;
306
+ const url = new URL(data._links['fx:gift_card_codes'].href);
307
+ new URLSearchParams(filters !== null && filters !== void 0 ? filters : '').forEach((value, name) => url.searchParams.set(name, value));
308
+ url.searchParams.set('limit', '5');
309
+ const filterButtonLabel = filters === null ? 'filter' : 'clear_filters';
310
+ const filterButtonIcon = `icons:${filters === null ? 'filter-list' : 'clear'}`;
311
+ return html `
312
+ <foxy-form-dialog
313
+ disabledcontrols=${disabledSelector.zoom('codes:generate:form').toString()}
314
+ readonlycontrols=${this.readonlySelector.zoom('codes:generate:form').toString()}
315
+ hiddencontrols="save-button ${this.hiddenSelector.zoom('codes:generate:form').toString()}"
316
+ header="generate"
317
+ parent=${(_a = data === null || data === void 0 ? void 0 : data._links['fx:generate_codes'].href) !== null && _a !== void 0 ? _a : ''}
318
+ group=${group}
319
+ lang=${lang}
320
+ form="foxy-generate-codes-form"
321
+ ns=${ns}
322
+ id="generate-codes-dialog"
323
+ alert
324
+ .related=${[url.toString()]}
325
+ >
326
+ </foxy-form-dialog>
327
+
328
+ <foxy-form-dialog
329
+ disabledcontrols=${disabledSelector.zoom('codes:form').toString()}
330
+ readonlycontrols=${this.readonlySelector.zoom('codes:form').toString()}
331
+ hiddencontrols=${this.hiddenSelector.zoom('codes:form').toString()}
332
+ header="code"
333
+ parent=${url.toString()}
334
+ group=${group}
335
+ lang=${lang}
336
+ form="foxy-gift-card-code-form"
337
+ ns=${ns}
338
+ id="code-dialog"
339
+ >
340
+ </foxy-form-dialog>
341
+
342
+ <foxy-form-dialog
343
+ disabledcontrols=${disabledSelector.zoom('codes:import:form').toString()}
344
+ readonlycontrols=${this.readonlySelector.zoom('codes:import:form').toString()}
345
+ hiddencontrols="save-button ${this.hiddenSelector.zoom('codes:generate:form').toString()}"
346
+ header="import"
347
+ parent=${data._links['fx:gift_card_codes'].href}
348
+ group=${group}
349
+ lang=${lang}
350
+ form="foxy-gift-card-codes-form"
351
+ ns=${ns}
352
+ id="import-dialog"
353
+ >
354
+ </foxy-form-dialog>
355
+
356
+ <div>
357
+ ${this.renderTemplateOrSlot('codes:before')}
358
+
359
+ <div class="flex items-center justify-between mb-xs space-x-s">
360
+ <foxy-i18n
361
+ class="text-s font-medium text-secondary leading-none flex-1"
362
+ lang=${lang}
363
+ key="code_plural"
364
+ ns=${ns}
365
+ >
366
+ </foxy-i18n>
367
+
368
+ <vaadin-button
369
+ theme="success tertiary small"
370
+ ?disabled=${isDisabled}
371
+ @click=${(evt) => {
372
+ const dialog = this.renderRoot.querySelector('#generate-codes-dialog');
373
+ const button = evt.currentTarget;
374
+ dialog === null || dialog === void 0 ? void 0 : dialog.show(button);
375
+ }}
376
+ >
377
+ <foxy-i18n class="text-s" lang=${lang} key="generate" ns=${ns}></foxy-i18n>
378
+ <iron-icon class="icon-inline text-s" icon="icons:add"></iron-icon>
379
+ </vaadin-button>
380
+
381
+ <vaadin-button
382
+ theme="contrast tertiary small"
383
+ ?disabled=${isDisabled}
384
+ @click=${(evt) => {
385
+ const dialog = this.renderRoot.querySelector('#import-dialog');
386
+ const button = evt.currentTarget;
387
+ dialog === null || dialog === void 0 ? void 0 : dialog.show(button);
388
+ }}
389
+ >
390
+ <foxy-i18n class="text-s" lang=${lang} key="import" ns=${ns}></foxy-i18n>
391
+ <iron-icon class="icon-inline text-s" icon="icons:open-in-browser"></iron-icon>
392
+ </vaadin-button>
393
+
394
+ <vaadin-button
395
+ theme="contrast ${filters === null ? 'tertiary' : ''} small"
396
+ ?disabled=${isDisabled}
397
+ @click=${() => (this.__codesTableQuery = filters === null ? '' : null)}
398
+ >
399
+ <foxy-i18n class="text-s" lang=${lang} key=${filterButtonLabel} ns=${ns}></foxy-i18n>
400
+ <iron-icon class="icon-inline text-s" icon=${filterButtonIcon}></iron-icon>
401
+ </vaadin-button>
402
+ </div>
403
+
404
+ <foxy-query-builder
405
+ class="bg-contrast-5 rounded-tl-l rounded-tr-s rounded-b-l p-m mb-s"
406
+ lang=${lang}
407
+ ns=${ns}
408
+ ?disabled=${isDisabled}
409
+ ?hidden=${filters === null}
410
+ .options=${GiftCardForm.__codesQueryOptions}
411
+ .value=${filters !== null && filters !== void 0 ? filters : ''}
412
+ @change=${(evt) => {
413
+ const queryBuilder = evt.currentTarget;
414
+ this.__codesTableQuery = queryBuilder.value;
415
+ }}
416
+ >
417
+ </foxy-query-builder>
418
+
419
+ <foxy-pagination first=${url.toString()} lang=${lang} ns=${ns} ?disabled=${isDisabled}>
420
+ <foxy-table
421
+ class="px-m mb-s border border-contrast-10 rounded-t-l rounded-b-l"
422
+ group=${group}
423
+ lang=${lang}
424
+ ns=${ns}
425
+ .columns=${this.__codesTableColumns}
426
+ >
427
+ </foxy-table>
428
+ </foxy-pagination>
429
+
430
+ ${this.renderTemplateOrSlot('codes:after')}
431
+ </div>
432
+ `;
433
+ }
434
+ __renderProductRestrictions() {
435
+ var _a;
436
+ const scope = 'product-restrictions';
437
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches(scope, true);
438
+ const isReadonly = this.readonlySelector.matches(scope, true);
439
+ const restrictions = (_a = this.form.product_code_restrictions) !== null && _a !== void 0 ? _a : '';
440
+ const groups = [
441
+ { header: 'allow', items: [] },
442
+ { header: 'block', items: [] },
443
+ ];
444
+ if (restrictions) {
445
+ restrictions.split(',').forEach(value => {
446
+ const isBlocklistValue = value.startsWith('-');
447
+ const target = isBlocklistValue ? 1 : 0;
448
+ const label = isBlocklistValue ? value.substring(1) : value;
449
+ groups[target].items.push({ label, value });
450
+ });
451
+ }
452
+ return html `
453
+ <div>
454
+ ${this.renderTemplateOrSlot('product-restrictions:before')}
455
+
456
+ <div class="space-y-s">
457
+ <x-group frame>
458
+ <foxy-i18n
459
+ class=${isDisabled ? 'text-disabled' : 'text-secondary'}
460
+ slot="header"
461
+ lang=${this.lang}
462
+ key="product_restrictions"
463
+ ns=${this.ns}
464
+ >
465
+ </foxy-i18n>
466
+
467
+ <div class="grid sm-grid-cols-2 bg-contrast-10" style="gap: 1px">
468
+ ${groups.map((group, index) => {
469
+ return html `
470
+ <x-group class="bg-base pt-m">
471
+ <foxy-i18n
472
+ class=${isDisabled ? 'text-disabled' : 'text-tertiary'}
473
+ slot="header"
474
+ lang=${this.lang}
475
+ key=${group.header}
476
+ ns=${this.ns}
477
+ >
478
+ </foxy-i18n>
479
+
480
+ <x-editable-list
481
+ lang=${this.lang}
482
+ ns=${this.ns}
483
+ ?disabled=${isDisabled}
484
+ ?readonly=${isReadonly}
485
+ .items=${group.items}
486
+ @change=${(evt) => {
487
+ const newItemsByGroup = [
488
+ index === 0 ? evt.currentTarget.items : groups[0].items,
489
+ index === 1 ? evt.currentTarget.items : groups[1].items,
490
+ ];
491
+ const newSanitizedItemsByGroup = newItemsByGroup
492
+ .map(list => list.map(v => v.value.replace(/^[\s-]*/, '').trimEnd()))
493
+ .map(list => list.filter(v => !!v))
494
+ .map(list => Array.from(new Set(list)));
495
+ const newRestrictions = newSanitizedItemsByGroup[0]
496
+ .concat(newSanitizedItemsByGroup[1].map(v => `-${v}`))
497
+ .join(',');
498
+ this.edit({ product_code_restrictions: newRestrictions });
499
+ }}
500
+ >
501
+ </x-editable-list>
502
+ </x-group>
503
+ `;
504
+ })}
505
+ </div>
506
+ </x-group>
507
+
508
+ <foxy-i18n
509
+ class=${classMap({
510
+ 'block text-xs leading-s transition-colors': true,
511
+ 'text-secondary': !isDisabled,
512
+ 'text-disabled': isDisabled,
513
+ })}
514
+ lang=${this.lang}
515
+ key="gift_card_product_restrictions_explainer"
516
+ ns=${this.ns}
517
+ >
518
+ </foxy-i18n>
519
+ </div>
520
+
521
+ ${this.renderTemplateOrSlot('product-restrictions:after')}
522
+ </div>
523
+ `;
524
+ }
525
+ __renderCategoryRestrictions() {
526
+ var _a;
527
+ const scope = 'category-restrictions';
528
+ const isDisabled = !this.in('idle') || this.disabledSelector.matches(scope, true);
529
+ const isReadonly = this.readonlySelector.matches(scope, true);
530
+ return html `
531
+ ${this.renderTemplateOrSlot('category-restrictions:before')}
532
+
533
+ <div class="space-y-xs">
534
+ <foxy-pagination
535
+ first=${this.__itemCategories}
536
+ lang=${this.lang}
537
+ ns=${this.ns}
538
+ ?disabled=${isDisabled}
539
+ >
540
+ <foxy-i18n
541
+ class="block text-s font-medium text-secondary leading-none mb-s"
542
+ lang=${this.lang}
543
+ key="category_restrictions"
544
+ ns=${this.ns}
545
+ >
546
+ </foxy-i18n>
547
+
548
+ <x-category-restrictions-page
549
+ gift-card-item-categories=${ifDefined((_a = this.data) === null || _a === void 0 ? void 0 : _a._links['fx:gift_card_item_categories'].href)}
550
+ gift-card=${this.href}
551
+ class="border border-contrast-10 rounded-t-l rounded-b-l mb-s"
552
+ group=${this.group}
553
+ lang=${this.lang}
554
+ ns=${this.ns}
555
+ ?disabled=${isDisabled}
556
+ ?readonly=${isReadonly}
557
+ >
558
+ </x-category-restrictions-page>
559
+ </foxy-pagination>
560
+
561
+ <foxy-i18n
562
+ class="block text-xs leading-s text-secondary"
563
+ lang=${this.lang}
564
+ key="gift_card_category_restrictions_helper_text"
565
+ ns=${this.ns}
566
+ >
567
+ </foxy-i18n>
568
+ </div>
569
+
570
+ ${this.renderTemplateOrSlot('category-restrictions:after')}
571
+ `;
572
+ }
573
+ __renderTimestamps() {
574
+ return html `
575
+ <div>
576
+ ${this.renderTemplateOrSlot('timestamps:before')}
577
+
578
+ <x-property-table
579
+ data-testid="timestamps"
580
+ .items=${['date_modified', 'date_created'].map(field => {
581
+ var _a;
582
+ return ({
583
+ name: this.t(field),
584
+ value: ((_a = this.data) === null || _a === void 0 ? void 0 : _a[field]) ? this.t('date', { value: new Date(this.data[field]) })
585
+ : '',
586
+ });
587
+ })}
588
+ >
589
+ </x-property-table>
590
+
591
+ ${this.renderTemplateOrSlot('timestamps:after')}
592
+ </div>
593
+ `;
594
+ }
595
+ __renderCreate() {
596
+ const isCleanTemplateInvalid = this.in({ idle: { template: { clean: 'invalid' } } });
597
+ const isDirtyTemplateInvalid = this.in({ idle: { template: { dirty: 'invalid' } } });
598
+ const isCleanSnapshotInvalid = this.in({ idle: { snapshot: { clean: 'invalid' } } });
599
+ const isDirtySnapshotInvalid = this.in({ idle: { snapshot: { dirty: 'invalid' } } });
600
+ const isTemplateInvalid = isCleanTemplateInvalid || isDirtyTemplateInvalid;
601
+ const isSnaphotInvalid = isCleanSnapshotInvalid || isDirtySnapshotInvalid;
602
+ const isInvalid = isTemplateInvalid || isSnaphotInvalid;
603
+ const isBusy = this.in('busy');
604
+ return html `
605
+ <div>
606
+ ${this.renderTemplateOrSlot('create:before')}
607
+
608
+ <vaadin-button
609
+ data-testid="create"
610
+ class="w-full"
611
+ theme="primary success"
612
+ ?disabled=${isBusy || isInvalid || this.disabledSelector.matches('create', true)}
613
+ @click=${this.submit}
614
+ >
615
+ <foxy-i18n ns=${this.ns} key="create" lang=${this.lang}></foxy-i18n>
616
+ </vaadin-button>
617
+
618
+ ${this.renderTemplateOrSlot('create:after')}
619
+ </div>
620
+ `;
621
+ }
622
+ __renderDelete() {
623
+ return html `
624
+ <div>
625
+ <foxy-internal-confirm-dialog
626
+ data-testid="confirm"
627
+ message="delete_prompt"
628
+ confirm="delete"
629
+ cancel="cancel"
630
+ header="delete"
631
+ theme="primary error"
632
+ lang=${this.lang}
633
+ ns=${this.ns}
634
+ id="confirm"
635
+ @hide=${(evt) => !evt.detail.cancelled && this.delete()}
636
+ >
637
+ </foxy-internal-confirm-dialog>
638
+
639
+ ${this.renderTemplateOrSlot('delete:before')}
640
+
641
+ <vaadin-button
642
+ data-testid="delete"
643
+ theme="primary error"
644
+ class="w-full"
645
+ ?disabled=${this.in('busy') || this.disabledSelector.matches('delete', true)}
646
+ @click=${(evt) => {
647
+ const confirm = this.renderRoot.querySelector('#confirm');
648
+ confirm.show(evt.currentTarget);
649
+ }}
650
+ >
651
+ <foxy-i18n ns=${this.ns} key="delete" lang=${this.lang}></foxy-i18n>
652
+ </vaadin-button>
653
+
654
+ ${this.renderTemplateOrSlot('delete:after')}
655
+ </div>
656
+ `;
657
+ }
658
+ }
659
+ GiftCardForm.__codesQueryOptions = [
660
+ { label: 'code', path: 'code', type: Type.String },
661
+ { label: 'current_balance', path: 'current_balance', type: Type.Number },
662
+ { label: 'end_date', path: 'end_date', type: Type.Date },
663
+ { label: 'date_created', path: 'date_created', type: Type.Date },
664
+ { label: 'date_modified', path: 'date_modified', type: Type.Date },
665
+ ];
666
+ //# sourceMappingURL=GiftCardForm.js.map