diff --git a/src/routes/backoffice/purchaseorder/+page.svelte b/src/routes/backoffice/purchaseorder/+page.svelte
index b9b3a1d..3cbba6d 100644
--- a/src/routes/backoffice/purchaseorder/+page.svelte
+++ b/src/routes/backoffice/purchaseorder/+page.svelte
@@ -4,7 +4,6 @@
import { getSessionAuthId } from "$lib/utils/authUtil";
import CurrencyInput from "$lib/CurrencyInput.svelte";
-
type PurchaseOrderInsert = {
issue_id: string;
prepared_date: string;
@@ -56,7 +55,7 @@
acknowledged: boolean;
acknowledge_by: string;
approved_by: string;
- prepared: boolean | null;
+ prepared: boolean | null;
approved_price: number;
approved_quantity: number;
total_approved_order_amount: number;
@@ -78,7 +77,6 @@
};
const columns: columns[] = [
-
{ key: "purchase_order_number", title: "PO Number" },
{ key: "issue_name", title: "Issue Name" },
{ key: "requested_date", title: "Requested Date" },
@@ -93,7 +91,7 @@
{ key: "completed", title: "Complete" },
{ key: "received", title: "Receive" },
{ key: "updated_at", title: "Updated At" },
- { key: "payment", title: "Payment" },
+ { key: "payment", title: "Payment" },
{ key: "actions", title: "Actions" }, // For edit/delete buttons
];
const excludedKeys = [
@@ -174,7 +172,7 @@
acknowledged: null,
completed: null,
received: null,
- po_remark: ""
+ po_remark: "",
};
let showAddPOModal = false;
let addPOForm = {
@@ -185,8 +183,8 @@
po_status: "requested",
po_remark: "",
requested_by: "",
- requested_date: new Date().toISOString().split("T")[0]
- };
+ requested_date: new Date().toISOString().split("T")[0],
+ };
let showApprovalModal = false;
let approvalForm = {
po_number: "",
@@ -199,14 +197,22 @@
approved_vendor: "",
approved_price: 0,
po_item: "",
- total_approved_order_amount: 0
+ total_approved_order_amount: 0,
};
- let villaOptions = [];
+
+ type VillaField = {
+ id: string;
+ villa_name: string;
+ };
+
+ let villaOptions: VillaField[] = [];
let poItemOptions = [];
let employeeOptions = [];
let allRows: PurchaseOrderDisplay[] = [];
let currentPage = 1;
let rowsPerPage = 10;
+ let totalItems = 0;
+ let totalPages = 0;
let currentUserId = "";
let currentUserFullName = "";
let showPaymentModal = false;
@@ -225,20 +231,20 @@
"4th_pay_date": "",
"5th_pay_date": "",
"6th_pay_date": "",
- due_remaining: 0
+ due_remaining: 0,
};
let showAcknowledgedModal = false;
let acknowledgedForm = {
po_number: "",
acknowledged: "",
acknowledged_by: "",
- acknowledged_date: ""
+ acknowledged_date: "",
};
let selectedVillaId: string | null = null;
let searchTerm: string = "";
let showPreparedModal = false;
let selectedStatus: string | null = null;
- let selectedPO: string | null = null;
+ let selectedPO: string | null = null;
let preparedByOptions: any[] = [];
let vendorOptions: any[] = [];
let preparedForm = {
@@ -256,22 +262,22 @@
approved_quantity: 0,
approved_vendor: "",
approved_price: 0,
- total_approved_order_amount: 0
+ total_approved_order_amount: 0,
};
- let formattedPrice = "";
+ let formattedPrice = "";
let showReceivedModal = false;
let receivedForm = {
po_number: "",
received: "",
received_by: "",
- received_date: ""
+ received_date: "",
};
let showCompletedModal = false;
let completedForm = {
po_number: "",
completed: "",
completed_by: "",
- completed_date: ""
+ completed_date: "",
};
let showModal = false;
let isEditing = false;
@@ -280,32 +286,21 @@
let vendors: { id: string; name: string }[] = [];
let issues: { id: string; name: string }[] = [];
let printingId: string | null = null;
- // Pagination variables
- $: totalPages = Math.ceil(allRows.length / rowsPerPage);
- $: paginatedRows = allRows.slice(
- (currentPage - 1) * rowsPerPage,
- currentPage * rowsPerPage,
- );
- $: currentPage = 1; // Reset to first page when allRows changes
+
$: formattedPrice = preparedForm.q1_vendor_price.toLocaleString("id-ID", {
- style: "currency",
- currency: "IDR",
- minimumFractionDigits: 0,
- });
+ style: "currency",
+ currency: "IDR",
+ minimumFractionDigits: 0,
+ });
// function Sort
function toggleSort(column: string) {
- if (sortColumn === column) {
- sortOrder = sortOrder === "asc" ? "desc" : "asc";
- } else {
- sortColumn = column;
- sortOrder = "asc";
- }
- fetchPurchaseOrder(
- selectedVillaId,
- searchTerm,
- sortColumn,
- sortOrder,
- );
+ if (sortColumn === column) {
+ sortOrder = sortOrder === "asc" ? "desc" : "asc";
+ } else {
+ sortColumn = column;
+ sortOrder = "asc";
+ }
+ fetchPurchaseOrder(selectedVillaId, searchTerm, sortColumn, sortOrder);
}
// Function to format numbers as ordinal (1st, 2nd, 3rd, etc.)
@@ -329,11 +324,51 @@
acknowledged: row.acknowledged,
completed: row.completed,
received: row.received,
- po_remark: row.po_remark || ""
+ po_remark: row.po_remark || "",
};
showEditModal = true;
}
+ function pageRange(
+ totalPages: number,
+ currentPage: number,
+ ): (number | string)[] {
+ const range: (number | string)[] = [];
+ const maxDisplay = 5;
+
+ if (totalPages <= maxDisplay + 2) {
+ for (let i = 1; i <= totalPages; i++) range.push(i);
+ } else {
+ const start = Math.max(2, currentPage - 2);
+ const end = Math.min(totalPages - 1, currentPage + 2);
+
+ range.push(1);
+ if (start > 2) range.push("...");
+
+ for (let i = start; i <= end; i++) {
+ range.push(i);
+ }
+
+ if (end < totalPages - 1) range.push("...");
+ range.push(totalPages);
+ }
+
+ return range;
+ }
+
+ function changePage(page: number) {
+ if (page < 1 || page > totalPages || page === currentPage) return;
+ currentPage = page;
+ fetchPurchaseOrder(
+ selectedVillaId,
+ searchTerm,
+ sortColumn,
+ sortOrder,
+ (currentPage - 1) * rowsPerPage,
+ rowsPerPage,
+ selectedStatus,
+ );
+ }
// pagination functions
function goToPage(page: number) {
if (page >= 1 && page <= totalPages) currentPage = page;
@@ -353,7 +388,7 @@
approved_vendor: row.approved_vendor || "",
approved_price: row.approved_price || 0,
po_item: row.po_item || "",
- total_approved_order_amount: row.total_approved_order_amount || 0
+ total_approved_order_amount: row.total_approved_order_amount || 0,
};
showApprovalModal = true;
@@ -366,7 +401,7 @@
po_number: row.purchase_order_number || "",
acknowledged: row.acknowledged ? "acknowledged" : "reject",
acknowledged_by: currentUserId,
- acknowledged_date: new Date().toISOString().split("T")[0]
+ acknowledged_date: new Date().toISOString().split("T")[0],
};
showAcknowledgedModal = true;
@@ -379,7 +414,7 @@
po_number: row.purchase_order_number || "",
received: row.received ? "received" : "reject",
received_by: currentUserId,
- received_date: new Date().toISOString().split("T")[0]
+ received_date: new Date().toISOString().split("T")[0],
};
showReceivedModal = true;
@@ -392,15 +427,15 @@
po_number: row.purchase_order_number || "",
completed: row.completed ? "completed" : "reject",
completed_by: currentUserId,
- completed_date: new Date().toISOString().split("T")[0]
+ completed_date: new Date().toISOString().split("T")[0],
};
showCompletedModal = true;
}
// Update total amount in prepared form
function updateTotalAmount() {
- preparedForm.total_approved_order_amount =
- preparedForm.approved_quantity * preparedForm.approved_price;
+ preparedForm.total_approved_order_amount =
+ preparedForm.approved_quantity * preparedForm.approved_price;
}
function getStatusOption(value: string) {
return statusOptions.find((option) => option.value === value) ?? null;
@@ -424,7 +459,7 @@
"4th_pay_date": row["4th_pay_date"] || "",
"5th_pay_date": row["5th_pay_date"] || "",
"6th_pay_date": row["6th_pay_date"] || "",
- due_remaining: calculateDueRemaining(row)
+ due_remaining: calculateDueRemaining(row),
};
showPaymentModal = true;
@@ -459,14 +494,14 @@
}
// Update due remaining amount in payment form
function updateDueRemaining() {
- paymentForm.due_remaining =
- paymentForm.total_approved_order_amount -
- paymentForm["1st_pay_amt"] -
- paymentForm["2nd_pay_amt"] -
- paymentForm["3rd_pay_amt"] -
- paymentForm["4th_pay_amt"] -
- paymentForm["5th_pay_amt"] -
- paymentForm["6th_pay_amt"];
+ paymentForm.due_remaining =
+ paymentForm.total_approved_order_amount -
+ paymentForm["1st_pay_amt"] -
+ paymentForm["2nd_pay_amt"] -
+ paymentForm["3rd_pay_amt"] -
+ paymentForm["4th_pay_amt"] -
+ paymentForm["5th_pay_amt"] -
+ paymentForm["6th_pay_amt"];
}
// Save payment data for purchase order
async function savePayment() {
@@ -486,7 +521,7 @@
"4th_pay_date": paymentForm["4th_pay_date"] || null,
"5th_pay_date": paymentForm["5th_pay_date"] || null,
"6th_pay_date": paymentForm["6th_pay_date"] || null,
- due_remaining: paymentForm.due_remaining
+ due_remaining: paymentForm.due_remaining,
})
.eq("id", selectedPO.id);
@@ -504,12 +539,13 @@
const { error } = await supabase
.from("vb_purchase_orders")
.update({
- approved: approvalForm.approval === "approve",
- approved_by: approvalForm.approval === "approve" ? currentUserId : null,
- approved_date: approvalForm.approved_date,
- reject_comment: approvalForm.reject_comment || null,
- po_status: "approved",
- po_remark: approvalForm.po_remark || null
+ approved: approvalForm.approval === "approve",
+ approved_by:
+ approvalForm.approval === "approve" ? currentUserId : null,
+ approved_date: approvalForm.approved_date,
+ reject_comment: approvalForm.reject_comment || null,
+ po_status: "approved",
+ po_remark: approvalForm.po_remark || null,
})
.eq("id", selectedPO.id);
@@ -524,11 +560,23 @@
}
// populate dropdowns for adding purchase orders
async function fetchDropdowns() {
- const [{ data: villas }, { data: items }, { data: employees }] = await Promise.all([
- supabase.from("vb_villas").select("id, villa_name").eq("villa_status", "Active").order("villa_name", { ascending: true }),
- supabase.from("vb_po_item").select("id, item_name").order("item_name", { ascending: true }),
- supabase.from("vb_employee").select("id, employee_name").eq("employee_status", "Active").order("employee_name", { ascending: true }),
- ]);
+ const [{ data: villas }, { data: items }, { data: employees }] =
+ await Promise.all([
+ supabase
+ .from("vb_villas")
+ .select("id, villa_name")
+ .eq("villa_status", "Active")
+ .order("villa_name", { ascending: true }),
+ supabase
+ .from("vb_po_item")
+ .select("id, item_name")
+ .order("item_name", { ascending: true }),
+ supabase
+ .from("vb_employee")
+ .select("id, employee_name")
+ .eq("employee_status", "Active")
+ .order("employee_name", { ascending: true }),
+ ]);
villaOptions = villas || [];
poItemOptions = items || [];
employeeOptions = employees || [];
@@ -544,7 +592,7 @@
po_status: "requested",
po_remark: "",
requested_by: "",
- requested_date: new Date().toISOString().split("T")[0]
+ requested_date: new Date().toISOString().split("T")[0],
};
showAddPOModal = true;
}
@@ -579,7 +627,7 @@
po_remark: addPOForm.po_remark,
requested_by: addPOForm.requested_by,
requested_date: addPOForm.requested_date,
- created_at: new Date().toISOString()
+ created_at: new Date().toISOString(),
});
if (error) {
@@ -594,20 +642,20 @@
// Fetch current user details
async function fetchCurrentUser() {
const {
- data: { user }
+ data: { user },
} = await supabase.auth.getUser();
if (user) {
currentUserId = user.id;
const { data, error } = await supabase
- .from("vb_users")
- .select("full_name")
- .eq("id", user.id)
- .single();
+ .from("vb_users")
+ .select("full_name")
+ .eq("id", user.id)
+ .single();
if (!error && data) {
- currentUserFullName = data.full_name;
+ currentUserFullName = data.full_name;
}
}
}
@@ -616,14 +664,14 @@
const { error } = await supabase
.from("vb_purchase_orders")
.update({
- prepared: editForm.prepared,
- approved: editForm.approved,
- acknowledged: editForm.acknowledged,
- completed: editForm.completed,
- received: editForm.received,
- po_remark: editForm.po_remark,
- updated_at: new Date().toISOString(), // ✅ safe current timestamp
- updated_by: currentUserId // ✅ user UUID
+ prepared: editForm.prepared,
+ approved: editForm.approved,
+ acknowledged: editForm.acknowledged,
+ completed: editForm.completed,
+ received: editForm.received,
+ po_remark: editForm.po_remark,
+ updated_at: new Date().toISOString(), // ✅ safe current timestamp
+ updated_by: currentUserId, // ✅ user UUID
})
.eq("id", selectedPO.id);
@@ -641,10 +689,13 @@
const { error } = await supabase
.from("vb_purchase_orders")
.update({
- completed: completedForm.completed === "completed",
- completed_by: completedForm.completed === "completed" ? currentUserId : null,
- completed_date: completedForm.completed_date,
- po_status: "completed"
+ completed: completedForm.completed === "completed",
+ completed_by:
+ completedForm.completed === "completed"
+ ? currentUserId
+ : null,
+ completed_date: completedForm.completed_date,
+ po_status: "completed",
})
.eq("id", selectedPO.id);
@@ -652,25 +703,31 @@
console.error("Error saving completed:", error);
alert("Failed to save.");
return;
- }
+ }
// ✅ Fire the webhook after saving:
try {
- await fetch("https://flow.catalis.app/webhook-test/vb_need_complete_new", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- po_id: selectedPO.id,
- completed: completedForm.completed === "completed",
- completed_by: completedForm.completed === "completed" ? currentUserId : null,
- completed_date: completedForm.completed_date
- })
- });
+ await fetch(
+ "https://flow.catalis.app/webhook-test/vb_need_complete_new",
+ {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ po_id: selectedPO.id,
+ completed: completedForm.completed === "completed",
+ completed_by:
+ completedForm.completed === "completed"
+ ? currentUserId
+ : null,
+ completed_date: completedForm.completed_date,
+ }),
+ },
+ );
} catch (webhookError) {
console.error("Webhook failed:", webhookError);
alert("Saved, but webhook failed.");
}
- showCompletedModal = false;
- await fetchPurchaseOrder();
+ showCompletedModal = false;
+ await fetchPurchaseOrder();
}
// open prepared modal for purchase order
async function openPreparedModal(row) {
@@ -691,7 +748,8 @@
approved_quantity: row.approved_quantity || 0,
approved_vendor: row.approved_vendor || "",
approved_price: row.approved_price || 0,
- total_approved_order_amount: row.approved_quantity * row.approved_price
+ total_approved_order_amount:
+ row.approved_quantity * row.approved_price,
};
// Load dropdowns
@@ -701,11 +759,15 @@
}
// Fetch dropdowns for prepared modal
async function fetchPreparedDropdowns() {
- const [{ data: employees }, { data: items }, { data: vendors }] = await Promise.all([
- supabase.from("vb_employee").select("id, employee_name").eq("employee_status", "Active"),
- supabase.from("vb_po_item").select("id, item_name"),
- supabase.from("vb_vendor").select("id, name")
- ]);
+ const [{ data: employees }, { data: items }, { data: vendors }] =
+ await Promise.all([
+ supabase
+ .from("vb_employee")
+ .select("id, employee_name")
+ .eq("employee_status", "Active"),
+ supabase.from("vb_po_item").select("id, item_name"),
+ supabase.from("vb_vendor").select("id, name"),
+ ]);
preparedByOptions = employees || [];
poItemOptions = items || [];
@@ -723,26 +785,31 @@
) {
let query = supabase
.from("vb_purchaseorder_data")
- .select("*")
- .order(sortColumn || "created_at", { ascending: sortOrder === "asc" })
+ .select("*", { count: "exact" })
+ .order(sortColumn || "created_at", {
+ ascending: sortOrder === "asc",
+ })
.range(offset, offset + limit - 1);
- if (filter) {
- query = query.eq("villa_id", filter);
- }
+ if (filter) {
+ query = query.eq("villa_id", filter);
+ }
- if (search) {
- query = query.or(
- `purchase_order_number.ilike.%${search}%,` +
+ if (search) {
+ query = query.or(
+ `purchase_order_number.ilike.%${search}%,` +
`issue_name.ilike.%${search}%,` +
- `po_item.ilike.%${search}%`
- );
- }
- if (poStatus) {
- query = query.eq("po_status", poStatus);
- }
+ `po_item.ilike.%${search}%`,
+ );
+ }
+ if (poStatus) {
+ query = query.eq("po_status", poStatus);
+ }
- const { data, error } = await query;
+ const { data, count, error } = await query;
+
+ console.log("total count:", count);
+
if (error) {
console.error("Error fetching purchase orders:", error);
@@ -755,23 +822,50 @@
return;
}
+
+
allRows = data.map((row: any) => {
return {
- ...row,
- issue_name: row.issue_name || "N/A",
- villa_name: row.villa_data || "N/A",
- po_number: row.purchase_order_number || "",
- approval: row.approval || "",
- completed_status: row.completed_status || "",
- proses_to_approval: row.proses_to_approval || false,
- po_price: row.po_price || 0,
- po_total_price: row.po_total_price || 0,
+ ...row,
+ issue_name: row.issue_name || "N/A",
+ villa_name: row.villa_data || "N/A",
+ po_number: row.purchase_order_number || "",
+ approval: row.approval || "",
+ completed_status: row.completed_status || "",
+ proses_to_approval: row.proses_to_approval || false,
+ po_price: row.po_price || 0,
+ po_total_price: row.po_total_price || 0,
} as PurchaseOrderDisplay;
});
console.log("✅ Fetched rows:", data);
console.log("✅ Final mapped rows:", allRows);
+
+ totalItems = count || 0;
+
+ console.log("✅ Total items:", totalItems);
+
}
+
+ //fetch on mount
+ onMount(() => {
+ fetchPurchaseOrder(
+ selectedVillaId,
+ searchTerm,
+ sortColumn,
+ sortOrder,
+ (currentPage - 1) * rowsPerPage,
+ rowsPerPage,
+ selectedStatus,
+ );
+ fetchVendors();
+ fetchCurrentUser();
+ fetchDropdowns();
+ });
+
+ $: totalPages = Math.ceil(totalItems / rowsPerPage);
+ $: currentPage = 1;
+
//fetch all issues
async function fetchIssues() {
const { data, error } = await supabase
@@ -820,58 +914,60 @@
}
// Save prepared purchase order
async function savePrepared() {
- const { error } = await supabase
- .from("vb_purchase_orders")
- .update({
- prepared_by: preparedForm.prepared_by,
- prepared_date: preparedForm.prepared_date,
- po_item: preparedForm.po_item,
- po_quantity: preparedForm.po_quantity,
- q1_vendor: preparedForm.q1_vendor,
- q2_vendor: preparedForm.q2_vendor,
- q3_vendor: preparedForm.q3_vendor,
- q1_vendor_price: preparedForm.q1_vendor_price,
- q2_vendor_price: preparedForm.q2_vendor_price,
- q3_vendor_price: preparedForm.q3_vendor_price,
- approved_quantity: preparedForm.approved_quantity,
- approved_vendor: preparedForm.approved_vendor,
- approved_price: preparedForm.approved_price,
- total_approved_order_amount: preparedForm.total_approved_order_amount,
- po_remark: preparedForm.po_remark,
- po_status: "prepared",
- prepared: true,
- })
- .eq("id", selectedPO.id);
+ const { error } = await supabase
+ .from("vb_purchase_orders")
+ .update({
+ prepared_by: preparedForm.prepared_by,
+ prepared_date: preparedForm.prepared_date,
+ po_item: preparedForm.po_item,
+ po_quantity: preparedForm.po_quantity,
+ q1_vendor: preparedForm.q1_vendor,
+ q2_vendor: preparedForm.q2_vendor,
+ q3_vendor: preparedForm.q3_vendor,
+ q1_vendor_price: preparedForm.q1_vendor_price,
+ q2_vendor_price: preparedForm.q2_vendor_price,
+ q3_vendor_price: preparedForm.q3_vendor_price,
+ approved_quantity: preparedForm.approved_quantity,
+ approved_vendor: preparedForm.approved_vendor,
+ approved_price: preparedForm.approved_price,
+ total_approved_order_amount:
+ preparedForm.total_approved_order_amount,
+ po_remark: preparedForm.po_remark,
+ po_status: "prepared",
+ prepared: true,
+ })
+ .eq("id", selectedPO.id);
- if (error) {
- console.error("Error saving prepared data:", error);
- alert("Failed to save.");
- return;
- }
+ if (error) {
+ console.error("Error saving prepared data:", error);
+ alert("Failed to save.");
+ return;
+ }
- try {
- await fetch("https://flow.catalis.app/webhook/vb_approval_po_new", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- po_id: selectedPO.id,
- po_status: "prepared",
- prepared_by: preparedForm.prepared_by,
- prepared_date: preparedForm.prepared_date,
- po_item: preparedForm.po_item,
- po_quantity: preparedForm.po_quantity,
- approved_quantity: preparedForm.approved_quantity,
- approved_vendor: preparedForm.approved_vendor,
- approved_price: preparedForm.approved_price,
- total_approved_order_amount: preparedForm.total_approved_order_amount,
- }),
- });
- } catch (webhookError) {
- console.error("Failed to fire webhook:", webhookError);
- alert("Save worked but webhook failed.");
- }
- showPreparedModal = false;
- await fetchPurchaseOrder();
+ try {
+ await fetch("https://flow.catalis.app/webhook/vb_approval_po_new", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ po_id: selectedPO.id,
+ po_status: "prepared",
+ prepared_by: preparedForm.prepared_by,
+ prepared_date: preparedForm.prepared_date,
+ po_item: preparedForm.po_item,
+ po_quantity: preparedForm.po_quantity,
+ approved_quantity: preparedForm.approved_quantity,
+ approved_vendor: preparedForm.approved_vendor,
+ approved_price: preparedForm.approved_price,
+ total_approved_order_amount:
+ preparedForm.total_approved_order_amount,
+ }),
+ });
+ } catch (webhookError) {
+ console.error("Failed to fire webhook:", webhookError);
+ alert("Save worked but webhook failed.");
+ }
+ showPreparedModal = false;
+ await fetchPurchaseOrder();
}
// Save project function
async function saveProject() {
@@ -930,7 +1026,9 @@
}
async function deleteProject(id: string) {
- const confirmed = confirm("Are you sure you want to delete this purchase order? This action cannot be undone.");
+ const confirmed = confirm(
+ "Are you sure you want to delete this purchase order? This action cannot be undone.",
+ );
if (!confirmed) {
return; // User chickened out — good.
}
@@ -954,10 +1052,11 @@
const { error } = await supabase
.from("vb_purchase_orders")
.update({
- received: receivedForm.received === "received",
- received_by: receivedForm.received === "received" ? currentUserId : null,
- received_date: receivedForm.received_date,
- po_status: "received",
+ received: receivedForm.received === "received",
+ received_by:
+ receivedForm.received === "received" ? currentUserId : null,
+ received_date: receivedForm.received_date,
+ po_status: "received",
})
.eq("id", selectedPO.id);
@@ -968,16 +1067,22 @@
}
// ✅ Fire the webhook after the DB update succeeds:
try {
- await fetch("https://flow.catalis.app/webhook-test/vb_need_received_new", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- po_id: selectedPO.id,
- received: receivedForm.received === "received",
- received_by: receivedForm.received === "received" ? currentUserId : null,
- received_date: receivedForm.received_date
- })
- });
+ await fetch(
+ "https://flow.catalis.app/webhook-test/vb_need_received_new",
+ {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ po_id: selectedPO.id,
+ received: receivedForm.received === "received",
+ received_by:
+ receivedForm.received === "received"
+ ? currentUserId
+ : null,
+ received_date: receivedForm.received_date,
+ }),
+ },
+ );
} catch (webhookError) {
console.error("Webhook failed:", webhookError);
alert("Saved, but webhook failed.");
@@ -990,10 +1095,13 @@
const { error } = await supabase
.from("vb_purchase_orders")
.update({
- acknowledged: acknowledgedForm.acknowledged === "acknowledged",
- acknowledge_by: acknowledgedForm.acknowledged === "acknowledged" ? currentUserId : null,
- acknowledged_date: acknowledgedForm.acknowledged_date,
- po_status: "acknowledged"
+ acknowledged: acknowledgedForm.acknowledged === "acknowledged",
+ acknowledge_by:
+ acknowledgedForm.acknowledged === "acknowledged"
+ ? currentUserId
+ : null,
+ acknowledged_date: acknowledgedForm.acknowledged_date,
+ po_status: "acknowledged",
})
.eq("id", selectedPO.id);
@@ -1005,16 +1113,23 @@
// ✅ Fire the webhook after successful update:
try {
- await fetch("https://flow.catalis.app/webhook/vb_acknowledged_new", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- po_id: selectedPO.id,
- acknowledged: acknowledgedForm.acknowledged === "acknowledged",
- acknowledged_by: acknowledgedForm.acknowledged === "acknowledged" ? currentUserId : null,
- acknowledged_date: acknowledgedForm.acknowledged_date
- })
- });
+ await fetch(
+ "https://flow.catalis.app/webhook/vb_acknowledged_new",
+ {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ po_id: selectedPO.id,
+ acknowledged:
+ acknowledgedForm.acknowledged === "acknowledged",
+ acknowledged_by:
+ acknowledgedForm.acknowledged === "acknowledged"
+ ? currentUserId
+ : null,
+ acknowledged_date: acknowledgedForm.acknowledged_date,
+ }),
+ },
+ );
} catch (webhookError) {
console.error("Failed to fire webhook:", webhookError);
alert("Saved, but webhook failed.");
@@ -1025,18 +1140,24 @@
}
// Print purchase order
async function printPO(row) {
- printingId = row.id; // set loading
+ printingId = row.id; // set loading
try {
- const response = await fetch("https://flow.catalis.app/webhook/vb_print_po_new", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify(row)
- });
+ const response = await fetch(
+ "https://flow.catalis.app/webhook/vb_print_po_new",
+ {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(row),
+ },
+ );
if (!response.ok) {
- console.error("Failed to call print webhook:", response.statusText);
- alert("Failed to send print request.");
- return;
+ console.error(
+ "Failed to call print webhook:",
+ response.statusText,
+ );
+ alert("Failed to send print request.");
+ return;
}
alert("Print request sent successfully!");
@@ -1044,17 +1165,9 @@
console.error("Error sending print request:", error);
alert("An error occurred while sending the print request.");
} finally {
- printingId = null; // unset loading
+ printingId = null; // unset loading
}
}
-
- //fetch on mount
- onMount(() => {
- fetchPurchaseOrder();
- fetchVendors();
- fetchCurrentUser();
- fetchDropdowns();
- });
@@ -1074,72 +1187,81 @@
- {
- searchTerm = (e.target as HTMLInputElement).value.toLowerCase();
+ searchTerm = (
+ e.target as HTMLInputElement
+ ).value.toLowerCase();
fetchPurchaseOrder(
- selectedVillaId,
- searchTerm,
- sortColumn,
- sortOrder,
- 0,
- 1000,
- selectedStatus
+ selectedVillaId,
+ searchTerm,
+ sortColumn,
+ sortOrder,
+ currentPage - 1,
+ rowsPerPage,
+ selectedStatus,
);
}}
- />
-
+ />
+
-
+
-
+
-
-
+
@@ -1154,7 +1276,7 @@
>
{col.title}
{#if sortColumn === col.key}
- {sortOrder === 'asc' ? ' 🔼' : ' 🔽'}
+ {sortOrder === "asc" ? " 🔼" : " 🔽"}
{/if}
{:else}
@@ -1164,7 +1286,7 @@
>
{col.title}
{#if sortColumn === col.key}
- {sortOrder === 'asc' ? ' 🔼' : ' 🔽'}
+ {sortOrder === "asc" ? " 🔼" : " 🔽"}
{/if}
{/if}
@@ -1172,172 +1294,178 @@
- {#each paginatedRows as row}
-
- {#each columns as col}
- {#if col.key === "requested_date" || col.key === "po_due" || col.key === "updated_at"}
- |
- {#if row[col.key]}
- {new Date(row[col.key]).toLocaleString()}
- {:else}
- —
- {/if}
- |
- {:else if col.key === "po_remark"}
-
- {row[col.key] || "—"}
- |
- {:else if col.key === "purchase_order_number"}
-
- {row.purchase_order_number || "—"}
- |
- {:else if col.key === "prepared"}
-
-
- |
- {:else if col.key === "approved"}
-
-
- |
- {:else if col.key === "acknowledged"}
-
-
- |
- {:else if col.key === "completed"}
-
-
+ |
+ {:else if col.key === "payment"}
+
+ openPaymentModal(row)}
+ >
+ Payment
+
+
+ printPO(row)}
+ disabled={printingId === row.id ||
+ row.acknowledged !== true}
+ >
+ {#if printingId === row.id}
+ 🔄 Printing...
+ {:else if row.acknowledged !== true}
+ ❌ Not Acknowledged
+ {:else}
+ 🖨️ Print
+ {/if}
+
+ |
+ {:else if col.key === "actions"}
+
+ openEditModal(row)}
+ >
+ ✏️ Edit
+
+
+ deleteProject(row.id)}
+ >
+ 🗑️ Delete
+
+ |
+ {:else}
+
+ {row[col.key] ?? "—"}
+ |
+ {/if}
+ {/each}
+
{/each}
-
+
@@ -1345,36 +1473,63 @@
Showing {(currentPage - 1) * rowsPerPage + 1}–
- {Math.min(currentPage * rowsPerPage, allRows.length)} of {allRows.length}
+ {Math.min(currentPage * rowsPerPage, totalItems)} of {totalItems} items
-
-
goToPage(currentPage - 1)}
- disabled={currentPage === 1}
- >
- Previous
-
- {#each Array(totalPages)
- .fill(0)
- .map((_, i) => i + 1) as page}
-
goToPage(page)}
+
+
+
+
+
+ goToPage(currentPage - 1)}
+ disabled={currentPage === 1}
+ >
+ Previous
- {/each}
- goToPage(currentPage + 1)}
- disabled={currentPage === totalPages}
- >
- Next
-
+ {#each pageRange(totalPages, currentPage) as page}
+ {#if page === "..."}
+ ...
+ {:else}
+ changePage(page as number)}
+ class="px-2 py-1 border rounded {page ===
+ currentPage
+ ? 'bg-blue-600 text-white border-blue-600'
+ : 'bg-white border-gray-300 hover:bg-gray-100'}"
+ >
+ {page}
+
+ {/if}
+ {/each}
+ goToPage(currentPage + 1)}
+ disabled={currentPage === totalPages}
+ >
+ Next
+
+
@@ -1618,482 +1773,695 @@
{/if}
{#if showPreparedModal}
-
-
-
-
Set Prepared
+
+
+
+
Set Prepared
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
updateTotalAmount()} class="w-full border p-2" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
updateTotalAmount()}
+ class="w-full border p-2"
+ />
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
- Save
- showPreparedModal = false} class="px-4 py-2 rounded border">Cancel
-
+
+ Save
+ (showPreparedModal = false)}
+ class="px-4 py-2 rounded border">Cancel
+
+
+
-
-
{/if}
{#if showPaymentModal}
-
-
-
-
Set Payment
+
+
+
+
Set Payment
-
-
-
+
+
+
-
-
-
+
+
+
-
- {#each [1,2,3,4,5,6] as num}
-
-
+
+ {#each [1, 2, 3, 4, 5, 6] as num}
+
+
-
-
- {/each}
+
+
+ {/each}
-
-
-
+
+
+
-
-
-
Save
-
showPaymentModal = false} class="px-4 py-2 rounded border">Cancel
+
+
+ Save
+ (showPaymentModal = false)}
+ class="px-4 py-2 rounded border">Cancel
+
+
-
-
{/if}
{#if showApprovalModal}
-
-
-
-
Approve Purchase Order
+
+
+
+
Approve Purchase Order
-
-
-
+
+
+
-
- {#if approvalForm.po_item}
-
-
- {/if}
+
+ {#if approvalForm.po_item}
+
+
+ {/if}
-
- {#if approvalForm.approved_quantity != null}
-
-
- {/if}
+
+ {#if approvalForm.approved_quantity != null}
+
+
+ {/if}
-
- {#if approvalForm.approved_price != null}
-
-
- {/if}
+
+ {#if approvalForm.approved_price != null}
+
+
+ {/if}
-
- {#if approvalForm.total_approved_order_amount != null}
-
-
- {/if}
+
+ {#if approvalForm.total_approved_order_amount != null}
+
+
+ {/if}
-
- {#if approvalForm.approved_vendor}
-
-
- {/if}
+
+ {#if approvalForm.approved_vendor}
+
+
+ {/if}
-
-
-
+
+
+
-
- {#if approvalForm.approval === 'reject'}
-
-
- {/if}
+
+ {#if approvalForm.approval === "reject"}
+
+
+ {/if}
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
Save
-
showApprovalModal = false} class="px-4 py-2 rounded border">Cancel
+
+
+ Save
+ (showApprovalModal = false)}
+ class="px-4 py-2 rounded border">Cancel
+
+
-
-
{/if}
-
{#if showAcknowledgedModal}
-
-
-
-
Acknowledge Purchase Order
+
+
+
+
Acknowledge Purchase Order
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
Save
-
showAcknowledgedModal = false} class="px-4 py-2 rounded border">Cancel
+
+
+ Save
+ (showAcknowledgedModal = false)}
+ class="px-4 py-2 rounded border">Cancel
+
+
-
-
{/if}
{#if showCompletedModal}
-
-
-
-
Complete Purchase Order
+
+
+
+
Complete Purchase Order
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
Save
-
showCompletedModal = false} class="px-4 py-2 rounded border">Cancel
+
+
+ Save
+ (showCompletedModal = false)}
+ class="px-4 py-2 rounded border">Cancel
+
+
-
-
{/if}
{#if showReceivedModal}
-
-
-
-
Receive Purchase Order
+
+
+
+
Receive Purchase Order
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
Save
-
showReceivedModal = false} class="px-4 py-2 rounded border">Cancel
+
+
+ Save
+ (showReceivedModal = false)}
+ class="px-4 py-2 rounded border">Cancel
+
+
-
-
{/if}
{#if showEditModal}
-
-
-
-
Edit Purchase Order
+
+
+
+
Edit Purchase Order
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
- {#each ['prepared','approved','acknowledged','completed','received'] as key}
-
-
-
-
editForm[key] = null}
- >Reset
+
+
+ {#each ["prepared", "approved", "acknowledged", "completed", "received"] as key}
+
+
+
+ (editForm[key] = null)}
+ >Reset
+
+ {/each}
+
+
+
+
+
+
+
+
+ Save
+ (showEditModal = false)}
+ class="px-4 py-2 rounded border">Cancel
+
- {/each}
-
-
-
-
-
-
-
- Save
- showEditModal = false} class="px-4 py-2 rounded border">Cancel
-
-
-
{/if}
{#if showAddPOModal}
-
-
-
-
Add Purchase Order
+
+
+
+
Add Purchase Order
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
Save
-
showAddPOModal = false} class="px-4 py-2 rounded border">Cancel
+
+
+ Save
+ (showAddPOModal = false)}
+ class="px-4 py-2 rounded border">Cancel
+
+
-
-
-{/if}
\ No newline at end of file
+{/if}
diff --git a/src/routes/backoffice/timesheets/+page.svelte b/src/routes/backoffice/timesheets/+page.svelte
index a6d01b0..55c8604 100644
--- a/src/routes/backoffice/timesheets/+page.svelte
+++ b/src/routes/backoffice/timesheets/+page.svelte
@@ -2,8 +2,8 @@
import { supabase } from "$lib/supabaseClient";
import { onMount } from "svelte";
import { v4 as uuidv4 } from "uuid";
- import * as XLSX from 'xlsx';
-
+ import * as XLSX from "xlsx";
+
type Timesheets = {
id: number;
entered_by: string;
@@ -32,7 +32,7 @@
type TimesheetsJoined = Timesheets & {
vb_employee: { id: string; employee_name: string } | null;
villa_name?: string;
- };
+ };
type TimesheetDisplay = {
id: number;
name: string;
@@ -241,9 +241,8 @@
}
// Function to go to a specific page
function goToPage(page: number) {
-
console.log("Going to page:", page);
-
+
if (page >= 1 && page <= totalPages) currentPage = page;
// Re-fetch timesheets with the current filters and pagination
@@ -272,8 +271,8 @@
type_of_work: tsdata.type_of_work,
category_of_work: tsdata.category_of_work,
villa_id:
- villas.find((v) => v.villa_name === tsdata.villa_name)?.id ||
- "",
+ villas.find((v) => v.villa_name === tsdata.villa_name)
+ ?.id || "",
datetime_in: tsdata.date_in?.toISOString().slice(0, 16),
datetime_out: tsdata.date_out?.toISOString().slice(0, 16),
total_work_hour: 0,
@@ -311,35 +310,21 @@
offset: number = 0,
limit: number = 20,
) {
-
- console.log("Fetching timesheets with filters:", {
- villaIdFilter,
- searchTerm,
- sortColumn,
- sortOrder,
- offset,
- limit,
- });
-
-
const fromIndex = offset;
const toIndex = offset + limit - 1;
let query = supabase
.from("vb_timesheet_data")
- .select(
- '*',
- { count: "exact" },
- )
+ .select("*", { count: "exact" })
.order(getDBColumn(sortColumn) || "created_at", {
- ascending: sortOrder === "asc"
+ ascending: sortOrder === "asc",
})
- .range(fromIndex, toIndex);
-
+ .range(fromIndex, toIndex);
+
if (typeof searchTerm === "string" && searchTerm.length > 4) {
// Supabase ilike only supports one column at a time, so use or for multiple columns
query = query.or(
- `work_description.ilike.%${searchTerm}%,entered_name.ilike.%${searchTerm}%`
+ `work_description.ilike.%${searchTerm}%,entered_name.ilike.%${searchTerm}%`,
);
}
@@ -353,8 +338,6 @@
console.log("Fetched timesheets:", count);
console.log("Fetched timesheets data:", data);
-
-
if (error) {
console.error("Error fetching timesheets:", error);
@@ -375,18 +358,19 @@
tsdata.approval == null
? "PENDING"
: tsdata.approval
- ? "APPROVED"
- : "REJECTED",
+ ? "APPROVED"
+ : "REJECTED",
total_hours_work:
Math.abs(
new Date(tsdata.datetime_out).getTime() -
new Date(tsdata.datetime_in).getTime(),
- ) / (1000 * 60 * 60),
- approved_by: tsdata.approved_name?.trim()
+ ) /
+ (1000 * 60 * 60),
+ approved_by: tsdata.approved_name?.trim()
? tsdata.approved_name
: tsdata.approval === true
- ? "Auto Approve"
- : "Not Approved",
+ ? "Auto Approve"
+ : "Not Approved",
approved_date: tsdata.approved_date
? new Date(tsdata.approved_date)
: undefined,
@@ -403,7 +387,10 @@
$: totalPages = Math.ceil(totalItems / rowsPerPage);
$: currentPage = 1;
- function pageRange(totalPages: number, currentPage: number,): (number | string)[] {
+ function pageRange(
+ totalPages: number,
+ currentPage: number,
+ ): (number | string)[] {
const range: (number | string)[] = [];
const maxDisplay = 5;
@@ -426,12 +413,16 @@
return range;
}
+
function getDBColumn(key: string) {
switch (key) {
- case "name": return "work_description";
- case "staff_id": return "entered_by";
- default: return key;
- }
+ case "name":
+ return "work_description";
+ case "staff_id":
+ return "entered_by";
+ default:
+ return key;
+ }
}
function changePage(page: number) {
if (page < 1 || page > totalPages || page === currentPage) return;
@@ -448,43 +439,46 @@
async function exportTimesheets() {
if (!selectedMonth || !selectedYear) {
- alert("Please select a month and year to export.");
- return;
- }
+ alert("Please select a month and year to export.");
+ return;
+ }
- try {
- const response = await fetch("https://flow.catalis.app/webhook-test/villabugis-timesheets", {
+ try {
+ const response = await fetch(
+ "https://flow.catalis.app/webhook-test/villabugis-timesheets",
+ {
method: "PATCH",
headers: {
- "Content-Type": "application/json"
+ "Content-Type": "application/json",
},
body: JSON.stringify({
month: selectedMonth,
- year: selectedYear
- })
- });
+ year: selectedYear,
+ }),
+ },
+ );
- if (!response.ok) {
- throw new Error(`Export failed: ${response.statusText}`);
- }
-
- const randomUuid = uuidv4().toString();
-
- // Jika response adalah file (application/octet-stream atau Excel)
- const blob = await response.blob();
- const url = window.URL.createObjectURL(blob);
- const link = document.createElement("a");
- link.href = url;
- link.download = `timesheet-${selectedYear}-${String(selectedMonth).padStart(2, '0')}-${randomUuid}.xlsx`;
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- window.URL.revokeObjectURL(url);
- } catch (error) {
- console.error("Export error:", error);
- alert("Failed to export timesheet.");
+ if (!response.ok) {
+ throw new Error(`Export failed: ${response.statusText}`);
}
+
+ const randomUuid = uuidv4().toString();
+
+ // Jika response adalah file (application/octet-stream atau Excel)
+ const blob = await response.blob();
+ const url = window.URL.createObjectURL(blob);
+ const link = document.createElement("a");
+ link.href = url;
+ link.download = `timesheet-${selectedYear}-${String(selectedMonth).padStart(2, "0")}-${randomUuid}.xlsx`;
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ window.URL.revokeObjectURL(url);
+ } catch (error) {
+ console.error("Export error:", error);
+ alert("Failed to export timesheet.");
}
+ }
async function exportToExcelFromFrontend() {
if (!selectedMonth || !selectedYear) {
alert("Please select both month and year");
@@ -497,7 +491,8 @@
// 1. Fetch timesheet data
const { data: timesheetData, error: timesheetErr } = await supabase
.from("vb_timesheet_data")
- .select(`
+ .select(
+ `
id,
work_description,
total_work_hour,
@@ -511,7 +506,8 @@
villa_name,
entered_name,
approved_name
- `)
+ `,
+ )
.gte("datetime_in", startDate.toISOString())
.lte("datetime_in", endDate.toISOString());
@@ -540,7 +536,7 @@
"Supervision",
"Guest Service",
"Administration",
- "Non Billable"
+ "Non Billable",
];
const sheet2Name = "Data";
@@ -586,20 +582,26 @@
return row;
};
- [headerRowIdx, officeRowIdx, fbRowIdx, villasOnlyRowIdx].forEach((idx) => {
- sheet1Rows[idx] = sheet1Rows[idx] || [];
- ensureCols(sheet1Rows[idx], 13); // at least to column M
- });
+ [headerRowIdx, officeRowIdx, fbRowIdx, villasOnlyRowIdx].forEach(
+ (idx) => {
+ sheet1Rows[idx] = sheet1Rows[idx] || [];
+ ensureCols(sheet1Rows[idx], 13); // at least to column M
+ },
+ );
// Insert labels and formulas
sheet1Rows[headerRowIdx][10] = "Total Work Hours"; // K2
sheet1Rows[headerRowIdx][11] = { f: `SUM(${sheet2Name}!$C:$C)` }; // L2
sheet1Rows[officeRowIdx][10] = "Office"; // K3
- sheet1Rows[officeRowIdx][11] = { f: `SUMIFS(${sheet2Name}!$C:$C, ${sheet2Name}!$K:$K, K3)` }; // L3
+ sheet1Rows[officeRowIdx][11] = {
+ f: `SUMIFS(${sheet2Name}!$C:$C, ${sheet2Name}!$K:$K, K3)`,
+ }; // L3
sheet1Rows[fbRowIdx][10] = "FB"; // K4
- sheet1Rows[fbRowIdx][11] = { f: `SUMIFS(${sheet2Name}!$C:$C, ${sheet2Name}!$K:$K, K4)` }; // L4
+ sheet1Rows[fbRowIdx][11] = {
+ f: `SUMIFS(${sheet2Name}!$C:$C, ${sheet2Name}!$K:$K, K4)`,
+ }; // L4
sheet1Rows[villasOnlyRowIdx][10] = "Villas Only"; // K5
sheet1Rows[villasOnlyRowIdx][11] = { f: `L2-L3` }; // L5
@@ -687,8 +689,6 @@
let error = null;
if (isEditing && currentEditingId) {
-
-
const { error: updateError } = await supabase
.from("vb_timesheet")
.update({
@@ -755,8 +755,6 @@
showModal = false;
}
}
-
-
@@ -778,7 +776,9 @@
placeholder="🔍 Search by work description or name..."
class="border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:outline-none px-4 py-2 rounded-xl text-sm w-64 transition"
on:input={(e) => {
- currentSearchTerm = (e.target as HTMLInputElement).value.toLowerCase();
+ currentSearchTerm = (
+ e.target as HTMLInputElement
+ ).value.toLowerCase();
fetchTimeSheets(currentVillaFilter, currentSearchTerm);
}}
/>
@@ -786,7 +786,8 @@
id="villa-select"
class="border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:outline-none px-4 py-2 rounded-xl text-sm w-48 transition"
on:change={(e) => {
- currentVillaFilter = (e.target as HTMLSelectElement).value || null;
+ currentVillaFilter =
+ (e.target as HTMLSelectElement).value || null;
fetchTimeSheets(currentVillaFilter, currentSearchTerm);
}}
>
@@ -797,17 +798,21 @@
{
+ on:click={() => {
currentVillaFilter = null;
currentSearchTerm = null;
-
+
// Optional: reset UI elements if you use bind:value
- const searchInput = document.querySelector('#search-input') as HTMLInputElement;
+ const searchInput = document.querySelector(
+ "#search-input",
+ ) as HTMLInputElement;
if (searchInput) searchInput.value = "";
-
- const villaSelect = document.querySelector('#villa-select') as HTMLSelectElement;
+
+ const villaSelect = document.querySelector(
+ "#villa-select",
+ ) as HTMLSelectElement;
if (villaSelect) villaSelect.value = "";
-
+
fetchTimeSheets(null, null);
}}
>
@@ -831,22 +836,21 @@
class="sticky left-0 px-4 py-3 text-left font-semibold text-gray-700 uppercase tracking-wider whitespace-nowrap"
style="background-color: #f0f8ff; z-index: 10;"
on:click={() => toggleSort(col.key)}
-
>
{col.title}
{#if sortColumn === col.key}
- {sortOrder === 'asc' ? ' 🔼' : ' 🔽'}
+ {sortOrder === "asc" ? " 🔼" : " 🔽"}
{/if}
{:else}
| toggleSort(col.key)}
+ class="cursor-pointer px-4 py-3 text-left font-semibold text-gray-700 uppercase tracking-wider whitespace-nowrap"
+ on:click={() => toggleSort(col.key)}
>
-
{col.title}
- {#if sortColumn === col.key}
- {sortOrder === 'asc' ? ' 🔼' : ' 🔽'}
- {/if}
+ {#if sortColumn === col.key}
+ {sortOrder === "asc" ? " 🔼" : " 🔽"}
+ {/if}
|
{/if}
{/each}
@@ -902,8 +906,20 @@
{:else if col.key === "approved_date"}
{row[col.key] &&
- !isNaN(new Date(row[col.key] as string | number | Date).getTime())
- ? new Date(row[col.key] as string | number | Date).toLocaleString()
+ !isNaN(
+ new Date(
+ row[col.key] as
+ | string
+ | number
+ | Date,
+ ).getTime(),
+ )
+ ? new Date(
+ row[col.key] as
+ | string
+ | number
+ | Date,
+ ).toLocaleString()
: "N/A"}
|
{:else if col.key === "total_hours_work"}
@@ -913,12 +929,19 @@
{:else if col.key === "created_at"}
{row[col.key] !== undefined
- ? new Date(row[col.key] as string | number | Date).toLocaleString()
+ ? new Date(
+ row[col.key] as
+ | string
+ | number
+ | Date,
+ ).toLocaleString()
: "N/A"}
|
{:else if col.key === "villa_name"}
-
+ |
{row[col.key] || "Unknown Villa"}
|
{:else if col.key === "staff_id"}
@@ -948,7 +971,9 @@
{:else if col.key === "date_in" || col.key === "date_out"}
{row[col.key]
- ? new Date(row[col.key]).toLocaleString()
+ ? new Date(
+ row[col.key],
+ ).toLocaleString()
: "N/A"}
|
{:else}
@@ -975,35 +1000,35 @@
- ⬇️ Export
+ ⬇️ Export
@@ -1041,7 +1066,8 @@
{:else}
changePage(page as number)}
- class="px-2 py-1 border rounded {page === currentPage
+ class="px-2 py-1 border rounded {page ===
+ currentPage
? 'bg-blue-600 text-white border-blue-600'
: 'bg-white border-gray-300 hover:bg-gray-100'}"
>
@@ -1058,7 +1084,7 @@
-
+
diff --git a/src/routes/login/+page.svelte b/src/routes/login/+page.svelte
index c1cf4d7..364e6e5 100644
--- a/src/routes/login/+page.svelte
+++ b/src/routes/login/+page.svelte
@@ -227,14 +227,14 @@
-
+
diff --git a/yarn.lock b/yarn.lock
index c798851..dcb66b6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -10,6 +10,148 @@
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.24"
+"@emnapi/core@^1.4.3":
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.5.tgz#bfbb0cbbbb9f96ec4e2c4fd917b7bbe5495ceccb"
+ integrity sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==
+ dependencies:
+ "@emnapi/wasi-threads" "1.0.4"
+ tslib "^2.4.0"
+
+"@emnapi/runtime@^1.4.3":
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.5.tgz#c67710d0661070f38418b6474584f159de38aba9"
+ integrity sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==
+ dependencies:
+ tslib "^2.4.0"
+
+"@emnapi/wasi-threads@1.0.4", "@emnapi/wasi-threads@^1.0.2":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz#703fc094d969e273b1b71c292523b2f792862bf4"
+ integrity sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==
+ dependencies:
+ tslib "^2.4.0"
+
+"@esbuild/aix-ppc64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz#830d6476cbbca0c005136af07303646b419f1162"
+ integrity sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==
+
+"@esbuild/android-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz#d11d4fc299224e729e2190cacadbcc00e7a9fd67"
+ integrity sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==
+
+"@esbuild/android-arm@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.4.tgz#5660bd25080553dd2a28438f2a401a29959bd9b1"
+ integrity sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==
+
+"@esbuild/android-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.4.tgz#18ddde705bf984e8cd9efec54e199ac18bc7bee1"
+ integrity sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==
+
+"@esbuild/darwin-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz#b0b7fb55db8fc6f5de5a0207ae986eb9c4766e67"
+ integrity sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==
+
+"@esbuild/darwin-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz#e6813fdeba0bba356cb350a4b80543fbe66bf26f"
+ integrity sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==
+
+"@esbuild/freebsd-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz#dc11a73d3ccdc308567b908b43c6698e850759be"
+ integrity sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==
+
+"@esbuild/freebsd-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz#91da08db8bd1bff5f31924c57a81dab26e93a143"
+ integrity sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==
+
+"@esbuild/linux-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz#efc15e45c945a082708f9a9f73bfa8d4db49728a"
+ integrity sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==
+
+"@esbuild/linux-arm@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz#9b93c3e54ac49a2ede6f906e705d5d906f6db9e8"
+ integrity sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==
+
+"@esbuild/linux-ia32@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz#be8ef2c3e1d99fca2d25c416b297d00360623596"
+ integrity sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==
+
+"@esbuild/linux-loong64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz#b0840a2707c3fc02eec288d3f9defa3827cd7a87"
+ integrity sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==
+
+"@esbuild/linux-mips64el@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz#2a198e5a458c9f0e75881a4e63d26ba0cf9df39f"
+ integrity sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==
+
+"@esbuild/linux-ppc64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz#64f4ae0b923d7dd72fb860b9b22edb42007cf8f5"
+ integrity sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==
+
+"@esbuild/linux-riscv64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz#fb2844b11fdddd39e29d291c7cf80f99b0d5158d"
+ integrity sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==
+
+"@esbuild/linux-s390x@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz#1466876e0aa3560c7673e63fdebc8278707bc750"
+ integrity sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==
+
+"@esbuild/linux-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz#c10fde899455db7cba5f11b3bccfa0e41bf4d0cd"
+ integrity sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==
+
+"@esbuild/netbsd-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz#02e483fbcbe3f18f0b02612a941b77be76c111a4"
+ integrity sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==
+
+"@esbuild/netbsd-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz#ec401fb0b1ed0ac01d978564c5fc8634ed1dc2ed"
+ integrity sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==
+
+"@esbuild/openbsd-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz#f272c2f41cfea1d91b93d487a51b5c5ca7a8c8c4"
+ integrity sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==
+
+"@esbuild/openbsd-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz#2e25950bc10fa9db1e5c868e3d50c44f7c150fd7"
+ integrity sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==
+
+"@esbuild/sunos-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz#cd596fa65a67b3b7adc5ecd52d9f5733832e1abd"
+ integrity sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==
+
+"@esbuild/win32-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz#b4dbcb57b21eeaf8331e424c3999b89d8951dc88"
+ integrity sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==
+
+"@esbuild/win32-ia32@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz#410842e5d66d4ece1757634e297a87635eb82f7a"
+ integrity sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==
+
"@esbuild/win32-x64@0.25.4":
version "0.25.4"
resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz"
@@ -74,6 +216,15 @@
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
+"@napi-rs/wasm-runtime@^0.2.9":
+ version "0.2.12"
+ resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2"
+ integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==
+ dependencies:
+ "@emnapi/core" "^1.4.3"
+ "@emnapi/runtime" "^1.4.3"
+ "@tybys/wasm-util" "^0.10.0"
+
"@polka/url@^1.0.0-next.24":
version "1.0.0-next.29"
resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz"
@@ -119,6 +270,106 @@
estree-walker "^2.0.2"
picomatch "^4.0.2"
+"@rollup/rollup-android-arm-eabi@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz#f39f09f60d4a562de727c960d7b202a2cf797424"
+ integrity sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==
+
+"@rollup/rollup-android-arm64@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz#d19af7e23760717f1d879d4ca3d2cd247742dff2"
+ integrity sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==
+
+"@rollup/rollup-darwin-arm64@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz#1c3a2fbf205d80641728e05f4a56c909e95218b7"
+ integrity sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==
+
+"@rollup/rollup-darwin-x64@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz#aa66d2ba1a25e609500e13bef06dc0e71cc0c0d4"
+ integrity sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==
+
+"@rollup/rollup-freebsd-arm64@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz#df10a7b6316a0ef1028c6ca71a081124c537e30d"
+ integrity sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==
+
+"@rollup/rollup-freebsd-x64@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz#a3fdce8a05e95b068cbcb46e4df5185e407d0c35"
+ integrity sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz#49f766c55383bd0498014a9d76924348c2f3890c"
+ integrity sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==
+
+"@rollup/rollup-linux-arm-musleabihf@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz#1d4d7d32fc557e17d52e1857817381ea365e2959"
+ integrity sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==
+
+"@rollup/rollup-linux-arm64-gnu@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz#f4fc317268441e9589edad3be8f62b6c03009bc1"
+ integrity sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==
+
+"@rollup/rollup-linux-arm64-musl@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz#63a1f1b0671cb17822dabae827fef0e443aebeb7"
+ integrity sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==
+
+"@rollup/rollup-linux-loongarch64-gnu@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz#c659b01cc6c0730b547571fc3973e1e955369f98"
+ integrity sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==
+
+"@rollup/rollup-linux-powerpc64le-gnu@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz#612e746f9ad7e58480f964d65e0d6c3f4aae69a8"
+ integrity sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==
+
+"@rollup/rollup-linux-riscv64-gnu@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz#4610dbd1dcfbbae32fbc10c20ae7387acb31110c"
+ integrity sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==
+
+"@rollup/rollup-linux-riscv64-musl@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz#054911fab40dc83fafc21e470193c058108f19d8"
+ integrity sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==
+
+"@rollup/rollup-linux-s390x-gnu@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz#98896eca8012547c7f04bd07eaa6896825f9e1a5"
+ integrity sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==
+
+"@rollup/rollup-linux-x64-gnu@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz#01cf56844a1e636ee80dfb364e72c2b7142ad896"
+ integrity sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==
+
+"@rollup/rollup-linux-x64-gnu@4.9.5":
+ version "4.9.5"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz#85946ee4d068bd12197aeeec2c6f679c94978a49"
+ integrity sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==
+
+"@rollup/rollup-linux-x64-musl@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz#e67c7531df6dff0b4c241101d4096617fbca87c3"
+ integrity sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==
+
+"@rollup/rollup-win32-arm64-msvc@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz#7eeada98444e580674de6989284e4baacd48ea65"
+ integrity sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==
+
+"@rollup/rollup-win32-ia32-msvc@4.41.1":
+ version "4.41.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz#516c4b54f80587b4a390aaf4940b40870271d35d"
+ integrity sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==
+
"@rollup/rollup-win32-x64-msvc@4.41.1":
version "4.41.1"
resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz"
@@ -138,7 +389,7 @@
dependencies:
"@supabase/node-fetch" "^2.6.14"
-"@supabase/node-fetch@^2.6.14", "@supabase/node-fetch@2.6.15":
+"@supabase/node-fetch@2.6.15", "@supabase/node-fetch@^2.6.14":
version "2.6.15"
resolved "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz"
integrity sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==
@@ -176,7 +427,7 @@
dependencies:
"@supabase/node-fetch" "^2.6.14"
-"@supabase/supabase-js@^2.43.4", "@supabase/supabase-js@^2.49.8":
+"@supabase/supabase-js@^2.49.8":
version "2.49.8"
resolved "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.49.8.tgz"
integrity sha512-zzBQLgS/jZs7btWcIAc7V5yfB+juG7h0AXxKowMJuySsO5vK+F7Vp+HCa07Z+tu9lZtr3sT9fofkc86bdylmtw==
@@ -208,7 +459,7 @@
"@rollup/plugin-node-resolve" "^16.0.0"
rollup "^4.9.5"
-"@sveltejs/kit@^2.0.0", "@sveltejs/kit@^2.16.0", "@sveltejs/kit@^2.4.0":
+"@sveltejs/kit@^2.16.0":
version "2.21.1"
resolved "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.21.1.tgz"
integrity sha512-vLbtVwtDcK8LhJKnFkFYwM0uCdFmzioQnif0bjEYH1I24Arz22JPr/hLUiXGVYAwhu8INKx5qrdvr4tHgPwX6w==
@@ -233,7 +484,7 @@
dependencies:
debug "^4.3.7"
-"@sveltejs/vite-plugin-svelte@^3.0.0 || ^4.0.0-next.1 || ^5.0.0", "@sveltejs/vite-plugin-svelte@^5.0.0":
+"@sveltejs/vite-plugin-svelte@^5.0.0":
version "5.0.3"
resolved "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.0.3.tgz"
integrity sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==
@@ -258,6 +509,68 @@
source-map-js "^1.2.1"
tailwindcss "4.1.7"
+"@tailwindcss/oxide-android-arm64@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.7.tgz#3b115097b64aff6487715304ebe0bb43d7a2d42a"
+ integrity sha512-IWA410JZ8fF7kACus6BrUwY2Z1t1hm0+ZWNEzykKmMNM09wQooOcN/VXr0p/WJdtHZ90PvJf2AIBS/Ceqx1emg==
+
+"@tailwindcss/oxide-darwin-arm64@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.7.tgz#6c9d8cd3cd631a2ac0dff58a766c958cff5b0046"
+ integrity sha512-81jUw9To7fimGGkuJ2W5h3/oGonTOZKZ8C2ghm/TTxbwvfSiFSDPd6/A/KE2N7Jp4mv3Ps9OFqg2fEKgZFfsvg==
+
+"@tailwindcss/oxide-darwin-x64@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.7.tgz#a022b5ef006570ac8bb92128ec7fc9cc2314bdd1"
+ integrity sha512-q77rWjEyGHV4PdDBtrzO0tgBBPlQWKY7wZK0cUok/HaGgbNKecegNxCGikuPJn5wFAlIywC3v+WMBt0PEBtwGw==
+
+"@tailwindcss/oxide-freebsd-x64@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.7.tgz#efc133e6065c3c6299a981caa9c5f426e1d60e5e"
+ integrity sha512-RfmdbbK6G6ptgF4qqbzoxmH+PKfP4KSVs7SRlTwcbRgBwezJkAO3Qta/7gDy10Q2DcUVkKxFLXUQO6J3CRvBGw==
+
+"@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.7.tgz#7a4dc1d9636c1b1e62936bd679a8867030dc0ad6"
+ integrity sha512-OZqsGvpwOa13lVd1z6JVwQXadEobmesxQ4AxhrwRiPuE04quvZHWn/LnihMg7/XkN+dTioXp/VMu/p6A5eZP3g==
+
+"@tailwindcss/oxide-linux-arm64-gnu@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.7.tgz#9a0da009c37d135fe983d1093bfb6d370fe926dc"
+ integrity sha512-voMvBTnJSfKecJxGkoeAyW/2XRToLZ227LxswLAwKY7YslG/Xkw9/tJNH+3IVh5bdYzYE7DfiaPbRkSHFxY1xA==
+
+"@tailwindcss/oxide-linux-arm64-musl@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.7.tgz#ef2398b48c426148c1b9949fdbdd86d364dca10d"
+ integrity sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A==
+
+"@tailwindcss/oxide-linux-x64-gnu@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.7.tgz#4d36aec4c4df87f8c332526bb6874b2c36230901"
+ integrity sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg==
+
+"@tailwindcss/oxide-linux-x64-musl@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.7.tgz#6e3045edc70d5156089aba0cd4a9760caa53965c"
+ integrity sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA==
+
+"@tailwindcss/oxide-wasm32-wasi@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.7.tgz#79b41b0c8da6e2f1dc5b722fe43528aa324222d5"
+ integrity sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A==
+ dependencies:
+ "@emnapi/core" "^1.4.3"
+ "@emnapi/runtime" "^1.4.3"
+ "@emnapi/wasi-threads" "^1.0.2"
+ "@napi-rs/wasm-runtime" "^0.2.9"
+ "@tybys/wasm-util" "^0.9.0"
+ tslib "^2.8.0"
+
+"@tailwindcss/oxide-win32-arm64-msvc@4.1.7":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.7.tgz#6c695b870eb8a3f9a958d0afccc67b1b6ee7e78d"
+ integrity sha512-HUiSiXQ9gLJBAPCMVRk2RT1ZrBjto7WvqsPBwUrNK2BcdSxMnk19h4pjZjI7zgPhDxlAbJSumTC4ljeA9y0tEw==
+
"@tailwindcss/oxide-win32-x64-msvc@4.1.7":
version "4.1.7"
resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.7.tgz"
@@ -293,17 +606,31 @@
"@tailwindcss/oxide" "4.1.7"
tailwindcss "4.1.7"
+"@tybys/wasm-util@^0.10.0":
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.0.tgz#2fd3cd754b94b378734ce17058d0507c45c88369"
+ integrity sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==
+ dependencies:
+ tslib "^2.4.0"
+
+"@tybys/wasm-util@^0.9.0":
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355"
+ integrity sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==
+ dependencies:
+ tslib "^2.4.0"
+
"@types/cookie@^0.6.0":
version "0.6.0"
resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz"
integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==
-"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6", "@types/estree@1.0.7":
+"@types/estree@*", "@types/estree@1.0.7", "@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6":
version "1.0.7"
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz"
integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==
-"@types/node@*", "@types/node@^18.0.0 || ^20.0.0 || >=22.0.0":
+"@types/node@*":
version "22.15.21"
resolved "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz"
integrity sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==
@@ -327,7 +654,7 @@
dependencies:
"@types/node" "*"
-acorn@^8.12.1, acorn@^8.14.1, acorn@^8.9.0:
+acorn@^8.12.1, acorn@^8.14.1:
version "8.14.1"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz"
integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==
@@ -485,6 +812,11 @@ frac@~1.1.2:
resolved "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz"
integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
@@ -514,13 +846,6 @@ is-module@^1.0.0:
resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz"
integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==
-is-reference@^3.0.3:
- version "3.0.3"
- resolved "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz"
- integrity sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==
- dependencies:
- "@types/estree" "^1.0.6"
-
is-reference@1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz"
@@ -528,7 +853,14 @@ is-reference@1.2.1:
dependencies:
"@types/estree" "*"
-jiti@^2.4.2, jiti@>=1.21.0:
+is-reference@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz"
+ integrity sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==
+ dependencies:
+ "@types/estree" "^1.0.6"
+
+jiti@^2.4.2:
version "2.4.2"
resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz"
integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==
@@ -538,12 +870,57 @@ kleur@^4.1.5:
resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz"
integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==
+lightningcss-darwin-arm64@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz#3d47ce5e221b9567c703950edf2529ca4a3700ae"
+ integrity sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==
+
+lightningcss-darwin-x64@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz#e81105d3fd6330860c15fe860f64d39cff5fbd22"
+ integrity sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==
+
+lightningcss-freebsd-x64@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz#a0e732031083ff9d625c5db021d09eb085af8be4"
+ integrity sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==
+
+lightningcss-linux-arm-gnueabihf@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz#1f5ecca6095528ddb649f9304ba2560c72474908"
+ integrity sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==
+
+lightningcss-linux-arm64-gnu@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz#eee7799726103bffff1e88993df726f6911ec009"
+ integrity sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==
+
+lightningcss-linux-arm64-musl@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz#f2e4b53f42892feeef8f620cbb889f7c064a7dfe"
+ integrity sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==
+
+lightningcss-linux-x64-gnu@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz#2fc7096224bc000ebb97eea94aea248c5b0eb157"
+ integrity sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==
+
+lightningcss-linux-x64-musl@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz#66dca2b159fd819ea832c44895d07e5b31d75f26"
+ integrity sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==
+
+lightningcss-win32-arm64-msvc@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz#7d8110a19d7c2d22bfdf2f2bb8be68e7d1b69039"
+ integrity sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==
+
lightningcss-win32-x64-msvc@1.30.1:
version "1.30.1"
resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz"
integrity sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==
-lightningcss@^1.21.0, lightningcss@1.30.1:
+lightningcss@1.30.1:
version "1.30.1"
resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz"
integrity sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==
@@ -620,7 +997,7 @@ picocolors@^1.0.0, picocolors@^1.1.1:
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
-"picomatch@^3 || ^4", picomatch@^4.0.2:
+picomatch@^4.0.2:
version "4.0.2"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz"
integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
@@ -648,7 +1025,7 @@ resolve@^1.22.1:
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
-rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.68.0||^3.0.0||^4.0.0, rollup@^2.78.0||^3.0.0||^4.0.0, rollup@^4.34.9, rollup@^4.9.5:
+rollup@^4.34.9, rollup@^4.9.5:
version "4.41.1"
resolved "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz"
integrity sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==
@@ -746,7 +1123,7 @@ svelte-table@^0.6.4:
resolved "https://registry.npmjs.org/svelte-table/-/svelte-table-0.6.4.tgz"
integrity sha512-6Rla/xdGIH84R24OFsEm6Fu6/Nugh7k/nYGTO7CvJiEiQwOHywnZgLIc1dRQyPdDA81JEgWarcYiFy6s7KgUxQ==
-"svelte@^4.0.0 || ^5.0.0-next.0", svelte@^5.0.0:
+svelte@^5.0.0:
version "5.33.1"
resolved "https://registry.npmjs.org/svelte/-/svelte-5.33.1.tgz"
integrity sha512-7znzaaQALL62NBzkdKV04tmYIVla8qjrW+k6GdgFZcKcj8XOb8iEjmfRPo40iaWZlKv3+uiuc0h4iaGgwoORtA==
@@ -766,7 +1143,7 @@ svelte-table@^0.6.4:
magic-string "^0.30.11"
zimmerframe "^1.1.2"
-tailwindcss@^4.1.7, tailwindcss@4.1.7:
+tailwindcss@4.1.7, tailwindcss@^4.1.7:
version "4.1.7"
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.7.tgz"
integrity sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg==
@@ -806,7 +1183,12 @@ tr46@~0.0.3:
resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
-typescript@^5.0.0, typescript@>=5.0.0:
+tslib@^2.4.0, tslib@^2.8.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
+typescript@^5.0.0:
version "5.8.3"
resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz"
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
@@ -821,7 +1203,7 @@ uuid@^11.1.0:
resolved "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz"
integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==
-"vite@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "vite@^5.0.3 || ^6.0.0", "vite@^5.2.0 || ^6", vite@^6.0.0, vite@^6.2.6:
+vite@^6.2.6:
version "6.3.5"
resolved "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz"
integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==