akfatimeline 1.0.6 → 1.2.0
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.
- package/CHANGELOG.md +98 -35
- package/dist/Timeline.js +4309 -1677
- package/dist/components/Timeline/AutocompleteSelect.js +150 -0
- package/dist/components/Timeline/ContextMenu.js +149 -0
- package/dist/components/Timeline/DailyView.js +255 -0
- package/dist/components/Timeline/DatePickerComponent.js +13 -0
- package/{public/dist/dist → dist}/components/Timeline/DragAndDropHandler.js +34 -34
- package/dist/components/Timeline/EventBadge.js +26 -0
- package/dist/components/Timeline/EventDetailModal.js +138 -0
- package/dist/components/Timeline/EventIcon.js +47 -0
- package/dist/{dist/components → components}/Timeline/EventTooltip.js +206 -206
- package/dist/components/Timeline/FilterPanel.js +179 -0
- package/dist/{dist/components → components}/Timeline/Indicator.js +26 -26
- package/dist/components/Timeline/LoadingSpinner.js +48 -0
- package/dist/{dist/components → components}/Timeline/MasterHeader.js +104 -68
- package/{public/dist/dist → dist}/components/Timeline/Resources.js +53 -53
- package/dist/{dist/components → components}/Timeline/ResourcesHeader.js +14 -14
- package/dist/components/Timeline/Timeline.css +2491 -0
- package/dist/components/Timeline/Timeline.js +607 -0
- package/dist/{dist/components → components}/Timeline/TimelineCell.js +8 -8
- package/dist/components/Timeline/TimelineContent.js +838 -0
- package/{public/dist/dist → dist}/components/Timeline/TimelineEvents.js +114 -114
- package/dist/components/Timeline/TimelineHeader.js +54 -0
- package/{public/dist/dist → dist}/components/Timeline/TimelineMonthContainer.js +29 -29
- package/{public/dist/dist → dist}/components/Timeline/TimelineResources.js +16 -16
- package/{public/dist/dist → dist}/hooks/useDragAndDrop.js +80 -80
- package/dist/{dist/hooks → hooks}/useEventDragDrop.js +126 -126
- package/dist/hooks/useEventManagement.js +173 -0
- package/dist/hooks/useEventSelection.js +82 -0
- package/{public/dist/dist → dist}/hooks/useExtendEvent.js +28 -28
- package/dist/hooks/useKeyboardShortcuts.js +158 -0
- package/dist/hooks/useTouchGestures.js +90 -0
- package/dist/utils/conflictUtils.js +105 -0
- package/dist/{dist/utils → utils}/dateUtils.js +36 -36
- package/dist/{dist/utils → utils}/filterTimelineData.js +20 -20
- package/dist/utils/filterUtils.js +106 -0
- package/dist/utils/timeUtils.js +179 -0
- package/dist/{dist/utils → utils}/timelineUtils.js +39 -39
- package/dist/utils/viewModeUtils.js +54 -0
- package/package.json +89 -19
- package/src/App.js +300 -19
- package/src/components/Timeline/AutocompleteSelect.js +150 -0
- package/src/components/Timeline/ContextMenu.js +149 -0
- package/src/components/Timeline/DailyView.js +255 -0
- package/src/components/Timeline/DatePickerComponent.js +13 -17
- package/src/components/Timeline/DragAndDropHandler.js +34 -34
- package/src/components/Timeline/EventBadge.js +26 -0
- package/src/components/Timeline/EventDetailModal.js +138 -0
- package/src/components/Timeline/EventIcon.js +47 -0
- package/src/components/Timeline/EventTooltip.js +206 -206
- package/src/components/Timeline/FilterPanel.js +179 -0
- package/src/components/Timeline/Indicator.js +26 -26
- package/src/components/Timeline/LoadingSpinner.js +48 -0
- package/src/components/Timeline/MasterHeader.js +104 -68
- package/src/components/Timeline/Resources.js +53 -53
- package/src/components/Timeline/ResourcesHeader.js +14 -14
- package/src/components/Timeline/Timeline.css +2491 -616
- package/src/components/Timeline/Timeline.js +607 -309
- package/src/components/Timeline/TimelineCell.js +8 -8
- package/src/components/Timeline/TimelineContent.js +838 -446
- package/src/components/Timeline/TimelineEvents.js +114 -114
- package/src/components/Timeline/TimelineHeader.js +54 -43
- package/src/components/Timeline/TimelineMonthContainer.js +29 -29
- package/src/components/Timeline/TimelineResources.js +16 -16
- package/src/demo.css +4 -0
- package/src/hooks/useDragAndDrop.js +80 -80
- package/src/hooks/useEventDragDrop.js +126 -126
- package/src/hooks/useEventManagement.js +173 -0
- package/src/hooks/useEventSelection.js +82 -0
- package/src/hooks/useExtendEvent.js +28 -28
- package/src/hooks/useKeyboardShortcuts.js +158 -0
- package/src/hooks/useTouchGestures.js +90 -0
- package/src/index.js +1 -7
- package/src/library.js +26 -0
- package/src/utils/conflictUtils.js +105 -0
- package/src/utils/dateUtils.js +36 -36
- package/src/utils/filterTimelineData.js +20 -20
- package/src/utils/filterUtils.js +106 -0
- package/src/utils/timeUtils.js +179 -0
- package/src/utils/timelineUtils.js +39 -39
- package/src/utils/viewModeUtils.js +54 -0
- package/.babelrc +0 -6
- package/babel.config.json +0 -4
- package/dist/dist/components/Timeline/DatePickerComponent.js +0 -17
- package/dist/dist/components/Timeline/DragAndDropHandler.js +0 -35
- package/dist/dist/components/Timeline/Resources.js +0 -53
- package/dist/dist/components/Timeline/Timeline.css +0 -616
- package/dist/dist/components/Timeline/Timeline.js +0 -309
- package/dist/dist/components/Timeline/TimelineContent.js +0 -446
- package/dist/dist/components/Timeline/TimelineEvents.js +0 -114
- package/dist/dist/components/Timeline/TimelineHeader.js +0 -43
- package/dist/dist/components/Timeline/TimelineMonthContainer.js +0 -29
- package/dist/dist/components/Timeline/TimelineResources.js +0 -16
- package/dist/dist/hooks/useDragAndDrop.js +0 -80
- package/dist/dist/hooks/useExtendEvent.js +0 -28
- package/public/dist/Timeline.js +0 -3277
- package/public/dist/dist/components/Timeline/DatePickerComponent.js +0 -17
- package/public/dist/dist/components/Timeline/EventTooltip.js +0 -206
- package/public/dist/dist/components/Timeline/Indicator.js +0 -29
- package/public/dist/dist/components/Timeline/MasterHeader.js +0 -68
- package/public/dist/dist/components/Timeline/ResourcesHeader.js +0 -14
- package/public/dist/dist/components/Timeline/Timeline.css +0 -616
- package/public/dist/dist/components/Timeline/Timeline.js +0 -304
- package/public/dist/dist/components/Timeline/TimelineCell.js +0 -8
- package/public/dist/dist/components/Timeline/TimelineContent.js +0 -447
- package/public/dist/dist/components/Timeline/TimelineHeader.js +0 -43
- package/public/dist/dist/hooks/useEventDragDrop.js +0 -126
- package/public/dist/dist/utils/HorizontalVirtualScroll.js +0 -0
- package/public/dist/dist/utils/dateUtils.js +0 -36
- package/public/dist/dist/utils/filterTimelineData.js +0 -21
- package/public/dist/dist/utils/timelineUtils.js +0 -40
- package/public/favicon.ico +0 -0
- package/public/index kutuphane /304/261c/304/261n.html" +0 -43
- package/public/index tasarim icin.html +0 -20
- package/public/index.html +0 -43
- package/public/logo192.png +0 -0
- package/public/logo512.png +0 -0
- package/public/manifest.json +0 -25
- package/public/robots.txt +0 -3
- package/src/App.css +0 -38
- package/src/App.test.js +0 -8
- package/src/dist/Timeline.js +0 -277
- package/src/index.css +0 -13
- package/src/logo.svg +0 -1
- package/src/reportWebVitals.js +0 -13
- package/src/setupTests.js +0 -5
- package/webpack.config.js +0 -49
- /package/dist/{dist/utils → utils}/HorizontalVirtualScroll.js +0 -0
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
|
|
3
|
-
const useEventDragDrop = (events, setEvents, setDropInfo) => {
|
|
4
|
-
const [draggingEvent, setDraggingEvent] = useState(null);
|
|
5
|
-
const [dragOffset, setDragOffset] = useState(0);
|
|
6
|
-
const [mode, setMode] = useState(null); // "drag" veya "extend"
|
|
7
|
-
|
|
8
|
-
const handleDragStart = (event, eventId) => {
|
|
9
|
-
if (mode === "extend") return; // Uzatma modundaysa taşıma işlemini başlatma
|
|
10
|
-
|
|
11
|
-
event.stopPropagation();
|
|
12
|
-
|
|
13
|
-
const eventElement = event.target;
|
|
14
|
-
const eventRect = eventElement.getBoundingClientRect();
|
|
15
|
-
const offset = event.clientX - eventRect.left;
|
|
16
|
-
|
|
17
|
-
setDraggingEvent(eventId);
|
|
18
|
-
setDragOffset(offset);
|
|
19
|
-
setMode("drag"); // Modu taşıma olarak ayarla
|
|
20
|
-
|
|
21
|
-
const draggedEvent = events.find((evt) => evt.id === eventId);
|
|
22
|
-
if (draggedEvent) {
|
|
23
|
-
console.log("Dragging Event Start:", draggedEvent.startDate);
|
|
24
|
-
console.log("Dragging Event End:", draggedEvent.endDate);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const handleExtendStart = (event, eventId) => {
|
|
29
|
-
event.stopPropagation();
|
|
30
|
-
|
|
31
|
-
setDraggingEvent(eventId);
|
|
32
|
-
setMode("extend"); // Modu uzatma olarak ayarla
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const handleDragOver = (event) => {
|
|
36
|
-
event.preventDefault();
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const handleDrop = (event, resourceId, targetDate) => {
|
|
40
|
-
event.preventDefault();
|
|
41
|
-
|
|
42
|
-
if (mode === "drag" && draggingEvent) {
|
|
43
|
-
const draggedEvent = events.find((evt) => evt.id === draggingEvent);
|
|
44
|
-
|
|
45
|
-
if (draggedEvent) {
|
|
46
|
-
const duration = draggedEvent.endDate - draggedEvent.startDate;
|
|
47
|
-
const cellWidth = event.target.offsetWidth || 30;
|
|
48
|
-
const offsetDays = Math.floor(dragOffset / cellWidth);
|
|
49
|
-
const newStartDate = new Date(targetDate.getTime() - offsetDays * 24 * 60 * 60 * 1000);
|
|
50
|
-
const newEndDate = new Date(newStartDate.getTime() + duration);
|
|
51
|
-
|
|
52
|
-
// Callback kontrolü ve loglama
|
|
53
|
-
if (setDropInfo) {
|
|
54
|
-
console.log("setDropInfo is being called with:", {
|
|
55
|
-
id: draggingEvent,
|
|
56
|
-
newResourceId: resourceId,
|
|
57
|
-
newStartDate,
|
|
58
|
-
newEndDate,
|
|
59
|
-
});
|
|
60
|
-
setDropInfo({
|
|
61
|
-
id: draggingEvent,
|
|
62
|
-
newResourceId: resourceId,
|
|
63
|
-
newStartDate,
|
|
64
|
-
newEndDate,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Event güncellemesi
|
|
69
|
-
setEvents((prevEvents) =>
|
|
70
|
-
prevEvents.map((evt) =>
|
|
71
|
-
evt.id === draggingEvent
|
|
72
|
-
? {
|
|
73
|
-
...evt,
|
|
74
|
-
resourceId,
|
|
75
|
-
startDate: newStartDate,
|
|
76
|
-
endDate: newEndDate,
|
|
77
|
-
}
|
|
78
|
-
: evt
|
|
79
|
-
)
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
setDraggingEvent(null);
|
|
85
|
-
setDragOffset(0);
|
|
86
|
-
setMode(null);
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const handleExtend = (event, eventId, newEndDate) => {
|
|
91
|
-
if (mode !== "extend" || draggingEvent !== eventId) return;
|
|
92
|
-
|
|
93
|
-
setEvents((prevEvents) =>
|
|
94
|
-
prevEvents.map((evt) =>
|
|
95
|
-
evt.id === eventId
|
|
96
|
-
? {
|
|
97
|
-
...evt,
|
|
98
|
-
endDate: newEndDate,
|
|
99
|
-
}
|
|
100
|
-
: evt
|
|
101
|
-
)
|
|
102
|
-
);
|
|
103
|
-
|
|
104
|
-
console.log("Extended Event ID:", eventId, "New End Date:", newEndDate);
|
|
105
|
-
|
|
106
|
-
setDraggingEvent(null);
|
|
107
|
-
setMode(null);
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
const handleDragEnd = () => {
|
|
111
|
-
setDraggingEvent(null);
|
|
112
|
-
setDragOffset(0);
|
|
113
|
-
setMode(null);
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
return {
|
|
117
|
-
handleDragStart,
|
|
118
|
-
handleExtendStart,
|
|
119
|
-
handleDragOver,
|
|
120
|
-
handleDrop,
|
|
121
|
-
handleExtend,
|
|
122
|
-
handleDragEnd,
|
|
123
|
-
};
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
export default useEventDragDrop;
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
const useEventDragDrop = (events, setEvents, setDropInfo) => {
|
|
4
|
+
const [draggingEvent, setDraggingEvent] = useState(null);
|
|
5
|
+
const [dragOffset, setDragOffset] = useState(0);
|
|
6
|
+
const [mode, setMode] = useState(null); // "drag" veya "extend"
|
|
7
|
+
|
|
8
|
+
const handleDragStart = (event, eventId) => {
|
|
9
|
+
if (mode === "extend") return; // Uzatma modundaysa taşıma işlemini başlatma
|
|
10
|
+
|
|
11
|
+
event.stopPropagation();
|
|
12
|
+
|
|
13
|
+
const eventElement = event.target;
|
|
14
|
+
const eventRect = eventElement.getBoundingClientRect();
|
|
15
|
+
const offset = event.clientX - eventRect.left;
|
|
16
|
+
|
|
17
|
+
setDraggingEvent(eventId);
|
|
18
|
+
setDragOffset(offset);
|
|
19
|
+
setMode("drag"); // Modu taşıma olarak ayarla
|
|
20
|
+
|
|
21
|
+
const draggedEvent = events.find((evt) => evt.id === eventId);
|
|
22
|
+
if (draggedEvent) {
|
|
23
|
+
console.log("Dragging Event Start:", draggedEvent.startDate);
|
|
24
|
+
console.log("Dragging Event End:", draggedEvent.endDate);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const handleExtendStart = (event, eventId) => {
|
|
29
|
+
event.stopPropagation();
|
|
30
|
+
|
|
31
|
+
setDraggingEvent(eventId);
|
|
32
|
+
setMode("extend"); // Modu uzatma olarak ayarla
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const handleDragOver = (event) => {
|
|
36
|
+
event.preventDefault();
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const handleDrop = (event, resourceId, targetDate) => {
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
|
|
42
|
+
if (mode === "drag" && draggingEvent) {
|
|
43
|
+
const draggedEvent = events.find((evt) => evt.id === draggingEvent);
|
|
44
|
+
|
|
45
|
+
if (draggedEvent) {
|
|
46
|
+
const duration = draggedEvent.endDate - draggedEvent.startDate;
|
|
47
|
+
const cellWidth = event.target.offsetWidth || 30;
|
|
48
|
+
const offsetDays = Math.floor(dragOffset / cellWidth);
|
|
49
|
+
const newStartDate = new Date(targetDate.getTime() - offsetDays * 24 * 60 * 60 * 1000);
|
|
50
|
+
const newEndDate = new Date(newStartDate.getTime() + duration);
|
|
51
|
+
|
|
52
|
+
// Callback kontrolü ve loglama
|
|
53
|
+
if (setDropInfo) {
|
|
54
|
+
console.log("setDropInfo is being called with:", {
|
|
55
|
+
id: draggingEvent,
|
|
56
|
+
newResourceId: resourceId,
|
|
57
|
+
newStartDate,
|
|
58
|
+
newEndDate,
|
|
59
|
+
});
|
|
60
|
+
setDropInfo({
|
|
61
|
+
id: draggingEvent,
|
|
62
|
+
newResourceId: resourceId,
|
|
63
|
+
newStartDate,
|
|
64
|
+
newEndDate,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Event güncellemesi
|
|
69
|
+
setEvents((prevEvents) =>
|
|
70
|
+
prevEvents.map((evt) =>
|
|
71
|
+
evt.id === draggingEvent
|
|
72
|
+
? {
|
|
73
|
+
...evt,
|
|
74
|
+
resourceId,
|
|
75
|
+
startDate: newStartDate,
|
|
76
|
+
endDate: newEndDate,
|
|
77
|
+
}
|
|
78
|
+
: evt
|
|
79
|
+
)
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
setDraggingEvent(null);
|
|
85
|
+
setDragOffset(0);
|
|
86
|
+
setMode(null);
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
const handleExtend = (event, eventId, newEndDate) => {
|
|
91
|
+
if (mode !== "extend" || draggingEvent !== eventId) return;
|
|
92
|
+
|
|
93
|
+
setEvents((prevEvents) =>
|
|
94
|
+
prevEvents.map((evt) =>
|
|
95
|
+
evt.id === eventId
|
|
96
|
+
? {
|
|
97
|
+
...evt,
|
|
98
|
+
endDate: newEndDate,
|
|
99
|
+
}
|
|
100
|
+
: evt
|
|
101
|
+
)
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
console.log("Extended Event ID:", eventId, "New End Date:", newEndDate);
|
|
105
|
+
|
|
106
|
+
setDraggingEvent(null);
|
|
107
|
+
setMode(null);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const handleDragEnd = () => {
|
|
111
|
+
setDraggingEvent(null);
|
|
112
|
+
setDragOffset(0);
|
|
113
|
+
setMode(null);
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
handleDragStart,
|
|
118
|
+
handleExtendStart,
|
|
119
|
+
handleDragOver,
|
|
120
|
+
handleDrop,
|
|
121
|
+
handleExtend,
|
|
122
|
+
handleDragEnd,
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export default useEventDragDrop;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { useState, useCallback, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Event management hook - handles selection, undo/redo, copy/paste
|
|
5
|
+
* @param {Array} initialEvents - Initial events array
|
|
6
|
+
* @param {Function} onEventsChange - Callback when events change
|
|
7
|
+
* @param {number} maxHistorySize - Maximum undo/redo history size
|
|
8
|
+
*/
|
|
9
|
+
const useEventManagement = (initialEvents = [], onEventsChange = null, maxHistorySize = 50) => {
|
|
10
|
+
const [events, setEvents] = useState(initialEvents);
|
|
11
|
+
const [selectedEvents, setSelectedEvents] = useState([]);
|
|
12
|
+
const [copiedEvents, setCopiedEvents] = useState([]);
|
|
13
|
+
|
|
14
|
+
// Undo/Redo history
|
|
15
|
+
const historyRef = useRef([]);
|
|
16
|
+
const historyIndexRef = useRef(-1);
|
|
17
|
+
const isUndoRedoRef = useRef(false);
|
|
18
|
+
|
|
19
|
+
// Update events and add to history
|
|
20
|
+
const updateEvents = useCallback((newEvents, addToHistory = true) => {
|
|
21
|
+
setEvents(newEvents);
|
|
22
|
+
|
|
23
|
+
if (onEventsChange) {
|
|
24
|
+
onEventsChange(newEvents);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Add to history (if not undo/redo operation)
|
|
28
|
+
if (addToHistory && !isUndoRedoRef.current) {
|
|
29
|
+
const history = historyRef.current;
|
|
30
|
+
const historyIndex = historyIndexRef.current;
|
|
31
|
+
|
|
32
|
+
// Remove any history after current index (if we're not at the end)
|
|
33
|
+
const newHistory = history.slice(0, historyIndex + 1);
|
|
34
|
+
|
|
35
|
+
// Add new state
|
|
36
|
+
newHistory.push([...newEvents]);
|
|
37
|
+
|
|
38
|
+
// Limit history size
|
|
39
|
+
if (newHistory.length > maxHistorySize) {
|
|
40
|
+
newHistory.shift();
|
|
41
|
+
} else {
|
|
42
|
+
historyIndexRef.current = newHistory.length - 1;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
historyRef.current = newHistory;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
isUndoRedoRef.current = false;
|
|
49
|
+
}, [onEventsChange, maxHistorySize]);
|
|
50
|
+
|
|
51
|
+
// Select event
|
|
52
|
+
const selectEvent = useCallback((eventId, multiSelect = false) => {
|
|
53
|
+
setSelectedEvents((prev) => {
|
|
54
|
+
if (multiSelect) {
|
|
55
|
+
// Toggle selection
|
|
56
|
+
if (prev.includes(eventId)) {
|
|
57
|
+
return prev.filter((id) => id !== eventId);
|
|
58
|
+
} else {
|
|
59
|
+
return [...prev, eventId];
|
|
60
|
+
}
|
|
61
|
+
} else {
|
|
62
|
+
// Single selection
|
|
63
|
+
return [eventId];
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}, []);
|
|
67
|
+
|
|
68
|
+
// Clear selection
|
|
69
|
+
const clearSelection = useCallback(() => {
|
|
70
|
+
setSelectedEvents([]);
|
|
71
|
+
}, []);
|
|
72
|
+
|
|
73
|
+
// Delete selected events
|
|
74
|
+
const deleteSelectedEvents = useCallback(() => {
|
|
75
|
+
if (selectedEvents.length === 0) return;
|
|
76
|
+
|
|
77
|
+
const newEvents = events.filter((event) => !selectedEvents.includes(event.id));
|
|
78
|
+
updateEvents(newEvents);
|
|
79
|
+
setSelectedEvents([]);
|
|
80
|
+
}, [events, selectedEvents, updateEvents]);
|
|
81
|
+
|
|
82
|
+
// Copy selected events
|
|
83
|
+
const copySelectedEvents = useCallback(() => {
|
|
84
|
+
if (selectedEvents.length === 0) return;
|
|
85
|
+
|
|
86
|
+
const eventsToCopy = events.filter((event) => selectedEvents.includes(event.id));
|
|
87
|
+
setCopiedEvents(eventsToCopy);
|
|
88
|
+
}, [events, selectedEvents]);
|
|
89
|
+
|
|
90
|
+
// Paste copied events
|
|
91
|
+
const pasteEvents = useCallback((targetDate = null, targetResourceId = null) => {
|
|
92
|
+
if (copiedEvents.length === 0) return;
|
|
93
|
+
|
|
94
|
+
const newEvents = [...events];
|
|
95
|
+
const baseDate = targetDate || new Date();
|
|
96
|
+
|
|
97
|
+
copiedEvents.forEach((event) => {
|
|
98
|
+
const newEvent = {
|
|
99
|
+
...event,
|
|
100
|
+
id: `${event.id}-copy-${Date.now()}-${Math.random()}`,
|
|
101
|
+
startDate: targetDate
|
|
102
|
+
? new Date(targetDate)
|
|
103
|
+
: new Date(event.startDate),
|
|
104
|
+
endDate: targetDate
|
|
105
|
+
? new Date(targetDate.getTime() + (new Date(event.endDate).getTime() - new Date(event.startDate).getTime()))
|
|
106
|
+
: new Date(event.endDate),
|
|
107
|
+
resourceId: targetResourceId || event.resourceId,
|
|
108
|
+
};
|
|
109
|
+
newEvents.push(newEvent);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
updateEvents(newEvents);
|
|
113
|
+
}, [events, copiedEvents, updateEvents]);
|
|
114
|
+
|
|
115
|
+
// Undo
|
|
116
|
+
const undo = useCallback(() => {
|
|
117
|
+
const history = historyRef.current;
|
|
118
|
+
const currentIndex = historyIndexRef.current;
|
|
119
|
+
|
|
120
|
+
if (currentIndex > 0) {
|
|
121
|
+
isUndoRedoRef.current = true;
|
|
122
|
+
historyIndexRef.current = currentIndex - 1;
|
|
123
|
+
const previousState = history[currentIndex - 1];
|
|
124
|
+
setEvents([...previousState]);
|
|
125
|
+
|
|
126
|
+
if (onEventsChange) {
|
|
127
|
+
onEventsChange([...previousState]);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}, [onEventsChange]);
|
|
131
|
+
|
|
132
|
+
// Redo
|
|
133
|
+
const redo = useCallback(() => {
|
|
134
|
+
const history = historyRef.current;
|
|
135
|
+
const currentIndex = historyIndexRef.current;
|
|
136
|
+
|
|
137
|
+
if (currentIndex < history.length - 1) {
|
|
138
|
+
isUndoRedoRef.current = true;
|
|
139
|
+
historyIndexRef.current = currentIndex + 1;
|
|
140
|
+
const nextState = history[currentIndex + 1];
|
|
141
|
+
setEvents([...nextState]);
|
|
142
|
+
|
|
143
|
+
if (onEventsChange) {
|
|
144
|
+
onEventsChange([...nextState]);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}, [onEventsChange]);
|
|
148
|
+
|
|
149
|
+
// Initialize history
|
|
150
|
+
if (historyRef.current.length === 0) {
|
|
151
|
+
historyRef.current = [[...events]];
|
|
152
|
+
historyIndexRef.current = 0;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
events,
|
|
157
|
+
setEvents: updateEvents,
|
|
158
|
+
selectedEvents,
|
|
159
|
+
selectEvent,
|
|
160
|
+
clearSelection,
|
|
161
|
+
deleteSelectedEvents,
|
|
162
|
+
copySelectedEvents,
|
|
163
|
+
pasteEvents,
|
|
164
|
+
copiedEvents,
|
|
165
|
+
undo,
|
|
166
|
+
redo,
|
|
167
|
+
canUndo: historyIndexRef.current > 0,
|
|
168
|
+
canRedo: historyIndexRef.current < historyRef.current.length - 1,
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
export default useEventManagement;
|
|
173
|
+
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// src/hooks/useEventSelection.js
|
|
2
|
+
|
|
3
|
+
import { useState, useCallback } from 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Event seçimi için hook
|
|
7
|
+
* @param {Array} events - Event listesi
|
|
8
|
+
* @returns {Object} - {selectedEvents, selectEvent, deselectEvent, toggleSelection, clearSelection, isSelected}
|
|
9
|
+
*/
|
|
10
|
+
export const useEventSelection = (events = []) => {
|
|
11
|
+
const [selectedEvents, setSelectedEvents] = useState([]);
|
|
12
|
+
|
|
13
|
+
const selectEvent = useCallback((eventId) => {
|
|
14
|
+
setSelectedEvents(prev => {
|
|
15
|
+
if (prev.includes(eventId)) {
|
|
16
|
+
return prev;
|
|
17
|
+
}
|
|
18
|
+
return [...prev, eventId];
|
|
19
|
+
});
|
|
20
|
+
}, []);
|
|
21
|
+
|
|
22
|
+
const deselectEvent = useCallback((eventId) => {
|
|
23
|
+
setSelectedEvents(prev => prev.filter(id => id !== eventId));
|
|
24
|
+
}, []);
|
|
25
|
+
|
|
26
|
+
const toggleSelection = useCallback((eventId) => {
|
|
27
|
+
setSelectedEvents(prev => {
|
|
28
|
+
if (prev.includes(eventId)) {
|
|
29
|
+
return prev.filter(id => id !== eventId);
|
|
30
|
+
}
|
|
31
|
+
return [...prev, eventId];
|
|
32
|
+
});
|
|
33
|
+
}, []);
|
|
34
|
+
|
|
35
|
+
const clearSelection = useCallback(() => {
|
|
36
|
+
setSelectedEvents([]);
|
|
37
|
+
}, []);
|
|
38
|
+
|
|
39
|
+
const selectRange = useCallback((startEventId, endEventId) => {
|
|
40
|
+
const startIndex = events.findIndex(e => e.id === startEventId);
|
|
41
|
+
const endIndex = events.findIndex(e => e.id === endEventId);
|
|
42
|
+
|
|
43
|
+
if (startIndex === -1 || endIndex === -1) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const minIndex = Math.min(startIndex, endIndex);
|
|
48
|
+
const maxIndex = Math.max(startIndex, endIndex);
|
|
49
|
+
const rangeEvents = events.slice(minIndex, maxIndex + 1).map(e => e.id);
|
|
50
|
+
|
|
51
|
+
setSelectedEvents(prev => {
|
|
52
|
+
const newSelection = [...prev];
|
|
53
|
+
rangeEvents.forEach(id => {
|
|
54
|
+
if (!newSelection.includes(id)) {
|
|
55
|
+
newSelection.push(id);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return newSelection;
|
|
59
|
+
});
|
|
60
|
+
}, [events]);
|
|
61
|
+
|
|
62
|
+
const isSelected = useCallback((eventId) => {
|
|
63
|
+
return selectedEvents.includes(eventId);
|
|
64
|
+
}, [selectedEvents]);
|
|
65
|
+
|
|
66
|
+
const selectAll = useCallback(() => {
|
|
67
|
+
setSelectedEvents(events.map(e => e.id));
|
|
68
|
+
}, [events]);
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
selectedEvents,
|
|
72
|
+
selectEvent,
|
|
73
|
+
deselectEvent,
|
|
74
|
+
toggleSelection,
|
|
75
|
+
clearSelection,
|
|
76
|
+
selectRange,
|
|
77
|
+
isSelected,
|
|
78
|
+
selectAll,
|
|
79
|
+
selectedCount: selectedEvents.length,
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { useCallback } from "react";
|
|
2
|
-
|
|
3
|
-
const useExtendEvent = (events, setEvents) => {
|
|
4
|
-
/**
|
|
5
|
-
* Etkinliği uzatmak veya kısaltmak için kullanılan işlev.
|
|
6
|
-
* @param {number} eventId - Güncellenmesi gereken etkinliğin ID'si.
|
|
7
|
-
* @param {Date} newEndDate - Etkinliğin yeni bitiş tarihi.
|
|
8
|
-
*/
|
|
9
|
-
const extendEvent = useCallback(
|
|
10
|
-
(eventId, newEndDate) => {
|
|
11
|
-
setEvents((prevEvents) =>
|
|
12
|
-
prevEvents.map((event) =>
|
|
13
|
-
event.id === eventId
|
|
14
|
-
? {
|
|
15
|
-
...event,
|
|
16
|
-
endDate: newEndDate, // Yeni bitiş tarihini günceller
|
|
17
|
-
}
|
|
18
|
-
: event // Diğer etkinlikler aynı kalır
|
|
19
|
-
)
|
|
20
|
-
);
|
|
21
|
-
},
|
|
22
|
-
[setEvents]
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
return { extendEvent };
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export default useExtendEvent;
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
|
|
3
|
+
const useExtendEvent = (events, setEvents) => {
|
|
4
|
+
/**
|
|
5
|
+
* Etkinliği uzatmak veya kısaltmak için kullanılan işlev.
|
|
6
|
+
* @param {number} eventId - Güncellenmesi gereken etkinliğin ID'si.
|
|
7
|
+
* @param {Date} newEndDate - Etkinliğin yeni bitiş tarihi.
|
|
8
|
+
*/
|
|
9
|
+
const extendEvent = useCallback(
|
|
10
|
+
(eventId, newEndDate) => {
|
|
11
|
+
setEvents((prevEvents) =>
|
|
12
|
+
prevEvents.map((event) =>
|
|
13
|
+
event.id === eventId
|
|
14
|
+
? {
|
|
15
|
+
...event,
|
|
16
|
+
endDate: newEndDate, // Yeni bitiş tarihini günceller
|
|
17
|
+
}
|
|
18
|
+
: event // Diğer etkinlikler aynı kalır
|
|
19
|
+
)
|
|
20
|
+
);
|
|
21
|
+
},
|
|
22
|
+
[setEvents]
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
return { extendEvent };
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default useExtendEvent;
|