handle drag n drop
This commit is contained in:
@@ -83,6 +83,7 @@ class _MainAppState extends State<MainApp> {
|
||||
start: start,
|
||||
end: end,
|
||||
lane: item.lane,
|
||||
hasEnd: item.end != null,
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -118,16 +119,21 @@ class _MainAppState extends State<MainApp> {
|
||||
String newGroupId,
|
||||
int newLane,
|
||||
) {
|
||||
final duration = entry.end.difference(entry.start);
|
||||
final newEnd = newStart.add(duration);
|
||||
|
||||
emitEvent('entry_moved', {
|
||||
final payload = <String, Object?>{
|
||||
'entryId': entry.id,
|
||||
'newStart': newStart.toIso8601String(),
|
||||
'newEnd': newEnd.toIso8601String(),
|
||||
'newGroupId': newGroupId,
|
||||
'newLane': newLane,
|
||||
});
|
||||
};
|
||||
|
||||
if (entry.hasEnd) {
|
||||
final duration = entry.end.difference(entry.start);
|
||||
payload['newEnd'] = newStart.add(duration).toIso8601String();
|
||||
} else {
|
||||
payload['newEnd'] = null;
|
||||
}
|
||||
|
||||
emitEvent('entry_moved', payload);
|
||||
}
|
||||
|
||||
void _emitContentHeight() {
|
||||
|
||||
@@ -8,6 +8,7 @@ class TimelineEntry {
|
||||
required this.start,
|
||||
required this.end,
|
||||
required this.lane,
|
||||
this.hasEnd = true,
|
||||
}) : assert(!end.isBefore(start), 'Entry end must be on/after start');
|
||||
|
||||
final String id;
|
||||
@@ -15,6 +16,7 @@ class TimelineEntry {
|
||||
final DateTime start;
|
||||
final DateTime end;
|
||||
final int lane; // provided by consumer for stacking
|
||||
final bool hasEnd; // false for point-events (end is synthetic)
|
||||
|
||||
bool overlaps(DateTime a, DateTime b) {
|
||||
return !(end.isBefore(a) || start.isAfter(b));
|
||||
@@ -26,6 +28,7 @@ class TimelineEntry {
|
||||
DateTime? start,
|
||||
DateTime? end,
|
||||
int? lane,
|
||||
bool? hasEnd,
|
||||
}) {
|
||||
return TimelineEntry(
|
||||
id: id ?? this.id,
|
||||
@@ -33,11 +36,12 @@ class TimelineEntry {
|
||||
start: start ?? this.start,
|
||||
end: end ?? this.end,
|
||||
lane: lane ?? this.lane,
|
||||
hasEnd: hasEnd ?? this.hasEnd,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(id, groupId, start, end, lane);
|
||||
int get hashCode => Object.hash(id, groupId, start, end, lane, hasEnd);
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
@@ -46,10 +50,11 @@ class TimelineEntry {
|
||||
other.groupId == groupId &&
|
||||
other.start == start &&
|
||||
other.end == end &&
|
||||
other.lane == lane;
|
||||
other.lane == lane &&
|
||||
other.hasEnd == hasEnd;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
'TimelineEntry(id: $id, groupId: $groupId, start: $start, end: $end, lane: $lane)';
|
||||
'TimelineEntry(id: $id, groupId: $groupId, start: $start, end: $end, lane: $lane, hasEnd: $hasEnd)';
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
{ id: "e-1", title: "Brand identity", start: "2026-01-02", end: "2026-01-08", lane: 1 },
|
||||
{ id: "e-2", title: "UI mockups", start: "2026-01-06", end: "2026-01-14", lane: 2 },
|
||||
{ id: "e-3", title: "Design review", start: "2026-01-20", end: "2026-01-22", lane: 1 },
|
||||
{ id: "e-10", title: "Kickoff meeting", start: "2026-01-01", end: null, lane: 3 },
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -74,6 +75,7 @@
|
||||
{ id: "e-7", title: "QA testing", start: "2026-01-19", end: "2026-01-26", lane: 1 },
|
||||
{ id: "e-8", title: "Beta release", start: "2026-01-24", end: "2026-01-28", lane: 2 },
|
||||
{ id: "e-9", title: "Marketing prep", start: "2026-01-08", end: "2026-01-15", lane: 1 },
|
||||
{ id: "e-11", title: "Go-live", start: "2026-01-28", end: null, lane: 3 },
|
||||
],
|
||||
},
|
||||
],
|
||||
@@ -115,7 +117,7 @@
|
||||
entry.start = new Date(p.newStart).toISOString().split("T")[0];
|
||||
entry.end = p.newEnd
|
||||
? new Date(p.newEnd).toISOString().split("T")[0]
|
||||
: new Date(new Date(p.newStart).getTime() + (new Date(entry.end) - new Date(entry.start))).toISOString().split("T")[0];
|
||||
: null;
|
||||
|
||||
// Preserve the lane from the drop target
|
||||
entry.lane = p.newLane;
|
||||
|
||||
Reference in New Issue
Block a user