133 lines
5.1 KiB
TypeScript
133 lines
5.1 KiB
TypeScript
import { fail } from "@sveltejs/kit";
|
|
import type { Actions, PageServerLoad } from "./$types";
|
|
import type { StackqItem } from "$lib/types/items";
|
|
import { parseBool, parseNum } from "$lib/parse-form";
|
|
import { validateImageUpload } from "$lib/validate-image-upload";
|
|
|
|
const COLLECTION = "Stackq_Items";
|
|
|
|
export const load: PageServerLoad = async ({ locals }) => {
|
|
const list = await locals.pb
|
|
.collection(COLLECTION)
|
|
.getFullList<StackqItem>({
|
|
sort: "-created",
|
|
expand: "Parent",
|
|
})
|
|
.catch((err) => {
|
|
console.error(COLLECTION, err);
|
|
return [] as StackqItem[];
|
|
});
|
|
|
|
const itemsForParent = list.map((i) => ({ id: i.id, Item: i.Item, SKU: i.SKU }));
|
|
|
|
return { items: list, itemsForParent };
|
|
};
|
|
|
|
export const actions: Actions = {
|
|
create: async ({ request, locals }) => {
|
|
const form = await request.formData();
|
|
const Item = (form.get("Item") as string)?.trim() ?? "";
|
|
const SKU = (form.get("SKU") as string)?.trim() ?? "";
|
|
const Description = (form.get("Description") as string)?.trim() ?? "";
|
|
const UOM = (form.get("UOM") as string)?.trim() ?? "";
|
|
const Cost = parseNum(form.get("Cost"));
|
|
const Vendor = (form.get("Vendor") as string)?.trim() ?? "";
|
|
const Catagory = (form.get("Catagory") as string)?.trim() ?? "";
|
|
const Sub_Catagory = (form.get("Sub_Catagory") as string)?.trim() ?? "";
|
|
const Has_Parent = parseBool(form.get("Has_Parent"));
|
|
const Parent = (form.get("Parent") as string)?.trim() ?? "";
|
|
const Stock = parseBool(form.get("Stock"));
|
|
const imageFileCreate = form.get("Image") as File | null;
|
|
const hasImage = imageFileCreate && imageFileCreate.size > 0;
|
|
if (hasImage) {
|
|
const imgError = validateImageUpload(imageFileCreate);
|
|
if (imgError) return fail(400, { error: imgError, form: "create" });
|
|
}
|
|
|
|
if (!Item) return fail(400, { error: "Item name is required", form: "create" });
|
|
|
|
try {
|
|
const body: Record<string, unknown> = {
|
|
Item,
|
|
SKU,
|
|
Description,
|
|
UOM: UOM || undefined,
|
|
Cost: Cost ?? 0,
|
|
Vendor,
|
|
Catagory: Catagory || undefined,
|
|
Sub_Catagory: Sub_Catagory || undefined,
|
|
Has_Parent: !!Has_Parent,
|
|
Parent: Parent || null,
|
|
Stock: !!Stock,
|
|
};
|
|
if (hasImage) body.Image = imageFileCreate;
|
|
await locals.pb.collection(COLLECTION).create(body);
|
|
} catch (e: unknown) {
|
|
const message = e && typeof e === "object" && "message" in e ? String((e as { message: string }).message) : "Create failed";
|
|
return fail(500, { error: message, form: "create" });
|
|
}
|
|
return { success: true };
|
|
},
|
|
|
|
update: async ({ request, locals }) => {
|
|
const form = await request.formData();
|
|
const id = (form.get("id") as string)?.trim();
|
|
if (!id) return fail(400, { error: "Missing id", form: "update" });
|
|
|
|
const Item = (form.get("Item") as string)?.trim() ?? "";
|
|
const SKU = (form.get("SKU") as string)?.trim() ?? "";
|
|
const Description = (form.get("Description") as string)?.trim() ?? "";
|
|
const UOM = (form.get("UOM") as string)?.trim() ?? "";
|
|
const Cost = parseNum(form.get("Cost"));
|
|
const Vendor = (form.get("Vendor") as string)?.trim() ?? "";
|
|
const Catagory = (form.get("Catagory") as string)?.trim() ?? "";
|
|
const Sub_Catagory = (form.get("Sub_Catagory") as string)?.trim() ?? "";
|
|
const Has_Parent = parseBool(form.get("Has_Parent"));
|
|
const Parent = (form.get("Parent") as string)?.trim() ?? "";
|
|
const Stock = parseBool(form.get("Stock"));
|
|
const Image = form.get("Image") as File | null;
|
|
const imageFile = Image && Image.size > 0 ? Image : undefined;
|
|
if (imageFile) {
|
|
const imgError = validateImageUpload(imageFile);
|
|
if (imgError) return fail(400, { error: imgError, form: "update" });
|
|
}
|
|
|
|
if (!Item) return fail(400, { error: "Item name is required", form: "update" });
|
|
|
|
try {
|
|
const body: Record<string, unknown> = {
|
|
Item,
|
|
SKU,
|
|
Description,
|
|
UOM: UOM || undefined,
|
|
Cost: Cost ?? 0,
|
|
Vendor,
|
|
Catagory: Catagory || undefined,
|
|
Sub_Catagory: Sub_Catagory || undefined,
|
|
Has_Parent: !!Has_Parent,
|
|
Parent: Parent || null,
|
|
Stock: !!Stock,
|
|
};
|
|
if (imageFile) body.Image = imageFile;
|
|
await locals.pb.collection(COLLECTION).update(id, body);
|
|
} catch (e: unknown) {
|
|
const message = e && typeof e === "object" && "message" in e ? String((e as { message: string }).message) : "Update failed";
|
|
return fail(500, { error: message, form: "update" });
|
|
}
|
|
return { success: true };
|
|
},
|
|
|
|
delete: async ({ request, locals }) => {
|
|
const form = await request.formData();
|
|
const id = (form.get("id") as string)?.trim();
|
|
if (!id) return fail(400, { error: "Missing id", form: "delete" });
|
|
try {
|
|
await locals.pb.collection(COLLECTION).delete(id);
|
|
} catch (e: unknown) {
|
|
const message = e && typeof e === "object" && "message" in e ? String((e as { message: string }).message) : "Delete failed";
|
|
return fail(500, { error: message, form: "delete" });
|
|
}
|
|
return { success: true };
|
|
},
|
|
};
|