@lodashventure/medusa-booking-for-pickup 1.4.19 → 1.4.22
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/.medusa/server/src/admin/index.js +34 -10
- package/.medusa/server/src/admin/index.mjs +35 -11
- package/.medusa/server/src/api/admin/customers/[id]/pickup-history/route.js +56 -43
- package/.medusa/server/src/api/store/customers/me/pickup-history/route.js +56 -43
- package/.medusa/server/src/links/shipping-option-pickup-availability.js +4 -5
- package/package.json +2 -1
|
@@ -460,7 +460,7 @@ const usePickupAvailable = (id) => {
|
|
|
460
460
|
setError(null);
|
|
461
461
|
try {
|
|
462
462
|
const option = await sdk.admin.shippingOption.retrieve(id, {
|
|
463
|
-
fields: "*.*,pickup_availabilities.*"
|
|
463
|
+
fields: "*.*,pickupAvailability.*,pickup_availabilities.*"
|
|
464
464
|
});
|
|
465
465
|
if (option.shipping_option.service_zone.fulfillment_set.type !== "pickup") {
|
|
466
466
|
throw new Error("shipping option is not pickup");
|
|
@@ -629,22 +629,46 @@ const DEFAULT_SCHEDULE = {
|
|
|
629
629
|
function ShippingOptionDetails() {
|
|
630
630
|
const { id } = reactRouterDom.useParams();
|
|
631
631
|
const navigate = reactRouterDom.useNavigate();
|
|
632
|
-
const sdk2 = adminSdk.useSdk();
|
|
633
632
|
const [schedule, setSchedule] = react.useState(
|
|
634
633
|
structuredClone(DEFAULT_SCHEDULE)
|
|
635
634
|
);
|
|
636
635
|
const { data, refetch, error } = usePickupAvailable(id);
|
|
637
636
|
react.useEffect(() => {
|
|
638
|
-
if (!data)
|
|
637
|
+
if (!(data == null ? void 0 : data.shipping_option)) {
|
|
638
|
+
return;
|
|
639
|
+
}
|
|
639
640
|
const _schedule = structuredClone(DEFAULT_SCHEDULE);
|
|
640
|
-
|
|
641
|
-
|
|
641
|
+
const normalizeInput = (input) => {
|
|
642
|
+
if (!input) {
|
|
643
|
+
return [];
|
|
644
|
+
}
|
|
645
|
+
if (Array.isArray(input)) {
|
|
646
|
+
return input;
|
|
647
|
+
}
|
|
648
|
+
if (typeof input === "object") {
|
|
649
|
+
return Object.values(input);
|
|
650
|
+
}
|
|
651
|
+
return [];
|
|
652
|
+
};
|
|
653
|
+
const normalized = [
|
|
654
|
+
...normalizeInput(data.shipping_option.pickup_availabilities),
|
|
655
|
+
...normalizeInput(data.shipping_option.pickupAvailability)
|
|
656
|
+
];
|
|
657
|
+
normalized.forEach((availability) => {
|
|
658
|
+
if (!(availability == null ? void 0 : availability.day_of_week)) {
|
|
659
|
+
return;
|
|
660
|
+
}
|
|
661
|
+
const dayKey = availability.day_of_week.toLowerCase();
|
|
662
|
+
if (!_schedule[dayKey]) {
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
665
|
+
const timeSlots = _schedule[dayKey].timeSlots;
|
|
642
666
|
timeSlots.push({
|
|
643
667
|
start: dateToString(availability.timeStart),
|
|
644
668
|
end: dateToString(availability.timeEnd)
|
|
645
669
|
});
|
|
646
|
-
_schedule[
|
|
647
|
-
enabled: availability.enable,
|
|
670
|
+
_schedule[dayKey] = {
|
|
671
|
+
enabled: Boolean(availability.enable),
|
|
648
672
|
timeSlots
|
|
649
673
|
};
|
|
650
674
|
});
|
|
@@ -679,12 +703,12 @@ function ShippingOptionDetails() {
|
|
|
679
703
|
return;
|
|
680
704
|
}
|
|
681
705
|
try {
|
|
682
|
-
await
|
|
706
|
+
await sdk.client.fetch(`/admin/pickup-date/${id}`, {
|
|
683
707
|
method: "POST",
|
|
684
708
|
headers: {
|
|
685
709
|
"Content-Type": "application/json"
|
|
686
710
|
},
|
|
687
|
-
body:
|
|
711
|
+
body: {
|
|
688
712
|
schedules: Object.entries(schedule).filter(([_, daySchedule]) => daySchedule.enabled).map(([day, { enabled, timeSlots }]) => ({
|
|
689
713
|
day_of_week: day,
|
|
690
714
|
enable: enabled,
|
|
@@ -693,7 +717,7 @@ function ShippingOptionDetails() {
|
|
|
693
717
|
end: slot.end
|
|
694
718
|
}))
|
|
695
719
|
}))
|
|
696
|
-
}
|
|
720
|
+
}
|
|
697
721
|
});
|
|
698
722
|
refetch();
|
|
699
723
|
ui.toast.success("Availability updated", {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { defineWidgetConfig, defineRouteConfig
|
|
2
|
+
import { defineWidgetConfig, defineRouteConfig } from "@medusajs/admin-sdk";
|
|
3
3
|
import { Container, Heading, Text, Badge, Button, toast, createDataTableColumnHelper, useDataTable, DataTable, Select, clx, Switch, IconButton } from "@medusajs/ui";
|
|
4
4
|
import { useState, useEffect, useMemo, useCallback } from "react";
|
|
5
5
|
import { Calendar, Package, ShoppingBag, Clock, MapPin, RefreshCw, ArrowLeft, Trash2 } from "lucide-react";
|
|
@@ -457,7 +457,7 @@ const usePickupAvailable = (id) => {
|
|
|
457
457
|
setError(null);
|
|
458
458
|
try {
|
|
459
459
|
const option = await sdk.admin.shippingOption.retrieve(id, {
|
|
460
|
-
fields: "*.*,pickup_availabilities.*"
|
|
460
|
+
fields: "*.*,pickupAvailability.*,pickup_availabilities.*"
|
|
461
461
|
});
|
|
462
462
|
if (option.shipping_option.service_zone.fulfillment_set.type !== "pickup") {
|
|
463
463
|
throw new Error("shipping option is not pickup");
|
|
@@ -626,22 +626,46 @@ const DEFAULT_SCHEDULE = {
|
|
|
626
626
|
function ShippingOptionDetails() {
|
|
627
627
|
const { id } = useParams();
|
|
628
628
|
const navigate = useNavigate();
|
|
629
|
-
const sdk2 = useSdk();
|
|
630
629
|
const [schedule, setSchedule] = useState(
|
|
631
630
|
structuredClone(DEFAULT_SCHEDULE)
|
|
632
631
|
);
|
|
633
632
|
const { data, refetch, error } = usePickupAvailable(id);
|
|
634
633
|
useEffect(() => {
|
|
635
|
-
if (!data)
|
|
634
|
+
if (!(data == null ? void 0 : data.shipping_option)) {
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
636
637
|
const _schedule = structuredClone(DEFAULT_SCHEDULE);
|
|
637
|
-
|
|
638
|
-
|
|
638
|
+
const normalizeInput = (input) => {
|
|
639
|
+
if (!input) {
|
|
640
|
+
return [];
|
|
641
|
+
}
|
|
642
|
+
if (Array.isArray(input)) {
|
|
643
|
+
return input;
|
|
644
|
+
}
|
|
645
|
+
if (typeof input === "object") {
|
|
646
|
+
return Object.values(input);
|
|
647
|
+
}
|
|
648
|
+
return [];
|
|
649
|
+
};
|
|
650
|
+
const normalized = [
|
|
651
|
+
...normalizeInput(data.shipping_option.pickup_availabilities),
|
|
652
|
+
...normalizeInput(data.shipping_option.pickupAvailability)
|
|
653
|
+
];
|
|
654
|
+
normalized.forEach((availability) => {
|
|
655
|
+
if (!(availability == null ? void 0 : availability.day_of_week)) {
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
const dayKey = availability.day_of_week.toLowerCase();
|
|
659
|
+
if (!_schedule[dayKey]) {
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
const timeSlots = _schedule[dayKey].timeSlots;
|
|
639
663
|
timeSlots.push({
|
|
640
664
|
start: dateToString(availability.timeStart),
|
|
641
665
|
end: dateToString(availability.timeEnd)
|
|
642
666
|
});
|
|
643
|
-
_schedule[
|
|
644
|
-
enabled: availability.enable,
|
|
667
|
+
_schedule[dayKey] = {
|
|
668
|
+
enabled: Boolean(availability.enable),
|
|
645
669
|
timeSlots
|
|
646
670
|
};
|
|
647
671
|
});
|
|
@@ -676,12 +700,12 @@ function ShippingOptionDetails() {
|
|
|
676
700
|
return;
|
|
677
701
|
}
|
|
678
702
|
try {
|
|
679
|
-
await
|
|
703
|
+
await sdk.client.fetch(`/admin/pickup-date/${id}`, {
|
|
680
704
|
method: "POST",
|
|
681
705
|
headers: {
|
|
682
706
|
"Content-Type": "application/json"
|
|
683
707
|
},
|
|
684
|
-
body:
|
|
708
|
+
body: {
|
|
685
709
|
schedules: Object.entries(schedule).filter(([_, daySchedule]) => daySchedule.enabled).map(([day, { enabled, timeSlots }]) => ({
|
|
686
710
|
day_of_week: day,
|
|
687
711
|
enable: enabled,
|
|
@@ -690,7 +714,7 @@ function ShippingOptionDetails() {
|
|
|
690
714
|
end: slot.end
|
|
691
715
|
}))
|
|
692
716
|
}))
|
|
693
|
-
}
|
|
717
|
+
}
|
|
694
718
|
});
|
|
695
719
|
refetch();
|
|
696
720
|
toast.success("Availability updated", {
|
|
@@ -6,8 +6,45 @@ const GET = async (req, res) => {
|
|
|
6
6
|
const { id: customer_id } = req.params;
|
|
7
7
|
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
8
8
|
try {
|
|
9
|
-
//
|
|
10
|
-
const
|
|
9
|
+
// Fetch customer orders first because pickup_date doesn't expose the customer relationship.
|
|
10
|
+
const ordersResult = (await query.graph({
|
|
11
|
+
entity: "order",
|
|
12
|
+
fields: [
|
|
13
|
+
"id",
|
|
14
|
+
"display_id",
|
|
15
|
+
"status",
|
|
16
|
+
"created_at",
|
|
17
|
+
"total",
|
|
18
|
+
"currency_code",
|
|
19
|
+
"items.id",
|
|
20
|
+
"shipping_methods.name",
|
|
21
|
+
],
|
|
22
|
+
filters: {
|
|
23
|
+
customer_id,
|
|
24
|
+
},
|
|
25
|
+
pagination: {
|
|
26
|
+
order: {
|
|
27
|
+
created_at: "DESC",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
}));
|
|
31
|
+
const orders = ordersResult.data || [];
|
|
32
|
+
if (!orders.length) {
|
|
33
|
+
return res.status(200).json({
|
|
34
|
+
pickup_history: [],
|
|
35
|
+
count: 0,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const orderIds = Array.from(new Set(orders
|
|
39
|
+
.map((order) => order.id)
|
|
40
|
+
.filter((id) => typeof id === "string" && id.length > 0)));
|
|
41
|
+
if (!orderIds.length) {
|
|
42
|
+
return res.status(200).json({
|
|
43
|
+
pickup_history: [],
|
|
44
|
+
count: 0,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const pickupResult = (await query.graph({
|
|
11
48
|
entity: "pickup_date",
|
|
12
49
|
fields: [
|
|
13
50
|
"id",
|
|
@@ -17,53 +54,29 @@ const GET = async (req, res) => {
|
|
|
17
54
|
"updated_at",
|
|
18
55
|
],
|
|
19
56
|
filters: {
|
|
20
|
-
|
|
21
|
-
customer_id: customer_id,
|
|
22
|
-
},
|
|
57
|
+
order_id: orderIds,
|
|
23
58
|
},
|
|
24
59
|
pagination: {
|
|
25
60
|
order: {
|
|
26
|
-
|
|
61
|
+
pickup_datetime: "DESC",
|
|
27
62
|
},
|
|
28
63
|
},
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const orders = await query.graph({
|
|
37
|
-
entity: "order",
|
|
38
|
-
fields: [
|
|
39
|
-
"id",
|
|
40
|
-
"display_id",
|
|
41
|
-
"status",
|
|
42
|
-
"created_at",
|
|
43
|
-
"total",
|
|
44
|
-
"currency_code",
|
|
45
|
-
"items.*",
|
|
46
|
-
"shipping_methods.*",
|
|
47
|
-
],
|
|
48
|
-
filters: {
|
|
49
|
-
id: orderIds,
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
// Map orders to pickup dates
|
|
53
|
-
const orderMap = new Map(orders.data.map((order) => [order.id, order]));
|
|
54
|
-
const enrichedPickups = pickupDates.map((pickup) => ({
|
|
55
|
-
...pickup,
|
|
56
|
-
order: orderMap.get(pickup.order_id) || null,
|
|
57
|
-
}));
|
|
58
|
-
return res.status(200).json({
|
|
59
|
-
pickup_history: enrichedPickups,
|
|
60
|
-
count: enrichedPickups.length,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
64
|
+
}));
|
|
65
|
+
const pickupDates = pickupResult.data || [];
|
|
66
|
+
if (!pickupDates.length) {
|
|
67
|
+
return res.status(200).json({
|
|
68
|
+
pickup_history: [],
|
|
69
|
+
count: 0,
|
|
70
|
+
});
|
|
63
71
|
}
|
|
72
|
+
const orderMap = new Map(orders.map((order) => [order.id, order]));
|
|
73
|
+
const enrichedPickups = pickupDates.map((pickup) => ({
|
|
74
|
+
...pickup,
|
|
75
|
+
order: pickup.order_id ? orderMap.get(pickup.order_id) ?? null : null,
|
|
76
|
+
}));
|
|
64
77
|
return res.status(200).json({
|
|
65
|
-
pickup_history:
|
|
66
|
-
count:
|
|
78
|
+
pickup_history: enrichedPickups,
|
|
79
|
+
count: enrichedPickups.length,
|
|
67
80
|
});
|
|
68
81
|
}
|
|
69
82
|
catch (error) {
|
|
@@ -74,4 +87,4 @@ const GET = async (req, res) => {
|
|
|
74
87
|
}
|
|
75
88
|
};
|
|
76
89
|
exports.GET = GET;
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2N1c3RvbWVycy9baWRdL3BpY2t1cC1oaXN0b3J5L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFzRTtBQXlCL0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVqRSxJQUFJLENBQUM7UUFDSCw0RkFBNEY7UUFDNUYsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDdEMsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUU7Z0JBQ04sSUFBSTtnQkFDSixZQUFZO2dCQUNaLFFBQVE7Z0JBQ1IsWUFBWTtnQkFDWixPQUFPO2dCQUNQLGVBQWU7Z0JBQ2YsVUFBVTtnQkFDVix1QkFBdUI7YUFDeEI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsV0FBVzthQUNaO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLEtBQUssRUFBRTtvQkFDTCxVQUFVLEVBQUUsTUFBTTtpQkFDbkI7YUFDRjtTQUNGLENBQUMsQ0FBNEIsQ0FBQztRQUUvQixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUV2QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixLQUFLLEVBQUUsQ0FBQzthQUNULENB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
|
|
@@ -10,8 +10,45 @@ const GET = async (req, res) => {
|
|
|
10
10
|
const customer_id = req.auth_context.actor_id;
|
|
11
11
|
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
12
12
|
try {
|
|
13
|
-
//
|
|
14
|
-
const
|
|
13
|
+
// Fetch customer orders first because pickup_date doesn't expose the customer relationship.
|
|
14
|
+
const ordersResult = (await query.graph({
|
|
15
|
+
entity: "order",
|
|
16
|
+
fields: [
|
|
17
|
+
"id",
|
|
18
|
+
"display_id",
|
|
19
|
+
"status",
|
|
20
|
+
"created_at",
|
|
21
|
+
"total",
|
|
22
|
+
"currency_code",
|
|
23
|
+
"items.id",
|
|
24
|
+
"shipping_methods.name",
|
|
25
|
+
],
|
|
26
|
+
filters: {
|
|
27
|
+
customer_id,
|
|
28
|
+
},
|
|
29
|
+
pagination: {
|
|
30
|
+
order: {
|
|
31
|
+
created_at: "DESC",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
}));
|
|
35
|
+
const orders = ordersResult.data || [];
|
|
36
|
+
if (!orders.length) {
|
|
37
|
+
return res.status(200).json({
|
|
38
|
+
pickup_history: [],
|
|
39
|
+
count: 0,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const orderIds = Array.from(new Set(orders
|
|
43
|
+
.map((order) => order.id)
|
|
44
|
+
.filter((id) => typeof id === "string" && id.length > 0)));
|
|
45
|
+
if (!orderIds.length) {
|
|
46
|
+
return res.status(200).json({
|
|
47
|
+
pickup_history: [],
|
|
48
|
+
count: 0,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const pickupResult = (await query.graph({
|
|
15
52
|
entity: "pickup_date",
|
|
16
53
|
fields: [
|
|
17
54
|
"id",
|
|
@@ -21,53 +58,29 @@ const GET = async (req, res) => {
|
|
|
21
58
|
"updated_at",
|
|
22
59
|
],
|
|
23
60
|
filters: {
|
|
24
|
-
|
|
25
|
-
customer_id: customer_id,
|
|
26
|
-
},
|
|
61
|
+
order_id: orderIds,
|
|
27
62
|
},
|
|
28
63
|
pagination: {
|
|
29
64
|
order: {
|
|
30
|
-
|
|
65
|
+
pickup_datetime: "DESC",
|
|
31
66
|
},
|
|
32
67
|
},
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const orders = await query.graph({
|
|
41
|
-
entity: "order",
|
|
42
|
-
fields: [
|
|
43
|
-
"id",
|
|
44
|
-
"display_id",
|
|
45
|
-
"status",
|
|
46
|
-
"created_at",
|
|
47
|
-
"total",
|
|
48
|
-
"currency_code",
|
|
49
|
-
"items.*",
|
|
50
|
-
"shipping_methods.*",
|
|
51
|
-
],
|
|
52
|
-
filters: {
|
|
53
|
-
id: orderIds,
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
// Map orders to pickup dates
|
|
57
|
-
const orderMap = new Map(orders.data.map((order) => [order.id, order]));
|
|
58
|
-
const enrichedPickups = pickupDates.map((pickup) => ({
|
|
59
|
-
...pickup,
|
|
60
|
-
order: orderMap.get(pickup.order_id) || null,
|
|
61
|
-
}));
|
|
62
|
-
return res.status(200).json({
|
|
63
|
-
pickup_history: enrichedPickups,
|
|
64
|
-
count: enrichedPickups.length,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
68
|
+
}));
|
|
69
|
+
const pickupDates = pickupResult.data || [];
|
|
70
|
+
if (!pickupDates.length) {
|
|
71
|
+
return res.status(200).json({
|
|
72
|
+
pickup_history: [],
|
|
73
|
+
count: 0,
|
|
74
|
+
});
|
|
67
75
|
}
|
|
76
|
+
const orderMap = new Map(orders.map((order) => [order.id, order]));
|
|
77
|
+
const enrichedPickups = pickupDates.map((pickup) => ({
|
|
78
|
+
...pickup,
|
|
79
|
+
order: pickup.order_id ? orderMap.get(pickup.order_id) ?? null : null,
|
|
80
|
+
}));
|
|
68
81
|
return res.status(200).json({
|
|
69
|
-
pickup_history:
|
|
70
|
-
count:
|
|
82
|
+
pickup_history: enrichedPickups,
|
|
83
|
+
count: enrichedPickups.length,
|
|
71
84
|
});
|
|
72
85
|
}
|
|
73
86
|
catch (error) {
|
|
@@ -78,4 +91,4 @@ const GET = async (req, res) => {
|
|
|
78
91
|
}
|
|
79
92
|
};
|
|
80
93
|
exports.GET = GET;
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9tZS9waWNrdXAtaGlzdG9yeS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxxREFBc0U7QUF5QnRFOzs7R0FHRztBQUNJLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQzlDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpFLElBQUksQ0FBQztRQUNILDRGQUE0RjtRQUM1RixNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN0QyxNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRTtnQkFDTixJQUFJO2dCQUNKLFlBQVk7Z0JBQ1osUUFBUTtnQkFDUixZQUFZO2dCQUNaLE9BQU87Z0JBQ1AsZUFBZTtnQkFDZixVQUFVO2dCQUNWLHVCQUF1QjthQUN4QjtZQUNELE9BQU8sRUFBRTtnQkFDUCxXQUFXO2FBQ1o7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFO29CQUNMLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjthQUNGO1NBQ0YsQ0FBQyxDQUE0QixDQUFDO1FBRS9CLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDMUIsY0FBYyxFQUFFLEVBQUU7Z0JBQ2xCLEtBQUssRUFBRSxDQUFDO2FBQ1Qs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
|
|
@@ -7,10 +7,9 @@ const utils_1 = require("@medusajs/framework/utils");
|
|
|
7
7
|
const fulfillment_1 = __importDefault(require("@medusajs/medusa/fulfillment"));
|
|
8
8
|
const pickup_datetime_1 = __importDefault(require("../modules/pickup-datetime"));
|
|
9
9
|
exports.default = (0, utils_1.defineLink)({
|
|
10
|
-
linkable:
|
|
11
|
-
|
|
10
|
+
linkable: pickup_datetime_1.default.linkable.pickupAvailability,
|
|
11
|
+
foreignKey: "shipping_option_id",
|
|
12
12
|
}, {
|
|
13
|
-
linkable:
|
|
14
|
-
isList: true,
|
|
13
|
+
linkable: fulfillment_1.default.linkable.shippingOption,
|
|
15
14
|
});
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpcHBpbmctb3B0aW9uLXBpY2t1cC1hdmFpbGFiaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGlua3Mvc2hpcHBpbmctb3B0aW9uLXBpY2t1cC1hdmFpbGFiaWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBdUQ7QUFDdkQsK0VBQTZEO0FBQzdELGlGQUE4RDtBQUU5RCxrQkFBZSxJQUFBLGtCQUFVLEVBQ3ZCO0lBQ0UsUUFBUSxFQUFFLHlCQUFvQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0I7SUFDMUQsVUFBVSxFQUFFLG9CQUFvQjtDQUNqQyxFQUNEO0lBQ0UsUUFBUSxFQUFFLHFCQUFpQixDQUFDLFFBQVEsQ0FBQyxjQUFjO0NBQ3BELENBQ0YsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodashventure/medusa-booking-for-pickup",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.22",
|
|
4
4
|
"description": "A starter for Medusa plugins.",
|
|
5
5
|
"author": "Medusa (https://medusajs.com)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"prop-types": "^15.8.1",
|
|
45
45
|
"react": "^18.2.0",
|
|
46
46
|
"react-dom": "^18.2.0",
|
|
47
|
+
"react-router-dom": "^6.22.0",
|
|
47
48
|
"ts-node": "^10.9.2",
|
|
48
49
|
"typescript": "^5.6.2",
|
|
49
50
|
"vite": "^5.2.11",
|