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,114 +1,114 @@
|
|
|
1
|
-
// src/components/Timeline/TimelineEvents.js
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { isDateInRange, parseDate } from "../../utils/dateUtils";
|
|
4
|
-
|
|
5
|
-
const TimelineEvents = ({ date, events, resourceId, onDelete }) => {
|
|
6
|
-
// Gelen tüm props'ları kontrol et
|
|
7
|
-
console.log("TimelineEvents Props:", { date, events, resourceId, onDelete });
|
|
8
|
-
|
|
9
|
-
const dateToCompare = date?.fullDate;
|
|
10
|
-
|
|
11
|
-
if (!dateToCompare) {
|
|
12
|
-
console.error("Hata: date.fullDate değeri tanımlı değil.");
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if (!Array.isArray(events)) {
|
|
17
|
-
console.error("Hata: events bir dizi değil.", events);
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (!resourceId) {
|
|
22
|
-
console.error("Hata: resourceId değeri tanımlı değil.");
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Event'leri filtrele: Tarih aralığı ve resource eşleşmesi ile
|
|
27
|
-
const filteredEvents = events.filter((event) => {
|
|
28
|
-
const isMatch =
|
|
29
|
-
event.resourceId === resourceId &&
|
|
30
|
-
isDateInRange(dateToCompare, event.startDate, event.endDate);
|
|
31
|
-
console.log(
|
|
32
|
-
"Event Filtering:",
|
|
33
|
-
{
|
|
34
|
-
event,
|
|
35
|
-
dateToCompare,
|
|
36
|
-
isMatch,
|
|
37
|
-
resourceId,
|
|
38
|
-
startDate: event.startDate,
|
|
39
|
-
endDate: event.endDate,
|
|
40
|
-
}
|
|
41
|
-
);
|
|
42
|
-
return isMatch;
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
console.log("Filtered Events for Resource:", { resourceId, filteredEvents });
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<div style={{ position: "relative", height: "100%", width: "100%" }}>
|
|
49
|
-
{filteredEvents.map((event) => {
|
|
50
|
-
const eventStartDate = parseDate(event.startDate);
|
|
51
|
-
const eventEndDate = parseDate(event.endDate);
|
|
52
|
-
|
|
53
|
-
if (!eventStartDate || !eventEndDate) {
|
|
54
|
-
console.error("Hata: Etkinlik başlangıç veya bitiş tarihi hatalı.", {
|
|
55
|
-
event,
|
|
56
|
-
});
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const durationInDays = Math.floor(
|
|
61
|
-
(eventEndDate - eventStartDate) / (24 * 60 * 60 * 1000) + 1
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
return (
|
|
65
|
-
<div
|
|
66
|
-
key={event.id}
|
|
67
|
-
onClick={(e) => {
|
|
68
|
-
e.stopPropagation(); // Sürükleme işlemini engelle
|
|
69
|
-
if (window.confirm(`\"${event.title}\" etkinliğini silmek istiyor musun?`)) {
|
|
70
|
-
onDelete(event.id);
|
|
71
|
-
}
|
|
72
|
-
}}
|
|
73
|
-
style={{
|
|
74
|
-
position: "absolute",
|
|
75
|
-
top: "5px", // Üstten biraz boşluk
|
|
76
|
-
left: "5px", // Soldan biraz boşluk
|
|
77
|
-
width: `calc(${durationInDays * 100}% - 10px)`, // Sağdan ve soldan 5px boşluk için 10px çıkarıldı
|
|
78
|
-
height: `calc(100% - 10px)`, // Alttan ve üstten 5px boşluk için 10px çıkarıldı
|
|
79
|
-
backgroundColor: event.color,
|
|
80
|
-
color: "#fff",
|
|
81
|
-
fontSize: "14px",
|
|
82
|
-
padding: "5px 10px",
|
|
83
|
-
borderRadius: "6px",
|
|
84
|
-
textAlign: "left",
|
|
85
|
-
display: "flex",
|
|
86
|
-
alignItems: "center",
|
|
87
|
-
boxSizing: "border-box",
|
|
88
|
-
zIndex: 10,
|
|
89
|
-
overflow: "hidden",
|
|
90
|
-
textOverflow: "ellipsis",
|
|
91
|
-
whiteSpace: "nowrap",
|
|
92
|
-
border: "1px solid #fff",
|
|
93
|
-
cursor: "pointer",
|
|
94
|
-
boxShadow: "0 2px 6px rgba(0, 0, 0, 0.15)",
|
|
95
|
-
transition: "transform 0.2s ease, box-shadow 0.2s ease",
|
|
96
|
-
}}
|
|
97
|
-
onMouseOver={(e) => {
|
|
98
|
-
e.currentTarget.style.transform = "scale(1.02)";
|
|
99
|
-
e.currentTarget.style.boxShadow = "0 4px 12px rgba(0, 0, 0, 0.3)";
|
|
100
|
-
}}
|
|
101
|
-
onMouseOut={(e) => {
|
|
102
|
-
e.currentTarget.style.transform = "scale(1)";
|
|
103
|
-
e.currentTarget.style.boxShadow = "0 2px 6px rgba(0, 0, 0, 0.15)";
|
|
104
|
-
}}
|
|
105
|
-
>
|
|
106
|
-
{event.title}
|
|
107
|
-
</div>
|
|
108
|
-
);
|
|
109
|
-
})}
|
|
110
|
-
</div>
|
|
111
|
-
);
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
export default TimelineEvents;
|
|
1
|
+
// src/components/Timeline/TimelineEvents.js
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { isDateInRange, parseDate } from "../../utils/dateUtils";
|
|
4
|
+
|
|
5
|
+
const TimelineEvents = ({ date, events, resourceId, onDelete }) => {
|
|
6
|
+
// Gelen tüm props'ları kontrol et
|
|
7
|
+
console.log("TimelineEvents Props:", { date, events, resourceId, onDelete });
|
|
8
|
+
|
|
9
|
+
const dateToCompare = date?.fullDate;
|
|
10
|
+
|
|
11
|
+
if (!dateToCompare) {
|
|
12
|
+
console.error("Hata: date.fullDate değeri tanımlı değil.");
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (!Array.isArray(events)) {
|
|
17
|
+
console.error("Hata: events bir dizi değil.", events);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!resourceId) {
|
|
22
|
+
console.error("Hata: resourceId değeri tanımlı değil.");
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Event'leri filtrele: Tarih aralığı ve resource eşleşmesi ile
|
|
27
|
+
const filteredEvents = events.filter((event) => {
|
|
28
|
+
const isMatch =
|
|
29
|
+
event.resourceId === resourceId &&
|
|
30
|
+
isDateInRange(dateToCompare, event.startDate, event.endDate);
|
|
31
|
+
console.log(
|
|
32
|
+
"Event Filtering:",
|
|
33
|
+
{
|
|
34
|
+
event,
|
|
35
|
+
dateToCompare,
|
|
36
|
+
isMatch,
|
|
37
|
+
resourceId,
|
|
38
|
+
startDate: event.startDate,
|
|
39
|
+
endDate: event.endDate,
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
return isMatch;
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
console.log("Filtered Events for Resource:", { resourceId, filteredEvents });
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<div style={{ position: "relative", height: "100%", width: "100%" }}>
|
|
49
|
+
{filteredEvents.map((event) => {
|
|
50
|
+
const eventStartDate = parseDate(event.startDate);
|
|
51
|
+
const eventEndDate = parseDate(event.endDate);
|
|
52
|
+
|
|
53
|
+
if (!eventStartDate || !eventEndDate) {
|
|
54
|
+
console.error("Hata: Etkinlik başlangıç veya bitiş tarihi hatalı.", {
|
|
55
|
+
event,
|
|
56
|
+
});
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const durationInDays = Math.floor(
|
|
61
|
+
(eventEndDate - eventStartDate) / (24 * 60 * 60 * 1000) + 1
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<div
|
|
66
|
+
key={event.id}
|
|
67
|
+
onClick={(e) => {
|
|
68
|
+
e.stopPropagation(); // Sürükleme işlemini engelle
|
|
69
|
+
if (window.confirm(`\"${event.title}\" etkinliğini silmek istiyor musun?`)) {
|
|
70
|
+
onDelete(event.id);
|
|
71
|
+
}
|
|
72
|
+
}}
|
|
73
|
+
style={{
|
|
74
|
+
position: "absolute",
|
|
75
|
+
top: "5px", // Üstten biraz boşluk
|
|
76
|
+
left: "5px", // Soldan biraz boşluk
|
|
77
|
+
width: `calc(${durationInDays * 100}% - 10px)`, // Sağdan ve soldan 5px boşluk için 10px çıkarıldı
|
|
78
|
+
height: `calc(100% - 10px)`, // Alttan ve üstten 5px boşluk için 10px çıkarıldı
|
|
79
|
+
backgroundColor: event.color,
|
|
80
|
+
color: "#fff",
|
|
81
|
+
fontSize: "14px",
|
|
82
|
+
padding: "5px 10px",
|
|
83
|
+
borderRadius: "6px",
|
|
84
|
+
textAlign: "left",
|
|
85
|
+
display: "flex",
|
|
86
|
+
alignItems: "center",
|
|
87
|
+
boxSizing: "border-box",
|
|
88
|
+
zIndex: 10,
|
|
89
|
+
overflow: "hidden",
|
|
90
|
+
textOverflow: "ellipsis",
|
|
91
|
+
whiteSpace: "nowrap",
|
|
92
|
+
border: "1px solid #fff",
|
|
93
|
+
cursor: "pointer",
|
|
94
|
+
boxShadow: "0 2px 6px rgba(0, 0, 0, 0.15)",
|
|
95
|
+
transition: "transform 0.2s ease, box-shadow 0.2s ease",
|
|
96
|
+
}}
|
|
97
|
+
onMouseOver={(e) => {
|
|
98
|
+
e.currentTarget.style.transform = "scale(1.02)";
|
|
99
|
+
e.currentTarget.style.boxShadow = "0 4px 12px rgba(0, 0, 0, 0.3)";
|
|
100
|
+
}}
|
|
101
|
+
onMouseOut={(e) => {
|
|
102
|
+
e.currentTarget.style.transform = "scale(1)";
|
|
103
|
+
e.currentTarget.style.boxShadow = "0 2px 6px rgba(0, 0, 0, 0.15)";
|
|
104
|
+
}}
|
|
105
|
+
>
|
|
106
|
+
{event.title}
|
|
107
|
+
</div>
|
|
108
|
+
);
|
|
109
|
+
})}
|
|
110
|
+
</div>
|
|
111
|
+
);
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export default TimelineEvents;
|
|
@@ -1,43 +1,54 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import "./Timeline.css"; // CSS dosyasını import etmeyi unutma
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "./Timeline.css"; // CSS dosyasını import etmeyi unutma
|
|
3
|
+
import { parseDate } from "../../utils/dateUtils";
|
|
4
|
+
|
|
5
|
+
const TimelineHeader = ({ dates, monthHeaders, highlightWeekends = false }) => {
|
|
6
|
+
return (
|
|
7
|
+
<div className="timeline-header-container">
|
|
8
|
+
{/* Ay ve Yıl Başlıkları */}
|
|
9
|
+
<div className="timeline-header-month-row">
|
|
10
|
+
{monthHeaders.map((monthHeader, index) => (
|
|
11
|
+
<div
|
|
12
|
+
key={index}
|
|
13
|
+
className="timeline-header-month-cell"
|
|
14
|
+
style={{
|
|
15
|
+
flex: monthHeader.endIndex - monthHeader.startIndex + 1,
|
|
16
|
+
borderRight:
|
|
17
|
+
index < monthHeaders.length - 1 ? "1px solid var(--border-color)" : "none",
|
|
18
|
+
}}
|
|
19
|
+
>
|
|
20
|
+
{monthHeader.monthName} {monthHeader.year}
|
|
21
|
+
</div>
|
|
22
|
+
))}
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
{/* Günlük Hücreler */}
|
|
26
|
+
<div className="timeline-header-day-row">
|
|
27
|
+
{dates.map((date, index) => {
|
|
28
|
+
// Hafta sonu kontrolü
|
|
29
|
+
let isWeekend = false;
|
|
30
|
+
if (highlightWeekends) {
|
|
31
|
+
const cellDate = parseDate(date.fullDate);
|
|
32
|
+
const dayOfWeek = cellDate.getDay(); // 0 = Pazar, 6 = Cumartesi
|
|
33
|
+
isWeekend = dayOfWeek === 0 || dayOfWeek === 6;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<div
|
|
38
|
+
key={index}
|
|
39
|
+
className={`timeline-header-day-cell ${isWeekend ? "timeline-header-day-weekend" : ""}`}
|
|
40
|
+
style={{
|
|
41
|
+
flex: 1,
|
|
42
|
+
borderRight: index < dates.length - 1 ? "1px solid var(--border-color)" : "none",
|
|
43
|
+
}}
|
|
44
|
+
>
|
|
45
|
+
{date.display}
|
|
46
|
+
</div>
|
|
47
|
+
);
|
|
48
|
+
})}
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export default TimelineHeader;
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import TimelineHeader from "./TimelineHeader";
|
|
3
|
-
import TimelineContent from "./TimelineContent";
|
|
4
|
-
|
|
5
|
-
const TimelineMonthContainer = ({
|
|
6
|
-
dates,
|
|
7
|
-
month,
|
|
8
|
-
groupedResources,
|
|
9
|
-
collapsedGroups,
|
|
10
|
-
toggleGroupCollapse,
|
|
11
|
-
}) => {
|
|
12
|
-
return (
|
|
13
|
-
<div style={{ display: "flex", flexDirection: "column", width: "100%" }}>
|
|
14
|
-
{/* Timeline Header */}
|
|
15
|
-
<TimelineHeader dates={dates} monthHeaders={[{ month, startIndex: 0, endIndex: dates.length - 1 }]} />
|
|
16
|
-
|
|
17
|
-
{/* Timeline Content */}
|
|
18
|
-
<div style={{ display: "flex" }}>
|
|
19
|
-
<TimelineContent
|
|
20
|
-
groupedResources={groupedResources}
|
|
21
|
-
dates={dates}
|
|
22
|
-
collapsedGroups={collapsedGroups}
|
|
23
|
-
/>
|
|
24
|
-
</div>
|
|
25
|
-
</div>
|
|
26
|
-
);
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export default TimelineMonthContainer;
|
|
1
|
+
import React from "react";
|
|
2
|
+
import TimelineHeader from "./TimelineHeader";
|
|
3
|
+
import TimelineContent from "./TimelineContent";
|
|
4
|
+
|
|
5
|
+
const TimelineMonthContainer = ({
|
|
6
|
+
dates,
|
|
7
|
+
month,
|
|
8
|
+
groupedResources,
|
|
9
|
+
collapsedGroups,
|
|
10
|
+
toggleGroupCollapse,
|
|
11
|
+
}) => {
|
|
12
|
+
return (
|
|
13
|
+
<div style={{ display: "flex", flexDirection: "column", width: "100%" }}>
|
|
14
|
+
{/* Timeline Header */}
|
|
15
|
+
<TimelineHeader dates={dates} monthHeaders={[{ month, startIndex: 0, endIndex: dates.length - 1 }]} />
|
|
16
|
+
|
|
17
|
+
{/* Timeline Content */}
|
|
18
|
+
<div style={{ display: "flex" }}>
|
|
19
|
+
<TimelineContent
|
|
20
|
+
groupedResources={groupedResources}
|
|
21
|
+
dates={dates}
|
|
22
|
+
collapsedGroups={collapsedGroups}
|
|
23
|
+
/>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default TimelineMonthContainer;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import './Timeline.css';
|
|
3
|
-
|
|
4
|
-
const TimelineResources = ({ resources }) => {
|
|
5
|
-
return (
|
|
6
|
-
<div className="timeline-resources">
|
|
7
|
-
{resources.map((resource, index) => (
|
|
8
|
-
<div key={index} className="resource-cell">
|
|
9
|
-
{resource}
|
|
10
|
-
</div>
|
|
11
|
-
))}
|
|
12
|
-
</div>
|
|
13
|
-
);
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export default TimelineResources;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './Timeline.css';
|
|
3
|
+
|
|
4
|
+
const TimelineResources = ({ resources }) => {
|
|
5
|
+
return (
|
|
6
|
+
<div className="timeline-resources">
|
|
7
|
+
{resources.map((resource, index) => (
|
|
8
|
+
<div key={index} className="resource-cell">
|
|
9
|
+
{resource}
|
|
10
|
+
</div>
|
|
11
|
+
))}
|
|
12
|
+
</div>
|
|
13
|
+
);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default TimelineResources;
|
package/src/demo.css
ADDED
|
@@ -1,80 +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;
|
|
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;
|