Files
calendar/apps/web/modules/data-table/contexts/DataTableStateContext.tsx
Benny JooGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
ab21c7f805 refactor: Cal.diy (#28903)
* feat: Cal.diy — community-driven MIT-licensed fork of Cal.com

This squashed commit contains all Cal.diy changes applied on top of calcom/cal.com main:

- Rebrand Cal.com to Cal.diy across the entire codebase
- Remove Enterprise Edition (EE) features, license checks, and AGPL restrictions
- Switch license from AGPL-3.0 to MIT
- Remove docs/ directory (migrated to Nextra at cal.diy)
- Remove dead code: org tests, EE tips, platform nav, premium username, SAML/SSO, etc.
- Clean up .env.example for self-hosted Cal.diy
- Update Docker image references to calcom/cal.diy
- Update README, CONTRIBUTING.md, and issue templates for Cal.diy community fork
- Add PR welcome bot for Cal.diy contributors
- Fix API v2 breaking changes oasdiff ignore entries
- Replace Blacksmith CI runners with default GitHub Actions

3893 files changed, 20789 insertions(+), 411020 deletions(-)

Co-Authored-By: benny@cal.com <sldisek783@gmail.com>

* refactor: remove org-specific /organizations/:orgId endpoints from API v2 atoms controllers (#1701)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* fix: revert Cal.diy Inc to Cal.com, Inc. in license files, copyright notices, and package metadata (#1702)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* rip out org related comments in api v2

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-04-15 09:52:36 -03:00

168 lines
4.8 KiB
TypeScript

"use client";
import {
activeFiltersParser,
columnSizingParser,
columnVisibilityParser,
DEFAULT_PAGE_SIZE,
pageIndexParser,
pageSizeParser,
searchTermParser,
segmentIdParser,
sortingParser,
} from "@calcom/features/data-table/lib/parsers";
import type { ActiveFilters, SegmentIdentifier } from "@calcom/features/data-table/lib/types";
import { CTA_CONTAINER_CLASS_NAME } from "@calcom/features/data-table/lib/utils";
import { useElementByClassName } from "@calcom/lib/hooks/useElementByClassName";
import type { ColumnSizingState, OnChangeFn, SortingState, VisibilityState } from "@tanstack/react-table";
import { useQueryState } from "nuqs";
import { createContext, useContext, useMemo, useRef } from "react";
export type ActiveFiltersValidator = (filters: ActiveFilters) => ActiveFilters;
export type ActiveFiltersValidatorState = ActiveFiltersValidator | "loading" | undefined;
export type DataTableStateContextType = {
tableIdentifier: string;
ctaContainerRef: React.RefObject<HTMLDivElement>;
filterToOpen: React.MutableRefObject<string | undefined>;
pageIndex: number;
setPageIndex: (pageIndex: number | null) => void;
pageSize: number;
setPageSize: (pageSize: number | null) => void;
searchTerm: string;
setSearchTerm: (searchTerm: string | null) => void;
activeFilters: ActiveFilters;
setActiveFilters: ReturnType<typeof useQueryState<ActiveFilters>>[1];
sorting: SortingState;
setSorting: OnChangeFn<SortingState>;
columnVisibility: VisibilityState;
setColumnVisibility: OnChangeFn<VisibilityState>;
columnSizing: ColumnSizingState;
setColumnSizing: OnChangeFn<ColumnSizingState>;
segmentIdRaw: string | null;
setSegmentIdRaw: (segmentId: string | null) => void;
defaultPageSize: number;
timeZone?: string;
validateActiveFilters?: ActiveFiltersValidatorState;
};
export const DataTableStateContext = createContext<DataTableStateContextType | null>(null);
export function useDataTableState() {
const context = useContext(DataTableStateContext);
if (!context) {
throw new Error("useDataTableState must be used within a DataTableStateProvider");
}
return context;
}
interface DataTableStateProviderProps {
tableIdentifier: string;
children: React.ReactNode;
defaultPageSize?: number;
ctaContainerClassName?: string;
timeZone?: string;
preferredSegmentId?: SegmentIdentifier | null;
validateActiveFilters?: ActiveFiltersValidatorState;
}
export function DataTableStateProvider({
tableIdentifier,
children,
defaultPageSize = DEFAULT_PAGE_SIZE,
ctaContainerClassName = CTA_CONTAINER_CLASS_NAME,
timeZone,
preferredSegmentId,
validateActiveFilters,
}: DataTableStateProviderProps) {
if (!tableIdentifier.trim()) {
throw new Error("tableIdentifier is required and cannot be empty");
}
const filterToOpen = useRef<string | undefined>(undefined);
const [pageIndex, setPageIndex] = useQueryState("page", pageIndexParser);
const [pageSize, setPageSize] = useQueryState("size", pageSizeParser);
const [searchTerm, setSearchTerm] = useQueryState("q", searchTermParser);
const [activeFilters, setActiveFilters] = useQueryState("activeFilters", activeFiltersParser);
const [sorting, setSorting] = useQueryState("sorting", sortingParser);
const [columnVisibility, setColumnVisibility] = useQueryState<VisibilityState>(
"cols",
columnVisibilityParser
);
const [columnSizing, setColumnSizing] = useQueryState<ColumnSizingState>("widths", columnSizingParser);
const initialSegmentId = useMemo(
() => (preferredSegmentId ? String(preferredSegmentId.id) : null),
[preferredSegmentId]
);
const [segmentIdRaw, setSegmentIdRaw] = useQueryState(
"segment",
initialSegmentId ? segmentIdParser.withDefault(initialSegmentId) : segmentIdParser
);
const ctaContainerRef = useElementByClassName<HTMLDivElement>(ctaContainerClassName);
const value = useMemo(
() => ({
tableIdentifier,
ctaContainerRef,
filterToOpen,
pageIndex,
setPageIndex,
pageSize,
setPageSize,
searchTerm,
setSearchTerm,
activeFilters,
setActiveFilters,
sorting,
setSorting,
columnVisibility,
setColumnVisibility,
columnSizing,
setColumnSizing,
segmentIdRaw,
setSegmentIdRaw,
defaultPageSize,
timeZone,
validateActiveFilters,
}),
[
tableIdentifier,
ctaContainerRef,
pageIndex,
setPageIndex,
pageSize,
setPageSize,
searchTerm,
setSearchTerm,
activeFilters,
setActiveFilters,
sorting,
setSorting,
columnVisibility,
setColumnVisibility,
columnSizing,
setColumnSizing,
segmentIdRaw,
setSegmentIdRaw,
defaultPageSize,
timeZone,
validateActiveFilters,
]
);
return <DataTableStateContext.Provider value={value}>{children}</DataTableStateContext.Provider>;
}