diff --git a/lib/pages/spaces_management/space_model/bloc/subspace_model_bloc.dart b/lib/pages/spaces_management/space_model/bloc/subspace_model_bloc.dart index 344d4b95..41c1d76f 100644 --- a/lib/pages/spaces_management/space_model/bloc/subspace_model_bloc.dart +++ b/lib/pages/spaces_management/space_model/bloc/subspace_model_bloc.dart @@ -10,7 +10,7 @@ class SubSpaceModelBloc extends Bloc { on((event, emit) { final updatedSubSpaces = List.from(state.subSpaces) ..add(event.subSpace); - emit(SubSpaceModelState(updatedSubSpaces, [])); + emit(SubSpaceModelState(updatedSubSpaces, state.updatedSubSpaceModels)); }); on((event, emit) { @@ -30,5 +30,25 @@ class SubSpaceModelBloc extends Bloc { emit(SubSpaceModelState(updatedSubSpaces, updatedSubspaceModels)); }); + + on((event, emit) { + final updatedSubSpaces = state.subSpaces.map((subSpace) { + if (subSpace.uuid == event.updatedSubSpace.uuid) { + return event.updatedSubSpace; + } + return subSpace; + }).toList(); + + final updatedSubspaceModels = List.from( + state.updatedSubSpaceModels, + ); + + updatedSubspaceModels.add(UpdateSubspaceTemplateModel( + action: Action.update, + uuid: event.updatedSubSpace.uuid!, + )); + + emit(SubSpaceModelState(updatedSubSpaces, updatedSubspaceModels)); + }); } } diff --git a/lib/pages/spaces_management/space_model/bloc/subspace_model_event.dart b/lib/pages/spaces_management/space_model/bloc/subspace_model_event.dart index 07d85643..2147d128 100644 --- a/lib/pages/spaces_management/space_model/bloc/subspace_model_event.dart +++ b/lib/pages/spaces_management/space_model/bloc/subspace_model_event.dart @@ -1,4 +1,3 @@ -// Events import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart'; abstract class SubSpaceModelEvent {} @@ -12,3 +11,8 @@ class RemoveSubSpaceModel extends SubSpaceModelEvent { final SubspaceTemplateModel subSpace; RemoveSubSpaceModel(this.subSpace); } + +class UpdateSubSpaceModel extends SubSpaceModelEvent { + final SubspaceTemplateModel updatedSubSpace; + UpdateSubSpaceModel(this.updatedSubSpace); +} diff --git a/lib/pages/spaces_management/space_model/widgets/button_content_widget.dart b/lib/pages/spaces_management/space_model/widgets/button_content_widget.dart new file mode 100644 index 00000000..81ecb674 --- /dev/null +++ b/lib/pages/spaces_management/space_model/widgets/button_content_widget.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; + +class ButtonContentWidget extends StatelessWidget { + final IconData icon; + final String label; + + const ButtonContentWidget({ + Key? key, + required this.icon, + required this.label, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final screenWidth = MediaQuery.of(context).size.width; + + return SizedBox( + width: screenWidth * 0.25, + child: Container( + decoration: BoxDecoration( + color: ColorsManager.textFieldGreyColor, + border: Border.all( + color: ColorsManager.neutralGray, + width: 3.0, + ), + borderRadius: BorderRadius.circular(20), + ), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0), + child: Row( + children: [ + Icon( + icon, + color: ColorsManager.spaceColor, + ), + const SizedBox(width: 10), + Expanded( + child: Text( + label, + style: const TextStyle( + color: ColorsManager.blackColor, + fontSize: 16, + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart b/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart index 2d14af22..77ca4e6d 100644 --- a/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart +++ b/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart @@ -3,6 +3,8 @@ import 'package:syncrow_web/pages/common/buttons/cancel_button.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/widgets/add_device_type_widget.dart'; +import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart'; +import 'package:syncrow_web/pages/spaces_management/space_model/widgets/button_content_widget.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/widgets/dialog/create_subspace_model_dialog.dart'; import 'package:syncrow_web/utils/color_manager.dart'; @@ -14,6 +16,7 @@ class CreateSpaceModelDialog extends StatelessWidget { @override Widget build(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; + List? subspaces = []; // Store subspaces here return AlertDialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), @@ -55,26 +58,28 @@ class CreateSpaceModelDialog extends StatelessWidget { const SizedBox(height: 16), TextButton( onPressed: () async { - final result = await showDialog( + final result = await showDialog>( barrierDismissible: false, context: context, builder: (BuildContext context) { - return const CreateSubSpaceModelDialog( + return CreateSubSpaceModelDialog( isEdit: true, dialogTitle: 'Create Sub-space', + existingSubSpaces: subspaces, ); }, ); - if (result != null && result.isNotEmpty) { - // Handle the result if necessary - print('Subspace created: $result'); + + if (result != null) { + // Update the subspaces + subspaces = result; + print('Updated Subspaces: $subspaces'); } }, style: TextButton.styleFrom( padding: EdgeInsets.zero, ), - child: _buildButtonContent( - context, + child: const ButtonContentWidget( icon: Icons.add, label: 'Create Sub Space', ), @@ -97,8 +102,7 @@ class CreateSpaceModelDialog extends StatelessWidget { style: TextButton.styleFrom( padding: EdgeInsets.zero, ), - child: _buildButtonContent( - context, + child: ButtonContentWidget( icon: Icons.add, label: 'Add Devices', ), @@ -118,7 +122,8 @@ class CreateSpaceModelDialog extends StatelessWidget { Expanded( child: DefaultButton( onPressed: () { - Navigator.of(context).pop(); + // Return data when OK is pressed + Navigator.of(context).pop(subspaces); }, backgroundColor: ColorsManager.secondaryColor, borderRadius: 10, @@ -134,44 +139,4 @@ class CreateSpaceModelDialog extends StatelessWidget { ), ); } - - Widget _buildButtonContent(BuildContext context, - {required IconData icon, required String label}) { - final screenWidth = MediaQuery.of(context).size.width; - - return SizedBox( - width: screenWidth * 0.25, - child: Container( - decoration: BoxDecoration( - color: ColorsManager.textFieldGreyColor, - border: Border.all( - color: ColorsManager.neutralGray, - width: 3.0, - ), - borderRadius: BorderRadius.circular(20), - ), - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0), - child: Row( - children: [ - Icon( - icon, - color: ColorsManager.spaceColor, - ), - const SizedBox(width: 10), - Expanded( - child: Text( - label, - style: const TextStyle( - color: ColorsManager.blackColor, - fontSize: 16, - ), - ), - ), - ], - ), - ), - ), - ); - } } diff --git a/lib/pages/spaces_management/space_model/widgets/dialog/create_subspace_model_dialog.dart b/lib/pages/spaces_management/space_model/widgets/dialog/create_subspace_model_dialog.dart index c4fec906..31a1f0d0 100644 --- a/lib/pages/spaces_management/space_model/widgets/dialog/create_subspace_model_dialog.dart +++ b/lib/pages/spaces_management/space_model/widgets/dialog/create_subspace_model_dialog.dart @@ -8,58 +8,32 @@ import 'package:syncrow_web/pages/spaces_management/space_model/bloc/subspace_mo import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart'; import 'package:syncrow_web/utils/color_manager.dart'; -class CreateSubSpaceModelDialog extends StatefulWidget { +class CreateSubSpaceModelDialog extends StatelessWidget { final bool isEdit; final String dialogTitle; final List? existingSubSpaces; const CreateSubSpaceModelDialog({ - super.key, + Key? key, required this.isEdit, required this.dialogTitle, this.existingSubSpaces, - }); - - @override - _CreateSubSpaceModelDialogState createState() => - _CreateSubSpaceModelDialogState(); -} - -class _CreateSubSpaceModelDialogState extends State { - final TextEditingController textController = TextEditingController(); - final FocusNode focusNode = FocusNode(); - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - focusNode.requestFocus(); - }); - - if (widget.isEdit) {} - } - - @override - void dispose() { - textController.dispose(); - focusNode.dispose(); - super.dispose(); - } + }) : super(key: key); @override Widget build(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; + final textController = TextEditingController(); return Dialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), - child: BlocProvider( create: (_) { final bloc = SubSpaceModelBloc(); - if (widget.existingSubSpaces != null) { - for (var subSpace in widget.existingSubSpaces!) { + if (existingSubSpaces != null) { + for (var subSpace in existingSubSpaces!) { bloc.add(AddSubSpaceModel(subSpace)); } } @@ -76,7 +50,7 @@ class _CreateSubSpaceModelDialogState extends State { mainAxisSize: MainAxisSize.min, children: [ Text( - widget.dialogTitle, + dialogTitle, style: Theme.of(context) .textTheme .headlineLarge @@ -97,15 +71,18 @@ class _CreateSubSpaceModelDialogState extends State { children: [ ...state.subSpaces.map( (subSpace) => Chip( - label: Text(subSpace.subspaceName, - style: const TextStyle( - color: ColorsManager.spaceColor)), + label: Text( + subSpace.subspaceName, + style: const TextStyle( + color: ColorsManager.spaceColor), + ), backgroundColor: ColorsManager.whiteColors, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), side: const BorderSide( - color: ColorsManager.transparentColor, - width: 0), + color: ColorsManager.transparentColor, + width: 0, + ), ), deleteIcon: Container( width: 24, @@ -132,7 +109,6 @@ class _CreateSubSpaceModelDialogState extends State { width: 200, child: TextField( controller: textController, - focusNode: focusNode, decoration: InputDecoration( border: InputBorder.none, hintText: state.subSpaces.isEmpty @@ -148,7 +124,6 @@ class _CreateSubSpaceModelDialogState extends State { subspaceName: value.trim(), disabled: false))); textController.clear(); - focusNode.requestFocus(); } }, style: const TextStyle(