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.
- package/.babelrc +5 -3
- package/CHANGELOG.md +35 -0
- package/dist/Timeline.js +2292 -1
- package/dist/dist/components/Timeline/DragAndDropHandler.js +35 -0
- package/dist/dist/components/Timeline/EventTooltip.js +206 -0
- package/dist/dist/components/Timeline/Indicator.js +30 -0
- package/dist/dist/components/Timeline/MasterHeader.js +55 -0
- package/dist/dist/components/Timeline/Resources.js +53 -0
- package/dist/dist/components/Timeline/ResourcesHeader.js +14 -0
- package/dist/dist/components/Timeline/Timeline.css +534 -0
- package/dist/dist/components/Timeline/Timeline.js +277 -0
- package/dist/dist/components/Timeline/TimelineCell.js +8 -0
- package/dist/dist/components/Timeline/TimelineContent.js +422 -0
- package/dist/dist/components/Timeline/TimelineEvents.js +114 -0
- package/dist/dist/components/Timeline/TimelineHeader.js +43 -0
- package/dist/dist/components/Timeline/TimelineMonthContainer.js +29 -0
- package/dist/dist/components/Timeline/TimelineResources.js +16 -0
- package/dist/dist/hooks/useDragAndDrop.js +80 -0
- package/dist/dist/hooks/useEventDragDrop.js +120 -0
- package/dist/dist/hooks/useExtendEvent.js +28 -0
- package/dist/dist/utils/HorizontalVirtualScroll.js +0 -0
- package/dist/dist/utils/dateUtils.js +36 -0
- package/dist/dist/utils/filterTimelineData.js +21 -0
- package/dist/dist/utils/timelineUtils.js +40 -0
- package/package.json +2 -1
- package/public/index kutuphane /304/261c/304/261n.html" +43 -0
- package/public/index tasarim icin.html +20 -0
- package/src/App.js +161 -154
- package/src/components/Timeline/DatePickerComponent.js +17 -0
- package/src/components/Timeline/EventTooltip.js +1 -1
- package/src/components/Timeline/Indicator.js +1 -2
- package/src/components/Timeline/MasterHeader.js +36 -23
- package/src/components/Timeline/Timeline.css +90 -8
- package/src/components/Timeline/Timeline.js +71 -44
- package/src/components/Timeline/TimelineContent.js +154 -129
- package/src/hooks/useEventDragDrop.js +22 -16
- package/webpack.config.js +25 -7
- package/src/App copy.js +0 -185
- package/src/components/Timeline/TimelineContent copy.js +0 -421
|
@@ -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
|
+
|
|
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(
|
|
77
|
+
const [isDarkMode, setIsDarkMode] = useState(themeType === "dark");
|
|
78
|
+
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (themeType !== undefined) {
|
|
81
|
+
setIsDarkMode(themeType === "dark");
|
|
82
|
+
}
|
|
83
|
+
}, [themeType]);
|
|
63
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
|
|
@@ -119,43 +143,49 @@ const Timeline = ({
|
|
|
119
143
|
|
|
120
144
|
// ---------------------------------------------------------
|
|
121
145
|
// 7) Navigation fonksiyonları
|
|
122
|
-
// ---------------------------------------------------------
|
|
146
|
+
// --------------------------------------------------------- const { dates, monthHeaders } = timelineData;
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
const handleDateChange = (newDate) => {
|
|
151
|
+
setSelectedDate(new Date(newDate));
|
|
152
|
+
};
|
|
153
|
+
|
|
123
154
|
const handleToday = () => {
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
setSelectedDate(
|
|
155
|
+
const today = new Date();
|
|
156
|
+
today.setDate(today.getDate() - 3); // Bugünden 3 gün öncesini ayarla
|
|
157
|
+
setSelectedDate(today);
|
|
127
158
|
};
|
|
159
|
+
|
|
128
160
|
|
|
129
|
-
const handleAdvance = () =>
|
|
161
|
+
const handleAdvance = () => {
|
|
130
162
|
setSelectedDate((prev) => new Date(prev.getTime() + 5 * 24 * 60 * 60 * 1000));
|
|
163
|
+
};
|
|
131
164
|
|
|
132
|
-
const handleRetreat = () =>
|
|
165
|
+
const handleRetreat = () => {
|
|
133
166
|
setSelectedDate((prev) => new Date(prev.getTime() - 5 * 24 * 60 * 60 * 1000));
|
|
167
|
+
};
|
|
134
168
|
|
|
135
|
-
const
|
|
169
|
+
const handleMonthAdvance = () => {
|
|
136
170
|
setSelectedDate((prev) => {
|
|
137
171
|
const newDate = new Date(prev);
|
|
138
|
-
newDate.setMonth(newDate.getMonth()
|
|
172
|
+
newDate.setMonth(newDate.getMonth() + 1);
|
|
139
173
|
return newDate;
|
|
140
174
|
});
|
|
175
|
+
};
|
|
141
176
|
|
|
142
|
-
const
|
|
177
|
+
const handleMonthRetreat = () => {
|
|
143
178
|
setSelectedDate((prev) => {
|
|
144
179
|
const newDate = new Date(prev);
|
|
145
|
-
newDate.setMonth(newDate.getMonth()
|
|
180
|
+
newDate.setMonth(newDate.getMonth() - 1);
|
|
146
181
|
return newDate;
|
|
147
182
|
});
|
|
183
|
+
};
|
|
148
184
|
|
|
149
185
|
// ---------------------------------------------------------
|
|
150
186
|
// 8) Dark Mode
|
|
151
187
|
// ---------------------------------------------------------
|
|
152
|
-
const toggleDarkMode = () => {
|
|
153
|
-
setIsDarkMode((prevMode) => !prevMode);
|
|
154
|
-
};
|
|
155
188
|
|
|
156
|
-
useEffect(() => {
|
|
157
|
-
document.body.classList.toggle("dark-mode", isDarkMode);
|
|
158
|
-
}, [isDarkMode]);
|
|
159
189
|
|
|
160
190
|
// ---------------------------------------------------------
|
|
161
191
|
// 9) Ay başlıklarını filtrele
|
|
@@ -181,21 +211,22 @@ const Timeline = ({
|
|
|
181
211
|
{masterHeaderView && (
|
|
182
212
|
<div className="timeline-master-header">
|
|
183
213
|
<MasterHeader
|
|
214
|
+
selectedDate={selectedDate} // Seçili tarihi gönder
|
|
215
|
+
onDateSelect={handleDateChange}
|
|
184
216
|
onToday={handleToday}
|
|
185
217
|
onAdvance={handleAdvance}
|
|
186
218
|
onRetreat={handleRetreat}
|
|
187
219
|
onMonthAdvance={handleMonthAdvance}
|
|
188
220
|
onMonthRetreat={handleMonthRetreat}
|
|
189
221
|
dayRange={dayRange}
|
|
190
|
-
setDayRange={setDayRange}
|
|
191
|
-
isDarkMode={isDarkMode}
|
|
192
|
-
toggleDarkMode={toggleDarkMode}
|
|
222
|
+
setDayRange={setDayRange}
|
|
193
223
|
/>
|
|
194
224
|
</div>
|
|
195
225
|
)}
|
|
196
226
|
{/* Body: Sol kısım => Resources, Sağ kısım => timeline */}
|
|
197
227
|
<div className="timeline-body">
|
|
198
|
-
<div className="timeline-resources-container"
|
|
228
|
+
<div className="timeline-resources-container"
|
|
229
|
+
style={{ overflow: "hidden"}}>
|
|
199
230
|
<ResourcesHeader content={resourceHeaderContent} />
|
|
200
231
|
<Resources
|
|
201
232
|
groupedResources={resources}
|
|
@@ -205,21 +236,14 @@ const Timeline = ({
|
|
|
205
236
|
/>
|
|
206
237
|
</div>
|
|
207
238
|
|
|
208
|
-
|
|
209
|
-
Dış kap => .timeline-scrollable-container
|
|
210
|
-
horizontalScrollOn => overflow-x auto/hidden
|
|
211
|
-
*/}
|
|
239
|
+
|
|
212
240
|
<div
|
|
213
241
|
className="timeline-scrollable-container"
|
|
214
242
|
style={{
|
|
215
243
|
overflowX: horizontalScrollOn ? "auto" : "hidden",
|
|
216
244
|
}}
|
|
217
245
|
>
|
|
218
|
-
|
|
219
|
-
İç kap => .timeline-header-content-wrapper
|
|
220
|
-
Genişlik => dayRange * cellWidth px (eğer horizontalScrollOn=true)
|
|
221
|
-
Yoksa 100% (scroll devre dışı)
|
|
222
|
-
*/}
|
|
246
|
+
|
|
223
247
|
<div
|
|
224
248
|
className="timeline-header-content-wrapper"
|
|
225
249
|
style={{
|
|
@@ -231,22 +255,20 @@ const Timeline = ({
|
|
|
231
255
|
monthHeaders={filteredMonthHeaders}
|
|
232
256
|
/>
|
|
233
257
|
|
|
234
|
-
|
|
235
|
-
// Props
|
|
258
|
+
<TimelineContent
|
|
236
259
|
groupedResources={resources}
|
|
237
260
|
dates={filteredDates}
|
|
238
261
|
collapsedGroups={collapsedGroups}
|
|
239
262
|
events={localEvents}
|
|
240
263
|
setEvents={setLocalEvents}
|
|
241
|
-
onEventClick={
|
|
242
|
-
todayIndex={
|
|
243
|
-
|
|
264
|
+
onEventClick={onEventClick}
|
|
265
|
+
todayIndex={filteredDates.findIndex(
|
|
266
|
+
(d) => new Date(d.fullDate).toDateString() === new Date().toDateString()
|
|
267
|
+
)}
|
|
244
268
|
indicatorOn={indicatorOn}
|
|
245
269
|
resourceSettings={resourceSettings}
|
|
246
270
|
toggleGroupCollapse={toggleGroupCollapse}
|
|
247
271
|
setDropInfo={setDropInfo}
|
|
248
|
-
|
|
249
|
-
// Yeni prop'lar
|
|
250
272
|
eventsDragOn={eventsDragOn}
|
|
251
273
|
eventsExtendOn={eventsExtendOn}
|
|
252
274
|
createNewEventOn={createNewEventOn}
|
|
@@ -254,6 +276,11 @@ const Timeline = ({
|
|
|
254
276
|
onExtendInfo={onExtendInfo}
|
|
255
277
|
onCreateEventInfo={onCreateEventInfo}
|
|
256
278
|
onEventRightClick={onEventRightClick}
|
|
279
|
+
eventTooltipOn={eventTooltipOn} // Tooltip kontrolü
|
|
280
|
+
tooltipComponent={TooltipComponent} // Özelleştirilebilir Tooltip bileşeni
|
|
281
|
+
tempEventStyle = {tempEventStyle}
|
|
282
|
+
eventStyleResolver={eventStyleResolver}
|
|
283
|
+
|
|
257
284
|
/>
|
|
258
285
|
|
|
259
286
|
{/* Tooltip */}
|
|
@@ -18,22 +18,35 @@ const TimelineContent = ({
|
|
|
18
18
|
resourceSettings,
|
|
19
19
|
setDropInfo,
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
eventsDragOn = true,
|
|
23
23
|
eventsExtendOn = true,
|
|
24
24
|
createNewEventOn = true,
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
|
|
307
|
-
{
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
if (
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
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
|
-
|
|
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
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
53
|
-
|
|
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;
|