This commit is contained in:
2025-12-25 23:49:47 -07:00
parent 13821cbcd5
commit 0d608cf3f4
26 changed files with 7 additions and 94 deletions

View File

@@ -9,7 +9,6 @@ import { eq, desc, asc, and, sql, or, like } from 'drizzle-orm';
const user = Astro.locals.user;
if (!user) return Astro.redirect('/login');
// Get user's first organization
const userOrg = await db.select()
.from(members)
.where(eq(members.userId, user.id))
@@ -17,25 +16,22 @@ const userOrg = await db.select()
if (!userOrg) return Astro.redirect('/dashboard');
// Get all clients for the organization
const allClients = await db.select()
.from(clients)
.where(eq(clients.organizationId, userOrg.organizationId))
.all();
// Get all categories for the organization
const allCategories = await db.select()
.from(categories)
.where(eq(categories.organizationId, userOrg.organizationId))
.all();
// Get all tags for the organization
const allTags = await db.select()
.from(tags)
.where(eq(tags.organizationId, userOrg.organizationId))
.all();
// Parse query parameters for filtering, sorting, and pagination
// Query params
const url = new URL(Astro.request.url);
const page = parseInt(url.searchParams.get('page') || '1');
const pageSize = 20;
@@ -43,11 +39,10 @@ const offset = (page - 1) * pageSize;
const filterClient = url.searchParams.get('client') || '';
const filterCategory = url.searchParams.get('category') || '';
const filterStatus = url.searchParams.get('status') || ''; // completed, running, all
const sortBy = url.searchParams.get('sort') || 'start-desc'; // start-desc, start-asc, duration-desc, duration-asc
const filterStatus = url.searchParams.get('status') || '';
const sortBy = url.searchParams.get('sort') || 'start-desc';
const searchTerm = url.searchParams.get('search') || '';
// Build query conditions
const conditions = [eq(timeEntries.organizationId, userOrg.organizationId)];
if (filterClient) {
@@ -68,7 +63,6 @@ if (searchTerm) {
conditions.push(like(timeEntries.description, `%${searchTerm}%`));
}
// Get total count for pagination
const totalCount = await db.select({ count: sql<number>`count(*)` })
.from(timeEntries)
.where(and(...conditions))
@@ -76,7 +70,6 @@ const totalCount = await db.select({ count: sql<number>`count(*)` })
const totalPages = Math.ceil((totalCount?.count || 0) / pageSize);
// Build order by
let orderBy;
switch (sortBy) {
case 'start-asc':
@@ -88,7 +81,7 @@ switch (sortBy) {
case 'duration-asc':
orderBy = asc(sql`(CASE WHEN ${timeEntries.endTime} IS NULL THEN 0 ELSE ${timeEntries.endTime} - ${timeEntries.startTime} END)`);
break;
default: // start-desc
default:
orderBy = desc(timeEntries.startTime);
}
@@ -129,7 +122,6 @@ function formatDuration(start: Date, end: Date | null) {
return `${hours}h ${mins}m`;
}
// Generate pagination page numbers
function getPaginationPages(currentPage: number, totalPages: number): number[] {
const pages: number[] = [];
const numPagesToShow = Math.min(5, totalPages);