mirror of
https://github.com/hanzoai/calendar.git
synced 2026-10-30 14:46:43 +00:00
* feat: Add routing trace presenters Add domain-specific presenters (SalesforceRoutingTracePresenter, RoutingFormTracePresenter) that format trace steps into human-readable strings, and a core RoutingTracePresenter that delegates to them based on step domain. Includes unit tests for all presenters. Co-Authored-By: Claude Opus 4.5 <[email protected]> * feat: Add findByBookingUid to RoutingTraceRepository Add method to look up a routing trace by booking UID, needed by the routing trace presenter tRPC endpoint. Co-Authored-By: Claude Opus 4.5 <[email protected]> * feat: Add getRoutingTrace tRPC endpoint Expose routing trace data for a booking via viewer.bookings.getRoutingTrace. Tries the permanent RoutingTrace first (round robin bookings), then falls back to PendingRoutingTrace via the booking's form response relation. Co-Authored-By: Claude Opus 4.5 <[email protected]> * feat: Add routing trace side sheet to booking list item Add a route icon button on booking list items that came from routing forms. Clicking it opens a side sheet displaying the full routing trace as human-readable steps. Adds RoutingTraceSheet component, store state, and translation key. Co-Authored-By: Claude Opus 4.5 <[email protected]> * refactor: Move routing trace action to dropdown menu Move the routing trace button from a standalone icon on the booking list item into the actions dropdown menu alongside "Report wrong assignment". The RoutingTraceSheet is now rendered from BookingActionsDropdown. Co-Authored-By: Claude Opus 4.5 <[email protected]> * fix: Improve routing trace UI and handle unnamed routes - Redesign RoutingTraceSheet with vertical timeline layout, domain badges, skeleton loading state, and millisecond timestamps - Use Salesforce app-store icon for Salesforce steps - Fall back to "Unnamed route" when route name is missing or matches route ID - Fix dropdown menu icon to git-merge (valid icon, unique in menu) Co-Authored-By: Claude Opus 4.5 <[email protected]> * test: Add tests for getRoutingTrace handler and findByBookingUid repository method Co-Authored-By: [email protected] <[email protected]> * Abstract functions * Fix build error * Add permission check * fix: Update getRoutingTrace tests to include ctx and mock BookingAccessService Co-Authored-By: [email protected] <[email protected]> --------- Co-authored-by: Claude Opus 4.5 <[email protected]> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import type { PrismaClient } from "@calcom/prisma";
|
|
import type { Prisma } from "@calcom/prisma/client";
|
|
|
|
import type {
|
|
IRoutingTraceRepository,
|
|
IRoutingTraceRepositoryCreateArgs,
|
|
RoutingTrace,
|
|
RoutingTraceRecord,
|
|
} from "./RoutingTraceRepository.interface";
|
|
|
|
export class PrismaRoutingTraceRepository implements IRoutingTraceRepository {
|
|
constructor(private readonly prisma: PrismaClient) {}
|
|
|
|
async create(args: IRoutingTraceRepositoryCreateArgs): Promise<RoutingTraceRecord> {
|
|
const result = await this.prisma.routingTrace.create({
|
|
data: {
|
|
createdAt: new Date(),
|
|
trace: args.trace as Prisma.InputJsonValue,
|
|
formResponseId: args.formResponseId,
|
|
queuedFormResponseId: args.queuedFormResponseId,
|
|
bookingUid: args.bookingUid,
|
|
assignmentReasonId: args.assignmentReasonId,
|
|
},
|
|
});
|
|
return {
|
|
...result,
|
|
trace: result.trace as RoutingTrace,
|
|
};
|
|
}
|
|
|
|
async findByBookingUid(bookingUid: string): Promise<RoutingTraceRecord | null> {
|
|
const result = await this.prisma.routingTrace.findFirst({
|
|
where: { bookingUid },
|
|
});
|
|
if (!result) return null;
|
|
return {
|
|
...result,
|
|
trace: result.trace as RoutingTrace,
|
|
};
|
|
}
|
|
}
|