akfatimeline 1.0.4 → 1.0.5

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 (33) hide show
  1. package/dist/Timeline.js +1095 -110
  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 +1 -2
  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 +71 -44
  8. package/dist/dist/components/Timeline/TimelineContent.js +154 -129
  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
@@ -18,22 +18,35 @@ const TimelineContent = ({
18
18
  resourceSettings,
19
19
  setDropInfo,
20
20
 
21
- // Yeni prop'lar
21
+
22
22
  eventsDragOn = true,
23
23
  eventsExtendOn = true,
24
24
  createNewEventOn = true,
25
- onDragInfo,
25
+
26
26
  onExtendInfo,
27
27
  onCreateEventInfo,
28
28
  onEventRightClick,
29
+
30
+ eventTooltipOn = true,
31
+ tooltipComponent: TooltipComponent,
32
+ tempEventStyle = {},
33
+
34
+ eventStyleResolver = () => ({}),
29
35
  }) => {
30
36
  // ------------------- HOOKS & STATE -------------------
31
37
  const containerRef = useRef(null);
32
38
 
33
39
  // Drag
34
40
  const { isDragging, dragStart, dragEnd } = useDragAndDrop(events, setEvents);
35
- const { handleDragStart, handleDragOver, handleDrop, handleDragEnd } =
36
- useEventDragDrop(events, setEvents, setDropInfo);
41
+ const { handleDragStart, handleDragOver, handleDrop, handleDragEnd } = useEventDragDrop(
42
+ events,
43
+ setEvents,
44
+ setDropInfo // Doğrudan setDropInfo'yu geçiriyoruz
45
+ );
46
+
47
+
48
+
49
+
37
50
 
38
51
  // Extend
39
52
  const { extendEvent } = useExtendEvent(events, setEvents);
@@ -55,9 +68,14 @@ const TimelineContent = ({
55
68
  // ------------------- Tooltip Logic -------------------
56
69
  const handleEventClickInternal = (event, e) => {
57
70
  e.stopPropagation();
71
+ // Eğer mod "extend" ise tooltip'i açma
72
+ if (mode === "extend") {
73
+ return;
74
+ }
75
+
58
76
  // Harici callback
59
77
  if (onEventClick) onEventClick(event, e);
60
-
78
+
61
79
  // Tooltip göstermek
62
80
  const eventElement = e.currentTarget;
63
81
  if (eventElement) {
@@ -69,6 +87,7 @@ const TimelineContent = ({
69
87
  setSelectedEvent(event);
70
88
  }
71
89
  };
90
+
72
91
 
73
92
  const handleCloseTooltip = () => {
74
93
  setSelectedEvent(null);
@@ -154,8 +173,11 @@ const TimelineContent = ({
154
173
  return;
155
174
  }
156
175
  handleDragEnd();
157
- // onDragInfo(...) => if needed
176
+
177
+
158
178
  };
179
+
180
+
159
181
 
160
182
  // ------------------- Extend Logic -------------------
161
183
  const handleMouseDownExtend = (mouseEvent, event) => {
@@ -199,11 +221,16 @@ const TimelineContent = ({
199
221
  });
200
222
  }
201
223
  }
202
- setMode(null);
224
+
225
+ // Tooltip açılmasını engellemek için modun null olmasını geciktiriyoruz
226
+ setTimeout(() => {
227
+ setMode(null);
228
+ }, 100); // 100ms gecikme
203
229
  setExtendingEvent(null);
204
230
  setOriginalEndDate(null);
205
231
  setStartMouseX(null);
206
232
  };
233
+
207
234
 
208
235
  useEffect(() => {
209
236
  if (mode === "extend") {
@@ -273,6 +300,11 @@ const TimelineContent = ({
273
300
  };
274
301
  };
275
302
 
303
+
304
+
305
+
306
+
307
+
276
308
  // ------------------- RENDER -------------------
277
309
  return (
278
310
  <div
@@ -283,138 +315,131 @@ const TimelineContent = ({
283
315
  <Indicator todayIndex={todayIndex} totalDays={totalDays} />
284
316
  )}
285
317
 
286
- {groupedResources.map((group, groupIndex) => (
287
- <div key={groupIndex} className="timeline-group-container">
288
- {/* Grup Başlığı */}
289
- {resourceSettings.isGrouped && (
290
- <div className="timeline-group-header-row">
291
- {dates.map((dateObj, colIndex) => (
292
- <div
293
- key={`group-header-${groupIndex}-${colIndex}`}
294
- className="timeline-group-header-cell"
295
- ></div>
296
- ))}
297
- </div>
298
- )}
299
-
300
- {/* Kaynaklar */}
301
- {!collapsedGroups[group.groupName] &&
302
- group.resources.map((resource, rowIndex) => {
303
- const resourceEvents = events.filter((ev) => ev.resourceId === resource.id);
318
+ {groupedResources.map((group, groupIndex) => (
319
+ <div key={groupIndex} className="timeline-group-container">
320
+ {/* Grup Başlığı */}
321
+ {resourceSettings.isGrouped && (
322
+ <div className="timeline-group-header-row">
323
+ {dates.map((dateObj, colIndex) => (
324
+ <div
325
+ key={`group-header-${groupIndex}-${colIndex}`}
326
+ className="timeline-group-header-cell"
327
+ ></div>
328
+ ))}
329
+ </div>
330
+ )}
331
+
332
+ {/* Kaynaklar */}
333
+ {!collapsedGroups[group.groupName] &&
334
+ group.resources.map((resource, rowIndex) => {
335
+ const resourceEvents = events.filter((ev) => ev.resourceId === resource.id);
336
+
337
+ return (
338
+ <div key={resource.id} className="timeline-resource-row">
339
+ {/* Her resource row'u */}
340
+ {resourceEvents.map((event) => {
341
+ const { isVisible, left, width, isPartialStart, isPartialEnd } =
342
+ calculatePosition(event, dates);
343
+ if (!isVisible) return null;
344
+
345
+ // Kullanıcıdan gelen stil
346
+ const eventStyle = eventStyleResolver ? eventStyleResolver(event) : {};
304
347
 
305
348
  return (
306
- <div key={resource.id} className="timeline-resource-row">
307
- {/* Her resource row'u */}
308
- {resourceEvents.map((event) => {
309
- const { isVisible, left, width, isPartialStart, isPartialEnd } =
310
- calculatePosition(event, dates);
311
- if (!isVisible) return null;
312
-
313
- return (
314
- <div
315
- key={event.id}
316
- className="timeline-event"
317
- draggable={mode !== "extend" && eventsDragOn}
318
- onDragStart={(e) => {
319
- if (mode === "extend") {
320
- e.preventDefault();
321
- return;
322
- }
323
- handleDragStartSafe(e, event.id);
324
- }}
325
- onDragEnd={(e) => {
326
- if (mode === "extend") {
327
- e.preventDefault();
328
- return;
329
- }
330
- handleDragEndSafe(e);
331
- }}
332
- onContextMenu={(reactEvent) => handleRightClickEvent(event, reactEvent)}
333
- onClick={(ev) => handleEventClickInternal(event, ev)}
334
- style={{
335
- left,
336
- width,
337
- top: "5px",
338
- // color from var(--timeline-event-text-color)
339
- // background from event.color or var(...) => if event.color empty, fallback in CSS
340
- borderTopLeftRadius: isPartialStart ? "0px" : "20px",
341
- borderBottomLeftRadius: isPartialStart ? "0px" : "20px",
342
- borderTopRightRadius: isPartialEnd ? "0px" : "20px",
343
- borderBottomRightRadius: isPartialEnd ? "0px" : "20px",
344
- cursor: mode === "extend" ? "col-resize" : "grab",
345
- }}
346
- >
347
- {event.title}
348
- {eventsExtendOn && (
349
- <div
350
- className="timeline-event-extend-handle"
351
- onMouseDown={(mouseEvent) => {
352
- mouseEvent.stopPropagation();
353
- handleMouseDownExtend(mouseEvent, event);
354
- }}
355
- ></div>
356
- )}
357
- </div>
358
- );
359
- })}
360
-
361
- {/* Geçici (yeni) event */}
362
- {tempEvent && tempEvent.resourceId === resource.id && (
349
+ <div
350
+ key={event.id}
351
+ className="timeline-event"
352
+ draggable={mode !== "extend" && eventsDragOn}
353
+ onDragStart={(e) => {
354
+ if (mode === "extend") {
355
+ e.preventDefault();
356
+ return;
357
+ }
358
+ handleDragStartSafe(e, event.id);
359
+ }}
360
+ onDragEnd={(e) => {
361
+ if (mode === "extend") {
362
+ e.preventDefault();
363
+ return;
364
+ }
365
+ handleDragEndSafe(e);
366
+ }}
367
+ onContextMenu={(reactEvent) => handleRightClickEvent(event, reactEvent)}
368
+ onClick={(ev) => handleEventClickInternal(event, ev)}
369
+ style={{
370
+ left,
371
+ width,
372
+ top: "5px",
373
+ borderTopLeftRadius: isPartialStart ? "0px" : "20px",
374
+ borderBottomLeftRadius: isPartialStart ? "0px" : "20px",
375
+ borderTopRightRadius: isPartialEnd ? "0px" : "20px",
376
+ borderBottomRightRadius: isPartialEnd ? "0px" : "20px",
377
+ cursor: mode === "extend" ? "col-resize" : "grab",
378
+ ...eventStyle, // Kullanıcı tarafından tanımlanan stiller
379
+ }}
380
+ >
381
+ {event.title}
382
+ {eventsExtendOn && (
363
383
  <div
364
- className="timeline-temp-event"
365
- style={{
366
- ...calculatePosition(tempEvent, dates),
367
- top: "5px",
384
+ className="timeline-event-extend-handle"
385
+ onMouseDown={(mouseEvent) => {
386
+ mouseEvent.stopPropagation();
387
+ handleMouseDownExtend(mouseEvent, event);
368
388
  }}
369
- >
370
- {tempEvent.title}
371
- </div>
372
- )}
373
-
374
- {/* Tarih Hücreleri */}
375
- {dates.map((dateObj, colIndex) => (
376
- <div
377
- key={`cell-${groupIndex}-${rowIndex}-${colIndex}`}
378
- className={`timeline-cell ${
379
- isCellSelected(resource.id, dateObj) ? "selected" : ""
380
- }`}
381
- data-date={JSON.stringify(dateObj)}
382
- data-resource-id={resource.id}
383
- onMouseDown={() => handleCellClick(resource.id, dateObj)}
384
- onDragOver={(e) => handleDragOver(e)}
385
- onDrop={(e) =>
386
- handleDrop(e, resource.id, parseDate(dateObj.fullDate))
387
- }
388
389
  ></div>
389
- ))}
390
+ )}
390
391
  </div>
391
392
  );
392
393
  })}
393
- </div>
394
- ))}
394
+
395
+ {/* Geçici (yeni) event */}
396
+ {tempEvent && tempEvent.resourceId === resource.id && (
397
+ <div
398
+ className="timeline-temp-event"
399
+ style={{
400
+ ...calculatePosition(tempEvent, dates),
401
+ ...tempEventStyle, // Kullanıcının geçtiği stiller
402
+ }}
403
+ >
404
+ {tempEvent.title}
405
+ </div>
406
+ )}
407
+
408
+ {/* Tarih Hücreleri */}
409
+ {dates.map((dateObj, colIndex) => (
410
+ <div
411
+ key={`cell-${groupIndex}-${rowIndex}-${colIndex}`}
412
+ className={`timeline-cell ${
413
+ isCellSelected(resource.id, dateObj) ? "selected" : ""
414
+ }`}
415
+ data-date={JSON.stringify(dateObj)}
416
+ data-resource-id={resource.id}
417
+ onMouseDown={() => handleCellClick(resource.id, dateObj)}
418
+ onDragOver={(e) => handleDragOver(e)}
419
+ onDrop={(e) =>
420
+ handleDrop(e, resource.id, parseDate(dateObj.fullDate))
421
+ }
422
+ ></div>
423
+ ))}
424
+ </div>
425
+ );
426
+ })}
427
+ </div>
428
+ ))}
429
+
395
430
 
396
431
  {/* Tooltip vb. */}
397
- {selectedEvent && (
398
- // "timeline-event-tooltip" gibi className tanımlanabilir
399
- // eğer custom css istenirse
400
- <div
401
- style={{
402
- position: "absolute",
403
- top: tooltipPosition.top,
404
- left: tooltipPosition.left,
405
- // ...
406
- backgroundColor: "#333",
407
- color: "#fff",
408
- padding: "5px",
409
- borderRadius: "4px",
410
- zIndex: 999,
411
- }}
412
- >
413
- <button onClick={() => handleCloseTooltip()}>X</button>
414
- {/* Content */}
415
- {selectedEvent.title}
416
- </div>
417
- )}
432
+ {eventTooltipOn && selectedEvent && TooltipComponent && mode !== "extend" && (
433
+ <TooltipComponent
434
+ event={selectedEvent}
435
+ position={tooltipPosition}
436
+ onClose={handleCloseTooltip}
437
+ />
438
+ )}
439
+
440
+
441
+
442
+
418
443
  </div>
419
444
  );
420
445
  };
@@ -38,20 +38,34 @@ const useEventDragDrop = (events, setEvents, setDropInfo) => {
38
38
 
39
39
  const handleDrop = (event, resourceId, targetDate) => {
40
40
  event.preventDefault();
41
-
41
+
42
42
  if (mode === "drag" && draggingEvent) {
43
43
  const draggedEvent = events.find((evt) => evt.id === draggingEvent);
44
-
44
+
45
45
  if (draggedEvent) {
46
46
  const duration = draggedEvent.endDate - draggedEvent.startDate;
47
47
  const cellWidth = event.target.offsetWidth || 30;
48
48
  const offsetDays = Math.floor(dragOffset / cellWidth);
49
49
  const newStartDate = new Date(targetDate.getTime() - offsetDays * 24 * 60 * 60 * 1000);
50
50
  const newEndDate = new Date(newStartDate.getTime() + duration);
51
-
52
- console.log("New Start Date:", newStartDate);
53
- console.log("New End Date:", newEndDate);
54
-
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
55
69
  setEvents((prevEvents) =>
56
70
  prevEvents.map((evt) =>
57
71
  evt.id === draggingEvent
@@ -64,22 +78,14 @@ const useEventDragDrop = (events, setEvents, setDropInfo) => {
64
78
  : evt
65
79
  )
66
80
  );
67
-
68
- if (setDropInfo) {
69
- setDropInfo({
70
- id: draggingEvent,
71
- newResourceId: resourceId,
72
- newStartDate,
73
- newEndDate,
74
- });
75
- }
76
81
  }
77
82
  }
78
-
83
+
79
84
  setDraggingEvent(null);
80
85
  setDragOffset(0);
81
86
  setMode(null);
82
87
  };
88
+
83
89
 
84
90
  const handleExtend = (event, eventId, newEndDate) => {
85
91
  if (mode !== "extend" || draggingEvent !== eventId) return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akfatimeline",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "A customizable timeline component for React applications",
5
5
  "main": "dist/Timeline.js",
6
6
  "module": "dist/Timeline.js",