@foxy.io/elements 1.39.0-beta.3 → 1.39.0-beta.4

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 (55) hide show
  1. package/dist/cdn/foxy-admin-subscription-card.js +1 -1
  2. package/dist/cdn/foxy-admin-subscription-form.js +1 -1
  3. package/dist/cdn/foxy-cancellation-form.js +1 -1
  4. package/dist/cdn/foxy-customer-portal-settings.js +1 -1
  5. package/dist/cdn/foxy-customer-portal.js +6 -10
  6. package/dist/cdn/foxy-customer.js +1 -1
  7. package/dist/cdn/foxy-donation.js +1 -1
  8. package/dist/cdn/foxy-error-entry-card.js +1 -1
  9. package/dist/cdn/foxy-item-card.js +1 -1
  10. package/dist/cdn/foxy-report-form.js +1 -1
  11. package/dist/cdn/foxy-store-shipping-method-form.js +1 -1
  12. package/dist/cdn/foxy-subscription-card.js +1 -1
  13. package/dist/cdn/foxy-subscription-form.js +1 -1
  14. package/dist/cdn/foxy-subscriptions-table.js +1 -1
  15. package/dist/cdn/{shared-56d70cc2.js → shared-230dee11.js} +5 -5
  16. package/dist/cdn/shared-84eb85dd.js +1 -0
  17. package/dist/cdn/shared-ada5e9f5.js +1 -0
  18. package/dist/cdn/translations/customer/en.json +18 -10
  19. package/dist/cdn/translations/customer-portal/de.json +33 -13
  20. package/dist/cdn/translations/customer-portal/en.json +24 -8
  21. package/dist/cdn/translations/customer-portal/es.json +32 -12
  22. package/dist/cdn/translations/customer-portal/fr.json +33 -13
  23. package/dist/cdn/translations/customer-portal/nl.json +33 -13
  24. package/dist/cdn/translations/customer-portal/pl.json +33 -13
  25. package/dist/cdn/translations/customer-portal/sv.json +33 -13
  26. package/dist/cdn/translations/customer-portal/zh-hk.json +34 -14
  27. package/dist/cdn/translations/store-shipping-method-form/en.json +4 -3
  28. package/dist/cdn/translations/subscription-card/en.json +8 -0
  29. package/dist/cdn/translations/subscription-form/en.json +16 -8
  30. package/dist/elements/private/Group/Group.js +2 -2
  31. package/dist/elements/private/Group/Group.js.map +1 -1
  32. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLink.js +2 -2
  33. package/dist/elements/public/CustomerPortal/InternalCustomerPortalLink.js.map +1 -1
  34. package/dist/elements/public/CustomerPortal/InternalCustomerPortalSubscriptions.js +3 -6
  35. package/dist/elements/public/CustomerPortal/InternalCustomerPortalSubscriptions.js.map +1 -1
  36. package/dist/elements/public/ItemCard/ItemCard.d.ts +3 -1
  37. package/dist/elements/public/ItemCard/ItemCard.js +20 -9
  38. package/dist/elements/public/ItemCard/ItemCard.js.map +1 -1
  39. package/dist/elements/public/ItemCard/types.d.ts +4 -2
  40. package/dist/elements/public/ItemCard/types.js.map +1 -1
  41. package/dist/elements/public/StoreShippingMethodForm/StoreShippingMethodForm.js +25 -4
  42. package/dist/elements/public/StoreShippingMethodForm/StoreShippingMethodForm.js.map +1 -1
  43. package/dist/elements/public/SubscriptionCard/SubscriptionCard.d.ts +4 -1
  44. package/dist/elements/public/SubscriptionCard/SubscriptionCard.js +19 -6
  45. package/dist/elements/public/SubscriptionCard/SubscriptionCard.js.map +1 -1
  46. package/dist/elements/public/SubscriptionCard/types.d.ts +4 -2
  47. package/dist/elements/public/SubscriptionCard/types.js.map +1 -1
  48. package/dist/elements/public/SubscriptionForm/SubscriptionForm.js +20 -7
  49. package/dist/elements/public/SubscriptionForm/SubscriptionForm.js.map +1 -1
  50. package/dist/utils/get-subscription-status.d.ts +3 -1
  51. package/dist/utils/get-subscription-status.js +27 -0
  52. package/dist/utils/get-subscription-status.js.map +1 -1
  53. package/package.json +2 -2
  54. package/dist/cdn/shared-4f64c35e.js +0 -1
  55. package/dist/cdn/shared-e2675ed0.js +0 -1
@@ -2,7 +2,7 @@ import { TranslatableMixin } from "../../../mixins/translatable.js";
2
2
  import { BooleanSelector } from '@foxy.io/sdk/core';
3
3
  import { InternalForm } from "../../internal/InternalForm/InternalForm.js";
4
4
  import { ifDefined } from 'lit-html/directives/if-defined';
5
- import { html } from 'lit-html';
5
+ import { html, svg } from 'lit-html';
6
6
  const NS = 'store-shipping-method-form';
7
7
  const Base = TranslatableMixin(InternalForm, NS);
8
8
  const getKbSize = (value) => new Blob([value]).size / 1024;
@@ -81,7 +81,7 @@ export class StoreShippingMethodForm extends Base {
81
81
  'CUSTOM': 'general account endpoint custom-code',
82
82
  'FedEx': 'endpoint custom-code',
83
83
  'USPS': 'account endpoint custom-code',
84
- 'UPS': 'endpoint custom-code',
84
+ 'UPS': 'endpoint custom-code account:accountid account:password account:authentication-key',
85
85
  };
86
86
  if (codeToHiddenControls[code])
87
87
  hiddenControls = codeToHiddenControls[code];
@@ -103,7 +103,7 @@ export class StoreShippingMethodForm extends Base {
103
103
  return { ...super.headerTitleOptions, provider: (_a = this.__shippingMethod) === null || _a === void 0 ? void 0 : _a.name };
104
104
  }
105
105
  renderBody() {
106
- var _a, _b, _c;
106
+ var _a, _b, _c, _d;
107
107
  const shippingMethod = this.__shippingMethod;
108
108
  return html `
109
109
  ${this.renderHeader()}
@@ -155,6 +155,27 @@ export class StoreShippingMethodForm extends Base {
155
155
  </foxy-internal-text-control>
156
156
  <foxy-internal-password-control layout="summary-item" infer="password">
157
157
  </foxy-internal-password-control>
158
+ ${this.__useCustomAccountGetValue() && ((_c = this.__shippingMethod) === null || _c === void 0 ? void 0 : _c.code) === 'UPS'
159
+ ? html `
160
+ <div
161
+ class="flex items-start"
162
+ style="gap: calc(0.625em + (var(--lumo-border-radius) / 4) - 1px)"
163
+ >
164
+ ${svg `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="flex-shrink-0 text-primary" style="width: 1.25em"><path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"></path></svg>`}
165
+ <p>
166
+ <foxy-i18n infer="" key="ups_use_legacy_admin_message"></foxy-i18n>
167
+ <br />
168
+ <a
169
+ target="_blank"
170
+ class="mt-xs inline-block rounded font-medium text-primary transition-colors cursor-pointer hover-opacity-80 focus-outline-none focus-ring-2 focus-ring-primary-50"
171
+ href="https://admin.foxycart.com"
172
+ >
173
+ admin.foxycart.com
174
+ </a>
175
+ </p>
176
+ </div>
177
+ `
178
+ : ''}
158
179
  </foxy-internal-summary-control>
159
180
 
160
181
  <foxy-internal-text-control infer="endpoint" property="accountid">
@@ -169,7 +190,7 @@ export class StoreShippingMethodForm extends Base {
169
190
  own-uri=${ifDefined(shippingMethod === null || shippingMethod === void 0 ? void 0 : shippingMethod._links.self.href)}
170
191
  embed-key="fx:store_shipping_services"
171
192
  options-href=${ifDefined(shippingMethod === null || shippingMethod === void 0 ? void 0 : shippingMethod._links['fx:shipping_services'].href)}
172
- links-href=${ifDefined((_c = this.data) === null || _c === void 0 ? void 0 : _c._links['fx:store_shipping_services'].href)}
193
+ links-href=${ifDefined((_d = this.data) === null || _d === void 0 ? void 0 : _d._links['fx:store_shipping_services'].href)}
173
194
  infer="services"
174
195
  limit="200"
175
196
  item="foxy-shipping-service-card"
@@ -1 +1 @@
1
- {"version":3,"file":"StoreShippingMethodForm.js","sourceRoot":"","sources":["../../../../src/elements/public/StoreShippingMethodForm/StoreShippingMethodForm.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PropertyDeclarations } from 'lit-element';\nimport type { NucleonElement } from '../NucleonElement/NucleonElement';\nimport type { TemplateResult } from 'lit-html';\nimport type { NucleonV8N } from '../NucleonElement/types';\nimport type { Resource } from '@foxy.io/sdk/core';\nimport type { Rels } from '@foxy.io/sdk/backend';\nimport type { Data } from './types';\n\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { BooleanSelector } from '@foxy.io/sdk/core';\nimport { InternalForm } from '../../internal/InternalForm/InternalForm';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { html } from 'lit-html';\n\nconst NS = 'store-shipping-method-form';\nconst Base = TranslatableMixin(InternalForm, NS);\nconst getKbSize = (value: string) => new Blob([value]).size / 1024;\nconst isURL = (value: string) => {\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Form element for creating and editing store shipping methods (`fx:store_shipping_method`).\n *\n * @element foxy-store-shipping-method-form\n * @since 1.21.0\n */\nexport class StoreShippingMethodForm extends Base<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n shippingMethods: { attribute: 'shipping-methods' },\n __useCustomAccount: { attribute: false },\n };\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [\n ({ shipping_method_uri: v }) => (v && isURL(v)) || 'shipping-method-uri:v8n_required',\n ({ accountid: v }) => !v || v.length <= 50 || 'accountid:v8n_too_long',\n ({ password: v }) => !v || v.length <= 50 || 'password:v8n_too_long',\n ({ meter_number: v }) => !v || v.length <= 50 || 'meter-number:v8n_too_long',\n ({ authentication_key: v }) => !v || v.length <= 50 || 'authentication-key:v8n_too_long',\n ({ custom_code: v }) => !v || getKbSize(v) <= 64 || 'custom-code:v8n_too_long',\n ];\n }\n\n /** URL of the `fx:shipping_methods` property helper. */\n shippingMethods: string | null = null;\n\n private readonly __shippingMethodLoaderId = 'shippingMethodLoader';\n\n private readonly __shippingMethodUriSetValue = (newValue: string) => {\n this.undo();\n this.edit({ shipping_method_uri: newValue });\n };\n\n private __useCustomAccount = false;\n\n private readonly __useCustomAccountGetValue = () => {\n return Boolean(\n this.__useCustomAccount ||\n this.form.authentication_key ||\n this.form.meter_number ||\n this.form.accountid ||\n this.form.password\n );\n };\n\n private readonly __useCustomAccountSetValue = (value: boolean) => {\n if (!value) {\n this.edit({\n authentication_key: '',\n meter_number: '',\n accountid: '',\n password: '',\n });\n }\n\n this.__useCustomAccount = value;\n };\n\n get hiddenSelector(): BooleanSelector {\n const hasData = !!this.data;\n const code = this.__shippingMethod?.code;\n\n // prettier-ignore\n let hiddenControls = 'general:shipping-container-uri general:shipping-drop-type-uri destinations account endpoint custom-code';\n\n if (code) {\n const codeToHiddenControls: Record<string, string> = {\n 'CUSTOM-ENDPOINT-POST': 'general destinations account custom-code',\n 'CUSTOM-CODE': 'general destinations account endpoint',\n 'CUSTOM': 'general account endpoint custom-code',\n 'FedEx': 'endpoint custom-code',\n 'USPS': 'account endpoint custom-code',\n 'UPS': 'endpoint custom-code',\n };\n\n if (codeToHiddenControls[code]) hiddenControls = codeToHiddenControls[code];\n }\n\n if (!hasData || code?.startsWith('CUSTOM-')) hiddenControls += ' services';\n if (hasData) hiddenControls = `general:shipping-method-uri ${hiddenControls}`;\n\n // prettier-ignore\n if (!this.__useCustomAccountGetValue()) hiddenControls += ' account:accountid account:password account:authentication-key account:meter-number';\n\n return new BooleanSelector(`${hiddenControls} ${super.hiddenSelector}`.trim());\n }\n\n get headerSubtitleOptions(): Record<string, unknown> {\n return { id: this.headerCopyIdValue };\n }\n\n get headerTitleOptions(): Record<string, unknown> {\n return { ...super.headerTitleOptions, provider: this.__shippingMethod?.name };\n }\n\n renderBody(): TemplateResult {\n const shippingMethod = this.__shippingMethod;\n\n return html`\n ${this.renderHeader()}\n\n <foxy-internal-summary-control infer=\"general\">\n <foxy-internal-resource-picker-control\n layout=\"summary-item\"\n infer=\"shipping-method-uri\"\n first=${ifDefined(this.shippingMethods ?? this.form._links?.['fx:shipping_methods'].href)}\n item=\"foxy-shipping-method-card\"\n .setValue=${this.__shippingMethodUriSetValue}\n >\n </foxy-internal-resource-picker-control>\n\n <foxy-internal-resource-picker-control\n layout=\"summary-item\"\n infer=\"shipping-container-uri\"\n first=${ifDefined(shippingMethod?._links['fx:shipping_containers'].href)}\n item=\"foxy-shipping-container-card\"\n >\n </foxy-internal-resource-picker-control>\n\n <foxy-internal-resource-picker-control\n layout=\"summary-item\"\n infer=\"shipping-drop-type-uri\"\n first=${ifDefined(shippingMethod?._links['fx:shipping_drop_types'].href)}\n item=\"foxy-shipping-drop-type-card\"\n >\n </foxy-internal-resource-picker-control>\n </foxy-internal-summary-control>\n\n <foxy-internal-summary-control infer=\"destinations\">\n <foxy-internal-switch-control infer=\"use-for-domestic\"></foxy-internal-switch-control>\n <foxy-internal-switch-control infer=\"use-for-international\"></foxy-internal-switch-control>\n </foxy-internal-summary-control>\n\n <foxy-internal-summary-control infer=\"account\">\n <foxy-internal-switch-control\n infer=\"use-custom-account\"\n .getValue=${this.__useCustomAccountGetValue}\n .setValue=${this.__useCustomAccountSetValue}\n >\n </foxy-internal-switch-control>\n <foxy-internal-text-control layout=\"summary-item\" infer=\"authentication-key\">\n </foxy-internal-text-control>\n <foxy-internal-text-control layout=\"summary-item\" infer=\"meter-number\">\n </foxy-internal-text-control>\n <foxy-internal-text-control layout=\"summary-item\" infer=\"accountid\">\n </foxy-internal-text-control>\n <foxy-internal-password-control layout=\"summary-item\" infer=\"password\">\n </foxy-internal-password-control>\n </foxy-internal-summary-control>\n\n <foxy-internal-text-control infer=\"endpoint\" property=\"accountid\">\n </foxy-internal-text-control>\n\n <foxy-internal-source-control infer=\"custom-code\"></foxy-internal-source-control>\n\n <foxy-internal-async-resource-link-list-control\n foreign-key-for-uri=\"shipping_service_uri\"\n foreign-key-for-id=\"shipping_service_id\"\n own-key-for-uri=\"shipping_method_uri\"\n own-uri=${ifDefined(shippingMethod?._links.self.href)}\n embed-key=\"fx:store_shipping_services\"\n options-href=${ifDefined(shippingMethod?._links['fx:shipping_services'].href)}\n links-href=${ifDefined(this.data?._links['fx:store_shipping_services'].href)}\n infer=\"services\"\n limit=\"200\"\n item=\"foxy-shipping-service-card\"\n >\n </foxy-internal-async-resource-link-list-control>\n\n <foxy-nucleon\n class=\"hidden\"\n infer=\"\"\n href=${ifDefined(this.form.shipping_method_uri || undefined)}\n id=${this.__shippingMethodLoaderId}\n @update=${() => this.requestUpdate()}\n >\n </foxy-nucleon>\n\n ${super.renderBody()}\n `;\n }\n\n updated(changes: Map<keyof this, unknown>): void {\n super.updated(changes);\n if (changes.has('href')) this.__useCustomAccount = false;\n }\n\n protected async _fetch<TResult = Data>(...args: Parameters<Window['fetch']>): Promise<TResult> {\n try {\n return await super._fetch(...args);\n } catch (err) {\n const errors: string[] = [];\n\n try {\n for (const error of (await (err as Response).json())._embedded['fx:errors']) {\n if (error.message.startsWith('shipping_container_id must be')) {\n errors.push('shipping-container-uri:v8n_required');\n } else if (error.message.startsWith('shipping_drop_type_id must be')) {\n errors.push('shipping-drop-type-uri:v8n_required');\n }\n }\n } catch {\n // no-op\n }\n\n throw errors.length > 0 ? errors : err;\n }\n }\n\n private get __shippingMethodLoader() {\n type Loader = NucleonElement<Resource<Rels.ShippingMethod>>;\n return this.renderRoot.querySelector<Loader>(`#${this.__shippingMethodLoaderId}`);\n }\n\n private get __shippingMethod() {\n return this.__shippingMethodLoader?.data;\n }\n}\n"]}
1
+ {"version":3,"file":"StoreShippingMethodForm.js","sourceRoot":"","sources":["../../../../src/elements/public/StoreShippingMethodForm/StoreShippingMethodForm.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PropertyDeclarations } from 'lit-element';\nimport type { NucleonElement } from '../NucleonElement/NucleonElement';\nimport type { TemplateResult } from 'lit-html';\nimport type { NucleonV8N } from '../NucleonElement/types';\nimport type { Resource } from '@foxy.io/sdk/core';\nimport type { Rels } from '@foxy.io/sdk/backend';\nimport type { Data } from './types';\n\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { BooleanSelector } from '@foxy.io/sdk/core';\nimport { InternalForm } from '../../internal/InternalForm/InternalForm';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { html, svg } from 'lit-html';\n\nconst NS = 'store-shipping-method-form';\nconst Base = TranslatableMixin(InternalForm, NS);\nconst getKbSize = (value: string) => new Blob([value]).size / 1024;\nconst isURL = (value: string) => {\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Form element for creating and editing store shipping methods (`fx:store_shipping_method`).\n *\n * @element foxy-store-shipping-method-form\n * @since 1.21.0\n */\nexport class StoreShippingMethodForm extends Base<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n shippingMethods: { attribute: 'shipping-methods' },\n __useCustomAccount: { attribute: false },\n };\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [\n ({ shipping_method_uri: v }) => (v && isURL(v)) || 'shipping-method-uri:v8n_required',\n ({ accountid: v }) => !v || v.length <= 50 || 'accountid:v8n_too_long',\n ({ password: v }) => !v || v.length <= 50 || 'password:v8n_too_long',\n ({ meter_number: v }) => !v || v.length <= 50 || 'meter-number:v8n_too_long',\n ({ authentication_key: v }) => !v || v.length <= 50 || 'authentication-key:v8n_too_long',\n ({ custom_code: v }) => !v || getKbSize(v) <= 64 || 'custom-code:v8n_too_long',\n ];\n }\n\n /** URL of the `fx:shipping_methods` property helper. */\n shippingMethods: string | null = null;\n\n private readonly __shippingMethodLoaderId = 'shippingMethodLoader';\n\n private readonly __shippingMethodUriSetValue = (newValue: string) => {\n this.undo();\n this.edit({ shipping_method_uri: newValue });\n };\n\n private __useCustomAccount = false;\n\n private readonly __useCustomAccountGetValue = () => {\n return Boolean(\n this.__useCustomAccount ||\n this.form.authentication_key ||\n this.form.meter_number ||\n this.form.accountid ||\n this.form.password\n );\n };\n\n private readonly __useCustomAccountSetValue = (value: boolean) => {\n if (!value) {\n this.edit({\n authentication_key: '',\n meter_number: '',\n accountid: '',\n password: '',\n });\n }\n\n this.__useCustomAccount = value;\n };\n\n get hiddenSelector(): BooleanSelector {\n const hasData = !!this.data;\n const code = this.__shippingMethod?.code;\n\n // prettier-ignore\n let hiddenControls = 'general:shipping-container-uri general:shipping-drop-type-uri destinations account endpoint custom-code';\n\n if (code) {\n const codeToHiddenControls: Record<string, string> = {\n 'CUSTOM-ENDPOINT-POST': 'general destinations account custom-code',\n 'CUSTOM-CODE': 'general destinations account endpoint',\n 'CUSTOM': 'general account endpoint custom-code',\n 'FedEx': 'endpoint custom-code',\n 'USPS': 'account endpoint custom-code',\n 'UPS': 'endpoint custom-code account:accountid account:password account:authentication-key',\n };\n\n if (codeToHiddenControls[code]) hiddenControls = codeToHiddenControls[code];\n }\n\n if (!hasData || code?.startsWith('CUSTOM-')) hiddenControls += ' services';\n if (hasData) hiddenControls = `general:shipping-method-uri ${hiddenControls}`;\n\n // prettier-ignore\n if (!this.__useCustomAccountGetValue()) hiddenControls += ' account:accountid account:password account:authentication-key account:meter-number';\n\n return new BooleanSelector(`${hiddenControls} ${super.hiddenSelector}`.trim());\n }\n\n get headerSubtitleOptions(): Record<string, unknown> {\n return { id: this.headerCopyIdValue };\n }\n\n get headerTitleOptions(): Record<string, unknown> {\n return { ...super.headerTitleOptions, provider: this.__shippingMethod?.name };\n }\n\n renderBody(): TemplateResult {\n const shippingMethod = this.__shippingMethod;\n\n return html`\n ${this.renderHeader()}\n\n <foxy-internal-summary-control infer=\"general\">\n <foxy-internal-resource-picker-control\n layout=\"summary-item\"\n infer=\"shipping-method-uri\"\n first=${ifDefined(this.shippingMethods ?? this.form._links?.['fx:shipping_methods'].href)}\n item=\"foxy-shipping-method-card\"\n .setValue=${this.__shippingMethodUriSetValue}\n >\n </foxy-internal-resource-picker-control>\n\n <foxy-internal-resource-picker-control\n layout=\"summary-item\"\n infer=\"shipping-container-uri\"\n first=${ifDefined(shippingMethod?._links['fx:shipping_containers'].href)}\n item=\"foxy-shipping-container-card\"\n >\n </foxy-internal-resource-picker-control>\n\n <foxy-internal-resource-picker-control\n layout=\"summary-item\"\n infer=\"shipping-drop-type-uri\"\n first=${ifDefined(shippingMethod?._links['fx:shipping_drop_types'].href)}\n item=\"foxy-shipping-drop-type-card\"\n >\n </foxy-internal-resource-picker-control>\n </foxy-internal-summary-control>\n\n <foxy-internal-summary-control infer=\"destinations\">\n <foxy-internal-switch-control infer=\"use-for-domestic\"></foxy-internal-switch-control>\n <foxy-internal-switch-control infer=\"use-for-international\"></foxy-internal-switch-control>\n </foxy-internal-summary-control>\n\n <foxy-internal-summary-control infer=\"account\">\n <foxy-internal-switch-control\n infer=\"use-custom-account\"\n .getValue=${this.__useCustomAccountGetValue}\n .setValue=${this.__useCustomAccountSetValue}\n >\n </foxy-internal-switch-control>\n <foxy-internal-text-control layout=\"summary-item\" infer=\"authentication-key\">\n </foxy-internal-text-control>\n <foxy-internal-text-control layout=\"summary-item\" infer=\"meter-number\">\n </foxy-internal-text-control>\n <foxy-internal-text-control layout=\"summary-item\" infer=\"accountid\">\n </foxy-internal-text-control>\n <foxy-internal-password-control layout=\"summary-item\" infer=\"password\">\n </foxy-internal-password-control>\n ${this.__useCustomAccountGetValue() && this.__shippingMethod?.code === 'UPS'\n ? html`\n <div\n class=\"flex items-start\"\n style=\"gap: calc(0.625em + (var(--lumo-border-radius) / 4) - 1px)\"\n >\n ${svg`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" class=\"flex-shrink-0 text-primary\" style=\"width: 1.25em\"><path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\" clip-rule=\"evenodd\"></path></svg>`}\n <p>\n <foxy-i18n infer=\"\" key=\"ups_use_legacy_admin_message\"></foxy-i18n>\n <br />\n <a\n target=\"_blank\"\n class=\"mt-xs inline-block rounded font-medium text-primary transition-colors cursor-pointer hover-opacity-80 focus-outline-none focus-ring-2 focus-ring-primary-50\"\n href=\"https://admin.foxycart.com\"\n >\n admin.foxycart.com\n </a>\n </p>\n </div>\n `\n : ''}\n </foxy-internal-summary-control>\n\n <foxy-internal-text-control infer=\"endpoint\" property=\"accountid\">\n </foxy-internal-text-control>\n\n <foxy-internal-source-control infer=\"custom-code\"></foxy-internal-source-control>\n\n <foxy-internal-async-resource-link-list-control\n foreign-key-for-uri=\"shipping_service_uri\"\n foreign-key-for-id=\"shipping_service_id\"\n own-key-for-uri=\"shipping_method_uri\"\n own-uri=${ifDefined(shippingMethod?._links.self.href)}\n embed-key=\"fx:store_shipping_services\"\n options-href=${ifDefined(shippingMethod?._links['fx:shipping_services'].href)}\n links-href=${ifDefined(this.data?._links['fx:store_shipping_services'].href)}\n infer=\"services\"\n limit=\"200\"\n item=\"foxy-shipping-service-card\"\n >\n </foxy-internal-async-resource-link-list-control>\n\n <foxy-nucleon\n class=\"hidden\"\n infer=\"\"\n href=${ifDefined(this.form.shipping_method_uri || undefined)}\n id=${this.__shippingMethodLoaderId}\n @update=${() => this.requestUpdate()}\n >\n </foxy-nucleon>\n\n ${super.renderBody()}\n `;\n }\n\n updated(changes: Map<keyof this, unknown>): void {\n super.updated(changes);\n if (changes.has('href')) this.__useCustomAccount = false;\n }\n\n protected async _fetch<TResult = Data>(...args: Parameters<Window['fetch']>): Promise<TResult> {\n try {\n return await super._fetch(...args);\n } catch (err) {\n const errors: string[] = [];\n\n try {\n for (const error of (await (err as Response).json())._embedded['fx:errors']) {\n if (error.message.startsWith('shipping_container_id must be')) {\n errors.push('shipping-container-uri:v8n_required');\n } else if (error.message.startsWith('shipping_drop_type_id must be')) {\n errors.push('shipping-drop-type-uri:v8n_required');\n }\n }\n } catch {\n // no-op\n }\n\n throw errors.length > 0 ? errors : err;\n }\n }\n\n private get __shippingMethodLoader() {\n type Loader = NucleonElement<Resource<Rels.ShippingMethod>>;\n return this.renderRoot.querySelector<Loader>(`#${this.__shippingMethodLoaderId}`);\n }\n\n private get __shippingMethod() {\n return this.__shippingMethodLoader?.data;\n }\n}\n"]}
@@ -1,5 +1,6 @@
1
+ import type { PropertyDeclarations } from 'lit-element';
2
+ import type { Data, Settings } from './types';
1
3
  import { TemplateResult } from 'lit-html';
2
- import { Data } from './types';
3
4
  import { NucleonElement } from '../NucleonElement/NucleonElement';
4
5
  declare const Base: typeof NucleonElement & import("lit-element").Constructor<import("../../../mixins/translatable").TranslatableMixinHost> & {
5
6
  defaultNS: string;
@@ -13,6 +14,8 @@ declare const Base: typeof NucleonElement & import("lit-element").Constructor<im
13
14
  * @since 1.4.0
14
15
  */
15
16
  export declare class SubscriptionCard extends Base<Data> {
17
+ static get properties(): PropertyDeclarations;
18
+ settings: Settings | null;
16
19
  render(): TemplateResult;
17
20
  private __getSummaryOptions;
18
21
  private __getPriceOptions;
@@ -6,7 +6,7 @@ import { ThemeableMixin } from "../../../mixins/themeable.js";
6
6
  import { TranslatableMixin } from "../../../mixins/translatable.js";
7
7
  import { classMap } from "../../../utils/class-map.js";
8
8
  import { parseFrequency } from "../../../utils/parse-frequency.js";
9
- import { getSubscriptionStatus } from "../../../utils/get-subscription-status.js";
9
+ import { getExtendedSubscriptionStatus, getSubscriptionStatus, } from "../../../utils/get-subscription-status.js";
10
10
  const NS = 'subscription-card';
11
11
  const Base = ConfigurableMixin(ResponsiveMixin(ThemeableMixin(TranslatableMixin(NucleonElement, NS))));
12
12
  /**
@@ -16,11 +16,23 @@ const Base = ConfigurableMixin(ResponsiveMixin(ThemeableMixin(TranslatableMixin(
16
16
  * @since 1.4.0
17
17
  */
18
18
  export class SubscriptionCard extends Base {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.settings = null;
22
+ }
23
+ static get properties() {
24
+ return {
25
+ ...super.properties,
26
+ settings: { type: Object },
27
+ };
28
+ }
19
29
  render() {
20
- var _a, _b, _c;
21
- const status = getSubscriptionStatus(this.data);
30
+ var _a, _b, _c, _d, _e;
31
+ const status = this.settings
32
+ ? getExtendedSubscriptionStatus(this.data, this.settings)
33
+ : getSubscriptionStatus(this.data);
22
34
  const isRed = status === 'failed';
23
- const isGreen = status === 'next_payment' || !!(status === null || status === void 0 ? void 0 : status.startsWith('will_end'));
35
+ const isGreen = (status === null || status === void 0 ? void 0 : status.startsWith('next_payment')) || !!(status === null || status === void 0 ? void 0 : status.startsWith('will_end'));
24
36
  const isNormal = !isGreen && !isRed;
25
37
  return html `
26
38
  <div class="relative text-left">
@@ -87,7 +99,8 @@ export class SubscriptionCard extends Base {
87
99
  options=${JSON.stringify(this.__getPriceOptions())}
88
100
  class="text-xxs sm-text-l font-tnum tracking-wide sm-tracking-normal uppercase sm-normal-case font-medium text-secondary sm-text-body sm-block"
89
101
  lang=${this.lang}
90
- key="price_${((_a = this.data) === null || _a === void 0 ? void 0 : _a.frequency) === '.5m' ? 'twice_a_month' : 'recurring'}"
102
+ key="price${((_b = (_a = this.settings) === null || _a === void 0 ? void 0 : _a.cart_display_config.show_sub_frequency) !== null && _b !== void 0 ? _b : true) ? `_${((_c = this.data) === null || _c === void 0 ? void 0 : _c.frequency) === '.5m' ? 'twice_a_month' : 'recurring'}`
103
+ : ''}"
91
104
  ns=${this.ns}
92
105
  >
93
106
  </foxy-i18n>
@@ -114,7 +127,7 @@ export class SubscriptionCard extends Base {
114
127
  state=${this.in('fail') ? 'error' : this.in({ idle: 'template' }) ? 'empty' : 'busy'}
115
128
  class="m-auto"
116
129
  lang=${this.lang}
117
- ns="${this.ns} ${(_c = (_b = customElements.get('foxy-spinner')) === null || _b === void 0 ? void 0 : _b.defaultNS) !== null && _c !== void 0 ? _c : ''}"
130
+ ns="${this.ns} ${(_e = (_d = customElements.get('foxy-spinner')) === null || _d === void 0 ? void 0 : _d.defaultNS) !== null && _e !== void 0 ? _e : ''}"
118
131
  >
119
132
  </foxy-spinner>
120
133
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriptionCard.js","sourceRoot":"","sources":["../../../../src/elements/public/SubscriptionCard/SubscriptionCard.ts"],"names":[],"mappings":"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","sourcesContent":["import { TemplateResult, html } from 'lit-html';\n\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { Data } from './types';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { ResponsiveMixin } from '../../../mixins/responsive';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { classMap } from '../../../utils/class-map';\nimport { parseFrequency } from '../../../utils/parse-frequency';\nimport { getSubscriptionStatus } from '../../../utils/get-subscription-status';\n\nconst NS = 'subscription-card';\nconst Base = ConfigurableMixin(\n ResponsiveMixin(ThemeableMixin(TranslatableMixin(NucleonElement, NS)))\n);\n\n/**\n * Card element displaying subscription summary.\n *\n * @element foxy-subscription-card\n * @since 1.4.0\n */\nexport class SubscriptionCard extends Base<Data> {\n render(): TemplateResult {\n const status = getSubscriptionStatus(this.data);\n const isRed = status === 'failed';\n const isGreen = status === 'next_payment' || !!status?.startsWith('will_end');\n const isNormal = !isGreen && !isRed;\n\n return html`\n <div class=\"relative text-left\">\n <div\n class=${classMap({\n 'flex items-start sm-items-center space-x-m transition duration-150 ease-in-out': true,\n 'opacity-0': !this.in({ idle: 'snapshot' }),\n })}\n >\n <div\n class=${classMap({\n 'min-w-0 flex-shrink-0 rounded-full relative flex p-s': true,\n 'text-success bg-success-10': isGreen,\n 'text-body bg-contrast-5': isNormal,\n 'text-error bg-error-10': isRed,\n })}\n >\n <iron-icon\n class=\"m-auto\"\n icon=${isRed ? 'error-outline' : isGreen ? 'done' : 'done-all'}\n >\n </iron-icon>\n </div>\n\n <div class=\"flex-1 min-w-0 leading-xs flex flex-col sm-flex-row sm-items-center\">\n <div class=\"order-1 sm-order-0\">\n <div class=\"text-body font-medium origin-top-left text-m\">\n <foxy-i18n\n data-testid=\"summary\"\n options=${JSON.stringify(this.__getSummaryOptions())}\n lang=${this.lang}\n key=\"transaction_summary\"\n ns=${this.ns}\n >\n </foxy-i18n>\n &#8203;\n </div>\n\n <div\n class=${classMap({\n 'text-m': true,\n 'text-tertiary': isNormal,\n 'text-success': isGreen,\n 'text-error': isRed,\n })}\n >\n <foxy-i18n\n data-testid=\"status\"\n lang=${this.lang}\n key=\"status_${status}\"\n ns=${this.ns}\n .options=${this.data}\n >\n </foxy-i18n>\n &#8203;\n </div>\n </div>\n\n <div\n class=\"flex-1 leading-xs mb-xs sm-mb-0 sm-text-right order-0 sm-order-1\"\n >\n <foxy-i18n\n data-testid=\"price\"\n options=${JSON.stringify(this.__getPriceOptions())}\n class=\"text-xxs sm-text-l font-tnum tracking-wide sm-tracking-normal uppercase sm-normal-case font-medium text-secondary sm-text-body sm-block\"\n lang=${this.lang}\n key=\"price_${this.data?.frequency === '.5m' ? 'twice_a_month' : 'recurring'}\"\n ns=${this.ns}\n >\n </foxy-i18n>\n <span class=\"text-secondary font-medium sm-font-normal sm-block text-xxs sm-text-s\">\n <span class=\"sm-hidden\">(</span><span class=\"hidden sm-inline\">*</span><foxy-i18n infer=\"\" key=\"fees_hint\"></foxy-i18n><span class=\"sm-hidden\">)</span>\n <iron-icon id=\"hint\" icon=\"icons:info-outline\" class=\"icon-inline\"></iron-icon>\n <vcf-tooltip for=\"hint\" position=\"bottom\">\n <span class=\"text-s\"><foxy-i18n infer=\"\" key=\"fees_explainer\"></foxy-i18n></span>\n </vcf-tooltip>\n <span>\n &#8203;\n </div>\n </div>\n </div>\n\n <div\n data-testid=\"spinner\"\n class=${classMap({\n 'pointer-events-none absolute inset-0 flex transition ease-in-out duration-150': true,\n 'opacity-0': this.in({ idle: 'snapshot' }),\n })}\n >\n <foxy-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 ${this.renderTemplateOrSlot()}\n `;\n }\n\n private __getSummaryOptions() {\n if (this.data === null) return {};\n const items = this.data._embedded['fx:transaction_template']._embedded['fx:items'];\n\n return {\n most_expensive_item: [...items].sort((a, b) => a.price - b.price)[0],\n count_minus_one: items.length - 1,\n count: items.length,\n };\n }\n\n private __getPriceOptions() {\n if (this.data === null) return {};\n\n const cart = this.data._embedded['fx:transaction_template'];\n const amount = `${cart.total_order} ${cart.currency_code}`;\n return { ...parseFrequency(this.data.frequency), amount };\n }\n}\n"]}
1
+ {"version":3,"file":"SubscriptionCard.js","sourceRoot":"","sources":["../../../../src/elements/public/SubscriptionCard/SubscriptionCard.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PropertyDeclarations } from 'lit-element';\nimport type { Data, Settings } from './types';\n\nimport { TemplateResult, html } from 'lit-html';\n\nimport { ConfigurableMixin } from '../../../mixins/configurable';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { ResponsiveMixin } from '../../../mixins/responsive';\nimport { ThemeableMixin } from '../../../mixins/themeable';\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { classMap } from '../../../utils/class-map';\nimport { parseFrequency } from '../../../utils/parse-frequency';\n\nimport {\n getExtendedSubscriptionStatus,\n getSubscriptionStatus,\n} from '../../../utils/get-subscription-status';\n\nconst NS = 'subscription-card';\nconst Base = ConfigurableMixin(\n ResponsiveMixin(ThemeableMixin(TranslatableMixin(NucleonElement, NS)))\n);\n\n/**\n * Card element displaying subscription summary.\n *\n * @element foxy-subscription-card\n * @since 1.4.0\n */\nexport class SubscriptionCard extends Base<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n settings: { type: Object },\n };\n }\n\n settings: Settings | null = null;\n\n render(): TemplateResult {\n const status = this.settings\n ? getExtendedSubscriptionStatus(this.data, this.settings)\n : getSubscriptionStatus(this.data);\n\n const isRed = status === 'failed';\n const isGreen = status?.startsWith('next_payment') || !!status?.startsWith('will_end');\n const isNormal = !isGreen && !isRed;\n\n return html`\n <div class=\"relative text-left\">\n <div\n class=${classMap({\n 'flex items-start sm-items-center space-x-m transition duration-150 ease-in-out': true,\n 'opacity-0': !this.in({ idle: 'snapshot' }),\n })}\n >\n <div\n class=${classMap({\n 'min-w-0 flex-shrink-0 rounded-full relative flex p-s': true,\n 'text-success bg-success-10': isGreen,\n 'text-body bg-contrast-5': isNormal,\n 'text-error bg-error-10': isRed,\n })}\n >\n <iron-icon\n class=\"m-auto\"\n icon=${isRed ? 'error-outline' : isGreen ? 'done' : 'done-all'}\n >\n </iron-icon>\n </div>\n\n <div class=\"flex-1 min-w-0 leading-xs flex flex-col sm-flex-row sm-items-center\">\n <div class=\"order-1 sm-order-0\">\n <div class=\"text-body font-medium origin-top-left text-m\">\n <foxy-i18n\n data-testid=\"summary\"\n options=${JSON.stringify(this.__getSummaryOptions())}\n lang=${this.lang}\n key=\"transaction_summary\"\n ns=${this.ns}\n >\n </foxy-i18n>\n &#8203;\n </div>\n\n <div\n class=${classMap({\n 'text-m': true,\n 'text-tertiary': isNormal,\n 'text-success': isGreen,\n 'text-error': isRed,\n })}\n >\n <foxy-i18n\n data-testid=\"status\"\n lang=${this.lang}\n key=\"status_${status}\"\n ns=${this.ns}\n .options=${this.data}\n >\n </foxy-i18n>\n &#8203;\n </div>\n </div>\n\n <div\n class=\"flex-1 leading-xs mb-xs sm-mb-0 sm-text-right order-0 sm-order-1\"\n >\n <foxy-i18n\n data-testid=\"price\"\n options=${JSON.stringify(this.__getPriceOptions())}\n class=\"text-xxs sm-text-l font-tnum tracking-wide sm-tracking-normal uppercase sm-normal-case font-medium text-secondary sm-text-body sm-block\"\n lang=${this.lang}\n key=\"price${\n this.settings?.cart_display_config.show_sub_frequency ?? true\n ? `_${this.data?.frequency === '.5m' ? 'twice_a_month' : 'recurring'}`\n : ''\n }\"\n ns=${this.ns}\n >\n </foxy-i18n>\n <span class=\"text-secondary font-medium sm-font-normal sm-block text-xxs sm-text-s\">\n <span class=\"sm-hidden\">(</span><span class=\"hidden sm-inline\">*</span><foxy-i18n infer=\"\" key=\"fees_hint\"></foxy-i18n><span class=\"sm-hidden\">)</span>\n <iron-icon id=\"hint\" icon=\"icons:info-outline\" class=\"icon-inline\"></iron-icon>\n <vcf-tooltip for=\"hint\" position=\"bottom\">\n <span class=\"text-s\"><foxy-i18n infer=\"\" key=\"fees_explainer\"></foxy-i18n></span>\n </vcf-tooltip>\n <span>\n &#8203;\n </div>\n </div>\n </div>\n\n <div\n data-testid=\"spinner\"\n class=${classMap({\n 'pointer-events-none absolute inset-0 flex transition ease-in-out duration-150': true,\n 'opacity-0': this.in({ idle: 'snapshot' }),\n })}\n >\n <foxy-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 ${this.renderTemplateOrSlot()}\n `;\n }\n\n private __getSummaryOptions() {\n if (this.data === null) return {};\n const items = this.data._embedded['fx:transaction_template']._embedded['fx:items'];\n\n return {\n most_expensive_item: [...items].sort((a, b) => a.price - b.price)[0],\n count_minus_one: items.length - 1,\n count: items.length,\n };\n }\n\n private __getPriceOptions() {\n if (this.data === null) return {};\n\n const cart = this.data._embedded['fx:transaction_template'];\n const amount = `${cart.total_order} ${cart.currency_code}`;\n return { ...parseFrequency(this.data.frequency), amount };\n }\n}\n"]}
@@ -1,8 +1,10 @@
1
+ import type { Rels as CustomerRels } from '@foxy.io/sdk/customer';
2
+ import type { Rels as BackendRels } from '@foxy.io/sdk/backend';
1
3
  import type { Resource } from '@foxy.io/sdk/core';
2
- import type { Rels } from '@foxy.io/sdk/backend';
3
- export declare type Rel = Rels.Subscription;
4
+ export declare type Settings = Resource<CustomerRels.CustomerPortalSettings>;
4
5
  export declare type Data = Resource<Rel, {
5
6
  zoom: {
6
7
  transaction_template: 'items';
7
8
  };
8
9
  }>;
10
+ export declare type Rel = BackendRels.Subscription;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/elements/public/SubscriptionCard/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Resource } from '@foxy.io/sdk/core';\nimport type { Rels } from '@foxy.io/sdk/backend';\n\nexport type Rel = Rels.Subscription;\nexport type Data = Resource<Rel, { zoom: { transaction_template: 'items' } }>;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/elements/public/SubscriptionCard/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Rels as CustomerRels } from '@foxy.io/sdk/customer';\nimport type { Rels as BackendRels } from '@foxy.io/sdk/backend';\nimport type { Resource } from '@foxy.io/sdk/core';\n\nexport type Settings = Resource<CustomerRels.CustomerPortalSettings>;\nexport type Data = Resource<Rel, { zoom: { transaction_template: 'items' } }>;\nexport type Rel = BackendRels.Subscription;\n"]}
@@ -1,5 +1,4 @@
1
1
  import { Choice, Group, Skeleton } from "../../private/index.js";
2
- import { getSubscriptionStatus } from "../../../utils/get-subscription-status.js";
3
2
  import { ScopedElementsMixin } from '@open-wc/scoped-elements';
4
3
  import { TranslatableMixin } from "../../../mixins/translatable.js";
5
4
  import { BooleanSelector } from '@foxy.io/sdk/core';
@@ -10,6 +9,7 @@ import { InternalForm } from "../../internal/InternalForm/InternalForm.js";
10
9
  import { ifDefined } from 'lit-html/directives/if-defined';
11
10
  import { classMap } from "../../../utils/class-map.js";
12
11
  import { html } from 'lit-html';
12
+ import { getExtendedSubscriptionStatus, getSubscriptionStatus, } from "../../../utils/get-subscription-status.js";
13
13
  import { getNextTransactionDateConstraints, getAllowedFrequencies, isNextTransactionDate, } from '@foxy.io/sdk/customer';
14
14
  const NS = 'subscription-form';
15
15
  const Base = ScopedElementsMixin(ResponsiveMixin(TranslatableMixin(InternalForm, NS)));
@@ -38,12 +38,12 @@ export class SubscriptionForm extends Base {
38
38
  this.__storeLoaderId = 'storeLoader';
39
39
  this.__renderItemsActions = () => {
40
40
  return html `
41
- <div class="flex" data-testid="items:actions">
41
+ <div class="flex items-center gap-s text-m" data-testid="items:actions">
42
42
  ${this.renderTemplateOrSlot('items:actions:before')}
43
43
 
44
44
  <foxy-i18n
45
45
  data-testid="items:actions-label"
46
- class="flex-1 text-s font-medium text-secondary"
46
+ class="flex-1 text-l font-medium text-body leading-m"
47
47
  lang=${this.lang}
48
48
  key="item_plural"
49
49
  ns=${this.ns}
@@ -74,7 +74,7 @@ export class SubscriptionForm extends Base {
74
74
  first=${ifDefined(itemsHref)}
75
75
  infer="items"
76
76
  item="foxy-item-card"
77
- .itemProps=${{ 'locale-codes': this.localeCodes }}
77
+ .itemProps=${{ 'locale-codes': this.localeCodes, '.settings': this.settings }}
78
78
  >
79
79
  </foxy-internal-async-list-control>
80
80
  </div>
@@ -259,7 +259,7 @@ export class SubscriptionForm extends Base {
259
259
  <div data-testid="customer" class="sm-col-span-2">
260
260
  ${this.renderTemplateOrSlot('customer:before')}
261
261
 
262
- <foxy-i18n infer="customer" class="block text-s font-medium leading-xs mb-xs" key="label">
262
+ <foxy-i18n infer="customer" class="block text-l font-medium leading-xs mb-s" key="label">
263
263
  </foxy-i18n>
264
264
 
265
265
  <a
@@ -319,13 +319,15 @@ export class SubscriptionForm extends Base {
319
319
  return new BooleanSelector(`items:pagination:card:autorenew-icon ${super.hiddenSelector}`);
320
320
  }
321
321
  get headerTitleOptions() {
322
+ var _a, _b;
322
323
  if (this.data && this.__currencyCode) {
323
324
  const frequency = parseFrequency(this.data.frequency);
324
325
  const transactionTemplate = this.__transactionTemplate;
325
326
  const total = transactionTemplate === null || transactionTemplate === void 0 ? void 0 : transactionTemplate.total_order;
326
327
  const amount = `${total} ${this.__currencyCode}`;
327
328
  const currencyDisplay = this.__currencyDisplay;
328
- const context = this.__currencyCode
329
+ const showSubFrequency = (_b = (_a = this.settings) === null || _a === void 0 ? void 0 : _a.cart_display_config.show_sub_frequency) !== null && _b !== void 0 ? _b : true;
330
+ const context = this.__currencyCode && showSubFrequency
329
331
  ? this.data.frequency === '.5m'
330
332
  ? 'twice_a_month'
331
333
  : 'recurring'
@@ -337,7 +339,9 @@ export class SubscriptionForm extends Base {
337
339
  }
338
340
  }
339
341
  get headerSubtitleKey() {
340
- const status = getSubscriptionStatus(this.data);
342
+ const status = this.settings
343
+ ? getExtendedSubscriptionStatus(this.data, this.settings)
344
+ : getSubscriptionStatus(this.data);
341
345
  return status ? `subtitle_${status}` : super.headerSubtitleKey;
342
346
  }
343
347
  renderBody() {
@@ -506,6 +510,7 @@ export class SubscriptionForm extends Base {
506
510
  return (_b = (_a = this.renderRoot.querySelector(selector)) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : null;
507
511
  }
508
512
  get __isNextTransactionDateVisible() {
513
+ var _a;
509
514
  if (this.hiddenSelector.matches('next-transaction-date', true))
510
515
  return false;
511
516
  if (this.data === null)
@@ -514,14 +519,19 @@ export class SubscriptionForm extends Base {
514
519
  return false;
515
520
  if (this.data.is_active === false)
516
521
  return false;
522
+ if (((_a = this.settings) === null || _a === void 0 ? void 0 : _a.cart_display_config.show_sub_nextdate) === false)
523
+ return false;
517
524
  if (this.settings === null)
518
525
  return true;
519
526
  const rules = this.settings.subscriptions.allow_next_date_modification;
520
527
  return !!getNextTransactionDateConstraints(this.data, rules);
521
528
  }
522
529
  get __isStartDateVisible() {
530
+ var _a;
523
531
  if (this.hiddenSelector.matches('start-date', true))
524
532
  return false;
533
+ if (((_a = this.settings) === null || _a === void 0 ? void 0 : _a.cart_display_config.show_sub_startdate) === false)
534
+ return false;
525
535
  return this.__isNextTransactionDateVisible;
526
536
  }
527
537
  get __isEndDateVisible() {
@@ -560,6 +570,7 @@ export class SubscriptionForm extends Base {
560
570
  return this.settings === null;
561
571
  }
562
572
  get __isFrequencyVisible() {
573
+ var _a;
563
574
  if (this.hiddenSelector.matches('frequency', true))
564
575
  return false;
565
576
  if (this.data === null)
@@ -568,6 +579,8 @@ export class SubscriptionForm extends Base {
568
579
  return false;
569
580
  if (this.data.is_active === false)
570
581
  return false;
582
+ if (((_a = this.settings) === null || _a === void 0 ? void 0 : _a.cart_display_config.show_sub_frequency) === false)
583
+ return false;
571
584
  if (this.settings === null)
572
585
  return true;
573
586
  const allowedFrequencies = getAllowedFrequencies({