akfatimeline 1.0.4 → 1.0.6
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/dist/Timeline.js +1097 -112
- package/dist/dist/components/Timeline/DatePickerComponent.js +17 -0
- package/dist/dist/components/Timeline/EventTooltip.js +1 -1
- package/dist/dist/components/Timeline/Indicator.js +0 -4
- package/dist/dist/components/Timeline/MasterHeader.js +36 -23
- package/dist/dist/components/Timeline/Timeline.css +90 -8
- package/dist/dist/components/Timeline/Timeline.js +79 -47
- package/dist/dist/components/Timeline/TimelineContent.js +154 -130
- package/dist/dist/hooks/useEventDragDrop.js +22 -16
- package/package.json +1 -1
- package/public/dist/Timeline.js +3277 -0
- package/public/dist/dist/components/Timeline/DatePickerComponent.js +17 -0
- package/public/dist/dist/components/Timeline/DragAndDropHandler.js +35 -0
- package/public/dist/dist/components/Timeline/EventTooltip.js +206 -0
- package/public/dist/dist/components/Timeline/Indicator.js +29 -0
- package/public/dist/dist/components/Timeline/MasterHeader.js +68 -0
- package/public/dist/dist/components/Timeline/Resources.js +53 -0
- package/public/dist/dist/components/Timeline/ResourcesHeader.js +14 -0
- package/public/dist/dist/components/Timeline/Timeline.css +616 -0
- package/public/dist/dist/components/Timeline/Timeline.js +304 -0
- package/public/dist/dist/components/Timeline/TimelineCell.js +8 -0
- package/public/dist/dist/components/Timeline/TimelineContent.js +447 -0
- package/public/dist/dist/components/Timeline/TimelineEvents.js +114 -0
- package/public/dist/dist/components/Timeline/TimelineHeader.js +43 -0
- package/public/dist/dist/components/Timeline/TimelineMonthContainer.js +29 -0
- package/public/dist/dist/components/Timeline/TimelineResources.js +16 -0
- package/public/dist/dist/hooks/useDragAndDrop.js +80 -0
- package/public/dist/dist/hooks/useEventDragDrop.js +126 -0
- package/public/dist/dist/hooks/useExtendEvent.js +28 -0
- package/public/dist/dist/utils/HorizontalVirtualScroll.js +0 -0
- package/public/dist/dist/utils/dateUtils.js +36 -0
- package/public/dist/dist/utils/filterTimelineData.js +21 -0
- package/public/dist/dist/utils/timelineUtils.js +40 -0
- package/src/App.js +3 -1
- package/src/components/Timeline/Indicator.js +0 -3
- package/src/components/Timeline/Timeline.js +16 -11
- package/src/components/Timeline/TimelineContent.js +0 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// src/hooks/useDragAndDrop.js
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { parseDate } from "../utils/dateUtils"; // Named import
|
|
4
|
+
|
|
5
|
+
const useDragAndDrop = (initialEvents = []) => {
|
|
6
|
+
const [isDragging, setIsDragging] = useState(false);
|
|
7
|
+
const [dragStart, setDragStart] = useState(null);
|
|
8
|
+
const [dragEnd, setDragEnd] = useState(null);
|
|
9
|
+
const [events, setEvents] = useState(initialEvents);
|
|
10
|
+
|
|
11
|
+
// Sürükleme başlat
|
|
12
|
+
const startDrag = (resourceId, date) => {
|
|
13
|
+
setIsDragging(true);
|
|
14
|
+
setDragStart({ resourceId, date });
|
|
15
|
+
setDragEnd({ resourceId, date });
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// Sürükleme hareketi
|
|
19
|
+
const updateDrag = (resourceId, date) => {
|
|
20
|
+
if (!isDragging) return;
|
|
21
|
+
setDragEnd({ resourceId, date });
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// Sürükleme bitişi
|
|
25
|
+
const endDrag = (dates) => {
|
|
26
|
+
if (!isDragging || !dragStart || !dragEnd) return;
|
|
27
|
+
if (dragStart.resourceId !== dragEnd.resourceId) {
|
|
28
|
+
resetDrag();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const startDateIndex = dates.findIndex(
|
|
33
|
+
(d) => parseDate(d.fullDate).toDateString() === parseDate(dragStart.date.fullDate).toDateString()
|
|
34
|
+
);
|
|
35
|
+
const endDateIndex = dates.findIndex(
|
|
36
|
+
(d) => parseDate(d.fullDate).toDateString() === parseDate(dragEnd.date.fullDate).toDateString()
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
if (startDateIndex === -1 || endDateIndex === -1) {
|
|
40
|
+
resetDrag();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const sortedStartIndex = Math.min(startDateIndex, endDateIndex);
|
|
45
|
+
const sortedEndIndex = Math.max(startDateIndex, endDateIndex);
|
|
46
|
+
const startDate = dates[sortedStartIndex].fullDate;
|
|
47
|
+
const endDate = dates[sortedEndIndex].fullDate;
|
|
48
|
+
|
|
49
|
+
const newEvent = {
|
|
50
|
+
id: Date.now(),
|
|
51
|
+
title: "Yeni Etkinlik",
|
|
52
|
+
resourceId: dragStart.resourceId,
|
|
53
|
+
startDate: startDate,
|
|
54
|
+
endDate: endDate,
|
|
55
|
+
color: "#ff7f50",
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
setEvents((prev) => [...prev, newEvent]);
|
|
59
|
+
resetDrag();
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const resetDrag = () => {
|
|
63
|
+
setIsDragging(false);
|
|
64
|
+
setDragStart(null);
|
|
65
|
+
setDragEnd(null);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
events,
|
|
70
|
+
isDragging,
|
|
71
|
+
dragStart,
|
|
72
|
+
dragEnd,
|
|
73
|
+
startDrag,
|
|
74
|
+
updateDrag,
|
|
75
|
+
endDrag,
|
|
76
|
+
setEvents,
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export default useDragAndDrop;
|
|
@@ -0,0 +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;
|
|
@@ -0,0 +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;
|
|
File without changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// src/utils/dateUtils.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* "dd/mm/yyyy" formatındaki bir tarih string'ini Date objesine dönüştürür.
|
|
5
|
+
* Eğer dateInput bir string değilse, direkt Date objesini döndürür.
|
|
6
|
+
* @param {string | Object | Date} dateInput - "dd/mm/yyyy" formatında tarih stringi veya {fullDate: Date, display: string} objesi veya Date objesi.
|
|
7
|
+
* @returns {Date} - Date objesi.
|
|
8
|
+
*/
|
|
9
|
+
export const parseDate = (dateInput) => {
|
|
10
|
+
if (dateInput instanceof Date) {
|
|
11
|
+
return dateInput;
|
|
12
|
+
}
|
|
13
|
+
if (typeof dateInput === 'string') {
|
|
14
|
+
const [day, month, year] = dateInput.split("/").map(Number);
|
|
15
|
+
return new Date(year, month - 1, day);
|
|
16
|
+
} else if (typeof dateInput === 'object' && dateInput.fullDate instanceof Date) {
|
|
17
|
+
return new Date(dateInput.fullDate.getTime() + dateInput.fullDate.getTimezoneOffset() * 60000);
|
|
18
|
+
} else {
|
|
19
|
+
console.error("parseDate received invalid input:", dateInput);
|
|
20
|
+
return new Date(); // veya hata fırlat
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Bir tarihin belirli bir aralık içinde olup olmadığını kontrol eder.
|
|
26
|
+
* @param {string | Object | Date} date - "dd/mm/yyyy" formatında tarih stringi, {fullDate: Date, display: string} objesi veya Date objesi.
|
|
27
|
+
* @param {string | Object | Date} startDate - "dd/mm/yyyy" formatında başlangıç tarihi stringi, {fullDate: Date, display: string} objesi veya Date objesi.
|
|
28
|
+
* @param {string | Object | Date} endDate - "dd/mm/yyyy" formatında bitiş tarihi stringi, {fullDate: Date, display: string} objesi veya Date objesi.
|
|
29
|
+
* @returns {boolean} - Tarih aralık içinde ise true, değilse false.
|
|
30
|
+
*/
|
|
31
|
+
export const isDateInRange = (date, startDate, endDate) => {
|
|
32
|
+
const d = parseDate(date);
|
|
33
|
+
const start = parseDate(startDate);
|
|
34
|
+
const end = parseDate(endDate);
|
|
35
|
+
return d >= start && d <= end;
|
|
36
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const filterTimelineData = (dates, startDate, dayCount) => {
|
|
2
|
+
const startIndex = dates.findIndex(
|
|
3
|
+
(date) => date.fullDate.toISOString().split("T")[0] === startDate
|
|
4
|
+
);
|
|
5
|
+
|
|
6
|
+
if (startIndex === -1) {
|
|
7
|
+
console.warn("Seçilen başlangıç tarihi bulunamadı.");
|
|
8
|
+
return { filteredDates: [] };
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const filteredDates = dates.slice(startIndex, startIndex + dayCount);
|
|
12
|
+
|
|
13
|
+
return {
|
|
14
|
+
filteredDates,
|
|
15
|
+
startIndex,
|
|
16
|
+
endIndex: startIndex + dayCount - 1,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default filterTimelineData;
|
|
21
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// src/utils/timelineUtils.js
|
|
2
|
+
|
|
3
|
+
export const generateTimelineData = (startYear, endYear) => {
|
|
4
|
+
const dayNames = ["Paz", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt"];
|
|
5
|
+
const monthNames = [
|
|
6
|
+
"Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran",
|
|
7
|
+
"Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık",
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
const dates = [];
|
|
11
|
+
const monthHeaders = [];
|
|
12
|
+
|
|
13
|
+
for (let year = startYear; year <= endYear; year++) {
|
|
14
|
+
for (let month = 1; month <= 12; month++) {
|
|
15
|
+
const daysInMonth = new Date(year, month, 0).getDate();
|
|
16
|
+
const startIndex = dates.length;
|
|
17
|
+
|
|
18
|
+
for (let day = 1; day <= daysInMonth; day++) {
|
|
19
|
+
const date = new Date(year, month - 1, day);
|
|
20
|
+
const dayName = dayNames[date.getDay()];
|
|
21
|
+
dates.push({
|
|
22
|
+
fullDate: date,
|
|
23
|
+
display: `${day} ${dayName}`,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const endIndex = dates.length - 1;
|
|
28
|
+
monthHeaders.push({
|
|
29
|
+
monthName: monthNames[month - 1],
|
|
30
|
+
year,
|
|
31
|
+
startIndex,
|
|
32
|
+
endIndex,
|
|
33
|
+
totalDays: endIndex - startIndex + 1,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return { dates, monthHeaders };
|
|
39
|
+
};
|
|
40
|
+
|
package/src/App.js
CHANGED
|
@@ -3,7 +3,7 @@ import Timeline from "./components/Timeline/Timeline";
|
|
|
3
3
|
import EventTooltip from "./components/Timeline/EventTooltip"; // Tooltip bileşenini import ediyoruz
|
|
4
4
|
|
|
5
5
|
const App = () => {
|
|
6
|
-
const programDate = "2025-01-
|
|
6
|
+
const programDate = "2025-01-08";
|
|
7
7
|
|
|
8
8
|
const events = [
|
|
9
9
|
{
|
|
@@ -200,6 +200,8 @@ const resources = [
|
|
|
200
200
|
setDropInfo={handleDropInfo} // Callback'i buradan bağlıyoruz
|
|
201
201
|
onExtendInfo={handleExtendInfo} // Uzatma bilgisi
|
|
202
202
|
onCreateEventInfo={handleCreateEventInfo} // Yeni etkinlik bilgisi
|
|
203
|
+
indicatorDate="2025-01-09" // İstediğiniz tarihi gönderin
|
|
204
|
+
|
|
203
205
|
/>
|
|
204
206
|
</div>
|
|
205
207
|
);
|
|
@@ -2,12 +2,9 @@ import React from "react";
|
|
|
2
2
|
|
|
3
3
|
const Indicator = ({ todayIndex, totalDays }) => {
|
|
4
4
|
if (todayIndex < 0 || todayIndex >= totalDays) {
|
|
5
|
-
console.log("Indicator not visible: Out of bounds");
|
|
6
5
|
return null; // Bugün timeline dışında ise çizgiyi gösterme
|
|
7
6
|
}
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
8
|
return (
|
|
12
9
|
<div
|
|
13
10
|
style={{
|
|
@@ -44,8 +44,8 @@ const Timeline = ({
|
|
|
44
44
|
tooltipComponent: TooltipComponent, // Özelleştirilebilir Tooltip bileşeni
|
|
45
45
|
tempEventStyle = {},
|
|
46
46
|
eventStyleResolver = () => ({}),
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
indicatorDate = new Date(),
|
|
48
|
+
onToday,
|
|
49
49
|
onAdvance,
|
|
50
50
|
onRetreat,
|
|
51
51
|
onMonthAdvance,
|
|
@@ -125,10 +125,15 @@ const Timeline = ({
|
|
|
125
125
|
const filteredDates =
|
|
126
126
|
startIndex !== -1 ? dates.slice(startIndex, Math.min(endIndex, dates.length)) : [];
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
128
|
+
const today = programDate ? new Date(programDate) : new Date();
|
|
129
|
+
today.setDate(today.getDate() - 3);
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
const todayIndex = filteredDates.findIndex(
|
|
134
|
+
(d) => new Date(d.fullDate).toDateString() === new Date(indicatorDate).toDateString()
|
|
135
|
+
);
|
|
136
|
+
|
|
132
137
|
const totalDays = filteredDates.length;
|
|
133
138
|
|
|
134
139
|
// ---------------------------------------------------------
|
|
@@ -152,11 +157,12 @@ const Timeline = ({
|
|
|
152
157
|
};
|
|
153
158
|
|
|
154
159
|
const handleToday = () => {
|
|
155
|
-
const today = new Date();
|
|
156
|
-
today.setDate(today.getDate() - 3); //
|
|
160
|
+
const today = programDate ? new Date(programDate) : new Date();
|
|
161
|
+
today.setDate(today.getDate() - 3); // Program tarihinden 3 gün öncesini ayarla
|
|
157
162
|
setSelectedDate(today);
|
|
158
163
|
};
|
|
159
164
|
|
|
165
|
+
|
|
160
166
|
|
|
161
167
|
const handleAdvance = () => {
|
|
162
168
|
setSelectedDate((prev) => new Date(prev.getTime() + 5 * 24 * 60 * 60 * 1000));
|
|
@@ -262,9 +268,8 @@ const Timeline = ({
|
|
|
262
268
|
events={localEvents}
|
|
263
269
|
setEvents={setLocalEvents}
|
|
264
270
|
onEventClick={onEventClick}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
)}
|
|
271
|
+
|
|
272
|
+
todayIndex={todayIndex}
|
|
268
273
|
indicatorOn={indicatorOn}
|
|
269
274
|
resourceSettings={resourceSettings}
|
|
270
275
|
toggleGroupCollapse={toggleGroupCollapse}
|
|
@@ -202,7 +202,6 @@ const TimelineContent = ({
|
|
|
202
202
|
const newEndDate = new Date((originalEndDate ?? new Date()).getTime());
|
|
203
203
|
newEndDate.setDate(newEndDate.getDate() + daysToAdd);
|
|
204
204
|
|
|
205
|
-
console.log(">>> Extending ID:", extendingEvent.id, "=>", newEndDate);
|
|
206
205
|
|
|
207
206
|
setEvents((prev) =>
|
|
208
207
|
prev.map((evt) => (evt.id === extendingEvent.id ? { ...evt, endDate: newEndDate } : evt))
|