mirror of
https://github.com/SyncrowIOT/syncrow-app.git
synced 2025-11-27 10:24:55 +00:00
power_clamp_chart_functionality
This commit is contained in:
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
@ -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});
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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});
|
||||||
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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,
|
||||||
),
|
),
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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),
|
||||||
),
|
// ),
|
||||||
);
|
// );
|
||||||
}),
|
// }),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
],
|
// ],
|
||||||
);
|
// );
|
||||||
},
|
// },
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@ -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);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user