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 3a2499f9..006a5f7c 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 @@ -9,8 +9,10 @@ import 'package:syncrow_web/pages/spaces_management/all_spaces/model/selected_pr 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/pages/spaces_management/tag_model/views/add_device_type_model_widget.dart'; import 'package:syncrow_web/utils/color_manager.dart'; @@ -23,8 +25,8 @@ class AssignTagModelsDialog extends StatelessWidget { final List? allTags; final String spaceName; final String title; - final void Function( - List? tags, List? subspaces)? onUpdate; + final BuildContext? pageContext; + final List? otherSpaceModels; const AssignTagModelsDialog( {Key? key, @@ -36,7 +38,8 @@ class AssignTagModelsDialog extends StatelessWidget { this.allTags, required this.spaceName, required this.title, - this.onUpdate}) + this.pageContext, + this.otherSpaceModels}) : super(key: key); @override @@ -271,6 +274,8 @@ class AssignTagModelsDialog extends StatelessWidget { } } if (context.mounted) { + Navigator.of(context).pop(); + await showDialog( barrierDismissible: false, context: context, @@ -282,11 +287,9 @@ class AssignTagModelsDialog extends StatelessWidget { initialSelectedProducts: addedProducts, allTags: allTags, spaceName: spaceName, + otherSpaceModels: otherSpaceModels, spaceTagModels: state.tags, - onUpdate: (tags, subspaces) { - onUpdate?.call(state.tags, subspaces); - Navigator.of(context).pop(); - }, + pageContext: pageContext, ), ); } @@ -304,8 +307,6 @@ class AssignTagModelsDialog extends StatelessWidget { foregroundColor: ColorsManager.whiteColors, onPressed: state.isSaveEnabled ? () async { - Navigator.of(context).pop(); - for (var tag in state.tags) { if (tag.location == null || subspaces == null) { @@ -333,8 +334,24 @@ class AssignTagModelsDialog extends StatelessWidget { t.internalId == tag.internalId); } } + Navigator.of(context) + .popUntil((route) => route.isFirst); - onUpdate?.call(state.tags, subspaces); + await showDialog( + context: context, + builder: (BuildContext dialogContext) { + return CreateSpaceModelDialog( + products: products, + allTags: allTags, + pageContext: pageContext, + otherSpaceModels: otherSpaceModels, + spaceModel: SpaceTemplateModel( + modelName: spaceName, + tags: state.tags, + subspaceModels: subspaces), + ); + }, + ); } : null, child: const Text('Save'), 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 33defb52..417ba1fd 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 @@ -1,3 +1,5 @@ +import 'dart:math'; + 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/bloc/create_space_model_state.dart'; @@ -52,8 +54,6 @@ class CreateSpaceModelBloc } }); - - on((event, emit) { emit(CreateSpaceModelLoading()); Future.delayed(const Duration(seconds: 1), () { @@ -173,7 +173,12 @@ class CreateSpaceModelBloc on((event, emit) { final currentState = state; if (currentState is CreateSpaceModelLoaded) { - if (event.name.trim().isEmpty) { + if (event.allModels.contains(event.name) == true) { + emit(CreateSpaceModelLoaded( + currentState.space, + errorMessage: "Duplicate Model name", + )); + } else if (event.name.trim().isEmpty) { emit(CreateSpaceModelLoaded( currentState.space, errorMessage: "Model name cannot be empty", 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 2bcb12b6..a78ae78f 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 @@ -34,11 +34,12 @@ class CreateSpaceTemplate extends CreateSpaceModelEvent { class UpdateSpaceTemplateName extends CreateSpaceModelEvent { final String name; + final List allModels; - UpdateSpaceTemplateName({required this.name}); + UpdateSpaceTemplateName({required this.name, required this.allModels}); @override - List get props => [name]; + List get props => [name,allModels]; } class AddSubspacesToSpaceTemplate extends CreateSpaceModelEvent { diff --git a/lib/pages/spaces_management/space_model/view/space_model_page.dart b/lib/pages/spaces_management/space_model/view/space_model_page.dart index d0b5a300..47bea955 100644 --- a/lib/pages/spaces_management/space_model/view/space_model_page.dart +++ b/lib/pages/spaces_management/space_model/view/space_model_page.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_bloc.dart'; -import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_event.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/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/add_space_model_widget.dart'; @@ -24,6 +23,7 @@ class SpaceModelPage extends StatelessWidget { } else if (state is SpaceModelLoaded) { final spaceModels = state.spaceModels; final allTagValues = _getAllTagValues(spaceModels); + final allSpaceModelNames = _getAllSpaceModelName(spaceModels); return Scaffold( backgroundColor: ColorsManager.whiteColors, @@ -52,12 +52,8 @@ class SpaceModelPage extends StatelessWidget { return CreateSpaceModelDialog( products: products, allTags: allTagValues, - onLoad: (newModel) { - context.read().add( - CreateSpaceModel( - newSpaceModel: newModel), - ); - }, + pageContext: context, + otherSpaceModels: allSpaceModelNames, ); }, ); @@ -76,7 +72,7 @@ class SpaceModelPage extends StatelessWidget { products: products, allTags: allTagValues, spaceModel: model, - onLoad: (newModel) {}, + otherSpaceModels: allSpaceModelNames, ); }, ); @@ -128,4 +124,12 @@ class SpaceModelPage extends StatelessWidget { } return allTags; } + + List _getAllSpaceModelName(List spaceModels) { + final List names = []; + for (final spaceModel in spaceModels) { + names.add(spaceModel.modelName); + } + return names; + } } 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 a3f34e31..4c4b8a7c 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 @@ -8,6 +8,8 @@ import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_spac 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/tag_chips_display_widget.dart'; +import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_bloc.dart'; +import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_event.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/widgets/subspace_model_create_widget.dart'; import 'package:syncrow_web/services/space_model_mang_api.dart'; @@ -17,15 +19,17 @@ class CreateSpaceModelDialog extends StatelessWidget { final List? products; final List? allTags; final SpaceTemplateModel? spaceModel; - final void Function(SpaceTemplateModel newModel)? onLoad; + final BuildContext? pageContext; + final List? otherSpaceModels; - const CreateSpaceModelDialog({ - Key? key, - this.products, - this.allTags, - this.spaceModel, - this.onLoad, - }) : super(key: key); + const CreateSpaceModelDialog( + {Key? key, + this.products, + this.allTags, + this.spaceModel, + this.pageContext, + this.otherSpaceModels}) + : super(key: key); @override Widget build(BuildContext context) { @@ -44,17 +48,17 @@ class CreateSpaceModelDialog extends StatelessWidget { child: BlocProvider( create: (_) { final bloc = CreateSpaceModelBloc(_spaceModelApi); - if (spaceModel != null) { - bloc.add(UpdateSpaceTemplate(spaceModel!)); - } else { - bloc.add(UpdateSpaceTemplate(SpaceTemplateModel( - modelName: '', - subspaceModels: const [], - ))); - } - + if (spaceModel != null) { + bloc.add(UpdateSpaceTemplate(spaceModel!)); + } else { + bloc.add(UpdateSpaceTemplate(SpaceTemplateModel( + modelName: '', + subspaceModels: const [], + ))); + } + spaceNameController.addListener(() { - bloc.add(UpdateSpaceTemplateName(name: spaceNameController.text)); + bloc.add(UpdateSpaceTemplateName(name: spaceNameController.text,allModels: otherSpaceModels ??[])); }); return bloc; @@ -86,9 +90,10 @@ class CreateSpaceModelDialog extends StatelessWidget { child: TextField( controller: spaceNameController, onChanged: (value) { - context - .read() - .add(UpdateSpaceTemplateName(name: value)); + context.read().add( + UpdateSpaceTemplateName( + name: value, + allModels: otherSpaceModels ?? [])); }, style: const TextStyle(color: ColorsManager.blackColor), decoration: InputDecoration( @@ -128,21 +133,8 @@ class CreateSpaceModelDialog extends StatelessWidget { subspaces: subspaces, allTags: allTags, spaceNameController: spaceNameController, - onLoad: (tags, subspaces) { - if (context.read().state - is CreateSpaceModelLoaded) { - if (subspaces != null) { - context - .read() - .add(AddSubspacesToSpaceTemplate(subspaces)); - } - if (tags != null) { - context - .read() - .add(AddTagsToSpaceTemplate(tags)); - } - } - }, + pageContext: pageContext, + otherSpaceModels: otherSpaceModels, ), const SizedBox(height: 20), SizedBox( @@ -161,26 +153,35 @@ class CreateSpaceModelDialog extends StatelessWidget { onPressed: state.errorMessage == null || isNameValid ? () { - final updatedSpaceTemplate = - updatedSpaceModel.copyWith( - modelName: - spaceNameController.text.trim(), - ); - if(updatedSpaceTemplate.uuid != null){ - + if (updatedSpaceModel.uuid == null) { + final updatedSpaceTemplate = + updatedSpaceModel.copyWith( + modelName: + spaceNameController.text.trim(), + ); + if (updatedSpaceTemplate.uuid != + null) {} + + context + .read() + .add( + CreateSpaceTemplate( + spaceTemplate: + updatedSpaceTemplate, + onCreate: (newModel) { + if (pageContext != null) { + pageContext! + .read() + .add(CreateSpaceModel( + newSpaceModel: + newModel)); + } + Navigator.of(context) + .pop(); // Close the dialog + }, + ), + ); } - - context.read().add( - CreateSpaceTemplate( - spaceTemplate: - updatedSpaceTemplate, - onCreate: (newModel) { - onLoad!(newModel); - Navigator.of(context) - .pop(); // Close the dialog - }, - ), - ); } : null, backgroundColor: ColorsManager.secondaryColor, diff --git a/lib/pages/spaces_management/space_model/widgets/tag_chips_display_widget.dart b/lib/pages/spaces_management/space_model/widgets/tag_chips_display_widget.dart index 18efd501..0c46076f 100644 --- a/lib/pages/spaces_management/space_model/widgets/tag_chips_display_widget.dart +++ b/lib/pages/spaces_management/space_model/widgets/tag_chips_display_widget.dart @@ -5,7 +5,6 @@ import 'package:syncrow_web/pages/spaces_management/assign_tag_models/views/assi import 'package:syncrow_web/pages/spaces_management/helper/tag_helper.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/button_content_widget.dart'; import 'package:syncrow_web/pages/spaces_management/tag_model/views/add_device_type_model_widget.dart'; import 'package:syncrow_web/utils/color_manager.dart'; @@ -17,8 +16,8 @@ class TagChipDisplay extends StatelessWidget { final List? subspaces; final List? allTags; final TextEditingController spaceNameController; - final void Function( - List? tags, List? subspaces)? onLoad; + final BuildContext? pageContext; + final List? otherSpaceModels; const TagChipDisplay(BuildContext context, {Key? key, @@ -28,7 +27,8 @@ class TagChipDisplay extends StatelessWidget { required this.subspaces, required this.allTags, required this.spaceNameController, - this.onLoad}) + this.pageContext, + this.otherSpaceModels}) : super(key: key); @override @@ -91,24 +91,22 @@ class TagChipDisplay extends StatelessWidget { if (navigatorContext != null) { await showDialog( - barrierDismissible: false, - context: navigatorContext, - builder: (context) => AssignTagModelsDialog( - products: products, - subspaces: subspaces, - allTags: allTags, - initialTags: TagHelper.generateInitialTags( + barrierDismissible: false, + context: navigatorContext, + builder: (context) => AssignTagModelsDialog( + products: products, subspaces: subspaces, - spaceTagModels: spaceModel?.tags ?? []), - title: 'Edit Device', - addedProducts: - TagHelper.createInitialSelectedProducts( - spaceModel?.tags ?? [], subspaces), - spaceName: spaceModel?.modelName ?? '', - onUpdate: (tags, subspaces) { - onLoad?.call(tags, subspaces); - }), - ); + pageContext: pageContext, + allTags: allTags, + initialTags: TagHelper.generateInitialTags( + subspaces: subspaces, + spaceTagModels: spaceModel?.tags ?? []), + title: 'Edit Device', + addedProducts: + TagHelper.createInitialSelectedProducts( + spaceModel?.tags ?? [], subspaces), + spaceName: spaceModel?.modelName ?? '', + )); } }, child: Chip( @@ -129,6 +127,8 @@ class TagChipDisplay extends StatelessWidget { ) : TextButton( onPressed: () async { + Navigator.of(context).pop(); + await showDialog( barrierDismissible: false, context: context, @@ -137,13 +137,8 @@ class TagChipDisplay extends StatelessWidget { subspaces: subspaces, allTags: allTags, spaceName: spaceNameController.text, + pageContext: pageContext, isCreate: true, - onUpdate: (tags, subspaces) { - onLoad?.call(tags, subspaces); - }, - onLoad: (tags, subspaces) { - onLoad?.call(tags, subspaces); - }, ), ); }, 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 7944eb4f..ddb9b5a3 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 @@ -5,6 +5,7 @@ import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/spaces_management/assign_tag_models/views/assign_tag_models_dialog.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/link_space_model/bloc/link_space_model_bloc.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/tag_model/bloc/add_device_model_bloc.dart'; @@ -21,28 +22,23 @@ class AddDeviceTypeModelWidget extends StatelessWidget { final List? allTags; final String spaceName; final bool isCreate; - final void Function( - List? tags, List? subspaces)? onLoad; - final void Function( - List? tags, List? subspaces)? onUpdate; + final List? otherSpaceModels; + final BuildContext? pageContext; - const AddDeviceTypeModelWidget({ - super.key, - this.products, - this.initialSelectedProducts, - this.subspaces, - this.allTags, - this.spaceTagModels, - required this.spaceName, - required this.isCreate, - this.onLoad, - this.onUpdate, - }); + const AddDeviceTypeModelWidget( + {super.key, + this.products, + this.initialSelectedProducts, + this.subspaces, + this.allTags, + this.spaceTagModels, + required this.spaceName, + required this.isCreate, + this.pageContext, + this.otherSpaceModels}); @override Widget build(BuildContext context) { - - final size = MediaQuery.of(context).size; final crossAxisCount = size.width > 1200 ? 8 @@ -142,10 +138,9 @@ class AddDeviceTypeModelWidget extends StatelessWidget { allTags: allTags, spaceName: spaceName, initialTags: state.initialTag, + otherSpaceModels: otherSpaceModels, title: dialogTitle, - onUpdate: (tags, subspaces) { - onUpdate?.call(tags, subspaces); - }, + pageContext: pageContext, ), ); }