From 28579e07786198c1bfb4659cb42fe262ffbdf5c7 Mon Sep 17 00:00:00 2001 From: ashrafzarkanisala Date: Thu, 12 Sep 2024 11:07:50 +0300 Subject: [PATCH] push door lock and living room batch design --- assets/icons/factory_reset.svg | 12 ++--- assets/icons/firmware.svg | 8 +++ lib/pages/common/custom_table.dart | 9 ++-- .../bloc/device_managment_bloc.dart | 28 +++++----- .../helper/route_controls_based_code.dart | 31 +++++++++-- .../widgets/device_managment_body.dart | 2 +- .../view/door_lock_batch_control_view.dart | 38 +++++++++++++ ..._view.dart => door_lock_control_view.dart} | 0 .../shared/batch_control/factory_reset.dart | 42 +++++++++++++++ .../shared/batch_control/firmware_update.dart | 43 +++++++++++++++ .../shared/device_batch_control_dialog.dart | 31 +++++++---- .../shared/device_control_dialog.dart | 3 +- .../view/living_room_batch_controls.dart | 7 +++ .../widgets/living_toggle_widget.dart | 54 ++++++++++--------- lib/utils/constants/assets.dart | 1 + 15 files changed, 241 insertions(+), 68 deletions(-) create mode 100644 assets/icons/firmware.svg create mode 100644 lib/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart rename lib/pages/device_managment/door_lock/view/{door_lock_status_view.dart => door_lock_control_view.dart} (100%) create mode 100644 lib/pages/device_managment/shared/batch_control/factory_reset.dart create mode 100644 lib/pages/device_managment/shared/batch_control/firmware_update.dart diff --git a/assets/icons/factory_reset.svg b/assets/icons/factory_reset.svg index 7a47f24b..b7297165 100644 --- a/assets/icons/factory_reset.svg +++ b/assets/icons/factory_reset.svg @@ -1,10 +1,4 @@ - - - - - - - - - + + + diff --git a/assets/icons/firmware.svg b/assets/icons/firmware.svg new file mode 100644 index 00000000..d636fd10 --- /dev/null +++ b/assets/icons/firmware.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/lib/pages/common/custom_table.dart b/lib/pages/common/custom_table.dart index 317f7381..b6829ec2 100644 --- a/lib/pages/common/custom_table.dart +++ b/lib/pages/common/custom_table.dart @@ -86,8 +86,10 @@ class _DynamicTableState extends State { setState(() { _selectAll = value ?? false; _selected = List.filled(widget.data.length, _selectAll); - if (widget.selectAll != null) { - widget.selectAll!(_selectAll); + for (int i = 0; i < widget.data.length; i++) { + if (widget.onRowSelected != null) { + widget.onRowSelected!(i, _selectAll, widget.data[i]); + } } }); } @@ -185,8 +187,7 @@ class _DynamicTableState extends State { ), ), child: Checkbox( - value: widget.data.isNotEmpty && - _selected.every((element) => element == true), + value: _selectAll, onChanged: widget.withSelectAll && widget.data.isNotEmpty ? _toggleSelectAll : null, diff --git a/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart b/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart index 1919cb49..70c65fcc 100644 --- a/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart +++ b/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart @@ -115,17 +115,8 @@ class DeviceManagementBloc List clonedSelectedDevices = List.from(_selectedDevices); - bool isControlButtonEnabled = false; - - if (clonedSelectedDevices.length == 1) { - isControlButtonEnabled = true; - } else if (clonedSelectedDevices.length > 1) { - - final productTypes = - clonedSelectedDevices.map((device) => device.productType).toSet(); - isControlButtonEnabled = productTypes.length == - 1; - } + bool isControlButtonEnabled = + _checkIfControlButtonEnabled(clonedSelectedDevices); if (state is DeviceManagementLoaded) { emit(DeviceManagementLoaded( @@ -136,7 +127,7 @@ class DeviceManagementBloc lowBatteryCount: _lowBatteryCount, selectedDevice: clonedSelectedDevices.isNotEmpty ? clonedSelectedDevices : null, - isControlButtonEnabled: isControlButtonEnabled, + isControlButtonEnabled: isControlButtonEnabled, )); } else if (state is DeviceManagementFiltered) { emit(DeviceManagementFiltered( @@ -147,11 +138,22 @@ class DeviceManagementBloc lowBatteryCount: _lowBatteryCount, selectedDevice: clonedSelectedDevices.isNotEmpty ? clonedSelectedDevices : null, - isControlButtonEnabled: isControlButtonEnabled, + isControlButtonEnabled: isControlButtonEnabled, )); } } + bool _checkIfControlButtonEnabled(List selectedDevices) { + if (selectedDevices.length > 1) { + final productTypes = + selectedDevices.map((device) => device.productType).toSet(); + return productTypes.length == 1; + } else if (selectedDevices.length == 1) { + return true; + } + return false; + } + void _calculateDeviceCounts() { _onlineCount = _devices.where((device) => device.online == true).length; _offlineCount = _devices.where((device) => device.online == false).length; diff --git a/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart b/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart index 5df77b2b..ffadb6f8 100644 --- a/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart +++ b/lib/pages/device_managment/all_devices/helper/route_controls_based_code.dart @@ -4,7 +4,8 @@ import 'package:syncrow_web/pages/device_managment/ac/view/ac_device_control.dar import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; import 'package:syncrow_web/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart'; import 'package:syncrow_web/pages/device_managment/curtain/view/curtain_status_view.dart'; -import 'package:syncrow_web/pages/device_managment/door_lock/view/door_lock_status_view.dart'; +import 'package:syncrow_web/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart'; +import 'package:syncrow_web/pages/device_managment/door_lock/view/door_lock_control_view.dart'; import 'package:syncrow_web/pages/device_managment/gateway/view/gateway_view.dart'; import 'package:syncrow_web/pages/device_managment/three_gang_switch/view/living_room_batch_controls.dart'; import 'package:syncrow_web/pages/device_managment/three_gang_switch/view/living_room_device_control.dart'; @@ -40,12 +41,30 @@ mixin RouteControlsBasedCode { } } + /* + 3G: 2 occurrences + 1G: 1 occurrence + 2G: 1 occurrence + GW: 2 occurrences + DL: 2 occurrences + WPS: 2 occurrences + CPS: 2 occurrences + AC: 3 occurrences + CUR: 1 occurrence + + + */ + Widget routeBatchControlsWidgets({required List devices}) { switch (devices.first.productType) { case '3G': + case '1G': + case '2G': return LivingRoomBatchControls( deviceIds: devices - .where((e) => e.productType == '3G') + .where((e) => (e.productType == '3G' || + e.productType == '1G' || + e.productType == '2G')) .map((e) => e.uuid!) .toList(), ); @@ -53,8 +72,12 @@ mixin RouteControlsBasedCode { // return GateWayControls( // gatewayId: device.first.uuid!, // ); - // case 'DL': - // return DoorLockControls(device: device.first); + case 'DL': + return DoorLockBatchControlView( + devicesIds: devices + .where((e) => (e.productType == 'DL')) + .map((e) => e.uuid!) + .toList()); // case 'WPS': // return WallSensorControls(device: device.first); // case 'CPS': diff --git a/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart b/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart index 936234cf..d2f5f1de 100644 --- a/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart +++ b/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart @@ -139,7 +139,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { ? const EdgeInsets.all(30) : const EdgeInsets.all(15), child: DynamicTable( - withSelectAll: false, + withSelectAll: true, cellDecoration: containerDecoration, onRowSelected: (index, isSelected, row) { final selectedDevice = devicesToShow[index]; diff --git a/lib/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart b/lib/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart new file mode 100644 index 00000000..9c6190e0 --- /dev/null +++ b/lib/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/device_managment/shared/batch_control/factory_reset.dart'; +import 'package:syncrow_web/pages/device_managment/shared/batch_control/firmware_update.dart'; +import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; + +class DoorLockBatchControlView extends StatelessWidget + with HelperResponsiveLayout { + const DoorLockBatchControlView({super.key, required this.devicesIds}); + + final List devicesIds; + + @override + Widget build(BuildContext context) { + final isExtraLarge = isExtraLargeScreenSize(context); + final isLarge = isLargeScreenSize(context); + final isMedium = isMediumScreenSize(context); + return SizedBox( + child: GridView( + padding: const EdgeInsets.symmetric(horizontal: 50), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: isLarge || isExtraLarge || isMedium ? 2 : 1, + mainAxisExtent: 140, + crossAxisSpacing: 12, + mainAxisSpacing: 12, + ), + children: [ + FirmwareUpdateWidget( + deviceId: devicesIds.first, + version: 12, + ), + FactoryResetWidget(deviceId: devicesIds.first), + ], + ), + ); + } +} diff --git a/lib/pages/device_managment/door_lock/view/door_lock_status_view.dart b/lib/pages/device_managment/door_lock/view/door_lock_control_view.dart similarity index 100% rename from lib/pages/device_managment/door_lock/view/door_lock_status_view.dart rename to lib/pages/device_managment/door_lock/view/door_lock_control_view.dart diff --git a/lib/pages/device_managment/shared/batch_control/factory_reset.dart b/lib/pages/device_managment/shared/batch_control/factory_reset.dart new file mode 100644 index 00000000..98f8f043 --- /dev/null +++ b/lib/pages/device_managment/shared/batch_control/factory_reset.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; + +class FactoryResetWidget extends StatelessWidget { + const FactoryResetWidget({super.key, required String deviceId}); + + @override + Widget build(BuildContext context) { + return DeviceControlsContainer( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ClipOval( + child: Container( + color: ColorsManager.whiteColors, + height: 60, + width: 60, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: SvgPicture.asset( + Assets.factoryReset, + fit: BoxFit.cover, + ), + ), + )), + Text( + 'Factory Reset', + style: context.textTheme.titleMedium!.copyWith( + fontWeight: FontWeight.w400, + color: ColorsManager.blackColor, + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/device_managment/shared/batch_control/firmware_update.dart b/lib/pages/device_managment/shared/batch_control/firmware_update.dart new file mode 100644 index 00000000..bb7c7516 --- /dev/null +++ b/lib/pages/device_managment/shared/batch_control/firmware_update.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; + +class FirmwareUpdateWidget extends StatelessWidget { + const FirmwareUpdateWidget( + {super.key, required String deviceId, required int version}); + + @override + Widget build(BuildContext context) { + return DeviceControlsContainer( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ClipOval( + child: Container( + color: ColorsManager.whiteColors, + height: 60, + width: 60, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: SvgPicture.asset( + Assets.firmware, + fit: BoxFit.cover, + ), + ), + )), + Text( + 'Firmware Update', + style: context.textTheme.titleMedium!.copyWith( + fontWeight: FontWeight.w400, + color: ColorsManager.blackColor, + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/device_managment/shared/device_batch_control_dialog.dart b/lib/pages/device_managment/shared/device_batch_control_dialog.dart index 18397253..1c3f3111 100644 --- a/lib/pages/device_managment/shared/device_batch_control_dialog.dart +++ b/lib/pages/device_managment/shared/device_batch_control_dialog.dart @@ -22,8 +22,8 @@ class DeviceBatchControlDialog extends StatelessWidget borderRadius: BorderRadius.circular(20), ), child: SizedBox( - width: 798, - height: context.screenHeight * 0.7, + width: devices.length < 3 ? 500 : 798, + // height: context.screenHeight * 0.7, child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(20.0), @@ -34,13 +34,25 @@ class DeviceBatchControlDialog extends StatelessWidget mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const SizedBox(), - Text( - devices.first.categoryName ?? 'Device Control', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 22, - color: ColorsManager.dialogBlueTitle, - ), + Column( + children: [ + Text( + devices.first.categoryName ?? 'Device Control', + style: context.textTheme.titleLarge!.copyWith( + color: ColorsManager.dialogBlueTitle, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox( + height: 8, + ), + Text( + "Batch Control", + style: context.textTheme.bodySmall!.copyWith( + color: ColorsManager.dialogBlueTitle, + ), + ), + ], ), Container( width: 25, @@ -66,6 +78,7 @@ class DeviceBatchControlDialog extends StatelessWidget ), ], ), + const SizedBox(height: 20), //// BUILD DEVICE CONTROLS /// diff --git a/lib/pages/device_managment/shared/device_control_dialog.dart b/lib/pages/device_managment/shared/device_control_dialog.dart index cde54047..77f52f62 100644 --- a/lib/pages/device_managment/shared/device_control_dialog.dart +++ b/lib/pages/device_managment/shared/device_control_dialog.dart @@ -1,7 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/helper/route_controls_based_code.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; @@ -22,7 +21,7 @@ class DeviceControlDialog extends StatelessWidget with RouteControlsBasedCode { ), child: SizedBox( width: 798, - height: context.screenHeight * 0.7, + // height: context.screenHeight * 0.7, child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(20.0), diff --git a/lib/pages/device_managment/three_gang_switch/view/living_room_batch_controls.dart b/lib/pages/device_managment/three_gang_switch/view/living_room_batch_controls.dart index 7712cc02..b07ecbff 100644 --- a/lib/pages/device_managment/three_gang_switch/view/living_room_batch_controls.dart +++ b/lib/pages/device_managment/three_gang_switch/view/living_room_batch_controls.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/shared/batch_control/factory_reset.dart'; +import 'package:syncrow_web/pages/device_managment/shared/batch_control/firmware_update.dart'; import 'package:syncrow_web/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart'; import 'package:syncrow_web/pages/device_managment/three_gang_switch/models/living_room_model.dart'; import 'package:syncrow_web/pages/device_managment/three_gang_switch/widgets/living_toggle_widget.dart'; @@ -60,6 +62,11 @@ class LivingRoomBatchControls extends StatelessWidget deviceId: deviceIds.first, label: 'Wall Light', ), + FirmwareUpdateWidget( + deviceId: deviceIds.first, + version: 12, + ), + FactoryResetWidget(deviceId: deviceIds.first), ], ), ); diff --git a/lib/pages/device_managment/three_gang_switch/widgets/living_toggle_widget.dart b/lib/pages/device_managment/three_gang_switch/widgets/living_toggle_widget.dart index abc75e66..62306a92 100644 --- a/lib/pages/device_managment/three_gang_switch/widgets/living_toggle_widget.dart +++ b/lib/pages/device_managment/three_gang_switch/widgets/living_toggle_widget.dart @@ -5,6 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_web/pages/device_managment/three_gang_switch/bloc/living_room_bloc.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; class ToggleWidget extends StatelessWidget { final bool value; @@ -29,12 +30,13 @@ class ToggleWidget extends StatelessWidget { border: Border.all(color: ColorsManager.boxDivider), ), padding: const EdgeInsets.all(16), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, + Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipOval( child: Container( @@ -46,31 +48,31 @@ class ToggleWidget extends StatelessWidget { fit: BoxFit.cover, ), )), - SizedBox( - height: 20, - width: 35, - child: CupertinoSwitch( - value: value, - activeColor: ColorsManager.dialogBlueTitle, - onChanged: (newValue) { - context.read().add( - LivingRoomControl( - deviceId: deviceId, - code: code, - value: newValue, - ), - ); - }, + Text( + label, + style: context.textTheme.titleMedium!.copyWith( + fontWeight: FontWeight.w400, + color: ColorsManager.blackColor, ), ), ], ), - const Spacer(), - Text( - label, - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 14, + Container( + height: 20, + width: 35, + padding: const EdgeInsets.only(right: 16, top: 10), + child: CupertinoSwitch( + value: value, + activeColor: ColorsManager.dialogBlueTitle, + onChanged: (newValue) { + context.read().add( + LivingRoomControl( + deviceId: deviceId, + code: code, + value: newValue, + ), + ); + }, ), ), ], diff --git a/lib/utils/constants/assets.dart b/lib/utils/constants/assets.dart index 5d2f5f2d..53fbb476 100644 --- a/lib/utils/constants/assets.dart +++ b/lib/utils/constants/assets.dart @@ -126,4 +126,5 @@ class Assets { static const String grid = "assets/images/grid.svg"; static const String curtainIcon = "assets/images/curtain.svg"; static const String unlock = 'assets/icons/unlock_ic.svg'; + static const String firmware = 'assets/icons/firmware.svg'; }