@sonic-equipment/ui 151.0.0 → 153.0.0

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.
@@ -32,7 +32,7 @@ function InternalAddToCartButton({ initialState = 'initial', isDisabled = false,
32
32
  _onChange(quantity);
33
33
  setQuantity(quantity);
34
34
  }, [_onChange]);
35
- return (jsxs("div", { "data-test-selector": "addToCartButton", children: [currentState === 'initial' && (jsx(InitialState, { isDisabled: isDisabled, onAddToCart: () => onChange(1) })), currentState === 'spinner' && (jsx(SpinnerState, { isDisabled: isDisabled, onChange: onChange, onManualInput: value => {
35
+ return (jsxs("div", { className: styles['add-to-cart-button'], "data-test-selector": "addToCartButton", children: [currentState === 'initial' && (jsx(InitialState, { isDisabled: isDisabled, onAddToCart: () => onChange(1) })), currentState === 'spinner' && (jsx(SpinnerState, { isDisabled: isDisabled, onChange: onChange, onManualInput: value => {
36
36
  setManualInputQuantity(value);
37
37
  setState('manual-input');
38
38
  }, quantity: quantity }, quantity)), currentState === 'manual-input' && (jsx(ManualInputState, { isDisabled: isDisabled, onCancel: () => setState('spinner'), onConfirm: onChange, quantity: manualInputQuantity || '' }))] }));
@@ -78,18 +78,18 @@ function ManualInputState({ isDisabled, onCancel, onConfirm, quantity, }) {
78
78
  const [updatedQuantity, setQuantity] = useState(quantity);
79
79
  const onKeyUp = (e) => {
80
80
  if (e.key === 'Enter')
81
- onConfirm(ensureNumber(updatedQuantity));
81
+ onConfirm(ensureNumber(updatedQuantity, 0));
82
82
  if (e.key === 'Escape')
83
83
  onCancel();
84
84
  };
85
- return (jsxs("div", { className: styles['manual-input-container'], children: [jsx("div", { className: styles['left-button-spacer'] }), jsx(NumberField, { autoFocus: true, autoGrow: true, "data-test-selector": "quantity", defaultValue: quantity ? ensureNumber(quantity) : undefined, formatOptions: {
85
+ return (jsxs("div", { className: styles['manual-input-container'], children: [jsx("div", { className: styles['left-button-spacer'] }), jsx(NumberField, { autoFocus: true, autoGrow: true, "data-test-selector": "quantity", defaultValue: quantity ? ensureNumber(quantity, 0) : undefined, formatOptions: {
86
86
  maximumFractionDigits: 0,
87
87
  style: 'decimal',
88
88
  useGrouping: false,
89
89
  }, isDisabled: isDisabled, label: "Quantity", maxLength: 4, maxValue: 9999, minValue: 0, name: "quantity", onChange: value => setQuantity(String(value)), onKeyUp: onKeyUp, showLabel: false, size: "md" }), jsx(Button, { condensed: true, "data-test-selector": "confirm", isDisabled: isDisabled, onClick: e => {
90
90
  e.preventDefault();
91
91
  e.stopPropagation();
92
- onConfirm(ensureNumber(updatedQuantity));
92
+ onConfirm(ensureNumber(updatedQuantity, 0));
93
93
  }, size: "md", children: "OK" })] }));
94
94
  }
95
95
 
@@ -1,3 +1,3 @@
1
- var styles = {"manual-input-container":"add-to-cart-button-module-AWFvQ","left-button-spacer":"add-to-cart-button-module-SS7WM"};
1
+ var styles = {"add-to-cart-button":"add-to-cart-button-module-GdrDp","manual-input-container":"add-to-cart-button-module-AWFvQ","left-button-spacer":"add-to-cart-button-module-SS7WM"};
2
2
 
3
3
  export { styles as default };
@@ -12,7 +12,7 @@ import styles from './orderline-card.module.css.js';
12
12
 
13
13
  function OrderLineCard(props) {
14
14
  const { deliveryDate, href, image, isReadonly, price, productId, sku, tags, title, } = props;
15
- return (jsxs(RouteLink, { className: clsx(styles['orderline-card'], isReadonly && styles.readonly), href: href, id: productId, isDisabled: isReadonly, children: [jsx("div", { className: styles['image-container'], role: "presentation", children: jsx(Image, { ...image }) }), jsx(Heading, { className: styles.title, size: "xxxs", tag: "h3", children: title }), tags && tags.length > 0 && (jsx("div", { className: styles.tags, children: tags.map(tag => (jsx(Tag, { children: jsx(FormattedMessage, { fallbackValue: tag, id: `tag.${tag.toLowerCase()}` }) }, tag))) })), jsx(ProductSku, { className: styles.sku, sku: sku }), isReadonly ? (jsx("p", { className: styles.amount, children: jsx(FormattedMessage, { id: "Amount: {0}", replacementValues: { '0': props.quantity.toString() } }) })) : (jsx("div", { className: styles['add-to-cart-button'], children: props.addToCartButton })), jsx(Price, { className: styles.price, currencyCode: price.currencyCode, originalPrice: price.originalTotalPrice, price: price.totalPrice, pricePerUnit: price.pricePerUnit, variant: "sonic" }), deliveryDate && (jsx(DeliveryTime, { className: styles.delivery, deliveryDate: deliveryDate })), !isReadonly && jsx("div", { className: styles.remove, children: props.removeButton })] }));
15
+ return (jsxs(RouteLink, { className: clsx(styles['orderline-card'], isReadonly && styles.readonly), href: href, id: productId, isDisabled: isReadonly, children: [jsx("div", { className: styles['image-container'], role: "presentation", children: jsx(Image, { ...image, fit: "contain" }) }), jsx(Heading, { className: styles.title, size: "xxxs", tag: "h3", children: title }), tags && tags.length > 0 && (jsx("div", { className: styles.tags, children: tags.map(tag => (jsx(Tag, { children: jsx(FormattedMessage, { fallbackValue: tag, id: `tag.${tag.toLowerCase()}` }) }, tag))) })), jsx(ProductSku, { className: styles.sku, sku: sku }), isReadonly ? (jsx("p", { className: styles.amount, children: jsx(FormattedMessage, { id: "Amount: {0}", replacementValues: { '0': props.quantity.toString() } }) })) : (jsx("div", { className: styles['add-to-cart-button'], children: props.addToCartButton })), jsx(Price, { className: styles.price, currencyCode: price.currencyCode, originalPrice: price.originalTotalPrice, price: price.totalPrice, pricePerUnit: price.pricePerUnit, variant: "sonic" }), deliveryDate && (jsx(DeliveryTime, { className: styles.delivery, deliveryDate: deliveryDate })), !isReadonly && jsx("div", { className: styles.remove, children: props.removeButton })] }));
16
16
  }
17
17
 
18
18
  export { OrderLineCard };
@@ -10,7 +10,7 @@ import { Heading } from '../../typography/heading/heading.js';
10
10
  import styles from './product-card.module.css.js';
11
11
 
12
12
  function ProductCard({ addToCartButton: AddToCartButton, favoriteButton: FavoriteButton, href, id, image, onClick, price, sku, tags, title, }) {
13
- return (jsx("div", { className: styles['product-card-container'], children: jsxs(RouteLink, { className: styles['product-card'], "data-product-id": sku, href: href, id: id, onClick: onClick, children: [jsx("div", { className: styles['image-container'], children: jsx(Image, { ...image }) }), jsx("div", { className: styles['favorite-button'], children: FavoriteButton && FavoriteButton }), tags && tags.length > 0 && (jsx("div", { className: styles.tags, children: tags.map(tag => (jsx(Tag, { children: jsx(FormattedMessage, { fallbackValue: tag, id: `tag.${tag.toLowerCase()}` }) }, tag))) })), jsx(Heading, { className: styles.title, size: "xxxs", tag: "h2", children: title }), jsx(ProductSku, { className: styles.sku, sku: sku }), jsx(Price, { className: styles.price, currencyCode: price.currencyCode, isVatIncluded: price.isVatIncluded, originalPrice: price.originalPrice, price: price.price, variant: "sonic" }), jsx("div", { className: styles['add-to-cart-button'], children: AddToCartButton })] }) }));
13
+ return (jsx("div", { className: styles['product-card-container'], children: jsxs(RouteLink, { className: styles['product-card'], "data-product-id": sku, href: href, id: id, onClick: onClick, children: [jsx("div", { className: styles['image-container'], children: jsx(Image, { ...image, fit: "contain" }) }), jsx("div", { className: styles['favorite-button'], children: FavoriteButton && FavoriteButton }), tags && tags.length > 0 && (jsx("div", { className: styles.tags, children: tags.map(tag => (jsx(Tag, { children: jsx(FormattedMessage, { fallbackValue: tag, id: `tag.${tag.toLowerCase()}` }) }, tag))) })), jsx(Heading, { className: styles.title, size: "xxxs", tag: "h2", children: title }), jsx(ProductSku, { className: styles.sku, sku: sku }), jsx(Price, { className: styles.price, currencyCode: price.currencyCode, isVatIncluded: price.isVatIncluded, originalPrice: price.originalPrice, price: price.price, variant: "sonic" }), jsx("div", { className: styles['add-to-cart-button'], children: AddToCartButton })] }) }));
14
14
  }
15
15
 
16
16
  export { ProductCard };
@@ -18,6 +18,7 @@ import { useToast } from '../../../toast/use-toast.js';
18
18
  import { useFetchCurrentCartLinesWithAtp } from '../../../shared/api/storefront/hooks/cart/use-fetch-current-cart-lines-with-atp.js';
19
19
  import { useFetchCurrentCartWithAtp } from '../../../shared/api/storefront/hooks/cart/use-fetch-current-cart-with-atp.js';
20
20
  import { getCurrencyCodeBySymbol } from '../../../shared/model/currency.js';
21
+ import { ensureNumber } from '../../../shared/utils/number.js';
21
22
  import { PATHS } from '../../paths.js';
22
23
  import { EmptyCart } from './components/empty-cart-page.js';
23
24
 
@@ -96,7 +97,7 @@ function CartContent({ cartLines }) {
96
97
  title: cartLine.altText,
97
98
  }, isReadonly: false, onRemove: () => deleteCartLine.mutate({ cartLineId: cartLine.id }), orderLineId: cartLine.id, price: {
98
99
  currencyCode,
99
- originalTotalPrice: cartLine.pricing?.extendedUnitNetPrice || 0,
100
+ originalTotalPrice: ensureNumber(cartLine.properties.totalListPrice),
100
101
  pricePerUnit: cartLine.pricing?.unitNetPrice || 0,
101
102
  totalPrice: cartLine.pricing?.extendedUnitNetPrice || 0,
102
103
  }, productId: cartLine.productId || '', sku: cartLine.erpNumber || '', tags: [], title: cartLine.productName }, cartLine.id))) }) }));
@@ -11,6 +11,7 @@ import { useSaveCartForLater } from '../../../shared/api/storefront/hooks/cart/u
11
11
  import { getCurrencyCodeBySymbol } from '../../../shared/model/currency.js';
12
12
  import { RouteButton } from '../../../shared/routing/route-button.js';
13
13
  import { formatDateToLocaleString } from '../../../shared/utils/date.js';
14
+ import { ensureNumber } from '../../../shared/utils/number.js';
14
15
  import { useToast } from '../../../toast/use-toast.js';
15
16
  import { Page } from '../../components/page/page.js';
16
17
  import { PATHS } from '../../paths.js';
@@ -85,7 +86,7 @@ function OrderConfirmationPageContent({ cart, }) {
85
86
  title: cartLine.altText,
86
87
  }, isReadonly: true, price: {
87
88
  currencyCode,
88
- originalTotalPrice: cartLine.pricing?.extendedUnitNetPrice || 0,
89
+ originalTotalPrice: ensureNumber(cartLine.properties.totalListPrice),
89
90
  pricePerUnit: cartLine.pricing?.unitNetPrice || 0,
90
91
  totalPrice: cartLine.pricing?.extendedUnitNetPrice || 0,
91
92
  }, productId: cartLine.productId || '', quantity: cartLine.qtyOrdered || 1, sku: cartLine.erpNumber || '', tags: [], title: cartLine.productName }, cartLine.id))) }) }) })] }) }) }));
@@ -7,6 +7,7 @@ import { FormattedMessage } from '../../../intl/formatted-message.js';
7
7
  import { useFormattedMessage } from '../../../intl/use-formatted-message.js';
8
8
  import { OrderLineList } from '../../../lists/orderline-list/orderline-list.js';
9
9
  import { getCurrencyCodeBySymbol } from '../../../shared/model/currency.js';
10
+ import { ensureNumber } from '../../../shared/utils/number.js';
10
11
  import { Page } from '../../components/page/page.js';
11
12
  import { PATHS } from '../../paths.js';
12
13
  import { CheckoutPageLayout } from '../layouts/checkout-page-layout/checkout-page-layout.js';
@@ -39,7 +40,7 @@ function PaymentPageContent({ atp, cart, formId, hasAtp, isProcessing, isValidat
39
40
  title: cartLine.altText,
40
41
  }, isReadonly: true, price: {
41
42
  currencyCode,
42
- originalTotalPrice: cartLine.pricing?.extendedUnitNetPrice || 0,
43
+ originalTotalPrice: ensureNumber(cartLine.properties.totalListPrice),
43
44
  pricePerUnit: cartLine.pricing?.unitNetPrice || 0,
44
45
  totalPrice: cartLine.pricing?.extendedUnitNetPrice || 0,
45
46
  }, productId: cartLine.productId || '', quantity: cartLine.qtyOrdered || 1, sku: cartLine.erpNumber || '', tags: [], title: cartLine.productName }, cartLine.id))) }) }) })] }) }));
@@ -861,6 +861,10 @@ export interface CartLineModel extends BaseModel {
861
861
  productName: string;
862
862
  productSubscription: ProductSubscriptionDto | null;
863
863
  productUri: string;
864
+ properties: {
865
+ [key: string]: string;
866
+ totalListPrice: string;
867
+ };
864
868
  qtyLeft: number;
865
869
  qtyOnHand: number;
866
870
  qtyOrdered: number | null;
@@ -257,7 +257,7 @@ const cart = {
257
257
  subscriptionTotalCycles: 0,
258
258
  },
259
259
  productUri: '/Product/4311165-High-leverage-combination-pliers-6',
260
- properties: {},
260
+ properties: { totalListPrice: '30.32' },
261
261
  qtyLeft: 0,
262
262
  qtyOnHand: 0,
263
263
  qtyOrdered: 1,
@@ -1,3 +1,5 @@
1
+ import { ensureNumber } from '../utils/number.js';
2
+
1
3
  function transformAlgoliaPromoHitToPromoHit(algoliaPromoHit) {
2
4
  return {
3
5
  hit: algoliaPromoHit,
@@ -27,9 +29,7 @@ function transformAlgoliaProductHitToProductHit(algoliaProductHit) {
27
29
  name: algoliaProductHit.name,
28
30
  objectId: algoliaProductHit.objectID,
29
31
  originalPrice: algoliaProductHit.originalPrice,
30
- position: Number.isNaN(Number.parseFloat(String(algoliaProductHit.__position)))
31
- ? 0
32
- : Number.parseFloat(String(algoliaProductHit.__position)),
32
+ position: ensureNumber(String(algoliaProductHit.__position), 0),
33
33
  price: algoliaProductHit.price,
34
34
  queryId: algoliaProductHit.__autocomplete_queryID === undefined
35
35
  ? undefined
@@ -1 +1,2 @@
1
- export declare const ensureNumber: (value: unknown, defaultNumber?: number) => number;
1
+ export declare function ensureNumber(value: unknown, defaultNumber: number): number;
2
+ export declare function ensureNumber(value: unknown): number | undefined;
@@ -1,10 +1,10 @@
1
- const ensureNumber = (value, defaultNumber = 0) => {
1
+ function ensureNumber(value, defaultNumber) {
2
2
  if (typeof value === 'number')
3
3
  return value;
4
4
  if (typeof value !== 'string')
5
5
  return defaultNumber;
6
6
  const numberValue = Number.parseFloat(value);
7
7
  return Number.isNaN(numberValue) ? defaultNumber : numberValue;
8
- };
8
+ }
9
9
 
10
10
  export { ensureNumber };
package/dist/styles.css CHANGED
@@ -1710,6 +1710,10 @@
1710
1710
  }
1711
1711
  }
1712
1712
 
1713
+ .add-to-cart-button-module-GdrDp {
1714
+ display: flex;
1715
+ }
1716
+
1713
1717
  .add-to-cart-button-module-AWFvQ {
1714
1718
  display: inline-flex;
1715
1719
  flex-direction: row;
@@ -2896,7 +2900,7 @@
2896
2900
  }
2897
2901
 
2898
2902
  .orderline-card-module-AMTMm .orderline-card-module-TlhUg {
2899
- display: grid;
2903
+ display: flex;
2900
2904
  aspect-ratio: 1;
2901
2905
  block-size: 100%;
2902
2906
  grid-area: image;
@@ -2933,12 +2937,10 @@
2933
2937
 
2934
2938
  @container (inline-size >= 576px) {.orderline-card-module-AMTMm {
2935
2939
  padding: 32px 64px 32px 0;
2936
- grid-template:
2937
- repeat(3, minmax(0, min-content)) minmax(8px, 1fr) repeat(
2940
+ grid-template: repeat(3, minmax(0, min-content)) minmax(8px, 1fr) repeat(
2938
2941
  2,
2939
2942
  minmax(0, min-content)
2940
- )
2941
- / 143px 1fr auto;
2943
+ ) / 143px 1fr auto;
2942
2944
  grid-template-areas:
2943
2945
  'image tags tags'
2944
2946
  'image title title'
@@ -3000,8 +3002,7 @@
3000
3002
  var(--space-8),
3001
3003
  1fr
3002
3004
  )
3003
- repeat(2, minmax(0, min-content))
3004
- / 1fr;
3005
+ repeat(2, minmax(0, min-content)) / 1fr;
3005
3006
  grid-template-areas:
3006
3007
  'image'
3007
3008
  '.'
@@ -3070,7 +3071,6 @@
3070
3071
  }
3071
3072
 
3072
3073
  .product-card-module-pLaiB .product-card-module-irW0D {
3073
- overflow: hidden;
3074
3074
  grid-area: price;
3075
3075
  margin-block-end: var(--space-8);
3076
3076
  place-self: flex-end flex-end;
@@ -3093,13 +3093,10 @@
3093
3093
  .product-card-module-pLaiB {
3094
3094
  --box-shadow: var(--box-shadow-heavy);
3095
3095
 
3096
- grid-template:
3097
- 204px var(--space-8) repeat(3, minmax(0, min-content)) minmax(
3096
+ grid-template: 204px var(--space-8) repeat(3, minmax(0, min-content)) minmax(
3098
3097
  var(--space-16),
3099
3098
  1fr
3100
- )
3101
- minmax(0, min-content)
3102
- / 1fr auto;
3099
+ ) minmax(0, min-content) / 1fr minmax(0, min-content);
3103
3100
  grid-template-areas:
3104
3101
  'image image'
3105
3102
  '. .'
@@ -3946,9 +3943,7 @@
3946
3943
 
3947
3944
  @media (width >= 768px) {
3948
3945
  .usp-carousel-module-UCbpX .usp-carousel-module-msaeJ {
3949
- left: calc(
3950
- ((100% - var(--image-max-width)) / 2) + var(--image-max-width)
3951
- );
3946
+ left: calc((100% - var(--image-max-width)) / 2 + var(--image-max-width));
3952
3947
  }
3953
3948
  }
3954
3949
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonic-equipment/ui",
3
- "version": "151.0.0",
3
+ "version": "153.0.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "engines": {