@sonic-equipment/ui 151.0.0 → 152.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.
- package/dist/buttons/add-to-cart-button/add-to-cart-button.js +4 -4
- package/dist/buttons/add-to-cart-button/add-to-cart-button.module.css.js +1 -1
- package/dist/cards/orderline-card/orderline-card.js +1 -1
- package/dist/cards/product-card/product-card.js +1 -1
- package/dist/pages/checkout/cart-page/cart-page.js +2 -1
- package/dist/pages/checkout/order-confirmation-page/order-confirmation-page-content.js +2 -1
- package/dist/pages/checkout/payment-page/payment-page-content.js +2 -1
- package/dist/shared/api/storefront/model/storefront.model.d.ts +4 -0
- package/dist/shared/data/cart.data.js +1 -1
- package/dist/shared/model/hit.js +3 -3
- package/dist/shared/utils/number.d.ts +2 -1
- package/dist/shared/utils/number.js +2 -2
- package/dist/styles.css +6 -3
- package/package.json +1 -1
|
@@ -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.
|
|
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.
|
|
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.
|
|
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;
|
package/dist/shared/model/hit.js
CHANGED
|
@@ -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:
|
|
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
|
|
1
|
+
export declare function ensureNumber(value: unknown, defaultNumber: number): number;
|
|
2
|
+
export declare function ensureNumber(value: unknown): number | undefined;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
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:
|
|
2903
|
+
display: flex;
|
|
2900
2904
|
aspect-ratio: 1;
|
|
2901
2905
|
block-size: 100%;
|
|
2902
2906
|
grid-area: image;
|
|
@@ -3070,7 +3074,6 @@
|
|
|
3070
3074
|
}
|
|
3071
3075
|
|
|
3072
3076
|
.product-card-module-pLaiB .product-card-module-irW0D {
|
|
3073
|
-
overflow: hidden;
|
|
3074
3077
|
grid-area: price;
|
|
3075
3078
|
margin-block-end: var(--space-8);
|
|
3076
3079
|
place-self: flex-end flex-end;
|
|
@@ -3099,7 +3102,7 @@
|
|
|
3099
3102
|
1fr
|
|
3100
3103
|
)
|
|
3101
3104
|
minmax(0, min-content)
|
|
3102
|
-
/ 1fr
|
|
3105
|
+
/ 1fr minmax(0, min-content);
|
|
3103
3106
|
grid-template-areas:
|
|
3104
3107
|
'image image'
|
|
3105
3108
|
'. .'
|