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,17 @@
1
+ import React, { useRef, useEffect } from "react";
2
+ import flatpickr from "flatpickr";
3
+ import "flatpickr/dist/themes/material_green.css"; // Tema
4
+
5
+ const DatePickerComponent = ({ onDateSelect }) => {
6
+ const pickerRef = useRef();
7
+
8
+ useEffect(() => {
9
+ flatpickr(pickerRef.current, {
10
+ onChange: ([selectedDate]) => onDateSelect(selectedDate),
11
+ });
12
+ }, []);
13
+
14
+ return <input type="text" ref={pickerRef} />;
15
+ };
16
+
17
+ export default DatePickerComponent;
@@ -28,7 +28,7 @@ const EventTooltip = ({ event, position = { top: 0, left: 0 }, onClose, onEdit,
28
28
  <div
29
29
  style={{
30
30
  position: "absolute",
31
- top: top - 30, // Tooltip'in biraz yukarıda görünmesi için
31
+ top: top - 200, // Tooltip'in biraz yukarıda görünmesi için
32
32
  left: left + 70,
33
33
  transform: "translateX(-50%)",
34
34
  backgroundColor: "#ffffff",
@@ -2,13 +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
- console.log("todayIndex:", todayIndex);
10
- console.log("totalDays:", totalDays);
11
-
12
8
  return (
13
9
  <div
14
10
  style={{
@@ -1,8 +1,10 @@
1
- // src/components/Timeline/MasterHeader.js
2
1
  import React from "react";
3
2
  import "./Timeline.css"; // veya MasterHeader.css, eğer ayrı dosyaya koyacaksan
3
+ import "flatpickr/dist/themes/material_green.css"; // Flatpickr Tema
4
4
 
5
5
  const MasterHeader = ({
6
+ selectedDate,
7
+ onDateSelect,
6
8
  onToday,
7
9
  onAdvance,
8
10
  onRetreat,
@@ -10,44 +12,55 @@ const MasterHeader = ({
10
12
  onMonthRetreat,
11
13
  dayRange,
12
14
  setDayRange,
13
- isDarkMode,
14
- toggleDarkMode,
15
15
  }) => {
16
+ const formattedDate = new Date(
17
+ selectedDate.getTime() + 24 * 60 * 60 * 1000 - selectedDate.getTimezoneOffset() * 60000
18
+ )
19
+ .toISOString()
20
+ .split("T")[0]; // YYYY-MM-DD formatı
21
+
16
22
  return (
17
23
  <div className="master-header-container">
18
- <button className="master-header-btn" onClick={onToday}>
19
- Today
20
- </button>
24
+ <div className="master-header-buttons">
25
+ <button className="master-header-btn" onClick={onMonthRetreat}>
26
+ 1 Ay Geri
27
+ </button>
28
+
29
+ <button className="master-header-btn" onClick={onRetreat}>
30
+ 5 Gün Geri
31
+ </button>
21
32
 
22
- <button className="master-header-btn" onClick={onMonthRetreat}>
23
- 1 Ay Geri
24
- </button>
33
+ <input
34
+ type="date"
35
+ className="master-header-date-picker"
36
+ value={formattedDate} // Seçili tarih burada gösteriliyor
37
+ onChange={(e) => onDateSelect(e.target.value)} // Tarih seçimi
38
+ onKeyDown={(e) => e.preventDefault()} // Manuel girişleri engelle
39
+ />
25
40
 
26
- <button className="master-header-btn" onClick={onRetreat}>
27
- 5 Gün Geri
28
- </button>
29
41
 
30
- <button className="master-header-btn" onClick={onAdvance}>
31
- 5 Gün İleri
32
- </button>
42
+ <button className="master-header-btn" onClick={onAdvance}>
43
+ 5 Gün İleri
44
+ </button>
33
45
 
34
- <button className="master-header-btn" onClick={onMonthAdvance}>
35
- 1 Ay İleri
36
- </button>
46
+ <button className="master-header-btn" onClick={onMonthAdvance}>
47
+ 1 Ay İleri
48
+ </button>
49
+
50
+ <button className="master-header-btn" onClick={onToday}>
51
+ Bugün
52
+ </button>
53
+ </div>
37
54
 
38
55
  <select
39
56
  className="master-header-select"
40
57
  value={dayRange}
41
- onChange={(e) => setDayRange(parseInt(e.target.value))}
58
+ onChange={(e) => setDayRange(parseInt(e.target.value, 10))}
42
59
  >
43
60
  <option value={30}>30 Gün</option>
44
61
  <option value={60}>60 Gün</option>
45
62
  <option value={90}>90 Gün</option>
46
63
  </select>
47
-
48
- <button className="master-header-btn" onClick={toggleDarkMode}>
49
- {isDarkMode ? "Light Mode" : "Dark Mode"}
50
- </button>
51
64
  </div>
52
65
  );
53
66
  };
@@ -1,4 +1,5 @@
1
1
  /* src/components/Timeline/Timeline.css */
2
+ @import "flatpickr/dist/themes/material_green.css";
2
3
 
3
4
  /*
4
5
  Temel: "sales sayfası" temasıyla uyumlu renkler,
@@ -376,31 +377,31 @@
376
377
  .master-header-container {
377
378
  display: flex;
378
379
  align-items: center;
380
+ justify-content: space-between; /* Butonlar solda, select sağda */
379
381
  padding: 10px;
380
-
381
382
  background-color: var(--header-background-color);
382
383
  color: var(--header-text-color);
384
+ }
383
385
 
384
- /* eğer border vs. istersen
385
- border-bottom: 1px solid var(--border-color);
386
- */
386
+ .master-header-buttons {
387
+ display: flex; /* Yan yana dizilim */
388
+ align-items: center; /* Dikey hizalama */
387
389
  }
388
390
 
389
- /* Butonlar */
390
391
  .master-header-btn {
391
392
  background-color: transparent;
392
393
  color: var(--header-text-color);
393
394
  border: 1px solid var(--border-color);
394
395
  border-radius: 4px;
395
396
  padding: 6px 12px;
396
- margin-right: 10px;
397
+ margin-right: 10px; /* Butonlar arasında mesafe */
397
398
  cursor: pointer;
398
399
  font-size: 14px;
399
400
  transition: background-color 0.2s ease, color 0.2s ease;
400
401
  }
401
402
 
402
403
  .master-header-btn:hover {
403
- background-color: rgba(25, 118, 210, 0.2); /* Light tema hover */
404
+ background-color: rgba(25, 118, 210, 0.2); /* Açık tema hover */
404
405
  }
405
406
 
406
407
  .dark-mode .master-header-btn:hover {
@@ -411,9 +412,36 @@
411
412
  outline: none;
412
413
  }
413
414
 
415
+
416
+
417
+ /* Tarih seçici (Date Picker) */
418
+ .master-header-date-picker {
419
+ background-color: transparent;
420
+ color: var(--header-text-color);
421
+ border: 1px solid var(--border-color);
422
+ border-radius: 4px;
423
+ padding: 5px 12px;
424
+ margin-right: 10px; /* Butonlar arasında mesafe */
425
+ cursor: pointer;
426
+ font-size: 14px;
427
+ transition: background-color 0.2s ease, color 0.2s ease;
428
+ }
429
+
430
+ .master-header-date-picker:hover {
431
+ background-color: rgba(25, 118, 210, 0.2); /* Açık tema hover */
432
+ }
433
+
434
+ .dark-mode .master-header-date-picker:hover {
435
+ background-color: rgba(76, 175, 80, 0.2); /* Koyu tema hover */
436
+ }
437
+
438
+ .master-header-date-picker:focus {
439
+ outline: none;
440
+ }
441
+
414
442
  /* Select */
415
443
  .master-header-select {
416
- margin-left: 10px;
444
+ margin-left: auto; /* Sağa yaslamak için */
417
445
  background-color: transparent;
418
446
  color: var(--header-text-color);
419
447
  border: 1px solid var(--border-color);
@@ -427,6 +455,60 @@
427
455
  outline: none;
428
456
  }
429
457
 
458
+ /* Flatpickr Takvim Kutusu */
459
+ .flatpickr-calendar {
460
+ background-color: var(--background-color);
461
+ color: var(--text-color);
462
+ border: 1px solid var(--border-color);
463
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); /* Gölge efekti */
464
+ }
465
+
466
+
467
+ /* Flatpickr Günü */
468
+ .flatpickr-day {
469
+ background-color: var(--background-color); /* Arka plan rengi */
470
+ color: var(--text-color); /* Yazı rengi */
471
+ border-radius: 4px; /* Köşeleri yuvarlat */
472
+ cursor: pointer;
473
+ }
474
+
475
+ .flatpickr-day:hover {
476
+ background-color: rgba(25, 118, 210, 0.2); /* Hover efekti */
477
+ }
478
+
479
+ .dark-mode .flatpickr-day:hover {
480
+ background-color: rgba(76, 175, 80, 0.2); /* Koyu tema hover efekti */
481
+ }
482
+
483
+ /* Seçili Gün */
484
+ .flatpickr-day.selected {
485
+ background-color: #4caf50; /* Seçili gün rengi */
486
+ color: white; /* Seçili gün yazı rengi */
487
+ }
488
+
489
+ /* Flatpickr Ay ve Yıl */
490
+ .flatpickr-months .flatpickr-month {
491
+ background-color: var(--background-color);
492
+ color: var(--text-color);
493
+ }
494
+
495
+ /* Flatpickr Ay İleri ve Geri Düğmeleri */
496
+ .flatpickr-prev-month, .flatpickr-next-month {
497
+ color: var(--text-color);
498
+ cursor: pointer;
499
+ }
500
+
501
+ /* Koyu Tema Örnekleri */
502
+ .dark-mode .flatpickr-calendar {
503
+ background-color: #1f2937; /* Koyu tema arka plan */
504
+ color: #ffffff; /* Koyu tema yazı rengi */
505
+ }
506
+
507
+ .dark-mode .flatpickr-day.selected {
508
+ background-color: #4caf50;
509
+ color: white;
510
+ }
511
+
430
512
 
431
513
  /* Container */
432
514
  .timeline-content-container {
@@ -35,32 +35,56 @@ const Timeline = ({
35
35
 
36
36
  // Yatay scroll özelliği aç/kapa
37
37
  horizontalScrollOn = false, // Varsayılan false
38
+
39
+ dayRange = 30,
40
+ setDayRange,
41
+ themeType = "light", // Tema bilgisi varsayılan olarak light
42
+
43
+ eventTooltipOn = true,
44
+ tooltipComponent: TooltipComponent, // Özelleştirilebilir Tooltip bileşeni
45
+ tempEventStyle = {},
46
+ eventStyleResolver = () => ({}),
47
+ indicatorDate = new Date(),
48
+ onToday,
49
+ onAdvance,
50
+ onRetreat,
51
+ onMonthAdvance,
52
+ onMonthRetreat,
38
53
  }) => {
39
54
  // ---------------------------------------------------------
40
55
  // 1) timelineData oluştur (dates, monthHeaders vs.)
41
56
  // ---------------------------------------------------------
42
57
  const timelineData = generateTimelineData(2020, 2030); // 10 yıllık veri
43
58
  const { dates, monthHeaders } = timelineData;
44
-
45
- // ---------------------------------------------------------
46
- // 2) local state
47
- // ---------------------------------------------------------
48
- const [collapsedGroups, setCollapsedGroups] = useState({});
49
59
  const [selectedDate, setSelectedDate] = useState(() => {
50
60
  const date = programDate ? new Date(programDate) : new Date();
51
- date.setDate(date.getDate() - 3);
61
+ date.setDate(date.getDate() - 3); // Program tarihinden 3 gün öncesini al
52
62
  return date;
53
63
  });
64
+
65
+ // ---------------------------------------------------------
66
+ // 2) local state
67
+ // ---------------------------------------------------------
68
+ const [collapsedGroups, setCollapsedGroups] = useState({});
69
+
54
70
  const [localEvents, setLocalEvents] = useState(events);
55
71
 
56
72
  const [selectedEvent, setSelectedEvent] = useState(null);
57
73
  const [tooltipPosition, setTooltipPosition] = useState({ top: 0, left: 0 });
58
74
 
59
75
  // dayRange = ekranda göstermeyi istediğimiz gün/hücre sayısı (ör. 30 gün)
60
- const [dayRange, setDayRange] = useState(30);
61
76
 
62
- const [isDarkMode, setIsDarkMode] = useState(false);
77
+ const [isDarkMode, setIsDarkMode] = useState(themeType === "dark");
63
78
 
79
+ useEffect(() => {
80
+ if (themeType !== undefined) {
81
+ setIsDarkMode(themeType === "dark");
82
+ }
83
+ }, [themeType]);
84
+
85
+ const toggleDarkMode = () => {
86
+ setIsDarkMode((prev) => !prev);
87
+ };
64
88
  // ---------------------------------------------------------
65
89
  // 3) Sabit hücre genişliği (örneğin 56.95 px)
66
90
  // Container genişliği = dayRange * cellWidth
@@ -101,10 +125,15 @@ const Timeline = ({
101
125
  const filteredDates =
102
126
  startIndex !== -1 ? dates.slice(startIndex, Math.min(endIndex, dates.length)) : [];
103
127
 
104
- const today = programDate ? new Date(programDate) : new Date();
105
- const todayIndex = filteredDates.findIndex(
106
- (d) => new Date(d.fullDate).toDateString() === today.toDateString()
107
- );
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
+
108
137
  const totalDays = filteredDates.length;
109
138
 
110
139
  // ---------------------------------------------------------
@@ -119,43 +148,50 @@ const Timeline = ({
119
148
 
120
149
  // ---------------------------------------------------------
121
150
  // 7) Navigation fonksiyonları
122
- // ---------------------------------------------------------
151
+ // --------------------------------------------------------- const { dates, monthHeaders } = timelineData;
152
+
153
+
154
+
155
+ const handleDateChange = (newDate) => {
156
+ setSelectedDate(new Date(newDate));
157
+ };
158
+
123
159
  const handleToday = () => {
124
- const date = programDate ? new Date(programDate) : new Date();
125
- date.setDate(date.getDate() - 3);
126
- setSelectedDate(date);
160
+ const today = programDate ? new Date(programDate) : new Date();
161
+ today.setDate(today.getDate() - 3); // Program tarihinden 3 gün öncesini ayarla
162
+ setSelectedDate(today);
127
163
  };
164
+
165
+
128
166
 
129
- const handleAdvance = () =>
167
+ const handleAdvance = () => {
130
168
  setSelectedDate((prev) => new Date(prev.getTime() + 5 * 24 * 60 * 60 * 1000));
169
+ };
131
170
 
132
- const handleRetreat = () =>
171
+ const handleRetreat = () => {
133
172
  setSelectedDate((prev) => new Date(prev.getTime() - 5 * 24 * 60 * 60 * 1000));
173
+ };
134
174
 
135
- const handleMonthRetreat = () =>
175
+ const handleMonthAdvance = () => {
136
176
  setSelectedDate((prev) => {
137
177
  const newDate = new Date(prev);
138
- newDate.setMonth(newDate.getMonth() - 1);
178
+ newDate.setMonth(newDate.getMonth() + 1);
139
179
  return newDate;
140
180
  });
181
+ };
141
182
 
142
- const handleMonthAdvance = () =>
183
+ const handleMonthRetreat = () => {
143
184
  setSelectedDate((prev) => {
144
185
  const newDate = new Date(prev);
145
- newDate.setMonth(newDate.getMonth() + 1);
186
+ newDate.setMonth(newDate.getMonth() - 1);
146
187
  return newDate;
147
188
  });
189
+ };
148
190
 
149
191
  // ---------------------------------------------------------
150
192
  // 8) Dark Mode
151
193
  // ---------------------------------------------------------
152
- const toggleDarkMode = () => {
153
- setIsDarkMode((prevMode) => !prevMode);
154
- };
155
194
 
156
- useEffect(() => {
157
- document.body.classList.toggle("dark-mode", isDarkMode);
158
- }, [isDarkMode]);
159
195
 
160
196
  // ---------------------------------------------------------
161
197
  // 9) Ay başlıklarını filtrele
@@ -181,21 +217,22 @@ const Timeline = ({
181
217
  {masterHeaderView && (
182
218
  <div className="timeline-master-header">
183
219
  <MasterHeader
220
+ selectedDate={selectedDate} // Seçili tarihi gönder
221
+ onDateSelect={handleDateChange}
184
222
  onToday={handleToday}
185
223
  onAdvance={handleAdvance}
186
224
  onRetreat={handleRetreat}
187
225
  onMonthAdvance={handleMonthAdvance}
188
226
  onMonthRetreat={handleMonthRetreat}
189
227
  dayRange={dayRange}
190
- setDayRange={setDayRange} // dayRange'ı burada user değiştirebilir
191
- isDarkMode={isDarkMode}
192
- toggleDarkMode={toggleDarkMode}
228
+ setDayRange={setDayRange}
193
229
  />
194
230
  </div>
195
231
  )}
196
232
  {/* Body: Sol kısım => Resources, Sağ kısım => timeline */}
197
233
  <div className="timeline-body">
198
- <div className="timeline-resources-container">
234
+ <div className="timeline-resources-container"
235
+ style={{ overflow: "hidden"}}>
199
236
  <ResourcesHeader content={resourceHeaderContent} />
200
237
  <Resources
201
238
  groupedResources={resources}
@@ -205,21 +242,14 @@ const Timeline = ({
205
242
  />
206
243
  </div>
207
244
 
208
- {/*
209
- Dış kap => .timeline-scrollable-container
210
- horizontalScrollOn => overflow-x auto/hidden
211
- */}
245
+
212
246
  <div
213
247
  className="timeline-scrollable-container"
214
248
  style={{
215
249
  overflowX: horizontalScrollOn ? "auto" : "hidden",
216
250
  }}
217
251
  >
218
- {/*
219
- İç kap => .timeline-header-content-wrapper
220
- Genişlik => dayRange * cellWidth px (eğer horizontalScrollOn=true)
221
- Yoksa 100% (scroll devre dışı)
222
- */}
252
+
223
253
  <div
224
254
  className="timeline-header-content-wrapper"
225
255
  style={{
@@ -231,22 +261,19 @@ const Timeline = ({
231
261
  monthHeaders={filteredMonthHeaders}
232
262
  />
233
263
 
234
- <TimelineContent
235
- // Props
264
+ <TimelineContent
236
265
  groupedResources={resources}
237
266
  dates={filteredDates}
238
267
  collapsedGroups={collapsedGroups}
239
268
  events={localEvents}
240
269
  setEvents={setLocalEvents}
241
- onEventClick={handleEventClick}
270
+ onEventClick={onEventClick}
271
+
242
272
  todayIndex={todayIndex}
243
- totalDays={totalDays}
244
273
  indicatorOn={indicatorOn}
245
274
  resourceSettings={resourceSettings}
246
275
  toggleGroupCollapse={toggleGroupCollapse}
247
276
  setDropInfo={setDropInfo}
248
-
249
- // Yeni prop'lar
250
277
  eventsDragOn={eventsDragOn}
251
278
  eventsExtendOn={eventsExtendOn}
252
279
  createNewEventOn={createNewEventOn}
@@ -254,6 +281,11 @@ const Timeline = ({
254
281
  onExtendInfo={onExtendInfo}
255
282
  onCreateEventInfo={onCreateEventInfo}
256
283
  onEventRightClick={onEventRightClick}
284
+ eventTooltipOn={eventTooltipOn} // Tooltip kontrolü
285
+ tooltipComponent={TooltipComponent} // Özelleştirilebilir Tooltip bileşeni
286
+ tempEventStyle = {tempEventStyle}
287
+ eventStyleResolver={eventStyleResolver}
288
+
257
289
  />
258
290
 
259
291
  {/* Tooltip */}