normalize data
This commit is contained in:
@@ -45,8 +45,8 @@ class _MainAppState extends State<MainApp> {
|
||||
}
|
||||
|
||||
void _applyState(TimelineState state) {
|
||||
final groups = _convertGroups(state.timeline.groups);
|
||||
final entries = _convertEntries(state.timeline.groups);
|
||||
final groups = _convertGroups(state);
|
||||
final entries = _convertEntries(state);
|
||||
final domain = _computeDomain(entries);
|
||||
|
||||
setState(() {
|
||||
@@ -63,32 +63,35 @@ class _MainAppState extends State<MainApp> {
|
||||
_emitContentHeight();
|
||||
}
|
||||
|
||||
List<TimelineGroup> _convertGroups(List<TimelineGroupData> groups) {
|
||||
return [for (final g in groups) TimelineGroup(id: g.id, title: g.title)];
|
||||
/// Build an ordered list of [TimelineGroup] using [groupOrder].
|
||||
List<TimelineGroup> _convertGroups(TimelineState state) {
|
||||
return [
|
||||
for (final id in state.groupOrder)
|
||||
if (state.groups[id] case final g?)
|
||||
TimelineGroup(id: g.id, title: g.title),
|
||||
];
|
||||
}
|
||||
|
||||
List<TimelineEntry> _convertEntries(List<TimelineGroupData> groups) {
|
||||
final entries = <TimelineEntry>[];
|
||||
for (final group in groups) {
|
||||
for (final item in group.items) {
|
||||
final start = DateTime.parse(item.start);
|
||||
final end = item.end != null
|
||||
? DateTime.parse(item.end!)
|
||||
: start.add(const Duration(days: 1));
|
||||
/// Build a flat list of [TimelineEntry] from the normalized items map.
|
||||
List<TimelineEntry> _convertEntries(TimelineState state) {
|
||||
return [
|
||||
for (final item in state.items.values)
|
||||
() {
|
||||
final start = DateTime.parse(item.start);
|
||||
final end = item.end != null
|
||||
? DateTime.parse(item.end!)
|
||||
: start.add(const Duration(days: 1));
|
||||
|
||||
entries.add(
|
||||
TimelineEntry(
|
||||
return TimelineEntry(
|
||||
id: item.id,
|
||||
groupId: group.id,
|
||||
groupId: item.groupId,
|
||||
start: start,
|
||||
end: end,
|
||||
lane: item.lane,
|
||||
hasEnd: item.end != null,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
return entries;
|
||||
);
|
||||
}(),
|
||||
];
|
||||
}
|
||||
|
||||
({DateTime start, DateTime end}) _computeDomain(List<TimelineEntry> entries) {
|
||||
@@ -156,16 +159,9 @@ class _MainAppState extends State<MainApp> {
|
||||
emitEvent('content_height', {'height': totalHeight});
|
||||
}
|
||||
|
||||
/// O(1) label lookup from the normalized items map.
|
||||
String _labelForEntry(TimelineEntry entry) {
|
||||
final state = _state;
|
||||
if (state == null) return entry.id;
|
||||
|
||||
for (final group in state.timeline.groups) {
|
||||
for (final item in group.items) {
|
||||
if (item.id == entry.id) return item.title;
|
||||
}
|
||||
}
|
||||
return entry.id;
|
||||
return _state?.items[entry.id]?.title ?? entry.id;
|
||||
}
|
||||
|
||||
static const _groupColors = [
|
||||
|
||||
Reference in New Issue
Block a user