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.
Files changed (128) hide show
  1. package/CHANGELOG.md +98 -35
  2. package/dist/Timeline.js +4309 -1677
  3. package/dist/components/Timeline/AutocompleteSelect.js +150 -0
  4. package/dist/components/Timeline/ContextMenu.js +149 -0
  5. package/dist/components/Timeline/DailyView.js +255 -0
  6. package/dist/components/Timeline/DatePickerComponent.js +13 -0
  7. package/{public/dist/dist → dist}/components/Timeline/DragAndDropHandler.js +34 -34
  8. package/dist/components/Timeline/EventBadge.js +26 -0
  9. package/dist/components/Timeline/EventDetailModal.js +138 -0
  10. package/dist/components/Timeline/EventIcon.js +47 -0
  11. package/dist/{dist/components → components}/Timeline/EventTooltip.js +206 -206
  12. package/dist/components/Timeline/FilterPanel.js +179 -0
  13. package/dist/{dist/components → components}/Timeline/Indicator.js +26 -26
  14. package/dist/components/Timeline/LoadingSpinner.js +48 -0
  15. package/dist/{dist/components → components}/Timeline/MasterHeader.js +104 -68
  16. package/{public/dist/dist → dist}/components/Timeline/Resources.js +53 -53
  17. package/dist/{dist/components → components}/Timeline/ResourcesHeader.js +14 -14
  18. package/dist/components/Timeline/Timeline.css +2491 -0
  19. package/dist/components/Timeline/Timeline.js +607 -0
  20. package/dist/{dist/components → components}/Timeline/TimelineCell.js +8 -8
  21. package/dist/components/Timeline/TimelineContent.js +838 -0
  22. package/{public/dist/dist → dist}/components/Timeline/TimelineEvents.js +114 -114
  23. package/dist/components/Timeline/TimelineHeader.js +54 -0
  24. package/{public/dist/dist → dist}/components/Timeline/TimelineMonthContainer.js +29 -29
  25. package/{public/dist/dist → dist}/components/Timeline/TimelineResources.js +16 -16
  26. package/{public/dist/dist → dist}/hooks/useDragAndDrop.js +80 -80
  27. package/dist/{dist/hooks → hooks}/useEventDragDrop.js +126 -126
  28. package/dist/hooks/useEventManagement.js +173 -0
  29. package/dist/hooks/useEventSelection.js +82 -0
  30. package/{public/dist/dist → dist}/hooks/useExtendEvent.js +28 -28
  31. package/dist/hooks/useKeyboardShortcuts.js +158 -0
  32. package/dist/hooks/useTouchGestures.js +90 -0
  33. package/dist/utils/conflictUtils.js +105 -0
  34. package/dist/{dist/utils → utils}/dateUtils.js +36 -36
  35. package/dist/{dist/utils → utils}/filterTimelineData.js +20 -20
  36. package/dist/utils/filterUtils.js +106 -0
  37. package/dist/utils/timeUtils.js +179 -0
  38. package/dist/{dist/utils → utils}/timelineUtils.js +39 -39
  39. package/dist/utils/viewModeUtils.js +54 -0
  40. package/package.json +89 -19
  41. package/src/App.js +300 -19
  42. package/src/components/Timeline/AutocompleteSelect.js +150 -0
  43. package/src/components/Timeline/ContextMenu.js +149 -0
  44. package/src/components/Timeline/DailyView.js +255 -0
  45. package/src/components/Timeline/DatePickerComponent.js +13 -17
  46. package/src/components/Timeline/DragAndDropHandler.js +34 -34
  47. package/src/components/Timeline/EventBadge.js +26 -0
  48. package/src/components/Timeline/EventDetailModal.js +138 -0
  49. package/src/components/Timeline/EventIcon.js +47 -0
  50. package/src/components/Timeline/EventTooltip.js +206 -206
  51. package/src/components/Timeline/FilterPanel.js +179 -0
  52. package/src/components/Timeline/Indicator.js +26 -26
  53. package/src/components/Timeline/LoadingSpinner.js +48 -0
  54. package/src/components/Timeline/MasterHeader.js +104 -68
  55. package/src/components/Timeline/Resources.js +53 -53
  56. package/src/components/Timeline/ResourcesHeader.js +14 -14
  57. package/src/components/Timeline/Timeline.css +2491 -616
  58. package/src/components/Timeline/Timeline.js +607 -309
  59. package/src/components/Timeline/TimelineCell.js +8 -8
  60. package/src/components/Timeline/TimelineContent.js +838 -446
  61. package/src/components/Timeline/TimelineEvents.js +114 -114
  62. package/src/components/Timeline/TimelineHeader.js +54 -43
  63. package/src/components/Timeline/TimelineMonthContainer.js +29 -29
  64. package/src/components/Timeline/TimelineResources.js +16 -16
  65. package/src/demo.css +4 -0
  66. package/src/hooks/useDragAndDrop.js +80 -80
  67. package/src/hooks/useEventDragDrop.js +126 -126
  68. package/src/hooks/useEventManagement.js +173 -0
  69. package/src/hooks/useEventSelection.js +82 -0
  70. package/src/hooks/useExtendEvent.js +28 -28
  71. package/src/hooks/useKeyboardShortcuts.js +158 -0
  72. package/src/hooks/useTouchGestures.js +90 -0
  73. package/src/index.js +1 -7
  74. package/src/library.js +26 -0
  75. package/src/utils/conflictUtils.js +105 -0
  76. package/src/utils/dateUtils.js +36 -36
  77. package/src/utils/filterTimelineData.js +20 -20
  78. package/src/utils/filterUtils.js +106 -0
  79. package/src/utils/timeUtils.js +179 -0
  80. package/src/utils/timelineUtils.js +39 -39
  81. package/src/utils/viewModeUtils.js +54 -0
  82. package/.babelrc +0 -6
  83. package/babel.config.json +0 -4
  84. package/dist/dist/components/Timeline/DatePickerComponent.js +0 -17
  85. package/dist/dist/components/Timeline/DragAndDropHandler.js +0 -35
  86. package/dist/dist/components/Timeline/Resources.js +0 -53
  87. package/dist/dist/components/Timeline/Timeline.css +0 -616
  88. package/dist/dist/components/Timeline/Timeline.js +0 -309
  89. package/dist/dist/components/Timeline/TimelineContent.js +0 -446
  90. package/dist/dist/components/Timeline/TimelineEvents.js +0 -114
  91. package/dist/dist/components/Timeline/TimelineHeader.js +0 -43
  92. package/dist/dist/components/Timeline/TimelineMonthContainer.js +0 -29
  93. package/dist/dist/components/Timeline/TimelineResources.js +0 -16
  94. package/dist/dist/hooks/useDragAndDrop.js +0 -80
  95. package/dist/dist/hooks/useExtendEvent.js +0 -28
  96. package/public/dist/Timeline.js +0 -3277
  97. package/public/dist/dist/components/Timeline/DatePickerComponent.js +0 -17
  98. package/public/dist/dist/components/Timeline/EventTooltip.js +0 -206
  99. package/public/dist/dist/components/Timeline/Indicator.js +0 -29
  100. package/public/dist/dist/components/Timeline/MasterHeader.js +0 -68
  101. package/public/dist/dist/components/Timeline/ResourcesHeader.js +0 -14
  102. package/public/dist/dist/components/Timeline/Timeline.css +0 -616
  103. package/public/dist/dist/components/Timeline/Timeline.js +0 -304
  104. package/public/dist/dist/components/Timeline/TimelineCell.js +0 -8
  105. package/public/dist/dist/components/Timeline/TimelineContent.js +0 -447
  106. package/public/dist/dist/components/Timeline/TimelineHeader.js +0 -43
  107. package/public/dist/dist/hooks/useEventDragDrop.js +0 -126
  108. package/public/dist/dist/utils/HorizontalVirtualScroll.js +0 -0
  109. package/public/dist/dist/utils/dateUtils.js +0 -36
  110. package/public/dist/dist/utils/filterTimelineData.js +0 -21
  111. package/public/dist/dist/utils/timelineUtils.js +0 -40
  112. package/public/favicon.ico +0 -0
  113. package/public/index kutuphane /304/261c/304/261n.html" +0 -43
  114. package/public/index tasarim icin.html +0 -20
  115. package/public/index.html +0 -43
  116. package/public/logo192.png +0 -0
  117. package/public/logo512.png +0 -0
  118. package/public/manifest.json +0 -25
  119. package/public/robots.txt +0 -3
  120. package/src/App.css +0 -38
  121. package/src/App.test.js +0 -8
  122. package/src/dist/Timeline.js +0 -277
  123. package/src/index.css +0 -13
  124. package/src/logo.svg +0 -1
  125. package/src/reportWebVitals.js +0 -13
  126. package/src/setupTests.js +0 -5
  127. package/webpack.config.js +0 -49
  128. /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
- const TimelineHeader = ({ dates, monthHeaders }) => {
5
- return (
6
- <div className="timeline-header-container">
7
- {/* Ay ve Yıl Başlıkları */}
8
- <div className="timeline-header-month-row">
9
- {monthHeaders.map((monthHeader, index) => (
10
- <div
11
- key={index}
12
- className="timeline-header-month-cell"
13
- style={{
14
- flex: monthHeader.endIndex - monthHeader.startIndex + 1,
15
- borderRight:
16
- index < monthHeaders.length - 1 ? "1px solid var(--border-color)" : "none",
17
- }}
18
- >
19
- {monthHeader.monthName} {monthHeader.year}
20
- </div>
21
- ))}
22
- </div>
23
-
24
- {/* Günlük Hücreler */}
25
- <div className="timeline-header-day-row">
26
- {dates.map((date, index) => (
27
- <div
28
- key={index}
29
- className="timeline-header-day-cell"
30
- style={{
31
- flex: 1,
32
- borderRight: index < dates.length - 1 ? "1px solid var(--border-color)" : "none",
33
- }}
34
- >
35
- {date.display}
36
- </div>
37
- ))}
38
- </div>
39
- </div>
40
- );
41
- };
42
-
43
- export default TimelineHeader;
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
@@ -0,0 +1,4 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
@@ -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;