power_clamp_chart_functionality

This commit is contained in:
mohammad
2024-10-23 16:38:40 +03:00
parent 91ba2bad78
commit 600ed7992d
9 changed files with 1095 additions and 485 deletions

View File

@ -171,6 +171,9 @@ class GarageDoorBloc extends Bloc<GarageDoorEvent, GarageDoorSensorState> {
code: 'switch_1', code: 'switch_1',
); );
recordGroups = response; recordGroups = response;
emit(UpdateState(garageSensor: deviceStatus)); emit(UpdateState(garageSensor: deviceStatus));
} on DioException catch (e) { } on DioException catch (e) {
final errorData = e.response!.data; final errorData = e.response!.data;

View File

@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
@ -18,12 +17,11 @@ class PowerClampBloc extends Bloc<PowerClampEvent, PowerClampState> {
}) : super(const PowerClampState()) { }) : super(const PowerClampState()) {
on<PowerClampInitial>(_fetchPowerClampInfo); on<PowerClampInitial>(_fetchPowerClampInfo);
// on<ReportLogsInitial>(fetchLogsForLastMonth); // on<ReportLogsInitial>(fetchLogsForLastMonth);
on<FetchEnergyData>(_mapReportToEnergyData); // on<FetchEnergyData>(_mapReportToEnergyData);
on<SelectDateEvent>(selectTimeOfLinePassword); on<SelectDateEvent>(checkDayMonthYearSelected);
on<FilterRecordsByDateEvent>(_filterRecordsByDate);
} }
//SelectDateEvent
DateTime? dateTime = DateTime.now(); DateTime? dateTime = DateTime.now();
String formattedDate = DateFormat('yyyy/MM/dd').format(DateTime.now()); String formattedDate = DateFormat('yyyy/MM/dd').format(DateTime.now());
bool lowBattery = false; bool lowBattery = false;
bool closingReminder = false; bool closingReminder = false;
@ -59,26 +57,6 @@ class PowerClampBloc extends Bloc<PowerClampEvent, PowerClampState> {
), ),
), ),
); );
// void _fetchStatus(
// PowerClampInitial event, Emitter<PowerClampState> emit) async {
// emit(PowerClampLoadingState());
// try {
// var response = await DevicesAPI.getDeviceStatus(PCId);
// List<StatusModel> statusModelList = [];
// for (var status in response['status']) {
// statusModelList.add(StatusModel.fromJson(status));
// }
// deviceStatus = PowerClampModel.fromJson(
// statusModelList,
// );
// emit(UpdateState(powerClampModel: deviceStatus));
// Future.delayed(const Duration(milliseconds: 500));
// // _listenToChanges();
// } catch (e) {
// emit(PowerClampFailedState(errorMessage: e.toString()));
// return;
// }
// }
void _fetchPowerClampInfo( void _fetchPowerClampInfo(
PowerClampInitial event, Emitter<PowerClampState> emit) async { PowerClampInitial event, Emitter<PowerClampState> emit) async {
@ -93,42 +71,564 @@ class PowerClampBloc extends Bloc<PowerClampEvent, PowerClampState> {
} }
} }
//List<StatusModel> statusModelList = [];
// for (var status in response['status']) {
// statusModelList.add(StatusModel.fromJson(status));
// }
// deviceStatus = PowerClampModel.fromJson(
// statusModelList,
// );
DeviceReport recordGroups = DeviceReport recordGroups =
DeviceReport(startTime: '0', endTime: '0', data: []); DeviceReport(startTime: '0', endTime: '0', data: []);
Future<void> fetchLogsForLastMonth( EventDevice recordGroupsDateTime =
ReportLogsInitial event, Emitter<PowerClampState> emit) async { EventDevice(code: '', eventTime: DateTime.now(), value: '');
DateTime now = DateTime.now();
DateTime lastMonth = DateTime(now.year, now.month - 1, now.day); List<EventDevice> record = [
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:43'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:35'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:29'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:25'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:21'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:17'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:15:07'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:14:47'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:14:40'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:14:23'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2024-10-23 11:14:13'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:43'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:35'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:29'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:25'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:21'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:17'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:15:07'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:14:47'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:14:40'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:14:23'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-10-23 11:14:13'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:43'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:35'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:29'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:25'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:21'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:17'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:15:07'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:14:47'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:14:40'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:14:23'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-23 11:14:13'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-11 11:15:43'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-11 11:15:35'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-12 11:15:29'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-13 11:15:25'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-14 11:15:21'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-15 11:15:17'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-16 11:15:07'),
value: '2286'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-17 11:14:47'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-18 11:14:40'),
value: '2284'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-19 11:14:23'),
value: '2285'),
EventDevice(
code: 'VoltageA',
eventTime: DateTime.parse('2023-02-20 11:14:13'),
value: '2284'),
];
List<EventDevice> filteredRecords = [];
int startTime = lastMonth.millisecondsSinceEpoch; int currentIndex = 0;
int endTime = now.millisecondsSinceEpoch; final List<String> views = ['Day', 'Month', 'Year'];
try {
emit(PowerClampLoadingState()); Widget dateSwitcher() {
var response = await DevicesAPI.getReportLogs( void switchView(int direction) {
startTime: startTime.toString(), currentIndex = (currentIndex + direction + views.length) % views.length;
endTime: endTime.toString(), }
deviceUuid: PCId,
code: event.code!, return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: const Icon(Icons.arrow_left),
onPressed: () {
setState(() {
switchView(-1);
});
},
),
Text(
views[currentIndex],
style: const TextStyle(fontSize: 15, fontWeight: FontWeight.w500),
),
IconButton(
icon: const Icon(Icons.arrow_right),
onPressed: () {
setState(() {
switchView(1);
});
},
),
],
); );
recordGroups = response; },
emit(UpdateState(powerClampModel: deviceStatus)); );
add(FetchEnergyData()); // Trigger mapping to EnergyData }
} on DioException catch (e) {
final errorData = e.response!.data; void checkDayMonthYearSelected(
String errorMessage = errorData['message']; SelectDateEvent event, Emitter<PowerClampState> emit) async {
emit(PowerClampLoadingState());
if (currentIndex == 0) {
await dayMonthYearPicker(context: event.context).then(
(newDate) {
if (newDate != null) {
dateTime = newDate;
formattedDate = DateFormat('yyyy/MM/dd').format(dateTime!);
add(FilterRecordsByDateEvent(
selectedDate: dateTime!,
viewType: views[currentIndex],
));
}
},
);
} else if (currentIndex == 1) {
await selectMonthAndYear(event.context).then(
(newDate) {
if (newDate != null) {
dateTime = newDate;
formattedDate = DateFormat('yyyy-MM').format(dateTime!);
add(FilterRecordsByDateEvent(
selectedDate: dateTime!,
viewType: views[currentIndex],
));
}
},
);
} else if (currentIndex == 2) {
await selectYear(event.context).then(
(newDate) {
if (newDate != null) {
dateTime = newDate;
formattedDate = DateFormat('yyyy').format(dateTime!);
add(FilterRecordsByDateEvent(
selectedDate: dateTime!,
viewType: views[currentIndex],
));
}
},
);
}
emit(DateSelectedState());
}
Future<DateTime?> selectMonthAndYear(BuildContext context) async {
int selectedYear = DateTime.now().year;
int selectedMonth = DateTime.now().month;
FixedExtentScrollController yearController =
FixedExtentScrollController(initialItem: selectedYear - 1905);
FixedExtentScrollController monthController =
FixedExtentScrollController(initialItem: selectedMonth - 1);
return await showModalBottomSheet<DateTime>(
context: context,
builder: (BuildContext context) {
return SizedBox(
height: 300,
child: Column(
children: [
const Padding(
padding: EdgeInsets.all(16.0),
child: Text(
'Select Month and Year',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
),
const Divider(),
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Spacer(),
Expanded(
child: ListWheelScrollView.useDelegate(
controller: yearController,
overAndUnderCenterOpacity: 0.2,
itemExtent: 50,
onSelectedItemChanged: (index) {
selectedYear = 1905 + index;
},
childDelegate: ListWheelChildBuilderDelegate(
builder: (context, index) {
return Center(
child: Text(
(1905 + index).toString(),
style: const TextStyle(fontSize: 18),
),
);
},
childCount: 200,
),
),
),
Expanded(
flex: 2,
child: ListWheelScrollView.useDelegate(
controller: monthController,
overAndUnderCenterOpacity: 0.2,
itemExtent: 50,
onSelectedItemChanged: (index) {
selectedMonth = index + 1;
},
childDelegate: ListWheelChildBuilderDelegate(
builder: (context, index) {
return Center(
child: Text(
DateFormat.MMMM()
.format(DateTime(0, index + 1)),
style: const TextStyle(fontSize: 18),
),
);
},
childCount: 12,
),
),
),
const Spacer(),
],
),
),
const Divider(),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextButton(
child: const Text('Cancel'),
onPressed: () {
Navigator.of(context).pop();
},
),
TextButton(
child: const Text('OK'),
onPressed: () {
final selectedDateTime =
DateTime(selectedYear, selectedMonth);
Navigator.of(context).pop(selectedDateTime);
},
),
],
),
),
],
),
);
},
);
}
Future<DateTime?> selectYear(BuildContext context) async {
int selectedYear = DateTime.now().year;
FixedExtentScrollController yearController =
FixedExtentScrollController(initialItem: selectedYear - 1905);
return await showModalBottomSheet<DateTime>(
context: context,
builder: (BuildContext context) {
return SizedBox(
height: 300,
child: Column(
children: [
const Padding(
padding: EdgeInsets.all(16.0),
child: Text(
'Select Year',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
),
const Divider(),
Expanded(
child: ListWheelScrollView.useDelegate(
controller: yearController,
overAndUnderCenterOpacity: 0.2,
itemExtent: 50,
onSelectedItemChanged: (index) {
selectedYear = 1905 + index;
},
childDelegate: ListWheelChildBuilderDelegate(
builder: (context, index) {
return Center(
child: Text(
(1905 + index).toString(),
style: const TextStyle(fontSize: 18),
),
);
},
childCount: 200,
),
),
),
const Divider(),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextButton(
child: const Text('Cancel'),
onPressed: () {
Navigator.of(context)
.pop(); // Pops without value, returning null
},
),
TextButton(
child: const Text('OK'),
onPressed: () {
final selectedDateTime = DateTime(selectedYear);
Navigator.of(context).pop(
selectedDateTime); // Pops with the selected date
},
),
],
),
),
],
),
);
},
);
}
Future<DateTime?> dayMonthYearPicker({
required BuildContext context,
}) async {
DateTime selectedDate = DateTime.now(); // Default selected date
return await showModalBottomSheet<DateTime>(
context: context,
builder: (BuildContext context) {
return SizedBox(
height: 350, // Increased height to accommodate the buttons
child: Column(
children: [
Expanded(
child: CupertinoDatePicker(
mode: CupertinoDatePickerMode.date,
initialDateTime: DateTime.now(),
minimumYear: 1900,
maximumYear: DateTime.now().year,
onDateTimeChanged: (DateTime newDateTime) {
selectedDate =
newDateTime; // Update the selected date when changed
},
),
),
const Divider(),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextButton(
child: const Text('Cancel'),
onPressed: () {
Navigator.of(context)
.pop(); // Dismiss the modal without returning a value
},
),
TextButton(
child: const Text('OK'),
onPressed: () {
Navigator.of(context)
.pop(selectedDate); // Return the selected date
},
),
],
),
),
],
),
);
},
);
}
List<EnergyData> energyDataList = [];
void _filterRecordsByDate(
FilterRecordsByDateEvent event, Emitter<PowerClampState> emit) {
emit(PowerClampLoadingState());
if (event.viewType == 'Year') {
filteredRecords = record
.where((record) => record.eventTime!.year == event.selectedDate.year)
.toList();
} else if (event.viewType == 'Month') {
filteredRecords = record
.where((record) =>
record.eventTime!.year == event.selectedDate.year &&
record.eventTime!.month == event.selectedDate.month)
.toList();
} else if (event.viewType == 'Day') {
filteredRecords = record
.where((record) =>
record.eventTime!.year == event.selectedDate.year &&
record.eventTime!.month == event.selectedDate.month &&
record.eventTime!.day == event.selectedDate.day)
.toList();
}
String getMonthShortName(int month) {
final date = DateTime(0, month);
return DateFormat.MMM().format(date);
}
energyDataList = filteredRecords.map((eventDevice) {
return EnergyData(
event.viewType == 'Year'
? getMonthShortName(
int.tryParse(DateFormat('MM').format(eventDevice.eventTime!))!)
: event.viewType == 'Month'
? DateFormat('yyyy/MM/dd').format(eventDevice.eventTime!)
: DateFormat('HH:mm:ss').format(eventDevice.eventTime!),
double.parse(eventDevice.value!),
);
}).toList();
Future.delayed(const Duration(milliseconds: 500));
emit(FilterRecordsState(filteredRecords: energyDataList));
} }
} }
// Event for filtering records by date
// _listenToChanges() { // _listenToChanges() {
// try { // try {
// DatabaseReference ref = // DatabaseReference ref =
@ -158,102 +658,135 @@ class PowerClampBloc extends Bloc<PowerClampEvent, PowerClampState> {
// } // }
// New Function: Convert the device report data into EnergyData and emit it. // New Function: Convert the device report data into EnergyData and emit it.
void _mapReportToEnergyData( // void _mapReportToEnergyData(
FetchEnergyData event, Emitter<PowerClampState> emit) { // FetchEnergyData event, Emitter<PowerClampState> emit) {
try { // try {
List<EnergyData> energyDataList = recordGroups.data // List<EnergyData> energyDataList = recordGroups.data
?.map((event) { // ?.map((event) {
if (event.code == "VoltageA" && event.eventTime != null) { // if (event.code == "VoltageA" && event.eventTime != null) {
// Convert eventTime to readable format // // Convert eventTime to readable format
DateTime eventDateTime = // DateTime eventDateTime =
DateTime.fromMillisecondsSinceEpoch(event.eventTime!); // DateTime.fromMillisecondsSinceEpoch(event.eventTime!);
String formattedTime = // String formattedTime =
"${eventDateTime.hour}:${eventDateTime.minute.toString().padLeft(2, '0')} ${eventDateTime.hour >= 12 ? 'PM' : 'AM'}"; // "${eventDateTime.hour}:${eventDateTime.minute.toString().padLeft(2, '0')} ${eventDateTime.hour >= 12 ? 'PM' : 'AM'}";
double value = double.tryParse(event.value ?? "0") ?? 0; // double value = double.tryParse(event.value ?? "0") ?? 0;
return EnergyData( // return EnergyData(
formattedTime, value / 1000); // Assume kWh format // formattedTime, value / 1000); // Assume kWh format
} // }
return null; // return null;
}) // })
.where((data) => data != null) // .where((data) => data != null)
.cast<EnergyData>() // .cast<EnergyData>()
.toList() ?? // .toList() ??
[]; // [];
emit(EnergyDataState(energyData: energyDataList)); // emit(EnergyDataState(energyData: energyDataList));
} catch (e) { // } catch (e) {
emit(PowerClampFailedState(errorMessage: e.toString())); // emit(PowerClampFailedState(errorMessage: e.toString()));
} // }
} // }
Future<void> selectTimeOfLinePassword( // Future<void> selectTimeOfLinePassword(
SelectDateEvent event, Emitter<PowerClampState> emit) async { // SelectDateEvent event, Emitter<PowerClampState> emit) async {
emit(ChangeTimeState()); // emit(ChangeTimeState());
final DateTime? picked = await showDatePicker( // final DateTime? picked = await showDatePicker(
context: event.context, // initialDatePickerMode: DatePickerMode.year,
initialDate: DateTime.now(), // context: event.context,
firstDate: DateTime(1905), // initialDate: DateTime.now(),
lastDate: DateTime(2101), // firstDate: DateTime(1905),
); // lastDate: DateTime(2101),
if (picked != null) { // );
final selectedDateTime = DateTime( // if (picked != null) {
picked.year, // final selectedDateTime = DateTime(
picked.month, // picked.year,
picked.day, // picked.month,
0, // picked.day,
0, // 0,
); // 0,
final selectedTimestamp = DateTime( // );
selectedDateTime.year, // final selectedTimestamp = DateTime(
selectedDateTime.month, // selectedDateTime.year,
selectedDateTime.day, // selectedDateTime.month,
selectedDateTime.hour, // selectedDateTime.day,
selectedDateTime.minute, // selectedDateTime.hour,
).millisecondsSinceEpoch ~/ // selectedDateTime.minute,
1000; // ).millisecondsSinceEpoch ~/
// 1000;
DateTime dateTime = selectedDateTime; // DateTime dateTime = selectedDateTime;
formattedDate = DateFormat('yyyy/MM/dd').format(dateTime); // formattedDate = DateFormat('yyyy/MM/dd').format(dateTime);
emit(DateSelectedState()); // emit(DateSelectedState());
} // }
} // }
int currentIndex = 0; // void _fetchStatus(
final List<String> views = ['Day', 'Month', 'Year']; // PowerClampInitial event, Emitter<PowerClampState> emit) async {
// emit(PowerClampLoadingState());
// try {
// var response = await DevicesAPI.getDeviceStatus(PCId);
// List<StatusModel> statusModelList = [];
// for (var status in response['status']) {
// statusModelList.add(StatusModel.fromJson(status));
// }
// deviceStatus = PowerClampModel.fromJson(
// statusModelList,
// );
// emit(UpdateState(powerClampModel: deviceStatus));
// Future.delayed(const Duration(milliseconds: 500));
// // _listenToChanges();
// } catch (e) {
// emit(PowerClampFailedState(errorMessage: e.toString()));
// return;
// }
// }
Widget dateSwitcher() {
void switchView(int direction) {
currentIndex = (currentIndex + direction + views.length) % views.length;
}
return StatefulBuilder( // Future<void> fetchLogsForLastMonth(
builder: (BuildContext context, StateSetter setState) { // ReportLogsInitial event, Emitter<PowerClampState> emit) async {
return Row( // DateTime now = DateTime.now();
mainAxisSize: MainAxisSize.min, // DateTime lastMonth = DateTime(now.year, now.month - 1, now.day);
children: [
IconButton( // int startTime = lastMonth.millisecondsSinceEpoch;
icon: Icon(Icons.arrow_left), // int endTime = now.millisecondsSinceEpoch;
onPressed: () {
setState(() { // try {
switchView(-1); // emit(PowerClampLoadingState());
}); // var response = await DevicesAPI.getReportLogs(
}, // startTime: startTime.toString(),
), // endTime: endTime.toString(),
Text( // deviceUuid: PCId,
views[currentIndex], // code: event.code!,
style: const TextStyle(fontSize: 15, fontWeight: FontWeight.w500), // );
), // recordGroups = response;
IconButton( // record = recordGroups.data!.map((event) {
icon: const Icon(Icons.arrow_right), // return EventDevice(
onPressed: () { // code: event.code,
setState(() { // eventTime: event.eventTime != null
switchView(1); // ? DateTime.fromMillisecondsSinceEpoch(event.eventTime!)
}); // : null,
}, // value: event.value,
), // );
], // }).toList();
); // for (var event in record) {
}, // print(
); // 'Code: ${event.code}, Event Time: ${DateFormat('yyyy-MM-dd hh:mm:ss a').format(event.eventTime!)}, Value: ${event.value}');
} // }
} // emit(UpdateState(powerClampModel: deviceStatus));
// } on DioException catch (e) {
// final errorData = e.response!.data;
// String errorMessage = errorData['message'];
// }
// }
// int transformTimestamp(int originalTime) {
// DateTime originalDateTime =
// DateTime.fromMillisecondsSinceEpoch(originalTime);
// DateTime transformedDateTime = originalDateTime.add(Duration(hours: 1));
// return transformedDateTime.millisecondsSinceEpoch;
// }
// void addDataToRecord(List<Map<String, dynamic>> rawData) {
// for (var dataPoint in rawData) {
// EventDevice event = EventDevice.fromJson(dataPoint);
// record.add(event);
// }
// }

View File

@ -107,3 +107,13 @@ class TickTimer extends PowerClampEvent {
class StopTimer extends PowerClampEvent {} class StopTimer extends PowerClampEvent {}
class OnClose extends PowerClampEvent {} class OnClose extends PowerClampEvent {}
class FilterRecordsByDateEvent extends PowerClampEvent {
final DateTime selectedDate;
final String viewType; // 'Day', 'Month', 'Year'
FilterRecordsByDateEvent(
{required this.selectedDate, required this.viewType});
}

View File

@ -1,4 +1,5 @@
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:syncrow_app/features/devices/model/device_report_model.dart';
import 'package:syncrow_app/features/devices/model/power_clamp_model.dart'; import 'package:syncrow_app/features/devices/model/power_clamp_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_chart.dart'; import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_chart.dart';
@ -12,7 +13,9 @@ class PowerClampState extends Equatable {
class PowerClampInitialState extends PowerClampState {} class PowerClampInitialState extends PowerClampState {}
class PowerClampLoadingState extends PowerClampState {} class PowerClampLoadingState extends PowerClampState {}
class ChangeTimeState extends PowerClampState {} class ChangeTimeState extends PowerClampState {}
class DateSelectedState extends PowerClampState {} class DateSelectedState extends PowerClampState {}
//DateSelectedState //DateSelectedState
@ -46,3 +49,10 @@ class EnergyDataState extends PowerClampState {
const EnergyDataState({required this.energyData}); const EnergyDataState({required this.energyData});
} }
// State for filtered records
class FilterRecordsState extends PowerClampState {
final List<EnergyData> filteredRecords;
FilterRecordsState({required this.filteredRecords});
}

View File

@ -27,6 +27,33 @@ class DeviceReport {
}; };
} }
class EventDevice {
final String? code;
final DateTime? eventTime;
final String? value;
EventDevice({
this.code,
this.eventTime,
this.value,
});
EventDevice.fromJson(Map<String, dynamic> json)
: code = json['code'] as String?,
eventTime = json['eventTime'] ,
value = json['value'] as String?;
Map<String, dynamic> toJson() => {
'code': code,
'eventTime': eventTime,
'value': value,
};
}
class DeviceEvent { class DeviceEvent {
final String? code; final String? code;
final int? eventTime; final int? eventTime;

View File

@ -18,6 +18,7 @@ class PowerClampCard extends StatelessWidget {
final String? totalVoltage; final String? totalVoltage;
final String? totalActive; final String? totalActive;
final String? totalFrequency; final String? totalFrequency;
final String? dateTimeSelected;
final String? totalFactor; final String? totalFactor;
final Widget? dateSwitcher; final Widget? dateSwitcher;
final String? formattedDate; final String? formattedDate;
@ -32,6 +33,7 @@ class PowerClampCard extends StatelessWidget {
this.title, this.title,
this.totalCurrent, this.totalCurrent,
this.totalActiveGeneral, this.totalActiveGeneral,
this.dateTimeSelected,
this.totalCurrentGeneral, this.totalCurrentGeneral,
this.totalFrequencyGeneral, this.totalFrequencyGeneral,
this.totalVoltage, this.totalVoltage,
@ -80,7 +82,7 @@ class PowerClampCard extends StatelessWidget {
], ],
), ),
const SizedBox( const SizedBox(
height: 20, height: 10,
), ),
isGeneral == true isGeneral == true
? Row( ? Row(
@ -144,28 +146,25 @@ class PowerClampCard extends StatelessWidget {
) )
], ],
), ),
const SizedBox( Row(
height: 10,
),
const Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
BodyMedium( const BodyMedium(
text: 'Total consumption', text: 'Total consumption',
fontSize: 12, fontSize: 12,
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
), ),
Text( Text(
'10/08/2024', dateTimeSelected !,
style: style: const TextStyle(
TextStyle(fontSize: 8, fontWeight: FontWeight.w400), fontSize: 8, fontWeight: FontWeight.w400),
), ),
], ],
), ),
Row( const Row(
children: [ children: [
BodyMedium( BodyMedium(
text: '1000.00 ', text: '1000.00 ',
@ -179,8 +178,8 @@ class PowerClampCard extends StatelessWidget {
), ),
], ],
), ),
SizedBox( Expanded(
height: 290, child: SizedBox(
child: EnergyConsumptionPage( child: EnergyConsumptionPage(
chartData: chartData!.isNotEmpty chartData: chartData!.isNotEmpty
? chartData! ? chartData!
@ -198,11 +197,12 @@ class PowerClampCard extends StatelessWidget {
EnergyData('10:00 AM', 3.9), EnergyData('10:00 AM', 3.9),
EnergyData('11:00 AM', 4.0), EnergyData('11:00 AM', 4.0),
], ],
totalConsumption: totalConsumption: chartData!
chartData!.fold(0, (sum, data) => sum + data.consumption), .fold(0, (sum, data) => sum + data.consumption),
date: '10/08/2024', date: '10/08/2024',
), ),
), ),
),
const SizedBox( const SizedBox(
height: 5, height: 5,
), ),

View File

@ -24,11 +24,12 @@ class _PowerClampPageState extends State<PowerClampPage> {
final PageController _pageController = PageController(); final PageController _pageController = PageController();
int _currentPage = 0; int _currentPage = 0;
static const int _pageCount = 4; static const int _pageCount = 4;
late PowerClampModel model;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_pageController.addListener(_handlePageChange); _pageController.addListener(_handlePageChange);
model = _initialPowerClampModel();
} }
void _handlePageChange() { void _handlePageChange() {
@ -54,16 +55,18 @@ class _PowerClampPageState extends State<PowerClampPage> {
child: BlocProvider( child: BlocProvider(
create: (context) => PowerClampBloc(PCId: widget.device?.uuid ?? '') create: (context) => PowerClampBloc(PCId: widget.device?.uuid ?? '')
..add(const PowerClampInitial()), ..add(const PowerClampInitial()),
// ..add(const ReportLogsInitial(code: 'VoltageA')),
child: BlocBuilder<PowerClampBloc, PowerClampState>( child: BlocBuilder<PowerClampBloc, PowerClampState>(
builder: (context, state) { builder: (context, state) {
final blocProvider = context.read<PowerClampBloc>(); final blocProvider = context.read<PowerClampBloc>();
PowerClampModel model = _initialPowerClampModel();
List<EnergyData> chartData = []; List<EnergyData> chartData = [];
if (state is UpdateState) { if (state is UpdateState) {
model = state.powerClampModel; model = state.powerClampModel;
} else if (state is EnergyDataState) { } else if (state is EnergyDataState) {
chartData = state.energyData; chartData = state.energyData;
} else if (state is FilterRecordsState) {
chartData = state.filteredRecords;
} }
if (state is PowerClampLoadingState) { if (state is PowerClampLoadingState) {
@ -83,11 +86,33 @@ class _PowerClampPageState extends State<PowerClampPage> {
onRefresh: () async { onRefresh: () async {
blocProvider.add(const PowerClampInitial()); blocProvider.add(const PowerClampInitial());
}, },
child: PageView( child: PageView(controller: _pageController, children: [
controller: _pageController, _buildPowerClampCard(
children: title: 'Total Energy \nConsumption',
_buildPowerClampCards(model, chartData, blocProvider), phase: model.status.general,
isGeneral: true,
chartData: chartData,
blocProvider: blocProvider,
), ),
_buildPowerClampCard(
title: 'Phase A Energy \nConsumption',
phase: model.status.phaseA,
chartData: chartData,
blocProvider: blocProvider,
),
_buildPowerClampCard(
title: 'Phase B Energy \nConsumption',
phase: model.status.phaseB,
chartData: chartData,
blocProvider: blocProvider,
),
_buildPowerClampCard(
title: 'Phase C Energy \nConsumption',
phase: model.status.phaseC,
chartData: chartData,
blocProvider: blocProvider,
),
]),
), ),
), ),
_buildPageIndicator(), _buildPageIndicator(),
@ -164,6 +189,7 @@ class _PowerClampPageState extends State<PowerClampPage> {
required PowerClampBloc blocProvider, required PowerClampBloc blocProvider,
}) { }) {
return PowerClampCard( return PowerClampCard(
dateTimeSelected:blocProvider.formattedDate,
energyConsumption: _getValueOrNA(phase.dataPoints, isGeneral ? 0 : 5), energyConsumption: _getValueOrNA(phase.dataPoints, isGeneral ? 0 : 5),
title: title, title: title,
isGeneral: isGeneral, isGeneral: isGeneral,

View File

@ -1,312 +1,312 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; // import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_bloc.dart'; // import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_event.dart'; // import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_event.dart';
import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_state.dart'; // import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart'; // import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/power_clamp_model.dart'; // import 'package:syncrow_app/features/devices/model/power_clamp_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_chart.dart'; // import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_chart.dart';
import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_clamp_card.dart'; // import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_clamp_card.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart'; // import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart'; // import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; // import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class PowerClampTestPage extends StatefulWidget { // class PowerClampTestPage extends StatefulWidget {
late final DeviceModel? device; // late final DeviceModel? device;
PowerClampTestPage({super.key, this.device}); // PowerClampTestPage({super.key, this.device});
@override // @override
_PowerClampTestPageState createState() => _PowerClampTestPageState(); // _PowerClampTestPageState createState() => _PowerClampTestPageState();
} // }
class _PowerClampTestPageState extends State<PowerClampTestPage> { // class _PowerClampTestPageState extends State<PowerClampTestPage> {
final PageController _pageController = PageController(); // final PageController _pageController = PageController();
int _currentPage = 0; // int _currentPage = 0;
final int _pageCount = 4; // final int _pageCount = 4;
@override // @override
void initState() { // void initState() {
super.initState(); // super.initState();
_pageController.addListener(() { // _pageController.addListener(() {
int nextPage = _pageController.page?.round() ?? 0; // int nextPage = _pageController.page?.round() ?? 0;
if (_currentPage != nextPage) { // if (_currentPage != nextPage) {
setState(() { // setState(() {
_currentPage = nextPage; // _currentPage = nextPage;
}); // });
} // }
}); // });
} // }
@override // @override
void dispose() { // void dispose() {
_pageController.dispose(); // _pageController.dispose();
super.dispose(); // super.dispose();
} // }
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
return DefaultScaffold( // return DefaultScaffold(
title: 'Power Clamp', // title: 'Power Clamp',
child: BlocProvider( // child: BlocProvider(
create: (context) => PowerClampBloc(PCId: widget.device?.uuid ?? '') // create: (context) => PowerClampBloc(PCId: widget.device?.uuid ?? '')
..add(const PowerClampInitial()), // ..add(const PowerClampInitial()),
child: BlocBuilder<PowerClampBloc, PowerClampState>( // child: BlocBuilder<PowerClampBloc, PowerClampState>(
builder: (context, state) { // builder: (context, state) {
final _blocProvider = BlocProvider.of<PowerClampBloc>(context); // final _blocProvider = BlocProvider.of<PowerClampBloc>(context);
PowerClampModel model = PowerClampModel( // PowerClampModel model = PowerClampModel(
productType: '', // productType: '',
productUuid: '', // productUuid: '',
status: PowerStatus( // status: PowerStatus(
phaseA: Phase( // phaseA: Phase(
dataPoints: [ // dataPoints: [
DataPoint( // DataPoint(
code: '', // code: '',
customName: '', // customName: '',
dpId: 0, // dpId: 0,
time: 0, // time: 0,
type: '', // type: '',
value: 0), // value: 0),
], // ],
), // ),
phaseB: Phase( // phaseB: Phase(
dataPoints: [ // dataPoints: [
DataPoint( // DataPoint(
code: '', // code: '',
customName: '', // customName: '',
dpId: 0, // dpId: 0,
time: 0, // time: 0,
type: '', // type: '',
value: 0), // value: 0),
], // ],
), // ),
phaseC: Phase( // phaseC: Phase(
dataPoints: [ // dataPoints: [
DataPoint( // DataPoint(
code: '', // code: '',
customName: '', // customName: '',
dpId: 0, // dpId: 0,
time: 0, // time: 0,
type: '', // type: '',
value: 0), // value: 0),
], // ],
), // ),
general: Phase( // general: Phase(
dataPoints: [ // dataPoints: [
DataPoint( // DataPoint(
code: '', // code: '',
customName: '', // customName: '',
dpId: 0, // dpId: 0,
time: 0, // time: 0,
type: '', // type: '',
value: 0), // value: 0),
], // ],
), // ),
), // ),
); // );
List<EnergyData> chartData = []; // List<EnergyData> chartData = [];
if (state is UpdateState) { // if (state is UpdateState) {
model = state.powerClampModel; // model = state.powerClampModel;
} else if (state is EnergyDataState) { // } else if (state is EnergyDataState) {
chartData = state.energyData; // chartData = state.energyData;
} // }
return state is PowerClampLoadingState // return state is PowerClampLoadingState
? const Center( // ? const Center(
child: DefaultContainer( // child: DefaultContainer(
width: 50, // width: 50,
height: 50, // height: 50,
child: CircularProgressIndicator()), // child: CircularProgressIndicator()),
) // )
: Column( // : Column(
children: [ // children: [
Flexible( // Flexible(
child: RefreshIndicator( // child: RefreshIndicator(
onRefresh: () async { // onRefresh: () async {
_blocProvider.add(const PowerClampInitial()); // _blocProvider.add(const PowerClampInitial());
}, // },
child: PageView( // child: PageView(
controller: _pageController, // controller: _pageController,
children: [ // children: [
PowerClampCard( // PowerClampCard(
energyConsumption: // energyConsumption:
model.status.general.dataPoints.length > 0 // model.status.general.dataPoints.length > 0
? model.status.general.dataPoints[0].value // ? model.status.general.dataPoints[0].value
.toString() // .toString()
: 'N/A', // : 'N/A',
title: 'Total Energy \nConsumption', // title: 'Total Energy \nConsumption',
isGeneral: true, // isGeneral: true,
dateSwitcher: _blocProvider.dateSwitcher(), // dateSwitcher: Container(),
formattedDate: _blocProvider.formattedDate, // formattedDate: _blocProvider.formattedDate,
selectDateEvent: () { // selectDateEvent: () {
_blocProvider.add( // _blocProvider.add(
SelectDateEvent(context: context)); // SelectDateEvent(context: context));
}, // },
totalFrequencyGeneral: // totalFrequencyGeneral:
model.status.general.dataPoints.length > 4 // model.status.general.dataPoints.length > 4
? model.status.general.dataPoints[4].value // ? model.status.general.dataPoints[4].value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalActiveGeneral: // totalActiveGeneral:
model.status.general.dataPoints.length > 2 // model.status.general.dataPoints.length > 2
? model.status.general.dataPoints[2].value // ? model.status.general.dataPoints[2].value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalCurrentGeneral: // totalCurrentGeneral:
model.status.general.dataPoints.length > 1 // model.status.general.dataPoints.length > 1
? model.status.general.dataPoints[1].value // ? model.status.general.dataPoints[1].value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalVoltage: // totalVoltage:
model.status.general.dataPoints.length > 0 // model.status.general.dataPoints.length > 0
? model.status.general.dataPoints[0].value.toString() // ? model.status.general.dataPoints[0].value.toString()
: 'N/A', // : 'N/A',
chartData: chartData, // chartData: chartData,
context: context), // context: context),
PowerClampCard( // PowerClampCard(
energyConsumption: // energyConsumption:
model.status.phaseA.dataPoints.length > 5 // model.status.phaseA.dataPoints.length > 5
? model.status.phaseA.dataPoints[5].value // ? model.status.phaseA.dataPoints[5].value
.toString() // .toString()
: 'N/A', // : 'N/A',
title: 'Phase A Energy \nConsumption', // title: 'Phase A Energy \nConsumption',
dateSwitcher: _blocProvider.dateSwitcher(), // dateSwitcher: _blocProvider.dateSwitcher(),
formattedDate: _blocProvider.formattedDate, // formattedDate: _blocProvider.formattedDate,
selectDateEvent: () { // selectDateEvent: () {
_blocProvider.add( // _blocProvider.add(
SelectDateEvent(context: context)); // SelectDateEvent(context: context));
}, // },
totalFactor: model.status.phaseA.dataPoints.length > 3 // totalFactor: model.status.phaseA.dataPoints.length > 3
? model.status.phaseA.dataPoints[3].value // ? model.status.phaseA.dataPoints[3].value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalActive: model.status.phaseA.dataPoints.length > 2 // totalActive: model.status.phaseA.dataPoints.length > 2
? model.status.phaseA.dataPoints[2].value // ? model.status.phaseA.dataPoints[2].value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalCurrent: // totalCurrent:
model.status.phaseA.dataPoints.length > 1 // model.status.phaseA.dataPoints.length > 1
? model.status.phaseA.dataPoints[1] // ? model.status.phaseA.dataPoints[1]
.value // .value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalVoltage: // totalVoltage:
model.status.phaseA.dataPoints.length > 0 // model.status.phaseA.dataPoints.length > 0
? model.status.phaseA.dataPoints[0] // ? model.status.phaseA.dataPoints[0]
.value // .value
.toString() // .toString()
: 'N/A', // : 'N/A',
chartData: chartData, // chartData: chartData,
context: context), // context: context),
PowerClampCard( // PowerClampCard(
energyConsumption: // energyConsumption:
model.status.phaseB.dataPoints.length > 5 // model.status.phaseB.dataPoints.length > 5
? model.status.phaseB.dataPoints[5].value // ? model.status.phaseB.dataPoints[5].value
.toString() // .toString()
: 'N/A', // : 'N/A',
title: 'Phase B Energy \nConsumption', // title: 'Phase B Energy \nConsumption',
dateSwitcher: _blocProvider.dateSwitcher(), // dateSwitcher: _blocProvider.dateSwitcher(),
formattedDate: _blocProvider.formattedDate, // formattedDate: _blocProvider.formattedDate,
selectDateEvent: () { // selectDateEvent: () {
_blocProvider.add( // _blocProvider.add(
SelectDateEvent(context: context)); // SelectDateEvent(context: context));
}, // },
totalFactor: model.status.phaseA.dataPoints.length > 3 // totalFactor: model.status.phaseA.dataPoints.length > 3
? model.status.phaseB.dataPoints[3].value // ? model.status.phaseB.dataPoints[3].value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalActive: model.status.phaseB.dataPoints.length > 2 // totalActive: model.status.phaseB.dataPoints.length > 2
? model.status.phaseB.dataPoints[2].value // ? model.status.phaseB.dataPoints[2].value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalCurrent: // totalCurrent:
model.status.phaseB.dataPoints.length > 1 // model.status.phaseB.dataPoints.length > 1
? model.status.phaseB.dataPoints[1] // ? model.status.phaseB.dataPoints[1]
.value // .value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalVoltage: // totalVoltage:
model.status.phaseB.dataPoints.length > 0 // model.status.phaseB.dataPoints.length > 0
? model.status.phaseB.dataPoints[0] // ? model.status.phaseB.dataPoints[0]
.value // .value
.toString() // .toString()
: 'N/A', // : 'N/A',
chartData: chartData, // chartData: chartData,
context: context), // context: context),
PowerClampCard( // PowerClampCard(
energyConsumption: // energyConsumption:
model.status.phaseC.dataPoints.length > 5 // model.status.phaseC.dataPoints.length > 5
? model.status.phaseC.dataPoints[5].value // ? model.status.phaseC.dataPoints[5].value
.toString() // .toString()
: 'N/A', // : 'N/A',
title: 'Phase A Energy \nConsumption', // title: 'Phase A Energy \nConsumption',
dateSwitcher: _blocProvider.dateSwitcher(), // dateSwitcher: _blocProvider.dateSwitcher(),
formattedDate: _blocProvider.formattedDate, // formattedDate: _blocProvider.formattedDate,
selectDateEvent: () { // selectDateEvent: () {
_blocProvider.add( // _blocProvider.add(
SelectDateEvent(context: context)); // SelectDateEvent(context: context));
}, // },
totalFactor: model.status.phaseC.dataPoints.length > 3 // totalFactor: model.status.phaseC.dataPoints.length > 3
? model.status.phaseC.dataPoints[3].value // ? model.status.phaseC.dataPoints[3].value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalActive: model.status.phaseC.dataPoints.length > 2 // totalActive: model.status.phaseC.dataPoints.length > 2
? model.status.phaseC.dataPoints[2].value // ? model.status.phaseC.dataPoints[2].value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalCurrent: // totalCurrent:
model.status.phaseC.dataPoints.length > 1 // model.status.phaseC.dataPoints.length > 1
? model.status.phaseC.dataPoints[1] // ? model.status.phaseC.dataPoints[1]
.value // .value
.toString() // .toString()
: 'N/A', // : 'N/A',
totalVoltage: // totalVoltage:
model.status.phaseC.dataPoints.length > 0 // model.status.phaseC.dataPoints.length > 0
? model.status.phaseC.dataPoints[0] // ? model.status.phaseC.dataPoints[0]
.value // .value
.toString() // .toString()
: 'N/A', // : 'N/A',
chartData: chartData, // chartData: chartData,
context: context), // context: context),
]), // ]),
), // ),
), // ),
Padding( // Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0), // padding: const EdgeInsets.symmetric(vertical: 10.0),
child: Row( // child: Row(
mainAxisAlignment: MainAxisAlignment.center, // mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(_pageCount, (index) { // children: List.generate(_pageCount, (index) {
return AnimatedContainer( // return AnimatedContainer(
duration: const Duration(milliseconds: 300), // duration: const Duration(milliseconds: 300),
margin: // margin:
const EdgeInsets.symmetric(horizontal: 4.0), // const EdgeInsets.symmetric(horizontal: 4.0),
height: 10.0, // height: 10.0,
width: _currentPage == index // width: _currentPage == index
? 10.0 // ? 10.0
: 10.0, // Change width for current page // : 10.0, // Change width for current page
decoration: BoxDecoration( // decoration: BoxDecoration(
color: _currentPage == index // color: _currentPage == index
? Colors // ? Colors
.grey // Use a different color for the active indicator // .grey // Use a different color for the active indicator
: ColorsManager.greyColor, // : ColorsManager.greyColor,
borderRadius: BorderRadius.circular(5.0), // borderRadius: BorderRadius.circular(5.0),
), // ),
); // );
}), // }),
), // ),
), // ),
], // ],
); // );
}, // },
), // ),
), // ),
); // );
} // }
} // }

View File

@ -383,6 +383,7 @@ class DevicesAPI {
.replaceAll('{startTime}', startTime) .replaceAll('{startTime}', startTime)
.replaceAll('{endTime}', endTime), .replaceAll('{endTime}', endTime),
expectedResponseModel: (json) { expectedResponseModel: (json) {
log('json=====$json');
return DeviceReport.fromJson(json); return DeviceReport.fromJson(json);
}, },
); );