diff --git a/lib/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_bloc.dart b/lib/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_bloc.dart index d51badca..42184278 100644 --- a/lib/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_bloc.dart +++ b/lib/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_bloc.dart @@ -24,7 +24,7 @@ class AssignTagModelBloc AssignTagModelLoaded(tags: tags, isSaveEnabled: _validateTags(tags))); }); - on((event, emit) { + on((event, emit) { final currentState = state; if (currentState is AssignTagModelLoaded && diff --git a/lib/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_event.dart b/lib/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_event.dart index 75c9ddc1..697b1c2a 100644 --- a/lib/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_event.dart +++ b/lib/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_event.dart @@ -22,11 +22,11 @@ class InitializeTagModels extends AssignTagModelEvent { List get props => [initialTags ?? [], addedProducts]; } -class UpdateTagModel extends AssignTagModelEvent { +class UpdateTag extends AssignTagModelEvent { final int index; final String tag; - const UpdateTagModel({required this.index, required this.tag}); + const UpdateTag({required this.index, required this.tag}); @override List get props => [index, tag]; diff --git a/lib/pages/spaces_management/assign_tag_models/views/assign_tag_models_dialog.dart b/lib/pages/spaces_management/assign_tag_models/views/assign_tag_models_dialog.dart index e58d75f0..72f2b2ee 100644 --- a/lib/pages/spaces_management/assign_tag_models/views/assign_tag_models_dialog.dart +++ b/lib/pages/spaces_management/assign_tag_models/views/assign_tag_models_dialog.dart @@ -1,12 +1,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +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/model/selected_product_model.dart'; import 'package:syncrow_web/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_event.dart'; import 'package:syncrow_web/pages/spaces_management/assign_tag_models/bloc/assign_tag_model_state.dart'; +import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/subspace_template_model.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/tag_model.dart'; +import 'package:syncrow_web/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart'; import 'package:syncrow_web/utils/color_manager.dart'; class AssignTagModelsDialog extends StatelessWidget { @@ -16,6 +20,7 @@ class AssignTagModelsDialog extends StatelessWidget { final ValueChanged>? onTagsAssigned; final List addedProducts; final List? allTags; + final String spaceName; const AssignTagModelsDialog({ Key? key, @@ -25,6 +30,7 @@ class AssignTagModelsDialog extends StatelessWidget { this.initialTags, this.onTagsAssigned, this.allTags, + required this.spaceName, }) : super(key: key); @override @@ -40,9 +46,6 @@ class AssignTagModelsDialog extends StatelessWidget { child: BlocBuilder( builder: (context, state) { if (state is AssignTagModelLoaded) { - print( - "Rebuilding UI with updated locations: ${state.tags.map((e) => e.location)}"); - final controllers = List.generate( state.tags.length, (index) => TextEditingController(text: state.tags[index].tag), @@ -143,7 +146,7 @@ class AssignTagModelsDialog extends StatelessWidget { onChanged: (value) { context .read() - .add(UpdateTagModel( + .add(UpdateTag( index: index, tag: value.trim(), )); @@ -172,7 +175,7 @@ class AssignTagModelsDialog extends StatelessWidget { controller.text = value; context .read() - .add(UpdateTagModel( + .add(UpdateTag( index: index, tag: value, )); @@ -274,16 +277,47 @@ class AssignTagModelsDialog extends StatelessWidget { ), ), actions: [ - ElevatedButton( - onPressed: state.isSaveEnabled - ? () { - if (onTagsAssigned != null) { - onTagsAssigned!(state.tags); - } - Navigator.pop(context); - } - : null, - child: const Text('Save'), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + const SizedBox(width: 10), + Expanded( + child: CancelButton( + label: 'Cancel', + onPressed: () => Navigator.of(context).pop(), + ), + ), + const SizedBox(width: 10), + Expanded( + child: DefaultButton( + borderRadius: 10, + backgroundColor: state.isSaveEnabled + ? ColorsManager.secondaryColor + : ColorsManager.grayColor, + foregroundColor: ColorsManager.whiteColors, + onPressed: state.isSaveEnabled + ? () async { + Navigator.of(context).pop(); + + await showDialog( + barrierDismissible: false, + context: context, + builder: (context) => CreateSpaceModelDialog( + products: products, + allTags: allTags, + spaceModel: SpaceTemplateModel( + modelName: spaceName, + subspaceModels: subspaces, + tags: state.tags), + ), + ); + } + : null, + child: const Text('Save'), + ), + ), + const SizedBox(width: 10), + ], ), ], ); diff --git a/lib/pages/spaces_management/subspace_model/bloc/subspace_model_bloc.dart b/lib/pages/spaces_management/create_subspace_model/bloc/subspace_model_bloc.dart similarity index 92% rename from lib/pages/spaces_management/subspace_model/bloc/subspace_model_bloc.dart rename to lib/pages/spaces_management/create_subspace_model/bloc/subspace_model_bloc.dart index 7feadc4f..6c12ad04 100644 --- a/lib/pages/spaces_management/subspace_model/bloc/subspace_model_bloc.dart +++ b/lib/pages/spaces_management/create_subspace_model/bloc/subspace_model_bloc.dart @@ -1,6 +1,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/spaces_management/subspace_model/bloc/subspace_model_event.dart'; -import 'package:syncrow_web/pages/spaces_management/subspace_model/bloc/subspace_model_state.dart'; +import 'package:syncrow_web/pages/spaces_management/create_subspace_model/bloc/subspace_model_event.dart'; +import 'package:syncrow_web/pages/spaces_management/create_subspace_model/bloc/subspace_model_state.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/subspace_template_model.dart'; import 'package:syncrow_web/utils/constants/action_enum.dart'; diff --git a/lib/pages/spaces_management/subspace_model/bloc/subspace_model_event.dart b/lib/pages/spaces_management/create_subspace_model/bloc/subspace_model_event.dart similarity index 100% rename from lib/pages/spaces_management/subspace_model/bloc/subspace_model_event.dart rename to lib/pages/spaces_management/create_subspace_model/bloc/subspace_model_event.dart diff --git a/lib/pages/spaces_management/subspace_model/bloc/subspace_model_state.dart b/lib/pages/spaces_management/create_subspace_model/bloc/subspace_model_state.dart similarity index 100% rename from lib/pages/spaces_management/subspace_model/bloc/subspace_model_state.dart rename to lib/pages/spaces_management/create_subspace_model/bloc/subspace_model_state.dart diff --git a/lib/pages/spaces_management/subspace_model/views/create_subspace_model_dialog.dart b/lib/pages/spaces_management/create_subspace_model/views/create_subspace_model_dialog.dart similarity index 96% rename from lib/pages/spaces_management/subspace_model/views/create_subspace_model_dialog.dart rename to lib/pages/spaces_management/create_subspace_model/views/create_subspace_model_dialog.dart index 54981975..d241b41e 100644 --- a/lib/pages/spaces_management/subspace_model/views/create_subspace_model_dialog.dart +++ b/lib/pages/spaces_management/create_subspace_model/views/create_subspace_model_dialog.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; 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/subspace_model/bloc/subspace_model_bloc.dart'; -import 'package:syncrow_web/pages/spaces_management/subspace_model/bloc/subspace_model_event.dart'; -import 'package:syncrow_web/pages/spaces_management/subspace_model/bloc/subspace_model_state.dart'; +import 'package:syncrow_web/pages/spaces_management/create_subspace_model/bloc/subspace_model_bloc.dart'; +import 'package:syncrow_web/pages/spaces_management/create_subspace_model/bloc/subspace_model_event.dart'; +import 'package:syncrow_web/pages/spaces_management/create_subspace_model/bloc/subspace_model_state.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/subspace_template_model.dart'; import 'package:syncrow_web/utils/color_manager.dart'; diff --git a/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart b/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart index 25d7c731..1ce8f651 100644 --- a/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart +++ b/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart @@ -24,6 +24,16 @@ class CreateSpaceModelBloc emit(CreateSpaceModelLoaded(_space!)); }); + on((event, emit) { + if (_space != null) { + _space = _space!.copyWith(modelName: event.name); // Use copyWith for immutability + emit(CreateSpaceModelLoaded(_space!)); + } else { + emit(CreateSpaceModelError("Space template not initialized")); + } + }); + + on((event, emit) { if (_space != null) { final updatedSpace = _space!.copyWith( diff --git a/lib/pages/spaces_management/space_model/bloc/create_space_model_event.dart b/lib/pages/spaces_management/space_model/bloc/create_space_model_event.dart index 6398c7ec..ccf0e3fb 100644 --- a/lib/pages/spaces_management/space_model/bloc/create_space_model_event.dart +++ b/lib/pages/spaces_management/space_model/bloc/create_space_model_event.dart @@ -11,6 +11,15 @@ class UpdateSpaceTemplate extends CreateSpaceModelEvent { UpdateSpaceTemplate(this.spaceTemplate); } +class UpdateSpaceTemplateName extends CreateSpaceModelEvent { + final String name; + + UpdateSpaceTemplateName({required this.name}); + + @override + List get props => [name]; +} + class AddSubspacesToSpaceTemplate extends CreateSpaceModelEvent { final List subspaces; diff --git a/lib/pages/spaces_management/space_model/models/space_template_model.dart b/lib/pages/spaces_management/space_model/models/space_template_model.dart index 2fa99d2b..d493fae9 100644 --- a/lib/pages/spaces_management/space_model/models/space_template_model.dart +++ b/lib/pages/spaces_management/space_model/models/space_template_model.dart @@ -6,7 +6,7 @@ import 'package:uuid/uuid.dart'; class SpaceTemplateModel { final String? uuid; - final String modelName; + String modelName; final List? subspaceModels; final List? tags; String internalId; @@ -35,15 +35,6 @@ class SpaceTemplateModel { ); } - Map toJson() { - return { - 'uuid': uuid, - 'modelName': modelName, - 'subspaceModels': subspaceModels?.map((e) => e.toJson()).toList(), - 'tags': tags?.map((e) => e.toJson()).toList(), - }; - } - SpaceTemplateModel copyWith({ String? uuid, String? modelName, @@ -59,6 +50,15 @@ class SpaceTemplateModel { internalId: internalId ?? this.internalId, ); } + + Map toJson() { + return { + 'uuid': uuid, + 'modelName': modelName, + 'subspaceModels': subspaceModels?.map((e) => e.toJson()).toList(), + 'tags': tags?.map((e) => e.toJson()).toList(), + }; + } } class UpdateSubspaceTemplateModel { 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 fce0522a..8b46d50a 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 @@ -4,6 +4,7 @@ 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/space_model/bloc/create_space_model_bloc.dart'; +import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_event.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_state.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'; @@ -17,13 +18,17 @@ import '../../models/subspace_template_model.dart'; class CreateSpaceModelDialog extends StatelessWidget { final List? products; final List? allTags; + final SpaceTemplateModel? spaceModel; - const CreateSpaceModelDialog({Key? key, this.products, this.allTags}) : super(key: key); + const CreateSpaceModelDialog( + {Key? key, this.products, this.allTags, this.spaceModel}) + : super(key: key); @override Widget build(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; - List? subspaces = []; // Store subspaces here + List? subspaces = []; + final TextEditingController spaceNameController = TextEditingController(); return AlertDialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), @@ -33,6 +38,14 @@ class CreateSpaceModelDialog extends StatelessWidget { child: BlocProvider( create: (_) { final bloc = CreateSpaceModelBloc(); + if (spaceModel != null) { + bloc.add(UpdateSpaceTemplate(spaceModel!)); + } else { + bloc.add(UpdateSpaceTemplate(SpaceTemplateModel( + modelName: '', + subspaceModels: [], + ))); + } return bloc; }, child: BlocBuilder( @@ -51,6 +64,7 @@ class CreateSpaceModelDialog extends StatelessWidget { SizedBox( width: screenWidth * 0.25, child: TextField( + controller: spaceNameController, style: const TextStyle(color: ColorsManager.blackColor), decoration: InputDecoration( filled: true, @@ -81,12 +95,10 @@ class CreateSpaceModelDialog extends StatelessWidget { products: products, subspaces: subspaces, allTags: allTags, + spaceName: spaceNameController.text, ), ); - if (result == true) { - // Handle the result if necessary - print('Devices added successfully'); - } + if (result == true) {} }, style: TextButton.styleFrom( padding: EdgeInsets.zero, diff --git a/lib/pages/spaces_management/space_model/widgets/subspace_model_create_widget.dart b/lib/pages/spaces_management/space_model/widgets/subspace_model_create_widget.dart index 4706fece..402c2ac1 100644 --- a/lib/pages/spaces_management/space_model/widgets/subspace_model_create_widget.dart +++ b/lib/pages/spaces_management/space_model/widgets/subspace_model_create_widget.dart @@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_event.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/subspace_template_model.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/widgets/button_content_widget.dart'; -import 'package:syncrow_web/pages/spaces_management/subspace_model/views/create_subspace_model_dialog.dart'; +import 'package:syncrow_web/pages/spaces_management/create_subspace_model/views/create_subspace_model_dialog.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart'; diff --git a/lib/pages/spaces_management/tag_model/views/add_device_type_model_widget.dart b/lib/pages/spaces_management/tag_model/views/add_device_type_model_widget.dart index c6ee5424..021e5ac9 100644 --- a/lib/pages/spaces_management/tag_model/views/add_device_type_model_widget.dart +++ b/lib/pages/spaces_management/tag_model/views/add_device_type_model_widget.dart @@ -16,6 +16,7 @@ class AddDeviceTypeModelWidget extends StatelessWidget { final List? initialSelectedProducts; final List? subspaces; final List? allTags; + final String spaceName; const AddDeviceTypeModelWidget( {super.key, @@ -23,7 +24,9 @@ class AddDeviceTypeModelWidget extends StatelessWidget { this.initialSelectedProducts, this.onProductsSelected, this.subspaces, - this.allTags}); + this.allTags, + required this.spaceName + }); @override Widget build(BuildContext context) { @@ -85,6 +88,7 @@ class AddDeviceTypeModelWidget extends StatelessWidget { subspaces: subspaces, addedProducts: currentState, allTags: allTags, + spaceName: spaceName, ), ); }