@eventlook/sdk 1.4.46-beta.6 → 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 +23 -15
- 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 +18 -36
- 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 +4 -1
- package/dist/cjs/form/payment/FeeBox.js.map +1 -1
- package/dist/cjs/form/payment/PaymentOverviewCheckbox.js +27 -17
- package/dist/cjs/form/payment/PaymentOverviewCheckbox.js.map +1 -1
- package/dist/cjs/form/product/ProductCard.js +34 -49
- package/dist/cjs/form/product/ProductCard.js.map +1 -1
- package/dist/cjs/form/product/ProductVariantsDialog.js +94 -118
- package/dist/cjs/form/product/ProductVariantsDialog.js.map +1 -1
- package/dist/cjs/locales/cs.js +1 -16
- package/dist/cjs/locales/cs.js.map +1 -1
- package/dist/cjs/locales/en.js +1 -16
- package/dist/cjs/locales/en.js.map +1 -1
- package/dist/cjs/locales/es.js +0 -15
- package/dist/cjs/locales/es.js.map +1 -1
- package/dist/cjs/locales/pl.js +0 -15
- package/dist/cjs/locales/pl.js.map +1 -1
- package/dist/cjs/locales/sk.js +0 -15
- package/dist/cjs/locales/sk.js.map +1 -1
- package/dist/cjs/locales/uk.js +0 -15
- 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 +23 -15
- 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 +20 -38
- 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 +4 -1
- package/dist/esm/form/payment/FeeBox.js.map +1 -1
- package/dist/esm/form/payment/PaymentOverviewCheckbox.js +29 -19
- package/dist/esm/form/payment/PaymentOverviewCheckbox.js.map +1 -1
- package/dist/esm/form/product/ProductCard.js +35 -50
- package/dist/esm/form/product/ProductCard.js.map +1 -1
- package/dist/esm/form/product/ProductVariantsDialog.js +95 -119
- package/dist/esm/form/product/ProductVariantsDialog.js.map +1 -1
- package/dist/esm/locales/cs.js +1 -16
- package/dist/esm/locales/cs.js.map +1 -1
- package/dist/esm/locales/en.js +1 -16
- package/dist/esm/locales/en.js.map +1 -1
- package/dist/esm/locales/es.js +0 -15
- package/dist/esm/locales/es.js.map +1 -1
- package/dist/esm/locales/pl.js +0 -15
- package/dist/esm/locales/pl.js.map +1 -1
- package/dist/esm/locales/sk.js +0 -15
- package/dist/esm/locales/sk.js.map +1 -1
- package/dist/esm/locales/uk.js +0 -15
- 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 +72 -40
- package/src/form/PaymentPending.tsx +1 -1
- package/src/form/ReleaseWithMerchandise.tsx +230 -0
- package/src/form/TicketForm.tsx +18 -56
- package/src/form/{tickets/TicketSelection.tsx → TicketSelection.tsx} +109 -17
- 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 +10 -0
- package/src/form/payment/PaymentOverviewCheckbox.tsx +56 -33
- package/src/form/product/ProductCard.tsx +52 -67
- package/src/form/product/ProductVariantsDialog.tsx +137 -195
- package/src/locales/cs.tsx +1 -16
- package/src/locales/en.tsx +1 -16
- package/src/locales/es.tsx +0 -15
- package/src/locales/pl.tsx +0 -15
- package/src/locales/sk.tsx +0 -15
- package/src/locales/uk.tsx +0 -15
- 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 -114
- 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 -39
- 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 -131
- 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 -139
- 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 -134
- 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 -88
- 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 -110
- 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 -35
- 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 -127
- 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 -135
- 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 -130
- 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 -84
- 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 -180
- package/src/form/merchandise/MerchandiseSelection.tsx +0 -24
- package/src/form/merchandise/MerchandiseSlider.tsx +0 -61
- package/src/form/services/index.tsx +0 -260
- package/src/form/tickets/ReleaseDescription.tsx +0 -46
- package/src/form/tickets/ReleaseWithMerchandise.tsx +0 -237
- package/src/form/tickets/TicketQuantityControl.tsx +0 -94
- package/src/form/tickets/TicketSelectionMobile.tsx +0 -175
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import React, { useEffect, useState } from 'react';
|
|
2
2
|
import {
|
|
3
|
+
Badge,
|
|
3
4
|
Button,
|
|
4
5
|
Dialog,
|
|
5
6
|
DialogActions,
|
|
6
7
|
DialogContent,
|
|
7
8
|
DialogTitle,
|
|
9
|
+
IconButton,
|
|
8
10
|
Stack,
|
|
9
11
|
Typography,
|
|
10
12
|
} from '@mui/material';
|
|
@@ -15,16 +17,16 @@ import { ITicketFormTicket } from '@utils/types/ticket.type';
|
|
|
15
17
|
import { IEventProductForm } from '@utils/types/product.type';
|
|
16
18
|
import { fCurrency } from '@utils/formatNumber';
|
|
17
19
|
import useGlobal from '@hooks/useGlobal.ts';
|
|
20
|
+
import { Iconify } from '@components';
|
|
18
21
|
|
|
19
22
|
interface Props {
|
|
20
23
|
eventProduct: IEventProduct;
|
|
21
24
|
eventId: number;
|
|
22
25
|
openDialog: boolean;
|
|
23
|
-
callback: (
|
|
26
|
+
callback: (variant: IEventProductForm) => void;
|
|
24
27
|
onClose?: () => void;
|
|
25
28
|
selectedQuantityByVariant?: Record<number, number>;
|
|
26
29
|
isOnlyMerchandise?: boolean;
|
|
27
|
-
canAddOnlyOneAtATime?: boolean;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
const ProductVariantsDialog: React.FC<Props> = ({
|
|
@@ -35,11 +37,13 @@ const ProductVariantsDialog: React.FC<Props> = ({
|
|
|
35
37
|
selectedQuantityByVariant,
|
|
36
38
|
isOnlyMerchandise,
|
|
37
39
|
eventId,
|
|
38
|
-
canAddOnlyOneAtATime,
|
|
39
40
|
}) => {
|
|
40
41
|
const { t, lang, options } = useGlobal();
|
|
41
42
|
const { showSnackbar } = useGlobal();
|
|
42
|
-
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);
|
|
43
47
|
const tickets: ITicketFormTicket[] = useWatch({ name: `tickets.${eventId}`, defaultValue: [] });
|
|
44
48
|
const products: IEventProductForm[] = useWatch({ name: `products.${eventId}`, defaultValue: [] });
|
|
45
49
|
|
|
@@ -52,41 +56,43 @@ const ProductVariantsDialog: React.FC<Props> = ({
|
|
|
52
56
|
}, [openDialog]);
|
|
53
57
|
|
|
54
58
|
useEffect(() => {
|
|
55
|
-
if (
|
|
56
|
-
|
|
59
|
+
if (isVariantClicked) {
|
|
60
|
+
setVariantQuantity(
|
|
61
|
+
selectedQuantityByVariant &&
|
|
62
|
+
selectedVariant &&
|
|
63
|
+
selectedQuantityByVariant[selectedVariant.eventProductVariantId] !== undefined
|
|
64
|
+
? selectedQuantityByVariant[selectedVariant.eventProductVariantId]
|
|
65
|
+
: 1
|
|
66
|
+
);
|
|
67
|
+
setIsVariantClicked(false);
|
|
57
68
|
}
|
|
58
|
-
}, [
|
|
69
|
+
}, [selectedVariant, isVariantClicked]);
|
|
59
70
|
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
excludedShippingMethodIds: eventProduct.excludedShippingMethods.map(
|
|
72
|
-
(method) => method.id
|
|
73
|
-
),
|
|
74
|
-
} as IEventProductForm;
|
|
75
|
-
})
|
|
76
|
-
.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
|
+
};
|
|
77
82
|
|
|
78
|
-
|
|
83
|
+
const handleOnAdd = () => {
|
|
84
|
+
if (!selectedVariant) {
|
|
79
85
|
showSnackbar(t('components.product_variant_dialog.select_variant'), { variant: 'error' });
|
|
80
86
|
return;
|
|
81
87
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
setDraftQuantities({});
|
|
88
|
+
callback(selectedVariant);
|
|
89
|
+
setSelectedVariant(null);
|
|
85
90
|
onClose?.();
|
|
86
91
|
};
|
|
87
92
|
|
|
88
|
-
const
|
|
93
|
+
const isVariantDisabled = (variant: IEventProductVariant) => {
|
|
89
94
|
let countUsed = 0;
|
|
95
|
+
let selectedVariantQuantity = 0;
|
|
90
96
|
|
|
91
97
|
for (const product of products) {
|
|
92
98
|
if (product.productVariantId === variant.productVariant.id) {
|
|
@@ -99,82 +105,70 @@ const ProductVariantsDialog: React.FC<Props> = ({
|
|
|
99
105
|
for (const product of ticket.products) {
|
|
100
106
|
if (product.productVariantId === variant.productVariant.id) {
|
|
101
107
|
countUsed += product.quantity;
|
|
108
|
+
selectedVariantQuantity = product.quantity;
|
|
102
109
|
}
|
|
103
110
|
}
|
|
104
111
|
}
|
|
105
112
|
}
|
|
106
|
-
return countUsed;
|
|
107
|
-
};
|
|
108
113
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
114
|
+
return (
|
|
115
|
+
(variant.productVariant.quantity &&
|
|
116
|
+
countUsed + variant.productVariant.sold >= variant.productVariant.quantity) ||
|
|
117
|
+
selectedVariantQuantity >= 10
|
|
118
|
+
);
|
|
112
119
|
};
|
|
113
120
|
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
121
|
+
const isVariantSoldOut = () => {
|
|
122
|
+
const variant = eventProduct.eventProductVariants.find(
|
|
123
|
+
(product) => product.id === selectedVariant?.eventProductVariantId
|
|
124
|
+
);
|
|
125
|
+
let countUsed = variantQuantity;
|
|
118
126
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
// Only allow one variant to be selected
|
|
127
|
-
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
|
+
}
|
|
128
134
|
}
|
|
129
|
-
|
|
130
|
-
});
|
|
131
|
-
};
|
|
135
|
+
}
|
|
132
136
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
return rest;
|
|
137
|
+
if (variant && variant.productVariant.quantity) {
|
|
138
|
+
if (
|
|
139
|
+
variant.productVariant.sold + countUsed >= variant.productVariant.quantity ||
|
|
140
|
+
variantQuantity >= 10
|
|
141
|
+
) {
|
|
142
|
+
return true;
|
|
140
143
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
return {};
|
|
144
|
-
}
|
|
145
|
-
return { ...prev, [variant.id]: next };
|
|
146
|
-
});
|
|
144
|
+
}
|
|
145
|
+
return false;
|
|
147
146
|
};
|
|
148
147
|
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
excludedShippingMethodIds: eventProduct.excludedShippingMethods.map(
|
|
160
|
-
(method) => method.id
|
|
161
|
-
),
|
|
162
|
-
}) as IEventProductForm
|
|
163
|
-
);
|
|
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
|
+
};
|
|
164
158
|
|
|
165
|
-
|
|
166
|
-
|
|
159
|
+
const handleRemoveQuantity = () => {
|
|
160
|
+
if (variantQuantity > 0) {
|
|
161
|
+
setVariantQuantity(variantQuantity - 1);
|
|
167
162
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
163
|
+
setSelectedVariant((prevState) => {
|
|
164
|
+
if (!prevState) return null;
|
|
165
|
+
return {
|
|
166
|
+
...prevState,
|
|
167
|
+
quantity: variantQuantity - 1,
|
|
168
|
+
};
|
|
169
|
+
});
|
|
172
170
|
};
|
|
173
171
|
|
|
174
|
-
const hasSelectedVariants = eventProduct.eventProductVariants.some(
|
|
175
|
-
(variant) => (selectedQuantityByVariant?.[variant.id] ?? 0) > 0
|
|
176
|
-
);
|
|
177
|
-
|
|
178
172
|
return (
|
|
179
173
|
<Dialog
|
|
180
174
|
open={openDialog}
|
|
@@ -193,17 +187,16 @@ const ProductVariantsDialog: React.FC<Props> = ({
|
|
|
193
187
|
},
|
|
194
188
|
}}
|
|
195
189
|
>
|
|
196
|
-
<DialogTitle
|
|
197
|
-
{eventProduct.product.name}
|
|
198
|
-
</DialogTitle>
|
|
190
|
+
<DialogTitle />
|
|
199
191
|
<DialogContent>
|
|
200
192
|
<Stack spacing={1}>
|
|
201
193
|
<Image
|
|
202
194
|
src={eventProduct.product.previewImage.url}
|
|
203
195
|
alt={eventProduct.product.name}
|
|
204
|
-
ratio="
|
|
196
|
+
ratio="1/1"
|
|
205
197
|
sx={{ borderRadius: 2 }}
|
|
206
198
|
/>
|
|
199
|
+
<Typography variant="h5">{eventProduct.product.name}</Typography>
|
|
207
200
|
<Typography variant="body2" color="primary">
|
|
208
201
|
{t('form.labels.category')}: {eventProduct.product.category.value.text}
|
|
209
202
|
</Typography>
|
|
@@ -215,113 +208,62 @@ const ProductVariantsDialog: React.FC<Props> = ({
|
|
|
215
208
|
</DialogContent>
|
|
216
209
|
<DialogActions sx={{ justifyContent: 'flex-start' }}>
|
|
217
210
|
<Stack spacing={2} width="100%">
|
|
218
|
-
<Stack spacing={1
|
|
219
|
-
{eventProduct.eventProductVariants.map((variant) =>
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
<
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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' }}
|
|
235
228
|
>
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
variant={draftQty > 0 ? 'contained' : 'outlined'}
|
|
239
|
-
size="large"
|
|
240
|
-
disabled={isOnlyMerchandise ? false : isAddDisabled || isAnotherSelected}
|
|
241
|
-
sx={{
|
|
242
|
-
minWidth: 64,
|
|
243
|
-
height: 40,
|
|
244
|
-
borderRadius: 1,
|
|
245
|
-
fontWeight: 700,
|
|
246
|
-
}}
|
|
247
|
-
>
|
|
248
|
-
{variant.productVariant.value}
|
|
249
|
-
</Button>
|
|
250
|
-
{draftQty > 0 ? (
|
|
251
|
-
<Stack direction="row" spacing={1} alignItems="center" sx={{ flex: 1 }}>
|
|
252
|
-
<Button
|
|
253
|
-
variant="outlined"
|
|
254
|
-
onClick={() => handleRemoveQuantity(variant)}
|
|
255
|
-
disabled={draftQty < 1}
|
|
256
|
-
sx={{ minWidth: 40, height: 40, borderRadius: 1, fontWeight: 700 }}
|
|
257
|
-
>
|
|
258
|
-
-
|
|
259
|
-
</Button>
|
|
260
|
-
<Typography
|
|
261
|
-
sx={{
|
|
262
|
-
minWidth: 40,
|
|
263
|
-
textAlign: 'center',
|
|
264
|
-
fontWeight: 700,
|
|
265
|
-
color: 'text.secondary',
|
|
266
|
-
}}
|
|
267
|
-
>
|
|
268
|
-
{draftQty}
|
|
269
|
-
</Typography>
|
|
270
|
-
{!canAddOnlyOneAtATime && (
|
|
271
|
-
<Button
|
|
272
|
-
variant="contained"
|
|
273
|
-
onClick={() => handleAddQuantity(variant)}
|
|
274
|
-
disabled={draftQty >= 10 || draftQty >= maxAvailable}
|
|
275
|
-
sx={{ minWidth: 40, height: 40, borderRadius: 1, fontWeight: 700 }}
|
|
276
|
-
>
|
|
277
|
-
+
|
|
278
|
-
</Button>
|
|
279
|
-
)}
|
|
280
|
-
</Stack>
|
|
281
|
-
) : (
|
|
282
|
-
<Button
|
|
283
|
-
variant="contained"
|
|
284
|
-
onClick={() => handleAddQuantity(variant)}
|
|
285
|
-
disabled={isOnlyMerchandise ? false : isAddDisabled || isAnotherSelected}
|
|
286
|
-
sx={{
|
|
287
|
-
flex: 1,
|
|
288
|
-
height: 40,
|
|
289
|
-
borderRadius: 1,
|
|
290
|
-
fontWeight: 700,
|
|
291
|
-
textTransform: 'none',
|
|
292
|
-
}}
|
|
293
|
-
>
|
|
294
|
-
{t('add')}
|
|
295
|
-
</Button>
|
|
296
|
-
)}
|
|
297
|
-
<Stack direction="row" spacing={1} alignItems="center">
|
|
298
|
-
{selectedQty > 0 && (
|
|
299
|
-
<Typography variant="caption" color="text.secondary">
|
|
300
|
-
{selectedQty}x
|
|
301
|
-
</Typography>
|
|
302
|
-
)}
|
|
303
|
-
<Typography variant="body1" fontWeight={600}>
|
|
304
|
-
{variant.priceWithVat > 0
|
|
305
|
-
? fCurrency(variant.priceWithVat, lang, eventProduct.product.currency)
|
|
306
|
-
: t('free')}
|
|
307
|
-
</Typography>
|
|
308
|
-
</Stack>
|
|
309
|
-
</Stack>
|
|
310
|
-
);
|
|
311
|
-
})}
|
|
312
|
-
</Stack>
|
|
313
|
-
<Stack direction="row" spacing={1} justifyContent="flex-end" width="100%">
|
|
314
|
-
{hasSelectedVariants && !canAddOnlyOneAtATime && (
|
|
315
|
-
<Button variant="outlined" color="error" onClick={handleRemoveProduct}>
|
|
316
|
-
{t('remove')}
|
|
229
|
+
{variant.productVariant.value}
|
|
230
|
+
</Badge>
|
|
317
231
|
</Button>
|
|
232
|
+
))}
|
|
233
|
+
</Stack>
|
|
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>
|
|
318
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')}
|
|
262
|
+
</Typography>
|
|
263
|
+
</Stack>
|
|
264
|
+
<Stack direction="row" spacing={1} justifyContent="flex-end" width="100%">
|
|
319
265
|
{onClose && <Button onClick={onClose}>{t('cancel')}</Button>}
|
|
320
|
-
<Button
|
|
321
|
-
variant="contained"
|
|
322
|
-
onClick={handleOnAdd}
|
|
323
|
-
disabled={!Object.values(draftQuantities).some((qty) => qty > 0)}
|
|
324
|
-
>
|
|
266
|
+
<Button variant="contained" onClick={handleOnAdd} disabled={!selectedVariant}>
|
|
325
267
|
{t('add')}
|
|
326
268
|
</Button>
|
|
327
269
|
</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,10 +105,6 @@ 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>.',
|
|
@@ -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,10 +105,6 @@ 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
110
|
'By submitting the order, I agree to the <0>Terms and Conditions</0> of {{termsAndConditionsCompanies}} and acknowledge the <1>Privacy Policy</1>.',
|
|
@@ -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,10 +105,6 @@ 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>.',
|
|
@@ -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:
|
package/src/locales/pl.tsx
CHANGED
|
@@ -7,8 +7,6 @@ const pl = {
|
|
|
7
7
|
add: 'Dodaj',
|
|
8
8
|
confirm: 'Potwierdź',
|
|
9
9
|
cancel: 'Anuluj',
|
|
10
|
-
close: 'Zamknij',
|
|
11
|
-
remove: 'Usuń',
|
|
12
10
|
pay: 'Zapłać',
|
|
13
11
|
change: 'Zmień',
|
|
14
12
|
free: 'Darmowe',
|
|
@@ -55,8 +53,6 @@ const pl = {
|
|
|
55
53
|
category: 'Kategoria',
|
|
56
54
|
sms_notification: 'Powiadomienie SMS',
|
|
57
55
|
open_map: 'Otwórz mapę',
|
|
58
|
-
payment_overview_open: 'Otwórz podsumowanie płatności',
|
|
59
|
-
payment_overview_close: 'Zamknij podsumowanie płatności',
|
|
60
56
|
},
|
|
61
57
|
validation: {
|
|
62
58
|
required: 'To pole jest wymagane.',
|
|
@@ -109,10 +105,6 @@ const pl = {
|
|
|
109
105
|
7: {
|
|
110
106
|
title: 'Powiązane wydarzenia',
|
|
111
107
|
},
|
|
112
|
-
8: {
|
|
113
|
-
title: 'EventLook usługi',
|
|
114
|
-
additional_info: 'Więcej informacji o usługach',
|
|
115
|
-
},
|
|
116
108
|
},
|
|
117
109
|
terms_and_conditions:
|
|
118
110
|
'Składając zamówienie, akceptuję <0>Regulamin</0> {{termsAndConditionsCompanies}} oraz potwierdzam <1>Politykę prywatności</1>.',
|
|
@@ -136,13 +128,6 @@ const pl = {
|
|
|
136
128
|
price: 'Cena przypomnienia SMS o wydarzeniu',
|
|
137
129
|
},
|
|
138
130
|
},
|
|
139
|
-
merchandise: {
|
|
140
|
-
show_sizes: 'Pokaż rozmiary',
|
|
141
|
-
show_added: 'Pokaż dodane',
|
|
142
|
-
},
|
|
143
|
-
services: {
|
|
144
|
-
add_tickets_first: 'Najpierw dodaj bilety',
|
|
145
|
-
},
|
|
146
131
|
order_success: {
|
|
147
132
|
title: 'Bilety zostały pomyślnie zarezerwowane. Teraz wystarczy zapłacić.',
|
|
148
133
|
description:
|
package/src/locales/sk.tsx
CHANGED
|
@@ -7,8 +7,6 @@ const sk = {
|
|
|
7
7
|
add: 'Pridať',
|
|
8
8
|
confirm: 'Potvrdiť',
|
|
9
9
|
cancel: 'Zrušiť',
|
|
10
|
-
close: 'Zavrieť',
|
|
11
|
-
remove: 'Odstrániť',
|
|
12
10
|
pay: 'Zaplaťte',
|
|
13
11
|
change: 'Zmeniť',
|
|
14
12
|
free: 'Zadarmo',
|
|
@@ -55,8 +53,6 @@ const sk = {
|
|
|
55
53
|
category: 'Kategória',
|
|
56
54
|
sms_notification: 'SMS notifikácia',
|
|
57
55
|
open_map: 'Otvoriť mapu',
|
|
58
|
-
payment_overview_open: 'Otvoriť prehľad platby',
|
|
59
|
-
payment_overview_close: 'Zavrieť prehľad platby',
|
|
60
56
|
},
|
|
61
57
|
validation: {
|
|
62
58
|
required: 'Toto pole je povinné.',
|
|
@@ -109,10 +105,6 @@ const sk = {
|
|
|
109
105
|
7: {
|
|
110
106
|
title: 'Pridružené eventy',
|
|
111
107
|
},
|
|
112
|
-
8: {
|
|
113
|
-
title: 'EventLook služby',
|
|
114
|
-
additional_info: 'Viac informácií o službách',
|
|
115
|
-
},
|
|
116
108
|
},
|
|
117
109
|
terms_and_conditions:
|
|
118
110
|
'Odoslaním objednávky súhlasím s <0>Obchodnými podmienkami</0> {{termsAndConditionsCompanies}} a beriem na vedomie <1>Zásady ochrany osobných údajov</1>.',
|
|
@@ -136,13 +128,6 @@ const sk = {
|
|
|
136
128
|
price: 'Cena SMS pripomenutia termínu akcie',
|
|
137
129
|
},
|
|
138
130
|
},
|
|
139
|
-
merchandise: {
|
|
140
|
-
show_sizes: 'Zobraziť veľkosti',
|
|
141
|
-
show_added: 'Zobraziť pridané',
|
|
142
|
-
},
|
|
143
|
-
services: {
|
|
144
|
-
add_tickets_first: 'Najskôr prosím pridajte lístky',
|
|
145
|
-
},
|
|
146
131
|
order_success: {
|
|
147
132
|
title: 'Vstupenky boli úspešne rezervované. Teraz už len zaplatiť.',
|
|
148
133
|
description:
|