medusajs-documents-plugin 1.1.50 → 1.1.51
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 +348 -0
- package/.medusa/server/src/admin/index.mjs +349 -1
- package/.medusa/server/src/api/admin/documents/[id]/route.js +25 -1
- package/.medusa/server/src/modules/documents/service.js +256 -12
- package/.medusa/server/src/services/zoho-books.js +5 -2
- package/.medusa/server/src/subscribers/order-documents.js +6 -1
- package/.medusa/server/src/subscribers/repair-documents.js +5 -2
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@ import { jsxs, jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { defineRouteConfig } from "@medusajs/admin-sdk";
|
|
3
3
|
import { Container, Heading, Text, Button, Input, Select, Tooltip, IconButton, Switch, Label, Table, Badge, DropdownMenu, Textarea, FocusModal } from "@medusajs/ui";
|
|
4
4
|
import { useState, useEffect, useMemo, Fragment } from "react";
|
|
5
|
-
import { DocumentText, ArrowPath, Plus, Sparkles, ChevronDown, ChevronRight, ArrowDownTray, Envelope, Trash } from "@medusajs/icons";
|
|
5
|
+
import { DocumentText, ArrowPath, Plus, Sparkles, ChevronDown, ChevronRight, ArrowDownTray, PencilSquare, Envelope, Trash } from "@medusajs/icons";
|
|
6
6
|
function extractBaseReference(displayId) {
|
|
7
7
|
if (!displayId) return "";
|
|
8
8
|
const cleaned = String(displayId).trim();
|
|
@@ -421,6 +421,18 @@ const DocumentsPage = () => {
|
|
|
421
421
|
const [customDocModalOpen, setCustomDocModalOpen] = useState(false);
|
|
422
422
|
const [sendModalOpen, setSendModalOpen] = useState(false);
|
|
423
423
|
const [selectedDoc, setSelectedDoc] = useState(null);
|
|
424
|
+
const [editModalOpen, setEditModalOpen] = useState(false);
|
|
425
|
+
const [editingDoc, setEditingDoc] = useState(null);
|
|
426
|
+
const [isUpdatingDoc, setIsUpdatingDoc] = useState(false);
|
|
427
|
+
const [editForm, setEditForm] = useState({
|
|
428
|
+
title: "",
|
|
429
|
+
customer_name: "",
|
|
430
|
+
customer_email: "",
|
|
431
|
+
customer_phone: "",
|
|
432
|
+
notes: "",
|
|
433
|
+
terms: "",
|
|
434
|
+
items: []
|
|
435
|
+
});
|
|
424
436
|
const [settings, setSettings] = useState({
|
|
425
437
|
company_name: "Store",
|
|
426
438
|
storefront_url: "",
|
|
@@ -982,6 +994,77 @@ const DocumentsPage = () => {
|
|
|
982
994
|
alert("Error sending notification.");
|
|
983
995
|
}
|
|
984
996
|
};
|
|
997
|
+
const handleOpenEditModal = (doc) => {
|
|
998
|
+
setEditingDoc(doc);
|
|
999
|
+
let meta = doc.metadata || {};
|
|
1000
|
+
if (typeof meta === "string") {
|
|
1001
|
+
try {
|
|
1002
|
+
meta = JSON.parse(meta);
|
|
1003
|
+
} catch (_) {
|
|
1004
|
+
meta = {};
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
const docItems = Array.isArray(meta == null ? void 0 : meta.items) && meta.items.length > 0 ? meta.items.map((it) => ({
|
|
1008
|
+
title: it.title || it.name || "Item",
|
|
1009
|
+
description: it.description || "",
|
|
1010
|
+
quantity: Number(it.quantity || 1),
|
|
1011
|
+
unit_price: Number(it.unit_price || it.rate || 0)
|
|
1012
|
+
})) : [
|
|
1013
|
+
{
|
|
1014
|
+
title: doc.title || "Service / Goods",
|
|
1015
|
+
description: "",
|
|
1016
|
+
quantity: 1,
|
|
1017
|
+
unit_price: Number(doc.total_amount || 0)
|
|
1018
|
+
}
|
|
1019
|
+
];
|
|
1020
|
+
setEditForm({
|
|
1021
|
+
title: doc.title || (doc.type === "invoice" ? "Tax Invoice" : "Quotation"),
|
|
1022
|
+
customer_name: doc.customer_name || "",
|
|
1023
|
+
customer_email: doc.customer_email || "",
|
|
1024
|
+
customer_phone: doc.customer_phone || "",
|
|
1025
|
+
notes: (meta == null ? void 0 : meta.notes) || "",
|
|
1026
|
+
terms: (meta == null ? void 0 : meta.terms) || "",
|
|
1027
|
+
items: docItems
|
|
1028
|
+
});
|
|
1029
|
+
setEditModalOpen(true);
|
|
1030
|
+
};
|
|
1031
|
+
const handleSaveEditDocument = async (e) => {
|
|
1032
|
+
if (!editingDoc) return;
|
|
1033
|
+
setIsUpdatingDoc(true);
|
|
1034
|
+
try {
|
|
1035
|
+
const calculatedTotal = editForm.items.reduce(
|
|
1036
|
+
(sum, it) => sum + Number(it.quantity || 1) * Number(it.unit_price || 0),
|
|
1037
|
+
0
|
|
1038
|
+
);
|
|
1039
|
+
const res = await fetch(`/admin/documents/${editingDoc.id}`, {
|
|
1040
|
+
method: "PUT",
|
|
1041
|
+
headers: { "Content-Type": "application/json" },
|
|
1042
|
+
credentials: "include",
|
|
1043
|
+
body: JSON.stringify({
|
|
1044
|
+
title: editForm.title,
|
|
1045
|
+
customer_name: editForm.customer_name,
|
|
1046
|
+
customer_email: editForm.customer_email,
|
|
1047
|
+
customer_phone: editForm.customer_phone,
|
|
1048
|
+
notes: editForm.notes,
|
|
1049
|
+
terms: editForm.terms,
|
|
1050
|
+
items: editForm.items,
|
|
1051
|
+
total: calculatedTotal
|
|
1052
|
+
})
|
|
1053
|
+
});
|
|
1054
|
+
const data = await res.json();
|
|
1055
|
+
if (!res.ok || data.error) {
|
|
1056
|
+
throw new Error(data.message || "Failed to update document");
|
|
1057
|
+
}
|
|
1058
|
+
setEditModalOpen(false);
|
|
1059
|
+
setEditingDoc(null);
|
|
1060
|
+
await loadDocuments();
|
|
1061
|
+
alert("Document updated successfully and synced with Zoho Books!");
|
|
1062
|
+
} catch (err) {
|
|
1063
|
+
alert(`Error updating document: ${err.message}`);
|
|
1064
|
+
} finally {
|
|
1065
|
+
setIsUpdatingDoc(false);
|
|
1066
|
+
}
|
|
1067
|
+
};
|
|
985
1068
|
const handleSyncToZoho = async (docId) => {
|
|
986
1069
|
try {
|
|
987
1070
|
const res = await fetch(`/admin/documents/${docId}/sync-zoho`, {
|
|
@@ -1364,6 +1447,16 @@ const DocumentsPage = () => {
|
|
|
1364
1447
|
children: /* @__PURE__ */ jsx(ArrowDownTray, { className: "w-4 h-4" })
|
|
1365
1448
|
}
|
|
1366
1449
|
),
|
|
1450
|
+
(doc.type === "invoice" || doc.type === "estimate" || doc.type === "quote") && /* @__PURE__ */ jsx(
|
|
1451
|
+
"button",
|
|
1452
|
+
{
|
|
1453
|
+
type: "button",
|
|
1454
|
+
onClick: () => handleOpenEditModal(doc),
|
|
1455
|
+
className: "p-1.5 rounded hover:bg-ui-bg-subtle text-ui-fg-subtle hover:text-purple-600 cursor-pointer",
|
|
1456
|
+
title: "Edit Quote / Invoice & Sync with Zoho Books",
|
|
1457
|
+
children: /* @__PURE__ */ jsx(PencilSquare, { className: "w-4 h-4" })
|
|
1458
|
+
}
|
|
1459
|
+
),
|
|
1367
1460
|
/* @__PURE__ */ jsx(
|
|
1368
1461
|
"button",
|
|
1369
1462
|
{
|
|
@@ -1511,6 +1604,16 @@ const DocumentsPage = () => {
|
|
|
1511
1604
|
children: /* @__PURE__ */ jsx(ArrowDownTray, { className: "w-3.5 h-3.5" })
|
|
1512
1605
|
}
|
|
1513
1606
|
),
|
|
1607
|
+
(subDoc.type === "invoice" || subDoc.type === "estimate" || subDoc.type === "quote") && /* @__PURE__ */ jsx(
|
|
1608
|
+
"button",
|
|
1609
|
+
{
|
|
1610
|
+
type: "button",
|
|
1611
|
+
onClick: () => handleOpenEditModal(subDoc),
|
|
1612
|
+
className: "p-1 rounded hover:bg-ui-bg-subtle text-ui-fg-subtle hover:text-purple-600",
|
|
1613
|
+
title: "Edit Quote / Invoice & Sync with Zoho Books",
|
|
1614
|
+
children: /* @__PURE__ */ jsx(PencilSquare, { className: "w-3.5 h-3.5" })
|
|
1615
|
+
}
|
|
1616
|
+
),
|
|
1514
1617
|
/* @__PURE__ */ jsx(
|
|
1515
1618
|
"button",
|
|
1516
1619
|
{
|
|
@@ -1606,6 +1709,16 @@ const DocumentsPage = () => {
|
|
|
1606
1709
|
children: /* @__PURE__ */ jsx(ArrowDownTray, { className: "w-4 h-4" })
|
|
1607
1710
|
}
|
|
1608
1711
|
),
|
|
1712
|
+
(doc.type === "invoice" || doc.type === "estimate" || doc.type === "quote") && /* @__PURE__ */ jsx(
|
|
1713
|
+
"button",
|
|
1714
|
+
{
|
|
1715
|
+
type: "button",
|
|
1716
|
+
onClick: () => handleOpenEditModal(doc),
|
|
1717
|
+
className: "p-1.5 rounded hover:bg-ui-bg-subtle text-ui-fg-subtle hover:text-purple-600 cursor-pointer",
|
|
1718
|
+
title: "Edit Quote / Invoice & Sync with Zoho Books",
|
|
1719
|
+
children: /* @__PURE__ */ jsx(PencilSquare, { className: "w-4 h-4" })
|
|
1720
|
+
}
|
|
1721
|
+
),
|
|
1609
1722
|
/* @__PURE__ */ jsx(
|
|
1610
1723
|
"button",
|
|
1611
1724
|
{
|
|
@@ -3976,6 +4089,241 @@ Your *{document_title} #{display_id}* has been generated.
|
|
|
3976
4089
|
)
|
|
3977
4090
|
] }) })
|
|
3978
4091
|
] })
|
|
4092
|
+
] }) }),
|
|
4093
|
+
editModalOpen && editingDoc && /* @__PURE__ */ jsx(FocusModal, { open: editModalOpen, onOpenChange: setEditModalOpen, children: /* @__PURE__ */ jsxs(FocusModal.Content, { children: [
|
|
4094
|
+
/* @__PURE__ */ jsxs(FocusModal.Header, { className: "flex items-center justify-between px-6 py-4 border-b border-ui-border-base", children: [
|
|
4095
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
4096
|
+
/* @__PURE__ */ jsx(PencilSquare, { className: "w-5 h-5 text-purple-600" }),
|
|
4097
|
+
/* @__PURE__ */ jsxs(Heading, { level: "h2", children: [
|
|
4098
|
+
"Edit ",
|
|
4099
|
+
editingDoc.type === "invoice" ? "Invoice" : "Quote / Estimate",
|
|
4100
|
+
" #",
|
|
4101
|
+
editingDoc.display_id
|
|
4102
|
+
] }),
|
|
4103
|
+
/* @__PURE__ */ jsx(Badge, { color: "purple", size: "small", children: "Zoho Synced" })
|
|
4104
|
+
] }),
|
|
4105
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
4106
|
+
/* @__PURE__ */ jsx(
|
|
4107
|
+
Button,
|
|
4108
|
+
{
|
|
4109
|
+
variant: "secondary",
|
|
4110
|
+
size: "small",
|
|
4111
|
+
onClick: () => setEditModalOpen(false),
|
|
4112
|
+
disabled: isUpdatingDoc,
|
|
4113
|
+
children: "Cancel"
|
|
4114
|
+
}
|
|
4115
|
+
),
|
|
4116
|
+
/* @__PURE__ */ jsx(
|
|
4117
|
+
Button,
|
|
4118
|
+
{
|
|
4119
|
+
variant: "primary",
|
|
4120
|
+
size: "small",
|
|
4121
|
+
onClick: () => handleSaveEditDocument(),
|
|
4122
|
+
isLoading: isUpdatingDoc,
|
|
4123
|
+
disabled: isUpdatingDoc,
|
|
4124
|
+
className: "bg-purple-600 hover:bg-purple-700 text-white",
|
|
4125
|
+
children: "Save & Sync to Zoho Books"
|
|
4126
|
+
}
|
|
4127
|
+
)
|
|
4128
|
+
] })
|
|
4129
|
+
] }),
|
|
4130
|
+
/* @__PURE__ */ jsxs(FocusModal.Body, { className: "p-6 flex flex-col gap-6 max-w-3xl mx-auto overflow-y-auto max-h-[80vh]", children: [
|
|
4131
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
4132
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4133
|
+
/* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Document Title" }),
|
|
4134
|
+
/* @__PURE__ */ jsx(
|
|
4135
|
+
Input,
|
|
4136
|
+
{
|
|
4137
|
+
value: editForm.title,
|
|
4138
|
+
onChange: (e) => setEditForm({ ...editForm, title: e.target.value }),
|
|
4139
|
+
size: "small"
|
|
4140
|
+
}
|
|
4141
|
+
)
|
|
4142
|
+
] }),
|
|
4143
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4144
|
+
/* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Customer Name" }),
|
|
4145
|
+
/* @__PURE__ */ jsx(
|
|
4146
|
+
Input,
|
|
4147
|
+
{
|
|
4148
|
+
value: editForm.customer_name,
|
|
4149
|
+
onChange: (e) => setEditForm({ ...editForm, customer_name: e.target.value }),
|
|
4150
|
+
size: "small"
|
|
4151
|
+
}
|
|
4152
|
+
)
|
|
4153
|
+
] }),
|
|
4154
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4155
|
+
/* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Customer Email" }),
|
|
4156
|
+
/* @__PURE__ */ jsx(
|
|
4157
|
+
Input,
|
|
4158
|
+
{
|
|
4159
|
+
value: editForm.customer_email,
|
|
4160
|
+
onChange: (e) => setEditForm({ ...editForm, customer_email: e.target.value }),
|
|
4161
|
+
size: "small"
|
|
4162
|
+
}
|
|
4163
|
+
)
|
|
4164
|
+
] }),
|
|
4165
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4166
|
+
/* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Customer Phone" }),
|
|
4167
|
+
/* @__PURE__ */ jsx(
|
|
4168
|
+
Input,
|
|
4169
|
+
{
|
|
4170
|
+
value: editForm.customer_phone,
|
|
4171
|
+
onChange: (e) => setEditForm({ ...editForm, customer_phone: e.target.value }),
|
|
4172
|
+
size: "small"
|
|
4173
|
+
}
|
|
4174
|
+
)
|
|
4175
|
+
] })
|
|
4176
|
+
] }),
|
|
4177
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
4178
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
4179
|
+
/* @__PURE__ */ jsx(Label, { className: "text-xs font-semibold", children: "Itemized Line Items" }),
|
|
4180
|
+
/* @__PURE__ */ jsxs(
|
|
4181
|
+
Button,
|
|
4182
|
+
{
|
|
4183
|
+
variant: "secondary",
|
|
4184
|
+
size: "small",
|
|
4185
|
+
onClick: () => setEditForm({
|
|
4186
|
+
...editForm,
|
|
4187
|
+
items: [
|
|
4188
|
+
...editForm.items,
|
|
4189
|
+
{ title: "", description: "", quantity: 1, unit_price: 0 }
|
|
4190
|
+
]
|
|
4191
|
+
}),
|
|
4192
|
+
children: [
|
|
4193
|
+
/* @__PURE__ */ jsx(Plus, { className: "w-3.5 h-3.5 mr-1" }),
|
|
4194
|
+
" Add Line Item"
|
|
4195
|
+
]
|
|
4196
|
+
}
|
|
4197
|
+
)
|
|
4198
|
+
] }),
|
|
4199
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: editForm.items.map((it, idx) => /* @__PURE__ */ jsxs(
|
|
4200
|
+
"div",
|
|
4201
|
+
{
|
|
4202
|
+
className: "p-3 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col gap-2",
|
|
4203
|
+
children: [
|
|
4204
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-12 gap-2 items-start", children: [
|
|
4205
|
+
/* @__PURE__ */ jsxs("div", { className: "col-span-6 flex flex-col gap-1", children: [
|
|
4206
|
+
/* @__PURE__ */ jsx(Label, { className: "text-[11px] text-ui-fg-subtle", children: "Item Title *" }),
|
|
4207
|
+
/* @__PURE__ */ jsx(
|
|
4208
|
+
Input,
|
|
4209
|
+
{
|
|
4210
|
+
placeholder: "Item name / Service",
|
|
4211
|
+
value: it.title,
|
|
4212
|
+
onChange: (e) => {
|
|
4213
|
+
const newItems = [...editForm.items];
|
|
4214
|
+
newItems[idx] = { ...newItems[idx], title: e.target.value };
|
|
4215
|
+
setEditForm({ ...editForm, items: newItems });
|
|
4216
|
+
},
|
|
4217
|
+
size: "small"
|
|
4218
|
+
}
|
|
4219
|
+
)
|
|
4220
|
+
] }),
|
|
4221
|
+
/* @__PURE__ */ jsxs("div", { className: "col-span-2 flex flex-col gap-1", children: [
|
|
4222
|
+
/* @__PURE__ */ jsx(Label, { className: "text-[11px] text-ui-fg-subtle", children: "Qty" }),
|
|
4223
|
+
/* @__PURE__ */ jsx(
|
|
4224
|
+
Input,
|
|
4225
|
+
{
|
|
4226
|
+
type: "number",
|
|
4227
|
+
min: "1",
|
|
4228
|
+
value: it.quantity,
|
|
4229
|
+
onChange: (e) => {
|
|
4230
|
+
const newItems = [...editForm.items];
|
|
4231
|
+
newItems[idx] = { ...newItems[idx], quantity: Number(e.target.value) || 1 };
|
|
4232
|
+
setEditForm({ ...editForm, items: newItems });
|
|
4233
|
+
},
|
|
4234
|
+
size: "small"
|
|
4235
|
+
}
|
|
4236
|
+
)
|
|
4237
|
+
] }),
|
|
4238
|
+
/* @__PURE__ */ jsxs("div", { className: "col-span-3 flex flex-col gap-1", children: [
|
|
4239
|
+
/* @__PURE__ */ jsx(Label, { className: "text-[11px] text-ui-fg-subtle", children: "Unit Price" }),
|
|
4240
|
+
/* @__PURE__ */ jsx(
|
|
4241
|
+
Input,
|
|
4242
|
+
{
|
|
4243
|
+
type: "number",
|
|
4244
|
+
step: "0.01",
|
|
4245
|
+
value: it.unit_price,
|
|
4246
|
+
onChange: (e) => {
|
|
4247
|
+
const newItems = [...editForm.items];
|
|
4248
|
+
newItems[idx] = { ...newItems[idx], unit_price: Number(e.target.value) || 0 };
|
|
4249
|
+
setEditForm({ ...editForm, items: newItems });
|
|
4250
|
+
},
|
|
4251
|
+
size: "small"
|
|
4252
|
+
}
|
|
4253
|
+
)
|
|
4254
|
+
] }),
|
|
4255
|
+
/* @__PURE__ */ jsx("div", { className: "col-span-1 pt-6 flex justify-end", children: /* @__PURE__ */ jsx(
|
|
4256
|
+
Button,
|
|
4257
|
+
{
|
|
4258
|
+
variant: "transparent",
|
|
4259
|
+
size: "small",
|
|
4260
|
+
onClick: () => {
|
|
4261
|
+
const newItems = editForm.items.filter((_, i) => i !== idx);
|
|
4262
|
+
setEditForm({ ...editForm, items: newItems });
|
|
4263
|
+
},
|
|
4264
|
+
className: "text-ui-fg-muted hover:text-ui-fg-error p-1",
|
|
4265
|
+
children: /* @__PURE__ */ jsx(Trash, { className: "w-4 h-4" })
|
|
4266
|
+
}
|
|
4267
|
+
) })
|
|
4268
|
+
] }),
|
|
4269
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
4270
|
+
/* @__PURE__ */ jsx(Label, { className: "text-[11px] text-ui-fg-subtle", children: "Description (Optional)" }),
|
|
4271
|
+
/* @__PURE__ */ jsx(
|
|
4272
|
+
Input,
|
|
4273
|
+
{
|
|
4274
|
+
placeholder: "Optional item details / specifications",
|
|
4275
|
+
value: it.description,
|
|
4276
|
+
onChange: (e) => {
|
|
4277
|
+
const newItems = [...editForm.items];
|
|
4278
|
+
newItems[idx] = { ...newItems[idx], description: e.target.value };
|
|
4279
|
+
setEditForm({ ...editForm, items: newItems });
|
|
4280
|
+
},
|
|
4281
|
+
size: "small"
|
|
4282
|
+
}
|
|
4283
|
+
)
|
|
4284
|
+
] })
|
|
4285
|
+
]
|
|
4286
|
+
},
|
|
4287
|
+
idx
|
|
4288
|
+
)) }),
|
|
4289
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-end items-center gap-4 py-2 border-t border-ui-border-base", children: [
|
|
4290
|
+
/* @__PURE__ */ jsx(Text, { className: "text-xs text-ui-fg-subtle", children: "Calculated Total:" }),
|
|
4291
|
+
/* @__PURE__ */ jsx(Text, { className: "text-sm font-semibold", children: formatCurrency(
|
|
4292
|
+
editForm.items.reduce(
|
|
4293
|
+
(sum, it) => sum + (Number(it.quantity) || 1) * (Number(it.unit_price) || 0),
|
|
4294
|
+
0
|
|
4295
|
+
),
|
|
4296
|
+
editingDoc.currency_code || "KES"
|
|
4297
|
+
) })
|
|
4298
|
+
] })
|
|
4299
|
+
] }),
|
|
4300
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
4301
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4302
|
+
/* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Notes / Client Remarks" }),
|
|
4303
|
+
/* @__PURE__ */ jsx(
|
|
4304
|
+
Textarea,
|
|
4305
|
+
{
|
|
4306
|
+
value: editForm.notes,
|
|
4307
|
+
onChange: (e) => setEditForm({ ...editForm, notes: e.target.value }),
|
|
4308
|
+
rows: 3,
|
|
4309
|
+
placeholder: "Notes visible on the document..."
|
|
4310
|
+
}
|
|
4311
|
+
)
|
|
4312
|
+
] }),
|
|
4313
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4314
|
+
/* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Terms & Conditions" }),
|
|
4315
|
+
/* @__PURE__ */ jsx(
|
|
4316
|
+
Textarea,
|
|
4317
|
+
{
|
|
4318
|
+
value: editForm.terms,
|
|
4319
|
+
onChange: (e) => setEditForm({ ...editForm, terms: e.target.value }),
|
|
4320
|
+
rows: 3,
|
|
4321
|
+
placeholder: "Terms and conditions..."
|
|
4322
|
+
}
|
|
4323
|
+
)
|
|
4324
|
+
] })
|
|
4325
|
+
] })
|
|
4326
|
+
] })
|
|
3979
4327
|
] }) })
|
|
3980
4328
|
] });
|
|
3981
4329
|
};
|
|
@@ -5,6 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.GET = GET;
|
|
7
7
|
exports.DELETE = DELETE;
|
|
8
|
+
exports.PUT = PUT;
|
|
9
|
+
exports.POST = POST;
|
|
8
10
|
const documents_1 = require("../../../../modules/documents");
|
|
9
11
|
const service_1 = require("../../../../modules/documents/service");
|
|
10
12
|
const zoho_books_1 = __importDefault(require("../../../../services/zoho-books"));
|
|
@@ -98,4 +100,26 @@ async function DELETE(req, res) {
|
|
|
98
100
|
return res.status(500).json({ message: error.message, error: true });
|
|
99
101
|
}
|
|
100
102
|
}
|
|
101
|
-
|
|
103
|
+
// PUT /admin/documents/:id - Edit / update an existing document (in database and Zoho Books)
|
|
104
|
+
async function PUT(req, res) {
|
|
105
|
+
try {
|
|
106
|
+
const documentService = req.scope.resolve(documents_1.DOCUMENTS_MODULE);
|
|
107
|
+
const docId = req.params.id;
|
|
108
|
+
const body = (req.body || {});
|
|
109
|
+
const updated = await documentService.updateDocument(docId, body, req.scope);
|
|
110
|
+
return res.json({
|
|
111
|
+
success: true,
|
|
112
|
+
message: "Document updated successfully",
|
|
113
|
+
document: updated,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
req.scope.resolve("logger", { allowUnregistered: true })?.error?.(`[Documents-API] Failed to update document ${req.params.id}: ${error.message}`);
|
|
118
|
+
return res.status(500).json({ message: error.message, error: true });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// POST /admin/documents/:id - Alternative method for updating document
|
|
122
|
+
async function POST(req, res) {
|
|
123
|
+
return PUT(req, res);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2RvY3VtZW50cy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsa0JBMEJDO0FBR0Qsd0JBd0VDO0FBR0Qsa0JBc0JDO0FBR0Qsb0JBS0M7QUEzSUQsNkRBQWlFO0FBQ2pFLG1FQUFxRztBQUNyRyxpRkFBK0Q7QUFFL0QsNkRBQTZEO0FBQ3RELEtBQUssVUFBVSxHQUFHLENBQ3ZCLEdBQWtDLEVBQ2xDLEdBQW1CO0lBRW5CLElBQUksQ0FBQztRQUNILE1BQU0sZUFBZSxHQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyw0QkFBZ0IsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBRTVCLElBQUksTUFBTSxHQUFRLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksR0FBRyxJQUFBLCtCQUFxQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxLQUFL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
|