@foxy.io/elements 1.15.0-beta.5 → 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 (93) 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-card.js +1 -1
  17. package/dist/cdn/foxy-customer-form.js +1 -1
  18. package/dist/cdn/foxy-customer-portal-settings.js +1 -1
  19. package/dist/cdn/foxy-customer-portal.js +2 -2
  20. package/dist/cdn/foxy-customer.js +1 -1
  21. package/dist/cdn/foxy-customers-table.js +1 -1
  22. package/dist/cdn/foxy-discount-card.js +1 -1
  23. package/dist/cdn/foxy-donation.js +1 -1
  24. package/dist/cdn/foxy-email-template-form.js +1 -1
  25. package/dist/cdn/foxy-form-dialog.js +1 -1
  26. package/dist/cdn/foxy-generate-codes-form.js +1 -1
  27. package/dist/cdn/foxy-gift-card-card.js +1 -1
  28. package/dist/cdn/foxy-gift-card-code-form.js +1 -1
  29. package/dist/cdn/foxy-gift-card-codes-form.js +1 -1
  30. package/dist/cdn/foxy-gift-card-form.js +1 -1
  31. package/dist/cdn/foxy-i18n.js +1 -1
  32. package/dist/cdn/foxy-items-form.js +1 -1
  33. package/dist/cdn/foxy-pagination.js +1 -1
  34. package/dist/cdn/foxy-payment-card.js +1 -1
  35. package/dist/cdn/foxy-payment-method-card.js +1 -1
  36. package/dist/cdn/foxy-sign-in-form.js +1 -1
  37. package/dist/cdn/foxy-spinner.js +2 -2
  38. package/dist/cdn/foxy-subscription-card.js +1 -1
  39. package/dist/cdn/foxy-subscription-form.js +1 -1
  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-4cc1da27.js → shared-06e64d75.js} +1 -1
  51. package/dist/cdn/shared-11708514.js +1 -0
  52. package/dist/cdn/{shared-5639389e.js → shared-20b9ce70.js} +1 -1
  53. package/dist/cdn/{shared-0032dc09.js → shared-25e67340.js} +2 -2
  54. package/dist/cdn/shared-3be96355.js +1 -0
  55. package/dist/cdn/shared-5272c758.js +1 -0
  56. package/dist/cdn/shared-805d18a2.js +1 -0
  57. package/dist/cdn/shared-940a4826.js +1 -0
  58. package/dist/cdn/{shared-67ca44d2.js → shared-a7095b6a.js} +1 -1
  59. package/dist/cdn/{shared-b30bc42d.js → shared-ffb27563.js} +1 -1
  60. package/dist/cdn/translations/shared/en.json +3 -1
  61. package/dist/elements/public/CouponCard/CouponCard.js +3 -3
  62. package/dist/elements/public/CouponCard/CouponCard.js.map +1 -1
  63. package/dist/elements/public/CouponCodesForm/types.d.ts +3 -2
  64. package/dist/elements/public/CouponCodesForm/types.js.map +1 -1
  65. package/dist/elements/public/CouponForm/CouponForm.js +3 -1
  66. package/dist/elements/public/CouponForm/CouponForm.js.map +1 -1
  67. package/dist/elements/public/GenerateCodesForm/GenerateCodesForm.d.ts +4 -0
  68. package/dist/elements/public/GenerateCodesForm/GenerateCodesForm.js +32 -0
  69. package/dist/elements/public/GenerateCodesForm/GenerateCodesForm.js.map +1 -1
  70. package/dist/elements/public/GiftCardCard/GiftCardCard.js +6 -29
  71. package/dist/elements/public/GiftCardCard/GiftCardCard.js.map +1 -1
  72. package/dist/elements/public/GiftCardCodesForm/GiftCardCodesForm.d.ts +6 -0
  73. package/dist/elements/public/GiftCardCodesForm/GiftCardCodesForm.js +45 -1
  74. package/dist/elements/public/GiftCardCodesForm/GiftCardCodesForm.js.map +1 -1
  75. package/dist/elements/public/GiftCardCodesForm/index.d.ts +1 -0
  76. package/dist/elements/public/GiftCardCodesForm/index.js +1 -0
  77. package/dist/elements/public/GiftCardCodesForm/index.js.map +1 -1
  78. package/dist/elements/public/GiftCardCodesForm/types.d.ts +3 -2
  79. package/dist/elements/public/GiftCardCodesForm/types.js.map +1 -1
  80. package/dist/elements/public/GiftCardForm/GiftCardForm.d.ts +3 -2
  81. package/dist/elements/public/GiftCardForm/GiftCardForm.js +29 -13
  82. package/dist/elements/public/GiftCardForm/GiftCardForm.js.map +1 -1
  83. package/dist/elements/public/I18n/format/index.js +2 -0
  84. package/dist/elements/public/I18n/format/index.js.map +1 -1
  85. package/dist/elements/public/I18n/format/relative.d.ts +6 -0
  86. package/dist/elements/public/I18n/format/relative.js +15 -0
  87. package/dist/elements/public/I18n/format/relative.js.map +1 -0
  88. package/package.json +2 -2
  89. package/dist/cdn/shared-05488216.js +0 -1
  90. package/dist/cdn/shared-0e4d19e2.js +0 -1
  91. package/dist/cdn/shared-43abbdd9.js +0 -1
  92. package/dist/cdn/shared-8a5ec3cf.js +0 -1
  93. package/dist/cdn/shared-cf6751d3.js +0 -1
@@ -4,7 +4,6 @@ import { NucleonElement } from "../NucleonElement/NucleonElement.js";
4
4
  import { ThemeableMixin } from "../../../mixins/themeable.js";
5
5
  import { TranslatableMixin } from "../../../mixins/translatable.js";
6
6
  import { classMap } from "../../../utils/class-map.js";
7
- import { parseDuration } from "../../../utils/parse-duration.js";
8
7
  const NS = 'gift-card-card';
9
8
  const Base = ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS)));
10
9
  /**
@@ -60,12 +59,12 @@ export class GiftCardCard extends Base {
60
59
  const name = (_b = (_a = this.data) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : html `​`;
61
60
  const code = (_d = (_c = this.data) === null || _c === void 0 ? void 0 : _c.currency_code) !== null && _d !== void 0 ? _d : html `​`;
62
61
  return html `
63
- <div>
62
+ <div data-testid="title">
64
63
  ${this.renderTemplateOrSlot('title:before')}
65
64
 
66
65
  <div class="flex items-center justify-between">
67
66
  <div class="font-semibold truncate">${name}</div>
68
- <div class="text-tertiary text-s flex-shrink-0">${code}</div>
67
+ <div class="text-tertiary uppercase text-s flex-shrink-0">${code}</div>
69
68
  </div>
70
69
 
71
70
  ${this.renderTemplateOrSlot('title:after')}
@@ -74,38 +73,16 @@ export class GiftCardCard extends Base {
74
73
  }
75
74
  __renderStatus() {
76
75
  var _a;
77
- let options;
78
- let key;
79
- if ((_a = this.data) === null || _a === void 0 ? void 0 : _a.expires_after) {
80
- let value;
81
- try {
82
- const rtf = new Intl.RelativeTimeFormat(this.lang);
83
- let { count, units } = parseDuration(this.data.expires_after, true);
84
- if (count === 0.5 && units === 'month') {
85
- count = 2;
86
- units = 'week';
87
- }
88
- value = rtf.format(count, units);
89
- }
90
- catch (_b) {
91
- value = this.data.expires_after;
92
- }
93
- options = JSON.stringify({ value });
94
- key = 'expires_after_value';
95
- }
96
- else {
97
- options = '';
98
- key = 'never_expires';
99
- }
76
+ const expiresAfter = (_a = this.data) === null || _a === void 0 ? void 0 : _a.expires_after;
100
77
  return html `
101
- <div>
78
+ <div data-testid="status">
102
79
  ${this.renderTemplateOrSlot('status:before')}
103
80
 
104
81
  <foxy-i18n
105
- options=${options}
82
+ options=${JSON.stringify({ value: expiresAfter })}
106
83
  class="block truncate text-s text-tertiary"
107
84
  lang=${this.lang}
108
- key=${key}
85
+ key=${expiresAfter ? 'expires_after_value' : 'never_expires'}
109
86
  ns=${this.ns}
110
87
  >
111
88
  </foxy-i18n>
@@ -1 +1 @@
1
- {"version":3,"file":"GiftCardCard.js","sourceRoot":"","sources":["../../../../src/elements/public/GiftCardCard/GiftCardCard.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';\nimport { parseDuration } from '../../../utils/parse-duration';\n\nconst NS = 'gift-card-card';\nconst Base = ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS)));\n\n/**\n * Basic card displaying a gift card.\n *\n * @slot title:before\n * @slot title:after\n * @slot status:before\n * @slot status:after\n *\n * @element foxy-gift-card-card\n * @since 1.15.0\n */\nexport class GiftCardCard 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('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 name = this.data?.name ?? html`&ZeroWidthSpace;`;\n const code = this.data?.currency_code ?? html`&ZeroWidthSpace;`;\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\">${name}</div>\n <div class=\"text-tertiary text-s flex-shrink-0\">${code}</div>\n </div>\n\n ${this.renderTemplateOrSlot('title:after')}\n </div>\n `;\n }\n\n private __renderStatus() {\n let options: string;\n let key: string;\n\n if (this.data?.expires_after) {\n let value: string;\n\n try {\n const rtf = new Intl.RelativeTimeFormat(this.lang);\n let { count, units } = parseDuration(this.data.expires_after, true);\n\n if (count === 0.5 && units === 'month') {\n count = 2;\n units = 'week';\n }\n\n value = rtf.format(count, units as Intl.RelativeTimeFormatUnit);\n } catch {\n value = this.data.expires_after;\n }\n\n options = JSON.stringify({ value });\n key = 'expires_after_value';\n } else {\n options = '';\n key = 'never_expires';\n }\n\n return html`\n <div>\n ${this.renderTemplateOrSlot('status:before')}\n\n <foxy-i18n\n options=${options}\n class=\"block truncate text-s text-tertiary\"\n lang=${this.lang}\n key=${key}\n ns=${this.ns}\n >\n </foxy-i18n>\n\n ${this.renderTemplateOrSlot('status:after')}\n </div>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"GiftCardCard.js","sourceRoot":"","sources":["../../../../src/elements/public/GiftCardCard/GiftCardCard.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AACjE,OAAO,EAAE,cAAc,EAAE,4CAAyC;AAClE,OAAO,EAAE,cAAc,EAAE,qCAAkC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AACjE,OAAO,EAAE,QAAQ,EAAE,oCAAiC;AAEpD,MAAM,EAAE,GAAG,gBAAgB,CAAC;AAC5B,MAAM,IAAI,GAAG,cAAc,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAEtF;;;;;;;;;;GAUG;AACH,MAAM,OAAO,YAAa,SAAQ,IAAU;IAA5C;;QACE,cAAS,GAAc,EAAE,CAAC;IAyE5B,CAAC;IAvEC,MAAM;;QACJ,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAE3C,OAAO,IAAI,CAAA;;oBAEK,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;;;;qBAId,QAAQ,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1E,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE;YACjE,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE;;;;kBAI7D,QAAQ,CAAC;YACf,8DAA8D,EAAE,IAAI;YACpE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;SACzB,CAAC;;;;oBAIQ,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;;mBAE7E,IAAI,CAAC,IAAI;kBACV,IAAI,CAAC,EAAE,IAAI,YAAA,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,0CAAE,SAAS,mCAAI,EAAE;;;;;KAK3E,CAAC;IACJ,CAAC;IAEO,aAAa;;QACnB,MAAM,IAAI,eAAG,IAAI,CAAC,IAAI,0CAAE,IAAI,mCAAI,IAAI,CAAA,kBAAkB,CAAC;QACvD,MAAM,IAAI,eAAG,IAAI,CAAC,IAAI,0CAAE,aAAa,mCAAI,IAAI,CAAA,kBAAkB,CAAC;QAEhE,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;;;gDAGH,IAAI;sEACkB,IAAI;;;UAGhE,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC;;KAE7C,CAAC;IACJ,CAAC;IAEO,cAAc;;QACpB,MAAM,YAAY,SAAG,IAAI,CAAC,IAAI,0CAAE,aAAa,CAAC;QAE9C,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC;;;oBAGhC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;;iBAE1C,IAAI,CAAC,IAAI;gBACV,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,eAAe;eACvD,IAAI,CAAC,EAAE;;;;UAIZ,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;;KAE9C,CAAC;IACJ,CAAC;CACF","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 = 'gift-card-card';\nconst Base = ThemeableMixin(ConfigurableMixin(TranslatableMixin(NucleonElement, NS)));\n\n/**\n * Basic card displaying a gift card.\n *\n * @slot title:before\n * @slot title:after\n * @slot status:before\n * @slot status:after\n *\n * @element foxy-gift-card-card\n * @since 1.15.0\n */\nexport class GiftCardCard 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('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 name = this.data?.name ?? html`&ZeroWidthSpace;`;\n const code = this.data?.currency_code ?? html`&ZeroWidthSpace;`;\n\n return html`\n <div data-testid=\"title\">\n ${this.renderTemplateOrSlot('title:before')}\n\n <div class=\"flex items-center justify-between\">\n <div class=\"font-semibold truncate\">${name}</div>\n <div class=\"text-tertiary uppercase text-s flex-shrink-0\">${code}</div>\n </div>\n\n ${this.renderTemplateOrSlot('title:after')}\n </div>\n `;\n }\n\n private __renderStatus() {\n const expiresAfter = this.data?.expires_after;\n\n return html`\n <div data-testid=\"status\">\n ${this.renderTemplateOrSlot('status:before')}\n\n <foxy-i18n\n options=${JSON.stringify({ value: expiresAfter })}\n class=\"block truncate text-s text-tertiary\"\n lang=${this.lang}\n key=${expiresAfter ? 'expires_after_value' : 'never_expires'}\n ns=${this.ns}\n >\n </foxy-i18n>\n\n ${this.renderTemplateOrSlot('status:after')}\n </div>\n `;\n }\n}\n"]}
@@ -14,6 +14,9 @@ declare const Base: typeof NucleonElement & import("lit-element").Constructor<im
14
14
  * @slot codes:before
15
15
  * @slot codes:after
16
16
  *
17
+ * @slot current-balance:before
18
+ * @slot current-balance:after
19
+ *
17
20
  * @slot import:before
18
21
  * @slot import:after
19
22
  *
@@ -25,7 +28,10 @@ export declare class GiftCardCodesForm extends Base<Data> {
25
28
  static get v8n(): NucleonV8N<Data>;
26
29
  templates: Templates;
27
30
  render(): TemplateResult;
31
+ private __getErrorMessage;
32
+ private __getValidator;
28
33
  private __renderCodes;
34
+ private __renderCurrentBalance;
29
35
  private __renderImport;
30
36
  }
31
37
  export {};
@@ -15,6 +15,9 @@ const Base = ConfigurableMixin(ThemeableMixin(ScopedElementsMixin(TranslatableMi
15
15
  * @slot codes:before
16
16
  * @slot codes:after
17
17
  *
18
+ * @slot current-balance:before
19
+ * @slot current-balance:after
20
+ *
18
21
  * @slot import:before
19
22
  * @slot import:after
20
23
  *
@@ -28,6 +31,7 @@ export class GiftCardCodesForm extends Base {
28
31
  }
29
32
  static get scopedElements() {
30
33
  return {
34
+ 'vaadin-integer-field': customElements.get('vaadin-integer-field'),
31
35
  'vaadin-button': customElements.get('vaadin-button'),
32
36
  'iron-icon': customElements.get('iron-icon'),
33
37
  'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),
@@ -38,7 +42,10 @@ export class GiftCardCodesForm extends Base {
38
42
  };
39
43
  }
40
44
  static get v8n() {
41
- return [({ gift_card_codes: v }) => (v && v.length > 0) || 'gift_card_codes_required'];
45
+ return [
46
+ ({ gift_card_codes: v }) => (v && v.length > 0) || 'gift_card_codes_required',
47
+ ({ current_balance: v }) => !v || v >= 0 || 'current_balance_negative',
48
+ ];
42
49
  }
43
50
  render() {
44
51
  var _a, _b;
@@ -59,6 +66,7 @@ export class GiftCardCodesForm extends Base {
59
66
  })}
60
67
  >
61
68
  ${hiddenSelector.matches('codes', true) ? '' : this.__renderCodes()}
69
+ ${hiddenSelector.matches('current-balance', true) ? '' : this.__renderCurrentBalance()}
62
70
  ${hiddenSelector.matches('import', true) ? '' : this.__renderImport()}
63
71
  </div>
64
72
 
@@ -96,6 +104,13 @@ export class GiftCardCodesForm extends Base {
96
104
  </div>
97
105
  `;
98
106
  }
107
+ __getErrorMessage(prefix) {
108
+ const error = this.errors.find(err => err.startsWith(prefix));
109
+ return error ? this.t(error.replace(prefix, 'v8n')) : '';
110
+ }
111
+ __getValidator(prefix) {
112
+ return () => !this.errors.some(err => err.startsWith(prefix));
113
+ }
99
114
  __renderCodes() {
100
115
  var _a;
101
116
  const maxVisible = 16;
@@ -190,6 +205,35 @@ export class GiftCardCodesForm extends Base {
190
205
  </div>
191
206
  `;
192
207
  }
208
+ __renderCurrentBalance() {
209
+ var _a;
210
+ const isTemplate = this.in({ idle: 'template' });
211
+ return html `
212
+ <div>
213
+ ${this.renderTemplateOrSlot('current-balance:before')}
214
+
215
+ <vaadin-integer-field
216
+ error-message=${this.__getErrorMessage('current_balance')}
217
+ label=${this.t('balance')}
218
+ class="w-full"
219
+ min="0"
220
+ ?disabled=${!isTemplate || this.disabledSelector.matches('current-balance', true)}
221
+ ?readonly=${this.readonlySelector.matches('current-balance', true)}
222
+ prevent-invalid-input
223
+ has-controls
224
+ .checkValidity=${this.__getValidator('current_balance')}
225
+ .value=${isTemplate ? (_a = this.form.current_balance) !== null && _a !== void 0 ? _a : 0 : ''}
226
+ @change=${(evt) => {
227
+ const field = evt.currentTarget;
228
+ this.edit({ current_balance: parseInt(field.value) });
229
+ }}
230
+ >
231
+ </vaadin-integer-field>
232
+
233
+ ${this.renderTemplateOrSlot('current-balance:after')}
234
+ </div>
235
+ `;
236
+ }
193
237
  __renderImport() {
194
238
  const isTemplateValid = this.in({ idle: { template: { dirty: 'valid' } } });
195
239
  const isSnapshotValid = this.in({ idle: { snapshot: { dirty: 'valid' } } });
@@ -1 +1 @@
1
- {"version":3,"file":"GiftCardCodesForm.js","sourceRoot":"","sources":["../../../../src/elements/public/GiftCardCodesForm/GiftCardCodesForm.ts"],"names":[],"mappings":"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","sourcesContent":["import { Data, Templates } from './types';\nimport { ScopedElementsMap, ScopedElementsMixin } from '@open-wc/scoped-elements';\nimport { TemplateResult, html } from 'lit-html';\n\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { EditableList } from '../../private/EditableList/EditableList';\nimport { Group } from '../../private/Group/Group';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { NucleonV8N } from '../NucleonElement/types';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { classMap } from '../../../utils/class-map';\n\nconst NS = 'gift-card-codes-form';\nconst Base = ConfigurableMixin(\n ThemeableMixin(ScopedElementsMixin(TranslatableMixin(NucleonElement, NS)))\n);\n\n/**\n * Form element for importing gift card codes (`fx:gift_card_codes`).\n *\n * @slot codes:before\n * @slot codes:after\n *\n * @slot import:before\n * @slot import:after\n *\n * @element foxy-gift-card-codes-form\n * @since 1.15.0\n */\nexport class GiftCardCodesForm extends Base<Data> {\n static get scopedElements(): ScopedElementsMap {\n return {\n 'vaadin-button': customElements.get('vaadin-button'),\n 'iron-icon': customElements.get('iron-icon'),\n\n 'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),\n 'foxy-spinner': customElements.get('foxy-spinner'),\n 'foxy-i18n': customElements.get('foxy-i18n'),\n\n 'x-editable-list': EditableList,\n 'x-group': Group,\n };\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [({ gift_card_codes: v }) => (v && v.length > 0) || 'gift_card_codes_required'];\n }\n\n templates: Templates = {};\n\n render(): TemplateResult {\n const { hiddenSelector, lang, ns } = this;\n\n const isBusy = this.in('busy');\n const isFail = this.in('fail');\n const isSnapshot = this.in({ idle: 'snapshot' });\n const isTemplate = this.in({ idle: 'template' });\n\n const transition = 'transition-opacity duration-500';\n const hidden = 'opacity-0 pointer-events-none';\n\n return html`\n <div class=\"relative\">\n <div\n class=${classMap({\n 'relative space-y-m': true,\n [transition]: true,\n [hidden]: isSnapshot,\n })}\n >\n ${hiddenSelector.matches('codes', true) ? '' : this.__renderCodes()}\n ${hiddenSelector.matches('import', true) ? '' : this.__renderImport()}\n </div>\n\n <div\n class=${classMap({\n 'absolute inset-0 flex flex-col items-center justify-center': true,\n 'text-center text-m text-secondary leading-m': true,\n [transition]: true,\n [hidden]: !isSnapshot,\n })}\n >\n <div class=\"mx-auto flex mb-m w-l h-l rounded-t-l rounded-b-l bg-success\">\n <iron-icon icon=\"icons:done-all\" class=\"m-auto text-success-contrast\"></iron-icon>\n </div>\n\n <foxy-i18n class=\"block\" lang=${lang} key=\"import_codes_done\" ns=${ns}></foxy-i18n>\n </div>\n\n <div\n class=${classMap({\n 'absolute inset-0 flex': true,\n [transition]: true,\n [hidden]: !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' : isTemplate ? 'empty' : 'busy'}\n lang=${lang}\n ns=\"${ns} ${customElements.get('foxy-spinner')?.defaultNS ?? ''}\"\n >\n </foxy-spinner>\n </div>\n </div>\n `;\n }\n\n private __renderCodes() {\n const maxVisible = 16;\n const codes = this.form.gift_card_codes ?? [];\n\n const visibleCodes = codes.length > maxVisible ? codes.slice(-maxVisible) : codes;\n const hiddenCodes = codes.length > maxVisible ? codes.slice(0, -maxVisible) : [];\n\n const items = visibleCodes.map(code => {\n let href: string;\n\n try {\n const url = new URL(this.parent);\n url.searchParams.set('code', code);\n href = url.toString();\n } catch {\n href = this.parent;\n }\n\n return {\n value: code,\n label: html`\n <foxy-internal-gift-card-codes-form-list-item\n group=${this.group}\n href=${href}\n lang=${this.lang}\n ns=${this.ns}\n >\n </foxy-internal-gift-card-codes-form-list-item>\n `,\n };\n });\n\n return html`\n <div>\n ${this.renderTemplateOrSlot('codes:before')}\n\n <x-group class=\"mb-xs\" frame>\n <foxy-i18n slot=\"header\" lang=${this.lang} key=\"code_plural\" ns=${this.ns}></foxy-i18n>\n\n <x-editable-list\n lang=${this.lang}\n ns=${this.ns}\n ?disabled=${!this.in('idle') || this.disabledSelector.matches('codes', true)}\n ?readonly=${this.readonlySelector.matches('codes', true)}\n .items=${items}\n @change=${(evt: CustomEvent) => {\n const list = evt.currentTarget as EditableList;\n const newCodes = new Set([...hiddenCodes, ...list.items.map(item => item.value)]);\n this.edit({ gift_card_codes: [...newCodes] });\n }}\n @paste=${(evt: ClipboardEvent) => {\n evt.preventDefault();\n\n const text = evt.clipboardData?.getData('text') ?? '';\n const pastedCodes = text\n .split(' ')\n .map(code => code.trim())\n .filter(code => code.length > 0);\n\n this.edit({ gift_card_codes: Array.from(new Set([...codes, ...pastedCodes])) });\n }}\n >\n <div\n class=\"ml-m py-s border-b border-contrast-10 font-lumo\"\n ?hidden=${hiddenCodes.length === 0}\n >\n <foxy-i18n\n options=${JSON.stringify({ count: hiddenCodes.length })}\n class=\"block text-body text-m mb-xs\"\n lang=${this.lang}\n key=\"hidden_codes_header\"\n ns=${this.ns}\n >\n </foxy-i18n>\n\n <foxy-i18n\n class=\"block text-xs text-tertiary\"\n lang=${this.lang}\n key=\"hidden_codes_explainer\"\n ns=${this.ns}\n >\n </foxy-i18n>\n </div>\n </x-editable-list>\n </x-group>\n\n <foxy-i18n\n class=\"block text-xs text-tertiary leading-s\"\n lang=${this.lang}\n key=\"code_import_hint\"\n ns=${this.ns}\n >\n </foxy-i18n>\n\n ${this.renderTemplateOrSlot('codes:after')}\n </div>\n `;\n }\n\n private __renderImport() {\n const isTemplateValid = this.in({ idle: { template: { dirty: 'valid' } } });\n const isSnapshotValid = this.in({ idle: { snapshot: { dirty: 'valid' } } });\n const isValid = isTemplateValid || isSnapshotValid;\n\n return html`\n <div>\n ${this.renderTemplateOrSlot('import:before')}\n\n <vaadin-button\n class=\"w-full mb-xs\"\n theme=\"primary success\"\n ?disabled=${!isValid || !this.in('idle') || this.disabledSelector.matches('import', true)}\n @click=${this.submit}\n >\n <foxy-i18n ns=${this.ns} key=\"import\" lang=${this.lang}></foxy-i18n>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('import:after')}\n </div>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"GiftCardCodesForm.js","sourceRoot":"","sources":["../../../../src/elements/public/GiftCardCodesForm/GiftCardCodesForm.ts"],"names":[],"mappings":"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","sourcesContent":["import { Data, Templates } from './types';\nimport { ScopedElementsMap, ScopedElementsMixin } from '@open-wc/scoped-elements';\nimport { TemplateResult, html } from 'lit-html';\n\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { EditableList } from '../../private/EditableList/EditableList';\nimport { Group } from '../../private/Group/Group';\nimport { IntegerFieldElement } from '@vaadin/vaadin-text-field/vaadin-integer-field';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { NucleonV8N } from '../NucleonElement/types';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { classMap } from '../../../utils/class-map';\n\nconst NS = 'gift-card-codes-form';\nconst Base = ConfigurableMixin(\n ThemeableMixin(ScopedElementsMixin(TranslatableMixin(NucleonElement, NS)))\n);\n\n/**\n * Form element for importing gift card codes (`fx:gift_card_codes`).\n *\n * @slot codes:before\n * @slot codes:after\n *\n * @slot current-balance:before\n * @slot current-balance:after\n *\n * @slot import:before\n * @slot import:after\n *\n * @element foxy-gift-card-codes-form\n * @since 1.15.0\n */\nexport class GiftCardCodesForm extends Base<Data> {\n static get scopedElements(): ScopedElementsMap {\n return {\n 'vaadin-integer-field': customElements.get('vaadin-integer-field'),\n 'vaadin-button': customElements.get('vaadin-button'),\n 'iron-icon': customElements.get('iron-icon'),\n\n 'foxy-internal-sandbox': customElements.get('foxy-internal-sandbox'),\n 'foxy-spinner': customElements.get('foxy-spinner'),\n 'foxy-i18n': customElements.get('foxy-i18n'),\n\n 'x-editable-list': EditableList,\n 'x-group': Group,\n };\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [\n ({ gift_card_codes: v }) => (v && v.length > 0) || 'gift_card_codes_required',\n ({ current_balance: v }) => !v || v >= 0 || 'current_balance_negative',\n ];\n }\n\n templates: Templates = {};\n\n render(): TemplateResult {\n const { hiddenSelector, lang, ns } = this;\n\n const isBusy = this.in('busy');\n const isFail = this.in('fail');\n const isSnapshot = this.in({ idle: 'snapshot' });\n const isTemplate = this.in({ idle: 'template' });\n\n const transition = 'transition-opacity duration-500';\n const hidden = 'opacity-0 pointer-events-none';\n\n return html`\n <div class=\"relative\">\n <div\n class=${classMap({\n 'relative space-y-m': true,\n [transition]: true,\n [hidden]: isSnapshot,\n })}\n >\n ${hiddenSelector.matches('codes', true) ? '' : this.__renderCodes()}\n ${hiddenSelector.matches('current-balance', true) ? '' : this.__renderCurrentBalance()}\n ${hiddenSelector.matches('import', true) ? '' : this.__renderImport()}\n </div>\n\n <div\n class=${classMap({\n 'absolute inset-0 flex flex-col items-center justify-center': true,\n 'text-center text-m text-secondary leading-m': true,\n [transition]: true,\n [hidden]: !isSnapshot,\n })}\n >\n <div class=\"mx-auto flex mb-m w-l h-l rounded-t-l rounded-b-l bg-success\">\n <iron-icon icon=\"icons:done-all\" class=\"m-auto text-success-contrast\"></iron-icon>\n </div>\n\n <foxy-i18n class=\"block\" lang=${lang} key=\"import_codes_done\" ns=${ns}></foxy-i18n>\n </div>\n\n <div\n class=${classMap({\n 'absolute inset-0 flex': true,\n [transition]: true,\n [hidden]: !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' : isTemplate ? 'empty' : 'busy'}\n lang=${lang}\n ns=\"${ns} ${customElements.get('foxy-spinner')?.defaultNS ?? ''}\"\n >\n </foxy-spinner>\n </div>\n </div>\n `;\n }\n\n private __getErrorMessage(prefix: string) {\n const error = this.errors.find(err => err.startsWith(prefix));\n return error ? this.t(error.replace(prefix, 'v8n')) : '';\n }\n\n private __getValidator(prefix: string) {\n return () => !this.errors.some(err => err.startsWith(prefix));\n }\n\n private __renderCodes() {\n const maxVisible = 16;\n const codes = this.form.gift_card_codes ?? [];\n\n const visibleCodes = codes.length > maxVisible ? codes.slice(-maxVisible) : codes;\n const hiddenCodes = codes.length > maxVisible ? codes.slice(0, -maxVisible) : [];\n\n const items = visibleCodes.map(code => {\n let href: string;\n\n try {\n const url = new URL(this.parent);\n url.searchParams.set('code', code);\n href = url.toString();\n } catch {\n href = this.parent;\n }\n\n return {\n value: code,\n label: html`\n <foxy-internal-gift-card-codes-form-list-item\n group=${this.group}\n href=${href}\n lang=${this.lang}\n ns=${this.ns}\n >\n </foxy-internal-gift-card-codes-form-list-item>\n `,\n };\n });\n\n return html`\n <div>\n ${this.renderTemplateOrSlot('codes:before')}\n\n <x-group class=\"mb-xs\" frame>\n <foxy-i18n slot=\"header\" lang=${this.lang} key=\"code_plural\" ns=${this.ns}></foxy-i18n>\n\n <x-editable-list\n lang=${this.lang}\n ns=${this.ns}\n ?disabled=${!this.in('idle') || this.disabledSelector.matches('codes', true)}\n ?readonly=${this.readonlySelector.matches('codes', true)}\n .items=${items}\n @change=${(evt: CustomEvent) => {\n const list = evt.currentTarget as EditableList;\n const newCodes = new Set([...hiddenCodes, ...list.items.map(item => item.value)]);\n this.edit({ gift_card_codes: [...newCodes] });\n }}\n @paste=${(evt: ClipboardEvent) => {\n evt.preventDefault();\n\n const text = evt.clipboardData?.getData('text') ?? '';\n const pastedCodes = text\n .split(' ')\n .map(code => code.trim())\n .filter(code => code.length > 0);\n\n this.edit({ gift_card_codes: Array.from(new Set([...codes, ...pastedCodes])) });\n }}\n >\n <div\n class=\"ml-m py-s border-b border-contrast-10 font-lumo\"\n ?hidden=${hiddenCodes.length === 0}\n >\n <foxy-i18n\n options=${JSON.stringify({ count: hiddenCodes.length })}\n class=\"block text-body text-m mb-xs\"\n lang=${this.lang}\n key=\"hidden_codes_header\"\n ns=${this.ns}\n >\n </foxy-i18n>\n\n <foxy-i18n\n class=\"block text-xs text-tertiary\"\n lang=${this.lang}\n key=\"hidden_codes_explainer\"\n ns=${this.ns}\n >\n </foxy-i18n>\n </div>\n </x-editable-list>\n </x-group>\n\n <foxy-i18n\n class=\"block text-xs text-tertiary leading-s\"\n lang=${this.lang}\n key=\"code_import_hint\"\n ns=${this.ns}\n >\n </foxy-i18n>\n\n ${this.renderTemplateOrSlot('codes:after')}\n </div>\n `;\n }\n\n private __renderCurrentBalance() {\n const isTemplate = this.in({ idle: 'template' });\n\n return html`\n <div>\n ${this.renderTemplateOrSlot('current-balance:before')}\n\n <vaadin-integer-field\n error-message=${this.__getErrorMessage('current_balance')}\n label=${this.t('balance')}\n class=\"w-full\"\n min=\"0\"\n ?disabled=${!isTemplate || this.disabledSelector.matches('current-balance', true)}\n ?readonly=${this.readonlySelector.matches('current-balance', true)}\n prevent-invalid-input\n has-controls\n .checkValidity=${this.__getValidator('current_balance')}\n .value=${isTemplate ? this.form.current_balance ?? 0 : ''}\n @change=${(evt: CustomEvent) => {\n const field = evt.currentTarget as IntegerFieldElement;\n this.edit({ current_balance: parseInt(field.value) });\n }}\n >\n </vaadin-integer-field>\n\n ${this.renderTemplateOrSlot('current-balance:after')}\n </div>\n `;\n }\n\n private __renderImport() {\n const isTemplateValid = this.in({ idle: { template: { dirty: 'valid' } } });\n const isSnapshotValid = this.in({ idle: { snapshot: { dirty: 'valid' } } });\n const isValid = isTemplateValid || isSnapshotValid;\n\n return html`\n <div>\n ${this.renderTemplateOrSlot('import:before')}\n\n <vaadin-button\n class=\"w-full mb-xs\"\n theme=\"primary success\"\n ?disabled=${!isValid || !this.in('idle') || this.disabledSelector.matches('import', true)}\n @click=${this.submit}\n >\n <foxy-i18n ns=${this.ns} key=\"import\" lang=${this.lang}></foxy-i18n>\n </vaadin-button>\n\n ${this.renderTemplateOrSlot('import:after')}\n </div>\n `;\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import '@vaadin/vaadin-text-field/vaadin-integer-field';
1
2
  import '@vaadin/vaadin-button';
2
3
  import '@polymer/iron-icons';
3
4
  import '@polymer/iron-icon';
@@ -1,3 +1,4 @@
1
+ import '@vaadin/vaadin-text-field/vaadin-integer-field';
1
2
  import '@vaadin/vaadin-button';
2
3
  import '@polymer/iron-icons';
3
4
  import '@polymer/iron-icon';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/GiftCardCodesForm/index.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,CAAC;AAC/B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,oBAAoB,CAAC;AAC5B,iDAA8C;AAC9C,6BAA0B;AAC1B,0BAAuB;AAEvB,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,iCAAiC,EAAE,wDAAqD;AAEjG,cAAc,CAAC,MAAM,CAAC,2BAA2B,EAAE,iBAAiB,CAAC,CAAC;AACtE,cAAc,CAAC,MAAM,CACnB,8CAA8C,EAC9C,iCAAiC,CAClC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import '@vaadin/vaadin-button';\nimport '@polymer/iron-icons';\nimport '@polymer/iron-icon';\nimport '../../internal/InternalSandbox/index';\nimport '../Spinner/index';\nimport '../I18n/index';\n\nimport { GiftCardCodesForm } from './GiftCardCodesForm';\nimport { InternalGiftCardCodesFormListItem } from './internal/InternalGiftCardCodesFormListItem';\n\ncustomElements.define('foxy-gift-card-codes-form', GiftCardCodesForm);\ncustomElements.define(\n 'foxy-internal-gift-card-codes-form-list-item',\n InternalGiftCardCodesFormListItem\n);\n\nexport { GiftCardCodesForm };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/GiftCardCodesForm/index.ts"],"names":[],"mappings":"AAAA,OAAO,gDAAgD,CAAC;AACxD,OAAO,uBAAuB,CAAC;AAC/B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,oBAAoB,CAAC;AAC5B,iDAA8C;AAC9C,6BAA0B;AAC1B,0BAAuB;AAEvB,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,iCAAiC,EAAE,wDAAqD;AAEjG,cAAc,CAAC,MAAM,CAAC,2BAA2B,EAAE,iBAAiB,CAAC,CAAC;AACtE,cAAc,CAAC,MAAM,CACnB,8CAA8C,EAC9C,iCAAiC,CAClC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import '@vaadin/vaadin-text-field/vaadin-integer-field';\nimport '@vaadin/vaadin-button';\nimport '@polymer/iron-icons';\nimport '@polymer/iron-icon';\nimport '../../internal/InternalSandbox/index';\nimport '../Spinner/index';\nimport '../I18n/index';\n\nimport { GiftCardCodesForm } from './GiftCardCodesForm';\nimport { InternalGiftCardCodesFormListItem } from './internal/InternalGiftCardCodesFormListItem';\n\ncustomElements.define('foxy-gift-card-codes-form', GiftCardCodesForm);\ncustomElements.define(\n 'foxy-internal-gift-card-codes-form-list-item',\n InternalGiftCardCodesFormListItem\n);\n\nexport { GiftCardCodesForm };\n"]}
@@ -1,12 +1,13 @@
1
1
  import { GiftCardCodesForm } from './GiftCardCodesForm';
2
+ import { Rels } from '@foxy.io/sdk/backend';
2
3
  import { Renderer } from '../../../mixins/configurable';
3
- export declare type Data = {
4
+ import { Resource } from '@foxy.io/sdk/core';
5
+ export declare type Data = Resource<Rels.GiftCardCodesImport> & {
4
6
  _links: {
5
7
  self: {
6
8
  href: string;
7
9
  };
8
10
  };
9
- gift_card_codes: string[];
10
11
  };
11
12
  export declare type Templates = {
12
13
  'codes:before'?: Renderer<GiftCardCodesForm>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/elements/public/GiftCardCodesForm/types.ts"],"names":[],"mappings":"","sourcesContent":["import { GiftCardCodesForm } from './GiftCardCodesForm';\nimport { Renderer } from '../../../mixins/configurable';\n\nexport type Data = {\n _links: { self: { href: string } };\n gift_card_codes: string[];\n};\n\nexport type Templates = {\n 'codes:before'?: Renderer<GiftCardCodesForm>;\n 'codes:after'?: Renderer<GiftCardCodesForm>;\n 'import:before'?: Renderer<GiftCardCodesForm>;\n 'import:after'?: Renderer<GiftCardCodesForm>;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/elements/public/GiftCardCodesForm/types.ts"],"names":[],"mappings":"","sourcesContent":["import { GiftCardCodesForm } from './GiftCardCodesForm';\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.GiftCardCodesImport> & { _links: { self: { href: string } } };\n\nexport type Templates = {\n 'codes:before'?: Renderer<GiftCardCodesForm>;\n 'codes:after'?: Renderer<GiftCardCodesForm>;\n 'import:before'?: Renderer<GiftCardCodesForm>;\n 'import:after'?: Renderer<GiftCardCodesForm>;\n};\n"]}
@@ -1,8 +1,8 @@
1
- import { ScopedElementsMap } from '@open-wc/scoped-elements';
1
+ import { Data } from './types';
2
2
  import { PropertyDeclarations, TemplateResult } from 'lit-element';
3
+ import { ScopedElementsMap } from '@open-wc/scoped-elements';
3
4
  import { NucleonElement } from '../NucleonElement/NucleonElement';
4
5
  import { NucleonV8N } from '../NucleonElement/types';
5
- import { Data } from './types';
6
6
  declare const Base: typeof NucleonElement & import("lit-element").Constructor<import("../../../mixins/translatable").TranslatableMixinHost> & {
7
7
  defaultNS: string;
8
8
  } & import("lit-element").Constructor<import("../../../mixins/configurable").ConfigurableMixinHost> & {
@@ -48,6 +48,7 @@ export declare class GiftCardForm extends Base<Data> {
48
48
  private __codesTableColumns;
49
49
  private static readonly __codesQueryOptions;
50
50
  private __codesTableQuery;
51
+ private __currencyDisplay;
51
52
  private __itemCategories;
52
53
  render(): TemplateResult;
53
54
  protected _sendGet(): Promise<Data>;
@@ -1,19 +1,19 @@
1
- import { ScopedElementsMixin } from '@open-wc/scoped-elements';
1
+ import { Type } from "../QueryBuilder/types.js";
2
2
  import { html } from 'lit-element';
3
- import { ifDefined } from 'lit-html/directives/if-defined';
3
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
4
+ import { CategoryRestrictionsPage } from "./private/CategoryRestrictionsPage.js";
4
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";
5
11
  import { ResponsiveMixin } from "../../../mixins/responsive.js";
6
12
  import { ThemeableMixin } from "../../../mixins/themeable.js";
7
13
  import { TranslatableMixin } from "../../../mixins/translatable.js";
8
14
  import { classMap } from "../../../utils/class-map.js";
9
- import { FrequencyInput } from "../../private/FrequencyInput/FrequencyInput.js";
10
- import { EditableList } from "../../private/EditableList/EditableList.js";
11
- import { Group } from "../../private/Group/Group.js";
12
- import { PropertyTable } from "../../private/PropertyTable/PropertyTable.js";
13
- import { NucleonElement } from "../NucleonElement/NucleonElement.js";
14
- import { Type } from "../QueryBuilder/types.js";
15
15
  import { currencies } from "./currencies.js";
16
- import { CategoryRestrictionsPage } from "./private/CategoryRestrictionsPage.js";
16
+ import { ifDefined } from 'lit-html/directives/if-defined';
17
17
  const NS = 'gift-card-form';
18
18
  const Base = ScopedElementsMixin(ThemeableMixin(ConfigurableMixin(ResponsiveMixin(TranslatableMixin(NucleonElement, NS)))));
19
19
  /**
@@ -85,10 +85,10 @@ export class GiftCardForm extends Base {
85
85
  },
86
86
  {
87
87
  hideBelow: 'sm',
88
- header: c => html `<foxy-i18n lang=${c.lang} key="date_modified" ns=${c.ns}></foxy-i18n>`,
88
+ header: c => html `<foxy-i18n lang=${c.lang} key="end_date" ns=${c.ns}></foxy-i18n>`,
89
89
  cell: ctx => html `
90
90
  <foxy-i18n
91
- options=${JSON.stringify({ value: ctx.data.date_modified })}
91
+ options=${JSON.stringify({ value: ctx.data.end_date })}
92
92
  class="text-tertiary"
93
93
  lang=${ctx.lang}
94
94
  key="date"
@@ -98,11 +98,26 @@ export class GiftCardForm extends Base {
98
98
  `,
99
99
  },
100
100
  {
101
- header: c => html `<foxy-i18n lang=${c.lang} key="used_codes" ns=${c.ns}></foxy-i18n>`,
102
- cell: ctx => html `${ctx.data.current_balance}`,
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
+ },
103
117
  },
104
118
  ];
105
119
  this.__codesTableQuery = null;
120
+ this.__currencyDisplay = '';
106
121
  this.__itemCategories = '';
107
122
  }
108
123
  static get scopedElements() {
@@ -189,6 +204,7 @@ export class GiftCardForm extends Base {
189
204
  const store = await super._fetch(giftCard._links['fx:store'].href);
190
205
  const categoriesURL = new URL(store._links['fx:item_categories'].href);
191
206
  categoriesURL.searchParams.set('limit', '5');
207
+ this.__currencyDisplay = store.use_international_currency_symbol ? 'code' : 'symbol';
192
208
  this.__itemCategories = categoriesURL.toString();
193
209
  return giftCard;
194
210
  }