fixed space model creation

This commit is contained in:
hannathkadher
2025-01-21 20:26:30 +04:00
parent 788ea27de1
commit e47f3d6d59
7 changed files with 144 additions and 126 deletions

View File

@ -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_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_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/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/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/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/pages/spaces_management/tag_model/views/add_device_type_model_widget.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
@ -23,8 +25,8 @@ class AssignTagModelsDialog extends StatelessWidget {
final List<String>? allTags; final List<String>? allTags;
final String spaceName; final String spaceName;
final String title; final String title;
final void Function( final BuildContext? pageContext;
List<TagModel>? tags, List<SubspaceTemplateModel>? subspaces)? onUpdate; final List<String>? otherSpaceModels;
const AssignTagModelsDialog( const AssignTagModelsDialog(
{Key? key, {Key? key,
@ -36,7 +38,8 @@ class AssignTagModelsDialog extends StatelessWidget {
this.allTags, this.allTags,
required this.spaceName, required this.spaceName,
required this.title, required this.title,
this.onUpdate}) this.pageContext,
this.otherSpaceModels})
: super(key: key); : super(key: key);
@override @override
@ -271,6 +274,8 @@ class AssignTagModelsDialog extends StatelessWidget {
} }
} }
if (context.mounted) { if (context.mounted) {
Navigator.of(context).pop();
await showDialog<bool>( await showDialog<bool>(
barrierDismissible: false, barrierDismissible: false,
context: context, context: context,
@ -282,11 +287,9 @@ class AssignTagModelsDialog extends StatelessWidget {
initialSelectedProducts: addedProducts, initialSelectedProducts: addedProducts,
allTags: allTags, allTags: allTags,
spaceName: spaceName, spaceName: spaceName,
otherSpaceModels: otherSpaceModels,
spaceTagModels: state.tags, spaceTagModels: state.tags,
onUpdate: (tags, subspaces) { pageContext: pageContext,
onUpdate?.call(state.tags, subspaces);
Navigator.of(context).pop();
},
), ),
); );
} }
@ -304,8 +307,6 @@ class AssignTagModelsDialog extends StatelessWidget {
foregroundColor: ColorsManager.whiteColors, foregroundColor: ColorsManager.whiteColors,
onPressed: state.isSaveEnabled onPressed: state.isSaveEnabled
? () async { ? () async {
Navigator.of(context).pop();
for (var tag in state.tags) { for (var tag in state.tags) {
if (tag.location == null || if (tag.location == null ||
subspaces == null) { subspaces == null) {
@ -333,8 +334,24 @@ class AssignTagModelsDialog extends StatelessWidget {
t.internalId == tag.internalId); 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, : null,
child: const Text('Save'), child: const Text('Save'),

View File

@ -1,3 +1,5 @@
import 'dart:math';
import 'package:flutter_bloc/flutter_bloc.dart'; 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_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/bloc/create_space_model_state.dart';
@ -52,8 +54,6 @@ class CreateSpaceModelBloc
} }
}); });
on<LoadSpaceTemplate>((event, emit) { on<LoadSpaceTemplate>((event, emit) {
emit(CreateSpaceModelLoading()); emit(CreateSpaceModelLoading());
Future.delayed(const Duration(seconds: 1), () { Future.delayed(const Duration(seconds: 1), () {
@ -173,7 +173,12 @@ class CreateSpaceModelBloc
on<UpdateSpaceTemplateName>((event, emit) { on<UpdateSpaceTemplateName>((event, emit) {
final currentState = state; final currentState = state;
if (currentState is CreateSpaceModelLoaded) { 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( emit(CreateSpaceModelLoaded(
currentState.space, currentState.space,
errorMessage: "Model name cannot be empty", errorMessage: "Model name cannot be empty",

View File

@ -34,11 +34,12 @@ class CreateSpaceTemplate extends CreateSpaceModelEvent {
class UpdateSpaceTemplateName extends CreateSpaceModelEvent { class UpdateSpaceTemplateName extends CreateSpaceModelEvent {
final String name; final String name;
final List<String> allModels;
UpdateSpaceTemplateName({required this.name}); UpdateSpaceTemplateName({required this.name, required this.allModels});
@override @override
List<Object> get props => [name]; List<Object> get props => [name,allModels];
} }
class AddSubspacesToSpaceTemplate extends CreateSpaceModelEvent { class AddSubspacesToSpaceTemplate extends CreateSpaceModelEvent {

View File

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.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/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_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/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/models/space_template_model.dart';
import 'package:syncrow_web/pages/spaces_management/space_model/widgets/add_space_model_widget.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) { } else if (state is SpaceModelLoaded) {
final spaceModels = state.spaceModels; final spaceModels = state.spaceModels;
final allTagValues = _getAllTagValues(spaceModels); final allTagValues = _getAllTagValues(spaceModels);
final allSpaceModelNames = _getAllSpaceModelName(spaceModels);
return Scaffold( return Scaffold(
backgroundColor: ColorsManager.whiteColors, backgroundColor: ColorsManager.whiteColors,
@ -52,12 +52,8 @@ class SpaceModelPage extends StatelessWidget {
return CreateSpaceModelDialog( return CreateSpaceModelDialog(
products: products, products: products,
allTags: allTagValues, allTags: allTagValues,
onLoad: (newModel) { pageContext: context,
context.read<SpaceModelBloc>().add( otherSpaceModels: allSpaceModelNames,
CreateSpaceModel(
newSpaceModel: newModel),
);
},
); );
}, },
); );
@ -76,7 +72,7 @@ class SpaceModelPage extends StatelessWidget {
products: products, products: products,
allTags: allTagValues, allTags: allTagValues,
spaceModel: model, spaceModel: model,
onLoad: (newModel) {}, otherSpaceModels: allSpaceModelNames,
); );
}, },
); );
@ -128,4 +124,12 @@ class SpaceModelPage extends StatelessWidget {
} }
return allTags; return allTags;
} }
List<String> _getAllSpaceModelName(List<SpaceTemplateModel> spaceModels) {
final List<String> names = [];
for (final spaceModel in spaceModels) {
names.add(spaceModel.modelName);
}
return names;
}
} }

View File

@ -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/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/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/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/pages/spaces_management/space_model/widgets/subspace_model_create_widget.dart';
import 'package:syncrow_web/services/space_model_mang_api.dart'; import 'package:syncrow_web/services/space_model_mang_api.dart';
@ -17,15 +19,17 @@ class CreateSpaceModelDialog extends StatelessWidget {
final List<ProductModel>? products; final List<ProductModel>? products;
final List<String>? allTags; final List<String>? allTags;
final SpaceTemplateModel? spaceModel; final SpaceTemplateModel? spaceModel;
final void Function(SpaceTemplateModel newModel)? onLoad; final BuildContext? pageContext;
final List<String>? otherSpaceModels;
const CreateSpaceModelDialog({ const CreateSpaceModelDialog(
Key? key, {Key? key,
this.products, this.products,
this.allTags, this.allTags,
this.spaceModel, this.spaceModel,
this.onLoad, this.pageContext,
}) : super(key: key); this.otherSpaceModels})
: super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -54,7 +58,7 @@ class CreateSpaceModelDialog extends StatelessWidget {
} }
spaceNameController.addListener(() { spaceNameController.addListener(() {
bloc.add(UpdateSpaceTemplateName(name: spaceNameController.text)); bloc.add(UpdateSpaceTemplateName(name: spaceNameController.text,allModels: otherSpaceModels ??[]));
}); });
return bloc; return bloc;
@ -86,9 +90,10 @@ class CreateSpaceModelDialog extends StatelessWidget {
child: TextField( child: TextField(
controller: spaceNameController, controller: spaceNameController,
onChanged: (value) { onChanged: (value) {
context context.read<CreateSpaceModelBloc>().add(
.read<CreateSpaceModelBloc>() UpdateSpaceTemplateName(
.add(UpdateSpaceTemplateName(name: value)); name: value,
allModels: otherSpaceModels ?? []));
}, },
style: const TextStyle(color: ColorsManager.blackColor), style: const TextStyle(color: ColorsManager.blackColor),
decoration: InputDecoration( decoration: InputDecoration(
@ -128,21 +133,8 @@ class CreateSpaceModelDialog extends StatelessWidget {
subspaces: subspaces, subspaces: subspaces,
allTags: allTags, allTags: allTags,
spaceNameController: spaceNameController, spaceNameController: spaceNameController,
onLoad: (tags, subspaces) { pageContext: pageContext,
if (context.read<CreateSpaceModelBloc>().state otherSpaceModels: otherSpaceModels,
is CreateSpaceModelLoaded) {
if (subspaces != null) {
context
.read<CreateSpaceModelBloc>()
.add(AddSubspacesToSpaceTemplate(subspaces));
}
if (tags != null) {
context
.read<CreateSpaceModelBloc>()
.add(AddTagsToSpaceTemplate(tags));
}
}
},
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
SizedBox( SizedBox(
@ -161,27 +153,36 @@ class CreateSpaceModelDialog extends StatelessWidget {
onPressed: state.errorMessage == null || onPressed: state.errorMessage == null ||
isNameValid isNameValid
? () { ? () {
if (updatedSpaceModel.uuid == null) {
final updatedSpaceTemplate = final updatedSpaceTemplate =
updatedSpaceModel.copyWith( updatedSpaceModel.copyWith(
modelName: modelName:
spaceNameController.text.trim(), spaceNameController.text.trim(),
); );
if(updatedSpaceTemplate.uuid != null){ if (updatedSpaceTemplate.uuid !=
null) {}
} context
.read<CreateSpaceModelBloc>()
context.read<CreateSpaceModelBloc>().add( .add(
CreateSpaceTemplate( CreateSpaceTemplate(
spaceTemplate: spaceTemplate:
updatedSpaceTemplate, updatedSpaceTemplate,
onCreate: (newModel) { onCreate: (newModel) {
onLoad!(newModel); if (pageContext != null) {
pageContext!
.read<SpaceModelBloc>()
.add(CreateSpaceModel(
newSpaceModel:
newModel));
}
Navigator.of(context) Navigator.of(context)
.pop(); // Close the dialog .pop(); // Close the dialog
}, },
), ),
); );
} }
}
: null, : null,
backgroundColor: ColorsManager.secondaryColor, backgroundColor: ColorsManager.secondaryColor,
borderRadius: 10, borderRadius: 10,

View File

@ -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/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/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/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/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/pages/spaces_management/tag_model/views/add_device_type_model_widget.dart';
import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart';
@ -17,8 +16,8 @@ class TagChipDisplay extends StatelessWidget {
final List<SubspaceTemplateModel>? subspaces; final List<SubspaceTemplateModel>? subspaces;
final List<String>? allTags; final List<String>? allTags;
final TextEditingController spaceNameController; final TextEditingController spaceNameController;
final void Function( final BuildContext? pageContext;
List<TagModel>? tags, List<SubspaceTemplateModel>? subspaces)? onLoad; final List<String>? otherSpaceModels;
const TagChipDisplay(BuildContext context, const TagChipDisplay(BuildContext context,
{Key? key, {Key? key,
@ -28,7 +27,8 @@ class TagChipDisplay extends StatelessWidget {
required this.subspaces, required this.subspaces,
required this.allTags, required this.allTags,
required this.spaceNameController, required this.spaceNameController,
this.onLoad}) this.pageContext,
this.otherSpaceModels})
: super(key: key); : super(key: key);
@override @override
@ -96,6 +96,7 @@ class TagChipDisplay extends StatelessWidget {
builder: (context) => AssignTagModelsDialog( builder: (context) => AssignTagModelsDialog(
products: products, products: products,
subspaces: subspaces, subspaces: subspaces,
pageContext: pageContext,
allTags: allTags, allTags: allTags,
initialTags: TagHelper.generateInitialTags( initialTags: TagHelper.generateInitialTags(
subspaces: subspaces, subspaces: subspaces,
@ -105,10 +106,7 @@ class TagChipDisplay extends StatelessWidget {
TagHelper.createInitialSelectedProducts( TagHelper.createInitialSelectedProducts(
spaceModel?.tags ?? [], subspaces), spaceModel?.tags ?? [], subspaces),
spaceName: spaceModel?.modelName ?? '', spaceName: spaceModel?.modelName ?? '',
onUpdate: (tags, subspaces) { ));
onLoad?.call(tags, subspaces);
}),
);
} }
}, },
child: Chip( child: Chip(
@ -129,6 +127,8 @@ class TagChipDisplay extends StatelessWidget {
) )
: TextButton( : TextButton(
onPressed: () async { onPressed: () async {
Navigator.of(context).pop();
await showDialog<bool>( await showDialog<bool>(
barrierDismissible: false, barrierDismissible: false,
context: context, context: context,
@ -137,13 +137,8 @@ class TagChipDisplay extends StatelessWidget {
subspaces: subspaces, subspaces: subspaces,
allTags: allTags, allTags: allTags,
spaceName: spaceNameController.text, spaceName: spaceNameController.text,
pageContext: pageContext,
isCreate: true, isCreate: true,
onUpdate: (tags, subspaces) {
onLoad?.call(tags, subspaces);
},
onLoad: (tags, subspaces) {
onLoad?.call(tags, subspaces);
},
), ),
); );
}, },

View File

@ -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/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/product_model.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/selected_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/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/models/tag_model.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_bloc.dart';
@ -21,13 +22,11 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
final List<String>? allTags; final List<String>? allTags;
final String spaceName; final String spaceName;
final bool isCreate; final bool isCreate;
final void Function( final List<String>? otherSpaceModels;
List<TagModel>? tags, List<SubspaceTemplateModel>? subspaces)? onLoad; final BuildContext? pageContext;
final void Function(
List<TagModel>? tags, List<SubspaceTemplateModel>? subspaces)? onUpdate;
const AddDeviceTypeModelWidget({ const AddDeviceTypeModelWidget(
super.key, {super.key,
this.products, this.products,
this.initialSelectedProducts, this.initialSelectedProducts,
this.subspaces, this.subspaces,
@ -35,14 +34,11 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
this.spaceTagModels, this.spaceTagModels,
required this.spaceName, required this.spaceName,
required this.isCreate, required this.isCreate,
this.onLoad, this.pageContext,
this.onUpdate, this.otherSpaceModels});
});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final size = MediaQuery.of(context).size; final size = MediaQuery.of(context).size;
final crossAxisCount = size.width > 1200 final crossAxisCount = size.width > 1200
? 8 ? 8
@ -142,10 +138,9 @@ class AddDeviceTypeModelWidget extends StatelessWidget {
allTags: allTags, allTags: allTags,
spaceName: spaceName, spaceName: spaceName,
initialTags: state.initialTag, initialTags: state.initialTag,
otherSpaceModels: otherSpaceModels,
title: dialogTitle, title: dialogTitle,
onUpdate: (tags, subspaces) { pageContext: pageContext,
onUpdate?.call(tags, subspaces);
},
), ),
); );
} }