normalize data
This commit is contained in:
@@ -42,44 +42,26 @@
|
||||
if (window.__zendegi__) return;
|
||||
|
||||
var state = {
|
||||
timeline: {
|
||||
id: "tl-1",
|
||||
title: "My Project",
|
||||
groups: [
|
||||
{
|
||||
id: "g-1",
|
||||
title: "Design",
|
||||
sortOrder: 0,
|
||||
items: [
|
||||
{ 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 },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "g-2",
|
||||
title: "Engineering",
|
||||
sortOrder: 1,
|
||||
items: [
|
||||
{ id: "e-4", title: "API scaffolding", start: "2026-01-05", end: "2026-01-12", lane: 1 },
|
||||
{ id: "e-5", title: "Auth flow", start: "2026-01-10", end: "2026-01-18", lane: 2 },
|
||||
{ id: "e-6", title: "Dashboard UI", start: "2026-01-15", end: "2026-01-25", lane: 3 },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "g-3",
|
||||
title: "Launch",
|
||||
sortOrder: 2,
|
||||
items: [
|
||||
{ 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 },
|
||||
],
|
||||
},
|
||||
],
|
||||
timeline: { id: "tl-1", title: "My Project" },
|
||||
groups: {
|
||||
"g-1": { id: "g-1", title: "Design", sortOrder: 0 },
|
||||
"g-2": { id: "g-2", title: "Engineering", sortOrder: 1 },
|
||||
"g-3": { id: "g-3", title: "Launch", sortOrder: 2 },
|
||||
},
|
||||
items: {
|
||||
"e-1": { id: "e-1", groupId: "g-1", title: "Brand identity", start: "2026-01-02", end: "2026-01-08", lane: 1 },
|
||||
"e-2": { id: "e-2", groupId: "g-1", title: "UI mockups", start: "2026-01-06", end: "2026-01-14", lane: 2 },
|
||||
"e-3": { id: "e-3", groupId: "g-1", title: "Design review", start: "2026-01-20", end: "2026-01-22", lane: 1 },
|
||||
"e-10": { id: "e-10", groupId: "g-1", title: "Kickoff meeting", start: "2026-01-01", end: null, lane: 3 },
|
||||
"e-4": { id: "e-4", groupId: "g-2", title: "API scaffolding", start: "2026-01-05", end: "2026-01-12", lane: 1 },
|
||||
"e-5": { id: "e-5", groupId: "g-2", title: "Auth flow", start: "2026-01-10", end: "2026-01-18", lane: 2 },
|
||||
"e-6": { id: "e-6", groupId: "g-2", title: "Dashboard UI", start: "2026-01-15", end: "2026-01-25", lane: 3 },
|
||||
"e-7": { id: "e-7", groupId: "g-3", title: "QA testing", start: "2026-01-19", end: "2026-01-26", lane: 1 },
|
||||
"e-8": { id: "e-8", groupId: "g-3", title: "Beta release", start: "2026-01-24", end: "2026-01-28", lane: 2 },
|
||||
"e-9": { id: "e-9", groupId: "g-3", title: "Marketing prep", start: "2026-01-08", end: "2026-01-15", lane: 1 },
|
||||
"e-11": { id: "e-11", groupId: "g-3", title: "Go-live", start: "2026-01-28", end: null, lane: 3 },
|
||||
},
|
||||
groupOrder: ["g-1", "g-2", "g-3"],
|
||||
selectedItemId: null,
|
||||
};
|
||||
|
||||
@@ -96,39 +78,17 @@
|
||||
|
||||
if (event.type === "entry_moved") {
|
||||
var p = event.payload;
|
||||
var entry = null;
|
||||
var sourceGroup = null;
|
||||
|
||||
// Find and remove the entry from its current group
|
||||
for (var i = 0; i < state.timeline.groups.length; i++) {
|
||||
var g = state.timeline.groups[i];
|
||||
for (var j = 0; j < g.items.length; j++) {
|
||||
if (g.items[j].id === p.entryId) {
|
||||
entry = g.items.splice(j, 1)[0];
|
||||
sourceGroup = g;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (entry) break;
|
||||
}
|
||||
|
||||
if (entry) {
|
||||
// Update start/end from payload (ISO 8601 → date-only)
|
||||
entry.start = new Date(p.newStart).toISOString().split("T")[0];
|
||||
entry.end = p.newEnd
|
||||
var item = state.items[p.entryId];
|
||||
if (item) {
|
||||
// Update in place — normalized makes this trivial
|
||||
item.start = p.newStart
|
||||
? new Date(p.newStart).toISOString().split("T")[0]
|
||||
: item.start;
|
||||
item.end = p.newEnd
|
||||
? new Date(p.newEnd).toISOString().split("T")[0]
|
||||
: null;
|
||||
|
||||
// Preserve the lane from the drop target
|
||||
entry.lane = p.newLane;
|
||||
|
||||
// Add to target group
|
||||
var targetGroup = state.timeline.groups.find(
|
||||
function (g) { return g.id === p.newGroupId; }
|
||||
);
|
||||
if (targetGroup) {
|
||||
targetGroup.items.push(entry);
|
||||
}
|
||||
item.groupId = p.newGroupId;
|
||||
item.lane = p.newLane;
|
||||
|
||||
// Push updated state back to Flutter
|
||||
if (_updateState) {
|
||||
|
||||
Reference in New Issue
Block a user