@lodashventure/medusa-parcel-shipping 0.2.8 → 0.2.11
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/api/admin/documents/packing-slip/preview/route.js +7 -7
- package/.medusa/server/api/admin/documents/packing-slip/route.js +20 -27
- package/.medusa/server/modules/documents/service.js +42 -35
- package/.medusa/server/src/admin/index.js +391 -2
- package/.medusa/server/src/admin/index.mjs +394 -5
- package/package.json +5 -4
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports.GET = void 0;
|
|
15
|
-
const utils_1 = require("@medusajs/utils");
|
|
15
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
16
16
|
const documents_1 = require("../../../../../modules/documents");
|
|
17
17
|
const utils_2 = require("@medusajs/framework/utils");
|
|
18
18
|
const GET = async (req, res) => {
|
|
@@ -20,11 +20,11 @@ const GET = async (req, res) => {
|
|
|
20
20
|
const orderModuleService = req.scope.resolve(utils_2.Modules.ORDER);
|
|
21
21
|
const lastOrders = await orderModuleService.listOrders({}, {
|
|
22
22
|
order: {
|
|
23
|
-
created_at: "DESC"
|
|
23
|
+
created_at: "DESC",
|
|
24
24
|
},
|
|
25
25
|
take: 1,
|
|
26
|
-
select: [
|
|
27
|
-
relations: [
|
|
26
|
+
select: ["*", "item_total", "shipping_total", "tax_total"],
|
|
27
|
+
relations: ["shipping_address", "billing_address", "items"],
|
|
28
28
|
});
|
|
29
29
|
try {
|
|
30
30
|
if (lastOrders && lastOrders.length) {
|
|
@@ -34,14 +34,14 @@ const GET = async (req, res) => {
|
|
|
34
34
|
res.status(201).json(result);
|
|
35
35
|
}
|
|
36
36
|
else {
|
|
37
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA,
|
|
37
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "You need to have at least one order to see preview");
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
catch (e) {
|
|
41
41
|
res.status(400).json({
|
|
42
|
-
message: e.message
|
|
42
|
+
message: e.message,
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
46
|
exports.GET = GET;
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2RvY3VtZW50cy9wYWNraW5nLXNsaXAvcHJldmlldy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7O0FBR0gscURBQXdEO0FBR3hELGdFQUFvRTtBQUVwRSxxREFBb0Q7QUFFN0MsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sc0JBQXNCLEdBQzFCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDRCQUFnQixDQUFDLENBQUM7SUFFdEMsTUFBTSxrQkFBa0IsR0FBd0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQy9ELGVBQU8sQ0FBQyxLQUFLLENBQ2QsQ0FBQztJQUVGLE1BQU0sVUFBVSxHQUFlLE1BQU0sa0JBQWtCLENBQUMsVUFBVSxDQUNoRSxFQUFFLEVBQ0Y7UUFDRSxLQUFLLEVBQUU7WUFDTCxVQUFVLEVBQUUsTUFBTTtTQUNuQjtRQUNELElBQUksRUFBRSxDQUFDO1FBQ1AsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLENBQUM7UUFDMUQsU0FBUyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxDQUFDO0tBQzVELENBQ0YsQ0FBQztJQUNGLElBQUksQ0FBQztRQUNILElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFVBQVUsR0FBRyxHQUFxQixDQUFDO1lBQ3pDLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQy9DLE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQXNCLENBQUMsdUJBQXVCLENBQ2pFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFDYixZQUF1QyxDQUN4QyxDQUFDO1lBQ0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixvREFBb0QsQ0FDckQsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTztTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBdkNXLFFBQUEsR0FBRyxPQXVDZCJ9
|
|
@@ -15,7 +15,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.GET = exports.POST = void 0;
|
|
18
|
-
const utils_1 = require("@medusajs/utils");
|
|
18
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
19
19
|
const documents_1 = require("../../../../modules/documents");
|
|
20
20
|
const utils_2 = require("@medusajs/framework/utils");
|
|
21
21
|
const utils_3 = require("@medusajs/framework/utils");
|
|
@@ -26,8 +26,8 @@ const POST = async (req, res) => {
|
|
|
26
26
|
try {
|
|
27
27
|
const body = req.body;
|
|
28
28
|
const order = await orderModuleService.retrieveOrder(body.order_id, {
|
|
29
|
-
select: [
|
|
30
|
-
relations: [
|
|
29
|
+
select: ["*", "item_total", "shipping_total", "tax_total"],
|
|
30
|
+
relations: ["shipping_address", "billing_address", "items"],
|
|
31
31
|
});
|
|
32
32
|
if (order) {
|
|
33
33
|
const result = await documentsModuleService.generatePackingSlipForOrder(order);
|
|
@@ -36,35 +36,32 @@ const POST = async (req, res) => {
|
|
|
36
36
|
const { data: [orderWithPackingSlip], } = await query.graph({
|
|
37
37
|
entity: "order",
|
|
38
38
|
filters: {
|
|
39
|
-
id: [
|
|
40
|
-
order.id
|
|
41
|
-
]
|
|
39
|
+
id: [order.id],
|
|
42
40
|
},
|
|
43
|
-
fields: [
|
|
44
|
-
"document_packing_slip.*",
|
|
45
|
-
],
|
|
41
|
+
fields: ["document_packing_slip.*"],
|
|
46
42
|
});
|
|
47
|
-
await (0, assign_packing_slip_1.default)(req.scope)
|
|
48
|
-
.run({
|
|
43
|
+
await (0, assign_packing_slip_1.default)(req.scope).run({
|
|
49
44
|
input: {
|
|
50
45
|
orderId: order.id,
|
|
51
46
|
newPackingSlipId: result.packingSlip.id,
|
|
52
|
-
oldPackingSlipId: orderWithPackingSlip.document_packing_slip
|
|
53
|
-
|
|
47
|
+
oldPackingSlipId: orderWithPackingSlip.document_packing_slip
|
|
48
|
+
? orderWithPackingSlip.document_packing_slip.id
|
|
49
|
+
: undefined,
|
|
50
|
+
},
|
|
54
51
|
});
|
|
55
52
|
res.status(201).json(result);
|
|
56
53
|
}
|
|
57
54
|
else {
|
|
58
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA,
|
|
55
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Packing slip not generated");
|
|
59
56
|
}
|
|
60
57
|
}
|
|
61
58
|
else {
|
|
62
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA,
|
|
59
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid order id");
|
|
63
60
|
}
|
|
64
61
|
}
|
|
65
62
|
catch (e) {
|
|
66
63
|
res.status(400).json({
|
|
67
|
-
message: e.message
|
|
64
|
+
message: e.message,
|
|
68
65
|
});
|
|
69
66
|
}
|
|
70
67
|
};
|
|
@@ -78,35 +75,31 @@ const GET = async (req, res) => {
|
|
|
78
75
|
const { data: [orderWithPackingSlip], } = await query.graph({
|
|
79
76
|
entity: "order",
|
|
80
77
|
filters: {
|
|
81
|
-
id: [
|
|
82
|
-
orderId
|
|
83
|
-
]
|
|
78
|
+
id: [orderId],
|
|
84
79
|
},
|
|
85
|
-
fields: [
|
|
86
|
-
"document_packing_slip.*",
|
|
87
|
-
],
|
|
80
|
+
fields: ["document_packing_slip.*"],
|
|
88
81
|
});
|
|
89
82
|
if (orderWithPackingSlip.document_packing_slip && orderId) {
|
|
90
83
|
const orderModuleService = req.scope.resolve(utils_2.Modules.ORDER);
|
|
91
84
|
const orderDto = await orderModuleService.retrieveOrder(orderId, {
|
|
92
|
-
select: [
|
|
93
|
-
relations: [
|
|
85
|
+
select: ["*", "item_total", "shipping_total", "tax_total"],
|
|
86
|
+
relations: ["shipping_address", "billing_address", "items"],
|
|
94
87
|
});
|
|
95
88
|
const result = await documentsModuleService.getPackingSlip(orderDto, orderWithPackingSlip.document_packing_slip.id, includeBuffer !== undefined);
|
|
96
89
|
res.status(200).json(result);
|
|
97
90
|
}
|
|
98
91
|
else {
|
|
99
92
|
const result = {
|
|
100
|
-
packingSlip: undefined
|
|
93
|
+
packingSlip: undefined,
|
|
101
94
|
};
|
|
102
95
|
res.status(200).json(result);
|
|
103
96
|
}
|
|
104
97
|
}
|
|
105
98
|
catch (e) {
|
|
106
99
|
res.status(400).json({
|
|
107
|
-
message: e.message
|
|
100
|
+
message: e.message,
|
|
108
101
|
});
|
|
109
102
|
}
|
|
110
103
|
};
|
|
111
104
|
exports.GET = GET;
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2RvY3VtZW50cy9wYWNraW5nLXNsaXAvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0dBVUc7Ozs7OztBQUlILHFEQUF3RDtBQUV4RCw2REFBaUU7QUFDakUscURBQW9EO0FBQ3BELHFEQUFzRTtBQUN0RSxzR0FBMkY7QUFFcEYsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sc0JBQXNCLEdBQzFCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDRCQUFnQixDQUFDLENBQUM7SUFDdEMsTUFBTSxrQkFBa0IsR0FBd0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQy9ELGVBQU8sQ0FBQyxLQUFLLENBQ2QsQ0FBQztJQUVGLElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFRLEdBQUcsQ0FBQyxJQUFXLENBQUM7UUFDbEMsTUFBTSxLQUFLLEdBQWEsTUFBTSxrQkFBa0IsQ0FBQyxhQUFhLENBQzVELElBQUksQ0FBQyxRQUFRLEVBQ2I7WUFDRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsQ0FBQztZQUMxRCxTQUFTLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLENBQUM7U0FDNUQsQ0FDRixDQUFDO1FBQ0YsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sTUFBTSxHQUNWLE1BQU0sc0JBQXNCLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEUsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FB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
|
|
@@ -14,7 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
const utils_1 = require("@medusajs/utils");
|
|
17
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
18
18
|
const utils_2 = require("@medusajs/framework/utils");
|
|
19
19
|
const document_packing_slip_1 = __importDefault(require("./models/document-packing-slip"));
|
|
20
20
|
const document_settings_1 = __importDefault(require("./models/document-settings"));
|
|
@@ -25,7 +25,7 @@ const packing_slip_generator_1 = require("./services/generators/packing-slip-gen
|
|
|
25
25
|
class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
26
26
|
DocumentPackingSlip: document_packing_slip_1.default,
|
|
27
27
|
DocumentSettings: document_settings_1.default,
|
|
28
|
-
DocumentPackingSlipSettings: document_packing_slip_settings_1.default
|
|
28
|
+
DocumentPackingSlipSettings: document_packing_slip_settings_1.default,
|
|
29
29
|
}) {
|
|
30
30
|
constructor({}, options) {
|
|
31
31
|
super(...arguments);
|
|
@@ -34,26 +34,26 @@ class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
|
34
34
|
async getNextPackingSlipNumber() {
|
|
35
35
|
const lastPackingSlip = await this.listDocumentPackingSlips({}, {
|
|
36
36
|
order: {
|
|
37
|
-
created_at: "DESC"
|
|
37
|
+
created_at: "DESC",
|
|
38
38
|
},
|
|
39
|
-
take: 1
|
|
39
|
+
take: 1,
|
|
40
40
|
});
|
|
41
41
|
if (lastPackingSlip && lastPackingSlip.length) {
|
|
42
42
|
return (lastPackingSlip[0].number + 1).toString();
|
|
43
43
|
}
|
|
44
|
-
return
|
|
44
|
+
return "1";
|
|
45
45
|
}
|
|
46
46
|
async getPackingSlip(order, packingSlipId, includeBuffer = false) {
|
|
47
47
|
if (includeBuffer) {
|
|
48
48
|
const packingSlip = await this.retrieveDocumentPackingSlip(packingSlipId, {
|
|
49
|
-
relations: [
|
|
49
|
+
relations: ["packingSlipSettings", "settings"],
|
|
50
50
|
});
|
|
51
51
|
if (packingSlip) {
|
|
52
52
|
const calculatedTemplateKind = this.calculatePackingSlipTemplateKind(packingSlip.packingSlipSettings);
|
|
53
53
|
const buffer = await (0, packing_slip_generator_1.generatePackingSlip)(calculatedTemplateKind, packingSlip.settings, packingSlip, order);
|
|
54
54
|
return {
|
|
55
55
|
packingSlip: packingSlip,
|
|
56
|
-
buffer: buffer
|
|
56
|
+
buffer: buffer,
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -61,16 +61,16 @@ class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
|
61
61
|
const packingSlip = await this.retrieveDocumentPackingSlip(packingSlipId);
|
|
62
62
|
return {
|
|
63
63
|
packingSlip: packingSlip,
|
|
64
|
-
buffer: undefined
|
|
64
|
+
buffer: undefined,
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
async generateTestPackingSlip(order, templateKind) {
|
|
69
69
|
const lastDocumentSettings = await this.listDocumentSettings({}, {
|
|
70
70
|
order: {
|
|
71
|
-
created_at: "DESC"
|
|
71
|
+
created_at: "DESC",
|
|
72
72
|
},
|
|
73
|
-
take: 1
|
|
73
|
+
take: 1,
|
|
74
74
|
});
|
|
75
75
|
if (lastDocumentSettings && lastDocumentSettings.length) {
|
|
76
76
|
const nextNumber = await this.getNextPackingSlipNumber();
|
|
@@ -79,12 +79,12 @@ class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
|
79
79
|
const testPackingSlip = {
|
|
80
80
|
number: parseInt(nextNumber),
|
|
81
81
|
displayNumber: nextNumber,
|
|
82
|
-
created_at: new Date(Date.now())
|
|
82
|
+
created_at: new Date(Date.now()),
|
|
83
83
|
};
|
|
84
84
|
const buffer = await (0, packing_slip_generator_1.generatePackingSlip)(templateKind, lastDocumentSettings[0], testPackingSlip, order);
|
|
85
85
|
return {
|
|
86
86
|
packingSlip: testPackingSlip,
|
|
87
|
-
buffer: buffer
|
|
87
|
+
buffer: buffer,
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
90
|
else {
|
|
@@ -101,18 +101,19 @@ class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
|
101
101
|
async generatePackingSlipForOrder(order) {
|
|
102
102
|
const lastDocumentSettings = await this.listDocumentSettings({}, {
|
|
103
103
|
order: {
|
|
104
|
-
created_at: "DESC"
|
|
104
|
+
created_at: "DESC",
|
|
105
105
|
},
|
|
106
|
-
take: 1
|
|
106
|
+
take: 1,
|
|
107
107
|
});
|
|
108
108
|
if (lastDocumentSettings && lastDocumentSettings.length) {
|
|
109
109
|
const lastDocumentPackingSlipSettings = await this.listDocumentPackingSlipSettings({}, {
|
|
110
110
|
order: {
|
|
111
|
-
created_at: "DESC"
|
|
111
|
+
created_at: "DESC",
|
|
112
112
|
},
|
|
113
|
-
take: 1
|
|
113
|
+
take: 1,
|
|
114
114
|
});
|
|
115
|
-
if (lastDocumentPackingSlipSettings &&
|
|
115
|
+
if (lastDocumentPackingSlipSettings &&
|
|
116
|
+
lastDocumentPackingSlipSettings.length) {
|
|
116
117
|
const packingSlipSettings = lastDocumentPackingSlipSettings[0];
|
|
117
118
|
const calculatedTemplateKind = this.calculatePackingSlipTemplateKind(lastDocumentPackingSlipSettings[0]);
|
|
118
119
|
const [validationPassed, info] = (0, packing_slip_generator_1.validateInputForProvidedKind)(calculatedTemplateKind, lastDocumentSettings[0]);
|
|
@@ -120,16 +121,18 @@ class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
|
120
121
|
const nextNumber = await this.getNextPackingSlipNumber();
|
|
121
122
|
const entryPackingSlip = {
|
|
122
123
|
number: parseInt(nextNumber),
|
|
123
|
-
displayNumber: packingSlipSettings.numberFormat
|
|
124
|
+
displayNumber: packingSlipSettings.numberFormat
|
|
125
|
+
? packingSlipSettings.numberFormat.replace(constants_1.PACKING_SLIP_NUMBER_PLACEHOLDER, nextNumber)
|
|
126
|
+
: nextNumber,
|
|
124
127
|
created_at: new Date(Date.now()),
|
|
125
128
|
packing_slip_settings_id: packingSlipSettings.id,
|
|
126
|
-
settings_id: lastDocumentSettings[0].id
|
|
129
|
+
settings_id: lastDocumentSettings[0].id,
|
|
127
130
|
};
|
|
128
131
|
const packingSlipResult = await this.createDocumentPackingSlips(entryPackingSlip);
|
|
129
132
|
const buffer = await (0, packing_slip_generator_1.generatePackingSlip)(calculatedTemplateKind, lastDocumentSettings[0], packingSlipResult, order);
|
|
130
133
|
return {
|
|
131
134
|
packingSlip: packingSlipResult,
|
|
132
|
-
buffer: buffer
|
|
135
|
+
buffer: buffer,
|
|
133
136
|
};
|
|
134
137
|
}
|
|
135
138
|
else {
|
|
@@ -137,32 +140,33 @@ class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
|
137
140
|
}
|
|
138
141
|
}
|
|
139
142
|
else {
|
|
140
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA,
|
|
143
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No packing slip settings found");
|
|
141
144
|
}
|
|
142
145
|
}
|
|
143
146
|
else {
|
|
144
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA,
|
|
147
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No document settings found");
|
|
145
148
|
}
|
|
146
149
|
}
|
|
147
150
|
async createOrUpdatePackingSlipSettingsWithTemplate(packingSlipTemplate) {
|
|
148
151
|
const lastDocumentPackingSlipSettings = await this.listDocumentPackingSlipSettings({}, {
|
|
149
152
|
order: {
|
|
150
|
-
created_at: "DESC"
|
|
153
|
+
created_at: "DESC",
|
|
151
154
|
},
|
|
152
|
-
take: 1
|
|
155
|
+
take: 1,
|
|
153
156
|
});
|
|
154
|
-
if (lastDocumentPackingSlipSettings &&
|
|
157
|
+
if (lastDocumentPackingSlipSettings &&
|
|
158
|
+
lastDocumentPackingSlipSettings.length) {
|
|
155
159
|
const newDocumentSettings = {
|
|
156
160
|
forcedNumber: lastDocumentPackingSlipSettings[0].forcedNumber,
|
|
157
161
|
numberFormat: lastDocumentPackingSlipSettings[0].numberFormat,
|
|
158
|
-
template: packingSlipTemplate
|
|
162
|
+
template: packingSlipTemplate,
|
|
159
163
|
};
|
|
160
164
|
const result = await this.createDocumentPackingSlipSettings(newDocumentSettings);
|
|
161
165
|
return result;
|
|
162
166
|
}
|
|
163
167
|
else {
|
|
164
168
|
const result = await this.createDocumentPackingSlipSettings({
|
|
165
|
-
template: packingSlipTemplate
|
|
169
|
+
template: packingSlipTemplate,
|
|
166
170
|
});
|
|
167
171
|
return result;
|
|
168
172
|
}
|
|
@@ -170,14 +174,17 @@ class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
|
170
174
|
async updatePackingSlipSettings(newFormatNumber, forcedNumber, template) {
|
|
171
175
|
const lastDocumentPackingSlipSettings = await this.listDocumentPackingSlipSettings({}, {
|
|
172
176
|
order: {
|
|
173
|
-
created_at: "DESC"
|
|
177
|
+
created_at: "DESC",
|
|
174
178
|
},
|
|
175
|
-
take: 1
|
|
179
|
+
take: 1,
|
|
176
180
|
});
|
|
177
|
-
if (lastDocumentPackingSlipSettings &&
|
|
181
|
+
if (lastDocumentPackingSlipSettings &&
|
|
182
|
+
lastDocumentPackingSlipSettings.length) {
|
|
178
183
|
const result = await this.createDocumentPackingSlipSettings({
|
|
179
184
|
numberFormat: newFormatNumber ?? lastDocumentPackingSlipSettings[0].numberFormat,
|
|
180
|
-
forcedNumber: forcedNumber
|
|
185
|
+
forcedNumber: forcedNumber
|
|
186
|
+
? parseInt(forcedNumber)
|
|
187
|
+
: lastDocumentPackingSlipSettings[0].forcedNumber,
|
|
181
188
|
template: template ?? lastDocumentPackingSlipSettings[0].template,
|
|
182
189
|
});
|
|
183
190
|
return result;
|
|
@@ -186,7 +193,7 @@ class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
|
186
193
|
const result = await this.createDocumentPackingSlipSettings({
|
|
187
194
|
numberFormat: newFormatNumber,
|
|
188
195
|
forcedNumber: forcedNumber ? parseInt(forcedNumber) : undefined,
|
|
189
|
-
template: template
|
|
196
|
+
template: template,
|
|
190
197
|
});
|
|
191
198
|
return result;
|
|
192
199
|
}
|
|
@@ -194,10 +201,10 @@ class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
|
194
201
|
async updateStoreDocumentAddress(address) {
|
|
195
202
|
const lastDocumentSettings = await this.listDocumentSettings({}, {
|
|
196
203
|
order: {
|
|
197
|
-
created_at: "DESC"
|
|
204
|
+
created_at: "DESC",
|
|
198
205
|
},
|
|
199
206
|
take: 1,
|
|
200
|
-
relations: ["documentPackingSlip"]
|
|
207
|
+
relations: ["documentPackingSlip"],
|
|
201
208
|
});
|
|
202
209
|
if (lastDocumentSettings && lastDocumentSettings.length) {
|
|
203
210
|
const result = await this.createDocumentSettings({
|
|
@@ -216,4 +223,4 @@ class DocumentsModuleService extends (0, utils_2.MedusaService)({
|
|
|
216
223
|
}
|
|
217
224
|
}
|
|
218
225
|
exports.default = DocumentsModuleService;
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2RvY3VtZW50cy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7OztHQVVHOzs7OztBQUVILHFEQUEwRTtBQUMxRSxxREFBMEQ7QUFFMUQsMkZBQWlFO0FBQ2pFLG1GQUEwRDtBQUMxRCw2R0FBa0Y7QUFFbEYseURBQWdFO0FBQ2hFLGlEQUFvRTtBQUNwRSx5RkFHc0Q7QUFPdEQsTUFBTSxzQkFBdUIsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDakQsbUJBQW1CLEVBQW5CLCtCQUFtQjtJQUNuQixnQkFBZ0IsRUFBaEIsMkJBQWdCO0lBQ2hCLDJCQUEyQixFQUEzQix3Q0FBMkI7Q0FDNUIsQ0FBQztJQUlBLFlBQVksRUFBd0IsRUFBRSxPQUF1QjtRQUMzRCxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRU8sS0FBSyxDQUFDLHdCQUF3QjtRQUNwQyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FDekQsRUFBRSxFQUNGO1lBQ0UsS0FBSyxFQUFFO2dCQUNMLFVBQVUsRUFBRSxNQUFNO2FBQ25CO1lBQ0QsSUFBSSxFQUFFLENBQUM7U0FDUixDQUNGLENBQUM7UUFFRixJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQ2xCLEtBQWUsRUFDZixhQUFxQixFQUNyQixnQkFBeUIsS0FBSztRQUU5QixJQUFJLGFBQWEsRUFB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
|
|
@@ -4,6 +4,385 @@ const adminSdk = require("@medusajs/admin-sdk");
|
|
|
4
4
|
const icons = require("@medusajs/icons");
|
|
5
5
|
const react = require("react");
|
|
6
6
|
const ui = require("@medusajs/ui");
|
|
7
|
+
const requestJson$1 = async (url, method = "GET", body) => {
|
|
8
|
+
const response = await fetch(url, {
|
|
9
|
+
method,
|
|
10
|
+
headers: {
|
|
11
|
+
"Content-Type": "application/json"
|
|
12
|
+
},
|
|
13
|
+
body: body ? JSON.stringify(body) : void 0,
|
|
14
|
+
credentials: "include"
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
let message = response.statusText;
|
|
18
|
+
try {
|
|
19
|
+
const payload = await response.json();
|
|
20
|
+
message = (payload == null ? void 0 : payload.code) ?? (payload == null ? void 0 : payload.error) ?? message;
|
|
21
|
+
} catch (_) {
|
|
22
|
+
}
|
|
23
|
+
throw new Error(message);
|
|
24
|
+
}
|
|
25
|
+
if (response.status === 204) {
|
|
26
|
+
return void 0;
|
|
27
|
+
}
|
|
28
|
+
return await response.json();
|
|
29
|
+
};
|
|
30
|
+
const toNumber$1 = (value) => {
|
|
31
|
+
if (value.trim().length === 0) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const parsed = Number(value);
|
|
35
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
36
|
+
};
|
|
37
|
+
function ParcelBoxesPage() {
|
|
38
|
+
const [boxes, setBoxes] = react.useState([]);
|
|
39
|
+
const [loading, setLoading] = react.useState(true);
|
|
40
|
+
const [formState, setFormState] = react.useState({
|
|
41
|
+
id: null,
|
|
42
|
+
name: "",
|
|
43
|
+
width_cm: "",
|
|
44
|
+
length_cm: "",
|
|
45
|
+
height_cm: "",
|
|
46
|
+
max_weight_kg: "",
|
|
47
|
+
price_thb: "",
|
|
48
|
+
active: true
|
|
49
|
+
});
|
|
50
|
+
const [saving, setSaving] = react.useState(false);
|
|
51
|
+
const [deletingId, setDeletingId] = react.useState(null);
|
|
52
|
+
const refresh = react.useCallback(async () => {
|
|
53
|
+
setLoading(true);
|
|
54
|
+
try {
|
|
55
|
+
const data = await requestJson$1(
|
|
56
|
+
"/admin/parcel-boxes"
|
|
57
|
+
);
|
|
58
|
+
setBoxes(data.boxes ?? []);
|
|
59
|
+
} catch (error) {
|
|
60
|
+
ui.toast.error(error.message ?? "Failed to load boxes", {
|
|
61
|
+
dismissable: true
|
|
62
|
+
});
|
|
63
|
+
} finally {
|
|
64
|
+
setLoading(false);
|
|
65
|
+
}
|
|
66
|
+
}, []);
|
|
67
|
+
react.useEffect(() => {
|
|
68
|
+
refresh();
|
|
69
|
+
}, [refresh]);
|
|
70
|
+
const resetForm = () => setFormState({
|
|
71
|
+
id: null,
|
|
72
|
+
name: "",
|
|
73
|
+
width_cm: "",
|
|
74
|
+
length_cm: "",
|
|
75
|
+
height_cm: "",
|
|
76
|
+
max_weight_kg: "",
|
|
77
|
+
price_thb: "",
|
|
78
|
+
active: true
|
|
79
|
+
});
|
|
80
|
+
const handleSubmit = async () => {
|
|
81
|
+
const width = toNumber$1(formState.width_cm);
|
|
82
|
+
const length = toNumber$1(formState.length_cm);
|
|
83
|
+
const height = toNumber$1(formState.height_cm);
|
|
84
|
+
const maxWeight = toNumber$1(formState.max_weight_kg);
|
|
85
|
+
const price = toNumber$1(formState.price_thb);
|
|
86
|
+
if (!formState.name.trim() || width === null || length === null || height === null || maxWeight === null || price === null) {
|
|
87
|
+
ui.toast.error("Fill all fields with valid numeric values", {
|
|
88
|
+
dismissable: true
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const payload = {
|
|
93
|
+
name: formState.name.trim(),
|
|
94
|
+
width_cm: width,
|
|
95
|
+
length_cm: length,
|
|
96
|
+
height_cm: height,
|
|
97
|
+
max_weight_kg: maxWeight,
|
|
98
|
+
price_thb: price,
|
|
99
|
+
active: formState.active
|
|
100
|
+
};
|
|
101
|
+
setSaving(true);
|
|
102
|
+
try {
|
|
103
|
+
if (formState.id) {
|
|
104
|
+
await requestJson$1(
|
|
105
|
+
`/admin/parcel-boxes/${formState.id}`,
|
|
106
|
+
"PUT",
|
|
107
|
+
payload
|
|
108
|
+
);
|
|
109
|
+
ui.toast.success("Box updated", { dismissable: true });
|
|
110
|
+
} else {
|
|
111
|
+
await requestJson$1("/admin/parcel-boxes", "POST", payload);
|
|
112
|
+
ui.toast.success("Box created", { dismissable: true });
|
|
113
|
+
}
|
|
114
|
+
await refresh();
|
|
115
|
+
resetForm();
|
|
116
|
+
} catch (error) {
|
|
117
|
+
ui.toast.error(error.message ?? "Failed to save box", {
|
|
118
|
+
dismissable: true
|
|
119
|
+
});
|
|
120
|
+
} finally {
|
|
121
|
+
setSaving(false);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const handleDelete = async (id) => {
|
|
125
|
+
setDeletingId(id);
|
|
126
|
+
try {
|
|
127
|
+
await requestJson$1(`/admin/parcel-boxes/${id}`, "DELETE");
|
|
128
|
+
ui.toast.success("Box removed", { dismissable: true });
|
|
129
|
+
await refresh();
|
|
130
|
+
} catch (error) {
|
|
131
|
+
ui.toast.error(error.message ?? "Failed to delete box", {
|
|
132
|
+
dismissable: true
|
|
133
|
+
});
|
|
134
|
+
} finally {
|
|
135
|
+
setDeletingId(null);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
const handleToggle = async (box) => {
|
|
139
|
+
try {
|
|
140
|
+
await requestJson$1(`/admin/parcel-boxes/${box.id}`, "PUT", {
|
|
141
|
+
active: !box.active
|
|
142
|
+
});
|
|
143
|
+
await refresh();
|
|
144
|
+
} catch (error) {
|
|
145
|
+
ui.toast.error(error.message ?? "Failed to update box status", {
|
|
146
|
+
dismissable: true
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const tableRows = react.useMemo(() => {
|
|
151
|
+
if (loading) {
|
|
152
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ui.Table.Row, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { colSpan: 6, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-center text-ui-fg-subtle", children: "Loading boxes..." }) }) });
|
|
153
|
+
}
|
|
154
|
+
if (boxes.length === 0) {
|
|
155
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ui.Table.Row, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { colSpan: 6, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-center text-ui-fg-subtle", children: "No boxes configured yet." }) }) });
|
|
156
|
+
}
|
|
157
|
+
return boxes.map((box) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Table.Row, { children: [
|
|
158
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: box.name }) }),
|
|
159
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { className: "text-sm text-ui-fg-subtle", children: [
|
|
160
|
+
box.width_cm,
|
|
161
|
+
" × ",
|
|
162
|
+
box.length_cm,
|
|
163
|
+
" × ",
|
|
164
|
+
box.height_cm
|
|
165
|
+
] }) }),
|
|
166
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: box.max_weight_kg }),
|
|
167
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: box.price_thb }),
|
|
168
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: box.active ? "green" : "grey", children: box.active ? "Active" : "Inactive" }) }),
|
|
169
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-2", children: [
|
|
170
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
171
|
+
ui.Switch,
|
|
172
|
+
{
|
|
173
|
+
checked: box.active,
|
|
174
|
+
onCheckedChange: () => handleToggle(box)
|
|
175
|
+
}
|
|
176
|
+
),
|
|
177
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
178
|
+
ui.Button,
|
|
179
|
+
{
|
|
180
|
+
variant: "secondary",
|
|
181
|
+
size: "small",
|
|
182
|
+
onClick: () => setFormState({
|
|
183
|
+
id: box.id,
|
|
184
|
+
name: box.name,
|
|
185
|
+
width_cm: String(box.width_cm),
|
|
186
|
+
length_cm: String(box.length_cm),
|
|
187
|
+
height_cm: String(box.height_cm),
|
|
188
|
+
max_weight_kg: String(box.max_weight_kg),
|
|
189
|
+
price_thb: String(box.price_thb),
|
|
190
|
+
active: box.active
|
|
191
|
+
}),
|
|
192
|
+
children: "Edit"
|
|
193
|
+
}
|
|
194
|
+
),
|
|
195
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
196
|
+
ui.Button,
|
|
197
|
+
{
|
|
198
|
+
variant: "danger",
|
|
199
|
+
size: "small",
|
|
200
|
+
onClick: () => handleDelete(box.id),
|
|
201
|
+
disabled: deletingId === box.id,
|
|
202
|
+
children: "Delete"
|
|
203
|
+
}
|
|
204
|
+
)
|
|
205
|
+
] }) })
|
|
206
|
+
] }, box.id));
|
|
207
|
+
}, [boxes, deletingId, loading]);
|
|
208
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "space-y-6 p-6", children: [
|
|
209
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
210
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Parcel Boxes" }),
|
|
211
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle", children: "Configure and manage parcel box sizes and pricing." })
|
|
212
|
+
] }),
|
|
213
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-4 rounded-md border p-4", children: [
|
|
214
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: formState.id ? "Edit Box" : "Create Box" }),
|
|
215
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-4 md:grid-cols-3", children: [
|
|
216
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
217
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
218
|
+
ui.Label,
|
|
219
|
+
{
|
|
220
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
221
|
+
htmlFor: "parcel-box-name",
|
|
222
|
+
children: "Name"
|
|
223
|
+
}
|
|
224
|
+
),
|
|
225
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
226
|
+
ui.Input,
|
|
227
|
+
{
|
|
228
|
+
id: "parcel-box-name",
|
|
229
|
+
placeholder: "Enter box name",
|
|
230
|
+
value: formState.name,
|
|
231
|
+
onChange: (event) => setFormState((prev) => ({ ...prev, name: event.target.value }))
|
|
232
|
+
}
|
|
233
|
+
)
|
|
234
|
+
] }),
|
|
235
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
236
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
237
|
+
ui.Label,
|
|
238
|
+
{
|
|
239
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
240
|
+
htmlFor: "parcel-box-width",
|
|
241
|
+
children: "Width (cm)"
|
|
242
|
+
}
|
|
243
|
+
),
|
|
244
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
245
|
+
ui.Input,
|
|
246
|
+
{
|
|
247
|
+
id: "parcel-box-width",
|
|
248
|
+
placeholder: "e.g. 20",
|
|
249
|
+
type: "number",
|
|
250
|
+
value: formState.width_cm,
|
|
251
|
+
onChange: (event) => setFormState((prev) => ({
|
|
252
|
+
...prev,
|
|
253
|
+
width_cm: event.target.value
|
|
254
|
+
}))
|
|
255
|
+
}
|
|
256
|
+
)
|
|
257
|
+
] }),
|
|
258
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
259
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
260
|
+
ui.Label,
|
|
261
|
+
{
|
|
262
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
263
|
+
htmlFor: "parcel-box-length",
|
|
264
|
+
children: "Length (cm)"
|
|
265
|
+
}
|
|
266
|
+
),
|
|
267
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
268
|
+
ui.Input,
|
|
269
|
+
{
|
|
270
|
+
id: "parcel-box-length",
|
|
271
|
+
placeholder: "e.g. 30",
|
|
272
|
+
type: "number",
|
|
273
|
+
value: formState.length_cm,
|
|
274
|
+
onChange: (event) => setFormState((prev) => ({
|
|
275
|
+
...prev,
|
|
276
|
+
length_cm: event.target.value
|
|
277
|
+
}))
|
|
278
|
+
}
|
|
279
|
+
)
|
|
280
|
+
] }),
|
|
281
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
282
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
283
|
+
ui.Label,
|
|
284
|
+
{
|
|
285
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
286
|
+
htmlFor: "parcel-box-height",
|
|
287
|
+
children: "Height (cm)"
|
|
288
|
+
}
|
|
289
|
+
),
|
|
290
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
291
|
+
ui.Input,
|
|
292
|
+
{
|
|
293
|
+
id: "parcel-box-height",
|
|
294
|
+
placeholder: "e.g. 15",
|
|
295
|
+
type: "number",
|
|
296
|
+
value: formState.height_cm,
|
|
297
|
+
onChange: (event) => setFormState((prev) => ({
|
|
298
|
+
...prev,
|
|
299
|
+
height_cm: event.target.value
|
|
300
|
+
}))
|
|
301
|
+
}
|
|
302
|
+
)
|
|
303
|
+
] }),
|
|
304
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
305
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
306
|
+
ui.Label,
|
|
307
|
+
{
|
|
308
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
309
|
+
htmlFor: "parcel-box-max-weight",
|
|
310
|
+
children: "Max Weight (kg)"
|
|
311
|
+
}
|
|
312
|
+
),
|
|
313
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
314
|
+
ui.Input,
|
|
315
|
+
{
|
|
316
|
+
id: "parcel-box-max-weight",
|
|
317
|
+
placeholder: "e.g. 0.5",
|
|
318
|
+
type: "number",
|
|
319
|
+
value: formState.max_weight_kg,
|
|
320
|
+
onChange: (event) => setFormState((prev) => ({
|
|
321
|
+
...prev,
|
|
322
|
+
max_weight_kg: event.target.value
|
|
323
|
+
}))
|
|
324
|
+
}
|
|
325
|
+
)
|
|
326
|
+
] }),
|
|
327
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
328
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
329
|
+
ui.Label,
|
|
330
|
+
{
|
|
331
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
332
|
+
htmlFor: "parcel-box-price",
|
|
333
|
+
children: "Box Price (THB)"
|
|
334
|
+
}
|
|
335
|
+
),
|
|
336
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
337
|
+
ui.Input,
|
|
338
|
+
{
|
|
339
|
+
id: "parcel-box-price",
|
|
340
|
+
placeholder: "e.g. 10",
|
|
341
|
+
type: "number",
|
|
342
|
+
value: formState.price_thb,
|
|
343
|
+
onChange: (event) => setFormState((prev) => ({
|
|
344
|
+
...prev,
|
|
345
|
+
price_thb: event.target.value
|
|
346
|
+
}))
|
|
347
|
+
}
|
|
348
|
+
)
|
|
349
|
+
] })
|
|
350
|
+
] }),
|
|
351
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
352
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
353
|
+
ui.Switch,
|
|
354
|
+
{
|
|
355
|
+
checked: formState.active,
|
|
356
|
+
onCheckedChange: (active) => setFormState((prev) => ({ ...prev, active }))
|
|
357
|
+
}
|
|
358
|
+
),
|
|
359
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-sm text-ui-fg-subtle", children: "Active" })
|
|
360
|
+
] }),
|
|
361
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3", children: [
|
|
362
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: handleSubmit, disabled: saving, children: formState.id ? "Update" : "Create" }),
|
|
363
|
+
formState.id && /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "secondary", onClick: resetForm, children: "Cancel" })
|
|
364
|
+
] })
|
|
365
|
+
] }),
|
|
366
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-md border", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Table, { children: [
|
|
367
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Header, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Table.Row, { children: [
|
|
368
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.HeaderCell, { children: "Name" }),
|
|
369
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.HeaderCell, { children: "Dimensions (cm)" }),
|
|
370
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.HeaderCell, { children: "Max Weight (kg)" }),
|
|
371
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.HeaderCell, { children: "Price" }),
|
|
372
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.HeaderCell, { children: "Status" }),
|
|
373
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.HeaderCell, { className: "text-right", children: "Actions" })
|
|
374
|
+
] }) }),
|
|
375
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Table.Body, { children: tableRows })
|
|
376
|
+
] }) })
|
|
377
|
+
] });
|
|
378
|
+
}
|
|
379
|
+
const ParcelBoxesRoute = () => {
|
|
380
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ParcelBoxesPage, {});
|
|
381
|
+
};
|
|
382
|
+
const config$1 = adminSdk.defineRouteConfig({
|
|
383
|
+
label: "Parcel Boxes",
|
|
384
|
+
icon: icons.FlyingBox
|
|
385
|
+
});
|
|
7
386
|
const requestJson = async (url, method = "GET", body) => {
|
|
8
387
|
const response = await fetch(url, {
|
|
9
388
|
method,
|
|
@@ -35,7 +414,7 @@ const toNumber = (value) => {
|
|
|
35
414
|
return Number.isFinite(parsed) ? parsed : null;
|
|
36
415
|
};
|
|
37
416
|
const getThaiAddressComponents = () => null;
|
|
38
|
-
|
|
417
|
+
function ParcelShippingPage() {
|
|
39
418
|
const [tab, setTab] = react.useState("boxes");
|
|
40
419
|
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "space-y-6 p-6", children: [
|
|
41
420
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
@@ -77,7 +456,7 @@ const ParcelShippingPage = () => {
|
|
|
77
456
|
tab === "areas" && /* @__PURE__ */ jsxRuntime.jsx(AreasSection, {})
|
|
78
457
|
] })
|
|
79
458
|
] });
|
|
80
|
-
}
|
|
459
|
+
}
|
|
81
460
|
const BoxesSection = () => {
|
|
82
461
|
const [boxes, setBoxes] = react.useState([]);
|
|
83
462
|
const [loading, setLoading] = react.useState(true);
|
|
@@ -1136,6 +1515,10 @@ const config = adminSdk.defineRouteConfig({
|
|
|
1136
1515
|
const widgetModule = { widgets: [] };
|
|
1137
1516
|
const routeModule = {
|
|
1138
1517
|
routes: [
|
|
1518
|
+
{
|
|
1519
|
+
Component: ParcelBoxesRoute,
|
|
1520
|
+
path: "/parcel-boxes"
|
|
1521
|
+
},
|
|
1139
1522
|
{
|
|
1140
1523
|
Component: ParcelShippingRoute,
|
|
1141
1524
|
path: "/parcel-shipping"
|
|
@@ -1144,6 +1527,12 @@ const routeModule = {
|
|
|
1144
1527
|
};
|
|
1145
1528
|
const menuItemModule = {
|
|
1146
1529
|
menuItems: [
|
|
1530
|
+
{
|
|
1531
|
+
label: config$1.label,
|
|
1532
|
+
icon: config$1.icon,
|
|
1533
|
+
path: "/parcel-boxes",
|
|
1534
|
+
nested: void 0
|
|
1535
|
+
},
|
|
1147
1536
|
{
|
|
1148
1537
|
label: config.label,
|
|
1149
1538
|
icon: config.icon,
|
|
@@ -1,8 +1,387 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { defineRouteConfig } from "@medusajs/admin-sdk";
|
|
3
|
-
import { Directions } from "@medusajs/icons";
|
|
3
|
+
import { FlyingBox, Directions } from "@medusajs/icons";
|
|
4
4
|
import { useState, useCallback, useEffect, useMemo } from "react";
|
|
5
|
-
import {
|
|
5
|
+
import { toast, Table, Text, Badge, Switch, Button, Container, Heading, Label, Input } from "@medusajs/ui";
|
|
6
|
+
const requestJson$1 = async (url, method = "GET", body) => {
|
|
7
|
+
const response = await fetch(url, {
|
|
8
|
+
method,
|
|
9
|
+
headers: {
|
|
10
|
+
"Content-Type": "application/json"
|
|
11
|
+
},
|
|
12
|
+
body: body ? JSON.stringify(body) : void 0,
|
|
13
|
+
credentials: "include"
|
|
14
|
+
});
|
|
15
|
+
if (!response.ok) {
|
|
16
|
+
let message = response.statusText;
|
|
17
|
+
try {
|
|
18
|
+
const payload = await response.json();
|
|
19
|
+
message = (payload == null ? void 0 : payload.code) ?? (payload == null ? void 0 : payload.error) ?? message;
|
|
20
|
+
} catch (_) {
|
|
21
|
+
}
|
|
22
|
+
throw new Error(message);
|
|
23
|
+
}
|
|
24
|
+
if (response.status === 204) {
|
|
25
|
+
return void 0;
|
|
26
|
+
}
|
|
27
|
+
return await response.json();
|
|
28
|
+
};
|
|
29
|
+
const toNumber$1 = (value) => {
|
|
30
|
+
if (value.trim().length === 0) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const parsed = Number(value);
|
|
34
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
35
|
+
};
|
|
36
|
+
function ParcelBoxesPage() {
|
|
37
|
+
const [boxes, setBoxes] = useState([]);
|
|
38
|
+
const [loading, setLoading] = useState(true);
|
|
39
|
+
const [formState, setFormState] = useState({
|
|
40
|
+
id: null,
|
|
41
|
+
name: "",
|
|
42
|
+
width_cm: "",
|
|
43
|
+
length_cm: "",
|
|
44
|
+
height_cm: "",
|
|
45
|
+
max_weight_kg: "",
|
|
46
|
+
price_thb: "",
|
|
47
|
+
active: true
|
|
48
|
+
});
|
|
49
|
+
const [saving, setSaving] = useState(false);
|
|
50
|
+
const [deletingId, setDeletingId] = useState(null);
|
|
51
|
+
const refresh = useCallback(async () => {
|
|
52
|
+
setLoading(true);
|
|
53
|
+
try {
|
|
54
|
+
const data = await requestJson$1(
|
|
55
|
+
"/admin/parcel-boxes"
|
|
56
|
+
);
|
|
57
|
+
setBoxes(data.boxes ?? []);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
toast.error(error.message ?? "Failed to load boxes", {
|
|
60
|
+
dismissable: true
|
|
61
|
+
});
|
|
62
|
+
} finally {
|
|
63
|
+
setLoading(false);
|
|
64
|
+
}
|
|
65
|
+
}, []);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
refresh();
|
|
68
|
+
}, [refresh]);
|
|
69
|
+
const resetForm = () => setFormState({
|
|
70
|
+
id: null,
|
|
71
|
+
name: "",
|
|
72
|
+
width_cm: "",
|
|
73
|
+
length_cm: "",
|
|
74
|
+
height_cm: "",
|
|
75
|
+
max_weight_kg: "",
|
|
76
|
+
price_thb: "",
|
|
77
|
+
active: true
|
|
78
|
+
});
|
|
79
|
+
const handleSubmit = async () => {
|
|
80
|
+
const width = toNumber$1(formState.width_cm);
|
|
81
|
+
const length = toNumber$1(formState.length_cm);
|
|
82
|
+
const height = toNumber$1(formState.height_cm);
|
|
83
|
+
const maxWeight = toNumber$1(formState.max_weight_kg);
|
|
84
|
+
const price = toNumber$1(formState.price_thb);
|
|
85
|
+
if (!formState.name.trim() || width === null || length === null || height === null || maxWeight === null || price === null) {
|
|
86
|
+
toast.error("Fill all fields with valid numeric values", {
|
|
87
|
+
dismissable: true
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const payload = {
|
|
92
|
+
name: formState.name.trim(),
|
|
93
|
+
width_cm: width,
|
|
94
|
+
length_cm: length,
|
|
95
|
+
height_cm: height,
|
|
96
|
+
max_weight_kg: maxWeight,
|
|
97
|
+
price_thb: price,
|
|
98
|
+
active: formState.active
|
|
99
|
+
};
|
|
100
|
+
setSaving(true);
|
|
101
|
+
try {
|
|
102
|
+
if (formState.id) {
|
|
103
|
+
await requestJson$1(
|
|
104
|
+
`/admin/parcel-boxes/${formState.id}`,
|
|
105
|
+
"PUT",
|
|
106
|
+
payload
|
|
107
|
+
);
|
|
108
|
+
toast.success("Box updated", { dismissable: true });
|
|
109
|
+
} else {
|
|
110
|
+
await requestJson$1("/admin/parcel-boxes", "POST", payload);
|
|
111
|
+
toast.success("Box created", { dismissable: true });
|
|
112
|
+
}
|
|
113
|
+
await refresh();
|
|
114
|
+
resetForm();
|
|
115
|
+
} catch (error) {
|
|
116
|
+
toast.error(error.message ?? "Failed to save box", {
|
|
117
|
+
dismissable: true
|
|
118
|
+
});
|
|
119
|
+
} finally {
|
|
120
|
+
setSaving(false);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const handleDelete = async (id) => {
|
|
124
|
+
setDeletingId(id);
|
|
125
|
+
try {
|
|
126
|
+
await requestJson$1(`/admin/parcel-boxes/${id}`, "DELETE");
|
|
127
|
+
toast.success("Box removed", { dismissable: true });
|
|
128
|
+
await refresh();
|
|
129
|
+
} catch (error) {
|
|
130
|
+
toast.error(error.message ?? "Failed to delete box", {
|
|
131
|
+
dismissable: true
|
|
132
|
+
});
|
|
133
|
+
} finally {
|
|
134
|
+
setDeletingId(null);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
const handleToggle = async (box) => {
|
|
138
|
+
try {
|
|
139
|
+
await requestJson$1(`/admin/parcel-boxes/${box.id}`, "PUT", {
|
|
140
|
+
active: !box.active
|
|
141
|
+
});
|
|
142
|
+
await refresh();
|
|
143
|
+
} catch (error) {
|
|
144
|
+
toast.error(error.message ?? "Failed to update box status", {
|
|
145
|
+
dismissable: true
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
const tableRows = useMemo(() => {
|
|
150
|
+
if (loading) {
|
|
151
|
+
return /* @__PURE__ */ jsx(Table.Row, { children: /* @__PURE__ */ jsx(Table.Cell, { colSpan: 6, children: /* @__PURE__ */ jsx(Text, { className: "text-center text-ui-fg-subtle", children: "Loading boxes..." }) }) });
|
|
152
|
+
}
|
|
153
|
+
if (boxes.length === 0) {
|
|
154
|
+
return /* @__PURE__ */ jsx(Table.Row, { children: /* @__PURE__ */ jsx(Table.Cell, { colSpan: 6, children: /* @__PURE__ */ jsx(Text, { className: "text-center text-ui-fg-subtle", children: "No boxes configured yet." }) }) });
|
|
155
|
+
}
|
|
156
|
+
return boxes.map((box) => /* @__PURE__ */ jsxs(Table.Row, { children: [
|
|
157
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Text, { className: "font-medium", children: box.name }) }),
|
|
158
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsxs(Text, { className: "text-sm text-ui-fg-subtle", children: [
|
|
159
|
+
box.width_cm,
|
|
160
|
+
" × ",
|
|
161
|
+
box.length_cm,
|
|
162
|
+
" × ",
|
|
163
|
+
box.height_cm
|
|
164
|
+
] }) }),
|
|
165
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: box.max_weight_kg }),
|
|
166
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: box.price_thb }),
|
|
167
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Badge, { color: box.active ? "green" : "grey", children: box.active ? "Active" : "Inactive" }) }),
|
|
168
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2", children: [
|
|
169
|
+
/* @__PURE__ */ jsx(
|
|
170
|
+
Switch,
|
|
171
|
+
{
|
|
172
|
+
checked: box.active,
|
|
173
|
+
onCheckedChange: () => handleToggle(box)
|
|
174
|
+
}
|
|
175
|
+
),
|
|
176
|
+
/* @__PURE__ */ jsx(
|
|
177
|
+
Button,
|
|
178
|
+
{
|
|
179
|
+
variant: "secondary",
|
|
180
|
+
size: "small",
|
|
181
|
+
onClick: () => setFormState({
|
|
182
|
+
id: box.id,
|
|
183
|
+
name: box.name,
|
|
184
|
+
width_cm: String(box.width_cm),
|
|
185
|
+
length_cm: String(box.length_cm),
|
|
186
|
+
height_cm: String(box.height_cm),
|
|
187
|
+
max_weight_kg: String(box.max_weight_kg),
|
|
188
|
+
price_thb: String(box.price_thb),
|
|
189
|
+
active: box.active
|
|
190
|
+
}),
|
|
191
|
+
children: "Edit"
|
|
192
|
+
}
|
|
193
|
+
),
|
|
194
|
+
/* @__PURE__ */ jsx(
|
|
195
|
+
Button,
|
|
196
|
+
{
|
|
197
|
+
variant: "danger",
|
|
198
|
+
size: "small",
|
|
199
|
+
onClick: () => handleDelete(box.id),
|
|
200
|
+
disabled: deletingId === box.id,
|
|
201
|
+
children: "Delete"
|
|
202
|
+
}
|
|
203
|
+
)
|
|
204
|
+
] }) })
|
|
205
|
+
] }, box.id));
|
|
206
|
+
}, [boxes, deletingId, loading]);
|
|
207
|
+
return /* @__PURE__ */ jsxs(Container, { className: "space-y-6 p-6", children: [
|
|
208
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
209
|
+
/* @__PURE__ */ jsx(Heading, { level: "h1", children: "Parcel Boxes" }),
|
|
210
|
+
/* @__PURE__ */ jsx(Text, { className: "text-ui-fg-subtle", children: "Configure and manage parcel box sizes and pricing." })
|
|
211
|
+
] }),
|
|
212
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-4 rounded-md border p-4", children: [
|
|
213
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", children: formState.id ? "Edit Box" : "Create Box" }),
|
|
214
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-4 md:grid-cols-3", children: [
|
|
215
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
216
|
+
/* @__PURE__ */ jsx(
|
|
217
|
+
Label,
|
|
218
|
+
{
|
|
219
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
220
|
+
htmlFor: "parcel-box-name",
|
|
221
|
+
children: "Name"
|
|
222
|
+
}
|
|
223
|
+
),
|
|
224
|
+
/* @__PURE__ */ jsx(
|
|
225
|
+
Input,
|
|
226
|
+
{
|
|
227
|
+
id: "parcel-box-name",
|
|
228
|
+
placeholder: "Enter box name",
|
|
229
|
+
value: formState.name,
|
|
230
|
+
onChange: (event) => setFormState((prev) => ({ ...prev, name: event.target.value }))
|
|
231
|
+
}
|
|
232
|
+
)
|
|
233
|
+
] }),
|
|
234
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
235
|
+
/* @__PURE__ */ jsx(
|
|
236
|
+
Label,
|
|
237
|
+
{
|
|
238
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
239
|
+
htmlFor: "parcel-box-width",
|
|
240
|
+
children: "Width (cm)"
|
|
241
|
+
}
|
|
242
|
+
),
|
|
243
|
+
/* @__PURE__ */ jsx(
|
|
244
|
+
Input,
|
|
245
|
+
{
|
|
246
|
+
id: "parcel-box-width",
|
|
247
|
+
placeholder: "e.g. 20",
|
|
248
|
+
type: "number",
|
|
249
|
+
value: formState.width_cm,
|
|
250
|
+
onChange: (event) => setFormState((prev) => ({
|
|
251
|
+
...prev,
|
|
252
|
+
width_cm: event.target.value
|
|
253
|
+
}))
|
|
254
|
+
}
|
|
255
|
+
)
|
|
256
|
+
] }),
|
|
257
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
258
|
+
/* @__PURE__ */ jsx(
|
|
259
|
+
Label,
|
|
260
|
+
{
|
|
261
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
262
|
+
htmlFor: "parcel-box-length",
|
|
263
|
+
children: "Length (cm)"
|
|
264
|
+
}
|
|
265
|
+
),
|
|
266
|
+
/* @__PURE__ */ jsx(
|
|
267
|
+
Input,
|
|
268
|
+
{
|
|
269
|
+
id: "parcel-box-length",
|
|
270
|
+
placeholder: "e.g. 30",
|
|
271
|
+
type: "number",
|
|
272
|
+
value: formState.length_cm,
|
|
273
|
+
onChange: (event) => setFormState((prev) => ({
|
|
274
|
+
...prev,
|
|
275
|
+
length_cm: event.target.value
|
|
276
|
+
}))
|
|
277
|
+
}
|
|
278
|
+
)
|
|
279
|
+
] }),
|
|
280
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
281
|
+
/* @__PURE__ */ jsx(
|
|
282
|
+
Label,
|
|
283
|
+
{
|
|
284
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
285
|
+
htmlFor: "parcel-box-height",
|
|
286
|
+
children: "Height (cm)"
|
|
287
|
+
}
|
|
288
|
+
),
|
|
289
|
+
/* @__PURE__ */ jsx(
|
|
290
|
+
Input,
|
|
291
|
+
{
|
|
292
|
+
id: "parcel-box-height",
|
|
293
|
+
placeholder: "e.g. 15",
|
|
294
|
+
type: "number",
|
|
295
|
+
value: formState.height_cm,
|
|
296
|
+
onChange: (event) => setFormState((prev) => ({
|
|
297
|
+
...prev,
|
|
298
|
+
height_cm: event.target.value
|
|
299
|
+
}))
|
|
300
|
+
}
|
|
301
|
+
)
|
|
302
|
+
] }),
|
|
303
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
304
|
+
/* @__PURE__ */ jsx(
|
|
305
|
+
Label,
|
|
306
|
+
{
|
|
307
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
308
|
+
htmlFor: "parcel-box-max-weight",
|
|
309
|
+
children: "Max Weight (kg)"
|
|
310
|
+
}
|
|
311
|
+
),
|
|
312
|
+
/* @__PURE__ */ jsx(
|
|
313
|
+
Input,
|
|
314
|
+
{
|
|
315
|
+
id: "parcel-box-max-weight",
|
|
316
|
+
placeholder: "e.g. 0.5",
|
|
317
|
+
type: "number",
|
|
318
|
+
value: formState.max_weight_kg,
|
|
319
|
+
onChange: (event) => setFormState((prev) => ({
|
|
320
|
+
...prev,
|
|
321
|
+
max_weight_kg: event.target.value
|
|
322
|
+
}))
|
|
323
|
+
}
|
|
324
|
+
)
|
|
325
|
+
] }),
|
|
326
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
327
|
+
/* @__PURE__ */ jsx(
|
|
328
|
+
Label,
|
|
329
|
+
{
|
|
330
|
+
className: "text-sm font-medium text-ui-fg-base",
|
|
331
|
+
htmlFor: "parcel-box-price",
|
|
332
|
+
children: "Box Price (THB)"
|
|
333
|
+
}
|
|
334
|
+
),
|
|
335
|
+
/* @__PURE__ */ jsx(
|
|
336
|
+
Input,
|
|
337
|
+
{
|
|
338
|
+
id: "parcel-box-price",
|
|
339
|
+
placeholder: "e.g. 10",
|
|
340
|
+
type: "number",
|
|
341
|
+
value: formState.price_thb,
|
|
342
|
+
onChange: (event) => setFormState((prev) => ({
|
|
343
|
+
...prev,
|
|
344
|
+
price_thb: event.target.value
|
|
345
|
+
}))
|
|
346
|
+
}
|
|
347
|
+
)
|
|
348
|
+
] })
|
|
349
|
+
] }),
|
|
350
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
351
|
+
/* @__PURE__ */ jsx(
|
|
352
|
+
Switch,
|
|
353
|
+
{
|
|
354
|
+
checked: formState.active,
|
|
355
|
+
onCheckedChange: (active) => setFormState((prev) => ({ ...prev, active }))
|
|
356
|
+
}
|
|
357
|
+
),
|
|
358
|
+
/* @__PURE__ */ jsx(Text, { className: "text-sm text-ui-fg-subtle", children: "Active" })
|
|
359
|
+
] }),
|
|
360
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
|
|
361
|
+
/* @__PURE__ */ jsx(Button, { onClick: handleSubmit, disabled: saving, children: formState.id ? "Update" : "Create" }),
|
|
362
|
+
formState.id && /* @__PURE__ */ jsx(Button, { variant: "secondary", onClick: resetForm, children: "Cancel" })
|
|
363
|
+
] })
|
|
364
|
+
] }),
|
|
365
|
+
/* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-md border", children: /* @__PURE__ */ jsxs(Table, { children: [
|
|
366
|
+
/* @__PURE__ */ jsx(Table.Header, { children: /* @__PURE__ */ jsxs(Table.Row, { children: [
|
|
367
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { children: "Name" }),
|
|
368
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { children: "Dimensions (cm)" }),
|
|
369
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { children: "Max Weight (kg)" }),
|
|
370
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { children: "Price" }),
|
|
371
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { children: "Status" }),
|
|
372
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { className: "text-right", children: "Actions" })
|
|
373
|
+
] }) }),
|
|
374
|
+
/* @__PURE__ */ jsx(Table.Body, { children: tableRows })
|
|
375
|
+
] }) })
|
|
376
|
+
] });
|
|
377
|
+
}
|
|
378
|
+
const ParcelBoxesRoute = () => {
|
|
379
|
+
return /* @__PURE__ */ jsx(ParcelBoxesPage, {});
|
|
380
|
+
};
|
|
381
|
+
const config$1 = defineRouteConfig({
|
|
382
|
+
label: "Parcel Boxes",
|
|
383
|
+
icon: FlyingBox
|
|
384
|
+
});
|
|
6
385
|
const requestJson = async (url, method = "GET", body) => {
|
|
7
386
|
const response = await fetch(url, {
|
|
8
387
|
method,
|
|
@@ -34,7 +413,7 @@ const toNumber = (value) => {
|
|
|
34
413
|
return Number.isFinite(parsed) ? parsed : null;
|
|
35
414
|
};
|
|
36
415
|
const getThaiAddressComponents = () => null;
|
|
37
|
-
|
|
416
|
+
function ParcelShippingPage() {
|
|
38
417
|
const [tab, setTab] = useState("boxes");
|
|
39
418
|
return /* @__PURE__ */ jsxs(Container, { className: "space-y-6 p-6", children: [
|
|
40
419
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -76,7 +455,7 @@ const ParcelShippingPage = () => {
|
|
|
76
455
|
tab === "areas" && /* @__PURE__ */ jsx(AreasSection, {})
|
|
77
456
|
] })
|
|
78
457
|
] });
|
|
79
|
-
}
|
|
458
|
+
}
|
|
80
459
|
const BoxesSection = () => {
|
|
81
460
|
const [boxes, setBoxes] = useState([]);
|
|
82
461
|
const [loading, setLoading] = useState(true);
|
|
@@ -1135,6 +1514,10 @@ const config = defineRouteConfig({
|
|
|
1135
1514
|
const widgetModule = { widgets: [] };
|
|
1136
1515
|
const routeModule = {
|
|
1137
1516
|
routes: [
|
|
1517
|
+
{
|
|
1518
|
+
Component: ParcelBoxesRoute,
|
|
1519
|
+
path: "/parcel-boxes"
|
|
1520
|
+
},
|
|
1138
1521
|
{
|
|
1139
1522
|
Component: ParcelShippingRoute,
|
|
1140
1523
|
path: "/parcel-shipping"
|
|
@@ -1143,6 +1526,12 @@ const routeModule = {
|
|
|
1143
1526
|
};
|
|
1144
1527
|
const menuItemModule = {
|
|
1145
1528
|
menuItems: [
|
|
1529
|
+
{
|
|
1530
|
+
label: config$1.label,
|
|
1531
|
+
icon: config$1.icon,
|
|
1532
|
+
path: "/parcel-boxes",
|
|
1533
|
+
nested: void 0
|
|
1534
|
+
},
|
|
1146
1535
|
{
|
|
1147
1536
|
label: config.label,
|
|
1148
1537
|
icon: config.icon,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodashventure/medusa-parcel-shipping",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.11",
|
|
4
4
|
"description": "Parcel box selection and Thailand shipping quotes for Medusa.",
|
|
5
5
|
"author": "LodashVenture",
|
|
6
6
|
"license": "MIT",
|
|
@@ -64,9 +64,10 @@
|
|
|
64
64
|
"node": ">=20"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"
|
|
68
|
-
"
|
|
67
|
+
"@types/pdfkit": "^0.13.5",
|
|
68
|
+
"i18next": "^23.11.0",
|
|
69
69
|
"pdfkit": "0.15.0",
|
|
70
|
-
"
|
|
70
|
+
"thai-address-autocomplete-react": "^1.2.2",
|
|
71
|
+
"zod": "^4.1.5"
|
|
71
72
|
}
|
|
72
73
|
}
|