TrendData.fromRaw constructor

TrendData.fromRaw(
  1. dynamic raw
)

Parse from row data (array of numbers or [labels, values] format)

Implementation

factory TrendData.fromRaw(dynamic raw) {
  if (raw == null) {
    return const TrendData(labels: [], values: []);
  }

  // Handle [[labels], [values]] format from backend
  if (raw is List && raw.length == 2) {
    final rawLabels = raw[0];
    final rawValues = raw[1];

    if (rawLabels is List && rawValues is List) {
      final labels = rawLabels.map((e) => e.toString()).toList();
      final values = rawValues.map((v) {
        if (v is num) return v.toDouble();
        if (v is String) return double.tryParse(v) ?? 0.0;
        return 0.0;
      }).toList();

      return TrendData(labels: labels, values: values);
    }
  }

  // Handle simple array of numbers (backward compatible)
  if (raw is List) {
    final values = raw.map((v) {
      if (v is num) return v.toDouble();
      if (v is String) return double.tryParse(v) ?? 0.0;
      return 0.0;
    }).toList();

    // Auto-generate labels: "1", "2", "3", etc.
    final labels = List.generate(values.length, (i) => '${i + 1}');

    return TrendData(labels: labels, values: values);
  }

  return const TrendData(labels: [], values: []);
}