From 6d612398ed96f09d02e5ca79aea864163122f0bd Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Wed, 9 Apr 2025 16:41:03 +0300 Subject: [PATCH] Update operation names in CpsFunctions and add toggle codes to CeilingSensorHelper --- assets/icons/communication_fault.svg | 22 +++ .../ceiling_presence_sensor_functions.dart | 55 +++---- .../ceiling_sensor/ceiling_sensor_dialog.dart | 151 +++++++++++++++++- .../ceiling_sensor/ceiling_sensor_helper.dart | 11 ++ 4 files changed, 205 insertions(+), 34 deletions(-) create mode 100644 assets/icons/communication_fault.svg diff --git a/assets/icons/communication_fault.svg b/assets/icons/communication_fault.svg new file mode 100644 index 00000000..e2ab1b40 --- /dev/null +++ b/assets/icons/communication_fault.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/pages/routines/models/ceiling_presence_sensor_functions.dart b/lib/pages/routines/models/ceiling_presence_sensor_functions.dart index 5bd15e66..4aa2e650 100644 --- a/lib/pages/routines/models/ceiling_presence_sensor_functions.dart +++ b/lib/pages/routines/models/ceiling_presence_sensor_functions.dart @@ -90,8 +90,8 @@ final class CpsSensitivityFunction extends CpsFunctions { step = 1, scale = 0, super( - code: 'far_detection', - operationName: 'Far Detection', + code: 'sensitivity', + operationName: 'Sensitivity', icon: Assets.sensitivity, ); @@ -123,7 +123,7 @@ final class CpsMovingSpeedFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Moving Speed', icon: Assets.speedoMeter, ); @override @@ -139,7 +139,7 @@ final class CpsSpatialStaticValueFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Spacial Static Value', icon: Assets.spatialStaticValue, ); @override @@ -149,7 +149,6 @@ final class CpsSpatialStaticValueFunction extends CpsFunctions { } } - final class CpsSpatialMotionValueFunction extends CpsFunctions { CpsSpatialMotionValueFunction({ required super.deviceId, @@ -157,7 +156,7 @@ final class CpsSpatialMotionValueFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Spatial Motion Value', icon: Assets.spatialMotionValue, ); @override @@ -167,7 +166,6 @@ final class CpsSpatialMotionValueFunction extends CpsFunctions { } } - final class CpsMaxDistanceOfDetectionFunction extends CpsFunctions { CpsMaxDistanceOfDetectionFunction({ required super.deviceId, @@ -175,7 +173,7 @@ final class CpsMaxDistanceOfDetectionFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Maximum Distance Of Detection', icon: Assets.currentDistanceIcon, ); @override @@ -185,7 +183,6 @@ final class CpsMaxDistanceOfDetectionFunction extends CpsFunctions { } } - final class CpsMaxDistanceOfStaticDetectionFunction extends CpsFunctions { CpsMaxDistanceOfStaticDetectionFunction({ required super.deviceId, @@ -193,7 +190,7 @@ final class CpsMaxDistanceOfStaticDetectionFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Maximum Distance Of Static Detection', icon: Assets.currentDistanceIcon, ); @override @@ -203,7 +200,6 @@ final class CpsMaxDistanceOfStaticDetectionFunction extends CpsFunctions { } } - final class CpsDetectionRangeFunction extends CpsFunctions { CpsDetectionRangeFunction({ required super.deviceId, @@ -211,7 +207,7 @@ final class CpsDetectionRangeFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Detection Range', icon: Assets.farDetection, ); @override @@ -221,7 +217,6 @@ final class CpsDetectionRangeFunction extends CpsFunctions { } } - final class CpsDistanceOfMovingObjectsFunction extends CpsFunctions { CpsDistanceOfMovingObjectsFunction({ required super.deviceId, @@ -229,7 +224,7 @@ final class CpsDistanceOfMovingObjectsFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Distance Of Moving Objects', icon: Assets.currentDistanceIcon, ); @override @@ -239,7 +234,6 @@ final class CpsDistanceOfMovingObjectsFunction extends CpsFunctions { } } - final class CpsPresenceJudgementThrsholdFunction extends CpsFunctions { CpsPresenceJudgementThrsholdFunction({ required super.deviceId, @@ -247,7 +241,7 @@ final class CpsPresenceJudgementThrsholdFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Presence Judgement Threshold', icon: Assets.presenceJudgementThrshold, ); @override @@ -264,7 +258,7 @@ final class CpsMotionAmplitudeTriggerThresholdFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Motion Amplitude Trigger Threshold', icon: Assets.presenceJudgementThrshold, ); @override @@ -274,7 +268,6 @@ final class CpsMotionAmplitudeTriggerThresholdFunction extends CpsFunctions { } } - final class CpsPerpetualBoundaryFunction extends CpsFunctions { CpsPerpetualBoundaryFunction({ required super.deviceId, @@ -282,7 +275,7 @@ final class CpsPerpetualBoundaryFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Perpetual Boundary', icon: Assets.boundary, ); @override @@ -292,9 +285,6 @@ final class CpsPerpetualBoundaryFunction extends CpsFunctions { } } - - - final class CpsMotionTriggerBoundaryFunction extends CpsFunctions { CpsMotionTriggerBoundaryFunction({ required super.deviceId, @@ -302,7 +292,7 @@ final class CpsMotionTriggerBoundaryFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Motion Trigger Boundary', icon: Assets.motionMeter, ); @override @@ -312,7 +302,6 @@ final class CpsMotionTriggerBoundaryFunction extends CpsFunctions { } } - final class CpsMotionTriggerTimeFunction extends CpsFunctions { CpsMotionTriggerTimeFunction({ required super.deviceId, @@ -320,7 +309,7 @@ final class CpsMotionTriggerTimeFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Motion Trigger Time', icon: Assets.motionMeter, ); @override @@ -337,7 +326,7 @@ final class CpsMotionToStaticTimeFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Motion To Static Time', icon: Assets.motionMeter, ); @override @@ -354,7 +343,7 @@ final class CpsEnteringNoBodyStateTimeFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Entering Nobody State Time', icon: Assets.motionMeter, ); @override @@ -364,8 +353,6 @@ final class CpsEnteringNoBodyStateTimeFunction extends CpsFunctions { } } - - final class CpsSelfTestResultFunctions extends CpsFunctions { CpsSelfTestResultFunctions({ required super.deviceId, @@ -404,6 +391,11 @@ final class CpsSelfTestResultFunctions extends CpsFunctions { icon: Assets.communicationFault, value: 'communication_fault', ), + CpsOperationalValue( + description: 'Radar Fault', + icon: Assets.radarFault, + value: 'radar_fault', + ), ]; } } @@ -503,7 +495,6 @@ final class CpsMovementFunctions extends CpsFunctions { } } - final class CpsCustomModeFunction extends CpsFunctions { CpsCustomModeFunction({ required super.deviceId, @@ -624,7 +615,7 @@ final class CpsSportsParaFunction extends CpsFunctions { required super.type, }) : super( code: '', - operationName: '', + operationName: 'Sports Para', icon: Assets.sportsPara, ); @override @@ -632,4 +623,4 @@ final class CpsSportsParaFunction extends CpsFunctions { // TODO: implement getOperationalValues throw UnimplementedError(); } -} \ No newline at end of file +} diff --git a/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_dialog.dart b/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_dialog.dart index 62594d38..0f19f204 100644 --- a/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_dialog.dart +++ b/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_dialog.dart @@ -3,9 +3,13 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; import 'package:syncrow_web/pages/routines/bloc/functions_bloc/functions_bloc_bloc.dart'; import 'package:syncrow_web/pages/routines/bloc/routine_bloc/routine_bloc.dart'; +import 'package:syncrow_web/pages/routines/models/ceiling_presence_sensor_functions.dart'; import 'package:syncrow_web/pages/routines/models/device_functions.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart'; import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart'; +import 'package:syncrow_web/pages/routines/widgets/routine_dialog_function_list_tile.dart'; +import 'package:syncrow_web/pages/routines/widgets/routine_dialog_selection_list_tile.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; class CeilingSensorDialog extends StatefulWidget { const CeilingSensorDialog({ @@ -27,6 +31,20 @@ class CeilingSensorDialog extends StatefulWidget { } class _CeilingSensorDialogState extends State { + late final List _cpsFunctions; + + @override + void initState() { + super.initState(); + + _cpsFunctions = widget.functions.whereType().where((function) { + if (widget.dialogType == 'THEN') { + return function.type == 'THEN' || function.type == 'BOTH'; + } + return function.type == 'IF' || function.type == 'BOTH'; + }).toList(); + } + @override Widget build(BuildContext context) { return AlertDialog( @@ -56,17 +74,20 @@ class _CeilingSensorDialogState extends State { mainAxisSize: MainAxisSize.min, children: [ const DialogHeader('Presence Sensor Condition'), + Expanded(child: _buildMainContent(context, state)), DialogFooter( onCancel: () => Navigator.pop(context), onConfirm: state.addedFunctions.isNotEmpty ? () { context.read().add( AddFunctionToRoutine( - state.addedFunctions, '{uniqueCustomId}'), + state.addedFunctions, + '${widget.uniqueCustomId}', + ), ); Navigator.pop(context, { - // 'deviceId': functions.first.deviceId, + 'deviceId': widget.functions.first.deviceId, }); } : null, @@ -79,4 +100,130 @@ class _CeilingSensorDialogState extends State { ), ); } + + Widget _buildMainContent(BuildContext context, FunctionBlocState state) { + final selectedFunction = state.selectedFunction; + final selectedOperationName = state.selectedOperationName; + final selectedFunctionData = state.addedFunctions.firstWhere( + (f) => f.functionCode == selectedFunction, + orElse: () => DeviceFunctionData( + entityId: '', + functionCode: selectedFunction ?? '', + operationName: '', + value: null, + ), + ); + final selectedCpsFunctions = _cpsFunctions.firstWhere( + (f) => f.code == selectedFunction, + orElse: () => CpsMovementFunctions( + deviceId: '', + deviceName: '', + type: '', + ), + ); + final operations = selectedCpsFunctions.getOperationalValues(); + + return Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + CpsFunctionsList(cpsFunctions: _cpsFunctions), + if (state.selectedFunction != null) + Expanded( + child: CpsDialogValueSelector( + operations: operations, + selectedFunction: selectedFunction ?? '', + selectedFunctionData: selectedFunctionData, + cpsFunctions: _cpsFunctions, + operationName: selectedOperationName ?? '', + device: widget.device, + ), + ), + ], + ); + } +} + +class CpsFunctionsList extends StatelessWidget { + const CpsFunctionsList({required this.cpsFunctions, super.key}); + + final List cpsFunctions; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 360, + child: ListView.separated( + shrinkWrap: false, + itemCount: cpsFunctions.length, + separatorBuilder: (context, index) => const Padding( + padding: EdgeInsets.symmetric(horizontal: 40.0), + child: Divider(color: ColorsManager.dividerColor), + ), + itemBuilder: (context, index) { + final function = cpsFunctions[index]; + return RoutineDialogFunctionListTile( + iconPath: function.icon, + operationName: function.operationName, + onTap: () => context.read().add( + SelectFunction( + functionCode: function.code, + operationName: function.operationName, + ), + ), + ); + }, + ), + ); + } +} + +class CpsDialogValueSelector extends StatelessWidget { + const CpsDialogValueSelector({ + required this.operations, + required this.selectedFunction, + required this.selectedFunctionData, + required this.cpsFunctions, + required this.device, + required this.operationName, + super.key, + }); + + final List operations; + final String selectedFunction; + final DeviceFunctionData? selectedFunctionData; + final List cpsFunctions; + final AllDevicesModel? device; + final String operationName; + + @override + Widget build(BuildContext context) { + return ListView.builder( + itemCount: operations.length, + itemBuilder: (context, index) { + final operation = operations[index]; + final isSelected = selectedFunctionData?.value == operation.value; + return RoutineDialogSelectionListTile( + iconPath: operation.icon, + description: operation.description, + isSelected: isSelected, + onTap: () { + if (!isSelected) { + context.read().add( + AddFunction( + functionData: DeviceFunctionData( + entityId: device?.uuid ?? '', + functionCode: selectedFunction, + operationName: operationName, + value: operation.value, + condition: selectedFunctionData?.condition, + valueDescription: selectedFunctionData?.valueDescription, + ), + ), + ); + } + }, + ); + }, + ); + } } diff --git a/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_helper.dart b/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_helper.dart index 67083504..291c2f81 100644 --- a/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_helper.dart +++ b/lib/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_helper.dart @@ -162,4 +162,15 @@ abstract final class CeilingSensorHelper { ), ]; } + + static const toggleCodes = { + 'radar_switch', + 'space_para_switch', + 'self_test_result', + 'nobody_time', + 'movement', + 'custom_mode', + 'space_type', + 'presence_state', + }; }