push fixes

This commit is contained in:
ashrafzarkanisala
2024-08-28 20:52:09 +03:00
parent cfc8d4cf2f
commit adf19818e7
9 changed files with 140 additions and 71 deletions

View File

@ -1,7 +1,5 @@
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: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_bloc.dart';
import 'package:syncrow_web/pages/access_management/bloc/access_event.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_event.dart';
import 'package:syncrow_web/pages/access_management/bloc/access_state.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/custom_table.dart';
import 'package:syncrow_web/pages/common/date_time_widget.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/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/pages/visitor_password/view/visitor_password_dialog.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/constants/assets.dart';
import 'package:syncrow_web/utils/constants/app_enum.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/utils/style.dart';
import 'package:syncrow_web/web_layout/web_scaffold.dart'; import 'package:syncrow_web/web_layout/web_scaffold.dart';
@ -38,30 +36,18 @@ class AccessManagementPage extends StatelessWidget {
children: [ children: [
Text( Text(
'Physical Access', 'Physical Access',
style: Theme.of(context).textTheme.headlineMedium!.copyWith(color: Colors.white), style: Theme.of(context)
), .textTheme
Row( .headlineMedium!
children: [ .copyWith(color: Colors.white),
InkWell(
onTap: () {
context.go(RoutesConst.home);
},
child: SvgPicture.asset(
height: 20,
width: 20,
Assets.grid,
),
),
const SizedBox(
width: 10,
)
],
), ),
const NavigateHomeGridView(),
], ],
), ),
], ],
scaffoldBody: BlocProvider( scaffoldBody: BlocProvider(
create: (BuildContext context) => AccessBloc()..add(FetchTableData()), create: (BuildContext context) =>
AccessBloc()..add(FetchTableData()),
child: BlocConsumer<AccessBloc, AccessState>( child: BlocConsumer<AccessBloc, AccessState>(
listener: (context, state) {}, listener: (context, state) {},
builder: (context, state) { builder: (context, state) {
@ -82,11 +68,15 @@ class AccessManagementPage extends StatelessWidget {
child: Flexible( child: Flexible(
child: ListView.builder( child: ListView.builder(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
itemCount: BlocProvider.of<AccessBloc>(context).tabs.length, itemCount:
BlocProvider.of<AccessBloc>(context)
.tabs
.length,
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final isSelected = index == final isSelected = index ==
BlocProvider.of<AccessBloc>(context).selectedIndex; BlocProvider.of<AccessBloc>(context)
.selectedIndex;
return InkWell( return InkWell(
onTap: () { onTap: () {
BlocProvider.of<AccessBloc>(context) BlocProvider.of<AccessBloc>(context)
@ -96,25 +86,36 @@ class AccessManagementPage extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
color: ColorsManager.boxColor, color: ColorsManager.boxColor,
border: Border.all( border: Border.all(
color: isSelected ? Colors.blue : Colors.transparent, color: isSelected
? Colors.blue
: Colors.transparent,
width: 2.0, width: 2.0,
), ),
borderRadius: index == 0 borderRadius: index == 0
? const BorderRadius.only( ? const BorderRadius.only(
topLeft: Radius.circular(10), topLeft:
bottomLeft: Radius.circular(10)) Radius.circular(10),
bottomLeft:
Radius.circular(10))
: index == 3 : index == 3
? const BorderRadius.only( ? const BorderRadius.only(
topRight: Radius.circular(10), topRight:
bottomRight: Radius.circular(10)) Radius.circular(10),
bottomRight:
Radius.circular(10))
: null, : null,
), ),
padding: const EdgeInsets.only(left: 10, right: 10), padding: const EdgeInsets.only(
left: 10, right: 10),
child: Center( child: Center(
child: Text( child: Text(
BlocProvider.of<AccessBloc>(context).tabs[index], BlocProvider.of<AccessBloc>(
context)
.tabs[index],
style: TextStyle( 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', title: 'Access Time',
size: size, size: size,
endTime: () { endTime: () {
accessBloc.add(SelectTime(context: context, isStart: false)); accessBloc.add(SelectTime(
context: context, isStart: false));
}, },
startTime: () { startTime: () {
accessBloc.add(SelectTime(context: context, isStart: true)); accessBloc.add(SelectTime(
context: context, isStart: true));
}, },
firstString: BlocProvider.of<AccessBloc>(context).startTime, firstString:
secondString: BlocProvider.of<AccessBloc>(context).endTime, BlocProvider.of<AccessBloc>(context)
.startTime,
secondString:
BlocProvider.of<AccessBloc>(context)
.endTime,
), ),
const SizedBox( const SizedBox(
width: 15, width: 15,
@ -168,13 +175,17 @@ class AccessManagementPage extends StatelessWidget {
child: DefaultButton( child: DefaultButton(
onPressed: () { onPressed: () {
accessBloc.add(FilterDataEvent( accessBloc.add(FilterDataEvent(
selectedTabIndex: BlocProvider.of<AccessBloc>( selectedTabIndex: BlocProvider
context) .of<AccessBloc>(
context)
.selectedIndex, // Pass the selected tab index .selectedIndex, // Pass the selected tab index
passwordName: passwordName: accessBloc
accessBloc.passwordName.text.toLowerCase(), .passwordName.text
startTime: accessBloc.effectiveTimeTimeStamp, .toLowerCase(),
endTime: accessBloc.expirationTimeTimeStamp)); startTime: accessBloc
.effectiveTimeTimeStamp,
endTime: accessBloc
.expirationTimeTimeStamp));
}, },
borderRadius: 9, borderRadius: 9,
child: const Text('Search'))), child: const Text('Search'))),
@ -190,7 +201,8 @@ class AccessManagementPage extends StatelessWidget {
onPressed: () { onPressed: () {
accessBloc.add(ResetSearch()); accessBloc.add(ResetSearch());
}, },
backgroundColor: ColorsManager.whiteColors, backgroundColor:
ColorsManager.whiteColors,
borderRadius: 9, borderRadius: 9,
child: Text( child: Text(
'Reset', 'Reset',
@ -227,7 +239,8 @@ class AccessManagementPage extends StatelessWidget {
}); });
}, },
borderRadius: 8, borderRadius: 8,
child: const Text('+ Create Visitor Password ')), child: const Text(
'+ Create Visitor Password ')),
), ),
const SizedBox( const SizedBox(
width: 10, width: 10,
@ -237,7 +250,8 @@ class AccessManagementPage extends StatelessWidget {
decoration: containerDecoration, decoration: containerDecoration,
child: DefaultButton( child: DefaultButton(
borderRadius: 8, borderRadius: 8,
backgroundColor: ColorsManager.whiteColors, backgroundColor:
ColorsManager.whiteColors,
child: Text( child: Text(
'Admin Password', 'Admin Password',
style: Theme.of(context) style: Theme.of(context)

View File

@ -65,11 +65,14 @@ class _DynamicTableState extends State<DynamicTable> {
child: Column( child: Column(
children: [ children: [
Container( Container(
decoration: widget.headerDecoration ?? BoxDecoration(color: Colors.grey[200]), decoration: widget.headerDecoration ??
BoxDecoration(color: Colors.grey[200]),
child: Row( child: Row(
children: [ children: [
if (widget.withCheckBox) _buildSelectAllCheckbox(), 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<DynamicTable> {
style: Theme.of(context) style: Theme.of(context)
.textTheme .textTheme
.bodySmall! .bodySmall!
.copyWith(color: ColorsManager.grayColor), .copyWith(
color: ColorsManager.grayColor),
) )
], ],
), ),
@ -113,10 +117,12 @@ class _DynamicTableState extends State<DynamicTable> {
return Row( return Row(
children: [ children: [
if (widget.withCheckBox) if (widget.withCheckBox)
_buildRowCheckbox(index, widget.size.height * 0.10), _buildRowCheckbox(
index, widget.size.height * 0.10),
...row ...row
.map((cell) => .map((cell) => _buildTableCell(
_buildTableCell(cell.toString(), widget.size.height * 0.10)) cell.toString(),
widget.size.height * 0.10))
.toList(), .toList(),
], ],
); );
@ -222,7 +228,7 @@ class _DynamicTableState extends State<DynamicTable> {
statusColor = ColorsManager.red; statusColor = ColorsManager.red;
break; break;
default: default:
statusColor = Colors.black; // Default color statusColor = Colors.black;
} }
return Expanded( return Expanded(
@ -241,9 +247,11 @@ class _DynamicTableState extends State<DynamicTable> {
child: Text( child: Text(
content, content,
style: TextStyle( style: TextStyle(
color: batteryLevel != null && batteryLevel < 20 color: (batteryLevel != null && batteryLevel < 20)
? ColorsManager.red ? ColorsManager.red
: statusColor, // Use the passed color or default to black : (batteryLevel != null && batteryLevel > 20)
? ColorsManager.green
: statusColor,
fontSize: 10, fontSize: 10,
fontWeight: FontWeight.w400), fontWeight: FontWeight.w400),
), ),

View File

@ -116,16 +116,20 @@ class _CurrentTempState extends State<CurrentTemp> {
description: '°C', description: '°C',
descriptionColor: ColorsManager.dialogBlueTitle, descriptionColor: ColorsManager.dialogBlueTitle,
onIncrement: () { onIncrement: () {
setState(() { if (_adjustedValue < 30) {
_adjustedValue++; setState(() {
}); _adjustedValue++;
_onValueChanged(_adjustedValue); });
_onValueChanged(_adjustedValue);
}
}, },
onDecrement: () { onDecrement: () {
setState(() { if (_adjustedValue > 20) {
_adjustedValue--; setState(() {
}); _adjustedValue--;
_onValueChanged(_adjustedValue); });
_onValueChanged(_adjustedValue);
}
}), }),
], ],
), ),

View File

@ -150,13 +150,14 @@ class DeviceManagementBloc
false); false);
return matchesCommunity && matchesUnit && matchesProductName; return matchesCommunity && matchesUnit && matchesProductName;
}).toList(); }).toList();
_selectedDevices = [];
emit(DeviceManagementFiltered( emit(DeviceManagementFiltered(
filteredDevices: filteredDevices, filteredDevices: filteredDevices,
selectedIndex: _selectedIndex, selectedIndex: 0,
onlineCount: _onlineCount, onlineCount: _onlineCount,
offlineCount: _offlineCount, offlineCount: _offlineCount,
lowBatteryCount: _lowBatteryCount, lowBatteryCount: _lowBatteryCount,
selectedDevice: null,
)); ));
} }
} }

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.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/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/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/web_layout/web_scaffold.dart';
import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.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', 'Device Management',
style: Theme.of(context).textTheme.headlineLarge, style: Theme.of(context).textTheme.headlineLarge,
), ),
appBarBody: const [
NavigateHomeGridView(),
],
enableMenuSideba: isLargeScreenSize(context), enableMenuSideba: isLargeScreenSize(context),
scaffoldBody: BlocBuilder<DeviceManagementBloc, DeviceManagementState>( scaffoldBody: BlocBuilder<DeviceManagementBloc, DeviceManagementState>(
builder: (context, state) { builder: (context, state) {

View File

@ -45,7 +45,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
} }
final tabs = [ final tabs = [
'All (${devices.length})', 'All',
'Online ($onlineCount)', 'Online ($onlineCount)',
'Offline ($offlineCount)', 'Offline ($offlineCount)',
'Low Battery ($lowBatteryCount)', 'Low Battery ($lowBatteryCount)',
@ -144,7 +144,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout {
device.room?.name ?? '', device.room?.name ?? '',
device.batteryLevel != null device.batteryLevel != null
? '${device.batteryLevel}%' ? '${device.batteryLevel}%'
: '', : '-',
formatDateTime(DateTime.fromMillisecondsSinceEpoch( formatDateTime(DateTime.fromMillisecondsSinceEpoch(
(device.createTime ?? 0) * 1000)), (device.createTime ?? 0) * 1000)),
device.online == true ? 'Online' : 'Offline', device.online == true ? 'Online' : 'Offline',

View File

@ -28,7 +28,7 @@ class _DeviceSearchFiltersState extends State<DeviceSearchFilters>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return isLargeScreenSize(context) return isExtraLargeScreenSize(context)
? Row( ? Row(
children: [ children: [
_buildSearchField("Community", communityController, 200), _buildSearchField("Community", communityController, 200),

View File

@ -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,
)
],
);
}
}

View File

@ -2,15 +2,20 @@ import 'package:flutter/material.dart';
mixin HelperResponsiveLayout { mixin HelperResponsiveLayout {
bool isSmallScreenSize(BuildContext context) { bool isSmallScreenSize(BuildContext context) {
return MediaQuery.of(context).size.width < 700; return MediaQuery.of(context).size.width < 600;
} }
bool isMediumScreenSize(BuildContext context) { bool isMediumScreenSize(BuildContext context) {
return MediaQuery.of(context).size.width >= 700 && return MediaQuery.of(context).size.width >= 600 &&
MediaQuery.of(context).size.width < 1400; MediaQuery.of(context).size.width < 1024;
} }
bool isLargeScreenSize(BuildContext context) { 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;
} }
} }