mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 15:17:31 +00:00
Added spaces devices
This commit is contained in:
@ -17,8 +17,6 @@ class DeviceManagementBloc extends Bloc<DeviceManagementEvent, DeviceManagementS
|
|||||||
String currentProductName = '';
|
String currentProductName = '';
|
||||||
String? currentCommunity;
|
String? currentCommunity;
|
||||||
String? currentUnitName;
|
String? currentUnitName;
|
||||||
String? communityId;
|
|
||||||
String? spaceId;
|
|
||||||
|
|
||||||
DeviceManagementBloc() : super(DeviceManagementInitial()) {
|
DeviceManagementBloc() : super(DeviceManagementInitial()) {
|
||||||
on<FetchDevices>(_onFetchDevices);
|
on<FetchDevices>(_onFetchDevices);
|
||||||
@ -34,13 +32,7 @@ class DeviceManagementBloc extends Bloc<DeviceManagementEvent, DeviceManagementS
|
|||||||
Future<void> _onFetchDevices(FetchDevices event, Emitter<DeviceManagementState> emit) async {
|
Future<void> _onFetchDevices(FetchDevices event, Emitter<DeviceManagementState> emit) async {
|
||||||
emit(DeviceManagementLoading());
|
emit(DeviceManagementLoading());
|
||||||
try {
|
try {
|
||||||
if (event.communityId.isNotEmpty) {
|
final devices = await DevicesManagementApi().fetchDevices(event.communityId, event.spaceId);
|
||||||
communityId = event.communityId;
|
|
||||||
}
|
|
||||||
if (event.spaceId.isNotEmpty) {
|
|
||||||
spaceId = event.spaceId;
|
|
||||||
}
|
|
||||||
final devices = await DevicesManagementApi().fetchDevices(communityId ?? '', spaceId ?? '');
|
|
||||||
_selectedDevices.clear();
|
_selectedDevices.clear();
|
||||||
_devices = devices;
|
_devices = devices;
|
||||||
_filteredDevices = devices;
|
_filteredDevices = devices;
|
||||||
|
@ -80,7 +80,7 @@ class DeviceManagementPage extends StatelessWidget with HelperResponsiveLayout {
|
|||||||
return BlocBuilder<DeviceManagementBloc, DeviceManagementState>(
|
return BlocBuilder<DeviceManagementBloc, DeviceManagementState>(
|
||||||
builder: (context, deviceState) {
|
builder: (context, deviceState) {
|
||||||
if (deviceState is DeviceManagementLoading) {
|
if (deviceState is DeviceManagementLoading) {
|
||||||
return const Center(child: CircularProgressIndicator());
|
return const DeviceManagementBody(devices: []);
|
||||||
} else if (deviceState is DeviceManagementLoaded) {
|
} else if (deviceState is DeviceManagementLoaded) {
|
||||||
return DeviceManagementBody(devices: deviceState.devices);
|
return DeviceManagementBody(devices: deviceState.devices);
|
||||||
} else if (deviceState is DeviceManagementFiltered) {
|
} else if (deviceState is DeviceManagementFiltered) {
|
||||||
|
@ -69,133 +69,143 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
|
|||||||
)),
|
)),
|
||||||
Flexible(
|
Flexible(
|
||||||
flex: 3,
|
flex: 3,
|
||||||
child: Column(
|
child: state is DeviceManagementLoading
|
||||||
children: [
|
? const Center(child: CircularProgressIndicator())
|
||||||
Container(
|
: Column(
|
||||||
padding: isLargeScreenSize(context)
|
|
||||||
? const EdgeInsets.all(30)
|
|
||||||
: const EdgeInsets.all(15),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
children: [
|
||||||
FilterWidget(
|
|
||||||
size: MediaQuery.of(context).size,
|
|
||||||
tabs: tabs,
|
|
||||||
selectedIndex: selectedIndex,
|
|
||||||
onTabChanged: (index) {
|
|
||||||
context.read<DeviceManagementBloc>().add(SelectedFilterChanged(index));
|
|
||||||
},
|
|
||||||
),
|
|
||||||
const SizedBox(height: 20),
|
|
||||||
const DeviceSearchFilters(),
|
|
||||||
const SizedBox(height: 12),
|
|
||||||
Container(
|
Container(
|
||||||
height: 45,
|
padding: isLargeScreenSize(context)
|
||||||
width: 125,
|
? const EdgeInsets.all(30)
|
||||||
decoration: containerDecoration,
|
: const EdgeInsets.all(15),
|
||||||
child: Center(
|
child: Column(
|
||||||
child: DefaultButton(
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
onPressed: isControlButtonEnabled
|
children: [
|
||||||
? () {
|
FilterWidget(
|
||||||
if (selectedDevices.length == 1) {
|
size: MediaQuery.of(context).size,
|
||||||
showDialog(
|
tabs: tabs,
|
||||||
context: context,
|
selectedIndex: selectedIndex,
|
||||||
builder: (context) => DeviceControlDialog(
|
onTabChanged: (index) {
|
||||||
device: selectedDevices.first,
|
context
|
||||||
),
|
.read<DeviceManagementBloc>()
|
||||||
);
|
.add(SelectedFilterChanged(index));
|
||||||
} else if (selectedDevices.length > 1) {
|
},
|
||||||
final productTypes = selectedDevices
|
),
|
||||||
.map((device) => device.productType)
|
const SizedBox(height: 20),
|
||||||
.toSet();
|
const DeviceSearchFilters(),
|
||||||
if (productTypes.length == 1) {
|
const SizedBox(height: 12),
|
||||||
showDialog(
|
Container(
|
||||||
context: context,
|
height: 45,
|
||||||
builder: (context) => DeviceBatchControlDialog(
|
width: 125,
|
||||||
devices: selectedDevices,
|
decoration: containerDecoration,
|
||||||
),
|
child: Center(
|
||||||
);
|
child: DefaultButton(
|
||||||
}
|
onPressed: isControlButtonEnabled
|
||||||
}
|
? () {
|
||||||
}
|
if (selectedDevices.length == 1) {
|
||||||
: null,
|
showDialog(
|
||||||
borderRadius: 9,
|
context: context,
|
||||||
child: Text(
|
builder: (context) => DeviceControlDialog(
|
||||||
buttonLabel,
|
device: selectedDevices.first,
|
||||||
textAlign: TextAlign.center,
|
),
|
||||||
style: TextStyle(
|
);
|
||||||
fontSize: 12,
|
} else if (selectedDevices.length > 1) {
|
||||||
color: isControlButtonEnabled ? Colors.white : Colors.grey,
|
final productTypes = selectedDevices
|
||||||
|
.map((device) => device.productType)
|
||||||
|
.toSet();
|
||||||
|
if (productTypes.length == 1) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => DeviceBatchControlDialog(
|
||||||
|
devices: selectedDevices,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
: null,
|
||||||
|
borderRadius: 9,
|
||||||
|
child: Text(
|
||||||
|
buttonLabel,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
color: isControlButtonEnabled ? Colors.white : Colors.grey,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Padding(
|
||||||
|
padding: isLargeScreenSize(context)
|
||||||
|
? const EdgeInsets.all(30)
|
||||||
|
: const EdgeInsets.all(15),
|
||||||
|
child: DynamicTable(
|
||||||
|
withSelectAll: true,
|
||||||
|
cellDecoration: containerDecoration,
|
||||||
|
onRowSelected: (index, isSelected, row) {
|
||||||
|
final selectedDevice = devicesToShow[index];
|
||||||
|
context
|
||||||
|
.read<DeviceManagementBloc>()
|
||||||
|
.add(SelectDevice(selectedDevice));
|
||||||
|
},
|
||||||
|
withCheckBox: true,
|
||||||
|
size: MediaQuery.of(context).size,
|
||||||
|
uuidIndex: 2,
|
||||||
|
headers: const [
|
||||||
|
'Device Name',
|
||||||
|
'Product Name',
|
||||||
|
'Device ID',
|
||||||
|
'Space Name',
|
||||||
|
'location',
|
||||||
|
'Battery Level',
|
||||||
|
'Installation Date and Time',
|
||||||
|
'Status',
|
||||||
|
'Last Offline Date and Time',
|
||||||
|
],
|
||||||
|
data: devicesToShow.map((device) {
|
||||||
|
final combinedSpaceNames = device.spaces != null
|
||||||
|
? device.spaces!.map((space) => space.spaceName).join(' > ') +
|
||||||
|
(device.community != null
|
||||||
|
? ' > ${device.community!.name}'
|
||||||
|
: '')
|
||||||
|
: (device.community != null ? device.community!.name : '');
|
||||||
|
|
||||||
|
return [
|
||||||
|
device.name ?? '',
|
||||||
|
device.productName ?? '',
|
||||||
|
device.uuid ?? '',
|
||||||
|
(device.spaces != null && device.spaces!.isNotEmpty)
|
||||||
|
? device.spaces![0].spaceName
|
||||||
|
: '',
|
||||||
|
combinedSpaceNames,
|
||||||
|
device.batteryLevel != null ? '${device.batteryLevel}%' : '-',
|
||||||
|
formatDateTime(DateTime.fromMillisecondsSinceEpoch(
|
||||||
|
(device.createTime ?? 0) * 1000)),
|
||||||
|
device.online == true ? 'Online' : 'Offline',
|
||||||
|
formatDateTime(DateTime.fromMillisecondsSinceEpoch(
|
||||||
|
(device.updateTime ?? 0) * 1000)),
|
||||||
|
];
|
||||||
|
}).toList(),
|
||||||
|
onSelectionChanged: (selectedRows) {
|
||||||
|
context
|
||||||
|
.read<DeviceManagementBloc>()
|
||||||
|
.add(UpdateSelection(selectedRows));
|
||||||
|
},
|
||||||
|
initialSelectedIds: context
|
||||||
|
.read<DeviceManagementBloc>()
|
||||||
|
.selectedDevices
|
||||||
|
.map((device) => device.uuid!)
|
||||||
|
.toList(),
|
||||||
|
isEmpty: devicesToShow.isEmpty,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Padding(
|
|
||||||
padding: isLargeScreenSize(context)
|
|
||||||
? const EdgeInsets.all(30)
|
|
||||||
: const EdgeInsets.all(15),
|
|
||||||
child: DynamicTable(
|
|
||||||
withSelectAll: true,
|
|
||||||
cellDecoration: containerDecoration,
|
|
||||||
onRowSelected: (index, isSelected, row) {
|
|
||||||
final selectedDevice = devicesToShow[index];
|
|
||||||
context.read<DeviceManagementBloc>().add(SelectDevice(selectedDevice));
|
|
||||||
},
|
|
||||||
withCheckBox: true,
|
|
||||||
size: MediaQuery.of(context).size,
|
|
||||||
uuidIndex: 2,
|
|
||||||
headers: const [
|
|
||||||
'Device Name',
|
|
||||||
'Product Name',
|
|
||||||
'Device ID',
|
|
||||||
'Space Name',
|
|
||||||
'location',
|
|
||||||
'Battery Level',
|
|
||||||
'Installation Date and Time',
|
|
||||||
'Status',
|
|
||||||
'Last Offline Date and Time',
|
|
||||||
],
|
|
||||||
data: devicesToShow.map((device) {
|
|
||||||
final combinedSpaceNames = device.spaces != null
|
|
||||||
? device.spaces!.map((space) => space.spaceName).join(' > ') +
|
|
||||||
(device.community != null ? ' > ${device.community!.name}' : '')
|
|
||||||
: (device.community != null ? device.community!.name : '');
|
|
||||||
|
|
||||||
return [
|
|
||||||
device.name ?? '',
|
|
||||||
device.productName ?? '',
|
|
||||||
device.uuid ?? '',
|
|
||||||
(device.spaces != null && device.spaces!.isNotEmpty)
|
|
||||||
? device.spaces![0].spaceName
|
|
||||||
: '',
|
|
||||||
combinedSpaceNames,
|
|
||||||
device.batteryLevel != null ? '${device.batteryLevel}%' : '-',
|
|
||||||
formatDateTime(DateTime.fromMillisecondsSinceEpoch(
|
|
||||||
(device.createTime ?? 0) * 1000)),
|
|
||||||
device.online == true ? 'Online' : 'Offline',
|
|
||||||
formatDateTime(DateTime.fromMillisecondsSinceEpoch(
|
|
||||||
(device.updateTime ?? 0) * 1000)),
|
|
||||||
];
|
|
||||||
}).toList(),
|
|
||||||
onSelectionChanged: (selectedRows) {
|
|
||||||
context.read<DeviceManagementBloc>().add(UpdateSelection(selectedRows));
|
|
||||||
},
|
|
||||||
initialSelectedIds: context
|
|
||||||
.read<DeviceManagementBloc>()
|
|
||||||
.selectedDevices
|
|
||||||
.map((device) => device.uuid!)
|
|
||||||
.toList(),
|
|
||||||
isEmpty: devicesToShow.isEmpty,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
Reference in New Issue
Block a user