@foxy.io/elements 1.39.0 → 1.40.0-beta.2

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 (96) hide show
  1. package/dist/cdn/foxy-address-form.js +1 -1
  2. package/dist/cdn/foxy-admin-subscription-form.js +1 -1
  3. package/dist/cdn/foxy-applied-coupon-code-form.js +1 -1
  4. package/dist/cdn/foxy-cart-form.js +2 -2
  5. package/dist/cdn/foxy-client-form.js +1 -1
  6. package/dist/cdn/foxy-coupon-code-form.js +1 -1
  7. package/dist/cdn/foxy-coupon-form.js +1 -1
  8. package/dist/cdn/foxy-customer-api.js +1 -1
  9. package/dist/cdn/foxy-customer-form.js +1 -1
  10. package/dist/cdn/foxy-customer-portal-settings-form.js +1 -1
  11. package/dist/cdn/foxy-customer-portal.js +14 -14
  12. package/dist/cdn/foxy-customer.js +1 -1
  13. package/dist/cdn/foxy-downloadable-form.js +1 -1
  14. package/dist/cdn/foxy-email-template-form.js +1 -1
  15. package/dist/cdn/foxy-experimental-add-to-cart-builder.js +1 -1
  16. package/dist/cdn/foxy-filter-attribute-form.js +1 -1
  17. package/dist/cdn/foxy-generate-codes-form.js +1 -1
  18. package/dist/cdn/foxy-gift-card-code-form.js +1 -1
  19. package/dist/cdn/foxy-gift-card-codes-form.js +1 -1
  20. package/dist/cdn/foxy-gift-card-form.js +1 -1
  21. package/dist/cdn/foxy-integration-form.js +1 -1
  22. package/dist/cdn/foxy-item-category-form.js +1 -1
  23. package/dist/cdn/foxy-item-form.js +1 -1
  24. package/dist/cdn/foxy-item-option-form.js +1 -1
  25. package/dist/cdn/foxy-native-integration-form.js +1 -1
  26. package/dist/cdn/foxy-passkey-form.js +1 -1
  27. package/dist/cdn/foxy-payment-method-card.js +1 -1
  28. package/dist/cdn/foxy-payments-api-fraud-protection-form.js +1 -1
  29. package/dist/cdn/foxy-payments-api-payment-method-form.js +1 -1
  30. package/dist/cdn/foxy-payments-api-payment-preset-form.js +1 -1
  31. package/dist/cdn/foxy-store-form.js +1 -1
  32. package/dist/cdn/foxy-store-shipping-method-form.js +1 -1
  33. package/dist/cdn/foxy-subscription-form.js +1 -1
  34. package/dist/cdn/foxy-subscription-settings-form.js +1 -1
  35. package/dist/cdn/foxy-tax-form.js +1 -1
  36. package/dist/cdn/foxy-template-config-form.js +1 -1
  37. package/dist/cdn/foxy-template-form.js +1 -1
  38. package/dist/cdn/foxy-template-set-form.js +1 -1
  39. package/dist/cdn/foxy-transaction.js +1 -1
  40. package/dist/cdn/foxy-update-payment-method-form.js +1 -1
  41. package/dist/cdn/foxy-user-form.js +1 -1
  42. package/dist/cdn/foxy-user-invitation-form.js +1 -1
  43. package/dist/cdn/foxy-users-table.js +1 -1
  44. package/dist/cdn/foxy-webhook-form.js +1 -1
  45. package/dist/cdn/shared-00e02b35.js +1 -0
  46. package/dist/cdn/{shared-2508187b.js → shared-0c2879b9.js} +1 -1
  47. package/dist/cdn/shared-4a32f76a.js +1 -0
  48. package/dist/cdn/shared-5cd33249.js +1 -0
  49. package/dist/cdn/shared-aca2705d.js +1 -0
  50. package/dist/cdn/shared-d0363ae9.js +1 -0
  51. package/dist/cdn/shared-e0da7113.js +1 -0
  52. package/dist/cdn/{shared-2ab1e9eb.js → shared-e21ddeae.js} +1 -1
  53. package/dist/cdn/translations/country/zh-CN.json +248 -0
  54. package/dist/cdn/translations/country/zh-HK.json +245 -0
  55. package/dist/cdn/translations/customer-portal/de.json +1 -0
  56. package/dist/cdn/translations/customer-portal/en.json +1 -0
  57. package/dist/cdn/translations/customer-portal/es.json +1 -0
  58. package/dist/cdn/translations/customer-portal/fr.json +1 -0
  59. package/dist/cdn/translations/customer-portal/nl.json +1 -0
  60. package/dist/cdn/translations/customer-portal/pl.json +1 -0
  61. package/dist/cdn/translations/customer-portal/sv.json +1 -0
  62. package/dist/cdn/translations/customer-portal/zh-HK.json +1182 -0
  63. package/dist/cdn/translations/customer-portal/zh-hk.json +1 -0
  64. package/dist/cdn/translations/tax-form/en.json +8 -3
  65. package/dist/elements/internal/InternalFrequencyControl/InternalFrequencyControl.js +10 -9
  66. package/dist/elements/internal/InternalFrequencyControl/InternalFrequencyControl.js.map +1 -1
  67. package/dist/elements/internal/InternalNumberControl/InternalNumberControl.js +15 -23
  68. package/dist/elements/internal/InternalNumberControl/InternalNumberControl.js.map +1 -1
  69. package/dist/elements/internal/InternalResourcePickerControl/InternalResourcePickerControl.js +10 -9
  70. package/dist/elements/internal/InternalResourcePickerControl/InternalResourcePickerControl.js.map +1 -1
  71. package/dist/elements/internal/InternalSelectControl/InternalSelectControl.js +44 -40
  72. package/dist/elements/internal/InternalSelectControl/InternalSelectControl.js.map +1 -1
  73. package/dist/elements/internal/InternalSwitchControl/InternalSwitchControl.js +8 -2
  74. package/dist/elements/internal/InternalSwitchControl/InternalSwitchControl.js.map +1 -1
  75. package/dist/elements/internal/InternalTextControl/InternalTextControl.js +14 -13
  76. package/dist/elements/internal/InternalTextControl/InternalTextControl.js.map +1 -1
  77. package/dist/elements/public/CustomerApi/CustomerApi.d.ts +9 -3
  78. package/dist/elements/public/CustomerApi/CustomerApi.js +3 -1
  79. package/dist/elements/public/CustomerApi/CustomerApi.js.map +1 -1
  80. package/dist/elements/public/CustomerPortal/CustomerPortal.d.ts +36 -0
  81. package/dist/elements/public/CustomerPortal/CustomerPortal.js +23 -9
  82. package/dist/elements/public/CustomerPortal/CustomerPortal.js.map +1 -1
  83. package/dist/elements/public/CustomerPortal/InternalCustomerPortalPasswordResetView.js +9 -0
  84. package/dist/elements/public/CustomerPortal/InternalCustomerPortalPasswordResetView.js.map +1 -1
  85. package/dist/elements/public/TaxForm/TaxForm.d.ts +0 -4
  86. package/dist/elements/public/TaxForm/TaxForm.js +16 -30
  87. package/dist/elements/public/TaxForm/TaxForm.js.map +1 -1
  88. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js +1 -1
  89. package/dist/elements/public/TemplateConfigForm/TemplateConfigForm.js.map +1 -1
  90. package/package.json +1 -1
  91. package/dist/cdn/shared-1d0839af.js +0 -1
  92. package/dist/cdn/shared-27cfa174.js +0 -1
  93. package/dist/cdn/shared-2c81b7df.js +0 -1
  94. package/dist/cdn/shared-afe24913.js +0 -1
  95. package/dist/cdn/shared-c05643e6.js +0 -1
  96. package/dist/cdn/shared-eea8debb.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"InternalSwitchControl.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalSwitchControl/InternalSwitchControl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,8DAA2D;AAC7F,OAAO,EAAE,IAAI,EAAwB,GAAG,EAAkB,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,oCAAiC;AAEpD,MAAM,OAAO,qBAAsB,SAAQ,uBAAuB;IAAlE;;QAWE,uBAAkB,GAAG,KAAK,CAAC;QAE3B,eAAU,GAAkB,IAAI,CAAC;QAEjC,cAAS,GAAkB,IAAI,CAAC;QAEhC,WAAM,GAAG,KAAK,CAAC;IA8FjB,CAAC;IA9GC,MAAM,KAAK,UAAU;QACnB,OAAO;YACL,GAAG,KAAK,CAAC,UAAU;YACnB,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE;YAC1E,UAAU,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE;YACxC,SAAS,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;YACtC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;SAC1B,CAAC;IACJ,CAAC;IAUD,aAAa;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3D,OAAO,IAAI,CAAA;;;wDAGyC,IAAI,CAAC,KAAK;YACtD,IAAI,CAAC,kBAAkB;YACvB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,CAAA,qCAAqC,IAAI,CAAC,UAAU,MAAM;kDAC1B,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;cAClE,IAAI,CAAC,aAAa;;;;UAItB,IAAI,CAAC,QAAQ;YACb,CAAC,CAAC,IAAI,CAAA,6BAA6B,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM;YAC1F,CAAC,CAAC,IAAI,CAAA;;;;0BAIU,QAAQ,CAAC;gBACf,iDAAiD,EAAE,IAAI;gBACvD,iCAAiC,EAAE,IAAI;gBACvC,YAAY,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO;gBACvC,qCAAqC,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;gBACjE,gBAAgB,EAAE,IAAI,CAAC,QAAQ;gBAC/B,kDAAkD,EAAE,IAAI;aACzD,CAAC;2BACO,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;;;;4BAIjC,QAAQ,CAAC;gBACf,6CAA6C,EAAE,IAAI;gBACnD,eAAe,EAAE,OAAO;gBACxB,eAAe,EAAE,CAAC,OAAO;gBACzB,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ;aAC1B,CAAC;;;;;;;;gCAQU,IAAI,CAAC,QAAQ;gCACb,IAAI,CAAC,QAAQ;+BACd,OAAO;8BACR,CAAC,GAAU,EAAE,EAAE;gBACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAiC,CAAC;gBACvD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnE,CAAC;;;;aAIR;UACH,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,UAAU;YAC1C,CAAC,CAAC,IAAI,CAAA;;;;;kBAKE,GAAG,CAAA,yfAAyf;;;;;;;;;4DASld,IAAI,CAAC,UAAU;;aAE9D;YACH,CAAC,CAAC,EAAE;;KAET,CAAC;IACJ,CAAC;IAED,IAAc,MAAM;QAClB,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;QACnC,IAAI,IAAI,CAAC,SAAS,IAAI,aAAa,KAAK,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QACpE,IAAI,IAAI,CAAC,UAAU,IAAI,aAAa,KAAK,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QACvE,OAAO,CAAC,CAAC,aAAa,CAAC;IACzB,CAAC;IAED,IAAc,MAAM,CAAC,KAAc;QACjC,IAAI,IAAI,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;aAC/D,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,KAAK,KAAK;YAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;;YACvE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IAC5B,CAAC;CACF","sourcesContent":["import { InternalEditableControl } from '../InternalEditableControl/InternalEditableControl';\nimport { html, PropertyDeclarations, svg, TemplateResult } from 'lit-element';\nimport { classMap } from '../../../utils/class-map';\n\nexport class InternalSwitchControl extends InternalEditableControl {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n helperTextAsToolip: { type: Boolean, attribute: 'helper-text-as-tooltip' },\n falseAlias: { attribute: 'false-alias' },\n trueAlias: { attribute: 'true-alias' },\n invert: { type: Boolean },\n };\n }\n\n helperTextAsToolip = false;\n\n falseAlias: string | null = null;\n\n trueAlias: string | null = null;\n\n invert = false;\n\n renderControl(): TemplateResult {\n const checked = this.invert ? !this._value : !!this._value;\n return html`\n <div class=\"flex items-start gap-s leading-xs text-m\">\n <div class=\"flex-1\">\n <label class=\"text-m text-body\" for=\"input\">${this.label}</label>\n ${this.helperTextAsToolip\n ? ''\n : html`<p class=\"text-xs text-secondary\">${this.helperText}</p>`}\n <p class=\"text-xs text-error\" ?hidden=${this.disabled || this.readonly}>\n ${this._errorMessage}\n </p>\n </div>\n\n ${this.readonly\n ? html`<p class=\"text-secondary\">${checked ? this.t('checked') : this.t('unchecked')}</p>`\n : html`\n <div style=\"height: calc(1em * var(--lumo-line-height-xs))\" class=\"flex items-center\">\n <div\n style=\"border-radius: var(--lumo-size-xl); width: calc((1em * var(--lumo-line-height-xs)) - 3px + var(--lumo-space-m))\"\n class=${classMap({\n 'cursor-pointer group transition-colors relative': true,\n 'flex flex-shrink-0 items-center': true,\n 'bg-success': !this.disabled && checked,\n 'bg-contrast-20 hover-bg-contrast-30': !this.disabled && !checked,\n 'bg-contrast-10': this.disabled,\n 'focus-within-ring-2 focus-within-ring-primary-50': true,\n })}\n @click=${() => (this._value = !this._value)}\n >\n <div\n style=\"margin: 1.5px; width: calc((1em * var(--lumo-line-height-xs)) - 6px); height: calc((1em * var(--lumo-line-height-xs)) - 6px)\"\n class=${classMap({\n 'transition-all transform block rounded-full': true,\n 'translate-x-m': checked,\n 'translate-x-0': !checked,\n 'bg-base': this.disabled,\n 'bg-tint': !this.disabled,\n })}\n ></div>\n\n <input\n class=\"opacity-0 absolute inset-0 focus-outline-none\"\n type=\"checkbox\"\n id=\"input\"\n switch\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n ?checked=${checked}\n @change=${(evt: Event) => {\n const checkbox = evt.currentTarget as HTMLInputElement;\n this._value = this.invert ? !checkbox.checked : checkbox.checked;\n }}\n />\n </div>\n </div>\n `}\n ${this.helperTextAsToolip && this.helperText\n ? html`\n <div\n class=\"transition-colors text-tertiary flex-shrink-0 cursor-pointer hover-text-body\"\n id=\"trigger\"\n >\n ${svg`<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" style=\"width: calc(1em * var(--lumo-line-height-xs)); height: calc(1em * var(--lumo-line-height-xs)); margin-right: -0.12em\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z\" /></svg>`}\n </div>\n <vcf-tooltip\n for=\"trigger\"\n style=\"--lumo-base-color: black; max-width: 30rem\"\n class=\"mt-s\"\n theme=\"light\"\n position=\"bottom\"\n >\n <span class=\"text-s\" style=\"color: white\">${this.helperText}</span>\n </vcf-tooltip>\n `\n : ''}\n </div>\n `;\n }\n\n protected get _value(): boolean {\n const originalValue = super._value;\n if (this.trueAlias && originalValue === this.trueAlias) return true;\n if (this.falseAlias && originalValue === this.falseAlias) return false;\n return !!originalValue;\n }\n\n protected set _value(value: boolean) {\n if (this.trueAlias && value === true) super._value = this.trueAlias;\n else if (this.falseAlias && value === false) super._value = this.falseAlias;\n else super._value = value;\n }\n}\n"]}
1
+ {"version":3,"file":"InternalSwitchControl.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalSwitchControl/InternalSwitchControl.ts"],"names":[],"mappings":"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","sourcesContent":["import { InternalEditableControl } from '../InternalEditableControl/InternalEditableControl';\nimport { html, PropertyDeclarations, svg, TemplateResult } from 'lit-element';\nimport { classMap } from '../../../utils/class-map';\n\nexport class InternalSwitchControl extends InternalEditableControl {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n helperTextAsToolip: { type: Boolean, attribute: 'helper-text-as-tooltip' },\n falseAlias: { attribute: 'false-alias' },\n trueAlias: { attribute: 'true-alias' },\n invert: { type: Boolean },\n };\n }\n\n helperTextAsToolip = false;\n\n falseAlias: string | null = null;\n\n trueAlias: string | null = null;\n\n invert = false;\n\n renderControl(): TemplateResult {\n const checked = this.invert ? !this._value : !!this._value;\n return html`\n <div class=\"flex items-start gap-s leading-xs text-m\">\n <div class=\"flex-1\">\n <label class=\"text-m text-body\" for=\"input\">${this.label}</label>\n ${this.helperTextAsToolip\n ? ''\n : html`<p class=\"text-xs text-secondary\" style=\"max-width: 32rem\">\n ${this.helperText}\n </p>`}\n <p\n class=\"text-xs text-error\"\n style=\"max-width: 32rem\"\n ?hidden=${this.disabled || this.readonly}\n >\n ${this._errorMessage}\n </p>\n </div>\n\n ${this.readonly\n ? html`<p class=\"text-secondary\">${checked ? this.t('checked') : this.t('unchecked')}</p>`\n : html`\n <div style=\"height: calc(1em * var(--lumo-line-height-xs))\" class=\"flex items-center\">\n <div\n style=\"border-radius: var(--lumo-size-xl); width: calc((1em * var(--lumo-line-height-xs)) - 3px + var(--lumo-space-m))\"\n class=${classMap({\n 'cursor-pointer group transition-colors relative': true,\n 'flex flex-shrink-0 items-center': true,\n 'bg-success': !this.disabled && checked,\n 'bg-contrast-20 hover-bg-contrast-30': !this.disabled && !checked,\n 'bg-contrast-10': this.disabled,\n 'focus-within-ring-2 focus-within-ring-primary-50': true,\n })}\n @click=${() => (this._value = !this._value)}\n >\n <div\n style=\"margin: 1.5px; width: calc((1em * var(--lumo-line-height-xs)) - 6px); height: calc((1em * var(--lumo-line-height-xs)) - 6px)\"\n class=${classMap({\n 'transition-all transform block rounded-full': true,\n 'translate-x-m': checked,\n 'translate-x-0': !checked,\n 'bg-base': this.disabled,\n 'bg-tint': !this.disabled,\n })}\n ></div>\n\n <input\n class=\"opacity-0 absolute inset-0 focus-outline-none\"\n type=\"checkbox\"\n id=\"input\"\n switch\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n ?checked=${checked}\n @change=${(evt: Event) => {\n const checkbox = evt.currentTarget as HTMLInputElement;\n this._value = this.invert ? !checkbox.checked : checkbox.checked;\n }}\n />\n </div>\n </div>\n `}\n ${this.helperTextAsToolip && this.helperText\n ? html`\n <div\n class=\"transition-colors text-tertiary flex-shrink-0 cursor-pointer hover-text-body\"\n id=\"trigger\"\n >\n ${svg`<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" style=\"width: calc(1em * var(--lumo-line-height-xs)); height: calc(1em * var(--lumo-line-height-xs)); margin-right: -0.12em\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z\" /></svg>`}\n </div>\n <vcf-tooltip\n for=\"trigger\"\n style=\"--lumo-base-color: black; max-width: 30rem\"\n class=\"mt-s\"\n theme=\"light\"\n position=\"bottom\"\n >\n <span class=\"text-s\" style=\"color: white\">${this.helperText}</span>\n </vcf-tooltip>\n `\n : ''}\n </div>\n `;\n }\n\n protected get _value(): boolean {\n const originalValue = super._value;\n if (this.trueAlias && originalValue === this.trueAlias) return true;\n if (this.falseAlias && originalValue === this.falseAlias) return false;\n return !!originalValue;\n }\n\n protected set _value(value: boolean) {\n if (this.trueAlias && value === true) super._value = this.trueAlias;\n else if (this.falseAlias && value === false) super._value = this.falseAlias;\n else super._value = value;\n }\n}\n"]}
@@ -78,19 +78,10 @@ export class InternalTextControl extends InternalEditableControl {
78
78
  }
79
79
  __renderSummaryItemLayout() {
80
80
  return html `
81
- <div class="flex items-start gap-m leading-xs">
82
- <div>
83
- <label class="text-m text-body" for="input">${this.label}</label>
84
- <p class="text-xs text-secondary">${this.helperText}</p>
85
- <p
86
- class="text-xs text-error"
87
- ?hidden=${!this.__isErrorVisible || this.disabled || this.readonly}
88
- >
89
- ${this._errorMessage}
90
- </p>
91
- </div>
81
+ <div class="leading-xs">
82
+ <div class="flex items-center gap-xs">
83
+ <label class="text-m text-body flex-1 whitespace-nowrap" for="input">${this.label}</label>
92
84
 
93
- <div class="flex-1 flex items-center gap-xs" style="min-width: 30%">
94
85
  ${this.prefix ? html `<div>${this.prefix}</div>` : ''}
95
86
 
96
87
  <input
@@ -120,7 +111,7 @@ export class InternalTextControl extends InternalEditableControl {
120
111
  <button
121
112
  aria-label=${this.t('clear')}
122
113
  class=${classMap({
123
- 'rounded-full transition-colors': true,
114
+ 'flex-shrink-0 rounded-full transition-colors': true,
124
115
  'focus-outline-none focus-ring-2 focus-ring-primary-50': true,
125
116
  'cursor-pointer text-tertiary hover-text-body': !this.disabled,
126
117
  'cursor-default text-disabled': this.disabled,
@@ -136,6 +127,16 @@ export class InternalTextControl extends InternalEditableControl {
136
127
  ${svg `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" style="width: 1em; height: 1em; transform: scale(1.25); margin-right: -0.16em"><path d="M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z" /></svg>`}
137
128
  </button>
138
129
  </div>
130
+
131
+ <div style="max-width: 32rem">
132
+ <p class="text-xs text-secondary">${this.helperText}</p>
133
+ <p
134
+ class="text-xs text-error"
135
+ ?hidden=${!this.__isErrorVisible || this.disabled || this.readonly}
136
+ >
137
+ ${this._errorMessage}
138
+ </p>
139
+ </div>
139
140
  </div>
140
141
  `;
141
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"InternalTextControl.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalTextControl/InternalTextControl.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CSSResultArray, PropertyDeclarations, TemplateResult } from 'lit-element';\nimport type { TextFieldElement } from '@vaadin/vaadin-text-field';\n\nimport { InternalEditableControl } from '../InternalEditableControl/InternalEditableControl';\nimport { html, css, svg } from 'lit-element';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { classMap } from '../../../utils/class-map';\nimport { live } from 'lit-html/directives/live';\n\n/**\n * Internal control displaying a basic text box.\n *\n * @since 1.17.0\n * @element foxy-internal-text-control\n */\nexport class InternalTextControl extends InternalEditableControl {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n layout: {},\n prefix: {},\n suffix: {},\n __isErrorVisible: { attribute: false },\n };\n }\n\n static get styles(): CSSResultArray {\n return [\n super.styles,\n css`\n input::-webkit-contacts-auto-fill-button {\n visibility: hidden;\n display: none !important;\n pointer-events: none;\n position: absolute;\n right: 0;\n }\n `,\n ];\n }\n\n layout: 'summary-item' | 'standalone' | null = null;\n\n prefix: string | null = null;\n\n suffix: string | null = null;\n\n private __isErrorVisible = false;\n\n reportValidity(): void {\n this.__isErrorVisible = true;\n super.reportValidity();\n }\n\n renderControl(): TemplateResult {\n if (this.layout === 'summary-item') return this.__renderSummaryItemLayout();\n\n return html`\n <vaadin-text-field\n error-message=${ifDefined(this._errorMessage)}\n helper-text=${this.helperText}\n placeholder=${this.placeholder}\n label=${this.label}\n class=\"w-full\"\n ?clear-button-visible=${!this.suffix}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n .checkValidity=${this._checkValidity}\n .value=${this._value}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && this.nucleon?.submit()}\n @input=${(evt: CustomEvent) => {\n const field = evt.currentTarget as TextFieldElement;\n this._value = field.value;\n }}\n >\n ${this.prefix ? html`<div slot=\"prefix\">${this.prefix}</div>` : ''}\n ${this.suffix ? html`<div class=\"pr-s font-medium\" slot=\"suffix\">${this.suffix}</div>` : ''}\n </vaadin-text-field>\n `;\n }\n\n protected get _value(): string {\n return (super._value as string | undefined) ?? '';\n }\n\n protected set _value(newValue: string) {\n super._value = newValue as unknown | undefined;\n }\n\n private __renderSummaryItemLayout() {\n return html`\n <div class=\"flex items-start gap-m leading-xs\">\n <div>\n <label class=\"text-m text-body\" for=\"input\">${this.label}</label>\n <p class=\"text-xs text-secondary\">${this.helperText}</p>\n <p\n class=\"text-xs text-error\"\n ?hidden=${!this.__isErrorVisible || this.disabled || this.readonly}\n >\n ${this._errorMessage}\n </p>\n </div>\n\n <div class=\"flex-1 flex items-center gap-xs\" style=\"min-width: 30%\">\n ${this.prefix ? html`<div>${this.prefix}</div>` : ''}\n\n <input\n placeholder=${this.placeholder}\n class=${classMap({\n 'w-full appearance-none text-right bg-transparent transition-colors': true,\n 'text-m rounded-s focus-outline-none': true,\n 'text-secondary': this.readonly,\n 'text-disabled': this.disabled,\n 'font-medium': !this.readonly,\n })}\n type=\"text\"\n id=\"input\"\n .value=${live(this._value)}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && this.nucleon?.submit()}\n @blur=${() => (this.__isErrorVisible = true)}\n @input=${(evt: Event) => {\n evt.stopPropagation();\n this._value = (evt.target as HTMLInputElement).value;\n }}\n />\n\n ${this.suffix ? html`<div class=\"font-medium text-secondary\">${this.suffix}</div>` : ''}\n\n <button\n aria-label=${this.t('clear')}\n class=${classMap({\n 'rounded-full transition-colors': true,\n 'focus-outline-none focus-ring-2 focus-ring-primary-50': true,\n 'cursor-pointer text-tertiary hover-text-body': !this.disabled,\n 'cursor-default text-disabled': this.disabled,\n })}\n style=\"width: 1em; height: 1em;\"\n ?disabled=${this.disabled}\n ?hidden=${this.readonly || !this._value}\n @click=${() => {\n this._value = '';\n this.dispatchEvent(new CustomEvent('clear'));\n }}\n >\n ${svg`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" style=\"width: 1em; height: 1em; transform: scale(1.25); margin-right: -0.16em\"><path d=\"M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z\" /></svg>`}\n </button>\n </div>\n </div>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"InternalTextControl.js","sourceRoot":"","sources":["../../../../src/elements/internal/InternalTextControl/InternalTextControl.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,8DAA2D;AAC7F,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,oCAAiC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,OAAO,mBAAoB,SAAQ,uBAAuB;IAAhE;;QA0BE,WAAM,GAAyC,IAAI,CAAC;QAEpD,WAAM,GAAkB,IAAI,CAAC;QAE7B,WAAM,GAAkB,IAAI,CAAC;QAErB,qBAAgB,GAAG,KAAK,CAAC;IA0GnC,CAAC;IAzIC,MAAM,KAAK,UAAU;QACnB,OAAO;YACL,GAAG,KAAK,CAAC,UAAU;YACnB,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;SACvC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO;YACL,KAAK,CAAC,MAAM;YACZ,GAAG;;;;;;;OAQF;SACF,CAAC;IACJ,CAAC;IAUD,cAAc;QACZ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc;YAAE,OAAO,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAE5E,OAAO,IAAI,CAAA;;wBAES,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;sBAC/B,IAAI,CAAC,UAAU;sBACf,IAAI,CAAC,WAAW;gBACtB,IAAI,CAAC,KAAK;;gCAEM,CAAC,IAAI,CAAC,MAAM;oBACxB,IAAI,CAAC,QAAQ;oBACb,IAAI,CAAC,QAAQ;yBACR,IAAI,CAAC,cAAc;iBAC3B,IAAI,CAAC,MAAM;mBACT,CAAC,GAAkB,EAAE,EAAE,WAAC,OAAA,GAAG,CAAC,GAAG,KAAK,OAAO,WAAI,IAAI,CAAC,OAAO,0CAAE,MAAM,GAAE,CAAA,EAAA;iBACvE,CAAC,GAAgB,EAAE,EAAE;YAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,aAAiC,CAAC;YACpD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;QAC5B,CAAC;;UAEC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA,sBAAsB,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE;UAChE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA,+CAA+C,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE;;KAE9F,CAAC;IACJ,CAAC;IAED,IAAc,MAAM;;QAClB,aAAQ,KAAK,CAAC,MAA6B,mCAAI,EAAE,CAAC;IACpD,CAAC;IAED,IAAc,MAAM,CAAC,QAAgB;QACnC,KAAK,CAAC,MAAM,GAAG,QAA+B,CAAC;IACjD,CAAC;IAEO,yBAAyB;QAC/B,OAAO,IAAI,CAAA;;;iFAGkE,IAAI,CAAC,KAAK;;YAE/E,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA,QAAQ,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE;;;0BAGpC,IAAI,CAAC,WAAW;oBACtB,QAAQ,CAAC;YACf,oEAAoE,EAAE,IAAI;YAC1E,qCAAqC,EAAE,IAAI;YAC3C,gBAAgB,EAAE,IAAI,CAAC,QAAQ;YAC/B,eAAe,EAAE,IAAI,CAAC,QAAQ;YAC9B,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ;SAC9B,CAAC;;;qBAGO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;wBACd,IAAI,CAAC,QAAQ;wBACb,IAAI,CAAC,QAAQ;uBACd,CAAC,GAAkB,EAAE,EAAE,WAAC,OAAA,GAAG,CAAC,GAAG,KAAK,OAAO,WAAI,IAAI,CAAC,OAAO,0CAAE,MAAM,GAAE,CAAA,EAAA;oBACxE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;qBACnC,CAAC,GAAU,EAAE,EAAE;YACtB,GAAG,CAAC,eAAe,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,GAAI,GAAG,CAAC,MAA2B,CAAC,KAAK,CAAC;QACvD,CAAC;;;YAGD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA,2CAA2C,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE;;;yBAGxE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;oBACpB,QAAQ,CAAC;YACf,8CAA8C,EAAE,IAAI;YACpD,uDAAuD,EAAE,IAAI;YAC7D,8CAA8C,EAAE,CAAC,IAAI,CAAC,QAAQ;YAC9D,8BAA8B,EAAE,IAAI,CAAC,QAAQ;SAC9C,CAAC;;wBAEU,IAAI,CAAC,QAAQ;sBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;qBAC9B,GAAG,EAAE;YACZ,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,CAAC;;cAEC,GAAG,CAAA,sWAAsW;;;;;8CAKzU,IAAI,CAAC,UAAU;;;sBAGvC,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;;cAEhE,IAAI,CAAC,aAAa;;;;KAI3B,CAAC;IACJ,CAAC;CACF","sourcesContent":["import type { CSSResultArray, PropertyDeclarations, TemplateResult } from 'lit-element';\nimport type { TextFieldElement } from '@vaadin/vaadin-text-field';\n\nimport { InternalEditableControl } from '../InternalEditableControl/InternalEditableControl';\nimport { html, css, svg } from 'lit-element';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { classMap } from '../../../utils/class-map';\nimport { live } from 'lit-html/directives/live';\n\n/**\n * Internal control displaying a basic text box.\n *\n * @since 1.17.0\n * @element foxy-internal-text-control\n */\nexport class InternalTextControl extends InternalEditableControl {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n layout: {},\n prefix: {},\n suffix: {},\n __isErrorVisible: { attribute: false },\n };\n }\n\n static get styles(): CSSResultArray {\n return [\n super.styles,\n css`\n input::-webkit-contacts-auto-fill-button {\n visibility: hidden;\n display: none !important;\n pointer-events: none;\n position: absolute;\n right: 0;\n }\n `,\n ];\n }\n\n layout: 'summary-item' | 'standalone' | null = null;\n\n prefix: string | null = null;\n\n suffix: string | null = null;\n\n private __isErrorVisible = false;\n\n reportValidity(): void {\n this.__isErrorVisible = true;\n super.reportValidity();\n }\n\n renderControl(): TemplateResult {\n if (this.layout === 'summary-item') return this.__renderSummaryItemLayout();\n\n return html`\n <vaadin-text-field\n error-message=${ifDefined(this._errorMessage)}\n helper-text=${this.helperText}\n placeholder=${this.placeholder}\n label=${this.label}\n class=\"w-full\"\n ?clear-button-visible=${!this.suffix}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n .checkValidity=${this._checkValidity}\n .value=${this._value}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && this.nucleon?.submit()}\n @input=${(evt: CustomEvent) => {\n const field = evt.currentTarget as TextFieldElement;\n this._value = field.value;\n }}\n >\n ${this.prefix ? html`<div slot=\"prefix\">${this.prefix}</div>` : ''}\n ${this.suffix ? html`<div class=\"pr-s font-medium\" slot=\"suffix\">${this.suffix}</div>` : ''}\n </vaadin-text-field>\n `;\n }\n\n protected get _value(): string {\n return (super._value as string | undefined) ?? '';\n }\n\n protected set _value(newValue: string) {\n super._value = newValue as unknown | undefined;\n }\n\n private __renderSummaryItemLayout() {\n return html`\n <div class=\"leading-xs\">\n <div class=\"flex items-center gap-xs\">\n <label class=\"text-m text-body flex-1 whitespace-nowrap\" for=\"input\">${this.label}</label>\n\n ${this.prefix ? html`<div>${this.prefix}</div>` : ''}\n\n <input\n placeholder=${this.placeholder}\n class=${classMap({\n 'w-full appearance-none text-right bg-transparent transition-colors': true,\n 'text-m rounded-s focus-outline-none': true,\n 'text-secondary': this.readonly,\n 'text-disabled': this.disabled,\n 'font-medium': !this.readonly,\n })}\n type=\"text\"\n id=\"input\"\n .value=${live(this._value)}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n @keydown=${(evt: KeyboardEvent) => evt.key === 'Enter' && this.nucleon?.submit()}\n @blur=${() => (this.__isErrorVisible = true)}\n @input=${(evt: Event) => {\n evt.stopPropagation();\n this._value = (evt.target as HTMLInputElement).value;\n }}\n />\n\n ${this.suffix ? html`<div class=\"font-medium text-secondary\">${this.suffix}</div>` : ''}\n\n <button\n aria-label=${this.t('clear')}\n class=${classMap({\n 'flex-shrink-0 rounded-full transition-colors': true,\n 'focus-outline-none focus-ring-2 focus-ring-primary-50': true,\n 'cursor-pointer text-tertiary hover-text-body': !this.disabled,\n 'cursor-default text-disabled': this.disabled,\n })}\n style=\"width: 1em; height: 1em;\"\n ?disabled=${this.disabled}\n ?hidden=${this.readonly || !this._value}\n @click=${() => {\n this._value = '';\n this.dispatchEvent(new CustomEvent('clear'));\n }}\n >\n ${svg`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" style=\"width: 1em; height: 1em; transform: scale(1.25); margin-right: -0.16em\"><path d=\"M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z\" /></svg>`}\n </button>\n </div>\n\n <div style=\"max-width: 32rem\">\n <p class=\"text-xs text-secondary\">${this.helperText}</p>\n <p\n class=\"text-xs text-error\"\n ?hidden=${!this.__isErrorVisible || this.disabled || this.readonly}\n >\n ${this._errorMessage}\n </p>\n </div>\n </div>\n `;\n }\n}\n"]}
@@ -43,9 +43,15 @@ export declare class CustomerApi extends CustomerApi_base {
43
43
  };
44
44
  };
45
45
  static readonly SignInEvent: {
46
- new (typeArg: string, eventInitDict?: CustomEventInit<void> | undefined): {
47
- readonly detail: void;
48
- initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: void): void;
46
+ new (typeArg: string, eventInitDict?: CustomEventInit<{
47
+ forcePasswordReset: boolean;
48
+ }> | undefined): {
49
+ readonly detail: {
50
+ forcePasswordReset: boolean;
51
+ };
52
+ initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: {
53
+ forcePasswordReset: boolean;
54
+ }): void;
49
55
  readonly bubbles: boolean;
50
56
  cancelBubble: boolean;
51
57
  readonly cancelable: boolean;
@@ -126,7 +126,9 @@ export class CustomerApi extends ConfigurableMixin(InferrableMixin(LitElement))
126
126
  let body;
127
127
  try {
128
128
  await this.api.signIn(payload.credential);
129
- this.dispatchEvent(new CustomerApi.SignInEvent('signin'));
129
+ const session = JSON.parse(this.api.storage.getItem(API.SESSION));
130
+ const detail = { forcePasswordReset: !!session.force_password_reset };
131
+ this.dispatchEvent(new CustomerApi.SignInEvent('signin', { detail }));
130
132
  this.requestUpdate();
131
133
  status = 200;
132
134
  body = { _links: { self: { href: request.url } }, ...payload };
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerApi.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerApi/CustomerApi.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '@foxy.io/sdk/customer';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { FetchEvent } from '../NucleonElement/FetchEvent';\nimport { cookieStorage } from './cookieStorage';\nimport { InferrableMixin } from '../../../mixins/inferrable';\n\n/**\n * Element connector for Customer API.\n *\n * @fires CustomerApi#signout - Instance of `CustomerApi.SignOutEvent`. Dispatched on an element when session expires or code 401 is returned.\n * @fires CustomerApi#signin - Instance of `CustomerApi.SignInEvent`. Dispatched on an element once authenticated.\n * @fires CustomerApi#signup - Instance of `CustomerApi.SignUpEvent`. Dispatched on an element once a customer is created (since v1.24.0).\n *\n * @element foxy-customer-api\n * @since 1.4.0\n */\nexport class CustomerApi extends ConfigurableMixin(InferrableMixin(LitElement)) {\n static readonly SignOutEvent = class extends CustomEvent<void> {};\n\n static readonly SignInEvent = class extends CustomEvent<void> {};\n\n static readonly SignUpEvent = class extends CustomEvent<void> {};\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n storage: { type: String, noAccessor: true },\n level: { type: Number, noAccessor: true },\n base: { type: String, noAccessor: true },\n };\n }\n\n private __storage: 'session' | 'cookie' | 'local' = 'local';\n\n private __level = 0;\n\n private __base = location.origin;\n\n private __api: API = this.__createAPIInstance();\n\n private __handleFetch = async (originalEvent: Event) => {\n if (!(originalEvent instanceof FetchEvent)) return;\n if (originalEvent.defaultPrevented) return;\n if (originalEvent.composedPath()[0] === this) return;\n\n originalEvent.preventDefault();\n\n const apiEvent = new FetchEvent('fetch', {\n cancelable: true,\n composed: true,\n request: originalEvent.request,\n bubbles: true,\n reject: (reason: unknown) => originalEvent.respondWith(Promise.reject(reason)),\n resolve: (response: Response) => {\n if (apiEvent.request.url === 'foxy://customer-api/session') this.requestUpdate();\n if (response.status === 401) this.requestUpdate();\n originalEvent.respondWith(Promise.resolve(response));\n },\n });\n\n if (this.dispatchEvent(apiEvent)) apiEvent.respondWith(this.__handleRequest(apiEvent.request));\n };\n\n get isLoggedIn(): boolean {\n return !!this.api.storage.getItem(API.SESSION);\n }\n\n /** `FoxySDK.Customer.API` instance used by this element to communicate with the backend. */\n get api(): API {\n return this.__api;\n }\n\n /** Bookmark URL for this API. This is where the tree traversal begins. We also use this URL as a base for relative paths. */\n get base(): string {\n return this.__base;\n }\n\n set base(value: string) {\n this.__base = value;\n this.__api = this.__createAPIInstance();\n }\n\n /** Numeric Consola log level. If omitted, Consola defaults will be used. */\n get level(): number {\n return this.__level;\n }\n\n set level(value: number) {\n this.__level = value;\n this.__api = this.__createAPIInstance();\n }\n\n /** Credentials storage implementing Web Storage API. Access tokens and other related info will be stored here. Defaults to in-memory storage. */\n get storage(): 'session' | 'cookie' | 'local' {\n return this.__storage;\n }\n\n set storage(value: 'session' | 'cookie' | 'local') {\n this.__storage = value;\n this.__api = this.__createAPIInstance();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('fetch', this.__handleFetch);\n }\n\n render(): TemplateResult {\n return html`\n ${this.renderTemplateOrSlot(this.isLoggedIn ? 'logged-in' : 'logged-out')}\n <slot></slot>\n `;\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('fetch', this.__handleFetch);\n }\n\n private __createAPIInstance() {\n const storageOptions = {\n session: sessionStorage,\n cookie: cookieStorage,\n local: localStorage,\n };\n\n return new API({\n storage: storageOptions[this.storage],\n level: this.level,\n base: new URL(this.base),\n });\n }\n\n private async __handleVirtualAuthSessionDelete() {\n await this.api.signOut();\n\n this.dispatchEvent(new CustomerApi.SignOutEvent('signout'));\n this.requestUpdate();\n\n return new Response();\n }\n\n private async __handleVirtualAuthSessionPost(request: Request) {\n const payload = await request.clone().json();\n if (payload.type !== 'password') throw new Error(`Unknown payload type ${payload.type}`);\n\n let status: number;\n let body: unknown;\n\n try {\n await this.api.signIn(payload.credential);\n\n this.dispatchEvent(new CustomerApi.SignInEvent('signin'));\n this.requestUpdate();\n\n status = 200;\n body = { _links: { self: { href: request.url } }, ...payload };\n } catch (err) {\n if (!(err instanceof API.AuthError)) throw err;\n if (!(err.code === 'UNAUTHORIZED')) throw err;\n\n const virtualAuthError = {\n message: err.message,\n logref: 'unavailable',\n code: 'invalid_credential_error',\n };\n\n status = 401;\n body = { total: 1, _embedded: { 'fx:errors': [virtualAuthError] } };\n }\n\n return new Response(JSON.stringify(body), { status });\n }\n\n private async __handleVirtualAuthSessionAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to sign in',\n })\n );\n }\n\n private async __handleVirtualAuthRecoverPost(request: Request) {\n const payload = await request.clone().json();\n\n if (payload.type === 'email') {\n await this.api.sendPasswordResetEmail(payload.detail);\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n email: payload.email,\n })\n );\n } else {\n throw new Error(`Unknown payload type ${payload.type}`);\n }\n }\n\n private async __handleVirtualAuthRecoverAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to request a password reset',\n })\n );\n }\n\n private async __handleVirtualAuthSignUpPost(request: Request) {\n const data = (await request.clone().json()) as {\n verification: { type: 'hcaptcha'; token: string };\n first_name?: string;\n last_name?: string;\n password?: string;\n email: string;\n };\n\n try {\n await this.api.signUp(data);\n } catch (err) {\n if (!(err instanceof API.AuthError)) throw err;\n\n let message: string;\n let status: number;\n\n if (err.code === 'UNAUTHORIZED') {\n message = 'Customer registration is disabled for this store.';\n status = 401;\n } else if (err.code === 'UNAVAILABLE') {\n message = 'This email address is already in use by an existing customer of this store.';\n status = 403;\n } else if (err.code === 'INVALID_FORM') {\n message = 'Client verification failed.';\n status = 400;\n } else {\n throw err;\n }\n\n const body = JSON.stringify({ total: 1, _embedded: { 'fx:errors': [{ message }] } });\n return new Response(body, { status });\n }\n\n if (data.password) await this.api.signIn(data as Required<typeof data>);\n this.requestUpdate();\n this.dispatchEvent(new CustomerApi.SignUpEvent('signup'));\n\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'Account created',\n })\n );\n }\n\n private async __handleVirtualAuthSignUpAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to create an account',\n })\n );\n }\n\n private async __handleRequest(request: Request) {\n const url = request.url;\n const method = request.method;\n\n try {\n if (url.startsWith('foxy://customer-api/session')) {\n if (method === 'DELETE') return this.__handleVirtualAuthSessionDelete();\n if (method === 'POST') return this.__handleVirtualAuthSessionPost(request);\n return this.__handleVirtualAuthSessionAny(request);\n }\n\n if (url.startsWith('foxy://customer-api/recover')) {\n if (method === 'POST') return this.__handleVirtualAuthRecoverPost(request);\n return this.__handleVirtualAuthRecoverAny(request);\n }\n\n if (url.startsWith('foxy://customer-api/signup')) {\n if (method === 'POST') return this.__handleVirtualAuthSignUpPost(request);\n return this.__handleVirtualAuthSignUpAny(request);\n }\n\n const response = await this.api.fetch(request);\n\n if (response.status === 401) {\n this.api.storage.clear();\n this.dispatchEvent(new CustomerApi.SignOutEvent('signout'));\n this.requestUpdate();\n }\n\n return response;\n } catch (err) {\n return new Response(null, { status: 500 });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"CustomerApi.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerApi/CustomerApi.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StoredSession } from '@foxy.io/sdk/dist/types/customer/types';\n\nimport { LitElement, PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '@foxy.io/sdk/customer';\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { FetchEvent } from '../NucleonElement/FetchEvent';\nimport { cookieStorage } from './cookieStorage';\nimport { InferrableMixin } from '../../../mixins/inferrable';\n\n/**\n * Element connector for Customer API.\n *\n * @fires CustomerApi#signout - Instance of `CustomerApi.SignOutEvent`. Dispatched on an element when session expires or code 401 is returned.\n * @fires CustomerApi#signin - Instance of `CustomerApi.SignInEvent`. Dispatched on an element once authenticated.\n * @fires CustomerApi#signup - Instance of `CustomerApi.SignUpEvent`. Dispatched on an element once a customer is created (since v1.24.0).\n *\n * @element foxy-customer-api\n * @since 1.4.0\n */\nexport class CustomerApi extends ConfigurableMixin(InferrableMixin(LitElement)) {\n static readonly SignOutEvent = class extends CustomEvent<void> {};\n\n static readonly SignInEvent = class extends CustomEvent<{ forcePasswordReset: boolean }> {};\n\n static readonly SignUpEvent = class extends CustomEvent<void> {};\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n storage: { type: String, noAccessor: true },\n level: { type: Number, noAccessor: true },\n base: { type: String, noAccessor: true },\n };\n }\n\n private __storage: 'session' | 'cookie' | 'local' = 'local';\n\n private __level = 0;\n\n private __base = location.origin;\n\n private __api: API = this.__createAPIInstance();\n\n private __handleFetch = async (originalEvent: Event) => {\n if (!(originalEvent instanceof FetchEvent)) return;\n if (originalEvent.defaultPrevented) return;\n if (originalEvent.composedPath()[0] === this) return;\n\n originalEvent.preventDefault();\n\n const apiEvent = new FetchEvent('fetch', {\n cancelable: true,\n composed: true,\n request: originalEvent.request,\n bubbles: true,\n reject: (reason: unknown) => originalEvent.respondWith(Promise.reject(reason)),\n resolve: (response: Response) => {\n if (apiEvent.request.url === 'foxy://customer-api/session') this.requestUpdate();\n if (response.status === 401) this.requestUpdate();\n originalEvent.respondWith(Promise.resolve(response));\n },\n });\n\n if (this.dispatchEvent(apiEvent)) apiEvent.respondWith(this.__handleRequest(apiEvent.request));\n };\n\n get isLoggedIn(): boolean {\n return !!this.api.storage.getItem(API.SESSION);\n }\n\n /** `FoxySDK.Customer.API` instance used by this element to communicate with the backend. */\n get api(): API {\n return this.__api;\n }\n\n /** Bookmark URL for this API. This is where the tree traversal begins. We also use this URL as a base for relative paths. */\n get base(): string {\n return this.__base;\n }\n\n set base(value: string) {\n this.__base = value;\n this.__api = this.__createAPIInstance();\n }\n\n /** Numeric Consola log level. If omitted, Consola defaults will be used. */\n get level(): number {\n return this.__level;\n }\n\n set level(value: number) {\n this.__level = value;\n this.__api = this.__createAPIInstance();\n }\n\n /** Credentials storage implementing Web Storage API. Access tokens and other related info will be stored here. Defaults to in-memory storage. */\n get storage(): 'session' | 'cookie' | 'local' {\n return this.__storage;\n }\n\n set storage(value: 'session' | 'cookie' | 'local') {\n this.__storage = value;\n this.__api = this.__createAPIInstance();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('fetch', this.__handleFetch);\n }\n\n render(): TemplateResult {\n return html`\n ${this.renderTemplateOrSlot(this.isLoggedIn ? 'logged-in' : 'logged-out')}\n <slot></slot>\n `;\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('fetch', this.__handleFetch);\n }\n\n private __createAPIInstance() {\n const storageOptions = {\n session: sessionStorage,\n cookie: cookieStorage,\n local: localStorage,\n };\n\n return new API({\n storage: storageOptions[this.storage],\n level: this.level,\n base: new URL(this.base),\n });\n }\n\n private async __handleVirtualAuthSessionDelete() {\n await this.api.signOut();\n\n this.dispatchEvent(new CustomerApi.SignOutEvent('signout'));\n this.requestUpdate();\n\n return new Response();\n }\n\n private async __handleVirtualAuthSessionPost(request: Request) {\n const payload = await request.clone().json();\n if (payload.type !== 'password') throw new Error(`Unknown payload type ${payload.type}`);\n\n let status: number;\n let body: unknown;\n\n try {\n await this.api.signIn(payload.credential);\n\n const session = JSON.parse(this.api.storage.getItem(API.SESSION) as string) as StoredSession;\n const detail = { forcePasswordReset: !!session.force_password_reset };\n\n this.dispatchEvent(new CustomerApi.SignInEvent('signin', { detail }));\n this.requestUpdate();\n\n status = 200;\n body = { _links: { self: { href: request.url } }, ...payload };\n } catch (err) {\n if (!(err instanceof API.AuthError)) throw err;\n if (!(err.code === 'UNAUTHORIZED')) throw err;\n\n const virtualAuthError = {\n message: err.message,\n logref: 'unavailable',\n code: 'invalid_credential_error',\n };\n\n status = 401;\n body = { total: 1, _embedded: { 'fx:errors': [virtualAuthError] } };\n }\n\n return new Response(JSON.stringify(body), { status });\n }\n\n private async __handleVirtualAuthSessionAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to sign in',\n })\n );\n }\n\n private async __handleVirtualAuthRecoverPost(request: Request) {\n const payload = await request.clone().json();\n\n if (payload.type === 'email') {\n await this.api.sendPasswordResetEmail(payload.detail);\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n email: payload.email,\n })\n );\n } else {\n throw new Error(`Unknown payload type ${payload.type}`);\n }\n }\n\n private async __handleVirtualAuthRecoverAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to request a password reset',\n })\n );\n }\n\n private async __handleVirtualAuthSignUpPost(request: Request) {\n const data = (await request.clone().json()) as {\n verification: { type: 'hcaptcha'; token: string };\n first_name?: string;\n last_name?: string;\n password?: string;\n email: string;\n };\n\n try {\n await this.api.signUp(data);\n } catch (err) {\n if (!(err instanceof API.AuthError)) throw err;\n\n let message: string;\n let status: number;\n\n if (err.code === 'UNAUTHORIZED') {\n message = 'Customer registration is disabled for this store.';\n status = 401;\n } else if (err.code === 'UNAVAILABLE') {\n message = 'This email address is already in use by an existing customer of this store.';\n status = 403;\n } else if (err.code === 'INVALID_FORM') {\n message = 'Client verification failed.';\n status = 400;\n } else {\n throw err;\n }\n\n const body = JSON.stringify({ total: 1, _embedded: { 'fx:errors': [{ message }] } });\n return new Response(body, { status });\n }\n\n if (data.password) await this.api.signIn(data as Required<typeof data>);\n this.requestUpdate();\n this.dispatchEvent(new CustomerApi.SignUpEvent('signup'));\n\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'Account created',\n })\n );\n }\n\n private async __handleVirtualAuthSignUpAny(request: Request) {\n return new Response(\n JSON.stringify({\n _links: { self: { href: request.url } },\n message: 'POST to this endpoint to create an account',\n })\n );\n }\n\n private async __handleRequest(request: Request) {\n const url = request.url;\n const method = request.method;\n\n try {\n if (url.startsWith('foxy://customer-api/session')) {\n if (method === 'DELETE') return this.__handleVirtualAuthSessionDelete();\n if (method === 'POST') return this.__handleVirtualAuthSessionPost(request);\n return this.__handleVirtualAuthSessionAny(request);\n }\n\n if (url.startsWith('foxy://customer-api/recover')) {\n if (method === 'POST') return this.__handleVirtualAuthRecoverPost(request);\n return this.__handleVirtualAuthRecoverAny(request);\n }\n\n if (url.startsWith('foxy://customer-api/signup')) {\n if (method === 'POST') return this.__handleVirtualAuthSignUpPost(request);\n return this.__handleVirtualAuthSignUpAny(request);\n }\n\n const response = await this.api.fetch(request);\n\n if (response.status === 401) {\n this.api.storage.clear();\n this.dispatchEvent(new CustomerApi.SignOutEvent('signout'));\n this.requestUpdate();\n }\n\n return response;\n } catch (err) {\n return new Response(null, { status: 500 });\n }\n }\n}\n"]}
@@ -8,6 +8,40 @@ declare const CustomerPortal_base: typeof CustomerApi & {
8
8
  };
9
9
  export declare class CustomerPortal extends CustomerPortal_base {
10
10
  #private;
11
+ static readonly PasswordResetEvent: {
12
+ new (typeArg: string, eventInitDict?: CustomEventInit<{
13
+ result: 'skipped' | 'completed';
14
+ }> | undefined): {
15
+ readonly detail: {
16
+ result: 'skipped' | 'completed';
17
+ };
18
+ initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: {
19
+ result: 'skipped' | 'completed';
20
+ }): void;
21
+ readonly bubbles: boolean;
22
+ cancelBubble: boolean;
23
+ readonly cancelable: boolean;
24
+ readonly composed: boolean;
25
+ readonly currentTarget: EventTarget | null;
26
+ readonly defaultPrevented: boolean;
27
+ readonly eventPhase: number;
28
+ readonly isTrusted: boolean;
29
+ returnValue: boolean;
30
+ readonly srcElement: EventTarget | null;
31
+ readonly target: EventTarget | null;
32
+ readonly timeStamp: number;
33
+ readonly type: string;
34
+ composedPath(): EventTarget[];
35
+ initEvent(type: string, bubbles?: boolean | undefined, cancelable?: boolean | undefined): void;
36
+ preventDefault(): void;
37
+ stopImmediatePropagation(): void;
38
+ stopPropagation(): void;
39
+ readonly AT_TARGET: number;
40
+ readonly BUBBLING_PHASE: number;
41
+ readonly CAPTURING_PHASE: number;
42
+ readonly NONE: number;
43
+ };
44
+ };
11
45
  static get properties(): PropertyDeclarations;
12
46
  /** Same as `.columns` property on `foxy-transactions-table`. Sets columns of that table. */
13
47
  transactionsTableColumns: TransactionsTable['columns'];
@@ -31,5 +65,7 @@ export declare class CustomerPortal extends CustomerPortal_base {
31
65
  group: string;
32
66
  render(): TemplateResult;
33
67
  updated(changedProperties: Map<keyof this, unknown>): void;
68
+ private __handlePasswordResetUpdate;
69
+ private __handlePasswordResetSkip;
34
70
  }
35
71
  export {};
@@ -59,20 +59,14 @@ export class CustomerPortal extends TranslatableMixin(ThemeableMixin(CustomerApi
59
59
  settingsHref = undefined;
60
60
  }
61
61
  return this.api.storage.getItem(API.SESSION)
62
- ? !this.skipPasswordReset && this.api.usesTemporaryPassword
62
+ ? !this.skipPasswordReset && this.api.usesTemporaryPassword && __classPrivateFieldGet(this, _temporaryPassword)
63
63
  ? html `
64
64
  <foxy-internal-customer-portal-password-reset-view
65
65
  password-old=${ifDefined((_a = __classPrivateFieldGet(this, _temporaryPassword)) !== null && _a !== void 0 ? _a : void 0)}
66
66
  infer="password-reset"
67
67
  href=${this.base}
68
- @update=${(evt) => {
69
- var _a;
70
- if (((_a = evt.detail) === null || _a === void 0 ? void 0 : _a.result) === UpdateEvent.UpdateResult.ResourceUpdated) {
71
- this.api.usesTemporaryPassword = false;
72
- __classPrivateFieldSet(this, _temporaryPassword, null);
73
- this.requestUpdate();
74
- }
75
- }}
68
+ @update=${this.__handlePasswordResetUpdate}
69
+ @skip=${this.__handlePasswordResetSkip}
76
70
  >
77
71
  </foxy-internal-customer-portal-password-reset-view>
78
72
  `
@@ -106,6 +100,26 @@ export class CustomerPortal extends TranslatableMixin(ThemeableMixin(CustomerApi
106
100
  __classPrivateFieldSet(this, _temporaryPassword, null);
107
101
  }
108
102
  }
103
+ __handlePasswordResetUpdate(evt) {
104
+ var _a;
105
+ if (((_a = evt.detail) === null || _a === void 0 ? void 0 : _a.result) === UpdateEvent.UpdateResult.ResourceUpdated) {
106
+ this.api.usesTemporaryPassword = false;
107
+ __classPrivateFieldSet(this, _temporaryPassword, null);
108
+ this.requestUpdate();
109
+ this.dispatchEvent(new CustomerPortal.PasswordResetEvent('passwordreset', {
110
+ detail: { result: 'completed' },
111
+ }));
112
+ }
113
+ }
114
+ __handlePasswordResetSkip() {
115
+ __classPrivateFieldSet(this, _temporaryPassword, null);
116
+ this.requestUpdate();
117
+ this.dispatchEvent(new CustomerPortal.PasswordResetEvent('passwordreset', {
118
+ detail: { result: 'skipped' },
119
+ }));
120
+ }
109
121
  }
110
122
  _temporaryPassword = new WeakMap();
123
+ CustomerPortal.PasswordResetEvent = class extends CustomEvent {
124
+ };
111
125
  //# sourceMappingURL=CustomerPortal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerPortal.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerPortal/CustomerPortal.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '@foxy.io/sdk/customer';\nimport { CustomerApi } from '../CustomerApi/CustomerApi';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { TransactionsTable } from '../TransactionsTable/TransactionsTable';\nimport { UpdateEvent } from '../NucleonElement/UpdateEvent';\nimport { ifDefined } from 'lit-html/directives/if-defined';\n\nexport class CustomerPortal extends TranslatableMixin(\n ThemeableMixin(CustomerApi),\n 'customer-portal'\n) {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n transactionsTableColumns: { attribute: false },\n skipPasswordReset: { type: Boolean, attribute: 'skip-password-reset' },\n embedUrl: { attribute: 'embed-url' },\n group: { type: String },\n };\n }\n\n /** Same as `.columns` property on `foxy-transactions-table`. Sets columns of that table. */\n transactionsTableColumns: TransactionsTable['columns'] = [\n TransactionsTable.priceColumn,\n TransactionsTable.summaryColumn,\n TransactionsTable.statusColumn,\n TransactionsTable.idColumn,\n TransactionsTable.dateColumn,\n TransactionsTable.receiptColumn,\n ];\n\n #temporaryPassword: string | null = null;\n\n /** When set to true, portal won't display Password Reset screen if customer logs in with a temporary password. */\n skipPasswordReset = false;\n\n /**\n * URL of the Payment Card Embed for updating payment method.\n * When set, the payment method will be editable. Otherwise, the customers\n * will only be able to view and delete it.\n *\n * ```html\n * <foxy-customer-portal\n * embed-url=\"https://embed.foxy.io/v1.html?template_set_id=123\"\n * base=\"https://demo.foxycart.com/s/customer/\"\n * >\n * </foxy-customer-portal>\n * ```\n */\n embedUrl: string | null = null;\n\n /** Rumour group. Elements in different groups will not share updates. Empty by default. */\n group = '';\n\n render(): TemplateResult {\n let settingsHref: URL | undefined;\n\n try {\n settingsHref = new URL('./customer_portal_settings', this.base);\n } catch {\n settingsHref = undefined;\n }\n\n return this.api.storage.getItem(API.SESSION)\n ? !this.skipPasswordReset && this.api.usesTemporaryPassword\n ? html`\n <foxy-internal-customer-portal-password-reset-view\n password-old=${ifDefined(this.#temporaryPassword ?? void 0)}\n infer=\"password-reset\"\n href=${this.base}\n @update=${(evt: UpdateEvent) => {\n if (evt.detail?.result === UpdateEvent.UpdateResult.ResourceUpdated) {\n this.api.usesTemporaryPassword = false;\n this.#temporaryPassword = null;\n this.requestUpdate();\n }\n }}\n >\n </foxy-internal-customer-portal-password-reset-view>\n `\n : html`\n <foxy-internal-customer-portal-logged-in-view\n embed-url=${ifDefined(this.embedUrl ?? void 0)}\n customer=${this.base}\n class=\"h-full\"\n infer=\"\"\n href=${ifDefined(settingsHref?.toString())}\n .transactionsTableColumns=${this.transactionsTableColumns}\n >\n </foxy-internal-customer-portal-logged-in-view>\n `\n : html`\n <foxy-internal-customer-portal-logged-out-view\n class=\"h-full\"\n infer=\"\"\n href=${ifDefined(settingsHref?.toString())}\n @password=${(evt: CustomEvent<string | null>) => {\n this.#temporaryPassword = evt.detail;\n }}\n >\n </foxy-internal-customer-portal-logged-out-view>\n `;\n }\n\n updated(changedProperties: Map<keyof this, unknown>): void {\n super.updated(changedProperties);\n const isLoggedIn = this.api.storage.getItem(API.SESSION) !== null;\n if (isLoggedIn && (this.skipPasswordReset || !this.api.usesTemporaryPassword)) {\n this.#temporaryPassword = null;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"CustomerPortal.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerPortal/CustomerPortal.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '@foxy.io/sdk/customer';\nimport { CustomerApi } from '../CustomerApi/CustomerApi';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { TransactionsTable } from '../TransactionsTable/TransactionsTable';\nimport { UpdateEvent } from '../NucleonElement/UpdateEvent';\nimport { ifDefined } from 'lit-html/directives/if-defined';\n\nexport class CustomerPortal extends TranslatableMixin(\n ThemeableMixin(CustomerApi),\n 'customer-portal'\n) {\n static readonly PasswordResetEvent = class extends CustomEvent<{\n result: 'skipped' | 'completed';\n }> {};\n\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n transactionsTableColumns: { attribute: false },\n skipPasswordReset: { type: Boolean, attribute: 'skip-password-reset' },\n embedUrl: { attribute: 'embed-url' },\n group: { type: String },\n };\n }\n\n /** Same as `.columns` property on `foxy-transactions-table`. Sets columns of that table. */\n transactionsTableColumns: TransactionsTable['columns'] = [\n TransactionsTable.priceColumn,\n TransactionsTable.summaryColumn,\n TransactionsTable.statusColumn,\n TransactionsTable.idColumn,\n TransactionsTable.dateColumn,\n TransactionsTable.receiptColumn,\n ];\n\n #temporaryPassword: string | null = null;\n\n /** When set to true, portal won't display Password Reset screen if customer logs in with a temporary password. */\n skipPasswordReset = false;\n\n /**\n * URL of the Payment Card Embed for updating payment method.\n * When set, the payment method will be editable. Otherwise, the customers\n * will only be able to view and delete it.\n *\n * ```html\n * <foxy-customer-portal\n * embed-url=\"https://embed.foxy.io/v1.html?template_set_id=123\"\n * base=\"https://demo.foxycart.com/s/customer/\"\n * >\n * </foxy-customer-portal>\n * ```\n */\n embedUrl: string | null = null;\n\n /** Rumour group. Elements in different groups will not share updates. Empty by default. */\n group = '';\n\n render(): TemplateResult {\n let settingsHref: URL | undefined;\n\n try {\n settingsHref = new URL('./customer_portal_settings', this.base);\n } catch {\n settingsHref = undefined;\n }\n\n return this.api.storage.getItem(API.SESSION)\n ? !this.skipPasswordReset && this.api.usesTemporaryPassword && this.#temporaryPassword\n ? html`\n <foxy-internal-customer-portal-password-reset-view\n password-old=${ifDefined(this.#temporaryPassword ?? void 0)}\n infer=\"password-reset\"\n href=${this.base}\n @update=${this.__handlePasswordResetUpdate}\n @skip=${this.__handlePasswordResetSkip}\n >\n </foxy-internal-customer-portal-password-reset-view>\n `\n : html`\n <foxy-internal-customer-portal-logged-in-view\n embed-url=${ifDefined(this.embedUrl ?? void 0)}\n customer=${this.base}\n class=\"h-full\"\n infer=\"\"\n href=${ifDefined(settingsHref?.toString())}\n .transactionsTableColumns=${this.transactionsTableColumns}\n >\n </foxy-internal-customer-portal-logged-in-view>\n `\n : html`\n <foxy-internal-customer-portal-logged-out-view\n class=\"h-full\"\n infer=\"\"\n href=${ifDefined(settingsHref?.toString())}\n @password=${(evt: CustomEvent<string | null>) => {\n this.#temporaryPassword = evt.detail;\n }}\n >\n </foxy-internal-customer-portal-logged-out-view>\n `;\n }\n\n updated(changedProperties: Map<keyof this, unknown>): void {\n super.updated(changedProperties);\n const isLoggedIn = this.api.storage.getItem(API.SESSION) !== null;\n if (isLoggedIn && (this.skipPasswordReset || !this.api.usesTemporaryPassword)) {\n this.#temporaryPassword = null;\n }\n }\n\n private __handlePasswordResetUpdate(evt: UpdateEvent) {\n if (evt.detail?.result === UpdateEvent.UpdateResult.ResourceUpdated) {\n this.api.usesTemporaryPassword = false;\n this.#temporaryPassword = null;\n this.requestUpdate();\n this.dispatchEvent(\n new CustomerPortal.PasswordResetEvent('passwordreset', {\n detail: { result: 'completed' },\n })\n );\n }\n }\n\n private __handlePasswordResetSkip() {\n this.#temporaryPassword = null;\n this.requestUpdate();\n this.dispatchEvent(\n new CustomerPortal.PasswordResetEvent('passwordreset', {\n detail: { result: 'skipped' },\n })\n );\n }\n}\n"]}
@@ -60,6 +60,15 @@ export class InternalCustomerPortalPasswordResetView extends TranslatableMixin(I
60
60
  >
61
61
  <foxy-i18n infer="" key="submit"></foxy-i18n>
62
62
  </vaadin-button>
63
+
64
+ <vaadin-button
65
+ class="w-full mt-s"
66
+ theme="tertiary"
67
+ ?disabled=${this.disabled || !this.in('idle')}
68
+ @click=${() => this.dispatchEvent(new CustomEvent('skip'))}
69
+ >
70
+ <foxy-i18n infer="" key="skip"></foxy-i18n>
71
+ </vaadin-button>
63
72
  </div>
64
73
  `;
65
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"InternalCustomerPortalPasswordResetView.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerPortal/InternalCustomerPortalPasswordResetView.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,wCAAqC;AACjE,OAAO,EAAE,YAAY,EAAE,oDAAiD;AACxE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;AAYhE,MAAM,OAAO,uCAAwC,SAAQ,iBAAiB,CAAC,YAAY,CAAO;IAAlG;;QA2BE,gBAAW,GAAkB,IAAI,CAAC;QAEjB,uBAAkB,GAAqB;YACtD,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;SACxD,CAAC;IAkDJ,CAAC;IAhFC,MAAM,KAAK,UAAU;QACnB,OAAO;YACL,GAAG,KAAK,CAAC,UAAU;YACnB,WAAW,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO;YACL,KAAK,CAAC,MAAM;YACZ,GAAG;;;OAIF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,OAAO;YACL,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,uBAAuB;YACnD,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,uBAAuB;YACpE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,uBAAuB;SAClF,CAAC;IACJ,CAAC;IAQD,UAAU;QACR,OAAO,IAAI,CAAA;;yCAE0B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW;;;;2BAI7D,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB;;;;;;;;8BAQjD,IAAI,CAAC,kBAAkB;;;;;;;sBAO/B,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;mBACpC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE;;;;;KAKjC,CAAC;IACJ,CAAC;IAED,MAAM;;QACJ,IAAI,CAAC,IAAI,CAAC,EAAE,YAAY,QAAE,IAAI,CAAC,WAAW,mCAAI,EAAE,EAAE,CAAC,CAAC;QACpD,KAAK,CAAC,MAAM,EAAE,CAAC;IACjB,CAAC;IAES,KAAK,CAAC,MAAM,CAAiB,GAAG,IAAiC;QACzE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC,MAAM,CAAU,GAAG,IAAI,CAAC,CAAC;QAEtE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAO,GAAG,IAAI,CAAC,CAAC;QAE/C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE9B,OAAO,IAA0B,CAAC;IACpC,CAAC;CACF","sourcesContent":["import type { CSSResultArray, PropertyDeclarations, TemplateResult } from 'lit-element';\nimport type { GeneratorOptions } from '../../internal/InternalPasswordControl/generateRandomPassword';\nimport type { NucleonV8N } from '../NucleonElement/types';\nimport type { Resource } from '@foxy.io/sdk/core';\nimport type { Graph } from '@foxy.io/sdk/customer';\n\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { InternalForm } from '../../internal/InternalForm/InternalForm';\nimport { html, css } from 'lit-element';\n\nimport checkPasswordStrength from 'check-password-strength';\nconst passwordStrength = checkPasswordStrength.passwordStrength;\n\ntype Data = Resource<\n Graph & {\n props: {\n /** When updating the password using Customer API, these values are required to complete the request. */\n password_old?: string;\n password?: string;\n };\n }\n>;\n\nexport class InternalCustomerPortalPasswordResetView extends TranslatableMixin(InternalForm)<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n passwordOld: { attribute: 'password-old' },\n };\n }\n\n static get styles(): CSSResultArray {\n return [\n super.styles,\n css`\n .max-w-25rem {\n max-width: 25rem;\n }\n `,\n ];\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [\n ({ password: v }) => !!v || 'password:v8n_required',\n ({ password: v }) => !v || v.length <= 50 || 'password:v8n_too_long',\n ({ password: v }) => !v || passwordStrength(v).id >= 2 || 'password:v8n_too_weak',\n ];\n }\n\n passwordOld: string | null = null;\n\n private readonly __generatorOptions: GeneratorOptions = {\n checkStrength: value => passwordStrength(value).id >= 2,\n };\n\n renderBody(): TemplateResult {\n return html`\n <div class=\"m-auto max-w-25rem leading-s\">\n <p class=\"text-xxl font-medium ${this.in('busy') ? 'text-disabled' : 'text-body'}\">\n <foxy-i18n infer=\"\" key=\"title\"></foxy-i18n>\n </p>\n\n <p class=\"text-l ${this.in('busy') ? 'text-disabled' : 'text-secondary'}\">\n <foxy-i18n infer=\"\" key=\"subtitle\"></foxy-i18n>\n </p>\n\n <foxy-internal-password-control\n infer=\"password\"\n class=\"mt-m\"\n show-generator\n .generatorOptions=${this.__generatorOptions}\n >\n </foxy-internal-password-control>\n\n <vaadin-button\n class=\"w-full mt-l\"\n theme=\"primary\"\n ?disabled=${this.disabled || !this.in('idle')}\n @click=${() => this.submit()}\n >\n <foxy-i18n infer=\"\" key=\"submit\"></foxy-i18n>\n </vaadin-button>\n </div>\n `;\n }\n\n submit(): void {\n this.edit({ password_old: this.passwordOld ?? '' });\n super.submit();\n }\n\n protected async _fetch<TResult = Data>(...args: Parameters<Window['fetch']>): Promise<TResult> {\n const request = new Request(...args);\n if (request.method !== 'PATCH') return super._fetch<TResult>(...args);\n\n const body = await request.json();\n const data = await super._fetch<Data>(...args);\n\n data.password_old = body.password_old;\n data.password = body.password;\n\n return data as unknown as TResult;\n }\n}\n"]}
1
+ {"version":3,"file":"InternalCustomerPortalPasswordResetView.js","sourceRoot":"","sources":["../../../../src/elements/public/CustomerPortal/InternalCustomerPortalPasswordResetView.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CSSResultArray, PropertyDeclarations, TemplateResult } from 'lit-element';\nimport type { GeneratorOptions } from '../../internal/InternalPasswordControl/generateRandomPassword';\nimport type { NucleonV8N } from '../NucleonElement/types';\nimport type { Resource } from '@foxy.io/sdk/core';\nimport type { Graph } from '@foxy.io/sdk/customer';\n\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { InternalForm } from '../../internal/InternalForm/InternalForm';\nimport { html, css } from 'lit-element';\n\nimport checkPasswordStrength from 'check-password-strength';\nconst passwordStrength = checkPasswordStrength.passwordStrength;\n\ntype Data = Resource<\n Graph & {\n props: {\n /** When updating the password using Customer API, these values are required to complete the request. */\n password_old?: string;\n password?: string;\n };\n }\n>;\n\nexport class InternalCustomerPortalPasswordResetView extends TranslatableMixin(InternalForm)<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n passwordOld: { attribute: 'password-old' },\n };\n }\n\n static get styles(): CSSResultArray {\n return [\n super.styles,\n css`\n .max-w-25rem {\n max-width: 25rem;\n }\n `,\n ];\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [\n ({ password: v }) => !!v || 'password:v8n_required',\n ({ password: v }) => !v || v.length <= 50 || 'password:v8n_too_long',\n ({ password: v }) => !v || passwordStrength(v).id >= 2 || 'password:v8n_too_weak',\n ];\n }\n\n passwordOld: string | null = null;\n\n private readonly __generatorOptions: GeneratorOptions = {\n checkStrength: value => passwordStrength(value).id >= 2,\n };\n\n renderBody(): TemplateResult {\n return html`\n <div class=\"m-auto max-w-25rem leading-s\">\n <p class=\"text-xxl font-medium ${this.in('busy') ? 'text-disabled' : 'text-body'}\">\n <foxy-i18n infer=\"\" key=\"title\"></foxy-i18n>\n </p>\n\n <p class=\"text-l ${this.in('busy') ? 'text-disabled' : 'text-secondary'}\">\n <foxy-i18n infer=\"\" key=\"subtitle\"></foxy-i18n>\n </p>\n\n <foxy-internal-password-control\n infer=\"password\"\n class=\"mt-m\"\n show-generator\n .generatorOptions=${this.__generatorOptions}\n >\n </foxy-internal-password-control>\n\n <vaadin-button\n class=\"w-full mt-l\"\n theme=\"primary\"\n ?disabled=${this.disabled || !this.in('idle')}\n @click=${() => this.submit()}\n >\n <foxy-i18n infer=\"\" key=\"submit\"></foxy-i18n>\n </vaadin-button>\n\n <vaadin-button\n class=\"w-full mt-s\"\n theme=\"tertiary\"\n ?disabled=${this.disabled || !this.in('idle')}\n @click=${() => this.dispatchEvent(new CustomEvent('skip'))}\n >\n <foxy-i18n infer=\"\" key=\"skip\"></foxy-i18n>\n </vaadin-button>\n </div>\n `;\n }\n\n submit(): void {\n this.edit({ password_old: this.passwordOld ?? '' });\n super.submit();\n }\n\n protected async _fetch<TResult = Data>(...args: Parameters<Window['fetch']>): Promise<TResult> {\n const request = new Request(...args);\n if (request.method !== 'PATCH') return super._fetch<TResult>(...args);\n\n const body = await request.json();\n const data = await super._fetch<Data>(...args);\n\n data.password_old = body.password_old;\n data.password = body.password;\n\n return data as unknown as TResult;\n }\n}\n"]}
@@ -21,8 +21,6 @@ export declare class TaxForm extends Base<Data> {
21
21
  countries: string | null;
22
22
  /** URL of the `fx:regions` property helper resource. */
23
23
  regions: string | null;
24
- private __serviceProviderGetValue;
25
- private __serviceProviderSetValue;
26
24
  private __countrySetValue;
27
25
  private __regionSetValue;
28
26
  private __typeSetValue;
@@ -38,10 +36,8 @@ export declare class TaxForm extends Base<Data> {
38
36
  private get __isExemptAllCustomerTaxIdsHidden();
39
37
  private get __isApplyToShippingHidden();
40
38
  private get __isUseOriginRatesHidden();
41
- private get __isProviderHidden();
42
39
  private get __isCountryHidden();
43
40
  private get __isRegionHidden();
44
41
  private get __isCityHidden();
45
- private get __isRateHidden();
46
42
  }
47
43
  export {};
@@ -23,21 +23,6 @@ export class TaxForm extends Base {
23
23
  this.countries = null;
24
24
  /** URL of the `fx:regions` property helper resource. */
25
25
  this.regions = null;
26
- this.__serviceProviderGetValue = () => {
27
- return this.form.service_provider || (this.form.is_live ? 'default' : 'none');
28
- };
29
- this.__serviceProviderSetValue = (newValue) => {
30
- const newProvider = ['none', 'default'].includes(newValue) ? '' : newValue;
31
- this.edit({
32
- service_provider: newProvider,
33
- use_origin_rates: false,
34
- is_live: newValue !== 'none',
35
- });
36
- this.edit({
37
- exempt_all_customer_tax_ids: this.__isExemptAllCustomerTaxIdsHidden,
38
- apply_to_shipping: this.__isApplyToShippingHidden,
39
- });
40
- };
41
26
  this.__countrySetValue = (newValue) => {
42
27
  this.edit({ country: newValue, region: '', city: '' });
43
28
  this.edit({ apply_to_shipping: this.__isApplyToShippingHidden });
@@ -107,6 +92,20 @@ export class TaxForm extends Base {
107
92
  get hiddenSelector() {
108
93
  var _a, _b, _c;
109
94
  const alwaysMatch = [super.hiddenSelector.toString()];
95
+ const type = this.form.type;
96
+ if (type === 'global' || type === 'custom_tax_endpoint') {
97
+ alwaysMatch.unshift('group-one:is-live', 'group-one:service-provider');
98
+ if (type === 'custom_tax_endpoint')
99
+ alwaysMatch.unshift('group-one:rate');
100
+ }
101
+ else {
102
+ if (this.form.is_live) {
103
+ alwaysMatch.unshift('group-one:rate');
104
+ }
105
+ else {
106
+ alwaysMatch.unshift('group-one:service-provider');
107
+ }
108
+ }
110
109
  if (this.__nativeIntegrationsUrl === void 0)
111
110
  alwaysMatch.unshift('native-integrations');
112
111
  if (this.__isCountryHidden)
@@ -116,10 +115,6 @@ export class TaxForm extends Base {
116
115
  }
117
116
  if (this.__isCityHidden)
118
117
  alwaysMatch.unshift('group-three:city');
119
- if (this.__isProviderHidden)
120
- alwaysMatch.unshift('group-one:service-provider');
121
- if (this.__isRateHidden)
122
- alwaysMatch.unshift('group-one:rate');
123
118
  if (this.__isApplyToShippingHidden)
124
119
  alwaysMatch.unshift('group-two:apply-to-shipping');
125
120
  if (this.__isUseOriginRatesHidden)
@@ -151,12 +146,12 @@ export class TaxForm extends Base {
151
146
  >
152
147
  </foxy-internal-select-control>
153
148
 
149
+ <foxy-internal-switch-control infer="is-live"></foxy-internal-switch-control>
150
+
154
151
  <foxy-internal-select-control
155
152
  options=${JSON.stringify(this.__serviceProviderOptions)}
156
153
  layout="summary-item"
157
154
  infer="service-provider"
158
- .getValue=${this.__serviceProviderGetValue}
159
- .setValue=${this.__serviceProviderSetValue}
160
155
  >
161
156
  </foxy-internal-select-control>
162
157
 
@@ -230,7 +225,6 @@ export class TaxForm extends Base {
230
225
  }
231
226
  get __serviceProviderOptions() {
232
227
  const options = [
233
- { label: 'option_none', value: 'none' },
234
228
  { label: 'option_avalara', value: 'avalara' },
235
229
  { label: 'option_onesource', value: 'onesource' },
236
230
  ];
@@ -303,10 +297,6 @@ export class TaxForm extends Base {
303
297
  get __isUseOriginRatesHidden() {
304
298
  return this.form.type !== 'union' || !this.form.is_live || !!this.form.service_provider;
305
299
  }
306
- get __isProviderHidden() {
307
- const type = this.form.type;
308
- return !type || type === 'global' || type === 'local' || type === 'custom_tax_endpoint';
309
- }
310
300
  get __isCountryHidden() {
311
301
  if (this.form.type === 'union') {
312
302
  return (!this.form.service_provider || this.form.is_live) && !this.form.use_origin_rates;
@@ -321,9 +311,5 @@ export class TaxForm extends Base {
321
311
  get __isCityHidden() {
322
312
  return this.form.type !== 'local';
323
313
  }
324
- get __isRateHidden() {
325
- const type = this.form.type;
326
- return !type || type === 'custom_tax_endpoint' || this.form.is_live === true;
327
- }
328
314
  }
329
315
  //# sourceMappingURL=TaxForm.js.map