akfatimeline 1.0.2 → 1.0.4

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 (39) hide show
  1. package/.babelrc +5 -3
  2. package/CHANGELOG.md +35 -0
  3. package/dist/Timeline.js +2292 -1
  4. package/dist/dist/components/Timeline/DragAndDropHandler.js +35 -0
  5. package/dist/dist/components/Timeline/EventTooltip.js +206 -0
  6. package/dist/dist/components/Timeline/Indicator.js +30 -0
  7. package/dist/dist/components/Timeline/MasterHeader.js +55 -0
  8. package/dist/dist/components/Timeline/Resources.js +53 -0
  9. package/dist/dist/components/Timeline/ResourcesHeader.js +14 -0
  10. package/dist/dist/components/Timeline/Timeline.css +534 -0
  11. package/dist/dist/components/Timeline/Timeline.js +277 -0
  12. package/dist/dist/components/Timeline/TimelineCell.js +8 -0
  13. package/dist/dist/components/Timeline/TimelineContent.js +422 -0
  14. package/dist/dist/components/Timeline/TimelineEvents.js +114 -0
  15. package/dist/dist/components/Timeline/TimelineHeader.js +43 -0
  16. package/dist/dist/components/Timeline/TimelineMonthContainer.js +29 -0
  17. package/dist/dist/components/Timeline/TimelineResources.js +16 -0
  18. package/dist/dist/hooks/useDragAndDrop.js +80 -0
  19. package/dist/dist/hooks/useEventDragDrop.js +120 -0
  20. package/dist/dist/hooks/useExtendEvent.js +28 -0
  21. package/dist/dist/utils/HorizontalVirtualScroll.js +0 -0
  22. package/dist/dist/utils/dateUtils.js +36 -0
  23. package/dist/dist/utils/filterTimelineData.js +21 -0
  24. package/dist/dist/utils/timelineUtils.js +40 -0
  25. package/package.json +2 -1
  26. package/public/index kutuphane /304/261c/304/261n.html" +43 -0
  27. package/public/index tasarim icin.html +20 -0
  28. package/src/App.js +161 -154
  29. package/src/components/Timeline/DatePickerComponent.js +17 -0
  30. package/src/components/Timeline/EventTooltip.js +1 -1
  31. package/src/components/Timeline/Indicator.js +1 -2
  32. package/src/components/Timeline/MasterHeader.js +36 -23
  33. package/src/components/Timeline/Timeline.css +90 -8
  34. package/src/components/Timeline/Timeline.js +71 -44
  35. package/src/components/Timeline/TimelineContent.js +154 -129
  36. package/src/hooks/useEventDragDrop.js +22 -16
  37. package/webpack.config.js +25 -7
  38. package/src/App copy.js +0 -185
  39. package/src/components/Timeline/TimelineContent copy.js +0 -421
@@ -0,0 +1,277 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import MasterHeader from "./MasterHeader";
3
+ import ResourcesHeader from "./ResourcesHeader";
4
+ import Resources from "./Resources";
5
+ import TimelineHeader from "./TimelineHeader";
6
+ import TimelineContent from "./TimelineContent";
7
+ import "./Timeline.css";
8
+ import EventTooltip from "./EventTooltip";
9
+ import { generateTimelineData } from "../../utils/timelineUtils";
10
+
11
+ const Timeline = ({
12
+ resources,
13
+ programDate = null,
14
+ events = [],
15
+ resourceSettings = {
16
+ showIdAsName: false,
17
+ isGrouped: true,
18
+ isCollapsible: true,
19
+ },
20
+ indicatorOn = false,
21
+ dropInfo,
22
+ setDropInfo,
23
+
24
+ masterHeaderView = true,
25
+ resourceHeaderContent = "Akfa Timeline",
26
+ eventsDragOn = true,
27
+ eventsExtendOn = true,
28
+ createNewEventOn = true,
29
+ onDragInfo,
30
+ onExtendInfo,
31
+ onCreateEventInfo,
32
+ // İsteğe bağlı event tıklama callback'leri
33
+ onEventClick,
34
+ onEventRightClick,
35
+
36
+ // Yatay scroll özelliği aç/kapa
37
+ horizontalScrollOn = false, // Varsayılan false
38
+ }) => {
39
+ // ---------------------------------------------------------
40
+ // 1) timelineData oluştur (dates, monthHeaders vs.)
41
+ // ---------------------------------------------------------
42
+ const timelineData = generateTimelineData(2020, 2030); // 10 yıllık veri
43
+ const { dates, monthHeaders } = timelineData;
44
+
45
+ // ---------------------------------------------------------
46
+ // 2) local state
47
+ // ---------------------------------------------------------
48
+ const [collapsedGroups, setCollapsedGroups] = useState({});
49
+ const [selectedDate, setSelectedDate] = useState(() => {
50
+ const date = programDate ? new Date(programDate) : new Date();
51
+ date.setDate(date.getDate() - 3);
52
+ return date;
53
+ });
54
+ const [localEvents, setLocalEvents] = useState(events);
55
+
56
+ const [selectedEvent, setSelectedEvent] = useState(null);
57
+ const [tooltipPosition, setTooltipPosition] = useState({ top: 0, left: 0 });
58
+
59
+ // dayRange = ekranda göstermeyi istediğimiz gün/hücre sayısı (ör. 30 gün)
60
+ const [dayRange, setDayRange] = useState(30);
61
+
62
+ const [isDarkMode, setIsDarkMode] = useState(false);
63
+
64
+ // ---------------------------------------------------------
65
+ // 3) Sabit hücre genişliği (örneğin 56.95 px)
66
+ // Container genişliği = dayRange * cellWidth
67
+ // ---------------------------------------------------------
68
+ const cellWidth = 56.95; // her gün/hücre ~57 piksel
69
+ const containerWidth = dayRange * cellWidth;
70
+ // örneğin dayRange=30 => containerWidth=30*56.95=1708.5 px
71
+
72
+ // ---------------------------------------------------------
73
+ // 4) Event Tooltip logic
74
+ // ---------------------------------------------------------
75
+ const handleEventClick = (event, e) => {
76
+ // Harici onEventClick callback'i varsa, önce onu tetikleyelim
77
+ if (onEventClick) {
78
+ onEventClick(event, e);
79
+ }
80
+ // Ardından tooltip göstermek istiyorsak:
81
+ const eventElement = e.currentTarget;
82
+ if (eventElement) {
83
+ const rect = eventElement.getBoundingClientRect();
84
+ setTooltipPosition({
85
+ top: rect.top + window.scrollY,
86
+ left: rect.left + rect.width / 2 + window.scrollX,
87
+ });
88
+ setSelectedEvent(event);
89
+ }
90
+ };
91
+
92
+ const handleCloseTooltip = () => {
93
+ setSelectedEvent(null);
94
+ };
95
+
96
+ // ---------------------------------------------------------
97
+ // 5) Tarih filtreleme => filteredDates
98
+ // ---------------------------------------------------------
99
+ const startIndex = dates.findIndex((d) => d.fullDate >= selectedDate);
100
+ const endIndex = startIndex + dayRange;
101
+ const filteredDates =
102
+ startIndex !== -1 ? dates.slice(startIndex, Math.min(endIndex, dates.length)) : [];
103
+
104
+ const today = programDate ? new Date(programDate) : new Date();
105
+ const todayIndex = filteredDates.findIndex(
106
+ (d) => new Date(d.fullDate).toDateString() === today.toDateString()
107
+ );
108
+ const totalDays = filteredDates.length;
109
+
110
+ // ---------------------------------------------------------
111
+ // 6) Grupları aç/kapa
112
+ // ---------------------------------------------------------
113
+ const toggleGroupCollapse = (groupName) => {
114
+ setCollapsedGroups((prev) => ({
115
+ ...prev,
116
+ [groupName]: !prev[groupName],
117
+ }));
118
+ };
119
+
120
+ // ---------------------------------------------------------
121
+ // 7) Navigation fonksiyonları
122
+ // ---------------------------------------------------------
123
+ const handleToday = () => {
124
+ const date = programDate ? new Date(programDate) : new Date();
125
+ date.setDate(date.getDate() - 3);
126
+ setSelectedDate(date);
127
+ };
128
+
129
+ const handleAdvance = () =>
130
+ setSelectedDate((prev) => new Date(prev.getTime() + 5 * 24 * 60 * 60 * 1000));
131
+
132
+ const handleRetreat = () =>
133
+ setSelectedDate((prev) => new Date(prev.getTime() - 5 * 24 * 60 * 60 * 1000));
134
+
135
+ const handleMonthRetreat = () =>
136
+ setSelectedDate((prev) => {
137
+ const newDate = new Date(prev);
138
+ newDate.setMonth(newDate.getMonth() - 1);
139
+ return newDate;
140
+ });
141
+
142
+ const handleMonthAdvance = () =>
143
+ setSelectedDate((prev) => {
144
+ const newDate = new Date(prev);
145
+ newDate.setMonth(newDate.getMonth() + 1);
146
+ return newDate;
147
+ });
148
+
149
+ // ---------------------------------------------------------
150
+ // 8) Dark Mode
151
+ // ---------------------------------------------------------
152
+ const toggleDarkMode = () => {
153
+ setIsDarkMode((prevMode) => !prevMode);
154
+ };
155
+
156
+ useEffect(() => {
157
+ document.body.classList.toggle("dark-mode", isDarkMode);
158
+ }, [isDarkMode]);
159
+
160
+ // ---------------------------------------------------------
161
+ // 9) Ay başlıklarını filtrele
162
+ // ---------------------------------------------------------
163
+ const filteredMonthHeaders = monthHeaders
164
+ .map((header) => {
165
+ const adjustedStartIndex = Math.max(header.startIndex, startIndex);
166
+ const adjustedEndIndex = Math.min(header.endIndex, endIndex - 1);
167
+ return {
168
+ ...header,
169
+ startIndex: adjustedStartIndex,
170
+ endIndex: adjustedEndIndex,
171
+ };
172
+ })
173
+ .filter((header) => header.startIndex <= header.endIndex);
174
+
175
+ // ---------------------------------------------------------
176
+ // 10) Return
177
+ // ---------------------------------------------------------
178
+ return (
179
+ <div className={`timeline-container ${isDarkMode ? "dark-mode" : ""}`}>
180
+ {/* Üst kısım: MasterHeader */}
181
+ {masterHeaderView && (
182
+ <div className="timeline-master-header">
183
+ <MasterHeader
184
+ onToday={handleToday}
185
+ onAdvance={handleAdvance}
186
+ onRetreat={handleRetreat}
187
+ onMonthAdvance={handleMonthAdvance}
188
+ onMonthRetreat={handleMonthRetreat}
189
+ dayRange={dayRange}
190
+ setDayRange={setDayRange} // dayRange'ı burada user değiştirebilir
191
+ isDarkMode={isDarkMode}
192
+ toggleDarkMode={toggleDarkMode}
193
+ />
194
+ </div>
195
+ )}
196
+ {/* Body: Sol kısım => Resources, Sağ kısım => timeline */}
197
+ <div className="timeline-body">
198
+ <div className="timeline-resources-container">
199
+ <ResourcesHeader content={resourceHeaderContent} />
200
+ <Resources
201
+ groupedResources={resources}
202
+ toggleGroupCollapse={toggleGroupCollapse}
203
+ collapsedGroups={collapsedGroups}
204
+ resourceSettings={resourceSettings}
205
+ />
206
+ </div>
207
+
208
+ {/*
209
+ Dış kap => .timeline-scrollable-container
210
+ horizontalScrollOn => overflow-x auto/hidden
211
+ */}
212
+ <div
213
+ className="timeline-scrollable-container"
214
+ style={{
215
+ overflowX: horizontalScrollOn ? "auto" : "hidden",
216
+ }}
217
+ >
218
+ {/*
219
+ İç kap => .timeline-header-content-wrapper
220
+ Genişlik => dayRange * cellWidth px (eğer horizontalScrollOn=true)
221
+ Yoksa 100% (scroll devre dışı)
222
+ */}
223
+ <div
224
+ className="timeline-header-content-wrapper"
225
+ style={{
226
+ width: horizontalScrollOn ? `${containerWidth}px` : "100%",
227
+ }}
228
+ >
229
+ <TimelineHeader
230
+ dates={filteredDates}
231
+ monthHeaders={filteredMonthHeaders}
232
+ />
233
+
234
+ <TimelineContent
235
+ // Props
236
+ groupedResources={resources}
237
+ dates={filteredDates}
238
+ collapsedGroups={collapsedGroups}
239
+ events={localEvents}
240
+ setEvents={setLocalEvents}
241
+ onEventClick={handleEventClick}
242
+ todayIndex={todayIndex}
243
+ totalDays={totalDays}
244
+ indicatorOn={indicatorOn}
245
+ resourceSettings={resourceSettings}
246
+ toggleGroupCollapse={toggleGroupCollapse}
247
+ setDropInfo={setDropInfo}
248
+
249
+ // Yeni prop'lar
250
+ eventsDragOn={eventsDragOn}
251
+ eventsExtendOn={eventsExtendOn}
252
+ createNewEventOn={createNewEventOn}
253
+ onDragInfo={onDragInfo}
254
+ onExtendInfo={onExtendInfo}
255
+ onCreateEventInfo={onCreateEventInfo}
256
+ onEventRightClick={onEventRightClick}
257
+ />
258
+
259
+ {/* Tooltip */}
260
+ {selectedEvent && (
261
+ <EventTooltip
262
+ event={selectedEvent}
263
+ position={tooltipPosition}
264
+ onClose={handleCloseTooltip}
265
+ onDelete={(eventId) =>
266
+ setLocalEvents((prev) => prev.filter((e) => e.id !== eventId))
267
+ }
268
+ />
269
+ )}
270
+ </div>
271
+ </div>
272
+ </div>
273
+ </div>
274
+ );
275
+ };
276
+
277
+ export default Timeline;
@@ -0,0 +1,8 @@
1
+ // src/components/Timeline/TimelineCell.js
2
+ import React from "react";
3
+
4
+ const TimelineCell = () => {
5
+ return <div style={{ width: "100%", height: "100%" }}></div>;
6
+ };
7
+
8
+ export default TimelineCell;