* 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>
170 lines
4.9 KiB
TypeScript
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>
|
|
);
|
|
}
|