* 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>
168 lines
4.8 KiB
TypeScript
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>;
|
|
}
|