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,446 +0,0 @@
1
- import React, { useState, useRef, useEffect } from "react";
2
- import { parseDate } from "../../utils/dateUtils";
3
- import useDragAndDrop from "../../hooks/useDragAndDrop";
4
- import useEventDragDrop from "../../hooks/useEventDragDrop";
5
- import Indicator from "./Indicator";
6
- import useExtendEvent from "../../hooks/useExtendEvent";
7
- // import "./Timeline.css"; // varsayalım "Timeline.css" globalde import ediliyor
8
-
9
- const TimelineContent = ({
10
- groupedResources,
11
- dates,
12
- collapsedGroups,
13
- events,
14
- setEvents,
15
- onEventClick,
16
- todayIndex,
17
- indicatorOn,
18
- resourceSettings,
19
- setDropInfo,
20
-
21
-
22
- eventsDragOn = true,
23
- eventsExtendOn = true,
24
- createNewEventOn = true,
25
-
26
- onExtendInfo,
27
- onCreateEventInfo,
28
- onEventRightClick,
29
-
30
- eventTooltipOn = true,
31
- tooltipComponent: TooltipComponent,
32
- tempEventStyle = {},
33
-
34
- eventStyleResolver = () => ({}),
35
- }) => {
36
- // ------------------- HOOKS & STATE -------------------
37
- const containerRef = useRef(null);
38
-
39
- // Drag
40
- const { isDragging, dragStart, dragEnd } = useDragAndDrop(events, setEvents);
41
- const { handleDragStart, handleDragOver, handleDrop, handleDragEnd } = useEventDragDrop(
42
- events,
43
- setEvents,
44
- setDropInfo // Doğrudan setDropInfo'yu geçiriyoruz
45
- );
46
-
47
-
48
-
49
-
50
-
51
- // Extend
52
- const { extendEvent } = useExtendEvent(events, setEvents);
53
- const [mode, setMode] = useState(null); // null | "extend"
54
- const [extendingEvent, setExtendingEvent] = useState(null);
55
- const [originalEndDate, setOriginalEndDate] = useState(null);
56
- const [startMouseX, setStartMouseX] = useState(null);
57
-
58
- // Create new event
59
- const [isCreating, setIsCreating] = useState(false);
60
- const [tempEvent, setTempEvent] = useState(null);
61
-
62
- // Tooltip
63
- const [selectedEvent, setSelectedEvent] = useState(null);
64
- const [tooltipPosition, setTooltipPosition] = useState({ top: 0, left: 0 });
65
-
66
- const totalDays = dates.length;
67
-
68
- // ------------------- Tooltip Logic -------------------
69
- const handleEventClickInternal = (event, e) => {
70
- e.stopPropagation();
71
- // Eğer mod "extend" ise tooltip'i açma
72
- if (mode === "extend") {
73
- return;
74
- }
75
-
76
- // Harici callback
77
- if (onEventClick) onEventClick(event, e);
78
-
79
- // Tooltip göstermek
80
- const eventElement = e.currentTarget;
81
- if (eventElement) {
82
- const rect = eventElement.getBoundingClientRect();
83
- setTooltipPosition({
84
- top: rect.top + window.scrollY,
85
- left: rect.left + rect.width / 2 + window.scrollX,
86
- });
87
- setSelectedEvent(event);
88
- }
89
- };
90
-
91
-
92
- const handleCloseTooltip = () => {
93
- setSelectedEvent(null);
94
- };
95
-
96
- // ------------------- Create New Event -------------------
97
- const handleCellClick = (resourceId, date) => {
98
- if (!createNewEventOn) return; // create devrede değilse
99
-
100
- const startDate = parseDate(date.fullDate);
101
- const newEvent = {
102
- id: Date.now(),
103
- title: "1 Gece",
104
- startDate,
105
- endDate: new Date(startDate.getTime() + 24 * 60 * 60 * 1000),
106
- resourceId,
107
- // color => var(--timeline-new-event-background-color) => => Sonra inline style yerine className
108
- color: "", // Bunu .css’te "var(--timeline-new-event-background-color)" atayabilirsin
109
- };
110
- setTempEvent(newEvent);
111
- setIsCreating(true);
112
- };
113
-
114
- useEffect(() => {
115
- if (!createNewEventOn) return;
116
- if (!isCreating) return;
117
- if (mode === "extend") {
118
- console.log(">>> 'extend' mode, skip new event creation");
119
- return;
120
- }
121
-
122
- const handleMouseMove = (e) => {
123
- if (!isCreating || !tempEvent) return;
124
- const cell = document.elementFromPoint(e.clientX, e.clientY);
125
- const cellW = cell?.offsetWidth || 30;
126
-
127
- const startX = tempEvent.startX || e.clientX;
128
- const deltaX = e.clientX - startX;
129
- const daysToAdd = Math.max(1, Math.floor(deltaX / cellW));
130
-
131
- const newEndDate = new Date(tempEvent.startDate.getTime());
132
- newEndDate.setDate(newEndDate.getDate() + daysToAdd);
133
-
134
- setTempEvent({
135
- ...tempEvent,
136
- endDate: newEndDate,
137
- startX: startX,
138
- title: `${daysToAdd} Gece`,
139
- });
140
- };
141
-
142
- const handleMouseUp = () => {
143
- if (isCreating && tempEvent) {
144
- setEvents([...events, tempEvent]);
145
- if (onCreateEventInfo) {
146
- onCreateEventInfo(tempEvent);
147
- }
148
- }
149
- setTempEvent(null);
150
- setIsCreating(false);
151
- };
152
-
153
- window.addEventListener("mousemove", handleMouseMove);
154
- window.addEventListener("mouseup", handleMouseUp);
155
-
156
- return () => {
157
- window.removeEventListener("mousemove", handleMouseMove);
158
- window.removeEventListener("mouseup", handleMouseUp);
159
- };
160
- }, [createNewEventOn, isCreating, mode, tempEvent, events, onCreateEventInfo, setEvents]);
161
-
162
- // ------------------- Drag Logic -------------------
163
- const handleDragStartSafe = (e, eventId) => {
164
- if (!eventsDragOn) {
165
- e.preventDefault();
166
- return;
167
- }
168
- handleDragStart(e, eventId);
169
- };
170
- const handleDragEndSafe = (e) => {
171
- if (!eventsDragOn) {
172
- e.preventDefault();
173
- return;
174
- }
175
- handleDragEnd();
176
-
177
-
178
- };
179
-
180
-
181
-
182
- // ------------------- Extend Logic -------------------
183
- const handleMouseDownExtend = (mouseEvent, event) => {
184
- if (!eventsExtendOn) return;
185
- mouseEvent.stopPropagation();
186
- console.log(">>> Extend start ID:", event.id);
187
- setMode("extend");
188
- setExtendingEvent(event);
189
- setOriginalEndDate(event.endDate);
190
- setStartMouseX(mouseEvent.clientX);
191
- };
192
-
193
- const handleMouseMoveExtend = (e) => {
194
- if (mode !== "extend" || !extendingEvent) return;
195
- if (!eventsExtendOn) return;
196
-
197
- const currentMouseX = e.clientX;
198
- const deltaX = currentMouseX - (startMouseX ?? 0);
199
- const cellW = 30;
200
- const daysToAdd = Math.floor(deltaX / cellW);
201
-
202
- const newEndDate = new Date((originalEndDate ?? new Date()).getTime());
203
- newEndDate.setDate(newEndDate.getDate() + daysToAdd);
204
-
205
-
206
- setEvents((prev) =>
207
- prev.map((evt) => (evt.id === extendingEvent.id ? { ...evt, endDate: newEndDate } : evt))
208
- );
209
- };
210
-
211
- const handleMouseUpExtend = () => {
212
- console.log(">>> Extend finished ID:", extendingEvent?.id);
213
- if (onExtendInfo && extendingEvent) {
214
- // callback
215
- const updatedEvent = events.find((ev) => ev.id === extendingEvent.id);
216
- if (updatedEvent) {
217
- onExtendInfo({
218
- eventId: extendingEvent.id,
219
- newEndDate: updatedEvent.endDate,
220
- });
221
- }
222
- }
223
-
224
- // Tooltip açılmasını engellemek için modun null olmasını geciktiriyoruz
225
- setTimeout(() => {
226
- setMode(null);
227
- }, 100); // 100ms gecikme
228
- setExtendingEvent(null);
229
- setOriginalEndDate(null);
230
- setStartMouseX(null);
231
- };
232
-
233
-
234
- useEffect(() => {
235
- if (mode === "extend") {
236
- const onMove = (e) => handleMouseMoveExtend(e);
237
- const onUp = () => handleMouseUpExtend();
238
- document.addEventListener("mousemove", onMove);
239
- document.addEventListener("mouseup", onUp);
240
- return () => {
241
- document.removeEventListener("mousemove", onMove);
242
- document.removeEventListener("mouseup", onUp);
243
- };
244
- }
245
- }, [mode, extendingEvent, eventsExtendOn, originalEndDate, startMouseX]);
246
-
247
- // ------------------- Right Click (context) -------------------
248
- const handleRightClickEvent = (evt, reactEvent) => {
249
- reactEvent.preventDefault();
250
- if (onEventRightClick) onEventRightClick(evt, reactEvent);
251
- };
252
-
253
- // ------------------- Helper isCellSelected -------------------
254
- const isCellSelected = (resourceId, date) => {
255
- if (!dragStart || !dragEnd) return false;
256
- if (resourceId !== dragStart.resourceId) return false;
257
-
258
- const startIndex = dates.findIndex((d) => parseDate(d.fullDate).getTime() === parseDate(dragStart.date).getTime());
259
- const endIndex = dates.findIndex((d) => parseDate(d.fullDate).getTime() === parseDate(dragEnd.date).getTime());
260
- const currentIndex = dates.findIndex((d) => parseDate(d.fullDate).getTime() === parseDate(date.fullDate).getTime());
261
-
262
- if (startIndex === -1 || endIndex === -1 || currentIndex === -1) return false;
263
-
264
- return currentIndex >= Math.min(startIndex, endIndex) && currentIndex <= Math.max(startIndex, endIndex);
265
- };
266
-
267
- // ------------------- calculatePosition -------------------
268
- const calculatePosition = (ev, dateArr) => {
269
- const startDate = parseDate(ev.startDate);
270
- const endDate = parseDate(ev.endDate);
271
-
272
- const startIndex = dateArr.findIndex((d) => parseDate(d.fullDate).toDateString() === startDate.toDateString());
273
- const endIndex = dateArr.findIndex((d) => parseDate(d.fullDate).toDateString() === endDate.toDateString());
274
-
275
- const totalDays = dateArr.length;
276
- if (startIndex < 0 && endIndex < 0) {
277
- return { isVisible: false, left: 0, width: 0, isPartialStart: false, isPartialEnd: false };
278
- }
279
- if (startIndex >= totalDays && endIndex >= totalDays) {
280
- return { isVisible: false, left: 0, width: 0, isPartialStart: false, isPartialEnd: false };
281
- }
282
-
283
- const effectiveStartIndex = Math.max(startIndex, 0);
284
- const effectiveEndIndex = Math.min(endIndex, totalDays - 1);
285
-
286
- const isPartialStart = startIndex < 0;
287
- const isPartialEnd = endIndex >= totalDays;
288
-
289
- const leftPercentage = ((effectiveStartIndex + (isPartialStart ? 0 : 0.5)) / totalDays) * 100;
290
- const rightPercentage = ((effectiveEndIndex + (isPartialEnd ? 1 : 0.5)) / totalDays) * 100;
291
- const widthPercentage = rightPercentage - leftPercentage;
292
-
293
- return {
294
- isVisible: true,
295
- left: `${leftPercentage}%`,
296
- width: `${widthPercentage}%`,
297
- isPartialStart,
298
- isPartialEnd,
299
- };
300
- };
301
-
302
-
303
-
304
-
305
-
306
-
307
- // ------------------- RENDER -------------------
308
- return (
309
- <div
310
- ref={containerRef}
311
- className="timeline-content-container" // Yeni class, stilini timeline.css'e ekleyebilirsin
312
- >
313
- {indicatorOn && (
314
- <Indicator todayIndex={todayIndex} totalDays={totalDays} />
315
- )}
316
-
317
- {groupedResources.map((group, groupIndex) => (
318
- <div key={groupIndex} className="timeline-group-container">
319
- {/* Grup Başlığı */}
320
- {resourceSettings.isGrouped && (
321
- <div className="timeline-group-header-row">
322
- {dates.map((dateObj, colIndex) => (
323
- <div
324
- key={`group-header-${groupIndex}-${colIndex}`}
325
- className="timeline-group-header-cell"
326
- ></div>
327
- ))}
328
- </div>
329
- )}
330
-
331
- {/* Kaynaklar */}
332
- {!collapsedGroups[group.groupName] &&
333
- group.resources.map((resource, rowIndex) => {
334
- const resourceEvents = events.filter((ev) => ev.resourceId === resource.id);
335
-
336
- return (
337
- <div key={resource.id} className="timeline-resource-row">
338
- {/* Her resource row'u */}
339
- {resourceEvents.map((event) => {
340
- const { isVisible, left, width, isPartialStart, isPartialEnd } =
341
- calculatePosition(event, dates);
342
- if (!isVisible) return null;
343
-
344
- // Kullanıcıdan gelen stil
345
- const eventStyle = eventStyleResolver ? eventStyleResolver(event) : {};
346
-
347
- return (
348
- <div
349
- key={event.id}
350
- className="timeline-event"
351
- draggable={mode !== "extend" && eventsDragOn}
352
- onDragStart={(e) => {
353
- if (mode === "extend") {
354
- e.preventDefault();
355
- return;
356
- }
357
- handleDragStartSafe(e, event.id);
358
- }}
359
- onDragEnd={(e) => {
360
- if (mode === "extend") {
361
- e.preventDefault();
362
- return;
363
- }
364
- handleDragEndSafe(e);
365
- }}
366
- onContextMenu={(reactEvent) => handleRightClickEvent(event, reactEvent)}
367
- onClick={(ev) => handleEventClickInternal(event, ev)}
368
- style={{
369
- left,
370
- width,
371
- top: "5px",
372
- borderTopLeftRadius: isPartialStart ? "0px" : "20px",
373
- borderBottomLeftRadius: isPartialStart ? "0px" : "20px",
374
- borderTopRightRadius: isPartialEnd ? "0px" : "20px",
375
- borderBottomRightRadius: isPartialEnd ? "0px" : "20px",
376
- cursor: mode === "extend" ? "col-resize" : "grab",
377
- ...eventStyle, // Kullanıcı tarafından tanımlanan stiller
378
- }}
379
- >
380
- {event.title}
381
- {eventsExtendOn && (
382
- <div
383
- className="timeline-event-extend-handle"
384
- onMouseDown={(mouseEvent) => {
385
- mouseEvent.stopPropagation();
386
- handleMouseDownExtend(mouseEvent, event);
387
- }}
388
- ></div>
389
- )}
390
- </div>
391
- );
392
- })}
393
-
394
- {/* Geçici (yeni) event */}
395
- {tempEvent && tempEvent.resourceId === resource.id && (
396
- <div
397
- className="timeline-temp-event"
398
- style={{
399
- ...calculatePosition(tempEvent, dates),
400
- ...tempEventStyle, // Kullanıcının geçtiği stiller
401
- }}
402
- >
403
- {tempEvent.title}
404
- </div>
405
- )}
406
-
407
- {/* Tarih Hücreleri */}
408
- {dates.map((dateObj, colIndex) => (
409
- <div
410
- key={`cell-${groupIndex}-${rowIndex}-${colIndex}`}
411
- className={`timeline-cell ${
412
- isCellSelected(resource.id, dateObj) ? "selected" : ""
413
- }`}
414
- data-date={JSON.stringify(dateObj)}
415
- data-resource-id={resource.id}
416
- onMouseDown={() => handleCellClick(resource.id, dateObj)}
417
- onDragOver={(e) => handleDragOver(e)}
418
- onDrop={(e) =>
419
- handleDrop(e, resource.id, parseDate(dateObj.fullDate))
420
- }
421
- ></div>
422
- ))}
423
- </div>
424
- );
425
- })}
426
- </div>
427
- ))}
428
-
429
-
430
- {/* Tooltip vb. */}
431
- {eventTooltipOn && selectedEvent && TooltipComponent && mode !== "extend" && (
432
- <TooltipComponent
433
- event={selectedEvent}
434
- position={tooltipPosition}
435
- onClose={handleCloseTooltip}
436
- />
437
- )}
438
-
439
-
440
-
441
-
442
- </div>
443
- );
444
- };
445
-
446
- export default TimelineContent;
@@ -1,114 +0,0 @@
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 +0,0 @@
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,29 +0,0 @@
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 +0,0 @@
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;