@foxy.io/elements 1.14.2 → 1.15.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 (175) 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-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 -0
  11. package/dist/cdn/foxy-coupon-code-form.js +1 -0
  12. package/dist/cdn/foxy-coupon-codes-form.js +1 -0
  13. package/dist/cdn/foxy-coupon-form.js +1 -0
  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 +4 -807
  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 -0
  29. package/dist/cdn/foxy-i18n.js +1 -1
  30. package/dist/cdn/foxy-items-form.js +1 -1
  31. package/dist/cdn/foxy-nucleon-element.js +1 -1
  32. package/dist/cdn/foxy-pagination.js +1 -0
  33. package/dist/cdn/foxy-payment-card.js +1 -1
  34. package/dist/cdn/foxy-payment-method-card.js +1 -1
  35. package/dist/cdn/foxy-query-builder.js +1 -69
  36. package/dist/cdn/foxy-sign-in-form.js +1 -1
  37. package/dist/cdn/foxy-spinner.js +1 -1
  38. package/dist/cdn/foxy-subscription-card.js +1 -1
  39. package/dist/cdn/foxy-subscription-form.js +3 -3
  40. package/dist/cdn/foxy-subscriptions-table.js +1 -1
  41. package/dist/cdn/foxy-table.js +1 -1
  42. package/dist/cdn/foxy-tax-card.js +1 -1
  43. package/dist/cdn/foxy-tax-form.js +1 -1
  44. package/dist/cdn/foxy-template-config-form.js +1 -1
  45. package/dist/cdn/foxy-template-form.js +1 -1
  46. package/dist/cdn/foxy-transaction-card.js +1 -1
  47. package/dist/cdn/foxy-transactions-table.js +1 -1
  48. package/dist/cdn/foxy-user-form.js +1 -1
  49. package/dist/cdn/foxy-users-table.js +1 -1
  50. package/dist/cdn/{shared-74b9e1d1.js → shared-0bda8ecb.js} +1 -1
  51. package/dist/cdn/{shared-07abcd7b.js → shared-0fcdd1c4.js} +1 -1
  52. package/dist/cdn/{shared-a46edf4b.js → shared-30131f76.js} +1 -1
  53. package/dist/cdn/shared-36629ded.js +131 -0
  54. package/dist/cdn/{shared-bc2bfe52.js → shared-4038cb18.js} +1 -1
  55. package/dist/cdn/{shared-44cfc617.js → shared-423a4840.js} +1 -1
  56. package/dist/cdn/shared-4fa5f144.js +1 -0
  57. package/dist/cdn/shared-51b5e223.js +1 -0
  58. package/dist/cdn/{shared-593f7e2c.js → shared-51e28c83.js} +1 -1
  59. package/dist/cdn/shared-710ed658.js +134 -0
  60. package/dist/cdn/shared-800a5471.js +1 -0
  61. package/dist/cdn/{shared-8a7bee0d.js → shared-8f7a66c4.js} +1 -1
  62. package/dist/cdn/{shared-91e768be.js → shared-9af7b5f0.js} +1 -1
  63. package/dist/cdn/{shared-7a42073a.js → shared-a11160e7.js} +5 -5
  64. package/dist/cdn/{shared-5f54e916.js → shared-a4e6ecb0.js} +1 -1
  65. package/dist/cdn/{shared-6ebe3825.js → shared-a8d96c23.js} +1 -1
  66. package/dist/cdn/{shared-322e60b1.js → shared-b03b6d72.js} +1 -1
  67. package/dist/cdn/shared-b2330475.js +1 -0
  68. package/dist/cdn/{shared-1761daef.js → shared-c1dadefe.js} +1 -1
  69. package/dist/cdn/shared-c6a4b2d6.js +1 -0
  70. package/dist/cdn/shared-ccea5a33.js +69 -0
  71. package/dist/cdn/shared-cd3c902e.js +1 -0
  72. package/dist/cdn/{shared-34b2c1e2.js → shared-d3831f99.js} +1 -1
  73. package/dist/cdn/shared-d9a260f0.js +1 -0
  74. package/dist/cdn/{shared-b1fc5dc3.js → shared-f875a4f8.js} +1 -1
  75. package/dist/cdn/{shared-e7f8ffe9.js → shared-fb403e1f.js} +1 -1
  76. package/dist/cdn/shared-ff149b55.js +804 -0
  77. package/dist/cdn/translations/customer-portal/zh-hk.json +35 -0
  78. package/dist/cdn/translations/shared/en.json +105 -0
  79. package/dist/cdn/translations/shared/zh-hk.json +179 -0
  80. package/dist/elements/private/Checkbox/Checkbox.js +36 -22
  81. package/dist/elements/private/Checkbox/Checkbox.js.map +1 -1
  82. package/dist/elements/private/EditableList/EditableList.d.ts +20 -0
  83. package/dist/elements/private/EditableList/EditableList.js +123 -0
  84. package/dist/elements/private/EditableList/EditableList.js.map +1 -0
  85. package/dist/elements/public/CouponCard/CouponCard.d.ts +29 -0
  86. package/dist/elements/public/CouponCard/CouponCard.js +130 -0
  87. package/dist/elements/public/CouponCard/CouponCard.js.map +1 -0
  88. package/dist/elements/public/CouponCard/index.d.ts +5 -0
  89. package/dist/elements/public/CouponCard/index.js +7 -0
  90. package/dist/elements/public/CouponCard/index.js.map +1 -0
  91. package/dist/elements/public/CouponCard/types.d.ts +15 -0
  92. package/dist/elements/public/CouponCard/types.js +2 -0
  93. package/dist/elements/public/CouponCard/types.js.map +1 -0
  94. package/dist/elements/public/CouponCodeForm/CouponCodeForm.d.ts +45 -0
  95. package/dist/elements/public/CouponCodeForm/CouponCodeForm.js +218 -0
  96. package/dist/elements/public/CouponCodeForm/CouponCodeForm.js.map +1 -0
  97. package/dist/elements/public/CouponCodeForm/index.d.ts +8 -0
  98. package/dist/elements/public/CouponCodeForm/index.js +10 -0
  99. package/dist/elements/public/CouponCodeForm/index.js.map +1 -0
  100. package/dist/elements/public/CouponCodeForm/types.d.ts +15 -0
  101. package/dist/elements/public/CouponCodeForm/types.js +2 -0
  102. package/dist/elements/public/CouponCodeForm/types.js.map +1 -0
  103. package/dist/elements/public/CouponCodesForm/CouponCodesForm.d.ts +29 -0
  104. package/dist/elements/public/CouponCodesForm/CouponCodesForm.js +209 -0
  105. package/dist/elements/public/CouponCodesForm/CouponCodesForm.js.map +1 -0
  106. package/dist/elements/public/CouponCodesForm/index.d.ts +8 -0
  107. package/dist/elements/public/CouponCodesForm/index.js +12 -0
  108. package/dist/elements/public/CouponCodesForm/index.js.map +1 -0
  109. package/dist/elements/public/CouponCodesForm/internal/InternalCouponCodesFormListItem.d.ts +14 -0
  110. package/dist/elements/public/CouponCodesForm/internal/InternalCouponCodesFormListItem.js +48 -0
  111. package/dist/elements/public/CouponCodesForm/internal/InternalCouponCodesFormListItem.js.map +1 -0
  112. package/dist/elements/public/CouponCodesForm/types.d.ts +16 -0
  113. package/dist/elements/public/CouponCodesForm/types.js +2 -0
  114. package/dist/elements/public/CouponCodesForm/types.js.map +1 -0
  115. package/dist/elements/public/CouponForm/CouponForm.d.ts +77 -0
  116. package/dist/elements/public/CouponForm/CouponForm.js +1266 -0
  117. package/dist/elements/public/CouponForm/CouponForm.js.map +1 -0
  118. package/dist/elements/public/CouponForm/index.d.ts +19 -0
  119. package/dist/elements/public/CouponForm/index.js +21 -0
  120. package/dist/elements/public/CouponForm/index.js.map +1 -0
  121. package/dist/elements/public/CouponForm/private/CategoryRestrictionsPage.d.ts +19 -0
  122. package/dist/elements/public/CouponForm/private/CategoryRestrictionsPage.js +98 -0
  123. package/dist/elements/public/CouponForm/private/CategoryRestrictionsPage.js.map +1 -0
  124. package/dist/elements/public/CouponForm/private/CategoryRestrictionsPageItem.d.ts +19 -0
  125. package/dist/elements/public/CouponForm/private/CategoryRestrictionsPageItem.js +51 -0
  126. package/dist/elements/public/CouponForm/private/CategoryRestrictionsPageItem.js.map +1 -0
  127. package/dist/elements/public/CouponForm/private/CategoryRestrictionsPageItemContent.d.ts +19 -0
  128. package/dist/elements/public/CouponForm/private/CategoryRestrictionsPageItemContent.js +52 -0
  129. package/dist/elements/public/CouponForm/private/CategoryRestrictionsPageItemContent.js.map +1 -0
  130. package/dist/elements/public/CouponForm/types.d.ts +27 -0
  131. package/dist/elements/public/CouponForm/types.js +2 -0
  132. package/dist/elements/public/CouponForm/types.js.map +1 -0
  133. package/dist/elements/public/GenerateCodesForm/GenerateCodesForm.d.ts +39 -0
  134. package/dist/elements/public/GenerateCodesForm/GenerateCodesForm.js +197 -0
  135. package/dist/elements/public/GenerateCodesForm/GenerateCodesForm.js.map +1 -0
  136. package/dist/elements/public/GenerateCodesForm/index.d.ts +8 -0
  137. package/dist/elements/public/GenerateCodesForm/index.js +10 -0
  138. package/dist/elements/public/GenerateCodesForm/index.js.map +1 -0
  139. package/dist/elements/public/GenerateCodesForm/types.d.ts +24 -0
  140. package/dist/elements/public/GenerateCodesForm/types.js +2 -0
  141. package/dist/elements/public/GenerateCodesForm/types.js.map +1 -0
  142. package/dist/elements/public/I18n/format/date.js +7 -6
  143. package/dist/elements/public/I18n/format/date.js.map +1 -1
  144. package/dist/elements/public/I18n/format/discount.d.ts +6 -0
  145. package/dist/elements/public/I18n/format/discount.js +20 -0
  146. package/dist/elements/public/I18n/format/discount.js.map +1 -0
  147. package/dist/elements/public/I18n/format/index.js +4 -0
  148. package/dist/elements/public/I18n/format/index.js.map +1 -1
  149. package/dist/elements/public/I18n/format/ordinal.d.ts +6 -0
  150. package/dist/elements/public/I18n/format/ordinal.js +9 -0
  151. package/dist/elements/public/I18n/format/ordinal.js.map +1 -0
  152. package/dist/elements/public/Pagination/Pagination.d.ts +37 -0
  153. package/dist/elements/public/Pagination/Pagination.js +154 -0
  154. package/dist/elements/public/Pagination/Pagination.js.map +1 -0
  155. package/dist/elements/public/Pagination/index.d.ts +6 -0
  156. package/dist/elements/public/Pagination/index.js +8 -0
  157. package/dist/elements/public/Pagination/index.js.map +1 -0
  158. package/dist/elements/public/Table/Table.js +20 -5
  159. package/dist/elements/public/Table/Table.js.map +1 -1
  160. package/dist/elements/public/index.d.ts +6 -0
  161. package/dist/elements/public/index.defined.d.ts +6 -0
  162. package/dist/elements/public/index.defined.js +6 -0
  163. package/dist/elements/public/index.defined.js.map +1 -1
  164. package/dist/elements/public/index.js +6 -0
  165. package/dist/elements/public/index.js.map +1 -1
  166. package/dist/mixins/themeable.js +80 -4
  167. package/dist/mixins/themeable.js.map +1 -1
  168. package/package.json +1 -1
  169. package/dist/cdn/shared-00563cb0.js +0 -1
  170. package/dist/cdn/shared-1f1734cb.js +0 -264
  171. package/dist/cdn/shared-66cb6a36.js +0 -1
  172. package/dist/cdn/shared-9a40309d.js +0 -1
  173. package/dist/cdn/shared-9c099da6.js +0 -1
  174. package/dist/cdn/shared-ce1da35d.js +0 -1
  175. package/dist/cdn/shared-f1dc1c6c.js +0 -1
@@ -0,0 +1,123 @@
1
+ import { LitElement, html } from 'lit-element';
2
+ import { ConfigurableMixin } from "../../../mixins/configurable.js";
3
+ import { ThemeableMixin } from "../../../mixins/themeable.js";
4
+ import { TranslatableMixin } from "../../../mixins/translatable.js";
5
+ import { classMap } from "../../../utils/class-map.js";
6
+ import { live } from 'lit-html/directives/live';
7
+ import { repeat } from 'lit-html/directives/repeat';
8
+ export class EditableList extends TranslatableMixin(ConfigurableMixin(ThemeableMixin(LitElement))) {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.options = [];
12
+ this.items = [];
13
+ this.__newItem = '';
14
+ }
15
+ static get properties() {
16
+ return {
17
+ ...super.properties,
18
+ options: { type: Array },
19
+ items: { type: Array },
20
+ __newItem: { attribute: false },
21
+ };
22
+ }
23
+ render() {
24
+ const deleteButtonClass = classMap({
25
+ 'w-xs h-xs mr-xs rounded-full transition-colors flex-shrink-0': true,
26
+ 'focus-outline-none focus-ring-2 ring-inset ring-error-50': true,
27
+ 'text-tertiary hover-bg-error-10 hover-text-error': !this.disabled,
28
+ 'cursor-default text-disabled': this.disabled,
29
+ 'flex items-center justify-center': !this.readonly,
30
+ 'hidden': this.readonly,
31
+ });
32
+ const itemClass = classMap({
33
+ 'transition-colors h-l ml-m flex items-center': true,
34
+ 'text-secondary': this.readonly,
35
+ 'text-disabled': this.disabled,
36
+ });
37
+ const isAddButtonDisabled = this.disabled || !this.__newItem;
38
+ const addItem = () => {
39
+ if (!this.__newItem)
40
+ return;
41
+ this.items.push({ value: this.__newItem });
42
+ this.requestUpdate('items');
43
+ this.dispatchEvent(new CustomEvent('change'));
44
+ this.__newItem = '';
45
+ };
46
+ return html `
47
+ <slot></slot>
48
+
49
+ <ol class="divide-y divide-contrast-10">
50
+ ${repeat(this.items, item => item.value, (item, index) => {
51
+ var _a;
52
+ return html `
53
+ <li class=${itemClass}>
54
+ <div class="flex-1 mr-s">${(_a = item.label) !== null && _a !== void 0 ? _a : item.value}</div>
55
+
56
+ <button
57
+ aria-label=${this.t('delete')}
58
+ class=${deleteButtonClass}
59
+ ?disabled=${this.disabled}
60
+ @click=${() => {
61
+ this.items.splice(index, 1);
62
+ this.requestUpdate('items');
63
+ this.dispatchEvent(new CustomEvent('change'));
64
+ }}
65
+ >
66
+ <iron-icon icon="lumo:cross" class="icon-inline text-xl"></iron-icon>
67
+ </button>
68
+ </li>
69
+ `;
70
+ })}
71
+ </ol>
72
+
73
+ <div
74
+ class=${classMap({
75
+ 'ml-m h-l flex items-center': true,
76
+ 'border-t border-contrast-10': this.items.length > 0,
77
+ 'flex': !this.readonly,
78
+ 'hidden': this.readonly,
79
+ })}
80
+ >
81
+ <input
82
+ placeholder=${this.t('type_here')}
83
+ class="w-full bg-transparent appearance-none h-m focus-outline-none"
84
+ list="list"
85
+ .value=${live(this.__newItem)}
86
+ ?disabled=${this.disabled}
87
+ ?readonly=${this.readonly}
88
+ @keydown=${(evt) => evt.key === 'Enter' && addItem()}
89
+ @input=${(evt) => {
90
+ this.__newItem = evt.currentTarget.value.trim();
91
+ }}
92
+ />
93
+
94
+ <datalist id="list">
95
+ ${this.options.map(({ label, value }) => {
96
+ if (this.items.some(item => item.value === value))
97
+ return;
98
+ return html `<option value=${value}>${label !== null && label !== void 0 ? label : value}</option>`;
99
+ })}
100
+ </datalist>
101
+
102
+ <div class="transition-opacity ${this.__newItem ? 'opacity-100' : 'opacity-0'}">
103
+ <button
104
+ aria-label=${this.t('submit')}
105
+ class=${classMap({
106
+ 'w-xs h-xs mr-xs flex-shrink-0 ring-inset ring-success-50 focus-outline-none': true,
107
+ 'flex items-center justify-center rounded-full transition-colors': true,
108
+ 'bg-contrast-5 text-disabled cursor-default': isAddButtonDisabled,
109
+ 'bg-success-10 text-success cursor-pointer': !isAddButtonDisabled,
110
+ 'hover-bg-success hover-text-success-contrast': !isAddButtonDisabled,
111
+ 'focus-ring-2': !isAddButtonDisabled,
112
+ })}
113
+ ?disabled=${isAddButtonDisabled}
114
+ @click=${addItem}
115
+ >
116
+ <iron-icon icon="lumo:plus" class="icon-inline text-l"></iron-icon>
117
+ </button>
118
+ </div>
119
+ </div>
120
+ `;
121
+ }
122
+ }
123
+ //# sourceMappingURL=EditableList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditableList.js","sourceRoot":"","sources":["../../../../src/elements/private/EditableList/EditableList.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { classMap } from '../../../utils/class-map';\nimport { live } from 'lit-html/directives/live';\nimport { repeat } from 'lit-html/directives/repeat';\n\nexport class EditableList extends TranslatableMixin(ConfigurableMixin(ThemeableMixin(LitElement))) {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n options: { type: Array },\n items: { type: Array },\n __newItem: { attribute: false },\n };\n }\n\n options: { label?: string; value: string }[] = [];\n\n items: { label?: string | TemplateResult; value: string }[] = [];\n\n private __newItem = '';\n\n render(): TemplateResult {\n const deleteButtonClass = classMap({\n 'w-xs h-xs mr-xs rounded-full transition-colors flex-shrink-0': true,\n 'focus-outline-none focus-ring-2 ring-inset ring-error-50': true,\n 'text-tertiary hover-bg-error-10 hover-text-error': !this.disabled,\n 'cursor-default text-disabled': this.disabled,\n 'flex items-center justify-center': !this.readonly,\n 'hidden': this.readonly,\n });\n\n const itemClass = classMap({\n 'transition-colors h-l ml-m flex items-center': true,\n 'text-secondary': this.readonly,\n 'text-disabled': this.disabled,\n });\n\n const isAddButtonDisabled = this.disabled || !this.__newItem;\n\n const addItem = () => {\n if (!this.__newItem) return;\n this.items.push({ value: this.__newItem });\n this.requestUpdate('items');\n this.dispatchEvent(new CustomEvent('change'));\n this.__newItem = '';\n };\n\n return html`\n <slot></slot>\n\n <ol class=\"divide-y divide-contrast-10\">\n ${repeat(\n this.items,\n item => item.value,\n (item, index) => {\n return html`\n <li class=${itemClass}>\n <div class=\"flex-1 mr-s\">${item.label ?? item.value}</div>\n\n <button\n aria-label=${this.t('delete')}\n class=${deleteButtonClass}\n ?disabled=${this.disabled}\n @click=${() => {\n this.items.splice(index, 1);\n this.requestUpdate('items');\n this.dispatchEvent(new CustomEvent('change'));\n }}\n >\n <iron-icon icon=\"lumo:cross\" class=\"icon-inline text-xl\"></iron-icon>\n </button>\n </li>\n `;\n }\n )}\n </ol>\n\n <div\n class=${classMap({\n 'ml-m h-l flex items-center': true,\n 'border-t border-contrast-10': this.items.length > 0,\n 'flex': !this.readonly,\n 'hidden': this.readonly,\n })}\n >\n <input\n placeholder=${this.t('type_here')}\n class=\"w-full bg-transparent appearance-none h-m focus-outline-none\"\n list=\"list\"\n .value=${live(this.__newItem)}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && addItem()}\n @input=${(evt: InputEvent) => {\n this.__newItem = (evt.currentTarget as HTMLInputElement).value.trim();\n }}\n />\n\n <datalist id=\"list\">\n ${this.options.map(({ label, value }) => {\n if (this.items.some(item => item.value === value)) return;\n return html`<option value=${value}>${label ?? value}</option>`;\n })}\n </datalist>\n\n <div class=\"transition-opacity ${this.__newItem ? 'opacity-100' : 'opacity-0'}\">\n <button\n aria-label=${this.t('submit')}\n class=${classMap({\n 'w-xs h-xs mr-xs flex-shrink-0 ring-inset ring-success-50 focus-outline-none': true,\n 'flex items-center justify-center rounded-full transition-colors': true,\n 'bg-contrast-5 text-disabled cursor-default': isAddButtonDisabled,\n 'bg-success-10 text-success cursor-pointer': !isAddButtonDisabled,\n 'hover-bg-success hover-text-success-contrast': !isAddButtonDisabled,\n 'focus-ring-2': !isAddButtonDisabled,\n })}\n ?disabled=${isAddButtonDisabled}\n @click=${addItem}\n >\n <iron-icon icon=\"lumo:plus\" class=\"icon-inline text-l\"></iron-icon>\n </button>\n </div>\n </div>\n `;\n }\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import { Data, Templates } from './types';
2
+ import { TemplateResult } from 'lit-html';
3
+ import { NucleonElement } from '../NucleonElement/NucleonElement';
4
+ declare const Base: typeof NucleonElement & import("lit-element").Constructor<import("../../../mixins/translatable").TranslatableMixinHost> & {
5
+ defaultNS: string;
6
+ } & import("lit-element").Constructor<import("../../../mixins/configurable").ConfigurableMixinHost> & {
7
+ styles: import("lit-element").CSSResultArray;
8
+ };
9
+ /**
10
+ * Basic card displaying a coupon.
11
+ *
12
+ * @slot title:before
13
+ * @slot title:after
14
+ * @slot description:before
15
+ * @slot description:after
16
+ * @slot status:before
17
+ * @slot status:after
18
+ *
19
+ * @element foxy-coupon-card
20
+ * @since 1.15.0
21
+ */
22
+ export declare class CouponCard extends Base<Data> {
23
+ templates: Templates;
24
+ render(): TemplateResult;
25
+ private __renderTitle;
26
+ private __renderDescription;
27
+ private __renderStatus;
28
+ }
29
+ export {};
@@ -0,0 +1,130 @@
1
+ import { html } from 'lit-html';
2
+ import { ConfigurableMixin } from "../../../mixins/configurable.js";
3
+ import { NucleonElement } from "../NucleonElement/NucleonElement.js";
4
+ import { ThemeableMixin } from "../../../mixins/themeable.js";
5
+ import { TranslatableMixin } from "../../../mixins/translatable.js";
6
+ import { classMap } from "../../../utils/class-map.js";
7
+ const NS = 'coupon-card';
8
+ const Base = ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS)));
9
+ /**
10
+ * Basic card displaying a coupon.
11
+ *
12
+ * @slot title:before
13
+ * @slot title:after
14
+ * @slot description:before
15
+ * @slot description:after
16
+ * @slot status:before
17
+ * @slot status:after
18
+ *
19
+ * @element foxy-coupon-card
20
+ * @since 1.15.0
21
+ */
22
+ export class CouponCard extends Base {
23
+ constructor() {
24
+ super(...arguments);
25
+ this.templates = {};
26
+ }
27
+ render() {
28
+ var _a, _b;
29
+ const hiddenSelector = this.hiddenSelector;
30
+ return html `
31
+ <div
32
+ aria-busy=${this.in('busy')}
33
+ aria-live="polite"
34
+ class="relative leading-m font-lumo text-m"
35
+ >
36
+ <div class=${classMap({ 'transition-opacity': true, 'opacity-0': !this.data })}>
37
+ ${hiddenSelector.matches('title', true) ? '' : this.__renderTitle()}
38
+ ${hiddenSelector.matches('description', true) ? '' : this.__renderDescription()}
39
+ ${hiddenSelector.matches('status', true) ? '' : this.__renderStatus()}
40
+ </div>
41
+
42
+ <div
43
+ class=${classMap({
44
+ 'pointer-events-none absolute inset-0 flex transition-opacity': true,
45
+ 'opacity-0': !!this.data,
46
+ })}
47
+ >
48
+ <foxy-spinner
49
+ data-testid="spinner"
50
+ state=${this.in('fail') ? 'error' : this.in({ idle: 'template' }) ? 'empty' : 'busy'}
51
+ class="m-auto"
52
+ lang=${this.lang}
53
+ ns="${this.ns} ${(_b = (_a = customElements.get('foxy-spinner')) === null || _a === void 0 ? void 0 : _a.defaultNS) !== null && _b !== void 0 ? _b : ''}"
54
+ >
55
+ </foxy-spinner>
56
+ </div>
57
+ </div>
58
+ `;
59
+ }
60
+ __renderTitle() {
61
+ var _a, _b, _c, _d, _e;
62
+ const count = (_b = (_a = this.data) === null || _a === void 0 ? void 0 : _a.number_of_uses_to_date) !== null && _b !== void 0 ? _b : 0;
63
+ const total = (_d = (_c = this.data) === null || _c === void 0 ? void 0 : _c.number_of_uses_allowed) !== null && _d !== void 0 ? _d : 0;
64
+ return html `
65
+ <div>
66
+ ${this.renderTemplateOrSlot('title:before')}
67
+
68
+ <div class="flex items-center justify-between">
69
+ <div class="font-semibold truncate">${(_e = this.data) === null || _e === void 0 ? void 0 : _e.name}</div>
70
+
71
+ <foxy-i18n
72
+ options=${JSON.stringify({ count, total })}
73
+ class="text-tertiary text-s flex-shrink-0"
74
+ lang=${this.lang}
75
+ key=${total === 0 ? 'uses_count' : 'uses_to_total_count'}
76
+ ns=${this.ns}
77
+ >
78
+ </foxy-i18n>
79
+ </div>
80
+
81
+ ${this.renderTemplateOrSlot('title:after')}
82
+ </div>
83
+ `;
84
+ }
85
+ __renderDescription() {
86
+ let summary = null;
87
+ if (this.data) {
88
+ const details = this.data.coupon_discount_details;
89
+ const type = this.data.coupon_discount_type;
90
+ summary = html `
91
+ <foxy-i18n
92
+ options=${JSON.stringify({ params: { details, type } })}
93
+ lang=${this.lang}
94
+ key="discount_summary"
95
+ ns=${this.ns}
96
+ >
97
+ </foxy-i18n>
98
+ `;
99
+ }
100
+ return html `
101
+ <div>
102
+ ${this.renderTemplateOrSlot('description:before')}
103
+ <div class="truncate text-s text-secondary">${summary !== null && summary !== void 0 ? summary : html `&ZeroWidthSpace;`}</div>
104
+ ${this.renderTemplateOrSlot('description:after')}
105
+ </div>
106
+ `;
107
+ }
108
+ __renderStatus() {
109
+ var _a;
110
+ const { start_date: start, end_date: end } = (_a = this.data) !== null && _a !== void 0 ? _a : {};
111
+ const type = start && end ? 'complete' : start ? 'from' : end ? 'until' : 'any';
112
+ return html `
113
+ <div>
114
+ ${this.renderTemplateOrSlot('status:before')}
115
+
116
+ <foxy-i18n
117
+ options=${JSON.stringify({ start, end })}
118
+ class="block truncate text-s text-tertiary"
119
+ lang=${this.lang}
120
+ key="date_range_${type}"
121
+ ns=${this.ns}
122
+ >
123
+ </foxy-i18n>
124
+
125
+ ${this.renderTemplateOrSlot('status:after')}
126
+ </div>
127
+ `;
128
+ }
129
+ }
130
+ //# sourceMappingURL=CouponCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CouponCard.js","sourceRoot":"","sources":["../../../../src/elements/public/CouponCard/CouponCard.ts"],"names":[],"mappings":"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","sourcesContent":["import { Data, Templates } from './types';\nimport { TemplateResult, html } from 'lit-html';\n\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { classMap } from '../../../utils/class-map';\n\nconst NS = 'coupon-card';\nconst Base = ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS)));\n\n/**\n * Basic card displaying a coupon.\n *\n * @slot title:before\n * @slot title:after\n * @slot description:before\n * @slot description:after\n * @slot status:before\n * @slot status:after\n *\n * @element foxy-coupon-card\n * @since 1.15.0\n */\nexport class CouponCard extends Base<Data> {\n templates: Templates = {};\n\n render(): TemplateResult {\n const hiddenSelector = this.hiddenSelector;\n\n return html`\n <div\n aria-busy=${this.in('busy')}\n aria-live=\"polite\"\n class=\"relative leading-m font-lumo text-m\"\n >\n <div class=${classMap({ 'transition-opacity': true, 'opacity-0': !this.data })}>\n ${hiddenSelector.matches('title', true) ? '' : this.__renderTitle()}\n ${hiddenSelector.matches('description', true) ? '' : this.__renderDescription()}\n ${hiddenSelector.matches('status', true) ? '' : this.__renderStatus()}\n </div>\n\n <div\n class=${classMap({\n 'pointer-events-none absolute inset-0 flex transition-opacity': true,\n 'opacity-0': !!this.data,\n })}\n >\n <foxy-spinner\n data-testid=\"spinner\"\n state=${this.in('fail') ? 'error' : this.in({ idle: 'template' }) ? 'empty' : 'busy'}\n class=\"m-auto\"\n lang=${this.lang}\n ns=\"${this.ns} ${customElements.get('foxy-spinner')?.defaultNS ?? ''}\"\n >\n </foxy-spinner>\n </div>\n </div>\n `;\n }\n\n private __renderTitle() {\n const count = this.data?.number_of_uses_to_date ?? 0;\n const total = this.data?.number_of_uses_allowed ?? 0;\n\n return html`\n <div>\n ${this.renderTemplateOrSlot('title:before')}\n\n <div class=\"flex items-center justify-between\">\n <div class=\"font-semibold truncate\">${this.data?.name}</div>\n\n <foxy-i18n\n options=${JSON.stringify({ count, total })}\n class=\"text-tertiary text-s flex-shrink-0\"\n lang=${this.lang}\n key=${total === 0 ? 'uses_count' : 'uses_to_total_count'}\n ns=${this.ns}\n >\n </foxy-i18n>\n </div>\n\n ${this.renderTemplateOrSlot('title:after')}\n </div>\n `;\n }\n\n private __renderDescription() {\n let summary: TemplateResult | null = null;\n\n if (this.data) {\n const details = this.data.coupon_discount_details;\n const type = this.data.coupon_discount_type;\n\n summary = html`\n <foxy-i18n\n options=${JSON.stringify({ params: { details, type } })}\n lang=${this.lang}\n key=\"discount_summary\"\n ns=${this.ns}\n >\n </foxy-i18n>\n `;\n }\n\n return html`\n <div>\n ${this.renderTemplateOrSlot('description:before')}\n <div class=\"truncate text-s text-secondary\">${summary ?? html`&ZeroWidthSpace;`}</div>\n ${this.renderTemplateOrSlot('description:after')}\n </div>\n `;\n }\n\n private __renderStatus() {\n const { start_date: start, end_date: end } = this.data ?? {};\n const type = start && end ? 'complete' : start ? 'from' : end ? 'until' : 'any';\n\n return html`\n <div>\n ${this.renderTemplateOrSlot('status:before')}\n\n <foxy-i18n\n options=${JSON.stringify({ start, end })}\n class=\"block truncate text-s text-tertiary\"\n lang=${this.lang}\n key=\"date_range_${type}\"\n ns=${this.ns}\n >\n </foxy-i18n>\n\n ${this.renderTemplateOrSlot('status:after')}\n </div>\n `;\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import '../../internal/InternalSandbox/index';
2
+ import '../Spinner/index';
3
+ import '../I18n/index';
4
+ import { CouponCard } from './CouponCard';
5
+ export { CouponCard };
@@ -0,0 +1,7 @@
1
+ import "../../internal/InternalSandbox/index.js";
2
+ import "../Spinner/index.js";
3
+ import "../I18n/index.js";
4
+ import { CouponCard } from "./CouponCard.js";
5
+ customElements.define('foxy-coupon-card', CouponCard);
6
+ export { CouponCard };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/CouponCard/index.ts"],"names":[],"mappings":"AAAA,iDAA8C;AAC9C,6BAA0B;AAC1B,0BAAuB;AAEvB,OAAO,EAAE,UAAU,EAAE,wBAAqB;AAE1C,cAAc,CAAC,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["import '../../internal/InternalSandbox/index';\nimport '../Spinner/index';\nimport '../I18n/index';\n\nimport { CouponCard } from './CouponCard';\n\ncustomElements.define('foxy-coupon-card', CouponCard);\n\nexport { CouponCard };\n"]}
@@ -0,0 +1,15 @@
1
+ import { CouponCard } from './CouponCard';
2
+ import { Rels } from '@foxy.io/sdk/backend';
3
+ import { Renderer } from '../../../mixins/configurable';
4
+ import { Resource } from '@foxy.io/sdk/core';
5
+ export declare type Data = Resource<Rels.Coupon>;
6
+ export declare type Templates = Partial<{
7
+ 'total:before': Renderer<CouponCard>;
8
+ 'total:after': Renderer<CouponCard>;
9
+ 'status:before': Renderer<CouponCard>;
10
+ 'status:after': Renderer<CouponCard>;
11
+ 'description:before': Renderer<CouponCard>;
12
+ 'description:after': Renderer<CouponCard>;
13
+ 'customer:before': Renderer<CouponCard>;
14
+ 'customer:after': Renderer<CouponCard>;
15
+ }>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/elements/public/CouponCard/types.ts"],"names":[],"mappings":"","sourcesContent":["import { CouponCard } from './CouponCard';\nimport { Rels } from '@foxy.io/sdk/backend';\nimport { Renderer } from '../../../mixins/configurable';\nimport { Resource } from '@foxy.io/sdk/core';\n\nexport type Data = Resource<Rels.Coupon>;\n\nexport type Templates = Partial<{\n 'total:before': Renderer<CouponCard>;\n 'total:after': Renderer<CouponCard>;\n 'status:before': Renderer<CouponCard>;\n 'status:after': Renderer<CouponCard>;\n 'description:before': Renderer<CouponCard>;\n 'description:after': Renderer<CouponCard>;\n 'customer:before': Renderer<CouponCard>;\n 'customer:after': Renderer<CouponCard>;\n}>;\n"]}
@@ -0,0 +1,45 @@
1
+ import { Data, Templates } from './types';
2
+ import { ScopedElementsMap } from '@open-wc/scoped-elements';
3
+ import { TemplateResult } from 'lit-html';
4
+ import { NucleonElement } from '../NucleonElement/NucleonElement';
5
+ import { NucleonV8N } from '../NucleonElement/types';
6
+ declare const Base: typeof NucleonElement & import("lit-element").Constructor<import("../../../mixins/translatable").TranslatableMixinHost> & {
7
+ defaultNS: string;
8
+ } & import("@open-wc/dedupe-mixin").Constructor<import("@open-wc/scoped-elements/src/types").ScopedElementsHost> & {
9
+ styles: import("lit-element").CSSResultArray;
10
+ } & import("lit-element").Constructor<import("../../../mixins/configurable").ConfigurableMixinHost>;
11
+ /**
12
+ * Form element for creating or editing coupon codes (`fx:coupon_code`).
13
+ *
14
+ * @slot code:before
15
+ * @slot code:after
16
+ *
17
+ * @slot timestamps:before
18
+ * @slot timestamps:after
19
+ *
20
+ * @slot delete:before
21
+ * @slot delete:after
22
+ *
23
+ * @slot create:before
24
+ * @slot create:after
25
+ *
26
+ * @element foxy-coupon-code-form
27
+ * @since 1.15.0
28
+ */
29
+ export declare class CouponCodeForm extends Base<Data> {
30
+ static get scopedElements(): ScopedElementsMap;
31
+ static get v8n(): NucleonV8N<Data>;
32
+ templates: Templates;
33
+ render(): TemplateResult;
34
+ private get __isCodeHidden();
35
+ private get __isTimestampsHidden();
36
+ private get __isCreateHidden();
37
+ private get __isDeleteHidden();
38
+ private __getErrorMessage;
39
+ private __getValidator;
40
+ private __renderCode;
41
+ private __renderTimestamps;
42
+ private __renderCreate;
43
+ private __renderDelete;
44
+ }
45
+ export {};
@@ -0,0 +1,218 @@
1
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
2
+ import { html } from 'lit-html';
3
+ import { ConfigurableMixin } from "../../../mixins/configurable.js";
4
+ import { NucleonElement } from "../NucleonElement/NucleonElement.js";
5
+ import { PropertyTable } from "../../private/index.js";
6
+ import { ThemeableMixin } from "../../../mixins/themeable.js";
7
+ import { TranslatableMixin } from "../../../mixins/translatable.js";
8
+ import { classMap } from "../../../utils/class-map.js";
9
+ import { ifDefined } from 'lit-html/directives/if-defined';
10
+ const NS = 'coupon-code-form';
11
+ const Base = ConfigurableMixin(ThemeableMixin(ScopedElementsMixin(TranslatableMixin(NucleonElement, NS))));
12
+ /**
13
+ * Form element for creating or editing coupon codes (`fx:coupon_code`).
14
+ *
15
+ * @slot code:before
16
+ * @slot code:after
17
+ *
18
+ * @slot timestamps:before
19
+ * @slot timestamps:after
20
+ *
21
+ * @slot delete:before
22
+ * @slot delete:after
23
+ *
24
+ * @slot create:before
25
+ * @slot create:after
26
+ *
27
+ * @element foxy-coupon-code-form
28
+ * @since 1.15.0
29
+ */
30
+ export class CouponCodeForm extends Base {
31
+ constructor() {
32
+ super(...arguments);
33
+ this.templates = {};
34
+ }
35
+ static get scopedElements() {
36
+ return {
37
+ 'vaadin-text-field': customElements.get('vaadin-text-field'),
38
+ 'vaadin-button': customElements.get('vaadin-button'),
39
+ 'foxy-internal-confirm-dialog': customElements.get('foxy-internal-confirm-dialog'),
40
+ 'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),
41
+ 'foxy-spinner': customElements.get('foxy-spinner'),
42
+ 'foxy-i18n': customElements.get('foxy-i18n'),
43
+ 'x-property-table': PropertyTable,
44
+ };
45
+ }
46
+ static get v8n() {
47
+ return [
48
+ ({ code: v }) => !!v || 'code_required',
49
+ ({ code: v }) => !v || v.length <= 50 || 'code_too_long',
50
+ ];
51
+ }
52
+ render() {
53
+ var _a, _b;
54
+ return html `
55
+ <div class="relative space-y-m">
56
+ ${this.__isCodeHidden ? null : this.__renderCode()}
57
+ ${this.__isTimestampsHidden ? null : this.__renderTimestamps()}
58
+ ${this.__isCreateHidden ? null : this.__renderCreate()}
59
+ ${this.__isDeleteHidden ? null : this.__renderDelete()}
60
+
61
+ <div
62
+ data-testid="spinner"
63
+ class=${classMap({
64
+ 'transition duration-500 ease-in-out absolute inset-0 flex': true,
65
+ 'opacity-0 pointer-events-none': !this.in('busy') && !this.in('fail'),
66
+ })}
67
+ >
68
+ <foxy-spinner
69
+ layout="vertical"
70
+ class="m-auto p-m bg-base shadow-xs rounded-t-l rounded-b-l"
71
+ state=${this.in('fail') ? 'error' : this.in('busy') ? 'busy' : 'empty'}
72
+ lang=${this.lang}
73
+ ns="${this.ns} ${(_b = (_a = customElements.get('foxy-spinner')) === null || _a === void 0 ? void 0 : _a.defaultNS) !== null && _b !== void 0 ? _b : ''}"
74
+ >
75
+ </foxy-spinner>
76
+ </div>
77
+ </div>
78
+ `;
79
+ }
80
+ get __isCodeHidden() {
81
+ return this.hiddenSelector.matches('code', true);
82
+ }
83
+ get __isTimestampsHidden() {
84
+ if (this.hiddenSelector.matches('timestamps', true))
85
+ return true;
86
+ return !this.data;
87
+ }
88
+ get __isCreateHidden() {
89
+ if (this.hiddenSelector.matches('create', true))
90
+ return true;
91
+ return !!this.data;
92
+ }
93
+ get __isDeleteHidden() {
94
+ if (this.hiddenSelector.matches('delete', true))
95
+ return true;
96
+ return !this.data;
97
+ }
98
+ __getErrorMessage(prefix) {
99
+ const error = this.errors.find(err => err.startsWith(prefix));
100
+ return error ? this.t(error.replace(prefix, 'v8n')).toString() : '';
101
+ }
102
+ __getValidator(prefix) {
103
+ return () => !this.errors.some(err => err.startsWith(prefix));
104
+ }
105
+ __renderCode() {
106
+ return html `
107
+ <div>
108
+ ${this.renderTemplateOrSlot('code:before')}
109
+
110
+ <vaadin-text-field
111
+ data-testid="code"
112
+ class="w-full"
113
+ label=${this.t('code')}
114
+ value=${ifDefined(this.form.code)}
115
+ .checkValidity=${this.__getValidator('code')}
116
+ .errorMessage=${this.__getErrorMessage('code')}
117
+ ?disabled=${this.in('busy') || this.disabledSelector.matches('code', true)}
118
+ ?readonly=${this.readonlySelector.matches('code', true)}
119
+ required
120
+ @keydown=${(evt) => evt.key === 'Enter' && this.submit()}
121
+ @input=${(evt) => {
122
+ const newCode = evt.currentTarget.value;
123
+ this.edit({ code: newCode });
124
+ }}
125
+ >
126
+ </vaadin-text-field>
127
+
128
+ ${this.renderTemplateOrSlot('name:after')}
129
+ </div>
130
+ `;
131
+ }
132
+ __renderTimestamps() {
133
+ return html `
134
+ <div>
135
+ ${this.renderTemplateOrSlot('timestamps:before')}
136
+
137
+ <x-property-table
138
+ data-testid="timestamps"
139
+ .items=${['date_modified', 'date_created'].map(field => {
140
+ var _a;
141
+ return ({
142
+ name: this.t(field),
143
+ value: ((_a = this.data) === null || _a === void 0 ? void 0 : _a[field]) ? this.t('date', { value: new Date(this.data[field]) })
144
+ : '',
145
+ });
146
+ })}
147
+ >
148
+ </x-property-table>
149
+
150
+ ${this.renderTemplateOrSlot('timestamps:after')}
151
+ </div>
152
+ `;
153
+ }
154
+ __renderCreate() {
155
+ const isCleanTemplateInvalid = this.in({ idle: { template: { clean: 'invalid' } } });
156
+ const isDirtyTemplateInvalid = this.in({ idle: { template: { dirty: 'invalid' } } });
157
+ const isCleanSnapshotInvalid = this.in({ idle: { snapshot: { clean: 'invalid' } } });
158
+ const isDirtySnapshotInvalid = this.in({ idle: { snapshot: { dirty: 'invalid' } } });
159
+ const isTemplateInvalid = isCleanTemplateInvalid || isDirtyTemplateInvalid;
160
+ const isSnaphotInvalid = isCleanSnapshotInvalid || isDirtySnapshotInvalid;
161
+ const isInvalid = isTemplateInvalid || isSnaphotInvalid;
162
+ const isBusy = this.in('busy');
163
+ return html `
164
+ <div>
165
+ ${this.renderTemplateOrSlot('create:before')}
166
+
167
+ <vaadin-button
168
+ data-testid="create"
169
+ class="w-full"
170
+ theme="primary success"
171
+ ?disabled=${isBusy || isInvalid || this.disabledSelector.matches('create', true)}
172
+ @click=${this.submit}
173
+ >
174
+ <foxy-i18n ns=${this.ns} key="create" lang=${this.lang}></foxy-i18n>
175
+ </vaadin-button>
176
+
177
+ ${this.renderTemplateOrSlot('create:after')}
178
+ </div>
179
+ `;
180
+ }
181
+ __renderDelete() {
182
+ return html `
183
+ <div>
184
+ <foxy-internal-confirm-dialog
185
+ data-testid="confirm"
186
+ message="delete_prompt"
187
+ confirm="delete"
188
+ cancel="cancel"
189
+ header="delete"
190
+ theme="primary error"
191
+ lang=${this.lang}
192
+ ns=${this.ns}
193
+ id="confirm"
194
+ @hide=${(evt) => !evt.detail.cancelled && this.delete()}
195
+ >
196
+ </foxy-internal-confirm-dialog>
197
+
198
+ ${this.renderTemplateOrSlot('delete:before')}
199
+
200
+ <vaadin-button
201
+ data-testid="delete"
202
+ theme="primary error"
203
+ class="w-full"
204
+ ?disabled=${this.in('busy') || this.disabledSelector.matches('delete', true)}
205
+ @click=${(evt) => {
206
+ const confirm = this.renderRoot.querySelector('#confirm');
207
+ confirm.show(evt.currentTarget);
208
+ }}
209
+ >
210
+ <foxy-i18n ns=${this.ns} key="delete" lang=${this.lang}></foxy-i18n>
211
+ </vaadin-button>
212
+
213
+ ${this.renderTemplateOrSlot('delete:after')}
214
+ </div>
215
+ `;
216
+ }
217
+ }
218
+ //# sourceMappingURL=CouponCodeForm.js.map