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 d4015a96..e6242c5e 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,10 +9,8 @@ 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/utils/color_manager.dart'; class AssignTagModelsDialog extends StatelessWidget { @@ -24,6 +22,8 @@ class AssignTagModelsDialog extends StatelessWidget { final List? allTags; final String spaceName; final String title; + final void Function( + List? tags, List? subspaces)? onUpdate; const AssignTagModelsDialog( {Key? key, @@ -34,7 +34,8 @@ class AssignTagModelsDialog extends StatelessWidget { this.onTagsAssigned, this.allTags, required this.spaceName, - required this.title}) + required this.title, + this.onUpdate}) : super(key: key); @override @@ -226,6 +227,21 @@ class AssignTagModelsDialog extends StatelessWidget { label: 'Add New Device', onPressed: () async { Navigator.of(context).pop(); + final assignedTags = {}; + for (var tag in state.tags) { + if (tag.location == null || subspaces == null) { + continue; + } + for (var subspace in subspaces!) { + if (tag.location == subspace.subspaceName) { + subspace.tags ??= []; + subspace.tags!.add(tag); + assignedTags.add(tag); + break; + } + } + } + state.tags.removeWhere(assignedTags.contains); }, ), ), @@ -256,18 +272,7 @@ class AssignTagModelsDialog extends StatelessWidget { } } state.tags.removeWhere(assignedTags.contains); - await showDialog( - barrierDismissible: false, - context: context, - builder: (context) => CreateSpaceModelDialog( - products: products, - allTags: allTags, - spaceModel: SpaceTemplateModel( - modelName: spaceName, - subspaceModels: subspaces, - tags: state.tags), - ), - ); + onUpdate!(state.tags,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 8055e217..ec17482f 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 @@ -84,6 +84,24 @@ class CreateSpaceModelBloc } }); + + + on((event, emit) { + final currentState = state; + + if (currentState is CreateSpaceModelLoaded) { + final updatedTags = currentState.space.copyWith( + tags: [ + ...(_space!.tags ?? []), + ...event.tags, + ], + ); + emit(CreateSpaceModelLoaded(updatedTags)); + } else { + emit(CreateSpaceModelError("Space template not initialized")); + } + }); + on((event, emit) { final currentState = state; if (currentState is CreateSpaceModelLoaded) { 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 1d7f6012..2bcb12b6 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 @@ -1,6 +1,7 @@ import 'package:equatable/equatable.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'; abstract class CreateSpaceModelEvent extends Equatable { const CreateSpaceModelEvent(); @@ -46,6 +47,13 @@ class AddSubspacesToSpaceTemplate extends CreateSpaceModelEvent { AddSubspacesToSpaceTemplate(this.subspaces); } +class AddTagsToSpaceTemplate extends CreateSpaceModelEvent { + final List tags; + + AddTagsToSpaceTemplate(this.tags); +} + + class ValidateSpaceTemplateName extends CreateSpaceModelEvent { final String name; 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 4f762c9a..84f568a5 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 @@ -13,7 +13,7 @@ class SpaceTemplateModel extends Equatable { String internalId; @override - List get props => [modelName, subspaceModels]; + List get props => [modelName, subspaceModels, tags]; SpaceTemplateModel({ this.uuid, 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 98c82f2a..1e2fc517 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 @@ -118,13 +118,28 @@ class CreateSpaceModelDialog extends StatelessWidget { }, ), const SizedBox(height: 10), - TagChipDisplay(context, - screenWidth: screenWidth, - spaceModel: updatedSpaceModel, - products: products, - subspaces: subspaces, - allTags: allTags, - spaceNameController: spaceNameController), + TagChipDisplay( + context, + screenWidth: screenWidth, + spaceModel: updatedSpaceModel, + products: products, + subspaces: subspaces, + allTags: allTags, + spaceNameController: spaceNameController, + onLoad: (tags, subspaces) { + if(subspaces!=null){ + context + .read() + .add(AddSubspacesToSpaceTemplate(subspaces)); + } + if(tags!=null){ + context + .read() + .add(AddTagsToSpaceTemplate(tags)); + + } + }, + ), const SizedBox(height: 20), SizedBox( width: screenWidth * 0.25, 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 21283ca4..d83db22a 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 @@ -16,17 +16,19 @@ class TagChipDisplay extends StatelessWidget { final List? subspaces; final List? allTags; final TextEditingController spaceNameController; + final void Function( + List? tags, List? subspaces)? onLoad; - const TagChipDisplay( - BuildContext context, { - Key? key, - required this.screenWidth, - required this.spaceModel, - required this.products, - required this.subspaces, - required this.allTags, - required this.spaceNameController, - }) : super(key: key); + const TagChipDisplay(BuildContext context, + {Key? key, + required this.screenWidth, + required this.spaceModel, + required this.products, + required this.subspaces, + required this.allTags, + required this.spaceNameController, + this.onLoad}) + : super(key: key); @override Widget build(BuildContext context) { @@ -104,15 +106,12 @@ class TagChipDisplay extends StatelessWidget { child: Chip( label: const Text( 'Edit', - style: TextStyle( - color: ColorsManager.spaceColor), + style: TextStyle(color: ColorsManager.spaceColor), ), - backgroundColor: - ColorsManager.whiteColors, + backgroundColor: ColorsManager.whiteColors, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - side: const BorderSide( - color: ColorsManager.spaceColor), + borderRadius: BorderRadius.circular(16), + side: const BorderSide(color: ColorsManager.spaceColor), ), ), ), @@ -122,7 +121,7 @@ class TagChipDisplay extends StatelessWidget { ) : TextButton( onPressed: () async { - final result = await showDialog( + await showDialog( barrierDismissible: false, context: context, builder: (context) => AddDeviceTypeModelWidget( @@ -131,9 +130,13 @@ class TagChipDisplay extends StatelessWidget { allTags: allTags, spaceName: spaceNameController.text, isCreate: true, + onLoad: (tags, subspaces) { + if (onLoad != null) { + onLoad!(tags, subspaces); + } + }, ), ); - if (result == true) {} }, style: TextButton.styleFrom( padding: EdgeInsets.zero, @@ -189,5 +192,4 @@ class TagChipDisplay extends StatelessWidget { )) .toList(); } - } 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 dbc4d6ea..8ed903b1 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 @@ -1,17 +1,15 @@ 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/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/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/bloc/add_device_model_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/tag_model/bloc/add_device_model_state.dart'; import 'package:syncrow_web/pages/spaces_management/tag_model/bloc/add_device_type_model_event.dart'; -import 'package:syncrow_web/pages/spaces_management/tag_model/widgets/action_button_widget.dart'; import 'package:syncrow_web/pages/spaces_management/tag_model/widgets/scrollable_grid_view_widget.dart'; import 'package:syncrow_web/utils/color_manager.dart'; @@ -23,6 +21,8 @@ class AddDeviceTypeModelWidget extends StatelessWidget { final List? allTags; final String spaceName; final bool isCreate; + final void Function( + List? tags, List? subspaces)? onLoad; const AddDeviceTypeModelWidget({ super.key, @@ -33,6 +33,7 @@ class AddDeviceTypeModelWidget extends StatelessWidget { this.spaceTagModels, required this.spaceName, required this.isCreate, + this.onLoad, }); @override @@ -94,46 +95,66 @@ class AddDeviceTypeModelWidget extends StatelessWidget { CancelButton( label: 'Cancel', onPressed: () async { - if (isCreate) { - Navigator.of(context).pop(); - } - }, - ), - ActionButton( - label: 'Continue', - backgroundColor: ColorsManager.secondaryColor, - foregroundColor: ColorsManager.whiteColors, - onPressed: () async { - final state = context.read().state; - if (state is AddDeviceModelLoaded && - state.selectedProducts.isNotEmpty) { - final initialTags = generateInitialTags( - spaceTagModels: spaceTagModels, - subspaces: subspaces, - ); - if (isCreate) { - Navigator.of(context).pop(); - } - - final dialogTitle = initialTags.isNotEmpty - ? 'Edit Device' - : 'Assign Tags'; - await showDialog( - barrierDismissible: false, - context: context, - builder: (context) => AssignTagModelsDialog( - products: products, - subspaces: subspaces, - addedProducts: state.selectedProducts, - allTags: allTags, - spaceName: spaceName, - initialTags: state.initialTag, - title: dialogTitle, - ), - ); + if (isCreate) { + Navigator.of(context).pop(); } }, ), + SizedBox( + width: 140, + child: + BlocBuilder( + builder: (context, state) { + final isDisabled = state is AddDeviceModelLoaded && + state.selectedProducts.isEmpty; + + return DefaultButton( + backgroundColor: ColorsManager.secondaryColor, + foregroundColor: isDisabled + ? ColorsManager.whiteColorsWithOpacity + : ColorsManager.whiteColors, + borderRadius: 10, + onPressed: isDisabled + ? null // Disable the button + : () async { + if (state is AddDeviceModelLoaded && + state.selectedProducts.isNotEmpty) { + final initialTags = generateInitialTags( + spaceTagModels: spaceTagModels, + subspaces: subspaces, + ); + if (isCreate) { + Navigator.of(context).pop(); + } + + final dialogTitle = initialTags.isNotEmpty + ? 'Edit Device' + : 'Assign Tags'; + await showDialog( + barrierDismissible: false, + context: context, + builder: (context) => AssignTagModelsDialog( + products: products, + subspaces: subspaces, + addedProducts: state.selectedProducts, + allTags: allTags, + spaceName: spaceName, + initialTags: state.initialTag, + title: dialogTitle, + onUpdate: (tags, subspaces) { + if (onLoad != null) { + onLoad!(tags, subspaces); + } + }, + ), + ); + } + }, + child: const Text('Next'), + ); + }, + ), + ), ], ), ],