fixes bugs and re add checkboxes theme

This commit is contained in:
ashrafzarkanisala
2024-08-29 12:55:37 +03:00
parent 5f8957c9c1
commit 95b1e2c932
15 changed files with 133 additions and 45 deletions

View File

@ -1 +0,0 @@

View File

@ -15,7 +15,8 @@ Future<void> main() async {
initialSetup();
String checkToken = await AuthBloc.getTokenAndValidate();
GoRouter router = GoRouter(
initialLocation: checkToken == 'Success' ? RoutesConst.home : RoutesConst.auth,
initialLocation:
checkToken == 'Success' ? RoutesConst.home : RoutesConst.auth,
routes: AppRoutes.getRoutes(),
);
runApp(MyApp(
@ -54,7 +55,9 @@ class MyApp extends StatelessWidget {
fontFamily: 'Aftika',
textTheme: const TextTheme(
bodySmall: TextStyle(
fontSize: 13, color: ColorsManager.whiteColors, fontWeight: FontWeight.bold),
fontSize: 13,
color: ColorsManager.whiteColors,
fontWeight: FontWeight.bold),
bodyMedium: TextStyle(color: Colors.black87, fontSize: 14),
bodyLarge: TextStyle(fontSize: 16, color: Colors.white),
headlineSmall: TextStyle(color: Colors.black87, fontSize: 18),
@ -65,7 +68,40 @@ class MyApp extends StatelessWidget {
fontWeight: FontWeight.bold,
),
),
colorScheme: ColorScheme.fromSeed(
seedColor: ColorsManager.blueColor,
primary: ColorsManager.blueColor,
onSurface: Colors.grey.shade400,
),
switchTheme: SwitchThemeData(
thumbColor: WidgetStateProperty.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return ColorsManager.blueColor;
}
return ColorsManager.whiteColors;
}),
trackColor: WidgetStateProperty.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return ColorsManager.blueColor.withOpacity(0.5);
}
return ColorsManager.whiteColors;
}),
),
checkboxTheme: CheckboxThemeData(
fillColor: WidgetStateProperty.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return ColorsManager.blueColor;
}
return Colors.grey.shade200;
}),
checkColor: WidgetStateProperty.all(Colors.white),
side: const BorderSide(color: ColorsManager.whiteColors),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4),
),
),
),
routeInformationProvider: router.routeInformationProvider,
routerDelegate: router.routerDelegate,
routeInformationParser: router.routeInformationParser,

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:syncrow_web/core/extension/build_context_x.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart';
class StatefulTextField extends StatefulWidget {
const StatefulTextField({

View File

@ -18,6 +18,7 @@ class AcDeviceControl extends StatelessWidget with HelperResponsiveLayout {
@override
Widget build(BuildContext context) {
final isExtraLarge = isExtraLargeScreenSize(context);
final isLarge = isLargeScreenSize(context);
final isMedium = isMediumScreenSize(context);
return BlocProvider(
@ -31,7 +32,7 @@ class AcDeviceControl extends StatelessWidget with HelperResponsiveLayout {
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: isLarge
crossAxisCount: isLarge || isExtraLarge
? 3
: isMedium
? 2
@ -74,7 +75,7 @@ class AcDeviceControl extends StatelessWidget with HelperResponsiveLayout {
} else if (state is AcsLoadingState) {
return const Center(child: CircularProgressIndicator());
} else {
return const Center(child: Text('Error fetching status'));
return const Center(child: Text('Error fetching status'));
}
},
),

View File

@ -36,7 +36,7 @@ class DeviceManagementPage extends StatelessWidget with HelperResponsiveLayout {
return DeviceManagementBody(devices: devices);
} else {
return const Center(child: Text('No Devices Found'));
return const Center(child: Text('Error fetching Devices'));
}
},
),

View File

@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/core/extension/build_context_x.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart';
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/filter/filter_widget.dart';

View File

@ -10,6 +10,7 @@ class CeilingSensorModel {
String bodyMovement;
String noBodyTime;
int maxDistance;
String spaceType;
CeilingSensorModel({
required this.presenceState,
@ -20,6 +21,7 @@ class CeilingSensorModel {
required this.bodyMovement,
required this.noBodyTime,
required this.maxDistance,
required this.spaceType,
});
factory CeilingSensorModel.fromJson(List<Status> jsonList) {
@ -31,6 +33,7 @@ class CeilingSensorModel {
String _bodyMovement = 'none';
String _noBodyTime = 'none';
int _maxDis = 0;
String _spaceType = 'none';
try {
for (var status in jsonList) {
@ -38,17 +41,26 @@ class CeilingSensorModel {
case 'presence_state':
_presenceState = status.value ?? 'none';
break;
case 'scene':
_spaceType = status.value ?? 'none';
break;
case 'sensitivity':
_sensitivity = status.value is int ? status.value : int.tryParse(status.value ?? '1') ?? 1;
_sensitivity = status.value is int
? status.value
: int.tryParse(status.value ?? '1') ?? 1;
break;
case 'checking_result':
_checkingResult = status.value ?? '';
break;
case 'presence_range':
_presenceRange = status.value is int ? status.value : int.tryParse(status.value ?? '0') ?? 0;
_presenceRange = status.value is int
? status.value
: int.tryParse(status.value ?? '0') ?? 0;
break;
case 'sports_para':
_sportsPara = status.value is int ? status.value : int.tryParse(status.value ?? '0') ?? 0;
_sportsPara = status.value is int
? status.value
: int.tryParse(status.value ?? '0') ?? 0;
break;
case 'body_movement':
_bodyMovement = status.value ?? '';
@ -57,7 +69,9 @@ class CeilingSensorModel {
_noBodyTime = status.value ?? 'none';
break;
case 'moving_max_dis':
_maxDis = status.value is int ? status.value : int.tryParse(status.value ?? '0') ?? 0;
_maxDis = status.value is int
? status.value
: int.tryParse(status.value ?? '0') ?? 0;
break;
}
}
@ -74,6 +88,7 @@ class CeilingSensorModel {
bodyMovement: _bodyMovement,
noBodyTime: _noBodyTime,
maxDistance: _maxDis,
spaceType: _spaceType,
);
}
}

View File

@ -24,6 +24,7 @@ class CeilingSensorControls extends StatelessWidget
@override
Widget build(BuildContext context) {
final isExtraLarge = isExtraLargeScreenSize(context);
final isLarge = isLargeScreenSize(context);
final isMedium = isMediumScreenSize(context);
return BlocProvider(
@ -35,8 +36,8 @@ class CeilingSensorControls extends StatelessWidget
state is CeilingReportsLoadingState) {
return const Center(child: CircularProgressIndicator());
} else if (state is CeilingUpdateState) {
return _buildGridView(
context, state.ceilingSensorModel, isLarge, isMedium);
return _buildGridView(context, state.ceilingSensorModel,
isExtraLarge, isLarge, isMedium);
} else if (state is CeilingReportsState) {
return ReportsTable(
report: state.deviceReport,
@ -58,7 +59,8 @@ class CeilingSensorControls extends StatelessWidget
);
} else if (state is CeilingReportsFailedState) {
final model = context.read<CeilingSensorBloc>().deviceStatus;
return _buildGridView(context, model, isLarge, isMedium);
return _buildGridView(
context, model, isExtraLarge, isLarge, isMedium);
}
return const Center(child: Text('Error fetching status'));
},
@ -67,13 +69,13 @@ class CeilingSensorControls extends StatelessWidget
}
Widget _buildGridView(BuildContext context, CeilingSensorModel model,
bool isLarge, bool isMedium) {
bool isExtraLarge, bool isLarge, bool isMedium) {
return GridView(
padding: const EdgeInsets.symmetric(horizontal: 50),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: isLarge
crossAxisCount: isLarge || isExtraLarge
? 3
: isMedium
? 2
@ -96,8 +98,8 @@ class CeilingSensorControls extends StatelessWidget
postfix: 'm',
description: 'Detection Range',
),
const PresenceSpaceType(
listOfIcons: [
PresenceSpaceType(
listOfIcons: const [
Assets.office,
Assets.parlour,
Assets.dyi,
@ -105,6 +107,7 @@ class CeilingSensorControls extends StatelessWidget
Assets.bedroom,
],
description: 'Space Type',
value: model.spaceType,
),
PresenceUpdateData(
value: model.sensitivity.toDouble(),
@ -138,7 +141,7 @@ class CeilingSensorControls extends StatelessWidget
PresenceNoBodyTime(
value: model.noBodyTime,
title: 'Nobody Time:',
// description: 'hr',
description: '',
action: (String value) => context.read<CeilingSensorBloc>().add(
CeilingChangeValueEvent(
code: 'nobody_time',

View File

@ -34,9 +34,9 @@ class DoorLockView extends StatelessWidget {
} else if (state is UpdateState) {
return _buildStatusControls(context, state.smartDoorModel);
} else if (state is DoorLockControlError) {
return Center(child: Text(state.message));
return const SizedBox();
} else {
return const Center(child: CircularProgressIndicator());
return const Center(child: Text('Error fetching status'));
}
},
),

View File

@ -14,6 +14,7 @@ class GateWayControls extends StatelessWidget with HelperResponsiveLayout {
@override
Widget build(BuildContext context) {
final isExtraLarge = isExtraLargeScreenSize(context);
final isLarge = isLargeScreenSize(context);
final isMedium = isMediumScreenSize(context);
@ -29,7 +30,7 @@ class GateWayControls extends StatelessWidget with HelperResponsiveLayout {
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: isLarge
crossAxisCount: isLarge || isExtraLarge
? 3
: isMedium
? 2
@ -45,7 +46,7 @@ class GateWayControls extends StatelessWidget with HelperResponsiveLayout {
},
);
} else {
return const Center(child: Text('Error fetching devices'));
return const Center(child: Text('Error fetching status'));
}
},
),

View File

@ -24,7 +24,7 @@ class LivingRoomDeviceControl extends StatelessWidget
return _buildStatusControls(context, state.status);
} else if (state is LivingRoomDeviceManagementError ||
state is LivingRoomControlError) {
return Center(child: Text(state.toString()));
return const Center(child: Text('Error fetching status'));
} else {
return const Center(child: CircularProgressIndicator());
}
@ -35,6 +35,7 @@ class LivingRoomDeviceControl extends StatelessWidget
Widget _buildStatusControls(
BuildContext context, LivingRoomStatusModel status) {
final isExtraLarge = isExtraLargeScreenSize(context);
final isLarge = isLargeScreenSize(context);
final isMedium = isMediumScreenSize(context);
return GridView(
@ -42,7 +43,7 @@ class LivingRoomDeviceControl extends StatelessWidget
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: isLarge
crossAxisCount: isLarge || isExtraLarge
? 3
: isMedium
? 2

View File

@ -1,7 +1,7 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:syncrow_web/core/extension/build_context_x.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';

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_web/core/extension/build_context_x.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart';
import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart';
import 'package:syncrow_web/utils/color_manager.dart';
@ -9,10 +10,12 @@ class PresenceSpaceType extends StatelessWidget {
super.key,
required this.listOfIcons,
required this.description,
required this.value,
});
final List<String> listOfIcons;
final String description;
final String value;
@override
Widget build(BuildContext context) {
@ -36,10 +39,20 @@ class PresenceSpaceType extends StatelessWidget {
runSpacing: 8,
spacing: 16,
children: [
...listOfIcons.map((icon) => SvgPicture.asset(
icon,
width: 40,
height: 40,
...listOfIcons.map((icon) => Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(100),
border: Border.all(
color: icon.contains(value)
? ColorsManager.blueColor
: Colors.transparent,
),
),
child: SvgPicture.asset(
icon,
width: 40,
height: 40,
),
)),
],
),

View File

@ -23,6 +23,8 @@ class PresenceNoBodyTime extends StatefulWidget {
class _PresenceUpdateDataState extends State<PresenceNoBodyTime> {
late String _currentValue;
late String _numericValue;
late String _unit;
final List<String> nobodyTimeRange = [
'none',
@ -40,29 +42,45 @@ class _PresenceUpdateDataState extends State<PresenceNoBodyTime> {
void initState() {
super.initState();
_currentValue = widget.value;
_numericValue = _extractNumericValue(_currentValue);
_unit = _extractUnit(_currentValue);
}
String _extractNumericValue(String value) {
if (value == 'none') return '0';
return value.replaceAll(RegExp(r'[a-zA-Z]'), '').trim();
}
String _extractUnit(String value) {
if (value == 'none') return '';
if (value.endsWith('s')) return 's';
if (value.endsWith('min')) return 'min';
if (value.endsWith('hour')) return 'hr';
return '';
}
void _onValueChanged(String newValue) {
setState(() {
_currentValue = newValue;
_numericValue = _extractNumericValue(newValue);
_unit = _extractUnit(newValue);
});
widget.action(newValue);
}
void _incrementValue() {
int currentIndex = nobodyTimeRange.indexOf(_currentValue);
if (currentIndex < nobodyTimeRange.length - 1) {
setState(() {
_currentValue = nobodyTimeRange[currentIndex + 1];
});
_onValueChanged(_currentValue);
String newValue = nobodyTimeRange[currentIndex + 1];
_onValueChanged(newValue);
}
}
void _decrementValue() {
int currentIndex = nobodyTimeRange.indexOf(_currentValue);
if (currentIndex > 0) {
setState(() {
_currentValue = nobodyTimeRange[currentIndex - 1];
});
_onValueChanged(_currentValue);
String newValue = nobodyTimeRange[currentIndex - 1];
_onValueChanged(newValue);
}
}
@ -81,11 +99,12 @@ class _PresenceUpdateDataState extends State<PresenceNoBodyTime> {
fontSize: 10),
),
IncrementDecrementWidget(
value: _currentValue,
description: widget.description ?? '',
descriptionColor: ColorsManager.blackColor,
onIncrement: _incrementValue,
onDecrement: _decrementValue),
value: _numericValue,
description: _unit,
descriptionColor: ColorsManager.blackColor,
onIncrement: _incrementValue,
onDecrement: _decrementValue,
),
],
),
);