Files
calendar/apps/web/modules/data-table/DataTableProvider.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

170 lines
4.9 KiB
TypeScript

"use client";
import type {
ActiveFilters,
CombinedFilterSegment,
FilterSegmentOutput,
FilterValue,
SegmentIdentifier,
SystemFilterSegment,
UseSegments,
} from "@calcom/features/data-table/lib/types";
import type { ColumnSizingState, OnChangeFn, SortingState, VisibilityState } from "@tanstack/react-table";
import { createContext, useMemo } from "react";
import type { ActiveFiltersValidatorState } from "./contexts";
import {
DataTableFiltersProvider,
DataTableSegmentProvider,
DataTableStateProvider,
useDataTableFilters,
useDataTableSegment,
useDataTableState,
} from "./contexts";
export type { ActiveFiltersValidatorState };
export type { ActiveFiltersValidator } from "./contexts";
export type DataTableContextType = {
tableIdentifier: string;
ctaContainerRef: React.RefObject<HTMLDivElement>;
filterToOpen: React.MutableRefObject<string | undefined>;
activeFilters: ActiveFilters;
clearAll: (exclude?: string[]) => void;
addFilter: (columnId: string) => void;
updateFilter: (columnId: string, value: FilterValue) => void;
removeFilter: (columnId: string) => void;
sorting: SortingState;
setSorting: OnChangeFn<SortingState>;
columnVisibility: VisibilityState;
setColumnVisibility: OnChangeFn<VisibilityState>;
columnSizing: ColumnSizingState;
setColumnSizing: OnChangeFn<ColumnSizingState>;
pageIndex: number;
pageSize: number;
setPageIndex: (pageIndex: number | null) => void;
setPageSize: (pageSize: number | null) => void;
offset: number;
limit: number;
segments: CombinedFilterSegment[];
selectedSegment: CombinedFilterSegment | undefined;
segmentId: SegmentIdentifier | null;
setSegmentId: (id: SegmentIdentifier | null, providedSegment?: CombinedFilterSegment) => void;
canSaveSegment: boolean;
isSegmentEnabled: boolean;
searchTerm: string;
setSearchTerm: (searchTerm: string | null) => void;
isValidatorPending: boolean;
timeZone?: string;
};
export const DataTableContext = createContext<DataTableContextType | null>(null);
interface DataTableProviderProps {
tableIdentifier: string;
children: React.ReactNode;
useSegments?: UseSegments;
ctaContainerClassName?: string;
defaultPageSize?: number;
segments?: FilterSegmentOutput[];
timeZone?: string;
preferredSegmentId?: SegmentIdentifier | null;
systemSegments?: SystemFilterSegment[];
validateActiveFilters?: ActiveFiltersValidatorState;
}
function DataTableContextBridge({ children }: { children: React.ReactNode }) {
const state = useDataTableState();
const segment = useDataTableSegment();
const filters = useDataTableFilters();
const value = useMemo<DataTableContextType>(
() => ({
tableIdentifier: state.tableIdentifier,
ctaContainerRef: state.ctaContainerRef,
filterToOpen: state.filterToOpen,
activeFilters: filters.activeFilters,
addFilter: filters.addFilter,
updateFilter: filters.updateFilter,
removeFilter: filters.removeFilter,
clearAll: filters.clearAll,
sorting: state.sorting,
setSorting: state.setSorting,
columnVisibility: state.columnVisibility,
setColumnVisibility: state.setColumnVisibility,
columnSizing: state.columnSizing,
setColumnSizing: state.setColumnSizing,
pageIndex: filters.pageIndex,
pageSize: filters.pageSize,
setPageIndex: filters.setPageIndex,
setPageSize: filters.setPageSize,
offset: filters.offset,
limit: filters.limit,
segments: segment.segments,
selectedSegment: segment.selectedSegment,
segmentId: segment.segmentId,
setSegmentId: segment.setSegmentId,
canSaveSegment: segment.canSaveSegment,
isSegmentEnabled: segment.isSegmentEnabled,
searchTerm: filters.searchTerm,
setSearchTerm: filters.setSearchTerm,
isValidatorPending: segment.isValidatorPending,
timeZone: state.timeZone,
}),
[state, segment, filters]
);
return <DataTableContext.Provider value={value}>{children}</DataTableContext.Provider>;
}
export function DataTableProvider({
tableIdentifier,
children,
useSegments,
defaultPageSize,
ctaContainerClassName,
segments: providedSegments,
timeZone,
preferredSegmentId,
systemSegments,
validateActiveFilters,
}: DataTableProviderProps) {
return (
<DataTableStateProvider
tableIdentifier={tableIdentifier}
defaultPageSize={defaultPageSize}
ctaContainerClassName={ctaContainerClassName}
timeZone={timeZone}
preferredSegmentId={preferredSegmentId}
validateActiveFilters={validateActiveFilters}>
<DataTableSegmentProvider
useSegments={useSegments}
segments={providedSegments}
systemSegments={systemSegments}>
<DataTableFiltersProvider>
<DataTableContextBridge>{children}</DataTableContextBridge>
</DataTableFiltersProvider>
</DataTableSegmentProvider>
</DataTableStateProvider>
);
}