diff --git a/lib/pages/access_management/view/access_management.dart b/lib/pages/access_management/view/access_management.dart index a63b02a3..57ef46da 100644 --- a/lib/pages/access_management/view/access_management.dart +++ b/lib/pages/access_management/view/access_management.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:go_router/go_router.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_bloc.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_event.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_state.dart'; @@ -9,11 +7,11 @@ import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/common/custom_table.dart'; import 'package:syncrow_web/pages/common/date_time_widget.dart'; import 'package:syncrow_web/pages/common/text_field/custom_web_textfield.dart'; +import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.dart'; import 'package:syncrow_web/pages/visitor_password/view/visitor_password_dialog.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/constants/app_enum.dart'; -import 'package:syncrow_web/utils/constants/routes_const.dart'; import 'package:syncrow_web/utils/style.dart'; import 'package:syncrow_web/web_layout/web_scaffold.dart'; @@ -38,30 +36,18 @@ class AccessManagementPage extends StatelessWidget { children: [ Text( 'Physical Access', - style: Theme.of(context).textTheme.headlineMedium!.copyWith(color: Colors.white), - ), - Row( - children: [ - InkWell( - onTap: () { - context.go(RoutesConst.home); - }, - child: SvgPicture.asset( - height: 20, - width: 20, - Assets.grid, - ), - ), - const SizedBox( - width: 10, - ) - ], + style: Theme.of(context) + .textTheme + .headlineMedium! + .copyWith(color: Colors.white), ), + const NavigateHomeGridView(), ], ), ], scaffoldBody: BlocProvider( - create: (BuildContext context) => AccessBloc()..add(FetchTableData()), + create: (BuildContext context) => + AccessBloc()..add(FetchTableData()), child: BlocConsumer( listener: (context, state) {}, builder: (context, state) { @@ -82,11 +68,15 @@ class AccessManagementPage extends StatelessWidget { child: Flexible( child: ListView.builder( scrollDirection: Axis.horizontal, - itemCount: BlocProvider.of(context).tabs.length, + itemCount: + BlocProvider.of(context) + .tabs + .length, shrinkWrap: true, itemBuilder: (context, index) { final isSelected = index == - BlocProvider.of(context).selectedIndex; + BlocProvider.of(context) + .selectedIndex; return InkWell( onTap: () { BlocProvider.of(context) @@ -96,25 +86,36 @@ class AccessManagementPage extends StatelessWidget { decoration: BoxDecoration( color: ColorsManager.boxColor, border: Border.all( - color: isSelected ? Colors.blue : Colors.transparent, + color: isSelected + ? Colors.blue + : Colors.transparent, width: 2.0, ), borderRadius: index == 0 ? const BorderRadius.only( - topLeft: Radius.circular(10), - bottomLeft: Radius.circular(10)) + topLeft: + Radius.circular(10), + bottomLeft: + Radius.circular(10)) : index == 3 ? const BorderRadius.only( - topRight: Radius.circular(10), - bottomRight: Radius.circular(10)) + topRight: + Radius.circular(10), + bottomRight: + Radius.circular(10)) : null, ), - padding: const EdgeInsets.only(left: 10, right: 10), + padding: const EdgeInsets.only( + left: 10, right: 10), child: Center( child: Text( - BlocProvider.of(context).tabs[index], + BlocProvider.of( + context) + .tabs[index], style: TextStyle( - color: isSelected ? Colors.blue : Colors.black, + color: isSelected + ? Colors.blue + : Colors.black, ), ), ), @@ -150,13 +151,19 @@ class AccessManagementPage extends StatelessWidget { title: 'Access Time', size: size, endTime: () { - accessBloc.add(SelectTime(context: context, isStart: false)); + accessBloc.add(SelectTime( + context: context, isStart: false)); }, startTime: () { - accessBloc.add(SelectTime(context: context, isStart: true)); + accessBloc.add(SelectTime( + context: context, isStart: true)); }, - firstString: BlocProvider.of(context).startTime, - secondString: BlocProvider.of(context).endTime, + firstString: + BlocProvider.of(context) + .startTime, + secondString: + BlocProvider.of(context) + .endTime, ), const SizedBox( width: 15, @@ -168,13 +175,17 @@ class AccessManagementPage extends StatelessWidget { child: DefaultButton( onPressed: () { accessBloc.add(FilterDataEvent( - selectedTabIndex: BlocProvider.of( - context) + selectedTabIndex: BlocProvider + .of( + context) .selectedIndex, // Pass the selected tab index - passwordName: - accessBloc.passwordName.text.toLowerCase(), - startTime: accessBloc.effectiveTimeTimeStamp, - endTime: accessBloc.expirationTimeTimeStamp)); + passwordName: accessBloc + .passwordName.text + .toLowerCase(), + startTime: accessBloc + .effectiveTimeTimeStamp, + endTime: accessBloc + .expirationTimeTimeStamp)); }, borderRadius: 9, child: const Text('Search'))), @@ -190,7 +201,8 @@ class AccessManagementPage extends StatelessWidget { onPressed: () { accessBloc.add(ResetSearch()); }, - backgroundColor: ColorsManager.whiteColors, + backgroundColor: + ColorsManager.whiteColors, borderRadius: 9, child: Text( 'Reset', @@ -227,7 +239,8 @@ class AccessManagementPage extends StatelessWidget { }); }, borderRadius: 8, - child: const Text('+ Create Visitor Password ')), + child: const Text( + '+ Create Visitor Password ')), ), const SizedBox( width: 10, @@ -237,7 +250,8 @@ class AccessManagementPage extends StatelessWidget { decoration: containerDecoration, child: DefaultButton( borderRadius: 8, - backgroundColor: ColorsManager.whiteColors, + backgroundColor: + ColorsManager.whiteColors, child: Text( 'Admin Password', style: Theme.of(context) diff --git a/lib/pages/common/custom_table.dart b/lib/pages/common/custom_table.dart index fdeff6b6..76ec2613 100644 --- a/lib/pages/common/custom_table.dart +++ b/lib/pages/common/custom_table.dart @@ -65,11 +65,14 @@ class _DynamicTableState extends State { child: Column( children: [ Container( - decoration: widget.headerDecoration ?? BoxDecoration(color: Colors.grey[200]), + decoration: widget.headerDecoration ?? + BoxDecoration(color: Colors.grey[200]), child: Row( children: [ if (widget.withCheckBox) _buildSelectAllCheckbox(), - ...widget.headers.map((header) => _buildTableHeaderCell(header)).toList(), + ...widget.headers + .map((header) => _buildTableHeaderCell(header)) + .toList(), ], ), ), @@ -93,7 +96,8 @@ class _DynamicTableState extends State { style: Theme.of(context) .textTheme .bodySmall! - .copyWith(color: ColorsManager.grayColor), + .copyWith( + color: ColorsManager.grayColor), ) ], ), @@ -113,10 +117,12 @@ class _DynamicTableState extends State { return Row( children: [ if (widget.withCheckBox) - _buildRowCheckbox(index, widget.size.height * 0.10), + _buildRowCheckbox( + index, widget.size.height * 0.10), ...row - .map((cell) => - _buildTableCell(cell.toString(), widget.size.height * 0.10)) + .map((cell) => _buildTableCell( + cell.toString(), + widget.size.height * 0.10)) .toList(), ], ); @@ -222,7 +228,7 @@ class _DynamicTableState extends State { statusColor = ColorsManager.red; break; default: - statusColor = Colors.black; // Default color + statusColor = Colors.black; } return Expanded( @@ -241,9 +247,11 @@ class _DynamicTableState extends State { child: Text( content, style: TextStyle( - color: batteryLevel != null && batteryLevel < 20 + color: (batteryLevel != null && batteryLevel < 20) ? ColorsManager.red - : statusColor, // Use the passed color or default to black + : (batteryLevel != null && batteryLevel > 20) + ? ColorsManager.green + : statusColor, fontSize: 10, fontWeight: FontWeight.w400), ), diff --git a/lib/pages/device_managment/ac/view/control_list/current_temp.dart b/lib/pages/device_managment/ac/view/control_list/current_temp.dart index fc00479b..2cf35228 100644 --- a/lib/pages/device_managment/ac/view/control_list/current_temp.dart +++ b/lib/pages/device_managment/ac/view/control_list/current_temp.dart @@ -116,16 +116,20 @@ class _CurrentTempState extends State { description: '°C', descriptionColor: ColorsManager.dialogBlueTitle, onIncrement: () { - setState(() { - _adjustedValue++; - }); - _onValueChanged(_adjustedValue); + if (_adjustedValue < 30) { + setState(() { + _adjustedValue++; + }); + _onValueChanged(_adjustedValue); + } }, onDecrement: () { - setState(() { - _adjustedValue--; - }); - _onValueChanged(_adjustedValue); + if (_adjustedValue > 20) { + setState(() { + _adjustedValue--; + }); + _onValueChanged(_adjustedValue); + } }), ], ), 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 edb02cb9..6ac40419 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 @@ -150,13 +150,14 @@ class DeviceManagementBloc false); return matchesCommunity && matchesUnit && matchesProductName; }).toList(); - + _selectedDevices = []; emit(DeviceManagementFiltered( filteredDevices: filteredDevices, - selectedIndex: _selectedIndex, + selectedIndex: 0, onlineCount: _onlineCount, offlineCount: _offlineCount, lowBatteryCount: _lowBatteryCount, + selectedDevice: null, )); } } diff --git a/lib/pages/device_managment/all_devices/view/device_managment_page.dart b/lib/pages/device_managment/all_devices/view/device_managment_page.dart index c56a661f..bc01871a 100644 --- a/lib/pages/device_managment/all_devices/view/device_managment_page.dart +++ b/lib/pages/device_managment/all_devices/view/device_managment_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/bloc/device_managment_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/widgets/device_managment_body.dart'; +import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.dart'; import 'package:syncrow_web/web_layout/web_scaffold.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; @@ -17,6 +18,9 @@ class DeviceManagementPage extends StatelessWidget with HelperResponsiveLayout { 'Device Management', style: Theme.of(context).textTheme.headlineLarge, ), + appBarBody: const [ + NavigateHomeGridView(), + ], enableMenuSideba: isLargeScreenSize(context), scaffoldBody: BlocBuilder( builder: (context, state) { 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 3fb8b300..383d6685 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 @@ -45,7 +45,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { } final tabs = [ - 'All (${devices.length})', + 'All', 'Online ($onlineCount)', 'Offline ($offlineCount)', 'Low Battery ($lowBatteryCount)', @@ -144,7 +144,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { device.room?.name ?? '', device.batteryLevel != null ? '${device.batteryLevel}%' - : '', + : '-', formatDateTime(DateTime.fromMillisecondsSinceEpoch( (device.createTime ?? 0) * 1000)), device.online == true ? 'Online' : 'Offline', diff --git a/lib/pages/device_managment/all_devices/widgets/device_search_filters.dart b/lib/pages/device_managment/all_devices/widgets/device_search_filters.dart index 7af6293e..e2d43b1a 100644 --- a/lib/pages/device_managment/all_devices/widgets/device_search_filters.dart +++ b/lib/pages/device_managment/all_devices/widgets/device_search_filters.dart @@ -28,7 +28,7 @@ class _DeviceSearchFiltersState extends State @override Widget build(BuildContext context) { - return isLargeScreenSize(context) + return isExtraLargeScreenSize(context) ? Row( children: [ _buildSearchField("Community", communityController, 200), diff --git a/lib/pages/device_managment/shared/navigate_home_grid_view.dart b/lib/pages/device_managment/shared/navigate_home_grid_view.dart new file mode 100644 index 00000000..7969e2b0 --- /dev/null +++ b/lib/pages/device_managment/shared/navigate_home_grid_view.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/constants/routes_const.dart'; + +class NavigateHomeGridView extends StatelessWidget { + const NavigateHomeGridView({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + InkWell( + onTap: () { + context.go(RoutesConst.home); + }, + child: SvgPicture.asset( + height: 20, + width: 20, + Assets.grid, + ), + ), + const SizedBox( + width: 10, + ) + ], + ); + } +} diff --git a/lib/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart b/lib/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart index d64a5144..ba11583c 100644 --- a/lib/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart +++ b/lib/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart @@ -2,15 +2,20 @@ import 'package:flutter/material.dart'; mixin HelperResponsiveLayout { bool isSmallScreenSize(BuildContext context) { - return MediaQuery.of(context).size.width < 700; + return MediaQuery.of(context).size.width < 600; } bool isMediumScreenSize(BuildContext context) { - return MediaQuery.of(context).size.width >= 700 && - MediaQuery.of(context).size.width < 1400; + return MediaQuery.of(context).size.width >= 600 && + MediaQuery.of(context).size.width < 1024; } bool isLargeScreenSize(BuildContext context) { - return MediaQuery.of(context).size.width >= 1400; + return MediaQuery.of(context).size.width >= 1024 && + MediaQuery.of(context).size.width < 1440; + } + + bool isExtraLargeScreenSize(BuildContext context) { + return MediaQuery.of(context).size.width >= 1440; } }