akfatimeline 2.2.4 → 2.2.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.
- package/dist/Timeline.js +52 -46
- package/dist/components/Timeline/Timeline.jsx +41 -13
- package/dist/components/Timeline/TimelineContent.jsx +5 -28
- package/package.json +1 -1
- package/src/App.js +22 -0
- package/src/components/Timeline/Timeline.jsx +41 -13
- package/src/components/Timeline/TimelineContent.jsx +5 -28
package/dist/Timeline.js
CHANGED
|
@@ -4002,7 +4002,13 @@ const TimelineContent = _ref => {
|
|
|
4002
4002
|
// Context menu açıldığında çağrılacak callback
|
|
4003
4003
|
|
|
4004
4004
|
// Disable Dates
|
|
4005
|
-
disableDates = null
|
|
4005
|
+
disableDates = null,
|
|
4006
|
+
// { mode: 'exclude' | 'include', dates: [], ranges: [] }
|
|
4007
|
+
|
|
4008
|
+
// Auto Select Enabled Range
|
|
4009
|
+
autoSelectEnabledRange = false,
|
|
4010
|
+
// true = belirtilen range'lere tıklandığında otomatik olarak tüm range'i seç
|
|
4011
|
+
autoSelectRanges = null // [{ start: '2025-12-31', end: '2026-01-05' }, ...] - Auto-select için range'ler (disableDates'ten bağımsız)
|
|
4006
4012
|
} = _ref;
|
|
4007
4013
|
// ------------------- HOOKS & STATE -------------------
|
|
4008
4014
|
const containerRef = (0,external_react_.useRef)(null);
|
|
@@ -4235,7 +4241,6 @@ const TimelineContent = _ref => {
|
|
|
4235
4241
|
if (!createNewEventOn) return;
|
|
4236
4242
|
if (!isCreating) return;
|
|
4237
4243
|
if (mode === "extend") {
|
|
4238
|
-
console.log(">>> 'extend' mode, skip new event creation");
|
|
4239
4244
|
return;
|
|
4240
4245
|
}
|
|
4241
4246
|
const handleMouseMove = e => {
|
|
@@ -4393,16 +4398,10 @@ const TimelineContent = _ref => {
|
|
|
4393
4398
|
|
|
4394
4399
|
// ------------------- Drag Logic -------------------
|
|
4395
4400
|
const handleDragStartSafe = (e, eventId) => {
|
|
4396
|
-
console.log("[TimelineContent] handleDragStartSafe called:", {
|
|
4397
|
-
eventId,
|
|
4398
|
-
eventsDragOn
|
|
4399
|
-
});
|
|
4400
4401
|
if (!eventsDragOn) {
|
|
4401
|
-
console.log("[TimelineContent] Events drag is disabled, preventing drag start");
|
|
4402
4402
|
e.preventDefault();
|
|
4403
4403
|
return;
|
|
4404
4404
|
}
|
|
4405
|
-
console.log("[TimelineContent] Calling handleDragStart...");
|
|
4406
4405
|
handleDragStart(e, eventId);
|
|
4407
4406
|
};
|
|
4408
4407
|
const handleDragEndSafe = e => {
|
|
@@ -4417,7 +4416,6 @@ const TimelineContent = _ref => {
|
|
|
4417
4416
|
const handleMouseDownExtend = (mouseEvent, event) => {
|
|
4418
4417
|
if (!eventsExtendOn) return;
|
|
4419
4418
|
mouseEvent.stopPropagation();
|
|
4420
|
-
console.log(">>> Extend start ID:", event.id);
|
|
4421
4419
|
setMode("extend");
|
|
4422
4420
|
setExtendingEvent(event);
|
|
4423
4421
|
setOriginalEndDate(event.endDate);
|
|
@@ -4437,7 +4435,6 @@ const TimelineContent = _ref => {
|
|
|
4437
4435
|
}) : evt));
|
|
4438
4436
|
}, [mode, extendingEvent, eventsExtendOn, originalEndDate, startMouseX, setEvents]);
|
|
4439
4437
|
const handleMouseUpExtend = (0,external_react_.useCallback)(() => {
|
|
4440
|
-
console.log(">>> Extend finished ID:", extendingEvent === null || extendingEvent === void 0 ? void 0 : extendingEvent.id);
|
|
4441
4438
|
if (onExtendInfo && extendingEvent) {
|
|
4442
4439
|
// callback
|
|
4443
4440
|
const updatedEvent = events.find(ev => ev.id === extendingEvent.id);
|
|
@@ -4584,15 +4581,6 @@ const TimelineContent = _ref => {
|
|
|
4584
4581
|
const cellDateOnly = new Date(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());
|
|
4585
4582
|
const preventPastEventsDateOnly = new Date(preventPastEventsDateObj.getFullYear(), preventPastEventsDateObj.getMonth(), preventPastEventsDateObj.getDate());
|
|
4586
4583
|
isPastDate = cellDateOnly < preventPastEventsDateOnly;
|
|
4587
|
-
// Debug: İlk birkaç hücre için log
|
|
4588
|
-
if (colIndex < 3 && groupIndex === 0) {
|
|
4589
|
-
console.log('[TimelineContent] Past date check:', {
|
|
4590
|
-
cellDate: cellDateOnly.toISOString().split('T')[0],
|
|
4591
|
-
preventPastEventsDateValue: preventPastEventsDateOnly.toISOString().split('T')[0],
|
|
4592
|
-
isPastDate,
|
|
4593
|
-
preventPastEvents
|
|
4594
|
-
});
|
|
4595
|
-
}
|
|
4596
4584
|
}
|
|
4597
4585
|
|
|
4598
4586
|
// Disabled tarih kontrolü
|
|
@@ -4706,7 +4694,6 @@ const TimelineContent = _ref => {
|
|
|
4706
4694
|
e.preventDefault();
|
|
4707
4695
|
return;
|
|
4708
4696
|
}
|
|
4709
|
-
console.log("[TimelineContent] Event drag start:", event.id);
|
|
4710
4697
|
handleDragStart(e, event.id);
|
|
4711
4698
|
e.stopPropagation();
|
|
4712
4699
|
|
|
@@ -4775,15 +4762,6 @@ const TimelineContent = _ref => {
|
|
|
4775
4762
|
const cellDateOnly = new Date(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());
|
|
4776
4763
|
const preventPastEventsDateOnly = new Date(preventPastEventsDateObj.getFullYear(), preventPastEventsDateObj.getMonth(), preventPastEventsDateObj.getDate());
|
|
4777
4764
|
isPastDate = cellDateOnly < preventPastEventsDateOnly;
|
|
4778
|
-
// Debug: İlk birkaç hücre için log
|
|
4779
|
-
if (colIndex < 3 && rowIndex === 0 && groupIndex === 0) {
|
|
4780
|
-
console.log('[TimelineContent] Cell past date check:', {
|
|
4781
|
-
cellDate: cellDateOnly.toISOString().split('T')[0],
|
|
4782
|
-
preventPastEventsDateValue: preventPastEventsDateOnly.toISOString().split('T')[0],
|
|
4783
|
-
isPastDate,
|
|
4784
|
-
preventPastEvents
|
|
4785
|
-
});
|
|
4786
|
-
}
|
|
4787
4765
|
}
|
|
4788
4766
|
|
|
4789
4767
|
// Hafta sonu kontrolü
|
|
@@ -4865,7 +4843,6 @@ const TimelineContent = _ref => {
|
|
|
4865
4843
|
}
|
|
4866
4844
|
e.preventDefault();
|
|
4867
4845
|
e.stopPropagation();
|
|
4868
|
-
console.log("[TimelineContent] onDragOver called for resource:", resource.id);
|
|
4869
4846
|
handleDragOver(e);
|
|
4870
4847
|
},
|
|
4871
4848
|
onDrop: e => {
|
|
@@ -4878,7 +4855,6 @@ const TimelineContent = _ref => {
|
|
|
4878
4855
|
}
|
|
4879
4856
|
e.preventDefault();
|
|
4880
4857
|
e.stopPropagation();
|
|
4881
|
-
console.log("[TimelineContent] onDrop called for resource:", resource.id, "date:", dateObj.fullDate);
|
|
4882
4858
|
handleDrop(e, resource.id, parseDate(dateObj.fullDate));
|
|
4883
4859
|
}
|
|
4884
4860
|
});
|
|
@@ -5980,10 +5956,18 @@ const Timeline_Timeline_Timeline = _ref => {
|
|
|
5980
5956
|
// Özelleştirilebilir tuş haritası
|
|
5981
5957
|
|
|
5982
5958
|
// Disable Dates
|
|
5983
|
-
disableDates = null
|
|
5959
|
+
disableDates = null,
|
|
5960
|
+
// { mode: 'exclude' | 'include', dates: [], ranges: [] }
|
|
5984
5961
|
// mode: 'exclude' = belirtilen tarihler disabled, 'include' = belirtilen tarihler enabled (diğerleri disabled)
|
|
5985
5962
|
// dates: ['2025-01-15', '2025-01-20', ...] veya [Date, Date, ...] - Tekil tarihler
|
|
5986
5963
|
// ranges: [{ start: '2025-01-15', end: '2025-01-20' }, ...] veya [{ start: Date, end: Date }, ...] - Tarih aralıkları
|
|
5964
|
+
|
|
5965
|
+
// Auto Select Enabled Range
|
|
5966
|
+
autoSelectEnabledRange = false,
|
|
5967
|
+
// true = belirtilen range'lere tıklandığında otomatik olarak tüm range'i seç
|
|
5968
|
+
autoSelectRanges = null // [{ start: '2025-12-31', end: '2026-01-05' }, ...] - Auto-select için range'ler (disableDates'ten bağımsız)
|
|
5969
|
+
// autoSelectRanges tanımlı olduğunda, tıklanan tarih bu range'lerden birinin içindeyse otomatik olarak tüm range seçilir
|
|
5970
|
+
// autoSelectRanges: null ise ve disableDates mode: 'include' ise, disableDates.ranges kullanılır (geriye dönük uyumluluk)
|
|
5987
5971
|
} = _ref;
|
|
5988
5972
|
// ---------------------------------------------------------
|
|
5989
5973
|
// 1) timelineData oluştur (dates, monthHeaders vs.)
|
|
@@ -6013,6 +5997,13 @@ const Timeline_Timeline_Timeline = _ref => {
|
|
|
6013
5997
|
// ---------------------------------------------------------
|
|
6014
5998
|
const [collapsedGroups, setCollapsedGroups] = (0,external_react_.useState)({});
|
|
6015
5999
|
|
|
6000
|
+
// Internal zoom state - eğer setZoomLevel prop'u yoksa kullanılır
|
|
6001
|
+
const [internalZoomLevel, setInternalZoomLevel] = (0,external_react_.useState)(zoomLevel);
|
|
6002
|
+
|
|
6003
|
+
// Effective zoom level - prop varsa prop'u kullan, yoksa internal state'i kullan
|
|
6004
|
+
const effectiveZoomLevel = setZoomLevel ? zoomLevel : internalZoomLevel;
|
|
6005
|
+
const effectiveSetZoomLevel = setZoomLevel || setInternalZoomLevel;
|
|
6006
|
+
|
|
6016
6007
|
// Event Management
|
|
6017
6008
|
const eventManagement = hooks_useEventManagement(events, newEvents => {
|
|
6018
6009
|
setLocalEvents(newEvents);
|
|
@@ -6063,9 +6054,17 @@ const Timeline_Timeline_Timeline = _ref => {
|
|
|
6063
6054
|
// Container genişliği = dayRange * cellWidth
|
|
6064
6055
|
// ---------------------------------------------------------
|
|
6065
6056
|
const baseCellWidth = 56.95; // Temel hücre genişliği (zoom = 1.0 için)
|
|
6066
|
-
const cellWidth = baseCellWidth *
|
|
6057
|
+
const cellWidth = baseCellWidth * effectiveZoomLevel; // Zoom seviyesine göre hücre genişliği
|
|
6067
6058
|
const containerWidth = dayRange * cellWidth;
|
|
6068
6059
|
|
|
6060
|
+
// Internal zoom state'i prop'tan gelen zoomLevel ile senkronize et
|
|
6061
|
+
(0,external_react_.useEffect)(() => {
|
|
6062
|
+
if (setZoomLevel) {
|
|
6063
|
+
// Prop'tan gelen zoomLevel kullanılıyor, internal state'i güncelle
|
|
6064
|
+
setInternalZoomLevel(zoomLevel);
|
|
6065
|
+
}
|
|
6066
|
+
}, [zoomLevel, setZoomLevel]);
|
|
6067
|
+
|
|
6069
6068
|
// ---------------------------------------------------------
|
|
6070
6069
|
// 4) Touch Gestures (Mobil desteği)
|
|
6071
6070
|
// ---------------------------------------------------------
|
|
@@ -6162,11 +6161,16 @@ const Timeline_Timeline_Timeline = _ref => {
|
|
|
6162
6161
|
setSelectedDate(new Date(newDate));
|
|
6163
6162
|
};
|
|
6164
6163
|
const handleToday = () => {
|
|
6165
|
-
|
|
6166
|
-
today
|
|
6164
|
+
// Bugünün tarihini al
|
|
6165
|
+
const today = new Date();
|
|
6166
|
+
today.setDate(today.getDate() - 3); // Bugünden 3 gün öncesini ayarla
|
|
6167
6167
|
setSelectedDate(today);
|
|
6168
|
-
|
|
6169
|
-
|
|
6168
|
+
|
|
6169
|
+
// onToday callback'i bir fonksiyon ise çağır
|
|
6170
|
+
// Eğer onToday bir string (tarih) ise veya başka bir değer ise, sadece setSelectedDate yeterli
|
|
6171
|
+
if (typeof onToday === 'function') {
|
|
6172
|
+
onToday();
|
|
6173
|
+
}
|
|
6170
6174
|
};
|
|
6171
6175
|
const handleAdvance = () => {
|
|
6172
6176
|
setSelectedDate(prev => new Date(prev.getTime() + 5 * 24 * 60 * 60 * 1000));
|
|
@@ -6205,15 +6209,15 @@ const Timeline_Timeline_Timeline = _ref => {
|
|
|
6205
6209
|
// 8.5) Zoom handlers
|
|
6206
6210
|
// ---------------------------------------------------------
|
|
6207
6211
|
const handleZoomIn = (0,external_react_.useCallback)(() => {
|
|
6208
|
-
if (
|
|
6209
|
-
|
|
6212
|
+
if (zoomOn) {
|
|
6213
|
+
effectiveSetZoomLevel(prev => Math.min(maxZoomLevel, prev + zoomStep));
|
|
6210
6214
|
}
|
|
6211
|
-
}, [
|
|
6215
|
+
}, [zoomOn, maxZoomLevel, zoomStep, effectiveSetZoomLevel]);
|
|
6212
6216
|
const handleZoomOut = (0,external_react_.useCallback)(() => {
|
|
6213
|
-
if (
|
|
6214
|
-
|
|
6217
|
+
if (zoomOn) {
|
|
6218
|
+
effectiveSetZoomLevel(prev => Math.max(minZoomLevel, prev - zoomStep));
|
|
6215
6219
|
}
|
|
6216
|
-
}, [
|
|
6220
|
+
}, [zoomOn, minZoomLevel, zoomStep, effectiveSetZoomLevel]);
|
|
6217
6221
|
|
|
6218
6222
|
// ---------------------------------------------------------
|
|
6219
6223
|
// 8.6) Keyboard Shortcuts
|
|
@@ -6265,8 +6269,8 @@ const Timeline_Timeline_Timeline = _ref => {
|
|
|
6265
6269
|
onMonthRetreat: handleMonthRetreat,
|
|
6266
6270
|
dayRange: dayRange,
|
|
6267
6271
|
setDayRange: setDayRange,
|
|
6268
|
-
zoomLevel:
|
|
6269
|
-
setZoomLevel:
|
|
6272
|
+
zoomLevel: effectiveZoomLevel,
|
|
6273
|
+
setZoomLevel: effectiveSetZoomLevel,
|
|
6270
6274
|
zoomOn: zoomOn,
|
|
6271
6275
|
minZoomLevel: minZoomLevel,
|
|
6272
6276
|
maxZoomLevel: maxZoomLevel,
|
|
@@ -6361,7 +6365,9 @@ const Timeline_Timeline_Timeline = _ref => {
|
|
|
6361
6365
|
eventBadgeResolver: eventBadgeResolver,
|
|
6362
6366
|
isLoading: isLoading,
|
|
6363
6367
|
loadingType: loadingType,
|
|
6364
|
-
disableDates: disableDates
|
|
6368
|
+
disableDates: disableDates,
|
|
6369
|
+
autoSelectEnabledRange: autoSelectEnabledRange,
|
|
6370
|
+
autoSelectRanges: autoSelectRanges
|
|
6365
6371
|
}), selectedEvent && /*#__PURE__*/external_react_default().createElement(Timeline_EventTooltip, {
|
|
6366
6372
|
event: selectedEvent,
|
|
6367
6373
|
position: tooltipPosition,
|
|
@@ -127,6 +127,12 @@ const Timeline = ({
|
|
|
127
127
|
// mode: 'exclude' = belirtilen tarihler disabled, 'include' = belirtilen tarihler enabled (diğerleri disabled)
|
|
128
128
|
// dates: ['2025-01-15', '2025-01-20', ...] veya [Date, Date, ...] - Tekil tarihler
|
|
129
129
|
// ranges: [{ start: '2025-01-15', end: '2025-01-20' }, ...] veya [{ start: Date, end: Date }, ...] - Tarih aralıkları
|
|
130
|
+
|
|
131
|
+
// Auto Select Enabled Range
|
|
132
|
+
autoSelectEnabledRange = false, // true = belirtilen range'lere tıklandığında otomatik olarak tüm range'i seç
|
|
133
|
+
autoSelectRanges = null, // [{ start: '2025-12-31', end: '2026-01-05' }, ...] - Auto-select için range'ler (disableDates'ten bağımsız)
|
|
134
|
+
// autoSelectRanges tanımlı olduğunda, tıklanan tarih bu range'lerden birinin içindeyse otomatik olarak tüm range seçilir
|
|
135
|
+
// autoSelectRanges: null ise ve disableDates mode: 'include' ise, disableDates.ranges kullanılır (geriye dönük uyumluluk)
|
|
130
136
|
}) => {
|
|
131
137
|
// ---------------------------------------------------------
|
|
132
138
|
// 1) timelineData oluştur (dates, monthHeaders vs.)
|
|
@@ -152,6 +158,13 @@ const Timeline = ({
|
|
|
152
158
|
// 2) local state
|
|
153
159
|
// ---------------------------------------------------------
|
|
154
160
|
const [collapsedGroups, setCollapsedGroups] = useState({});
|
|
161
|
+
|
|
162
|
+
// Internal zoom state - eğer setZoomLevel prop'u yoksa kullanılır
|
|
163
|
+
const [internalZoomLevel, setInternalZoomLevel] = useState(zoomLevel);
|
|
164
|
+
|
|
165
|
+
// Effective zoom level - prop varsa prop'u kullan, yoksa internal state'i kullan
|
|
166
|
+
const effectiveZoomLevel = setZoomLevel ? zoomLevel : internalZoomLevel;
|
|
167
|
+
const effectiveSetZoomLevel = setZoomLevel || setInternalZoomLevel;
|
|
155
168
|
|
|
156
169
|
// Event Management
|
|
157
170
|
const eventManagement = useEventManagement(
|
|
@@ -206,9 +219,17 @@ const Timeline = ({
|
|
|
206
219
|
// Container genişliği = dayRange * cellWidth
|
|
207
220
|
// ---------------------------------------------------------
|
|
208
221
|
const baseCellWidth = 56.95; // Temel hücre genişliği (zoom = 1.0 için)
|
|
209
|
-
const cellWidth = baseCellWidth *
|
|
222
|
+
const cellWidth = baseCellWidth * effectiveZoomLevel; // Zoom seviyesine göre hücre genişliği
|
|
210
223
|
const containerWidth = dayRange * cellWidth;
|
|
211
224
|
|
|
225
|
+
// Internal zoom state'i prop'tan gelen zoomLevel ile senkronize et
|
|
226
|
+
useEffect(() => {
|
|
227
|
+
if (setZoomLevel) {
|
|
228
|
+
// Prop'tan gelen zoomLevel kullanılıyor, internal state'i güncelle
|
|
229
|
+
setInternalZoomLevel(zoomLevel);
|
|
230
|
+
}
|
|
231
|
+
}, [zoomLevel, setZoomLevel]);
|
|
232
|
+
|
|
212
233
|
// ---------------------------------------------------------
|
|
213
234
|
// 4) Touch Gestures (Mobil desteği)
|
|
214
235
|
// ---------------------------------------------------------
|
|
@@ -321,11 +342,16 @@ const Timeline = ({
|
|
|
321
342
|
};
|
|
322
343
|
|
|
323
344
|
const handleToday = () => {
|
|
324
|
-
|
|
325
|
-
today
|
|
345
|
+
// Bugünün tarihini al
|
|
346
|
+
const today = new Date();
|
|
347
|
+
today.setDate(today.getDate() - 3); // Bugünden 3 gün öncesini ayarla
|
|
326
348
|
setSelectedDate(today);
|
|
327
|
-
|
|
328
|
-
|
|
349
|
+
|
|
350
|
+
// onToday callback'i bir fonksiyon ise çağır
|
|
351
|
+
// Eğer onToday bir string (tarih) ise veya başka bir değer ise, sadece setSelectedDate yeterli
|
|
352
|
+
if (typeof onToday === 'function') {
|
|
353
|
+
onToday();
|
|
354
|
+
}
|
|
329
355
|
};
|
|
330
356
|
|
|
331
357
|
|
|
@@ -370,16 +396,16 @@ const Timeline = ({
|
|
|
370
396
|
// 8.5) Zoom handlers
|
|
371
397
|
// ---------------------------------------------------------
|
|
372
398
|
const handleZoomIn = useCallback(() => {
|
|
373
|
-
if (
|
|
374
|
-
|
|
399
|
+
if (zoomOn) {
|
|
400
|
+
effectiveSetZoomLevel((prev) => Math.min(maxZoomLevel, prev + zoomStep));
|
|
375
401
|
}
|
|
376
|
-
}, [
|
|
402
|
+
}, [zoomOn, maxZoomLevel, zoomStep, effectiveSetZoomLevel]);
|
|
377
403
|
|
|
378
404
|
const handleZoomOut = useCallback(() => {
|
|
379
|
-
if (
|
|
380
|
-
|
|
405
|
+
if (zoomOn) {
|
|
406
|
+
effectiveSetZoomLevel((prev) => Math.max(minZoomLevel, prev - zoomStep));
|
|
381
407
|
}
|
|
382
|
-
}, [
|
|
408
|
+
}, [zoomOn, minZoomLevel, zoomStep, effectiveSetZoomLevel]);
|
|
383
409
|
|
|
384
410
|
// ---------------------------------------------------------
|
|
385
411
|
// 8.6) Keyboard Shortcuts
|
|
@@ -437,8 +463,8 @@ const Timeline = ({
|
|
|
437
463
|
onMonthRetreat={handleMonthRetreat}
|
|
438
464
|
dayRange={dayRange}
|
|
439
465
|
setDayRange={setDayRange}
|
|
440
|
-
zoomLevel={
|
|
441
|
-
setZoomLevel={
|
|
466
|
+
zoomLevel={effectiveZoomLevel}
|
|
467
|
+
setZoomLevel={effectiveSetZoomLevel}
|
|
442
468
|
zoomOn={zoomOn}
|
|
443
469
|
minZoomLevel={minZoomLevel}
|
|
444
470
|
maxZoomLevel={maxZoomLevel}
|
|
@@ -541,6 +567,8 @@ const Timeline = ({
|
|
|
541
567
|
isLoading={isLoading}
|
|
542
568
|
loadingType={loadingType}
|
|
543
569
|
disableDates={disableDates}
|
|
570
|
+
autoSelectEnabledRange={autoSelectEnabledRange}
|
|
571
|
+
autoSelectRanges={autoSelectRanges}
|
|
544
572
|
|
|
545
573
|
/>
|
|
546
574
|
|
|
@@ -70,6 +70,10 @@ const TimelineContent = ({
|
|
|
70
70
|
|
|
71
71
|
// Disable Dates
|
|
72
72
|
disableDates = null, // { mode: 'exclude' | 'include', dates: [], ranges: [] }
|
|
73
|
+
|
|
74
|
+
// Auto Select Enabled Range
|
|
75
|
+
autoSelectEnabledRange = false, // true = belirtilen range'lere tıklandığında otomatik olarak tüm range'i seç
|
|
76
|
+
autoSelectRanges = null, // [{ start: '2025-12-31', end: '2026-01-05' }, ...] - Auto-select için range'ler (disableDates'ten bağımsız)
|
|
73
77
|
}) => {
|
|
74
78
|
// ------------------- HOOKS & STATE -------------------
|
|
75
79
|
const containerRef = useRef(null);
|
|
@@ -304,7 +308,6 @@ const TimelineContent = ({
|
|
|
304
308
|
if (!createNewEventOn) return;
|
|
305
309
|
if (!isCreating) return;
|
|
306
310
|
if (mode === "extend") {
|
|
307
|
-
console.log(">>> 'extend' mode, skip new event creation");
|
|
308
311
|
return;
|
|
309
312
|
}
|
|
310
313
|
|
|
@@ -470,13 +473,10 @@ const TimelineContent = ({
|
|
|
470
473
|
|
|
471
474
|
// ------------------- Drag Logic -------------------
|
|
472
475
|
const handleDragStartSafe = (e, eventId) => {
|
|
473
|
-
console.log("[TimelineContent] handleDragStartSafe called:", { eventId, eventsDragOn });
|
|
474
476
|
if (!eventsDragOn) {
|
|
475
|
-
console.log("[TimelineContent] Events drag is disabled, preventing drag start");
|
|
476
477
|
e.preventDefault();
|
|
477
478
|
return;
|
|
478
479
|
}
|
|
479
|
-
console.log("[TimelineContent] Calling handleDragStart...");
|
|
480
480
|
handleDragStart(e, eventId);
|
|
481
481
|
};
|
|
482
482
|
const handleDragEndSafe = (e) => {
|
|
@@ -495,7 +495,6 @@ const TimelineContent = ({
|
|
|
495
495
|
const handleMouseDownExtend = (mouseEvent, event) => {
|
|
496
496
|
if (!eventsExtendOn) return;
|
|
497
497
|
mouseEvent.stopPropagation();
|
|
498
|
-
console.log(">>> Extend start ID:", event.id);
|
|
499
498
|
setMode("extend");
|
|
500
499
|
setExtendingEvent(event);
|
|
501
500
|
setOriginalEndDate(event.endDate);
|
|
@@ -521,7 +520,6 @@ const TimelineContent = ({
|
|
|
521
520
|
}, [mode, extendingEvent, eventsExtendOn, originalEndDate, startMouseX, setEvents]);
|
|
522
521
|
|
|
523
522
|
const handleMouseUpExtend = useCallback(() => {
|
|
524
|
-
console.log(">>> Extend finished ID:", extendingEvent?.id);
|
|
525
523
|
if (onExtendInfo && extendingEvent) {
|
|
526
524
|
// callback
|
|
527
525
|
const updatedEvent = events.find((ev) => ev.id === extendingEvent.id);
|
|
@@ -682,15 +680,6 @@ const TimelineContent = ({
|
|
|
682
680
|
const cellDateOnly = new Date(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());
|
|
683
681
|
const preventPastEventsDateOnly = new Date(preventPastEventsDateObj.getFullYear(), preventPastEventsDateObj.getMonth(), preventPastEventsDateObj.getDate());
|
|
684
682
|
isPastDate = cellDateOnly < preventPastEventsDateOnly;
|
|
685
|
-
// Debug: İlk birkaç hücre için log
|
|
686
|
-
if (colIndex < 3 && groupIndex === 0) {
|
|
687
|
-
console.log('[TimelineContent] Past date check:', {
|
|
688
|
-
cellDate: cellDateOnly.toISOString().split('T')[0],
|
|
689
|
-
preventPastEventsDateValue: preventPastEventsDateOnly.toISOString().split('T')[0],
|
|
690
|
-
isPastDate,
|
|
691
|
-
preventPastEvents
|
|
692
|
-
});
|
|
693
|
-
}
|
|
694
683
|
}
|
|
695
684
|
|
|
696
685
|
// Disabled tarih kontrolü
|
|
@@ -817,7 +806,6 @@ const TimelineContent = ({
|
|
|
817
806
|
e.preventDefault();
|
|
818
807
|
return;
|
|
819
808
|
}
|
|
820
|
-
console.log("[TimelineContent] Event drag start:", event.id);
|
|
821
809
|
handleDragStart(e, event.id);
|
|
822
810
|
e.stopPropagation();
|
|
823
811
|
|
|
@@ -908,15 +896,6 @@ const TimelineContent = ({
|
|
|
908
896
|
const cellDateOnly = new Date(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());
|
|
909
897
|
const preventPastEventsDateOnly = new Date(preventPastEventsDateObj.getFullYear(), preventPastEventsDateObj.getMonth(), preventPastEventsDateObj.getDate());
|
|
910
898
|
isPastDate = cellDateOnly < preventPastEventsDateOnly;
|
|
911
|
-
// Debug: İlk birkaç hücre için log
|
|
912
|
-
if (colIndex < 3 && rowIndex === 0 && groupIndex === 0) {
|
|
913
|
-
console.log('[TimelineContent] Cell past date check:', {
|
|
914
|
-
cellDate: cellDateOnly.toISOString().split('T')[0],
|
|
915
|
-
preventPastEventsDateValue: preventPastEventsDateOnly.toISOString().split('T')[0],
|
|
916
|
-
isPastDate,
|
|
917
|
-
preventPastEvents
|
|
918
|
-
});
|
|
919
|
-
}
|
|
920
899
|
}
|
|
921
900
|
|
|
922
901
|
// Hafta sonu kontrolü
|
|
@@ -1004,7 +983,6 @@ const TimelineContent = ({
|
|
|
1004
983
|
}
|
|
1005
984
|
e.preventDefault();
|
|
1006
985
|
e.stopPropagation();
|
|
1007
|
-
console.log("[TimelineContent] onDragOver called for resource:", resource.id);
|
|
1008
986
|
handleDragOver(e);
|
|
1009
987
|
}}
|
|
1010
988
|
onDrop={(e) => {
|
|
@@ -1016,8 +994,7 @@ const TimelineContent = ({
|
|
|
1016
994
|
return false;
|
|
1017
995
|
}
|
|
1018
996
|
e.preventDefault();
|
|
1019
|
-
e.stopPropagation();
|
|
1020
|
-
console.log("[TimelineContent] onDrop called for resource:", resource.id, "date:", dateObj.fullDate);
|
|
997
|
+
e.stopPropagation();
|
|
1021
998
|
handleDrop(e, resource.id, parseDate(dateObj.fullDate));
|
|
1022
999
|
}}
|
|
1023
1000
|
></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "akfatimeline",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.6",
|
|
4
4
|
"description": "A customizable timeline component for React applications with disableDates, custom header buttons, and past date protection features",
|
|
5
5
|
"main": "./src/library.js",
|
|
6
6
|
"module": "./src/library.js",
|
package/src/App.js
CHANGED
|
@@ -55,6 +55,23 @@ const App = () => {
|
|
|
55
55
|
],
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
+
// Auto Select Enabled Range - Belirtilen range'lere tıklandığında otomatik olarak tüm range'i seç
|
|
59
|
+
const [autoSelectEnabledRange, setAutoSelectEnabledRange] = useState(true); // true = aktif, false = pasif
|
|
60
|
+
|
|
61
|
+
// Auto Select Ranges - Auto-select için range'ler (disableDates'ten bağımsız)
|
|
62
|
+
// Bu range'lere tıklandığında otomatik olarak tüm range seçilir
|
|
63
|
+
const autoSelectRanges = [
|
|
64
|
+
{
|
|
65
|
+
start: '2025-12-31', // 31 Aralık 2025
|
|
66
|
+
end: '2026-01-05', // 5 Ocak 2026
|
|
67
|
+
},
|
|
68
|
+
// İstediğiniz kadar range ekleyebilirsiniz
|
|
69
|
+
// {
|
|
70
|
+
// start: '2026-02-01',
|
|
71
|
+
// end: '2026-02-10',
|
|
72
|
+
// },
|
|
73
|
+
];
|
|
74
|
+
|
|
58
75
|
// Cell Tooltip için örnek fiyat verisi
|
|
59
76
|
// Her gün için farklı fiyatlar tanımlanabilir
|
|
60
77
|
const getCellTooltipContent = (resource, dateObj) => {
|
|
@@ -450,6 +467,9 @@ const resources = [
|
|
|
450
467
|
<button onClick={() => setIsLoading(!isLoading)}>
|
|
451
468
|
Loading: {isLoading ? "Açık" : "Kapalı"}
|
|
452
469
|
</button>
|
|
470
|
+
<button onClick={() => setAutoSelectEnabledRange(!autoSelectEnabledRange)}>
|
|
471
|
+
Auto Select Enabled Range: {autoSelectEnabledRange ? "Açık" : "Kapalı"}
|
|
472
|
+
</button>
|
|
453
473
|
<button onClick={handleToday}>Bugüne Git</button>
|
|
454
474
|
<button onClick={handleRetreat}>5 Gün Geri</button>
|
|
455
475
|
<button onClick={handleAdvance}>5 Gün İleri</button>
|
|
@@ -561,6 +581,8 @@ const resources = [
|
|
|
561
581
|
/>
|
|
562
582
|
}
|
|
563
583
|
disableDates={disableDates}
|
|
584
|
+
autoSelectEnabledRange={autoSelectEnabledRange}
|
|
585
|
+
autoSelectRanges={autoSelectRanges}
|
|
564
586
|
|
|
565
587
|
/>
|
|
566
588
|
</div>
|
|
@@ -127,6 +127,12 @@ const Timeline = ({
|
|
|
127
127
|
// mode: 'exclude' = belirtilen tarihler disabled, 'include' = belirtilen tarihler enabled (diğerleri disabled)
|
|
128
128
|
// dates: ['2025-01-15', '2025-01-20', ...] veya [Date, Date, ...] - Tekil tarihler
|
|
129
129
|
// ranges: [{ start: '2025-01-15', end: '2025-01-20' }, ...] veya [{ start: Date, end: Date }, ...] - Tarih aralıkları
|
|
130
|
+
|
|
131
|
+
// Auto Select Enabled Range
|
|
132
|
+
autoSelectEnabledRange = false, // true = belirtilen range'lere tıklandığında otomatik olarak tüm range'i seç
|
|
133
|
+
autoSelectRanges = null, // [{ start: '2025-12-31', end: '2026-01-05' }, ...] - Auto-select için range'ler (disableDates'ten bağımsız)
|
|
134
|
+
// autoSelectRanges tanımlı olduğunda, tıklanan tarih bu range'lerden birinin içindeyse otomatik olarak tüm range seçilir
|
|
135
|
+
// autoSelectRanges: null ise ve disableDates mode: 'include' ise, disableDates.ranges kullanılır (geriye dönük uyumluluk)
|
|
130
136
|
}) => {
|
|
131
137
|
// ---------------------------------------------------------
|
|
132
138
|
// 1) timelineData oluştur (dates, monthHeaders vs.)
|
|
@@ -152,6 +158,13 @@ const Timeline = ({
|
|
|
152
158
|
// 2) local state
|
|
153
159
|
// ---------------------------------------------------------
|
|
154
160
|
const [collapsedGroups, setCollapsedGroups] = useState({});
|
|
161
|
+
|
|
162
|
+
// Internal zoom state - eğer setZoomLevel prop'u yoksa kullanılır
|
|
163
|
+
const [internalZoomLevel, setInternalZoomLevel] = useState(zoomLevel);
|
|
164
|
+
|
|
165
|
+
// Effective zoom level - prop varsa prop'u kullan, yoksa internal state'i kullan
|
|
166
|
+
const effectiveZoomLevel = setZoomLevel ? zoomLevel : internalZoomLevel;
|
|
167
|
+
const effectiveSetZoomLevel = setZoomLevel || setInternalZoomLevel;
|
|
155
168
|
|
|
156
169
|
// Event Management
|
|
157
170
|
const eventManagement = useEventManagement(
|
|
@@ -206,9 +219,17 @@ const Timeline = ({
|
|
|
206
219
|
// Container genişliği = dayRange * cellWidth
|
|
207
220
|
// ---------------------------------------------------------
|
|
208
221
|
const baseCellWidth = 56.95; // Temel hücre genişliği (zoom = 1.0 için)
|
|
209
|
-
const cellWidth = baseCellWidth *
|
|
222
|
+
const cellWidth = baseCellWidth * effectiveZoomLevel; // Zoom seviyesine göre hücre genişliği
|
|
210
223
|
const containerWidth = dayRange * cellWidth;
|
|
211
224
|
|
|
225
|
+
// Internal zoom state'i prop'tan gelen zoomLevel ile senkronize et
|
|
226
|
+
useEffect(() => {
|
|
227
|
+
if (setZoomLevel) {
|
|
228
|
+
// Prop'tan gelen zoomLevel kullanılıyor, internal state'i güncelle
|
|
229
|
+
setInternalZoomLevel(zoomLevel);
|
|
230
|
+
}
|
|
231
|
+
}, [zoomLevel, setZoomLevel]);
|
|
232
|
+
|
|
212
233
|
// ---------------------------------------------------------
|
|
213
234
|
// 4) Touch Gestures (Mobil desteği)
|
|
214
235
|
// ---------------------------------------------------------
|
|
@@ -321,11 +342,16 @@ const Timeline = ({
|
|
|
321
342
|
};
|
|
322
343
|
|
|
323
344
|
const handleToday = () => {
|
|
324
|
-
|
|
325
|
-
today
|
|
345
|
+
// Bugünün tarihini al
|
|
346
|
+
const today = new Date();
|
|
347
|
+
today.setDate(today.getDate() - 3); // Bugünden 3 gün öncesini ayarla
|
|
326
348
|
setSelectedDate(today);
|
|
327
|
-
|
|
328
|
-
|
|
349
|
+
|
|
350
|
+
// onToday callback'i bir fonksiyon ise çağır
|
|
351
|
+
// Eğer onToday bir string (tarih) ise veya başka bir değer ise, sadece setSelectedDate yeterli
|
|
352
|
+
if (typeof onToday === 'function') {
|
|
353
|
+
onToday();
|
|
354
|
+
}
|
|
329
355
|
};
|
|
330
356
|
|
|
331
357
|
|
|
@@ -370,16 +396,16 @@ const Timeline = ({
|
|
|
370
396
|
// 8.5) Zoom handlers
|
|
371
397
|
// ---------------------------------------------------------
|
|
372
398
|
const handleZoomIn = useCallback(() => {
|
|
373
|
-
if (
|
|
374
|
-
|
|
399
|
+
if (zoomOn) {
|
|
400
|
+
effectiveSetZoomLevel((prev) => Math.min(maxZoomLevel, prev + zoomStep));
|
|
375
401
|
}
|
|
376
|
-
}, [
|
|
402
|
+
}, [zoomOn, maxZoomLevel, zoomStep, effectiveSetZoomLevel]);
|
|
377
403
|
|
|
378
404
|
const handleZoomOut = useCallback(() => {
|
|
379
|
-
if (
|
|
380
|
-
|
|
405
|
+
if (zoomOn) {
|
|
406
|
+
effectiveSetZoomLevel((prev) => Math.max(minZoomLevel, prev - zoomStep));
|
|
381
407
|
}
|
|
382
|
-
}, [
|
|
408
|
+
}, [zoomOn, minZoomLevel, zoomStep, effectiveSetZoomLevel]);
|
|
383
409
|
|
|
384
410
|
// ---------------------------------------------------------
|
|
385
411
|
// 8.6) Keyboard Shortcuts
|
|
@@ -437,8 +463,8 @@ const Timeline = ({
|
|
|
437
463
|
onMonthRetreat={handleMonthRetreat}
|
|
438
464
|
dayRange={dayRange}
|
|
439
465
|
setDayRange={setDayRange}
|
|
440
|
-
zoomLevel={
|
|
441
|
-
setZoomLevel={
|
|
466
|
+
zoomLevel={effectiveZoomLevel}
|
|
467
|
+
setZoomLevel={effectiveSetZoomLevel}
|
|
442
468
|
zoomOn={zoomOn}
|
|
443
469
|
minZoomLevel={minZoomLevel}
|
|
444
470
|
maxZoomLevel={maxZoomLevel}
|
|
@@ -541,6 +567,8 @@ const Timeline = ({
|
|
|
541
567
|
isLoading={isLoading}
|
|
542
568
|
loadingType={loadingType}
|
|
543
569
|
disableDates={disableDates}
|
|
570
|
+
autoSelectEnabledRange={autoSelectEnabledRange}
|
|
571
|
+
autoSelectRanges={autoSelectRanges}
|
|
544
572
|
|
|
545
573
|
/>
|
|
546
574
|
|
|
@@ -70,6 +70,10 @@ const TimelineContent = ({
|
|
|
70
70
|
|
|
71
71
|
// Disable Dates
|
|
72
72
|
disableDates = null, // { mode: 'exclude' | 'include', dates: [], ranges: [] }
|
|
73
|
+
|
|
74
|
+
// Auto Select Enabled Range
|
|
75
|
+
autoSelectEnabledRange = false, // true = belirtilen range'lere tıklandığında otomatik olarak tüm range'i seç
|
|
76
|
+
autoSelectRanges = null, // [{ start: '2025-12-31', end: '2026-01-05' }, ...] - Auto-select için range'ler (disableDates'ten bağımsız)
|
|
73
77
|
}) => {
|
|
74
78
|
// ------------------- HOOKS & STATE -------------------
|
|
75
79
|
const containerRef = useRef(null);
|
|
@@ -304,7 +308,6 @@ const TimelineContent = ({
|
|
|
304
308
|
if (!createNewEventOn) return;
|
|
305
309
|
if (!isCreating) return;
|
|
306
310
|
if (mode === "extend") {
|
|
307
|
-
console.log(">>> 'extend' mode, skip new event creation");
|
|
308
311
|
return;
|
|
309
312
|
}
|
|
310
313
|
|
|
@@ -470,13 +473,10 @@ const TimelineContent = ({
|
|
|
470
473
|
|
|
471
474
|
// ------------------- Drag Logic -------------------
|
|
472
475
|
const handleDragStartSafe = (e, eventId) => {
|
|
473
|
-
console.log("[TimelineContent] handleDragStartSafe called:", { eventId, eventsDragOn });
|
|
474
476
|
if (!eventsDragOn) {
|
|
475
|
-
console.log("[TimelineContent] Events drag is disabled, preventing drag start");
|
|
476
477
|
e.preventDefault();
|
|
477
478
|
return;
|
|
478
479
|
}
|
|
479
|
-
console.log("[TimelineContent] Calling handleDragStart...");
|
|
480
480
|
handleDragStart(e, eventId);
|
|
481
481
|
};
|
|
482
482
|
const handleDragEndSafe = (e) => {
|
|
@@ -495,7 +495,6 @@ const TimelineContent = ({
|
|
|
495
495
|
const handleMouseDownExtend = (mouseEvent, event) => {
|
|
496
496
|
if (!eventsExtendOn) return;
|
|
497
497
|
mouseEvent.stopPropagation();
|
|
498
|
-
console.log(">>> Extend start ID:", event.id);
|
|
499
498
|
setMode("extend");
|
|
500
499
|
setExtendingEvent(event);
|
|
501
500
|
setOriginalEndDate(event.endDate);
|
|
@@ -521,7 +520,6 @@ const TimelineContent = ({
|
|
|
521
520
|
}, [mode, extendingEvent, eventsExtendOn, originalEndDate, startMouseX, setEvents]);
|
|
522
521
|
|
|
523
522
|
const handleMouseUpExtend = useCallback(() => {
|
|
524
|
-
console.log(">>> Extend finished ID:", extendingEvent?.id);
|
|
525
523
|
if (onExtendInfo && extendingEvent) {
|
|
526
524
|
// callback
|
|
527
525
|
const updatedEvent = events.find((ev) => ev.id === extendingEvent.id);
|
|
@@ -682,15 +680,6 @@ const TimelineContent = ({
|
|
|
682
680
|
const cellDateOnly = new Date(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());
|
|
683
681
|
const preventPastEventsDateOnly = new Date(preventPastEventsDateObj.getFullYear(), preventPastEventsDateObj.getMonth(), preventPastEventsDateObj.getDate());
|
|
684
682
|
isPastDate = cellDateOnly < preventPastEventsDateOnly;
|
|
685
|
-
// Debug: İlk birkaç hücre için log
|
|
686
|
-
if (colIndex < 3 && groupIndex === 0) {
|
|
687
|
-
console.log('[TimelineContent] Past date check:', {
|
|
688
|
-
cellDate: cellDateOnly.toISOString().split('T')[0],
|
|
689
|
-
preventPastEventsDateValue: preventPastEventsDateOnly.toISOString().split('T')[0],
|
|
690
|
-
isPastDate,
|
|
691
|
-
preventPastEvents
|
|
692
|
-
});
|
|
693
|
-
}
|
|
694
683
|
}
|
|
695
684
|
|
|
696
685
|
// Disabled tarih kontrolü
|
|
@@ -817,7 +806,6 @@ const TimelineContent = ({
|
|
|
817
806
|
e.preventDefault();
|
|
818
807
|
return;
|
|
819
808
|
}
|
|
820
|
-
console.log("[TimelineContent] Event drag start:", event.id);
|
|
821
809
|
handleDragStart(e, event.id);
|
|
822
810
|
e.stopPropagation();
|
|
823
811
|
|
|
@@ -908,15 +896,6 @@ const TimelineContent = ({
|
|
|
908
896
|
const cellDateOnly = new Date(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());
|
|
909
897
|
const preventPastEventsDateOnly = new Date(preventPastEventsDateObj.getFullYear(), preventPastEventsDateObj.getMonth(), preventPastEventsDateObj.getDate());
|
|
910
898
|
isPastDate = cellDateOnly < preventPastEventsDateOnly;
|
|
911
|
-
// Debug: İlk birkaç hücre için log
|
|
912
|
-
if (colIndex < 3 && rowIndex === 0 && groupIndex === 0) {
|
|
913
|
-
console.log('[TimelineContent] Cell past date check:', {
|
|
914
|
-
cellDate: cellDateOnly.toISOString().split('T')[0],
|
|
915
|
-
preventPastEventsDateValue: preventPastEventsDateOnly.toISOString().split('T')[0],
|
|
916
|
-
isPastDate,
|
|
917
|
-
preventPastEvents
|
|
918
|
-
});
|
|
919
|
-
}
|
|
920
899
|
}
|
|
921
900
|
|
|
922
901
|
// Hafta sonu kontrolü
|
|
@@ -1004,7 +983,6 @@ const TimelineContent = ({
|
|
|
1004
983
|
}
|
|
1005
984
|
e.preventDefault();
|
|
1006
985
|
e.stopPropagation();
|
|
1007
|
-
console.log("[TimelineContent] onDragOver called for resource:", resource.id);
|
|
1008
986
|
handleDragOver(e);
|
|
1009
987
|
}}
|
|
1010
988
|
onDrop={(e) => {
|
|
@@ -1016,8 +994,7 @@ const TimelineContent = ({
|
|
|
1016
994
|
return false;
|
|
1017
995
|
}
|
|
1018
996
|
e.preventDefault();
|
|
1019
|
-
e.stopPropagation();
|
|
1020
|
-
console.log("[TimelineContent] onDrop called for resource:", resource.id, "date:", dateObj.fullDate);
|
|
997
|
+
e.stopPropagation();
|
|
1021
998
|
handleDrop(e, resource.id, parseDate(dateObj.fullDate));
|
|
1022
999
|
}}
|
|
1023
1000
|
></div>
|