@eventlook/sdk 1.4.46-beta.7 → 1.4.46
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/.claude/settings.local.json +9 -0
- package/dist/cjs/components/Image.js +29 -14
- package/dist/cjs/components/Image.js.map +1 -1
- package/dist/cjs/components/hook-form/FormProvider.js +2 -2
- package/dist/cjs/components/hook-form/FormProvider.js.map +1 -1
- package/dist/cjs/form/ChildEventDialog.js +3 -3
- package/dist/cjs/form/ChildEventDialog.js.map +1 -1
- package/dist/cjs/form/ContactPerson.js +1 -1
- package/dist/cjs/form/ContactPerson.js.map +1 -1
- package/dist/cjs/form/Payment.js +2 -2
- package/dist/cjs/form/Payment.js.map +1 -1
- package/dist/cjs/form/PaymentOverviewBox.js +61 -47
- package/dist/cjs/form/PaymentOverviewBox.js.map +1 -1
- package/dist/cjs/form/PaymentPending.js +4 -1
- package/dist/cjs/form/PaymentPending.js.map +1 -1
- package/dist/cjs/form/ReleaseWithMerchandise.js +48 -57
- package/dist/cjs/form/ReleaseWithMerchandise.js.map +1 -1
- package/dist/cjs/form/TicketForm.js +25 -43
- package/dist/cjs/form/TicketForm.js.map +1 -1
- package/dist/cjs/form/TicketSelection.js +6 -5
- package/dist/cjs/form/TicketSelection.js.map +1 -1
- package/dist/cjs/form/TicketWithMerchandiseSelection.js +5 -3
- package/dist/cjs/form/TicketWithMerchandiseSelection.js.map +1 -1
- package/dist/cjs/form/index.js +1 -1
- package/dist/cjs/form/index.js.map +1 -1
- package/dist/cjs/form/payment/FeeBox.js +16 -4
- package/dist/cjs/form/payment/FeeBox.js.map +1 -1
- package/dist/cjs/form/payment/PaymentOverviewCheckbox.js +28 -34
- package/dist/cjs/form/payment/PaymentOverviewCheckbox.js.map +1 -1
- package/dist/cjs/form/product/ProductCard.js +36 -117
- package/dist/cjs/form/product/ProductCard.js.map +1 -1
- package/dist/cjs/form/product/ProductVariantsDialog.js +96 -158
- package/dist/cjs/form/product/ProductVariantsDialog.js.map +1 -1
- package/dist/cjs/locales/cs.js +2 -17
- package/dist/cjs/locales/cs.js.map +1 -1
- package/dist/cjs/locales/en.js +2 -17
- package/dist/cjs/locales/en.js.map +1 -1
- package/dist/cjs/locales/es.js +1 -16
- package/dist/cjs/locales/es.js.map +1 -1
- package/dist/cjs/locales/pl.js +1 -16
- package/dist/cjs/locales/pl.js.map +1 -1
- package/dist/cjs/locales/sk.js +1 -16
- package/dist/cjs/locales/sk.js.map +1 -1
- package/dist/cjs/locales/uk.js +1 -16
- package/dist/cjs/locales/uk.js.map +1 -1
- package/dist/cjs/utils/data/global.js +0 -2
- package/dist/cjs/utils/data/global.js.map +1 -1
- package/dist/esm/components/Image.js +30 -15
- package/dist/esm/components/Image.js.map +1 -1
- package/dist/esm/components/hook-form/FormProvider.js +2 -2
- package/dist/esm/components/hook-form/FormProvider.js.map +1 -1
- package/dist/esm/form/ChildEventDialog.js +3 -3
- package/dist/esm/form/ChildEventDialog.js.map +1 -1
- package/dist/esm/form/ContactPerson.js +1 -1
- package/dist/esm/form/ContactPerson.js.map +1 -1
- package/dist/esm/form/Payment.js +2 -2
- package/dist/esm/form/Payment.js.map +1 -1
- package/dist/esm/form/PaymentOverviewBox.js +62 -48
- package/dist/esm/form/PaymentOverviewBox.js.map +1 -1
- package/dist/esm/form/PaymentPending.js +4 -1
- package/dist/esm/form/PaymentPending.js.map +1 -1
- package/dist/esm/form/ReleaseWithMerchandise.js +49 -58
- package/dist/esm/form/ReleaseWithMerchandise.js.map +1 -1
- package/dist/esm/form/TicketForm.js +27 -45
- package/dist/esm/form/TicketForm.js.map +1 -1
- package/dist/esm/form/TicketSelection.js +6 -5
- package/dist/esm/form/TicketSelection.js.map +1 -1
- package/dist/esm/form/TicketWithMerchandiseSelection.js +6 -4
- package/dist/esm/form/TicketWithMerchandiseSelection.js.map +1 -1
- package/dist/esm/form/index.js +1 -1
- package/dist/esm/form/index.js.map +1 -1
- package/dist/esm/form/payment/FeeBox.js +17 -5
- package/dist/esm/form/payment/FeeBox.js.map +1 -1
- package/dist/esm/form/payment/PaymentOverviewCheckbox.js +30 -36
- package/dist/esm/form/payment/PaymentOverviewCheckbox.js.map +1 -1
- package/dist/esm/form/product/ProductCard.js +37 -118
- package/dist/esm/form/product/ProductCard.js.map +1 -1
- package/dist/esm/form/product/ProductVariantsDialog.js +98 -160
- package/dist/esm/form/product/ProductVariantsDialog.js.map +1 -1
- package/dist/esm/locales/cs.js +2 -17
- package/dist/esm/locales/cs.js.map +1 -1
- package/dist/esm/locales/en.js +2 -17
- package/dist/esm/locales/en.js.map +1 -1
- package/dist/esm/locales/es.js +1 -16
- package/dist/esm/locales/es.js.map +1 -1
- package/dist/esm/locales/pl.js +1 -16
- package/dist/esm/locales/pl.js.map +1 -1
- package/dist/esm/locales/sk.js +1 -16
- package/dist/esm/locales/sk.js.map +1 -1
- package/dist/esm/locales/uk.js +1 -16
- package/dist/esm/locales/uk.js.map +1 -1
- package/dist/esm/utils/data/global.js +1 -2
- package/dist/esm/utils/data/global.js.map +1 -1
- package/dist/types/components/Image.d.ts +4 -4
- package/dist/types/form/style.d.ts +1 -1
- package/package.json +2 -8
- package/rollup.config.mjs +0 -2
- package/src/components/Image.tsx +48 -27
- package/src/components/hook-form/FormProvider.tsx +2 -5
- package/src/form/ChildEventDialog.tsx +3 -3
- package/src/form/ContactPerson.tsx +1 -1
- package/src/form/MerchandiseSelection.tsx +29 -0
- package/src/form/Payment.tsx +2 -2
- package/src/form/PaymentOverviewBox.tsx +122 -89
- package/src/form/PaymentPending.tsx +1 -1
- package/src/form/ReleaseWithMerchandise.tsx +230 -0
- package/src/form/TicketForm.tsx +25 -63
- package/src/form/{tickets/TicketSelection.tsx → TicketSelection.tsx} +128 -24
- package/src/form/{tickets/TicketSelectionMap.tsx → TicketSelectionMap.tsx} +1 -9
- package/src/form/{tickets/TicketWithMerchandiseSelection.tsx → TicketWithMerchandiseSelection.tsx} +7 -3
- package/src/form/index.tsx +1 -3
- package/src/form/payment/FeeBox.tsx +31 -4
- package/src/form/payment/PaymentOverviewCheckbox.tsx +56 -57
- package/src/form/product/ProductCard.tsx +59 -179
- package/src/form/product/ProductVariantsDialog.tsx +140 -253
- package/src/locales/cs.tsx +2 -17
- package/src/locales/en.tsx +2 -17
- package/src/locales/es.tsx +1 -16
- package/src/locales/pl.tsx +1 -16
- package/src/locales/sk.tsx +1 -16
- package/src/locales/uk.tsx +1 -16
- package/src/utils/data/global.ts +0 -1
- package/tsconfig.json +1 -2
- package/.env.example +0 -1
- package/dist/cjs/_virtual/_commonjsHelpers.js +0 -8
- package/dist/cjs/_virtual/_commonjsHelpers.js.map +0 -1
- package/dist/cjs/_virtual/index.js +0 -6
- package/dist/cjs/_virtual/index.js.map +0 -1
- package/dist/cjs/_virtual/index2.js +0 -6
- package/dist/cjs/_virtual/index2.js.map +0 -1
- package/dist/cjs/_virtual/index3.js +0 -6
- package/dist/cjs/_virtual/index3.js.map +0 -1
- package/dist/cjs/_virtual/react-is.development.js +0 -6
- package/dist/cjs/_virtual/react-is.development.js.map +0 -1
- package/dist/cjs/_virtual/react-is.development2.js +0 -6
- package/dist/cjs/_virtual/react-is.development2.js.map +0 -1
- package/dist/cjs/_virtual/react-is.production.js +0 -6
- package/dist/cjs/_virtual/react-is.production.js.map +0 -1
- package/dist/cjs/_virtual/react-is.production.min.js +0 -6
- package/dist/cjs/_virtual/react-is.production.min.js.map +0 -1
- package/dist/cjs/form/PaymentOverviewDrawer.js +0 -149
- package/dist/cjs/form/PaymentOverviewDrawer.js.map +0 -1
- package/dist/cjs/form/TicketQuantityControl.js +0 -51
- package/dist/cjs/form/TicketQuantityControl.js.map +0 -1
- package/dist/cjs/form/TicketSelectionMobile.js +0 -98
- package/dist/cjs/form/TicketSelectionMobile.js.map +0 -1
- package/dist/cjs/form/merchandise/MerchandiseSelection.js +0 -14
- package/dist/cjs/form/merchandise/MerchandiseSelection.js.map +0 -1
- package/dist/cjs/form/merchandise/MerchandiseSlider.js +0 -40
- package/dist/cjs/form/merchandise/MerchandiseSlider.js.map +0 -1
- package/dist/cjs/form/merchendise/MerchandiseSelection.js +0 -19
- package/dist/cjs/form/merchendise/MerchandiseSelection.js.map +0 -1
- package/dist/cjs/form/merchendise/MerchandiseSlider.js +0 -75
- package/dist/cjs/form/merchendise/MerchandiseSlider.js.map +0 -1
- package/dist/cjs/form/services/index.js +0 -134
- package/dist/cjs/form/services/index.js.map +0 -1
- package/dist/cjs/form/tickets/ReleaseDescription.js +0 -23
- package/dist/cjs/form/tickets/ReleaseDescription.js.map +0 -1
- package/dist/cjs/form/tickets/ReleaseWithMerchandise.js +0 -141
- package/dist/cjs/form/tickets/ReleaseWithMerchandise.js.map +0 -1
- package/dist/cjs/form/tickets/TicketQuantityControl.js +0 -52
- package/dist/cjs/form/tickets/TicketQuantityControl.js.map +0 -1
- package/dist/cjs/form/tickets/TicketSelection.js +0 -139
- package/dist/cjs/form/tickets/TicketSelection.js.map +0 -1
- package/dist/cjs/form/tickets/TicketSelectionMap.js +0 -73
- package/dist/cjs/form/tickets/TicketSelectionMap.js.map +0 -1
- package/dist/cjs/form/tickets/TicketSelectionMobile.js +0 -90
- package/dist/cjs/form/tickets/TicketSelectionMobile.js.map +0 -1
- package/dist/cjs/form/tickets/TicketWithMerchandiseSelection.js +0 -117
- package/dist/cjs/form/tickets/TicketWithMerchandiseSelection.js.map +0 -1
- package/dist/esm/_virtual/_commonjsHelpers.js +0 -6
- package/dist/esm/_virtual/_commonjsHelpers.js.map +0 -1
- package/dist/esm/_virtual/index.js +0 -4
- package/dist/esm/_virtual/index.js.map +0 -1
- package/dist/esm/_virtual/index2.js +0 -4
- package/dist/esm/_virtual/index2.js.map +0 -1
- package/dist/esm/_virtual/index3.js +0 -4
- package/dist/esm/_virtual/index3.js.map +0 -1
- package/dist/esm/_virtual/react-is.development.js +0 -4
- package/dist/esm/_virtual/react-is.development.js.map +0 -1
- package/dist/esm/_virtual/react-is.development2.js +0 -4
- package/dist/esm/_virtual/react-is.development2.js.map +0 -1
- package/dist/esm/_virtual/react-is.production.js +0 -4
- package/dist/esm/_virtual/react-is.production.js.map +0 -1
- package/dist/esm/_virtual/react-is.production.min.js +0 -4
- package/dist/esm/_virtual/react-is.production.min.js.map +0 -1
- package/dist/esm/form/PaymentOverviewDrawer.js +0 -145
- package/dist/esm/form/PaymentOverviewDrawer.js.map +0 -1
- package/dist/esm/form/TicketQuantityControl.js +0 -47
- package/dist/esm/form/TicketQuantityControl.js.map +0 -1
- package/dist/esm/form/TicketSelectionMobile.js +0 -94
- package/dist/esm/form/TicketSelectionMobile.js.map +0 -1
- package/dist/esm/form/merchandise/MerchandiseSelection.js +0 -10
- package/dist/esm/form/merchandise/MerchandiseSelection.js.map +0 -1
- package/dist/esm/form/merchandise/MerchandiseSlider.js +0 -36
- package/dist/esm/form/merchandise/MerchandiseSlider.js.map +0 -1
- package/dist/esm/form/merchendise/MerchandiseSelection.js +0 -15
- package/dist/esm/form/merchendise/MerchandiseSelection.js.map +0 -1
- package/dist/esm/form/merchendise/MerchandiseSlider.js +0 -71
- package/dist/esm/form/merchendise/MerchandiseSlider.js.map +0 -1
- package/dist/esm/form/services/index.js +0 -130
- package/dist/esm/form/services/index.js.map +0 -1
- package/dist/esm/form/tickets/ReleaseDescription.js +0 -19
- package/dist/esm/form/tickets/ReleaseDescription.js.map +0 -1
- package/dist/esm/form/tickets/ReleaseWithMerchandise.js +0 -137
- package/dist/esm/form/tickets/ReleaseWithMerchandise.js.map +0 -1
- package/dist/esm/form/tickets/TicketQuantityControl.js +0 -48
- package/dist/esm/form/tickets/TicketQuantityControl.js.map +0 -1
- package/dist/esm/form/tickets/TicketSelection.js +0 -135
- package/dist/esm/form/tickets/TicketSelection.js.map +0 -1
- package/dist/esm/form/tickets/TicketSelectionMap.js +0 -69
- package/dist/esm/form/tickets/TicketSelectionMap.js.map +0 -1
- package/dist/esm/form/tickets/TicketSelectionMobile.js +0 -86
- package/dist/esm/form/tickets/TicketSelectionMobile.js.map +0 -1
- package/dist/esm/form/tickets/TicketWithMerchandiseSelection.js +0 -113
- package/dist/esm/form/tickets/TicketWithMerchandiseSelection.js.map +0 -1
- package/dist/types/form/PaymentOverviewDrawer.d.ts +0 -8
- package/dist/types/form/merchendise/MerchandiseSelection.d.ts +0 -9
- package/dist/types/form/merchendise/MerchandiseSlider.d.ts +0 -10
- package/dist/types/form/merchendise/MerchendiseSlider.d.ts +0 -0
- package/src/form/PaymentOverviewDrawer.tsx +0 -228
- package/src/form/merchandise/MerchandiseSelection.tsx +0 -24
- package/src/form/merchandise/MerchandiseSlider.tsx +0 -62
- package/src/form/services/index.tsx +0 -263
- package/src/form/tickets/ReleaseDescription.tsx +0 -46
- package/src/form/tickets/ReleaseWithMerchandise.tsx +0 -239
- package/src/form/tickets/TicketQuantityControl.tsx +0 -94
- package/src/form/tickets/TicketSelectionMobile.tsx +0 -177
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import React, { useEffect,
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
2
|
import {
|
|
3
|
-
|
|
3
|
+
Badge,
|
|
4
4
|
Button,
|
|
5
5
|
Dialog,
|
|
6
6
|
DialogActions,
|
|
7
7
|
DialogContent,
|
|
8
8
|
DialogTitle,
|
|
9
|
+
IconButton,
|
|
9
10
|
Stack,
|
|
10
11
|
Typography,
|
|
11
12
|
} from '@mui/material';
|
|
@@ -16,16 +17,16 @@ import { ITicketFormTicket } from '@utils/types/ticket.type';
|
|
|
16
17
|
import { IEventProductForm } from '@utils/types/product.type';
|
|
17
18
|
import { fCurrency } from '@utils/formatNumber';
|
|
18
19
|
import useGlobal from '@hooks/useGlobal.ts';
|
|
20
|
+
import { Iconify } from '@components';
|
|
19
21
|
|
|
20
22
|
interface Props {
|
|
21
23
|
eventProduct: IEventProduct;
|
|
22
24
|
eventId: number;
|
|
23
25
|
openDialog: boolean;
|
|
24
|
-
callback: (
|
|
26
|
+
callback: (variant: IEventProductForm) => void;
|
|
25
27
|
onClose?: () => void;
|
|
26
28
|
selectedQuantityByVariant?: Record<number, number>;
|
|
27
29
|
isOnlyMerchandise?: boolean;
|
|
28
|
-
canAddOnlyOneAtATime?: boolean;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
const ProductVariantsDialog: React.FC<Props> = ({
|
|
@@ -36,11 +37,13 @@ const ProductVariantsDialog: React.FC<Props> = ({
|
|
|
36
37
|
selectedQuantityByVariant,
|
|
37
38
|
isOnlyMerchandise,
|
|
38
39
|
eventId,
|
|
39
|
-
canAddOnlyOneAtATime,
|
|
40
40
|
}) => {
|
|
41
41
|
const { t, lang, options } = useGlobal();
|
|
42
42
|
const { showSnackbar } = useGlobal();
|
|
43
|
-
const [
|
|
43
|
+
const [selectedVariant, setSelectedVariant] = useState<IEventProductForm | null>(null);
|
|
44
|
+
const [variantPrice, setVariantPrice] = useState<number | null>(null);
|
|
45
|
+
const [variantQuantity, setVariantQuantity] = useState<number>(1);
|
|
46
|
+
const [isVariantClicked, setIsVariantClicked] = useState(false);
|
|
44
47
|
const tickets: ITicketFormTicket[] = useWatch({ name: `tickets.${eventId}`, defaultValue: [] });
|
|
45
48
|
const products: IEventProductForm[] = useWatch({ name: `products.${eventId}`, defaultValue: [] });
|
|
46
49
|
|
|
@@ -53,41 +56,43 @@ const ProductVariantsDialog: React.FC<Props> = ({
|
|
|
53
56
|
}, [openDialog]);
|
|
54
57
|
|
|
55
58
|
useEffect(() => {
|
|
56
|
-
if (
|
|
57
|
-
|
|
59
|
+
if (isVariantClicked) {
|
|
60
|
+
setVariantQuantity(
|
|
61
|
+
selectedQuantityByVariant &&
|
|
62
|
+
selectedVariant &&
|
|
63
|
+
selectedQuantityByVariant[selectedVariant.eventProductVariantId] !== undefined
|
|
64
|
+
? selectedQuantityByVariant[selectedVariant.eventProductVariantId]
|
|
65
|
+
: 1
|
|
66
|
+
);
|
|
67
|
+
setIsVariantClicked(false);
|
|
58
68
|
}
|
|
59
|
-
}, [
|
|
69
|
+
}, [selectedVariant, isVariantClicked]);
|
|
60
70
|
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
excludedShippingMethodIds: eventProduct.excludedShippingMethods.map(
|
|
73
|
-
(method) => method.id
|
|
74
|
-
),
|
|
75
|
-
} as IEventProductForm;
|
|
76
|
-
})
|
|
77
|
-
.filter((variant): variant is IEventProductForm => Boolean(variant));
|
|
71
|
+
const handleOnClick = (variant: IEventProductVariant) => {
|
|
72
|
+
setVariantPrice(variant.priceWithVat);
|
|
73
|
+
setSelectedVariant({
|
|
74
|
+
eventProductVariantId: variant.id,
|
|
75
|
+
productVariantId: variant.productVariant.id,
|
|
76
|
+
quantity: 1,
|
|
77
|
+
price: variant.priceWithVat,
|
|
78
|
+
excludedShippingMethodIds: eventProduct.excludedShippingMethods.map((method) => method.id),
|
|
79
|
+
});
|
|
80
|
+
setIsVariantClicked(true);
|
|
81
|
+
};
|
|
78
82
|
|
|
79
|
-
|
|
83
|
+
const handleOnAdd = () => {
|
|
84
|
+
if (!selectedVariant) {
|
|
80
85
|
showSnackbar(t('components.product_variant_dialog.select_variant'), { variant: 'error' });
|
|
81
86
|
return;
|
|
82
87
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
setDraftQuantities({});
|
|
88
|
+
callback(selectedVariant);
|
|
89
|
+
setSelectedVariant(null);
|
|
86
90
|
onClose?.();
|
|
87
91
|
};
|
|
88
92
|
|
|
89
|
-
const
|
|
93
|
+
const isVariantDisabled = (variant: IEventProductVariant) => {
|
|
90
94
|
let countUsed = 0;
|
|
95
|
+
let selectedVariantQuantity = 0;
|
|
91
96
|
|
|
92
97
|
for (const product of products) {
|
|
93
98
|
if (product.productVariantId === variant.productVariant.id) {
|
|
@@ -100,104 +105,70 @@ const ProductVariantsDialog: React.FC<Props> = ({
|
|
|
100
105
|
for (const product of ticket.products) {
|
|
101
106
|
if (product.productVariantId === variant.productVariant.id) {
|
|
102
107
|
countUsed += product.quantity;
|
|
108
|
+
selectedVariantQuantity = product.quantity;
|
|
103
109
|
}
|
|
104
110
|
}
|
|
105
111
|
}
|
|
106
112
|
}
|
|
107
|
-
return countUsed;
|
|
108
|
-
};
|
|
109
113
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
114
|
+
return (
|
|
115
|
+
(variant.productVariant.quantity &&
|
|
116
|
+
countUsed + variant.productVariant.sold >= variant.productVariant.quantity) ||
|
|
117
|
+
selectedVariantQuantity >= 10
|
|
118
|
+
);
|
|
113
119
|
};
|
|
114
120
|
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
121
|
+
const isVariantSoldOut = () => {
|
|
122
|
+
const variant = eventProduct.eventProductVariants.find(
|
|
123
|
+
(product) => product.id === selectedVariant?.eventProductVariantId
|
|
124
|
+
);
|
|
125
|
+
let countUsed = variantQuantity;
|
|
119
126
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
// Only allow one variant to be selected
|
|
128
|
-
return { [variant.id]: 1 };
|
|
127
|
+
for (const ticket of tickets) {
|
|
128
|
+
if (ticket.products) {
|
|
129
|
+
for (const product of ticket.products) {
|
|
130
|
+
if (product.productVariantId === variant?.productVariant.id) {
|
|
131
|
+
countUsed += product.quantity;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
129
134
|
}
|
|
130
|
-
|
|
131
|
-
});
|
|
132
|
-
};
|
|
135
|
+
}
|
|
133
136
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
delete rest[variant.id];
|
|
141
|
-
return rest;
|
|
142
|
-
}
|
|
143
|
-
if (canAddOnlyOneAtATime) {
|
|
144
|
-
// Remove the only variant
|
|
145
|
-
return {};
|
|
137
|
+
if (variant && variant.productVariant.quantity) {
|
|
138
|
+
if (
|
|
139
|
+
variant.productVariant.sold + countUsed >= variant.productVariant.quantity ||
|
|
140
|
+
variantQuantity >= 10
|
|
141
|
+
) {
|
|
142
|
+
return true;
|
|
146
143
|
}
|
|
147
|
-
|
|
148
|
-
|
|
144
|
+
}
|
|
145
|
+
return false;
|
|
149
146
|
};
|
|
150
147
|
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
excludedShippingMethodIds: eventProduct.excludedShippingMethods.map(
|
|
162
|
-
(method) => method.id
|
|
163
|
-
),
|
|
164
|
-
}) as IEventProductForm
|
|
165
|
-
);
|
|
148
|
+
const handleAddQuantity = () => {
|
|
149
|
+
setVariantQuantity(variantQuantity + 1);
|
|
150
|
+
setSelectedVariant((prevState) => {
|
|
151
|
+
if (!prevState) return null;
|
|
152
|
+
return {
|
|
153
|
+
...prevState,
|
|
154
|
+
quantity: variantQuantity + 1,
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
};
|
|
166
158
|
|
|
167
|
-
|
|
168
|
-
|
|
159
|
+
const handleRemoveQuantity = () => {
|
|
160
|
+
if (variantQuantity > 0) {
|
|
161
|
+
setVariantQuantity(variantQuantity - 1);
|
|
169
162
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
163
|
+
setSelectedVariant((prevState) => {
|
|
164
|
+
if (!prevState) return null;
|
|
165
|
+
return {
|
|
166
|
+
...prevState,
|
|
167
|
+
quantity: variantQuantity - 1,
|
|
168
|
+
};
|
|
169
|
+
});
|
|
174
170
|
};
|
|
175
171
|
|
|
176
|
-
const hasSelectedVariants = eventProduct.eventProductVariants.some(
|
|
177
|
-
(variant) => (selectedQuantityByVariant?.[variant.id] ?? 0) > 0
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
const variantsById = useMemo(
|
|
181
|
-
() => new Map(eventProduct.eventProductVariants.map((variant) => [variant.id, variant])),
|
|
182
|
-
[eventProduct.eventProductVariants]
|
|
183
|
-
);
|
|
184
|
-
|
|
185
|
-
const totalDraftPrice = useMemo(
|
|
186
|
-
() =>
|
|
187
|
-
Object.entries(draftQuantities).reduce((total, [variantId, qty]) => {
|
|
188
|
-
const variant = variantsById.get(Number(variantId));
|
|
189
|
-
if (!variant) return total;
|
|
190
|
-
return total + variant.priceWithVat * qty;
|
|
191
|
-
}, 0),
|
|
192
|
-
[draftQuantities, variantsById]
|
|
193
|
-
);
|
|
194
|
-
|
|
195
|
-
const hasDraftSelection = useMemo(
|
|
196
|
-
() =>
|
|
197
|
-
eventProduct.eventProductVariants.some((variant) => (draftQuantities[variant.id] ?? 0) > 0),
|
|
198
|
-
[eventProduct.eventProductVariants, draftQuantities]
|
|
199
|
-
);
|
|
200
|
-
|
|
201
172
|
return (
|
|
202
173
|
<Dialog
|
|
203
174
|
open={openDialog}
|
|
@@ -216,19 +187,16 @@ const ProductVariantsDialog: React.FC<Props> = ({
|
|
|
216
187
|
},
|
|
217
188
|
}}
|
|
218
189
|
>
|
|
219
|
-
<DialogTitle
|
|
220
|
-
|
|
221
|
-
>
|
|
222
|
-
{eventProduct.product.name}
|
|
223
|
-
</DialogTitle>
|
|
224
|
-
<DialogContent sx={{ pb: 0 }}>
|
|
190
|
+
<DialogTitle />
|
|
191
|
+
<DialogContent>
|
|
225
192
|
<Stack spacing={1}>
|
|
226
193
|
<Image
|
|
227
194
|
src={eventProduct.product.previewImage.url}
|
|
228
195
|
alt={eventProduct.product.name}
|
|
229
|
-
ratio="
|
|
230
|
-
sx={{ borderRadius:
|
|
196
|
+
ratio="1/1"
|
|
197
|
+
sx={{ borderRadius: 2 }}
|
|
231
198
|
/>
|
|
199
|
+
<Typography variant="h5">{eventProduct.product.name}</Typography>
|
|
232
200
|
<Typography variant="body2" color="primary">
|
|
233
201
|
{t('form.labels.category')}: {eventProduct.product.category.value.text}
|
|
234
202
|
</Typography>
|
|
@@ -239,145 +207,64 @@ const ProductVariantsDialog: React.FC<Props> = ({
|
|
|
239
207
|
</Stack>
|
|
240
208
|
</DialogContent>
|
|
241
209
|
<DialogActions sx={{ justifyContent: 'flex-start' }}>
|
|
242
|
-
<Stack spacing={
|
|
243
|
-
<Stack spacing={1}>
|
|
244
|
-
{eventProduct.eventProductVariants.map((variant) =>
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
210
|
+
<Stack spacing={2} width="100%">
|
|
211
|
+
<Stack direction="row" spacing={1} flexWrap="wrap" useFlexGap textAlign="left">
|
|
212
|
+
{eventProduct.eventProductVariants.map((variant) => (
|
|
213
|
+
<Button
|
|
214
|
+
key={variant.id}
|
|
215
|
+
onClick={() => handleOnClick(variant)}
|
|
216
|
+
variant={
|
|
217
|
+
variant.id === selectedVariant?.eventProductVariantId ? 'contained' : 'outlined'
|
|
218
|
+
}
|
|
219
|
+
size="large"
|
|
220
|
+
disabled={isOnlyMerchandise ? false : isVariantDisabled(variant)}
|
|
221
|
+
>
|
|
222
|
+
<Badge
|
|
223
|
+
color="primary"
|
|
224
|
+
badgeContent={
|
|
225
|
+
selectedQuantityByVariant ? selectedQuantityByVariant[variant.id] : 0
|
|
226
|
+
}
|
|
227
|
+
sx={{ position: 'unset' }}
|
|
259
228
|
>
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
height: 36,
|
|
265
|
-
borderRadius: 1,
|
|
266
|
-
fontWeight: 700,
|
|
267
|
-
border: 1,
|
|
268
|
-
borderColor: 'divider',
|
|
269
|
-
bgcolor: 'background.paper',
|
|
270
|
-
color: 'text.primary',
|
|
271
|
-
display: 'flex',
|
|
272
|
-
alignItems: 'center',
|
|
273
|
-
justifyContent: 'center',
|
|
274
|
-
}}
|
|
275
|
-
>
|
|
276
|
-
{variant.productVariant.value}
|
|
277
|
-
</Box>
|
|
278
|
-
{draftQty > 0 ? (
|
|
279
|
-
<Box
|
|
280
|
-
sx={{
|
|
281
|
-
flex: 1,
|
|
282
|
-
display: 'grid',
|
|
283
|
-
gridTemplateColumns: canAddOnlyOneAtATime
|
|
284
|
-
? 'repeat(2, minmax(0, 1fr))'
|
|
285
|
-
: 'repeat(3, minmax(0, 1fr))',
|
|
286
|
-
gap: 1,
|
|
287
|
-
alignItems: 'center',
|
|
288
|
-
}}
|
|
289
|
-
>
|
|
290
|
-
<Button
|
|
291
|
-
variant="outlined"
|
|
292
|
-
onClick={() => handleRemoveQuantity(variant)}
|
|
293
|
-
disabled={draftQty < 1}
|
|
294
|
-
sx={{
|
|
295
|
-
minWidth: 0,
|
|
296
|
-
height: 36,
|
|
297
|
-
borderRadius: 1,
|
|
298
|
-
fontWeight: 700,
|
|
299
|
-
borderColor: 'grey.300',
|
|
300
|
-
color: 'text.primary',
|
|
301
|
-
}}
|
|
302
|
-
>
|
|
303
|
-
-
|
|
304
|
-
</Button>
|
|
305
|
-
<Typography
|
|
306
|
-
sx={{
|
|
307
|
-
minWidth: 0,
|
|
308
|
-
height: 36,
|
|
309
|
-
borderRadius: 1,
|
|
310
|
-
border: 1,
|
|
311
|
-
borderColor: 'divider',
|
|
312
|
-
boxSizing: 'border-box',
|
|
313
|
-
display: 'flex',
|
|
314
|
-
alignItems: 'center',
|
|
315
|
-
justifyContent: 'center',
|
|
316
|
-
textAlign: 'center',
|
|
317
|
-
fontWeight: 700,
|
|
318
|
-
color: 'text.primary',
|
|
319
|
-
}}
|
|
320
|
-
>
|
|
321
|
-
{draftQty}
|
|
322
|
-
</Typography>
|
|
323
|
-
{!canAddOnlyOneAtATime && (
|
|
324
|
-
<Button
|
|
325
|
-
variant="contained"
|
|
326
|
-
onClick={() => handleAddQuantity(variant)}
|
|
327
|
-
disabled={draftQty >= 10 || draftQty >= maxAvailable}
|
|
328
|
-
sx={{ minWidth: 0, height: 36, borderRadius: 1, fontWeight: 700 }}
|
|
329
|
-
>
|
|
330
|
-
+
|
|
331
|
-
</Button>
|
|
332
|
-
)}
|
|
333
|
-
</Box>
|
|
334
|
-
) : (
|
|
335
|
-
<Button
|
|
336
|
-
variant="contained"
|
|
337
|
-
onClick={() => handleAddQuantity(variant)}
|
|
338
|
-
disabled={isOnlyMerchandise ? false : isAddDisabled || isAnotherSelected}
|
|
339
|
-
sx={{
|
|
340
|
-
flex: 1,
|
|
341
|
-
height: 36,
|
|
342
|
-
borderRadius: 1,
|
|
343
|
-
fontWeight: 700,
|
|
344
|
-
textTransform: 'none',
|
|
345
|
-
}}
|
|
346
|
-
>
|
|
347
|
-
{t('add')}
|
|
348
|
-
</Button>
|
|
349
|
-
)}
|
|
350
|
-
|
|
351
|
-
<Typography variant="body1">
|
|
352
|
-
{variant.priceWithVat > 0
|
|
353
|
-
? fCurrency(variant.priceWithVat, lang, eventProduct.product.currency)
|
|
354
|
-
: t('free')}
|
|
355
|
-
</Typography>
|
|
356
|
-
</Stack>
|
|
357
|
-
);
|
|
358
|
-
})}
|
|
229
|
+
{variant.productVariant.value}
|
|
230
|
+
</Badge>
|
|
231
|
+
</Button>
|
|
232
|
+
))}
|
|
359
233
|
</Stack>
|
|
360
|
-
<Stack
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
234
|
+
<Stack direction="row" justifyContent="space-between" alignItems="center" pt={1}>
|
|
235
|
+
{selectedVariant && isOnlyMerchandise && (
|
|
236
|
+
<Stack direction="row" alignItems="center" spacing={1}>
|
|
237
|
+
<IconButton
|
|
238
|
+
size="small"
|
|
239
|
+
color="primary"
|
|
240
|
+
onClick={handleRemoveQuantity}
|
|
241
|
+
disabled={variantQuantity < 1}
|
|
242
|
+
>
|
|
243
|
+
<Iconify icon="eva:minus-fill" />
|
|
244
|
+
</IconButton>
|
|
245
|
+
<Typography color="grey.500">{variantQuantity}</Typography>
|
|
246
|
+
<IconButton
|
|
247
|
+
size="small"
|
|
248
|
+
color="primary"
|
|
249
|
+
onClick={handleAddQuantity}
|
|
250
|
+
disabled={isVariantSoldOut()}
|
|
251
|
+
>
|
|
252
|
+
<Iconify icon="eva:plus-fill" />
|
|
253
|
+
</IconButton>
|
|
254
|
+
</Stack>
|
|
255
|
+
)}
|
|
256
|
+
<Typography variant="h4" textAlign="right" mt={0}>
|
|
257
|
+
{variantPrice !== null
|
|
258
|
+
? variantPrice > 0
|
|
259
|
+
? fCurrency(variantPrice, lang, eventProduct.product.currency)
|
|
260
|
+
: t('free')
|
|
261
|
+
: t('unselected')}
|
|
370
262
|
</Typography>
|
|
371
263
|
</Stack>
|
|
372
264
|
<Stack direction="row" spacing={1} justifyContent="flex-end" width="100%">
|
|
373
|
-
{hasSelectedVariants && !canAddOnlyOneAtATime && (
|
|
374
|
-
<Button variant="outlined" color="error" onClick={handleRemoveProduct}>
|
|
375
|
-
{t('remove')}
|
|
376
|
-
</Button>
|
|
377
|
-
)}
|
|
378
265
|
{onClose && <Button onClick={onClose}>{t('cancel')}</Button>}
|
|
379
|
-
<Button variant="contained" onClick={handleOnAdd} disabled={!
|
|
380
|
-
{t('
|
|
266
|
+
<Button variant="contained" onClick={handleOnAdd} disabled={!selectedVariant}>
|
|
267
|
+
{t('add')}
|
|
381
268
|
</Button>
|
|
382
269
|
</Stack>
|
|
383
270
|
</Stack>
|
package/src/locales/cs.tsx
CHANGED
|
@@ -7,8 +7,6 @@ const cs = {
|
|
|
7
7
|
add: 'Přidat',
|
|
8
8
|
confirm: 'Potvrdit',
|
|
9
9
|
cancel: 'Zrušit',
|
|
10
|
-
close: 'Zavřít',
|
|
11
|
-
remove: 'Odstranit',
|
|
12
10
|
pay: 'Zaplatit',
|
|
13
11
|
change: 'Změnit',
|
|
14
12
|
free: 'Zdarma',
|
|
@@ -41,7 +39,7 @@ const cs = {
|
|
|
41
39
|
promo_code: 'Slevový kód',
|
|
42
40
|
start_date: 'Datum konání',
|
|
43
41
|
organizer: 'Pořadatel',
|
|
44
|
-
total: 'Celkem',
|
|
42
|
+
total: 'Celkem ',
|
|
45
43
|
with_fee: 'vč. servisního poplatku',
|
|
46
44
|
service_fee: 'Servisní poplatek',
|
|
47
45
|
shipping_fee: 'Doprava',
|
|
@@ -55,8 +53,6 @@ const cs = {
|
|
|
55
53
|
category: 'Kategorie',
|
|
56
54
|
sms_notification: 'SMS notifikace',
|
|
57
55
|
open_map: 'Otevřít mapu',
|
|
58
|
-
payment_overview_open: 'Otevřít přehled platby',
|
|
59
|
-
payment_overview_close: 'Zavřít přehled platby',
|
|
60
56
|
},
|
|
61
57
|
validation: {
|
|
62
58
|
required: 'Toto pole je povinné.',
|
|
@@ -109,13 +105,9 @@ const cs = {
|
|
|
109
105
|
7: {
|
|
110
106
|
title: 'Přidružené eventy',
|
|
111
107
|
},
|
|
112
|
-
8: {
|
|
113
|
-
title: 'EventLook služby',
|
|
114
|
-
additional_info: 'Více informací ke službám',
|
|
115
|
-
},
|
|
116
108
|
},
|
|
117
109
|
terms_and_conditions:
|
|
118
|
-
'
|
|
110
|
+
'Odesláním objednávky souhlasím s <0>Obchodními podmínkami</0> {{termsAndConditionsCompanies}} a beru na vědomí <1>Zásady soukromí</1>.',
|
|
119
111
|
insurance: {
|
|
120
112
|
label: 'Pojištění vstupenek',
|
|
121
113
|
per_ticket: 'ks',
|
|
@@ -135,13 +127,6 @@ const cs = {
|
|
|
135
127
|
price: 'Cena SMS připomenutí termínu akce',
|
|
136
128
|
},
|
|
137
129
|
},
|
|
138
|
-
merchandise: {
|
|
139
|
-
show_sizes: 'Zobrazit velikosti',
|
|
140
|
-
show_added: 'Zobrazit přidané',
|
|
141
|
-
},
|
|
142
|
-
services: {
|
|
143
|
-
add_tickets_first: 'Nejdříve prosím přidejte vstupenky',
|
|
144
|
-
},
|
|
145
130
|
order_success: {
|
|
146
131
|
title: 'Vstupenky byly úspěšně zarezervovány. Teď už zbývá jenom zaplatit.',
|
|
147
132
|
description:
|
package/src/locales/en.tsx
CHANGED
|
@@ -7,8 +7,6 @@ const en = {
|
|
|
7
7
|
add: 'Add',
|
|
8
8
|
confirm: 'Confirm',
|
|
9
9
|
cancel: 'Cancel',
|
|
10
|
-
close: 'Close',
|
|
11
|
-
remove: 'Remove',
|
|
12
10
|
pay: 'Pay',
|
|
13
11
|
change: 'Change',
|
|
14
12
|
free: 'Free',
|
|
@@ -55,8 +53,6 @@ const en = {
|
|
|
55
53
|
category: 'Category',
|
|
56
54
|
sms_notification: 'SMS notification',
|
|
57
55
|
open_map: 'Open map',
|
|
58
|
-
payment_overview_open: 'Open payment overview',
|
|
59
|
-
payment_overview_close: 'Close payment overview',
|
|
60
56
|
},
|
|
61
57
|
validation: {
|
|
62
58
|
required: 'This field is required.',
|
|
@@ -109,13 +105,9 @@ const en = {
|
|
|
109
105
|
7: {
|
|
110
106
|
title: 'Associated events',
|
|
111
107
|
},
|
|
112
|
-
8: {
|
|
113
|
-
title: 'EventLook services',
|
|
114
|
-
additional_info: 'More information about services',
|
|
115
|
-
},
|
|
116
108
|
},
|
|
117
109
|
terms_and_conditions:
|
|
118
|
-
'I agree
|
|
110
|
+
'By submitting the order, I agree to the <0>Terms and Conditions</0> of {{termsAndConditionsCompanies}} and acknowledge the <1>Privacy Policy</1>.',
|
|
119
111
|
insurance: {
|
|
120
112
|
label: 'Ticket insurance',
|
|
121
113
|
per_ticket: 'pc',
|
|
@@ -132,17 +124,10 @@ const en = {
|
|
|
132
124
|
label: 'SMS event reminder',
|
|
133
125
|
modal: {
|
|
134
126
|
description:
|
|
135
|
-
|
|
127
|
+
'Event reminder the day before: SMS will notify you about the upcoming event so you don\'t forget and have time to prepare.',
|
|
136
128
|
price: 'SMS event reminder price',
|
|
137
129
|
},
|
|
138
130
|
},
|
|
139
|
-
merchandise: {
|
|
140
|
-
show_sizes: 'Show sizes',
|
|
141
|
-
show_added: 'Show added',
|
|
142
|
-
},
|
|
143
|
-
services: {
|
|
144
|
-
add_tickets_first: 'Please add tickets first',
|
|
145
|
-
},
|
|
146
131
|
order_success: {
|
|
147
132
|
title: 'Tickets have been successfully reserved. Now you just need to pay.',
|
|
148
133
|
description:
|
package/src/locales/es.tsx
CHANGED
|
@@ -7,8 +7,6 @@ const es = {
|
|
|
7
7
|
add: 'Añadir',
|
|
8
8
|
confirm: 'Confirmar',
|
|
9
9
|
cancel: 'Cancelar',
|
|
10
|
-
close: 'Cerrar',
|
|
11
|
-
remove: 'Eliminar',
|
|
12
10
|
pay: 'Pagar',
|
|
13
11
|
change: 'Cambiar',
|
|
14
12
|
free: 'Gratis',
|
|
@@ -55,8 +53,6 @@ const es = {
|
|
|
55
53
|
category: 'Categoría',
|
|
56
54
|
sms_notification: 'Notificación SMS',
|
|
57
55
|
open_map: 'Abrir mapa',
|
|
58
|
-
payment_overview_open: 'Abrir resumen de pago',
|
|
59
|
-
payment_overview_close: 'Cerrar resumen de pago',
|
|
60
56
|
},
|
|
61
57
|
validation: {
|
|
62
58
|
required: 'Este campo es obligatorio.',
|
|
@@ -109,13 +105,9 @@ const es = {
|
|
|
109
105
|
7: {
|
|
110
106
|
title: 'Eventos asociados',
|
|
111
107
|
},
|
|
112
|
-
8: {
|
|
113
|
-
title: 'EventLook servicios',
|
|
114
|
-
additional_info: 'Más información sobre los servicios',
|
|
115
|
-
},
|
|
116
108
|
},
|
|
117
109
|
terms_and_conditions:
|
|
118
|
-
'
|
|
110
|
+
'Al enviar el pedido, acepto los <0>Términos y Condiciones</0> de {{termsAndConditionsCompanies}} y reconozco la <1>Política de Privacidad</1>.',
|
|
119
111
|
insurance: {
|
|
120
112
|
label: 'Seguro de entrada',
|
|
121
113
|
per_ticket: 'pc',
|
|
@@ -136,13 +128,6 @@ const es = {
|
|
|
136
128
|
price: 'Precio del recordatorio por SMS del evento',
|
|
137
129
|
},
|
|
138
130
|
},
|
|
139
|
-
merchandise: {
|
|
140
|
-
show_sizes: 'Mostrar tallas',
|
|
141
|
-
show_added: 'Mostrar añadidos',
|
|
142
|
-
},
|
|
143
|
-
services: {
|
|
144
|
-
add_tickets_first: 'Por favor, agregue entradas primero',
|
|
145
|
-
},
|
|
146
131
|
order_success: {
|
|
147
132
|
title: 'Las entradas han sido reservadas con éxito. Ahora solo tienes que pagar.',
|
|
148
133
|
description:
|