52d5261b51
* display UTM parameters * persist view (list | calendar) in localStorage * move to next page on clicking "next" of last item in the page improve navigation ^ Conflicts: ^ apps/web/modules/bookings/components/BookingCalendarContainer.tsx * fix navigation on calendar view * Delete apps/web/modules/bookings/NAVIGATION_IMPLEMENTATION.md * avoid page size being 0 * check feature flag on user level * use map to improve useBookingListData * address feedback * feat(bookings): add smart navigation for calendar view - Add sort option to tRPC bookings.get schema and handler - Create NAVIGATION_PROBE_WINDOW_MONTHS constant (3 months) - Create useNearestFutureBooking hook to find nearest future booking - Create useNearestPastBooking hook to find nearest past booking - Update useCalendarNavigationCapabilities to use probe results - Update BookingCalendarContainer to wire up probe hooks This enables the booking details sheet to: - Disable next/prev buttons when no bookings exist in that direction - Jump directly to the week containing the nearest booking Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * fix type error * feat: add booking selection state when using slideover (#25637) * implement booking selection when using slideover * remove pixel shift * fix * auto scroll to selected event on calendar * make DateValues header sticky when scrolling --------- Co-authored-by: Eunjae Lee <hey@eunjae.dev> * prefetch previous / next weeks on calendar view * clean up classes * handle "fetched & but no data" situation more correctly in useCalendarAutoSelector --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com>
33 lines
1.6 KiB
TypeScript
33 lines
1.6 KiB
TypeScript
import type { SortingState, VisibilityState, ColumnSizingState } from "@tanstack/react-table";
|
|
import { parseAsArrayOf, parseAsJson, parseAsInteger, parseAsString, createParser } from "nuqs";
|
|
|
|
import { ZActiveFilter, ZSorting, ZColumnVisibility, ZColumnSizing } from "./types";
|
|
import type { ActiveFilters } from "./types";
|
|
|
|
const DEFAULT_ACTIVE_FILTERS: ActiveFilters = [] as ActiveFilters;
|
|
const DEFAULT_SORTING: SortingState = [] as SortingState;
|
|
const DEFAULT_COLUMN_VISIBILITY: VisibilityState = {};
|
|
const DEFAULT_COLUMN_SIZING: ColumnSizingState = {};
|
|
export const DEFAULT_PAGE_SIZE = 10;
|
|
|
|
export const activeFiltersParser = parseAsArrayOf(parseAsJson(ZActiveFilter.parse)).withDefault(
|
|
DEFAULT_ACTIVE_FILTERS
|
|
);
|
|
export const sortingParser = parseAsArrayOf(parseAsJson(ZSorting.parse)).withDefault(DEFAULT_SORTING);
|
|
export const columnVisibilityParser = parseAsJson(ZColumnVisibility.parse).withDefault(
|
|
DEFAULT_COLUMN_VISIBILITY
|
|
);
|
|
export const columnSizingParser = parseAsJson(ZColumnSizing.parse).withDefault(DEFAULT_COLUMN_SIZING);
|
|
export const segmentIdParser = parseAsString.withDefault("");
|
|
export const pageIndexParser = parseAsInteger.withDefault(0);
|
|
// Custom parser that validates pageSize is positive to prevent division by zero
|
|
export const pageSizeParser = createParser({
|
|
parse: (value) => {
|
|
const parsed = parseAsInteger.parse(value);
|
|
// Return null for invalid values (0 or negative), which will fall back to default
|
|
return parsed !== null && parsed > 0 ? parsed : null;
|
|
},
|
|
serialize: (value) => String(value),
|
|
}).withDefault(DEFAULT_PAGE_SIZE);
|
|
export const searchTermParser = parseAsString.withDefault("");
|