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.
Files changed (37) hide show
  1. package/dist/Timeline.js +1097 -112
  2. package/dist/dist/components/Timeline/DatePickerComponent.js +17 -0
  3. package/dist/dist/components/Timeline/EventTooltip.js +1 -1
  4. package/dist/dist/components/Timeline/Indicator.js +0 -4
  5. package/dist/dist/components/Timeline/MasterHeader.js +36 -23
  6. package/dist/dist/components/Timeline/Timeline.css +90 -8
  7. package/dist/dist/components/Timeline/Timeline.js +79 -47
  8. package/dist/dist/components/Timeline/TimelineContent.js +154 -130
  9. package/dist/dist/hooks/useEventDragDrop.js +22 -16
  10. package/package.json +1 -1
  11. package/public/dist/Timeline.js +3277 -0
  12. package/public/dist/dist/components/Timeline/DatePickerComponent.js +17 -0
  13. package/public/dist/dist/components/Timeline/DragAndDropHandler.js +35 -0
  14. package/public/dist/dist/components/Timeline/EventTooltip.js +206 -0
  15. package/public/dist/dist/components/Timeline/Indicator.js +29 -0
  16. package/public/dist/dist/components/Timeline/MasterHeader.js +68 -0
  17. package/public/dist/dist/components/Timeline/Resources.js +53 -0
  18. package/public/dist/dist/components/Timeline/ResourcesHeader.js +14 -0
  19. package/public/dist/dist/components/Timeline/Timeline.css +616 -0
  20. package/public/dist/dist/components/Timeline/Timeline.js +304 -0
  21. package/public/dist/dist/components/Timeline/TimelineCell.js +8 -0
  22. package/public/dist/dist/components/Timeline/TimelineContent.js +447 -0
  23. package/public/dist/dist/components/Timeline/TimelineEvents.js +114 -0
  24. package/public/dist/dist/components/Timeline/TimelineHeader.js +43 -0
  25. package/public/dist/dist/components/Timeline/TimelineMonthContainer.js +29 -0
  26. package/public/dist/dist/components/Timeline/TimelineResources.js +16 -0
  27. package/public/dist/dist/hooks/useDragAndDrop.js +80 -0
  28. package/public/dist/dist/hooks/useEventDragDrop.js +126 -0
  29. package/public/dist/dist/hooks/useExtendEvent.js +28 -0
  30. package/public/dist/dist/utils/HorizontalVirtualScroll.js +0 -0
  31. package/public/dist/dist/utils/dateUtils.js +36 -0
  32. package/public/dist/dist/utils/filterTimelineData.js +21 -0
  33. package/public/dist/dist/utils/timelineUtils.js +40 -0
  34. package/src/App.js +3 -1
  35. package/src/components/Timeline/Indicator.js +0 -3
  36. package/src/components/Timeline/Timeline.js +16 -11
  37. 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;
@@ -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-02";
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
- onToday,
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
- const today = programDate ? new Date(programDate) : new Date();
129
- const todayIndex = filteredDates.findIndex(
130
- (d) => new Date(d.fullDate).toDateString() === today.toDateString()
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); // Bugünden 3 gün öncesini ayarla
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
- todayIndex={filteredDates.findIndex(
266
- (d) => new Date(d.fullDate).toDateString() === new Date().toDateString()
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))