gantt-task-react-v 1.2.14 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,117 @@
1
+ import React from "react";
2
+ import { RenderTask, TaskCoordinates } from "../types";
3
+ export interface SVGBatch {
4
+ tasks: RenderTask[];
5
+ dependencies: string[];
6
+ selectedTasks: string[];
7
+ holidays: string[];
8
+ }
9
+ export interface SVGRenderContext {
10
+ additionalLeftSpace: number;
11
+ fullRowHeight: number;
12
+ taskHeight: number;
13
+ svgWidth: number;
14
+ svgHeight: number;
15
+ }
16
+ /**
17
+ * Hook for batched SVG rendering to reduce DOM operations
18
+ */
19
+ export declare const useBatchedSVGRenderer: () => {
20
+ clearBatch: () => void;
21
+ addTaskToBatch: (task: RenderTask) => void;
22
+ addDependencyToBatch: (dependency: string) => void;
23
+ addSelectedTaskToBatch: (selectedTask: string) => void;
24
+ addHolidayToBatch: (holiday: string) => void;
25
+ getBatchData: () => {
26
+ tasks: RenderTask[];
27
+ dependencies: string[];
28
+ selectedTasks: string[];
29
+ holidays: string[];
30
+ };
31
+ currentBatch: SVGBatch;
32
+ };
33
+ /**
34
+ * Hook for SVG element pooling to reuse DOM elements
35
+ */
36
+ export declare const useSVGElementPool: () => {
37
+ acquireRect: () => SVGRectElement;
38
+ releaseRect: (rect: SVGRectElement) => void;
39
+ acquirePath: () => SVGPathElement;
40
+ releasePath: (path: SVGPathElement) => void;
41
+ acquireText: () => SVGTextElement;
42
+ releaseText: (text: SVGTextElement) => void;
43
+ acquireGroup: () => SVGGElement;
44
+ releaseGroup: (group: SVGGElement) => void;
45
+ clearPools: () => void;
46
+ };
47
+ /**
48
+ * Hook for virtual SVG rendering - only renders visible elements
49
+ */
50
+ export declare const useVirtualSVGRenderer: (allTasks: RenderTask[], getTaskCoordinates: (task: RenderTask) => TaskCoordinates, viewportBounds: {
51
+ minX: number;
52
+ maxX: number;
53
+ minY: number;
54
+ maxY: number;
55
+ }) => {
56
+ visibleTasks: RenderTask[];
57
+ getVisibleTasksInRange: (startIndex: number, endIndex: number) => RenderTask[];
58
+ totalVisibleCount: number;
59
+ };
60
+ /**
61
+ * Hook for optimized SVG coordinate transformations
62
+ */
63
+ export declare const useSVGCoordinateTransforms: () => {
64
+ getTransform: (x: number, y: number) => string;
65
+ getScaleTransform: (scaleX: number, scaleY: number) => string;
66
+ clearTransformCache: () => void;
67
+ };
68
+ /**
69
+ * Hook for Level-of-Detail (LOD) rendering
70
+ * Reduces rendering complexity based on zoom level
71
+ */
72
+ export declare const useLODRenderer: (zoomLevel: number, taskCount: number) => {
73
+ showLabels: boolean;
74
+ showProgress: boolean;
75
+ showDependencies: boolean;
76
+ taskDetail: "minimal";
77
+ maxVisibleTasks: number;
78
+ } | {
79
+ showLabels: boolean;
80
+ showProgress: boolean;
81
+ showDependencies: boolean;
82
+ taskDetail: "reduced";
83
+ maxVisibleTasks: number;
84
+ } | {
85
+ showLabels: boolean;
86
+ showProgress: boolean;
87
+ showDependencies: boolean;
88
+ taskDetail: "full";
89
+ maxVisibleTasks: number;
90
+ };
91
+ /**
92
+ * Hook for efficient SVG path generation
93
+ */
94
+ export declare const useSVGPathGenerator: () => {
95
+ generateTaskPath: (x: number, y: number, width: number, height: number, cornerRadius?: number) => string;
96
+ generateProgressPath: (x: number, y: number, width: number, height: number, progressPercent: number) => string;
97
+ generateArrowPath: (fromX: number, fromY: number, toX: number, toY: number, arrowSize?: number) => string;
98
+ clearPathCache: () => void;
99
+ };
100
+ /**
101
+ * Hook for SVG performance optimization
102
+ */
103
+ export declare const useSVGPerformanceOptimizer: () => {
104
+ optimizeRenderList: (elements: React.ReactElement[]) => React.ReactElement<any, string | React.JSXElementConstructor<any>>[];
105
+ batchSVGUpdates: (updates: Array<() => void>) => void;
106
+ shouldSkipRender: (bounds: {
107
+ x: number;
108
+ y: number;
109
+ width?: number;
110
+ height?: number;
111
+ }, viewportBounds: {
112
+ minX: number;
113
+ maxX: number;
114
+ minY: number;
115
+ maxY: number;
116
+ }) => boolean;
117
+ };
@@ -0,0 +1,106 @@
1
+ export interface PerformanceMetrics {
2
+ renderTime: number;
3
+ coordinateCalculationTime: number;
4
+ dependencyCalculationTime: number;
5
+ sortingTime: number;
6
+ totalTasks: number;
7
+ visibleTasks: number;
8
+ fps: number;
9
+ memoryUsage: number;
10
+ timestamp: number;
11
+ }
12
+ export interface PerformanceBenchmark {
13
+ name: string;
14
+ startTime: number;
15
+ endTime?: number;
16
+ duration?: number;
17
+ metadata?: Record<string, unknown>;
18
+ }
19
+ /**
20
+ * Performance monitor for tracking Gantt chart performance metrics
21
+ */
22
+ export declare const usePerformanceMonitor: (enabled?: boolean) => {
23
+ startMeasurement: (name: string, metadata?: Record<string, unknown>) => void;
24
+ endMeasurement: (name: string) => number;
25
+ measureFunction: <T extends unknown[], R>(name: string, fn: (...args: T) => R, metadata?: Record<string, unknown>) => (...args: T) => R;
26
+ measureAsyncFunction: <T_1 extends unknown[], R_1>(name: string, fn: (...args: T_1) => Promise<R_1>, metadata?: Record<string, unknown>) => (...args: T_1) => Promise<R_1>;
27
+ getPerformanceReport: () => {
28
+ measurements: Record<string, {
29
+ count: number;
30
+ totalTime: number;
31
+ avgTime: number;
32
+ maxTime: number;
33
+ minTime: number;
34
+ }>;
35
+ fps: number;
36
+ currentMetrics: PerformanceMetrics;
37
+ allMetrics: PerformanceMetrics[];
38
+ };
39
+ addMetrics: (metrics: Omit<PerformanceMetrics, "timestamp">) => void;
40
+ clearMeasurements: () => void;
41
+ updateFPS: () => void;
42
+ getFPS: () => number;
43
+ getMemoryUsage: () => number;
44
+ enabled: boolean;
45
+ };
46
+ /**
47
+ * Hook for measuring render performance
48
+ */
49
+ export declare const useRenderPerformance: (componentName: string) => {
50
+ measureRender: (fn: () => void) => () => void;
51
+ renderCount: number;
52
+ lastRenderTime: number;
53
+ };
54
+ /**
55
+ * Hook for performance budgeting
56
+ */
57
+ export declare const usePerformanceBudget: (budgets: Record<string, number>) => {
58
+ checkBudgets: () => {
59
+ operation: string;
60
+ actual: number;
61
+ budget: number;
62
+ timestamp: number;
63
+ }[];
64
+ getBudgetStatus: () => Record<string, {
65
+ budget: number;
66
+ actual: number;
67
+ status: "ok" | "warning" | "violation";
68
+ }>;
69
+ violations: {
70
+ operation: string;
71
+ actual: number;
72
+ budget: number;
73
+ timestamp: number;
74
+ }[];
75
+ };
76
+ /**
77
+ * Hook for performance-aware rendering
78
+ * Automatically reduces quality when performance is poor
79
+ */
80
+ export declare const useAdaptivePerformance: (thresholds: {
81
+ fpsThreshold: number;
82
+ renderTimeThreshold: number;
83
+ }) => {
84
+ performanceLevel: "medium" | "high" | "low";
85
+ updatePerformanceLevel: () => "medium" | "high" | "low";
86
+ getQualitySettings: () => {
87
+ enableAnimations: boolean;
88
+ renderQuality: string;
89
+ maxVisibleTasks: number;
90
+ updateFrequency: number;
91
+ };
92
+ };
93
+ /**
94
+ * Hook for throttling expensive operations based on performance
95
+ */
96
+ export declare const usePerformanceThrottling: () => {
97
+ throttle: <T extends unknown[], R>(key: string, fn: (...args: T) => R, baseDelay?: number) => (...args: T) => R | undefined;
98
+ };
99
+ /**
100
+ * Development-only performance debugging utilities
101
+ */
102
+ export declare const usePerformanceDebugger: () => {
103
+ logPerformanceReport: () => void;
104
+ exportPerformanceData: () => void;
105
+ clearMeasurements: () => void;
106
+ };
@@ -0,0 +1,63 @@
1
+ import { RenderTask } from "../types";
2
+ import type { OptimizedListParams } from "./use-optimized-list";
3
+ export interface ProgressiveLoadingConfig {
4
+ /** Number of tasks to load per chunk */
5
+ chunkSize: number;
6
+ /** Buffer size for preloading (in chunks) */
7
+ preloadBuffer: number;
8
+ /** Function to load a chunk of tasks */
9
+ loadTaskChunk: (startIndex: number, endIndex: number) => Promise<RenderTask[]>;
10
+ /** Total number of tasks available */
11
+ totalTaskCount: number;
12
+ /** Enable progressive loading */
13
+ enabled: boolean;
14
+ }
15
+ export interface ProgressiveLoadingState {
16
+ /** Currently loaded tasks */
17
+ loadedTasks: readonly RenderTask[];
18
+ /** Loading state */
19
+ isLoading: boolean;
20
+ /** Error state */
21
+ error: Error | null;
22
+ /** Loaded chunk ranges */
23
+ loadedRanges: Set<string>;
24
+ /** Currently loading chunks */
25
+ loadingChunks: Set<string>;
26
+ }
27
+ /**
28
+ * Hook for progressive loading of large task datasets
29
+ * Loads tasks in chunks based on viewport visibility
30
+ */
31
+ export declare const useProgressiveLoading: (initialTasks: readonly RenderTask[], config: Partial<ProgressiveLoadingConfig>, renderedIndexes: OptimizedListParams | null) => ProgressiveLoadingState & {
32
+ /** Force load a specific range */
33
+ loadRange: (startIndex: number, endIndex: number) => Promise<void>;
34
+ /** Preload next chunks based on scroll direction */
35
+ preloadNext: (direction: "up" | "down") => Promise<void>;
36
+ /** Clear loaded data and reset */
37
+ reset: () => void;
38
+ };
39
+ /**
40
+ * Hook for chunked task processing
41
+ * Processes large task arrays in smaller chunks to avoid blocking the main thread
42
+ */
43
+ export declare const useChunkedProcessing: <T, R>(data: T[], processor: (chunk: T[]) => R[], chunkSize?: number) => {
44
+ processedData: R[];
45
+ isProcessing: boolean;
46
+ progress: number;
47
+ };
48
+ /**
49
+ * Enhanced progressive loading with smart caching
50
+ */
51
+ export declare const useSmartProgressiveLoading: (config: Partial<ProgressiveLoadingConfig> & {
52
+ /** Cache expiry time in milliseconds */
53
+ cacheExpiry?: number;
54
+ /** Maximum cache size (number of chunks) */
55
+ maxCacheSize?: number;
56
+ }, renderedIndexes: OptimizedListParams | null) => ProgressiveLoadingState & {
57
+ /** Force load a specific range */
58
+ loadRange: (startIndex: number, endIndex: number) => Promise<void>;
59
+ /** Preload next chunks based on scroll direction */
60
+ preloadNext: (direction: "up" | "down") => Promise<void>;
61
+ /** Clear loaded data and reset */
62
+ reset: () => void;
63
+ };
@@ -0,0 +1,49 @@
1
+ import { DependencyMap, DependentMap, DependencyMargins, ExpandedDependency, ExpandedDependent, MapTaskToCoordinates, TaskMapByLevel, RenderTask, TaskCoordinates } from "../types";
2
+ import type { OptimizedListParams } from "./use-optimized-list";
3
+ interface SpatialBounds {
4
+ minX: number;
5
+ maxX: number;
6
+ minY: number;
7
+ maxY: number;
8
+ }
9
+ interface SpatialNode {
10
+ taskId: string;
11
+ bounds: SpatialBounds;
12
+ dependencies: ExpandedDependency[];
13
+ dependents: ExpandedDependent[];
14
+ }
15
+ /**
16
+ * Spatial hash map for efficient spatial queries
17
+ * Divides space into grid cells for O(1) spatial lookups
18
+ */
19
+ declare class SpatialHashMap {
20
+ private cellSize;
21
+ private grid;
22
+ private taskNodes;
23
+ constructor(cellSize?: number);
24
+ private getBoundsFromCoordinates;
25
+ insert(taskId: string, coordinates: TaskCoordinates, dependencies?: ExpandedDependency[], dependents?: ExpandedDependent[]): void;
26
+ query(bounds: SpatialBounds): SpatialNode[];
27
+ private boundsIntersect;
28
+ getNode(taskId: string): SpatialNode | undefined;
29
+ clear(): void;
30
+ remove(taskId: string): void;
31
+ }
32
+ /**
33
+ * Hook for optimized dependency calculations using spatial indexing
34
+ */
35
+ export declare const useSpatialDependencyMap: (tasks: readonly RenderTask[], visibleTasksMirror: Readonly<Record<string, true>>, tasksMap: TaskMapByLevel, mapTaskToCoordinates: MapTaskToCoordinates, fullRowHeight: number, isShowCriticalPath: boolean, renderedRowIndexes: OptimizedListParams | null, renderedColumnIndexes: OptimizedListParams | null) => [DependencyMap, DependentMap, DependencyMargins, SpatialHashMap];
36
+ /**
37
+ * Hook for querying dependencies in a specific spatial region
38
+ */
39
+ export declare const useSpatialDependencyQuery: (spatialMap: SpatialHashMap, queryBounds: SpatialBounds) => SpatialNode[];
40
+ /**
41
+ * Hook for optimized dependency updates
42
+ * Only recalculates dependencies for tasks that actually changed
43
+ */
44
+ export declare const useIncrementalDependencyUpdate: (spatialMap: SpatialHashMap, changedTaskIds: Set<string>, allTasks: readonly RenderTask[]) => (newTaskCoordinates: Map<string, TaskCoordinates>) => void;
45
+ /**
46
+ * Utility function to create viewport bounds from rendered indexes
47
+ */
48
+ export declare const createViewportBounds: (renderedRowIndexes: OptimizedListParams | null, renderedColumnIndexes: OptimizedListParams | null, fullRowHeight: number, columnWidth: number) => SpatialBounds | null;
49
+ export {};
@@ -0,0 +1,50 @@
1
+ import { RenderTask, ViewMode, Distances, TaskCoordinates } from "../types";
2
+ export interface WorkerMessage {
3
+ id: string;
4
+ type: "calculate-coordinates" | "process-dependencies" | "sort-tasks" | "filter-tasks";
5
+ data: unknown;
6
+ }
7
+ export interface WorkerResponse {
8
+ id: string;
9
+ type: string;
10
+ result?: unknown;
11
+ error?: string;
12
+ }
13
+ export interface CoordinateCalculationData {
14
+ tasks: RenderTask[];
15
+ startDate: number;
16
+ viewMode: ViewMode;
17
+ rtl: boolean;
18
+ fullRowHeight: number;
19
+ taskHeight: number;
20
+ taskYOffset: number;
21
+ distances: Distances;
22
+ svgWidth: number;
23
+ }
24
+ /**
25
+ * Hook for managing Web Worker communications for heavy calculations
26
+ */
27
+ export declare const useGanttWebWorker: () => {
28
+ isWorkerAvailable: boolean;
29
+ sendMessage: (message: Omit<WorkerMessage, "id">, timeoutMs?: number) => Promise<unknown>;
30
+ };
31
+ /**
32
+ * Hook for calculating task coordinates using Web Worker
33
+ */
34
+ export declare const useWorkerCoordinateCalculation: (tasks: readonly RenderTask[], startDate: Date, viewMode: ViewMode, rtl: boolean, fullRowHeight: number, taskHeight: number, taskYOffset: number, distances: Distances, svgWidth: number) => {
35
+ coordinates: Map<string, TaskCoordinates>;
36
+ isCalculating: boolean;
37
+ recalculate: () => Promise<Map<string, TaskCoordinates>>;
38
+ };
39
+ /**
40
+ * Hook for sorting tasks using Web Worker
41
+ */
42
+ export declare const useWorkerTaskSorting: () => {
43
+ sortTasks: (tasks: RenderTask[]) => Promise<RenderTask[]>;
44
+ };
45
+ /**
46
+ * Hook for filtering tasks using Web Worker
47
+ */
48
+ export declare const useWorkerTaskFiltering: () => {
49
+ filterTasks: (tasks: RenderTask[], filterFn: string) => Promise<RenderTask[]>;
50
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gantt-task-react-v",
3
- "version": "1.2.14",
3
+ "version": "1.3.2",
4
4
  "description": "Interactive Gantt Chart for React with TypeScript.",
5
5
  "author": "aguilanbon",
6
6
  "homepage": "https://github.com/aguilanbon/gantt-task-react-v",
@@ -43,8 +43,9 @@
43
43
  "@floating-ui/dom": "1.6.3",
44
44
  "@floating-ui/react": "0.26.11",
45
45
  "date-fns": "3.6.0",
46
- "i18next": "^24.0.5",
47
- "react-i18next": "^15.1.3"
46
+ "i18next": "^25.5.2",
47
+ "react-i18next": "^15.7.3",
48
+ "react-window": "^2.1.1"
48
49
  },
49
50
  "peerDependencies": {
50
51
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc",
@@ -61,11 +62,11 @@
61
62
  "@storybook/addon-onboarding": "8.2.10",
62
63
  "@storybook/blocks": "8.2.10",
63
64
  "@storybook/cli": "8.2.10",
65
+ "@storybook/core-server": "8.2.10",
66
+ "@storybook/jest": "0.2.3",
64
67
  "@storybook/react": "8.2.10",
65
68
  "@storybook/react-vite": "8.2.10",
66
69
  "@storybook/test": "8.2.10",
67
- "@storybook/core-server": "8.2.10",
68
- "@storybook/jest": "0.2.3",
69
70
  "@storybook/test-runner": "0.23.0",
70
71
  "@storybook/testing-library": "^0.2.2",
71
72
  "@testing-library/jest-dom": "^6.4.2",
@@ -75,6 +76,7 @@
75
76
  "@types/node": "^20.12.4",
76
77
  "@types/react": "^18.2.74",
77
78
  "@types/react-dom": "^18.2.24",
79
+ "@types/react-window": "^1.8.8",
78
80
  "@typescript-eslint/eslint-plugin": "^7.5.0",
79
81
  "@typescript-eslint/parser": "^7.5.0",
80
82
  "@vitejs/plugin-react": "4.2.1",