feat: timeline UI overhaul with project/resource panel redesign, quick filters, and API improvements

Redesigned timeline project and resource panels with expanded detail views,
added quick filter toolbar, improved drag handling, and enhanced vacation/entitlement
router logic. Includes e2e test updates and minor API fixes.

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
2026-03-15 09:28:59 +01:00
parent fa2019f521
commit a83edb2f9d
23 changed files with 2464 additions and 734 deletions
@@ -13,13 +13,18 @@ const createCaller = createCallerFactory(entitlementRouter);
// ── Caller factories ─────────────────────────────────────────────────────────
/** Injects a default resource ownership mock so the ownership check in getBalance passes */
function createProtectedCaller(db: Record<string, unknown>) {
const withResourceOwnership = {
resource: { findUnique: vi.fn().mockResolvedValue({ userId: "user_1" }) },
...db,
};
return createCaller({
session: {
user: { email: "user@example.com", name: "User", image: null },
expires: "2099-01-01T00:00:00.000Z",
},
db: db as never,
db: withResourceOwnership as never,
dbUser: {
id: "user_1",
systemRole: SystemRole.USER,
@@ -12,7 +12,7 @@ function createProtectedCaller(db: Record<string, unknown>) {
expires: "2026-03-13T00:00:00.000Z",
},
db: db as never,
dbUser: null,
dbUser: { id: "user_1", systemRole: "ADMIN", permissionOverrides: null },
});
}
@@ -203,6 +203,9 @@ describe("vacation router", () => {
user: {
findUnique: vi.fn().mockResolvedValue({ id: "user_1", systemRole: "USER" }),
},
resource: {
findUnique: vi.fn().mockResolvedValue({ userId: "user_1" }),
},
vacation: {
findFirst: vi.fn().mockResolvedValue(null),
create: vi.fn().mockResolvedValue(createdVacation),
@@ -270,6 +273,9 @@ describe("vacation router", () => {
user: {
findUnique: vi.fn().mockResolvedValue({ id: "user_1", systemRole: "USER" }),
},
resource: {
findUnique: vi.fn().mockResolvedValue({ userId: "user_1" }),
},
vacation: {
findFirst: vi.fn().mockResolvedValue({ id: "existing_vac" }),
},
@@ -314,6 +320,9 @@ describe("vacation router", () => {
user: {
findUnique: vi.fn().mockResolvedValue({ id: "user_1", systemRole: "USER" }),
},
resource: {
findUnique: vi.fn().mockResolvedValue({ userId: "user_1" }),
},
vacation: {
findFirst: vi.fn().mockResolvedValue(null),
create: vi.fn().mockResolvedValue(createdVacation),
@@ -469,6 +478,9 @@ describe("vacation router", () => {
};
const db = {
user: {
findUnique: vi.fn().mockResolvedValue({ id: "user_1", systemRole: "USER" }),
},
vacation: {
findUnique: vi.fn().mockResolvedValue(sampleVacation),
update: vi.fn().mockResolvedValue(updatedVacation),