akfatimeline 1.0.0 → 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 +6 -0
  2. package/CHANGELOG.md +35 -0
  3. package/dist/Timeline.js +2292 -0
  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 +20 -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,2292 @@
1
+ (function webpackUniversalModuleDefinition(root, factory) {
2
+ if(typeof exports === 'object' && typeof module === 'object')
3
+ module.exports = factory(require("react"));
4
+ else if(typeof define === 'function' && define.amd)
5
+ define(["react"], factory);
6
+ else if(typeof exports === 'object')
7
+ exports["AkfaTimeline"] = factory(require("react"));
8
+ else
9
+ root["AkfaTimeline"] = factory(root["react"]);
10
+ })(this, (__WEBPACK_EXTERNAL_MODULE__155__) => {
11
+ return /******/ (() => { // webpackBootstrap
12
+ /******/ "use strict";
13
+ /******/ var __webpack_modules__ = ({
14
+
15
+ /***/ 27:
16
+ /***/ ((module, __webpack_exports__, __webpack_require__) => {
17
+
18
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
19
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
20
+ /* harmony export */ });
21
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(601);
22
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
23
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);
24
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
25
+ // Imports
26
+
27
+
28
+ var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
29
+ // Module
30
+ ___CSS_LOADER_EXPORT___.push([module.id, `/* src/components/Timeline/Timeline.css */
31
+
32
+ /*
33
+ Temel: "sales sayfası" temasıyla uyumlu renkler,
34
+ light vs. dark tanımları
35
+ */
36
+
37
+ :root {
38
+ /* Light Tema Varsayılan Renkler */
39
+ --background-color: #f5f5f2; /* Açık tema arka plan */
40
+ --text-color: #666; /* Açık tema yazı rengi */
41
+ --border-color: #bbb; /* Daha yumuşak border */
42
+
43
+ /* Header */
44
+ --header-background-color: #f5f5f2; /* Üst header, tablo header */
45
+ --header-text-color: #666;
46
+
47
+ /* Resources */
48
+ --resource-background-color: #f5f5f2;
49
+ --resource-text-color: #666;
50
+ --group-header-background-color: #dadada;
51
+
52
+ /* Timeline */
53
+ --timeline-header-background-color: #f5f5f2;
54
+ --timeline-cell-border-color: #ccc;
55
+ --timeline-event-background-color: #fff;
56
+ --timeline-event-border-color: #666;
57
+ --timeline-event-text-color: #666;
58
+
59
+ /* Scrollbar */
60
+ --scrollbar-thumb-background: #aaa;
61
+ --scrollbar-thumb-hover-background: #888;
62
+
63
+ --resource-width: 150px;
64
+ --cell-height: 40px;
65
+ --header-height: 60px;
66
+ --time-slot-height: 20px;
67
+ --container-height: 480px;
68
+
69
+ --timeline-new-event-background-color: #ff5722;
70
+ --timeline-new-event-text-color: #fff;
71
+
72
+ --timeline-event-background-color: #ff7f50;
73
+ --timeline-event-text-color: #fff;
74
+ --timeline-event-border-color: #fff;
75
+
76
+ --timeline-cell-selected-bg: rgba(25,118,210,0.2);
77
+
78
+ user-select: none; /* Metin seçimini engelle */
79
+ }
80
+
81
+ /* Koyu Tema */
82
+ .dark-mode {
83
+ /* Koyu tema */
84
+ --background-color: #16202a; /* Koyu tema arka plan */
85
+ --text-color: #ddd; /* Koyu tema yazı rengi */
86
+ --border-color: #444;
87
+
88
+ --header-background-color: #16202a;
89
+ --header-text-color: #bbb;
90
+
91
+ --resource-background-color: #16202a;
92
+ --resource-text-color: #bbb;
93
+ --group-header-background-color: #0d141b;
94
+
95
+ --timeline-header-background-color: #16202a;
96
+ --timeline-cell-border-color: #444;
97
+ --timeline-event-background-color: #2a2a2a;
98
+ --timeline-event-border-color: #222;
99
+ --timeline-event-text-color: #ddd;
100
+
101
+ --scrollbar-thumb-background: #555;
102
+ --scrollbar-thumb-hover-background: #888;
103
+
104
+ --timeline-new-event-background-color: #a83e20;
105
+ --timeline-new-event-text-color: #eee;
106
+
107
+ --timeline-event-background-color: #a83e20;
108
+ --timeline-event-text-color: #fff;
109
+ --timeline-event-border-color: #222;
110
+
111
+ --timeline-cell-selected-bg: rgba(76,175,80,0.2);
112
+ }
113
+
114
+ /* Genel Timeline Konteyner */
115
+ .timeline-container {
116
+ display: flex;
117
+ flex-direction: column;
118
+ width: 100%;
119
+ height: 100%;
120
+ border: 1px solid var(--border-color);
121
+ border-radius: 8px;
122
+ overflow: hidden;
123
+ box-sizing: border-box;
124
+ background-color: var(--background-color);
125
+ color: var(--text-color);
126
+ }
127
+
128
+ /* Master Header */
129
+ .timeline-master-header {
130
+ width: 100%;
131
+ background-color: var(--header-background-color);
132
+ color: var(--header-text-color);
133
+ border-bottom: 1px solid var(--border-color);
134
+ z-index: 10;
135
+ padding: 10px;
136
+ box-sizing: border-box;
137
+ }
138
+
139
+ /* Timeline Body */
140
+ .timeline-body {
141
+ display: flex;
142
+ flex: 1;
143
+ }
144
+
145
+ /* Sol Kısım: Resources */
146
+ .timeline-resources-container {
147
+ width: var(--resource-width);
148
+ display: flex;
149
+ flex-direction: column;
150
+ border-right: 1px solid var(--border-color);
151
+ position: sticky;
152
+ left: 0;
153
+ top: var(--header-height);
154
+ z-index: 2;
155
+ background-color: var(--resource-background-color);
156
+ overflow-y: auto;
157
+ }
158
+
159
+ /* Resources Header */
160
+ .resources-header {
161
+ background-color: var(--header-background-color);
162
+ color: var(--resource-text-color);
163
+ text-align: center;
164
+ width: var(--resource-width);
165
+ font-weight: bold;
166
+ display: flex;
167
+ flex-direction: column;
168
+ justify-content: center;
169
+ align-items: center;
170
+ height: calc(var(--header-height) * 2); /* Üst üste iki header yüksekliği */
171
+ border-right: 1px solid var(--border-color);
172
+ box-sizing: border-box;
173
+ }
174
+
175
+ /* Grup Başlığı Hücreleri */
176
+ .group-header-row {
177
+ display: flex;
178
+ height: var(--cell-height);
179
+ background-color: var(--group-header-background-color);
180
+ color: var(--resource-text-color);
181
+ font-weight: bold;
182
+ }
183
+
184
+ .group-header-cell {
185
+ flex: 1;
186
+ border: 1px solid var(--border-color);
187
+ text-align: center;
188
+ background-color: var(--group-header-background-color);
189
+ color: var(--resource-text-color);
190
+ height: var(--cell-height);
191
+ display: flex;
192
+ align-items: center;
193
+ justify-content: center;
194
+ }
195
+
196
+ /* Resource Grupları */
197
+ .resource-group {
198
+ display: flex;
199
+ flex-direction: column;
200
+ }
201
+
202
+ /* Resource Grup Header */
203
+ .resource-group-header {
204
+ background-color: var(--group-header-background-color);
205
+ color: var(--resource-text-color);
206
+ font-weight: bold;
207
+ height: var(--cell-height);
208
+ box-sizing: border-box;
209
+ display: flex;
210
+ align-items: center;
211
+ justify-content: space-between;
212
+ padding: 0 0px;
213
+ cursor: pointer;
214
+ border: 1px solid var(--border-color);
215
+ }
216
+
217
+ /* Resource Hücreleri */
218
+ .resource-cell {
219
+ padding: 0;
220
+ text-align: left;
221
+ background-color: var(--resource-background-color);
222
+ color: var(--resource-text-color);
223
+ height: var(--cell-height);
224
+ display: flex;
225
+ align-items: center;
226
+ border: 0.3px solid var(--border-color);
227
+ box-sizing: border-box;
228
+ }
229
+
230
+ /* Sağ Kısım: Timeline */
231
+ .timeline-scrollable-container {
232
+ flex: 1;
233
+ overflow-x: auto;
234
+ overflow-y: hidden;
235
+ display: flex;
236
+ flex-direction: column;
237
+ position: relative;
238
+ }
239
+
240
+ /* Header ve Content Wrapper */
241
+ .timeline-header-content-wrapper {
242
+ display: flex;
243
+ flex-direction: column;
244
+ }
245
+
246
+ /* Timeline Header */
247
+ .timeline-header {
248
+ display: flex;
249
+ background-color: var(--timeline-header-background-color);
250
+ color: var(--header-text-color);
251
+ position: sticky;
252
+ top: 0;
253
+ z-index: 2;
254
+ height: var(--header-height);
255
+ overflow: hidden;
256
+ box-sizing: border-box;
257
+ }
258
+
259
+ /* Timeline Content */
260
+ .timeline-content {
261
+ display: flex;
262
+ flex-direction: column;
263
+ }
264
+
265
+ /* Grup Container */
266
+ .group-container {
267
+ display: flex;
268
+ flex-direction: column;
269
+ }
270
+
271
+ /* Resource Satırları */
272
+ .resource-row {
273
+ display: flex;
274
+ box-sizing: border-box;
275
+ position: relative;
276
+ height: var(--cell-height);
277
+ border: 1px solid var(--border-color);
278
+ margin-top: -1px;
279
+ overflow: hidden;
280
+ }
281
+
282
+ /* Timeline Hücreleri */
283
+ .timeline-cell {
284
+ flex: 1;
285
+ border: 1px solid var(--timeline-cell-border-color);
286
+ height: 100%;
287
+ box-sizing: border-box;
288
+ }
289
+
290
+ /* Hücre Seçili Durumu */
291
+ .timeline-cell.selected {
292
+ background-color: rgba(25, 118, 210, 0.2); /* satır içi/hover */
293
+ }
294
+
295
+ /* Event Stilleri */
296
+ .event {
297
+ position: absolute;
298
+ background-color: var(--timeline-event-background-color);
299
+ color: var(--timeline-event-text-color);
300
+ font-size: 12px;
301
+ padding: 2px 5px;
302
+ border-radius: 4px;
303
+ text-align: left;
304
+ display: flex;
305
+ flex-direction: column;
306
+ justify-content: center;
307
+ box-sizing: border-box;
308
+ z-index: 10;
309
+ overflow: hidden;
310
+ text-overflow: ellipsis;
311
+ white-space: nowrap;
312
+ border: 1px solid var(--timeline-event-border-color);
313
+ cursor: pointer;
314
+ }
315
+
316
+ /* Event Time Stili */
317
+ .event-time {
318
+ font-size: 10px;
319
+ margin-top: 2px;
320
+ }
321
+
322
+ /* Scrollbar için */
323
+ .timeline-scrollable-container::-webkit-scrollbar {
324
+ height: 10px;
325
+ }
326
+
327
+ .timeline-scrollable-container::-webkit-scrollbar-thumb {
328
+ background: var(--scrollbar-thumb-background);
329
+ border-radius: 5px;
330
+ }
331
+
332
+ .timeline-scrollable-container::-webkit-scrollbar-thumb:hover {
333
+ background: var(--scrollbar-thumb-hover-background);
334
+ }
335
+
336
+ .resources-header {
337
+ background-color: var(--header-background-color);
338
+ color: var(--resource-text-color);
339
+ text-align: center;
340
+ width: var(--resource-width);
341
+ font-weight: bold;
342
+ display: flex;
343
+ flex-direction: column;
344
+ justify-content: center;
345
+ align-items: center;
346
+ height: 80px;
347
+ border-right: 1px solid var(--border-color);
348
+ box-sizing: border-box;
349
+ }
350
+
351
+ /* TimelineHeader Container */
352
+ .timeline-header-container {
353
+ flex: 1;
354
+ display: flex;
355
+ flex-direction: column;
356
+ }
357
+
358
+ /* Ay + Yıl satırı */
359
+ .timeline-header-month-row {
360
+ display: flex;
361
+ background-color: var(--header-background-color);
362
+ color: var(--header-text-color);
363
+ font-weight: bold;
364
+ font-size: 16px;
365
+ height: 40px;
366
+ line-height: 40px;
367
+ border-bottom: 1px solid var(--border-color);
368
+ }
369
+
370
+ /* Ay + Yıl hücreleri */
371
+ .timeline-header-month-cell {
372
+ text-align: center;
373
+ display: flex;
374
+ align-items: center;
375
+ justify-content: center;
376
+ /* border-right => dynamic, inline style if needed */
377
+ box-sizing: border-box;
378
+ }
379
+
380
+ /* Günlük Hücreler (tarih satırı) */
381
+ .timeline-header-day-row {
382
+ display: flex;
383
+ background-color: var(--timeline-header-background-color);
384
+ color: var(--header-text-color);
385
+ /* border-bottom: 1px solid var(--border-color); if needed */
386
+ }
387
+
388
+ /* Günlük hücre (her gün) */
389
+ .timeline-header-day-cell {
390
+ height: 40px;
391
+ line-height: 40px;
392
+ font-size: 14px;
393
+ white-space: nowrap;
394
+ overflow: hidden;
395
+ text-overflow: ellipsis;
396
+ text-align: center;
397
+ box-sizing: border-box;
398
+ }
399
+
400
+
401
+ /* src/components/Timeline/Timeline.css */
402
+ /* Ekleme: MasterHeader stili */
403
+
404
+ /* Kapsayıcı */
405
+ .master-header-container {
406
+ display: flex;
407
+ align-items: center;
408
+ padding: 10px;
409
+
410
+ background-color: var(--header-background-color);
411
+ color: var(--header-text-color);
412
+
413
+ /* eğer border vs. istersen
414
+ border-bottom: 1px solid var(--border-color);
415
+ */
416
+ }
417
+
418
+ /* Butonlar */
419
+ .master-header-btn {
420
+ background-color: transparent;
421
+ color: var(--header-text-color);
422
+ border: 1px solid var(--border-color);
423
+ border-radius: 4px;
424
+ padding: 6px 12px;
425
+ margin-right: 10px;
426
+ cursor: pointer;
427
+ font-size: 14px;
428
+ transition: background-color 0.2s ease, color 0.2s ease;
429
+ }
430
+
431
+ .master-header-btn:hover {
432
+ background-color: rgba(25, 118, 210, 0.2); /* Light tema hover */
433
+ }
434
+
435
+ .dark-mode .master-header-btn:hover {
436
+ background-color: rgba(76, 175, 80, 0.2); /* Koyu tema hover */
437
+ }
438
+
439
+ .master-header-btn:focus {
440
+ outline: none;
441
+ }
442
+
443
+ /* Select */
444
+ .master-header-select {
445
+ margin-left: 10px;
446
+ background-color: transparent;
447
+ color: var(--header-text-color);
448
+ border: 1px solid var(--border-color);
449
+ border-radius: 4px;
450
+ padding: 4px 8px;
451
+ font-size: 14px;
452
+ cursor: pointer;
453
+ }
454
+
455
+ .master-header-select:focus {
456
+ outline: none;
457
+ }
458
+
459
+
460
+ /* Container */
461
+ .timeline-content-container {
462
+ position: relative;
463
+ width: 100%;
464
+ height: auto; /* or as needed */
465
+ display: flex;
466
+ flex-direction: column;
467
+ }
468
+
469
+ /* Group container */
470
+ .timeline-group-container {
471
+ margin-bottom: 0px;
472
+ display: flex;
473
+ flex-direction: column;
474
+ }
475
+
476
+ /* Group header row */
477
+ .timeline-group-header-row {
478
+ display: flex;
479
+ margin-top: -0.08rem;
480
+ }
481
+
482
+ .timeline-group-header-cell {
483
+ flex: 1;
484
+ height: 2.58rem;
485
+ background-color: var(--group-header-background-color);
486
+ border: 1px solid var(--border-color);
487
+
488
+ box-sizing: border-box;
489
+ display: flex;
490
+ align-items: center;
491
+ justify-content: center;
492
+ }
493
+
494
+ /* Resource row */
495
+ .timeline-resource-row {
496
+ display: flex;
497
+ position: relative;
498
+ height: var(--cell-height, 40px);
499
+ border: 1px solid var(--border-color);
500
+ box-sizing: border-box;
501
+ }
502
+
503
+ /* Each day cell */
504
+ .timeline-cell {
505
+ flex: 1;
506
+ height: 100%;
507
+ position: relative;
508
+ border-left: 1px solid var(--border-color);
509
+ border-right: 1px solid var(--border-color);
510
+ box-sizing: border-box;
511
+ cursor: pointer;
512
+ }
513
+
514
+ /* "selected" day cell */
515
+ .timeline-cell.selected {
516
+ background-color: var(--timeline-cell-selected-bg, rgba(25,118,210,0.2));
517
+ }
518
+
519
+ /* Event */
520
+ .timeline-event {
521
+ position: absolute;
522
+ background-color: var(--timeline-event-background-color, #0093ce);
523
+ color: var(--timeline-event-text-color, #fff);
524
+ font-size: 14px;
525
+ padding: 5px;
526
+ border-radius: 20px;
527
+ box-sizing: border-box;
528
+ z-index: 10;
529
+ overflow: hidden;
530
+ text-overflow: ellipsis;
531
+ white-space: nowrap;
532
+ border: 1px solid var(--timeline-event-border-color, #fff);
533
+ top: 5px; /* or a variable offset if you want */
534
+ /* "left" and "width" are inline from JS */
535
+ }
536
+
537
+ /* Extend handle */
538
+ .timeline-event-extend-handle {
539
+ position: absolute;
540
+ right: 0;
541
+ top: 0;
542
+ width: 10px;
543
+ height: 100%;
544
+ background-color: rgba(0,0,0,0.2);
545
+ cursor: col-resize;
546
+ z-index: 20;
547
+ }
548
+
549
+ /* Temp event (while creating) */
550
+ .timeline-temp-event {
551
+ position: absolute;
552
+ background-color: var(--timeline-new-event-background-color, #0093ce);
553
+ color: var(--timeline-new-event-text-color, #fff);
554
+ opacity: 0.7;
555
+ border-radius: 20px;
556
+ z-index: 9;
557
+ display: flex;
558
+ align-items: center;
559
+ justify-content: center;
560
+ font-size: 14px;
561
+ /* "left"/"width" from JS: " ...calculatePosition(tempEvent, dates)" */
562
+ top: 5px;
563
+ }
564
+ `, ""]);
565
+ // Exports
566
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
567
+
568
+
569
+ /***/ }),
570
+
571
+ /***/ 314:
572
+ /***/ ((module) => {
573
+
574
+
575
+
576
+ /*
577
+ MIT License http://www.opensource.org/licenses/mit-license.php
578
+ Author Tobias Koppers @sokra
579
+ */
580
+ module.exports = function (cssWithMappingToString) {
581
+ var list = [];
582
+
583
+ // return the list of modules as css string
584
+ list.toString = function toString() {
585
+ return this.map(function (item) {
586
+ var content = "";
587
+ var needLayer = typeof item[5] !== "undefined";
588
+ if (item[4]) {
589
+ content += "@supports (".concat(item[4], ") {");
590
+ }
591
+ if (item[2]) {
592
+ content += "@media ".concat(item[2], " {");
593
+ }
594
+ if (needLayer) {
595
+ content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");
596
+ }
597
+ content += cssWithMappingToString(item);
598
+ if (needLayer) {
599
+ content += "}";
600
+ }
601
+ if (item[2]) {
602
+ content += "}";
603
+ }
604
+ if (item[4]) {
605
+ content += "}";
606
+ }
607
+ return content;
608
+ }).join("");
609
+ };
610
+
611
+ // import a list of modules into the list
612
+ list.i = function i(modules, media, dedupe, supports, layer) {
613
+ if (typeof modules === "string") {
614
+ modules = [[null, modules, undefined]];
615
+ }
616
+ var alreadyImportedModules = {};
617
+ if (dedupe) {
618
+ for (var k = 0; k < this.length; k++) {
619
+ var id = this[k][0];
620
+ if (id != null) {
621
+ alreadyImportedModules[id] = true;
622
+ }
623
+ }
624
+ }
625
+ for (var _k = 0; _k < modules.length; _k++) {
626
+ var item = [].concat(modules[_k]);
627
+ if (dedupe && alreadyImportedModules[item[0]]) {
628
+ continue;
629
+ }
630
+ if (typeof layer !== "undefined") {
631
+ if (typeof item[5] === "undefined") {
632
+ item[5] = layer;
633
+ } else {
634
+ item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");
635
+ item[5] = layer;
636
+ }
637
+ }
638
+ if (media) {
639
+ if (!item[2]) {
640
+ item[2] = media;
641
+ } else {
642
+ item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");
643
+ item[2] = media;
644
+ }
645
+ }
646
+ if (supports) {
647
+ if (!item[4]) {
648
+ item[4] = "".concat(supports);
649
+ } else {
650
+ item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");
651
+ item[4] = supports;
652
+ }
653
+ }
654
+ list.push(item);
655
+ }
656
+ };
657
+ return list;
658
+ };
659
+
660
+ /***/ }),
661
+
662
+ /***/ 601:
663
+ /***/ ((module) => {
664
+
665
+
666
+
667
+ module.exports = function (i) {
668
+ return i[1];
669
+ };
670
+
671
+ /***/ }),
672
+
673
+ /***/ 72:
674
+ /***/ ((module) => {
675
+
676
+
677
+
678
+ var stylesInDOM = [];
679
+ function getIndexByIdentifier(identifier) {
680
+ var result = -1;
681
+ for (var i = 0; i < stylesInDOM.length; i++) {
682
+ if (stylesInDOM[i].identifier === identifier) {
683
+ result = i;
684
+ break;
685
+ }
686
+ }
687
+ return result;
688
+ }
689
+ function modulesToDom(list, options) {
690
+ var idCountMap = {};
691
+ var identifiers = [];
692
+ for (var i = 0; i < list.length; i++) {
693
+ var item = list[i];
694
+ var id = options.base ? item[0] + options.base : item[0];
695
+ var count = idCountMap[id] || 0;
696
+ var identifier = "".concat(id, " ").concat(count);
697
+ idCountMap[id] = count + 1;
698
+ var indexByIdentifier = getIndexByIdentifier(identifier);
699
+ var obj = {
700
+ css: item[1],
701
+ media: item[2],
702
+ sourceMap: item[3],
703
+ supports: item[4],
704
+ layer: item[5]
705
+ };
706
+ if (indexByIdentifier !== -1) {
707
+ stylesInDOM[indexByIdentifier].references++;
708
+ stylesInDOM[indexByIdentifier].updater(obj);
709
+ } else {
710
+ var updater = addElementStyle(obj, options);
711
+ options.byIndex = i;
712
+ stylesInDOM.splice(i, 0, {
713
+ identifier: identifier,
714
+ updater: updater,
715
+ references: 1
716
+ });
717
+ }
718
+ identifiers.push(identifier);
719
+ }
720
+ return identifiers;
721
+ }
722
+ function addElementStyle(obj, options) {
723
+ var api = options.domAPI(options);
724
+ api.update(obj);
725
+ var updater = function updater(newObj) {
726
+ if (newObj) {
727
+ if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {
728
+ return;
729
+ }
730
+ api.update(obj = newObj);
731
+ } else {
732
+ api.remove();
733
+ }
734
+ };
735
+ return updater;
736
+ }
737
+ module.exports = function (list, options) {
738
+ options = options || {};
739
+ list = list || [];
740
+ var lastIdentifiers = modulesToDom(list, options);
741
+ return function update(newList) {
742
+ newList = newList || [];
743
+ for (var i = 0; i < lastIdentifiers.length; i++) {
744
+ var identifier = lastIdentifiers[i];
745
+ var index = getIndexByIdentifier(identifier);
746
+ stylesInDOM[index].references--;
747
+ }
748
+ var newLastIdentifiers = modulesToDom(newList, options);
749
+ for (var _i = 0; _i < lastIdentifiers.length; _i++) {
750
+ var _identifier = lastIdentifiers[_i];
751
+ var _index = getIndexByIdentifier(_identifier);
752
+ if (stylesInDOM[_index].references === 0) {
753
+ stylesInDOM[_index].updater();
754
+ stylesInDOM.splice(_index, 1);
755
+ }
756
+ }
757
+ lastIdentifiers = newLastIdentifiers;
758
+ };
759
+ };
760
+
761
+ /***/ }),
762
+
763
+ /***/ 659:
764
+ /***/ ((module) => {
765
+
766
+
767
+
768
+ var memo = {};
769
+
770
+ /* istanbul ignore next */
771
+ function getTarget(target) {
772
+ if (typeof memo[target] === "undefined") {
773
+ var styleTarget = document.querySelector(target);
774
+
775
+ // Special case to return head of iframe instead of iframe itself
776
+ if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
777
+ try {
778
+ // This will throw an exception if access to iframe is blocked
779
+ // due to cross-origin restrictions
780
+ styleTarget = styleTarget.contentDocument.head;
781
+ } catch (e) {
782
+ // istanbul ignore next
783
+ styleTarget = null;
784
+ }
785
+ }
786
+ memo[target] = styleTarget;
787
+ }
788
+ return memo[target];
789
+ }
790
+
791
+ /* istanbul ignore next */
792
+ function insertBySelector(insert, style) {
793
+ var target = getTarget(insert);
794
+ if (!target) {
795
+ throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
796
+ }
797
+ target.appendChild(style);
798
+ }
799
+ module.exports = insertBySelector;
800
+
801
+ /***/ }),
802
+
803
+ /***/ 540:
804
+ /***/ ((module) => {
805
+
806
+
807
+
808
+ /* istanbul ignore next */
809
+ function insertStyleElement(options) {
810
+ var element = document.createElement("style");
811
+ options.setAttributes(element, options.attributes);
812
+ options.insert(element, options.options);
813
+ return element;
814
+ }
815
+ module.exports = insertStyleElement;
816
+
817
+ /***/ }),
818
+
819
+ /***/ 56:
820
+ /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
821
+
822
+
823
+
824
+ /* istanbul ignore next */
825
+ function setAttributesWithoutAttributes(styleElement) {
826
+ var nonce = true ? __webpack_require__.nc : 0;
827
+ if (nonce) {
828
+ styleElement.setAttribute("nonce", nonce);
829
+ }
830
+ }
831
+ module.exports = setAttributesWithoutAttributes;
832
+
833
+ /***/ }),
834
+
835
+ /***/ 825:
836
+ /***/ ((module) => {
837
+
838
+
839
+
840
+ /* istanbul ignore next */
841
+ function apply(styleElement, options, obj) {
842
+ var css = "";
843
+ if (obj.supports) {
844
+ css += "@supports (".concat(obj.supports, ") {");
845
+ }
846
+ if (obj.media) {
847
+ css += "@media ".concat(obj.media, " {");
848
+ }
849
+ var needLayer = typeof obj.layer !== "undefined";
850
+ if (needLayer) {
851
+ css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");
852
+ }
853
+ css += obj.css;
854
+ if (needLayer) {
855
+ css += "}";
856
+ }
857
+ if (obj.media) {
858
+ css += "}";
859
+ }
860
+ if (obj.supports) {
861
+ css += "}";
862
+ }
863
+ var sourceMap = obj.sourceMap;
864
+ if (sourceMap && typeof btoa !== "undefined") {
865
+ css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
866
+ }
867
+
868
+ // For old IE
869
+ /* istanbul ignore if */
870
+ options.styleTagTransform(css, styleElement, options.options);
871
+ }
872
+ function removeStyleElement(styleElement) {
873
+ // istanbul ignore if
874
+ if (styleElement.parentNode === null) {
875
+ return false;
876
+ }
877
+ styleElement.parentNode.removeChild(styleElement);
878
+ }
879
+
880
+ /* istanbul ignore next */
881
+ function domAPI(options) {
882
+ if (typeof document === "undefined") {
883
+ return {
884
+ update: function update() {},
885
+ remove: function remove() {}
886
+ };
887
+ }
888
+ var styleElement = options.insertStyleElement(options);
889
+ return {
890
+ update: function update(obj) {
891
+ apply(styleElement, options, obj);
892
+ },
893
+ remove: function remove() {
894
+ removeStyleElement(styleElement);
895
+ }
896
+ };
897
+ }
898
+ module.exports = domAPI;
899
+
900
+ /***/ }),
901
+
902
+ /***/ 113:
903
+ /***/ ((module) => {
904
+
905
+
906
+
907
+ /* istanbul ignore next */
908
+ function styleTagTransform(css, styleElement) {
909
+ if (styleElement.styleSheet) {
910
+ styleElement.styleSheet.cssText = css;
911
+ } else {
912
+ while (styleElement.firstChild) {
913
+ styleElement.removeChild(styleElement.firstChild);
914
+ }
915
+ styleElement.appendChild(document.createTextNode(css));
916
+ }
917
+ }
918
+ module.exports = styleTagTransform;
919
+
920
+ /***/ }),
921
+
922
+ /***/ 155:
923
+ /***/ ((module) => {
924
+
925
+ module.exports = __WEBPACK_EXTERNAL_MODULE__155__;
926
+
927
+ /***/ })
928
+
929
+ /******/ });
930
+ /************************************************************************/
931
+ /******/ // The module cache
932
+ /******/ var __webpack_module_cache__ = {};
933
+ /******/
934
+ /******/ // The require function
935
+ /******/ function __webpack_require__(moduleId) {
936
+ /******/ // Check if module is in cache
937
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
938
+ /******/ if (cachedModule !== undefined) {
939
+ /******/ return cachedModule.exports;
940
+ /******/ }
941
+ /******/ // Create a new module (and put it into the cache)
942
+ /******/ var module = __webpack_module_cache__[moduleId] = {
943
+ /******/ id: moduleId,
944
+ /******/ // no module.loaded needed
945
+ /******/ exports: {}
946
+ /******/ };
947
+ /******/
948
+ /******/ // Execute the module function
949
+ /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
950
+ /******/
951
+ /******/ // Return the exports of the module
952
+ /******/ return module.exports;
953
+ /******/ }
954
+ /******/
955
+ /************************************************************************/
956
+ /******/ /* webpack/runtime/compat get default export */
957
+ /******/ (() => {
958
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
959
+ /******/ __webpack_require__.n = (module) => {
960
+ /******/ var getter = module && module.__esModule ?
961
+ /******/ () => (module['default']) :
962
+ /******/ () => (module);
963
+ /******/ __webpack_require__.d(getter, { a: getter });
964
+ /******/ return getter;
965
+ /******/ };
966
+ /******/ })();
967
+ /******/
968
+ /******/ /* webpack/runtime/define property getters */
969
+ /******/ (() => {
970
+ /******/ // define getter functions for harmony exports
971
+ /******/ __webpack_require__.d = (exports, definition) => {
972
+ /******/ for(var key in definition) {
973
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
974
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
975
+ /******/ }
976
+ /******/ }
977
+ /******/ };
978
+ /******/ })();
979
+ /******/
980
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
981
+ /******/ (() => {
982
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
983
+ /******/ })();
984
+ /******/
985
+ /******/ /* webpack/runtime/make namespace object */
986
+ /******/ (() => {
987
+ /******/ // define __esModule on exports
988
+ /******/ __webpack_require__.r = (exports) => {
989
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
990
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
991
+ /******/ }
992
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
993
+ /******/ };
994
+ /******/ })();
995
+ /******/
996
+ /******/ /* webpack/runtime/nonce */
997
+ /******/ (() => {
998
+ /******/ __webpack_require__.nc = undefined;
999
+ /******/ })();
1000
+ /******/
1001
+ /************************************************************************/
1002
+ var __webpack_exports__ = {};
1003
+ // ESM COMPAT FLAG
1004
+ __webpack_require__.r(__webpack_exports__);
1005
+
1006
+ // EXPORTS
1007
+ __webpack_require__.d(__webpack_exports__, {
1008
+ "default": () => (/* binding */ components_Timeline_Timeline)
1009
+ });
1010
+
1011
+ // EXTERNAL MODULE: external "react"
1012
+ var external_react_ = __webpack_require__(155);
1013
+ var external_react_default = /*#__PURE__*/__webpack_require__.n(external_react_);
1014
+ // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js
1015
+ var injectStylesIntoStyleTag = __webpack_require__(72);
1016
+ var injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);
1017
+ // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js
1018
+ var styleDomAPI = __webpack_require__(825);
1019
+ var styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);
1020
+ // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js
1021
+ var insertBySelector = __webpack_require__(659);
1022
+ var insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);
1023
+ // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js
1024
+ var setAttributesWithoutAttributes = __webpack_require__(56);
1025
+ var setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);
1026
+ // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js
1027
+ var insertStyleElement = __webpack_require__(540);
1028
+ var insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);
1029
+ // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js
1030
+ var styleTagTransform = __webpack_require__(113);
1031
+ var styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);
1032
+ // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/components/Timeline/Timeline.css
1033
+ var Timeline = __webpack_require__(27);
1034
+ ;// ./src/components/Timeline/Timeline.css
1035
+
1036
+
1037
+
1038
+
1039
+
1040
+
1041
+
1042
+
1043
+
1044
+
1045
+
1046
+ var options = {};
1047
+
1048
+ options.styleTagTransform = (styleTagTransform_default());
1049
+ options.setAttributes = (setAttributesWithoutAttributes_default());
1050
+ options.insert = insertBySelector_default().bind(null, "head");
1051
+ options.domAPI = (styleDomAPI_default());
1052
+ options.insertStyleElement = (insertStyleElement_default());
1053
+
1054
+ var update = injectStylesIntoStyleTag_default()(Timeline/* default */.A, options);
1055
+
1056
+
1057
+
1058
+
1059
+ /* harmony default export */ const Timeline_Timeline = (Timeline/* default */.A && Timeline/* default */.A.locals ? Timeline/* default */.A.locals : undefined);
1060
+
1061
+ ;// ./src/components/Timeline/MasterHeader.js
1062
+ // src/components/Timeline/MasterHeader.js
1063
+
1064
+ // veya MasterHeader.css, eğer ayrı dosyaya koyacaksan
1065
+
1066
+ const MasterHeader = _ref => {
1067
+ let {
1068
+ onToday,
1069
+ onAdvance,
1070
+ onRetreat,
1071
+ onMonthAdvance,
1072
+ onMonthRetreat,
1073
+ dayRange,
1074
+ setDayRange,
1075
+ isDarkMode,
1076
+ toggleDarkMode
1077
+ } = _ref;
1078
+ return /*#__PURE__*/external_react_default().createElement("div", {
1079
+ className: "master-header-container"
1080
+ }, /*#__PURE__*/external_react_default().createElement("button", {
1081
+ className: "master-header-btn",
1082
+ onClick: onToday
1083
+ }, "Today"), /*#__PURE__*/external_react_default().createElement("button", {
1084
+ className: "master-header-btn",
1085
+ onClick: onMonthRetreat
1086
+ }, "1 Ay Geri"), /*#__PURE__*/external_react_default().createElement("button", {
1087
+ className: "master-header-btn",
1088
+ onClick: onRetreat
1089
+ }, "5 G\xFCn Geri"), /*#__PURE__*/external_react_default().createElement("button", {
1090
+ className: "master-header-btn",
1091
+ onClick: onAdvance
1092
+ }, "5 G\xFCn \u0130leri"), /*#__PURE__*/external_react_default().createElement("button", {
1093
+ className: "master-header-btn",
1094
+ onClick: onMonthAdvance
1095
+ }, "1 Ay \u0130leri"), /*#__PURE__*/external_react_default().createElement("select", {
1096
+ className: "master-header-select",
1097
+ value: dayRange,
1098
+ onChange: e => setDayRange(parseInt(e.target.value))
1099
+ }, /*#__PURE__*/external_react_default().createElement("option", {
1100
+ value: 30
1101
+ }, "30 G\xFCn"), /*#__PURE__*/external_react_default().createElement("option", {
1102
+ value: 60
1103
+ }, "60 G\xFCn"), /*#__PURE__*/external_react_default().createElement("option", {
1104
+ value: 90
1105
+ }, "90 G\xFCn")), /*#__PURE__*/external_react_default().createElement("button", {
1106
+ className: "master-header-btn",
1107
+ onClick: toggleDarkMode
1108
+ }, isDarkMode ? "Light Mode" : "Dark Mode"));
1109
+ };
1110
+ /* harmony default export */ const Timeline_MasterHeader = (MasterHeader);
1111
+ ;// ./src/components/Timeline/ResourcesHeader.js
1112
+ // ResourcesHeader.js
1113
+
1114
+
1115
+ const ResourcesHeader = _ref => {
1116
+ let {
1117
+ content
1118
+ } = _ref;
1119
+ return /*#__PURE__*/external_react_default().createElement("div", {
1120
+ className: "resources-header"
1121
+ }, content);
1122
+ };
1123
+ /* harmony default export */ const Timeline_ResourcesHeader = (ResourcesHeader);
1124
+ ;// ./src/components/Timeline/Resources.js
1125
+
1126
+ const Resources = _ref => {
1127
+ let {
1128
+ groupedResources = [],
1129
+ // Kaynakların listesi
1130
+ collapsedGroups = {},
1131
+ // Grupların açık/kapalı durumunu tutan nesne
1132
+ toggleGroupCollapse,
1133
+ // Grupları açma/kapama fonksiyonu
1134
+ resourceSettings = {
1135
+ showIdAsName: false,
1136
+ // Varsayılan: `name` varsa onu göster, yoksa `id`
1137
+ isGrouped: true,
1138
+ // Varsayılan: Gruplama açık
1139
+ isCollapsible: true // Varsayılan: Gruplar açılıp kapanabilir
1140
+ }
1141
+ } = _ref;
1142
+ const {
1143
+ showIdAsName,
1144
+ isGrouped,
1145
+ isCollapsible
1146
+ } = resourceSettings;
1147
+ return /*#__PURE__*/external_react_default().createElement("div", {
1148
+ className: "timeline-resources"
1149
+ }, isGrouped ?
1150
+ // Gruplama aktif
1151
+ groupedResources.map((group, groupIndex) => /*#__PURE__*/external_react_default().createElement("div", {
1152
+ key: groupIndex,
1153
+ className: "resource-group"
1154
+ }, /*#__PURE__*/external_react_default().createElement("div", {
1155
+ className: "resource-group-header",
1156
+ onClick: () => isCollapsible && toggleGroupCollapse(group.groupName)
1157
+ }, group.groupName, " ", isCollapsible && (collapsedGroups[group.groupName] ? "▲" : "▼")), !collapsedGroups[group.groupName] && group.resources.map((resource, resourceIndex) => /*#__PURE__*/external_react_default().createElement("div", {
1158
+ key: resourceIndex,
1159
+ className: "resource-cell"
1160
+ }, showIdAsName ? resource.id : resource.name || resource.id)))) :
1161
+ // Gruplama yok
1162
+ groupedResources.flatMap(group => group.resources).map((resource, resourceIndex) => /*#__PURE__*/external_react_default().createElement("div", {
1163
+ key: resourceIndex,
1164
+ className: "resource-cell"
1165
+ }, showIdAsName ? resource.id : resource.name || resource.id)));
1166
+ };
1167
+ /* harmony default export */ const Timeline_Resources = (Resources);
1168
+ ;// ./src/components/Timeline/TimelineHeader.js
1169
+
1170
+ // CSS dosyasını import etmeyi unutma
1171
+
1172
+ const TimelineHeader = _ref => {
1173
+ let {
1174
+ dates,
1175
+ monthHeaders
1176
+ } = _ref;
1177
+ return /*#__PURE__*/external_react_default().createElement("div", {
1178
+ className: "timeline-header-container"
1179
+ }, /*#__PURE__*/external_react_default().createElement("div", {
1180
+ className: "timeline-header-month-row"
1181
+ }, monthHeaders.map((monthHeader, index) => /*#__PURE__*/external_react_default().createElement("div", {
1182
+ key: index,
1183
+ className: "timeline-header-month-cell",
1184
+ style: {
1185
+ flex: monthHeader.endIndex - monthHeader.startIndex + 1,
1186
+ borderRight: index < monthHeaders.length - 1 ? "1px solid var(--border-color)" : "none"
1187
+ }
1188
+ }, monthHeader.monthName, " ", monthHeader.year))), /*#__PURE__*/external_react_default().createElement("div", {
1189
+ className: "timeline-header-day-row"
1190
+ }, dates.map((date, index) => /*#__PURE__*/external_react_default().createElement("div", {
1191
+ key: index,
1192
+ className: "timeline-header-day-cell",
1193
+ style: {
1194
+ flex: 1,
1195
+ borderRight: index < dates.length - 1 ? "1px solid var(--border-color)" : "none"
1196
+ }
1197
+ }, date.display))));
1198
+ };
1199
+ /* harmony default export */ const Timeline_TimelineHeader = (TimelineHeader);
1200
+ ;// ./src/utils/dateUtils.js
1201
+ // src/utils/dateUtils.js
1202
+
1203
+ /**
1204
+ * "dd/mm/yyyy" formatındaki bir tarih string'ini Date objesine dönüştürür.
1205
+ * Eğer dateInput bir string değilse, direkt Date objesini döndürür.
1206
+ * @param {string | Object | Date} dateInput - "dd/mm/yyyy" formatında tarih stringi veya {fullDate: Date, display: string} objesi veya Date objesi.
1207
+ * @returns {Date} - Date objesi.
1208
+ */
1209
+ const parseDate = dateInput => {
1210
+ if (dateInput instanceof Date) {
1211
+ return dateInput;
1212
+ }
1213
+ if (typeof dateInput === 'string') {
1214
+ const [day, month, year] = dateInput.split("/").map(Number);
1215
+ return new Date(year, month - 1, day);
1216
+ } else if (typeof dateInput === 'object' && dateInput.fullDate instanceof Date) {
1217
+ return new Date(dateInput.fullDate.getTime() + dateInput.fullDate.getTimezoneOffset() * 60000);
1218
+ } else {
1219
+ console.error("parseDate received invalid input:", dateInput);
1220
+ return new Date(); // veya hata fırlat
1221
+ }
1222
+ };
1223
+
1224
+ /**
1225
+ * Bir tarihin belirli bir aralık içinde olup olmadığını kontrol eder.
1226
+ * @param {string | Object | Date} date - "dd/mm/yyyy" formatında tarih stringi, {fullDate: Date, display: string} objesi veya Date objesi.
1227
+ * @param {string | Object | Date} startDate - "dd/mm/yyyy" formatında başlangıç tarihi stringi, {fullDate: Date, display: string} objesi veya Date objesi.
1228
+ * @param {string | Object | Date} endDate - "dd/mm/yyyy" formatında bitiş tarihi stringi, {fullDate: Date, display: string} objesi veya Date objesi.
1229
+ * @returns {boolean} - Tarih aralık içinde ise true, değilse false.
1230
+ */
1231
+ const isDateInRange = (date, startDate, endDate) => {
1232
+ const d = parseDate(date);
1233
+ const start = parseDate(startDate);
1234
+ const end = parseDate(endDate);
1235
+ return d >= start && d <= end;
1236
+ };
1237
+ ;// ./src/hooks/useDragAndDrop.js
1238
+ // src/hooks/useDragAndDrop.js
1239
+
1240
+ // Named import
1241
+
1242
+ const useDragAndDrop = function () {
1243
+ let initialEvents = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
1244
+ const [isDragging, setIsDragging] = (0,external_react_.useState)(false);
1245
+ const [dragStart, setDragStart] = (0,external_react_.useState)(null);
1246
+ const [dragEnd, setDragEnd] = (0,external_react_.useState)(null);
1247
+ const [events, setEvents] = (0,external_react_.useState)(initialEvents);
1248
+
1249
+ // Sürükleme başlat
1250
+ const startDrag = (resourceId, date) => {
1251
+ setIsDragging(true);
1252
+ setDragStart({
1253
+ resourceId,
1254
+ date
1255
+ });
1256
+ setDragEnd({
1257
+ resourceId,
1258
+ date
1259
+ });
1260
+ };
1261
+
1262
+ // Sürükleme hareketi
1263
+ const updateDrag = (resourceId, date) => {
1264
+ if (!isDragging) return;
1265
+ setDragEnd({
1266
+ resourceId,
1267
+ date
1268
+ });
1269
+ };
1270
+
1271
+ // Sürükleme bitişi
1272
+ const endDrag = dates => {
1273
+ if (!isDragging || !dragStart || !dragEnd) return;
1274
+ if (dragStart.resourceId !== dragEnd.resourceId) {
1275
+ resetDrag();
1276
+ return;
1277
+ }
1278
+ const startDateIndex = dates.findIndex(d => parseDate(d.fullDate).toDateString() === parseDate(dragStart.date.fullDate).toDateString());
1279
+ const endDateIndex = dates.findIndex(d => parseDate(d.fullDate).toDateString() === parseDate(dragEnd.date.fullDate).toDateString());
1280
+ if (startDateIndex === -1 || endDateIndex === -1) {
1281
+ resetDrag();
1282
+ return;
1283
+ }
1284
+ const sortedStartIndex = Math.min(startDateIndex, endDateIndex);
1285
+ const sortedEndIndex = Math.max(startDateIndex, endDateIndex);
1286
+ const startDate = dates[sortedStartIndex].fullDate;
1287
+ const endDate = dates[sortedEndIndex].fullDate;
1288
+ const newEvent = {
1289
+ id: Date.now(),
1290
+ title: "Yeni Etkinlik",
1291
+ resourceId: dragStart.resourceId,
1292
+ startDate: startDate,
1293
+ endDate: endDate,
1294
+ color: "#ff7f50"
1295
+ };
1296
+ setEvents(prev => [...prev, newEvent]);
1297
+ resetDrag();
1298
+ };
1299
+ const resetDrag = () => {
1300
+ setIsDragging(false);
1301
+ setDragStart(null);
1302
+ setDragEnd(null);
1303
+ };
1304
+ return {
1305
+ events,
1306
+ isDragging,
1307
+ dragStart,
1308
+ dragEnd,
1309
+ startDrag,
1310
+ updateDrag,
1311
+ endDrag,
1312
+ setEvents
1313
+ };
1314
+ };
1315
+ /* harmony default export */ const hooks_useDragAndDrop = (useDragAndDrop);
1316
+ ;// ./src/hooks/useEventDragDrop.js
1317
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1318
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1319
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
1320
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
1321
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
1322
+
1323
+ const useEventDragDrop = (events, setEvents, setDropInfo) => {
1324
+ const [draggingEvent, setDraggingEvent] = (0,external_react_.useState)(null);
1325
+ const [dragOffset, setDragOffset] = (0,external_react_.useState)(0);
1326
+ const [mode, setMode] = (0,external_react_.useState)(null); // "drag" veya "extend"
1327
+
1328
+ const handleDragStart = (event, eventId) => {
1329
+ if (mode === "extend") return; // Uzatma modundaysa taşıma işlemini başlatma
1330
+
1331
+ event.stopPropagation();
1332
+ const eventElement = event.target;
1333
+ const eventRect = eventElement.getBoundingClientRect();
1334
+ const offset = event.clientX - eventRect.left;
1335
+ setDraggingEvent(eventId);
1336
+ setDragOffset(offset);
1337
+ setMode("drag"); // Modu taşıma olarak ayarla
1338
+
1339
+ const draggedEvent = events.find(evt => evt.id === eventId);
1340
+ if (draggedEvent) {
1341
+ console.log("Dragging Event Start:", draggedEvent.startDate);
1342
+ console.log("Dragging Event End:", draggedEvent.endDate);
1343
+ }
1344
+ };
1345
+ const handleExtendStart = (event, eventId) => {
1346
+ event.stopPropagation();
1347
+ setDraggingEvent(eventId);
1348
+ setMode("extend"); // Modu uzatma olarak ayarla
1349
+ };
1350
+ const handleDragOver = event => {
1351
+ event.preventDefault();
1352
+ };
1353
+ const handleDrop = (event, resourceId, targetDate) => {
1354
+ event.preventDefault();
1355
+ if (mode === "drag" && draggingEvent) {
1356
+ const draggedEvent = events.find(evt => evt.id === draggingEvent);
1357
+ if (draggedEvent) {
1358
+ const duration = draggedEvent.endDate - draggedEvent.startDate;
1359
+ const cellWidth = event.target.offsetWidth || 30;
1360
+ const offsetDays = Math.floor(dragOffset / cellWidth);
1361
+ const newStartDate = new Date(targetDate.getTime() - offsetDays * 24 * 60 * 60 * 1000);
1362
+ const newEndDate = new Date(newStartDate.getTime() + duration);
1363
+ console.log("New Start Date:", newStartDate);
1364
+ console.log("New End Date:", newEndDate);
1365
+ setEvents(prevEvents => prevEvents.map(evt => evt.id === draggingEvent ? _objectSpread(_objectSpread({}, evt), {}, {
1366
+ resourceId,
1367
+ startDate: newStartDate,
1368
+ endDate: newEndDate
1369
+ }) : evt));
1370
+ if (setDropInfo) {
1371
+ setDropInfo({
1372
+ id: draggingEvent,
1373
+ newResourceId: resourceId,
1374
+ newStartDate,
1375
+ newEndDate
1376
+ });
1377
+ }
1378
+ }
1379
+ }
1380
+ setDraggingEvent(null);
1381
+ setDragOffset(0);
1382
+ setMode(null);
1383
+ };
1384
+ const handleExtend = (event, eventId, newEndDate) => {
1385
+ if (mode !== "extend" || draggingEvent !== eventId) return;
1386
+ setEvents(prevEvents => prevEvents.map(evt => evt.id === eventId ? _objectSpread(_objectSpread({}, evt), {}, {
1387
+ endDate: newEndDate
1388
+ }) : evt));
1389
+ console.log("Extended Event ID:", eventId, "New End Date:", newEndDate);
1390
+ setDraggingEvent(null);
1391
+ setMode(null);
1392
+ };
1393
+ const handleDragEnd = () => {
1394
+ setDraggingEvent(null);
1395
+ setDragOffset(0);
1396
+ setMode(null);
1397
+ };
1398
+ return {
1399
+ handleDragStart,
1400
+ handleExtendStart,
1401
+ handleDragOver,
1402
+ handleDrop,
1403
+ handleExtend,
1404
+ handleDragEnd
1405
+ };
1406
+ };
1407
+ /* harmony default export */ const hooks_useEventDragDrop = (useEventDragDrop);
1408
+ ;// ./src/components/Timeline/Indicator.js
1409
+
1410
+ const Indicator = _ref => {
1411
+ let {
1412
+ todayIndex,
1413
+ totalDays
1414
+ } = _ref;
1415
+ if (todayIndex < 0 || todayIndex >= totalDays) {
1416
+ console.log("Indicator not visible: Out of bounds");
1417
+ return null; // Bugün timeline dışında ise çizgiyi gösterme
1418
+ }
1419
+ console.log("todayIndex:", todayIndex);
1420
+ console.log("totalDays:", totalDays);
1421
+ return /*#__PURE__*/external_react_default().createElement("div", {
1422
+ style: {
1423
+ position: "absolute",
1424
+ top: 0,
1425
+ left: "calc(".concat((todayIndex + 0.5) / totalDays, " * 100%)"),
1426
+ // Günün ortasına yerleştirmek için +0.5
1427
+ width: "2px",
1428
+ height: "100%",
1429
+ backgroundColor: "transparent",
1430
+ zIndex: 5,
1431
+ borderStyle: "dashed",
1432
+ // Kesikli çizgi için
1433
+ borderWidth: "0 0 0 2px",
1434
+ // Sadece sol tarafa kesikli çizgi
1435
+ borderColor: "red"
1436
+ }
1437
+ });
1438
+ };
1439
+ /* harmony default export */ const Timeline_Indicator = (Indicator);
1440
+ ;// ./src/hooks/useExtendEvent.js
1441
+ function useExtendEvent_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1442
+ function useExtendEvent_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? useExtendEvent_ownKeys(Object(t), !0).forEach(function (r) { useExtendEvent_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : useExtendEvent_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1443
+ function useExtendEvent_defineProperty(e, r, t) { return (r = useExtendEvent_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
1444
+ function useExtendEvent_toPropertyKey(t) { var i = useExtendEvent_toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
1445
+ function useExtendEvent_toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
1446
+
1447
+ const useExtendEvent = (events, setEvents) => {
1448
+ /**
1449
+ * Etkinliği uzatmak veya kısaltmak için kullanılan işlev.
1450
+ * @param {number} eventId - Güncellenmesi gereken etkinliğin ID'si.
1451
+ * @param {Date} newEndDate - Etkinliğin yeni bitiş tarihi.
1452
+ */
1453
+ const extendEvent = (0,external_react_.useCallback)((eventId, newEndDate) => {
1454
+ setEvents(prevEvents => prevEvents.map(event => event.id === eventId ? useExtendEvent_objectSpread(useExtendEvent_objectSpread({}, event), {}, {
1455
+ endDate: newEndDate // Yeni bitiş tarihini günceller
1456
+ }) : event // Diğer etkinlikler aynı kalır
1457
+ ));
1458
+ }, [setEvents]);
1459
+ return {
1460
+ extendEvent
1461
+ };
1462
+ };
1463
+ /* harmony default export */ const hooks_useExtendEvent = (useExtendEvent);
1464
+ ;// ./src/components/Timeline/TimelineContent.js
1465
+ function TimelineContent_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1466
+ function TimelineContent_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? TimelineContent_ownKeys(Object(t), !0).forEach(function (r) { TimelineContent_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : TimelineContent_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1467
+ function TimelineContent_defineProperty(e, r, t) { return (r = TimelineContent_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
1468
+ function TimelineContent_toPropertyKey(t) { var i = TimelineContent_toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
1469
+ function TimelineContent_toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
1470
+
1471
+
1472
+
1473
+
1474
+
1475
+
1476
+ // import "./Timeline.css"; // varsayalım "Timeline.css" globalde import ediliyor
1477
+
1478
+ const TimelineContent = _ref => {
1479
+ let {
1480
+ groupedResources,
1481
+ dates,
1482
+ collapsedGroups,
1483
+ events,
1484
+ setEvents,
1485
+ onEventClick,
1486
+ todayIndex,
1487
+ indicatorOn,
1488
+ resourceSettings,
1489
+ setDropInfo,
1490
+ // Yeni prop'lar
1491
+ eventsDragOn = true,
1492
+ eventsExtendOn = true,
1493
+ createNewEventOn = true,
1494
+ onDragInfo,
1495
+ onExtendInfo,
1496
+ onCreateEventInfo,
1497
+ onEventRightClick
1498
+ } = _ref;
1499
+ // ------------------- HOOKS & STATE -------------------
1500
+ const containerRef = (0,external_react_.useRef)(null);
1501
+
1502
+ // Drag
1503
+ const {
1504
+ isDragging,
1505
+ dragStart,
1506
+ dragEnd
1507
+ } = hooks_useDragAndDrop(events, setEvents);
1508
+ const {
1509
+ handleDragStart,
1510
+ handleDragOver,
1511
+ handleDrop,
1512
+ handleDragEnd
1513
+ } = hooks_useEventDragDrop(events, setEvents, setDropInfo);
1514
+
1515
+ // Extend
1516
+ const {
1517
+ extendEvent
1518
+ } = hooks_useExtendEvent(events, setEvents);
1519
+ const [mode, setMode] = (0,external_react_.useState)(null); // null | "extend"
1520
+ const [extendingEvent, setExtendingEvent] = (0,external_react_.useState)(null);
1521
+ const [originalEndDate, setOriginalEndDate] = (0,external_react_.useState)(null);
1522
+ const [startMouseX, setStartMouseX] = (0,external_react_.useState)(null);
1523
+
1524
+ // Create new event
1525
+ const [isCreating, setIsCreating] = (0,external_react_.useState)(false);
1526
+ const [tempEvent, setTempEvent] = (0,external_react_.useState)(null);
1527
+
1528
+ // Tooltip
1529
+ const [selectedEvent, setSelectedEvent] = (0,external_react_.useState)(null);
1530
+ const [tooltipPosition, setTooltipPosition] = (0,external_react_.useState)({
1531
+ top: 0,
1532
+ left: 0
1533
+ });
1534
+ const totalDays = dates.length;
1535
+
1536
+ // ------------------- Tooltip Logic -------------------
1537
+ const handleEventClickInternal = (event, e) => {
1538
+ e.stopPropagation();
1539
+ // Harici callback
1540
+ if (onEventClick) onEventClick(event, e);
1541
+
1542
+ // Tooltip göstermek
1543
+ const eventElement = e.currentTarget;
1544
+ if (eventElement) {
1545
+ const rect = eventElement.getBoundingClientRect();
1546
+ setTooltipPosition({
1547
+ top: rect.top + window.scrollY,
1548
+ left: rect.left + rect.width / 2 + window.scrollX
1549
+ });
1550
+ setSelectedEvent(event);
1551
+ }
1552
+ };
1553
+ const handleCloseTooltip = () => {
1554
+ setSelectedEvent(null);
1555
+ };
1556
+
1557
+ // ------------------- Create New Event -------------------
1558
+ const handleCellClick = (resourceId, date) => {
1559
+ if (!createNewEventOn) return; // create devrede değilse
1560
+
1561
+ const startDate = parseDate(date.fullDate);
1562
+ const newEvent = {
1563
+ id: Date.now(),
1564
+ title: "1 Gece",
1565
+ startDate,
1566
+ endDate: new Date(startDate.getTime() + 24 * 60 * 60 * 1000),
1567
+ resourceId,
1568
+ // color => var(--timeline-new-event-background-color) => => Sonra inline style yerine className
1569
+ color: "" // Bunu .css’te "var(--timeline-new-event-background-color)" atayabilirsin
1570
+ };
1571
+ setTempEvent(newEvent);
1572
+ setIsCreating(true);
1573
+ };
1574
+ (0,external_react_.useEffect)(() => {
1575
+ if (!createNewEventOn) return;
1576
+ if (!isCreating) return;
1577
+ if (mode === "extend") {
1578
+ console.log(">>> 'extend' mode, skip new event creation");
1579
+ return;
1580
+ }
1581
+ const handleMouseMove = e => {
1582
+ if (!isCreating || !tempEvent) return;
1583
+ const cell = document.elementFromPoint(e.clientX, e.clientY);
1584
+ const cellW = (cell === null || cell === void 0 ? void 0 : cell.offsetWidth) || 30;
1585
+ const startX = tempEvent.startX || e.clientX;
1586
+ const deltaX = e.clientX - startX;
1587
+ const daysToAdd = Math.max(1, Math.floor(deltaX / cellW));
1588
+ const newEndDate = new Date(tempEvent.startDate.getTime());
1589
+ newEndDate.setDate(newEndDate.getDate() + daysToAdd);
1590
+ setTempEvent(TimelineContent_objectSpread(TimelineContent_objectSpread({}, tempEvent), {}, {
1591
+ endDate: newEndDate,
1592
+ startX: startX,
1593
+ title: "".concat(daysToAdd, " Gece")
1594
+ }));
1595
+ };
1596
+ const handleMouseUp = () => {
1597
+ if (isCreating && tempEvent) {
1598
+ setEvents([...events, tempEvent]);
1599
+ if (onCreateEventInfo) {
1600
+ onCreateEventInfo(tempEvent);
1601
+ }
1602
+ }
1603
+ setTempEvent(null);
1604
+ setIsCreating(false);
1605
+ };
1606
+ window.addEventListener("mousemove", handleMouseMove);
1607
+ window.addEventListener("mouseup", handleMouseUp);
1608
+ return () => {
1609
+ window.removeEventListener("mousemove", handleMouseMove);
1610
+ window.removeEventListener("mouseup", handleMouseUp);
1611
+ };
1612
+ }, [createNewEventOn, isCreating, mode, tempEvent, events, onCreateEventInfo, setEvents]);
1613
+
1614
+ // ------------------- Drag Logic -------------------
1615
+ const handleDragStartSafe = (e, eventId) => {
1616
+ if (!eventsDragOn) {
1617
+ e.preventDefault();
1618
+ return;
1619
+ }
1620
+ handleDragStart(e, eventId);
1621
+ };
1622
+ const handleDragEndSafe = e => {
1623
+ if (!eventsDragOn) {
1624
+ e.preventDefault();
1625
+ return;
1626
+ }
1627
+ handleDragEnd();
1628
+ // onDragInfo(...) => if needed
1629
+ };
1630
+
1631
+ // ------------------- Extend Logic -------------------
1632
+ const handleMouseDownExtend = (mouseEvent, event) => {
1633
+ if (!eventsExtendOn) return;
1634
+ mouseEvent.stopPropagation();
1635
+ console.log(">>> Extend start ID:", event.id);
1636
+ setMode("extend");
1637
+ setExtendingEvent(event);
1638
+ setOriginalEndDate(event.endDate);
1639
+ setStartMouseX(mouseEvent.clientX);
1640
+ };
1641
+ const handleMouseMoveExtend = e => {
1642
+ if (mode !== "extend" || !extendingEvent) return;
1643
+ if (!eventsExtendOn) return;
1644
+ const currentMouseX = e.clientX;
1645
+ const deltaX = currentMouseX - (startMouseX !== null && startMouseX !== void 0 ? startMouseX : 0);
1646
+ const cellW = 30;
1647
+ const daysToAdd = Math.floor(deltaX / cellW);
1648
+ const newEndDate = new Date((originalEndDate !== null && originalEndDate !== void 0 ? originalEndDate : new Date()).getTime());
1649
+ newEndDate.setDate(newEndDate.getDate() + daysToAdd);
1650
+ console.log(">>> Extending ID:", extendingEvent.id, "=>", newEndDate);
1651
+ setEvents(prev => prev.map(evt => evt.id === extendingEvent.id ? TimelineContent_objectSpread(TimelineContent_objectSpread({}, evt), {}, {
1652
+ endDate: newEndDate
1653
+ }) : evt));
1654
+ };
1655
+ const handleMouseUpExtend = () => {
1656
+ console.log(">>> Extend finished ID:", extendingEvent === null || extendingEvent === void 0 ? void 0 : extendingEvent.id);
1657
+ if (onExtendInfo && extendingEvent) {
1658
+ // callback
1659
+ const updatedEvent = events.find(ev => ev.id === extendingEvent.id);
1660
+ if (updatedEvent) {
1661
+ onExtendInfo({
1662
+ eventId: extendingEvent.id,
1663
+ newEndDate: updatedEvent.endDate
1664
+ });
1665
+ }
1666
+ }
1667
+ setMode(null);
1668
+ setExtendingEvent(null);
1669
+ setOriginalEndDate(null);
1670
+ setStartMouseX(null);
1671
+ };
1672
+ (0,external_react_.useEffect)(() => {
1673
+ if (mode === "extend") {
1674
+ const onMove = e => handleMouseMoveExtend(e);
1675
+ const onUp = () => handleMouseUpExtend();
1676
+ document.addEventListener("mousemove", onMove);
1677
+ document.addEventListener("mouseup", onUp);
1678
+ return () => {
1679
+ document.removeEventListener("mousemove", onMove);
1680
+ document.removeEventListener("mouseup", onUp);
1681
+ };
1682
+ }
1683
+ }, [mode, extendingEvent, eventsExtendOn, originalEndDate, startMouseX]);
1684
+
1685
+ // ------------------- Right Click (context) -------------------
1686
+ const handleRightClickEvent = (evt, reactEvent) => {
1687
+ reactEvent.preventDefault();
1688
+ if (onEventRightClick) onEventRightClick(evt, reactEvent);
1689
+ };
1690
+
1691
+ // ------------------- Helper isCellSelected -------------------
1692
+ const isCellSelected = (resourceId, date) => {
1693
+ if (!dragStart || !dragEnd) return false;
1694
+ if (resourceId !== dragStart.resourceId) return false;
1695
+ const startIndex = dates.findIndex(d => parseDate(d.fullDate).getTime() === parseDate(dragStart.date).getTime());
1696
+ const endIndex = dates.findIndex(d => parseDate(d.fullDate).getTime() === parseDate(dragEnd.date).getTime());
1697
+ const currentIndex = dates.findIndex(d => parseDate(d.fullDate).getTime() === parseDate(date.fullDate).getTime());
1698
+ if (startIndex === -1 || endIndex === -1 || currentIndex === -1) return false;
1699
+ return currentIndex >= Math.min(startIndex, endIndex) && currentIndex <= Math.max(startIndex, endIndex);
1700
+ };
1701
+
1702
+ // ------------------- calculatePosition -------------------
1703
+ const calculatePosition = (ev, dateArr) => {
1704
+ const startDate = parseDate(ev.startDate);
1705
+ const endDate = parseDate(ev.endDate);
1706
+ const startIndex = dateArr.findIndex(d => parseDate(d.fullDate).toDateString() === startDate.toDateString());
1707
+ const endIndex = dateArr.findIndex(d => parseDate(d.fullDate).toDateString() === endDate.toDateString());
1708
+ const totalDays = dateArr.length;
1709
+ if (startIndex < 0 && endIndex < 0) {
1710
+ return {
1711
+ isVisible: false,
1712
+ left: 0,
1713
+ width: 0,
1714
+ isPartialStart: false,
1715
+ isPartialEnd: false
1716
+ };
1717
+ }
1718
+ if (startIndex >= totalDays && endIndex >= totalDays) {
1719
+ return {
1720
+ isVisible: false,
1721
+ left: 0,
1722
+ width: 0,
1723
+ isPartialStart: false,
1724
+ isPartialEnd: false
1725
+ };
1726
+ }
1727
+ const effectiveStartIndex = Math.max(startIndex, 0);
1728
+ const effectiveEndIndex = Math.min(endIndex, totalDays - 1);
1729
+ const isPartialStart = startIndex < 0;
1730
+ const isPartialEnd = endIndex >= totalDays;
1731
+ const leftPercentage = (effectiveStartIndex + (isPartialStart ? 0 : 0.5)) / totalDays * 100;
1732
+ const rightPercentage = (effectiveEndIndex + (isPartialEnd ? 1 : 0.5)) / totalDays * 100;
1733
+ const widthPercentage = rightPercentage - leftPercentage;
1734
+ return {
1735
+ isVisible: true,
1736
+ left: "".concat(leftPercentage, "%"),
1737
+ width: "".concat(widthPercentage, "%"),
1738
+ isPartialStart,
1739
+ isPartialEnd
1740
+ };
1741
+ };
1742
+
1743
+ // ------------------- RENDER -------------------
1744
+ return /*#__PURE__*/external_react_default().createElement("div", {
1745
+ ref: containerRef,
1746
+ className: "timeline-content-container" // Yeni class, stilini timeline.css'e ekleyebilirsin
1747
+ }, indicatorOn && /*#__PURE__*/external_react_default().createElement(Timeline_Indicator, {
1748
+ todayIndex: todayIndex,
1749
+ totalDays: totalDays
1750
+ }), groupedResources.map((group, groupIndex) => /*#__PURE__*/external_react_default().createElement("div", {
1751
+ key: groupIndex,
1752
+ className: "timeline-group-container"
1753
+ }, resourceSettings.isGrouped && /*#__PURE__*/external_react_default().createElement("div", {
1754
+ className: "timeline-group-header-row"
1755
+ }, dates.map((dateObj, colIndex) => /*#__PURE__*/external_react_default().createElement("div", {
1756
+ key: "group-header-".concat(groupIndex, "-").concat(colIndex),
1757
+ className: "timeline-group-header-cell"
1758
+ }))), !collapsedGroups[group.groupName] && group.resources.map((resource, rowIndex) => {
1759
+ const resourceEvents = events.filter(ev => ev.resourceId === resource.id);
1760
+ return /*#__PURE__*/external_react_default().createElement("div", {
1761
+ key: resource.id,
1762
+ className: "timeline-resource-row"
1763
+ }, resourceEvents.map(event => {
1764
+ const {
1765
+ isVisible,
1766
+ left,
1767
+ width,
1768
+ isPartialStart,
1769
+ isPartialEnd
1770
+ } = calculatePosition(event, dates);
1771
+ if (!isVisible) return null;
1772
+ return /*#__PURE__*/external_react_default().createElement("div", {
1773
+ key: event.id,
1774
+ className: "timeline-event",
1775
+ draggable: mode !== "extend" && eventsDragOn,
1776
+ onDragStart: e => {
1777
+ if (mode === "extend") {
1778
+ e.preventDefault();
1779
+ return;
1780
+ }
1781
+ handleDragStartSafe(e, event.id);
1782
+ },
1783
+ onDragEnd: e => {
1784
+ if (mode === "extend") {
1785
+ e.preventDefault();
1786
+ return;
1787
+ }
1788
+ handleDragEndSafe(e);
1789
+ },
1790
+ onContextMenu: reactEvent => handleRightClickEvent(event, reactEvent),
1791
+ onClick: ev => handleEventClickInternal(event, ev),
1792
+ style: {
1793
+ left,
1794
+ width,
1795
+ top: "5px",
1796
+ // color from var(--timeline-event-text-color)
1797
+ // background from event.color or var(...) => if event.color empty, fallback in CSS
1798
+ borderTopLeftRadius: isPartialStart ? "0px" : "20px",
1799
+ borderBottomLeftRadius: isPartialStart ? "0px" : "20px",
1800
+ borderTopRightRadius: isPartialEnd ? "0px" : "20px",
1801
+ borderBottomRightRadius: isPartialEnd ? "0px" : "20px",
1802
+ cursor: mode === "extend" ? "col-resize" : "grab"
1803
+ }
1804
+ }, event.title, eventsExtendOn && /*#__PURE__*/external_react_default().createElement("div", {
1805
+ className: "timeline-event-extend-handle",
1806
+ onMouseDown: mouseEvent => {
1807
+ mouseEvent.stopPropagation();
1808
+ handleMouseDownExtend(mouseEvent, event);
1809
+ }
1810
+ }));
1811
+ }), tempEvent && tempEvent.resourceId === resource.id && /*#__PURE__*/external_react_default().createElement("div", {
1812
+ className: "timeline-temp-event",
1813
+ style: TimelineContent_objectSpread(TimelineContent_objectSpread({}, calculatePosition(tempEvent, dates)), {}, {
1814
+ top: "5px"
1815
+ })
1816
+ }, tempEvent.title), dates.map((dateObj, colIndex) => /*#__PURE__*/external_react_default().createElement("div", {
1817
+ key: "cell-".concat(groupIndex, "-").concat(rowIndex, "-").concat(colIndex),
1818
+ className: "timeline-cell ".concat(isCellSelected(resource.id, dateObj) ? "selected" : ""),
1819
+ "data-date": JSON.stringify(dateObj),
1820
+ "data-resource-id": resource.id,
1821
+ onMouseDown: () => handleCellClick(resource.id, dateObj),
1822
+ onDragOver: e => handleDragOver(e),
1823
+ onDrop: e => handleDrop(e, resource.id, parseDate(dateObj.fullDate))
1824
+ })));
1825
+ }))), selectedEvent &&
1826
+ /*#__PURE__*/
1827
+ // "timeline-event-tooltip" gibi className tanımlanabilir
1828
+ // eğer custom css istenirse
1829
+ external_react_default().createElement("div", {
1830
+ style: {
1831
+ position: "absolute",
1832
+ top: tooltipPosition.top,
1833
+ left: tooltipPosition.left,
1834
+ // ...
1835
+ backgroundColor: "#333",
1836
+ color: "#fff",
1837
+ padding: "5px",
1838
+ borderRadius: "4px",
1839
+ zIndex: 999
1840
+ }
1841
+ }, /*#__PURE__*/external_react_default().createElement("button", {
1842
+ onClick: () => handleCloseTooltip()
1843
+ }, "X"), selectedEvent.title));
1844
+ };
1845
+ /* harmony default export */ const Timeline_TimelineContent = (TimelineContent);
1846
+ ;// ./src/components/Timeline/EventTooltip.js
1847
+ // src/components/Timeline/EventTooltip.js
1848
+
1849
+ const EventTooltip = _ref => {
1850
+ let {
1851
+ event,
1852
+ position = {
1853
+ top: 0,
1854
+ left: 0
1855
+ },
1856
+ onClose,
1857
+ onEdit,
1858
+ onDelete
1859
+ } = _ref;
1860
+ if (!event) return null;
1861
+ const {
1862
+ top,
1863
+ left
1864
+ } = position;
1865
+
1866
+ // Rezervasyon durumuna göre renk belirleme
1867
+ const getStatusColor = status => {
1868
+ switch (status) {
1869
+ case "Confirmed":
1870
+ return "#4caf50";
1871
+ // Yeşil
1872
+ case "Pending":
1873
+ return "#ff9800";
1874
+ // Turuncu
1875
+ case "Cancelled":
1876
+ return "#f44336";
1877
+ // Kırmızı
1878
+ case "Completed":
1879
+ return "#2196f3";
1880
+ // Mavi
1881
+ default:
1882
+ return "#9e9e9e";
1883
+ // Gri
1884
+ }
1885
+ };
1886
+ const statusColor = getStatusColor(event.status);
1887
+ return /*#__PURE__*/external_react_default().createElement("div", {
1888
+ style: {
1889
+ position: "absolute",
1890
+ top: top - 30,
1891
+ // Tooltip'in biraz yukarıda görünmesi için
1892
+ left: left + 70,
1893
+ transform: "translateX(-50%)",
1894
+ backgroundColor: "#ffffff",
1895
+ color: "#333333",
1896
+ borderRadius: "10px",
1897
+ boxShadow: "0 8px 16px rgba(0, 0, 0, 0.2)",
1898
+ fontSize: "16px",
1899
+ zIndex: 1000,
1900
+ pointerEvents: "auto",
1901
+ // Tooltip'in tıklanabilir olmasını sağlar
1902
+ whiteSpace: "normal",
1903
+ maxWidth: "400px",
1904
+ width: "100%",
1905
+ transition: "opacity 0.3s ease, transform 0.3s ease"
1906
+ }
1907
+ }, onClose && /*#__PURE__*/external_react_default().createElement("button", {
1908
+ onClick: onClose,
1909
+ style: {
1910
+ position: "absolute",
1911
+ top: "10px",
1912
+ right: "15px",
1913
+ background: "transparent",
1914
+ border: "none",
1915
+ color: "#aaa",
1916
+ fontSize: "24px",
1917
+ cursor: "pointer",
1918
+ transition: "color 0.2s"
1919
+ },
1920
+ "aria-label": "Kapat",
1921
+ onMouseOver: e => e.target.style.color = "#000",
1922
+ onMouseOut: e => e.target.style.color = "#aaa"
1923
+ }, "\xD7"), /*#__PURE__*/external_react_default().createElement("div", {
1924
+ style: {
1925
+ backgroundColor: statusColor,
1926
+ color: "#ffffff",
1927
+ padding: "15px 20px",
1928
+ borderTopLeftRadius: "10px",
1929
+ borderTopRightRadius: "10px",
1930
+ display: "flex",
1931
+ flexDirection: "column",
1932
+ gap: "5px"
1933
+ }
1934
+ }, /*#__PURE__*/external_react_default().createElement("div", {
1935
+ style: {
1936
+ fontWeight: "bold",
1937
+ fontSize: "18px"
1938
+ }
1939
+ }, event.title), /*#__PURE__*/external_react_default().createElement("div", {
1940
+ style: {
1941
+ fontSize: "14px"
1942
+ }
1943
+ }, "Rezervasyon ID: ", event.reservationId)), /*#__PURE__*/external_react_default().createElement("div", {
1944
+ style: {
1945
+ padding: "20px",
1946
+ display: "flex",
1947
+ flexDirection: "column",
1948
+ gap: "15px"
1949
+ }
1950
+ }, Array.isArray(event.guestNames) && /*#__PURE__*/external_react_default().createElement("div", null, /*#__PURE__*/external_react_default().createElement("strong", null, "Misafirler:"), " ", event.guestNames.join(", ")), /*#__PURE__*/external_react_default().createElement("div", {
1951
+ style: {
1952
+ display: "flex",
1953
+ justifyContent: "space-between",
1954
+ marginBottom: "10px"
1955
+ }
1956
+ }, /*#__PURE__*/external_react_default().createElement("div", null, /*#__PURE__*/external_react_default().createElement("strong", null, "Giri\u015F:"), " ", new Date(event.startDate).toLocaleDateString()), /*#__PURE__*/external_react_default().createElement("div", null, /*#__PURE__*/external_react_default().createElement("strong", null, "\xC7\u0131k\u0131\u015F:"), " ", new Date(event.endDate).toLocaleDateString())), (event.totalAmount !== undefined || event.amountPaid !== undefined) && /*#__PURE__*/external_react_default().createElement("div", {
1957
+ style: {
1958
+ display: "flex",
1959
+ justifyContent: "space-between",
1960
+ marginBottom: "10px"
1961
+ }
1962
+ }, event.amountPaid !== undefined && /*#__PURE__*/external_react_default().createElement("div", null, /*#__PURE__*/external_react_default().createElement("strong", null, "\xD6denen Miktar:"), " $", event.amountPaid.toFixed(2)), event.totalAmount !== undefined && /*#__PURE__*/external_react_default().createElement("div", null, /*#__PURE__*/external_react_default().createElement("strong", null, "Toplam Bor\xE7:"), " $", event.totalAmount.toFixed(2))), event.status && /*#__PURE__*/external_react_default().createElement("div", null, /*#__PURE__*/external_react_default().createElement("strong", null, "Durum:"), " ", event.status), event.note && /*#__PURE__*/external_react_default().createElement("div", null, /*#__PURE__*/external_react_default().createElement("strong", null, "Not:"), " ", event.note)), /*#__PURE__*/external_react_default().createElement("div", {
1963
+ style: {
1964
+ padding: "15px 20px",
1965
+ borderTop: "1px solid #ddd",
1966
+ display: "flex",
1967
+ justifyContent: "flex-end",
1968
+ gap: "10px",
1969
+ borderBottomLeftRadius: "10px",
1970
+ borderBottomRightRadius: "10px"
1971
+ }
1972
+ }, onEdit && /*#__PURE__*/external_react_default().createElement("button", {
1973
+ onClick: () => onEdit(event),
1974
+ style: {
1975
+ padding: "8px 16px",
1976
+ backgroundColor: "#2196f3",
1977
+ color: "#ffffff",
1978
+ border: "none",
1979
+ borderRadius: "4px",
1980
+ cursor: "pointer",
1981
+ fontSize: "14px",
1982
+ display: "flex",
1983
+ alignItems: "center",
1984
+ gap: "5px",
1985
+ transition: "background-color 0.2s"
1986
+ },
1987
+ onMouseOver: e => e.target.style.backgroundColor = "#1976d2",
1988
+ onMouseOut: e => e.target.style.backgroundColor = "#2196f3"
1989
+ }, /*#__PURE__*/external_react_default().createElement("span", {
1990
+ role: "img",
1991
+ "aria-label": "D\xFCzenle"
1992
+ }, "\u270F\uFE0F"), "D\xFCzenle"), onDelete && /*#__PURE__*/external_react_default().createElement("button", {
1993
+ onClick: () => onDelete(event.id),
1994
+ style: {
1995
+ padding: "8px 16px",
1996
+ backgroundColor: "#f44336",
1997
+ color: "#ffffff",
1998
+ border: "none",
1999
+ borderRadius: "4px",
2000
+ cursor: "pointer",
2001
+ fontSize: "14px",
2002
+ display: "flex",
2003
+ alignItems: "center",
2004
+ gap: "5px",
2005
+ transition: "background-color 0.2s"
2006
+ },
2007
+ onMouseOver: e => e.target.style.backgroundColor = "#d32f2f",
2008
+ onMouseOut: e => e.target.style.backgroundColor = "#f44336"
2009
+ }, /*#__PURE__*/external_react_default().createElement("span", {
2010
+ role: "img",
2011
+ "aria-label": "Sil"
2012
+ }, "\uD83D\uDDD1\uFE0F"), "Sil")));
2013
+ };
2014
+ /* harmony default export */ const Timeline_EventTooltip = (EventTooltip);
2015
+ ;// ./src/utils/timelineUtils.js
2016
+ // src/utils/timelineUtils.js
2017
+
2018
+ const generateTimelineData = (startYear, endYear) => {
2019
+ const dayNames = ["Paz", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt"];
2020
+ const monthNames = ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"];
2021
+ const dates = [];
2022
+ const monthHeaders = [];
2023
+ for (let year = startYear; year <= endYear; year++) {
2024
+ for (let month = 1; month <= 12; month++) {
2025
+ const daysInMonth = new Date(year, month, 0).getDate();
2026
+ const startIndex = dates.length;
2027
+ for (let day = 1; day <= daysInMonth; day++) {
2028
+ const date = new Date(year, month - 1, day);
2029
+ const dayName = dayNames[date.getDay()];
2030
+ dates.push({
2031
+ fullDate: date,
2032
+ display: "".concat(day, " ").concat(dayName)
2033
+ });
2034
+ }
2035
+ const endIndex = dates.length - 1;
2036
+ monthHeaders.push({
2037
+ monthName: monthNames[month - 1],
2038
+ year,
2039
+ startIndex,
2040
+ endIndex,
2041
+ totalDays: endIndex - startIndex + 1
2042
+ });
2043
+ }
2044
+ }
2045
+ return {
2046
+ dates,
2047
+ monthHeaders
2048
+ };
2049
+ };
2050
+ ;// ./src/components/Timeline/Timeline.js
2051
+ function Timeline_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2052
+ function Timeline_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? Timeline_ownKeys(Object(t), !0).forEach(function (r) { Timeline_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : Timeline_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2053
+ function Timeline_defineProperty(e, r, t) { return (r = Timeline_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
2054
+ function Timeline_toPropertyKey(t) { var i = Timeline_toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
2055
+ function Timeline_toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
2056
+
2057
+
2058
+
2059
+
2060
+
2061
+
2062
+
2063
+
2064
+
2065
+ const Timeline_Timeline_Timeline = _ref => {
2066
+ let {
2067
+ resources,
2068
+ programDate = null,
2069
+ events = [],
2070
+ resourceSettings = {
2071
+ showIdAsName: false,
2072
+ isGrouped: true,
2073
+ isCollapsible: true
2074
+ },
2075
+ indicatorOn = false,
2076
+ dropInfo,
2077
+ setDropInfo,
2078
+ masterHeaderView = true,
2079
+ resourceHeaderContent = "Akfa Timeline",
2080
+ eventsDragOn = true,
2081
+ eventsExtendOn = true,
2082
+ createNewEventOn = true,
2083
+ onDragInfo,
2084
+ onExtendInfo,
2085
+ onCreateEventInfo,
2086
+ // İsteğe bağlı event tıklama callback'leri
2087
+ onEventClick,
2088
+ onEventRightClick,
2089
+ // Yatay scroll özelliği aç/kapa
2090
+ horizontalScrollOn = false // Varsayılan false
2091
+ } = _ref;
2092
+ // ---------------------------------------------------------
2093
+ // 1) timelineData oluştur (dates, monthHeaders vs.)
2094
+ // ---------------------------------------------------------
2095
+ const timelineData = generateTimelineData(2020, 2030); // 10 yıllık veri
2096
+ const {
2097
+ dates,
2098
+ monthHeaders
2099
+ } = timelineData;
2100
+
2101
+ // ---------------------------------------------------------
2102
+ // 2) local state
2103
+ // ---------------------------------------------------------
2104
+ const [collapsedGroups, setCollapsedGroups] = (0,external_react_.useState)({});
2105
+ const [selectedDate, setSelectedDate] = (0,external_react_.useState)(() => {
2106
+ const date = programDate ? new Date(programDate) : new Date();
2107
+ date.setDate(date.getDate() - 3);
2108
+ return date;
2109
+ });
2110
+ const [localEvents, setLocalEvents] = (0,external_react_.useState)(events);
2111
+ const [selectedEvent, setSelectedEvent] = (0,external_react_.useState)(null);
2112
+ const [tooltipPosition, setTooltipPosition] = (0,external_react_.useState)({
2113
+ top: 0,
2114
+ left: 0
2115
+ });
2116
+
2117
+ // dayRange = ekranda göstermeyi istediğimiz gün/hücre sayısı (ör. 30 gün)
2118
+ const [dayRange, setDayRange] = (0,external_react_.useState)(30);
2119
+ const [isDarkMode, setIsDarkMode] = (0,external_react_.useState)(false);
2120
+
2121
+ // ---------------------------------------------------------
2122
+ // 3) Sabit hücre genişliği (örneğin 56.95 px)
2123
+ // Container genişliği = dayRange * cellWidth
2124
+ // ---------------------------------------------------------
2125
+ const cellWidth = 56.95; // her gün/hücre ~57 piksel
2126
+ const containerWidth = dayRange * cellWidth;
2127
+ // örneğin dayRange=30 => containerWidth=30*56.95=1708.5 px
2128
+
2129
+ // ---------------------------------------------------------
2130
+ // 4) Event Tooltip logic
2131
+ // ---------------------------------------------------------
2132
+ const handleEventClick = (event, e) => {
2133
+ // Harici onEventClick callback'i varsa, önce onu tetikleyelim
2134
+ if (onEventClick) {
2135
+ onEventClick(event, e);
2136
+ }
2137
+ // Ardından tooltip göstermek istiyorsak:
2138
+ const eventElement = e.currentTarget;
2139
+ if (eventElement) {
2140
+ const rect = eventElement.getBoundingClientRect();
2141
+ setTooltipPosition({
2142
+ top: rect.top + window.scrollY,
2143
+ left: rect.left + rect.width / 2 + window.scrollX
2144
+ });
2145
+ setSelectedEvent(event);
2146
+ }
2147
+ };
2148
+ const handleCloseTooltip = () => {
2149
+ setSelectedEvent(null);
2150
+ };
2151
+
2152
+ // ---------------------------------------------------------
2153
+ // 5) Tarih filtreleme => filteredDates
2154
+ // ---------------------------------------------------------
2155
+ const startIndex = dates.findIndex(d => d.fullDate >= selectedDate);
2156
+ const endIndex = startIndex + dayRange;
2157
+ const filteredDates = startIndex !== -1 ? dates.slice(startIndex, Math.min(endIndex, dates.length)) : [];
2158
+ const today = programDate ? new Date(programDate) : new Date();
2159
+ const todayIndex = filteredDates.findIndex(d => new Date(d.fullDate).toDateString() === today.toDateString());
2160
+ const totalDays = filteredDates.length;
2161
+
2162
+ // ---------------------------------------------------------
2163
+ // 6) Grupları aç/kapa
2164
+ // ---------------------------------------------------------
2165
+ const toggleGroupCollapse = groupName => {
2166
+ setCollapsedGroups(prev => Timeline_objectSpread(Timeline_objectSpread({}, prev), {}, {
2167
+ [groupName]: !prev[groupName]
2168
+ }));
2169
+ };
2170
+
2171
+ // ---------------------------------------------------------
2172
+ // 7) Navigation fonksiyonları
2173
+ // ---------------------------------------------------------
2174
+ const handleToday = () => {
2175
+ const date = programDate ? new Date(programDate) : new Date();
2176
+ date.setDate(date.getDate() - 3);
2177
+ setSelectedDate(date);
2178
+ };
2179
+ const handleAdvance = () => setSelectedDate(prev => new Date(prev.getTime() + 5 * 24 * 60 * 60 * 1000));
2180
+ const handleRetreat = () => setSelectedDate(prev => new Date(prev.getTime() - 5 * 24 * 60 * 60 * 1000));
2181
+ const handleMonthRetreat = () => setSelectedDate(prev => {
2182
+ const newDate = new Date(prev);
2183
+ newDate.setMonth(newDate.getMonth() - 1);
2184
+ return newDate;
2185
+ });
2186
+ const handleMonthAdvance = () => setSelectedDate(prev => {
2187
+ const newDate = new Date(prev);
2188
+ newDate.setMonth(newDate.getMonth() + 1);
2189
+ return newDate;
2190
+ });
2191
+
2192
+ // ---------------------------------------------------------
2193
+ // 8) Dark Mode
2194
+ // ---------------------------------------------------------
2195
+ const toggleDarkMode = () => {
2196
+ setIsDarkMode(prevMode => !prevMode);
2197
+ };
2198
+ (0,external_react_.useEffect)(() => {
2199
+ document.body.classList.toggle("dark-mode", isDarkMode);
2200
+ }, [isDarkMode]);
2201
+
2202
+ // ---------------------------------------------------------
2203
+ // 9) Ay başlıklarını filtrele
2204
+ // ---------------------------------------------------------
2205
+ const filteredMonthHeaders = monthHeaders.map(header => {
2206
+ const adjustedStartIndex = Math.max(header.startIndex, startIndex);
2207
+ const adjustedEndIndex = Math.min(header.endIndex, endIndex - 1);
2208
+ return Timeline_objectSpread(Timeline_objectSpread({}, header), {}, {
2209
+ startIndex: adjustedStartIndex,
2210
+ endIndex: adjustedEndIndex
2211
+ });
2212
+ }).filter(header => header.startIndex <= header.endIndex);
2213
+
2214
+ // ---------------------------------------------------------
2215
+ // 10) Return
2216
+ // ---------------------------------------------------------
2217
+ return /*#__PURE__*/external_react_default().createElement("div", {
2218
+ className: "timeline-container ".concat(isDarkMode ? "dark-mode" : "")
2219
+ }, masterHeaderView && /*#__PURE__*/external_react_default().createElement("div", {
2220
+ className: "timeline-master-header"
2221
+ }, /*#__PURE__*/external_react_default().createElement(Timeline_MasterHeader, {
2222
+ onToday: handleToday,
2223
+ onAdvance: handleAdvance,
2224
+ onRetreat: handleRetreat,
2225
+ onMonthAdvance: handleMonthAdvance,
2226
+ onMonthRetreat: handleMonthRetreat,
2227
+ dayRange: dayRange,
2228
+ setDayRange: setDayRange // dayRange'ı burada user değiştirebilir
2229
+ ,
2230
+ isDarkMode: isDarkMode,
2231
+ toggleDarkMode: toggleDarkMode
2232
+ })), /*#__PURE__*/external_react_default().createElement("div", {
2233
+ className: "timeline-body"
2234
+ }, /*#__PURE__*/external_react_default().createElement("div", {
2235
+ className: "timeline-resources-container"
2236
+ }, /*#__PURE__*/external_react_default().createElement(Timeline_ResourcesHeader, {
2237
+ content: resourceHeaderContent
2238
+ }), /*#__PURE__*/external_react_default().createElement(Timeline_Resources, {
2239
+ groupedResources: resources,
2240
+ toggleGroupCollapse: toggleGroupCollapse,
2241
+ collapsedGroups: collapsedGroups,
2242
+ resourceSettings: resourceSettings
2243
+ })), /*#__PURE__*/external_react_default().createElement("div", {
2244
+ className: "timeline-scrollable-container",
2245
+ style: {
2246
+ overflowX: horizontalScrollOn ? "auto" : "hidden"
2247
+ }
2248
+ }, /*#__PURE__*/external_react_default().createElement("div", {
2249
+ className: "timeline-header-content-wrapper",
2250
+ style: {
2251
+ width: horizontalScrollOn ? "".concat(containerWidth, "px") : "100%"
2252
+ }
2253
+ }, /*#__PURE__*/external_react_default().createElement(Timeline_TimelineHeader, {
2254
+ dates: filteredDates,
2255
+ monthHeaders: filteredMonthHeaders
2256
+ }), /*#__PURE__*/external_react_default().createElement(Timeline_TimelineContent
2257
+ // Props
2258
+ , {
2259
+ groupedResources: resources,
2260
+ dates: filteredDates,
2261
+ collapsedGroups: collapsedGroups,
2262
+ events: localEvents,
2263
+ setEvents: setLocalEvents,
2264
+ onEventClick: handleEventClick,
2265
+ todayIndex: todayIndex,
2266
+ totalDays: totalDays,
2267
+ indicatorOn: indicatorOn,
2268
+ resourceSettings: resourceSettings,
2269
+ toggleGroupCollapse: toggleGroupCollapse,
2270
+ setDropInfo: setDropInfo
2271
+
2272
+ // Yeni prop'lar
2273
+ ,
2274
+ eventsDragOn: eventsDragOn,
2275
+ eventsExtendOn: eventsExtendOn,
2276
+ createNewEventOn: createNewEventOn,
2277
+ onDragInfo: onDragInfo,
2278
+ onExtendInfo: onExtendInfo,
2279
+ onCreateEventInfo: onCreateEventInfo,
2280
+ onEventRightClick: onEventRightClick
2281
+ }), selectedEvent && /*#__PURE__*/external_react_default().createElement(Timeline_EventTooltip, {
2282
+ event: selectedEvent,
2283
+ position: tooltipPosition,
2284
+ onClose: handleCloseTooltip,
2285
+ onDelete: eventId => setLocalEvents(prev => prev.filter(e => e.id !== eventId))
2286
+ })))));
2287
+ };
2288
+ /* harmony default export */ const components_Timeline_Timeline = (Timeline_Timeline_Timeline);
2289
+ /******/ return __webpack_exports__;
2290
+ /******/ })()
2291
+ ;
2292
+ });