📋 Project List

Manage your projects and tasks efficiently.

{ const searchTerm = ( e.target as HTMLInputElement ).value.toLowerCase(); fetchProjects(null, searchTerm, "created_at", "desc"); }} />
{#each columns as col} {#if col.key === "name"} {:else} {/if} {/each} {#each paginatedRows as row} {#each columns as col} {#if col.key === "name"} {:else if col.key === "actions"} {:else if col.key === "add_to_po"} {:else if col.key === "need_approval"} {:else if col.key === "picture_link"} {:else} {/if} {/each} {/each}
{col.title} {col.title}
{row[col.key]} { const isChecked = ( e.target as HTMLInputElement ).checked; row.add_to_po = isChecked; if (isChecked) { // map to project const project: Project = { id: row.id, issue_id: row.issue_id, project_number: row.issue_number, add_to_po: isChecked, input_by: row.input_by, project_due_date: row.project_due_date, picture_link: row.picture_link, }; currentEditingId = row.id; await addToPo(project); } else { // uncheck const { data, error } = await supabase .from("vb_projects") .update({ add_to_po: false, }) .eq("id", row.id); if (error) { console.error( "Error updating project:", error, ); } } }} /> {#if row[col.key as keyof Projects]} ✅ {:else} ❌ {/if} {#if row.picture_link} {#await getPublicUrl(row.picture_link) then publicUrl} View Picture {:catch} Error loading image {/await} {:else} No Picture {/if} {row[col.key as keyof Projects]}
Showing {(currentPage - 1) * rowsPerPage + 1}– {Math.min(currentPage * rowsPerPage, allRows.length)} of {allRows.length}
{#each Array(totalPages) .fill(0) .map((_, i) => i + 1) as page} {/each}
{#if showModal}

{isEditing ? "Edit Project" : "Add Project"}

{#each formColumns as col} {#if col.key === "project_due_date"}
{:else if col.key === "picture_link"}

Upload an image related to the issue.

{#if imagePreviewUrl} Preview {:else if newProjects.picture_link} {#await getPublicUrl(newProjects.picture_link) then url} Preview {/await} {:else}

No image selected or uploaded.

{/if}
{:else}
{/if} {/each}
{/if}